365 lines
1.2 MiB
365 lines
1.2 MiB
"use strict";
|
||
/*
|
||
* ATTENTION: An "eval-source-map" devtool has been used.
|
||
* This devtool is neither made for production nor for readable output files.
|
||
* It uses "eval()" calls to create a separate source file with attached SourceMaps in the browser devtools.
|
||
* If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/)
|
||
* or disable the default devtool with "devtool: false".
|
||
* If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/).
|
||
*/
|
||
exports.id = "vendor-chunks/nodemailer@7.0.13";
|
||
exports.ids = ["vendor-chunks/nodemailer@7.0.13"];
|
||
exports.modules = {
|
||
|
||
/***/ "(action-browser)/./node_modules/.pnpm/nodemailer@7.0.13/node_modules/nodemailer/lib/addressparser/index.js":
|
||
/*!*************************************************************************************************!*\
|
||
!*** ./node_modules/.pnpm/nodemailer@7.0.13/node_modules/nodemailer/lib/addressparser/index.js ***!
|
||
\*************************************************************************************************/
|
||
/***/ ((module) => {
|
||
|
||
eval("\n\n/**\n * Converts tokens for a single address into an address object\n *\n * @param {Array} tokens Tokens object\n * @param {Number} depth Current recursion depth for nested group protection\n * @return {Object} Address object\n */\nfunction _handleAddress(tokens, depth) {\n let isGroup = false;\n let state = 'text';\n let address;\n let addresses = [];\n let data = {\n address: [],\n comment: [],\n group: [],\n text: [],\n textWasQuoted: [] // Track which text tokens came from inside quotes\n };\n let i;\n let len;\n let insideQuotes = false; // Track if we're currently inside a quoted string\n\n // Filter out <addresses>, (comments) and regular text\n for (i = 0, len = tokens.length; i < len; i++) {\n let token = tokens[i];\n let prevToken = i ? tokens[i - 1] : null;\n if (token.type === 'operator') {\n switch (token.value) {\n case '<':\n state = 'address';\n insideQuotes = false;\n break;\n case '(':\n state = 'comment';\n insideQuotes = false;\n break;\n case ':':\n state = 'group';\n isGroup = true;\n insideQuotes = false;\n break;\n case '\"':\n // Track quote state for text tokens\n insideQuotes = !insideQuotes;\n state = 'text';\n break;\n default:\n state = 'text';\n insideQuotes = false;\n break;\n }\n } else if (token.value) {\n if (state === 'address') {\n // handle use case where unquoted name includes a \"<\"\n // Apple Mail truncates everything between an unexpected < and an address\n // and so will we\n token.value = token.value.replace(/^[^<]*<\\s*/, '');\n }\n\n if (prevToken && prevToken.noBreak && data[state].length) {\n // join values\n data[state][data[state].length - 1] += token.value;\n if (state === 'text' && insideQuotes) {\n data.textWasQuoted[data.textWasQuoted.length - 1] = true;\n }\n } else {\n data[state].push(token.value);\n if (state === 'text') {\n data.textWasQuoted.push(insideQuotes);\n }\n }\n }\n }\n\n // If there is no text but a comment, replace the two\n if (!data.text.length && data.comment.length) {\n data.text = data.comment;\n data.comment = [];\n }\n\n if (isGroup) {\n // http://tools.ietf.org/html/rfc2822#appendix-A.1.3\n data.text = data.text.join(' ');\n\n // Parse group members, but flatten any nested groups (RFC 5322 doesn't allow nesting)\n let groupMembers = [];\n if (data.group.length) {\n let parsedGroup = addressparser(data.group.join(','), { _depth: depth + 1 });\n // Flatten: if any member is itself a group, extract its members into the sequence\n parsedGroup.forEach(member => {\n if (member.group) {\n // Nested group detected - flatten it by adding its members directly\n groupMembers = groupMembers.concat(member.group);\n } else {\n groupMembers.push(member);\n }\n });\n }\n\n addresses.push({\n name: data.text || (address && address.name),\n group: groupMembers\n });\n } else {\n // If no address was found, try to detect one from regular text\n if (!data.address.length && data.text.length) {\n for (i = data.text.length - 1; i >= 0; i--) {\n // Security fix: Do not extract email addresses from quoted strings\n // RFC 5321 allows @ inside quoted local-parts like \"user@domain\"@example.com\n // Extracting emails from quoted text leads to misrouting vulnerabilities\n if (!data.textWasQuoted[i] && data.text[i].match(/^[^@\\s]+@[^@\\s]+$/)) {\n data.address = data.text.splice(i, 1);\n data.textWasQuoted.splice(i, 1);\n break;\n }\n }\n\n let _regexHandler = function (address) {\n if (!data.address.length) {\n data.address = [address.trim()];\n return ' ';\n } else {\n return address;\n }\n };\n\n // still no address\n if (!data.address.length) {\n for (i = data.text.length - 1; i >= 0; i--) {\n // Security fix: Do not extract email addresses from quoted strings\n if (!data.textWasQuoted[i]) {\n // fixed the regex to parse email address correctly when email address has more than one @\n data.text[i] = data.text[i].replace(/\\s*\\b[^@\\s]+@[^\\s]+\\b\\s*/, _regexHandler).trim();\n if (data.address.length) {\n break;\n }\n }\n }\n }\n }\n\n // If there's still is no text but a comment exixts, replace the two\n if (!data.text.length && data.comment.length) {\n data.text = data.comment;\n data.comment = [];\n }\n\n // Keep only the first address occurence, push others to regular text\n if (data.address.length > 1) {\n data.text = data.text.concat(data.address.splice(1));\n }\n\n // Join values with spaces\n data.text = data.text.join(' ');\n data.address = data.address.join(' ');\n\n if (!data.address && isGroup) {\n return [];\n } else {\n address = {\n address: data.address || data.text || '',\n name: data.text || data.address || ''\n };\n\n if (address.address === address.name) {\n if ((address.address || '').match(/@/)) {\n address.name = '';\n } else {\n address.address = '';\n }\n }\n\n addresses.push(address);\n }\n }\n\n return addresses;\n}\n\n/**\n * Creates a Tokenizer object for tokenizing address field strings\n *\n * @constructor\n * @param {String} str Address field string\n */\nclass Tokenizer {\n constructor(str) {\n this.str = (str || '').toString();\n this.operatorCurrent = '';\n this.operatorExpecting = '';\n this.node = null;\n this.escaped = false;\n\n this.list = [];\n /**\n * Operator tokens and which tokens are expected to end the sequence\n */\n this.operators = {\n '\"': '\"',\n '(': ')',\n '<': '>',\n ',': '',\n ':': ';',\n // Semicolons are not a legal delimiter per the RFC2822 grammar other\n // than for terminating a group, but they are also not valid for any\n // other use in this context. Given that some mail clients have\n // historically allowed the semicolon as a delimiter equivalent to the\n // comma in their UI, it makes sense to treat them the same as a comma\n // when used outside of a group.\n ';': ''\n };\n }\n\n /**\n * Tokenizes the original input string\n *\n * @return {Array} An array of operator|text tokens\n */\n tokenize() {\n let list = [];\n\n for (let i = 0, len = this.str.length; i < len; i++) {\n let chr = this.str.charAt(i);\n let nextChr = i < len - 1 ? this.str.charAt(i + 1) : null;\n this.checkChar(chr, nextChr);\n }\n\n this.list.forEach(node => {\n node.value = (node.value || '').toString().trim();\n if (node.value) {\n list.push(node);\n }\n });\n\n return list;\n }\n\n /**\n * Checks if a character is an operator or text and acts accordingly\n *\n * @param {String} chr Character from the address field\n */\n checkChar(chr, nextChr) {\n if (this.escaped) {\n // ignore next condition blocks\n } else if (chr === this.operatorExpecting) {\n this.node = {\n type: 'operator',\n value: chr\n };\n\n if (nextChr && ![' ', '\\t', '\\r', '\\n', ',', ';'].includes(nextChr)) {\n this.node.noBreak = true;\n }\n\n this.list.push(this.node);\n this.node = null;\n this.operatorExpecting = '';\n this.escaped = false;\n\n return;\n } else if (!this.operatorExpecting && chr in this.operators) {\n this.node = {\n type: 'operator',\n value: chr\n };\n this.list.push(this.node);\n this.node = null;\n this.operatorExpecting = this.operators[chr];\n this.escaped = false;\n return;\n } else if (['\"', \"'\"].includes(this.operatorExpecting) && chr === '\\\\') {\n this.escaped = true;\n return;\n }\n\n if (!this.node) {\n this.node = {\n type: 'text',\n value: ''\n };\n this.list.push(this.node);\n }\n\n if (chr === '\\n') {\n // Convert newlines to spaces. Carriage return is ignored as \\r and \\n usually\n // go together anyway and there already is a WS for \\n. Lone \\r means something is fishy.\n chr = ' ';\n }\n\n if (chr.charCodeAt(0) >= 0x21 || [' ', '\\t'].includes(chr)) {\n // skip command bytes\n this.node.value += chr;\n }\n\n this.escaped = false;\n }\n}\n\n/**\n * Maximum recursion depth for parsing nested groups.\n * RFC 5322 doesn't allow nested groups, so this is a safeguard against\n * malicious input that could cause stack overflow.\n */\nconst MAX_NESTED_GROUP_DEPTH = 50;\n\n/**\n * Parses structured e-mail addresses from an address field\n *\n * Example:\n *\n * 'Name <address@domain>'\n *\n * will be converted to\n *\n * [{name: 'Name', address: 'address@domain'}]\n *\n * @param {String} str Address field\n * @param {Object} options Optional options object\n * @param {Number} options._depth Internal recursion depth counter (do not set manually)\n * @return {Array} An array of address objects\n */\nfunction addressparser(str, options) {\n options = options || {};\n let depth = options._depth || 0;\n\n // Prevent stack overflow from deeply nested groups (DoS protection)\n if (depth > MAX_NESTED_GROUP_DEPTH) {\n return [];\n }\n\n let tokenizer = new Tokenizer(str);\n let tokens = tokenizer.tokenize();\n\n let addresses = [];\n let address = [];\n let parsedAddresses = [];\n\n tokens.forEach(token => {\n if (token.type === 'operator' && (token.value === ',' || token.value === ';')) {\n if (address.length) {\n addresses.push(address);\n }\n address = [];\n } else {\n address.push(token);\n }\n });\n\n if (address.length) {\n addresses.push(address);\n }\n\n addresses.forEach(address => {\n address = _handleAddress(address, depth);\n if (address.length) {\n parsedAddresses = parsedAddresses.concat(address);\n }\n });\n\n if (options.flatten) {\n let addresses = [];\n let walkAddressList = list => {\n list.forEach(address => {\n if (address.group) {\n return walkAddressList(address.group);\n } else {\n addresses.push(address);\n }\n });\n };\n walkAddressList(parsedAddresses);\n return addresses;\n }\n\n return parsedAddresses;\n}\n\n// expose to the world\nmodule.exports = addressparser;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFjdGlvbi1icm93c2VyKS8uL25vZGVfbW9kdWxlcy8ucG5wbS9ub2RlbWFpbGVyQDcuMC4xMy9ub2RlX21vZHVsZXMvbm9kZW1haWxlci9saWIvYWRkcmVzc3BhcnNlci9pbmRleC5qcyIsIm1hcHBpbmdzIjoiQUFBYTs7QUFFYjtBQUNBO0FBQ0E7QUFDQSxXQUFXLE9BQU87QUFDbEIsV0FBVyxRQUFRO0FBQ25CLFlBQVksUUFBUTtBQUNwQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4QkFBOEI7O0FBRTlCO0FBQ0EscUNBQXFDLFNBQVM7QUFDOUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0Esb0VBQW9FLG1CQUFtQjtBQUN2RjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULE1BQU07QUFDTjtBQUNBO0FBQ0EsMkNBQTJDLFFBQVE7QUFDbkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsK0NBQStDLFFBQVE7QUFDdkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQkFBbUI7QUFDbkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCLE9BQU87QUFDdkI7QUFDQTtBQUNBOztBQUVBLCtDQUErQyxTQUFTO0FBQ3hEO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsZUFBZSxRQUFRO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBOztBQUVBLDJEQUEyRDtBQUMzRDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVMsd0NBQXdDO0FBQ2pEO0FBQ0EsV0FBVyxRQUFRO0FBQ25CLFdBQVcsUUFBUTtBQUNuQixXQUFXLFFBQVE7QUFDbkIsWUFBWSxPQUFPO0FBQ25CO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsbUZBQW1GO0FBQ25GO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0I7QUFDbEI7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0EiLCJzb3VyY2VzIjpbIi9Vc2Vycy9tYXJjbWludGVsL1Byb2plY3RzL2UtdGliLmNvbS9ub2RlX21vZHVsZXMvLnBucG0vbm9kZW1haWxlckA3LjAuMTMvbm9kZV9tb2R1bGVzL25vZGVtYWlsZXIvbGliL2FkZHJlc3NwYXJzZXIvaW5kZXguanMiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIENvbnZlcnRzIHRva2VucyBmb3IgYSBzaW5nbGUgYWRkcmVzcyBpbnRvIGFuIGFkZHJlc3Mgb2JqZWN0XG4gKlxuICogQHBhcmFtIHtBcnJheX0gdG9rZW5zIFRva2VucyBvYmplY3RcbiAqIEBwYXJhbSB7TnVtYmVyfSBkZXB0aCBDdXJyZW50IHJlY3Vyc2lvbiBkZXB0aCBmb3IgbmVzdGVkIGdyb3VwIHByb3RlY3Rpb25cbiAqIEByZXR1cm4ge09iamVjdH0gQWRkcmVzcyBvYmplY3RcbiAqL1xuZnVuY3Rpb24gX2hhbmRsZUFkZHJlc3ModG9rZW5zLCBkZXB0aCkge1xuICAgIGxldCBpc0dyb3VwID0gZmFsc2U7XG4gICAgbGV0IHN0YXRlID0gJ3RleHQnO1xuICAgIGxldCBhZGRyZXNzO1xuICAgIGxldCBhZGRyZXNzZXMgPSBbXTtcbiAgICBsZXQgZGF0YSA9IHtcbiAgICAgICAgYWRkcmVzczogW10sXG4gICAgICAgIGNvbW1lbnQ6IFtdLFxuICAgICAgICBncm91cDogW10sXG4gICAgICAgIHRleHQ6IFtdLFxuICAgICAgICB0ZXh0V2FzUXVvdGVkOiBbXSAvLyBUcmFjayB3aGljaCB0ZXh0IHRva2VucyBjYW1lIGZyb20gaW5zaWRlIHF1b3Rlc1xuICAgIH07XG4gICAgbGV0IGk7XG4gICAgbGV0IGxlbjtcbiAgICBsZXQgaW5zaWRlUXVvdGVzID0gZmFsc2U7IC8vIFRyYWNrIGlmIHdlJ3JlIGN1cnJlbnRseSBpbnNpZGUgYSBxdW90ZWQgc3RyaW5nXG5cbiAgICAvLyBGaWx0ZXIgb3V0IDxhZGRyZXNzZXM+LCAoY29tbWVudHMpIGFuZCByZWd1bGFyIHRleHRcbiAgICBmb3IgKGkgPSAwLCBsZW4gPSB0b2tlbnMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgbGV0IHRva2VuID0gdG9rZW5zW2ldO1xuICAgICAgICBsZXQgcHJldlRva2VuID0gaSA/IHRva2Vuc1tpIC0gMV0gOiBudWxsO1xuICAgICAgICBpZiAodG9rZW4udHlwZSA9PT0gJ29wZXJhdG9yJykge1xuICAgICAgICAgICAgc3dpdGNoICh0b2tlbi52YWx1ZSkge1xuICAgICAgICAgICAgICAgIGNhc2UgJzwnOlxuICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9ICdhZGRyZXNzJztcbiAgICAgICAgICAgICAgICAgICAgaW5zaWRlUXVvdGVzID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJygnOlxuICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9ICdjb21tZW50JztcbiAgICAgICAgICAgICAgICAgICAgaW5zaWRlUXVvdGVzID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJzonOlxuICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9ICdncm91cCc7XG4gICAgICAgICAgICAgICAgICAgIGlzR3JvdXAgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBpbnNpZGVRdW90ZXMgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAnXCInOlxuICAgICAgICAgICAgICAgICAgICAvLyBUcmFjayBxdW90ZSBzdGF0ZSBmb3IgdGV4dCB0b2tlbnNcbiAgICAgICAgICAgICAgICAgICAgaW5zaWRlUXVvdGVzID0gIWluc2lkZVF1b3RlcztcbiAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSAndGV4dCc7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHN0YXRlID0gJ3RleHQnO1xuICAgICAgICAgICAgICAgICAgICBpbnNpZGVRdW90ZXMgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAodG9rZW4udmFsdWUpIHtcbiAgICAgICAgICAgIGlmIChzdGF0ZSA9PT0gJ2FkZHJlc3MnKSB7XG4gICAgICAgICAgICAgICAgLy8gaGFuZGxlIHVzZSBjYXNlIHdoZXJlIHVucXVvdGVkIG5hbWUgaW5jbHVkZXMgYSBcIjxcIlxuICAgICAgICAgICAgICAgIC8vIEFwcGxlIE1haWwgdHJ1bmNhdGVzIGV2ZXJ5dGhpbmcgYmV0d2VlbiBhbiB1bmV4cGVjdGVkIDwgYW5kIGFuIGFkZHJlc3NcbiAgICAgICAgICAgICAgICAvLyBhbmQgc28gd2lsbCB3ZVxuICAgICAgICAgICAgICAgIHRva2VuLnZhbHVlID0gdG9rZW4udmFsdWUucmVwbGFjZSgvXltePF0qPFxccyovLCAnJyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChwcmV2VG9rZW4gJiYgcHJldlRva2VuLm5vQnJlYWsgJiYgZGF0YVtzdGF0ZV0ubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgLy8gam9pbiB2YWx1ZXNcbiAgICAgICAgICAgICAgICBkYXRhW3N0YXRlXVtkYXRhW3N0YXRlXS5sZW5ndGggLSAxXSArPSB0b2tlbi52YWx1ZTtcbiAgICAgICAgICAgICAgICBpZiAoc3RhdGUgPT09ICd0ZXh0JyAmJiBpbnNpZGVRdW90ZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgZGF0YS50ZXh0V2FzUXVvdGVkW2RhdGEudGV4dFdhc1F1b3RlZC5sZW5ndGggLSAxXSA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBkYXRhW3N0YXRlXS5wdXNoKHRva2VuLnZhbHVlKTtcbiAgICAgICAgICAgICAgICBpZiAoc3RhdGUgPT09ICd0ZXh0Jykge1xuICAgICAgICAgICAgICAgICAgICBkYXRhLnRleHRXYXNRdW90ZWQucHVzaChpbnNpZGVRdW90ZXMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIElmIHRoZXJlIGlzIG5vIHRleHQgYnV0IGEgY29tbWVudCwgcmVwbGFjZSB0aGUgdHdvXG4gICAgaWYgKCFkYXRhLnRleHQubGVuZ3RoICYmIGRhdGEuY29tbWVudC5sZW5ndGgpIHtcbiAgICAgICAgZGF0YS50ZXh0ID0gZGF0YS5jb21tZW50O1xuICAgICAgICBkYXRhLmNvbW1lbnQgPSBbXTtcbiAgICB9XG5cbiAgICBpZiAoaXNHcm91cCkge1xuICAgICAgICAvLyBodHRwOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmMyODIyI2FwcGVuZGl4LUEuMS4zXG4gICAgICAgIGRhdGEudGV4dCA9IGRhdGEudGV4dC5qb2luKCcgJyk7XG5cbiAgICAgICAgLy8gUGFyc2UgZ3JvdXAgbWVtYmVycywgYnV0IGZsYXR0ZW4gYW55IG5lc3RlZCBncm91cHMgKFJGQyA1MzIyIGRvZXNuJ3QgYWxsb3cgbmVzdGluZylcbiAgICAgICAgbGV0IGdyb3VwTWVtYmVycyA9IFtdO1xuICAgICAgICBpZiAoZGF0YS5ncm91cC5sZW5ndGgpIHtcbiAgICAgICAgICAgIGxldCBwYXJzZWRHcm91cCA9IGFkZHJlc3NwYXJzZXIoZGF0YS5ncm91cC5qb2luKCcsJyksIHsgX2RlcHRoOiBkZXB0aCArIDEgfSk7XG4gICAgICAgICAgICAvLyBGbGF0dGVuOiBpZiBhbnkgbWVtYmVyIGlzIGl0c2VsZiBhIGdyb3VwLCBleHRyYWN0IGl0cyBtZW1iZXJzIGludG8gdGhlIHNlcXVlbmNlXG4gICAgICAgICAgICBwYXJzZWRHcm91cC5mb3JFYWNoKG1lbWJlciA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKG1lbWJlci5ncm91cCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBOZXN0ZWQgZ3JvdXAgZGV0ZWN0ZWQgLSBmbGF0dGVuIGl0IGJ5IGFkZGluZyBpdHMgbWVtYmVycyBkaXJlY3RseVxuICAgICAgICAgICAgICAgICAgICBncm91cE1lbWJlcnMgPSBncm91cE1lbWJlcnMuY29uY2F0KG1lbWJlci5ncm91cCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgZ3JvdXBNZW1iZXJzLnB1c2gobWVtYmVyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGFkZHJlc3Nlcy5wdXNoKHtcbiAgICAgICAgICAgIG5hbWU6IGRhdGEudGV4dCB8fCAoYWRkcmVzcyAmJiBhZGRyZXNzLm5hbWUpLFxuICAgICAgICAgICAgZ3JvdXA6IGdyb3VwTWVtYmVyc1xuICAgICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgICAvLyBJZiBubyBhZGRyZXNzIHdhcyBmb3VuZCwgdHJ5IHRvIGRldGVjdCBvbmUgZnJvbSByZWd1bGFyIHRleHRcbiAgICAgICAgaWYgKCFkYXRhLmFkZHJlc3MubGVuZ3RoICYmIGRhdGEudGV4dC5sZW5ndGgpIHtcbiAgICAgICAgICAgIGZvciAoaSA9IGRhdGEudGV4dC5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICAgICAgICAgIC8vIFNlY3VyaXR5IGZpeDogRG8gbm90IGV4dHJhY3QgZW1haWwgYWRkcmVzc2VzIGZyb20gcXVvdGVkIHN0cmluZ3NcbiAgICAgICAgICAgICAgICAvLyBSRkMgNTMyMSBhbGxvd3MgQCBpbnNpZGUgcXVvdGVkIGxvY2FsLXBhcnRzIGxpa2UgXCJ1c2VyQGRvbWFpblwiQGV4YW1wbGUuY29tXG4gICAgICAgICAgICAgICAgLy8gRXh0cmFjdGluZyBlbWFpbHMgZnJvbSBxdW90ZWQgdGV4dCBsZWFkcyB0byBtaXNyb3V0aW5nIHZ1bG5lcmFiaWxpdGllc1xuICAgICAgICAgICAgICAgIGlmICghZGF0YS50ZXh0V2FzUXVvdGVkW2ldICYmIGRhdGEudGV4dFtpXS5tYXRjaCgvXlteQFxcc10rQFteQFxcc10rJC8pKSB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGEuYWRkcmVzcyA9IGRhdGEudGV4dC5zcGxpY2UoaSwgMSk7XG4gICAgICAgICAgICAgICAgICAgIGRhdGEudGV4dFdhc1F1b3RlZC5zcGxpY2UoaSwgMSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbGV0IF9yZWdleEhhbmRsZXIgPSBmdW5jdGlvbiAoYWRkcmVzcykge1xuICAgICAgICAgICAgICAgIGlmICghZGF0YS5hZGRyZXNzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICBkYXRhLmFkZHJlc3MgPSBbYWRkcmVzcy50cmltKCldO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gJyAnO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBhZGRyZXNzO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIC8vIHN0aWxsIG5vIGFkZHJlc3NcbiAgICAgICAgICAgIGlmICghZGF0YS5hZGRyZXNzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIGZvciAoaSA9IGRhdGEudGV4dC5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBTZWN1cml0eSBmaXg6IERvIG5vdCBleHRyYWN0IGVtYWlsIGFkZHJlc3NlcyBmcm9tIHF1b3RlZCBzdHJpbmdzXG4gICAgICAgICAgICAgICAgICAgIGlmICghZGF0YS50ZXh0V2FzUXVvdGVkW2ldKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBmaXhlZCB0aGUgcmVnZXggdG8gcGFyc2UgZW1haWwgYWRkcmVzcyBjb3JyZWN0bHkgd2hlbiBlbWFpbCBhZGRyZXNzIGhhcyBtb3JlIHRoYW4gb25lIEBcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEudGV4dFtpXSA9IGRhdGEudGV4dFtpXS5yZXBsYWNlKC9cXHMqXFxiW15AXFxzXStAW15cXHNdK1xcYlxccyovLCBfcmVnZXhIYW5kbGVyKS50cmltKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YS5hZGRyZXNzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gSWYgdGhlcmUncyBzdGlsbCBpcyBubyB0ZXh0IGJ1dCBhIGNvbW1lbnQgZXhpeHRzLCByZXBsYWNlIHRoZSB0d29cbiAgICAgICAgaWYgKCFkYXRhLnRleHQubGVuZ3RoICYmIGRhdGEuY29tbWVudC5sZW5ndGgpIHtcbiAgICAgICAgICAgIGRhdGEudGV4dCA9IGRhdGEuY29tbWVudDtcbiAgICAgICAgICAgIGRhdGEuY29tbWVudCA9IFtdO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gS2VlcCBvbmx5IHRoZSBmaXJzdCBhZGRyZXNzIG9jY3VyZW5jZSwgcHVzaCBvdGhlcnMgdG8gcmVndWxhciB0ZXh0XG4gICAgICAgIGlmIChkYXRhLmFkZHJlc3MubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgZGF0YS50ZXh0ID0gZGF0YS50ZXh0LmNvbmNhdChkYXRhLmFkZHJlc3Muc3BsaWNlKDEpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEpvaW4gdmFsdWVzIHdpdGggc3BhY2VzXG4gICAgICAgIGRhdGEudGV4dCA9IGRhdGEudGV4dC5qb2luKCcgJyk7XG4gICAgICAgIGRhdGEuYWRkcmVzcyA9IGRhdGEuYWRkcmVzcy5qb2luKCcgJyk7XG5cbiAgICAgICAgaWYgKCFkYXRhLmFkZHJlc3MgJiYgaXNHcm91cCkge1xuICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYWRkcmVzcyA9IHtcbiAgICAgICAgICAgICAgICBhZGRyZXNzOiBkYXRhLmFkZHJlc3MgfHwgZGF0YS50ZXh0IHx8ICcnLFxuICAgICAgICAgICAgICAgIG5hbWU6IGRhdGEudGV4dCB8fCBkYXRhLmFkZHJlc3MgfHwgJydcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIGlmIChhZGRyZXNzLmFkZHJlc3MgPT09IGFkZHJlc3MubmFtZSkge1xuICAgICAgICAgICAgICAgIGlmICgoYWRkcmVzcy5hZGRyZXNzIHx8ICcnKS5tYXRjaCgvQC8pKSB7XG4gICAgICAgICAgICAgICAgICAgIGFkZHJlc3MubmFtZSA9ICcnO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGFkZHJlc3MuYWRkcmVzcyA9ICcnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgYWRkcmVzc2VzLnB1c2goYWRkcmVzcyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gYWRkcmVzc2VzO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBUb2tlbml6ZXIgb2JqZWN0IGZvciB0b2tlbml6aW5nIGFkZHJlc3MgZmllbGQgc3RyaW5nc1xuICpcbiAqIEBjb25zdHJ1Y3RvclxuICogQHBhcmFtIHtTdHJpbmd9IHN0ciBBZGRyZXNzIGZpZWxkIHN0cmluZ1xuICovXG5jbGFzcyBUb2tlbml6ZXIge1xuICAgIGNvbnN0cnVjdG9yKHN0cikge1xuICAgICAgICB0aGlzLnN0ciA9IChzdHIgfHwgJycpLnRvU3RyaW5nKCk7XG4gICAgICAgIHRoaXMub3BlcmF0b3JDdXJyZW50ID0gJyc7XG4gICAgICAgIHRoaXMub3BlcmF0b3JFeHBlY3RpbmcgPSAnJztcbiAgICAgICAgdGhpcy5ub2RlID0gbnVsbDtcbiAgICAgICAgdGhpcy5lc2NhcGVkID0gZmFsc2U7XG5cbiAgICAgICAgdGhpcy5saXN0ID0gW107XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBPcGVyYXRvciB0b2tlbnMgYW5kIHdoaWNoIHRva2VucyBhcmUgZXhwZWN0ZWQgdG8gZW5kIHRoZSBzZXF1ZW5jZVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5vcGVyYXRvcnMgPSB7XG4gICAgICAgICAgICAnXCInOiAnXCInLFxuICAgICAgICAgICAgJygnOiAnKScsXG4gICAgICAgICAgICAnPCc6ICc+JyxcbiAgICAgICAgICAgICcsJzogJycsXG4gICAgICAgICAgICAnOic6ICc7JyxcbiAgICAgICAgICAgIC8vIFNlbWljb2xvbnMgYXJlIG5vdCBhIGxlZ2FsIGRlbGltaXRlciBwZXIgdGhlIFJGQzI4MjIgZ3JhbW1hciBvdGhlclxuICAgICAgICAgICAgLy8gdGhhbiBmb3IgdGVybWluYXRpbmcgYSBncm91cCwgYnV0IHRoZXkgYXJlIGFsc28gbm90IHZhbGlkIGZvciBhbnlcbiAgICAgICAgICAgIC8vIG90aGVyIHVzZSBpbiB0aGlzIGNvbnRleHQuICBHaXZlbiB0aGF0IHNvbWUgbWFpbCBjbGllbnRzIGhhdmVcbiAgICAgICAgICAgIC8vIGhpc3RvcmljYWxseSBhbGxvd2VkIHRoZSBzZW1pY29sb24gYXMgYSBkZWxpbWl0ZXIgZXF1aXZhbGVudCB0byB0aGVcbiAgICAgICAgICAgIC8vIGNvbW1hIGluIHRoZWlyIFVJLCBpdCBtYWtlcyBzZW5zZSB0byB0cmVhdCB0aGVtIHRoZSBzYW1lIGFzIGEgY29tbWFcbiAgICAgICAgICAgIC8vIHdoZW4gdXNlZCBvdXRzaWRlIG9mIGEgZ3JvdXAuXG4gICAgICAgICAgICAnOyc6ICcnXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVG9rZW5pemVzIHRoZSBvcmlnaW5hbCBpbnB1dCBzdHJpbmdcbiAgICAgKlxuICAgICAqIEByZXR1cm4ge0FycmF5fSBBbiBhcnJheSBvZiBvcGVyYXRvcnx0ZXh0IHRva2Vuc1xuICAgICAqL1xuICAgIHRva2VuaXplKCkge1xuICAgICAgICBsZXQgbGlzdCA9IFtdO1xuXG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSB0aGlzLnN0ci5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgbGV0IGNociA9IHRoaXMuc3RyLmNoYXJBdChpKTtcbiAgICAgICAgICAgIGxldCBuZXh0Q2hyID0gaSA8IGxlbiAtIDEgPyB0aGlzLnN0ci5jaGFyQXQoaSArIDEpIDogbnVsbDtcbiAgICAgICAgICAgIHRoaXMuY2hlY2tDaGFyKGNociwgbmV4dENocik7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmxpc3QuZm9yRWFjaChub2RlID0+IHtcbiAgICAgICAgICAgIG5vZGUudmFsdWUgPSAobm9kZS52YWx1ZSB8fCAnJykudG9TdHJpbmcoKS50cmltKCk7XG4gICAgICAgICAgICBpZiAobm9kZS52YWx1ZSkge1xuICAgICAgICAgICAgICAgIGxpc3QucHVzaChub2RlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIGxpc3Q7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGEgY2hhcmFjdGVyIGlzIGFuIG9wZXJhdG9yIG9yIHRleHQgYW5kIGFjdHMgYWNjb3JkaW5nbHlcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBjaHIgQ2hhcmFjdGVyIGZyb20gdGhlIGFkZHJlc3MgZmllbGRcbiAgICAgKi9cbiAgICBjaGVja0NoYXIoY2hyLCBuZXh0Q2hyKSB7XG4gICAgICAgIGlmICh0aGlzLmVzY2FwZWQpIHtcbiAgICAgICAgICAgIC8vIGlnbm9yZSBuZXh0IGNvbmRpdGlvbiBibG9ja3NcbiAgICAgICAgfSBlbHNlIGlmIChjaHIgPT09IHRoaXMub3BlcmF0b3JFeHBlY3RpbmcpIHtcbiAgICAgICAgICAgIHRoaXMubm9kZSA9IHtcbiAgICAgICAgICAgICAgICB0eXBlOiAnb3BlcmF0b3InLFxuICAgICAgICAgICAgICAgIHZhbHVlOiBjaHJcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIGlmIChuZXh0Q2hyICYmICFbJyAnLCAnXFx0JywgJ1xccicsICdcXG4nLCAnLCcsICc7J10uaW5jbHVkZXMobmV4dENocikpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm5vZGUubm9CcmVhayA9IHRydWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMubGlzdC5wdXNoKHRoaXMubm9kZSk7XG4gICAgICAgICAgICB0aGlzLm5vZGUgPSBudWxsO1xuICAgICAgICAgICAgdGhpcy5vcGVyYXRvckV4cGVjdGluZyA9ICcnO1xuICAgICAgICAgICAgdGhpcy5lc2NhcGVkID0gZmFsc2U7XG5cbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfSBlbHNlIGlmICghdGhpcy5vcGVyYXRvckV4cGVjdGluZyAmJiBjaHIgaW4gdGhpcy5vcGVyYXRvcnMpIHtcbiAgICAgICAgICAgIHRoaXMubm9kZSA9IHtcbiAgICAgICAgICAgICAgICB0eXBlOiAnb3BlcmF0b3InLFxuICAgICAgICAgICAgICAgIHZhbHVlOiBjaHJcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICB0aGlzLmxpc3QucHVzaCh0aGlzLm5vZGUpO1xuICAgICAgICAgICAgdGhpcy5ub2RlID0gbnVsbDtcbiAgICAgICAgICAgIHRoaXMub3BlcmF0b3JFeHBlY3RpbmcgPSB0aGlzLm9wZXJhdG9yc1tjaHJdO1xuICAgICAgICAgICAgdGhpcy5lc2NhcGVkID0gZmFsc2U7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH0gZWxzZSBpZiAoWydcIicsIFwiJ1wiXS5pbmNsdWRlcyh0aGlzLm9wZXJhdG9yRXhwZWN0aW5nKSAmJiBjaHIgPT09ICdcXFxcJykge1xuICAgICAgICAgICAgdGhpcy5lc2NhcGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhpcy5ub2RlKSB7XG4gICAgICAgICAgICB0aGlzLm5vZGUgPSB7XG4gICAgICAgICAgICAgICAgdHlwZTogJ3RleHQnLFxuICAgICAgICAgICAgICAgIHZhbHVlOiAnJ1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHRoaXMubGlzdC5wdXNoKHRoaXMubm9kZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY2hyID09PSAnXFxuJykge1xuICAgICAgICAgICAgLy8gQ29udmVydCBuZXdsaW5lcyB0byBzcGFjZXMuIENhcnJpYWdlIHJldHVybiBpcyBpZ25vcmVkIGFzIFxcciBhbmQgXFxuIHVzdWFsbHlcbiAgICAgICAgICAgIC8vIGdvIHRvZ2V0aGVyIGFueXdheSBhbmQgdGhlcmUgYWxyZWFkeSBpcyBhIFdTIGZvciBcXG4uIExvbmUgXFxyIG1lYW5zIHNvbWV0aGluZyBpcyBmaXNoeS5cbiAgICAgICAgICAgIGNociA9ICcgJztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjaHIuY2hhckNvZGVBdCgwKSA+PSAweDIxIHx8IFsnICcsICdcXHQnXS5pbmNsdWRlcyhjaHIpKSB7XG4gICAgICAgICAgICAvLyBza2lwIGNvbW1hbmQgYnl0ZXNcbiAgICAgICAgICAgIHRoaXMubm9kZS52YWx1ZSArPSBjaHI7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmVzY2FwZWQgPSBmYWxzZTtcbiAgICB9XG59XG5cbi8qKlxuICogTWF4aW11bSByZWN1cnNpb24gZGVwdGggZm9yIHBhcnNpbmcgbmVzdGVkIGdyb3Vwcy5cbiAqIFJGQyA1MzIyIGRvZXNuJ3QgYWxsb3cgbmVzdGVkIGdyb3Vwcywgc28gdGhpcyBpcyBhIHNhZmVndWFyZCBhZ2FpbnN0XG4gKiBtYWxpY2lvdXMgaW5wdXQgdGhhdCBjb3VsZCBjYXVzZSBzdGFjayBvdmVyZmxvdy5cbiAqL1xuY29uc3QgTUFYX05FU1RFRF9HUk9VUF9ERVBUSCA9IDUwO1xuXG4vKipcbiAqIFBhcnNlcyBzdHJ1Y3R1cmVkIGUtbWFpbCBhZGRyZXNzZXMgZnJvbSBhbiBhZGRyZXNzIGZpZWxkXG4gKlxuICogRXhhbXBsZTpcbiAqXG4gKiAgICAnTmFtZSA8YWRkcmVzc0Bkb21haW4+J1xuICpcbiAqIHdpbGwgYmUgY29udmVydGVkIHRvXG4gKlxuICogICAgIFt7bmFtZTogJ05hbWUnLCBhZGRyZXNzOiAnYWRkcmVzc0Bkb21haW4nfV1cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gc3RyIEFkZHJlc3MgZmllbGRcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIE9wdGlvbmFsIG9wdGlvbnMgb2JqZWN0XG4gKiBAcGFyYW0ge051bWJlcn0gb3B0aW9ucy5fZGVwdGggSW50ZXJuYWwgcmVjdXJzaW9uIGRlcHRoIGNvdW50ZXIgKGRvIG5vdCBzZXQgbWFudWFsbHkpXG4gKiBAcmV0dXJuIHtBcnJheX0gQW4gYXJyYXkgb2YgYWRkcmVzcyBvYmplY3RzXG4gKi9cbmZ1bmN0aW9uIGFkZHJlc3NwYXJzZXIoc3RyLCBvcHRpb25zKSB7XG4gICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gICAgbGV0IGRlcHRoID0gb3B0aW9ucy5fZGVwdGggfHwgMDtcblxuICAgIC8vIFByZXZlbnQgc3RhY2sgb3ZlcmZsb3cgZnJvbSBkZWVwbHkgbmVzdGVkIGdyb3VwcyAoRG9TIHByb3RlY3Rpb24pXG4gICAgaWYgKGRlcHRoID4gTUFYX05FU1RFRF9HUk9VUF9ERVBUSCkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgbGV0IHRva2VuaXplciA9IG5ldyBUb2tlbml6ZXIoc3RyKTtcbiAgICBsZXQgdG9rZW5zID0gdG9rZW5pemVyLnRva2VuaXplKCk7XG5cbiAgICBsZXQgYWRkcmVzc2VzID0gW107XG4gICAgbGV0IGFkZHJlc3MgPSBbXTtcbiAgICBsZXQgcGFyc2VkQWRkcmVzc2VzID0gW107XG5cbiAgICB0b2tlbnMuZm9yRWFjaCh0b2tlbiA9PiB7XG4gICAgICAgIGlmICh0b2tlbi50eXBlID09PSAnb3BlcmF0b3InICYmICh0b2tlbi52YWx1ZSA9PT0gJywnIHx8IHRva2VuLnZhbHVlID09PSAnOycpKSB7XG4gICAgICAgICAgICBpZiAoYWRkcmVzcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBhZGRyZXNzZXMucHVzaChhZGRyZXNzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGFkZHJlc3MgPSBbXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGFkZHJlc3MucHVzaCh0b2tlbik7XG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIGlmIChhZGRyZXNzLmxlbmd0aCkge1xuICAgICAgICBhZGRyZXNzZXMucHVzaChhZGRyZXNzKTtcbiAgICB9XG5cbiAgICBhZGRyZXNzZXMuZm9yRWFjaChhZGRyZXNzID0+IHtcbiAgICAgICAgYWRkcmVzcyA9IF9oYW5kbGVBZGRyZXNzKGFkZHJlc3MsIGRlcHRoKTtcbiAgICAgICAgaWYgKGFkZHJlc3MubGVuZ3RoKSB7XG4gICAgICAgICAgICBwYXJzZWRBZGRyZXNzZXMgPSBwYXJzZWRBZGRyZXNzZXMuY29uY2F0KGFkZHJlc3MpO1xuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICBpZiAob3B0aW9ucy5mbGF0dGVuKSB7XG4gICAgICAgIGxldCBhZGRyZXNzZXMgPSBbXTtcbiAgICAgICAgbGV0IHdhbGtBZGRyZXNzTGlzdCA9IGxpc3QgPT4ge1xuICAgICAgICAgICAgbGlzdC5mb3JFYWNoKGFkZHJlc3MgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChhZGRyZXNzLmdyb3VwKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB3YWxrQWRkcmVzc0xpc3QoYWRkcmVzcy5ncm91cCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgYWRkcmVzc2VzLnB1c2goYWRkcmVzcyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH07XG4gICAgICAgIHdhbGtBZGRyZXNzTGlzdChwYXJzZWRBZGRyZXNzZXMpO1xuICAgICAgICByZXR1cm4gYWRkcmVzc2VzO1xuICAgIH1cblxuICAgIHJldHVybiBwYXJzZWRBZGRyZXNzZXM7XG59XG5cbi8vIGV4cG9zZSB0byB0aGUgd29ybGRcbm1vZHVsZS5leHBvcnRzID0gYWRkcmVzc3BhcnNlcjtcbiJdLCJuYW1lcyI6W10sImlnbm9yZUxpc3QiOlswXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(action-browser)/./node_modules/.pnpm/nodemailer@7.0.13/node_modules/nodemailer/lib/addressparser/index.js\n");
|
||
|
||
/***/ }),
|
||
|
||
/***/ "(action-browser)/./node_modules/.pnpm/nodemailer@7.0.13/node_modules/nodemailer/lib/base64/index.js":
|
||
/*!******************************************************************************************!*\
|
||
!*** ./node_modules/.pnpm/nodemailer@7.0.13/node_modules/nodemailer/lib/base64/index.js ***!
|
||
\******************************************************************************************/
|
||
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
|
||
|
||
eval("\n\nconst Transform = (__webpack_require__(/*! stream */ \"stream\").Transform);\n\n/**\n * Encodes a Buffer into a base64 encoded string\n *\n * @param {Buffer} buffer Buffer to convert\n * @returns {String} base64 encoded string\n */\nfunction encode(buffer) {\n if (typeof buffer === 'string') {\n buffer = Buffer.from(buffer, 'utf-8');\n }\n\n return buffer.toString('base64');\n}\n\n/**\n * Adds soft line breaks to a base64 string\n *\n * @param {String} str base64 encoded string that might need line wrapping\n * @param {Number} [lineLength=76] Maximum allowed length for a line\n * @returns {String} Soft-wrapped base64 encoded string\n */\nfunction wrap(str, lineLength) {\n str = (str || '').toString();\n lineLength = lineLength || 76;\n\n if (str.length <= lineLength) {\n return str;\n }\n\n let result = [];\n let pos = 0;\n let chunkLength = lineLength * 1024;\n while (pos < str.length) {\n let wrappedLines = str.substr(pos, chunkLength).replace(new RegExp('.{' + lineLength + '}', 'g'), '$&\\r\\n');\n result.push(wrappedLines);\n pos += chunkLength;\n }\n\n return result.join('');\n}\n\n/**\n * Creates a transform stream for encoding data to base64 encoding\n *\n * @constructor\n * @param {Object} options Stream options\n * @param {Number} [options.lineLength=76] Maximum length for lines, set to false to disable wrapping\n */\nclass Encoder extends Transform {\n constructor(options) {\n super();\n this.options = options || {};\n\n if (this.options.lineLength !== false) {\n this.options.lineLength = this.options.lineLength || 76;\n }\n\n this._curLine = '';\n this._remainingBytes = false;\n\n this.inputBytes = 0;\n this.outputBytes = 0;\n }\n\n _transform(chunk, encoding, done) {\n if (encoding !== 'buffer') {\n chunk = Buffer.from(chunk, encoding);\n }\n\n if (!chunk || !chunk.length) {\n return setImmediate(done);\n }\n\n this.inputBytes += chunk.length;\n\n if (this._remainingBytes && this._remainingBytes.length) {\n chunk = Buffer.concat([this._remainingBytes, chunk], this._remainingBytes.length + chunk.length);\n this._remainingBytes = false;\n }\n\n if (chunk.length % 3) {\n this._remainingBytes = chunk.slice(chunk.length - (chunk.length % 3));\n chunk = chunk.slice(0, chunk.length - (chunk.length % 3));\n } else {\n this._remainingBytes = false;\n }\n\n let b64 = this._curLine + encode(chunk);\n\n if (this.options.lineLength) {\n b64 = wrap(b64, this.options.lineLength);\n\n let lastLF = b64.lastIndexOf('\\n');\n if (lastLF < 0) {\n this._curLine = b64;\n b64 = '';\n } else {\n this._curLine = b64.substring(lastLF + 1);\n b64 = b64.substring(0, lastLF + 1);\n\n if (b64 && !b64.endsWith('\\r\\n')) {\n b64 += '\\r\\n';\n }\n }\n } else {\n this._curLine = '';\n }\n\n if (b64) {\n this.outputBytes += b64.length;\n this.push(Buffer.from(b64, 'ascii'));\n }\n\n setImmediate(done);\n }\n\n _flush(done) {\n if (this._remainingBytes && this._remainingBytes.length) {\n this._curLine += encode(this._remainingBytes);\n }\n\n if (this._curLine) {\n this.outputBytes += this._curLine.length;\n this.push(Buffer.from(this._curLine, 'ascii'));\n this._curLine = '';\n }\n done();\n }\n}\n\nmodule.exports = {\n encode,\n wrap,\n Encoder\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFjdGlvbi1icm93c2VyKS8uL25vZGVfbW9kdWxlcy8ucG5wbS9ub2RlbWFpbGVyQDcuMC4xMy9ub2RlX21vZHVsZXMvbm9kZW1haWxlci9saWIvYmFzZTY0L2luZGV4LmpzIiwibWFwcGluZ3MiOiJBQUFhOztBQUViLGtCQUFrQix1REFBMkI7O0FBRTdDO0FBQ0E7QUFDQTtBQUNBLFdBQVcsUUFBUTtBQUNuQixhQUFhLFFBQVE7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsUUFBUTtBQUNuQixXQUFXLFFBQVE7QUFDbkIsYUFBYSxRQUFRO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhFQUE4RSxtQkFBbUI7QUFDakc7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkIsV0FBVyxRQUFRO0FBQ25CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsiL1VzZXJzL21hcmNtaW50ZWwvUHJvamVjdHMvZS10aWIuY29tL25vZGVfbW9kdWxlcy8ucG5wbS9ub2RlbWFpbGVyQDcuMC4xMy9ub2RlX21vZHVsZXMvbm9kZW1haWxlci9saWIvYmFzZTY0L2luZGV4LmpzIl0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcblxuY29uc3QgVHJhbnNmb3JtID0gcmVxdWlyZSgnc3RyZWFtJykuVHJhbnNmb3JtO1xuXG4vKipcbiAqIEVuY29kZXMgYSBCdWZmZXIgaW50byBhIGJhc2U2NCBlbmNvZGVkIHN0cmluZ1xuICpcbiAqIEBwYXJhbSB7QnVmZmVyfSBidWZmZXIgQnVmZmVyIHRvIGNvbnZlcnRcbiAqIEByZXR1cm5zIHtTdHJpbmd9IGJhc2U2NCBlbmNvZGVkIHN0cmluZ1xuICovXG5mdW5jdGlvbiBlbmNvZGUoYnVmZmVyKSB7XG4gICAgaWYgKHR5cGVvZiBidWZmZXIgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGJ1ZmZlciA9IEJ1ZmZlci5mcm9tKGJ1ZmZlciwgJ3V0Zi04Jyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGJ1ZmZlci50b1N0cmluZygnYmFzZTY0Jyk7XG59XG5cbi8qKlxuICogQWRkcyBzb2Z0IGxpbmUgYnJlYWtzIHRvIGEgYmFzZTY0IHN0cmluZ1xuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBzdHIgYmFzZTY0IGVuY29kZWQgc3RyaW5nIHRoYXQgbWlnaHQgbmVlZCBsaW5lIHdyYXBwaW5nXG4gKiBAcGFyYW0ge051bWJlcn0gW2xpbmVMZW5ndGg9NzZdIE1heGltdW0gYWxsb3dlZCBsZW5ndGggZm9yIGEgbGluZVxuICogQHJldHVybnMge1N0cmluZ30gU29mdC13cmFwcGVkIGJhc2U2NCBlbmNvZGVkIHN0cmluZ1xuICovXG5mdW5jdGlvbiB3cmFwKHN0ciwgbGluZUxlbmd0aCkge1xuICAgIHN0ciA9IChzdHIgfHwgJycpLnRvU3RyaW5nKCk7XG4gICAgbGluZUxlbmd0aCA9IGxpbmVMZW5ndGggfHwgNzY7XG5cbiAgICBpZiAoc3RyLmxlbmd0aCA8PSBsaW5lTGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBzdHI7XG4gICAgfVxuXG4gICAgbGV0IHJlc3VsdCA9IFtdO1xuICAgIGxldCBwb3MgPSAwO1xuICAgIGxldCBjaHVua0xlbmd0aCA9IGxpbmVMZW5ndGggKiAxMDI0O1xuICAgIHdoaWxlIChwb3MgPCBzdHIubGVuZ3RoKSB7XG4gICAgICAgIGxldCB3cmFwcGVkTGluZXMgPSBzdHIuc3Vic3RyKHBvcywgY2h1bmtMZW5ndGgpLnJlcGxhY2UobmV3IFJlZ0V4cCgnLnsnICsgbGluZUxlbmd0aCArICd9JywgJ2cnKSwgJyQmXFxyXFxuJyk7XG4gICAgICAgIHJlc3VsdC5wdXNoKHdyYXBwZWRMaW5lcyk7XG4gICAgICAgIHBvcyArPSBjaHVua0xlbmd0aDtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0LmpvaW4oJycpO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSB0cmFuc2Zvcm0gc3RyZWFtIGZvciBlbmNvZGluZyBkYXRhIHRvIGJhc2U2NCBlbmNvZGluZ1xuICpcbiAqIEBjb25zdHJ1Y3RvclxuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgU3RyZWFtIG9wdGlvbnNcbiAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy5saW5lTGVuZ3RoPTc2XSBNYXhpbXVtIGxlbmd0aCBmb3IgbGluZXMsIHNldCB0byBmYWxzZSB0byBkaXNhYmxlIHdyYXBwaW5nXG4gKi9cbmNsYXNzIEVuY29kZXIgZXh0ZW5kcyBUcmFuc2Zvcm0ge1xuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnMpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcblxuICAgICAgICBpZiAodGhpcy5vcHRpb25zLmxpbmVMZW5ndGggIT09IGZhbHNlKSB7XG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMubGluZUxlbmd0aCA9IHRoaXMub3B0aW9ucy5saW5lTGVuZ3RoIHx8IDc2O1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fY3VyTGluZSA9ICcnO1xuICAgICAgICB0aGlzLl9yZW1haW5pbmdCeXRlcyA9IGZhbHNlO1xuXG4gICAgICAgIHRoaXMuaW5wdXRCeXRlcyA9IDA7XG4gICAgICAgIHRoaXMub3V0cHV0Qnl0ZXMgPSAwO1xuICAgIH1cblxuICAgIF90cmFuc2Zvcm0oY2h1bmssIGVuY29kaW5nLCBkb25lKSB7XG4gICAgICAgIGlmIChlbmNvZGluZyAhPT0gJ2J1ZmZlcicpIHtcbiAgICAgICAgICAgIGNodW5rID0gQnVmZmVyLmZyb20oY2h1bmssIGVuY29kaW5nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghY2h1bmsgfHwgIWNodW5rLmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIHNldEltbWVkaWF0ZShkb25lKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuaW5wdXRCeXRlcyArPSBjaHVuay5sZW5ndGg7XG5cbiAgICAgICAgaWYgKHRoaXMuX3JlbWFpbmluZ0J5dGVzICYmIHRoaXMuX3JlbWFpbmluZ0J5dGVzLmxlbmd0aCkge1xuICAgICAgICAgICAgY2h1bmsgPSBCdWZmZXIuY29uY2F0KFt0aGlzLl9yZW1haW5pbmdCeXRlcywgY2h1bmtdLCB0aGlzLl9yZW1haW5pbmdCeXRlcy5sZW5ndGggKyBjaHVuay5sZW5ndGgpO1xuICAgICAgICAgICAgdGhpcy5fcmVtYWluaW5nQnl0ZXMgPSBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjaHVuay5sZW5ndGggJSAzKSB7XG4gICAgICAgICAgICB0aGlzLl9yZW1haW5pbmdCeXRlcyA9IGNodW5rLnNsaWNlKGNodW5rLmxlbmd0aCAtIChjaHVuay5sZW5ndGggJSAzKSk7XG4gICAgICAgICAgICBjaHVuayA9IGNodW5rLnNsaWNlKDAsIGNodW5rLmxlbmd0aCAtIChjaHVuay5sZW5ndGggJSAzKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9yZW1haW5pbmdCeXRlcyA9IGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGI2NCA9IHRoaXMuX2N1ckxpbmUgKyBlbmNvZGUoY2h1bmspO1xuXG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMubGluZUxlbmd0aCkge1xuICAgICAgICAgICAgYjY0ID0gd3JhcChiNjQsIHRoaXMub3B0aW9ucy5saW5lTGVuZ3RoKTtcblxuICAgICAgICAgICAgbGV0IGxhc3RMRiA9IGI2NC5sYXN0SW5kZXhPZignXFxuJyk7XG4gICAgICAgICAgICBpZiAobGFzdExGIDwgMCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2N1ckxpbmUgPSBiNjQ7XG4gICAgICAgICAgICAgICAgYjY0ID0gJyc7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuX2N1ckxpbmUgPSBiNjQuc3Vic3RyaW5nKGxhc3RMRiArIDEpO1xuICAgICAgICAgICAgICAgIGI2NCA9IGI2NC5zdWJzdHJpbmcoMCwgbGFzdExGICsgMSk7XG5cbiAgICAgICAgICAgICAgICBpZiAoYjY0ICYmICFiNjQuZW5kc1dpdGgoJ1xcclxcbicpKSB7XG4gICAgICAgICAgICAgICAgICAgIGI2NCArPSAnXFxyXFxuJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9jdXJMaW5lID0gJyc7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoYjY0KSB7XG4gICAgICAgICAgICB0aGlzLm91dHB1dEJ5dGVzICs9IGI2NC5sZW5ndGg7XG4gICAgICAgICAgICB0aGlzLnB1c2goQnVmZmVyLmZyb20oYjY0LCAnYXNjaWknKSk7XG4gICAgICAgIH1cblxuICAgICAgICBzZXRJbW1lZGlhdGUoZG9uZSk7XG4gICAgfVxuXG4gICAgX2ZsdXNoKGRvbmUpIHtcbiAgICAgICAgaWYgKHRoaXMuX3JlbWFpbmluZ0J5dGVzICYmIHRoaXMuX3JlbWFpbmluZ0J5dGVzLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy5fY3VyTGluZSArPSBlbmNvZGUodGhpcy5fcmVtYWluaW5nQnl0ZXMpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuX2N1ckxpbmUpIHtcbiAgICAgICAgICAgIHRoaXMub3V0cHV0Qnl0ZXMgKz0gdGhpcy5fY3VyTGluZS5sZW5ndGg7XG4gICAgICAgICAgICB0aGlzLnB1c2goQnVmZmVyLmZyb20odGhpcy5fY3VyTGluZSwgJ2FzY2lpJykpO1xuICAgICAgICAgICAgdGhpcy5fY3VyTGluZSA9ICcnO1xuICAgICAgICB9XG4gICAgICAgIGRvbmUoKTtcbiAgICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICAgIGVuY29kZSxcbiAgICB3cmFwLFxuICAgIEVuY29kZXJcbn07XG4iXSwibmFtZXMiOltdLCJpZ25vcmVMaXN0IjpbMF0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(action-browser)/./node_modules/.pnpm/nodemailer@7.0.13/node_modules/nodemailer/lib/base64/index.js\n");
|
||
|
||
/***/ }),
|
||
|
||
/***/ "(action-browser)/./node_modules/.pnpm/nodemailer@7.0.13/node_modules/nodemailer/lib/dkim/index.js":
|
||
/*!****************************************************************************************!*\
|
||
!*** ./node_modules/.pnpm/nodemailer@7.0.13/node_modules/nodemailer/lib/dkim/index.js ***!
|
||
\****************************************************************************************/
|
||
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
|
||
|
||
eval("\n\n// FIXME:\n// replace this Transform mess with a method that pipes input argument to output argument\n\nconst MessageParser = __webpack_require__(/*! ./message-parser */ \"(action-browser)/./node_modules/.pnpm/nodemailer@7.0.13/node_modules/nodemailer/lib/dkim/message-parser.js\");\nconst RelaxedBody = __webpack_require__(/*! ./relaxed-body */ \"(action-browser)/./node_modules/.pnpm/nodemailer@7.0.13/node_modules/nodemailer/lib/dkim/relaxed-body.js\");\nconst sign = __webpack_require__(/*! ./sign */ \"(action-browser)/./node_modules/.pnpm/nodemailer@7.0.13/node_modules/nodemailer/lib/dkim/sign.js\");\nconst PassThrough = (__webpack_require__(/*! stream */ \"stream\").PassThrough);\nconst fs = __webpack_require__(/*! fs */ \"fs\");\nconst path = __webpack_require__(/*! path */ \"path\");\nconst crypto = __webpack_require__(/*! crypto */ \"crypto\");\n\nconst DKIM_ALGO = 'sha256';\nconst MAX_MESSAGE_SIZE = 2 * 1024 * 1024; // buffer messages larger than this to disk\n\n/*\n// Usage:\n\nlet dkim = new DKIM({\n domainName: 'example.com',\n keySelector: 'key-selector',\n privateKey,\n cacheDir: '/tmp'\n});\ndkim.sign(input).pipe(process.stdout);\n\n// Where inputStream is a rfc822 message (either a stream, string or Buffer)\n// and outputStream is a DKIM signed rfc822 message\n*/\n\nclass DKIMSigner {\n constructor(options, keys, input, output) {\n this.options = options || {};\n this.keys = keys;\n\n this.cacheTreshold = Number(this.options.cacheTreshold) || MAX_MESSAGE_SIZE;\n this.hashAlgo = this.options.hashAlgo || DKIM_ALGO;\n\n this.cacheDir = this.options.cacheDir || false;\n\n this.chunks = [];\n this.chunklen = 0;\n this.readPos = 0;\n this.cachePath = this.cacheDir\n ? path.join(this.cacheDir, 'message.' + Date.now() + '-' + crypto.randomBytes(14).toString('hex'))\n : false;\n this.cache = false;\n\n this.headers = false;\n this.bodyHash = false;\n this.parser = false;\n this.relaxedBody = false;\n\n this.input = input;\n this.output = output;\n this.output.usingCache = false;\n\n this.hasErrored = false;\n\n this.input.on('error', err => {\n this.hasErrored = true;\n this.cleanup();\n output.emit('error', err);\n });\n }\n\n cleanup() {\n if (!this.cache || !this.cachePath) {\n return;\n }\n fs.unlink(this.cachePath, () => false);\n }\n\n createReadCache() {\n // pipe remainings to cache file\n this.cache = fs.createReadStream(this.cachePath);\n this.cache.once('error', err => {\n this.cleanup();\n this.output.emit('error', err);\n });\n this.cache.once('close', () => {\n this.cleanup();\n });\n this.cache.pipe(this.output);\n }\n\n sendNextChunk() {\n if (this.hasErrored) {\n return;\n }\n\n if (this.readPos >= this.chunks.length) {\n if (!this.cache) {\n return this.output.end();\n }\n return this.createReadCache();\n }\n let chunk = this.chunks[this.readPos++];\n if (this.output.write(chunk) === false) {\n return this.output.once('drain', () => {\n this.sendNextChunk();\n });\n }\n setImmediate(() => this.sendNextChunk());\n }\n\n sendSignedOutput() {\n let keyPos = 0;\n let signNextKey = () => {\n if (keyPos >= this.keys.length) {\n this.output.write(this.parser.rawHeaders);\n return setImmediate(() => this.sendNextChunk());\n }\n let key = this.keys[keyPos++];\n let dkimField = sign(this.headers, this.hashAlgo, this.bodyHash, {\n domainName: key.domainName,\n keySelector: key.keySelector,\n privateKey: key.privateKey,\n headerFieldNames: this.options.headerFieldNames,\n skipFields: this.options.skipFields\n });\n if (dkimField) {\n this.output.write(Buffer.from(dkimField + '\\r\\n'));\n }\n return setImmediate(signNextKey);\n };\n\n if (this.bodyHash && this.headers) {\n return signNextKey();\n }\n\n this.output.write(this.parser.rawHeaders);\n this.sendNextChunk();\n }\n\n createWriteCache() {\n this.output.usingCache = true;\n // pipe remainings to cache file\n this.cache = fs.createWriteStream(this.cachePath);\n this.cache.once('error', err => {\n this.cleanup();\n // drain input\n this.relaxedBody.unpipe(this.cache);\n this.relaxedBody.on('readable', () => {\n while (this.relaxedBody.read() !== null) {\n // do nothing\n }\n });\n this.hasErrored = true;\n // emit error\n this.output.emit('error', err);\n });\n this.cache.once('close', () => {\n this.sendSignedOutput();\n });\n this.relaxedBody.removeAllListeners('readable');\n this.relaxedBody.pipe(this.cache);\n }\n\n signStream() {\n this.parser = new MessageParser();\n this.relaxedBody = new RelaxedBody({\n hashAlgo: this.hashAlgo\n });\n\n this.parser.on('headers', value => {\n this.headers = value;\n });\n\n this.relaxedBody.on('hash', value => {\n this.bodyHash = value;\n });\n\n this.relaxedBody.on('readable', () => {\n let chunk;\n if (this.cache) {\n return;\n }\n while ((chunk = this.relaxedBody.read()) !== null) {\n this.chunks.push(chunk);\n this.chunklen += chunk.length;\n if (this.chunklen >= this.cacheTreshold && this.cachePath) {\n return this.createWriteCache();\n }\n }\n });\n\n this.relaxedBody.on('end', () => {\n if (this.cache) {\n return;\n }\n this.sendSignedOutput();\n });\n\n this.parser.pipe(this.relaxedBody);\n setImmediate(() => this.input.pipe(this.parser));\n }\n}\n\nclass DKIM {\n constructor(options) {\n this.options = options || {};\n this.keys = [].concat(\n this.options.keys || {\n domainName: options.domainName,\n keySelector: options.keySelector,\n privateKey: options.privateKey\n }\n );\n }\n\n sign(input, extraOptions) {\n let output = new PassThrough();\n let inputStream = input;\n let writeValue = false;\n\n if (Buffer.isBuffer(input)) {\n writeValue = input;\n inputStream = new PassThrough();\n } else if (typeof input === 'string') {\n writeValue = Buffer.from(input);\n inputStream = new PassThrough();\n }\n\n let options = this.options;\n if (extraOptions && Object.keys(extraOptions).length) {\n options = {};\n Object.keys(this.options || {}).forEach(key => {\n options[key] = this.options[key];\n });\n Object.keys(extraOptions || {}).forEach(key => {\n if (!(key in options)) {\n options[key] = extraOptions[key];\n }\n });\n }\n\n let signer = new DKIMSigner(options, this.keys, inputStream, output);\n setImmediate(() => {\n signer.signStream();\n if (writeValue) {\n setImmediate(() => {\n inputStream.end(writeValue);\n });\n }\n });\n\n return output;\n }\n}\n\nmodule.exports = DKIM;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFjdGlvbi1icm93c2VyKS8uL25vZGVfbW9kdWxlcy8ucG5wbS9ub2RlbWFpbGVyQDcuMC4xMy9ub2RlX21vZHVsZXMvbm9kZW1haWxlci9saWIvZGtpbS9pbmRleC5qcyIsIm1hcHBpbmdzIjoiQUFBYTs7QUFFYjtBQUNBOztBQUVBLHNCQUFzQixtQkFBTyxDQUFDLG9JQUFrQjtBQUNoRCxvQkFBb0IsbUJBQU8sQ0FBQyxnSUFBZ0I7QUFDNUMsYUFBYSxtQkFBTyxDQUFDLGdIQUFRO0FBQzdCLG9CQUFvQix5REFBNkI7QUFDakQsV0FBVyxtQkFBTyxDQUFDLGNBQUk7QUFDdkIsYUFBYSxtQkFBTyxDQUFDLGtCQUFNO0FBQzNCLGVBQWUsbUJBQU8sQ0FBQyxzQkFBUTs7QUFFL0I7QUFDQSwwQ0FBMEM7O0FBRTFDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLDBDQUEwQztBQUMxQztBQUNBLGFBQWE7QUFDYiwwQ0FBMEM7QUFDMUM7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBOztBQUVBIiwic291cmNlcyI6WyIvVXNlcnMvbWFyY21pbnRlbC9Qcm9qZWN0cy9lLXRpYi5jb20vbm9kZV9tb2R1bGVzLy5wbnBtL25vZGVtYWlsZXJANy4wLjEzL25vZGVfbW9kdWxlcy9ub2RlbWFpbGVyL2xpYi9ka2ltL2luZGV4LmpzIl0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcblxuLy8gRklYTUU6XG4vLyByZXBsYWNlIHRoaXMgVHJhbnNmb3JtIG1lc3Mgd2l0aCBhIG1ldGhvZCB0aGF0IHBpcGVzIGlucHV0IGFyZ3VtZW50IHRvIG91dHB1dCBhcmd1bWVudFxuXG5jb25zdCBNZXNzYWdlUGFyc2VyID0gcmVxdWlyZSgnLi9tZXNzYWdlLXBhcnNlcicpO1xuY29uc3QgUmVsYXhlZEJvZHkgPSByZXF1aXJlKCcuL3JlbGF4ZWQtYm9keScpO1xuY29uc3Qgc2lnbiA9IHJlcXVpcmUoJy4vc2lnbicpO1xuY29uc3QgUGFzc1Rocm91Z2ggPSByZXF1aXJlKCdzdHJlYW0nKS5QYXNzVGhyb3VnaDtcbmNvbnN0IGZzID0gcmVxdWlyZSgnZnMnKTtcbmNvbnN0IHBhdGggPSByZXF1aXJlKCdwYXRoJyk7XG5jb25zdCBjcnlwdG8gPSByZXF1aXJlKCdjcnlwdG8nKTtcblxuY29uc3QgREtJTV9BTEdPID0gJ3NoYTI1Nic7XG5jb25zdCBNQVhfTUVTU0FHRV9TSVpFID0gMiAqIDEwMjQgKiAxMDI0OyAvLyBidWZmZXIgbWVzc2FnZXMgbGFyZ2VyIHRoYW4gdGhpcyB0byBkaXNrXG5cbi8qXG4vLyBVc2FnZTpcblxubGV0IGRraW0gPSBuZXcgREtJTSh7XG4gICAgZG9tYWluTmFtZTogJ2V4YW1wbGUuY29tJyxcbiAgICBrZXlTZWxlY3RvcjogJ2tleS1zZWxlY3RvcicsXG4gICAgcHJpdmF0ZUtleSxcbiAgICBjYWNoZURpcjogJy90bXAnXG59KTtcbmRraW0uc2lnbihpbnB1dCkucGlwZShwcm9jZXNzLnN0ZG91dCk7XG5cbi8vIFdoZXJlIGlucHV0U3RyZWFtIGlzIGEgcmZjODIyIG1lc3NhZ2UgKGVpdGhlciBhIHN0cmVhbSwgc3RyaW5nIG9yIEJ1ZmZlcilcbi8vIGFuZCBvdXRwdXRTdHJlYW0gaXMgYSBES0lNIHNpZ25lZCByZmM4MjIgbWVzc2FnZVxuKi9cblxuY2xhc3MgREtJTVNpZ25lciB7XG4gICAgY29uc3RydWN0b3Iob3B0aW9ucywga2V5cywgaW5wdXQsIG91dHB1dCkge1xuICAgICAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICAgICAgICB0aGlzLmtleXMgPSBrZXlzO1xuXG4gICAgICAgIHRoaXMuY2FjaGVUcmVzaG9sZCA9IE51bWJlcih0aGlzLm9wdGlvbnMuY2FjaGVUcmVzaG9sZCkgfHwgTUFYX01FU1NBR0VfU0laRTtcbiAgICAgICAgdGhpcy5oYXNoQWxnbyA9IHRoaXMub3B0aW9ucy5oYXNoQWxnbyB8fCBES0lNX0FMR087XG5cbiAgICAgICAgdGhpcy5jYWNoZURpciA9IHRoaXMub3B0aW9ucy5jYWNoZURpciB8fCBmYWxzZTtcblxuICAgICAgICB0aGlzLmNodW5rcyA9IFtdO1xuICAgICAgICB0aGlzLmNodW5rbGVuID0gMDtcbiAgICAgICAgdGhpcy5yZWFkUG9zID0gMDtcbiAgICAgICAgdGhpcy5jYWNoZVBhdGggPSB0aGlzLmNhY2hlRGlyXG4gICAgICAgICAgICA/IHBhdGguam9pbih0aGlzLmNhY2hlRGlyLCAnbWVzc2FnZS4nICsgRGF0ZS5ub3coKSArICctJyArIGNyeXB0by5yYW5kb21CeXRlcygxNCkudG9TdHJpbmcoJ2hleCcpKVxuICAgICAgICAgICAgOiBmYWxzZTtcbiAgICAgICAgdGhpcy5jYWNoZSA9IGZhbHNlO1xuXG4gICAgICAgIHRoaXMuaGVhZGVycyA9IGZhbHNlO1xuICAgICAgICB0aGlzLmJvZHlIYXNoID0gZmFsc2U7XG4gICAgICAgIHRoaXMucGFyc2VyID0gZmFsc2U7XG4gICAgICAgIHRoaXMucmVsYXhlZEJvZHkgPSBmYWxzZTtcblxuICAgICAgICB0aGlzLmlucHV0ID0gaW5wdXQ7XG4gICAgICAgIHRoaXMub3V0cHV0ID0gb3V0cHV0O1xuICAgICAgICB0aGlzLm91dHB1dC51c2luZ0NhY2hlID0gZmFsc2U7XG5cbiAgICAgICAgdGhpcy5oYXNFcnJvcmVkID0gZmFsc2U7XG5cbiAgICAgICAgdGhpcy5pbnB1dC5vbignZXJyb3InLCBlcnIgPT4ge1xuICAgICAgICAgICAgdGhpcy5oYXNFcnJvcmVkID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMuY2xlYW51cCgpO1xuICAgICAgICAgICAgb3V0cHV0LmVtaXQoJ2Vycm9yJywgZXJyKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgY2xlYW51cCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLmNhY2hlIHx8ICF0aGlzLmNhY2hlUGF0aCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGZzLnVubGluayh0aGlzLmNhY2hlUGF0aCwgKCkgPT4gZmFsc2UpO1xuICAgIH1cblxuICAgIGNyZWF0ZVJlYWRDYWNoZSgpIHtcbiAgICAgICAgLy8gcGlwZSByZW1haW5pbmdzIHRvIGNhY2hlIGZpbGVcbiAgICAgICAgdGhpcy5jYWNoZSA9IGZzLmNyZWF0ZVJlYWRTdHJlYW0odGhpcy5jYWNoZVBhdGgpO1xuICAgICAgICB0aGlzLmNhY2hlLm9uY2UoJ2Vycm9yJywgZXJyID0+IHtcbiAgICAgICAgICAgIHRoaXMuY2xlYW51cCgpO1xuICAgICAgICAgICAgdGhpcy5vdXRwdXQuZW1pdCgnZXJyb3InLCBlcnIpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5jYWNoZS5vbmNlKCdjbG9zZScsICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuY2xlYW51cCgpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5jYWNoZS5waXBlKHRoaXMub3V0cHV0KTtcbiAgICB9XG5cbiAgICBzZW5kTmV4dENodW5rKCkge1xuICAgICAgICBpZiAodGhpcy5oYXNFcnJvcmVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5yZWFkUG9zID49IHRoaXMuY2h1bmtzLmxlbmd0aCkge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmNhY2hlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMub3V0cHV0LmVuZCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlUmVhZENhY2hlKCk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGNodW5rID0gdGhpcy5jaHVua3NbdGhpcy5yZWFkUG9zKytdO1xuICAgICAgICBpZiAodGhpcy5vdXRwdXQud3JpdGUoY2h1bmspID09PSBmYWxzZSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMub3V0cHV0Lm9uY2UoJ2RyYWluJywgKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuc2VuZE5leHRDaHVuaygpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgc2V0SW1tZWRpYXRlKCgpID0+IHRoaXMuc2VuZE5leHRDaHVuaygpKTtcbiAgICB9XG5cbiAgICBzZW5kU2lnbmVkT3V0cHV0KCkge1xuICAgICAgICBsZXQga2V5UG9zID0gMDtcbiAgICAgICAgbGV0IHNpZ25OZXh0S2V5ID0gKCkgPT4ge1xuICAgICAgICAgICAgaWYgKGtleVBvcyA+PSB0aGlzLmtleXMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5vdXRwdXQud3JpdGUodGhpcy5wYXJzZXIucmF3SGVhZGVycyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHNldEltbWVkaWF0ZSgoKSA9PiB0aGlzLnNlbmROZXh0Q2h1bmsoKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQga2V5ID0gdGhpcy5rZXlzW2tleVBvcysrXTtcbiAgICAgICAgICAgIGxldCBka2ltRmllbGQgPSBzaWduKHRoaXMuaGVhZGVycywgdGhpcy5oYXNoQWxnbywgdGhpcy5ib2R5SGFzaCwge1xuICAgICAgICAgICAgICAgIGRvbWFpbk5hbWU6IGtleS5kb21haW5OYW1lLFxuICAgICAgICAgICAgICAgIGtleVNlbGVjdG9yOiBrZXkua2V5U2VsZWN0b3IsXG4gICAgICAgICAgICAgICAgcHJpdmF0ZUtleToga2V5LnByaXZhdGVLZXksXG4gICAgICAgICAgICAgICAgaGVhZGVyRmllbGROYW1lczogdGhpcy5vcHRpb25zLmhlYWRlckZpZWxkTmFtZXMsXG4gICAgICAgICAgICAgICAgc2tpcEZpZWxkczogdGhpcy5vcHRpb25zLnNraXBGaWVsZHNcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKGRraW1GaWVsZCkge1xuICAgICAgICAgICAgICAgIHRoaXMub3V0cHV0LndyaXRlKEJ1ZmZlci5mcm9tKGRraW1GaWVsZCArICdcXHJcXG4nKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gc2V0SW1tZWRpYXRlKHNpZ25OZXh0S2V5KTtcbiAgICAgICAgfTtcblxuICAgICAgICBpZiAodGhpcy5ib2R5SGFzaCAmJiB0aGlzLmhlYWRlcnMpIHtcbiAgICAgICAgICAgIHJldHVybiBzaWduTmV4dEtleSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5vdXRwdXQud3JpdGUodGhpcy5wYXJzZXIucmF3SGVhZGVycyk7XG4gICAgICAgIHRoaXMuc2VuZE5leHRDaHVuaygpO1xuICAgIH1cblxuICAgIGNyZWF0ZVdyaXRlQ2FjaGUoKSB7XG4gICAgICAgIHRoaXMub3V0cHV0LnVzaW5nQ2FjaGUgPSB0cnVlO1xuICAgICAgICAvLyBwaXBlIHJlbWFpbmluZ3MgdG8gY2FjaGUgZmlsZVxuICAgICAgICB0aGlzLmNhY2hlID0gZnMuY3JlYXRlV3JpdGVTdHJlYW0odGhpcy5jYWNoZVBhdGgpO1xuICAgICAgICB0aGlzLmNhY2hlLm9uY2UoJ2Vycm9yJywgZXJyID0+IHtcbiAgICAgICAgICAgIHRoaXMuY2xlYW51cCgpO1xuICAgICAgICAgICAgLy8gZHJhaW4gaW5wdXRcbiAgICAgICAgICAgIHRoaXMucmVsYXhlZEJvZHkudW5waXBlKHRoaXMuY2FjaGUpO1xuICAgICAgICAgICAgdGhpcy5yZWxheGVkQm9keS5vbigncmVhZGFibGUnLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgd2hpbGUgKHRoaXMucmVsYXhlZEJvZHkucmVhZCgpICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMuaGFzRXJyb3JlZCA9IHRydWU7XG4gICAgICAgICAgICAvLyBlbWl0IGVycm9yXG4gICAgICAgICAgICB0aGlzLm91dHB1dC5lbWl0KCdlcnJvcicsIGVycik7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmNhY2hlLm9uY2UoJ2Nsb3NlJywgKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5zZW5kU2lnbmVkT3V0cHV0KCk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnJlbGF4ZWRCb2R5LnJlbW92ZUFsbExpc3RlbmVycygncmVhZGFibGUnKTtcbiAgICAgICAgdGhpcy5yZWxheGVkQm9keS5waXBlKHRoaXMuY2FjaGUpO1xuICAgIH1cblxuICAgIHNpZ25TdHJlYW0oKSB7XG4gICAgICAgIHRoaXMucGFyc2VyID0gbmV3IE1lc3NhZ2VQYXJzZXIoKTtcbiAgICAgICAgdGhpcy5yZWxheGVkQm9keSA9IG5ldyBSZWxheGVkQm9keSh7XG4gICAgICAgICAgICBoYXNoQWxnbzogdGhpcy5oYXNoQWxnb1xuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLnBhcnNlci5vbignaGVhZGVycycsIHZhbHVlID0+IHtcbiAgICAgICAgICAgIHRoaXMuaGVhZGVycyA9IHZhbHVlO1xuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLnJlbGF4ZWRCb2R5Lm9uKCdoYXNoJywgdmFsdWUgPT4ge1xuICAgICAgICAgICAgdGhpcy5ib2R5SGFzaCA9IHZhbHVlO1xuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLnJlbGF4ZWRCb2R5Lm9uKCdyZWFkYWJsZScsICgpID0+IHtcbiAgICAgICAgICAgIGxldCBjaHVuaztcbiAgICAgICAgICAgIGlmICh0aGlzLmNhY2hlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgd2hpbGUgKChjaHVuayA9IHRoaXMucmVsYXhlZEJvZHkucmVhZCgpKSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRoaXMuY2h1bmtzLnB1c2goY2h1bmspO1xuICAgICAgICAgICAgICAgIHRoaXMuY2h1bmtsZW4gKz0gY2h1bmsubGVuZ3RoO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmNodW5rbGVuID49IHRoaXMuY2FjaGVUcmVzaG9sZCAmJiB0aGlzLmNhY2hlUGF0aCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5jcmVhdGVXcml0ZUNhY2hlKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLnJlbGF4ZWRCb2R5Lm9uKCdlbmQnLCAoKSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5jYWNoZSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuc2VuZFNpZ25lZE91dHB1dCgpO1xuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLnBhcnNlci5waXBlKHRoaXMucmVsYXhlZEJvZHkpO1xuICAgICAgICBzZXRJbW1lZGlhdGUoKCkgPT4gdGhpcy5pbnB1dC5waXBlKHRoaXMucGFyc2VyKSk7XG4gICAgfVxufVxuXG5jbGFzcyBES0lNIHtcbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zKSB7XG4gICAgICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gICAgICAgIHRoaXMua2V5cyA9IFtdLmNvbmNhdChcbiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5rZXlzIHx8IHtcbiAgICAgICAgICAgICAgICBkb21haW5OYW1lOiBvcHRpb25zLmRvbWFpbk5hbWUsXG4gICAgICAgICAgICAgICAga2V5U2VsZWN0b3I6IG9wdGlvbnMua2V5U2VsZWN0b3IsXG4gICAgICAgICAgICAgICAgcHJpdmF0ZUtleTogb3B0aW9ucy5wcml2YXRlS2V5XG4gICAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgc2lnbihpbnB1dCwgZXh0cmFPcHRpb25zKSB7XG4gICAgICAgIGxldCBvdXRwdXQgPSBuZXcgUGFzc1Rocm91Z2goKTtcbiAgICAgICAgbGV0IGlucHV0U3RyZWFtID0gaW5wdXQ7XG4gICAgICAgIGxldCB3cml0ZVZhbHVlID0gZmFsc2U7XG5cbiAgICAgICAgaWYgKEJ1ZmZlci5pc0J1ZmZlcihpbnB1dCkpIHtcbiAgICAgICAgICAgIHdyaXRlVmFsdWUgPSBpbnB1dDtcbiAgICAgICAgICAgIGlucHV0U3RyZWFtID0gbmV3IFBhc3NUaHJvdWdoKCk7XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGlucHV0ID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgd3JpdGVWYWx1ZSA9IEJ1ZmZlci5mcm9tKGlucHV0KTtcbiAgICAgICAgICAgIGlucHV0U3RyZWFtID0gbmV3IFBhc3NUaHJvdWdoKCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgb3B0aW9ucyA9IHRoaXMub3B0aW9ucztcbiAgICAgICAgaWYgKGV4dHJhT3B0aW9ucyAmJiBPYmplY3Qua2V5cyhleHRyYU9wdGlvbnMpLmxlbmd0aCkge1xuICAgICAgICAgICAgb3B0aW9ucyA9IHt9O1xuICAgICAgICAgICAgT2JqZWN0LmtleXModGhpcy5vcHRpb25zIHx8IHt9KS5mb3JFYWNoKGtleSA9PiB7XG4gICAgICAgICAgICAgICAgb3B0aW9uc1trZXldID0gdGhpcy5vcHRpb25zW2tleV07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIE9iamVjdC5rZXlzKGV4dHJhT3B0aW9ucyB8fCB7fSkuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghKGtleSBpbiBvcHRpb25zKSkge1xuICAgICAgICAgICAgICAgICAgICBvcHRpb25zW2tleV0gPSBleHRyYU9wdGlvbnNba2V5XTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBzaWduZXIgPSBuZXcgREtJTVNpZ25lcihvcHRpb25zLCB0aGlzLmtleXMsIGlucHV0U3RyZWFtLCBvdXRwdXQpO1xuICAgICAgICBzZXRJbW1lZGlhdGUoKCkgPT4ge1xuICAgICAgICAgICAgc2lnbmVyLnNpZ25TdHJlYW0oKTtcbiAgICAgICAgICAgIGlmICh3cml0ZVZhbHVlKSB7XG4gICAgICAgICAgICAgICAgc2V0SW1tZWRpYXRlKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaW5wdXRTdHJlYW0uZW5kKHdyaXRlVmFsdWUpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gb3V0cHV0O1xuICAgIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBES0lNO1xuIl0sIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6WzBdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(action-browser)/./node_modules/.pnpm/nodemailer@7.0.13/node_modules/nodemailer/lib/dkim/index.js\n");
|
||
|
||
/***/ }),
|
||
|
||
/***/ "(action-browser)/./node_modules/.pnpm/nodemailer@7.0.13/node_modules/nodemailer/lib/dkim/message-parser.js":
|
||
/*!*************************************************************************************************!*\
|
||
!*** ./node_modules/.pnpm/nodemailer@7.0.13/node_modules/nodemailer/lib/dkim/message-parser.js ***!
|
||
\*************************************************************************************************/
|
||
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
|
||
|
||
eval("\n\nconst Transform = (__webpack_require__(/*! stream */ \"stream\").Transform);\n\n/**\n * MessageParser instance is a transform stream that separates message headers\n * from the rest of the body. Headers are emitted with the 'headers' event. Message\n * body is passed on as the resulting stream.\n */\nclass MessageParser extends Transform {\n constructor(options) {\n super(options);\n this.lastBytes = Buffer.alloc(4);\n this.headersParsed = false;\n this.headerBytes = 0;\n this.headerChunks = [];\n this.rawHeaders = false;\n this.bodySize = 0;\n }\n\n /**\n * Keeps count of the last 4 bytes in order to detect line breaks on chunk boundaries\n *\n * @param {Buffer} data Next data chunk from the stream\n */\n updateLastBytes(data) {\n let lblen = this.lastBytes.length;\n let nblen = Math.min(data.length, lblen);\n\n // shift existing bytes\n for (let i = 0, len = lblen - nblen; i < len; i++) {\n this.lastBytes[i] = this.lastBytes[i + nblen];\n }\n\n // add new bytes\n for (let i = 1; i <= nblen; i++) {\n this.lastBytes[lblen - i] = data[data.length - i];\n }\n }\n\n /**\n * Finds and removes message headers from the remaining body. We want to keep\n * headers separated until final delivery to be able to modify these\n *\n * @param {Buffer} data Next chunk of data\n * @return {Boolean} Returns true if headers are already found or false otherwise\n */\n checkHeaders(data) {\n if (this.headersParsed) {\n return true;\n }\n\n let lblen = this.lastBytes.length;\n let headerPos = 0;\n this.curLinePos = 0;\n for (let i = 0, len = this.lastBytes.length + data.length; i < len; i++) {\n let chr;\n if (i < lblen) {\n chr = this.lastBytes[i];\n } else {\n chr = data[i - lblen];\n }\n if (chr === 0x0a && i) {\n let pr1 = i - 1 < lblen ? this.lastBytes[i - 1] : data[i - 1 - lblen];\n let pr2 = i > 1 ? (i - 2 < lblen ? this.lastBytes[i - 2] : data[i - 2 - lblen]) : false;\n if (pr1 === 0x0a) {\n this.headersParsed = true;\n headerPos = i - lblen + 1;\n this.headerBytes += headerPos;\n break;\n } else if (pr1 === 0x0d && pr2 === 0x0a) {\n this.headersParsed = true;\n headerPos = i - lblen + 1;\n this.headerBytes += headerPos;\n break;\n }\n }\n }\n\n if (this.headersParsed) {\n this.headerChunks.push(data.slice(0, headerPos));\n this.rawHeaders = Buffer.concat(this.headerChunks, this.headerBytes);\n this.headerChunks = null;\n this.emit('headers', this.parseHeaders());\n if (data.length - 1 > headerPos) {\n let chunk = data.slice(headerPos);\n this.bodySize += chunk.length;\n // this would be the first chunk of data sent downstream\n setImmediate(() => this.push(chunk));\n }\n return false;\n } else {\n this.headerBytes += data.length;\n this.headerChunks.push(data);\n }\n\n // store last 4 bytes to catch header break\n this.updateLastBytes(data);\n\n return false;\n }\n\n _transform(chunk, encoding, callback) {\n if (!chunk || !chunk.length) {\n return callback();\n }\n\n if (typeof chunk === 'string') {\n chunk = Buffer.from(chunk, encoding);\n }\n\n let headersFound;\n\n try {\n headersFound = this.checkHeaders(chunk);\n } catch (E) {\n return callback(E);\n }\n\n if (headersFound) {\n this.bodySize += chunk.length;\n this.push(chunk);\n }\n\n setImmediate(callback);\n }\n\n _flush(callback) {\n if (this.headerChunks) {\n let chunk = Buffer.concat(this.headerChunks, this.headerBytes);\n this.bodySize += chunk.length;\n this.push(chunk);\n this.headerChunks = null;\n }\n callback();\n }\n\n parseHeaders() {\n let lines = (this.rawHeaders || '').toString().split(/\\r?\\n/);\n for (let i = lines.length - 1; i > 0; i--) {\n if (/^\\s/.test(lines[i])) {\n lines[i - 1] += '\\n' + lines[i];\n lines.splice(i, 1);\n }\n }\n return lines\n .filter(line => line.trim())\n .map(line => ({\n key: line.substr(0, line.indexOf(':')).trim().toLowerCase(),\n line\n }));\n }\n}\n\nmodule.exports = MessageParser;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFjdGlvbi1icm93c2VyKS8uL25vZGVfbW9kdWxlcy8ucG5wbS9ub2RlbWFpbGVyQDcuMC4xMy9ub2RlX21vZHVsZXMvbm9kZW1haWxlci9saWIvZGtpbS9tZXNzYWdlLXBhcnNlci5qcyIsIm1hcHBpbmdzIjoiQUFBYTs7QUFFYixrQkFBa0IsdURBQTJCOztBQUU3QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsZUFBZSxRQUFRO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsNkNBQTZDLFNBQVM7QUFDdEQ7QUFDQTs7QUFFQTtBQUNBLHdCQUF3QixZQUFZO0FBQ3BDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsUUFBUTtBQUN2QixnQkFBZ0IsU0FBUztBQUN6QjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLG1FQUFtRSxTQUFTO0FBQzVFO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSx1Q0FBdUMsT0FBTztBQUM5QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBOztBQUVBIiwic291cmNlcyI6WyIvVXNlcnMvbWFyY21pbnRlbC9Qcm9qZWN0cy9lLXRpYi5jb20vbm9kZV9tb2R1bGVzLy5wbnBtL25vZGVtYWlsZXJANy4wLjEzL25vZGVfbW9kdWxlcy9ub2RlbWFpbGVyL2xpYi9ka2ltL21lc3NhZ2UtcGFyc2VyLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcblxuY29uc3QgVHJhbnNmb3JtID0gcmVxdWlyZSgnc3RyZWFtJykuVHJhbnNmb3JtO1xuXG4vKipcbiAqIE1lc3NhZ2VQYXJzZXIgaW5zdGFuY2UgaXMgYSB0cmFuc2Zvcm0gc3RyZWFtIHRoYXQgc2VwYXJhdGVzIG1lc3NhZ2UgaGVhZGVyc1xuICogZnJvbSB0aGUgcmVzdCBvZiB0aGUgYm9keS4gSGVhZGVycyBhcmUgZW1pdHRlZCB3aXRoIHRoZSAnaGVhZGVycycgZXZlbnQuIE1lc3NhZ2VcbiAqIGJvZHkgaXMgcGFzc2VkIG9uIGFzIHRoZSByZXN1bHRpbmcgc3RyZWFtLlxuICovXG5jbGFzcyBNZXNzYWdlUGFyc2VyIGV4dGVuZHMgVHJhbnNmb3JtIHtcbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zKSB7XG4gICAgICAgIHN1cGVyKG9wdGlvbnMpO1xuICAgICAgICB0aGlzLmxhc3RCeXRlcyA9IEJ1ZmZlci5hbGxvYyg0KTtcbiAgICAgICAgdGhpcy5oZWFkZXJzUGFyc2VkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuaGVhZGVyQnl0ZXMgPSAwO1xuICAgICAgICB0aGlzLmhlYWRlckNodW5rcyA9IFtdO1xuICAgICAgICB0aGlzLnJhd0hlYWRlcnMgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5ib2R5U2l6ZSA9IDA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogS2VlcHMgY291bnQgb2YgdGhlIGxhc3QgNCBieXRlcyBpbiBvcmRlciB0byBkZXRlY3QgbGluZSBicmVha3Mgb24gY2h1bmsgYm91bmRhcmllc1xuICAgICAqXG4gICAgICogQHBhcmFtIHtCdWZmZXJ9IGRhdGEgTmV4dCBkYXRhIGNodW5rIGZyb20gdGhlIHN0cmVhbVxuICAgICAqL1xuICAgIHVwZGF0ZUxhc3RCeXRlcyhkYXRhKSB7XG4gICAgICAgIGxldCBsYmxlbiA9IHRoaXMubGFzdEJ5dGVzLmxlbmd0aDtcbiAgICAgICAgbGV0IG5ibGVuID0gTWF0aC5taW4oZGF0YS5sZW5ndGgsIGxibGVuKTtcblxuICAgICAgICAvLyBzaGlmdCBleGlzdGluZyBieXRlc1xuICAgICAgICBmb3IgKGxldCBpID0gMCwgbGVuID0gbGJsZW4gLSBuYmxlbjsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgICB0aGlzLmxhc3RCeXRlc1tpXSA9IHRoaXMubGFzdEJ5dGVzW2kgKyBuYmxlbl07XG4gICAgICAgIH1cblxuICAgICAgICAvLyBhZGQgbmV3IGJ5dGVzXG4gICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDw9IG5ibGVuOyBpKyspIHtcbiAgICAgICAgICAgIHRoaXMubGFzdEJ5dGVzW2xibGVuIC0gaV0gPSBkYXRhW2RhdGEubGVuZ3RoIC0gaV07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGaW5kcyBhbmQgcmVtb3ZlcyBtZXNzYWdlIGhlYWRlcnMgZnJvbSB0aGUgcmVtYWluaW5nIGJvZHkuIFdlIHdhbnQgdG8ga2VlcFxuICAgICAqIGhlYWRlcnMgc2VwYXJhdGVkIHVudGlsIGZpbmFsIGRlbGl2ZXJ5IHRvIGJlIGFibGUgdG8gbW9kaWZ5IHRoZXNlXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0J1ZmZlcn0gZGF0YSBOZXh0IGNodW5rIG9mIGRhdGFcbiAgICAgKiBAcmV0dXJuIHtCb29sZWFufSBSZXR1cm5zIHRydWUgaWYgaGVhZGVycyBhcmUgYWxyZWFkeSBmb3VuZCBvciBmYWxzZSBvdGhlcndpc2VcbiAgICAgKi9cbiAgICBjaGVja0hlYWRlcnMoZGF0YSkge1xuICAgICAgICBpZiAodGhpcy5oZWFkZXJzUGFyc2VkKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsYmxlbiA9IHRoaXMubGFzdEJ5dGVzLmxlbmd0aDtcbiAgICAgICAgbGV0IGhlYWRlclBvcyA9IDA7XG4gICAgICAgIHRoaXMuY3VyTGluZVBvcyA9IDA7XG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSB0aGlzLmxhc3RCeXRlcy5sZW5ndGggKyBkYXRhLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgY2hyO1xuICAgICAgICAgICAgaWYgKGkgPCBsYmxlbikge1xuICAgICAgICAgICAgICAgIGNociA9IHRoaXMubGFzdEJ5dGVzW2ldO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjaHIgPSBkYXRhW2kgLSBsYmxlbl07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoY2hyID09PSAweDBhICYmIGkpIHtcbiAgICAgICAgICAgICAgICBsZXQgcHIxID0gaSAtIDEgPCBsYmxlbiA/IHRoaXMubGFzdEJ5dGVzW2kgLSAxXSA6IGRhdGFbaSAtIDEgLSBsYmxlbl07XG4gICAgICAgICAgICAgICAgbGV0IHByMiA9IGkgPiAxID8gKGkgLSAyIDwgbGJsZW4gPyB0aGlzLmxhc3RCeXRlc1tpIC0gMl0gOiBkYXRhW2kgLSAyIC0gbGJsZW5dKSA6IGZhbHNlO1xuICAgICAgICAgICAgICAgIGlmIChwcjEgPT09IDB4MGEpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5oZWFkZXJzUGFyc2VkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgaGVhZGVyUG9zID0gaSAtIGxibGVuICsgMTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5oZWFkZXJCeXRlcyArPSBoZWFkZXJQb3M7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocHIxID09PSAweDBkICYmIHByMiA9PT0gMHgwYSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmhlYWRlcnNQYXJzZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBoZWFkZXJQb3MgPSBpIC0gbGJsZW4gKyAxO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmhlYWRlckJ5dGVzICs9IGhlYWRlclBvcztcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuaGVhZGVyc1BhcnNlZCkge1xuICAgICAgICAgICAgdGhpcy5oZWFkZXJDaHVua3MucHVzaChkYXRhLnNsaWNlKDAsIGhlYWRlclBvcykpO1xuICAgICAgICAgICAgdGhpcy5yYXdIZWFkZXJzID0gQnVmZmVyLmNvbmNhdCh0aGlzLmhlYWRlckNodW5rcywgdGhpcy5oZWFkZXJCeXRlcyk7XG4gICAgICAgICAgICB0aGlzLmhlYWRlckNodW5rcyA9IG51bGw7XG4gICAgICAgICAgICB0aGlzLmVtaXQoJ2hlYWRlcnMnLCB0aGlzLnBhcnNlSGVhZGVycygpKTtcbiAgICAgICAgICAgIGlmIChkYXRhLmxlbmd0aCAtIDEgPiBoZWFkZXJQb3MpIHtcbiAgICAgICAgICAgICAgICBsZXQgY2h1bmsgPSBkYXRhLnNsaWNlKGhlYWRlclBvcyk7XG4gICAgICAgICAgICAgICAgdGhpcy5ib2R5U2l6ZSArPSBjaHVuay5sZW5ndGg7XG4gICAgICAgICAgICAgICAgLy8gdGhpcyB3b3VsZCBiZSB0aGUgZmlyc3QgY2h1bmsgb2YgZGF0YSBzZW50IGRvd25zdHJlYW1cbiAgICAgICAgICAgICAgICBzZXRJbW1lZGlhdGUoKCkgPT4gdGhpcy5wdXNoKGNodW5rKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmhlYWRlckJ5dGVzICs9IGRhdGEubGVuZ3RoO1xuICAgICAgICAgICAgdGhpcy5oZWFkZXJDaHVua3MucHVzaChkYXRhKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHN0b3JlIGxhc3QgNCBieXRlcyB0byBjYXRjaCBoZWFkZXIgYnJlYWtcbiAgICAgICAgdGhpcy51cGRhdGVMYXN0Qnl0ZXMoZGF0YSk7XG5cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIF90cmFuc2Zvcm0oY2h1bmssIGVuY29kaW5nLCBjYWxsYmFjaykge1xuICAgICAgICBpZiAoIWNodW5rIHx8ICFjaHVuay5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiBjYWxsYmFjaygpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHR5cGVvZiBjaHVuayA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGNodW5rID0gQnVmZmVyLmZyb20oY2h1bmssIGVuY29kaW5nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBoZWFkZXJzRm91bmQ7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGhlYWRlcnNGb3VuZCA9IHRoaXMuY2hlY2tIZWFkZXJzKGNodW5rKTtcbiAgICAgICAgfSBjYXRjaCAoRSkge1xuICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKEUpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGhlYWRlcnNGb3VuZCkge1xuICAgICAgICAgICAgdGhpcy5ib2R5U2l6ZSArPSBjaHVuay5sZW5ndGg7XG4gICAgICAgICAgICB0aGlzLnB1c2goY2h1bmspO1xuICAgICAgICB9XG5cbiAgICAgICAgc2V0SW1tZWRpYXRlKGNhbGxiYWNrKTtcbiAgICB9XG5cbiAgICBfZmx1c2goY2FsbGJhY2spIHtcbiAgICAgICAgaWYgKHRoaXMuaGVhZGVyQ2h1bmtzKSB7XG4gICAgICAgICAgICBsZXQgY2h1bmsgPSBCdWZmZXIuY29uY2F0KHRoaXMuaGVhZGVyQ2h1bmtzLCB0aGlzLmhlYWRlckJ5dGVzKTtcbiAgICAgICAgICAgIHRoaXMuYm9keVNpemUgKz0gY2h1bmsubGVuZ3RoO1xuICAgICAgICAgICAgdGhpcy5wdXNoKGNodW5rKTtcbiAgICAgICAgICAgIHRoaXMuaGVhZGVyQ2h1bmtzID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBjYWxsYmFjaygpO1xuICAgIH1cblxuICAgIHBhcnNlSGVhZGVycygpIHtcbiAgICAgICAgbGV0IGxpbmVzID0gKHRoaXMucmF3SGVhZGVycyB8fCAnJykudG9TdHJpbmcoKS5zcGxpdCgvXFxyP1xcbi8pO1xuICAgICAgICBmb3IgKGxldCBpID0gbGluZXMubGVuZ3RoIC0gMTsgaSA+IDA7IGktLSkge1xuICAgICAgICAgICAgaWYgKC9eXFxzLy50ZXN0KGxpbmVzW2ldKSkge1xuICAgICAgICAgICAgICAgIGxpbmVzW2kgLSAxXSArPSAnXFxuJyArIGxpbmVzW2ldO1xuICAgICAgICAgICAgICAgIGxpbmVzLnNwbGljZShpLCAxKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbGluZXNcbiAgICAgICAgICAgIC5maWx0ZXIobGluZSA9PiBsaW5lLnRyaW0oKSlcbiAgICAgICAgICAgIC5tYXAobGluZSA9PiAoe1xuICAgICAgICAgICAgICAgIGtleTogbGluZS5zdWJzdHIoMCwgbGluZS5pbmRleE9mKCc6JykpLnRyaW0oKS50b0xvd2VyQ2FzZSgpLFxuICAgICAgICAgICAgICAgIGxpbmVcbiAgICAgICAgICAgIH0pKTtcbiAgICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gTWVzc2FnZVBhcnNlcjtcbiJdLCJuYW1lcyI6W10sImlnbm9yZUxpc3QiOlswXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(action-browser)/./node_modules/.pnpm/nodemailer@7.0.13/node_modules/nodemailer/lib/dkim/message-parser.js\n");
|
||
|
||
/***/ }),
|
||
|
||
/***/ "(action-browser)/./node_modules/.pnpm/nodemailer@7.0.13/node_modules/nodemailer/lib/dkim/relaxed-body.js":
|
||
/*!***********************************************************************************************!*\
|
||
!*** ./node_modules/.pnpm/nodemailer@7.0.13/node_modules/nodemailer/lib/dkim/relaxed-body.js ***!
|
||
\***********************************************************************************************/
|
||
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
|
||
|
||
eval("\n\n// streams through a message body and calculates relaxed body hash\n\nconst Transform = (__webpack_require__(/*! stream */ \"stream\").Transform);\nconst crypto = __webpack_require__(/*! crypto */ \"crypto\");\n\nclass RelaxedBody extends Transform {\n constructor(options) {\n super();\n options = options || {};\n this.chunkBuffer = [];\n this.chunkBufferLen = 0;\n this.bodyHash = crypto.createHash(options.hashAlgo || 'sha1');\n this.remainder = '';\n this.byteLength = 0;\n\n this.debug = options.debug;\n this._debugBody = options.debug ? [] : false;\n }\n\n updateHash(chunk) {\n let bodyStr;\n\n // find next remainder\n let nextRemainder = '';\n\n // This crux finds and removes the spaces from the last line and the newline characters after the last non-empty line\n // If we get another chunk that does not match this description then we can restore the previously processed data\n let state = 'file';\n for (let i = chunk.length - 1; i >= 0; i--) {\n let c = chunk[i];\n\n if (state === 'file' && (c === 0x0a || c === 0x0d)) {\n // do nothing, found \\n or \\r at the end of chunk, stil end of file\n } else if (state === 'file' && (c === 0x09 || c === 0x20)) {\n // switch to line ending mode, this is the last non-empty line\n state = 'line';\n } else if (state === 'line' && (c === 0x09 || c === 0x20)) {\n // do nothing, found ' ' or \\t at the end of line, keep processing the last non-empty line\n } else if (state === 'file' || state === 'line') {\n // non line/file ending character found, switch to body mode\n state = 'body';\n if (i === chunk.length - 1) {\n // final char is not part of line end or file end, so do nothing\n break;\n }\n }\n\n if (i === 0) {\n // reached to the beginning of the chunk, check if it is still about the ending\n // and if the remainder also matches\n if (\n (state === 'file' && (!this.remainder || /[\\r\\n]$/.test(this.remainder))) ||\n (state === 'line' && (!this.remainder || /[ \\t]$/.test(this.remainder)))\n ) {\n // keep everything\n this.remainder += chunk.toString('binary');\n return;\n } else if (state === 'line' || state === 'file') {\n // process existing remainder as normal line but store the current chunk\n nextRemainder = chunk.toString('binary');\n chunk = false;\n break;\n }\n }\n\n if (state !== 'body') {\n continue;\n }\n\n // reached first non ending byte\n nextRemainder = chunk.slice(i + 1).toString('binary');\n chunk = chunk.slice(0, i + 1);\n break;\n }\n\n let needsFixing = !!this.remainder;\n if (chunk && !needsFixing) {\n // check if we even need to change anything\n for (let i = 0, len = chunk.length; i < len; i++) {\n if (i && chunk[i] === 0x0a && chunk[i - 1] !== 0x0d) {\n // missing \\r before \\n\n needsFixing = true;\n break;\n } else if (i && chunk[i] === 0x0d && chunk[i - 1] === 0x20) {\n // trailing WSP found\n needsFixing = true;\n break;\n } else if (i && chunk[i] === 0x20 && chunk[i - 1] === 0x20) {\n // multiple spaces found, needs to be replaced with just one\n needsFixing = true;\n break;\n } else if (chunk[i] === 0x09) {\n // TAB found, needs to be replaced with a space\n needsFixing = true;\n break;\n }\n }\n }\n\n if (needsFixing) {\n bodyStr = this.remainder + (chunk ? chunk.toString('binary') : '');\n this.remainder = nextRemainder;\n bodyStr = bodyStr\n .replace(/\\r?\\n/g, '\\n') // use js line endings\n .replace(/[ \\t]*$/gm, '') // remove line endings, rtrim\n .replace(/[ \\t]+/gm, ' ') // single spaces\n .replace(/\\n/g, '\\r\\n'); // restore rfc822 line endings\n chunk = Buffer.from(bodyStr, 'binary');\n } else if (nextRemainder) {\n this.remainder = nextRemainder;\n }\n\n if (this.debug) {\n this._debugBody.push(chunk);\n }\n this.bodyHash.update(chunk);\n }\n\n _transform(chunk, encoding, callback) {\n if (!chunk || !chunk.length) {\n return callback();\n }\n\n if (typeof chunk === 'string') {\n chunk = Buffer.from(chunk, encoding);\n }\n\n this.updateHash(chunk);\n\n this.byteLength += chunk.length;\n this.push(chunk);\n callback();\n }\n\n _flush(callback) {\n // generate final hash and emit it\n if (/[\\r\\n]$/.test(this.remainder) && this.byteLength > 2) {\n // add terminating line end\n this.bodyHash.update(Buffer.from('\\r\\n'));\n }\n if (!this.byteLength) {\n // emit empty line buffer to keep the stream flowing\n this.push(Buffer.from('\\r\\n'));\n // this.bodyHash.update(Buffer.from('\\r\\n'));\n }\n\n this.emit('hash', this.bodyHash.digest('base64'), this.debug ? Buffer.concat(this._debugBody) : false);\n callback();\n }\n}\n\nmodule.exports = RelaxedBody;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFjdGlvbi1icm93c2VyKS8uL25vZGVfbW9kdWxlcy8ucG5wbS9ub2RlbWFpbGVyQDcuMC4xMy9ub2RlX21vZHVsZXMvbm9kZW1haWxlci9saWIvZGtpbS9yZWxheGVkLWJvZHkuanMiLCJtYXBwaW5ncyI6IkFBQWE7O0FBRWI7O0FBRUEsa0JBQWtCLHVEQUEyQjtBQUM3QyxlQUFlLG1CQUFPLENBQUMsc0JBQVE7O0FBRS9CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLHVDQUF1QyxRQUFRO0FBQy9DOztBQUVBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsZ0RBQWdELFNBQVM7QUFDekQ7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0I7QUFDbEI7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5Q0FBeUM7QUFDekM7QUFDQSxVQUFVO0FBQ1Y7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBIiwic291cmNlcyI6WyIvVXNlcnMvbWFyY21pbnRlbC9Qcm9qZWN0cy9lLXRpYi5jb20vbm9kZV9tb2R1bGVzLy5wbnBtL25vZGVtYWlsZXJANy4wLjEzL25vZGVfbW9kdWxlcy9ub2RlbWFpbGVyL2xpYi9ka2ltL3JlbGF4ZWQtYm9keS5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbi8vIHN0cmVhbXMgdGhyb3VnaCBhIG1lc3NhZ2UgYm9keSBhbmQgY2FsY3VsYXRlcyByZWxheGVkIGJvZHkgaGFzaFxuXG5jb25zdCBUcmFuc2Zvcm0gPSByZXF1aXJlKCdzdHJlYW0nKS5UcmFuc2Zvcm07XG5jb25zdCBjcnlwdG8gPSByZXF1aXJlKCdjcnlwdG8nKTtcblxuY2xhc3MgUmVsYXhlZEJvZHkgZXh0ZW5kcyBUcmFuc2Zvcm0ge1xuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnMpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gICAgICAgIHRoaXMuY2h1bmtCdWZmZXIgPSBbXTtcbiAgICAgICAgdGhpcy5jaHVua0J1ZmZlckxlbiA9IDA7XG4gICAgICAgIHRoaXMuYm9keUhhc2ggPSBjcnlwdG8uY3JlYXRlSGFzaChvcHRpb25zLmhhc2hBbGdvIHx8ICdzaGExJyk7XG4gICAgICAgIHRoaXMucmVtYWluZGVyID0gJyc7XG4gICAgICAgIHRoaXMuYnl0ZUxlbmd0aCA9IDA7XG5cbiAgICAgICAgdGhpcy5kZWJ1ZyA9IG9wdGlvbnMuZGVidWc7XG4gICAgICAgIHRoaXMuX2RlYnVnQm9keSA9IG9wdGlvbnMuZGVidWcgPyBbXSA6IGZhbHNlO1xuICAgIH1cblxuICAgIHVwZGF0ZUhhc2goY2h1bmspIHtcbiAgICAgICAgbGV0IGJvZHlTdHI7XG5cbiAgICAgICAgLy8gZmluZCBuZXh0IHJlbWFpbmRlclxuICAgICAgICBsZXQgbmV4dFJlbWFpbmRlciA9ICcnO1xuXG4gICAgICAgIC8vIFRoaXMgY3J1eCBmaW5kcyBhbmQgcmVtb3ZlcyB0aGUgc3BhY2VzIGZyb20gdGhlIGxhc3QgbGluZSBhbmQgdGhlIG5ld2xpbmUgY2hhcmFjdGVycyBhZnRlciB0aGUgbGFzdCBub24tZW1wdHkgbGluZVxuICAgICAgICAvLyBJZiB3ZSBnZXQgYW5vdGhlciBjaHVuayB0aGF0IGRvZXMgbm90IG1hdGNoIHRoaXMgZGVzY3JpcHRpb24gdGhlbiB3ZSBjYW4gcmVzdG9yZSB0aGUgcHJldmlvdXNseSBwcm9jZXNzZWQgZGF0YVxuICAgICAgICBsZXQgc3RhdGUgPSAnZmlsZSc7XG4gICAgICAgIGZvciAobGV0IGkgPSBjaHVuay5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICAgICAgbGV0IGMgPSBjaHVua1tpXTtcblxuICAgICAgICAgICAgaWYgKHN0YXRlID09PSAnZmlsZScgJiYgKGMgPT09IDB4MGEgfHwgYyA9PT0gMHgwZCkpIHtcbiAgICAgICAgICAgICAgICAvLyBkbyBub3RoaW5nLCBmb3VuZCBcXG4gb3IgXFxyIGF0IHRoZSBlbmQgb2YgY2h1bmssIHN0aWwgZW5kIG9mIGZpbGVcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RhdGUgPT09ICdmaWxlJyAmJiAoYyA9PT0gMHgwOSB8fCBjID09PSAweDIwKSkge1xuICAgICAgICAgICAgICAgIC8vIHN3aXRjaCB0byBsaW5lIGVuZGluZyBtb2RlLCB0aGlzIGlzIHRoZSBsYXN0IG5vbi1lbXB0eSBsaW5lXG4gICAgICAgICAgICAgICAgc3RhdGUgPSAnbGluZSc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHN0YXRlID09PSAnbGluZScgJiYgKGMgPT09IDB4MDkgfHwgYyA9PT0gMHgyMCkpIHtcbiAgICAgICAgICAgICAgICAvLyBkbyBub3RoaW5nLCBmb3VuZCAnICcgb3IgXFx0IGF0IHRoZSBlbmQgb2YgbGluZSwga2VlcCBwcm9jZXNzaW5nIHRoZSBsYXN0IG5vbi1lbXB0eSBsaW5lXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHN0YXRlID09PSAnZmlsZScgfHwgc3RhdGUgPT09ICdsaW5lJykge1xuICAgICAgICAgICAgICAgIC8vIG5vbiBsaW5lL2ZpbGUgZW5kaW5nIGNoYXJhY3RlciBmb3VuZCwgc3dpdGNoIHRvIGJvZHkgbW9kZVxuICAgICAgICAgICAgICAgIHN0YXRlID0gJ2JvZHknO1xuICAgICAgICAgICAgICAgIGlmIChpID09PSBjaHVuay5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGZpbmFsIGNoYXIgaXMgbm90IHBhcnQgb2YgbGluZSBlbmQgb3IgZmlsZSBlbmQsIHNvIGRvIG5vdGhpbmdcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoaSA9PT0gMCkge1xuICAgICAgICAgICAgICAgIC8vIHJlYWNoZWQgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgY2h1bmssIGNoZWNrIGlmIGl0IGlzIHN0aWxsIGFib3V0IHRoZSBlbmRpbmdcbiAgICAgICAgICAgICAgICAvLyBhbmQgaWYgdGhlIHJlbWFpbmRlciBhbHNvIG1hdGNoZXNcbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgIChzdGF0ZSA9PT0gJ2ZpbGUnICYmICghdGhpcy5yZW1haW5kZXIgfHwgL1tcXHJcXG5dJC8udGVzdCh0aGlzLnJlbWFpbmRlcikpKSB8fFxuICAgICAgICAgICAgICAgICAgICAoc3RhdGUgPT09ICdsaW5lJyAmJiAoIXRoaXMucmVtYWluZGVyIHx8IC9bIFxcdF0kLy50ZXN0KHRoaXMucmVtYWluZGVyKSkpXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGtlZXAgZXZlcnl0aGluZ1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbWFpbmRlciArPSBjaHVuay50b1N0cmluZygnYmluYXJ5Jyk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0YXRlID09PSAnbGluZScgfHwgc3RhdGUgPT09ICdmaWxlJykge1xuICAgICAgICAgICAgICAgICAgICAvLyBwcm9jZXNzIGV4aXN0aW5nIHJlbWFpbmRlciBhcyBub3JtYWwgbGluZSBidXQgc3RvcmUgdGhlIGN1cnJlbnQgY2h1bmtcbiAgICAgICAgICAgICAgICAgICAgbmV4dFJlbWFpbmRlciA9IGNodW5rLnRvU3RyaW5nKCdiaW5hcnknKTtcbiAgICAgICAgICAgICAgICAgICAgY2h1bmsgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoc3RhdGUgIT09ICdib2R5Jykge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyByZWFjaGVkIGZpcnN0IG5vbiBlbmRpbmcgYnl0ZVxuICAgICAgICAgICAgbmV4dFJlbWFpbmRlciA9IGNodW5rLnNsaWNlKGkgKyAxKS50b1N0cmluZygnYmluYXJ5Jyk7XG4gICAgICAgICAgICBjaHVuayA9IGNodW5rLnNsaWNlKDAsIGkgKyAxKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IG5lZWRzRml4aW5nID0gISF0aGlzLnJlbWFpbmRlcjtcbiAgICAgICAgaWYgKGNodW5rICYmICFuZWVkc0ZpeGluZykge1xuICAgICAgICAgICAgLy8gY2hlY2sgaWYgd2UgZXZlbiBuZWVkIHRvIGNoYW5nZSBhbnl0aGluZ1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IGNodW5rLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgICAgICAgaWYgKGkgJiYgY2h1bmtbaV0gPT09IDB4MGEgJiYgY2h1bmtbaSAtIDFdICE9PSAweDBkKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIG1pc3NpbmcgXFxyIGJlZm9yZSBcXG5cbiAgICAgICAgICAgICAgICAgICAgbmVlZHNGaXhpbmcgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGkgJiYgY2h1bmtbaV0gPT09IDB4MGQgJiYgY2h1bmtbaSAtIDFdID09PSAweDIwKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIHRyYWlsaW5nIFdTUCBmb3VuZFxuICAgICAgICAgICAgICAgICAgICBuZWVkc0ZpeGluZyA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaSAmJiBjaHVua1tpXSA9PT0gMHgyMCAmJiBjaHVua1tpIC0gMV0gPT09IDB4MjApIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gbXVsdGlwbGUgc3BhY2VzIGZvdW5kLCBuZWVkcyB0byBiZSByZXBsYWNlZCB3aXRoIGp1c3Qgb25lXG4gICAgICAgICAgICAgICAgICAgIG5lZWRzRml4aW5nID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaHVua1tpXSA9PT0gMHgwOSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBUQUIgZm91bmQsIG5lZWRzIHRvIGJlIHJlcGxhY2VkIHdpdGggYSBzcGFjZVxuICAgICAgICAgICAgICAgICAgICBuZWVkc0ZpeGluZyA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChuZWVkc0ZpeGluZykge1xuICAgICAgICAgICAgYm9keVN0ciA9IHRoaXMucmVtYWluZGVyICsgKGNodW5rID8gY2h1bmsudG9TdHJpbmcoJ2JpbmFyeScpIDogJycpO1xuICAgICAgICAgICAgdGhpcy5yZW1haW5kZXIgPSBuZXh0UmVtYWluZGVyO1xuICAgICAgICAgICAgYm9keVN0ciA9IGJvZHlTdHJcbiAgICAgICAgICAgICAgICAucmVwbGFjZSgvXFxyP1xcbi9nLCAnXFxuJykgLy8gdXNlIGpzIGxpbmUgZW5kaW5nc1xuICAgICAgICAgICAgICAgIC5yZXBsYWNlKC9bIFxcdF0qJC9nbSwgJycpIC8vIHJlbW92ZSBsaW5lIGVuZGluZ3MsIHJ0cmltXG4gICAgICAgICAgICAgICAgLnJlcGxhY2UoL1sgXFx0XSsvZ20sICcgJykgLy8gc2luZ2xlIHNwYWNlc1xuICAgICAgICAgICAgICAgIC5yZXBsYWNlKC9cXG4vZywgJ1xcclxcbicpOyAvLyByZXN0b3JlIHJmYzgyMiBsaW5lIGVuZGluZ3NcbiAgICAgICAgICAgIGNodW5rID0gQnVmZmVyLmZyb20oYm9keVN0ciwgJ2JpbmFyeScpO1xuICAgICAgICB9IGVsc2UgaWYgKG5leHRSZW1haW5kZXIpIHtcbiAgICAgICAgICAgIHRoaXMucmVtYWluZGVyID0gbmV4dFJlbWFpbmRlcjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmRlYnVnKSB7XG4gICAgICAgICAgICB0aGlzLl9kZWJ1Z0JvZHkucHVzaChjaHVuayk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5ib2R5SGFzaC51cGRhdGUoY2h1bmspO1xuICAgIH1cblxuICAgIF90cmFuc2Zvcm0oY2h1bmssIGVuY29kaW5nLCBjYWxsYmFjaykge1xuICAgICAgICBpZiAoIWNodW5rIHx8ICFjaHVuay5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiBjYWxsYmFjaygpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHR5cGVvZiBjaHVuayA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGNodW5rID0gQnVmZmVyLmZyb20oY2h1bmssIGVuY29kaW5nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMudXBkYXRlSGFzaChjaHVuayk7XG5cbiAgICAgICAgdGhpcy5ieXRlTGVuZ3RoICs9IGNodW5rLmxlbmd0aDtcbiAgICAgICAgdGhpcy5wdXNoKGNodW5rKTtcbiAgICAgICAgY2FsbGJhY2soKTtcbiAgICB9XG5cbiAgICBfZmx1c2goY2FsbGJhY2spIHtcbiAgICAgICAgLy8gZ2VuZXJhdGUgZmluYWwgaGFzaCBhbmQgZW1pdCBpdFxuICAgICAgICBpZiAoL1tcXHJcXG5dJC8udGVzdCh0aGlzLnJlbWFpbmRlcikgJiYgdGhpcy5ieXRlTGVuZ3RoID4gMikge1xuICAgICAgICAgICAgLy8gYWRkIHRlcm1pbmF0aW5nIGxpbmUgZW5kXG4gICAgICAgICAgICB0aGlzLmJvZHlIYXNoLnVwZGF0ZShCdWZmZXIuZnJvbSgnXFxyXFxuJykpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy5ieXRlTGVuZ3RoKSB7XG4gICAgICAgICAgICAvLyBlbWl0IGVtcHR5IGxpbmUgYnVmZmVyIHRvIGtlZXAgdGhlIHN0cmVhbSBmbG93aW5nXG4gICAgICAgICAgICB0aGlzLnB1c2goQnVmZmVyLmZyb20oJ1xcclxcbicpKTtcbiAgICAgICAgICAgIC8vIHRoaXMuYm9keUhhc2gudXBkYXRlKEJ1ZmZlci5mcm9tKCdcXHJcXG4nKSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmVtaXQoJ2hhc2gnLCB0aGlzLmJvZHlIYXNoLmRpZ2VzdCgnYmFzZTY0JyksIHRoaXMuZGVidWcgPyBCdWZmZXIuY29uY2F0KHRoaXMuX2RlYnVnQm9keSkgOiBmYWxzZSk7XG4gICAgICAgIGNhbGxiYWNrKCk7XG4gICAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IFJlbGF4ZWRCb2R5O1xuIl0sIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6WzBdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(action-browser)/./node_modules/.pnpm/nodemailer@7.0.13/node_modules/nodemailer/lib/dkim/relaxed-body.js\n");
|
||
|
||
/***/ }),
|
||
|
||
/***/ "(action-browser)/./node_modules/.pnpm/nodemailer@7.0.13/node_modules/nodemailer/lib/dkim/sign.js":
|
||
/*!***************************************************************************************!*\
|
||
!*** ./node_modules/.pnpm/nodemailer@7.0.13/node_modules/nodemailer/lib/dkim/sign.js ***!
|
||
\***************************************************************************************/
|
||
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
|
||
|
||
eval("\n\nconst punycode = __webpack_require__(/*! ../punycode */ \"(action-browser)/./node_modules/.pnpm/nodemailer@7.0.13/node_modules/nodemailer/lib/punycode/index.js\");\nconst mimeFuncs = __webpack_require__(/*! ../mime-funcs */ \"(action-browser)/./node_modules/.pnpm/nodemailer@7.0.13/node_modules/nodemailer/lib/mime-funcs/index.js\");\nconst crypto = __webpack_require__(/*! crypto */ \"crypto\");\n\n/**\n * Returns DKIM signature header line\n *\n * @param {Object} headers Parsed headers object from MessageParser\n * @param {String} bodyHash Base64 encoded hash of the message\n * @param {Object} options DKIM options\n * @param {String} options.domainName Domain name to be signed for\n * @param {String} options.keySelector DKIM key selector to use\n * @param {String} options.privateKey DKIM private key to use\n * @return {String} Complete header line\n */\n\nmodule.exports = (headers, hashAlgo, bodyHash, options) => {\n options = options || {};\n\n // all listed fields from RFC4871 #5.5\n let defaultFieldNames =\n 'From:Sender:Reply-To:Subject:Date:Message-ID:To:' +\n 'Cc:MIME-Version:Content-Type:Content-Transfer-Encoding:Content-ID:' +\n 'Content-Description:Resent-Date:Resent-From:Resent-Sender:' +\n 'Resent-To:Resent-Cc:Resent-Message-ID:In-Reply-To:References:' +\n 'List-Id:List-Help:List-Unsubscribe:List-Subscribe:List-Post:' +\n 'List-Owner:List-Archive';\n\n let fieldNames = options.headerFieldNames || defaultFieldNames;\n\n let canonicalizedHeaderData = relaxedHeaders(headers, fieldNames, options.skipFields);\n let dkimHeader = generateDKIMHeader(options.domainName, options.keySelector, canonicalizedHeaderData.fieldNames, hashAlgo, bodyHash);\n\n let signer, signature;\n\n canonicalizedHeaderData.headers += 'dkim-signature:' + relaxedHeaderLine(dkimHeader);\n\n signer = crypto.createSign(('rsa-' + hashAlgo).toUpperCase());\n signer.update(canonicalizedHeaderData.headers);\n try {\n signature = signer.sign(options.privateKey, 'base64');\n } catch (_E) {\n return false;\n }\n\n return dkimHeader + signature.replace(/(^.{73}|.{75}(?!\\r?\\n|\\r))/g, '$&\\r\\n ').trim();\n};\n\nmodule.exports.relaxedHeaders = relaxedHeaders;\n\nfunction generateDKIMHeader(domainName, keySelector, fieldNames, hashAlgo, bodyHash) {\n let dkim = [\n 'v=1',\n 'a=rsa-' + hashAlgo,\n 'c=relaxed/relaxed',\n 'd=' + punycode.toASCII(domainName),\n 'q=dns/txt',\n 's=' + keySelector,\n 'bh=' + bodyHash,\n 'h=' + fieldNames\n ].join('; ');\n\n return mimeFuncs.foldLines('DKIM-Signature: ' + dkim, 76) + ';\\r\\n b=';\n}\n\nfunction relaxedHeaders(headers, fieldNames, skipFields) {\n let includedFields = new Set();\n let skip = new Set();\n let headerFields = new Map();\n\n (skipFields || '')\n .toLowerCase()\n .split(':')\n .forEach(field => {\n skip.add(field.trim());\n });\n\n (fieldNames || '')\n .toLowerCase()\n .split(':')\n .filter(field => !skip.has(field.trim()))\n .forEach(field => {\n includedFields.add(field.trim());\n });\n\n for (let i = headers.length - 1; i >= 0; i--) {\n let line = headers[i];\n // only include the first value from bottom to top\n if (includedFields.has(line.key) && !headerFields.has(line.key)) {\n headerFields.set(line.key, relaxedHeaderLine(line.line));\n }\n }\n\n let headersList = [];\n let fields = [];\n includedFields.forEach(field => {\n if (headerFields.has(field)) {\n fields.push(field);\n headersList.push(field + ':' + headerFields.get(field));\n }\n });\n\n return {\n headers: headersList.join('\\r\\n') + '\\r\\n',\n fieldNames: fields.join(':')\n };\n}\n\nfunction relaxedHeaderLine(line) {\n return line\n .substr(line.indexOf(':') + 1)\n .replace(/\\r?\\n/g, '')\n .replace(/\\s+/g, ' ')\n .trim();\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFjdGlvbi1icm93c2VyKS8uL25vZGVfbW9kdWxlcy8ucG5wbS9ub2RlbWFpbGVyQDcuMC4xMy9ub2RlX21vZHVsZXMvbm9kZW1haWxlci9saWIvZGtpbS9zaWduLmpzIiwibWFwcGluZ3MiOiJBQUFhOztBQUViLGlCQUFpQixtQkFBTyxDQUFDLDBIQUFhO0FBQ3RDLGtCQUFrQixtQkFBTyxDQUFDLDhIQUFlO0FBQ3pDLGVBQWUsbUJBQU8sQ0FBQyxzQkFBUTs7QUFFL0I7QUFDQTtBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CLFdBQVcsUUFBUTtBQUNuQixXQUFXLFFBQVE7QUFDbkIsV0FBVyxRQUFRO0FBQ25CLFdBQVcsUUFBUTtBQUNuQixXQUFXLFFBQVE7QUFDbkIsWUFBWSxRQUFRO0FBQ3BCOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7O0FBRUEsK0NBQStDLEdBQUcsR0FBRyxHQUFHO0FBQ3hEOztBQUVBLDZCQUE2Qjs7QUFFN0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjOztBQUVkLGtFQUFrRTtBQUNsRTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTOztBQUVULHFDQUFxQyxRQUFRO0FBQzdDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsiL1VzZXJzL21hcmNtaW50ZWwvUHJvamVjdHMvZS10aWIuY29tL25vZGVfbW9kdWxlcy8ucG5wbS9ub2RlbWFpbGVyQDcuMC4xMy9ub2RlX21vZHVsZXMvbm9kZW1haWxlci9saWIvZGtpbS9zaWduLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcblxuY29uc3QgcHVueWNvZGUgPSByZXF1aXJlKCcuLi9wdW55Y29kZScpO1xuY29uc3QgbWltZUZ1bmNzID0gcmVxdWlyZSgnLi4vbWltZS1mdW5jcycpO1xuY29uc3QgY3J5cHRvID0gcmVxdWlyZSgnY3J5cHRvJyk7XG5cbi8qKlxuICogUmV0dXJucyBES0lNIHNpZ25hdHVyZSBoZWFkZXIgbGluZVxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBoZWFkZXJzIFBhcnNlZCBoZWFkZXJzIG9iamVjdCBmcm9tIE1lc3NhZ2VQYXJzZXJcbiAqIEBwYXJhbSB7U3RyaW5nfSBib2R5SGFzaCBCYXNlNjQgZW5jb2RlZCBoYXNoIG9mIHRoZSBtZXNzYWdlXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyBES0lNIG9wdGlvbnNcbiAqIEBwYXJhbSB7U3RyaW5nfSBvcHRpb25zLmRvbWFpbk5hbWUgRG9tYWluIG5hbWUgdG8gYmUgc2lnbmVkIGZvclxuICogQHBhcmFtIHtTdHJpbmd9IG9wdGlvbnMua2V5U2VsZWN0b3IgREtJTSBrZXkgc2VsZWN0b3IgdG8gdXNlXG4gKiBAcGFyYW0ge1N0cmluZ30gb3B0aW9ucy5wcml2YXRlS2V5IERLSU0gcHJpdmF0ZSBrZXkgdG8gdXNlXG4gKiBAcmV0dXJuIHtTdHJpbmd9IENvbXBsZXRlIGhlYWRlciBsaW5lXG4gKi9cblxubW9kdWxlLmV4cG9ydHMgPSAoaGVhZGVycywgaGFzaEFsZ28sIGJvZHlIYXNoLCBvcHRpb25zKSA9PiB7XG4gICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cbiAgICAvLyBhbGwgbGlzdGVkIGZpZWxkcyBmcm9tIFJGQzQ4NzEgIzUuNVxuICAgIGxldCBkZWZhdWx0RmllbGROYW1lcyA9XG4gICAgICAgICdGcm9tOlNlbmRlcjpSZXBseS1UbzpTdWJqZWN0OkRhdGU6TWVzc2FnZS1JRDpUbzonICtcbiAgICAgICAgJ0NjOk1JTUUtVmVyc2lvbjpDb250ZW50LVR5cGU6Q29udGVudC1UcmFuc2Zlci1FbmNvZGluZzpDb250ZW50LUlEOicgK1xuICAgICAgICAnQ29udGVudC1EZXNjcmlwdGlvbjpSZXNlbnQtRGF0ZTpSZXNlbnQtRnJvbTpSZXNlbnQtU2VuZGVyOicgK1xuICAgICAgICAnUmVzZW50LVRvOlJlc2VudC1DYzpSZXNlbnQtTWVzc2FnZS1JRDpJbi1SZXBseS1UbzpSZWZlcmVuY2VzOicgK1xuICAgICAgICAnTGlzdC1JZDpMaXN0LUhlbHA6TGlzdC1VbnN1YnNjcmliZTpMaXN0LVN1YnNjcmliZTpMaXN0LVBvc3Q6JyArXG4gICAgICAgICdMaXN0LU93bmVyOkxpc3QtQXJjaGl2ZSc7XG5cbiAgICBsZXQgZmllbGROYW1lcyA9IG9wdGlvbnMuaGVhZGVyRmllbGROYW1lcyB8fCBkZWZhdWx0RmllbGROYW1lcztcblxuICAgIGxldCBjYW5vbmljYWxpemVkSGVhZGVyRGF0YSA9IHJlbGF4ZWRIZWFkZXJzKGhlYWRlcnMsIGZpZWxkTmFtZXMsIG9wdGlvbnMuc2tpcEZpZWxkcyk7XG4gICAgbGV0IGRraW1IZWFkZXIgPSBnZW5lcmF0ZURLSU1IZWFkZXIob3B0aW9ucy5kb21haW5OYW1lLCBvcHRpb25zLmtleVNlbGVjdG9yLCBjYW5vbmljYWxpemVkSGVhZGVyRGF0YS5maWVsZE5hbWVzLCBoYXNoQWxnbywgYm9keUhhc2gpO1xuXG4gICAgbGV0IHNpZ25lciwgc2lnbmF0dXJlO1xuXG4gICAgY2Fub25pY2FsaXplZEhlYWRlckRhdGEuaGVhZGVycyArPSAnZGtpbS1zaWduYXR1cmU6JyArIHJlbGF4ZWRIZWFkZXJMaW5lKGRraW1IZWFkZXIpO1xuXG4gICAgc2lnbmVyID0gY3J5cHRvLmNyZWF0ZVNpZ24oKCdyc2EtJyArIGhhc2hBbGdvKS50b1VwcGVyQ2FzZSgpKTtcbiAgICBzaWduZXIudXBkYXRlKGNhbm9uaWNhbGl6ZWRIZWFkZXJEYXRhLmhlYWRlcnMpO1xuICAgIHRyeSB7XG4gICAgICAgIHNpZ25hdHVyZSA9IHNpZ25lci5zaWduKG9wdGlvbnMucHJpdmF0ZUtleSwgJ2Jhc2U2NCcpO1xuICAgIH0gY2F0Y2ggKF9FKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICByZXR1cm4gZGtpbUhlYWRlciArIHNpZ25hdHVyZS5yZXBsYWNlKC8oXi57NzN9fC57NzV9KD8hXFxyP1xcbnxcXHIpKS9nLCAnJCZcXHJcXG4gJykudHJpbSgpO1xufTtcblxubW9kdWxlLmV4cG9ydHMucmVsYXhlZEhlYWRlcnMgPSByZWxheGVkSGVhZGVycztcblxuZnVuY3Rpb24gZ2VuZXJhdGVES0lNSGVhZGVyKGRvbWFpbk5hbWUsIGtleVNlbGVjdG9yLCBmaWVsZE5hbWVzLCBoYXNoQWxnbywgYm9keUhhc2gpIHtcbiAgICBsZXQgZGtpbSA9IFtcbiAgICAgICAgJ3Y9MScsXG4gICAgICAgICdhPXJzYS0nICsgaGFzaEFsZ28sXG4gICAgICAgICdjPXJlbGF4ZWQvcmVsYXhlZCcsXG4gICAgICAgICdkPScgKyBwdW55Y29kZS50b0FTQ0lJKGRvbWFpbk5hbWUpLFxuICAgICAgICAncT1kbnMvdHh0JyxcbiAgICAgICAgJ3M9JyArIGtleVNlbGVjdG9yLFxuICAgICAgICAnYmg9JyArIGJvZHlIYXNoLFxuICAgICAgICAnaD0nICsgZmllbGROYW1lc1xuICAgIF0uam9pbignOyAnKTtcblxuICAgIHJldHVybiBtaW1lRnVuY3MuZm9sZExpbmVzKCdES0lNLVNpZ25hdHVyZTogJyArIGRraW0sIDc2KSArICc7XFxyXFxuIGI9Jztcbn1cblxuZnVuY3Rpb24gcmVsYXhlZEhlYWRlcnMoaGVhZGVycywgZmllbGROYW1lcywgc2tpcEZpZWxkcykge1xuICAgIGxldCBpbmNsdWRlZEZpZWxkcyA9IG5ldyBTZXQoKTtcbiAgICBsZXQgc2tpcCA9IG5ldyBTZXQoKTtcbiAgICBsZXQgaGVhZGVyRmllbGRzID0gbmV3IE1hcCgpO1xuXG4gICAgKHNraXBGaWVsZHMgfHwgJycpXG4gICAgICAgIC50b0xvd2VyQ2FzZSgpXG4gICAgICAgIC5zcGxpdCgnOicpXG4gICAgICAgIC5mb3JFYWNoKGZpZWxkID0+IHtcbiAgICAgICAgICAgIHNraXAuYWRkKGZpZWxkLnRyaW0oKSk7XG4gICAgICAgIH0pO1xuXG4gICAgKGZpZWxkTmFtZXMgfHwgJycpXG4gICAgICAgIC50b0xvd2VyQ2FzZSgpXG4gICAgICAgIC5zcGxpdCgnOicpXG4gICAgICAgIC5maWx0ZXIoZmllbGQgPT4gIXNraXAuaGFzKGZpZWxkLnRyaW0oKSkpXG4gICAgICAgIC5mb3JFYWNoKGZpZWxkID0+IHtcbiAgICAgICAgICAgIGluY2x1ZGVkRmllbGRzLmFkZChmaWVsZC50cmltKCkpO1xuICAgICAgICB9KTtcblxuICAgIGZvciAobGV0IGkgPSBoZWFkZXJzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgIGxldCBsaW5lID0gaGVhZGVyc1tpXTtcbiAgICAgICAgLy8gb25seSBpbmNsdWRlIHRoZSBmaXJzdCB2YWx1ZSBmcm9tIGJvdHRvbSB0byB0b3BcbiAgICAgICAgaWYgKGluY2x1ZGVkRmllbGRzLmhhcyhsaW5lLmtleSkgJiYgIWhlYWRlckZpZWxkcy5oYXMobGluZS5rZXkpKSB7XG4gICAgICAgICAgICBoZWFkZXJGaWVsZHMuc2V0KGxpbmUua2V5LCByZWxheGVkSGVhZGVyTGluZShsaW5lLmxpbmUpKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGxldCBoZWFkZXJzTGlzdCA9IFtdO1xuICAgIGxldCBmaWVsZHMgPSBbXTtcbiAgICBpbmNsdWRlZEZpZWxkcy5mb3JFYWNoKGZpZWxkID0+IHtcbiAgICAgICAgaWYgKGhlYWRlckZpZWxkcy5oYXMoZmllbGQpKSB7XG4gICAgICAgICAgICBmaWVsZHMucHVzaChmaWVsZCk7XG4gICAgICAgICAgICBoZWFkZXJzTGlzdC5wdXNoKGZpZWxkICsgJzonICsgaGVhZGVyRmllbGRzLmdldChmaWVsZCkpO1xuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgICBoZWFkZXJzOiBoZWFkZXJzTGlzdC5qb2luKCdcXHJcXG4nKSArICdcXHJcXG4nLFxuICAgICAgICBmaWVsZE5hbWVzOiBmaWVsZHMuam9pbignOicpXG4gICAgfTtcbn1cblxuZnVuY3Rpb24gcmVsYXhlZEhlYWRlckxpbmUobGluZSkge1xuICAgIHJldHVybiBsaW5lXG4gICAgICAgIC5zdWJzdHIobGluZS5pbmRleE9mKCc6JykgKyAxKVxuICAgICAgICAucmVwbGFjZSgvXFxyP1xcbi9nLCAnJylcbiAgICAgICAgLnJlcGxhY2UoL1xccysvZywgJyAnKVxuICAgICAgICAudHJpbSgpO1xufVxuIl0sIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6WzBdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(action-browser)/./node_modules/.pnpm/nodemailer@7.0.13/node_modules/nodemailer/lib/dkim/sign.js\n");
|
||
|
||
/***/ }),
|
||
|
||
/***/ "(action-browser)/./node_modules/.pnpm/nodemailer@7.0.13/node_modules/nodemailer/lib/fetch/cookies.js":
|
||
/*!*******************************************************************************************!*\
|
||
!*** ./node_modules/.pnpm/nodemailer@7.0.13/node_modules/nodemailer/lib/fetch/cookies.js ***!
|
||
\*******************************************************************************************/
|
||
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
|
||
|
||
eval("\n\n// module to handle cookies\n\nconst urllib = __webpack_require__(/*! url */ \"url\");\n\nconst SESSION_TIMEOUT = 1800; // 30 min\n\n/**\n * Creates a biskviit cookie jar for managing cookie values in memory\n *\n * @constructor\n * @param {Object} [options] Optional options object\n */\nclass Cookies {\n constructor(options) {\n this.options = options || {};\n this.cookies = [];\n }\n\n /**\n * Stores a cookie string to the cookie storage\n *\n * @param {String} cookieStr Value from the 'Set-Cookie:' header\n * @param {String} url Current URL\n */\n set(cookieStr, url) {\n let urlparts = urllib.parse(url || '');\n let cookie = this.parse(cookieStr);\n let domain;\n\n if (cookie.domain) {\n domain = cookie.domain.replace(/^\\./, '');\n\n // do not allow cross origin cookies\n if (\n // can't be valid if the requested domain is shorter than current hostname\n urlparts.hostname.length < domain.length ||\n // prefix domains with dot to be sure that partial matches are not used\n ('.' + urlparts.hostname).substr(-domain.length + 1) !== '.' + domain\n ) {\n cookie.domain = urlparts.hostname;\n }\n } else {\n cookie.domain = urlparts.hostname;\n }\n\n if (!cookie.path) {\n cookie.path = this.getPath(urlparts.pathname);\n }\n\n // if no expire date, then use sessionTimeout value\n if (!cookie.expires) {\n cookie.expires = new Date(Date.now() + (Number(this.options.sessionTimeout || SESSION_TIMEOUT) || SESSION_TIMEOUT) * 1000);\n }\n\n return this.add(cookie);\n }\n\n /**\n * Returns cookie string for the 'Cookie:' header.\n *\n * @param {String} url URL to check for\n * @returns {String} Cookie header or empty string if no matches were found\n */\n get(url) {\n return this.list(url)\n .map(cookie => cookie.name + '=' + cookie.value)\n .join('; ');\n }\n\n /**\n * Lists all valied cookie objects for the specified URL\n *\n * @param {String} url URL to check for\n * @returns {Array} An array of cookie objects\n */\n list(url) {\n let result = [];\n let i;\n let cookie;\n\n for (i = this.cookies.length - 1; i >= 0; i--) {\n cookie = this.cookies[i];\n\n if (this.isExpired(cookie)) {\n this.cookies.splice(i, i);\n continue;\n }\n\n if (this.match(cookie, url)) {\n result.unshift(cookie);\n }\n }\n\n return result;\n }\n\n /**\n * Parses cookie string from the 'Set-Cookie:' header\n *\n * @param {String} cookieStr String from the 'Set-Cookie:' header\n * @returns {Object} Cookie object\n */\n parse(cookieStr) {\n let cookie = {};\n\n (cookieStr || '')\n .toString()\n .split(';')\n .forEach(cookiePart => {\n let valueParts = cookiePart.split('=');\n let key = valueParts.shift().trim().toLowerCase();\n let value = valueParts.join('=').trim();\n let domain;\n\n if (!key) {\n // skip empty parts\n return;\n }\n\n switch (key) {\n case 'expires':\n value = new Date(value);\n // ignore date if can not parse it\n if (value.toString() !== 'Invalid Date') {\n cookie.expires = value;\n }\n break;\n\n case 'path':\n cookie.path = value;\n break;\n\n case 'domain':\n domain = value.toLowerCase();\n if (domain.length && domain.charAt(0) !== '.') {\n domain = '.' + domain; // ensure preceeding dot for user set domains\n }\n cookie.domain = domain;\n break;\n\n case 'max-age':\n cookie.expires = new Date(Date.now() + (Number(value) || 0) * 1000);\n break;\n\n case 'secure':\n cookie.secure = true;\n break;\n\n case 'httponly':\n cookie.httponly = true;\n break;\n\n default:\n if (!cookie.name) {\n cookie.name = key;\n cookie.value = value;\n }\n }\n });\n\n return cookie;\n }\n\n /**\n * Checks if a cookie object is valid for a specified URL\n *\n * @param {Object} cookie Cookie object\n * @param {String} url URL to check for\n * @returns {Boolean} true if cookie is valid for specifiec URL\n */\n match(cookie, url) {\n let urlparts = urllib.parse(url || '');\n\n // check if hostname matches\n // .foo.com also matches subdomains, foo.com does not\n if (\n urlparts.hostname !== cookie.domain &&\n (cookie.domain.charAt(0) !== '.' || ('.' + urlparts.hostname).substr(-cookie.domain.length) !== cookie.domain)\n ) {\n return false;\n }\n\n // check if path matches\n let path = this.getPath(urlparts.pathname);\n if (path.substr(0, cookie.path.length) !== cookie.path) {\n return false;\n }\n\n // check secure argument\n if (cookie.secure && urlparts.protocol !== 'https:') {\n return false;\n }\n\n return true;\n }\n\n /**\n * Adds (or updates/removes if needed) a cookie object to the cookie storage\n *\n * @param {Object} cookie Cookie value to be stored\n */\n add(cookie) {\n let i;\n let len;\n\n // nothing to do here\n if (!cookie || !cookie.name) {\n return false;\n }\n\n // overwrite if has same params\n for (i = 0, len = this.cookies.length; i < len; i++) {\n if (this.compare(this.cookies[i], cookie)) {\n // check if the cookie needs to be removed instead\n if (this.isExpired(cookie)) {\n this.cookies.splice(i, 1); // remove expired/unset cookie\n return false;\n }\n\n this.cookies[i] = cookie;\n return true;\n }\n }\n\n // add as new if not already expired\n if (!this.isExpired(cookie)) {\n this.cookies.push(cookie);\n }\n\n return true;\n }\n\n /**\n * Checks if two cookie objects are the same\n *\n * @param {Object} a Cookie to check against\n * @param {Object} b Cookie to check against\n * @returns {Boolean} True, if the cookies are the same\n */\n compare(a, b) {\n return a.name === b.name && a.path === b.path && a.domain === b.domain && a.secure === b.secure && a.httponly === a.httponly;\n }\n\n /**\n * Checks if a cookie is expired\n *\n * @param {Object} cookie Cookie object to check against\n * @returns {Boolean} True, if the cookie is expired\n */\n isExpired(cookie) {\n return (cookie.expires && cookie.expires < new Date()) || !cookie.value;\n }\n\n /**\n * Returns normalized cookie path for an URL path argument\n *\n * @param {String} pathname\n * @returns {String} Normalized path\n */\n getPath(pathname) {\n let path = (pathname || '/').split('/');\n path.pop(); // remove filename part\n path = path.join('/').trim();\n\n // ensure path prefix /\n if (path.charAt(0) !== '/') {\n path = '/' + path;\n }\n\n // ensure path suffix /\n if (path.substr(-1) !== '/') {\n path += '/';\n }\n\n return path;\n }\n}\n\nmodule.exports = Cookies;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFjdGlvbi1icm93c2VyKS8uL25vZGVfbW9kdWxlcy8ucG5wbS9ub2RlbWFpbGVyQDcuMC4xMy9ub2RlX21vZHVsZXMvbm9kZW1haWxlci9saWIvZmV0Y2gvY29va2llcy5qcyIsIm1hcHBpbmdzIjoiQUFBYTs7QUFFYjs7QUFFQSxlQUFlLG1CQUFPLENBQUMsZ0JBQUs7O0FBRTVCLDhCQUE4Qjs7QUFFOUI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsUUFBUTtBQUN2QixlQUFlLFFBQVE7QUFDdkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsUUFBUTtBQUN2QixpQkFBaUIsUUFBUTtBQUN6QjtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQjs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLFFBQVE7QUFDdkIsaUJBQWlCLE9BQU87QUFDeEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSwwQ0FBMEMsUUFBUTtBQUNsRDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsUUFBUTtBQUN2QixpQkFBaUIsUUFBUTtBQUN6QjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLG1EQUFtRDtBQUNuRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTs7QUFFYjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsUUFBUTtBQUN2QixlQUFlLFFBQVE7QUFDdkIsaUJBQWlCLFNBQVM7QUFDMUI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsUUFBUTtBQUN2QjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLCtDQUErQyxTQUFTO0FBQ3hEO0FBQ0E7QUFDQTtBQUNBLCtDQUErQztBQUMvQztBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsZUFBZSxRQUFRO0FBQ3ZCLGVBQWUsUUFBUTtBQUN2QixpQkFBaUIsU0FBUztBQUMxQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLFFBQVE7QUFDdkIsaUJBQWlCLFNBQVM7QUFDMUI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsZUFBZSxRQUFRO0FBQ3ZCLGlCQUFpQixRQUFRO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQjtBQUNwQjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEiLCJzb3VyY2VzIjpbIi9Vc2Vycy9tYXJjbWludGVsL1Byb2plY3RzL2UtdGliLmNvbS9ub2RlX21vZHVsZXMvLnBucG0vbm9kZW1haWxlckA3LjAuMTMvbm9kZV9tb2R1bGVzL25vZGVtYWlsZXIvbGliL2ZldGNoL2Nvb2tpZXMuanMiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG4vLyBtb2R1bGUgdG8gaGFuZGxlIGNvb2tpZXNcblxuY29uc3QgdXJsbGliID0gcmVxdWlyZSgndXJsJyk7XG5cbmNvbnN0IFNFU1NJT05fVElNRU9VVCA9IDE4MDA7IC8vIDMwIG1pblxuXG4vKipcbiAqIENyZWF0ZXMgYSBiaXNrdmlpdCBjb29raWUgamFyIGZvciBtYW5hZ2luZyBjb29raWUgdmFsdWVzIGluIG1lbW9yeVxuICpcbiAqIEBjb25zdHJ1Y3RvclxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXSBPcHRpb25hbCBvcHRpb25zIG9iamVjdFxuICovXG5jbGFzcyBDb29raWVzIHtcbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zKSB7XG4gICAgICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gICAgICAgIHRoaXMuY29va2llcyA9IFtdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFN0b3JlcyBhIGNvb2tpZSBzdHJpbmcgdG8gdGhlIGNvb2tpZSBzdG9yYWdlXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gY29va2llU3RyIFZhbHVlIGZyb20gdGhlICdTZXQtQ29va2llOicgaGVhZGVyXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IHVybCBDdXJyZW50IFVSTFxuICAgICAqL1xuICAgIHNldChjb29raWVTdHIsIHVybCkge1xuICAgICAgICBsZXQgdXJscGFydHMgPSB1cmxsaWIucGFyc2UodXJsIHx8ICcnKTtcbiAgICAgICAgbGV0IGNvb2tpZSA9IHRoaXMucGFyc2UoY29va2llU3RyKTtcbiAgICAgICAgbGV0IGRvbWFpbjtcblxuICAgICAgICBpZiAoY29va2llLmRvbWFpbikge1xuICAgICAgICAgICAgZG9tYWluID0gY29va2llLmRvbWFpbi5yZXBsYWNlKC9eXFwuLywgJycpO1xuXG4gICAgICAgICAgICAvLyBkbyBub3QgYWxsb3cgY3Jvc3Mgb3JpZ2luIGNvb2tpZXNcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAvLyBjYW4ndCBiZSB2YWxpZCBpZiB0aGUgcmVxdWVzdGVkIGRvbWFpbiBpcyBzaG9ydGVyIHRoYW4gY3VycmVudCBob3N0bmFtZVxuICAgICAgICAgICAgICAgIHVybHBhcnRzLmhvc3RuYW1lLmxlbmd0aCA8IGRvbWFpbi5sZW5ndGggfHxcbiAgICAgICAgICAgICAgICAvLyBwcmVmaXggZG9tYWlucyB3aXRoIGRvdCB0byBiZSBzdXJlIHRoYXQgcGFydGlhbCBtYXRjaGVzIGFyZSBub3QgdXNlZFxuICAgICAgICAgICAgICAgICgnLicgKyB1cmxwYXJ0cy5ob3N0bmFtZSkuc3Vic3RyKC1kb21haW4ubGVuZ3RoICsgMSkgIT09ICcuJyArIGRvbWFpblxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgY29va2llLmRvbWFpbiA9IHVybHBhcnRzLmhvc3RuYW1lO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29va2llLmRvbWFpbiA9IHVybHBhcnRzLmhvc3RuYW1lO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFjb29raWUucGF0aCkge1xuICAgICAgICAgICAgY29va2llLnBhdGggPSB0aGlzLmdldFBhdGgodXJscGFydHMucGF0aG5hbWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gaWYgbm8gZXhwaXJlIGRhdGUsIHRoZW4gdXNlIHNlc3Npb25UaW1lb3V0IHZhbHVlXG4gICAgICAgIGlmICghY29va2llLmV4cGlyZXMpIHtcbiAgICAgICAgICAgIGNvb2tpZS5leHBpcmVzID0gbmV3IERhdGUoRGF0ZS5ub3coKSArIChOdW1iZXIodGhpcy5vcHRpb25zLnNlc3Npb25UaW1lb3V0IHx8IFNFU1NJT05fVElNRU9VVCkgfHwgU0VTU0lPTl9USU1FT1VUKSAqIDEwMDApO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuYWRkKGNvb2tpZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBjb29raWUgc3RyaW5nIGZvciB0aGUgJ0Nvb2tpZTonIGhlYWRlci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSB1cmwgVVJMIHRvIGNoZWNrIGZvclxuICAgICAqIEByZXR1cm5zIHtTdHJpbmd9IENvb2tpZSBoZWFkZXIgb3IgZW1wdHkgc3RyaW5nIGlmIG5vIG1hdGNoZXMgd2VyZSBmb3VuZFxuICAgICAqL1xuICAgIGdldCh1cmwpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubGlzdCh1cmwpXG4gICAgICAgICAgICAubWFwKGNvb2tpZSA9PiBjb29raWUubmFtZSArICc9JyArIGNvb2tpZS52YWx1ZSlcbiAgICAgICAgICAgIC5qb2luKCc7ICcpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExpc3RzIGFsbCB2YWxpZWQgY29va2llIG9iamVjdHMgZm9yIHRoZSBzcGVjaWZpZWQgVVJMXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gdXJsIFVSTCB0byBjaGVjayBmb3JcbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IEFuIGFycmF5IG9mIGNvb2tpZSBvYmplY3RzXG4gICAgICovXG4gICAgbGlzdCh1cmwpIHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IFtdO1xuICAgICAgICBsZXQgaTtcbiAgICAgICAgbGV0IGNvb2tpZTtcblxuICAgICAgICBmb3IgKGkgPSB0aGlzLmNvb2tpZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgICAgIGNvb2tpZSA9IHRoaXMuY29va2llc1tpXTtcblxuICAgICAgICAgICAgaWYgKHRoaXMuaXNFeHBpcmVkKGNvb2tpZSkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNvb2tpZXMuc3BsaWNlKGksIGkpO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodGhpcy5tYXRjaChjb29raWUsIHVybCkpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQudW5zaGlmdChjb29raWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQYXJzZXMgY29va2llIHN0cmluZyBmcm9tIHRoZSAnU2V0LUNvb2tpZTonIGhlYWRlclxuICAgICAqXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IGNvb2tpZVN0ciBTdHJpbmcgZnJvbSB0aGUgJ1NldC1Db29raWU6JyBoZWFkZXJcbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBDb29raWUgb2JqZWN0XG4gICAgICovXG4gICAgcGFyc2UoY29va2llU3RyKSB7XG4gICAgICAgIGxldCBjb29raWUgPSB7fTtcblxuICAgICAgICAoY29va2llU3RyIHx8ICcnKVxuICAgICAgICAgICAgLnRvU3RyaW5nKClcbiAgICAgICAgICAgIC5zcGxpdCgnOycpXG4gICAgICAgICAgICAuZm9yRWFjaChjb29raWVQYXJ0ID0+IHtcbiAgICAgICAgICAgICAgICBsZXQgdmFsdWVQYXJ0cyA9IGNvb2tpZVBhcnQuc3BsaXQoJz0nKTtcbiAgICAgICAgICAgICAgICBsZXQga2V5ID0gdmFsdWVQYXJ0cy5zaGlmdCgpLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgICAgIGxldCB2YWx1ZSA9IHZhbHVlUGFydHMuam9pbignPScpLnRyaW0oKTtcbiAgICAgICAgICAgICAgICBsZXQgZG9tYWluO1xuXG4gICAgICAgICAgICAgICAgaWYgKCFrZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gc2tpcCBlbXB0eSBwYXJ0c1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgc3dpdGNoIChrZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnZXhwaXJlcyc6XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IG5ldyBEYXRlKHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZSBkYXRlIGlmIGNhbiBub3QgcGFyc2UgaXRcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZS50b1N0cmluZygpICE9PSAnSW52YWxpZCBEYXRlJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvb2tpZS5leHBpcmVzID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgICAgICBjYXNlICdwYXRoJzpcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvb2tpZS5wYXRoID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgICAgICBjYXNlICdkb21haW4nOlxuICAgICAgICAgICAgICAgICAgICAgICAgZG9tYWluID0gdmFsdWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkb21haW4ubGVuZ3RoICYmIGRvbWFpbi5jaGFyQXQoMCkgIT09ICcuJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvbWFpbiA9ICcuJyArIGRvbWFpbjsgLy8gZW5zdXJlIHByZWNlZWRpbmcgZG90IGZvciB1c2VyIHNldCBkb21haW5zXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBjb29raWUuZG9tYWluID0gZG9tYWluO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnbWF4LWFnZSc6XG4gICAgICAgICAgICAgICAgICAgICAgICBjb29raWUuZXhwaXJlcyA9IG5ldyBEYXRlKERhdGUubm93KCkgKyAoTnVtYmVyKHZhbHVlKSB8fCAwKSAqIDEwMDApO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnc2VjdXJlJzpcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvb2tpZS5zZWN1cmUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnaHR0cG9ubHknOlxuICAgICAgICAgICAgICAgICAgICAgICAgY29va2llLmh0dHBvbmx5ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNvb2tpZS5uYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29va2llLm5hbWUgPSBrZXk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29va2llLnZhbHVlID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIGNvb2tpZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYSBjb29raWUgb2JqZWN0IGlzIHZhbGlkIGZvciBhIHNwZWNpZmllZCBVUkxcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjb29raWUgQ29va2llIG9iamVjdFxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSB1cmwgVVJMIHRvIGNoZWNrIGZvclxuICAgICAqIEByZXR1cm5zIHtCb29sZWFufSB0cnVlIGlmIGNvb2tpZSBpcyB2YWxpZCBmb3Igc3BlY2lmaWVjIFVSTFxuICAgICAqL1xuICAgIG1hdGNoKGNvb2tpZSwgdXJsKSB7XG4gICAgICAgIGxldCB1cmxwYXJ0cyA9IHVybGxpYi5wYXJzZSh1cmwgfHwgJycpO1xuXG4gICAgICAgIC8vIGNoZWNrIGlmIGhvc3RuYW1lIG1hdGNoZXNcbiAgICAgICAgLy8gLmZvby5jb20gYWxzbyBtYXRjaGVzIHN1YmRvbWFpbnMsIGZvby5jb20gZG9lcyBub3RcbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgdXJscGFydHMuaG9zdG5hbWUgIT09IGNvb2tpZS5kb21haW4gJiZcbiAgICAgICAgICAgIChjb29raWUuZG9tYWluLmNoYXJBdCgwKSAhPT0gJy4nIHx8ICgnLicgKyB1cmxwYXJ0cy5ob3N0bmFtZSkuc3Vic3RyKC1jb29raWUuZG9tYWluLmxlbmd0aCkgIT09IGNvb2tpZS5kb21haW4pXG4gICAgICAgICkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gY2hlY2sgaWYgcGF0aCBtYXRjaGVzXG4gICAgICAgIGxldCBwYXRoID0gdGhpcy5nZXRQYXRoKHVybHBhcnRzLnBhdGhuYW1lKTtcbiAgICAgICAgaWYgKHBhdGguc3Vic3RyKDAsIGNvb2tpZS5wYXRoLmxlbmd0aCkgIT09IGNvb2tpZS5wYXRoKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBjaGVjayBzZWN1cmUgYXJndW1lbnRcbiAgICAgICAgaWYgKGNvb2tpZS5zZWN1cmUgJiYgdXJscGFydHMucHJvdG9jb2wgIT09ICdodHRwczonKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBZGRzIChvciB1cGRhdGVzL3JlbW92ZXMgaWYgbmVlZGVkKSBhIGNvb2tpZSBvYmplY3QgdG8gdGhlIGNvb2tpZSBzdG9yYWdlXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gY29va2llIENvb2tpZSB2YWx1ZSB0byBiZSBzdG9yZWRcbiAgICAgKi9cbiAgICBhZGQoY29va2llKSB7XG4gICAgICAgIGxldCBpO1xuICAgICAgICBsZXQgbGVuO1xuXG4gICAgICAgIC8vIG5vdGhpbmcgdG8gZG8gaGVyZVxuICAgICAgICBpZiAoIWNvb2tpZSB8fCAhY29va2llLm5hbWUpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIG92ZXJ3cml0ZSBpZiBoYXMgc2FtZSBwYXJhbXNcbiAgICAgICAgZm9yIChpID0gMCwgbGVuID0gdGhpcy5jb29raWVzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5jb21wYXJlKHRoaXMuY29va2llc1tpXSwgY29va2llKSkge1xuICAgICAgICAgICAgICAgIC8vIGNoZWNrIGlmIHRoZSBjb29raWUgbmVlZHMgdG8gYmUgcmVtb3ZlZCBpbnN0ZWFkXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNFeHBpcmVkKGNvb2tpZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb29raWVzLnNwbGljZShpLCAxKTsgLy8gcmVtb3ZlIGV4cGlyZWQvdW5zZXQgY29va2llXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB0aGlzLmNvb2tpZXNbaV0gPSBjb29raWU7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBhZGQgYXMgbmV3IGlmIG5vdCBhbHJlYWR5IGV4cGlyZWRcbiAgICAgICAgaWYgKCF0aGlzLmlzRXhwaXJlZChjb29raWUpKSB7XG4gICAgICAgICAgICB0aGlzLmNvb2tpZXMucHVzaChjb29raWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIHR3byBjb29raWUgb2JqZWN0cyBhcmUgdGhlIHNhbWVcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBhIENvb2tpZSB0byBjaGVjayBhZ2FpbnN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IGIgQ29va2llIHRvIGNoZWNrIGFnYWluc3RcbiAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSwgaWYgdGhlIGNvb2tpZXMgYXJlIHRoZSBzYW1lXG4gICAgICovXG4gICAgY29tcGFyZShhLCBiKSB7XG4gICAgICAgIHJldHVybiBhLm5hbWUgPT09IGIubmFtZSAmJiBhLnBhdGggPT09IGIucGF0aCAmJiBhLmRvbWFpbiA9PT0gYi5kb21haW4gJiYgYS5zZWN1cmUgPT09IGIuc2VjdXJlICYmIGEuaHR0cG9ubHkgPT09IGEuaHR0cG9ubHk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGEgY29va2llIGlzIGV4cGlyZWRcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjb29raWUgQ29va2llIG9iamVjdCB0byBjaGVjayBhZ2FpbnN0XG4gICAgICogQHJldHVybnMge0Jvb2xlYW59IFRydWUsIGlmIHRoZSBjb29raWUgaXMgZXhwaXJlZFxuICAgICAqL1xuICAgIGlzRXhwaXJlZChjb29raWUpIHtcbiAgICAgICAgcmV0dXJuIChjb29raWUuZXhwaXJlcyAmJiBjb29raWUuZXhwaXJlcyA8IG5ldyBEYXRlKCkpIHx8ICFjb29raWUudmFsdWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBub3JtYWxpemVkIGNvb2tpZSBwYXRoIGZvciBhbiBVUkwgcGF0aCBhcmd1bWVudFxuICAgICAqXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IHBhdGhuYW1lXG4gICAgICogQHJldHVybnMge1N0cmluZ30gTm9ybWFsaXplZCBwYXRoXG4gICAgICovXG4gICAgZ2V0UGF0aChwYXRobmFtZSkge1xuICAgICAgICBsZXQgcGF0aCA9IChwYXRobmFtZSB8fCAnLycpLnNwbGl0KCcvJyk7XG4gICAgICAgIHBhdGgucG9wKCk7IC8vIHJlbW92ZSBmaWxlbmFtZSBwYXJ0XG4gICAgICAgIHBhdGggPSBwYXRoLmpvaW4oJy8nKS50cmltKCk7XG5cbiAgICAgICAgLy8gZW5zdXJlIHBhdGggcHJlZml4IC9cbiAgICAgICAgaWYgKHBhdGguY2hhckF0KDApICE9PSAnLycpIHtcbiAgICAgICAgICAgIHBhdGggPSAnLycgKyBwYXRoO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gZW5zdXJlIHBhdGggc3VmZml4IC9cbiAgICAgICAgaWYgKHBhdGguc3Vic3RyKC0xKSAhPT0gJy8nKSB7XG4gICAgICAgICAgICBwYXRoICs9ICcvJztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBwYXRoO1xuICAgIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBDb29raWVzO1xuIl0sIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6WzBdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(action-browser)/./node_modules/.pnpm/nodemailer@7.0.13/node_modules/nodemailer/lib/fetch/cookies.js\n");
|
||
|
||
/***/ }),
|
||
|
||
/***/ "(action-browser)/./node_modules/.pnpm/nodemailer@7.0.13/node_modules/nodemailer/lib/fetch/index.js":
|
||
/*!*****************************************************************************************!*\
|
||
!*** ./node_modules/.pnpm/nodemailer@7.0.13/node_modules/nodemailer/lib/fetch/index.js ***!
|
||
\*****************************************************************************************/
|
||
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
|
||
|
||
eval("\n\nconst http = __webpack_require__(/*! http */ \"http\");\nconst https = __webpack_require__(/*! https */ \"https\");\nconst urllib = __webpack_require__(/*! url */ \"url\");\nconst zlib = __webpack_require__(/*! zlib */ \"zlib\");\nconst PassThrough = (__webpack_require__(/*! stream */ \"stream\").PassThrough);\nconst Cookies = __webpack_require__(/*! ./cookies */ \"(action-browser)/./node_modules/.pnpm/nodemailer@7.0.13/node_modules/nodemailer/lib/fetch/cookies.js\");\nconst packageData = __webpack_require__(/*! ../../package.json */ \"(action-browser)/./node_modules/.pnpm/nodemailer@7.0.13/node_modules/nodemailer/package.json\");\nconst net = __webpack_require__(/*! net */ \"net\");\n\nconst MAX_REDIRECTS = 5;\n\nmodule.exports = function (url, options) {\n return nmfetch(url, options);\n};\n\nmodule.exports.Cookies = Cookies;\n\nfunction nmfetch(url, options) {\n options = options || {};\n\n options.fetchRes = options.fetchRes || new PassThrough();\n options.cookies = options.cookies || new Cookies();\n options.redirects = options.redirects || 0;\n options.maxRedirects = isNaN(options.maxRedirects) ? MAX_REDIRECTS : options.maxRedirects;\n\n if (options.cookie) {\n [].concat(options.cookie || []).forEach(cookie => {\n options.cookies.set(cookie, url);\n });\n options.cookie = false;\n }\n\n let fetchRes = options.fetchRes;\n let parsed = urllib.parse(url);\n let method = (options.method || '').toString().trim().toUpperCase() || 'GET';\n let finished = false;\n let cookies;\n let body;\n\n let handler = parsed.protocol === 'https:' ? https : http;\n\n let headers = {\n 'accept-encoding': 'gzip,deflate',\n 'user-agent': 'nodemailer/' + packageData.version\n };\n\n Object.keys(options.headers || {}).forEach(key => {\n headers[key.toLowerCase().trim()] = options.headers[key];\n });\n\n if (options.userAgent) {\n headers['user-agent'] = options.userAgent;\n }\n\n if (parsed.auth) {\n headers.Authorization = 'Basic ' + Buffer.from(parsed.auth).toString('base64');\n }\n\n if ((cookies = options.cookies.get(url))) {\n headers.cookie = cookies;\n }\n\n if (options.body) {\n if (options.contentType !== false) {\n headers['Content-Type'] = options.contentType || 'application/x-www-form-urlencoded';\n }\n\n if (typeof options.body.pipe === 'function') {\n // it's a stream\n headers['Transfer-Encoding'] = 'chunked';\n body = options.body;\n body.on('error', err => {\n if (finished) {\n return;\n }\n finished = true;\n err.type = 'FETCH';\n err.sourceUrl = url;\n fetchRes.emit('error', err);\n });\n } else {\n if (options.body instanceof Buffer) {\n body = options.body;\n } else if (typeof options.body === 'object') {\n try {\n // encodeURIComponent can fail on invalid input (partial emoji etc.)\n body = Buffer.from(\n Object.keys(options.body)\n .map(key => {\n let value = options.body[key].toString().trim();\n return encodeURIComponent(key) + '=' + encodeURIComponent(value);\n })\n .join('&')\n );\n } catch (E) {\n if (finished) {\n return;\n }\n finished = true;\n E.type = 'FETCH';\n E.sourceUrl = url;\n fetchRes.emit('error', E);\n return;\n }\n } else {\n body = Buffer.from(options.body.toString().trim());\n }\n\n headers['Content-Type'] = options.contentType || 'application/x-www-form-urlencoded';\n headers['Content-Length'] = body.length;\n }\n // if method is not provided, use POST instead of GET\n method = (options.method || '').toString().trim().toUpperCase() || 'POST';\n }\n\n let req;\n let reqOptions = {\n method,\n host: parsed.hostname,\n path: parsed.path,\n port: parsed.port ? parsed.port : parsed.protocol === 'https:' ? 443 : 80,\n headers,\n rejectUnauthorized: false,\n agent: false\n };\n\n if (options.tls) {\n Object.keys(options.tls).forEach(key => {\n reqOptions[key] = options.tls[key];\n });\n }\n\n if (\n parsed.protocol === 'https:' &&\n parsed.hostname &&\n parsed.hostname !== reqOptions.host &&\n !net.isIP(parsed.hostname) &&\n !reqOptions.servername\n ) {\n reqOptions.servername = parsed.hostname;\n }\n\n try {\n req = handler.request(reqOptions);\n } catch (E) {\n finished = true;\n setImmediate(() => {\n E.type = 'FETCH';\n E.sourceUrl = url;\n fetchRes.emit('error', E);\n });\n return fetchRes;\n }\n\n if (options.timeout) {\n req.setTimeout(options.timeout, () => {\n if (finished) {\n return;\n }\n finished = true;\n req.abort();\n let err = new Error('Request Timeout');\n err.type = 'FETCH';\n err.sourceUrl = url;\n fetchRes.emit('error', err);\n });\n }\n\n req.on('error', err => {\n if (finished) {\n return;\n }\n finished = true;\n err.type = 'FETCH';\n err.sourceUrl = url;\n fetchRes.emit('error', err);\n });\n\n req.on('response', res => {\n let inflate;\n\n if (finished) {\n return;\n }\n\n switch (res.headers['content-encoding']) {\n case 'gzip':\n case 'deflate':\n inflate = zlib.createUnzip();\n break;\n }\n\n if (res.headers['set-cookie']) {\n [].concat(res.headers['set-cookie'] || []).forEach(cookie => {\n options.cookies.set(cookie, url);\n });\n }\n\n if ([301, 302, 303, 307, 308].includes(res.statusCode) && res.headers.location) {\n // redirect\n options.redirects++;\n if (options.redirects > options.maxRedirects) {\n finished = true;\n let err = new Error('Maximum redirect count exceeded');\n err.type = 'FETCH';\n err.sourceUrl = url;\n fetchRes.emit('error', err);\n req.abort();\n return;\n }\n // redirect does not include POST body\n options.method = 'GET';\n options.body = false;\n return nmfetch(urllib.resolve(url, res.headers.location), options);\n }\n\n fetchRes.statusCode = res.statusCode;\n fetchRes.headers = res.headers;\n\n if (res.statusCode >= 300 && !options.allowErrorResponse) {\n finished = true;\n let err = new Error('Invalid status code ' + res.statusCode);\n err.type = 'FETCH';\n err.sourceUrl = url;\n fetchRes.emit('error', err);\n req.abort();\n return;\n }\n\n res.on('error', err => {\n if (finished) {\n return;\n }\n finished = true;\n err.type = 'FETCH';\n err.sourceUrl = url;\n fetchRes.emit('error', err);\n req.abort();\n });\n\n if (inflate) {\n res.pipe(inflate).pipe(fetchRes);\n inflate.on('error', err => {\n if (finished) {\n return;\n }\n finished = true;\n err.type = 'FETCH';\n err.sourceUrl = url;\n fetchRes.emit('error', err);\n req.abort();\n });\n } else {\n res.pipe(fetchRes);\n }\n });\n\n setImmediate(() => {\n if (body) {\n try {\n if (typeof body.pipe === 'function') {\n return body.pipe(req);\n } else {\n req.write(body);\n }\n } catch (err) {\n finished = true;\n err.type = 'FETCH';\n err.sourceUrl = url;\n fetchRes.emit('error', err);\n return;\n }\n }\n req.end();\n });\n\n return fetchRes;\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFjdGlvbi1icm93c2VyKS8uL25vZGVfbW9kdWxlcy8ucG5wbS9ub2RlbWFpbGVyQDcuMC4xMy9ub2RlX21vZHVsZXMvbm9kZW1haWxlci9saWIvZmV0Y2gvaW5kZXguanMiLCJtYXBwaW5ncyI6IkFBQWE7O0FBRWIsYUFBYSxtQkFBTyxDQUFDLGtCQUFNO0FBQzNCLGNBQWMsbUJBQU8sQ0FBQyxvQkFBTztBQUM3QixlQUFlLG1CQUFPLENBQUMsZ0JBQUs7QUFDNUIsYUFBYSxtQkFBTyxDQUFDLGtCQUFNO0FBQzNCLG9CQUFvQix5REFBNkI7QUFDakQsZ0JBQWdCLG1CQUFPLENBQUMsdUhBQVc7QUFDbkMsb0JBQW9CLG1CQUFPLENBQUMsd0hBQW9CO0FBQ2hELFlBQVksbUJBQU8sQ0FBQyxnQkFBSzs7QUFFekI7O0FBRUE7QUFDQTtBQUNBOztBQUVBLHNCQUFzQjs7QUFFdEI7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUEscUNBQXFDO0FBQ3JDO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2IsVUFBVTtBQUNWO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2QkFBNkI7QUFDN0I7QUFDQTtBQUNBLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2IsVUFBVTtBQUNWO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0I7QUFDbEI7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBIiwic291cmNlcyI6WyIvVXNlcnMvbWFyY21pbnRlbC9Qcm9qZWN0cy9lLXRpYi5jb20vbm9kZV9tb2R1bGVzLy5wbnBtL25vZGVtYWlsZXJANy4wLjEzL25vZGVfbW9kdWxlcy9ub2RlbWFpbGVyL2xpYi9mZXRjaC9pbmRleC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbmNvbnN0IGh0dHAgPSByZXF1aXJlKCdodHRwJyk7XG5jb25zdCBodHRwcyA9IHJlcXVpcmUoJ2h0dHBzJyk7XG5jb25zdCB1cmxsaWIgPSByZXF1aXJlKCd1cmwnKTtcbmNvbnN0IHpsaWIgPSByZXF1aXJlKCd6bGliJyk7XG5jb25zdCBQYXNzVGhyb3VnaCA9IHJlcXVpcmUoJ3N0cmVhbScpLlBhc3NUaHJvdWdoO1xuY29uc3QgQ29va2llcyA9IHJlcXVpcmUoJy4vY29va2llcycpO1xuY29uc3QgcGFja2FnZURhdGEgPSByZXF1aXJlKCcuLi8uLi9wYWNrYWdlLmpzb24nKTtcbmNvbnN0IG5ldCA9IHJlcXVpcmUoJ25ldCcpO1xuXG5jb25zdCBNQVhfUkVESVJFQ1RTID0gNTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAodXJsLCBvcHRpb25zKSB7XG4gICAgcmV0dXJuIG5tZmV0Y2godXJsLCBvcHRpb25zKTtcbn07XG5cbm1vZHVsZS5leHBvcnRzLkNvb2tpZXMgPSBDb29raWVzO1xuXG5mdW5jdGlvbiBubWZldGNoKHVybCwgb3B0aW9ucykge1xuICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuXG4gICAgb3B0aW9ucy5mZXRjaFJlcyA9IG9wdGlvbnMuZmV0Y2hSZXMgfHwgbmV3IFBhc3NUaHJvdWdoKCk7XG4gICAgb3B0aW9ucy5jb29raWVzID0gb3B0aW9ucy5jb29raWVzIHx8IG5ldyBDb29raWVzKCk7XG4gICAgb3B0aW9ucy5yZWRpcmVjdHMgPSBvcHRpb25zLnJlZGlyZWN0cyB8fCAwO1xuICAgIG9wdGlvbnMubWF4UmVkaXJlY3RzID0gaXNOYU4ob3B0aW9ucy5tYXhSZWRpcmVjdHMpID8gTUFYX1JFRElSRUNUUyA6IG9wdGlvbnMubWF4UmVkaXJlY3RzO1xuXG4gICAgaWYgKG9wdGlvbnMuY29va2llKSB7XG4gICAgICAgIFtdLmNvbmNhdChvcHRpb25zLmNvb2tpZSB8fCBbXSkuZm9yRWFjaChjb29raWUgPT4ge1xuICAgICAgICAgICAgb3B0aW9ucy5jb29raWVzLnNldChjb29raWUsIHVybCk7XG4gICAgICAgIH0pO1xuICAgICAgICBvcHRpb25zLmNvb2tpZSA9IGZhbHNlO1xuICAgIH1cblxuICAgIGxldCBmZXRjaFJlcyA9IG9wdGlvbnMuZmV0Y2hSZXM7XG4gICAgbGV0IHBhcnNlZCA9IHVybGxpYi5wYXJzZSh1cmwpO1xuICAgIGxldCBtZXRob2QgPSAob3B0aW9ucy5tZXRob2QgfHwgJycpLnRvU3RyaW5nKCkudHJpbSgpLnRvVXBwZXJDYXNlKCkgfHwgJ0dFVCc7XG4gICAgbGV0IGZpbmlzaGVkID0gZmFsc2U7XG4gICAgbGV0IGNvb2tpZXM7XG4gICAgbGV0IGJvZHk7XG5cbiAgICBsZXQgaGFuZGxlciA9IHBhcnNlZC5wcm90b2NvbCA9PT0gJ2h0dHBzOicgPyBodHRwcyA6IGh0dHA7XG5cbiAgICBsZXQgaGVhZGVycyA9IHtcbiAgICAgICAgJ2FjY2VwdC1lbmNvZGluZyc6ICdnemlwLGRlZmxhdGUnLFxuICAgICAgICAndXNlci1hZ2VudCc6ICdub2RlbWFpbGVyLycgKyBwYWNrYWdlRGF0YS52ZXJzaW9uXG4gICAgfTtcblxuICAgIE9iamVjdC5rZXlzKG9wdGlvbnMuaGVhZGVycyB8fCB7fSkuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICBoZWFkZXJzW2tleS50b0xvd2VyQ2FzZSgpLnRyaW0oKV0gPSBvcHRpb25zLmhlYWRlcnNba2V5XTtcbiAgICB9KTtcblxuICAgIGlmIChvcHRpb25zLnVzZXJBZ2VudCkge1xuICAgICAgICBoZWFkZXJzWyd1c2VyLWFnZW50J10gPSBvcHRpb25zLnVzZXJBZ2VudDtcbiAgICB9XG5cbiAgICBpZiAocGFyc2VkLmF1dGgpIHtcbiAgICAgICAgaGVhZGVycy5BdXRob3JpemF0aW9uID0gJ0Jhc2ljICcgKyBCdWZmZXIuZnJvbShwYXJzZWQuYXV0aCkudG9TdHJpbmcoJ2Jhc2U2NCcpO1xuICAgIH1cblxuICAgIGlmICgoY29va2llcyA9IG9wdGlvbnMuY29va2llcy5nZXQodXJsKSkpIHtcbiAgICAgICAgaGVhZGVycy5jb29raWUgPSBjb29raWVzO1xuICAgIH1cblxuICAgIGlmIChvcHRpb25zLmJvZHkpIHtcbiAgICAgICAgaWYgKG9wdGlvbnMuY29udGVudFR5cGUgIT09IGZhbHNlKSB7XG4gICAgICAgICAgICBoZWFkZXJzWydDb250ZW50LVR5cGUnXSA9IG9wdGlvbnMuY29udGVudFR5cGUgfHwgJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCc7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZW9mIG9wdGlvbnMuYm9keS5waXBlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAvLyBpdCdzIGEgc3RyZWFtXG4gICAgICAgICAgICBoZWFkZXJzWydUcmFuc2Zlci1FbmNvZGluZyddID0gJ2NodW5rZWQnO1xuICAgICAgICAgICAgYm9keSA9IG9wdGlvbnMuYm9keTtcbiAgICAgICAgICAgIGJvZHkub24oJ2Vycm9yJywgZXJyID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoZmluaXNoZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBmaW5pc2hlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgZXJyLnR5cGUgPSAnRkVUQ0gnO1xuICAgICAgICAgICAgICAgIGVyci5zb3VyY2VVcmwgPSB1cmw7XG4gICAgICAgICAgICAgICAgZmV0Y2hSZXMuZW1pdCgnZXJyb3InLCBlcnIpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAob3B0aW9ucy5ib2R5IGluc3RhbmNlb2YgQnVmZmVyKSB7XG4gICAgICAgICAgICAgICAgYm9keSA9IG9wdGlvbnMuYm9keTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIG9wdGlvbnMuYm9keSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAvLyBlbmNvZGVVUklDb21wb25lbnQgY2FuIGZhaWwgb24gaW52YWxpZCBpbnB1dCAocGFydGlhbCBlbW9qaSBldGMuKVxuICAgICAgICAgICAgICAgICAgICBib2R5ID0gQnVmZmVyLmZyb20oXG4gICAgICAgICAgICAgICAgICAgICAgICBPYmplY3Qua2V5cyhvcHRpb25zLmJvZHkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1hcChrZXkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgdmFsdWUgPSBvcHRpb25zLmJvZHlba2V5XS50b1N0cmluZygpLnRyaW0oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudChrZXkpICsgJz0nICsgZW5jb2RlVVJJQ29tcG9uZW50KHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5qb2luKCcmJylcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChFKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChmaW5pc2hlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGZpbmlzaGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgRS50eXBlID0gJ0ZFVENIJztcbiAgICAgICAgICAgICAgICAgICAgRS5zb3VyY2VVcmwgPSB1cmw7XG4gICAgICAgICAgICAgICAgICAgIGZldGNoUmVzLmVtaXQoJ2Vycm9yJywgRSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGJvZHkgPSBCdWZmZXIuZnJvbShvcHRpb25zLmJvZHkudG9TdHJpbmcoKS50cmltKCkpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBoZWFkZXJzWydDb250ZW50LVR5cGUnXSA9IG9wdGlvbnMuY29udGVudFR5cGUgfHwgJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCc7XG4gICAgICAgICAgICBoZWFkZXJzWydDb250ZW50LUxlbmd0aCddID0gYm9keS5sZW5ndGg7XG4gICAgICAgIH1cbiAgICAgICAgLy8gaWYgbWV0aG9kIGlzIG5vdCBwcm92aWRlZCwgdXNlIFBPU1QgaW5zdGVhZCBvZiBHRVRcbiAgICAgICAgbWV0aG9kID0gKG9wdGlvbnMubWV0aG9kIHx8ICcnKS50b1N0cmluZygpLnRyaW0oKS50b1VwcGVyQ2FzZSgpIHx8ICdQT1NUJztcbiAgICB9XG5cbiAgICBsZXQgcmVxO1xuICAgIGxldCByZXFPcHRpb25zID0ge1xuICAgICAgICBtZXRob2QsXG4gICAgICAgIGhvc3Q6IHBhcnNlZC5ob3N0bmFtZSxcbiAgICAgICAgcGF0aDogcGFyc2VkLnBhdGgsXG4gICAgICAgIHBvcnQ6IHBhcnNlZC5wb3J0ID8gcGFyc2VkLnBvcnQgOiBwYXJzZWQucHJvdG9jb2wgPT09ICdodHRwczonID8gNDQzIDogODAsXG4gICAgICAgIGhlYWRlcnMsXG4gICAgICAgIHJlamVjdFVuYXV0aG9yaXplZDogZmFsc2UsXG4gICAgICAgIGFnZW50OiBmYWxzZVxuICAgIH07XG5cbiAgICBpZiAob3B0aW9ucy50bHMpIHtcbiAgICAgICAgT2JqZWN0LmtleXMob3B0aW9ucy50bHMpLmZvckVhY2goa2V5ID0+IHtcbiAgICAgICAgICAgIHJlcU9wdGlvbnNba2V5XSA9IG9wdGlvbnMudGxzW2tleV07XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChcbiAgICAgICAgcGFyc2VkLnByb3RvY29sID09PSAnaHR0cHM6JyAmJlxuICAgICAgICBwYXJzZWQuaG9zdG5hbWUgJiZcbiAgICAgICAgcGFyc2VkLmhvc3RuYW1lICE9PSByZXFPcHRpb25zLmhvc3QgJiZcbiAgICAgICAgIW5ldC5pc0lQKHBhcnNlZC5ob3N0bmFtZSkgJiZcbiAgICAgICAgIXJlcU9wdGlvbnMuc2VydmVybmFtZVxuICAgICkge1xuICAgICAgICByZXFPcHRpb25zLnNlcnZlcm5hbWUgPSBwYXJzZWQuaG9zdG5hbWU7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgICAgcmVxID0gaGFuZGxlci5yZXF1ZXN0KHJlcU9wdGlvbnMpO1xuICAgIH0gY2F0Y2ggKEUpIHtcbiAgICAgICAgZmluaXNoZWQgPSB0cnVlO1xuICAgICAgICBzZXRJbW1lZGlhdGUoKCkgPT4ge1xuICAgICAgICAgICAgRS50eXBlID0gJ0ZFVENIJztcbiAgICAgICAgICAgIEUuc291cmNlVXJsID0gdXJsO1xuICAgICAgICAgICAgZmV0Y2hSZXMuZW1pdCgnZXJyb3InLCBFKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBmZXRjaFJlcztcbiAgICB9XG5cbiAgICBpZiAob3B0aW9ucy50aW1lb3V0KSB7XG4gICAgICAgIHJlcS5zZXRUaW1lb3V0KG9wdGlvbnMudGltZW91dCwgKCkgPT4ge1xuICAgICAgICAgICAgaWYgKGZpbmlzaGVkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZmluaXNoZWQgPSB0cnVlO1xuICAgICAgICAgICAgcmVxLmFib3J0KCk7XG4gICAgICAgICAgICBsZXQgZXJyID0gbmV3IEVycm9yKCdSZXF1ZXN0IFRpbWVvdXQnKTtcbiAgICAgICAgICAgIGVyci50eXBlID0gJ0ZFVENIJztcbiAgICAgICAgICAgIGVyci5zb3VyY2VVcmwgPSB1cmw7XG4gICAgICAgICAgICBmZXRjaFJlcy5lbWl0KCdlcnJvcicsIGVycik7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHJlcS5vbignZXJyb3InLCBlcnIgPT4ge1xuICAgICAgICBpZiAoZmluaXNoZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBmaW5pc2hlZCA9IHRydWU7XG4gICAgICAgIGVyci50eXBlID0gJ0ZFVENIJztcbiAgICAgICAgZXJyLnNvdXJjZVVybCA9IHVybDtcbiAgICAgICAgZmV0Y2hSZXMuZW1pdCgnZXJyb3InLCBlcnIpO1xuICAgIH0pO1xuXG4gICAgcmVxLm9uKCdyZXNwb25zZScsIHJlcyA9PiB7XG4gICAgICAgIGxldCBpbmZsYXRlO1xuXG4gICAgICAgIGlmIChmaW5pc2hlZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgc3dpdGNoIChyZXMuaGVhZGVyc1snY29udGVudC1lbmNvZGluZyddKSB7XG4gICAgICAgICAgICBjYXNlICdnemlwJzpcbiAgICAgICAgICAgIGNhc2UgJ2RlZmxhdGUnOlxuICAgICAgICAgICAgICAgIGluZmxhdGUgPSB6bGliLmNyZWF0ZVVuemlwKCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocmVzLmhlYWRlcnNbJ3NldC1jb29raWUnXSkge1xuICAgICAgICAgICAgW10uY29uY2F0KHJlcy5oZWFkZXJzWydzZXQtY29va2llJ10gfHwgW10pLmZvckVhY2goY29va2llID0+IHtcbiAgICAgICAgICAgICAgICBvcHRpb25zLmNvb2tpZXMuc2V0KGNvb2tpZSwgdXJsKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKFszMDEsIDMwMiwgMzAzLCAzMDcsIDMwOF0uaW5jbHVkZXMocmVzLnN0YXR1c0NvZGUpICYmIHJlcy5oZWFkZXJzLmxvY2F0aW9uKSB7XG4gICAgICAgICAgICAvLyByZWRpcmVjdFxuICAgICAgICAgICAgb3B0aW9ucy5yZWRpcmVjdHMrKztcbiAgICAgICAgICAgIGlmIChvcHRpb25zLnJlZGlyZWN0cyA+IG9wdGlvbnMubWF4UmVkaXJlY3RzKSB7XG4gICAgICAgICAgICAgICAgZmluaXNoZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGxldCBlcnIgPSBuZXcgRXJyb3IoJ01heGltdW0gcmVkaXJlY3QgY291bnQgZXhjZWVkZWQnKTtcbiAgICAgICAgICAgICAgICBlcnIudHlwZSA9ICdGRVRDSCc7XG4gICAgICAgICAgICAgICAgZXJyLnNvdXJjZVVybCA9IHVybDtcbiAgICAgICAgICAgICAgICBmZXRjaFJlcy5lbWl0KCdlcnJvcicsIGVycik7XG4gICAgICAgICAgICAgICAgcmVxLmFib3J0KCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gcmVkaXJlY3QgZG9lcyBub3QgaW5jbHVkZSBQT1NUIGJvZHlcbiAgICAgICAgICAgIG9wdGlvbnMubWV0aG9kID0gJ0dFVCc7XG4gICAgICAgICAgICBvcHRpb25zLmJvZHkgPSBmYWxzZTtcbiAgICAgICAgICAgIHJldHVybiBubWZldGNoKHVybGxpYi5yZXNvbHZlKHVybCwgcmVzLmhlYWRlcnMubG9jYXRpb24pLCBvcHRpb25zKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZldGNoUmVzLnN0YXR1c0NvZGUgPSByZXMuc3RhdHVzQ29kZTtcbiAgICAgICAgZmV0Y2hSZXMuaGVhZGVycyA9IHJlcy5oZWFkZXJzO1xuXG4gICAgICAgIGlmIChyZXMuc3RhdHVzQ29kZSA+PSAzMDAgJiYgIW9wdGlvbnMuYWxsb3dFcnJvclJlc3BvbnNlKSB7XG4gICAgICAgICAgICBmaW5pc2hlZCA9IHRydWU7XG4gICAgICAgICAgICBsZXQgZXJyID0gbmV3IEVycm9yKCdJbnZhbGlkIHN0YXR1cyBjb2RlICcgKyByZXMuc3RhdHVzQ29kZSk7XG4gICAgICAgICAgICBlcnIudHlwZSA9ICdGRVRDSCc7XG4gICAgICAgICAgICBlcnIuc291cmNlVXJsID0gdXJsO1xuICAgICAgICAgICAgZmV0Y2hSZXMuZW1pdCgnZXJyb3InLCBlcnIpO1xuICAgICAgICAgICAgcmVxLmFib3J0KCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICByZXMub24oJ2Vycm9yJywgZXJyID0+IHtcbiAgICAgICAgICAgIGlmIChmaW5pc2hlZCkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZpbmlzaGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIGVyci50eXBlID0gJ0ZFVENIJztcbiAgICAgICAgICAgIGVyci5zb3VyY2VVcmwgPSB1cmw7XG4gICAgICAgICAgICBmZXRjaFJlcy5lbWl0KCdlcnJvcicsIGVycik7XG4gICAgICAgICAgICByZXEuYWJvcnQoKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKGluZmxhdGUpIHtcbiAgICAgICAgICAgIHJlcy5waXBlKGluZmxhdGUpLnBpcGUoZmV0Y2hSZXMpO1xuICAgICAgICAgICAgaW5mbGF0ZS5vbignZXJyb3InLCBlcnIgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChmaW5pc2hlZCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGZpbmlzaGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBlcnIudHlwZSA9ICdGRVRDSCc7XG4gICAgICAgICAgICAgICAgZXJyLnNvdXJjZVVybCA9IHVybDtcbiAgICAgICAgICAgICAgICBmZXRjaFJlcy5lbWl0KCdlcnJvcicsIGVycik7XG4gICAgICAgICAgICAgICAgcmVxLmFib3J0KCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJlcy5waXBlKGZldGNoUmVzKTtcbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgc2V0SW1tZWRpYXRlKCgpID0+IHtcbiAgICAgICAgaWYgKGJvZHkpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBib2R5LnBpcGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJvZHkucGlwZShyZXEpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJlcS53cml0ZShib2R5KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICBmaW5pc2hlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgZXJyLnR5cGUgPSAnRkVUQ0gnO1xuICAgICAgICAgICAgICAgIGVyci5zb3VyY2VVcmwgPSB1cmw7XG4gICAgICAgICAgICAgICAgZmV0Y2hSZXMuZW1pdCgnZXJyb3InLCBlcnIpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXEuZW5kKCk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gZmV0Y2hSZXM7XG59XG4iXSwibmFtZXMiOltdLCJpZ25vcmVMaXN0IjpbMF0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(action-browser)/./node_modules/.pnpm/nodemailer@7.0.13/node_modules/nodemailer/lib/fetch/index.js\n");
|
||
|
||
/***/ }),
|
||
|
||
/***/ "(action-browser)/./node_modules/.pnpm/nodemailer@7.0.13/node_modules/nodemailer/lib/json-transport/index.js":
|
||
/*!**************************************************************************************************!*\
|
||
!*** ./node_modules/.pnpm/nodemailer@7.0.13/node_modules/nodemailer/lib/json-transport/index.js ***!
|
||
\**************************************************************************************************/
|
||
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
|
||
|
||
eval("\n\nconst packageData = __webpack_require__(/*! ../../package.json */ \"(action-browser)/./node_modules/.pnpm/nodemailer@7.0.13/node_modules/nodemailer/package.json\");\nconst shared = __webpack_require__(/*! ../shared */ \"(action-browser)/./node_modules/.pnpm/nodemailer@7.0.13/node_modules/nodemailer/lib/shared/index.js\");\n\n/**\n * Generates a Transport object to generate JSON output\n *\n * @constructor\n * @param {Object} optional config parameter\n */\nclass JSONTransport {\n constructor(options) {\n options = options || {};\n\n this.options = options || {};\n\n this.name = 'JSONTransport';\n this.version = packageData.version;\n\n this.logger = shared.getLogger(this.options, {\n component: this.options.component || 'json-transport'\n });\n }\n\n /**\n * <p>Compiles a mailcomposer message and forwards it to handler that sends it.</p>\n *\n * @param {Object} emailMessage MailComposer object\n * @param {Function} callback Callback function to run when the sending is completed\n */\n send(mail, done) {\n // Sendmail strips this header line by itself\n mail.message.keepBcc = true;\n\n let envelope = mail.data.envelope || mail.message.getEnvelope();\n let messageId = mail.message.messageId();\n\n let recipients = [].concat(envelope.to || []);\n if (recipients.length > 3) {\n recipients.push('...and ' + recipients.splice(2).length + ' more');\n }\n this.logger.info(\n {\n tnx: 'send',\n messageId\n },\n 'Composing JSON structure of %s to <%s>',\n messageId,\n recipients.join(', ')\n );\n\n setImmediate(() => {\n mail.normalize((err, data) => {\n if (err) {\n this.logger.error(\n {\n err,\n tnx: 'send',\n messageId\n },\n 'Failed building JSON structure for %s. %s',\n messageId,\n err.message\n );\n return done(err);\n }\n\n delete data.envelope;\n delete data.normalizedHeaders;\n\n return done(null, {\n envelope,\n messageId,\n message: this.options.skipEncoding ? data : JSON.stringify(data)\n });\n });\n });\n }\n}\n\nmodule.exports = JSONTransport;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFjdGlvbi1icm93c2VyKS8uL25vZGVfbW9kdWxlcy8ucG5wbS9ub2RlbWFpbGVyQDcuMC4xMy9ub2RlX21vZHVsZXMvbm9kZW1haWxlci9saWIvanNvbi10cmFuc3BvcnQvaW5kZXguanMiLCJtYXBwaW5ncyI6IkFBQWE7O0FBRWIsb0JBQW9CLG1CQUFPLENBQUMsd0hBQW9CO0FBQ2hELGVBQWUsbUJBQU8sQ0FBQyxzSEFBVzs7QUFFbEM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsU0FBUztBQUNUOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsUUFBUTtBQUN2QixlQUFlLFVBQVU7QUFDekI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5QkFBeUI7QUFDekI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakIsYUFBYTtBQUNiLFNBQVM7QUFDVDtBQUNBOztBQUVBIiwic291cmNlcyI6WyIvVXNlcnMvbWFyY21pbnRlbC9Qcm9qZWN0cy9lLXRpYi5jb20vbm9kZV9tb2R1bGVzLy5wbnBtL25vZGVtYWlsZXJANy4wLjEzL25vZGVfbW9kdWxlcy9ub2RlbWFpbGVyL2xpYi9qc29uLXRyYW5zcG9ydC9pbmRleC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbmNvbnN0IHBhY2thZ2VEYXRhID0gcmVxdWlyZSgnLi4vLi4vcGFja2FnZS5qc29uJyk7XG5jb25zdCBzaGFyZWQgPSByZXF1aXJlKCcuLi9zaGFyZWQnKTtcblxuLyoqXG4gKiBHZW5lcmF0ZXMgYSBUcmFuc3BvcnQgb2JqZWN0IHRvIGdlbmVyYXRlIEpTT04gb3V0cHV0XG4gKlxuICogQGNvbnN0cnVjdG9yXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9uYWwgY29uZmlnIHBhcmFtZXRlclxuICovXG5jbGFzcyBKU09OVHJhbnNwb3J0IHtcbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zKSB7XG4gICAgICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuXG4gICAgICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cbiAgICAgICAgdGhpcy5uYW1lID0gJ0pTT05UcmFuc3BvcnQnO1xuICAgICAgICB0aGlzLnZlcnNpb24gPSBwYWNrYWdlRGF0YS52ZXJzaW9uO1xuXG4gICAgICAgIHRoaXMubG9nZ2VyID0gc2hhcmVkLmdldExvZ2dlcih0aGlzLm9wdGlvbnMsIHtcbiAgICAgICAgICAgIGNvbXBvbmVudDogdGhpcy5vcHRpb25zLmNvbXBvbmVudCB8fCAnanNvbi10cmFuc3BvcnQnXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIDxwPkNvbXBpbGVzIGEgbWFpbGNvbXBvc2VyIG1lc3NhZ2UgYW5kIGZvcndhcmRzIGl0IHRvIGhhbmRsZXIgdGhhdCBzZW5kcyBpdC48L3A+XG4gICAgICpcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gZW1haWxNZXNzYWdlIE1haWxDb21wb3NlciBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBDYWxsYmFjayBmdW5jdGlvbiB0byBydW4gd2hlbiB0aGUgc2VuZGluZyBpcyBjb21wbGV0ZWRcbiAgICAgKi9cbiAgICBzZW5kKG1haWwsIGRvbmUpIHtcbiAgICAgICAgLy8gU2VuZG1haWwgc3RyaXBzIHRoaXMgaGVhZGVyIGxpbmUgYnkgaXRzZWxmXG4gICAgICAgIG1haWwubWVzc2FnZS5rZWVwQmNjID0gdHJ1ZTtcblxuICAgICAgICBsZXQgZW52ZWxvcGUgPSBtYWlsLmRhdGEuZW52ZWxvcGUgfHwgbWFpbC5tZXNzYWdlLmdldEVudmVsb3BlKCk7XG4gICAgICAgIGxldCBtZXNzYWdlSWQgPSBtYWlsLm1lc3NhZ2UubWVzc2FnZUlkKCk7XG5cbiAgICAgICAgbGV0IHJlY2lwaWVudHMgPSBbXS5jb25jYXQoZW52ZWxvcGUudG8gfHwgW10pO1xuICAgICAgICBpZiAocmVjaXBpZW50cy5sZW5ndGggPiAzKSB7XG4gICAgICAgICAgICByZWNpcGllbnRzLnB1c2goJy4uLmFuZCAnICsgcmVjaXBpZW50cy5zcGxpY2UoMikubGVuZ3RoICsgJyBtb3JlJyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5sb2dnZXIuaW5mbyhcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB0bng6ICdzZW5kJyxcbiAgICAgICAgICAgICAgICBtZXNzYWdlSWRcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnQ29tcG9zaW5nIEpTT04gc3RydWN0dXJlIG9mICVzIHRvIDwlcz4nLFxuICAgICAgICAgICAgbWVzc2FnZUlkLFxuICAgICAgICAgICAgcmVjaXBpZW50cy5qb2luKCcsICcpXG4gICAgICAgICk7XG5cbiAgICAgICAgc2V0SW1tZWRpYXRlKCgpID0+IHtcbiAgICAgICAgICAgIG1haWwubm9ybWFsaXplKChlcnIsIGRhdGEpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bng6ICdzZW5kJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlSWRcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAnRmFpbGVkIGJ1aWxkaW5nIEpTT04gc3RydWN0dXJlIGZvciAlcy4gJXMnLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZUlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgZXJyLm1lc3NhZ2VcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRvbmUoZXJyKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBkZWxldGUgZGF0YS5lbnZlbG9wZTtcbiAgICAgICAgICAgICAgICBkZWxldGUgZGF0YS5ub3JtYWxpemVkSGVhZGVycztcblxuICAgICAgICAgICAgICAgIHJldHVybiBkb25lKG51bGwsIHtcbiAgICAgICAgICAgICAgICAgICAgZW52ZWxvcGUsXG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VJZCxcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogdGhpcy5vcHRpb25zLnNraXBFbmNvZGluZyA/IGRhdGEgOiBKU09OLnN0cmluZ2lmeShkYXRhKVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBKU09OVHJhbnNwb3J0O1xuIl0sIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6WzBdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(action-browser)/./node_modules/.pnpm/nodemailer@7.0.13/node_modules/nodemailer/lib/json-transport/index.js\n");
|
||
|
||
/***/ }),
|
||
|
||
/***/ "(action-browser)/./node_modules/.pnpm/nodemailer@7.0.13/node_modules/nodemailer/lib/mail-composer/index.js":
|
||
/*!*************************************************************************************************!*\
|
||
!*** ./node_modules/.pnpm/nodemailer@7.0.13/node_modules/nodemailer/lib/mail-composer/index.js ***!
|
||
\*************************************************************************************************/
|
||
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
|
||
|
||
eval("/* eslint no-undefined: 0 */\n\n\n\nconst MimeNode = __webpack_require__(/*! ../mime-node */ \"(action-browser)/./node_modules/.pnpm/nodemailer@7.0.13/node_modules/nodemailer/lib/mime-node/index.js\");\nconst mimeFuncs = __webpack_require__(/*! ../mime-funcs */ \"(action-browser)/./node_modules/.pnpm/nodemailer@7.0.13/node_modules/nodemailer/lib/mime-funcs/index.js\");\nconst parseDataURI = (__webpack_require__(/*! ../shared */ \"(action-browser)/./node_modules/.pnpm/nodemailer@7.0.13/node_modules/nodemailer/lib/shared/index.js\").parseDataURI);\n\n/**\n * Creates the object for composing a MimeNode instance out from the mail options\n *\n * @constructor\n * @param {Object} mail Mail options\n */\nclass MailComposer {\n constructor(mail) {\n this.mail = mail || {};\n this.message = false;\n }\n\n /**\n * Builds MimeNode instance\n */\n compile() {\n this._alternatives = this.getAlternatives();\n this._htmlNode = this._alternatives.filter(alternative => /^text\\/html\\b/i.test(alternative.contentType)).pop();\n this._attachments = this.getAttachments(!!this._htmlNode);\n\n this._useRelated = !!(this._htmlNode && this._attachments.related.length);\n this._useAlternative = this._alternatives.length > 1;\n this._useMixed = this._attachments.attached.length > 1 || (this._alternatives.length && this._attachments.attached.length === 1);\n\n // Compose MIME tree\n if (this.mail.raw) {\n this.message = new MimeNode('message/rfc822', { newline: this.mail.newline }).setRaw(this.mail.raw);\n } else if (this._useMixed) {\n this.message = this._createMixed();\n } else if (this._useAlternative) {\n this.message = this._createAlternative();\n } else if (this._useRelated) {\n this.message = this._createRelated();\n } else {\n this.message = this._createContentNode(\n false,\n []\n .concat(this._alternatives || [])\n .concat(this._attachments.attached || [])\n .shift() || {\n contentType: 'text/plain',\n content: ''\n }\n );\n }\n\n // Add custom headers\n if (this.mail.headers) {\n this.message.addHeader(this.mail.headers);\n }\n\n // Add headers to the root node, always overrides custom headers\n ['from', 'sender', 'to', 'cc', 'bcc', 'reply-to', 'in-reply-to', 'references', 'subject', 'message-id', 'date'].forEach(header => {\n let key = header.replace(/-(\\w)/g, (o, c) => c.toUpperCase());\n if (this.mail[key]) {\n this.message.setHeader(header, this.mail[key]);\n }\n });\n\n // Sets custom envelope\n if (this.mail.envelope) {\n this.message.setEnvelope(this.mail.envelope);\n }\n\n // ensure Message-Id value\n this.message.messageId();\n\n return this.message;\n }\n\n /**\n * List all attachments. Resulting attachment objects can be used as input for MimeNode nodes\n *\n * @param {Boolean} findRelated If true separate related attachments from attached ones\n * @returns {Object} An object of arrays (`related` and `attached`)\n */\n getAttachments(findRelated) {\n let icalEvent, eventObject;\n let attachments = [].concat(this.mail.attachments || []).map((attachment, i) => {\n let data;\n\n if (/^data:/i.test(attachment.path || attachment.href)) {\n attachment = this._processDataUrl(attachment);\n }\n\n let contentType =\n attachment.contentType || mimeFuncs.detectMimeType(attachment.filename || attachment.path || attachment.href || 'bin');\n\n let isImage = /^image\\//i.test(contentType);\n let isMessageNode = /^message\\//i.test(contentType);\n\n let contentDisposition =\n attachment.contentDisposition || (isMessageNode || (isImage && attachment.cid) ? 'inline' : 'attachment');\n\n let contentTransferEncoding;\n if ('contentTransferEncoding' in attachment) {\n // also contains `false`, to set\n contentTransferEncoding = attachment.contentTransferEncoding;\n } else if (isMessageNode) {\n // the content might include non-ASCII bytes but at this point we do not know it yet\n contentTransferEncoding = '8bit';\n } else {\n contentTransferEncoding = 'base64'; // the default\n }\n\n data = {\n contentType,\n contentDisposition,\n contentTransferEncoding\n };\n\n if (attachment.filename) {\n data.filename = attachment.filename;\n } else if (!isMessageNode && attachment.filename !== false) {\n data.filename = (attachment.path || attachment.href || '').split('/').pop().split('?').shift() || 'attachment-' + (i + 1);\n if (data.filename.indexOf('.') < 0) {\n data.filename += '.' + mimeFuncs.detectExtension(data.contentType);\n }\n }\n\n if (/^https?:\\/\\//i.test(attachment.path)) {\n attachment.href = attachment.path;\n attachment.path = undefined;\n }\n\n if (attachment.cid) {\n data.cid = attachment.cid;\n }\n\n if (attachment.raw) {\n data.raw = attachment.raw;\n } else if (attachment.path) {\n data.content = {\n path: attachment.path\n };\n } else if (attachment.href) {\n data.content = {\n href: attachment.href,\n httpHeaders: attachment.httpHeaders\n };\n } else {\n data.content = attachment.content || '';\n }\n\n if (attachment.encoding) {\n data.encoding = attachment.encoding;\n }\n\n if (attachment.headers) {\n data.headers = attachment.headers;\n }\n\n return data;\n });\n\n if (this.mail.icalEvent) {\n if (\n typeof this.mail.icalEvent === 'object' &&\n (this.mail.icalEvent.content || this.mail.icalEvent.path || this.mail.icalEvent.href || this.mail.icalEvent.raw)\n ) {\n icalEvent = this.mail.icalEvent;\n } else {\n icalEvent = {\n content: this.mail.icalEvent\n };\n }\n\n eventObject = {};\n Object.keys(icalEvent).forEach(key => {\n eventObject[key] = icalEvent[key];\n });\n\n eventObject.contentType = 'application/ics';\n if (!eventObject.headers) {\n eventObject.headers = {};\n }\n eventObject.filename = eventObject.filename || 'invite.ics';\n eventObject.headers['Content-Disposition'] = 'attachment';\n eventObject.headers['Content-Transfer-Encoding'] = 'base64';\n }\n\n if (!findRelated) {\n return {\n attached: attachments.concat(eventObject || []),\n related: []\n };\n } else {\n return {\n attached: attachments.filter(attachment => !attachment.cid).concat(eventObject || []),\n related: attachments.filter(attachment => !!attachment.cid)\n };\n }\n }\n\n /**\n * List alternatives. Resulting objects can be used as input for MimeNode nodes\n *\n * @returns {Array} An array of alternative elements. Includes the `text` and `html` values as well\n */\n getAlternatives() {\n let alternatives = [],\n text,\n html,\n watchHtml,\n amp,\n icalEvent,\n eventObject;\n\n if (this.mail.text) {\n if (\n typeof this.mail.text === 'object' &&\n (this.mail.text.content || this.mail.text.path || this.mail.text.href || this.mail.text.raw)\n ) {\n text = this.mail.text;\n } else {\n text = {\n content: this.mail.text\n };\n }\n text.contentType = 'text/plain; charset=utf-8';\n }\n\n if (this.mail.watchHtml) {\n if (\n typeof this.mail.watchHtml === 'object' &&\n (this.mail.watchHtml.content || this.mail.watchHtml.path || this.mail.watchHtml.href || this.mail.watchHtml.raw)\n ) {\n watchHtml = this.mail.watchHtml;\n } else {\n watchHtml = {\n content: this.mail.watchHtml\n };\n }\n watchHtml.contentType = 'text/watch-html; charset=utf-8';\n }\n\n if (this.mail.amp) {\n if (\n typeof this.mail.amp === 'object' &&\n (this.mail.amp.content || this.mail.amp.path || this.mail.amp.href || this.mail.amp.raw)\n ) {\n amp = this.mail.amp;\n } else {\n amp = {\n content: this.mail.amp\n };\n }\n amp.contentType = 'text/x-amp-html; charset=utf-8';\n }\n\n // NB! when including attachments with a calendar alternative you might end up in a blank screen on some clients\n if (this.mail.icalEvent) {\n if (\n typeof this.mail.icalEvent === 'object' &&\n (this.mail.icalEvent.content || this.mail.icalEvent.path || this.mail.icalEvent.href || this.mail.icalEvent.raw)\n ) {\n icalEvent = this.mail.icalEvent;\n } else {\n icalEvent = {\n content: this.mail.icalEvent\n };\n }\n\n eventObject = {};\n Object.keys(icalEvent).forEach(key => {\n eventObject[key] = icalEvent[key];\n });\n\n if (eventObject.content && typeof eventObject.content === 'object') {\n // we are going to have the same attachment twice, so mark this to be\n // resolved just once\n eventObject.content._resolve = true;\n }\n\n eventObject.filename = false;\n eventObject.contentType =\n 'text/calendar; charset=utf-8; method=' + (eventObject.method || 'PUBLISH').toString().trim().toUpperCase();\n if (!eventObject.headers) {\n eventObject.headers = {};\n }\n }\n\n if (this.mail.html) {\n if (\n typeof this.mail.html === 'object' &&\n (this.mail.html.content || this.mail.html.path || this.mail.html.href || this.mail.html.raw)\n ) {\n html = this.mail.html;\n } else {\n html = {\n content: this.mail.html\n };\n }\n html.contentType = 'text/html; charset=utf-8';\n }\n\n []\n .concat(text || [])\n .concat(watchHtml || [])\n .concat(amp || [])\n .concat(html || [])\n .concat(eventObject || [])\n .concat(this.mail.alternatives || [])\n .forEach(alternative => {\n let data;\n\n if (/^data:/i.test(alternative.path || alternative.href)) {\n alternative = this._processDataUrl(alternative);\n }\n\n data = {\n contentType:\n alternative.contentType ||\n mimeFuncs.detectMimeType(alternative.filename || alternative.path || alternative.href || 'txt'),\n contentTransferEncoding: alternative.contentTransferEncoding\n };\n\n if (alternative.filename) {\n data.filename = alternative.filename;\n }\n\n if (/^https?:\\/\\//i.test(alternative.path)) {\n alternative.href = alternative.path;\n alternative.path = undefined;\n }\n\n if (alternative.raw) {\n data.raw = alternative.raw;\n } else if (alternative.path) {\n data.content = {\n path: alternative.path\n };\n } else if (alternative.href) {\n data.content = {\n href: alternative.href\n };\n } else {\n data.content = alternative.content || '';\n }\n\n if (alternative.encoding) {\n data.encoding = alternative.encoding;\n }\n\n if (alternative.headers) {\n data.headers = alternative.headers;\n }\n\n alternatives.push(data);\n });\n\n return alternatives;\n }\n\n /**\n * Builds multipart/mixed node. It should always contain different type of elements on the same level\n * eg. text + attachments\n *\n * @param {Object} parentNode Parent for this note. If it does not exist, a root node is created\n * @returns {Object} MimeNode node element\n */\n _createMixed(parentNode) {\n let node;\n\n if (!parentNode) {\n node = new MimeNode('multipart/mixed', {\n baseBoundary: this.mail.baseBoundary,\n textEncoding: this.mail.textEncoding,\n boundaryPrefix: this.mail.boundaryPrefix,\n disableUrlAccess: this.mail.disableUrlAccess,\n disableFileAccess: this.mail.disableFileAccess,\n normalizeHeaderKey: this.mail.normalizeHeaderKey,\n newline: this.mail.newline\n });\n } else {\n node = parentNode.createChild('multipart/mixed', {\n disableUrlAccess: this.mail.disableUrlAccess,\n disableFileAccess: this.mail.disableFileAccess,\n normalizeHeaderKey: this.mail.normalizeHeaderKey,\n newline: this.mail.newline\n });\n }\n\n if (this._useAlternative) {\n this._createAlternative(node);\n } else if (this._useRelated) {\n this._createRelated(node);\n }\n\n []\n .concat((!this._useAlternative && this._alternatives) || [])\n .concat(this._attachments.attached || [])\n .forEach(element => {\n // if the element is a html node from related subpart then ignore it\n if (!this._useRelated || element !== this._htmlNode) {\n this._createContentNode(node, element);\n }\n });\n\n return node;\n }\n\n /**\n * Builds multipart/alternative node. It should always contain same type of elements on the same level\n * eg. text + html view of the same data\n *\n * @param {Object} parentNode Parent for this note. If it does not exist, a root node is created\n * @returns {Object} MimeNode node element\n */\n _createAlternative(parentNode) {\n let node;\n\n if (!parentNode) {\n node = new MimeNode('multipart/alternative', {\n baseBoundary: this.mail.baseBoundary,\n textEncoding: this.mail.textEncoding,\n boundaryPrefix: this.mail.boundaryPrefix,\n disableUrlAccess: this.mail.disableUrlAccess,\n disableFileAccess: this.mail.disableFileAccess,\n normalizeHeaderKey: this.mail.normalizeHeaderKey,\n newline: this.mail.newline\n });\n } else {\n node = parentNode.createChild('multipart/alternative', {\n disableUrlAccess: this.mail.disableUrlAccess,\n disableFileAccess: this.mail.disableFileAccess,\n normalizeHeaderKey: this.mail.normalizeHeaderKey,\n newline: this.mail.newline\n });\n }\n\n this._alternatives.forEach(alternative => {\n if (this._useRelated && this._htmlNode === alternative) {\n this._createRelated(node);\n } else {\n this._createContentNode(node, alternative);\n }\n });\n\n return node;\n }\n\n /**\n * Builds multipart/related node. It should always contain html node with related attachments\n *\n * @param {Object} parentNode Parent for this note. If it does not exist, a root node is created\n * @returns {Object} MimeNode node element\n */\n _createRelated(parentNode) {\n let node;\n\n if (!parentNode) {\n node = new MimeNode('multipart/related; type=\"text/html\"', {\n baseBoundary: this.mail.baseBoundary,\n textEncoding: this.mail.textEncoding,\n boundaryPrefix: this.mail.boundaryPrefix,\n disableUrlAccess: this.mail.disableUrlAccess,\n disableFileAccess: this.mail.disableFileAccess,\n normalizeHeaderKey: this.mail.normalizeHeaderKey,\n newline: this.mail.newline\n });\n } else {\n node = parentNode.createChild('multipart/related; type=\"text/html\"', {\n disableUrlAccess: this.mail.disableUrlAccess,\n disableFileAccess: this.mail.disableFileAccess,\n normalizeHeaderKey: this.mail.normalizeHeaderKey,\n newline: this.mail.newline\n });\n }\n\n this._createContentNode(node, this._htmlNode);\n\n this._attachments.related.forEach(alternative => this._createContentNode(node, alternative));\n\n return node;\n }\n\n /**\n * Creates a regular node with contents\n *\n * @param {Object} parentNode Parent for this note. If it does not exist, a root node is created\n * @param {Object} element Node data\n * @returns {Object} MimeNode node element\n */\n _createContentNode(parentNode, element) {\n element = element || {};\n element.content = element.content || '';\n\n let node;\n let encoding = (element.encoding || 'utf8')\n .toString()\n .toLowerCase()\n .replace(/[-_\\s]/g, '');\n\n if (!parentNode) {\n node = new MimeNode(element.contentType, {\n filename: element.filename,\n baseBoundary: this.mail.baseBoundary,\n textEncoding: this.mail.textEncoding,\n boundaryPrefix: this.mail.boundaryPrefix,\n disableUrlAccess: this.mail.disableUrlAccess,\n disableFileAccess: this.mail.disableFileAccess,\n normalizeHeaderKey: this.mail.normalizeHeaderKey,\n newline: this.mail.newline\n });\n } else {\n node = parentNode.createChild(element.contentType, {\n filename: element.filename,\n textEncoding: this.mail.textEncoding,\n disableUrlAccess: this.mail.disableUrlAccess,\n disableFileAccess: this.mail.disableFileAccess,\n normalizeHeaderKey: this.mail.normalizeHeaderKey,\n newline: this.mail.newline\n });\n }\n\n // add custom headers\n if (element.headers) {\n node.addHeader(element.headers);\n }\n\n if (element.cid) {\n node.setHeader('Content-Id', '<' + element.cid.replace(/[<>]/g, '') + '>');\n }\n\n if (element.contentTransferEncoding) {\n node.setHeader('Content-Transfer-Encoding', element.contentTransferEncoding);\n } else if (this.mail.encoding && /^text\\//i.test(element.contentType)) {\n node.setHeader('Content-Transfer-Encoding', this.mail.encoding);\n }\n\n if (!/^text\\//i.test(element.contentType) || element.contentDisposition) {\n node.setHeader(\n 'Content-Disposition',\n element.contentDisposition || (element.cid && /^image\\//i.test(element.contentType) ? 'inline' : 'attachment')\n );\n }\n\n if (typeof element.content === 'string' && !['utf8', 'usascii', 'ascii'].includes(encoding)) {\n element.content = Buffer.from(element.content, encoding);\n }\n\n // prefer pregenerated raw content\n if (element.raw) {\n node.setRaw(element.raw);\n } else {\n node.setContent(element.content);\n }\n\n return node;\n }\n\n /**\n * Parses data uri and converts it to a Buffer\n *\n * @param {Object} element Content element\n * @return {Object} Parsed element\n */\n _processDataUrl(element) {\n const dataUrl = element.path || element.href;\n\n // Early validation to prevent ReDoS\n if (!dataUrl || typeof dataUrl !== 'string') {\n return element;\n }\n\n if (!dataUrl.startsWith('data:')) {\n return element;\n }\n\n if (dataUrl.length > 52428800) {\n // 52428800 chars = 50MB limit for data URL string (~37.5MB decoded image)\n // Extract content type before rejecting to preserve MIME type\n let detectedType = 'application/octet-stream';\n const commaPos = dataUrl.indexOf(',');\n\n if (commaPos > 0 && commaPos < 200) {\n // Parse header safely with size limit\n const header = dataUrl.substring(5, commaPos); // skip 'data:'\n const parts = header.split(';');\n if (parts[0] && parts[0].includes('/')) {\n detectedType = parts[0].trim();\n }\n }\n\n // Return empty content for excessively long data URLs\n return Object.assign({}, element, {\n path: false,\n href: false,\n content: Buffer.alloc(0),\n contentType: element.contentType || detectedType\n });\n }\n\n let parsedDataUri;\n try {\n parsedDataUri = parseDataURI(dataUrl);\n } catch (_err) {\n return element;\n }\n\n if (!parsedDataUri) {\n return element;\n }\n\n element.content = parsedDataUri.data;\n element.contentType = element.contentType || parsedDataUri.contentType;\n\n if ('path' in element) {\n element.path = false;\n }\n\n if ('href' in element) {\n element.href = false;\n }\n\n return element;\n }\n}\n\nmodule.exports = MailComposer;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFjdGlvbi1icm93c2VyKS8uL25vZGVfbW9kdWxlcy8ucG5wbS9ub2RlbWFpbGVyQDcuMC4xMy9ub2RlX21vZHVsZXMvbm9kZW1haWxlci9saWIvbWFpbC1jb21wb3Nlci9pbmRleC5qcyIsIm1hcHBpbmdzIjoiQUFBQTs7QUFFYTs7QUFFYixpQkFBaUIsbUJBQU8sQ0FBQyw0SEFBYztBQUN2QyxrQkFBa0IsbUJBQU8sQ0FBQyw4SEFBZTtBQUN6QyxxQkFBcUIsMEpBQWlDOztBQUV0RDtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsUUFBUTtBQUNuQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSw0REFBNEQsNEJBQTRCO0FBQ3hGLFVBQVU7QUFDVjtBQUNBLFVBQVU7QUFDVjtBQUNBLFVBQVU7QUFDVjtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsU0FBUztBQUN4QixpQkFBaUIsUUFBUTtBQUN6QjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0EsY0FBYztBQUNkLG9EQUFvRDtBQUNwRDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsYUFBYTs7QUFFYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQixPQUFPO0FBQ3hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0Q0FBNEM7QUFDNUM7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0RBQXNEO0FBQ3REOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdEQUFnRDtBQUNoRDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxhQUFhOztBQUViO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGdDQUFnQyxlQUFlO0FBQy9DO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJDQUEyQztBQUMzQzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0E7QUFDQSxrQkFBa0I7QUFDbEI7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCO0FBQ2xCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGFBQWE7O0FBRWI7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsUUFBUTtBQUN2QixpQkFBaUIsUUFBUTtBQUN6QjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiOztBQUVBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTs7QUFFYjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxRQUFRO0FBQ3ZCLGlCQUFpQixRQUFRO0FBQ3pCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2IsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsZUFBZSxRQUFRO0FBQ3ZCLGlCQUFpQixRQUFRO0FBQ3pCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLG9EQUFvRDtBQUNwRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYixVQUFVO0FBQ1YsOERBQThEO0FBQzlEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsZUFBZSxRQUFRO0FBQ3ZCLGVBQWUsUUFBUTtBQUN2QixpQkFBaUIsUUFBUTtBQUN6QjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLFFBQVE7QUFDdkIsZ0JBQWdCLFFBQVE7QUFDeEI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSwrREFBK0Q7QUFDL0QsNkNBQTZDO0FBQzdDO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsbUNBQW1DO0FBQ25DO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBIiwic291cmNlcyI6WyIvVXNlcnMvbWFyY21pbnRlbC9Qcm9qZWN0cy9lLXRpYi5jb20vbm9kZV9tb2R1bGVzLy5wbnBtL25vZGVtYWlsZXJANy4wLjEzL25vZGVfbW9kdWxlcy9ub2RlbWFpbGVyL2xpYi9tYWlsLWNvbXBvc2VyL2luZGV4LmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludCBuby11bmRlZmluZWQ6IDAgKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCBNaW1lTm9kZSA9IHJlcXVpcmUoJy4uL21pbWUtbm9kZScpO1xuY29uc3QgbWltZUZ1bmNzID0gcmVxdWlyZSgnLi4vbWltZS1mdW5jcycpO1xuY29uc3QgcGFyc2VEYXRhVVJJID0gcmVxdWlyZSgnLi4vc2hhcmVkJykucGFyc2VEYXRhVVJJO1xuXG4vKipcbiAqIENyZWF0ZXMgdGhlIG9iamVjdCBmb3IgY29tcG9zaW5nIGEgTWltZU5vZGUgaW5zdGFuY2Ugb3V0IGZyb20gdGhlIG1haWwgb3B0aW9uc1xuICpcbiAqIEBjb25zdHJ1Y3RvclxuICogQHBhcmFtIHtPYmplY3R9IG1haWwgTWFpbCBvcHRpb25zXG4gKi9cbmNsYXNzIE1haWxDb21wb3NlciB7XG4gICAgY29uc3RydWN0b3IobWFpbCkge1xuICAgICAgICB0aGlzLm1haWwgPSBtYWlsIHx8IHt9O1xuICAgICAgICB0aGlzLm1lc3NhZ2UgPSBmYWxzZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBCdWlsZHMgTWltZU5vZGUgaW5zdGFuY2VcbiAgICAgKi9cbiAgICBjb21waWxlKCkge1xuICAgICAgICB0aGlzLl9hbHRlcm5hdGl2ZXMgPSB0aGlzLmdldEFsdGVybmF0aXZlcygpO1xuICAgICAgICB0aGlzLl9odG1sTm9kZSA9IHRoaXMuX2FsdGVybmF0aXZlcy5maWx0ZXIoYWx0ZXJuYXRpdmUgPT4gL150ZXh0XFwvaHRtbFxcYi9pLnRlc3QoYWx0ZXJuYXRpdmUuY29udGVudFR5cGUpKS5wb3AoKTtcbiAgICAgICAgdGhpcy5fYXR0YWNobWVudHMgPSB0aGlzLmdldEF0dGFjaG1lbnRzKCEhdGhpcy5faHRtbE5vZGUpO1xuXG4gICAgICAgIHRoaXMuX3VzZVJlbGF0ZWQgPSAhISh0aGlzLl9odG1sTm9kZSAmJiB0aGlzLl9hdHRhY2htZW50cy5yZWxhdGVkLmxlbmd0aCk7XG4gICAgICAgIHRoaXMuX3VzZUFsdGVybmF0aXZlID0gdGhpcy5fYWx0ZXJuYXRpdmVzLmxlbmd0aCA+IDE7XG4gICAgICAgIHRoaXMuX3VzZU1peGVkID0gdGhpcy5fYXR0YWNobWVudHMuYXR0YWNoZWQubGVuZ3RoID4gMSB8fCAodGhpcy5fYWx0ZXJuYXRpdmVzLmxlbmd0aCAmJiB0aGlzLl9hdHRhY2htZW50cy5hdHRhY2hlZC5sZW5ndGggPT09IDEpO1xuXG4gICAgICAgIC8vIENvbXBvc2UgTUlNRSB0cmVlXG4gICAgICAgIGlmICh0aGlzLm1haWwucmF3KSB7XG4gICAgICAgICAgICB0aGlzLm1lc3NhZ2UgPSBuZXcgTWltZU5vZGUoJ21lc3NhZ2UvcmZjODIyJywgeyBuZXdsaW5lOiB0aGlzLm1haWwubmV3bGluZSB9KS5zZXRSYXcodGhpcy5tYWlsLnJhdyk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5fdXNlTWl4ZWQpIHtcbiAgICAgICAgICAgIHRoaXMubWVzc2FnZSA9IHRoaXMuX2NyZWF0ZU1peGVkKCk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5fdXNlQWx0ZXJuYXRpdmUpIHtcbiAgICAgICAgICAgIHRoaXMubWVzc2FnZSA9IHRoaXMuX2NyZWF0ZUFsdGVybmF0aXZlKCk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5fdXNlUmVsYXRlZCkge1xuICAgICAgICAgICAgdGhpcy5tZXNzYWdlID0gdGhpcy5fY3JlYXRlUmVsYXRlZCgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5tZXNzYWdlID0gdGhpcy5fY3JlYXRlQ29udGVudE5vZGUoXG4gICAgICAgICAgICAgICAgZmFsc2UsXG4gICAgICAgICAgICAgICAgW11cbiAgICAgICAgICAgICAgICAgICAgLmNvbmNhdCh0aGlzLl9hbHRlcm5hdGl2ZXMgfHwgW10pXG4gICAgICAgICAgICAgICAgICAgIC5jb25jYXQodGhpcy5fYXR0YWNobWVudHMuYXR0YWNoZWQgfHwgW10pXG4gICAgICAgICAgICAgICAgICAgIC5zaGlmdCgpIHx8IHtcbiAgICAgICAgICAgICAgICAgICAgY29udGVudFR5cGU6ICd0ZXh0L3BsYWluJyxcbiAgICAgICAgICAgICAgICAgICAgY29udGVudDogJydcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQWRkIGN1c3RvbSBoZWFkZXJzXG4gICAgICAgIGlmICh0aGlzLm1haWwuaGVhZGVycykge1xuICAgICAgICAgICAgdGhpcy5tZXNzYWdlLmFkZEhlYWRlcih0aGlzLm1haWwuaGVhZGVycyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBBZGQgaGVhZGVycyB0byB0aGUgcm9vdCBub2RlLCBhbHdheXMgb3ZlcnJpZGVzIGN1c3RvbSBoZWFkZXJzXG4gICAgICAgIFsnZnJvbScsICdzZW5kZXInLCAndG8nLCAnY2MnLCAnYmNjJywgJ3JlcGx5LXRvJywgJ2luLXJlcGx5LXRvJywgJ3JlZmVyZW5jZXMnLCAnc3ViamVjdCcsICdtZXNzYWdlLWlkJywgJ2RhdGUnXS5mb3JFYWNoKGhlYWRlciA9PiB7XG4gICAgICAgICAgICBsZXQga2V5ID0gaGVhZGVyLnJlcGxhY2UoLy0oXFx3KS9nLCAobywgYykgPT4gYy50b1VwcGVyQ2FzZSgpKTtcbiAgICAgICAgICAgIGlmICh0aGlzLm1haWxba2V5XSkge1xuICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZS5zZXRIZWFkZXIoaGVhZGVyLCB0aGlzLm1haWxba2V5XSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIFNldHMgY3VzdG9tIGVudmVsb3BlXG4gICAgICAgIGlmICh0aGlzLm1haWwuZW52ZWxvcGUpIHtcbiAgICAgICAgICAgIHRoaXMubWVzc2FnZS5zZXRFbnZlbG9wZSh0aGlzLm1haWwuZW52ZWxvcGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gZW5zdXJlIE1lc3NhZ2UtSWQgdmFsdWVcbiAgICAgICAgdGhpcy5tZXNzYWdlLm1lc3NhZ2VJZCgpO1xuXG4gICAgICAgIHJldHVybiB0aGlzLm1lc3NhZ2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTGlzdCBhbGwgYXR0YWNobWVudHMuIFJlc3VsdGluZyBhdHRhY2htZW50IG9iamVjdHMgY2FuIGJlIHVzZWQgYXMgaW5wdXQgZm9yIE1pbWVOb2RlIG5vZGVzXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IGZpbmRSZWxhdGVkIElmIHRydWUgc2VwYXJhdGUgcmVsYXRlZCBhdHRhY2htZW50cyBmcm9tIGF0dGFjaGVkIG9uZXNcbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBBbiBvYmplY3Qgb2YgYXJyYXlzIChgcmVsYXRlZGAgYW5kIGBhdHRhY2hlZGApXG4gICAgICovXG4gICAgZ2V0QXR0YWNobWVudHMoZmluZFJlbGF0ZWQpIHtcbiAgICAgICAgbGV0IGljYWxFdmVudCwgZXZlbnRPYmplY3Q7XG4gICAgICAgIGxldCBhdHRhY2htZW50cyA9IFtdLmNvbmNhdCh0aGlzLm1haWwuYXR0YWNobWVudHMgfHwgW10pLm1hcCgoYXR0YWNobWVudCwgaSkgPT4ge1xuICAgICAgICAgICAgbGV0IGRhdGE7XG5cbiAgICAgICAgICAgIGlmICgvXmRhdGE6L2kudGVzdChhdHRhY2htZW50LnBhdGggfHwgYXR0YWNobWVudC5ocmVmKSkge1xuICAgICAgICAgICAgICAgIGF0dGFjaG1lbnQgPSB0aGlzLl9wcm9jZXNzRGF0YVVybChhdHRhY2htZW50KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbGV0IGNvbnRlbnRUeXBlID1cbiAgICAgICAgICAgICAgICBhdHRhY2htZW50LmNvbnRlbnRUeXBlIHx8IG1pbWVGdW5jcy5kZXRlY3RNaW1lVHlwZShhdHRhY2htZW50LmZpbGVuYW1lIHx8IGF0dGFjaG1lbnQucGF0aCB8fCBhdHRhY2htZW50LmhyZWYgfHwgJ2JpbicpO1xuXG4gICAgICAgICAgICBsZXQgaXNJbWFnZSA9IC9eaW1hZ2VcXC8vaS50ZXN0KGNvbnRlbnRUeXBlKTtcbiAgICAgICAgICAgIGxldCBpc01lc3NhZ2VOb2RlID0gL15tZXNzYWdlXFwvL2kudGVzdChjb250ZW50VHlwZSk7XG5cbiAgICAgICAgICAgIGxldCBjb250ZW50RGlzcG9zaXRpb24gPVxuICAgICAgICAgICAgICAgIGF0dGFjaG1lbnQuY29udGVudERpc3Bvc2l0aW9uIHx8IChpc01lc3NhZ2VOb2RlIHx8IChpc0ltYWdlICYmIGF0dGFjaG1lbnQuY2lkKSA/ICdpbmxpbmUnIDogJ2F0dGFjaG1lbnQnKTtcblxuICAgICAgICAgICAgbGV0IGNvbnRlbnRUcmFuc2ZlckVuY29kaW5nO1xuICAgICAgICAgICAgaWYgKCdjb250ZW50VHJhbnNmZXJFbmNvZGluZycgaW4gYXR0YWNobWVudCkge1xuICAgICAgICAgICAgICAgIC8vIGFsc28gY29udGFpbnMgYGZhbHNlYCwgdG8gc2V0XG4gICAgICAgICAgICAgICAgY29udGVudFRyYW5zZmVyRW5jb2RpbmcgPSBhdHRhY2htZW50LmNvbnRlbnRUcmFuc2ZlckVuY29kaW5nO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChpc01lc3NhZ2VOb2RlKSB7XG4gICAgICAgICAgICAgICAgLy8gdGhlIGNvbnRlbnQgbWlnaHQgaW5jbHVkZSBub24tQVNDSUkgYnl0ZXMgYnV0IGF0IHRoaXMgcG9pbnQgd2UgZG8gbm90IGtub3cgaXQgeWV0XG4gICAgICAgICAgICAgICAgY29udGVudFRyYW5zZmVyRW5jb2RpbmcgPSAnOGJpdCc7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnRlbnRUcmFuc2ZlckVuY29kaW5nID0gJ2Jhc2U2NCc7IC8vIHRoZSBkZWZhdWx0XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGRhdGEgPSB7XG4gICAgICAgICAgICAgICAgY29udGVudFR5cGUsXG4gICAgICAgICAgICAgICAgY29udGVudERpc3Bvc2l0aW9uLFxuICAgICAgICAgICAgICAgIGNvbnRlbnRUcmFuc2ZlckVuY29kaW5nXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBpZiAoYXR0YWNobWVudC5maWxlbmFtZSkge1xuICAgICAgICAgICAgICAgIGRhdGEuZmlsZW5hbWUgPSBhdHRhY2htZW50LmZpbGVuYW1lO1xuICAgICAgICAgICAgfSBlbHNlIGlmICghaXNNZXNzYWdlTm9kZSAmJiBhdHRhY2htZW50LmZpbGVuYW1lICE9PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgIGRhdGEuZmlsZW5hbWUgPSAoYXR0YWNobWVudC5wYXRoIHx8IGF0dGFjaG1lbnQuaHJlZiB8fCAnJykuc3BsaXQoJy8nKS5wb3AoKS5zcGxpdCgnPycpLnNoaWZ0KCkgfHwgJ2F0dGFjaG1lbnQtJyArIChpICsgMSk7XG4gICAgICAgICAgICAgICAgaWYgKGRhdGEuZmlsZW5hbWUuaW5kZXhPZignLicpIDwgMCkge1xuICAgICAgICAgICAgICAgICAgICBkYXRhLmZpbGVuYW1lICs9ICcuJyArIG1pbWVGdW5jcy5kZXRlY3RFeHRlbnNpb24oZGF0YS5jb250ZW50VHlwZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoL15odHRwcz86XFwvXFwvL2kudGVzdChhdHRhY2htZW50LnBhdGgpKSB7XG4gICAgICAgICAgICAgICAgYXR0YWNobWVudC5ocmVmID0gYXR0YWNobWVudC5wYXRoO1xuICAgICAgICAgICAgICAgIGF0dGFjaG1lbnQucGF0aCA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGF0dGFjaG1lbnQuY2lkKSB7XG4gICAgICAgICAgICAgICAgZGF0YS5jaWQgPSBhdHRhY2htZW50LmNpZDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGF0dGFjaG1lbnQucmF3KSB7XG4gICAgICAgICAgICAgICAgZGF0YS5yYXcgPSBhdHRhY2htZW50LnJhdztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoYXR0YWNobWVudC5wYXRoKSB7XG4gICAgICAgICAgICAgICAgZGF0YS5jb250ZW50ID0ge1xuICAgICAgICAgICAgICAgICAgICBwYXRoOiBhdHRhY2htZW50LnBhdGhcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSBlbHNlIGlmIChhdHRhY2htZW50LmhyZWYpIHtcbiAgICAgICAgICAgICAgICBkYXRhLmNvbnRlbnQgPSB7XG4gICAgICAgICAgICAgICAgICAgIGhyZWY6IGF0dGFjaG1lbnQuaHJlZixcbiAgICAgICAgICAgICAgICAgICAgaHR0cEhlYWRlcnM6IGF0dGFjaG1lbnQuaHR0cEhlYWRlcnNcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBkYXRhLmNvbnRlbnQgPSBhdHRhY2htZW50LmNvbnRlbnQgfHwgJyc7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChhdHRhY2htZW50LmVuY29kaW5nKSB7XG4gICAgICAgICAgICAgICAgZGF0YS5lbmNvZGluZyA9IGF0dGFjaG1lbnQuZW5jb2Rpbmc7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChhdHRhY2htZW50LmhlYWRlcnMpIHtcbiAgICAgICAgICAgICAgICBkYXRhLmhlYWRlcnMgPSBhdHRhY2htZW50LmhlYWRlcnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBkYXRhO1xuICAgICAgICB9KTtcblxuICAgICAgICBpZiAodGhpcy5tYWlsLmljYWxFdmVudCkge1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIHR5cGVvZiB0aGlzLm1haWwuaWNhbEV2ZW50ID09PSAnb2JqZWN0JyAmJlxuICAgICAgICAgICAgICAgICh0aGlzLm1haWwuaWNhbEV2ZW50LmNvbnRlbnQgfHwgdGhpcy5tYWlsLmljYWxFdmVudC5wYXRoIHx8IHRoaXMubWFpbC5pY2FsRXZlbnQuaHJlZiB8fCB0aGlzLm1haWwuaWNhbEV2ZW50LnJhdylcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIGljYWxFdmVudCA9IHRoaXMubWFpbC5pY2FsRXZlbnQ7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGljYWxFdmVudCA9IHtcbiAgICAgICAgICAgICAgICAgICAgY29udGVudDogdGhpcy5tYWlsLmljYWxFdmVudFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGV2ZW50T2JqZWN0ID0ge307XG4gICAgICAgICAgICBPYmplY3Qua2V5cyhpY2FsRXZlbnQpLmZvckVhY2goa2V5ID0+IHtcbiAgICAgICAgICAgICAgICBldmVudE9iamVjdFtrZXldID0gaWNhbEV2ZW50W2tleV07XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgZXZlbnRPYmplY3QuY29udGVudFR5cGUgPSAnYXBwbGljYXRpb24vaWNzJztcbiAgICAgICAgICAgIGlmICghZXZlbnRPYmplY3QuaGVhZGVycykge1xuICAgICAgICAgICAgICAgIGV2ZW50T2JqZWN0LmhlYWRlcnMgPSB7fTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGV2ZW50T2JqZWN0LmZpbGVuYW1lID0gZXZlbnRPYmplY3QuZmlsZW5hbWUgfHwgJ2ludml0ZS5pY3MnO1xuICAgICAgICAgICAgZXZlbnRPYmplY3QuaGVhZGVyc1snQ29udGVudC1EaXNwb3NpdGlvbiddID0gJ2F0dGFjaG1lbnQnO1xuICAgICAgICAgICAgZXZlbnRPYmplY3QuaGVhZGVyc1snQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZyddID0gJ2Jhc2U2NCc7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWZpbmRSZWxhdGVkKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGF0dGFjaGVkOiBhdHRhY2htZW50cy5jb25jYXQoZXZlbnRPYmplY3QgfHwgW10pLFxuICAgICAgICAgICAgICAgIHJlbGF0ZWQ6IFtdXG4gICAgICAgICAgICB9O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBhdHRhY2hlZDogYXR0YWNobWVudHMuZmlsdGVyKGF0dGFjaG1lbnQgPT4gIWF0dGFjaG1lbnQuY2lkKS5jb25jYXQoZXZlbnRPYmplY3QgfHwgW10pLFxuICAgICAgICAgICAgICAgIHJlbGF0ZWQ6IGF0dGFjaG1lbnRzLmZpbHRlcihhdHRhY2htZW50ID0+ICEhYXR0YWNobWVudC5jaWQpXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTGlzdCBhbHRlcm5hdGl2ZXMuIFJlc3VsdGluZyBvYmplY3RzIGNhbiBiZSB1c2VkIGFzIGlucHV0IGZvciBNaW1lTm9kZSBub2Rlc1xuICAgICAqXG4gICAgICogQHJldHVybnMge0FycmF5fSBBbiBhcnJheSBvZiBhbHRlcm5hdGl2ZSBlbGVtZW50cy4gSW5jbHVkZXMgdGhlIGB0ZXh0YCBhbmQgYGh0bWxgIHZhbHVlcyBhcyB3ZWxsXG4gICAgICovXG4gICAgZ2V0QWx0ZXJuYXRpdmVzKCkge1xuICAgICAgICBsZXQgYWx0ZXJuYXRpdmVzID0gW10sXG4gICAgICAgICAgICB0ZXh0LFxuICAgICAgICAgICAgaHRtbCxcbiAgICAgICAgICAgIHdhdGNoSHRtbCxcbiAgICAgICAgICAgIGFtcCxcbiAgICAgICAgICAgIGljYWxFdmVudCxcbiAgICAgICAgICAgIGV2ZW50T2JqZWN0O1xuXG4gICAgICAgIGlmICh0aGlzLm1haWwudGV4dCkge1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIHR5cGVvZiB0aGlzLm1haWwudGV4dCA9PT0gJ29iamVjdCcgJiZcbiAgICAgICAgICAgICAgICAodGhpcy5tYWlsLnRleHQuY29udGVudCB8fCB0aGlzLm1haWwudGV4dC5wYXRoIHx8IHRoaXMubWFpbC50ZXh0LmhyZWYgfHwgdGhpcy5tYWlsLnRleHQucmF3KVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgdGV4dCA9IHRoaXMubWFpbC50ZXh0O1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0ZXh0ID0ge1xuICAgICAgICAgICAgICAgICAgICBjb250ZW50OiB0aGlzLm1haWwudGV4dFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0ZXh0LmNvbnRlbnRUeXBlID0gJ3RleHQvcGxhaW47IGNoYXJzZXQ9dXRmLTgnO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMubWFpbC53YXRjaEh0bWwpIHtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICB0eXBlb2YgdGhpcy5tYWlsLndhdGNoSHRtbCA9PT0gJ29iamVjdCcgJiZcbiAgICAgICAgICAgICAgICAodGhpcy5tYWlsLndhdGNoSHRtbC5jb250ZW50IHx8IHRoaXMubWFpbC53YXRjaEh0bWwucGF0aCB8fCB0aGlzLm1haWwud2F0Y2hIdG1sLmhyZWYgfHwgdGhpcy5tYWlsLndhdGNoSHRtbC5yYXcpXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICB3YXRjaEh0bWwgPSB0aGlzLm1haWwud2F0Y2hIdG1sO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB3YXRjaEh0bWwgPSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRlbnQ6IHRoaXMubWFpbC53YXRjaEh0bWxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgd2F0Y2hIdG1sLmNvbnRlbnRUeXBlID0gJ3RleHQvd2F0Y2gtaHRtbDsgY2hhcnNldD11dGYtOCc7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5tYWlsLmFtcCkge1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIHR5cGVvZiB0aGlzLm1haWwuYW1wID09PSAnb2JqZWN0JyAmJlxuICAgICAgICAgICAgICAgICh0aGlzLm1haWwuYW1wLmNvbnRlbnQgfHwgdGhpcy5tYWlsLmFtcC5wYXRoIHx8IHRoaXMubWFpbC5hbXAuaHJlZiB8fCB0aGlzLm1haWwuYW1wLnJhdylcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIGFtcCA9IHRoaXMubWFpbC5hbXA7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGFtcCA9IHtcbiAgICAgICAgICAgICAgICAgICAgY29udGVudDogdGhpcy5tYWlsLmFtcFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhbXAuY29udGVudFR5cGUgPSAndGV4dC94LWFtcC1odG1sOyBjaGFyc2V0PXV0Zi04JztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE5CISB3aGVuIGluY2x1ZGluZyBhdHRhY2htZW50cyB3aXRoIGEgY2FsZW5kYXIgYWx0ZXJuYXRpdmUgeW91IG1pZ2h0IGVuZCB1cCBpbiBhIGJsYW5rIHNjcmVlbiBvbiBzb21lIGNsaWVudHNcbiAgICAgICAgaWYgKHRoaXMubWFpbC5pY2FsRXZlbnQpIHtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICB0eXBlb2YgdGhpcy5tYWlsLmljYWxFdmVudCA9PT0gJ29iamVjdCcgJiZcbiAgICAgICAgICAgICAgICAodGhpcy5tYWlsLmljYWxFdmVudC5jb250ZW50IHx8IHRoaXMubWFpbC5pY2FsRXZlbnQucGF0aCB8fCB0aGlzLm1haWwuaWNhbEV2ZW50LmhyZWYgfHwgdGhpcy5tYWlsLmljYWxFdmVudC5yYXcpXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICBpY2FsRXZlbnQgPSB0aGlzLm1haWwuaWNhbEV2ZW50O1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpY2FsRXZlbnQgPSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRlbnQ6IHRoaXMubWFpbC5pY2FsRXZlbnRcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBldmVudE9iamVjdCA9IHt9O1xuICAgICAgICAgICAgT2JqZWN0LmtleXMoaWNhbEV2ZW50KS5mb3JFYWNoKGtleSA9PiB7XG4gICAgICAgICAgICAgICAgZXZlbnRPYmplY3Rba2V5XSA9IGljYWxFdmVudFtrZXldO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGlmIChldmVudE9iamVjdC5jb250ZW50ICYmIHR5cGVvZiBldmVudE9iamVjdC5jb250ZW50ID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgICAgIC8vIHdlIGFyZSBnb2luZyB0byBoYXZlIHRoZSBzYW1lIGF0dGFjaG1lbnQgdHdpY2UsIHNvIG1hcmsgdGhpcyB0byBiZVxuICAgICAgICAgICAgICAgIC8vIHJlc29sdmVkIGp1c3Qgb25jZVxuICAgICAgICAgICAgICAgIGV2ZW50T2JqZWN0LmNvbnRlbnQuX3Jlc29sdmUgPSB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBldmVudE9iamVjdC5maWxlbmFtZSA9IGZhbHNlO1xuICAgICAgICAgICAgZXZlbnRPYmplY3QuY29udGVudFR5cGUgPVxuICAgICAgICAgICAgICAgICd0ZXh0L2NhbGVuZGFyOyBjaGFyc2V0PXV0Zi04OyBtZXRob2Q9JyArIChldmVudE9iamVjdC5tZXRob2QgfHwgJ1BVQkxJU0gnKS50b1N0cmluZygpLnRyaW0oKS50b1VwcGVyQ2FzZSgpO1xuICAgICAgICAgICAgaWYgKCFldmVudE9iamVjdC5oZWFkZXJzKSB7XG4gICAgICAgICAgICAgICAgZXZlbnRPYmplY3QuaGVhZGVycyA9IHt9O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMubWFpbC5odG1sKSB7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgdHlwZW9mIHRoaXMubWFpbC5odG1sID09PSAnb2JqZWN0JyAmJlxuICAgICAgICAgICAgICAgICh0aGlzLm1haWwuaHRtbC5jb250ZW50IHx8IHRoaXMubWFpbC5odG1sLnBhdGggfHwgdGhpcy5tYWlsLmh0bWwuaHJlZiB8fCB0aGlzLm1haWwuaHRtbC5yYXcpXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICBodG1sID0gdGhpcy5tYWlsLmh0bWw7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGh0bWwgPSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRlbnQ6IHRoaXMubWFpbC5odG1sXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGh0bWwuY29udGVudFR5cGUgPSAndGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04JztcbiAgICAgICAgfVxuXG4gICAgICAgIFtdXG4gICAgICAgICAgICAuY29uY2F0KHRleHQgfHwgW10pXG4gICAgICAgICAgICAuY29uY2F0KHdhdGNoSHRtbCB8fCBbXSlcbiAgICAgICAgICAgIC5jb25jYXQoYW1wIHx8IFtdKVxuICAgICAgICAgICAgLmNvbmNhdChodG1sIHx8IFtdKVxuICAgICAgICAgICAgLmNvbmNhdChldmVudE9iamVjdCB8fCBbXSlcbiAgICAgICAgICAgIC5jb25jYXQodGhpcy5tYWlsLmFsdGVybmF0aXZlcyB8fCBbXSlcbiAgICAgICAgICAgIC5mb3JFYWNoKGFsdGVybmF0aXZlID0+IHtcbiAgICAgICAgICAgICAgICBsZXQgZGF0YTtcblxuICAgICAgICAgICAgICAgIGlmICgvXmRhdGE6L2kudGVzdChhbHRlcm5hdGl2ZS5wYXRoIHx8IGFsdGVybmF0aXZlLmhyZWYpKSB7XG4gICAgICAgICAgICAgICAgICAgIGFsdGVybmF0aXZlID0gdGhpcy5fcHJvY2Vzc0RhdGFVcmwoYWx0ZXJuYXRpdmUpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGRhdGEgPSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRlbnRUeXBlOlxuICAgICAgICAgICAgICAgICAgICAgICAgYWx0ZXJuYXRpdmUuY29udGVudFR5cGUgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1pbWVGdW5jcy5kZXRlY3RNaW1lVHlwZShhbHRlcm5hdGl2ZS5maWxlbmFtZSB8fCBhbHRlcm5hdGl2ZS5wYXRoIHx8IGFsdGVybmF0aXZlLmhyZWYgfHwgJ3R4dCcpLFxuICAgICAgICAgICAgICAgICAgICBjb250ZW50VHJhbnNmZXJFbmNvZGluZzogYWx0ZXJuYXRpdmUuY29udGVudFRyYW5zZmVyRW5jb2RpbmdcbiAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgaWYgKGFsdGVybmF0aXZlLmZpbGVuYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGEuZmlsZW5hbWUgPSBhbHRlcm5hdGl2ZS5maWxlbmFtZTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoL15odHRwcz86XFwvXFwvL2kudGVzdChhbHRlcm5hdGl2ZS5wYXRoKSkge1xuICAgICAgICAgICAgICAgICAgICBhbHRlcm5hdGl2ZS5ocmVmID0gYWx0ZXJuYXRpdmUucGF0aDtcbiAgICAgICAgICAgICAgICAgICAgYWx0ZXJuYXRpdmUucGF0aCA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoYWx0ZXJuYXRpdmUucmF3KSB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGEucmF3ID0gYWx0ZXJuYXRpdmUucmF3O1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYWx0ZXJuYXRpdmUucGF0aCkge1xuICAgICAgICAgICAgICAgICAgICBkYXRhLmNvbnRlbnQgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXRoOiBhbHRlcm5hdGl2ZS5wYXRoXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChhbHRlcm5hdGl2ZS5ocmVmKSB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGEuY29udGVudCA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGhyZWY6IGFsdGVybmF0aXZlLmhyZWZcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBkYXRhLmNvbnRlbnQgPSBhbHRlcm5hdGl2ZS5jb250ZW50IHx8ICcnO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChhbHRlcm5hdGl2ZS5lbmNvZGluZykge1xuICAgICAgICAgICAgICAgICAgICBkYXRhLmVuY29kaW5nID0gYWx0ZXJuYXRpdmUuZW5jb2Rpbmc7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKGFsdGVybmF0aXZlLmhlYWRlcnMpIHtcbiAgICAgICAgICAgICAgICAgICAgZGF0YS5oZWFkZXJzID0gYWx0ZXJuYXRpdmUuaGVhZGVycztcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBhbHRlcm5hdGl2ZXMucHVzaChkYXRhKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBhbHRlcm5hdGl2ZXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQnVpbGRzIG11bHRpcGFydC9taXhlZCBub2RlLiBJdCBzaG91bGQgYWx3YXlzIGNvbnRhaW4gZGlmZmVyZW50IHR5cGUgb2YgZWxlbWVudHMgb24gdGhlIHNhbWUgbGV2ZWxcbiAgICAgKiBlZy4gdGV4dCArIGF0dGFjaG1lbnRzXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gcGFyZW50Tm9kZSBQYXJlbnQgZm9yIHRoaXMgbm90ZS4gSWYgaXQgZG9lcyBub3QgZXhpc3QsIGEgcm9vdCBub2RlIGlzIGNyZWF0ZWRcbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBNaW1lTm9kZSBub2RlIGVsZW1lbnRcbiAgICAgKi9cbiAgICBfY3JlYXRlTWl4ZWQocGFyZW50Tm9kZSkge1xuICAgICAgICBsZXQgbm9kZTtcblxuICAgICAgICBpZiAoIXBhcmVudE5vZGUpIHtcbiAgICAgICAgICAgIG5vZGUgPSBuZXcgTWltZU5vZGUoJ211bHRpcGFydC9taXhlZCcsIHtcbiAgICAgICAgICAgICAgICBiYXNlQm91bmRhcnk6IHRoaXMubWFpbC5iYXNlQm91bmRhcnksXG4gICAgICAgICAgICAgICAgdGV4dEVuY29kaW5nOiB0aGlzLm1haWwudGV4dEVuY29kaW5nLFxuICAgICAgICAgICAgICAgIGJvdW5kYXJ5UHJlZml4OiB0aGlzLm1haWwuYm91bmRhcnlQcmVmaXgsXG4gICAgICAgICAgICAgICAgZGlzYWJsZVVybEFjY2VzczogdGhpcy5tYWlsLmRpc2FibGVVcmxBY2Nlc3MsXG4gICAgICAgICAgICAgICAgZGlzYWJsZUZpbGVBY2Nlc3M6IHRoaXMubWFpbC5kaXNhYmxlRmlsZUFjY2VzcyxcbiAgICAgICAgICAgICAgICBub3JtYWxpemVIZWFkZXJLZXk6IHRoaXMubWFpbC5ub3JtYWxpemVIZWFkZXJLZXksXG4gICAgICAgICAgICAgICAgbmV3bGluZTogdGhpcy5tYWlsLm5ld2xpbmVcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbm9kZSA9IHBhcmVudE5vZGUuY3JlYXRlQ2hpbGQoJ211bHRpcGFydC9taXhlZCcsIHtcbiAgICAgICAgICAgICAgICBkaXNhYmxlVXJsQWNjZXNzOiB0aGlzLm1haWwuZGlzYWJsZVVybEFjY2VzcyxcbiAgICAgICAgICAgICAgICBkaXNhYmxlRmlsZUFjY2VzczogdGhpcy5tYWlsLmRpc2FibGVGaWxlQWNjZXNzLFxuICAgICAgICAgICAgICAgIG5vcm1hbGl6ZUhlYWRlcktleTogdGhpcy5tYWlsLm5vcm1hbGl6ZUhlYWRlcktleSxcbiAgICAgICAgICAgICAgICBuZXdsaW5lOiB0aGlzLm1haWwubmV3bGluZVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5fdXNlQWx0ZXJuYXRpdmUpIHtcbiAgICAgICAgICAgIHRoaXMuX2NyZWF0ZUFsdGVybmF0aXZlKG5vZGUpO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuX3VzZVJlbGF0ZWQpIHtcbiAgICAgICAgICAgIHRoaXMuX2NyZWF0ZVJlbGF0ZWQobm9kZSk7XG4gICAgICAgIH1cblxuICAgICAgICBbXVxuICAgICAgICAgICAgLmNvbmNhdCgoIXRoaXMuX3VzZUFsdGVybmF0aXZlICYmIHRoaXMuX2FsdGVybmF0aXZlcykgfHwgW10pXG4gICAgICAgICAgICAuY29uY2F0KHRoaXMuX2F0dGFjaG1lbnRzLmF0dGFjaGVkIHx8IFtdKVxuICAgICAgICAgICAgLmZvckVhY2goZWxlbWVudCA9PiB7XG4gICAgICAgICAgICAgICAgLy8gaWYgdGhlIGVsZW1lbnQgaXMgYSBodG1sIG5vZGUgZnJvbSByZWxhdGVkIHN1YnBhcnQgdGhlbiBpZ25vcmUgaXRcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuX3VzZVJlbGF0ZWQgfHwgZWxlbWVudCAhPT0gdGhpcy5faHRtbE5vZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fY3JlYXRlQ29udGVudE5vZGUobm9kZSwgZWxlbWVudCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQnVpbGRzIG11bHRpcGFydC9hbHRlcm5hdGl2ZSBub2RlLiBJdCBzaG91bGQgYWx3YXlzIGNvbnRhaW4gc2FtZSB0eXBlIG9mIGVsZW1lbnRzIG9uIHRoZSBzYW1lIGxldmVsXG4gICAgICogZWcuIHRleHQgKyBodG1sIHZpZXcgb2YgdGhlIHNhbWUgZGF0YVxuICAgICAqXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHBhcmVudE5vZGUgUGFyZW50IGZvciB0aGlzIG5vdGUuIElmIGl0IGRvZXMgbm90IGV4aXN0LCBhIHJvb3Qgbm9kZSBpcyBjcmVhdGVkXG4gICAgICogQHJldHVybnMge09iamVjdH0gTWltZU5vZGUgbm9kZSBlbGVtZW50XG4gICAgICovXG4gICAgX2NyZWF0ZUFsdGVybmF0aXZlKHBhcmVudE5vZGUpIHtcbiAgICAgICAgbGV0IG5vZGU7XG5cbiAgICAgICAgaWYgKCFwYXJlbnROb2RlKSB7XG4gICAgICAgICAgICBub2RlID0gbmV3IE1pbWVOb2RlKCdtdWx0aXBhcnQvYWx0ZXJuYXRpdmUnLCB7XG4gICAgICAgICAgICAgICAgYmFzZUJvdW5kYXJ5OiB0aGlzLm1haWwuYmFzZUJvdW5kYXJ5LFxuICAgICAgICAgICAgICAgIHRleHRFbmNvZGluZzogdGhpcy5tYWlsLnRleHRFbmNvZGluZyxcbiAgICAgICAgICAgICAgICBib3VuZGFyeVByZWZpeDogdGhpcy5tYWlsLmJvdW5kYXJ5UHJlZml4LFxuICAgICAgICAgICAgICAgIGRpc2FibGVVcmxBY2Nlc3M6IHRoaXMubWFpbC5kaXNhYmxlVXJsQWNjZXNzLFxuICAgICAgICAgICAgICAgIGRpc2FibGVGaWxlQWNjZXNzOiB0aGlzLm1haWwuZGlzYWJsZUZpbGVBY2Nlc3MsXG4gICAgICAgICAgICAgICAgbm9ybWFsaXplSGVhZGVyS2V5OiB0aGlzLm1haWwubm9ybWFsaXplSGVhZGVyS2V5LFxuICAgICAgICAgICAgICAgIG5ld2xpbmU6IHRoaXMubWFpbC5uZXdsaW5lXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG5vZGUgPSBwYXJlbnROb2RlLmNyZWF0ZUNoaWxkKCdtdWx0aXBhcnQvYWx0ZXJuYXRpdmUnLCB7XG4gICAgICAgICAgICAgICAgZGlzYWJsZVVybEFjY2VzczogdGhpcy5tYWlsLmRpc2FibGVVcmxBY2Nlc3MsXG4gICAgICAgICAgICAgICAgZGlzYWJsZUZpbGVBY2Nlc3M6IHRoaXMubWFpbC5kaXNhYmxlRmlsZUFjY2VzcyxcbiAgICAgICAgICAgICAgICBub3JtYWxpemVIZWFkZXJLZXk6IHRoaXMubWFpbC5ub3JtYWxpemVIZWFkZXJLZXksXG4gICAgICAgICAgICAgICAgbmV3bGluZTogdGhpcy5tYWlsLm5ld2xpbmVcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fYWx0ZXJuYXRpdmVzLmZvckVhY2goYWx0ZXJuYXRpdmUgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMuX3VzZVJlbGF0ZWQgJiYgdGhpcy5faHRtbE5vZGUgPT09IGFsdGVybmF0aXZlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fY3JlYXRlUmVsYXRlZChub2RlKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fY3JlYXRlQ29udGVudE5vZGUobm9kZSwgYWx0ZXJuYXRpdmUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gbm9kZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBCdWlsZHMgbXVsdGlwYXJ0L3JlbGF0ZWQgbm9kZS4gSXQgc2hvdWxkIGFsd2F5cyBjb250YWluIGh0bWwgbm9kZSB3aXRoIHJlbGF0ZWQgYXR0YWNobWVudHNcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBwYXJlbnROb2RlIFBhcmVudCBmb3IgdGhpcyBub3RlLiBJZiBpdCBkb2VzIG5vdCBleGlzdCwgYSByb290IG5vZGUgaXMgY3JlYXRlZFxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IE1pbWVOb2RlIG5vZGUgZWxlbWVudFxuICAgICAqL1xuICAgIF9jcmVhdGVSZWxhdGVkKHBhcmVudE5vZGUpIHtcbiAgICAgICAgbGV0IG5vZGU7XG5cbiAgICAgICAgaWYgKCFwYXJlbnROb2RlKSB7XG4gICAgICAgICAgICBub2RlID0gbmV3IE1pbWVOb2RlKCdtdWx0aXBhcnQvcmVsYXRlZDsgdHlwZT1cInRleHQvaHRtbFwiJywge1xuICAgICAgICAgICAgICAgIGJhc2VCb3VuZGFyeTogdGhpcy5tYWlsLmJhc2VCb3VuZGFyeSxcbiAgICAgICAgICAgICAgICB0ZXh0RW5jb2Rpbmc6IHRoaXMubWFpbC50ZXh0RW5jb2RpbmcsXG4gICAgICAgICAgICAgICAgYm91bmRhcnlQcmVmaXg6IHRoaXMubWFpbC5ib3VuZGFyeVByZWZpeCxcbiAgICAgICAgICAgICAgICBkaXNhYmxlVXJsQWNjZXNzOiB0aGlzLm1haWwuZGlzYWJsZVVybEFjY2VzcyxcbiAgICAgICAgICAgICAgICBkaXNhYmxlRmlsZUFjY2VzczogdGhpcy5tYWlsLmRpc2FibGVGaWxlQWNjZXNzLFxuICAgICAgICAgICAgICAgIG5vcm1hbGl6ZUhlYWRlcktleTogdGhpcy5tYWlsLm5vcm1hbGl6ZUhlYWRlcktleSxcbiAgICAgICAgICAgICAgICBuZXdsaW5lOiB0aGlzLm1haWwubmV3bGluZVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBub2RlID0gcGFyZW50Tm9kZS5jcmVhdGVDaGlsZCgnbXVsdGlwYXJ0L3JlbGF0ZWQ7IHR5cGU9XCJ0ZXh0L2h0bWxcIicsIHtcbiAgICAgICAgICAgICAgICBkaXNhYmxlVXJsQWNjZXNzOiB0aGlzLm1haWwuZGlzYWJsZVVybEFjY2VzcyxcbiAgICAgICAgICAgICAgICBkaXNhYmxlRmlsZUFjY2VzczogdGhpcy5tYWlsLmRpc2FibGVGaWxlQWNjZXNzLFxuICAgICAgICAgICAgICAgIG5vcm1hbGl6ZUhlYWRlcktleTogdGhpcy5tYWlsLm5vcm1hbGl6ZUhlYWRlcktleSxcbiAgICAgICAgICAgICAgICBuZXdsaW5lOiB0aGlzLm1haWwubmV3bGluZVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9jcmVhdGVDb250ZW50Tm9kZShub2RlLCB0aGlzLl9odG1sTm9kZSk7XG5cbiAgICAgICAgdGhpcy5fYXR0YWNobWVudHMucmVsYXRlZC5mb3JFYWNoKGFsdGVybmF0aXZlID0+IHRoaXMuX2NyZWF0ZUNvbnRlbnROb2RlKG5vZGUsIGFsdGVybmF0aXZlKSk7XG5cbiAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIHJlZ3VsYXIgbm9kZSB3aXRoIGNvbnRlbnRzXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gcGFyZW50Tm9kZSBQYXJlbnQgZm9yIHRoaXMgbm90ZS4gSWYgaXQgZG9lcyBub3QgZXhpc3QsIGEgcm9vdCBub2RlIGlzIGNyZWF0ZWRcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gZWxlbWVudCBOb2RlIGRhdGFcbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBNaW1lTm9kZSBub2RlIGVsZW1lbnRcbiAgICAgKi9cbiAgICBfY3JlYXRlQ29udGVudE5vZGUocGFyZW50Tm9kZSwgZWxlbWVudCkge1xuICAgICAgICBlbGVtZW50ID0gZWxlbWVudCB8fCB7fTtcbiAgICAgICAgZWxlbWVudC5jb250ZW50ID0gZWxlbWVudC5jb250ZW50IHx8ICcnO1xuXG4gICAgICAgIGxldCBub2RlO1xuICAgICAgICBsZXQgZW5jb2RpbmcgPSAoZWxlbWVudC5lbmNvZGluZyB8fCAndXRmOCcpXG4gICAgICAgICAgICAudG9TdHJpbmcoKVxuICAgICAgICAgICAgLnRvTG93ZXJDYXNlKClcbiAgICAgICAgICAgIC5yZXBsYWNlKC9bLV9cXHNdL2csICcnKTtcblxuICAgICAgICBpZiAoIXBhcmVudE5vZGUpIHtcbiAgICAgICAgICAgIG5vZGUgPSBuZXcgTWltZU5vZGUoZWxlbWVudC5jb250ZW50VHlwZSwge1xuICAgICAgICAgICAgICAgIGZpbGVuYW1lOiBlbGVtZW50LmZpbGVuYW1lLFxuICAgICAgICAgICAgICAgIGJhc2VCb3VuZGFyeTogdGhpcy5tYWlsLmJhc2VCb3VuZGFyeSxcbiAgICAgICAgICAgICAgICB0ZXh0RW5jb2Rpbmc6IHRoaXMubWFpbC50ZXh0RW5jb2RpbmcsXG4gICAgICAgICAgICAgICAgYm91bmRhcnlQcmVmaXg6IHRoaXMubWFpbC5ib3VuZGFyeVByZWZpeCxcbiAgICAgICAgICAgICAgICBkaXNhYmxlVXJsQWNjZXNzOiB0aGlzLm1haWwuZGlzYWJsZVVybEFjY2VzcyxcbiAgICAgICAgICAgICAgICBkaXNhYmxlRmlsZUFjY2VzczogdGhpcy5tYWlsLmRpc2FibGVGaWxlQWNjZXNzLFxuICAgICAgICAgICAgICAgIG5vcm1hbGl6ZUhlYWRlcktleTogdGhpcy5tYWlsLm5vcm1hbGl6ZUhlYWRlcktleSxcbiAgICAgICAgICAgICAgICBuZXdsaW5lOiB0aGlzLm1haWwubmV3bGluZVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBub2RlID0gcGFyZW50Tm9kZS5jcmVhdGVDaGlsZChlbGVtZW50LmNvbnRlbnRUeXBlLCB7XG4gICAgICAgICAgICAgICAgZmlsZW5hbWU6IGVsZW1lbnQuZmlsZW5hbWUsXG4gICAgICAgICAgICAgICAgdGV4dEVuY29kaW5nOiB0aGlzLm1haWwudGV4dEVuY29kaW5nLFxuICAgICAgICAgICAgICAgIGRpc2FibGVVcmxBY2Nlc3M6IHRoaXMubWFpbC5kaXNhYmxlVXJsQWNjZXNzLFxuICAgICAgICAgICAgICAgIGRpc2FibGVGaWxlQWNjZXNzOiB0aGlzLm1haWwuZGlzYWJsZUZpbGVBY2Nlc3MsXG4gICAgICAgICAgICAgICAgbm9ybWFsaXplSGVhZGVyS2V5OiB0aGlzLm1haWwubm9ybWFsaXplSGVhZGVyS2V5LFxuICAgICAgICAgICAgICAgIG5ld2xpbmU6IHRoaXMubWFpbC5uZXdsaW5lXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGFkZCBjdXN0b20gaGVhZGVyc1xuICAgICAgICBpZiAoZWxlbWVudC5oZWFkZXJzKSB7XG4gICAgICAgICAgICBub2RlLmFkZEhlYWRlcihlbGVtZW50LmhlYWRlcnMpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGVsZW1lbnQuY2lkKSB7XG4gICAgICAgICAgICBub2RlLnNldEhlYWRlcignQ29udGVudC1JZCcsICc8JyArIGVsZW1lbnQuY2lkLnJlcGxhY2UoL1s8Pl0vZywgJycpICsgJz4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChlbGVtZW50LmNvbnRlbnRUcmFuc2ZlckVuY29kaW5nKSB7XG4gICAgICAgICAgICBub2RlLnNldEhlYWRlcignQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZycsIGVsZW1lbnQuY29udGVudFRyYW5zZmVyRW5jb2RpbmcpO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMubWFpbC5lbmNvZGluZyAmJiAvXnRleHRcXC8vaS50ZXN0KGVsZW1lbnQuY29udGVudFR5cGUpKSB7XG4gICAgICAgICAgICBub2RlLnNldEhlYWRlcignQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZycsIHRoaXMubWFpbC5lbmNvZGluZyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIS9edGV4dFxcLy9pLnRlc3QoZWxlbWVudC5jb250ZW50VHlwZSkgfHwgZWxlbWVudC5jb250ZW50RGlzcG9zaXRpb24pIHtcbiAgICAgICAgICAgIG5vZGUuc2V0SGVhZGVyKFxuICAgICAgICAgICAgICAgICdDb250ZW50LURpc3Bvc2l0aW9uJyxcbiAgICAgICAgICAgICAgICBlbGVtZW50LmNvbnRlbnREaXNwb3NpdGlvbiB8fCAoZWxlbWVudC5jaWQgJiYgL15pbWFnZVxcLy9pLnRlc3QoZWxlbWVudC5jb250ZW50VHlwZSkgPyAnaW5saW5lJyA6ICdhdHRhY2htZW50JylcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZW9mIGVsZW1lbnQuY29udGVudCA9PT0gJ3N0cmluZycgJiYgIVsndXRmOCcsICd1c2FzY2lpJywgJ2FzY2lpJ10uaW5jbHVkZXMoZW5jb2RpbmcpKSB7XG4gICAgICAgICAgICBlbGVtZW50LmNvbnRlbnQgPSBCdWZmZXIuZnJvbShlbGVtZW50LmNvbnRlbnQsIGVuY29kaW5nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHByZWZlciBwcmVnZW5lcmF0ZWQgcmF3IGNvbnRlbnRcbiAgICAgICAgaWYgKGVsZW1lbnQucmF3KSB7XG4gICAgICAgICAgICBub2RlLnNldFJhdyhlbGVtZW50LnJhdyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBub2RlLnNldENvbnRlbnQoZWxlbWVudC5jb250ZW50KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBub2RlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBhcnNlcyBkYXRhIHVyaSBhbmQgY29udmVydHMgaXQgdG8gYSBCdWZmZXJcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBlbGVtZW50IENvbnRlbnQgZWxlbWVudFxuICAgICAqIEByZXR1cm4ge09iamVjdH0gUGFyc2VkIGVsZW1lbnRcbiAgICAgKi9cbiAgICBfcHJvY2Vzc0RhdGFVcmwoZWxlbWVudCkge1xuICAgICAgICBjb25zdCBkYXRhVXJsID0gZWxlbWVudC5wYXRoIHx8IGVsZW1lbnQuaHJlZjtcblxuICAgICAgICAvLyBFYXJseSB2YWxpZGF0aW9uIHRvIHByZXZlbnQgUmVEb1NcbiAgICAgICAgaWYgKCFkYXRhVXJsIHx8IHR5cGVvZiBkYXRhVXJsICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQ7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWRhdGFVcmwuc3RhcnRzV2l0aCgnZGF0YTonKSkge1xuICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQ7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZGF0YVVybC5sZW5ndGggPiA1MjQyODgwMCkge1xuICAgICAgICAgICAgLy8gNTI0Mjg4MDAgY2hhcnMgPSA1ME1CIGxpbWl0IGZvciBkYXRhIFVSTCBzdHJpbmcgKH4zNy41TUIgZGVjb2RlZCBpbWFnZSlcbiAgICAgICAgICAgIC8vIEV4dHJhY3QgY29udGVudCB0eXBlIGJlZm9yZSByZWplY3RpbmcgdG8gcHJlc2VydmUgTUlNRSB0eXBlXG4gICAgICAgICAgICBsZXQgZGV0ZWN0ZWRUeXBlID0gJ2FwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSc7XG4gICAgICAgICAgICBjb25zdCBjb21tYVBvcyA9IGRhdGFVcmwuaW5kZXhPZignLCcpO1xuXG4gICAgICAgICAgICBpZiAoY29tbWFQb3MgPiAwICYmIGNvbW1hUG9zIDwgMjAwKSB7XG4gICAgICAgICAgICAgICAgLy8gUGFyc2UgaGVhZGVyIHNhZmVseSB3aXRoIHNpemUgbGltaXRcbiAgICAgICAgICAgICAgICBjb25zdCBoZWFkZXIgPSBkYXRhVXJsLnN1YnN0cmluZyg1LCBjb21tYVBvcyk7IC8vIHNraXAgJ2RhdGE6J1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhcnRzID0gaGVhZGVyLnNwbGl0KCc7Jyk7XG4gICAgICAgICAgICAgICAgaWYgKHBhcnRzWzBdICYmIHBhcnRzWzBdLmluY2x1ZGVzKCcvJykpIHtcbiAgICAgICAgICAgICAgICAgICAgZGV0ZWN0ZWRUeXBlID0gcGFydHNbMF0udHJpbSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gUmV0dXJuIGVtcHR5IGNvbnRlbnQgZm9yIGV4Y2Vzc2l2ZWx5IGxvbmcgZGF0YSBVUkxzXG4gICAgICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgZWxlbWVudCwge1xuICAgICAgICAgICAgICAgIHBhdGg6IGZhbHNlLFxuICAgICAgICAgICAgICAgIGhyZWY6IGZhbHNlLFxuICAgICAgICAgICAgICAgIGNvbnRlbnQ6IEJ1ZmZlci5hbGxvYygwKSxcbiAgICAgICAgICAgICAgICBjb250ZW50VHlwZTogZWxlbWVudC5jb250ZW50VHlwZSB8fCBkZXRlY3RlZFR5cGVcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHBhcnNlZERhdGFVcmk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBwYXJzZWREYXRhVXJpID0gcGFyc2VEYXRhVVJJKGRhdGFVcmwpO1xuICAgICAgICB9IGNhdGNoIChfZXJyKSB7XG4gICAgICAgICAgICByZXR1cm4gZWxlbWVudDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghcGFyc2VkRGF0YVVyaSkge1xuICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQ7XG4gICAgICAgIH1cblxuICAgICAgICBlbGVtZW50LmNvbnRlbnQgPSBwYXJzZWREYXRhVXJpLmRhdGE7XG4gICAgICAgIGVsZW1lbnQuY29udGVudFR5cGUgPSBlbGVtZW50LmNvbnRlbnRUeXBlIHx8IHBhcnNlZERhdGFVcmkuY29udGVudFR5cGU7XG5cbiAgICAgICAgaWYgKCdwYXRoJyBpbiBlbGVtZW50KSB7XG4gICAgICAgICAgICBlbGVtZW50LnBhdGggPSBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICgnaHJlZicgaW4gZWxlbWVudCkge1xuICAgICAgICAgICAgZWxlbWVudC5ocmVmID0gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZWxlbWVudDtcbiAgICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gTWFpbENvbXBvc2VyO1xuIl0sIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6WzBdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(action-browser)/./node_modules/.pnpm/nodemailer@7.0.13/node_modules/nodemailer/lib/mail-composer/index.js\n");
|
||
|
||
/***/ }),
|
||
|
||
/***/ "(action-browser)/./node_modules/.pnpm/nodemailer@7.0.13/node_modules/nodemailer/lib/mailer/index.js":
|
||
/*!******************************************************************************************!*\
|
||
!*** ./node_modules/.pnpm/nodemailer@7.0.13/node_modules/nodemailer/lib/mailer/index.js ***!
|
||
\******************************************************************************************/
|
||
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
|
||
|
||
eval("\n\nconst EventEmitter = __webpack_require__(/*! events */ \"events\");\nconst shared = __webpack_require__(/*! ../shared */ \"(action-browser)/./node_modules/.pnpm/nodemailer@7.0.13/node_modules/nodemailer/lib/shared/index.js\");\nconst mimeTypes = __webpack_require__(/*! ../mime-funcs/mime-types */ \"(action-browser)/./node_modules/.pnpm/nodemailer@7.0.13/node_modules/nodemailer/lib/mime-funcs/mime-types.js\");\nconst MailComposer = __webpack_require__(/*! ../mail-composer */ \"(action-browser)/./node_modules/.pnpm/nodemailer@7.0.13/node_modules/nodemailer/lib/mail-composer/index.js\");\nconst DKIM = __webpack_require__(/*! ../dkim */ \"(action-browser)/./node_modules/.pnpm/nodemailer@7.0.13/node_modules/nodemailer/lib/dkim/index.js\");\nconst httpProxyClient = __webpack_require__(/*! ../smtp-connection/http-proxy-client */ \"(action-browser)/./node_modules/.pnpm/nodemailer@7.0.13/node_modules/nodemailer/lib/smtp-connection/http-proxy-client.js\");\nconst util = __webpack_require__(/*! util */ \"util\");\nconst urllib = __webpack_require__(/*! url */ \"url\");\nconst packageData = __webpack_require__(/*! ../../package.json */ \"(action-browser)/./node_modules/.pnpm/nodemailer@7.0.13/node_modules/nodemailer/package.json\");\nconst MailMessage = __webpack_require__(/*! ./mail-message */ \"(action-browser)/./node_modules/.pnpm/nodemailer@7.0.13/node_modules/nodemailer/lib/mailer/mail-message.js\");\nconst net = __webpack_require__(/*! net */ \"net\");\nconst dns = __webpack_require__(/*! dns */ \"dns\");\nconst crypto = __webpack_require__(/*! crypto */ \"crypto\");\n\n/**\n * Creates an object for exposing the Mail API\n *\n * @constructor\n * @param {Object} transporter Transport object instance to pass the mails to\n */\nclass Mail extends EventEmitter {\n constructor(transporter, options, defaults) {\n super();\n\n this.options = options || {};\n this._defaults = defaults || {};\n\n this._defaultPlugins = {\n compile: [(...args) => this._convertDataImages(...args)],\n stream: []\n };\n\n this._userPlugins = {\n compile: [],\n stream: []\n };\n\n this.meta = new Map();\n\n this.dkim = this.options.dkim ? new DKIM(this.options.dkim) : false;\n\n this.transporter = transporter;\n this.transporter.mailer = this;\n\n this.logger = shared.getLogger(this.options, {\n component: this.options.component || 'mail'\n });\n\n this.logger.debug(\n {\n tnx: 'create'\n },\n 'Creating transport: %s',\n this.getVersionString()\n );\n\n // setup emit handlers for the transporter\n if (typeof this.transporter.on === 'function') {\n // deprecated log interface\n this.transporter.on('log', log => {\n this.logger.debug(\n {\n tnx: 'transport'\n },\n '%s: %s',\n log.type,\n log.message\n );\n });\n\n // transporter errors\n this.transporter.on('error', err => {\n this.logger.error(\n {\n err,\n tnx: 'transport'\n },\n 'Transport Error: %s',\n err.message\n );\n this.emit('error', err);\n });\n\n // indicates if the sender has became idle\n this.transporter.on('idle', (...args) => {\n this.emit('idle', ...args);\n });\n\n // indicates if the sender has became idle and all connections are terminated\n this.transporter.on('clear', (...args) => {\n this.emit('clear', ...args);\n });\n }\n\n /**\n * Optional methods passed to the underlying transport object\n */\n ['close', 'isIdle', 'verify'].forEach(method => {\n this[method] = (...args) => {\n if (typeof this.transporter[method] === 'function') {\n if (method === 'verify' && typeof this.getSocket === 'function') {\n this.transporter.getSocket = this.getSocket;\n this.getSocket = false;\n }\n return this.transporter[method](...args);\n } else {\n this.logger.warn(\n {\n tnx: 'transport',\n methodName: method\n },\n 'Non existing method %s called for transport',\n method\n );\n return false;\n }\n };\n });\n\n // setup proxy handling\n if (this.options.proxy && typeof this.options.proxy === 'string') {\n this.setupProxy(this.options.proxy);\n }\n }\n\n use(step, plugin) {\n step = (step || '').toString();\n if (!this._userPlugins.hasOwnProperty(step)) {\n this._userPlugins[step] = [plugin];\n } else {\n this._userPlugins[step].push(plugin);\n }\n\n return this;\n }\n\n /**\n * Sends an email using the preselected transport object\n *\n * @param {Object} data E-data description\n * @param {Function?} callback Callback to run once the sending succeeded or failed\n */\n sendMail(data, callback = null) {\n let promise;\n\n if (!callback) {\n promise = new Promise((resolve, reject) => {\n callback = shared.callbackPromise(resolve, reject);\n });\n }\n\n if (typeof this.getSocket === 'function') {\n this.transporter.getSocket = this.getSocket;\n this.getSocket = false;\n }\n\n let mail = new MailMessage(this, data);\n\n this.logger.debug(\n {\n tnx: 'transport',\n name: this.transporter.name,\n version: this.transporter.version,\n action: 'send'\n },\n 'Sending mail using %s/%s',\n this.transporter.name,\n this.transporter.version\n );\n\n this._processPlugins('compile', mail, err => {\n if (err) {\n this.logger.error(\n {\n err,\n tnx: 'plugin',\n action: 'compile'\n },\n 'PluginCompile Error: %s',\n err.message\n );\n return callback(err);\n }\n\n mail.message = new MailComposer(mail.data).compile();\n\n mail.setMailerHeader();\n mail.setPriorityHeaders();\n mail.setListHeaders();\n\n this._processPlugins('stream', mail, err => {\n if (err) {\n this.logger.error(\n {\n err,\n tnx: 'plugin',\n action: 'stream'\n },\n 'PluginStream Error: %s',\n err.message\n );\n return callback(err);\n }\n\n if (mail.data.dkim || this.dkim) {\n mail.message.processFunc(input => {\n let dkim = mail.data.dkim ? new DKIM(mail.data.dkim) : this.dkim;\n this.logger.debug(\n {\n tnx: 'DKIM',\n messageId: mail.message.messageId(),\n dkimDomains: dkim.keys.map(key => key.keySelector + '.' + key.domainName).join(', ')\n },\n 'Signing outgoing message with %s keys',\n dkim.keys.length\n );\n return dkim.sign(input, mail.data._dkim);\n });\n }\n\n this.transporter.send(mail, (...args) => {\n if (args[0]) {\n this.logger.error(\n {\n err: args[0],\n tnx: 'transport',\n action: 'send'\n },\n 'Send Error: %s',\n args[0].message\n );\n }\n callback(...args);\n });\n });\n });\n\n return promise;\n }\n\n getVersionString() {\n return util.format(\n '%s (%s; +%s; %s/%s)',\n packageData.name,\n packageData.version,\n packageData.homepage,\n this.transporter.name,\n this.transporter.version\n );\n }\n\n _processPlugins(step, mail, callback) {\n step = (step || '').toString();\n\n if (!this._userPlugins.hasOwnProperty(step)) {\n return callback();\n }\n\n let userPlugins = this._userPlugins[step] || [];\n let defaultPlugins = this._defaultPlugins[step] || [];\n\n if (userPlugins.length) {\n this.logger.debug(\n {\n tnx: 'transaction',\n pluginCount: userPlugins.length,\n step\n },\n 'Using %s plugins for %s',\n userPlugins.length,\n step\n );\n }\n\n if (userPlugins.length + defaultPlugins.length === 0) {\n return callback();\n }\n\n let pos = 0;\n let block = 'default';\n let processPlugins = () => {\n let curplugins = block === 'default' ? defaultPlugins : userPlugins;\n if (pos >= curplugins.length) {\n if (block === 'default' && userPlugins.length) {\n block = 'user';\n pos = 0;\n curplugins = userPlugins;\n } else {\n return callback();\n }\n }\n let plugin = curplugins[pos++];\n plugin(mail, err => {\n if (err) {\n return callback(err);\n }\n processPlugins();\n });\n };\n\n processPlugins();\n }\n\n /**\n * Sets up proxy handler for a Nodemailer object\n *\n * @param {String} proxyUrl Proxy configuration url\n */\n setupProxy(proxyUrl) {\n let proxy = urllib.parse(proxyUrl);\n\n // setup socket handler for the mailer object\n this.getSocket = (options, callback) => {\n let protocol = proxy.protocol.replace(/:$/, '').toLowerCase();\n\n if (this.meta.has('proxy_handler_' + protocol)) {\n return this.meta.get('proxy_handler_' + protocol)(proxy, options, callback);\n }\n\n switch (protocol) {\n // Connect using a HTTP CONNECT method\n case 'http':\n case 'https':\n httpProxyClient(proxy.href, options.port, options.host, (err, socket) => {\n if (err) {\n return callback(err);\n }\n return callback(null, {\n connection: socket\n });\n });\n return;\n case 'socks':\n case 'socks5':\n case 'socks4':\n case 'socks4a': {\n if (!this.meta.has('proxy_socks_module')) {\n return callback(new Error('Socks module not loaded'));\n }\n let connect = ipaddress => {\n let proxyV2 = !!this.meta.get('proxy_socks_module').SocksClient;\n let socksClient = proxyV2 ? this.meta.get('proxy_socks_module').SocksClient : this.meta.get('proxy_socks_module');\n let proxyType = Number(proxy.protocol.replace(/\\D/g, '')) || 5;\n let connectionOpts = {\n proxy: {\n ipaddress,\n port: Number(proxy.port),\n type: proxyType\n },\n [proxyV2 ? 'destination' : 'target']: {\n host: options.host,\n port: options.port\n },\n command: 'connect'\n };\n\n if (proxy.auth) {\n let username = decodeURIComponent(proxy.auth.split(':').shift());\n let password = decodeURIComponent(proxy.auth.split(':').pop());\n if (proxyV2) {\n connectionOpts.proxy.userId = username;\n connectionOpts.proxy.password = password;\n } else if (proxyType === 4) {\n connectionOpts.userid = username;\n } else {\n connectionOpts.authentication = {\n username,\n password\n };\n }\n }\n\n socksClient.createConnection(connectionOpts, (err, info) => {\n if (err) {\n return callback(err);\n }\n return callback(null, {\n connection: info.socket || info\n });\n });\n };\n\n if (net.isIP(proxy.hostname)) {\n return connect(proxy.hostname);\n }\n\n return dns.resolve(proxy.hostname, (err, address) => {\n if (err) {\n return callback(err);\n }\n connect(Array.isArray(address) ? address[0] : address);\n });\n }\n }\n callback(new Error('Unknown proxy configuration'));\n };\n }\n\n _convertDataImages(mail, callback) {\n if ((!this.options.attachDataUrls && !mail.data.attachDataUrls) || !mail.data.html) {\n return callback();\n }\n mail.resolveContent(mail.data, 'html', (err, html) => {\n if (err) {\n return callback(err);\n }\n let cidCounter = 0;\n html = (html || '')\n .toString()\n .replace(/(<img\\b[^<>]{0,1024} src\\s{0,20}=[\\s\"']{0,20})(data:([^;]+);[^\"'>\\s]+)/gi, (match, prefix, dataUri, mimeType) => {\n let cid = crypto.randomBytes(10).toString('hex') + '@localhost';\n if (!mail.data.attachments) {\n mail.data.attachments = [];\n }\n if (!Array.isArray(mail.data.attachments)) {\n mail.data.attachments = [].concat(mail.data.attachments || []);\n }\n mail.data.attachments.push({\n path: dataUri,\n cid,\n filename: 'image-' + ++cidCounter + '.' + mimeTypes.detectExtension(mimeType)\n });\n return prefix + 'cid:' + cid;\n });\n mail.data.html = html;\n callback();\n });\n }\n\n set(key, value) {\n return this.meta.set(key, value);\n }\n\n get(key) {\n return this.meta.get(key);\n }\n}\n\nmodule.exports = Mail;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFjdGlvbi1icm93c2VyKS8uL25vZGVfbW9kdWxlcy8ucG5wbS9ub2RlbWFpbGVyQDcuMC4xMy9ub2RlX21vZHVsZXMvbm9kZW1haWxlci9saWIvbWFpbGVyL2luZGV4LmpzIiwibWFwcGluZ3MiOiJBQUFhOztBQUViLHFCQUFxQixtQkFBTyxDQUFDLHNCQUFRO0FBQ3JDLGVBQWUsbUJBQU8sQ0FBQyxzSEFBVztBQUNsQyxrQkFBa0IsbUJBQU8sQ0FBQyw4SUFBMEI7QUFDcEQscUJBQXFCLG1CQUFPLENBQUMsb0lBQWtCO0FBQy9DLGFBQWEsbUJBQU8sQ0FBQyxrSEFBUztBQUM5Qix3QkFBd0IsbUJBQU8sQ0FBQyxzS0FBc0M7QUFDdEUsYUFBYSxtQkFBTyxDQUFDLGtCQUFNO0FBQzNCLGVBQWUsbUJBQU8sQ0FBQyxnQkFBSztBQUM1QixvQkFBb0IsbUJBQU8sQ0FBQyx3SEFBb0I7QUFDaEQsb0JBQW9CLG1CQUFPLENBQUMsa0lBQWdCO0FBQzVDLFlBQVksbUJBQU8sQ0FBQyxnQkFBSztBQUN6QixZQUFZLG1CQUFPLENBQUMsZ0JBQUs7QUFDekIsZUFBZSxtQkFBTyxDQUFDLHNCQUFROztBQUUvQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsUUFBUTtBQUNuQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7O0FBRWI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTs7QUFFYjtBQUNBO0FBQ0E7QUFDQSxhQUFhOztBQUViO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUJBQXlCO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsZUFBZSxRQUFRO0FBQ3ZCLGVBQWUsV0FBVztBQUMxQjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlCQUF5QjtBQUN6QjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2QkFBNkI7QUFDN0I7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2QkFBNkI7QUFDN0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQixhQUFhO0FBQ2IsU0FBUzs7QUFFVDtBQUNBOztBQUVBO0FBQ0E7QUFDQSxxQkFBcUIsS0FBSztBQUMxQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0I7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsZUFBZSxRQUFRO0FBQ3ZCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUJBQXlCO0FBQ3pCLHFCQUFxQjtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkJBQTZCO0FBQzdCO0FBQ0E7QUFDQTtBQUNBLDZCQUE2QjtBQUM3QjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhCQUE4QjtBQUM5QjtBQUNBLDhCQUE4QjtBQUM5QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkJBQTZCO0FBQzdCLHlCQUF5QjtBQUN6Qjs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1Q0FBdUMsUUFBUSxNQUFNLEtBQUssUUFBUSxLQUFLLFdBQVcsSUFBSTtBQUN0RjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBIiwic291cmNlcyI6WyIvVXNlcnMvbWFyY21pbnRlbC9Qcm9qZWN0cy9lLXRpYi5jb20vbm9kZV9tb2R1bGVzLy5wbnBtL25vZGVtYWlsZXJANy4wLjEzL25vZGVfbW9kdWxlcy9ub2RlbWFpbGVyL2xpYi9tYWlsZXIvaW5kZXguanMiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCBFdmVudEVtaXR0ZXIgPSByZXF1aXJlKCdldmVudHMnKTtcbmNvbnN0IHNoYXJlZCA9IHJlcXVpcmUoJy4uL3NoYXJlZCcpO1xuY29uc3QgbWltZVR5cGVzID0gcmVxdWlyZSgnLi4vbWltZS1mdW5jcy9taW1lLXR5cGVzJyk7XG5jb25zdCBNYWlsQ29tcG9zZXIgPSByZXF1aXJlKCcuLi9tYWlsLWNvbXBvc2VyJyk7XG5jb25zdCBES0lNID0gcmVxdWlyZSgnLi4vZGtpbScpO1xuY29uc3QgaHR0cFByb3h5Q2xpZW50ID0gcmVxdWlyZSgnLi4vc210cC1jb25uZWN0aW9uL2h0dHAtcHJveHktY2xpZW50Jyk7XG5jb25zdCB1dGlsID0gcmVxdWlyZSgndXRpbCcpO1xuY29uc3QgdXJsbGliID0gcmVxdWlyZSgndXJsJyk7XG5jb25zdCBwYWNrYWdlRGF0YSA9IHJlcXVpcmUoJy4uLy4uL3BhY2thZ2UuanNvbicpO1xuY29uc3QgTWFpbE1lc3NhZ2UgPSByZXF1aXJlKCcuL21haWwtbWVzc2FnZScpO1xuY29uc3QgbmV0ID0gcmVxdWlyZSgnbmV0Jyk7XG5jb25zdCBkbnMgPSByZXF1aXJlKCdkbnMnKTtcbmNvbnN0IGNyeXB0byA9IHJlcXVpcmUoJ2NyeXB0bycpO1xuXG4vKipcbiAqIENyZWF0ZXMgYW4gb2JqZWN0IGZvciBleHBvc2luZyB0aGUgTWFpbCBBUElcbiAqXG4gKiBAY29uc3RydWN0b3JcbiAqIEBwYXJhbSB7T2JqZWN0fSB0cmFuc3BvcnRlciBUcmFuc3BvcnQgb2JqZWN0IGluc3RhbmNlIHRvIHBhc3MgdGhlIG1haWxzIHRvXG4gKi9cbmNsYXNzIE1haWwgZXh0ZW5kcyBFdmVudEVtaXR0ZXIge1xuICAgIGNvbnN0cnVjdG9yKHRyYW5zcG9ydGVyLCBvcHRpb25zLCBkZWZhdWx0cykge1xuICAgICAgICBzdXBlcigpO1xuXG4gICAgICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gICAgICAgIHRoaXMuX2RlZmF1bHRzID0gZGVmYXVsdHMgfHwge307XG5cbiAgICAgICAgdGhpcy5fZGVmYXVsdFBsdWdpbnMgPSB7XG4gICAgICAgICAgICBjb21waWxlOiBbKC4uLmFyZ3MpID0+IHRoaXMuX2NvbnZlcnREYXRhSW1hZ2VzKC4uLmFyZ3MpXSxcbiAgICAgICAgICAgIHN0cmVhbTogW11cbiAgICAgICAgfTtcblxuICAgICAgICB0aGlzLl91c2VyUGx1Z2lucyA9IHtcbiAgICAgICAgICAgIGNvbXBpbGU6IFtdLFxuICAgICAgICAgICAgc3RyZWFtOiBbXVxuICAgICAgICB9O1xuXG4gICAgICAgIHRoaXMubWV0YSA9IG5ldyBNYXAoKTtcblxuICAgICAgICB0aGlzLmRraW0gPSB0aGlzLm9wdGlvbnMuZGtpbSA/IG5ldyBES0lNKHRoaXMub3B0aW9ucy5ka2ltKSA6IGZhbHNlO1xuXG4gICAgICAgIHRoaXMudHJhbnNwb3J0ZXIgPSB0cmFuc3BvcnRlcjtcbiAgICAgICAgdGhpcy50cmFuc3BvcnRlci5tYWlsZXIgPSB0aGlzO1xuXG4gICAgICAgIHRoaXMubG9nZ2VyID0gc2hhcmVkLmdldExvZ2dlcih0aGlzLm9wdGlvbnMsIHtcbiAgICAgICAgICAgIGNvbXBvbmVudDogdGhpcy5vcHRpb25zLmNvbXBvbmVudCB8fCAnbWFpbCdcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdG54OiAnY3JlYXRlJ1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICdDcmVhdGluZyB0cmFuc3BvcnQ6ICVzJyxcbiAgICAgICAgICAgIHRoaXMuZ2V0VmVyc2lvblN0cmluZygpXG4gICAgICAgICk7XG5cbiAgICAgICAgLy8gc2V0dXAgZW1pdCBoYW5kbGVycyBmb3IgdGhlIHRyYW5zcG9ydGVyXG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy50cmFuc3BvcnRlci5vbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgLy8gZGVwcmVjYXRlZCBsb2cgaW50ZXJmYWNlXG4gICAgICAgICAgICB0aGlzLnRyYW5zcG9ydGVyLm9uKCdsb2cnLCBsb2cgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKFxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0bng6ICd0cmFuc3BvcnQnXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICclczogJXMnLFxuICAgICAgICAgICAgICAgICAgICBsb2cudHlwZSxcbiAgICAgICAgICAgICAgICAgICAgbG9nLm1lc3NhZ2VcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIC8vIHRyYW5zcG9ydGVyIGVycm9yc1xuICAgICAgICAgICAgdGhpcy50cmFuc3BvcnRlci5vbignZXJyb3InLCBlcnIgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKFxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlcnIsXG4gICAgICAgICAgICAgICAgICAgICAgICB0bng6ICd0cmFuc3BvcnQnXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICdUcmFuc3BvcnQgRXJyb3I6ICVzJyxcbiAgICAgICAgICAgICAgICAgICAgZXJyLm1lc3NhZ2VcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIHRoaXMuZW1pdCgnZXJyb3InLCBlcnIpO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIC8vIGluZGljYXRlcyBpZiB0aGUgc2VuZGVyIGhhcyBiZWNhbWUgaWRsZVxuICAgICAgICAgICAgdGhpcy50cmFuc3BvcnRlci5vbignaWRsZScsICguLi5hcmdzKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5lbWl0KCdpZGxlJywgLi4uYXJncyk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgLy8gaW5kaWNhdGVzIGlmIHRoZSBzZW5kZXIgaGFzIGJlY2FtZSBpZGxlIGFuZCBhbGwgY29ubmVjdGlvbnMgYXJlIHRlcm1pbmF0ZWRcbiAgICAgICAgICAgIHRoaXMudHJhbnNwb3J0ZXIub24oJ2NsZWFyJywgKC4uLmFyZ3MpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmVtaXQoJ2NsZWFyJywgLi4uYXJncyk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBPcHRpb25hbCBtZXRob2RzIHBhc3NlZCB0byB0aGUgdW5kZXJseWluZyB0cmFuc3BvcnQgb2JqZWN0XG4gICAgICAgICAqL1xuICAgICAgICBbJ2Nsb3NlJywgJ2lzSWRsZScsICd2ZXJpZnknXS5mb3JFYWNoKG1ldGhvZCA9PiB7XG4gICAgICAgICAgICB0aGlzW21ldGhvZF0gPSAoLi4uYXJncykgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdGhpcy50cmFuc3BvcnRlclttZXRob2RdID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChtZXRob2QgPT09ICd2ZXJpZnknICYmIHR5cGVvZiB0aGlzLmdldFNvY2tldCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50cmFuc3BvcnRlci5nZXRTb2NrZXQgPSB0aGlzLmdldFNvY2tldDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZ2V0U29ja2V0ID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNwb3J0ZXJbbWV0aG9kXSguLi5hcmdzKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci53YXJuKFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRueDogJ3RyYW5zcG9ydCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kTmFtZTogbWV0aG9kXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgJ05vbiBleGlzdGluZyBtZXRob2QgJXMgY2FsbGVkIGZvciB0cmFuc3BvcnQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICB9KTtcblxuICAgICAgICAvLyBzZXR1cCBwcm94eSBoYW5kbGluZ1xuICAgICAgICBpZiAodGhpcy5vcHRpb25zLnByb3h5ICYmIHR5cGVvZiB0aGlzLm9wdGlvbnMucHJveHkgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICB0aGlzLnNldHVwUHJveHkodGhpcy5vcHRpb25zLnByb3h5KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHVzZShzdGVwLCBwbHVnaW4pIHtcbiAgICAgICAgc3RlcCA9IChzdGVwIHx8ICcnKS50b1N0cmluZygpO1xuICAgICAgICBpZiAoIXRoaXMuX3VzZXJQbHVnaW5zLmhhc093blByb3BlcnR5KHN0ZXApKSB7XG4gICAgICAgICAgICB0aGlzLl91c2VyUGx1Z2luc1tzdGVwXSA9IFtwbHVnaW5dO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fdXNlclBsdWdpbnNbc3RlcF0ucHVzaChwbHVnaW4pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2VuZHMgYW4gZW1haWwgdXNpbmcgdGhlIHByZXNlbGVjdGVkIHRyYW5zcG9ydCBvYmplY3RcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBkYXRhIEUtZGF0YSBkZXNjcmlwdGlvblxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb24/fSBjYWxsYmFjayBDYWxsYmFjayB0byBydW4gb25jZSB0aGUgc2VuZGluZyBzdWNjZWVkZWQgb3IgZmFpbGVkXG4gICAgICovXG4gICAgc2VuZE1haWwoZGF0YSwgY2FsbGJhY2sgPSBudWxsKSB7XG4gICAgICAgIGxldCBwcm9taXNlO1xuXG4gICAgICAgIGlmICghY2FsbGJhY2spIHtcbiAgICAgICAgICAgIHByb21pc2UgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICAgICAgY2FsbGJhY2sgPSBzaGFyZWQuY2FsbGJhY2tQcm9taXNlKHJlc29sdmUsIHJlamVjdCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5nZXRTb2NrZXQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHRoaXMudHJhbnNwb3J0ZXIuZ2V0U29ja2V0ID0gdGhpcy5nZXRTb2NrZXQ7XG4gICAgICAgICAgICB0aGlzLmdldFNvY2tldCA9IGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IG1haWwgPSBuZXcgTWFpbE1lc3NhZ2UodGhpcywgZGF0YSk7XG5cbiAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdG54OiAndHJhbnNwb3J0JyxcbiAgICAgICAgICAgICAgICBuYW1lOiB0aGlzLnRyYW5zcG9ydGVyLm5hbWUsXG4gICAgICAgICAgICAgICAgdmVyc2lvbjogdGhpcy50cmFuc3BvcnRlci52ZXJzaW9uLFxuICAgICAgICAgICAgICAgIGFjdGlvbjogJ3NlbmQnXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJ1NlbmRpbmcgbWFpbCB1c2luZyAlcy8lcycsXG4gICAgICAgICAgICB0aGlzLnRyYW5zcG9ydGVyLm5hbWUsXG4gICAgICAgICAgICB0aGlzLnRyYW5zcG9ydGVyLnZlcnNpb25cbiAgICAgICAgKTtcblxuICAgICAgICB0aGlzLl9wcm9jZXNzUGx1Z2lucygnY29tcGlsZScsIG1haWwsIGVyciA9PiB7XG4gICAgICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVycixcbiAgICAgICAgICAgICAgICAgICAgICAgIHRueDogJ3BsdWdpbicsXG4gICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb246ICdjb21waWxlJ1xuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAnUGx1Z2luQ29tcGlsZSBFcnJvcjogJXMnLFxuICAgICAgICAgICAgICAgICAgICBlcnIubWVzc2FnZVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKGVycik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIG1haWwubWVzc2FnZSA9IG5ldyBNYWlsQ29tcG9zZXIobWFpbC5kYXRhKS5jb21waWxlKCk7XG5cbiAgICAgICAgICAgIG1haWwuc2V0TWFpbGVySGVhZGVyKCk7XG4gICAgICAgICAgICBtYWlsLnNldFByaW9yaXR5SGVhZGVycygpO1xuICAgICAgICAgICAgbWFpbC5zZXRMaXN0SGVhZGVycygpO1xuXG4gICAgICAgICAgICB0aGlzLl9wcm9jZXNzUGx1Z2lucygnc3RyZWFtJywgbWFpbCwgZXJyID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bng6ICdwbHVnaW4nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbjogJ3N0cmVhbSdcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAnUGx1Z2luU3RyZWFtIEVycm9yOiAlcycsXG4gICAgICAgICAgICAgICAgICAgICAgICBlcnIubWVzc2FnZVxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2FsbGJhY2soZXJyKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAobWFpbC5kYXRhLmRraW0gfHwgdGhpcy5ka2ltKSB7XG4gICAgICAgICAgICAgICAgICAgIG1haWwubWVzc2FnZS5wcm9jZXNzRnVuYyhpbnB1dCA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgZGtpbSA9IG1haWwuZGF0YS5ka2ltID8gbmV3IERLSU0obWFpbC5kYXRhLmRraW0pIDogdGhpcy5ka2ltO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bng6ICdES0lNJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZUlkOiBtYWlsLm1lc3NhZ2UubWVzc2FnZUlkKCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRraW1Eb21haW5zOiBka2ltLmtleXMubWFwKGtleSA9PiBrZXkua2V5U2VsZWN0b3IgKyAnLicgKyBrZXkuZG9tYWluTmFtZSkuam9pbignLCAnKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1NpZ25pbmcgb3V0Z29pbmcgbWVzc2FnZSB3aXRoICVzIGtleXMnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRraW0ua2V5cy5sZW5ndGhcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGtpbS5zaWduKGlucHV0LCBtYWlsLmRhdGEuX2RraW0pO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB0aGlzLnRyYW5zcG9ydGVyLnNlbmQobWFpbCwgKC4uLmFyZ3MpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGFyZ3NbMF0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyOiBhcmdzWzBdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bng6ICd0cmFuc3BvcnQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb246ICdzZW5kJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1NlbmQgRXJyb3I6ICVzJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzWzBdLm1lc3NhZ2VcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soLi4uYXJncyk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIHByb21pc2U7XG4gICAgfVxuXG4gICAgZ2V0VmVyc2lvblN0cmluZygpIHtcbiAgICAgICAgcmV0dXJuIHV0aWwuZm9ybWF0KFxuICAgICAgICAgICAgJyVzICglczsgKyVzOyAlcy8lcyknLFxuICAgICAgICAgICAgcGFja2FnZURhdGEubmFtZSxcbiAgICAgICAgICAgIHBhY2thZ2VEYXRhLnZlcnNpb24sXG4gICAgICAgICAgICBwYWNrYWdlRGF0YS5ob21lcGFnZSxcbiAgICAgICAgICAgIHRoaXMudHJhbnNwb3J0ZXIubmFtZSxcbiAgICAgICAgICAgIHRoaXMudHJhbnNwb3J0ZXIudmVyc2lvblxuICAgICAgICApO1xuICAgIH1cblxuICAgIF9wcm9jZXNzUGx1Z2lucyhzdGVwLCBtYWlsLCBjYWxsYmFjaykge1xuICAgICAgICBzdGVwID0gKHN0ZXAgfHwgJycpLnRvU3RyaW5nKCk7XG5cbiAgICAgICAgaWYgKCF0aGlzLl91c2VyUGx1Z2lucy5oYXNPd25Qcm9wZXJ0eShzdGVwKSkge1xuICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgdXNlclBsdWdpbnMgPSB0aGlzLl91c2VyUGx1Z2luc1tzdGVwXSB8fCBbXTtcbiAgICAgICAgbGV0IGRlZmF1bHRQbHVnaW5zID0gdGhpcy5fZGVmYXVsdFBsdWdpbnNbc3RlcF0gfHwgW107XG5cbiAgICAgICAgaWYgKHVzZXJQbHVnaW5zLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICB0bng6ICd0cmFuc2FjdGlvbicsXG4gICAgICAgICAgICAgICAgICAgIHBsdWdpbkNvdW50OiB1c2VyUGx1Z2lucy5sZW5ndGgsXG4gICAgICAgICAgICAgICAgICAgIHN0ZXBcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICdVc2luZyAlcyBwbHVnaW5zIGZvciAlcycsXG4gICAgICAgICAgICAgICAgdXNlclBsdWdpbnMubGVuZ3RoLFxuICAgICAgICAgICAgICAgIHN0ZXBcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodXNlclBsdWdpbnMubGVuZ3RoICsgZGVmYXVsdFBsdWdpbnMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gY2FsbGJhY2soKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBwb3MgPSAwO1xuICAgICAgICBsZXQgYmxvY2sgPSAnZGVmYXVsdCc7XG4gICAgICAgIGxldCBwcm9jZXNzUGx1Z2lucyA9ICgpID0+IHtcbiAgICAgICAgICAgIGxldCBjdXJwbHVnaW5zID0gYmxvY2sgPT09ICdkZWZhdWx0JyA/IGRlZmF1bHRQbHVnaW5zIDogdXNlclBsdWdpbnM7XG4gICAgICAgICAgICBpZiAocG9zID49IGN1cnBsdWdpbnMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgaWYgKGJsb2NrID09PSAnZGVmYXVsdCcgJiYgdXNlclBsdWdpbnMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIGJsb2NrID0gJ3VzZXInO1xuICAgICAgICAgICAgICAgICAgICBwb3MgPSAwO1xuICAgICAgICAgICAgICAgICAgICBjdXJwbHVnaW5zID0gdXNlclBsdWdpbnM7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IHBsdWdpbiA9IGN1cnBsdWdpbnNbcG9zKytdO1xuICAgICAgICAgICAgcGx1Z2luKG1haWwsIGVyciA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2FsbGJhY2soZXJyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcHJvY2Vzc1BsdWdpbnMoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9O1xuXG4gICAgICAgIHByb2Nlc3NQbHVnaW5zKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB1cCBwcm94eSBoYW5kbGVyIGZvciBhIE5vZGVtYWlsZXIgb2JqZWN0XG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gcHJveHlVcmwgUHJveHkgY29uZmlndXJhdGlvbiB1cmxcbiAgICAgKi9cbiAgICBzZXR1cFByb3h5KHByb3h5VXJsKSB7XG4gICAgICAgIGxldCBwcm94eSA9IHVybGxpYi5wYXJzZShwcm94eVVybCk7XG5cbiAgICAgICAgLy8gc2V0dXAgc29ja2V0IGhhbmRsZXIgZm9yIHRoZSBtYWlsZXIgb2JqZWN0XG4gICAgICAgIHRoaXMuZ2V0U29ja2V0ID0gKG9wdGlvbnMsIGNhbGxiYWNrKSA9PiB7XG4gICAgICAgICAgICBsZXQgcHJvdG9jb2wgPSBwcm94eS5wcm90b2NvbC5yZXBsYWNlKC86JC8sICcnKS50b0xvd2VyQ2FzZSgpO1xuXG4gICAgICAgICAgICBpZiAodGhpcy5tZXRhLmhhcygncHJveHlfaGFuZGxlcl8nICsgcHJvdG9jb2wpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubWV0YS5nZXQoJ3Byb3h5X2hhbmRsZXJfJyArIHByb3RvY29sKShwcm94eSwgb3B0aW9ucywgY2FsbGJhY2spO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBzd2l0Y2ggKHByb3RvY29sKSB7XG4gICAgICAgICAgICAgICAgLy8gQ29ubmVjdCB1c2luZyBhIEhUVFAgQ09OTkVDVCBtZXRob2RcbiAgICAgICAgICAgICAgICBjYXNlICdodHRwJzpcbiAgICAgICAgICAgICAgICBjYXNlICdodHRwcyc6XG4gICAgICAgICAgICAgICAgICAgIGh0dHBQcm94eUNsaWVudChwcm94eS5ocmVmLCBvcHRpb25zLnBvcnQsIG9wdGlvbnMuaG9zdCwgKGVyciwgc29ja2V0KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKGVycik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2FsbGJhY2sobnVsbCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb246IHNvY2tldFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgY2FzZSAnc29ja3MnOlxuICAgICAgICAgICAgICAgIGNhc2UgJ3NvY2tzNSc6XG4gICAgICAgICAgICAgICAgY2FzZSAnc29ja3M0JzpcbiAgICAgICAgICAgICAgICBjYXNlICdzb2NrczRhJzoge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMubWV0YS5oYXMoJ3Byb3h5X3NvY2tzX21vZHVsZScpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2FsbGJhY2sobmV3IEVycm9yKCdTb2NrcyBtb2R1bGUgbm90IGxvYWRlZCcpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBsZXQgY29ubmVjdCA9IGlwYWRkcmVzcyA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgcHJveHlWMiA9ICEhdGhpcy5tZXRhLmdldCgncHJveHlfc29ja3NfbW9kdWxlJykuU29ja3NDbGllbnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgc29ja3NDbGllbnQgPSBwcm94eVYyID8gdGhpcy5tZXRhLmdldCgncHJveHlfc29ja3NfbW9kdWxlJykuU29ja3NDbGllbnQgOiB0aGlzLm1ldGEuZ2V0KCdwcm94eV9zb2Nrc19tb2R1bGUnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBwcm94eVR5cGUgPSBOdW1iZXIocHJveHkucHJvdG9jb2wucmVwbGFjZSgvXFxEL2csICcnKSkgfHwgNTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjb25uZWN0aW9uT3B0cyA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm94eToge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcGFkZHJlc3MsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcnQ6IE51bWJlcihwcm94eS5wb3J0KSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogcHJveHlUeXBlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcHJveHlWMiA/ICdkZXN0aW5hdGlvbicgOiAndGFyZ2V0J106IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaG9zdDogb3B0aW9ucy5ob3N0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3J0OiBvcHRpb25zLnBvcnRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQ6ICdjb25uZWN0J1xuICAgICAgICAgICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByb3h5LmF1dGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgdXNlcm5hbWUgPSBkZWNvZGVVUklDb21wb25lbnQocHJveHkuYXV0aC5zcGxpdCgnOicpLnNoaWZ0KCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBwYXNzd29yZCA9IGRlY29kZVVSSUNvbXBvbmVudChwcm94eS5hdXRoLnNwbGl0KCc6JykucG9wKCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcm94eVYyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb25PcHRzLnByb3h5LnVzZXJJZCA9IHVzZXJuYW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uT3B0cy5wcm94eS5wYXNzd29yZCA9IHBhc3N3b3JkO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocHJveHlUeXBlID09PSA0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb25PcHRzLnVzZXJpZCA9IHVzZXJuYW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb25PcHRzLmF1dGhlbnRpY2F0aW9uID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlcm5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzd29yZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgc29ja3NDbGllbnQuY3JlYXRlQ29ubmVjdGlvbihjb25uZWN0aW9uT3B0cywgKGVyciwgaW5mbykgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKGVycik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjYWxsYmFjayhudWxsLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb246IGluZm8uc29ja2V0IHx8IGluZm9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChuZXQuaXNJUChwcm94eS5ob3N0bmFtZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb25uZWN0KHByb3h5Lmhvc3RuYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBkbnMucmVzb2x2ZShwcm94eS5ob3N0bmFtZSwgKGVyciwgYWRkcmVzcykgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjYWxsYmFjayhlcnIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdChBcnJheS5pc0FycmF5KGFkZHJlc3MpID8gYWRkcmVzc1swXSA6IGFkZHJlc3MpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYWxsYmFjayhuZXcgRXJyb3IoJ1Vua25vd24gcHJveHkgY29uZmlndXJhdGlvbicpKTtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBfY29udmVydERhdGFJbWFnZXMobWFpbCwgY2FsbGJhY2spIHtcbiAgICAgICAgaWYgKCghdGhpcy5vcHRpb25zLmF0dGFjaERhdGFVcmxzICYmICFtYWlsLmRhdGEuYXR0YWNoRGF0YVVybHMpIHx8ICFtYWlsLmRhdGEuaHRtbCkge1xuICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKCk7XG4gICAgICAgIH1cbiAgICAgICAgbWFpbC5yZXNvbHZlQ29udGVudChtYWlsLmRhdGEsICdodG1sJywgKGVyciwgaHRtbCkgPT4ge1xuICAgICAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgICAgICAgIHJldHVybiBjYWxsYmFjayhlcnIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IGNpZENvdW50ZXIgPSAwO1xuICAgICAgICAgICAgaHRtbCA9IChodG1sIHx8ICcnKVxuICAgICAgICAgICAgICAgIC50b1N0cmluZygpXG4gICAgICAgICAgICAgICAgLnJlcGxhY2UoLyg8aW1nXFxiW148Pl17MCwxMDI0fSBzcmNcXHN7MCwyMH09W1xcc1wiJ117MCwyMH0pKGRhdGE6KFteO10rKTtbXlwiJz5cXHNdKykvZ2ksIChtYXRjaCwgcHJlZml4LCBkYXRhVXJpLCBtaW1lVHlwZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBsZXQgY2lkID0gY3J5cHRvLnJhbmRvbUJ5dGVzKDEwKS50b1N0cmluZygnaGV4JykgKyAnQGxvY2FsaG9zdCc7XG4gICAgICAgICAgICAgICAgICAgIGlmICghbWFpbC5kYXRhLmF0dGFjaG1lbnRzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtYWlsLmRhdGEuYXR0YWNobWVudHMgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkobWFpbC5kYXRhLmF0dGFjaG1lbnRzKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbWFpbC5kYXRhLmF0dGFjaG1lbnRzID0gW10uY29uY2F0KG1haWwuZGF0YS5hdHRhY2htZW50cyB8fCBbXSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbWFpbC5kYXRhLmF0dGFjaG1lbnRzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgcGF0aDogZGF0YVVyaSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNpZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lOiAnaW1hZ2UtJyArICsrY2lkQ291bnRlciArICcuJyArIG1pbWVUeXBlcy5kZXRlY3RFeHRlbnNpb24obWltZVR5cGUpXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcHJlZml4ICsgJ2NpZDonICsgY2lkO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgbWFpbC5kYXRhLmh0bWwgPSBodG1sO1xuICAgICAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgc2V0KGtleSwgdmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWV0YS5zZXQoa2V5LCB2YWx1ZSk7XG4gICAgfVxuXG4gICAgZ2V0KGtleSkge1xuICAgICAgICByZXR1cm4gdGhpcy5tZXRhLmdldChrZXkpO1xuICAgIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBNYWlsO1xuIl0sIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6WzBdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(action-browser)/./node_modules/.pnpm/nodemailer@7.0.13/node_modules/nodemailer/lib/mailer/index.js\n");
|
||
|
||
/***/ }),
|
||
|
||
/***/ "(action-browser)/./node_modules/.pnpm/nodemailer@7.0.13/node_modules/nodemailer/lib/mailer/mail-message.js":
|
||
/*!*************************************************************************************************!*\
|
||
!*** ./node_modules/.pnpm/nodemailer@7.0.13/node_modules/nodemailer/lib/mailer/mail-message.js ***!
|
||
\*************************************************************************************************/
|
||
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
|
||
|
||
eval("\n\nconst shared = __webpack_require__(/*! ../shared */ \"(action-browser)/./node_modules/.pnpm/nodemailer@7.0.13/node_modules/nodemailer/lib/shared/index.js\");\nconst MimeNode = __webpack_require__(/*! ../mime-node */ \"(action-browser)/./node_modules/.pnpm/nodemailer@7.0.13/node_modules/nodemailer/lib/mime-node/index.js\");\nconst mimeFuncs = __webpack_require__(/*! ../mime-funcs */ \"(action-browser)/./node_modules/.pnpm/nodemailer@7.0.13/node_modules/nodemailer/lib/mime-funcs/index.js\");\n\nclass MailMessage {\n constructor(mailer, data) {\n this.mailer = mailer;\n this.data = {};\n this.message = null;\n\n data = data || {};\n let options = mailer.options || {};\n let defaults = mailer._defaults || {};\n\n Object.keys(data).forEach(key => {\n this.data[key] = data[key];\n });\n\n this.data.headers = this.data.headers || {};\n\n // apply defaults\n Object.keys(defaults).forEach(key => {\n if (!(key in this.data)) {\n this.data[key] = defaults[key];\n } else if (key === 'headers') {\n // headers is a special case. Allow setting individual default headers\n Object.keys(defaults.headers).forEach(key => {\n if (!(key in this.data.headers)) {\n this.data.headers[key] = defaults.headers[key];\n }\n });\n }\n });\n\n // force specific keys from transporter options\n ['disableFileAccess', 'disableUrlAccess', 'normalizeHeaderKey'].forEach(key => {\n if (key in options) {\n this.data[key] = options[key];\n }\n });\n }\n\n resolveContent(...args) {\n return shared.resolveContent(...args);\n }\n\n resolveAll(callback) {\n let keys = [\n [this.data, 'html'],\n [this.data, 'text'],\n [this.data, 'watchHtml'],\n [this.data, 'amp'],\n [this.data, 'icalEvent']\n ];\n\n if (this.data.alternatives && this.data.alternatives.length) {\n this.data.alternatives.forEach((alternative, i) => {\n keys.push([this.data.alternatives, i]);\n });\n }\n\n if (this.data.attachments && this.data.attachments.length) {\n this.data.attachments.forEach((attachment, i) => {\n if (!attachment.filename) {\n attachment.filename =\n (attachment.path || attachment.href || '').split('/').pop().split('?').shift() || 'attachment-' + (i + 1);\n if (attachment.filename.indexOf('.') < 0) {\n attachment.filename += '.' + mimeFuncs.detectExtension(attachment.contentType);\n }\n }\n\n if (!attachment.contentType) {\n attachment.contentType = mimeFuncs.detectMimeType(attachment.filename || attachment.path || attachment.href || 'bin');\n }\n\n keys.push([this.data.attachments, i]);\n });\n }\n\n let mimeNode = new MimeNode();\n\n let addressKeys = ['from', 'to', 'cc', 'bcc', 'sender', 'replyTo'];\n\n addressKeys.forEach(address => {\n let value;\n if (this.message) {\n value = [].concat(mimeNode._parseAddresses(this.message.getHeader(address === 'replyTo' ? 'reply-to' : address)) || []);\n } else if (this.data[address]) {\n value = [].concat(mimeNode._parseAddresses(this.data[address]) || []);\n }\n if (value && value.length) {\n this.data[address] = value;\n } else if (address in this.data) {\n this.data[address] = null;\n }\n });\n\n let singleKeys = ['from', 'sender'];\n singleKeys.forEach(address => {\n if (this.data[address]) {\n this.data[address] = this.data[address].shift();\n }\n });\n\n let pos = 0;\n let resolveNext = () => {\n if (pos >= keys.length) {\n return callback(null, this.data);\n }\n let args = keys[pos++];\n if (!args[0] || !args[0][args[1]]) {\n return resolveNext();\n }\n shared.resolveContent(...args, (err, value) => {\n if (err) {\n return callback(err);\n }\n\n let node = {\n content: value\n };\n if (args[0][args[1]] && typeof args[0][args[1]] === 'object' && !Buffer.isBuffer(args[0][args[1]])) {\n Object.keys(args[0][args[1]]).forEach(key => {\n if (!(key in node) && !['content', 'path', 'href', 'raw'].includes(key)) {\n node[key] = args[0][args[1]][key];\n }\n });\n }\n\n args[0][args[1]] = node;\n resolveNext();\n });\n };\n\n setImmediate(() => resolveNext());\n }\n\n normalize(callback) {\n let envelope = this.data.envelope || this.message.getEnvelope();\n let messageId = this.message.messageId();\n\n this.resolveAll((err, data) => {\n if (err) {\n return callback(err);\n }\n\n data.envelope = envelope;\n data.messageId = messageId;\n\n ['html', 'text', 'watchHtml', 'amp'].forEach(key => {\n if (data[key] && data[key].content) {\n if (typeof data[key].content === 'string') {\n data[key] = data[key].content;\n } else if (Buffer.isBuffer(data[key].content)) {\n data[key] = data[key].content.toString();\n }\n }\n });\n\n if (data.icalEvent && Buffer.isBuffer(data.icalEvent.content)) {\n data.icalEvent.content = data.icalEvent.content.toString('base64');\n data.icalEvent.encoding = 'base64';\n }\n\n if (data.alternatives && data.alternatives.length) {\n data.alternatives.forEach(alternative => {\n if (alternative && alternative.content && Buffer.isBuffer(alternative.content)) {\n alternative.content = alternative.content.toString('base64');\n alternative.encoding = 'base64';\n }\n });\n }\n\n if (data.attachments && data.attachments.length) {\n data.attachments.forEach(attachment => {\n if (attachment && attachment.content && Buffer.isBuffer(attachment.content)) {\n attachment.content = attachment.content.toString('base64');\n attachment.encoding = 'base64';\n }\n });\n }\n\n data.normalizedHeaders = {};\n Object.keys(data.headers || {}).forEach(key => {\n let value = [].concat(data.headers[key] || []).shift();\n value = (value && value.value) || value;\n if (value) {\n if (['references', 'in-reply-to', 'message-id', 'content-id'].includes(key)) {\n value = this.message._encodeHeaderValue(key, value);\n }\n data.normalizedHeaders[key] = value;\n }\n });\n\n if (data.list && typeof data.list === 'object') {\n let listHeaders = this._getListHeaders(data.list);\n listHeaders.forEach(entry => {\n data.normalizedHeaders[entry.key] = entry.value.map(val => (val && val.value) || val).join(', ');\n });\n }\n\n if (data.references) {\n data.normalizedHeaders.references = this.message._encodeHeaderValue('references', data.references);\n }\n\n if (data.inReplyTo) {\n data.normalizedHeaders['in-reply-to'] = this.message._encodeHeaderValue('in-reply-to', data.inReplyTo);\n }\n\n return callback(null, data);\n });\n }\n\n setMailerHeader() {\n if (!this.message || !this.data.xMailer) {\n return;\n }\n this.message.setHeader('X-Mailer', this.data.xMailer);\n }\n\n setPriorityHeaders() {\n if (!this.message || !this.data.priority) {\n return;\n }\n switch ((this.data.priority || '').toString().toLowerCase()) {\n case 'high':\n this.message.setHeader('X-Priority', '1 (Highest)');\n this.message.setHeader('X-MSMail-Priority', 'High');\n this.message.setHeader('Importance', 'High');\n break;\n case 'low':\n this.message.setHeader('X-Priority', '5 (Lowest)');\n this.message.setHeader('X-MSMail-Priority', 'Low');\n this.message.setHeader('Importance', 'Low');\n break;\n default:\n // do not add anything, since all messages are 'Normal' by default\n }\n }\n\n setListHeaders() {\n if (!this.message || !this.data.list || typeof this.data.list !== 'object') {\n return;\n }\n // add optional List-* headers\n if (this.data.list && typeof this.data.list === 'object') {\n this._getListHeaders(this.data.list).forEach(listHeader => {\n listHeader.value.forEach(value => {\n this.message.addHeader(listHeader.key, value);\n });\n });\n }\n }\n\n _getListHeaders(listData) {\n // make sure an url looks like <protocol:url>\n return Object.keys(listData).map(key => ({\n key: 'list-' + key.toLowerCase().trim(),\n value: [].concat(listData[key] || []).map(value => ({\n prepared: true,\n foldLines: true,\n value: []\n .concat(value || [])\n .map(value => {\n if (typeof value === 'string') {\n value = {\n url: value\n };\n }\n\n if (value && value.url) {\n if (key.toLowerCase().trim() === 'id') {\n // List-ID: \"comment\" <domain>\n let comment = value.comment || '';\n if (mimeFuncs.isPlainText(comment)) {\n comment = '\"' + comment + '\"';\n } else {\n comment = mimeFuncs.encodeWord(comment);\n }\n\n return (value.comment ? comment + ' ' : '') + this._formatListUrl(value.url).replace(/^<[^:]+\\/{,2}/, '');\n }\n\n // List-*: <http://domain> (comment)\n let comment = value.comment || '';\n if (!mimeFuncs.isPlainText(comment)) {\n comment = mimeFuncs.encodeWord(comment);\n }\n\n return this._formatListUrl(value.url) + (value.comment ? ' (' + comment + ')' : '');\n }\n\n return '';\n })\n .filter(value => value)\n .join(', ')\n }))\n }));\n }\n\n _formatListUrl(url) {\n url = url.replace(/[\\s<]+|[\\s>]+/g, '');\n if (/^(https?|mailto|ftp):/.test(url)) {\n return '<' + url + '>';\n }\n if (/^[^@]+@[^@]+$/.test(url)) {\n return '<mailto:' + url + '>';\n }\n\n return '<http://' + url + '>';\n }\n}\n\nmodule.exports = MailMessage;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFjdGlvbi1icm93c2VyKS8uL25vZGVfbW9kdWxlcy8ucG5wbS9ub2RlbWFpbGVyQDcuMC4xMy9ub2RlX21vZHVsZXMvbm9kZW1haWxlci9saWIvbWFpbGVyL21haWwtbWVzc2FnZS5qcyIsIm1hcHBpbmdzIjoiQUFBYTs7QUFFYixlQUFlLG1CQUFPLENBQUMsc0hBQVc7QUFDbEMsaUJBQWlCLG1CQUFPLENBQUMsNEhBQWM7QUFDdkMsa0JBQWtCLG1CQUFPLENBQUMsOEhBQWU7O0FBRXpDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxTQUFTOztBQUVUOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxhQUFhO0FBQ2I7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQjs7QUFFQTtBQUNBO0FBQ0EsYUFBYTtBQUNiOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0I7QUFDdEI7QUFDQTtBQUNBO0FBQ0EsYUFBYTs7QUFFYjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCOztBQUVBO0FBQ0EsMENBQTBDO0FBQzFDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhOztBQUViO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxTQUFTO0FBQ1Q7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQixhQUFhO0FBQ2I7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0NBQWtDO0FBQ2xDO0FBQ0E7O0FBRUEsZ0lBQWdJLEdBQUc7QUFDbkk7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0EscUJBQXFCO0FBQ3JCO0FBQ0E7QUFDQSxhQUFhO0FBQ2IsU0FBUztBQUNUOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBIiwic291cmNlcyI6WyIvVXNlcnMvbWFyY21pbnRlbC9Qcm9qZWN0cy9lLXRpYi5jb20vbm9kZV9tb2R1bGVzLy5wbnBtL25vZGVtYWlsZXJANy4wLjEzL25vZGVfbW9kdWxlcy9ub2RlbWFpbGVyL2xpYi9tYWlsZXIvbWFpbC1tZXNzYWdlLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcblxuY29uc3Qgc2hhcmVkID0gcmVxdWlyZSgnLi4vc2hhcmVkJyk7XG5jb25zdCBNaW1lTm9kZSA9IHJlcXVpcmUoJy4uL21pbWUtbm9kZScpO1xuY29uc3QgbWltZUZ1bmNzID0gcmVxdWlyZSgnLi4vbWltZS1mdW5jcycpO1xuXG5jbGFzcyBNYWlsTWVzc2FnZSB7XG4gICAgY29uc3RydWN0b3IobWFpbGVyLCBkYXRhKSB7XG4gICAgICAgIHRoaXMubWFpbGVyID0gbWFpbGVyO1xuICAgICAgICB0aGlzLmRhdGEgPSB7fTtcbiAgICAgICAgdGhpcy5tZXNzYWdlID0gbnVsbDtcblxuICAgICAgICBkYXRhID0gZGF0YSB8fCB7fTtcbiAgICAgICAgbGV0IG9wdGlvbnMgPSBtYWlsZXIub3B0aW9ucyB8fCB7fTtcbiAgICAgICAgbGV0IGRlZmF1bHRzID0gbWFpbGVyLl9kZWZhdWx0cyB8fCB7fTtcblxuICAgICAgICBPYmplY3Qua2V5cyhkYXRhKS5mb3JFYWNoKGtleSA9PiB7XG4gICAgICAgICAgICB0aGlzLmRhdGFba2V5XSA9IGRhdGFba2V5XTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5kYXRhLmhlYWRlcnMgPSB0aGlzLmRhdGEuaGVhZGVycyB8fCB7fTtcblxuICAgICAgICAvLyBhcHBseSBkZWZhdWx0c1xuICAgICAgICBPYmplY3Qua2V5cyhkZWZhdWx0cykuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICAgICAgaWYgKCEoa2V5IGluIHRoaXMuZGF0YSkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmRhdGFba2V5XSA9IGRlZmF1bHRzW2tleV07XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGtleSA9PT0gJ2hlYWRlcnMnKSB7XG4gICAgICAgICAgICAgICAgLy8gaGVhZGVycyBpcyBhIHNwZWNpYWwgY2FzZS4gQWxsb3cgc2V0dGluZyBpbmRpdmlkdWFsIGRlZmF1bHQgaGVhZGVyc1xuICAgICAgICAgICAgICAgIE9iamVjdC5rZXlzKGRlZmF1bHRzLmhlYWRlcnMpLmZvckVhY2goa2V5ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCEoa2V5IGluIHRoaXMuZGF0YS5oZWFkZXJzKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhLmhlYWRlcnNba2V5XSA9IGRlZmF1bHRzLmhlYWRlcnNba2V5XTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBmb3JjZSBzcGVjaWZpYyBrZXlzIGZyb20gdHJhbnNwb3J0ZXIgb3B0aW9uc1xuICAgICAgICBbJ2Rpc2FibGVGaWxlQWNjZXNzJywgJ2Rpc2FibGVVcmxBY2Nlc3MnLCAnbm9ybWFsaXplSGVhZGVyS2V5J10uZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICAgICAgaWYgKGtleSBpbiBvcHRpb25zKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kYXRhW2tleV0gPSBvcHRpb25zW2tleV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHJlc29sdmVDb250ZW50KC4uLmFyZ3MpIHtcbiAgICAgICAgcmV0dXJuIHNoYXJlZC5yZXNvbHZlQ29udGVudCguLi5hcmdzKTtcbiAgICB9XG5cbiAgICByZXNvbHZlQWxsKGNhbGxiYWNrKSB7XG4gICAgICAgIGxldCBrZXlzID0gW1xuICAgICAgICAgICAgW3RoaXMuZGF0YSwgJ2h0bWwnXSxcbiAgICAgICAgICAgIFt0aGlzLmRhdGEsICd0ZXh0J10sXG4gICAgICAgICAgICBbdGhpcy5kYXRhLCAnd2F0Y2hIdG1sJ10sXG4gICAgICAgICAgICBbdGhpcy5kYXRhLCAnYW1wJ10sXG4gICAgICAgICAgICBbdGhpcy5kYXRhLCAnaWNhbEV2ZW50J11cbiAgICAgICAgXTtcblxuICAgICAgICBpZiAodGhpcy5kYXRhLmFsdGVybmF0aXZlcyAmJiB0aGlzLmRhdGEuYWx0ZXJuYXRpdmVzLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy5kYXRhLmFsdGVybmF0aXZlcy5mb3JFYWNoKChhbHRlcm5hdGl2ZSwgaSkgPT4ge1xuICAgICAgICAgICAgICAgIGtleXMucHVzaChbdGhpcy5kYXRhLmFsdGVybmF0aXZlcywgaV0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5kYXRhLmF0dGFjaG1lbnRzICYmIHRoaXMuZGF0YS5hdHRhY2htZW50cy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMuZGF0YS5hdHRhY2htZW50cy5mb3JFYWNoKChhdHRhY2htZW50LCBpKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCFhdHRhY2htZW50LmZpbGVuYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgIGF0dGFjaG1lbnQuZmlsZW5hbWUgPVxuICAgICAgICAgICAgICAgICAgICAgICAgKGF0dGFjaG1lbnQucGF0aCB8fCBhdHRhY2htZW50LmhyZWYgfHwgJycpLnNwbGl0KCcvJykucG9wKCkuc3BsaXQoJz8nKS5zaGlmdCgpIHx8ICdhdHRhY2htZW50LScgKyAoaSArIDEpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoYXR0YWNobWVudC5maWxlbmFtZS5pbmRleE9mKCcuJykgPCAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhdHRhY2htZW50LmZpbGVuYW1lICs9ICcuJyArIG1pbWVGdW5jcy5kZXRlY3RFeHRlbnNpb24oYXR0YWNobWVudC5jb250ZW50VHlwZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoIWF0dGFjaG1lbnQuY29udGVudFR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgYXR0YWNobWVudC5jb250ZW50VHlwZSA9IG1pbWVGdW5jcy5kZXRlY3RNaW1lVHlwZShhdHRhY2htZW50LmZpbGVuYW1lIHx8IGF0dGFjaG1lbnQucGF0aCB8fCBhdHRhY2htZW50LmhyZWYgfHwgJ2JpbicpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGtleXMucHVzaChbdGhpcy5kYXRhLmF0dGFjaG1lbnRzLCBpXSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBtaW1lTm9kZSA9IG5ldyBNaW1lTm9kZSgpO1xuXG4gICAgICAgIGxldCBhZGRyZXNzS2V5cyA9IFsnZnJvbScsICd0bycsICdjYycsICdiY2MnLCAnc2VuZGVyJywgJ3JlcGx5VG8nXTtcblxuICAgICAgICBhZGRyZXNzS2V5cy5mb3JFYWNoKGFkZHJlc3MgPT4ge1xuICAgICAgICAgICAgbGV0IHZhbHVlO1xuICAgICAgICAgICAgaWYgKHRoaXMubWVzc2FnZSkge1xuICAgICAgICAgICAgICAgIHZhbHVlID0gW10uY29uY2F0KG1pbWVOb2RlLl9wYXJzZUFkZHJlc3Nlcyh0aGlzLm1lc3NhZ2UuZ2V0SGVhZGVyKGFkZHJlc3MgPT09ICdyZXBseVRvJyA/ICdyZXBseS10bycgOiBhZGRyZXNzKSkgfHwgW10pO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmRhdGFbYWRkcmVzc10pIHtcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IFtdLmNvbmNhdChtaW1lTm9kZS5fcGFyc2VBZGRyZXNzZXModGhpcy5kYXRhW2FkZHJlc3NdKSB8fCBbXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodmFsdWUgJiYgdmFsdWUubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kYXRhW2FkZHJlc3NdID0gdmFsdWU7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGFkZHJlc3MgaW4gdGhpcy5kYXRhKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kYXRhW2FkZHJlc3NdID0gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgbGV0IHNpbmdsZUtleXMgPSBbJ2Zyb20nLCAnc2VuZGVyJ107XG4gICAgICAgIHNpbmdsZUtleXMuZm9yRWFjaChhZGRyZXNzID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLmRhdGFbYWRkcmVzc10pIHtcbiAgICAgICAgICAgICAgICB0aGlzLmRhdGFbYWRkcmVzc10gPSB0aGlzLmRhdGFbYWRkcmVzc10uc2hpZnQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgbGV0IHBvcyA9IDA7XG4gICAgICAgIGxldCByZXNvbHZlTmV4dCA9ICgpID0+IHtcbiAgICAgICAgICAgIGlmIChwb3MgPj0ga2V5cy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY2FsbGJhY2sobnVsbCwgdGhpcy5kYXRhKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCBhcmdzID0ga2V5c1twb3MrK107XG4gICAgICAgICAgICBpZiAoIWFyZ3NbMF0gfHwgIWFyZ3NbMF1bYXJnc1sxXV0pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzb2x2ZU5leHQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHNoYXJlZC5yZXNvbHZlQ29udGVudCguLi5hcmdzLCAoZXJyLCB2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKGVycik7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgbGV0IG5vZGUgPSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRlbnQ6IHZhbHVlXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBpZiAoYXJnc1swXVthcmdzWzFdXSAmJiB0eXBlb2YgYXJnc1swXVthcmdzWzFdXSA9PT0gJ29iamVjdCcgJiYgIUJ1ZmZlci5pc0J1ZmZlcihhcmdzWzBdW2FyZ3NbMV1dKSkge1xuICAgICAgICAgICAgICAgICAgICBPYmplY3Qua2V5cyhhcmdzWzBdW2FyZ3NbMV1dKS5mb3JFYWNoKGtleSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIShrZXkgaW4gbm9kZSkgJiYgIVsnY29udGVudCcsICdwYXRoJywgJ2hyZWYnLCAncmF3J10uaW5jbHVkZXMoa2V5KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGVba2V5XSA9IGFyZ3NbMF1bYXJnc1sxXV1ba2V5XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgYXJnc1swXVthcmdzWzFdXSA9IG5vZGU7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZU5leHQoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9O1xuXG4gICAgICAgIHNldEltbWVkaWF0ZSgoKSA9PiByZXNvbHZlTmV4dCgpKTtcbiAgICB9XG5cbiAgICBub3JtYWxpemUoY2FsbGJhY2spIHtcbiAgICAgICAgbGV0IGVudmVsb3BlID0gdGhpcy5kYXRhLmVudmVsb3BlIHx8IHRoaXMubWVzc2FnZS5nZXRFbnZlbG9wZSgpO1xuICAgICAgICBsZXQgbWVzc2FnZUlkID0gdGhpcy5tZXNzYWdlLm1lc3NhZ2VJZCgpO1xuXG4gICAgICAgIHRoaXMucmVzb2x2ZUFsbCgoZXJyLCBkYXRhKSA9PiB7XG4gICAgICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKGVycik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGRhdGEuZW52ZWxvcGUgPSBlbnZlbG9wZTtcbiAgICAgICAgICAgIGRhdGEubWVzc2FnZUlkID0gbWVzc2FnZUlkO1xuXG4gICAgICAgICAgICBbJ2h0bWwnLCAndGV4dCcsICd3YXRjaEh0bWwnLCAnYW1wJ10uZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChkYXRhW2tleV0gJiYgZGF0YVtrZXldLmNvbnRlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBkYXRhW2tleV0uY29udGVudCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFba2V5XSA9IGRhdGFba2V5XS5jb250ZW50O1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKEJ1ZmZlci5pc0J1ZmZlcihkYXRhW2tleV0uY29udGVudCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFba2V5XSA9IGRhdGFba2V5XS5jb250ZW50LnRvU3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgaWYgKGRhdGEuaWNhbEV2ZW50ICYmIEJ1ZmZlci5pc0J1ZmZlcihkYXRhLmljYWxFdmVudC5jb250ZW50KSkge1xuICAgICAgICAgICAgICAgIGRhdGEuaWNhbEV2ZW50LmNvbnRlbnQgPSBkYXRhLmljYWxFdmVudC5jb250ZW50LnRvU3RyaW5nKCdiYXNlNjQnKTtcbiAgICAgICAgICAgICAgICBkYXRhLmljYWxFdmVudC5lbmNvZGluZyA9ICdiYXNlNjQnO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoZGF0YS5hbHRlcm5hdGl2ZXMgJiYgZGF0YS5hbHRlcm5hdGl2ZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgZGF0YS5hbHRlcm5hdGl2ZXMuZm9yRWFjaChhbHRlcm5hdGl2ZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChhbHRlcm5hdGl2ZSAmJiBhbHRlcm5hdGl2ZS5jb250ZW50ICYmIEJ1ZmZlci5pc0J1ZmZlcihhbHRlcm5hdGl2ZS5jb250ZW50KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYWx0ZXJuYXRpdmUuY29udGVudCA9IGFsdGVybmF0aXZlLmNvbnRlbnQudG9TdHJpbmcoJ2Jhc2U2NCcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYWx0ZXJuYXRpdmUuZW5jb2RpbmcgPSAnYmFzZTY0JztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoZGF0YS5hdHRhY2htZW50cyAmJiBkYXRhLmF0dGFjaG1lbnRzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIGRhdGEuYXR0YWNobWVudHMuZm9yRWFjaChhdHRhY2htZW50ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGF0dGFjaG1lbnQgJiYgYXR0YWNobWVudC5jb250ZW50ICYmIEJ1ZmZlci5pc0J1ZmZlcihhdHRhY2htZW50LmNvbnRlbnQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhdHRhY2htZW50LmNvbnRlbnQgPSBhdHRhY2htZW50LmNvbnRlbnQudG9TdHJpbmcoJ2Jhc2U2NCcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYXR0YWNobWVudC5lbmNvZGluZyA9ICdiYXNlNjQnO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGRhdGEubm9ybWFsaXplZEhlYWRlcnMgPSB7fTtcbiAgICAgICAgICAgIE9iamVjdC5rZXlzKGRhdGEuaGVhZGVycyB8fCB7fSkuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICAgICAgICAgIGxldCB2YWx1ZSA9IFtdLmNvbmNhdChkYXRhLmhlYWRlcnNba2V5XSB8fCBbXSkuc2hpZnQoKTtcbiAgICAgICAgICAgICAgICB2YWx1ZSA9ICh2YWx1ZSAmJiB2YWx1ZS52YWx1ZSkgfHwgdmFsdWU7XG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChbJ3JlZmVyZW5jZXMnLCAnaW4tcmVwbHktdG8nLCAnbWVzc2FnZS1pZCcsICdjb250ZW50LWlkJ10uaW5jbHVkZXMoa2V5KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSB0aGlzLm1lc3NhZ2UuX2VuY29kZUhlYWRlclZhbHVlKGtleSwgdmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGRhdGEubm9ybWFsaXplZEhlYWRlcnNba2V5XSA9IHZhbHVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBpZiAoZGF0YS5saXN0ICYmIHR5cGVvZiBkYXRhLmxpc3QgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICAgICAgbGV0IGxpc3RIZWFkZXJzID0gdGhpcy5fZ2V0TGlzdEhlYWRlcnMoZGF0YS5saXN0KTtcbiAgICAgICAgICAgICAgICBsaXN0SGVhZGVycy5mb3JFYWNoKGVudHJ5ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgZGF0YS5ub3JtYWxpemVkSGVhZGVyc1tlbnRyeS5rZXldID0gZW50cnkudmFsdWUubWFwKHZhbCA9PiAodmFsICYmIHZhbC52YWx1ZSkgfHwgdmFsKS5qb2luKCcsICcpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoZGF0YS5yZWZlcmVuY2VzKSB7XG4gICAgICAgICAgICAgICAgZGF0YS5ub3JtYWxpemVkSGVhZGVycy5yZWZlcmVuY2VzID0gdGhpcy5tZXNzYWdlLl9lbmNvZGVIZWFkZXJWYWx1ZSgncmVmZXJlbmNlcycsIGRhdGEucmVmZXJlbmNlcyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChkYXRhLmluUmVwbHlUbykge1xuICAgICAgICAgICAgICAgIGRhdGEubm9ybWFsaXplZEhlYWRlcnNbJ2luLXJlcGx5LXRvJ10gPSB0aGlzLm1lc3NhZ2UuX2VuY29kZUhlYWRlclZhbHVlKCdpbi1yZXBseS10bycsIGRhdGEuaW5SZXBseVRvKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKG51bGwsIGRhdGEpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBzZXRNYWlsZXJIZWFkZXIoKSB7XG4gICAgICAgIGlmICghdGhpcy5tZXNzYWdlIHx8ICF0aGlzLmRhdGEueE1haWxlcikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubWVzc2FnZS5zZXRIZWFkZXIoJ1gtTWFpbGVyJywgdGhpcy5kYXRhLnhNYWlsZXIpO1xuICAgIH1cblxuICAgIHNldFByaW9yaXR5SGVhZGVycygpIHtcbiAgICAgICAgaWYgKCF0aGlzLm1lc3NhZ2UgfHwgIXRoaXMuZGF0YS5wcmlvcml0eSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHN3aXRjaCAoKHRoaXMuZGF0YS5wcmlvcml0eSB8fCAnJykudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpKSB7XG4gICAgICAgICAgICBjYXNlICdoaWdoJzpcbiAgICAgICAgICAgICAgICB0aGlzLm1lc3NhZ2Uuc2V0SGVhZGVyKCdYLVByaW9yaXR5JywgJzEgKEhpZ2hlc3QpJyk7XG4gICAgICAgICAgICAgICAgdGhpcy5tZXNzYWdlLnNldEhlYWRlcignWC1NU01haWwtUHJpb3JpdHknLCAnSGlnaCcpO1xuICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZS5zZXRIZWFkZXIoJ0ltcG9ydGFuY2UnLCAnSGlnaCcpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnbG93JzpcbiAgICAgICAgICAgICAgICB0aGlzLm1lc3NhZ2Uuc2V0SGVhZGVyKCdYLVByaW9yaXR5JywgJzUgKExvd2VzdCknKTtcbiAgICAgICAgICAgICAgICB0aGlzLm1lc3NhZ2Uuc2V0SGVhZGVyKCdYLU1TTWFpbC1Qcmlvcml0eScsICdMb3cnKTtcbiAgICAgICAgICAgICAgICB0aGlzLm1lc3NhZ2Uuc2V0SGVhZGVyKCdJbXBvcnRhbmNlJywgJ0xvdycpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIC8vIGRvIG5vdCBhZGQgYW55dGhpbmcsIHNpbmNlIGFsbCBtZXNzYWdlcyBhcmUgJ05vcm1hbCcgYnkgZGVmYXVsdFxuICAgICAgICB9XG4gICAgfVxuXG4gICAgc2V0TGlzdEhlYWRlcnMoKSB7XG4gICAgICAgIGlmICghdGhpcy5tZXNzYWdlIHx8ICF0aGlzLmRhdGEubGlzdCB8fCB0eXBlb2YgdGhpcy5kYXRhLmxpc3QgIT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gYWRkIG9wdGlvbmFsIExpc3QtKiBoZWFkZXJzXG4gICAgICAgIGlmICh0aGlzLmRhdGEubGlzdCAmJiB0eXBlb2YgdGhpcy5kYXRhLmxpc3QgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICB0aGlzLl9nZXRMaXN0SGVhZGVycyh0aGlzLmRhdGEubGlzdCkuZm9yRWFjaChsaXN0SGVhZGVyID0+IHtcbiAgICAgICAgICAgICAgICBsaXN0SGVhZGVyLnZhbHVlLmZvckVhY2godmFsdWUgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm1lc3NhZ2UuYWRkSGVhZGVyKGxpc3RIZWFkZXIua2V5LCB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIF9nZXRMaXN0SGVhZGVycyhsaXN0RGF0YSkge1xuICAgICAgICAvLyBtYWtlIHN1cmUgYW4gdXJsIGxvb2tzIGxpa2UgPHByb3RvY29sOnVybD5cbiAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKGxpc3REYXRhKS5tYXAoa2V5ID0+ICh7XG4gICAgICAgICAgICBrZXk6ICdsaXN0LScgKyBrZXkudG9Mb3dlckNhc2UoKS50cmltKCksXG4gICAgICAgICAgICB2YWx1ZTogW10uY29uY2F0KGxpc3REYXRhW2tleV0gfHwgW10pLm1hcCh2YWx1ZSA9PiAoe1xuICAgICAgICAgICAgICAgIHByZXBhcmVkOiB0cnVlLFxuICAgICAgICAgICAgICAgIGZvbGRMaW5lczogdHJ1ZSxcbiAgICAgICAgICAgICAgICB2YWx1ZTogW11cbiAgICAgICAgICAgICAgICAgICAgLmNvbmNhdCh2YWx1ZSB8fCBbXSlcbiAgICAgICAgICAgICAgICAgICAgLm1hcCh2YWx1ZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cmw6IHZhbHVlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlICYmIHZhbHVlLnVybCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChrZXkudG9Mb3dlckNhc2UoKS50cmltKCkgPT09ICdpZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTGlzdC1JRDogXCJjb21tZW50XCIgPGRvbWFpbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNvbW1lbnQgPSB2YWx1ZS5jb21tZW50IHx8ICcnO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobWltZUZ1bmNzLmlzUGxhaW5UZXh0KGNvbW1lbnQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tZW50ID0gJ1wiJyArIGNvbW1lbnQgKyAnXCInO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWVudCA9IG1pbWVGdW5jcy5lbmNvZGVXb3JkKGNvbW1lbnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICh2YWx1ZS5jb21tZW50ID8gY29tbWVudCArICcgJyA6ICcnKSArIHRoaXMuX2Zvcm1hdExpc3RVcmwodmFsdWUudXJsKS5yZXBsYWNlKC9ePFteOl0rXFwveywyfS8sICcnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBMaXN0LSo6IDxodHRwOi8vZG9tYWluPiAoY29tbWVudClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgY29tbWVudCA9IHZhbHVlLmNvbW1lbnQgfHwgJyc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFtaW1lRnVuY3MuaXNQbGFpblRleHQoY29tbWVudCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWVudCA9IG1pbWVGdW5jcy5lbmNvZGVXb3JkKGNvbW1lbnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9mb3JtYXRMaXN0VXJsKHZhbHVlLnVybCkgKyAodmFsdWUuY29tbWVudCA/ICcgKCcgKyBjb21tZW50ICsgJyknIDogJycpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJyc7XG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgIC5maWx0ZXIodmFsdWUgPT4gdmFsdWUpXG4gICAgICAgICAgICAgICAgICAgIC5qb2luKCcsICcpXG4gICAgICAgICAgICB9KSlcbiAgICAgICAgfSkpO1xuICAgIH1cblxuICAgIF9mb3JtYXRMaXN0VXJsKHVybCkge1xuICAgICAgICB1cmwgPSB1cmwucmVwbGFjZSgvW1xcczxdK3xbXFxzPl0rL2csICcnKTtcbiAgICAgICAgaWYgKC9eKGh0dHBzP3xtYWlsdG98ZnRwKTovLnRlc3QodXJsKSkge1xuICAgICAgICAgICAgcmV0dXJuICc8JyArIHVybCArICc+JztcbiAgICAgICAgfVxuICAgICAgICBpZiAoL15bXkBdK0BbXkBdKyQvLnRlc3QodXJsKSkge1xuICAgICAgICAgICAgcmV0dXJuICc8bWFpbHRvOicgKyB1cmwgKyAnPic7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gJzxodHRwOi8vJyArIHVybCArICc+JztcbiAgICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gTWFpbE1lc3NhZ2U7XG4iXSwibmFtZXMiOltdLCJpZ25vcmVMaXN0IjpbMF0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(action-browser)/./node_modules/.pnpm/nodemailer@7.0.13/node_modules/nodemailer/lib/mailer/mail-message.js\n");
|
||
|
||
/***/ }),
|
||
|
||
/***/ "(action-browser)/./node_modules/.pnpm/nodemailer@7.0.13/node_modules/nodemailer/lib/mime-funcs/index.js":
|
||
/*!**********************************************************************************************!*\
|
||
!*** ./node_modules/.pnpm/nodemailer@7.0.13/node_modules/nodemailer/lib/mime-funcs/index.js ***!
|
||
\**********************************************************************************************/
|
||
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
|
||
|
||
eval("/* eslint no-control-regex:0 */\n\n\n\nconst base64 = __webpack_require__(/*! ../base64 */ \"(action-browser)/./node_modules/.pnpm/nodemailer@7.0.13/node_modules/nodemailer/lib/base64/index.js\");\nconst qp = __webpack_require__(/*! ../qp */ \"(action-browser)/./node_modules/.pnpm/nodemailer@7.0.13/node_modules/nodemailer/lib/qp/index.js\");\nconst mimeTypes = __webpack_require__(/*! ./mime-types */ \"(action-browser)/./node_modules/.pnpm/nodemailer@7.0.13/node_modules/nodemailer/lib/mime-funcs/mime-types.js\");\n\nmodule.exports = {\n /**\n * Checks if a value is plaintext string (uses only printable 7bit chars)\n *\n * @param {String} value String to be tested\n * @returns {Boolean} true if it is a plaintext string\n */\n isPlainText(value, isParam) {\n const re = isParam ? /[\\x00-\\x08\\x0b\\x0c\\x0e-\\x1f\"\\u0080-\\uFFFF]/ : /[\\x00-\\x08\\x0b\\x0c\\x0e-\\x1f\\u0080-\\uFFFF]/;\n if (typeof value !== 'string' || re.test(value)) {\n return false;\n } else {\n return true;\n }\n },\n\n /**\n * Checks if a multi line string containes lines longer than the selected value.\n *\n * Useful when detecting if a mail message needs any processing at all –\n * if only plaintext characters are used and lines are short, then there is\n * no need to encode the values in any way. If the value is plaintext but has\n * longer lines then allowed, then use format=flowed\n *\n * @param {Number} lineLength Max line length to check for\n * @returns {Boolean} Returns true if there is at least one line longer than lineLength chars\n */\n hasLongerLines(str, lineLength) {\n if (str.length > 128 * 1024) {\n // do not test strings longer than 128kB\n return true;\n }\n return new RegExp('^.{' + (lineLength + 1) + ',}', 'm').test(str);\n },\n\n /**\n * Encodes a string or an Buffer to an UTF-8 MIME Word (rfc2047)\n *\n * @param {String|Buffer} data String to be encoded\n * @param {String} mimeWordEncoding='Q' Encoding for the mime word, either Q or B\n * @param {Number} [maxLength=0] If set, split mime words into several chunks if needed\n * @return {String} Single or several mime words joined together\n */\n encodeWord(data, mimeWordEncoding, maxLength) {\n mimeWordEncoding = (mimeWordEncoding || 'Q').toString().toUpperCase().trim().charAt(0);\n maxLength = maxLength || 0;\n\n let encodedStr;\n let toCharset = 'UTF-8';\n\n if (maxLength && maxLength > 7 + toCharset.length) {\n maxLength -= 7 + toCharset.length;\n }\n\n if (mimeWordEncoding === 'Q') {\n // https://tools.ietf.org/html/rfc2047#section-5 rule (3)\n encodedStr = qp.encode(data).replace(/[^a-z0-9!*+\\-/=]/gi, chr => {\n let ord = chr.charCodeAt(0).toString(16).toUpperCase();\n if (chr === ' ') {\n return '_';\n } else {\n return '=' + (ord.length === 1 ? '0' + ord : ord);\n }\n });\n } else if (mimeWordEncoding === 'B') {\n encodedStr = typeof data === 'string' ? data : base64.encode(data);\n maxLength = maxLength ? Math.max(3, ((maxLength - (maxLength % 4)) / 4) * 3) : 0;\n }\n\n if (maxLength && (mimeWordEncoding !== 'B' ? encodedStr : base64.encode(data)).length > maxLength) {\n if (mimeWordEncoding === 'Q') {\n encodedStr = this.splitMimeEncodedString(encodedStr, maxLength).join('?= =?' + toCharset + '?' + mimeWordEncoding + '?');\n } else {\n // RFC2047 6.3 (2) states that encoded-word must include an integral number of characters, so no chopping unicode sequences\n let parts = [];\n let lpart = '';\n for (let i = 0, len = encodedStr.length; i < len; i++) {\n let chr = encodedStr.charAt(i);\n\n if (/[\\ud83c\\ud83d\\ud83e]/.test(chr) && i < len - 1) {\n // composite emoji byte, so add the next byte as well\n chr += encodedStr.charAt(++i);\n }\n\n // check if we can add this character to the existing string\n // without breaking byte length limit\n if (Buffer.byteLength(lpart + chr) <= maxLength || i === 0) {\n lpart += chr;\n } else {\n // we hit the length limit, so push the existing string and start over\n parts.push(base64.encode(lpart));\n lpart = chr;\n }\n }\n if (lpart) {\n parts.push(base64.encode(lpart));\n }\n\n if (parts.length > 1) {\n encodedStr = parts.join('?= =?' + toCharset + '?' + mimeWordEncoding + '?');\n } else {\n encodedStr = parts.join('');\n }\n }\n } else if (mimeWordEncoding === 'B') {\n encodedStr = base64.encode(data);\n }\n\n return '=?' + toCharset + '?' + mimeWordEncoding + '?' + encodedStr + (encodedStr.substr(-2) === '?=' ? '' : '?=');\n },\n\n /**\n * Finds word sequences with non ascii text and converts these to mime words\n *\n * @param {String} value String to be encoded\n * @param {String} mimeWordEncoding='Q' Encoding for the mime word, either Q or B\n * @param {Number} [maxLength=0] If set, split mime words into several chunks if needed\n * @param {Boolean} [encodeAll=false] If true and the value needs encoding then encodes entire string, not just the smallest match\n * @return {String} String with possible mime words\n */\n encodeWords(value, mimeWordEncoding, maxLength, encodeAll) {\n maxLength = maxLength || 0;\n\n let encodedValue;\n\n // find first word with a non-printable ascii or special symbol in it\n let firstMatch = value.match(/(?:^|\\s)([^\\s]*[\"\\u0080-\\uFFFF])/);\n if (!firstMatch) {\n return value;\n }\n\n if (encodeAll) {\n // if it is requested to encode everything or the string contains something that resebles encoded word, then encode everything\n\n return this.encodeWord(value, mimeWordEncoding, maxLength);\n }\n\n // find the last word with a non-printable ascii in it\n let lastMatch = value.match(/([\"\\u0080-\\uFFFF][^\\s]*)[^\"\\u0080-\\uFFFF]*$/);\n if (!lastMatch) {\n // should not happen\n return value;\n }\n\n let startIndex =\n firstMatch.index +\n (\n firstMatch[0].match(/[^\\s]/) || {\n index: 0\n }\n ).index;\n let endIndex = lastMatch.index + (lastMatch[1] || '').length;\n\n encodedValue =\n (startIndex ? value.substr(0, startIndex) : '') +\n this.encodeWord(value.substring(startIndex, endIndex), mimeWordEncoding || 'Q', maxLength) +\n (endIndex < value.length ? value.substr(endIndex) : '');\n\n return encodedValue;\n },\n\n /**\n * Joins parsed header value together as 'value; param1=value1; param2=value2'\n * PS: We are following RFC 822 for the list of special characters that we need to keep in quotes.\n * Refer: https://www.w3.org/Protocols/rfc1341/4_Content-Type.html\n * @param {Object} structured Parsed header value\n * @return {String} joined header value\n */\n buildHeaderValue(structured) {\n let paramsArray = [];\n\n Object.keys(structured.params || {}).forEach(param => {\n // filename might include unicode characters so it is a special case\n // other values probably do not\n let value = structured.params[param];\n if (!this.isPlainText(value, true) || value.length >= 75) {\n this.buildHeaderParam(param, value, 50).forEach(encodedParam => {\n if (!/[\\s\"\\\\;:/=(),<>@[\\]?]|^[-']|'$/.test(encodedParam.value) || encodedParam.key.substr(-1) === '*') {\n paramsArray.push(encodedParam.key + '=' + encodedParam.value);\n } else {\n paramsArray.push(encodedParam.key + '=' + JSON.stringify(encodedParam.value));\n }\n });\n } else if (/[\\s'\"\\\\;:/=(),<>@[\\]?]|^-/.test(value)) {\n paramsArray.push(param + '=' + JSON.stringify(value));\n } else {\n paramsArray.push(param + '=' + value);\n }\n });\n\n return structured.value + (paramsArray.length ? '; ' + paramsArray.join('; ') : '');\n },\n\n /**\n * Encodes a string or an Buffer to an UTF-8 Parameter Value Continuation encoding (rfc2231)\n * Useful for splitting long parameter values.\n *\n * For example\n * title=\"unicode string\"\n * becomes\n * title*0*=utf-8''unicode\n * title*1*=%20string\n *\n * @param {String|Buffer} data String to be encoded\n * @param {Number} [maxLength=50] Max length for generated chunks\n * @param {String} [fromCharset='UTF-8'] Source sharacter set\n * @return {Array} A list of encoded keys and headers\n */\n buildHeaderParam(key, data, maxLength) {\n let list = [];\n let encodedStr = typeof data === 'string' ? data : (data || '').toString();\n let encodedStrArr;\n let chr, ord;\n let line;\n let startPos = 0;\n let i, len;\n\n maxLength = maxLength || 50;\n\n // process ascii only text\n if (this.isPlainText(data, true)) {\n // check if conversion is even needed\n if (encodedStr.length <= maxLength) {\n return [\n {\n key,\n value: encodedStr\n }\n ];\n }\n\n encodedStr = encodedStr.replace(new RegExp('.{' + maxLength + '}', 'g'), str => {\n list.push({\n line: str\n });\n return '';\n });\n\n if (encodedStr) {\n list.push({\n line: encodedStr\n });\n }\n } else {\n if (/[\\uD800-\\uDBFF]/.test(encodedStr)) {\n // string containts surrogate pairs, so normalize it to an array of bytes\n encodedStrArr = [];\n for (i = 0, len = encodedStr.length; i < len; i++) {\n chr = encodedStr.charAt(i);\n ord = chr.charCodeAt(0);\n if (ord >= 0xd800 && ord <= 0xdbff && i < len - 1) {\n chr += encodedStr.charAt(i + 1);\n encodedStrArr.push(chr);\n i++;\n } else {\n encodedStrArr.push(chr);\n }\n }\n encodedStr = encodedStrArr;\n }\n\n // first line includes the charset and language info and needs to be encoded\n // even if it does not contain any unicode characters\n line = \"utf-8''\";\n let encoded = true;\n startPos = 0;\n\n // process text with unicode or special chars\n for (i = 0, len = encodedStr.length; i < len; i++) {\n chr = encodedStr[i];\n\n if (encoded) {\n chr = this.safeEncodeURIComponent(chr);\n } else {\n // try to urlencode current char\n chr = chr === ' ' ? chr : this.safeEncodeURIComponent(chr);\n // By default it is not required to encode a line, the need\n // only appears when the string contains unicode or special chars\n // in this case we start processing the line over and encode all chars\n if (chr !== encodedStr[i]) {\n // Check if it is even possible to add the encoded char to the line\n // If not, there is no reason to use this line, just push it to the list\n // and start a new line with the char that needs encoding\n if ((this.safeEncodeURIComponent(line) + chr).length >= maxLength) {\n list.push({\n line,\n encoded\n });\n line = '';\n startPos = i - 1;\n } else {\n encoded = true;\n i = startPos;\n line = '';\n continue;\n }\n }\n }\n\n // if the line is already too long, push it to the list and start a new one\n if ((line + chr).length >= maxLength) {\n list.push({\n line,\n encoded\n });\n line = chr = encodedStr[i] === ' ' ? ' ' : this.safeEncodeURIComponent(encodedStr[i]);\n if (chr === encodedStr[i]) {\n encoded = false;\n startPos = i - 1;\n } else {\n encoded = true;\n }\n } else {\n line += chr;\n }\n }\n\n if (line) {\n list.push({\n line,\n encoded\n });\n }\n }\n\n return list.map((item, i) => ({\n // encoded lines: {name}*{part}*\n // unencoded lines: {name}*{part}\n // if any line needs to be encoded then the first line (part==0) is always encoded\n key: key + '*' + i + (item.encoded ? '*' : ''),\n value: item.line\n }));\n },\n\n /**\n * Parses a header value with key=value arguments into a structured\n * object.\n *\n * parseHeaderValue('content-type: text/plain; CHARSET='UTF-8'') ->\n * {\n * 'value': 'text/plain',\n * 'params': {\n * 'charset': 'UTF-8'\n * }\n * }\n *\n * @param {String} str Header value\n * @return {Object} Header value as a parsed structure\n */\n parseHeaderValue(str) {\n let response = {\n value: false,\n params: {}\n };\n let key = false;\n let value = '';\n let type = 'value';\n let quote = false;\n let escaped = false;\n let chr;\n\n for (let i = 0, len = str.length; i < len; i++) {\n chr = str.charAt(i);\n if (type === 'key') {\n if (chr === '=') {\n key = value.trim().toLowerCase();\n type = 'value';\n value = '';\n continue;\n }\n value += chr;\n } else {\n if (escaped) {\n value += chr;\n } else if (chr === '\\\\') {\n escaped = true;\n continue;\n } else if (quote && chr === quote) {\n quote = false;\n } else if (!quote && chr === '\"') {\n quote = chr;\n } else if (!quote && chr === ';') {\n if (key === false) {\n response.value = value.trim();\n } else {\n response.params[key] = value.trim();\n }\n type = 'key';\n value = '';\n } else {\n value += chr;\n }\n escaped = false;\n }\n }\n\n if (type === 'value') {\n if (key === false) {\n response.value = value.trim();\n } else {\n response.params[key] = value.trim();\n }\n } else if (value.trim()) {\n response.params[value.trim().toLowerCase()] = '';\n }\n\n // handle parameter value continuations\n // https://tools.ietf.org/html/rfc2231#section-3\n\n // preprocess values\n Object.keys(response.params).forEach(key => {\n let actualKey, nr, match, value;\n if ((match = key.match(/(\\*(\\d+)|\\*(\\d+)\\*|\\*)$/))) {\n actualKey = key.substr(0, match.index);\n nr = Number(match[2] || match[3]) || 0;\n\n if (!response.params[actualKey] || typeof response.params[actualKey] !== 'object') {\n response.params[actualKey] = {\n charset: false,\n values: []\n };\n }\n\n value = response.params[key];\n\n if (nr === 0 && match[0].substr(-1) === '*' && (match = value.match(/^([^']*)'[^']*'(.*)$/))) {\n response.params[actualKey].charset = match[1] || 'iso-8859-1';\n value = match[2];\n }\n\n response.params[actualKey].values[nr] = value;\n\n // remove the old reference\n delete response.params[key];\n }\n });\n\n // concatenate split rfc2231 strings and convert encoded strings to mime encoded words\n Object.keys(response.params).forEach(key => {\n let value;\n if (response.params[key] && Array.isArray(response.params[key].values)) {\n value = response.params[key].values.map(val => val || '').join('');\n\n if (response.params[key].charset) {\n // convert \"%AB\" to \"=?charset?Q?=AB?=\"\n response.params[key] =\n '=?' +\n response.params[key].charset +\n '?Q?' +\n value\n // fix invalidly encoded chars\n .replace(/[=?_\\s]/g, s => {\n let c = s.charCodeAt(0).toString(16);\n if (s === ' ') {\n return '_';\n } else {\n return '%' + (c.length < 2 ? '0' : '') + c;\n }\n })\n // change from urlencoding to percent encoding\n .replace(/%/g, '=') +\n '?=';\n } else {\n response.params[key] = value;\n }\n }\n });\n\n return response;\n },\n\n /**\n * Returns file extension for a content type string. If no suitable extensions\n * are found, 'bin' is used as the default extension\n *\n * @param {String} mimeType Content type to be checked for\n * @return {String} File extension\n */\n detectExtension: mimeType => mimeTypes.detectExtension(mimeType),\n\n /**\n * Returns content type for a file extension. If no suitable content types\n * are found, 'application/octet-stream' is used as the default content type\n *\n * @param {String} extension Extension to be checked for\n * @return {String} File extension\n */\n detectMimeType: extension => mimeTypes.detectMimeType(extension),\n\n /**\n * Folds long lines, useful for folding header lines (afterSpace=false) and\n * flowed text (afterSpace=true)\n *\n * @param {String} str String to be folded\n * @param {Number} [lineLength=76] Maximum length of a line\n * @param {Boolean} afterSpace If true, leave a space in th end of a line\n * @return {String} String with folded lines\n */\n foldLines(str, lineLength, afterSpace) {\n str = (str || '').toString();\n lineLength = lineLength || 76;\n\n let pos = 0,\n len = str.length,\n result = '',\n line,\n match;\n\n while (pos < len) {\n line = str.substr(pos, lineLength);\n if (line.length < lineLength) {\n result += line;\n break;\n }\n if ((match = line.match(/^[^\\n\\r]*(\\r?\\n|\\r)/))) {\n line = match[0];\n result += line;\n pos += line.length;\n continue;\n } else if ((match = line.match(/(\\s+)[^\\s]*$/)) && match[0].length - (afterSpace ? (match[1] || '').length : 0) < line.length) {\n line = line.substr(0, line.length - (match[0].length - (afterSpace ? (match[1] || '').length : 0)));\n } else if ((match = str.substr(pos + line.length).match(/^[^\\s]+(\\s*)/))) {\n line = line + match[0].substr(0, match[0].length - (!afterSpace ? (match[1] || '').length : 0));\n }\n\n result += line;\n pos += line.length;\n if (pos < len) {\n result += '\\r\\n';\n }\n }\n\n return result;\n },\n\n /**\n * Splits a mime encoded string. Needed for dividing mime words into smaller chunks\n *\n * @param {String} str Mime encoded string to be split up\n * @param {Number} maxlen Maximum length of characters for one part (minimum 12)\n * @return {Array} Split string\n */\n splitMimeEncodedString: (str, maxlen) => {\n let curLine,\n match,\n chr,\n done,\n lines = [];\n\n // require at least 12 symbols to fit possible 4 octet UTF-8 sequences\n maxlen = Math.max(maxlen || 0, 12);\n\n while (str.length) {\n curLine = str.substr(0, maxlen);\n\n // move incomplete escaped char back to main\n if ((match = curLine.match(/[=][0-9A-F]?$/i))) {\n curLine = curLine.substr(0, match.index);\n }\n\n done = false;\n while (!done) {\n done = true;\n // check if not middle of a unicode char sequence\n if ((match = str.substr(curLine.length).match(/^[=]([0-9A-F]{2})/i))) {\n chr = parseInt(match[1], 16);\n // invalid sequence, move one char back anc recheck\n if (chr < 0xc2 && chr > 0x7f) {\n curLine = curLine.substr(0, curLine.length - 3);\n done = false;\n }\n }\n }\n\n if (curLine.length) {\n lines.push(curLine);\n }\n str = str.substr(curLine.length);\n }\n\n return lines;\n },\n\n encodeURICharComponent: chr => {\n let res = '';\n let ord = chr.charCodeAt(0).toString(16).toUpperCase();\n\n if (ord.length % 2) {\n ord = '0' + ord;\n }\n\n if (ord.length > 2) {\n for (let i = 0, len = ord.length / 2; i < len; i++) {\n res += '%' + ord.substr(i, 2);\n }\n } else {\n res += '%' + ord;\n }\n\n return res;\n },\n\n safeEncodeURIComponent(str) {\n str = (str || '').toString();\n\n try {\n // might throw if we try to encode invalid sequences, eg. partial emoji\n str = encodeURIComponent(str);\n } catch (_E) {\n // should never run\n return str.replace(/[^\\x00-\\x1F *'()<>@,;:\\\\\"[\\]?=\\u007F-\\uFFFF]+/g, '');\n }\n\n // ensure chars that are not handled by encodeURICompent are converted as well\n return str.replace(/[\\x00-\\x1F *'()<>@,;:\\\\\"[\\]?=\\u007F-\\uFFFF]/g, chr => this.encodeURICharComponent(chr));\n }\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFjdGlvbi1icm93c2VyKS8uL25vZGVfbW9kdWxlcy8ucG5wbS9ub2RlbWFpbGVyQDcuMC4xMy9ub2RlX21vZHVsZXMvbm9kZW1haWxlci9saWIvbWltZS1mdW5jcy9pbmRleC5qcyIsIm1hcHBpbmdzIjoiQUFBQTs7QUFFYTs7QUFFYixlQUFlLG1CQUFPLENBQUMsc0hBQVc7QUFDbEMsV0FBVyxtQkFBTyxDQUFDLDhHQUFPO0FBQzFCLGtCQUFrQixtQkFBTyxDQUFDLGtJQUFjOztBQUV4QztBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsUUFBUTtBQUN2QixpQkFBaUIsU0FBUztBQUMxQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLFFBQVE7QUFDdkIsaUJBQWlCLFNBQVM7QUFDMUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOEJBQThCLDBCQUEwQjtBQUN4RCxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBLGVBQWUsZUFBZTtBQUM5QixlQUFlLFFBQVE7QUFDdkIsZUFBZSxRQUFRO0FBQ3ZCLGdCQUFnQixRQUFRO0FBQ3hCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0EsYUFBYTtBQUNiLFVBQVU7QUFDVjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBLHlEQUF5RCxTQUFTO0FBQ2xFOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTs7QUFFQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0EsZUFBZSxRQUFRO0FBQ3ZCLGVBQWUsUUFBUTtBQUN2QixlQUFlLFFBQVE7QUFDdkIsZUFBZSxTQUFTO0FBQ3hCLGdCQUFnQixRQUFRO0FBQ3hCO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEtBQUs7O0FBRUw7QUFDQSxxREFBcUQsZUFBZTtBQUNwRTtBQUNBO0FBQ0EsZUFBZSxRQUFRO0FBQ3ZCLGdCQUFnQixRQUFRO0FBQ3hCO0FBQ0E7QUFDQTs7QUFFQSwyQ0FBMkM7QUFDM0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlDQUFpQztBQUNqQztBQUNBLHNCQUFzQjtBQUN0QjtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCLGNBQWMsa0JBQWtCO0FBQ2hDO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQSxTQUFTOztBQUVULDJEQUEyRCx3QkFBd0I7QUFDbkYsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsZUFBZTtBQUM5QixlQUFlLFFBQVE7QUFDdkIsZUFBZSxRQUFRO0FBQ3ZCLGdCQUFnQixPQUFPO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLDBEQUEwRCxrQkFBa0I7QUFDNUU7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBLGFBQWE7O0FBRWI7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBLHFEQUFxRCxTQUFTO0FBQzlEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQjtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxpREFBaUQsU0FBUztBQUMxRDs7QUFFQTtBQUNBO0FBQ0Esa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkJBQTZCO0FBQzdCO0FBQ0E7QUFDQSwwQkFBMEI7QUFDMUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQjtBQUN0QjtBQUNBO0FBQ0Esa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBOztBQUVBO0FBQ0EsK0JBQStCLEtBQUssRUFBRSxLQUFLO0FBQzNDLGlDQUFpQyxLQUFLLEVBQUU7QUFDeEM7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxREFBcUQ7QUFDckQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLFFBQVE7QUFDdkIsZ0JBQWdCLFFBQVE7QUFDeEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLDBDQUEwQyxTQUFTO0FBQ25EO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0Esa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQSxrQkFBa0I7QUFDbEI7QUFDQSxrQkFBa0I7QUFDbEI7QUFDQSxrQkFBa0IsNkJBQTZCO0FBQy9DO0FBQ0E7QUFDQSxzQkFBc0I7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0I7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0NBQWtDO0FBQ2xDO0FBQ0E7QUFDQSw2QkFBNkI7QUFDN0I7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxRQUFRO0FBQ3ZCLGdCQUFnQixRQUFRO0FBQ3hCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLFFBQVE7QUFDdkIsZ0JBQWdCLFFBQVE7QUFDeEI7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsUUFBUTtBQUN2QixlQUFlLFFBQVE7QUFDdkIsZUFBZSxTQUFTO0FBQ3hCLGdCQUFnQixRQUFRO0FBQ3hCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBLGNBQWM7QUFDZDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0EsZUFBZSxRQUFRO0FBQ3ZCLGVBQWUsUUFBUTtBQUN2QixnQkFBZ0IsT0FBTztBQUN2QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2RUFBNkUsRUFBRTtBQUMvRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxrREFBa0QsU0FBUztBQUMzRDtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7O0FBRUE7QUFDQSxLQUFLOztBQUVMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0EscURBQXFEO0FBQ3JEOztBQUVBO0FBQ0EsZ0RBQWdEO0FBQ2hEO0FBQ0EiLCJzb3VyY2VzIjpbIi9Vc2Vycy9tYXJjbWludGVsL1Byb2plY3RzL2UtdGliLmNvbS9ub2RlX21vZHVsZXMvLnBucG0vbm9kZW1haWxlckA3LjAuMTMvbm9kZV9tb2R1bGVzL25vZGVtYWlsZXIvbGliL21pbWUtZnVuY3MvaW5kZXguanMiXSwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50IG5vLWNvbnRyb2wtcmVnZXg6MCAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbmNvbnN0IGJhc2U2NCA9IHJlcXVpcmUoJy4uL2Jhc2U2NCcpO1xuY29uc3QgcXAgPSByZXF1aXJlKCcuLi9xcCcpO1xuY29uc3QgbWltZVR5cGVzID0gcmVxdWlyZSgnLi9taW1lLXR5cGVzJyk7XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBhIHZhbHVlIGlzIHBsYWludGV4dCBzdHJpbmcgKHVzZXMgb25seSBwcmludGFibGUgN2JpdCBjaGFycylcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSB2YWx1ZSBTdHJpbmcgdG8gYmUgdGVzdGVkXG4gICAgICogQHJldHVybnMge0Jvb2xlYW59IHRydWUgaWYgaXQgaXMgYSBwbGFpbnRleHQgc3RyaW5nXG4gICAgICovXG4gICAgaXNQbGFpblRleHQodmFsdWUsIGlzUGFyYW0pIHtcbiAgICAgICAgY29uc3QgcmUgPSBpc1BhcmFtID8gL1tcXHgwMC1cXHgwOFxceDBiXFx4MGNcXHgwZS1cXHgxZlwiXFx1MDA4MC1cXHVGRkZGXS8gOiAvW1xceDAwLVxceDA4XFx4MGJcXHgwY1xceDBlLVxceDFmXFx1MDA4MC1cXHVGRkZGXS87XG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgIT09ICdzdHJpbmcnIHx8IHJlLnRlc3QodmFsdWUpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYSBtdWx0aSBsaW5lIHN0cmluZyBjb250YWluZXMgbGluZXMgbG9uZ2VyIHRoYW4gdGhlIHNlbGVjdGVkIHZhbHVlLlxuICAgICAqXG4gICAgICogVXNlZnVsIHdoZW4gZGV0ZWN0aW5nIGlmIGEgbWFpbCBtZXNzYWdlIG5lZWRzIGFueSBwcm9jZXNzaW5nIGF0IGFsbCDigJNcbiAgICAgKiBpZiBvbmx5IHBsYWludGV4dCBjaGFyYWN0ZXJzIGFyZSB1c2VkIGFuZCBsaW5lcyBhcmUgc2hvcnQsIHRoZW4gdGhlcmUgaXNcbiAgICAgKiBubyBuZWVkIHRvIGVuY29kZSB0aGUgdmFsdWVzIGluIGFueSB3YXkuIElmIHRoZSB2YWx1ZSBpcyBwbGFpbnRleHQgYnV0IGhhc1xuICAgICAqIGxvbmdlciBsaW5lcyB0aGVuIGFsbG93ZWQsIHRoZW4gdXNlIGZvcm1hdD1mbG93ZWRcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBsaW5lTGVuZ3RoIE1heCBsaW5lIGxlbmd0aCB0byBjaGVjayBmb3JcbiAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gUmV0dXJucyB0cnVlIGlmIHRoZXJlIGlzIGF0IGxlYXN0IG9uZSBsaW5lIGxvbmdlciB0aGFuIGxpbmVMZW5ndGggY2hhcnNcbiAgICAgKi9cbiAgICBoYXNMb25nZXJMaW5lcyhzdHIsIGxpbmVMZW5ndGgpIHtcbiAgICAgICAgaWYgKHN0ci5sZW5ndGggPiAxMjggKiAxMDI0KSB7XG4gICAgICAgICAgICAvLyBkbyBub3QgdGVzdCBzdHJpbmdzIGxvbmdlciB0aGFuIDEyOGtCXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IFJlZ0V4cCgnXi57JyArIChsaW5lTGVuZ3RoICsgMSkgKyAnLH0nLCAnbScpLnRlc3Qoc3RyKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogRW5jb2RlcyBhIHN0cmluZyBvciBhbiBCdWZmZXIgdG8gYW4gVVRGLTggTUlNRSBXb3JkIChyZmMyMDQ3KVxuICAgICAqXG4gICAgICogQHBhcmFtIHtTdHJpbmd8QnVmZmVyfSBkYXRhIFN0cmluZyB0byBiZSBlbmNvZGVkXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IG1pbWVXb3JkRW5jb2Rpbmc9J1EnIEVuY29kaW5nIGZvciB0aGUgbWltZSB3b3JkLCBlaXRoZXIgUSBvciBCXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IFttYXhMZW5ndGg9MF0gSWYgc2V0LCBzcGxpdCBtaW1lIHdvcmRzIGludG8gc2V2ZXJhbCBjaHVua3MgaWYgbmVlZGVkXG4gICAgICogQHJldHVybiB7U3RyaW5nfSBTaW5nbGUgb3Igc2V2ZXJhbCBtaW1lIHdvcmRzIGpvaW5lZCB0b2dldGhlclxuICAgICAqL1xuICAgIGVuY29kZVdvcmQoZGF0YSwgbWltZVdvcmRFbmNvZGluZywgbWF4TGVuZ3RoKSB7XG4gICAgICAgIG1pbWVXb3JkRW5jb2RpbmcgPSAobWltZVdvcmRFbmNvZGluZyB8fCAnUScpLnRvU3RyaW5nKCkudG9VcHBlckNhc2UoKS50cmltKCkuY2hhckF0KDApO1xuICAgICAgICBtYXhMZW5ndGggPSBtYXhMZW5ndGggfHwgMDtcblxuICAgICAgICBsZXQgZW5jb2RlZFN0cjtcbiAgICAgICAgbGV0IHRvQ2hhcnNldCA9ICdVVEYtOCc7XG5cbiAgICAgICAgaWYgKG1heExlbmd0aCAmJiBtYXhMZW5ndGggPiA3ICsgdG9DaGFyc2V0Lmxlbmd0aCkge1xuICAgICAgICAgICAgbWF4TGVuZ3RoIC09IDcgKyB0b0NoYXJzZXQubGVuZ3RoO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG1pbWVXb3JkRW5jb2RpbmcgPT09ICdRJykge1xuICAgICAgICAgICAgLy8gaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzIwNDcjc2VjdGlvbi01IHJ1bGUgKDMpXG4gICAgICAgICAgICBlbmNvZGVkU3RyID0gcXAuZW5jb2RlKGRhdGEpLnJlcGxhY2UoL1teYS16MC05ISorXFwtLz1dL2dpLCBjaHIgPT4ge1xuICAgICAgICAgICAgICAgIGxldCBvcmQgPSBjaHIuY2hhckNvZGVBdCgwKS50b1N0cmluZygxNikudG9VcHBlckNhc2UoKTtcbiAgICAgICAgICAgICAgICBpZiAoY2hyID09PSAnICcpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdfJztcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gJz0nICsgKG9yZC5sZW5ndGggPT09IDEgPyAnMCcgKyBvcmQgOiBvcmQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKG1pbWVXb3JkRW5jb2RpbmcgPT09ICdCJykge1xuICAgICAgICAgICAgZW5jb2RlZFN0ciA9IHR5cGVvZiBkYXRhID09PSAnc3RyaW5nJyA/IGRhdGEgOiBiYXNlNjQuZW5jb2RlKGRhdGEpO1xuICAgICAgICAgICAgbWF4TGVuZ3RoID0gbWF4TGVuZ3RoID8gTWF0aC5tYXgoMywgKChtYXhMZW5ndGggLSAobWF4TGVuZ3RoICUgNCkpIC8gNCkgKiAzKSA6IDA7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobWF4TGVuZ3RoICYmIChtaW1lV29yZEVuY29kaW5nICE9PSAnQicgPyBlbmNvZGVkU3RyIDogYmFzZTY0LmVuY29kZShkYXRhKSkubGVuZ3RoID4gbWF4TGVuZ3RoKSB7XG4gICAgICAgICAgICBpZiAobWltZVdvcmRFbmNvZGluZyA9PT0gJ1EnKSB7XG4gICAgICAgICAgICAgICAgZW5jb2RlZFN0ciA9IHRoaXMuc3BsaXRNaW1lRW5jb2RlZFN0cmluZyhlbmNvZGVkU3RyLCBtYXhMZW5ndGgpLmpvaW4oJz89ID0/JyArIHRvQ2hhcnNldCArICc/JyArIG1pbWVXb3JkRW5jb2RpbmcgKyAnPycpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBSRkMyMDQ3IDYuMyAoMikgc3RhdGVzIHRoYXQgZW5jb2RlZC13b3JkIG11c3QgaW5jbHVkZSBhbiBpbnRlZ3JhbCBudW1iZXIgb2YgY2hhcmFjdGVycywgc28gbm8gY2hvcHBpbmcgdW5pY29kZSBzZXF1ZW5jZXNcbiAgICAgICAgICAgICAgICBsZXQgcGFydHMgPSBbXTtcbiAgICAgICAgICAgICAgICBsZXQgbHBhcnQgPSAnJztcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMCwgbGVuID0gZW5jb2RlZFN0ci5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBsZXQgY2hyID0gZW5jb2RlZFN0ci5jaGFyQXQoaSk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKC9bXFx1ZDgzY1xcdWQ4M2RcXHVkODNlXS8udGVzdChjaHIpICYmIGkgPCBsZW4gLSAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjb21wb3NpdGUgZW1vamkgYnl0ZSwgc28gYWRkIHRoZSBuZXh0IGJ5dGUgYXMgd2VsbFxuICAgICAgICAgICAgICAgICAgICAgICAgY2hyICs9IGVuY29kZWRTdHIuY2hhckF0KCsraSk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAvLyBjaGVjayBpZiB3ZSBjYW4gYWRkIHRoaXMgY2hhcmFjdGVyIHRvIHRoZSBleGlzdGluZyBzdHJpbmdcbiAgICAgICAgICAgICAgICAgICAgLy8gd2l0aG91dCBicmVha2luZyBieXRlIGxlbmd0aCBsaW1pdFxuICAgICAgICAgICAgICAgICAgICBpZiAoQnVmZmVyLmJ5dGVMZW5ndGgobHBhcnQgKyBjaHIpIDw9IG1heExlbmd0aCB8fCBpID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBscGFydCArPSBjaHI7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSBoaXQgdGhlIGxlbmd0aCBsaW1pdCwgc28gcHVzaCB0aGUgZXhpc3Rpbmcgc3RyaW5nIGFuZCBzdGFydCBvdmVyXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJ0cy5wdXNoKGJhc2U2NC5lbmNvZGUobHBhcnQpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxwYXJ0ID0gY2hyO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChscGFydCkge1xuICAgICAgICAgICAgICAgICAgICBwYXJ0cy5wdXNoKGJhc2U2NC5lbmNvZGUobHBhcnQpKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAocGFydHMubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgICAgICAgICBlbmNvZGVkU3RyID0gcGFydHMuam9pbignPz0gPT8nICsgdG9DaGFyc2V0ICsgJz8nICsgbWltZVdvcmRFbmNvZGluZyArICc/Jyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgZW5jb2RlZFN0ciA9IHBhcnRzLmpvaW4oJycpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChtaW1lV29yZEVuY29kaW5nID09PSAnQicpIHtcbiAgICAgICAgICAgIGVuY29kZWRTdHIgPSBiYXNlNjQuZW5jb2RlKGRhdGEpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuICc9PycgKyB0b0NoYXJzZXQgKyAnPycgKyBtaW1lV29yZEVuY29kaW5nICsgJz8nICsgZW5jb2RlZFN0ciArIChlbmNvZGVkU3RyLnN1YnN0cigtMikgPT09ICc/PScgPyAnJyA6ICc/PScpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBGaW5kcyB3b3JkIHNlcXVlbmNlcyB3aXRoIG5vbiBhc2NpaSB0ZXh0IGFuZCBjb252ZXJ0cyB0aGVzZSB0byBtaW1lIHdvcmRzXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gdmFsdWUgU3RyaW5nIHRvIGJlIGVuY29kZWRcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gbWltZVdvcmRFbmNvZGluZz0nUScgRW5jb2RpbmcgZm9yIHRoZSBtaW1lIHdvcmQsIGVpdGhlciBRIG9yIEJcbiAgICAgKiBAcGFyYW0ge051bWJlcn0gW21heExlbmd0aD0wXSBJZiBzZXQsIHNwbGl0IG1pbWUgd29yZHMgaW50byBzZXZlcmFsIGNodW5rcyBpZiBuZWVkZWRcbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtlbmNvZGVBbGw9ZmFsc2VdIElmIHRydWUgYW5kIHRoZSB2YWx1ZSBuZWVkcyBlbmNvZGluZyB0aGVuIGVuY29kZXMgZW50aXJlIHN0cmluZywgbm90IGp1c3QgdGhlIHNtYWxsZXN0IG1hdGNoXG4gICAgICogQHJldHVybiB7U3RyaW5nfSBTdHJpbmcgd2l0aCBwb3NzaWJsZSBtaW1lIHdvcmRzXG4gICAgICovXG4gICAgZW5jb2RlV29yZHModmFsdWUsIG1pbWVXb3JkRW5jb2RpbmcsIG1heExlbmd0aCwgZW5jb2RlQWxsKSB7XG4gICAgICAgIG1heExlbmd0aCA9IG1heExlbmd0aCB8fCAwO1xuXG4gICAgICAgIGxldCBlbmNvZGVkVmFsdWU7XG5cbiAgICAgICAgLy8gZmluZCBmaXJzdCB3b3JkIHdpdGggYSBub24tcHJpbnRhYmxlIGFzY2lpIG9yIHNwZWNpYWwgc3ltYm9sIGluIGl0XG4gICAgICAgIGxldCBmaXJzdE1hdGNoID0gdmFsdWUubWF0Y2goLyg/Ol58XFxzKShbXlxcc10qW1wiXFx1MDA4MC1cXHVGRkZGXSkvKTtcbiAgICAgICAgaWYgKCFmaXJzdE1hdGNoKSB7XG4gICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZW5jb2RlQWxsKSB7XG4gICAgICAgICAgICAvLyBpZiBpdCBpcyByZXF1ZXN0ZWQgdG8gZW5jb2RlIGV2ZXJ5dGhpbmcgb3IgdGhlIHN0cmluZyBjb250YWlucyBzb21ldGhpbmcgdGhhdCByZXNlYmxlcyBlbmNvZGVkIHdvcmQsIHRoZW4gZW5jb2RlIGV2ZXJ5dGhpbmdcblxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZW5jb2RlV29yZCh2YWx1ZSwgbWltZVdvcmRFbmNvZGluZywgbWF4TGVuZ3RoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGZpbmQgdGhlIGxhc3Qgd29yZCB3aXRoIGEgbm9uLXByaW50YWJsZSBhc2NpaSBpbiBpdFxuICAgICAgICBsZXQgbGFzdE1hdGNoID0gdmFsdWUubWF0Y2goLyhbXCJcXHUwMDgwLVxcdUZGRkZdW15cXHNdKilbXlwiXFx1MDA4MC1cXHVGRkZGXSokLyk7XG4gICAgICAgIGlmICghbGFzdE1hdGNoKSB7XG4gICAgICAgICAgICAvLyBzaG91bGQgbm90IGhhcHBlblxuICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHN0YXJ0SW5kZXggPVxuICAgICAgICAgICAgZmlyc3RNYXRjaC5pbmRleCArXG4gICAgICAgICAgICAoXG4gICAgICAgICAgICAgICAgZmlyc3RNYXRjaFswXS5tYXRjaCgvW15cXHNdLykgfHwge1xuICAgICAgICAgICAgICAgICAgICBpbmRleDogMFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICkuaW5kZXg7XG4gICAgICAgIGxldCBlbmRJbmRleCA9IGxhc3RNYXRjaC5pbmRleCArIChsYXN0TWF0Y2hbMV0gfHwgJycpLmxlbmd0aDtcblxuICAgICAgICBlbmNvZGVkVmFsdWUgPVxuICAgICAgICAgICAgKHN0YXJ0SW5kZXggPyB2YWx1ZS5zdWJzdHIoMCwgc3RhcnRJbmRleCkgOiAnJykgK1xuICAgICAgICAgICAgdGhpcy5lbmNvZGVXb3JkKHZhbHVlLnN1YnN0cmluZyhzdGFydEluZGV4LCBlbmRJbmRleCksIG1pbWVXb3JkRW5jb2RpbmcgfHwgJ1EnLCBtYXhMZW5ndGgpICtcbiAgICAgICAgICAgIChlbmRJbmRleCA8IHZhbHVlLmxlbmd0aCA/IHZhbHVlLnN1YnN0cihlbmRJbmRleCkgOiAnJyk7XG5cbiAgICAgICAgcmV0dXJuIGVuY29kZWRWYWx1ZTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogSm9pbnMgcGFyc2VkIGhlYWRlciB2YWx1ZSB0b2dldGhlciBhcyAndmFsdWU7IHBhcmFtMT12YWx1ZTE7IHBhcmFtMj12YWx1ZTInXG4gICAgICogUFM6IFdlIGFyZSBmb2xsb3dpbmcgUkZDIDgyMiBmb3IgdGhlIGxpc3Qgb2Ygc3BlY2lhbCBjaGFyYWN0ZXJzIHRoYXQgd2UgbmVlZCB0byBrZWVwIGluIHF1b3Rlcy5cbiAgICAgKiAgICAgIFJlZmVyOiBodHRwczovL3d3dy53My5vcmcvUHJvdG9jb2xzL3JmYzEzNDEvNF9Db250ZW50LVR5cGUuaHRtbFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBzdHJ1Y3R1cmVkIFBhcnNlZCBoZWFkZXIgdmFsdWVcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9IGpvaW5lZCBoZWFkZXIgdmFsdWVcbiAgICAgKi9cbiAgICBidWlsZEhlYWRlclZhbHVlKHN0cnVjdHVyZWQpIHtcbiAgICAgICAgbGV0IHBhcmFtc0FycmF5ID0gW107XG5cbiAgICAgICAgT2JqZWN0LmtleXMoc3RydWN0dXJlZC5wYXJhbXMgfHwge30pLmZvckVhY2gocGFyYW0gPT4ge1xuICAgICAgICAgICAgLy8gZmlsZW5hbWUgbWlnaHQgaW5jbHVkZSB1bmljb2RlIGNoYXJhY3RlcnMgc28gaXQgaXMgYSBzcGVjaWFsIGNhc2VcbiAgICAgICAgICAgIC8vIG90aGVyIHZhbHVlcyBwcm9iYWJseSBkbyBub3RcbiAgICAgICAgICAgIGxldCB2YWx1ZSA9IHN0cnVjdHVyZWQucGFyYW1zW3BhcmFtXTtcbiAgICAgICAgICAgIGlmICghdGhpcy5pc1BsYWluVGV4dCh2YWx1ZSwgdHJ1ZSkgfHwgdmFsdWUubGVuZ3RoID49IDc1KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5idWlsZEhlYWRlclBhcmFtKHBhcmFtLCB2YWx1ZSwgNTApLmZvckVhY2goZW5jb2RlZFBhcmFtID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCEvW1xcc1wiXFxcXDs6Lz0oKSw8PkBbXFxdP118XlstJ118JyQvLnRlc3QoZW5jb2RlZFBhcmFtLnZhbHVlKSB8fCBlbmNvZGVkUGFyYW0ua2V5LnN1YnN0cigtMSkgPT09ICcqJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zQXJyYXkucHVzaChlbmNvZGVkUGFyYW0ua2V5ICsgJz0nICsgZW5jb2RlZFBhcmFtLnZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtc0FycmF5LnB1c2goZW5jb2RlZFBhcmFtLmtleSArICc9JyArIEpTT04uc3RyaW5naWZ5KGVuY29kZWRQYXJhbS52YWx1ZSkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKC9bXFxzJ1wiXFxcXDs6Lz0oKSw8PkBbXFxdP118Xi0vLnRlc3QodmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgcGFyYW1zQXJyYXkucHVzaChwYXJhbSArICc9JyArIEpTT04uc3RyaW5naWZ5KHZhbHVlKSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHBhcmFtc0FycmF5LnB1c2gocGFyYW0gKyAnPScgKyB2YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBzdHJ1Y3R1cmVkLnZhbHVlICsgKHBhcmFtc0FycmF5Lmxlbmd0aCA/ICc7ICcgKyBwYXJhbXNBcnJheS5qb2luKCc7ICcpIDogJycpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBFbmNvZGVzIGEgc3RyaW5nIG9yIGFuIEJ1ZmZlciB0byBhbiBVVEYtOCBQYXJhbWV0ZXIgVmFsdWUgQ29udGludWF0aW9uIGVuY29kaW5nIChyZmMyMjMxKVxuICAgICAqIFVzZWZ1bCBmb3Igc3BsaXR0aW5nIGxvbmcgcGFyYW1ldGVyIHZhbHVlcy5cbiAgICAgKlxuICAgICAqIEZvciBleGFtcGxlXG4gICAgICogICAgICB0aXRsZT1cInVuaWNvZGUgc3RyaW5nXCJcbiAgICAgKiBiZWNvbWVzXG4gICAgICogICAgIHRpdGxlKjAqPXV0Zi04Jyd1bmljb2RlXG4gICAgICogICAgIHRpdGxlKjEqPSUyMHN0cmluZ1xuICAgICAqXG4gICAgICogQHBhcmFtIHtTdHJpbmd8QnVmZmVyfSBkYXRhIFN0cmluZyB0byBiZSBlbmNvZGVkXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IFttYXhMZW5ndGg9NTBdIE1heCBsZW5ndGggZm9yIGdlbmVyYXRlZCBjaHVua3NcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gW2Zyb21DaGFyc2V0PSdVVEYtOCddIFNvdXJjZSBzaGFyYWN0ZXIgc2V0XG4gICAgICogQHJldHVybiB7QXJyYXl9IEEgbGlzdCBvZiBlbmNvZGVkIGtleXMgYW5kIGhlYWRlcnNcbiAgICAgKi9cbiAgICBidWlsZEhlYWRlclBhcmFtKGtleSwgZGF0YSwgbWF4TGVuZ3RoKSB7XG4gICAgICAgIGxldCBsaXN0ID0gW107XG4gICAgICAgIGxldCBlbmNvZGVkU3RyID0gdHlwZW9mIGRhdGEgPT09ICdzdHJpbmcnID8gZGF0YSA6IChkYXRhIHx8ICcnKS50b1N0cmluZygpO1xuICAgICAgICBsZXQgZW5jb2RlZFN0ckFycjtcbiAgICAgICAgbGV0IGNociwgb3JkO1xuICAgICAgICBsZXQgbGluZTtcbiAgICAgICAgbGV0IHN0YXJ0UG9zID0gMDtcbiAgICAgICAgbGV0IGksIGxlbjtcblxuICAgICAgICBtYXhMZW5ndGggPSBtYXhMZW5ndGggfHwgNTA7XG5cbiAgICAgICAgLy8gcHJvY2VzcyBhc2NpaSBvbmx5IHRleHRcbiAgICAgICAgaWYgKHRoaXMuaXNQbGFpblRleHQoZGF0YSwgdHJ1ZSkpIHtcbiAgICAgICAgICAgIC8vIGNoZWNrIGlmIGNvbnZlcnNpb24gaXMgZXZlbiBuZWVkZWRcbiAgICAgICAgICAgIGlmIChlbmNvZGVkU3RyLmxlbmd0aCA8PSBtYXhMZW5ndGgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBrZXksXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogZW5jb2RlZFN0clxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZW5jb2RlZFN0ciA9IGVuY29kZWRTdHIucmVwbGFjZShuZXcgUmVnRXhwKCcueycgKyBtYXhMZW5ndGggKyAnfScsICdnJyksIHN0ciA9PiB7XG4gICAgICAgICAgICAgICAgbGlzdC5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgbGluZTogc3RyXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuICcnO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGlmIChlbmNvZGVkU3RyKSB7XG4gICAgICAgICAgICAgICAgbGlzdC5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgbGluZTogZW5jb2RlZFN0clxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKC9bXFx1RDgwMC1cXHVEQkZGXS8udGVzdChlbmNvZGVkU3RyKSkge1xuICAgICAgICAgICAgICAgIC8vIHN0cmluZyBjb250YWludHMgc3Vycm9nYXRlIHBhaXJzLCBzbyBub3JtYWxpemUgaXQgdG8gYW4gYXJyYXkgb2YgYnl0ZXNcbiAgICAgICAgICAgICAgICBlbmNvZGVkU3RyQXJyID0gW107XG4gICAgICAgICAgICAgICAgZm9yIChpID0gMCwgbGVuID0gZW5jb2RlZFN0ci5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBjaHIgPSBlbmNvZGVkU3RyLmNoYXJBdChpKTtcbiAgICAgICAgICAgICAgICAgICAgb3JkID0gY2hyLmNoYXJDb2RlQXQoMCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChvcmQgPj0gMHhkODAwICYmIG9yZCA8PSAweGRiZmYgJiYgaSA8IGxlbiAtIDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNociArPSBlbmNvZGVkU3RyLmNoYXJBdChpICsgMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGVkU3RyQXJyLnB1c2goY2hyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGkrKztcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kZWRTdHJBcnIucHVzaChjaHIpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVuY29kZWRTdHIgPSBlbmNvZGVkU3RyQXJyO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBmaXJzdCBsaW5lIGluY2x1ZGVzIHRoZSBjaGFyc2V0IGFuZCBsYW5ndWFnZSBpbmZvIGFuZCBuZWVkcyB0byBiZSBlbmNvZGVkXG4gICAgICAgICAgICAvLyBldmVuIGlmIGl0IGRvZXMgbm90IGNvbnRhaW4gYW55IHVuaWNvZGUgY2hhcmFjdGVyc1xuICAgICAgICAgICAgbGluZSA9IFwidXRmLTgnJ1wiO1xuICAgICAgICAgICAgbGV0IGVuY29kZWQgPSB0cnVlO1xuICAgICAgICAgICAgc3RhcnRQb3MgPSAwO1xuXG4gICAgICAgICAgICAvLyBwcm9jZXNzIHRleHQgd2l0aCB1bmljb2RlIG9yIHNwZWNpYWwgY2hhcnNcbiAgICAgICAgICAgIGZvciAoaSA9IDAsIGxlbiA9IGVuY29kZWRTdHIubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICAgICAgICBjaHIgPSBlbmNvZGVkU3RyW2ldO1xuXG4gICAgICAgICAgICAgICAgaWYgKGVuY29kZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgY2hyID0gdGhpcy5zYWZlRW5jb2RlVVJJQ29tcG9uZW50KGNocik7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gdHJ5IHRvIHVybGVuY29kZSBjdXJyZW50IGNoYXJcbiAgICAgICAgICAgICAgICAgICAgY2hyID0gY2hyID09PSAnICcgPyBjaHIgOiB0aGlzLnNhZmVFbmNvZGVVUklDb21wb25lbnQoY2hyKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gQnkgZGVmYXVsdCBpdCBpcyBub3QgcmVxdWlyZWQgdG8gZW5jb2RlIGEgbGluZSwgdGhlIG5lZWRcbiAgICAgICAgICAgICAgICAgICAgLy8gb25seSBhcHBlYXJzIHdoZW4gdGhlIHN0cmluZyBjb250YWlucyB1bmljb2RlIG9yIHNwZWNpYWwgY2hhcnNcbiAgICAgICAgICAgICAgICAgICAgLy8gaW4gdGhpcyBjYXNlIHdlIHN0YXJ0IHByb2Nlc3NpbmcgdGhlIGxpbmUgb3ZlciBhbmQgZW5jb2RlIGFsbCBjaGFyc1xuICAgICAgICAgICAgICAgICAgICBpZiAoY2hyICE9PSBlbmNvZGVkU3RyW2ldKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBDaGVjayBpZiBpdCBpcyBldmVuIHBvc3NpYmxlIHRvIGFkZCB0aGUgZW5jb2RlZCBjaGFyIHRvIHRoZSBsaW5lXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiBub3QsIHRoZXJlIGlzIG5vIHJlYXNvbiB0byB1c2UgdGhpcyBsaW5lLCBqdXN0IHB1c2ggaXQgdG8gdGhlIGxpc3RcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCBzdGFydCBhIG5ldyBsaW5lIHdpdGggdGhlIGNoYXIgdGhhdCBuZWVkcyBlbmNvZGluZ1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCh0aGlzLnNhZmVFbmNvZGVVUklDb21wb25lbnQobGluZSkgKyBjaHIpLmxlbmd0aCA+PSBtYXhMZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0LnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGVkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZSA9ICcnO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0UG9zID0gaSAtIDE7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkgPSBzdGFydFBvcztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lID0gJyc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBpZiB0aGUgbGluZSBpcyBhbHJlYWR5IHRvbyBsb25nLCBwdXNoIGl0IHRvIHRoZSBsaXN0IGFuZCBzdGFydCBhIG5ldyBvbmVcbiAgICAgICAgICAgICAgICBpZiAoKGxpbmUgKyBjaHIpLmxlbmd0aCA+PSBtYXhMZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgbGlzdC5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUsXG4gICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGVkXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBsaW5lID0gY2hyID0gZW5jb2RlZFN0cltpXSA9PT0gJyAnID8gJyAnIDogdGhpcy5zYWZlRW5jb2RlVVJJQ29tcG9uZW50KGVuY29kZWRTdHJbaV0pO1xuICAgICAgICAgICAgICAgICAgICBpZiAoY2hyID09PSBlbmNvZGVkU3RyW2ldKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGVkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdGFydFBvcyA9IGkgLSAxO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBsaW5lICs9IGNocjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChsaW5lKSB7XG4gICAgICAgICAgICAgICAgbGlzdC5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgbGluZSxcbiAgICAgICAgICAgICAgICAgICAgZW5jb2RlZFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGxpc3QubWFwKChpdGVtLCBpKSA9PiAoe1xuICAgICAgICAgICAgLy8gZW5jb2RlZCBsaW5lczoge25hbWV9KntwYXJ0fSpcbiAgICAgICAgICAgIC8vIHVuZW5jb2RlZCBsaW5lczoge25hbWV9KntwYXJ0fVxuICAgICAgICAgICAgLy8gaWYgYW55IGxpbmUgbmVlZHMgdG8gYmUgZW5jb2RlZCB0aGVuIHRoZSBmaXJzdCBsaW5lIChwYXJ0PT0wKSBpcyBhbHdheXMgZW5jb2RlZFxuICAgICAgICAgICAga2V5OiBrZXkgKyAnKicgKyBpICsgKGl0ZW0uZW5jb2RlZCA/ICcqJyA6ICcnKSxcbiAgICAgICAgICAgIHZhbHVlOiBpdGVtLmxpbmVcbiAgICAgICAgfSkpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBQYXJzZXMgYSBoZWFkZXIgdmFsdWUgd2l0aCBrZXk9dmFsdWUgYXJndW1lbnRzIGludG8gYSBzdHJ1Y3R1cmVkXG4gICAgICogb2JqZWN0LlxuICAgICAqXG4gICAgICogICBwYXJzZUhlYWRlclZhbHVlKCdjb250ZW50LXR5cGU6IHRleHQvcGxhaW47IENIQVJTRVQ9J1VURi04JycpIC0+XG4gICAgICogICB7XG4gICAgICogICAgICd2YWx1ZSc6ICd0ZXh0L3BsYWluJyxcbiAgICAgKiAgICAgJ3BhcmFtcyc6IHtcbiAgICAgKiAgICAgICAnY2hhcnNldCc6ICdVVEYtOCdcbiAgICAgKiAgICAgfVxuICAgICAqICAgfVxuICAgICAqXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IHN0ciBIZWFkZXIgdmFsdWVcbiAgICAgKiBAcmV0dXJuIHtPYmplY3R9IEhlYWRlciB2YWx1ZSBhcyBhIHBhcnNlZCBzdHJ1Y3R1cmVcbiAgICAgKi9cbiAgICBwYXJzZUhlYWRlclZhbHVlKHN0cikge1xuICAgICAgICBsZXQgcmVzcG9uc2UgPSB7XG4gICAgICAgICAgICB2YWx1ZTogZmFsc2UsXG4gICAgICAgICAgICBwYXJhbXM6IHt9XG4gICAgICAgIH07XG4gICAgICAgIGxldCBrZXkgPSBmYWxzZTtcbiAgICAgICAgbGV0IHZhbHVlID0gJyc7XG4gICAgICAgIGxldCB0eXBlID0gJ3ZhbHVlJztcbiAgICAgICAgbGV0IHF1b3RlID0gZmFsc2U7XG4gICAgICAgIGxldCBlc2NhcGVkID0gZmFsc2U7XG4gICAgICAgIGxldCBjaHI7XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IHN0ci5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgY2hyID0gc3RyLmNoYXJBdChpKTtcbiAgICAgICAgICAgIGlmICh0eXBlID09PSAna2V5Jykge1xuICAgICAgICAgICAgICAgIGlmIChjaHIgPT09ICc9Jykge1xuICAgICAgICAgICAgICAgICAgICBrZXkgPSB2YWx1ZS50cmltKCkudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICAgICAgdHlwZSA9ICd2YWx1ZSc7XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlID0gJyc7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YWx1ZSArPSBjaHI7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmIChlc2NhcGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlICs9IGNocjtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNociA9PT0gJ1xcXFwnKSB7XG4gICAgICAgICAgICAgICAgICAgIGVzY2FwZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHF1b3RlICYmIGNociA9PT0gcXVvdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcXVvdGUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFxdW90ZSAmJiBjaHIgPT09ICdcIicpIHtcbiAgICAgICAgICAgICAgICAgICAgcXVvdGUgPSBjaHI7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICghcXVvdGUgJiYgY2hyID09PSAnOycpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGtleSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLnZhbHVlID0gdmFsdWUudHJpbSgpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UucGFyYW1zW2tleV0gPSB2YWx1ZS50cmltKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdHlwZSA9ICdrZXknO1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9ICcnO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlICs9IGNocjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZXNjYXBlZCA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHR5cGUgPT09ICd2YWx1ZScpIHtcbiAgICAgICAgICAgIGlmIChrZXkgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2UudmFsdWUgPSB2YWx1ZS50cmltKCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlLnBhcmFtc1trZXldID0gdmFsdWUudHJpbSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHZhbHVlLnRyaW0oKSkge1xuICAgICAgICAgICAgcmVzcG9uc2UucGFyYW1zW3ZhbHVlLnRyaW0oKS50b0xvd2VyQ2FzZSgpXSA9ICcnO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gaGFuZGxlIHBhcmFtZXRlciB2YWx1ZSBjb250aW51YXRpb25zXG4gICAgICAgIC8vIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmMyMjMxI3NlY3Rpb24tM1xuXG4gICAgICAgIC8vIHByZXByb2Nlc3MgdmFsdWVzXG4gICAgICAgIE9iamVjdC5rZXlzKHJlc3BvbnNlLnBhcmFtcykuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICAgICAgbGV0IGFjdHVhbEtleSwgbnIsIG1hdGNoLCB2YWx1ZTtcbiAgICAgICAgICAgIGlmICgobWF0Y2ggPSBrZXkubWF0Y2goLyhcXCooXFxkKyl8XFwqKFxcZCspXFwqfFxcKikkLykpKSB7XG4gICAgICAgICAgICAgICAgYWN0dWFsS2V5ID0ga2V5LnN1YnN0cigwLCBtYXRjaC5pbmRleCk7XG4gICAgICAgICAgICAgICAgbnIgPSBOdW1iZXIobWF0Y2hbMl0gfHwgbWF0Y2hbM10pIHx8IDA7XG5cbiAgICAgICAgICAgICAgICBpZiAoIXJlc3BvbnNlLnBhcmFtc1thY3R1YWxLZXldIHx8IHR5cGVvZiByZXNwb25zZS5wYXJhbXNbYWN0dWFsS2V5XSAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UucGFyYW1zW2FjdHVhbEtleV0gPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjaGFyc2V0OiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlczogW11cbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB2YWx1ZSA9IHJlc3BvbnNlLnBhcmFtc1trZXldO1xuXG4gICAgICAgICAgICAgICAgaWYgKG5yID09PSAwICYmIG1hdGNoWzBdLnN1YnN0cigtMSkgPT09ICcqJyAmJiAobWF0Y2ggPSB2YWx1ZS5tYXRjaCgvXihbXiddKiknW14nXSonKC4qKSQvKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UucGFyYW1zW2FjdHVhbEtleV0uY2hhcnNldCA9IG1hdGNoWzFdIHx8ICdpc28tODg1OS0xJztcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBtYXRjaFsyXTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZXNwb25zZS5wYXJhbXNbYWN0dWFsS2V5XS52YWx1ZXNbbnJdID0gdmFsdWU7XG5cbiAgICAgICAgICAgICAgICAvLyByZW1vdmUgdGhlIG9sZCByZWZlcmVuY2VcbiAgICAgICAgICAgICAgICBkZWxldGUgcmVzcG9uc2UucGFyYW1zW2tleV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIGNvbmNhdGVuYXRlIHNwbGl0IHJmYzIyMzEgc3RyaW5ncyBhbmQgY29udmVydCBlbmNvZGVkIHN0cmluZ3MgdG8gbWltZSBlbmNvZGVkIHdvcmRzXG4gICAgICAgIE9iamVjdC5rZXlzKHJlc3BvbnNlLnBhcmFtcykuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICAgICAgbGV0IHZhbHVlO1xuICAgICAgICAgICAgaWYgKHJlc3BvbnNlLnBhcmFtc1trZXldICYmIEFycmF5LmlzQXJyYXkocmVzcG9uc2UucGFyYW1zW2tleV0udmFsdWVzKSkge1xuICAgICAgICAgICAgICAgIHZhbHVlID0gcmVzcG9uc2UucGFyYW1zW2tleV0udmFsdWVzLm1hcCh2YWwgPT4gdmFsIHx8ICcnKS5qb2luKCcnKTtcblxuICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZS5wYXJhbXNba2V5XS5jaGFyc2V0KSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGNvbnZlcnQgXCIlQUJcIiB0byBcIj0/Y2hhcnNldD9RPz1BQj89XCJcbiAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UucGFyYW1zW2tleV0gPVxuICAgICAgICAgICAgICAgICAgICAgICAgJz0/JyArXG4gICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5wYXJhbXNba2V5XS5jaGFyc2V0ICtcbiAgICAgICAgICAgICAgICAgICAgICAgICc/UT8nICtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZml4IGludmFsaWRseSBlbmNvZGVkIGNoYXJzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoL1s9P19cXHNdL2csIHMgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgYyA9IHMuY2hhckNvZGVBdCgwKS50b1N0cmluZygxNik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzID09PSAnICcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnXyc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJyUnICsgKGMubGVuZ3RoIDwgMiA/ICcwJyA6ICcnKSArIGM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNoYW5nZSBmcm9tIHVybGVuY29kaW5nIHRvIHBlcmNlbnQgZW5jb2RpbmdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAucmVwbGFjZSgvJS9nLCAnPScpICtcbiAgICAgICAgICAgICAgICAgICAgICAgICc/PSc7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UucGFyYW1zW2tleV0gPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiByZXNwb25zZTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBmaWxlIGV4dGVuc2lvbiBmb3IgYSBjb250ZW50IHR5cGUgc3RyaW5nLiBJZiBubyBzdWl0YWJsZSBleHRlbnNpb25zXG4gICAgICogYXJlIGZvdW5kLCAnYmluJyBpcyB1c2VkIGFzIHRoZSBkZWZhdWx0IGV4dGVuc2lvblxuICAgICAqXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IG1pbWVUeXBlIENvbnRlbnQgdHlwZSB0byBiZSBjaGVja2VkIGZvclxuICAgICAqIEByZXR1cm4ge1N0cmluZ30gRmlsZSBleHRlbnNpb25cbiAgICAgKi9cbiAgICBkZXRlY3RFeHRlbnNpb246IG1pbWVUeXBlID0+IG1pbWVUeXBlcy5kZXRlY3RFeHRlbnNpb24obWltZVR5cGUpLFxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBjb250ZW50IHR5cGUgZm9yIGEgZmlsZSBleHRlbnNpb24uIElmIG5vIHN1aXRhYmxlIGNvbnRlbnQgdHlwZXNcbiAgICAgKiBhcmUgZm91bmQsICdhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nIGlzIHVzZWQgYXMgdGhlIGRlZmF1bHQgY29udGVudCB0eXBlXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gZXh0ZW5zaW9uIEV4dGVuc2lvbiB0byBiZSBjaGVja2VkIGZvclxuICAgICAqIEByZXR1cm4ge1N0cmluZ30gRmlsZSBleHRlbnNpb25cbiAgICAgKi9cbiAgICBkZXRlY3RNaW1lVHlwZTogZXh0ZW5zaW9uID0+IG1pbWVUeXBlcy5kZXRlY3RNaW1lVHlwZShleHRlbnNpb24pLFxuXG4gICAgLyoqXG4gICAgICogRm9sZHMgbG9uZyBsaW5lcywgdXNlZnVsIGZvciBmb2xkaW5nIGhlYWRlciBsaW5lcyAoYWZ0ZXJTcGFjZT1mYWxzZSkgYW5kXG4gICAgICogZmxvd2VkIHRleHQgKGFmdGVyU3BhY2U9dHJ1ZSlcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBzdHIgU3RyaW5nIHRvIGJlIGZvbGRlZFxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBbbGluZUxlbmd0aD03Nl0gTWF4aW11bSBsZW5ndGggb2YgYSBsaW5lXG4gICAgICogQHBhcmFtIHtCb29sZWFufSBhZnRlclNwYWNlIElmIHRydWUsIGxlYXZlIGEgc3BhY2UgaW4gdGggZW5kIG9mIGEgbGluZVxuICAgICAqIEByZXR1cm4ge1N0cmluZ30gU3RyaW5nIHdpdGggZm9sZGVkIGxpbmVzXG4gICAgICovXG4gICAgZm9sZExpbmVzKHN0ciwgbGluZUxlbmd0aCwgYWZ0ZXJTcGFjZSkge1xuICAgICAgICBzdHIgPSAoc3RyIHx8ICcnKS50b1N0cmluZygpO1xuICAgICAgICBsaW5lTGVuZ3RoID0gbGluZUxlbmd0aCB8fCA3NjtcblxuICAgICAgICBsZXQgcG9zID0gMCxcbiAgICAgICAgICAgIGxlbiA9IHN0ci5sZW5ndGgsXG4gICAgICAgICAgICByZXN1bHQgPSAnJyxcbiAgICAgICAgICAgIGxpbmUsXG4gICAgICAgICAgICBtYXRjaDtcblxuICAgICAgICB3aGlsZSAocG9zIDwgbGVuKSB7XG4gICAgICAgICAgICBsaW5lID0gc3RyLnN1YnN0cihwb3MsIGxpbmVMZW5ndGgpO1xuICAgICAgICAgICAgaWYgKGxpbmUubGVuZ3RoIDwgbGluZUxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHJlc3VsdCArPSBsaW5lO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKChtYXRjaCA9IGxpbmUubWF0Y2goL15bXlxcblxccl0qKFxccj9cXG58XFxyKS8pKSkge1xuICAgICAgICAgICAgICAgIGxpbmUgPSBtYXRjaFswXTtcbiAgICAgICAgICAgICAgICByZXN1bHQgKz0gbGluZTtcbiAgICAgICAgICAgICAgICBwb3MgKz0gbGluZS5sZW5ndGg7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKChtYXRjaCA9IGxpbmUubWF0Y2goLyhcXHMrKVteXFxzXSokLykpICYmIG1hdGNoWzBdLmxlbmd0aCAtIChhZnRlclNwYWNlID8gKG1hdGNoWzFdIHx8ICcnKS5sZW5ndGggOiAwKSA8IGxpbmUubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgbGluZSA9IGxpbmUuc3Vic3RyKDAsIGxpbmUubGVuZ3RoIC0gKG1hdGNoWzBdLmxlbmd0aCAtIChhZnRlclNwYWNlID8gKG1hdGNoWzFdIHx8ICcnKS5sZW5ndGggOiAwKSkpO1xuICAgICAgICAgICAgfSBlbHNlIGlmICgobWF0Y2ggPSBzdHIuc3Vic3RyKHBvcyArIGxpbmUubGVuZ3RoKS5tYXRjaCgvXlteXFxzXSsoXFxzKikvKSkpIHtcbiAgICAgICAgICAgICAgICBsaW5lID0gbGluZSArIG1hdGNoWzBdLnN1YnN0cigwLCBtYXRjaFswXS5sZW5ndGggLSAoIWFmdGVyU3BhY2UgPyAobWF0Y2hbMV0gfHwgJycpLmxlbmd0aCA6IDApKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmVzdWx0ICs9IGxpbmU7XG4gICAgICAgICAgICBwb3MgKz0gbGluZS5sZW5ndGg7XG4gICAgICAgICAgICBpZiAocG9zIDwgbGVuKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0ICs9ICdcXHJcXG4nO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogU3BsaXRzIGEgbWltZSBlbmNvZGVkIHN0cmluZy4gTmVlZGVkIGZvciBkaXZpZGluZyBtaW1lIHdvcmRzIGludG8gc21hbGxlciBjaHVua3NcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBzdHIgTWltZSBlbmNvZGVkIHN0cmluZyB0byBiZSBzcGxpdCB1cFxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBtYXhsZW4gTWF4aW11bSBsZW5ndGggb2YgY2hhcmFjdGVycyBmb3Igb25lIHBhcnQgKG1pbmltdW0gMTIpXG4gICAgICogQHJldHVybiB7QXJyYXl9IFNwbGl0IHN0cmluZ1xuICAgICAqL1xuICAgIHNwbGl0TWltZUVuY29kZWRTdHJpbmc6IChzdHIsIG1heGxlbikgPT4ge1xuICAgICAgICBsZXQgY3VyTGluZSxcbiAgICAgICAgICAgIG1hdGNoLFxuICAgICAgICAgICAgY2hyLFxuICAgICAgICAgICAgZG9uZSxcbiAgICAgICAgICAgIGxpbmVzID0gW107XG5cbiAgICAgICAgLy8gcmVxdWlyZSBhdCBsZWFzdCAxMiBzeW1ib2xzIHRvIGZpdCBwb3NzaWJsZSA0IG9jdGV0IFVURi04IHNlcXVlbmNlc1xuICAgICAgICBtYXhsZW4gPSBNYXRoLm1heChtYXhsZW4gfHwgMCwgMTIpO1xuXG4gICAgICAgIHdoaWxlIChzdHIubGVuZ3RoKSB7XG4gICAgICAgICAgICBjdXJMaW5lID0gc3RyLnN1YnN0cigwLCBtYXhsZW4pO1xuXG4gICAgICAgICAgICAvLyBtb3ZlIGluY29tcGxldGUgZXNjYXBlZCBjaGFyIGJhY2sgdG8gbWFpblxuICAgICAgICAgICAgaWYgKChtYXRjaCA9IGN1ckxpbmUubWF0Y2goL1s9XVswLTlBLUZdPyQvaSkpKSB7XG4gICAgICAgICAgICAgICAgY3VyTGluZSA9IGN1ckxpbmUuc3Vic3RyKDAsIG1hdGNoLmluZGV4KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZG9uZSA9IGZhbHNlO1xuICAgICAgICAgICAgd2hpbGUgKCFkb25lKSB7XG4gICAgICAgICAgICAgICAgZG9uZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgLy8gY2hlY2sgaWYgbm90IG1pZGRsZSBvZiBhIHVuaWNvZGUgY2hhciBzZXF1ZW5jZVxuICAgICAgICAgICAgICAgIGlmICgobWF0Y2ggPSBzdHIuc3Vic3RyKGN1ckxpbmUubGVuZ3RoKS5tYXRjaCgvXls9XShbMC05QS1GXXsyfSkvaSkpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNociA9IHBhcnNlSW50KG1hdGNoWzFdLCAxNik7XG4gICAgICAgICAgICAgICAgICAgIC8vIGludmFsaWQgc2VxdWVuY2UsIG1vdmUgb25lIGNoYXIgYmFjayBhbmMgcmVjaGVja1xuICAgICAgICAgICAgICAgICAgICBpZiAoY2hyIDwgMHhjMiAmJiBjaHIgPiAweDdmKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJMaW5lID0gY3VyTGluZS5zdWJzdHIoMCwgY3VyTGluZS5sZW5ndGggLSAzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRvbmUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGN1ckxpbmUubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgbGluZXMucHVzaChjdXJMaW5lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHN0ciA9IHN0ci5zdWJzdHIoY3VyTGluZS5sZW5ndGgpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGxpbmVzO1xuICAgIH0sXG5cbiAgICBlbmNvZGVVUklDaGFyQ29tcG9uZW50OiBjaHIgPT4ge1xuICAgICAgICBsZXQgcmVzID0gJyc7XG4gICAgICAgIGxldCBvcmQgPSBjaHIuY2hhckNvZGVBdCgwKS50b1N0cmluZygxNikudG9VcHBlckNhc2UoKTtcblxuICAgICAgICBpZiAob3JkLmxlbmd0aCAlIDIpIHtcbiAgICAgICAgICAgIG9yZCA9ICcwJyArIG9yZDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChvcmQubGVuZ3RoID4gMikge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IG9yZC5sZW5ndGggLyAyOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICAgICAgICByZXMgKz0gJyUnICsgb3JkLnN1YnN0cihpLCAyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJlcyArPSAnJScgKyBvcmQ7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVzO1xuICAgIH0sXG5cbiAgICBzYWZlRW5jb2RlVVJJQ29tcG9uZW50KHN0cikge1xuICAgICAgICBzdHIgPSAoc3RyIHx8ICcnKS50b1N0cmluZygpO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBtaWdodCB0aHJvdyBpZiB3ZSB0cnkgdG8gZW5jb2RlIGludmFsaWQgc2VxdWVuY2VzLCBlZy4gcGFydGlhbCBlbW9qaVxuICAgICAgICAgICAgc3RyID0gZW5jb2RlVVJJQ29tcG9uZW50KHN0cik7XG4gICAgICAgIH0gY2F0Y2ggKF9FKSB7XG4gICAgICAgICAgICAvLyBzaG91bGQgbmV2ZXIgcnVuXG4gICAgICAgICAgICByZXR1cm4gc3RyLnJlcGxhY2UoL1teXFx4MDAtXFx4MUYgKicoKTw+QCw7OlxcXFxcIltcXF0/PVxcdTAwN0YtXFx1RkZGRl0rL2csICcnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGVuc3VyZSBjaGFycyB0aGF0IGFyZSBub3QgaGFuZGxlZCBieSBlbmNvZGVVUklDb21wZW50IGFyZSBjb252ZXJ0ZWQgYXMgd2VsbFxuICAgICAgICByZXR1cm4gc3RyLnJlcGxhY2UoL1tcXHgwMC1cXHgxRiAqJygpPD5ALDs6XFxcXFwiW1xcXT89XFx1MDA3Ri1cXHVGRkZGXS9nLCBjaHIgPT4gdGhpcy5lbmNvZGVVUklDaGFyQ29tcG9uZW50KGNocikpO1xuICAgIH1cbn07XG4iXSwibmFtZXMiOltdLCJpZ25vcmVMaXN0IjpbMF0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(action-browser)/./node_modules/.pnpm/nodemailer@7.0.13/node_modules/nodemailer/lib/mime-funcs/index.js\n");
|
||
|
||
/***/ }),
|
||
|
||
/***/ "(action-browser)/./node_modules/.pnpm/nodemailer@7.0.13/node_modules/nodemailer/lib/mime-funcs/mime-types.js":
|
||
/*!***************************************************************************************************!*\
|
||
!*** ./node_modules/.pnpm/nodemailer@7.0.13/node_modules/nodemailer/lib/mime-funcs/mime-types.js ***!
|
||
\***************************************************************************************************/
|
||
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
|
||
|
||
eval("/* eslint quote-props: 0 */\n\n\n\nconst path = __webpack_require__(/*! path */ \"path\");\n\nconst defaultMimeType = 'application/octet-stream';\nconst defaultExtension = 'bin';\n\nconst mimeTypes = new Map([\n ['application/acad', 'dwg'],\n ['application/applixware', 'aw'],\n ['application/arj', 'arj'],\n ['application/atom+xml', 'xml'],\n ['application/atomcat+xml', 'atomcat'],\n ['application/atomsvc+xml', 'atomsvc'],\n ['application/base64', ['mm', 'mme']],\n ['application/binhex', 'hqx'],\n ['application/binhex4', 'hqx'],\n ['application/book', ['book', 'boo']],\n ['application/ccxml+xml,', 'ccxml'],\n ['application/cdf', 'cdf'],\n ['application/cdmi-capability', 'cdmia'],\n ['application/cdmi-container', 'cdmic'],\n ['application/cdmi-domain', 'cdmid'],\n ['application/cdmi-object', 'cdmio'],\n ['application/cdmi-queue', 'cdmiq'],\n ['application/clariscad', 'ccad'],\n ['application/commonground', 'dp'],\n ['application/cu-seeme', 'cu'],\n ['application/davmount+xml', 'davmount'],\n ['application/drafting', 'drw'],\n ['application/dsptype', 'tsp'],\n ['application/dssc+der', 'dssc'],\n ['application/dssc+xml', 'xdssc'],\n ['application/dxf', 'dxf'],\n ['application/ecmascript', ['js', 'es']],\n ['application/emma+xml', 'emma'],\n ['application/envoy', 'evy'],\n ['application/epub+zip', 'epub'],\n ['application/excel', ['xls', 'xl', 'xla', 'xlb', 'xlc', 'xld', 'xlk', 'xll', 'xlm', 'xlt', 'xlv', 'xlw']],\n ['application/exi', 'exi'],\n ['application/font-tdpfr', 'pfr'],\n ['application/fractals', 'fif'],\n ['application/freeloader', 'frl'],\n ['application/futuresplash', 'spl'],\n ['application/geo+json', 'geojson'],\n ['application/gnutar', 'tgz'],\n ['application/groupwise', 'vew'],\n ['application/hlp', 'hlp'],\n ['application/hta', 'hta'],\n ['application/hyperstudio', 'stk'],\n ['application/i-deas', 'unv'],\n ['application/iges', ['iges', 'igs']],\n ['application/inf', 'inf'],\n ['application/internet-property-stream', 'acx'],\n ['application/ipfix', 'ipfix'],\n ['application/java', 'class'],\n ['application/java-archive', 'jar'],\n ['application/java-byte-code', 'class'],\n ['application/java-serialized-object', 'ser'],\n ['application/java-vm', 'class'],\n ['application/javascript', 'js'],\n ['application/json', 'json'],\n ['application/lha', 'lha'],\n ['application/lzx', 'lzx'],\n ['application/mac-binary', 'bin'],\n ['application/mac-binhex', 'hqx'],\n ['application/mac-binhex40', 'hqx'],\n ['application/mac-compactpro', 'cpt'],\n ['application/macbinary', 'bin'],\n ['application/mads+xml', 'mads'],\n ['application/marc', 'mrc'],\n ['application/marcxml+xml', 'mrcx'],\n ['application/mathematica', 'ma'],\n ['application/mathml+xml', 'mathml'],\n ['application/mbedlet', 'mbd'],\n ['application/mbox', 'mbox'],\n ['application/mcad', 'mcd'],\n ['application/mediaservercontrol+xml', 'mscml'],\n ['application/metalink4+xml', 'meta4'],\n ['application/mets+xml', 'mets'],\n ['application/mime', 'aps'],\n ['application/mods+xml', 'mods'],\n ['application/mp21', 'm21'],\n ['application/mp4', 'mp4'],\n ['application/mspowerpoint', ['ppt', 'pot', 'pps', 'ppz']],\n ['application/msword', ['doc', 'dot', 'w6w', 'wiz', 'word']],\n ['application/mswrite', 'wri'],\n ['application/mxf', 'mxf'],\n ['application/netmc', 'mcp'],\n ['application/octet-stream', ['*']],\n ['application/oda', 'oda'],\n ['application/oebps-package+xml', 'opf'],\n ['application/ogg', 'ogx'],\n ['application/olescript', 'axs'],\n ['application/onenote', 'onetoc'],\n ['application/patch-ops-error+xml', 'xer'],\n ['application/pdf', 'pdf'],\n ['application/pgp-encrypted', 'asc'],\n ['application/pgp-signature', 'pgp'],\n ['application/pics-rules', 'prf'],\n ['application/pkcs-12', 'p12'],\n ['application/pkcs-crl', 'crl'],\n ['application/pkcs10', 'p10'],\n ['application/pkcs7-mime', ['p7c', 'p7m']],\n ['application/pkcs7-signature', 'p7s'],\n ['application/pkcs8', 'p8'],\n ['application/pkix-attr-cert', 'ac'],\n ['application/pkix-cert', ['cer', 'crt']],\n ['application/pkix-crl', 'crl'],\n ['application/pkix-pkipath', 'pkipath'],\n ['application/pkixcmp', 'pki'],\n ['application/plain', 'text'],\n ['application/pls+xml', 'pls'],\n ['application/postscript', ['ps', 'ai', 'eps']],\n ['application/powerpoint', 'ppt'],\n ['application/pro_eng', ['part', 'prt']],\n ['application/prs.cww', 'cww'],\n ['application/pskc+xml', 'pskcxml'],\n ['application/rdf+xml', 'rdf'],\n ['application/reginfo+xml', 'rif'],\n ['application/relax-ng-compact-syntax', 'rnc'],\n ['application/resource-lists+xml', 'rl'],\n ['application/resource-lists-diff+xml', 'rld'],\n ['application/ringing-tones', 'rng'],\n ['application/rls-services+xml', 'rs'],\n ['application/rsd+xml', 'rsd'],\n ['application/rss+xml', 'xml'],\n ['application/rtf', ['rtf', 'rtx']],\n ['application/sbml+xml', 'sbml'],\n ['application/scvp-cv-request', 'scq'],\n ['application/scvp-cv-response', 'scs'],\n ['application/scvp-vp-request', 'spq'],\n ['application/scvp-vp-response', 'spp'],\n ['application/sdp', 'sdp'],\n ['application/sea', 'sea'],\n ['application/set', 'set'],\n ['application/set-payment-initiation', 'setpay'],\n ['application/set-registration-initiation', 'setreg'],\n ['application/shf+xml', 'shf'],\n ['application/sla', 'stl'],\n ['application/smil', ['smi', 'smil']],\n ['application/smil+xml', 'smi'],\n ['application/solids', 'sol'],\n ['application/sounder', 'sdr'],\n ['application/sparql-query', 'rq'],\n ['application/sparql-results+xml', 'srx'],\n ['application/srgs', 'gram'],\n ['application/srgs+xml', 'grxml'],\n ['application/sru+xml', 'sru'],\n ['application/ssml+xml', 'ssml'],\n ['application/step', ['step', 'stp']],\n ['application/streamingmedia', 'ssm'],\n ['application/tei+xml', 'tei'],\n ['application/thraud+xml', 'tfi'],\n ['application/timestamped-data', 'tsd'],\n ['application/toolbook', 'tbk'],\n ['application/vda', 'vda'],\n ['application/vnd.3gpp.pic-bw-large', 'plb'],\n ['application/vnd.3gpp.pic-bw-small', 'psb'],\n ['application/vnd.3gpp.pic-bw-var', 'pvb'],\n ['application/vnd.3gpp2.tcap', 'tcap'],\n ['application/vnd.3m.post-it-notes', 'pwn'],\n ['application/vnd.accpac.simply.aso', 'aso'],\n ['application/vnd.accpac.simply.imp', 'imp'],\n ['application/vnd.acucobol', 'acu'],\n ['application/vnd.acucorp', 'atc'],\n ['application/vnd.adobe.air-application-installer-package+zip', 'air'],\n ['application/vnd.adobe.fxp', 'fxp'],\n ['application/vnd.adobe.xdp+xml', 'xdp'],\n ['application/vnd.adobe.xfdf', 'xfdf'],\n ['application/vnd.ahead.space', 'ahead'],\n ['application/vnd.airzip.filesecure.azf', 'azf'],\n ['application/vnd.airzip.filesecure.azs', 'azs'],\n ['application/vnd.amazon.ebook', 'azw'],\n ['application/vnd.americandynamics.acc', 'acc'],\n ['application/vnd.amiga.ami', 'ami'],\n ['application/vnd.android.package-archive', 'apk'],\n ['application/vnd.anser-web-certificate-issue-initiation', 'cii'],\n ['application/vnd.anser-web-funds-transfer-initiation', 'fti'],\n ['application/vnd.antix.game-component', 'atx'],\n ['application/vnd.apple.installer+xml', 'mpkg'],\n ['application/vnd.apple.mpegurl', 'm3u8'],\n ['application/vnd.aristanetworks.swi', 'swi'],\n ['application/vnd.audiograph', 'aep'],\n ['application/vnd.blueice.multipass', 'mpm'],\n ['application/vnd.bmi', 'bmi'],\n ['application/vnd.businessobjects', 'rep'],\n ['application/vnd.chemdraw+xml', 'cdxml'],\n ['application/vnd.chipnuts.karaoke-mmd', 'mmd'],\n ['application/vnd.cinderella', 'cdy'],\n ['application/vnd.claymore', 'cla'],\n ['application/vnd.cloanto.rp9', 'rp9'],\n ['application/vnd.clonk.c4group', 'c4g'],\n ['application/vnd.cluetrust.cartomobile-config', 'c11amc'],\n ['application/vnd.cluetrust.cartomobile-config-pkg', 'c11amz'],\n ['application/vnd.commonspace', 'csp'],\n ['application/vnd.contact.cmsg', 'cdbcmsg'],\n ['application/vnd.cosmocaller', 'cmc'],\n ['application/vnd.crick.clicker', 'clkx'],\n ['application/vnd.crick.clicker.keyboard', 'clkk'],\n ['application/vnd.crick.clicker.palette', 'clkp'],\n ['application/vnd.crick.clicker.template', 'clkt'],\n ['application/vnd.crick.clicker.wordbank', 'clkw'],\n ['application/vnd.criticaltools.wbs+xml', 'wbs'],\n ['application/vnd.ctc-posml', 'pml'],\n ['application/vnd.cups-ppd', 'ppd'],\n ['application/vnd.curl.car', 'car'],\n ['application/vnd.curl.pcurl', 'pcurl'],\n ['application/vnd.data-vision.rdz', 'rdz'],\n ['application/vnd.denovo.fcselayout-link', 'fe_launch'],\n ['application/vnd.dna', 'dna'],\n ['application/vnd.dolby.mlp', 'mlp'],\n ['application/vnd.dpgraph', 'dpg'],\n ['application/vnd.dreamfactory', 'dfac'],\n ['application/vnd.dvb.ait', 'ait'],\n ['application/vnd.dvb.service', 'svc'],\n ['application/vnd.dynageo', 'geo'],\n ['application/vnd.ecowin.chart', 'mag'],\n ['application/vnd.enliven', 'nml'],\n ['application/vnd.epson.esf', 'esf'],\n ['application/vnd.epson.msf', 'msf'],\n ['application/vnd.epson.quickanime', 'qam'],\n ['application/vnd.epson.salt', 'slt'],\n ['application/vnd.epson.ssf', 'ssf'],\n ['application/vnd.eszigno3+xml', 'es3'],\n ['application/vnd.ezpix-album', 'ez2'],\n ['application/vnd.ezpix-package', 'ez3'],\n ['application/vnd.fdf', 'fdf'],\n ['application/vnd.fdsn.seed', 'seed'],\n ['application/vnd.flographit', 'gph'],\n ['application/vnd.fluxtime.clip', 'ftc'],\n ['application/vnd.framemaker', 'fm'],\n ['application/vnd.frogans.fnc', 'fnc'],\n ['application/vnd.frogans.ltf', 'ltf'],\n ['application/vnd.fsc.weblaunch', 'fsc'],\n ['application/vnd.fujitsu.oasys', 'oas'],\n ['application/vnd.fujitsu.oasys2', 'oa2'],\n ['application/vnd.fujitsu.oasys3', 'oa3'],\n ['application/vnd.fujitsu.oasysgp', 'fg5'],\n ['application/vnd.fujitsu.oasysprs', 'bh2'],\n ['application/vnd.fujixerox.ddd', 'ddd'],\n ['application/vnd.fujixerox.docuworks', 'xdw'],\n ['application/vnd.fujixerox.docuworks.binder', 'xbd'],\n ['application/vnd.fuzzysheet', 'fzs'],\n ['application/vnd.genomatix.tuxedo', 'txd'],\n ['application/vnd.geogebra.file', 'ggb'],\n ['application/vnd.geogebra.tool', 'ggt'],\n ['application/vnd.geometry-explorer', 'gex'],\n ['application/vnd.geonext', 'gxt'],\n ['application/vnd.geoplan', 'g2w'],\n ['application/vnd.geospace', 'g3w'],\n ['application/vnd.gmx', 'gmx'],\n ['application/vnd.google-earth.kml+xml', 'kml'],\n ['application/vnd.google-earth.kmz', 'kmz'],\n ['application/vnd.grafeq', 'gqf'],\n ['application/vnd.groove-account', 'gac'],\n ['application/vnd.groove-help', 'ghf'],\n ['application/vnd.groove-identity-message', 'gim'],\n ['application/vnd.groove-injector', 'grv'],\n ['application/vnd.groove-tool-message', 'gtm'],\n ['application/vnd.groove-tool-template', 'tpl'],\n ['application/vnd.groove-vcard', 'vcg'],\n ['application/vnd.hal+xml', 'hal'],\n ['application/vnd.handheld-entertainment+xml', 'zmm'],\n ['application/vnd.hbci', 'hbci'],\n ['application/vnd.hhe.lesson-player', 'les'],\n ['application/vnd.hp-hpgl', ['hgl', 'hpg', 'hpgl']],\n ['application/vnd.hp-hpid', 'hpid'],\n ['application/vnd.hp-hps', 'hps'],\n ['application/vnd.hp-jlyt', 'jlt'],\n ['application/vnd.hp-pcl', 'pcl'],\n ['application/vnd.hp-pclxl', 'pclxl'],\n ['application/vnd.hydrostatix.sof-data', 'sfd-hdstx'],\n ['application/vnd.hzn-3d-crossword', 'x3d'],\n ['application/vnd.ibm.minipay', 'mpy'],\n ['application/vnd.ibm.modcap', 'afp'],\n ['application/vnd.ibm.rights-management', 'irm'],\n ['application/vnd.ibm.secure-container', 'sc'],\n ['application/vnd.iccprofile', 'icc'],\n ['application/vnd.igloader', 'igl'],\n ['application/vnd.immervision-ivp', 'ivp'],\n ['application/vnd.immervision-ivu', 'ivu'],\n ['application/vnd.insors.igm', 'igm'],\n ['application/vnd.intercon.formnet', 'xpw'],\n ['application/vnd.intergeo', 'i2g'],\n ['application/vnd.intu.qbo', 'qbo'],\n ['application/vnd.intu.qfx', 'qfx'],\n ['application/vnd.ipunplugged.rcprofile', 'rcprofile'],\n ['application/vnd.irepository.package+xml', 'irp'],\n ['application/vnd.is-xpr', 'xpr'],\n ['application/vnd.isac.fcs', 'fcs'],\n ['application/vnd.jam', 'jam'],\n ['application/vnd.jcp.javame.midlet-rms', 'rms'],\n ['application/vnd.jisp', 'jisp'],\n ['application/vnd.joost.joda-archive', 'joda'],\n ['application/vnd.kahootz', 'ktz'],\n ['application/vnd.kde.karbon', 'karbon'],\n ['application/vnd.kde.kchart', 'chrt'],\n ['application/vnd.kde.kformula', 'kfo'],\n ['application/vnd.kde.kivio', 'flw'],\n ['application/vnd.kde.kontour', 'kon'],\n ['application/vnd.kde.kpresenter', 'kpr'],\n ['application/vnd.kde.kspread', 'ksp'],\n ['application/vnd.kde.kword', 'kwd'],\n ['application/vnd.kenameaapp', 'htke'],\n ['application/vnd.kidspiration', 'kia'],\n ['application/vnd.kinar', 'kne'],\n ['application/vnd.koan', 'skp'],\n ['application/vnd.kodak-descriptor', 'sse'],\n ['application/vnd.las.las+xml', 'lasxml'],\n ['application/vnd.llamagraphics.life-balance.desktop', 'lbd'],\n ['application/vnd.llamagraphics.life-balance.exchange+xml', 'lbe'],\n ['application/vnd.lotus-1-2-3', '123'],\n ['application/vnd.lotus-approach', 'apr'],\n ['application/vnd.lotus-freelance', 'pre'],\n ['application/vnd.lotus-notes', 'nsf'],\n ['application/vnd.lotus-organizer', 'org'],\n ['application/vnd.lotus-screencam', 'scm'],\n ['application/vnd.lotus-wordpro', 'lwp'],\n ['application/vnd.macports.portpkg', 'portpkg'],\n ['application/vnd.mcd', 'mcd'],\n ['application/vnd.medcalcdata', 'mc1'],\n ['application/vnd.mediastation.cdkey', 'cdkey'],\n ['application/vnd.mfer', 'mwf'],\n ['application/vnd.mfmp', 'mfm'],\n ['application/vnd.micrografx.flo', 'flo'],\n ['application/vnd.micrografx.igx', 'igx'],\n ['application/vnd.mif', 'mif'],\n ['application/vnd.mobius.daf', 'daf'],\n ['application/vnd.mobius.dis', 'dis'],\n ['application/vnd.mobius.mbk', 'mbk'],\n ['application/vnd.mobius.mqy', 'mqy'],\n ['application/vnd.mobius.msl', 'msl'],\n ['application/vnd.mobius.plc', 'plc'],\n ['application/vnd.mobius.txf', 'txf'],\n ['application/vnd.mophun.application', 'mpn'],\n ['application/vnd.mophun.certificate', 'mpc'],\n ['application/vnd.mozilla.xul+xml', 'xul'],\n ['application/vnd.ms-artgalry', 'cil'],\n ['application/vnd.ms-cab-compressed', 'cab'],\n ['application/vnd.ms-excel', ['xls', 'xla', 'xlc', 'xlm', 'xlt', 'xlw', 'xlb', 'xll']],\n ['application/vnd.ms-excel.addin.macroenabled.12', 'xlam'],\n ['application/vnd.ms-excel.sheet.binary.macroenabled.12', 'xlsb'],\n ['application/vnd.ms-excel.sheet.macroenabled.12', 'xlsm'],\n ['application/vnd.ms-excel.template.macroenabled.12', 'xltm'],\n ['application/vnd.ms-fontobject', 'eot'],\n ['application/vnd.ms-htmlhelp', 'chm'],\n ['application/vnd.ms-ims', 'ims'],\n ['application/vnd.ms-lrm', 'lrm'],\n ['application/vnd.ms-officetheme', 'thmx'],\n ['application/vnd.ms-outlook', 'msg'],\n ['application/vnd.ms-pki.certstore', 'sst'],\n ['application/vnd.ms-pki.pko', 'pko'],\n ['application/vnd.ms-pki.seccat', 'cat'],\n ['application/vnd.ms-pki.stl', 'stl'],\n ['application/vnd.ms-pkicertstore', 'sst'],\n ['application/vnd.ms-pkiseccat', 'cat'],\n ['application/vnd.ms-pkistl', 'stl'],\n ['application/vnd.ms-powerpoint', ['ppt', 'pot', 'pps', 'ppa', 'pwz']],\n ['application/vnd.ms-powerpoint.addin.macroenabled.12', 'ppam'],\n ['application/vnd.ms-powerpoint.presentation.macroenabled.12', 'pptm'],\n ['application/vnd.ms-powerpoint.slide.macroenabled.12', 'sldm'],\n ['application/vnd.ms-powerpoint.slideshow.macroenabled.12', 'ppsm'],\n ['application/vnd.ms-powerpoint.template.macroenabled.12', 'potm'],\n ['application/vnd.ms-project', 'mpp'],\n ['application/vnd.ms-word.document.macroenabled.12', 'docm'],\n ['application/vnd.ms-word.template.macroenabled.12', 'dotm'],\n ['application/vnd.ms-works', ['wks', 'wcm', 'wdb', 'wps']],\n ['application/vnd.ms-wpl', 'wpl'],\n ['application/vnd.ms-xpsdocument', 'xps'],\n ['application/vnd.mseq', 'mseq'],\n ['application/vnd.musician', 'mus'],\n ['application/vnd.muvee.style', 'msty'],\n ['application/vnd.neurolanguage.nlu', 'nlu'],\n ['application/vnd.noblenet-directory', 'nnd'],\n ['application/vnd.noblenet-sealer', 'nns'],\n ['application/vnd.noblenet-web', 'nnw'],\n ['application/vnd.nokia.configuration-message', 'ncm'],\n ['application/vnd.nokia.n-gage.data', 'ngdat'],\n ['application/vnd.nokia.n-gage.symbian.install', 'n-gage'],\n ['application/vnd.nokia.radio-preset', 'rpst'],\n ['application/vnd.nokia.radio-presets', 'rpss'],\n ['application/vnd.nokia.ringing-tone', 'rng'],\n ['application/vnd.novadigm.edm', 'edm'],\n ['application/vnd.novadigm.edx', 'edx'],\n ['application/vnd.novadigm.ext', 'ext'],\n ['application/vnd.oasis.opendocument.chart', 'odc'],\n ['application/vnd.oasis.opendocument.chart-template', 'otc'],\n ['application/vnd.oasis.opendocument.database', 'odb'],\n ['application/vnd.oasis.opendocument.formula', 'odf'],\n ['application/vnd.oasis.opendocument.formula-template', 'odft'],\n ['application/vnd.oasis.opendocument.graphics', 'odg'],\n ['application/vnd.oasis.opendocument.graphics-template', 'otg'],\n ['application/vnd.oasis.opendocument.image', 'odi'],\n ['application/vnd.oasis.opendocument.image-template', 'oti'],\n ['application/vnd.oasis.opendocument.presentation', 'odp'],\n ['application/vnd.oasis.opendocument.presentation-template', 'otp'],\n ['application/vnd.oasis.opendocument.spreadsheet', 'ods'],\n ['application/vnd.oasis.opendocument.spreadsheet-template', 'ots'],\n ['application/vnd.oasis.opendocument.text', 'odt'],\n ['application/vnd.oasis.opendocument.text-master', 'odm'],\n ['application/vnd.oasis.opendocument.text-template', 'ott'],\n ['application/vnd.oasis.opendocument.text-web', 'oth'],\n ['application/vnd.olpc-sugar', 'xo'],\n ['application/vnd.oma.dd2+xml', 'dd2'],\n ['application/vnd.openofficeorg.extension', 'oxt'],\n ['application/vnd.openxmlformats-officedocument.presentationml.presentation', 'pptx'],\n ['application/vnd.openxmlformats-officedocument.presentationml.slide', 'sldx'],\n ['application/vnd.openxmlformats-officedocument.presentationml.slideshow', 'ppsx'],\n ['application/vnd.openxmlformats-officedocument.presentationml.template', 'potx'],\n ['application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'xlsx'],\n ['application/vnd.openxmlformats-officedocument.spreadsheetml.template', 'xltx'],\n ['application/vnd.openxmlformats-officedocument.wordprocessingml.document', 'docx'],\n ['application/vnd.openxmlformats-officedocument.wordprocessingml.template', 'dotx'],\n ['application/vnd.osgeo.mapguide.package', 'mgp'],\n ['application/vnd.osgi.dp', 'dp'],\n ['application/vnd.palm', 'pdb'],\n ['application/vnd.pawaafile', 'paw'],\n ['application/vnd.pg.format', 'str'],\n ['application/vnd.pg.osasli', 'ei6'],\n ['application/vnd.picsel', 'efif'],\n ['application/vnd.pmi.widget', 'wg'],\n ['application/vnd.pocketlearn', 'plf'],\n ['application/vnd.powerbuilder6', 'pbd'],\n ['application/vnd.previewsystems.box', 'box'],\n ['application/vnd.proteus.magazine', 'mgz'],\n ['application/vnd.publishare-delta-tree', 'qps'],\n ['application/vnd.pvi.ptid1', 'ptid'],\n ['application/vnd.quark.quarkxpress', 'qxd'],\n ['application/vnd.realvnc.bed', 'bed'],\n ['application/vnd.recordare.musicxml', 'mxl'],\n ['application/vnd.recordare.musicxml+xml', 'musicxml'],\n ['application/vnd.rig.cryptonote', 'cryptonote'],\n ['application/vnd.rim.cod', 'cod'],\n ['application/vnd.rn-realmedia', 'rm'],\n ['application/vnd.rn-realplayer', 'rnx'],\n ['application/vnd.route66.link66+xml', 'link66'],\n ['application/vnd.sailingtracker.track', 'st'],\n ['application/vnd.seemail', 'see'],\n ['application/vnd.sema', 'sema'],\n ['application/vnd.semd', 'semd'],\n ['application/vnd.semf', 'semf'],\n ['application/vnd.shana.informed.formdata', 'ifm'],\n ['application/vnd.shana.informed.formtemplate', 'itp'],\n ['application/vnd.shana.informed.interchange', 'iif'],\n ['application/vnd.shana.informed.package', 'ipk'],\n ['application/vnd.simtech-mindmapper', 'twd'],\n ['application/vnd.smaf', 'mmf'],\n ['application/vnd.smart.teacher', 'teacher'],\n ['application/vnd.solent.sdkm+xml', 'sdkm'],\n ['application/vnd.spotfire.dxp', 'dxp'],\n ['application/vnd.spotfire.sfs', 'sfs'],\n ['application/vnd.stardivision.calc', 'sdc'],\n ['application/vnd.stardivision.draw', 'sda'],\n ['application/vnd.stardivision.impress', 'sdd'],\n ['application/vnd.stardivision.math', 'smf'],\n ['application/vnd.stardivision.writer', 'sdw'],\n ['application/vnd.stardivision.writer-global', 'sgl'],\n ['application/vnd.stepmania.stepchart', 'sm'],\n ['application/vnd.sun.xml.calc', 'sxc'],\n ['application/vnd.sun.xml.calc.template', 'stc'],\n ['application/vnd.sun.xml.draw', 'sxd'],\n ['application/vnd.sun.xml.draw.template', 'std'],\n ['application/vnd.sun.xml.impress', 'sxi'],\n ['application/vnd.sun.xml.impress.template', 'sti'],\n ['application/vnd.sun.xml.math', 'sxm'],\n ['application/vnd.sun.xml.writer', 'sxw'],\n ['application/vnd.sun.xml.writer.global', 'sxg'],\n ['application/vnd.sun.xml.writer.template', 'stw'],\n ['application/vnd.sus-calendar', 'sus'],\n ['application/vnd.svd', 'svd'],\n ['application/vnd.symbian.install', 'sis'],\n ['application/vnd.syncml+xml', 'xsm'],\n ['application/vnd.syncml.dm+wbxml', 'bdm'],\n ['application/vnd.syncml.dm+xml', 'xdm'],\n ['application/vnd.tao.intent-module-archive', 'tao'],\n ['application/vnd.tmobile-livetv', 'tmo'],\n ['application/vnd.trid.tpt', 'tpt'],\n ['application/vnd.triscape.mxs', 'mxs'],\n ['application/vnd.trueapp', 'tra'],\n ['application/vnd.ufdl', 'ufd'],\n ['application/vnd.uiq.theme', 'utz'],\n ['application/vnd.umajin', 'umj'],\n ['application/vnd.unity', 'unityweb'],\n ['application/vnd.uoml+xml', 'uoml'],\n ['application/vnd.vcx', 'vcx'],\n ['application/vnd.visio', 'vsd'],\n ['application/vnd.visionary', 'vis'],\n ['application/vnd.vsf', 'vsf'],\n ['application/vnd.wap.wbxml', 'wbxml'],\n ['application/vnd.wap.wmlc', 'wmlc'],\n ['application/vnd.wap.wmlscriptc', 'wmlsc'],\n ['application/vnd.webturbo', 'wtb'],\n ['application/vnd.wolfram.player', 'nbp'],\n ['application/vnd.wordperfect', 'wpd'],\n ['application/vnd.wqd', 'wqd'],\n ['application/vnd.wt.stf', 'stf'],\n ['application/vnd.xara', ['web', 'xar']],\n ['application/vnd.xfdl', 'xfdl'],\n ['application/vnd.yamaha.hv-dic', 'hvd'],\n ['application/vnd.yamaha.hv-script', 'hvs'],\n ['application/vnd.yamaha.hv-voice', 'hvp'],\n ['application/vnd.yamaha.openscoreformat', 'osf'],\n ['application/vnd.yamaha.openscoreformat.osfpvg+xml', 'osfpvg'],\n ['application/vnd.yamaha.smaf-audio', 'saf'],\n ['application/vnd.yamaha.smaf-phrase', 'spf'],\n ['application/vnd.yellowriver-custom-menu', 'cmp'],\n ['application/vnd.zul', 'zir'],\n ['application/vnd.zzazz.deck+xml', 'zaz'],\n ['application/vocaltec-media-desc', 'vmd'],\n ['application/vocaltec-media-file', 'vmf'],\n ['application/voicexml+xml', 'vxml'],\n ['application/widget', 'wgt'],\n ['application/winhlp', 'hlp'],\n ['application/wordperfect', ['wp', 'wp5', 'wp6', 'wpd']],\n ['application/wordperfect6.0', ['w60', 'wp5']],\n ['application/wordperfect6.1', 'w61'],\n ['application/wsdl+xml', 'wsdl'],\n ['application/wspolicy+xml', 'wspolicy'],\n ['application/x-123', 'wk1'],\n ['application/x-7z-compressed', '7z'],\n ['application/x-abiword', 'abw'],\n ['application/x-ace-compressed', 'ace'],\n ['application/x-aim', 'aim'],\n ['application/x-authorware-bin', 'aab'],\n ['application/x-authorware-map', 'aam'],\n ['application/x-authorware-seg', 'aas'],\n ['application/x-bcpio', 'bcpio'],\n ['application/x-binary', 'bin'],\n ['application/x-binhex40', 'hqx'],\n ['application/x-bittorrent', 'torrent'],\n ['application/x-bsh', ['bsh', 'sh', 'shar']],\n ['application/x-bytecode.elisp', 'elc'],\n ['application/x-bytecode.python', 'pyc'],\n ['application/x-bzip', 'bz'],\n ['application/x-bzip2', ['boz', 'bz2']],\n ['application/x-cdf', 'cdf'],\n ['application/x-cdlink', 'vcd'],\n ['application/x-chat', ['cha', 'chat']],\n ['application/x-chess-pgn', 'pgn'],\n ['application/x-cmu-raster', 'ras'],\n ['application/x-cocoa', 'cco'],\n ['application/x-compactpro', 'cpt'],\n ['application/x-compress', 'z'],\n ['application/x-compressed', ['tgz', 'gz', 'z', 'zip']],\n ['application/x-conference', 'nsc'],\n ['application/x-cpio', 'cpio'],\n ['application/x-cpt', 'cpt'],\n ['application/x-csh', 'csh'],\n ['application/x-debian-package', 'deb'],\n ['application/x-deepv', 'deepv'],\n ['application/x-director', ['dir', 'dcr', 'dxr']],\n ['application/x-doom', 'wad'],\n ['application/x-dtbncx+xml', 'ncx'],\n ['application/x-dtbook+xml', 'dtb'],\n ['application/x-dtbresource+xml', 'res'],\n ['application/x-dvi', 'dvi'],\n ['application/x-elc', 'elc'],\n ['application/x-envoy', ['env', 'evy']],\n ['application/x-esrehber', 'es'],\n ['application/x-excel', ['xls', 'xla', 'xlb', 'xlc', 'xld', 'xlk', 'xll', 'xlm', 'xlt', 'xlv', 'xlw']],\n ['application/x-font-bdf', 'bdf'],\n ['application/x-font-ghostscript', 'gsf'],\n ['application/x-font-linux-psf', 'psf'],\n ['application/x-font-otf', 'otf'],\n ['application/x-font-pcf', 'pcf'],\n ['application/x-font-snf', 'snf'],\n ['application/x-font-ttf', 'ttf'],\n ['application/x-font-type1', 'pfa'],\n ['application/x-font-woff', 'woff'],\n ['application/x-frame', 'mif'],\n ['application/x-freelance', 'pre'],\n ['application/x-futuresplash', 'spl'],\n ['application/x-gnumeric', 'gnumeric'],\n ['application/x-gsp', 'gsp'],\n ['application/x-gss', 'gss'],\n ['application/x-gtar', 'gtar'],\n ['application/x-gzip', ['gz', 'gzip']],\n ['application/x-hdf', 'hdf'],\n ['application/x-helpfile', ['help', 'hlp']],\n ['application/x-httpd-imap', 'imap'],\n ['application/x-ima', 'ima'],\n ['application/x-internet-signup', ['ins', 'isp']],\n ['application/x-internett-signup', 'ins'],\n ['application/x-inventor', 'iv'],\n ['application/x-ip2', 'ip'],\n ['application/x-iphone', 'iii'],\n ['application/x-java-class', 'class'],\n ['application/x-java-commerce', 'jcm'],\n ['application/x-java-jnlp-file', 'jnlp'],\n ['application/x-javascript', 'js'],\n ['application/x-koan', ['skd', 'skm', 'skp', 'skt']],\n ['application/x-ksh', 'ksh'],\n ['application/x-latex', ['latex', 'ltx']],\n ['application/x-lha', 'lha'],\n ['application/x-lisp', 'lsp'],\n ['application/x-livescreen', 'ivy'],\n ['application/x-lotus', 'wq1'],\n ['application/x-lotusscreencam', 'scm'],\n ['application/x-lzh', 'lzh'],\n ['application/x-lzx', 'lzx'],\n ['application/x-mac-binhex40', 'hqx'],\n ['application/x-macbinary', 'bin'],\n ['application/x-magic-cap-package-1.0', 'mc$'],\n ['application/x-mathcad', 'mcd'],\n ['application/x-meme', 'mm'],\n ['application/x-midi', ['mid', 'midi']],\n ['application/x-mif', 'mif'],\n ['application/x-mix-transfer', 'nix'],\n ['application/x-mobipocket-ebook', 'prc'],\n ['application/x-mplayer2', 'asx'],\n ['application/x-ms-application', 'application'],\n ['application/x-ms-wmd', 'wmd'],\n ['application/x-ms-wmz', 'wmz'],\n ['application/x-ms-xbap', 'xbap'],\n ['application/x-msaccess', 'mdb'],\n ['application/x-msbinder', 'obd'],\n ['application/x-mscardfile', 'crd'],\n ['application/x-msclip', 'clp'],\n ['application/x-msdownload', ['exe', 'dll']],\n ['application/x-msexcel', ['xls', 'xla', 'xlw']],\n ['application/x-msmediaview', ['mvb', 'm13', 'm14']],\n ['application/x-msmetafile', 'wmf'],\n ['application/x-msmoney', 'mny'],\n ['application/x-mspowerpoint', 'ppt'],\n ['application/x-mspublisher', 'pub'],\n ['application/x-msschedule', 'scd'],\n ['application/x-msterminal', 'trm'],\n ['application/x-mswrite', 'wri'],\n ['application/x-navi-animation', 'ani'],\n ['application/x-navidoc', 'nvd'],\n ['application/x-navimap', 'map'],\n ['application/x-navistyle', 'stl'],\n ['application/x-netcdf', ['cdf', 'nc']],\n ['application/x-newton-compatible-pkg', 'pkg'],\n ['application/x-nokia-9000-communicator-add-on-software', 'aos'],\n ['application/x-omc', 'omc'],\n ['application/x-omcdatamaker', 'omcd'],\n ['application/x-omcregerator', 'omcr'],\n ['application/x-pagemaker', ['pm4', 'pm5']],\n ['application/x-pcl', 'pcl'],\n ['application/x-perfmon', ['pma', 'pmc', 'pml', 'pmr', 'pmw']],\n ['application/x-pixclscript', 'plx'],\n ['application/x-pkcs10', 'p10'],\n ['application/x-pkcs12', ['p12', 'pfx']],\n ['application/x-pkcs7-certificates', ['p7b', 'spc']],\n ['application/x-pkcs7-certreqresp', 'p7r'],\n ['application/x-pkcs7-mime', ['p7m', 'p7c']],\n ['application/x-pkcs7-signature', ['p7s', 'p7a']],\n ['application/x-pointplus', 'css'],\n ['application/x-portable-anymap', 'pnm'],\n ['application/x-project', ['mpc', 'mpt', 'mpv', 'mpx']],\n ['application/x-qpro', 'wb1'],\n ['application/x-rar-compressed', 'rar'],\n ['application/x-rtf', 'rtf'],\n ['application/x-sdp', 'sdp'],\n ['application/x-sea', 'sea'],\n ['application/x-seelogo', 'sl'],\n ['application/x-sh', 'sh'],\n ['application/x-shar', ['shar', 'sh']],\n ['application/x-shockwave-flash', 'swf'],\n ['application/x-silverlight-app', 'xap'],\n ['application/x-sit', 'sit'],\n ['application/x-sprite', ['spr', 'sprite']],\n ['application/x-stuffit', 'sit'],\n ['application/x-stuffitx', 'sitx'],\n ['application/x-sv4cpio', 'sv4cpio'],\n ['application/x-sv4crc', 'sv4crc'],\n ['application/x-tar', 'tar'],\n ['application/x-tbook', ['sbk', 'tbk']],\n ['application/x-tcl', 'tcl'],\n ['application/x-tex', 'tex'],\n ['application/x-tex-tfm', 'tfm'],\n ['application/x-texinfo', ['texi', 'texinfo']],\n ['application/x-troff', ['roff', 't', 'tr']],\n ['application/x-troff-man', 'man'],\n ['application/x-troff-me', 'me'],\n ['application/x-troff-ms', 'ms'],\n ['application/x-troff-msvideo', 'avi'],\n ['application/x-ustar', 'ustar'],\n ['application/x-visio', ['vsd', 'vst', 'vsw']],\n ['application/x-vnd.audioexplosion.mzz', 'mzz'],\n ['application/x-vnd.ls-xpix', 'xpix'],\n ['application/x-vrml', 'vrml'],\n ['application/x-wais-source', ['src', 'wsrc']],\n ['application/x-winhelp', 'hlp'],\n ['application/x-wintalk', 'wtk'],\n ['application/x-world', ['wrl', 'svr']],\n ['application/x-wpwin', 'wpd'],\n ['application/x-wri', 'wri'],\n ['application/x-x509-ca-cert', ['cer', 'crt', 'der']],\n ['application/x-x509-user-cert', 'crt'],\n ['application/x-xfig', 'fig'],\n ['application/x-xpinstall', 'xpi'],\n ['application/x-zip-compressed', 'zip'],\n ['application/xcap-diff+xml', 'xdf'],\n ['application/xenc+xml', 'xenc'],\n ['application/xhtml+xml', 'xhtml'],\n ['application/xml', 'xml'],\n ['application/xml-dtd', 'dtd'],\n ['application/xop+xml', 'xop'],\n ['application/xslt+xml', 'xslt'],\n ['application/xspf+xml', 'xspf'],\n ['application/xv+xml', 'mxml'],\n ['application/yang', 'yang'],\n ['application/yin+xml', 'yin'],\n ['application/ynd.ms-pkipko', 'pko'],\n ['application/zip', 'zip'],\n ['audio/adpcm', 'adp'],\n ['audio/aiff', ['aiff', 'aif', 'aifc']],\n ['audio/basic', ['snd', 'au']],\n ['audio/it', 'it'],\n ['audio/make', ['funk', 'my', 'pfunk']],\n ['audio/make.my.funk', 'pfunk'],\n ['audio/mid', ['mid', 'rmi']],\n ['audio/midi', ['midi', 'kar', 'mid']],\n ['audio/mod', 'mod'],\n ['audio/mp4', 'mp4a'],\n ['audio/mpeg', ['mpga', 'mp3', 'm2a', 'mp2', 'mpa', 'mpg']],\n ['audio/mpeg3', 'mp3'],\n ['audio/nspaudio', ['la', 'lma']],\n ['audio/ogg', 'oga'],\n ['audio/s3m', 's3m'],\n ['audio/tsp-audio', 'tsi'],\n ['audio/tsplayer', 'tsp'],\n ['audio/vnd.dece.audio', 'uva'],\n ['audio/vnd.digital-winds', 'eol'],\n ['audio/vnd.dra', 'dra'],\n ['audio/vnd.dts', 'dts'],\n ['audio/vnd.dts.hd', 'dtshd'],\n ['audio/vnd.lucent.voice', 'lvp'],\n ['audio/vnd.ms-playready.media.pya', 'pya'],\n ['audio/vnd.nuera.ecelp4800', 'ecelp4800'],\n ['audio/vnd.nuera.ecelp7470', 'ecelp7470'],\n ['audio/vnd.nuera.ecelp9600', 'ecelp9600'],\n ['audio/vnd.qcelp', 'qcp'],\n ['audio/vnd.rip', 'rip'],\n ['audio/voc', 'voc'],\n ['audio/voxware', 'vox'],\n ['audio/wav', 'wav'],\n ['audio/webm', 'weba'],\n ['audio/x-aac', 'aac'],\n ['audio/x-adpcm', 'snd'],\n ['audio/x-aiff', ['aiff', 'aif', 'aifc']],\n ['audio/x-au', 'au'],\n ['audio/x-gsm', ['gsd', 'gsm']],\n ['audio/x-jam', 'jam'],\n ['audio/x-liveaudio', 'lam'],\n ['audio/x-mid', ['mid', 'midi']],\n ['audio/x-midi', ['midi', 'mid']],\n ['audio/x-mod', 'mod'],\n ['audio/x-mpeg', 'mp2'],\n ['audio/x-mpeg-3', 'mp3'],\n ['audio/x-mpegurl', 'm3u'],\n ['audio/x-mpequrl', 'm3u'],\n ['audio/x-ms-wax', 'wax'],\n ['audio/x-ms-wma', 'wma'],\n ['audio/x-nspaudio', ['la', 'lma']],\n ['audio/x-pn-realaudio', ['ra', 'ram', 'rm', 'rmm', 'rmp']],\n ['audio/x-pn-realaudio-plugin', ['ra', 'rmp', 'rpm']],\n ['audio/x-psid', 'sid'],\n ['audio/x-realaudio', 'ra'],\n ['audio/x-twinvq', 'vqf'],\n ['audio/x-twinvq-plugin', ['vqe', 'vql']],\n ['audio/x-vnd.audioexplosion.mjuicemediafile', 'mjf'],\n ['audio/x-voc', 'voc'],\n ['audio/x-wav', 'wav'],\n ['audio/xm', 'xm'],\n ['chemical/x-cdx', 'cdx'],\n ['chemical/x-cif', 'cif'],\n ['chemical/x-cmdf', 'cmdf'],\n ['chemical/x-cml', 'cml'],\n ['chemical/x-csml', 'csml'],\n ['chemical/x-pdb', ['pdb', 'xyz']],\n ['chemical/x-xyz', 'xyz'],\n ['drawing/x-dwf', 'dwf'],\n ['i-world/i-vrml', 'ivr'],\n ['image/bmp', ['bmp', 'bm']],\n ['image/cgm', 'cgm'],\n ['image/cis-cod', 'cod'],\n ['image/cmu-raster', ['ras', 'rast']],\n ['image/fif', 'fif'],\n ['image/florian', ['flo', 'turbot']],\n ['image/g3fax', 'g3'],\n ['image/gif', 'gif'],\n ['image/ief', ['ief', 'iefs']],\n ['image/jpeg', ['jpeg', 'jpe', 'jpg', 'jfif', 'jfif-tbnl']],\n ['image/jutvision', 'jut'],\n ['image/ktx', 'ktx'],\n ['image/naplps', ['nap', 'naplps']],\n ['image/pict', ['pic', 'pict']],\n ['image/pipeg', 'jfif'],\n ['image/pjpeg', ['jfif', 'jpe', 'jpeg', 'jpg']],\n ['image/png', ['png', 'x-png']],\n ['image/prs.btif', 'btif'],\n ['image/svg+xml', 'svg'],\n ['image/tiff', ['tif', 'tiff']],\n ['image/vasa', 'mcf'],\n ['image/vnd.adobe.photoshop', 'psd'],\n ['image/vnd.dece.graphic', 'uvi'],\n ['image/vnd.djvu', 'djvu'],\n ['image/vnd.dvb.subtitle', 'sub'],\n ['image/vnd.dwg', ['dwg', 'dxf', 'svf']],\n ['image/vnd.dxf', 'dxf'],\n ['image/vnd.fastbidsheet', 'fbs'],\n ['image/vnd.fpx', 'fpx'],\n ['image/vnd.fst', 'fst'],\n ['image/vnd.fujixerox.edmics-mmr', 'mmr'],\n ['image/vnd.fujixerox.edmics-rlc', 'rlc'],\n ['image/vnd.ms-modi', 'mdi'],\n ['image/vnd.net-fpx', ['fpx', 'npx']],\n ['image/vnd.rn-realflash', 'rf'],\n ['image/vnd.rn-realpix', 'rp'],\n ['image/vnd.wap.wbmp', 'wbmp'],\n ['image/vnd.xiff', 'xif'],\n ['image/webp', 'webp'],\n ['image/x-cmu-raster', 'ras'],\n ['image/x-cmx', 'cmx'],\n ['image/x-dwg', ['dwg', 'dxf', 'svf']],\n ['image/x-freehand', 'fh'],\n ['image/x-icon', 'ico'],\n ['image/x-jg', 'art'],\n ['image/x-jps', 'jps'],\n ['image/x-niff', ['niff', 'nif']],\n ['image/x-pcx', 'pcx'],\n ['image/x-pict', ['pct', 'pic']],\n ['image/x-portable-anymap', 'pnm'],\n ['image/x-portable-bitmap', 'pbm'],\n ['image/x-portable-graymap', 'pgm'],\n ['image/x-portable-greymap', 'pgm'],\n ['image/x-portable-pixmap', 'ppm'],\n ['image/x-quicktime', ['qif', 'qti', 'qtif']],\n ['image/x-rgb', 'rgb'],\n ['image/x-tiff', ['tif', 'tiff']],\n ['image/x-windows-bmp', 'bmp'],\n ['image/x-xbitmap', 'xbm'],\n ['image/x-xbm', 'xbm'],\n ['image/x-xpixmap', ['xpm', 'pm']],\n ['image/x-xwd', 'xwd'],\n ['image/x-xwindowdump', 'xwd'],\n ['image/xbm', 'xbm'],\n ['image/xpm', 'xpm'],\n ['message/rfc822', ['eml', 'mht', 'mhtml', 'nws', 'mime']],\n ['model/iges', ['iges', 'igs']],\n ['model/mesh', 'msh'],\n ['model/vnd.collada+xml', 'dae'],\n ['model/vnd.dwf', 'dwf'],\n ['model/vnd.gdl', 'gdl'],\n ['model/vnd.gtw', 'gtw'],\n ['model/vnd.mts', 'mts'],\n ['model/vnd.vtu', 'vtu'],\n ['model/vrml', ['vrml', 'wrl', 'wrz']],\n ['model/x-pov', 'pov'],\n ['multipart/x-gzip', 'gzip'],\n ['multipart/x-ustar', 'ustar'],\n ['multipart/x-zip', 'zip'],\n ['music/crescendo', ['mid', 'midi']],\n ['music/x-karaoke', 'kar'],\n ['paleovu/x-pv', 'pvu'],\n ['text/asp', 'asp'],\n ['text/calendar', 'ics'],\n ['text/css', 'css'],\n ['text/csv', 'csv'],\n ['text/ecmascript', 'js'],\n ['text/h323', '323'],\n ['text/html', ['html', 'htm', 'stm', 'acgi', 'htmls', 'htx', 'shtml']],\n ['text/iuls', 'uls'],\n ['text/javascript', 'js'],\n ['text/mcf', 'mcf'],\n ['text/n3', 'n3'],\n ['text/pascal', 'pas'],\n [\n 'text/plain',\n [\n 'txt',\n 'bas',\n 'c',\n 'h',\n 'c++',\n 'cc',\n 'com',\n 'conf',\n 'cxx',\n 'def',\n 'f',\n 'f90',\n 'for',\n 'g',\n 'hh',\n 'idc',\n 'jav',\n 'java',\n 'list',\n 'log',\n 'lst',\n 'm',\n 'mar',\n 'pl',\n 'sdml',\n 'text'\n ]\n ],\n ['text/plain-bas', 'par'],\n ['text/prs.lines.tag', 'dsc'],\n ['text/richtext', ['rtx', 'rt', 'rtf']],\n ['text/scriplet', 'wsc'],\n ['text/scriptlet', 'sct'],\n ['text/sgml', ['sgm', 'sgml']],\n ['text/tab-separated-values', 'tsv'],\n ['text/troff', 't'],\n ['text/turtle', 'ttl'],\n ['text/uri-list', ['uni', 'unis', 'uri', 'uris']],\n ['text/vnd.abc', 'abc'],\n ['text/vnd.curl', 'curl'],\n ['text/vnd.curl.dcurl', 'dcurl'],\n ['text/vnd.curl.mcurl', 'mcurl'],\n ['text/vnd.curl.scurl', 'scurl'],\n ['text/vnd.fly', 'fly'],\n ['text/vnd.fmi.flexstor', 'flx'],\n ['text/vnd.graphviz', 'gv'],\n ['text/vnd.in3d.3dml', '3dml'],\n ['text/vnd.in3d.spot', 'spot'],\n ['text/vnd.rn-realtext', 'rt'],\n ['text/vnd.sun.j2me.app-descriptor', 'jad'],\n ['text/vnd.wap.wml', 'wml'],\n ['text/vnd.wap.wmlscript', 'wmls'],\n ['text/webviewhtml', 'htt'],\n ['text/x-asm', ['asm', 's']],\n ['text/x-audiosoft-intra', 'aip'],\n ['text/x-c', ['c', 'cc', 'cpp']],\n ['text/x-component', 'htc'],\n ['text/x-fortran', ['for', 'f', 'f77', 'f90']],\n ['text/x-h', ['h', 'hh']],\n ['text/x-java-source', ['java', 'jav']],\n ['text/x-java-source,java', 'java'],\n ['text/x-la-asf', 'lsx'],\n ['text/x-m', 'm'],\n ['text/x-pascal', 'p'],\n ['text/x-script', 'hlb'],\n ['text/x-script.csh', 'csh'],\n ['text/x-script.elisp', 'el'],\n ['text/x-script.guile', 'scm'],\n ['text/x-script.ksh', 'ksh'],\n ['text/x-script.lisp', 'lsp'],\n ['text/x-script.perl', 'pl'],\n ['text/x-script.perl-module', 'pm'],\n ['text/x-script.phyton', 'py'],\n ['text/x-script.rexx', 'rexx'],\n ['text/x-script.scheme', 'scm'],\n ['text/x-script.sh', 'sh'],\n ['text/x-script.tcl', 'tcl'],\n ['text/x-script.tcsh', 'tcsh'],\n ['text/x-script.zsh', 'zsh'],\n ['text/x-server-parsed-html', ['shtml', 'ssi']],\n ['text/x-setext', 'etx'],\n ['text/x-sgml', ['sgm', 'sgml']],\n ['text/x-speech', ['spc', 'talk']],\n ['text/x-uil', 'uil'],\n ['text/x-uuencode', ['uu', 'uue']],\n ['text/x-vcalendar', 'vcs'],\n ['text/x-vcard', 'vcf'],\n ['text/xml', 'xml'],\n ['video/3gpp', '3gp'],\n ['video/3gpp2', '3g2'],\n ['video/animaflex', 'afl'],\n ['video/avi', 'avi'],\n ['video/avs-video', 'avs'],\n ['video/dl', 'dl'],\n ['video/fli', 'fli'],\n ['video/gl', 'gl'],\n ['video/h261', 'h261'],\n ['video/h263', 'h263'],\n ['video/h264', 'h264'],\n ['video/jpeg', 'jpgv'],\n ['video/jpm', 'jpm'],\n ['video/mj2', 'mj2'],\n ['video/mp4', 'mp4'],\n ['video/mpeg', ['mpeg', 'mp2', 'mpa', 'mpe', 'mpg', 'mpv2', 'm1v', 'm2v', 'mp3']],\n ['video/msvideo', 'avi'],\n ['video/ogg', 'ogv'],\n ['video/quicktime', ['mov', 'qt', 'moov']],\n ['video/vdo', 'vdo'],\n ['video/vivo', ['viv', 'vivo']],\n ['video/vnd.dece.hd', 'uvh'],\n ['video/vnd.dece.mobile', 'uvm'],\n ['video/vnd.dece.pd', 'uvp'],\n ['video/vnd.dece.sd', 'uvs'],\n ['video/vnd.dece.video', 'uvv'],\n ['video/vnd.fvt', 'fvt'],\n ['video/vnd.mpegurl', 'mxu'],\n ['video/vnd.ms-playready.media.pyv', 'pyv'],\n ['video/vnd.rn-realvideo', 'rv'],\n ['video/vnd.uvvu.mp4', 'uvu'],\n ['video/vnd.vivo', ['viv', 'vivo']],\n ['video/vosaic', 'vos'],\n ['video/webm', 'webm'],\n ['video/x-amt-demorun', 'xdr'],\n ['video/x-amt-showrun', 'xsr'],\n ['video/x-atomic3d-feature', 'fmf'],\n ['video/x-dl', 'dl'],\n ['video/x-dv', ['dif', 'dv']],\n ['video/x-f4v', 'f4v'],\n ['video/x-fli', 'fli'],\n ['video/x-flv', 'flv'],\n ['video/x-gl', 'gl'],\n ['video/x-isvideo', 'isu'],\n ['video/x-la-asf', ['lsf', 'lsx']],\n ['video/x-m4v', 'm4v'],\n ['video/x-motion-jpeg', 'mjpg'],\n ['video/x-mpeg', ['mp3', 'mp2']],\n ['video/x-mpeq2a', 'mp2'],\n ['video/x-ms-asf', ['asf', 'asr', 'asx']],\n ['video/x-ms-asf-plugin', 'asx'],\n ['video/x-ms-wm', 'wm'],\n ['video/x-ms-wmv', 'wmv'],\n ['video/x-ms-wmx', 'wmx'],\n ['video/x-ms-wvx', 'wvx'],\n ['video/x-msvideo', 'avi'],\n ['video/x-qtc', 'qtc'],\n ['video/x-scm', 'scm'],\n ['video/x-sgi-movie', ['movie', 'mv']],\n ['windows/metafile', 'wmf'],\n ['www/mime', 'mime'],\n ['x-conference/x-cooltalk', 'ice'],\n ['x-music/x-midi', ['mid', 'midi']],\n ['x-world/x-3dmf', ['3dm', '3dmf', 'qd3', 'qd3d']],\n ['x-world/x-svr', 'svr'],\n ['x-world/x-vrml', ['flr', 'vrml', 'wrl', 'wrz', 'xaf', 'xof']],\n ['x-world/x-vrt', 'vrt'],\n ['xgl/drawing', 'xgz'],\n ['xgl/movie', 'xmz']\n]);\nconst extensions = new Map([\n ['123', 'application/vnd.lotus-1-2-3'],\n ['323', 'text/h323'],\n ['*', 'application/octet-stream'],\n ['3dm', 'x-world/x-3dmf'],\n ['3dmf', 'x-world/x-3dmf'],\n ['3dml', 'text/vnd.in3d.3dml'],\n ['3g2', 'video/3gpp2'],\n ['3gp', 'video/3gpp'],\n ['7z', 'application/x-7z-compressed'],\n ['a', 'application/octet-stream'],\n ['aab', 'application/x-authorware-bin'],\n ['aac', 'audio/x-aac'],\n ['aam', 'application/x-authorware-map'],\n ['aas', 'application/x-authorware-seg'],\n ['abc', 'text/vnd.abc'],\n ['abw', 'application/x-abiword'],\n ['ac', 'application/pkix-attr-cert'],\n ['acc', 'application/vnd.americandynamics.acc'],\n ['ace', 'application/x-ace-compressed'],\n ['acgi', 'text/html'],\n ['acu', 'application/vnd.acucobol'],\n ['acx', 'application/internet-property-stream'],\n ['adp', 'audio/adpcm'],\n ['aep', 'application/vnd.audiograph'],\n ['afl', 'video/animaflex'],\n ['afp', 'application/vnd.ibm.modcap'],\n ['ahead', 'application/vnd.ahead.space'],\n ['ai', 'application/postscript'],\n ['aif', ['audio/aiff', 'audio/x-aiff']],\n ['aifc', ['audio/aiff', 'audio/x-aiff']],\n ['aiff', ['audio/aiff', 'audio/x-aiff']],\n ['aim', 'application/x-aim'],\n ['aip', 'text/x-audiosoft-intra'],\n ['air', 'application/vnd.adobe.air-application-installer-package+zip'],\n ['ait', 'application/vnd.dvb.ait'],\n ['ami', 'application/vnd.amiga.ami'],\n ['ani', 'application/x-navi-animation'],\n ['aos', 'application/x-nokia-9000-communicator-add-on-software'],\n ['apk', 'application/vnd.android.package-archive'],\n ['application', 'application/x-ms-application'],\n ['apr', 'application/vnd.lotus-approach'],\n ['aps', 'application/mime'],\n ['arc', 'application/octet-stream'],\n ['arj', ['application/arj', 'application/octet-stream']],\n ['art', 'image/x-jg'],\n ['asf', 'video/x-ms-asf'],\n ['asm', 'text/x-asm'],\n ['aso', 'application/vnd.accpac.simply.aso'],\n ['asp', 'text/asp'],\n ['asr', 'video/x-ms-asf'],\n ['asx', ['video/x-ms-asf', 'application/x-mplayer2', 'video/x-ms-asf-plugin']],\n ['atc', 'application/vnd.acucorp'],\n ['atomcat', 'application/atomcat+xml'],\n ['atomsvc', 'application/atomsvc+xml'],\n ['atx', 'application/vnd.antix.game-component'],\n ['au', ['audio/basic', 'audio/x-au']],\n ['avi', ['video/avi', 'video/msvideo', 'application/x-troff-msvideo', 'video/x-msvideo']],\n ['avs', 'video/avs-video'],\n ['aw', 'application/applixware'],\n ['axs', 'application/olescript'],\n ['azf', 'application/vnd.airzip.filesecure.azf'],\n ['azs', 'application/vnd.airzip.filesecure.azs'],\n ['azw', 'application/vnd.amazon.ebook'],\n ['bas', 'text/plain'],\n ['bcpio', 'application/x-bcpio'],\n ['bdf', 'application/x-font-bdf'],\n ['bdm', 'application/vnd.syncml.dm+wbxml'],\n ['bed', 'application/vnd.realvnc.bed'],\n ['bh2', 'application/vnd.fujitsu.oasysprs'],\n [\n 'bin',\n ['application/octet-stream', 'application/mac-binary', 'application/macbinary', 'application/x-macbinary', 'application/x-binary']\n ],\n ['bm', 'image/bmp'],\n ['bmi', 'application/vnd.bmi'],\n ['bmp', ['image/bmp', 'image/x-windows-bmp']],\n ['boo', 'application/book'],\n ['book', 'application/book'],\n ['box', 'application/vnd.previewsystems.box'],\n ['boz', 'application/x-bzip2'],\n ['bsh', 'application/x-bsh'],\n ['btif', 'image/prs.btif'],\n ['bz', 'application/x-bzip'],\n ['bz2', 'application/x-bzip2'],\n ['c', ['text/plain', 'text/x-c']],\n ['c++', 'text/plain'],\n ['c11amc', 'application/vnd.cluetrust.cartomobile-config'],\n ['c11amz', 'application/vnd.cluetrust.cartomobile-config-pkg'],\n ['c4g', 'application/vnd.clonk.c4group'],\n ['cab', 'application/vnd.ms-cab-compressed'],\n ['car', 'application/vnd.curl.car'],\n ['cat', ['application/vnd.ms-pkiseccat', 'application/vnd.ms-pki.seccat']],\n ['cc', ['text/plain', 'text/x-c']],\n ['ccad', 'application/clariscad'],\n ['cco', 'application/x-cocoa'],\n ['ccxml', 'application/ccxml+xml,'],\n ['cdbcmsg', 'application/vnd.contact.cmsg'],\n ['cdf', ['application/cdf', 'application/x-cdf', 'application/x-netcdf']],\n ['cdkey', 'application/vnd.mediastation.cdkey'],\n ['cdmia', 'application/cdmi-capability'],\n ['cdmic', 'application/cdmi-container'],\n ['cdmid', 'application/cdmi-domain'],\n ['cdmio', 'application/cdmi-object'],\n ['cdmiq', 'application/cdmi-queue'],\n ['cdx', 'chemical/x-cdx'],\n ['cdxml', 'application/vnd.chemdraw+xml'],\n ['cdy', 'application/vnd.cinderella'],\n ['cer', ['application/pkix-cert', 'application/x-x509-ca-cert']],\n ['cgm', 'image/cgm'],\n ['cha', 'application/x-chat'],\n ['chat', 'application/x-chat'],\n ['chm', 'application/vnd.ms-htmlhelp'],\n ['chrt', 'application/vnd.kde.kchart'],\n ['cif', 'chemical/x-cif'],\n ['cii', 'application/vnd.anser-web-certificate-issue-initiation'],\n ['cil', 'application/vnd.ms-artgalry'],\n ['cla', 'application/vnd.claymore'],\n [\n 'class',\n ['application/octet-stream', 'application/java', 'application/java-byte-code', 'application/java-vm', 'application/x-java-class']\n ],\n ['clkk', 'application/vnd.crick.clicker.keyboard'],\n ['clkp', 'application/vnd.crick.clicker.palette'],\n ['clkt', 'application/vnd.crick.clicker.template'],\n ['clkw', 'application/vnd.crick.clicker.wordbank'],\n ['clkx', 'application/vnd.crick.clicker'],\n ['clp', 'application/x-msclip'],\n ['cmc', 'application/vnd.cosmocaller'],\n ['cmdf', 'chemical/x-cmdf'],\n ['cml', 'chemical/x-cml'],\n ['cmp', 'application/vnd.yellowriver-custom-menu'],\n ['cmx', 'image/x-cmx'],\n ['cod', ['image/cis-cod', 'application/vnd.rim.cod']],\n ['com', ['application/octet-stream', 'text/plain']],\n ['conf', 'text/plain'],\n ['cpio', 'application/x-cpio'],\n ['cpp', 'text/x-c'],\n ['cpt', ['application/mac-compactpro', 'application/x-compactpro', 'application/x-cpt']],\n ['crd', 'application/x-mscardfile'],\n ['crl', ['application/pkix-crl', 'application/pkcs-crl']],\n ['crt', ['application/pkix-cert', 'application/x-x509-user-cert', 'application/x-x509-ca-cert']],\n ['cryptonote', 'application/vnd.rig.cryptonote'],\n ['csh', ['text/x-script.csh', 'application/x-csh']],\n ['csml', 'chemical/x-csml'],\n ['csp', 'application/vnd.commonspace'],\n ['css', ['text/css', 'application/x-pointplus']],\n ['csv', 'text/csv'],\n ['cu', 'application/cu-seeme'],\n ['curl', 'text/vnd.curl'],\n ['cww', 'application/prs.cww'],\n ['cxx', 'text/plain'],\n ['dae', 'model/vnd.collada+xml'],\n ['daf', 'application/vnd.mobius.daf'],\n ['davmount', 'application/davmount+xml'],\n ['dcr', 'application/x-director'],\n ['dcurl', 'text/vnd.curl.dcurl'],\n ['dd2', 'application/vnd.oma.dd2+xml'],\n ['ddd', 'application/vnd.fujixerox.ddd'],\n ['deb', 'application/x-debian-package'],\n ['deepv', 'application/x-deepv'],\n ['def', 'text/plain'],\n ['der', 'application/x-x509-ca-cert'],\n ['dfac', 'application/vnd.dreamfactory'],\n ['dif', 'video/x-dv'],\n ['dir', 'application/x-director'],\n ['dis', 'application/vnd.mobius.dis'],\n ['djvu', 'image/vnd.djvu'],\n ['dl', ['video/dl', 'video/x-dl']],\n ['dll', 'application/x-msdownload'],\n ['dms', 'application/octet-stream'],\n ['dna', 'application/vnd.dna'],\n ['doc', 'application/msword'],\n ['docm', 'application/vnd.ms-word.document.macroenabled.12'],\n ['docx', 'application/vnd.openxmlformats-officedocument.wordprocessingml.document'],\n ['dot', 'application/msword'],\n ['dotm', 'application/vnd.ms-word.template.macroenabled.12'],\n ['dotx', 'application/vnd.openxmlformats-officedocument.wordprocessingml.template'],\n ['dp', ['application/commonground', 'application/vnd.osgi.dp']],\n ['dpg', 'application/vnd.dpgraph'],\n ['dra', 'audio/vnd.dra'],\n ['drw', 'application/drafting'],\n ['dsc', 'text/prs.lines.tag'],\n ['dssc', 'application/dssc+der'],\n ['dtb', 'application/x-dtbook+xml'],\n ['dtd', 'application/xml-dtd'],\n ['dts', 'audio/vnd.dts'],\n ['dtshd', 'audio/vnd.dts.hd'],\n ['dump', 'application/octet-stream'],\n ['dv', 'video/x-dv'],\n ['dvi', 'application/x-dvi'],\n ['dwf', ['model/vnd.dwf', 'drawing/x-dwf']],\n ['dwg', ['application/acad', 'image/vnd.dwg', 'image/x-dwg']],\n ['dxf', ['application/dxf', 'image/vnd.dwg', 'image/vnd.dxf', 'image/x-dwg']],\n ['dxp', 'application/vnd.spotfire.dxp'],\n ['dxr', 'application/x-director'],\n ['ecelp4800', 'audio/vnd.nuera.ecelp4800'],\n ['ecelp7470', 'audio/vnd.nuera.ecelp7470'],\n ['ecelp9600', 'audio/vnd.nuera.ecelp9600'],\n ['edm', 'application/vnd.novadigm.edm'],\n ['edx', 'application/vnd.novadigm.edx'],\n ['efif', 'application/vnd.picsel'],\n ['ei6', 'application/vnd.pg.osasli'],\n ['el', 'text/x-script.elisp'],\n ['elc', ['application/x-elc', 'application/x-bytecode.elisp']],\n ['eml', 'message/rfc822'],\n ['emma', 'application/emma+xml'],\n ['env', 'application/x-envoy'],\n ['eol', 'audio/vnd.digital-winds'],\n ['eot', 'application/vnd.ms-fontobject'],\n ['eps', 'application/postscript'],\n ['epub', 'application/epub+zip'],\n ['es', ['application/ecmascript', 'application/x-esrehber']],\n ['es3', 'application/vnd.eszigno3+xml'],\n ['esf', 'application/vnd.epson.esf'],\n ['etx', 'text/x-setext'],\n ['evy', ['application/envoy', 'application/x-envoy']],\n ['exe', ['application/octet-stream', 'application/x-msdownload']],\n ['exi', 'application/exi'],\n ['ext', 'application/vnd.novadigm.ext'],\n ['ez2', 'application/vnd.ezpix-album'],\n ['ez3', 'application/vnd.ezpix-package'],\n ['f', ['text/plain', 'text/x-fortran']],\n ['f4v', 'video/x-f4v'],\n ['f77', 'text/x-fortran'],\n ['f90', ['text/plain', 'text/x-fortran']],\n ['fbs', 'image/vnd.fastbidsheet'],\n ['fcs', 'application/vnd.isac.fcs'],\n ['fdf', 'application/vnd.fdf'],\n ['fe_launch', 'application/vnd.denovo.fcselayout-link'],\n ['fg5', 'application/vnd.fujitsu.oasysgp'],\n ['fh', 'image/x-freehand'],\n ['fif', ['application/fractals', 'image/fif']],\n ['fig', 'application/x-xfig'],\n ['fli', ['video/fli', 'video/x-fli']],\n ['flo', ['image/florian', 'application/vnd.micrografx.flo']],\n ['flr', 'x-world/x-vrml'],\n ['flv', 'video/x-flv'],\n ['flw', 'application/vnd.kde.kivio'],\n ['flx', 'text/vnd.fmi.flexstor'],\n ['fly', 'text/vnd.fly'],\n ['fm', 'application/vnd.framemaker'],\n ['fmf', 'video/x-atomic3d-feature'],\n ['fnc', 'application/vnd.frogans.fnc'],\n ['for', ['text/plain', 'text/x-fortran']],\n ['fpx', ['image/vnd.fpx', 'image/vnd.net-fpx']],\n ['frl', 'application/freeloader'],\n ['fsc', 'application/vnd.fsc.weblaunch'],\n ['fst', 'image/vnd.fst'],\n ['ftc', 'application/vnd.fluxtime.clip'],\n ['fti', 'application/vnd.anser-web-funds-transfer-initiation'],\n ['funk', 'audio/make'],\n ['fvt', 'video/vnd.fvt'],\n ['fxp', 'application/vnd.adobe.fxp'],\n ['fzs', 'application/vnd.fuzzysheet'],\n ['g', 'text/plain'],\n ['g2w', 'application/vnd.geoplan'],\n ['g3', 'image/g3fax'],\n ['g3w', 'application/vnd.geospace'],\n ['gac', 'application/vnd.groove-account'],\n ['gdl', 'model/vnd.gdl'],\n ['geo', 'application/vnd.dynageo'],\n ['geojson', 'application/geo+json'],\n ['gex', 'application/vnd.geometry-explorer'],\n ['ggb', 'application/vnd.geogebra.file'],\n ['ggt', 'application/vnd.geogebra.tool'],\n ['ghf', 'application/vnd.groove-help'],\n ['gif', 'image/gif'],\n ['gim', 'application/vnd.groove-identity-message'],\n ['gl', ['video/gl', 'video/x-gl']],\n ['gmx', 'application/vnd.gmx'],\n ['gnumeric', 'application/x-gnumeric'],\n ['gph', 'application/vnd.flographit'],\n ['gqf', 'application/vnd.grafeq'],\n ['gram', 'application/srgs'],\n ['grv', 'application/vnd.groove-injector'],\n ['grxml', 'application/srgs+xml'],\n ['gsd', 'audio/x-gsm'],\n ['gsf', 'application/x-font-ghostscript'],\n ['gsm', 'audio/x-gsm'],\n ['gsp', 'application/x-gsp'],\n ['gss', 'application/x-gss'],\n ['gtar', 'application/x-gtar'],\n ['gtm', 'application/vnd.groove-tool-message'],\n ['gtw', 'model/vnd.gtw'],\n ['gv', 'text/vnd.graphviz'],\n ['gxt', 'application/vnd.geonext'],\n ['gz', ['application/x-gzip', 'application/x-compressed']],\n ['gzip', ['multipart/x-gzip', 'application/x-gzip']],\n ['h', ['text/plain', 'text/x-h']],\n ['h261', 'video/h261'],\n ['h263', 'video/h263'],\n ['h264', 'video/h264'],\n ['hal', 'application/vnd.hal+xml'],\n ['hbci', 'application/vnd.hbci'],\n ['hdf', 'application/x-hdf'],\n ['help', 'application/x-helpfile'],\n ['hgl', 'application/vnd.hp-hpgl'],\n ['hh', ['text/plain', 'text/x-h']],\n ['hlb', 'text/x-script'],\n ['hlp', ['application/winhlp', 'application/hlp', 'application/x-helpfile', 'application/x-winhelp']],\n ['hpg', 'application/vnd.hp-hpgl'],\n ['hpgl', 'application/vnd.hp-hpgl'],\n ['hpid', 'application/vnd.hp-hpid'],\n ['hps', 'application/vnd.hp-hps'],\n [\n 'hqx',\n [\n 'application/mac-binhex40',\n 'application/binhex',\n 'application/binhex4',\n 'application/mac-binhex',\n 'application/x-binhex40',\n 'application/x-mac-binhex40'\n ]\n ],\n ['hta', 'application/hta'],\n ['htc', 'text/x-component'],\n ['htke', 'application/vnd.kenameaapp'],\n ['htm', 'text/html'],\n ['html', 'text/html'],\n ['htmls', 'text/html'],\n ['htt', 'text/webviewhtml'],\n ['htx', 'text/html'],\n ['hvd', 'application/vnd.yamaha.hv-dic'],\n ['hvp', 'application/vnd.yamaha.hv-voice'],\n ['hvs', 'application/vnd.yamaha.hv-script'],\n ['i2g', 'application/vnd.intergeo'],\n ['icc', 'application/vnd.iccprofile'],\n ['ice', 'x-conference/x-cooltalk'],\n ['ico', 'image/x-icon'],\n ['ics', 'text/calendar'],\n ['idc', 'text/plain'],\n ['ief', 'image/ief'],\n ['iefs', 'image/ief'],\n ['ifm', 'application/vnd.shana.informed.formdata'],\n ['iges', ['application/iges', 'model/iges']],\n ['igl', 'application/vnd.igloader'],\n ['igm', 'application/vnd.insors.igm'],\n ['igs', ['application/iges', 'model/iges']],\n ['igx', 'application/vnd.micrografx.igx'],\n ['iif', 'application/vnd.shana.informed.interchange'],\n ['iii', 'application/x-iphone'],\n ['ima', 'application/x-ima'],\n ['imap', 'application/x-httpd-imap'],\n ['imp', 'application/vnd.accpac.simply.imp'],\n ['ims', 'application/vnd.ms-ims'],\n ['inf', 'application/inf'],\n ['ins', ['application/x-internet-signup', 'application/x-internett-signup']],\n ['ip', 'application/x-ip2'],\n ['ipfix', 'application/ipfix'],\n ['ipk', 'application/vnd.shana.informed.package'],\n ['irm', 'application/vnd.ibm.rights-management'],\n ['irp', 'application/vnd.irepository.package+xml'],\n ['isp', 'application/x-internet-signup'],\n ['isu', 'video/x-isvideo'],\n ['it', 'audio/it'],\n ['itp', 'application/vnd.shana.informed.formtemplate'],\n ['iv', 'application/x-inventor'],\n ['ivp', 'application/vnd.immervision-ivp'],\n ['ivr', 'i-world/i-vrml'],\n ['ivu', 'application/vnd.immervision-ivu'],\n ['ivy', 'application/x-livescreen'],\n ['jad', 'text/vnd.sun.j2me.app-descriptor'],\n ['jam', ['application/vnd.jam', 'audio/x-jam']],\n ['jar', 'application/java-archive'],\n ['jav', ['text/plain', 'text/x-java-source']],\n ['java', ['text/plain', 'text/x-java-source,java', 'text/x-java-source']],\n ['jcm', 'application/x-java-commerce'],\n ['jfif', ['image/pipeg', 'image/jpeg', 'image/pjpeg']],\n ['jfif-tbnl', 'image/jpeg'],\n ['jisp', 'application/vnd.jisp'],\n ['jlt', 'application/vnd.hp-jlyt'],\n ['jnlp', 'application/x-java-jnlp-file'],\n ['joda', 'application/vnd.joost.joda-archive'],\n ['jpe', ['image/jpeg', 'image/pjpeg']],\n ['jpeg', ['image/jpeg', 'image/pjpeg']],\n ['jpg', ['image/jpeg', 'image/pjpeg']],\n ['jpgv', 'video/jpeg'],\n ['jpm', 'video/jpm'],\n ['jps', 'image/x-jps'],\n ['js', ['application/javascript', 'application/ecmascript', 'text/javascript', 'text/ecmascript', 'application/x-javascript']],\n ['json', 'application/json'],\n ['jut', 'image/jutvision'],\n ['kar', ['audio/midi', 'music/x-karaoke']],\n ['karbon', 'application/vnd.kde.karbon'],\n ['kfo', 'application/vnd.kde.kformula'],\n ['kia', 'application/vnd.kidspiration'],\n ['kml', 'application/vnd.google-earth.kml+xml'],\n ['kmz', 'application/vnd.google-earth.kmz'],\n ['kne', 'application/vnd.kinar'],\n ['kon', 'application/vnd.kde.kontour'],\n ['kpr', 'application/vnd.kde.kpresenter'],\n ['ksh', ['application/x-ksh', 'text/x-script.ksh']],\n ['ksp', 'application/vnd.kde.kspread'],\n ['ktx', 'image/ktx'],\n ['ktz', 'application/vnd.kahootz'],\n ['kwd', 'application/vnd.kde.kword'],\n ['la', ['audio/nspaudio', 'audio/x-nspaudio']],\n ['lam', 'audio/x-liveaudio'],\n ['lasxml', 'application/vnd.las.las+xml'],\n ['latex', 'application/x-latex'],\n ['lbd', 'application/vnd.llamagraphics.life-balance.desktop'],\n ['lbe', 'application/vnd.llamagraphics.life-balance.exchange+xml'],\n ['les', 'application/vnd.hhe.lesson-player'],\n ['lha', ['application/octet-stream', 'application/lha', 'application/x-lha']],\n ['lhx', 'application/octet-stream'],\n ['link66', 'application/vnd.route66.link66+xml'],\n ['list', 'text/plain'],\n ['lma', ['audio/nspaudio', 'audio/x-nspaudio']],\n ['log', 'text/plain'],\n ['lrm', 'application/vnd.ms-lrm'],\n ['lsf', 'video/x-la-asf'],\n ['lsp', ['application/x-lisp', 'text/x-script.lisp']],\n ['lst', 'text/plain'],\n ['lsx', ['video/x-la-asf', 'text/x-la-asf']],\n ['ltf', 'application/vnd.frogans.ltf'],\n ['ltx', 'application/x-latex'],\n ['lvp', 'audio/vnd.lucent.voice'],\n ['lwp', 'application/vnd.lotus-wordpro'],\n ['lzh', ['application/octet-stream', 'application/x-lzh']],\n ['lzx', ['application/lzx', 'application/octet-stream', 'application/x-lzx']],\n ['m', ['text/plain', 'text/x-m']],\n ['m13', 'application/x-msmediaview'],\n ['m14', 'application/x-msmediaview'],\n ['m1v', 'video/mpeg'],\n ['m21', 'application/mp21'],\n ['m2a', 'audio/mpeg'],\n ['m2v', 'video/mpeg'],\n ['m3u', ['audio/x-mpegurl', 'audio/x-mpequrl']],\n ['m3u8', 'application/vnd.apple.mpegurl'],\n ['m4v', 'video/x-m4v'],\n ['ma', 'application/mathematica'],\n ['mads', 'application/mads+xml'],\n ['mag', 'application/vnd.ecowin.chart'],\n ['man', 'application/x-troff-man'],\n ['map', 'application/x-navimap'],\n ['mar', 'text/plain'],\n ['mathml', 'application/mathml+xml'],\n ['mbd', 'application/mbedlet'],\n ['mbk', 'application/vnd.mobius.mbk'],\n ['mbox', 'application/mbox'],\n ['mc$', 'application/x-magic-cap-package-1.0'],\n ['mc1', 'application/vnd.medcalcdata'],\n ['mcd', ['application/mcad', 'application/vnd.mcd', 'application/x-mathcad']],\n ['mcf', ['image/vasa', 'text/mcf']],\n ['mcp', 'application/netmc'],\n ['mcurl', 'text/vnd.curl.mcurl'],\n ['mdb', 'application/x-msaccess'],\n ['mdi', 'image/vnd.ms-modi'],\n ['me', 'application/x-troff-me'],\n ['meta4', 'application/metalink4+xml'],\n ['mets', 'application/mets+xml'],\n ['mfm', 'application/vnd.mfmp'],\n ['mgp', 'application/vnd.osgeo.mapguide.package'],\n ['mgz', 'application/vnd.proteus.magazine'],\n ['mht', 'message/rfc822'],\n ['mhtml', 'message/rfc822'],\n ['mid', ['audio/mid', 'audio/midi', 'music/crescendo', 'x-music/x-midi', 'audio/x-midi', 'application/x-midi', 'audio/x-mid']],\n ['midi', ['audio/midi', 'music/crescendo', 'x-music/x-midi', 'audio/x-midi', 'application/x-midi', 'audio/x-mid']],\n ['mif', ['application/vnd.mif', 'application/x-mif', 'application/x-frame']],\n ['mime', ['message/rfc822', 'www/mime']],\n ['mj2', 'video/mj2'],\n ['mjf', 'audio/x-vnd.audioexplosion.mjuicemediafile'],\n ['mjpg', 'video/x-motion-jpeg'],\n ['mlp', 'application/vnd.dolby.mlp'],\n ['mm', ['application/base64', 'application/x-meme']],\n ['mmd', 'application/vnd.chipnuts.karaoke-mmd'],\n ['mme', 'application/base64'],\n ['mmf', 'application/vnd.smaf'],\n ['mmr', 'image/vnd.fujixerox.edmics-mmr'],\n ['mny', 'application/x-msmoney'],\n ['mod', ['audio/mod', 'audio/x-mod']],\n ['mods', 'application/mods+xml'],\n ['moov', 'video/quicktime'],\n ['mov', 'video/quicktime'],\n ['movie', 'video/x-sgi-movie'],\n ['mp2', ['video/mpeg', 'audio/mpeg', 'video/x-mpeg', 'audio/x-mpeg', 'video/x-mpeq2a']],\n ['mp3', ['audio/mpeg', 'audio/mpeg3', 'video/mpeg', 'audio/x-mpeg-3', 'video/x-mpeg']],\n ['mp4', ['video/mp4', 'application/mp4']],\n ['mp4a', 'audio/mp4'],\n ['mpa', ['video/mpeg', 'audio/mpeg']],\n ['mpc', ['application/vnd.mophun.certificate', 'application/x-project']],\n ['mpe', 'video/mpeg'],\n ['mpeg', 'video/mpeg'],\n ['mpg', ['video/mpeg', 'audio/mpeg']],\n ['mpga', 'audio/mpeg'],\n ['mpkg', 'application/vnd.apple.installer+xml'],\n ['mpm', 'application/vnd.blueice.multipass'],\n ['mpn', 'application/vnd.mophun.application'],\n ['mpp', 'application/vnd.ms-project'],\n ['mpt', 'application/x-project'],\n ['mpv', 'application/x-project'],\n ['mpv2', 'video/mpeg'],\n ['mpx', 'application/x-project'],\n ['mpy', 'application/vnd.ibm.minipay'],\n ['mqy', 'application/vnd.mobius.mqy'],\n ['mrc', 'application/marc'],\n ['mrcx', 'application/marcxml+xml'],\n ['ms', 'application/x-troff-ms'],\n ['mscml', 'application/mediaservercontrol+xml'],\n ['mseq', 'application/vnd.mseq'],\n ['msf', 'application/vnd.epson.msf'],\n ['msg', 'application/vnd.ms-outlook'],\n ['msh', 'model/mesh'],\n ['msl', 'application/vnd.mobius.msl'],\n ['msty', 'application/vnd.muvee.style'],\n ['mts', 'model/vnd.mts'],\n ['mus', 'application/vnd.musician'],\n ['musicxml', 'application/vnd.recordare.musicxml+xml'],\n ['mv', 'video/x-sgi-movie'],\n ['mvb', 'application/x-msmediaview'],\n ['mwf', 'application/vnd.mfer'],\n ['mxf', 'application/mxf'],\n ['mxl', 'application/vnd.recordare.musicxml'],\n ['mxml', 'application/xv+xml'],\n ['mxs', 'application/vnd.triscape.mxs'],\n ['mxu', 'video/vnd.mpegurl'],\n ['my', 'audio/make'],\n ['mzz', 'application/x-vnd.audioexplosion.mzz'],\n ['n-gage', 'application/vnd.nokia.n-gage.symbian.install'],\n ['n3', 'text/n3'],\n ['nap', 'image/naplps'],\n ['naplps', 'image/naplps'],\n ['nbp', 'application/vnd.wolfram.player'],\n ['nc', 'application/x-netcdf'],\n ['ncm', 'application/vnd.nokia.configuration-message'],\n ['ncx', 'application/x-dtbncx+xml'],\n ['ngdat', 'application/vnd.nokia.n-gage.data'],\n ['nif', 'image/x-niff'],\n ['niff', 'image/x-niff'],\n ['nix', 'application/x-mix-transfer'],\n ['nlu', 'application/vnd.neurolanguage.nlu'],\n ['nml', 'application/vnd.enliven'],\n ['nnd', 'application/vnd.noblenet-directory'],\n ['nns', 'application/vnd.noblenet-sealer'],\n ['nnw', 'application/vnd.noblenet-web'],\n ['npx', 'image/vnd.net-fpx'],\n ['nsc', 'application/x-conference'],\n ['nsf', 'application/vnd.lotus-notes'],\n ['nvd', 'application/x-navidoc'],\n ['nws', 'message/rfc822'],\n ['o', 'application/octet-stream'],\n ['oa2', 'application/vnd.fujitsu.oasys2'],\n ['oa3', 'application/vnd.fujitsu.oasys3'],\n ['oas', 'application/vnd.fujitsu.oasys'],\n ['obd', 'application/x-msbinder'],\n ['oda', 'application/oda'],\n ['odb', 'application/vnd.oasis.opendocument.database'],\n ['odc', 'application/vnd.oasis.opendocument.chart'],\n ['odf', 'application/vnd.oasis.opendocument.formula'],\n ['odft', 'application/vnd.oasis.opendocument.formula-template'],\n ['odg', 'application/vnd.oasis.opendocument.graphics'],\n ['odi', 'application/vnd.oasis.opendocument.image'],\n ['odm', 'application/vnd.oasis.opendocument.text-master'],\n ['odp', 'application/vnd.oasis.opendocument.presentation'],\n ['ods', 'application/vnd.oasis.opendocument.spreadsheet'],\n ['odt', 'application/vnd.oasis.opendocument.text'],\n ['oga', 'audio/ogg'],\n ['ogv', 'video/ogg'],\n ['ogx', 'application/ogg'],\n ['omc', 'application/x-omc'],\n ['omcd', 'application/x-omcdatamaker'],\n ['omcr', 'application/x-omcregerator'],\n ['onetoc', 'application/onenote'],\n ['opf', 'application/oebps-package+xml'],\n ['org', 'application/vnd.lotus-organizer'],\n ['osf', 'application/vnd.yamaha.openscoreformat'],\n ['osfpvg', 'application/vnd.yamaha.openscoreformat.osfpvg+xml'],\n ['otc', 'application/vnd.oasis.opendocument.chart-template'],\n ['otf', 'application/x-font-otf'],\n ['otg', 'application/vnd.oasis.opendocument.graphics-template'],\n ['oth', 'application/vnd.oasis.opendocument.text-web'],\n ['oti', 'application/vnd.oasis.opendocument.image-template'],\n ['otp', 'application/vnd.oasis.opendocument.presentation-template'],\n ['ots', 'application/vnd.oasis.opendocument.spreadsheet-template'],\n ['ott', 'application/vnd.oasis.opendocument.text-template'],\n ['oxt', 'application/vnd.openofficeorg.extension'],\n ['p', 'text/x-pascal'],\n ['p10', ['application/pkcs10', 'application/x-pkcs10']],\n ['p12', ['application/pkcs-12', 'application/x-pkcs12']],\n ['p7a', 'application/x-pkcs7-signature'],\n ['p7b', 'application/x-pkcs7-certificates'],\n ['p7c', ['application/pkcs7-mime', 'application/x-pkcs7-mime']],\n ['p7m', ['application/pkcs7-mime', 'application/x-pkcs7-mime']],\n ['p7r', 'application/x-pkcs7-certreqresp'],\n ['p7s', ['application/pkcs7-signature', 'application/x-pkcs7-signature']],\n ['p8', 'application/pkcs8'],\n ['par', 'text/plain-bas'],\n ['part', 'application/pro_eng'],\n ['pas', 'text/pascal'],\n ['paw', 'application/vnd.pawaafile'],\n ['pbd', 'application/vnd.powerbuilder6'],\n ['pbm', 'image/x-portable-bitmap'],\n ['pcf', 'application/x-font-pcf'],\n ['pcl', ['application/vnd.hp-pcl', 'application/x-pcl']],\n ['pclxl', 'application/vnd.hp-pclxl'],\n ['pct', 'image/x-pict'],\n ['pcurl', 'application/vnd.curl.pcurl'],\n ['pcx', 'image/x-pcx'],\n ['pdb', ['application/vnd.palm', 'chemical/x-pdb']],\n ['pdf', 'application/pdf'],\n ['pfa', 'application/x-font-type1'],\n ['pfr', 'application/font-tdpfr'],\n ['pfunk', ['audio/make', 'audio/make.my.funk']],\n ['pfx', 'application/x-pkcs12'],\n ['pgm', ['image/x-portable-graymap', 'image/x-portable-greymap']],\n ['pgn', 'application/x-chess-pgn'],\n ['pgp', 'application/pgp-signature'],\n ['pic', ['image/pict', 'image/x-pict']],\n ['pict', 'image/pict'],\n ['pkg', 'application/x-newton-compatible-pkg'],\n ['pki', 'application/pkixcmp'],\n ['pkipath', 'application/pkix-pkipath'],\n ['pko', ['application/ynd.ms-pkipko', 'application/vnd.ms-pki.pko']],\n ['pl', ['text/plain', 'text/x-script.perl']],\n ['plb', 'application/vnd.3gpp.pic-bw-large'],\n ['plc', 'application/vnd.mobius.plc'],\n ['plf', 'application/vnd.pocketlearn'],\n ['pls', 'application/pls+xml'],\n ['plx', 'application/x-pixclscript'],\n ['pm', ['text/x-script.perl-module', 'image/x-xpixmap']],\n ['pm4', 'application/x-pagemaker'],\n ['pm5', 'application/x-pagemaker'],\n ['pma', 'application/x-perfmon'],\n ['pmc', 'application/x-perfmon'],\n ['pml', ['application/vnd.ctc-posml', 'application/x-perfmon']],\n ['pmr', 'application/x-perfmon'],\n ['pmw', 'application/x-perfmon'],\n ['png', 'image/png'],\n ['pnm', ['application/x-portable-anymap', 'image/x-portable-anymap']],\n ['portpkg', 'application/vnd.macports.portpkg'],\n ['pot', ['application/vnd.ms-powerpoint', 'application/mspowerpoint']],\n ['potm', 'application/vnd.ms-powerpoint.template.macroenabled.12'],\n ['potx', 'application/vnd.openxmlformats-officedocument.presentationml.template'],\n ['pov', 'model/x-pov'],\n ['ppa', 'application/vnd.ms-powerpoint'],\n ['ppam', 'application/vnd.ms-powerpoint.addin.macroenabled.12'],\n ['ppd', 'application/vnd.cups-ppd'],\n ['ppm', 'image/x-portable-pixmap'],\n ['pps', ['application/vnd.ms-powerpoint', 'application/mspowerpoint']],\n ['ppsm', 'application/vnd.ms-powerpoint.slideshow.macroenabled.12'],\n ['ppsx', 'application/vnd.openxmlformats-officedocument.presentationml.slideshow'],\n ['ppt', ['application/vnd.ms-powerpoint', 'application/mspowerpoint', 'application/powerpoint', 'application/x-mspowerpoint']],\n ['pptm', 'application/vnd.ms-powerpoint.presentation.macroenabled.12'],\n ['pptx', 'application/vnd.openxmlformats-officedocument.presentationml.presentation'],\n ['ppz', 'application/mspowerpoint'],\n ['prc', 'application/x-mobipocket-ebook'],\n ['pre', ['application/vnd.lotus-freelance', 'application/x-freelance']],\n ['prf', 'application/pics-rules'],\n ['prt', 'application/pro_eng'],\n ['ps', 'application/postscript'],\n ['psb', 'application/vnd.3gpp.pic-bw-small'],\n ['psd', ['application/octet-stream', 'image/vnd.adobe.photoshop']],\n ['psf', 'application/x-font-linux-psf'],\n ['pskcxml', 'application/pskc+xml'],\n ['ptid', 'application/vnd.pvi.ptid1'],\n ['pub', 'application/x-mspublisher'],\n ['pvb', 'application/vnd.3gpp.pic-bw-var'],\n ['pvu', 'paleovu/x-pv'],\n ['pwn', 'application/vnd.3m.post-it-notes'],\n ['pwz', 'application/vnd.ms-powerpoint'],\n ['py', 'text/x-script.phyton'],\n ['pya', 'audio/vnd.ms-playready.media.pya'],\n ['pyc', 'application/x-bytecode.python'],\n ['pyv', 'video/vnd.ms-playready.media.pyv'],\n ['qam', 'application/vnd.epson.quickanime'],\n ['qbo', 'application/vnd.intu.qbo'],\n ['qcp', 'audio/vnd.qcelp'],\n ['qd3', 'x-world/x-3dmf'],\n ['qd3d', 'x-world/x-3dmf'],\n ['qfx', 'application/vnd.intu.qfx'],\n ['qif', 'image/x-quicktime'],\n ['qps', 'application/vnd.publishare-delta-tree'],\n ['qt', 'video/quicktime'],\n ['qtc', 'video/x-qtc'],\n ['qti', 'image/x-quicktime'],\n ['qtif', 'image/x-quicktime'],\n ['qxd', 'application/vnd.quark.quarkxpress'],\n ['ra', ['audio/x-realaudio', 'audio/x-pn-realaudio', 'audio/x-pn-realaudio-plugin']],\n ['ram', 'audio/x-pn-realaudio'],\n ['rar', 'application/x-rar-compressed'],\n ['ras', ['image/cmu-raster', 'application/x-cmu-raster', 'image/x-cmu-raster']],\n ['rast', 'image/cmu-raster'],\n ['rcprofile', 'application/vnd.ipunplugged.rcprofile'],\n ['rdf', 'application/rdf+xml'],\n ['rdz', 'application/vnd.data-vision.rdz'],\n ['rep', 'application/vnd.businessobjects'],\n ['res', 'application/x-dtbresource+xml'],\n ['rexx', 'text/x-script.rexx'],\n ['rf', 'image/vnd.rn-realflash'],\n ['rgb', 'image/x-rgb'],\n ['rif', 'application/reginfo+xml'],\n ['rip', 'audio/vnd.rip'],\n ['rl', 'application/resource-lists+xml'],\n ['rlc', 'image/vnd.fujixerox.edmics-rlc'],\n ['rld', 'application/resource-lists-diff+xml'],\n ['rm', ['application/vnd.rn-realmedia', 'audio/x-pn-realaudio']],\n ['rmi', 'audio/mid'],\n ['rmm', 'audio/x-pn-realaudio'],\n ['rmp', ['audio/x-pn-realaudio-plugin', 'audio/x-pn-realaudio']],\n ['rms', 'application/vnd.jcp.javame.midlet-rms'],\n ['rnc', 'application/relax-ng-compact-syntax'],\n ['rng', ['application/ringing-tones', 'application/vnd.nokia.ringing-tone']],\n ['rnx', 'application/vnd.rn-realplayer'],\n ['roff', 'application/x-troff'],\n ['rp', 'image/vnd.rn-realpix'],\n ['rp9', 'application/vnd.cloanto.rp9'],\n ['rpm', 'audio/x-pn-realaudio-plugin'],\n ['rpss', 'application/vnd.nokia.radio-presets'],\n ['rpst', 'application/vnd.nokia.radio-preset'],\n ['rq', 'application/sparql-query'],\n ['rs', 'application/rls-services+xml'],\n ['rsd', 'application/rsd+xml'],\n ['rt', ['text/richtext', 'text/vnd.rn-realtext']],\n ['rtf', ['application/rtf', 'text/richtext', 'application/x-rtf']],\n ['rtx', ['text/richtext', 'application/rtf']],\n ['rv', 'video/vnd.rn-realvideo'],\n ['s', 'text/x-asm'],\n ['s3m', 'audio/s3m'],\n ['saf', 'application/vnd.yamaha.smaf-audio'],\n ['saveme', 'application/octet-stream'],\n ['sbk', 'application/x-tbook'],\n ['sbml', 'application/sbml+xml'],\n ['sc', 'application/vnd.ibm.secure-container'],\n ['scd', 'application/x-msschedule'],\n [\n 'scm',\n ['application/vnd.lotus-screencam', 'video/x-scm', 'text/x-script.guile', 'application/x-lotusscreencam', 'text/x-script.scheme']\n ],\n ['scq', 'application/scvp-cv-request'],\n ['scs', 'application/scvp-cv-response'],\n ['sct', 'text/scriptlet'],\n ['scurl', 'text/vnd.curl.scurl'],\n ['sda', 'application/vnd.stardivision.draw'],\n ['sdc', 'application/vnd.stardivision.calc'],\n ['sdd', 'application/vnd.stardivision.impress'],\n ['sdkm', 'application/vnd.solent.sdkm+xml'],\n ['sdml', 'text/plain'],\n ['sdp', ['application/sdp', 'application/x-sdp']],\n ['sdr', 'application/sounder'],\n ['sdw', 'application/vnd.stardivision.writer'],\n ['sea', ['application/sea', 'application/x-sea']],\n ['see', 'application/vnd.seemail'],\n ['seed', 'application/vnd.fdsn.seed'],\n ['sema', 'application/vnd.sema'],\n ['semd', 'application/vnd.semd'],\n ['semf', 'application/vnd.semf'],\n ['ser', 'application/java-serialized-object'],\n ['set', 'application/set'],\n ['setpay', 'application/set-payment-initiation'],\n ['setreg', 'application/set-registration-initiation'],\n ['sfd-hdstx', 'application/vnd.hydrostatix.sof-data'],\n ['sfs', 'application/vnd.spotfire.sfs'],\n ['sgl', 'application/vnd.stardivision.writer-global'],\n ['sgm', ['text/sgml', 'text/x-sgml']],\n ['sgml', ['text/sgml', 'text/x-sgml']],\n ['sh', ['application/x-shar', 'application/x-bsh', 'application/x-sh', 'text/x-script.sh']],\n ['shar', ['application/x-bsh', 'application/x-shar']],\n ['shf', 'application/shf+xml'],\n ['shtml', ['text/html', 'text/x-server-parsed-html']],\n ['sid', 'audio/x-psid'],\n ['sis', 'application/vnd.symbian.install'],\n ['sit', ['application/x-stuffit', 'application/x-sit']],\n ['sitx', 'application/x-stuffitx'],\n ['skd', 'application/x-koan'],\n ['skm', 'application/x-koan'],\n ['skp', ['application/vnd.koan', 'application/x-koan']],\n ['skt', 'application/x-koan'],\n ['sl', 'application/x-seelogo'],\n ['sldm', 'application/vnd.ms-powerpoint.slide.macroenabled.12'],\n ['sldx', 'application/vnd.openxmlformats-officedocument.presentationml.slide'],\n ['slt', 'application/vnd.epson.salt'],\n ['sm', 'application/vnd.stepmania.stepchart'],\n ['smf', 'application/vnd.stardivision.math'],\n ['smi', ['application/smil', 'application/smil+xml']],\n ['smil', 'application/smil'],\n ['snd', ['audio/basic', 'audio/x-adpcm']],\n ['snf', 'application/x-font-snf'],\n ['sol', 'application/solids'],\n ['spc', ['text/x-speech', 'application/x-pkcs7-certificates']],\n ['spf', 'application/vnd.yamaha.smaf-phrase'],\n ['spl', ['application/futuresplash', 'application/x-futuresplash']],\n ['spot', 'text/vnd.in3d.spot'],\n ['spp', 'application/scvp-vp-response'],\n ['spq', 'application/scvp-vp-request'],\n ['spr', 'application/x-sprite'],\n ['sprite', 'application/x-sprite'],\n ['src', 'application/x-wais-source'],\n ['sru', 'application/sru+xml'],\n ['srx', 'application/sparql-results+xml'],\n ['sse', 'application/vnd.kodak-descriptor'],\n ['ssf', 'application/vnd.epson.ssf'],\n ['ssi', 'text/x-server-parsed-html'],\n ['ssm', 'application/streamingmedia'],\n ['ssml', 'application/ssml+xml'],\n ['sst', ['application/vnd.ms-pkicertstore', 'application/vnd.ms-pki.certstore']],\n ['st', 'application/vnd.sailingtracker.track'],\n ['stc', 'application/vnd.sun.xml.calc.template'],\n ['std', 'application/vnd.sun.xml.draw.template'],\n ['step', 'application/step'],\n ['stf', 'application/vnd.wt.stf'],\n ['sti', 'application/vnd.sun.xml.impress.template'],\n ['stk', 'application/hyperstudio'],\n ['stl', ['application/vnd.ms-pkistl', 'application/sla', 'application/vnd.ms-pki.stl', 'application/x-navistyle']],\n ['stm', 'text/html'],\n ['stp', 'application/step'],\n ['str', 'application/vnd.pg.format'],\n ['stw', 'application/vnd.sun.xml.writer.template'],\n ['sub', 'image/vnd.dvb.subtitle'],\n ['sus', 'application/vnd.sus-calendar'],\n ['sv4cpio', 'application/x-sv4cpio'],\n ['sv4crc', 'application/x-sv4crc'],\n ['svc', 'application/vnd.dvb.service'],\n ['svd', 'application/vnd.svd'],\n ['svf', ['image/vnd.dwg', 'image/x-dwg']],\n ['svg', 'image/svg+xml'],\n ['svr', ['x-world/x-svr', 'application/x-world']],\n ['swf', 'application/x-shockwave-flash'],\n ['swi', 'application/vnd.aristanetworks.swi'],\n ['sxc', 'application/vnd.sun.xml.calc'],\n ['sxd', 'application/vnd.sun.xml.draw'],\n ['sxg', 'application/vnd.sun.xml.writer.global'],\n ['sxi', 'application/vnd.sun.xml.impress'],\n ['sxm', 'application/vnd.sun.xml.math'],\n ['sxw', 'application/vnd.sun.xml.writer'],\n ['t', ['text/troff', 'application/x-troff']],\n ['talk', 'text/x-speech'],\n ['tao', 'application/vnd.tao.intent-module-archive'],\n ['tar', 'application/x-tar'],\n ['tbk', ['application/toolbook', 'application/x-tbook']],\n ['tcap', 'application/vnd.3gpp2.tcap'],\n ['tcl', ['text/x-script.tcl', 'application/x-tcl']],\n ['tcsh', 'text/x-script.tcsh'],\n ['teacher', 'application/vnd.smart.teacher'],\n ['tei', 'application/tei+xml'],\n ['tex', 'application/x-tex'],\n ['texi', 'application/x-texinfo'],\n ['texinfo', 'application/x-texinfo'],\n ['text', ['application/plain', 'text/plain']],\n ['tfi', 'application/thraud+xml'],\n ['tfm', 'application/x-tex-tfm'],\n ['tgz', ['application/gnutar', 'application/x-compressed']],\n ['thmx', 'application/vnd.ms-officetheme'],\n ['tif', ['image/tiff', 'image/x-tiff']],\n ['tiff', ['image/tiff', 'image/x-tiff']],\n ['tmo', 'application/vnd.tmobile-livetv'],\n ['torrent', 'application/x-bittorrent'],\n ['tpl', 'application/vnd.groove-tool-template'],\n ['tpt', 'application/vnd.trid.tpt'],\n ['tr', 'application/x-troff'],\n ['tra', 'application/vnd.trueapp'],\n ['trm', 'application/x-msterminal'],\n ['tsd', 'application/timestamped-data'],\n ['tsi', 'audio/tsp-audio'],\n ['tsp', ['application/dsptype', 'audio/tsplayer']],\n ['tsv', 'text/tab-separated-values'],\n ['ttf', 'application/x-font-ttf'],\n ['ttl', 'text/turtle'],\n ['turbot', 'image/florian'],\n ['twd', 'application/vnd.simtech-mindmapper'],\n ['txd', 'application/vnd.genomatix.tuxedo'],\n ['txf', 'application/vnd.mobius.txf'],\n ['txt', 'text/plain'],\n ['ufd', 'application/vnd.ufdl'],\n ['uil', 'text/x-uil'],\n ['uls', 'text/iuls'],\n ['umj', 'application/vnd.umajin'],\n ['uni', 'text/uri-list'],\n ['unis', 'text/uri-list'],\n ['unityweb', 'application/vnd.unity'],\n ['unv', 'application/i-deas'],\n ['uoml', 'application/vnd.uoml+xml'],\n ['uri', 'text/uri-list'],\n ['uris', 'text/uri-list'],\n ['ustar', ['application/x-ustar', 'multipart/x-ustar']],\n ['utz', 'application/vnd.uiq.theme'],\n ['uu', ['application/octet-stream', 'text/x-uuencode']],\n ['uue', 'text/x-uuencode'],\n ['uva', 'audio/vnd.dece.audio'],\n ['uvh', 'video/vnd.dece.hd'],\n ['uvi', 'image/vnd.dece.graphic'],\n ['uvm', 'video/vnd.dece.mobile'],\n ['uvp', 'video/vnd.dece.pd'],\n ['uvs', 'video/vnd.dece.sd'],\n ['uvu', 'video/vnd.uvvu.mp4'],\n ['uvv', 'video/vnd.dece.video'],\n ['vcd', 'application/x-cdlink'],\n ['vcf', 'text/x-vcard'],\n ['vcg', 'application/vnd.groove-vcard'],\n ['vcs', 'text/x-vcalendar'],\n ['vcx', 'application/vnd.vcx'],\n ['vda', 'application/vda'],\n ['vdo', 'video/vdo'],\n ['vew', 'application/groupwise'],\n ['vis', 'application/vnd.visionary'],\n ['viv', ['video/vivo', 'video/vnd.vivo']],\n ['vivo', ['video/vivo', 'video/vnd.vivo']],\n ['vmd', 'application/vocaltec-media-desc'],\n ['vmf', 'application/vocaltec-media-file'],\n ['voc', ['audio/voc', 'audio/x-voc']],\n ['vos', 'video/vosaic'],\n ['vox', 'audio/voxware'],\n ['vqe', 'audio/x-twinvq-plugin'],\n ['vqf', 'audio/x-twinvq'],\n ['vql', 'audio/x-twinvq-plugin'],\n ['vrml', ['model/vrml', 'x-world/x-vrml', 'application/x-vrml']],\n ['vrt', 'x-world/x-vrt'],\n ['vsd', ['application/vnd.visio', 'application/x-visio']],\n ['vsf', 'application/vnd.vsf'],\n ['vst', 'application/x-visio'],\n ['vsw', 'application/x-visio'],\n ['vtu', 'model/vnd.vtu'],\n ['vxml', 'application/voicexml+xml'],\n ['w60', 'application/wordperfect6.0'],\n ['w61', 'application/wordperfect6.1'],\n ['w6w', 'application/msword'],\n ['wad', 'application/x-doom'],\n ['wav', ['audio/wav', 'audio/x-wav']],\n ['wax', 'audio/x-ms-wax'],\n ['wb1', 'application/x-qpro'],\n ['wbmp', 'image/vnd.wap.wbmp'],\n ['wbs', 'application/vnd.criticaltools.wbs+xml'],\n ['wbxml', 'application/vnd.wap.wbxml'],\n ['wcm', 'application/vnd.ms-works'],\n ['wdb', 'application/vnd.ms-works'],\n ['web', 'application/vnd.xara'],\n ['weba', 'audio/webm'],\n ['webm', 'video/webm'],\n ['webp', 'image/webp'],\n ['wg', 'application/vnd.pmi.widget'],\n ['wgt', 'application/widget'],\n ['wiz', 'application/msword'],\n ['wk1', 'application/x-123'],\n ['wks', 'application/vnd.ms-works'],\n ['wm', 'video/x-ms-wm'],\n ['wma', 'audio/x-ms-wma'],\n ['wmd', 'application/x-ms-wmd'],\n ['wmf', ['windows/metafile', 'application/x-msmetafile']],\n ['wml', 'text/vnd.wap.wml'],\n ['wmlc', 'application/vnd.wap.wmlc'],\n ['wmls', 'text/vnd.wap.wmlscript'],\n ['wmlsc', 'application/vnd.wap.wmlscriptc'],\n ['wmv', 'video/x-ms-wmv'],\n ['wmx', 'video/x-ms-wmx'],\n ['wmz', 'application/x-ms-wmz'],\n ['woff', 'application/x-font-woff'],\n ['word', 'application/msword'],\n ['wp', 'application/wordperfect'],\n ['wp5', ['application/wordperfect', 'application/wordperfect6.0']],\n ['wp6', 'application/wordperfect'],\n ['wpd', ['application/wordperfect', 'application/vnd.wordperfect', 'application/x-wpwin']],\n ['wpl', 'application/vnd.ms-wpl'],\n ['wps', 'application/vnd.ms-works'],\n ['wq1', 'application/x-lotus'],\n ['wqd', 'application/vnd.wqd'],\n ['wri', ['application/mswrite', 'application/x-wri', 'application/x-mswrite']],\n ['wrl', ['model/vrml', 'x-world/x-vrml', 'application/x-world']],\n ['wrz', ['model/vrml', 'x-world/x-vrml']],\n ['wsc', 'text/scriplet'],\n ['wsdl', 'application/wsdl+xml'],\n ['wspolicy', 'application/wspolicy+xml'],\n ['wsrc', 'application/x-wais-source'],\n ['wtb', 'application/vnd.webturbo'],\n ['wtk', 'application/x-wintalk'],\n ['wvx', 'video/x-ms-wvx'],\n ['x-png', 'image/png'],\n ['x3d', 'application/vnd.hzn-3d-crossword'],\n ['xaf', 'x-world/x-vrml'],\n ['xap', 'application/x-silverlight-app'],\n ['xar', 'application/vnd.xara'],\n ['xbap', 'application/x-ms-xbap'],\n ['xbd', 'application/vnd.fujixerox.docuworks.binder'],\n ['xbm', ['image/xbm', 'image/x-xbm', 'image/x-xbitmap']],\n ['xdf', 'application/xcap-diff+xml'],\n ['xdm', 'application/vnd.syncml.dm+xml'],\n ['xdp', 'application/vnd.adobe.xdp+xml'],\n ['xdr', 'video/x-amt-demorun'],\n ['xdssc', 'application/dssc+xml'],\n ['xdw', 'application/vnd.fujixerox.docuworks'],\n ['xenc', 'application/xenc+xml'],\n ['xer', 'application/patch-ops-error+xml'],\n ['xfdf', 'application/vnd.adobe.xfdf'],\n ['xfdl', 'application/vnd.xfdl'],\n ['xgz', 'xgl/drawing'],\n ['xhtml', 'application/xhtml+xml'],\n ['xif', 'image/vnd.xiff'],\n ['xl', 'application/excel'],\n ['xla', ['application/vnd.ms-excel', 'application/excel', 'application/x-msexcel', 'application/x-excel']],\n ['xlam', 'application/vnd.ms-excel.addin.macroenabled.12'],\n ['xlb', ['application/excel', 'application/vnd.ms-excel', 'application/x-excel']],\n ['xlc', ['application/vnd.ms-excel', 'application/excel', 'application/x-excel']],\n ['xld', ['application/excel', 'application/x-excel']],\n ['xlk', ['application/excel', 'application/x-excel']],\n ['xll', ['application/excel', 'application/vnd.ms-excel', 'application/x-excel']],\n ['xlm', ['application/vnd.ms-excel', 'application/excel', 'application/x-excel']],\n ['xls', ['application/vnd.ms-excel', 'application/excel', 'application/x-msexcel', 'application/x-excel']],\n ['xlsb', 'application/vnd.ms-excel.sheet.binary.macroenabled.12'],\n ['xlsm', 'application/vnd.ms-excel.sheet.macroenabled.12'],\n ['xlsx', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'],\n ['xlt', ['application/vnd.ms-excel', 'application/excel', 'application/x-excel']],\n ['xltm', 'application/vnd.ms-excel.template.macroenabled.12'],\n ['xltx', 'application/vnd.openxmlformats-officedocument.spreadsheetml.template'],\n ['xlv', ['application/excel', 'application/x-excel']],\n ['xlw', ['application/vnd.ms-excel', 'application/excel', 'application/x-msexcel', 'application/x-excel']],\n ['xm', 'audio/xm'],\n ['xml', ['application/xml', 'text/xml', 'application/atom+xml', 'application/rss+xml']],\n ['xmz', 'xgl/movie'],\n ['xo', 'application/vnd.olpc-sugar'],\n ['xof', 'x-world/x-vrml'],\n ['xop', 'application/xop+xml'],\n ['xpi', 'application/x-xpinstall'],\n ['xpix', 'application/x-vnd.ls-xpix'],\n ['xpm', ['image/xpm', 'image/x-xpixmap']],\n ['xpr', 'application/vnd.is-xpr'],\n ['xps', 'application/vnd.ms-xpsdocument'],\n ['xpw', 'application/vnd.intercon.formnet'],\n ['xslt', 'application/xslt+xml'],\n ['xsm', 'application/vnd.syncml+xml'],\n ['xspf', 'application/xspf+xml'],\n ['xsr', 'video/x-amt-showrun'],\n ['xul', 'application/vnd.mozilla.xul+xml'],\n ['xwd', ['image/x-xwd', 'image/x-xwindowdump']],\n ['xyz', ['chemical/x-xyz', 'chemical/x-pdb']],\n ['yang', 'application/yang'],\n ['yin', 'application/yin+xml'],\n ['z', ['application/x-compressed', 'application/x-compress']],\n ['zaz', 'application/vnd.zzazz.deck+xml'],\n ['zip', ['application/zip', 'multipart/x-zip', 'application/x-zip-compressed', 'application/x-compressed']],\n ['zir', 'application/vnd.zul'],\n ['zmm', 'application/vnd.handheld-entertainment+xml'],\n ['zoo', 'application/octet-stream'],\n ['zsh', 'text/x-script.zsh']\n]);\n\nmodule.exports = {\n detectMimeType(filename) {\n if (!filename) {\n return defaultMimeType;\n }\n\n let parsed = path.parse(filename);\n let extension = (parsed.ext.substr(1) || parsed.name || '').split('?').shift().trim().toLowerCase();\n let value = defaultMimeType;\n\n if (extensions.has(extension)) {\n value = extensions.get(extension);\n }\n\n if (Array.isArray(value)) {\n return value[0];\n }\n return value;\n },\n\n detectExtension(mimeType) {\n if (!mimeType) {\n return defaultExtension;\n }\n let parts = (mimeType || '').toLowerCase().trim().split('/');\n let rootType = parts.shift().trim();\n let subType = parts.join('/').trim();\n\n if (mimeTypes.has(rootType + '/' + subType)) {\n let value = mimeTypes.get(rootType + '/' + subType);\n if (Array.isArray(value)) {\n return value[0];\n }\n return value;\n }\n\n switch (rootType) {\n case 'text':\n return 'txt';\n default:\n return 'bin';\n }\n }\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFjdGlvbi1icm93c2VyKS8uL25vZGVfbW9kdWxlcy8ucG5wbS9ub2RlbWFpbGVyQDcuMC4xMy9ub2RlX21vZHVsZXMvbm9kZW1haWxlci9saWIvbWltZS1mdW5jcy9taW1lLXR5cGVzLmpzIiwibWFwcGluZ3MiOiJBQUFBOztBQUVhOztBQUViLGFBQWEsbUJBQU8sQ0FBQyxrQkFBTTs7QUFFM0I7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIi9Vc2Vycy9tYXJjbWludGVsL1Byb2plY3RzL2UtdGliLmNvbS9ub2RlX21vZHVsZXMvLnBucG0vbm9kZW1haWxlckA3LjAuMTMvbm9kZV9tb2R1bGVzL25vZGVtYWlsZXIvbGliL21pbWUtZnVuY3MvbWltZS10eXBlcy5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQgcXVvdGUtcHJvcHM6IDAgKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCBwYXRoID0gcmVxdWlyZSgncGF0aCcpO1xuXG5jb25zdCBkZWZhdWx0TWltZVR5cGUgPSAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJztcbmNvbnN0IGRlZmF1bHRFeHRlbnNpb24gPSAnYmluJztcblxuY29uc3QgbWltZVR5cGVzID0gbmV3IE1hcChbXG4gICAgWydhcHBsaWNhdGlvbi9hY2FkJywgJ2R3ZyddLFxuICAgIFsnYXBwbGljYXRpb24vYXBwbGl4d2FyZScsICdhdyddLFxuICAgIFsnYXBwbGljYXRpb24vYXJqJywgJ2FyaiddLFxuICAgIFsnYXBwbGljYXRpb24vYXRvbSt4bWwnLCAneG1sJ10sXG4gICAgWydhcHBsaWNhdGlvbi9hdG9tY2F0K3htbCcsICdhdG9tY2F0J10sXG4gICAgWydhcHBsaWNhdGlvbi9hdG9tc3ZjK3htbCcsICdhdG9tc3ZjJ10sXG4gICAgWydhcHBsaWNhdGlvbi9iYXNlNjQnLCBbJ21tJywgJ21tZSddXSxcbiAgICBbJ2FwcGxpY2F0aW9uL2JpbmhleCcsICdocXgnXSxcbiAgICBbJ2FwcGxpY2F0aW9uL2JpbmhleDQnLCAnaHF4J10sXG4gICAgWydhcHBsaWNhdGlvbi9ib29rJywgWydib29rJywgJ2JvbyddXSxcbiAgICBbJ2FwcGxpY2F0aW9uL2NjeG1sK3htbCwnLCAnY2N4bWwnXSxcbiAgICBbJ2FwcGxpY2F0aW9uL2NkZicsICdjZGYnXSxcbiAgICBbJ2FwcGxpY2F0aW9uL2NkbWktY2FwYWJpbGl0eScsICdjZG1pYSddLFxuICAgIFsnYXBwbGljYXRpb24vY2RtaS1jb250YWluZXInLCAnY2RtaWMnXSxcbiAgICBbJ2FwcGxpY2F0aW9uL2NkbWktZG9tYWluJywgJ2NkbWlkJ10sXG4gICAgWydhcHBsaWNhdGlvbi9jZG1pLW9iamVjdCcsICdjZG1pbyddLFxuICAgIFsnYXBwbGljYXRpb24vY2RtaS1xdWV1ZScsICdjZG1pcSddLFxuICAgIFsnYXBwbGljYXRpb24vY2xhcmlzY2FkJywgJ2NjYWQnXSxcbiAgICBbJ2FwcGxpY2F0aW9uL2NvbW1vbmdyb3VuZCcsICdkcCddLFxuICAgIFsnYXBwbGljYXRpb24vY3Utc2VlbWUnLCAnY3UnXSxcbiAgICBbJ2FwcGxpY2F0aW9uL2Rhdm1vdW50K3htbCcsICdkYXZtb3VudCddLFxuICAgIFsnYXBwbGljYXRpb24vZHJhZnRpbmcnLCAnZHJ3J10sXG4gICAgWydhcHBsaWNhdGlvbi9kc3B0eXBlJywgJ3RzcCddLFxuICAgIFsnYXBwbGljYXRpb24vZHNzYytkZXInLCAnZHNzYyddLFxuICAgIFsnYXBwbGljYXRpb24vZHNzYyt4bWwnLCAneGRzc2MnXSxcbiAgICBbJ2FwcGxpY2F0aW9uL2R4ZicsICdkeGYnXSxcbiAgICBbJ2FwcGxpY2F0aW9uL2VjbWFzY3JpcHQnLCBbJ2pzJywgJ2VzJ11dLFxuICAgIFsnYXBwbGljYXRpb24vZW1tYSt4bWwnLCAnZW1tYSddLFxuICAgIFsnYXBwbGljYXRpb24vZW52b3knLCAnZXZ5J10sXG4gICAgWydhcHBsaWNhdGlvbi9lcHViK3ppcCcsICdlcHViJ10sXG4gICAgWydhcHBsaWNhdGlvbi9leGNlbCcsIFsneGxzJywgJ3hsJywgJ3hsYScsICd4bGInLCAneGxjJywgJ3hsZCcsICd4bGsnLCAneGxsJywgJ3hsbScsICd4bHQnLCAneGx2JywgJ3hsdyddXSxcbiAgICBbJ2FwcGxpY2F0aW9uL2V4aScsICdleGknXSxcbiAgICBbJ2FwcGxpY2F0aW9uL2ZvbnQtdGRwZnInLCAncGZyJ10sXG4gICAgWydhcHBsaWNhdGlvbi9mcmFjdGFscycsICdmaWYnXSxcbiAgICBbJ2FwcGxpY2F0aW9uL2ZyZWVsb2FkZXInLCAnZnJsJ10sXG4gICAgWydhcHBsaWNhdGlvbi9mdXR1cmVzcGxhc2gnLCAnc3BsJ10sXG4gICAgWydhcHBsaWNhdGlvbi9nZW8ranNvbicsICdnZW9qc29uJ10sXG4gICAgWydhcHBsaWNhdGlvbi9nbnV0YXInLCAndGd6J10sXG4gICAgWydhcHBsaWNhdGlvbi9ncm91cHdpc2UnLCAndmV3J10sXG4gICAgWydhcHBsaWNhdGlvbi9obHAnLCAnaGxwJ10sXG4gICAgWydhcHBsaWNhdGlvbi9odGEnLCAnaHRhJ10sXG4gICAgWydhcHBsaWNhdGlvbi9oeXBlcnN0dWRpbycsICdzdGsnXSxcbiAgICBbJ2FwcGxpY2F0aW9uL2ktZGVhcycsICd1bnYnXSxcbiAgICBbJ2FwcGxpY2F0aW9uL2lnZXMnLCBbJ2lnZXMnLCAnaWdzJ11dLFxuICAgIFsnYXBwbGljYXRpb24vaW5mJywgJ2luZiddLFxuICAgIFsnYXBwbGljYXRpb24vaW50ZXJuZXQtcHJvcGVydHktc3RyZWFtJywgJ2FjeCddLFxuICAgIFsnYXBwbGljYXRpb24vaXBmaXgnLCAnaXBmaXgnXSxcbiAgICBbJ2FwcGxpY2F0aW9uL2phdmEnLCAnY2xhc3MnXSxcbiAgICBbJ2FwcGxpY2F0aW9uL2phdmEtYXJjaGl2ZScsICdqYXInXSxcbiAgICBbJ2FwcGxpY2F0aW9uL2phdmEtYnl0ZS1jb2RlJywgJ2NsYXNzJ10sXG4gICAgWydhcHBsaWNhdGlvbi9qYXZhLXNlcmlhbGl6ZWQtb2JqZWN0JywgJ3NlciddLFxuICAgIFsnYXBwbGljYXRpb24vamF2YS12bScsICdjbGFzcyddLFxuICAgIFsnYXBwbGljYXRpb24vamF2YXNjcmlwdCcsICdqcyddLFxuICAgIFsnYXBwbGljYXRpb24vanNvbicsICdqc29uJ10sXG4gICAgWydhcHBsaWNhdGlvbi9saGEnLCAnbGhhJ10sXG4gICAgWydhcHBsaWNhdGlvbi9sengnLCAnbHp4J10sXG4gICAgWydhcHBsaWNhdGlvbi9tYWMtYmluYXJ5JywgJ2JpbiddLFxuICAgIFsnYXBwbGljYXRpb24vbWFjLWJpbmhleCcsICdocXgnXSxcbiAgICBbJ2FwcGxpY2F0aW9uL21hYy1iaW5oZXg0MCcsICdocXgnXSxcbiAgICBbJ2FwcGxpY2F0aW9uL21hYy1jb21wYWN0cHJvJywgJ2NwdCddLFxuICAgIFsnYXBwbGljYXRpb24vbWFjYmluYXJ5JywgJ2JpbiddLFxuICAgIFsnYXBwbGljYXRpb24vbWFkcyt4bWwnLCAnbWFkcyddLFxuICAgIFsnYXBwbGljYXRpb24vbWFyYycsICdtcmMnXSxcbiAgICBbJ2FwcGxpY2F0aW9uL21hcmN4bWwreG1sJywgJ21yY3gnXSxcbiAgICBbJ2FwcGxpY2F0aW9uL21hdGhlbWF0aWNhJywgJ21hJ10sXG4gICAgWydhcHBsaWNhdGlvbi9tYXRobWwreG1sJywgJ21hdGhtbCddLFxuICAgIFsnYXBwbGljYXRpb24vbWJlZGxldCcsICdtYmQnXSxcbiAgICBbJ2FwcGxpY2F0aW9uL21ib3gnLCAnbWJveCddLFxuICAgIFsnYXBwbGljYXRpb24vbWNhZCcsICdtY2QnXSxcbiAgICBbJ2FwcGxpY2F0aW9uL21lZGlhc2VydmVyY29udHJvbCt4bWwnLCAnbXNjbWwnXSxcbiAgICBbJ2FwcGxpY2F0aW9uL21ldGFsaW5rNCt4bWwnLCAnbWV0YTQnXSxcbiAgICBbJ2FwcGxpY2F0aW9uL21ldHMreG1sJywgJ21ldHMnXSxcbiAgICBbJ2FwcGxpY2F0aW9uL21pbWUnLCAnYXBzJ10sXG4gICAgWydhcHBsaWNhdGlvbi9tb2RzK3htbCcsICdtb2RzJ10sXG4gICAgWydhcHBsaWNhdGlvbi9tcDIxJywgJ20yMSddLFxuICAgIFsnYXBwbGljYXRpb24vbXA0JywgJ21wNCddLFxuICAgIFsnYXBwbGljYXRpb24vbXNwb3dlcnBvaW50JywgWydwcHQnLCAncG90JywgJ3BwcycsICdwcHonXV0sXG4gICAgWydhcHBsaWNhdGlvbi9tc3dvcmQnLCBbJ2RvYycsICdkb3QnLCAndzZ3JywgJ3dpeicsICd3b3JkJ11dLFxuICAgIFsnYXBwbGljYXRpb24vbXN3cml0ZScsICd3cmknXSxcbiAgICBbJ2FwcGxpY2F0aW9uL214ZicsICdteGYnXSxcbiAgICBbJ2FwcGxpY2F0aW9uL25ldG1jJywgJ21jcCddLFxuICAgIFsnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJywgWycqJ11dLFxuICAgIFsnYXBwbGljYXRpb24vb2RhJywgJ29kYSddLFxuICAgIFsnYXBwbGljYXRpb24vb2VicHMtcGFja2FnZSt4bWwnLCAnb3BmJ10sXG4gICAgWydhcHBsaWNhdGlvbi9vZ2cnLCAnb2d4J10sXG4gICAgWydhcHBsaWNhdGlvbi9vbGVzY3JpcHQnLCAnYXhzJ10sXG4gICAgWydhcHBsaWNhdGlvbi9vbmVub3RlJywgJ29uZXRvYyddLFxuICAgIFsnYXBwbGljYXRpb24vcGF0Y2gtb3BzLWVycm9yK3htbCcsICd4ZXInXSxcbiAgICBbJ2FwcGxpY2F0aW9uL3BkZicsICdwZGYnXSxcbiAgICBbJ2FwcGxpY2F0aW9uL3BncC1lbmNyeXB0ZWQnLCAnYXNjJ10sXG4gICAgWydhcHBsaWNhdGlvbi9wZ3Atc2lnbmF0dXJlJywgJ3BncCddLFxuICAgIFsnYXBwbGljYXRpb24vcGljcy1ydWxlcycsICdwcmYnXSxcbiAgICBbJ2FwcGxpY2F0aW9uL3BrY3MtMTInLCAncDEyJ10sXG4gICAgWydhcHBsaWNhdGlvbi9wa2NzLWNybCcsICdjcmwnXSxcbiAgICBbJ2FwcGxpY2F0aW9uL3BrY3MxMCcsICdwMTAnXSxcbiAgICBbJ2FwcGxpY2F0aW9uL3BrY3M3LW1pbWUnLCBbJ3A3YycsICdwN20nXV0sXG4gICAgWydhcHBsaWNhdGlvbi9wa2NzNy1zaWduYXR1cmUnLCAncDdzJ10sXG4gICAgWydhcHBsaWNhdGlvbi9wa2NzOCcsICdwOCddLFxuICAgIFsnYXBwbGljYXRpb24vcGtpeC1hdHRyLWNlcnQnLCAnYWMnXSxcbiAgICBbJ2FwcGxpY2F0aW9uL3BraXgtY2VydCcsIFsnY2VyJywgJ2NydCddXSxcbiAgICBbJ2FwcGxpY2F0aW9uL3BraXgtY3JsJywgJ2NybCddLFxuICAgIFsnYXBwbGljYXRpb24vcGtpeC1wa2lwYXRoJywgJ3BraXBhdGgnXSxcbiAgICBbJ2FwcGxpY2F0aW9uL3BraXhjbXAnLCAncGtpJ10sXG4gICAgWydhcHBsaWNhdGlvbi9wbGFpbicsICd0ZXh0J10sXG4gICAgWydhcHBsaWNhdGlvbi9wbHMreG1sJywgJ3BscyddLFxuICAgIFsnYXBwbGljYXRpb24vcG9zdHNjcmlwdCcsIFsncHMnLCAnYWknLCAnZXBzJ11dLFxuICAgIFsnYXBwbGljYXRpb24vcG93ZXJwb2ludCcsICdwcHQnXSxcbiAgICBbJ2FwcGxpY2F0aW9uL3Byb19lbmcnLCBbJ3BhcnQnLCAncHJ0J11dLFxuICAgIFsnYXBwbGljYXRpb24vcHJzLmN3dycsICdjd3cnXSxcbiAgICBbJ2FwcGxpY2F0aW9uL3Bza2MreG1sJywgJ3Bza2N4bWwnXSxcbiAgICBbJ2FwcGxpY2F0aW9uL3JkZit4bWwnLCAncmRmJ10sXG4gICAgWydhcHBsaWNhdGlvbi9yZWdpbmZvK3htbCcsICdyaWYnXSxcbiAgICBbJ2FwcGxpY2F0aW9uL3JlbGF4LW5nLWNvbXBhY3Qtc3ludGF4JywgJ3JuYyddLFxuICAgIFsnYXBwbGljYXRpb24vcmVzb3VyY2UtbGlzdHMreG1sJywgJ3JsJ10sXG4gICAgWydhcHBsaWNhdGlvbi9yZXNvdXJjZS1saXN0cy1kaWZmK3htbCcsICdybGQnXSxcbiAgICBbJ2FwcGxpY2F0aW9uL3JpbmdpbmctdG9uZXMnLCAncm5nJ10sXG4gICAgWydhcHBsaWNhdGlvbi9ybHMtc2VydmljZXMreG1sJywgJ3JzJ10sXG4gICAgWydhcHBsaWNhdGlvbi9yc2QreG1sJywgJ3JzZCddLFxuICAgIFsnYXBwbGljYXRpb24vcnNzK3htbCcsICd4bWwnXSxcbiAgICBbJ2FwcGxpY2F0aW9uL3J0ZicsIFsncnRmJywgJ3J0eCddXSxcbiAgICBbJ2FwcGxpY2F0aW9uL3NibWwreG1sJywgJ3NibWwnXSxcbiAgICBbJ2FwcGxpY2F0aW9uL3NjdnAtY3YtcmVxdWVzdCcsICdzY3EnXSxcbiAgICBbJ2FwcGxpY2F0aW9uL3NjdnAtY3YtcmVzcG9uc2UnLCAnc2NzJ10sXG4gICAgWydhcHBsaWNhdGlvbi9zY3ZwLXZwLXJlcXVlc3QnLCAnc3BxJ10sXG4gICAgWydhcHBsaWNhdGlvbi9zY3ZwLXZwLXJlc3BvbnNlJywgJ3NwcCddLFxuICAgIFsnYXBwbGljYXRpb24vc2RwJywgJ3NkcCddLFxuICAgIFsnYXBwbGljYXRpb24vc2VhJywgJ3NlYSddLFxuICAgIFsnYXBwbGljYXRpb24vc2V0JywgJ3NldCddLFxuICAgIFsnYXBwbGljYXRpb24vc2V0LXBheW1lbnQtaW5pdGlhdGlvbicsICdzZXRwYXknXSxcbiAgICBbJ2FwcGxpY2F0aW9uL3NldC1yZWdpc3RyYXRpb24taW5pdGlhdGlvbicsICdzZXRyZWcnXSxcbiAgICBbJ2FwcGxpY2F0aW9uL3NoZit4bWwnLCAnc2hmJ10sXG4gICAgWydhcHBsaWNhdGlvbi9zbGEnLCAnc3RsJ10sXG4gICAgWydhcHBsaWNhdGlvbi9zbWlsJywgWydzbWknLCAnc21pbCddXSxcbiAgICBbJ2FwcGxpY2F0aW9uL3NtaWwreG1sJywgJ3NtaSddLFxuICAgIFsnYXBwbGljYXRpb24vc29saWRzJywgJ3NvbCddLFxuICAgIFsnYXBwbGljYXRpb24vc291bmRlcicsICdzZHInXSxcbiAgICBbJ2FwcGxpY2F0aW9uL3NwYXJxbC1xdWVyeScsICdycSddLFxuICAgIFsnYXBwbGljYXRpb24vc3BhcnFsLXJlc3VsdHMreG1sJywgJ3NyeCddLFxuICAgIFsnYXBwbGljYXRpb24vc3JncycsICdncmFtJ10sXG4gICAgWydhcHBsaWNhdGlvbi9zcmdzK3htbCcsICdncnhtbCddLFxuICAgIFsnYXBwbGljYXRpb24vc3J1K3htbCcsICdzcnUnXSxcbiAgICBbJ2FwcGxpY2F0aW9uL3NzbWwreG1sJywgJ3NzbWwnXSxcbiAgICBbJ2FwcGxpY2F0aW9uL3N0ZXAnLCBbJ3N0ZXAnLCAnc3RwJ11dLFxuICAgIFsnYXBwbGljYXRpb24vc3RyZWFtaW5nbWVkaWEnLCAnc3NtJ10sXG4gICAgWydhcHBsaWNhdGlvbi90ZWkreG1sJywgJ3RlaSddLFxuICAgIFsnYXBwbGljYXRpb24vdGhyYXVkK3htbCcsICd0ZmknXSxcbiAgICBbJ2FwcGxpY2F0aW9uL3RpbWVzdGFtcGVkLWRhdGEnLCAndHNkJ10sXG4gICAgWydhcHBsaWNhdGlvbi90b29sYm9vaycsICd0YmsnXSxcbiAgICBbJ2FwcGxpY2F0aW9uL3ZkYScsICd2ZGEnXSxcbiAgICBbJ2FwcGxpY2F0aW9uL3ZuZC4zZ3BwLnBpYy1idy1sYXJnZScsICdwbGInXSxcbiAgICBbJ2FwcGxpY2F0aW9uL3ZuZC4zZ3BwLnBpYy1idy1zbWFsbCcsICdwc2InXSxcbiAgICBbJ2FwcGxpY2F0aW9uL3ZuZC4zZ3BwLnBpYy1idy12YXInLCAncHZiJ10sXG4gICAgWydhcHBsaWNhdGlvbi92bmQuM2dwcDIudGNhcCcsICd0Y2FwJ10sXG4gICAgWydhcHBsaWNhdGlvbi92bmQuM20ucG9zdC1pdC1ub3RlcycsICdwd24nXSxcbiAgICBbJ2FwcGxpY2F0aW9uL3ZuZC5hY2NwYWMuc2ltcGx5LmFzbycsICdhc28nXSxcbiAgICBbJ2FwcGxpY2F0aW9uL3ZuZC5hY2NwYWMuc2ltcGx5LmltcCcsICdpbXAnXSxcbiAgICBbJ2FwcGxpY2F0aW9uL3ZuZC5hY3Vjb2JvbCcsICdhY3UnXSxcbiAgICBbJ2FwcGxpY2F0aW9uL3ZuZC5hY3Vjb3JwJywgJ2F0YyddLFxuICAgIFsnYXBwbGljYXRpb24vdm5kLmFkb2JlLmFpci1hcHBsaWNhdGlvbi1pbnN0YWxsZXItcGFja2FnZSt6aXAnLCAnYWlyJ10sXG4gICAgWydhcHBsaWNhdGlvbi92bmQuYWRvYmUuZnhwJywgJ2Z4cCddLFxuICAgIFsnYXBwbGljYXRpb24vdm5kLmFkb2JlLnhkcCt4bWwnLCAneGRwJ10sXG4gICAgWydhcHBsaWNhdGlvbi92bmQuYWRvYmUueGZkZicsICd4ZmRmJ10sXG4gICAgWydhcHBsaWNhdGlvbi92bmQuYWhlYWQuc3BhY2UnLCAnYWhlYWQnXSxcbiAgICBbJ2FwcGxpY2F0aW9uL3ZuZC5haXJ6aXAuZmlsZXNlY3VyZS5hemYnLCAnYXpmJ10sXG4gICAgWydhcHBsaWNhdGlvbi92bmQuYWlyemlwLmZpbGVzZWN1cmUuYXpzJywgJ2F6cyddLFxuICAgIFsnYXBwbGljYXRpb24vdm5kLmFtYXpvbi5lYm9vaycsICdhencnXSxcbiAgICBbJ2FwcGxpY2F0aW9uL3ZuZC5hbWVyaWNhbmR5bmFtaWNzLmFjYycsICdhY2MnXSxcbiAgICBbJ2FwcGxpY2F0aW9uL3ZuZC5hbWlnYS5hbWknLCAnYW1pJ10sXG4gICAgWydhcHBsaWNhdGlvbi92bmQuYW5kcm9pZC5wYWNrYWdlLWFyY2hpdmUnLCAnYXBrJ10sXG4gICAgWydhcHBsaWNhdGlvbi92bmQuYW5zZXItd2ViLWNlcnRpZmljYXRlLWlzc3VlLWluaXRpYXRpb24nLCAnY2lpJ10sXG4gICAgWydhcHBsaWNhdGlvbi92bmQuYW5zZXItd2ViLWZ1bmRzLXRyYW5zZmVyLWluaXRpYXRpb24nLCAnZnRpJ10sXG4gICAgWydhcHBsaWNhdGlvbi92bmQuYW50aXguZ2FtZS1jb21wb25lbnQnLCAnYXR4J10sXG4gICAgWydhcHBsaWNhdGlvbi92bmQuYXBwbGUuaW5zdGFsbGVyK3htbCcsICdtcGtnJ10sXG4gICAgWydhcHBsaWNhdGlvbi92bmQuYXBwbGUubXBlZ3VybCcsICdtM3U4J10sXG4gICAgWydhcHBsaWNhdGlvbi92bmQuYXJpc3RhbmV0d29ya3Muc3dpJywgJ3N3aSddLFxuICAgIFsnYXBwbGljYXRpb24vdm5kLmF1ZGlvZ3JhcGgnLCAnYWVwJ10sXG4gICAgWydhcHBsaWNhdGlvbi92bmQuYmx1ZWljZS5tdWx0aXBhc3MnLCAnbXBtJ10sXG4gICAgWydhcHBsaWNhdGlvbi92bmQuYm1pJywgJ2JtaSddLFxuICAgIFsnYXBwbGljYXRpb24vdm5kLmJ1c2luZXNzb2JqZWN0cycsICdyZXAnXSxcbiAgICBbJ2FwcGxpY2F0aW9uL3ZuZC5jaGVtZHJhdyt4bWwnLCAnY2R4bWwnXSxcbiAgICBbJ2FwcGxpY2F0aW9uL3ZuZC5jaGlwbnV0cy5rYXJhb2tlLW1tZCcsICdtbWQnXSxcbiAgICBbJ2FwcGxpY2F0aW9uL3ZuZC5jaW5kZXJlbGxhJywgJ2NkeSddLFxuICAgIFsnYXBwbGljYXRpb24vdm5kLmNsYXltb3JlJywgJ2NsYSddLFxuICAgIFsnYXBwbGljYXRpb24vdm5kLmNsb2FudG8ucnA5JywgJ3JwOSddLFxuICAgIFsnYXBwbGljYXRpb24vdm5kLmNsb25rLmM0Z3JvdXAnLCAnYzRnJ10sXG4gICAgWydhcHBsaWNhdGlvbi92bmQuY2x1ZXRydXN0LmNhcnRvbW9iaWxlLWNvbmZpZycsICdjMTFhbWMnXSxcbiAgICBbJ2FwcGxpY2F0aW9uL3ZuZC5jbHVldHJ1c3QuY2FydG9tb2JpbGUtY29uZmlnLXBrZycsICdjMTFhbXonXSxcbiAgICBbJ2FwcGxpY2F0aW9uL3ZuZC5jb21tb25zcGFjZScsICdjc3AnXSxcbiAgICBbJ2FwcGxpY2F0aW9uL3ZuZC5jb250YWN0LmNtc2cnLCAnY2RiY21zZyddLFxuICAgIFsnYXBwbGljYXRpb24vdm5kLmNvc21vY2FsbGVyJywgJ2NtYyddLFxuICAgIFsnYXBwbGljYXRpb24vdm5kLmNyaWNrLmNsaWNrZXInLCAnY2xreCddLFxuICAgIFsnYXBwbGljYXRpb24vdm5kLmNyaWNrLmNsaWNrZXIua2V5Ym9hcmQnLCAnY2xrayddLFxuICAgIFsnYXBwbGljYXRpb24vdm5kLmNyaWNrLmNsaWNrZXIucGFsZXR0ZScsICdjbGtwJ10sXG4gICAgWydhcHBsaWNhdGlvbi92bmQuY3JpY2suY2xpY2tlci50ZW1wbGF0ZScsICdjbGt0J10sXG4gICAgWydhcHBsaWNhdGlvbi92bmQuY3JpY2suY2xpY2tlci53b3JkYmFuaycsICdjbGt3J10sXG4gICAgWydhcHBsaWNhdGlvbi92bmQuY3JpdGljYWx0b29scy53YnMreG1sJywgJ3dicyddLFxuICAgIFsnYXBwbGljYXRpb24vdm5kLmN0Yy1wb3NtbCcsICdwbWwnXSxcbiAgICBbJ2FwcGxpY2F0aW9uL3ZuZC5jdXBzLXBwZCcsICdwcGQnXSxcbiAgICBbJ2FwcGxpY2F0aW9uL3ZuZC5jdXJsLmNhcicsICdjYXInXSxcbiAgICBbJ2FwcGxpY2F0aW9uL3ZuZC5jdXJsLnBjdXJsJywgJ3BjdXJsJ10sXG4gICAgWydhcHBsaWNhdGlvbi92bmQuZGF0YS12aXNpb24ucmR6JywgJ3JkeiddLFxuICAgIFsnYXBwbGljYXRpb24vdm5kLmRlbm92by5mY3NlbGF5b3V0LWxpbmsnLCAnZmVfbGF1bmNoJ10sXG4gICAgWydhcHBsaWNhdGlvbi92bmQuZG5hJywgJ2RuYSddLFxuICAgIFsnYXBwbGljYXRpb24vdm5kLmRvbGJ5Lm1scCcsICdtbHAnXSxcbiAgICBbJ2FwcGxpY2F0aW9uL3ZuZC5kcGdyYXBoJywgJ2RwZyddLFxuICAgIFsnYXBwbGljYXRpb24vdm5kLmRyZWFtZmFjdG9yeScsICdkZmFjJ10sXG4gICAgWydhcHBsaWNhdGlvbi92bmQuZHZiLmFpdCcsICdhaXQnXSxcbiAgICBbJ2FwcGxpY2F0aW9uL3ZuZC5kdmIuc2VydmljZScsICdzdmMnXSxcbiAgICBbJ2FwcGxpY2F0aW9uL3ZuZC5keW5hZ2VvJywgJ2dlbyddLFxuICAgIFsnYXBwbGljYXRpb24vdm5kLmVjb3dpbi5jaGFydCcsICdtYWcnXSxcbiAgICBbJ2FwcGxpY2F0aW9uL3ZuZC5lbmxpdmVuJywgJ25tbCddLFxuICAgIFsnYXBwbGljYXRpb24vdm5kLmVwc29uLmVzZicsICdlc2YnXSxcbiAgICBbJ2FwcGxpY2F0aW9uL3ZuZC5lcHNvbi5tc2YnLCAnbXNmJ10sXG4gICAgWydhcHBsaWNhdGlvbi92bmQuZXBzb24ucXVpY2thbmltZScsICdxYW0nXSxcbiAgICBbJ2FwcGxpY2F0aW9uL3ZuZC5lcHNvbi5zYWx0JywgJ3NsdCddLFxuICAgIFsnYXBwbGljYXRpb24vdm5kLmVwc29uLnNzZicsICdzc2YnXSxcbiAgICBbJ2FwcGxpY2F0aW9uL3ZuZC5lc3ppZ25vMyt4bWwnLCAnZXMzJ10sXG4gICAgWydhcHBsaWNhdGlvbi92bmQuZXpwaXgtYWxidW0nLCAnZXoyJ10sXG4gICAgWydhcHBsaWNhdGlvbi92bmQuZXpwaXgtcGFja2FnZScsICdlejMnXSxcbiAgICBbJ2FwcGxpY2F0aW9uL3ZuZC5mZGYnLCAnZmRmJ10sXG4gICAgWydhcHBsaWNhdGlvbi92bmQuZmRzbi5zZWVkJywgJ3NlZWQnXSxcbiAgICBbJ2FwcGxpY2F0aW9uL3ZuZC5mbG9ncmFwaGl0JywgJ2dwaCddLFxuICAgIFsnYXBwbGljYXRpb24vdm5kLmZsdXh0aW1lLmNsaXAnLCAnZnRjJ10sXG4gICAgWydhcHBsaWNhdGlvbi92bmQuZnJhbWVtYWtlcicsICdmbSddLFxuICAgIFsnYXBwbGljYXRpb24vdm5kLmZyb2dhbnMuZm5jJywgJ2ZuYyddLFxuICAgIFsnYXBwbGljYXRpb24vdm5kLmZyb2dhbnMubHRmJywgJ2x0ZiddLFxuICAgIFsnYXBwbGljYXRpb24vdm5kLmZzYy53ZWJsYXVuY2gnLCAnZnNjJ10sXG4gICAgWydhcHBsaWNhdGlvbi92bmQuZnVqaXRzdS5vYXN5cycsICdvYXMnXSxcbiAgICBbJ2FwcGxpY2F0aW9uL3ZuZC5mdWppdHN1Lm9hc3lzMicsICdvYTInXSxcbiAgICBbJ2FwcGxpY2F0aW9uL3ZuZC5mdWppdHN1Lm9hc3lzMycsICdvYTMnXSxcbiAgICBbJ2FwcGxpY2F0aW9uL3ZuZC5mdWppdHN1Lm9hc3lzZ3AnLCAnZmc1J10sXG4gICAgWydhcHBsaWNhdGlvbi92bmQuZnVqaXRzdS5vYXN5c3BycycsICdiaDInXSxcbiAgICBbJ2FwcGxpY2F0aW9uL3ZuZC5mdWppeGVyb3guZGRkJywgJ2RkZCddLFxuICAgIFsnYXBwbGljYXRpb24vdm5kLmZ1aml4ZXJveC5kb2N1d29ya3MnLCAneGR3J10sXG4gICAgWydhcHBsaWNhdGlvbi92bmQuZnVqaXhlcm94LmRvY3V3b3Jrcy5iaW5kZXInLCAneGJkJ10sXG4gICAgWydhcHBsaWNhdGlvbi92bmQuZnV6enlzaGVldCcsICdmenMnXSxcbiAgICBbJ2FwcGxpY2F0aW9uL3ZuZC5nZW5vbWF0aXgudHV4ZWRvJywgJ3R4ZCddLFxuICAgIFsnYXBwbGljYXRpb24vdm5kLmdlb2dlYnJhLmZpbGUnLCAnZ2diJ10sXG4gICAgWydhcHBsaWNhdGlvbi92bmQuZ2VvZ2VicmEudG9vbCcsICdnZ3QnXSxcbiAgICBbJ2FwcGxpY2F0aW9uL3ZuZC5nZW9tZXRyeS1leHBsb3JlcicsICdnZXgnXSxcbiAgICBbJ2FwcGxpY2F0aW9uL3ZuZC5nZW9uZXh0JywgJ2d4dCddLFxuICAgIFsnYXBwbGljYXRpb24vdm5kLmdlb3BsYW4nLCAnZzJ3J10sXG4gICAgWydhcHBsaWNhdGlvbi92bmQuZ2Vvc3BhY2UnLCAnZzN3J10sXG4gICAgWydhcHBsaWNhdGlvbi92bmQuZ214JywgJ2dteCddLFxuICAgIFsnYXBwbGljYXRpb24vdm5kLmdvb2dsZS1lYXJ0aC5rbWwreG1sJywgJ2ttbCddLFxuICAgIFsnYXBwbGljYXRpb24vdm5kLmdvb2dsZS1lYXJ0aC5rbXonLCAna216J10sXG4gICAgWydhcHBsaWNhdGlvbi92bmQuZ3JhZmVxJywgJ2dxZiddLFxuICAgIFsnYXBwbGljYXRpb24vdm5kLmdyb292ZS1hY2NvdW50JywgJ2dhYyddLFxuICAgIFsnYXBwbGljYXRpb24vdm5kLmdyb292ZS1oZWxwJywgJ2doZiddLFxuICAgIFsnYXBwbGljYXRpb24vdm5kLmdyb292ZS1pZGVudGl0eS1tZXNzYWdlJywgJ2dpbSddLFxuICAgIFsnYXBwbGljYXRpb24vdm5kLmdyb292ZS1pbmplY3RvcicsICdncnYnXSxcbiAgICBbJ2FwcGxpY2F0aW9uL3ZuZC5ncm9vdmUtdG9vbC1tZXNzYWdlJywgJ2d0bSddLFxuICAgIFsnYXBwbGljYXRpb24vdm5kLmdyb292ZS10b29sLXRlbXBsYXRlJywgJ3RwbCddLFxuICAgIFsnYXBwbGljYXRpb24vdm5kLmdyb292ZS12Y2FyZCcsICd2Y2cnXSxcbiAgICBbJ2FwcGxpY2F0aW9uL3ZuZC5oYWwreG1sJywgJ2hhbCddLFxuICAgIFsnYXBwbGljYXRpb24vdm5kLmhhbmRoZWxkLWVudGVydGFpbm1lbnQreG1sJywgJ3ptbSddLFxuICAgIFsnYXBwbGljYXRpb24vdm5kLmhiY2knLCAnaGJjaSddLFxuICAgIFsnYXBwbGljYXRpb24vdm5kLmhoZS5sZXNzb24tcGxheWVyJywgJ2xlcyddLFxuICAgIFsnYXBwbGljYXRpb24vdm5kLmhwLWhwZ2wnLCBbJ2hnbCcsICdocGcnLCAnaHBnbCddXSxcbiAgICBbJ2FwcGxpY2F0aW9uL3ZuZC5ocC1ocGlkJywgJ2hwaWQnXSxcbiAgICBbJ2FwcGxpY2F0aW9uL3ZuZC5ocC1ocHMnLCAnaHBzJ10sXG4gICAgWydhcHBsaWNhdGlvbi92bmQuaHAtamx5dCcsICdqbHQnXSxcbiAgICBbJ2FwcGxpY2F0aW9uL3ZuZC5ocC1wY2wnLCAncGNsJ10sXG4gICAgWydhcHBsaWNhdGlvbi92bmQuaHAtcGNseGwnLCAncGNseGwnXSxcbiAgICBbJ2FwcGxpY2F0aW9uL3ZuZC5oeWRyb3N0YXRpeC5zb2YtZGF0YScsICdzZmQtaGRzdHgnXSxcbiAgICBbJ2FwcGxpY2F0aW9uL3ZuZC5oem4tM2QtY3Jvc3N3b3JkJywgJ3gzZCddLFxuICAgIFsnYXBwbGljYXRpb24vdm5kLmlibS5taW5pcGF5JywgJ21weSddLFxuICAgIFsnYXBwbGljYXRpb24vdm5kLmlibS5tb2RjYXAnLCAnYWZwJ10sXG4gICAgWydhcHBsaWNhdGlvbi92bmQuaWJtLnJpZ2h0cy1tYW5hZ2VtZW50JywgJ2lybSddLFxuICAgIFsnYXBwbGljYXRpb24vdm5kLmlibS5zZWN1cmUtY29udGFpbmVyJywgJ3NjJ10sXG4gICAgWydhcHBsaWNhdGlvbi92bmQuaWNjcHJvZmlsZScsICdpY2MnXSxcbiAgICBbJ2FwcGxpY2F0aW9uL3ZuZC5pZ2xvYWRlcicsICdpZ2wnXSxcbiAgICBbJ2FwcGxpY2F0aW9uL3ZuZC5pbW1lcnZpc2lvbi1pdnAnLCAnaXZwJ10sXG4gICAgWydhcHBsaWNhdGlvbi92bmQuaW1tZXJ2aXNpb24taXZ1JywgJ2l2dSddLFxuICAgIFsnYXBwbGljYXRpb24vdm5kLmluc29ycy5pZ20nLCAnaWdtJ10sXG4gICAgWydhcHBsaWNhdGlvbi92bmQuaW50ZXJjb24uZm9ybW5ldCcsICd4cHcnXSxcbiAgICBbJ2FwcGxpY2F0aW9uL3ZuZC5pbnRlcmdlbycsICdpMmcnXSxcbiAgICBbJ2FwcGxpY2F0aW9uL3ZuZC5pbnR1LnFibycsICdxYm8nXSxcbiAgICBbJ2FwcGxpY2F0aW9uL3ZuZC5pbnR1LnFmeCcsICdxZngnXSxcbiAgICBbJ2FwcGxpY2F0aW9uL3ZuZC5pcHVucGx1Z2dlZC5yY3Byb2ZpbGUnLCAncmNwcm9maWxlJ10sXG4gICAgWydhcHBsaWNhdGlvbi92bmQuaXJlcG9zaXRvcnkucGFja2FnZSt4bWwnLCAnaXJwJ10sXG4gICAgWydhcHBsaWNhdGlvbi92bmQuaXMteHByJywgJ3hwciddLFxuICAgIFsnYXBwbGljYXRpb24vdm5kLmlzYWMuZmNzJywgJ2ZjcyddLFxuICAgIFsnYXBwbGljYXRpb24vdm5kLmphbScsICdqYW0nXSxcbiAgICBbJ2FwcGxpY2F0aW9uL3ZuZC5qY3AuamF2YW1lLm1pZGxldC1ybXMnLCAncm1zJ10sXG4gICAgWydhcHBsaWNhdGlvbi92bmQuamlzcCcsICdqaXNwJ10sXG4gICAgWydhcHBsaWNhdGlvbi92bmQuam9vc3Quam9kYS1hcmNoaXZlJywgJ2pvZGEnXSxcbiAgICBbJ2FwcGxpY2F0aW9uL3ZuZC5rYWhvb3R6JywgJ2t0eiddLFxuICAgIFsnYXBwbGljYXRpb24vdm5kLmtkZS5rYXJib24nLCAna2FyYm9uJ10sXG4gICAgWydhcHBsaWNhdGlvbi92bmQua2RlLmtjaGFydCcsICdjaHJ0J10sXG4gICAgWydhcHBsaWNhdGlvbi92bmQua2RlLmtmb3JtdWxhJywgJ2tmbyddLFxuICAgIFsnYXBwbGljYXRpb24vdm5kLmtkZS5raXZpbycsICdmbHcnXSxcbiAgICBbJ2FwcGxpY2F0aW9uL3ZuZC5rZGUua29udG91cicsICdrb24nXSxcbiAgICBbJ2FwcGxpY2F0aW9uL3ZuZC5rZGUua3ByZXNlbnRlcicsICdrcHInXSxcbiAgICBbJ2FwcGxpY2F0aW9uL3ZuZC5rZGUua3NwcmVhZCcsICdrc3AnXSxcbiAgICBbJ2FwcGxpY2F0aW9uL3ZuZC5rZGUua3dvcmQnLCAna3dkJ10sXG4gICAgWydhcHBsaWNhdGlvbi92bmQua2VuYW1lYWFwcCcsICdodGtlJ10sXG4gICAgWydhcHBsaWNhdGlvbi92bmQua2lkc3BpcmF0aW9uJywgJ2tpYSddLFxuICAgIFsnYXBwbGljYXRpb24vdm5kLmtpbmFyJywgJ2tuZSddLFxuICAgIFsnYXBwbGljYXRpb24vdm5kLmtvYW4nLCAnc2twJ10sXG4gICAgWydhcHBsaWNhdGlvbi92bmQua29kYWstZGVzY3JpcHRvcicsICdzc2UnXSxcbiAgICBbJ2FwcGxpY2F0aW9uL3ZuZC5sYXMubGFzK3htbCcsICdsYXN4bWwnXSxcbiAgICBbJ2FwcGxpY2F0aW9uL3ZuZC5sbGFtYWdyYXBoaWNzLmxpZmUtYmFsYW5jZS5kZXNrdG9wJywgJ2xiZCddLFxuICAgIFsnYXBwbGljYXRpb24vdm5kLmxsYW1hZ3JhcGhpY3MubGlmZS1iYWxhbmNlLmV4Y2hhbmdlK3htbCcsICdsYmUnXSxcbiAgICBbJ2FwcGxpY2F0aW9uL3ZuZC5sb3R1cy0xLTItMycsICcxMjMnXSxcbiAgICBbJ2FwcGxpY2F0aW9uL3ZuZC5sb3R1cy1hcHByb2FjaCcsICdhcHInXSxcbiAgICBbJ2FwcGxpY2F0aW9uL3ZuZC5sb3R1cy1mcmVlbGFuY2UnLCAncHJlJ10sXG4gICAgWydhcHBsaWNhdGlvbi92bmQubG90dXMtbm90ZXMnLCAnbnNmJ10sXG4gICAgWydhcHBsaWNhdGlvbi92bmQubG90dXMtb3JnYW5pemVyJywgJ29yZyddLFxuICAgIFsnYXBwbGljYXRpb24vdm5kLmxvdHVzLXNjcmVlbmNhbScsICdzY20nXSxcbiAgICBbJ2FwcGxpY2F0aW9uL3ZuZC5sb3R1cy13b3JkcHJvJywgJ2x3cCddLFxuICAgIFsnYXBwbGljYXRpb24vdm5kLm1hY3BvcnRzLnBvcnRwa2cnLCAncG9ydHBrZyddLFxuICAgIFsnYXBwbGljYXRpb24vdm5kLm1jZCcsICdtY2QnXSxcbiAgICBbJ2FwcGxpY2F0aW9uL3ZuZC5tZWRjYWxjZGF0YScsICdtYzEnXSxcbiAgICBbJ2FwcGxpY2F0aW9uL3ZuZC5tZWRpYXN0YXRpb24uY2RrZXknLCAnY2RrZXknXSxcbiAgICBbJ2FwcGxpY2F0aW9uL3ZuZC5tZmVyJywgJ213ZiddLFxuICAgIFsnYXBwbGljYXRpb24vdm5kLm1mbXAnLCAnbWZtJ10sXG4gICAgWydhcHBsaWNhdGlvbi92bmQubWljcm9ncmFmeC5mbG8nLCAnZmxvJ10sXG4gICAgWydhcHBsaWNhdGlvbi92bmQubWljcm9ncmFmeC5pZ3gnLCAnaWd4J10sXG4gICAgWydhcHBsaWNhdGlvbi92bmQubWlmJywgJ21pZiddLFxuICAgIFsnYXBwbGljYXRpb24vdm5kLm1vYml1cy5kYWYnLCAnZGFmJ10sXG4gICAgWydhcHBsaWNhdGlvbi92bmQubW9iaXVzLmRpcycsICdkaXMnXSxcbiAgICBbJ2FwcGxpY2F0aW9uL3ZuZC5tb2JpdXMubWJrJywgJ21iayddLFxuICAgIFsnYXBwbGljYXRpb24vdm5kLm1vYml1cy5tcXknLCAnbXF5J10sXG4gICAgWydhcHBsaWNhdGlvbi92bmQubW9iaXVzLm1zbCcsICdtc2wnXSxcbiAgICBbJ2FwcGxpY2F0aW9uL3ZuZC5tb2JpdXMucGxjJywgJ3BsYyddLFxuICAgIFsnYXBwbGljYXRpb24vdm5kLm1vYml1cy50eGYnLCAndHhmJ10sXG4gICAgWydhcHBsaWNhdGlvbi92bmQubW9waHVuLmFwcGxpY2F0aW9uJywgJ21wbiddLFxuICAgIFsnYXBwbGljYXRpb24vdm5kLm1vcGh1bi5jZXJ0aWZpY2F0ZScsICdtcGMnXSxcbiAgICBbJ2FwcGxpY2F0aW9uL3ZuZC5tb3ppbGxhLnh1bCt4bWwnLCAneHVsJ10sXG4gICAgWydhcHBsaWNhdGlvbi92bmQubXMtYXJ0Z2FscnknLCAnY2lsJ10sXG4gICAgWydhcHBsaWNhdGlvbi92bmQubXMtY2FiLWNvbXByZXNzZWQnLCAnY2FiJ10sXG4gICAgWydhcHBsaWNhdGlvbi92bmQubXMtZXhjZWwnLCBbJ3hscycsICd4bGEnLCAneGxjJywgJ3hsbScsICd4bHQnLCAneGx3JywgJ3hsYicsICd4bGwnXV0sXG4gICAgWydhcHBsaWNhdGlvbi92bmQubXMtZXhjZWwuYWRkaW4ubWFjcm9lbmFibGVkLjEyJywgJ3hsYW0nXSxcbiAgICBbJ2FwcGxpY2F0aW9uL3ZuZC5tcy1leGNlbC5zaGVldC5iaW5hcnkubWFjcm9lbmFibGVkLjEyJywgJ3hsc2InXSxcbiAgICBbJ2FwcGxpY2F0aW9uL3ZuZC5tcy1leGNlbC5zaGVldC5tYWNyb2VuYWJsZWQuMTInLCAneGxzbSddLFxuICAgIFsnYXBwbGljYXRpb24vdm5kLm1zLWV4Y2VsLnRlbXBsYXRlLm1hY3JvZW5hYmxlZC4xMicsICd4bHRtJ10sXG4gICAgWydhcHBsaWNhdGlvbi92bmQubXMtZm9udG9iamVjdCcsICdlb3QnXSxcbiAgICBbJ2FwcGxpY2F0aW9uL3ZuZC5tcy1odG1saGVscCcsICdjaG0nXSxcbiAgICBbJ2FwcGxpY2F0aW9uL3ZuZC5tcy1pbXMnLCAnaW1zJ10sXG4gICAgWydhcHBsaWNhdGlvbi92bmQubXMtbHJtJywgJ2xybSddLFxuICAgIFsnYXBwbGljYXRpb24vdm5kLm1zLW9mZmljZXRoZW1lJywgJ3RobXgnXSxcbiAgICBbJ2FwcGxpY2F0aW9uL3ZuZC5tcy1vdXRsb29rJywgJ21zZyddLFxuICAgIFsnYXBwbGljYXRpb24vdm5kLm1zLXBraS5jZXJ0c3RvcmUnLCAnc3N0J10sXG4gICAgWydhcHBsaWNhdGlvbi92bmQubXMtcGtpLnBrbycsICdwa28nXSxcbiAgICBbJ2FwcGxpY2F0aW9uL3ZuZC5tcy1wa2kuc2VjY2F0JywgJ2NhdCddLFxuICAgIFsnYXBwbGljYXRpb24vdm5kLm1zLXBraS5zdGwnLCAnc3RsJ10sXG4gICAgWydhcHBsaWNhdGlvbi92bmQubXMtcGtpY2VydHN0b3JlJywgJ3NzdCddLFxuICAgIFsnYXBwbGljYXRpb24vdm5kLm1zLXBraXNlY2NhdCcsICdjYXQnXSxcbiAgICBbJ2FwcGxpY2F0aW9uL3ZuZC5tcy1wa2lzdGwnLCAnc3RsJ10sXG4gICAgWydhcHBsaWNhdGlvbi92bmQubXMtcG93ZXJwb2ludCcsIFsncHB0JywgJ3BvdCcsICdwcHMnLCAncHBhJywgJ3B3eiddXSxcbiAgICBbJ2FwcGxpY2F0aW9uL3ZuZC5tcy1wb3dlcnBvaW50LmFkZGluLm1hY3JvZW5hYmxlZC4xMicsICdwcGFtJ10sXG4gICAgWydhcHBsaWNhdGlvbi92bmQubXMtcG93ZXJwb2ludC5wcmVzZW50YXRpb24ubWFjcm9lbmFibGVkLjEyJywgJ3BwdG0nXSxcbiAgICBbJ2FwcGxpY2F0aW9uL3ZuZC5tcy1wb3dlcnBvaW50LnNsaWRlLm1hY3JvZW5hYmxlZC4xMicsICdzbGRtJ10sXG4gICAgWydhcHBsaWNhdGlvbi92bmQubXMtcG93ZXJwb2ludC5zbGlkZXNob3cubWFjcm9lbmFibGVkLjEyJywgJ3Bwc20nXSxcbiAgICBbJ2FwcGxpY2F0aW9uL3ZuZC5tcy1wb3dlcnBvaW50LnRlbXBsYXRlLm1hY3JvZW5hYmxlZC4xMicsICdwb3RtJ10sXG4gICAgWydhcHBsaWNhdGlvbi92bmQubXMtcHJvamVjdCcsICdtcHAnXSxcbiAgICBbJ2FwcGxpY2F0aW9uL3ZuZC5tcy13b3JkLmRvY3VtZW50Lm1hY3JvZW5hYmxlZC4xMicsICdkb2NtJ10sXG4gICAgWydhcHBsaWNhdGlvbi92bmQubXMtd29yZC50ZW1wbGF0ZS5tYWNyb2VuYWJsZWQuMTInLCAnZG90bSddLFxuICAgIFsnYXBwbGljYXRpb24vdm5kLm1zLXdvcmtzJywgWyd3a3MnLCAnd2NtJywgJ3dkYicsICd3cHMnXV0sXG4gICAgWydhcHBsaWNhdGlvbi92bmQubXMtd3BsJywgJ3dwbCddLFxuICAgIFsnYXBwbGljYXRpb24vdm5kLm1zLXhwc2RvY3VtZW50JywgJ3hwcyddLFxuICAgIFsnYXBwbGljYXRpb24vdm5kLm1zZXEnLCAnbXNlcSddLFxuICAgIFsnYXBwbGljYXRpb24vdm5kLm11c2ljaWFuJywgJ211cyddLFxuICAgIFsnYXBwbGljYXRpb24vdm5kLm11dmVlLnN0eWxlJywgJ21zdHknXSxcbiAgICBbJ2FwcGxpY2F0aW9uL3ZuZC5uZXVyb2xhbmd1YWdlLm5sdScsICdubHUnXSxcbiAgICBbJ2FwcGxpY2F0aW9uL3ZuZC5ub2JsZW5ldC1kaXJlY3RvcnknLCAnbm5kJ10sXG4gICAgWydhcHBsaWNhdGlvbi92bmQubm9ibGVuZXQtc2VhbGVyJywgJ25ucyddLFxuICAgIFsnYXBwbGljYXRpb24vdm5kLm5vYmxlbmV0LXdlYicsICdubncnXSxcbiAgICBbJ2FwcGxpY2F0aW9uL3ZuZC5ub2tpYS5jb25maWd1cmF0aW9uLW1lc3NhZ2UnLCAnbmNtJ10sXG4gICAgWydhcHBsaWNhdGlvbi92bmQubm9raWEubi1nYWdlLmRhdGEnLCAnbmdkYXQnXSxcbiAgICBbJ2FwcGxpY2F0aW9uL3ZuZC5ub2tpYS5uLWdhZ2Uuc3ltYmlhbi5pbnN0YWxsJywgJ24tZ2FnZSddLFxuICAgIFsnYXBwbGljYXRpb24vdm5kLm5va2lhLnJhZGlvLXByZXNldCcsICdycHN0J10sXG4gICAgWydhcHBsaWNhdGlvbi92bmQubm9raWEucmFkaW8tcHJlc2V0cycsICdycHNzJ10sXG4gICAgWydhcHBsaWNhdGlvbi92bmQubm9raWEucmluZ2luZy10b25lJywgJ3JuZyddLFxuICAgIFsnYXBwbGljYXRpb24vdm5kLm5vdmFkaWdtLmVkbScsICdlZG0nXSxcbiAgICBbJ2FwcGxpY2F0aW9uL3ZuZC5ub3ZhZGlnbS5lZHgnLCAnZWR4J10sXG4gICAgWydhcHBsaWNhdGlvbi92bmQubm92YWRpZ20uZXh0JywgJ2V4dCddLFxuICAgIFsnYXBwbGljYXRpb24vdm5kLm9hc2lzLm9wZW5kb2N1bWVudC5jaGFydCcsICdvZGMnXSxcbiAgICBbJ2FwcGxpY2F0aW9uL3ZuZC5vYXNpcy5vcGVuZG9jdW1lbnQuY2hhcnQtdGVtcGxhdGUnLCAnb3RjJ10sXG4gICAgWydhcHBsaWNhdGlvbi92bmQub2FzaXMub3BlbmRvY3VtZW50LmRhdGFiYXNlJywgJ29kYiddLFxuICAgIFsnYXBwbGljYXRpb24vdm5kLm9hc2lzLm9wZW5kb2N1bWVudC5mb3JtdWxhJywgJ29kZiddLFxuICAgIFsnYXBwbGljYXRpb24vdm5kLm9hc2lzLm9wZW5kb2N1bWVudC5mb3JtdWxhLXRlbXBsYXRlJywgJ29kZnQnXSxcbiAgICBbJ2FwcGxpY2F0aW9uL3ZuZC5vYXNpcy5vcGVuZG9jdW1lbnQuZ3JhcGhpY3MnLCAnb2RnJ10sXG4gICAgWydhcHBsaWNhdGlvbi92bmQub2FzaXMub3BlbmRvY3VtZW50LmdyYXBoaWNzLXRlbXBsYXRlJywgJ290ZyddLFxuICAgIFsnYXBwbGljYXRpb24vdm5kLm9hc2lzLm9wZW5kb2N1bWVudC5pbWFnZScsICdvZGknXSxcbiAgICBbJ2FwcGxpY2F0aW9uL3ZuZC5vYXNpcy5vcGVuZG9jdW1lbnQuaW1hZ2UtdGVtcGxhdGUnLCAnb3RpJ10sXG4gICAgWydhcHBsaWNhdGlvbi92bmQub2FzaXMub3BlbmRvY3VtZW50LnByZXNlbnRhdGlvbicsICdvZHAnXSxcbiAgICBbJ2FwcGxpY2F0aW9uL3ZuZC5vYXNpcy5vcGVuZG9jdW1lbnQucHJlc2VudGF0aW9uLXRlbXBsYXRlJywgJ290cCddLFxuICAgIFsnYXBwbGljYXRpb24vdm5kLm9hc2lzLm9wZW5kb2N1bWVudC5zcHJlYWRzaGVldCcsICdvZHMnXSxcbiAgICBbJ2FwcGxpY2F0aW9uL3ZuZC5vYXNpcy5vcGVuZG9jdW1lbnQuc3ByZWFkc2hlZXQtdGVtcGxhdGUnLCAnb3RzJ10sXG4gICAgWydhcHBsaWNhdGlvbi92bmQub2FzaXMub3BlbmRvY3VtZW50LnRleHQnLCAnb2R0J10sXG4gICAgWydhcHBsaWNhdGlvbi92bmQub2FzaXMub3BlbmRvY3VtZW50LnRleHQtbWFzdGVyJywgJ29kbSddLFxuICAgIFsnYXBwbGljYXRpb24vdm5kLm9hc2lzLm9wZW5kb2N1bWVudC50ZXh0LXRlbXBsYXRlJywgJ290dCddLFxuICAgIFsnYXBwbGljYXRpb24vdm5kLm9hc2lzLm9wZW5kb2N1bWVudC50ZXh0LXdlYicsICdvdGgnXSxcbiAgICBbJ2FwcGxpY2F0aW9uL3ZuZC5vbHBjLXN1Z2FyJywgJ3hvJ10sXG4gICAgWydhcHBsaWNhdGlvbi92bmQub21hLmRkMit4bWwnLCAnZGQyJ10sXG4gICAgWydhcHBsaWNhdGlvbi92bmQub3Blbm9mZmljZW9yZy5leHRlbnNpb24nLCAnb3h0J10sXG4gICAgWydhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQucHJlc2VudGF0aW9ubWwucHJlc2VudGF0aW9uJywgJ3BwdHgnXSxcbiAgICBbJ2FwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5wcmVzZW50YXRpb25tbC5zbGlkZScsICdzbGR4J10sXG4gICAgWydhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQucHJlc2VudGF0aW9ubWwuc2xpZGVzaG93JywgJ3Bwc3gnXSxcbiAgICBbJ2FwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5wcmVzZW50YXRpb25tbC50ZW1wbGF0ZScsICdwb3R4J10sXG4gICAgWydhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQuc3ByZWFkc2hlZXRtbC5zaGVldCcsICd4bHN4J10sXG4gICAgWydhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQuc3ByZWFkc2hlZXRtbC50ZW1wbGF0ZScsICd4bHR4J10sXG4gICAgWydhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQud29yZHByb2Nlc3NpbmdtbC5kb2N1bWVudCcsICdkb2N4J10sXG4gICAgWydhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQud29yZHByb2Nlc3NpbmdtbC50ZW1wbGF0ZScsICdkb3R4J10sXG4gICAgWydhcHBsaWNhdGlvbi92bmQub3NnZW8ubWFwZ3VpZGUucGFja2FnZScsICdtZ3AnXSxcbiAgICBbJ2FwcGxpY2F0aW9uL3ZuZC5vc2dpLmRwJywgJ2RwJ10sXG4gICAgWydhcHBsaWNhdGlvbi92bmQucGFsbScsICdwZGInXSxcbiAgICBbJ2FwcGxpY2F0aW9uL3ZuZC5wYXdhYWZpbGUnLCAncGF3J10sXG4gICAgWydhcHBsaWNhdGlvbi92bmQucGcuZm9ybWF0JywgJ3N0ciddLFxuICAgIFsnYXBwbGljYXRpb24vdm5kLnBnLm9zYXNsaScsICdlaTYnXSxcbiAgICBbJ2FwcGxpY2F0aW9uL3ZuZC5waWNzZWwnLCAnZWZpZiddLFxuICAgIFsnYXBwbGljYXRpb24vdm5kLnBtaS53aWRnZXQnLCAnd2cnXSxcbiAgICBbJ2FwcGxpY2F0aW9uL3ZuZC5wb2NrZXRsZWFybicsICdwbGYnXSxcbiAgICBbJ2FwcGxpY2F0aW9uL3ZuZC5wb3dlcmJ1aWxkZXI2JywgJ3BiZCddLFxuICAgIFsnYXBwbGljYXRpb24vdm5kLnByZXZpZXdzeXN0ZW1zLmJveCcsICdib3gnXSxcbiAgICBbJ2FwcGxpY2F0aW9uL3ZuZC5wcm90ZXVzLm1hZ2F6aW5lJywgJ21neiddLFxuICAgIFsnYXBwbGljYXRpb24vdm5kLnB1Ymxpc2hhcmUtZGVsdGEtdHJlZScsICdxcHMnXSxcbiAgICBbJ2FwcGxpY2F0aW9uL3ZuZC5wdmkucHRpZDEnLCAncHRpZCddLFxuICAgIFsnYXBwbGljYXRpb24vdm5kLnF1YXJrLnF1YXJreHByZXNzJywgJ3F4ZCddLFxuICAgIFsnYXBwbGljYXRpb24vdm5kLnJlYWx2bmMuYmVkJywgJ2JlZCddLFxuICAgIFsnYXBwbGljYXRpb24vdm5kLnJlY29yZGFyZS5tdXNpY3htbCcsICdteGwnXSxcbiAgICBbJ2FwcGxpY2F0aW9uL3ZuZC5yZWNvcmRhcmUubXVzaWN4bWwreG1sJywgJ211c2ljeG1sJ10sXG4gICAgWydhcHBsaWNhdGlvbi92bmQucmlnLmNyeXB0b25vdGUnLCAnY3J5cHRvbm90ZSddLFxuICAgIFsnYXBwbGljYXRpb24vdm5kLnJpbS5jb2QnLCAnY29kJ10sXG4gICAgWydhcHBsaWNhdGlvbi92bmQucm4tcmVhbG1lZGlhJywgJ3JtJ10sXG4gICAgWydhcHBsaWNhdGlvbi92bmQucm4tcmVhbHBsYXllcicsICdybngnXSxcbiAgICBbJ2FwcGxpY2F0aW9uL3ZuZC5yb3V0ZTY2Lmxpbms2Nit4bWwnLCAnbGluazY2J10sXG4gICAgWydhcHBsaWNhdGlvbi92bmQuc2FpbGluZ3RyYWNrZXIudHJhY2snLCAnc3QnXSxcbiAgICBbJ2FwcGxpY2F0aW9uL3ZuZC5zZWVtYWlsJywgJ3NlZSddLFxuICAgIFsnYXBwbGljYXRpb24vdm5kLnNlbWEnLCAnc2VtYSddLFxuICAgIFsnYXBwbGljYXRpb24vdm5kLnNlbWQnLCAnc2VtZCddLFxuICAgIFsnYXBwbGljYXRpb24vdm5kLnNlbWYnLCAnc2VtZiddLFxuICAgIFsnYXBwbGljYXRpb24vdm5kLnNoYW5hLmluZm9ybWVkLmZvcm1kYXRhJywgJ2lmbSddLFxuICAgIFsnYXBwbGljYXRpb24vdm5kLnNoYW5hLmluZm9ybWVkLmZvcm10ZW1wbGF0ZScsICdpdHAnXSxcbiAgICBbJ2FwcGxpY2F0aW9uL3ZuZC5zaGFuYS5pbmZvcm1lZC5pbnRlcmNoYW5nZScsICdpaWYnXSxcbiAgICBbJ2FwcGxpY2F0aW9uL3ZuZC5zaGFuYS5pbmZvcm1lZC5wYWNrYWdlJywgJ2lwayddLFxuICAgIFsnYXBwbGljYXRpb24vdm5kLnNpbXRlY2gtbWluZG1hcHBlcicsICd0d2QnXSxcbiAgICBbJ2FwcGxpY2F0aW9uL3ZuZC5zbWFmJywgJ21tZiddLFxuICAgIFsnYXBwbGljYXRpb24vdm5kLnNtYXJ0LnRlYWNoZXInLCAndGVhY2hlciddLFxuICAgIFsnYXBwbGljYXRpb24vdm5kLnNvbGVudC5zZGttK3htbCcsICdzZGttJ10sXG4gICAgWydhcHBsaWNhdGlvbi92bmQuc3BvdGZpcmUuZHhwJywgJ2R4cCddLFxuICAgIFsnYXBwbGljYXRpb24vdm5kLnNwb3RmaXJlLnNmcycsICdzZnMnXSxcbiAgICBbJ2FwcGxpY2F0aW9uL3ZuZC5zdGFyZGl2aXNpb24uY2FsYycsICdzZGMnXSxcbiAgICBbJ2FwcGxpY2F0aW9uL3ZuZC5zdGFyZGl2aXNpb24uZHJhdycsICdzZGEnXSxcbiAgICBbJ2FwcGxpY2F0aW9uL3ZuZC5zdGFyZGl2aXNpb24uaW1wcmVzcycsICdzZGQnXSxcbiAgICBbJ2FwcGxpY2F0aW9uL3ZuZC5zdGFyZGl2aXNpb24ubWF0aCcsICdzbWYnXSxcbiAgICBbJ2FwcGxpY2F0aW9uL3ZuZC5zdGFyZGl2aXNpb24ud3JpdGVyJywgJ3NkdyddLFxuICAgIFsnYXBwbGljYXRpb24vdm5kLnN0YXJkaXZpc2lvbi53cml0ZXItZ2xvYmFsJywgJ3NnbCddLFxuICAgIFsnYXBwbGljYXRpb24vdm5kLnN0ZXBtYW5pYS5zdGVwY2hhcnQnLCAnc20nXSxcbiAgICBbJ2FwcGxpY2F0aW9uL3ZuZC5zdW4ueG1sLmNhbGMnLCAnc3hjJ10sXG4gICAgWydhcHBsaWNhdGlvbi92bmQuc3VuLnhtbC5jYWxjLnRlbXBsYXRlJywgJ3N0YyddLFxuICAgIFsnYXBwbGljYXRpb24vdm5kLnN1bi54bWwuZHJhdycsICdzeGQnXSxcbiAgICBbJ2FwcGxpY2F0aW9uL3ZuZC5zdW4ueG1sLmRyYXcudGVtcGxhdGUnLCAnc3RkJ10sXG4gICAgWydhcHBsaWNhdGlvbi92bmQuc3VuLnhtbC5pbXByZXNzJywgJ3N4aSddLFxuICAgIFsnYXBwbGljYXRpb24vdm5kLnN1bi54bWwuaW1wcmVzcy50ZW1wbGF0ZScsICdzdGknXSxcbiAgICBbJ2FwcGxpY2F0aW9uL3ZuZC5zdW4ueG1sLm1hdGgnLCAnc3htJ10sXG4gICAgWydhcHBsaWNhdGlvbi92bmQuc3VuLnhtbC53cml0ZXInLCAnc3h3J10sXG4gICAgWydhcHBsaWNhdGlvbi92bmQuc3VuLnhtbC53cml0ZXIuZ2xvYmFsJywgJ3N4ZyddLFxuICAgIFsnYXBwbGljYXRpb24vdm5kLnN1bi54bWwud3JpdGVyLnRlbXBsYXRlJywgJ3N0dyddLFxuICAgIFsnYXBwbGljYXRpb24vdm5kLnN1cy1jYWxlbmRhcicsICdzdXMnXSxcbiAgICBbJ2FwcGxpY2F0aW9uL3ZuZC5zdmQnLCAnc3ZkJ10sXG4gICAgWydhcHBsaWNhdGlvbi92bmQuc3ltYmlhbi5pbnN0YWxsJywgJ3NpcyddLFxuICAgIFsnYXBwbGljYXRpb24vdm5kLnN5bmNtbCt4bWwnLCAneHNtJ10sXG4gICAgWydhcHBsaWNhdGlvbi92bmQuc3luY21sLmRtK3dieG1sJywgJ2JkbSddLFxuICAgIFsnYXBwbGljYXRpb24vdm5kLnN5bmNtbC5kbSt4bWwnLCAneGRtJ10sXG4gICAgWydhcHBsaWNhdGlvbi92bmQudGFvLmludGVudC1tb2R1bGUtYXJjaGl2ZScsICd0YW8nXSxcbiAgICBbJ2FwcGxpY2F0aW9uL3ZuZC50bW9iaWxlLWxpdmV0dicsICd0bW8nXSxcbiAgICBbJ2FwcGxpY2F0aW9uL3ZuZC50cmlkLnRwdCcsICd0cHQnXSxcbiAgICBbJ2FwcGxpY2F0aW9uL3ZuZC50cmlzY2FwZS5teHMnLCAnbXhzJ10sXG4gICAgWydhcHBsaWNhdGlvbi92bmQudHJ1ZWFwcCcsICd0cmEnXSxcbiAgICBbJ2FwcGxpY2F0aW9uL3ZuZC51ZmRsJywgJ3VmZCddLFxuICAgIFsnYXBwbGljYXRpb24vdm5kLnVpcS50aGVtZScsICd1dHonXSxcbiAgICBbJ2FwcGxpY2F0aW9uL3ZuZC51bWFqaW4nLCAndW1qJ10sXG4gICAgWydhcHBsaWNhdGlvbi92bmQudW5pdHknLCAndW5pdHl3ZWInXSxcbiAgICBbJ2FwcGxpY2F0aW9uL3ZuZC51b21sK3htbCcsICd1b21sJ10sXG4gICAgWydhcHBsaWNhdGlvbi92bmQudmN4JywgJ3ZjeCddLFxuICAgIFsnYXBwbGljYXRpb24vdm5kLnZpc2lvJywgJ3ZzZCddLFxuICAgIFsnYXBwbGljYXRpb24vdm5kLnZpc2lvbmFyeScsICd2aXMnXSxcbiAgICBbJ2FwcGxpY2F0aW9uL3ZuZC52c2YnLCAndnNmJ10sXG4gICAgWydhcHBsaWNhdGlvbi92bmQud2FwLndieG1sJywgJ3dieG1sJ10sXG4gICAgWydhcHBsaWNhdGlvbi92bmQud2FwLndtbGMnLCAnd21sYyddLFxuICAgIFsnYXBwbGljYXRpb24vdm5kLndhcC53bWxzY3JpcHRjJywgJ3dtbHNjJ10sXG4gICAgWydhcHBsaWNhdGlvbi92bmQud2VidHVyYm8nLCAnd3RiJ10sXG4gICAgWydhcHBsaWNhdGlvbi92bmQud29sZnJhbS5wbGF5ZXInLCAnbmJwJ10sXG4gICAgWydhcHBsaWNhdGlvbi92bmQud29yZHBlcmZlY3QnLCAnd3BkJ10sXG4gICAgWydhcHBsaWNhdGlvbi92bmQud3FkJywgJ3dxZCddLFxuICAgIFsnYXBwbGljYXRpb24vdm5kLnd0LnN0ZicsICdzdGYnXSxcbiAgICBbJ2FwcGxpY2F0aW9uL3ZuZC54YXJhJywgWyd3ZWInLCAneGFyJ11dLFxuICAgIFsnYXBwbGljYXRpb24vdm5kLnhmZGwnLCAneGZkbCddLFxuICAgIFsnYXBwbGljYXRpb24vdm5kLnlhbWFoYS5odi1kaWMnLCAnaHZkJ10sXG4gICAgWydhcHBsaWNhdGlvbi92bmQueWFtYWhhLmh2LXNjcmlwdCcsICdodnMnXSxcbiAgICBbJ2FwcGxpY2F0aW9uL3ZuZC55YW1haGEuaHYtdm9pY2UnLCAnaHZwJ10sXG4gICAgWydhcHBsaWNhdGlvbi92bmQueWFtYWhhLm9wZW5zY29yZWZvcm1hdCcsICdvc2YnXSxcbiAgICBbJ2FwcGxpY2F0aW9uL3ZuZC55YW1haGEub3BlbnNjb3JlZm9ybWF0Lm9zZnB2Zyt4bWwnLCAnb3NmcHZnJ10sXG4gICAgWydhcHBsaWNhdGlvbi92bmQueWFtYWhhLnNtYWYtYXVkaW8nLCAnc2FmJ10sXG4gICAgWydhcHBsaWNhdGlvbi92bmQueWFtYWhhLnNtYWYtcGhyYXNlJywgJ3NwZiddLFxuICAgIFsnYXBwbGljYXRpb24vdm5kLnllbGxvd3JpdmVyLWN1c3RvbS1tZW51JywgJ2NtcCddLFxuICAgIFsnYXBwbGljYXRpb24vdm5kLnp1bCcsICd6aXInXSxcbiAgICBbJ2FwcGxpY2F0aW9uL3ZuZC56emF6ei5kZWNrK3htbCcsICd6YXonXSxcbiAgICBbJ2FwcGxpY2F0aW9uL3ZvY2FsdGVjLW1lZGlhLWRlc2MnLCAndm1kJ10sXG4gICAgWydhcHBsaWNhdGlvbi92b2NhbHRlYy1tZWRpYS1maWxlJywgJ3ZtZiddLFxuICAgIFsnYXBwbGljYXRpb24vdm9pY2V4bWwreG1sJywgJ3Z4bWwnXSxcbiAgICBbJ2FwcGxpY2F0aW9uL3dpZGdldCcsICd3Z3QnXSxcbiAgICBbJ2FwcGxpY2F0aW9uL3dpbmhscCcsICdobHAnXSxcbiAgICBbJ2FwcGxpY2F0aW9uL3dvcmRwZXJmZWN0JywgWyd3cCcsICd3cDUnLCAnd3A2JywgJ3dwZCddXSxcbiAgICBbJ2FwcGxpY2F0aW9uL3dvcmRwZXJmZWN0Ni4wJywgWyd3NjAnLCAnd3A1J11dLFxuICAgIFsnYXBwbGljYXRpb24vd29yZHBlcmZlY3Q2LjEnLCAndzYxJ10sXG4gICAgWydhcHBsaWNhdGlvbi93c2RsK3htbCcsICd3c2RsJ10sXG4gICAgWydhcHBsaWNhdGlvbi93c3BvbGljeSt4bWwnLCAnd3Nwb2xpY3knXSxcbiAgICBbJ2FwcGxpY2F0aW9uL3gtMTIzJywgJ3drMSddLFxuICAgIFsnYXBwbGljYXRpb24veC03ei1jb21wcmVzc2VkJywgJzd6J10sXG4gICAgWydhcHBsaWNhdGlvbi94LWFiaXdvcmQnLCAnYWJ3J10sXG4gICAgWydhcHBsaWNhdGlvbi94LWFjZS1jb21wcmVzc2VkJywgJ2FjZSddLFxuICAgIFsnYXBwbGljYXRpb24veC1haW0nLCAnYWltJ10sXG4gICAgWydhcHBsaWNhdGlvbi94LWF1dGhvcndhcmUtYmluJywgJ2FhYiddLFxuICAgIFsnYXBwbGljYXRpb24veC1hdXRob3J3YXJlLW1hcCcsICdhYW0nXSxcbiAgICBbJ2FwcGxpY2F0aW9uL3gtYXV0aG9yd2FyZS1zZWcnLCAnYWFzJ10sXG4gICAgWydhcHBsaWNhdGlvbi94LWJjcGlvJywgJ2JjcGlvJ10sXG4gICAgWydhcHBsaWNhdGlvbi94LWJpbmFyeScsICdiaW4nXSxcbiAgICBbJ2FwcGxpY2F0aW9uL3gtYmluaGV4NDAnLCAnaHF4J10sXG4gICAgWydhcHBsaWNhdGlvbi94LWJpdHRvcnJlbnQnLCAndG9ycmVudCddLFxuICAgIFsnYXBwbGljYXRpb24veC1ic2gnLCBbJ2JzaCcsICdzaCcsICdzaGFyJ11dLFxuICAgIFsnYXBwbGljYXRpb24veC1ieXRlY29kZS5lbGlzcCcsICdlbGMnXSxcbiAgICBbJ2FwcGxpY2F0aW9uL3gtYnl0ZWNvZGUucHl0aG9uJywgJ3B5YyddLFxuICAgIFsnYXBwbGljYXRpb24veC1iemlwJywgJ2J6J10sXG4gICAgWydhcHBsaWNhdGlvbi94LWJ6aXAyJywgWydib3onLCAnYnoyJ11dLFxuICAgIFsnYXBwbGljYXRpb24veC1jZGYnLCAnY2RmJ10sXG4gICAgWydhcHBsaWNhdGlvbi94LWNkbGluaycsICd2Y2QnXSxcbiAgICBbJ2FwcGxpY2F0aW9uL3gtY2hhdCcsIFsnY2hhJywgJ2NoYXQnXV0sXG4gICAgWydhcHBsaWNhdGlvbi94LWNoZXNzLXBnbicsICdwZ24nXSxcbiAgICBbJ2FwcGxpY2F0aW9uL3gtY211LXJhc3RlcicsICdyYXMnXSxcbiAgICBbJ2FwcGxpY2F0aW9uL3gtY29jb2EnLCAnY2NvJ10sXG4gICAgWydhcHBsaWNhdGlvbi94LWNvbXBhY3Rwcm8nLCAnY3B0J10sXG4gICAgWydhcHBsaWNhdGlvbi94LWNvbXByZXNzJywgJ3onXSxcbiAgICBbJ2FwcGxpY2F0aW9uL3gtY29tcHJlc3NlZCcsIFsndGd6JywgJ2d6JywgJ3onLCAnemlwJ11dLFxuICAgIFsnYXBwbGljYXRpb24veC1jb25mZXJlbmNlJywgJ25zYyddLFxuICAgIFsnYXBwbGljYXRpb24veC1jcGlvJywgJ2NwaW8nXSxcbiAgICBbJ2FwcGxpY2F0aW9uL3gtY3B0JywgJ2NwdCddLFxuICAgIFsnYXBwbGljYXRpb24veC1jc2gnLCAnY3NoJ10sXG4gICAgWydhcHBsaWNhdGlvbi94LWRlYmlhbi1wYWNrYWdlJywgJ2RlYiddLFxuICAgIFsnYXBwbGljYXRpb24veC1kZWVwdicsICdkZWVwdiddLFxuICAgIFsnYXBwbGljYXRpb24veC1kaXJlY3RvcicsIFsnZGlyJywgJ2RjcicsICdkeHInXV0sXG4gICAgWydhcHBsaWNhdGlvbi94LWRvb20nLCAnd2FkJ10sXG4gICAgWydhcHBsaWNhdGlvbi94LWR0Ym5jeCt4bWwnLCAnbmN4J10sXG4gICAgWydhcHBsaWNhdGlvbi94LWR0Ym9vayt4bWwnLCAnZHRiJ10sXG4gICAgWydhcHBsaWNhdGlvbi94LWR0YnJlc291cmNlK3htbCcsICdyZXMnXSxcbiAgICBbJ2FwcGxpY2F0aW9uL3gtZHZpJywgJ2R2aSddLFxuICAgIFsnYXBwbGljYXRpb24veC1lbGMnLCAnZWxjJ10sXG4gICAgWydhcHBsaWNhdGlvbi94LWVudm95JywgWydlbnYnLCAnZXZ5J11dLFxuICAgIFsnYXBwbGljYXRpb24veC1lc3JlaGJlcicsICdlcyddLFxuICAgIFsnYXBwbGljYXRpb24veC1leGNlbCcsIFsneGxzJywgJ3hsYScsICd4bGInLCAneGxjJywgJ3hsZCcsICd4bGsnLCAneGxsJywgJ3hsbScsICd4bHQnLCAneGx2JywgJ3hsdyddXSxcbiAgICBbJ2FwcGxpY2F0aW9uL3gtZm9udC1iZGYnLCAnYmRmJ10sXG4gICAgWydhcHBsaWNhdGlvbi94LWZvbnQtZ2hvc3RzY3JpcHQnLCAnZ3NmJ10sXG4gICAgWydhcHBsaWNhdGlvbi94LWZvbnQtbGludXgtcHNmJywgJ3BzZiddLFxuICAgIFsnYXBwbGljYXRpb24veC1mb250LW90ZicsICdvdGYnXSxcbiAgICBbJ2FwcGxpY2F0aW9uL3gtZm9udC1wY2YnLCAncGNmJ10sXG4gICAgWydhcHBsaWNhdGlvbi94LWZvbnQtc25mJywgJ3NuZiddLFxuICAgIFsnYXBwbGljYXRpb24veC1mb250LXR0ZicsICd0dGYnXSxcbiAgICBbJ2FwcGxpY2F0aW9uL3gtZm9udC10eXBlMScsICdwZmEnXSxcbiAgICBbJ2FwcGxpY2F0aW9uL3gtZm9udC13b2ZmJywgJ3dvZmYnXSxcbiAgICBbJ2FwcGxpY2F0aW9uL3gtZnJhbWUnLCAnbWlmJ10sXG4gICAgWydhcHBsaWNhdGlvbi94LWZyZWVsYW5jZScsICdwcmUnXSxcbiAgICBbJ2FwcGxpY2F0aW9uL3gtZnV0dXJlc3BsYXNoJywgJ3NwbCddLFxuICAgIFsnYXBwbGljYXRpb24veC1nbnVtZXJpYycsICdnbnVtZXJpYyddLFxuICAgIFsnYXBwbGljYXRpb24veC1nc3AnLCAnZ3NwJ10sXG4gICAgWydhcHBsaWNhdGlvbi94LWdzcycsICdnc3MnXSxcbiAgICBbJ2FwcGxpY2F0aW9uL3gtZ3RhcicsICdndGFyJ10sXG4gICAgWydhcHBsaWNhdGlvbi94LWd6aXAnLCBbJ2d6JywgJ2d6aXAnXV0sXG4gICAgWydhcHBsaWNhdGlvbi94LWhkZicsICdoZGYnXSxcbiAgICBbJ2FwcGxpY2F0aW9uL3gtaGVscGZpbGUnLCBbJ2hlbHAnLCAnaGxwJ11dLFxuICAgIFsnYXBwbGljYXRpb24veC1odHRwZC1pbWFwJywgJ2ltYXAnXSxcbiAgICBbJ2FwcGxpY2F0aW9uL3gtaW1hJywgJ2ltYSddLFxuICAgIFsnYXBwbGljYXRpb24veC1pbnRlcm5ldC1zaWdudXAnLCBbJ2lucycsICdpc3AnXV0sXG4gICAgWydhcHBsaWNhdGlvbi94LWludGVybmV0dC1zaWdudXAnLCAnaW5zJ10sXG4gICAgWydhcHBsaWNhdGlvbi94LWludmVudG9yJywgJ2l2J10sXG4gICAgWydhcHBsaWNhdGlvbi94LWlwMicsICdpcCddLFxuICAgIFsnYXBwbGljYXRpb24veC1pcGhvbmUnLCAnaWlpJ10sXG4gICAgWydhcHBsaWNhdGlvbi94LWphdmEtY2xhc3MnLCAnY2xhc3MnXSxcbiAgICBbJ2FwcGxpY2F0aW9uL3gtamF2YS1jb21tZXJjZScsICdqY20nXSxcbiAgICBbJ2FwcGxpY2F0aW9uL3gtamF2YS1qbmxwLWZpbGUnLCAnam5scCddLFxuICAgIFsnYXBwbGljYXRpb24veC1qYXZhc2NyaXB0JywgJ2pzJ10sXG4gICAgWydhcHBsaWNhdGlvbi94LWtvYW4nLCBbJ3NrZCcsICdza20nLCAnc2twJywgJ3NrdCddXSxcbiAgICBbJ2FwcGxpY2F0aW9uL3gta3NoJywgJ2tzaCddLFxuICAgIFsnYXBwbGljYXRpb24veC1sYXRleCcsIFsnbGF0ZXgnLCAnbHR4J11dLFxuICAgIFsnYXBwbGljYXRpb24veC1saGEnLCAnbGhhJ10sXG4gICAgWydhcHBsaWNhdGlvbi94LWxpc3AnLCAnbHNwJ10sXG4gICAgWydhcHBsaWNhdGlvbi94LWxpdmVzY3JlZW4nLCAnaXZ5J10sXG4gICAgWydhcHBsaWNhdGlvbi94LWxvdHVzJywgJ3dxMSddLFxuICAgIFsnYXBwbGljYXRpb24veC1sb3R1c3NjcmVlbmNhbScsICdzY20nXSxcbiAgICBbJ2FwcGxpY2F0aW9uL3gtbHpoJywgJ2x6aCddLFxuICAgIFsnYXBwbGljYXRpb24veC1sengnLCAnbHp4J10sXG4gICAgWydhcHBsaWNhdGlvbi94LW1hYy1iaW5oZXg0MCcsICdocXgnXSxcbiAgICBbJ2FwcGxpY2F0aW9uL3gtbWFjYmluYXJ5JywgJ2JpbiddLFxuICAgIFsnYXBwbGljYXRpb24veC1tYWdpYy1jYXAtcGFja2FnZS0xLjAnLCAnbWMkJ10sXG4gICAgWydhcHBsaWNhdGlvbi94LW1hdGhjYWQnLCAnbWNkJ10sXG4gICAgWydhcHBsaWNhdGlvbi94LW1lbWUnLCAnbW0nXSxcbiAgICBbJ2FwcGxpY2F0aW9uL3gtbWlkaScsIFsnbWlkJywgJ21pZGknXV0sXG4gICAgWydhcHBsaWNhdGlvbi94LW1pZicsICdtaWYnXSxcbiAgICBbJ2FwcGxpY2F0aW9uL3gtbWl4LXRyYW5zZmVyJywgJ25peCddLFxuICAgIFsnYXBwbGljYXRpb24veC1tb2JpcG9ja2V0LWVib29rJywgJ3ByYyddLFxuICAgIFsnYXBwbGljYXRpb24veC1tcGxheWVyMicsICdhc3gnXSxcbiAgICBbJ2FwcGxpY2F0aW9uL3gtbXMtYXBwbGljYXRpb24nLCAnYXBwbGljYXRpb24nXSxcbiAgICBbJ2FwcGxpY2F0aW9uL3gtbXMtd21kJywgJ3dtZCddLFxuICAgIFsnYXBwbGljYXRpb24veC1tcy13bXonLCAnd216J10sXG4gICAgWydhcHBsaWNhdGlvbi94LW1zLXhiYXAnLCAneGJhcCddLFxuICAgIFsnYXBwbGljYXRpb24veC1tc2FjY2VzcycsICdtZGInXSxcbiAgICBbJ2FwcGxpY2F0aW9uL3gtbXNiaW5kZXInLCAnb2JkJ10sXG4gICAgWydhcHBsaWNhdGlvbi94LW1zY2FyZGZpbGUnLCAnY3JkJ10sXG4gICAgWydhcHBsaWNhdGlvbi94LW1zY2xpcCcsICdjbHAnXSxcbiAgICBbJ2FwcGxpY2F0aW9uL3gtbXNkb3dubG9hZCcsIFsnZXhlJywgJ2RsbCddXSxcbiAgICBbJ2FwcGxpY2F0aW9uL3gtbXNleGNlbCcsIFsneGxzJywgJ3hsYScsICd4bHcnXV0sXG4gICAgWydhcHBsaWNhdGlvbi94LW1zbWVkaWF2aWV3JywgWydtdmInLCAnbTEzJywgJ20xNCddXSxcbiAgICBbJ2FwcGxpY2F0aW9uL3gtbXNtZXRhZmlsZScsICd3bWYnXSxcbiAgICBbJ2FwcGxpY2F0aW9uL3gtbXNtb25leScsICdtbnknXSxcbiAgICBbJ2FwcGxpY2F0aW9uL3gtbXNwb3dlcnBvaW50JywgJ3BwdCddLFxuICAgIFsnYXBwbGljYXRpb24veC1tc3B1Ymxpc2hlcicsICdwdWInXSxcbiAgICBbJ2FwcGxpY2F0aW9uL3gtbXNzY2hlZHVsZScsICdzY2QnXSxcbiAgICBbJ2FwcGxpY2F0aW9uL3gtbXN0ZXJtaW5hbCcsICd0cm0nXSxcbiAgICBbJ2FwcGxpY2F0aW9uL3gtbXN3cml0ZScsICd3cmknXSxcbiAgICBbJ2FwcGxpY2F0aW9uL3gtbmF2aS1hbmltYXRpb24nLCAnYW5pJ10sXG4gICAgWydhcHBsaWNhdGlvbi94LW5hdmlkb2MnLCAnbnZkJ10sXG4gICAgWydhcHBsaWNhdGlvbi94LW5hdmltYXAnLCAnbWFwJ10sXG4gICAgWydhcHBsaWNhdGlvbi94LW5hdmlzdHlsZScsICdzdGwnXSxcbiAgICBbJ2FwcGxpY2F0aW9uL3gtbmV0Y2RmJywgWydjZGYnLCAnbmMnXV0sXG4gICAgWydhcHBsaWNhdGlvbi94LW5ld3Rvbi1jb21wYXRpYmxlLXBrZycsICdwa2cnXSxcbiAgICBbJ2FwcGxpY2F0aW9uL3gtbm9raWEtOTAwMC1jb21tdW5pY2F0b3ItYWRkLW9uLXNvZnR3YXJlJywgJ2FvcyddLFxuICAgIFsnYXBwbGljYXRpb24veC1vbWMnLCAnb21jJ10sXG4gICAgWydhcHBsaWNhdGlvbi94LW9tY2RhdGFtYWtlcicsICdvbWNkJ10sXG4gICAgWydhcHBsaWNhdGlvbi94LW9tY3JlZ2VyYXRvcicsICdvbWNyJ10sXG4gICAgWydhcHBsaWNhdGlvbi94LXBhZ2VtYWtlcicsIFsncG00JywgJ3BtNSddXSxcbiAgICBbJ2FwcGxpY2F0aW9uL3gtcGNsJywgJ3BjbCddLFxuICAgIFsnYXBwbGljYXRpb24veC1wZXJmbW9uJywgWydwbWEnLCAncG1jJywgJ3BtbCcsICdwbXInLCAncG13J11dLFxuICAgIFsnYXBwbGljYXRpb24veC1waXhjbHNjcmlwdCcsICdwbHgnXSxcbiAgICBbJ2FwcGxpY2F0aW9uL3gtcGtjczEwJywgJ3AxMCddLFxuICAgIFsnYXBwbGljYXRpb24veC1wa2NzMTInLCBbJ3AxMicsICdwZngnXV0sXG4gICAgWydhcHBsaWNhdGlvbi94LXBrY3M3LWNlcnRpZmljYXRlcycsIFsncDdiJywgJ3NwYyddXSxcbiAgICBbJ2FwcGxpY2F0aW9uL3gtcGtjczctY2VydHJlcXJlc3AnLCAncDdyJ10sXG4gICAgWydhcHBsaWNhdGlvbi94LXBrY3M3LW1pbWUnLCBbJ3A3bScsICdwN2MnXV0sXG4gICAgWydhcHBsaWNhdGlvbi94LXBrY3M3LXNpZ25hdHVyZScsIFsncDdzJywgJ3A3YSddXSxcbiAgICBbJ2FwcGxpY2F0aW9uL3gtcG9pbnRwbHVzJywgJ2NzcyddLFxuICAgIFsnYXBwbGljYXRpb24veC1wb3J0YWJsZS1hbnltYXAnLCAncG5tJ10sXG4gICAgWydhcHBsaWNhdGlvbi94LXByb2plY3QnLCBbJ21wYycsICdtcHQnLCAnbXB2JywgJ21weCddXSxcbiAgICBbJ2FwcGxpY2F0aW9uL3gtcXBybycsICd3YjEnXSxcbiAgICBbJ2FwcGxpY2F0aW9uL3gtcmFyLWNvbXByZXNzZWQnLCAncmFyJ10sXG4gICAgWydhcHBsaWNhdGlvbi94LXJ0ZicsICdydGYnXSxcbiAgICBbJ2FwcGxpY2F0aW9uL3gtc2RwJywgJ3NkcCddLFxuICAgIFsnYXBwbGljYXRpb24veC1zZWEnLCAnc2VhJ10sXG4gICAgWydhcHBsaWNhdGlvbi94LXNlZWxvZ28nLCAnc2wnXSxcbiAgICBbJ2FwcGxpY2F0aW9uL3gtc2gnLCAnc2gnXSxcbiAgICBbJ2FwcGxpY2F0aW9uL3gtc2hhcicsIFsnc2hhcicsICdzaCddXSxcbiAgICBbJ2FwcGxpY2F0aW9uL3gtc2hvY2t3YXZlLWZsYXNoJywgJ3N3ZiddLFxuICAgIFsnYXBwbGljYXRpb24veC1zaWx2ZXJsaWdodC1hcHAnLCAneGFwJ10sXG4gICAgWydhcHBsaWNhdGlvbi94LXNpdCcsICdzaXQnXSxcbiAgICBbJ2FwcGxpY2F0aW9uL3gtc3ByaXRlJywgWydzcHInLCAnc3ByaXRlJ11dLFxuICAgIFsnYXBwbGljYXRpb24veC1zdHVmZml0JywgJ3NpdCddLFxuICAgIFsnYXBwbGljYXRpb24veC1zdHVmZml0eCcsICdzaXR4J10sXG4gICAgWydhcHBsaWNhdGlvbi94LXN2NGNwaW8nLCAnc3Y0Y3BpbyddLFxuICAgIFsnYXBwbGljYXRpb24veC1zdjRjcmMnLCAnc3Y0Y3JjJ10sXG4gICAgWydhcHBsaWNhdGlvbi94LXRhcicsICd0YXInXSxcbiAgICBbJ2FwcGxpY2F0aW9uL3gtdGJvb2snLCBbJ3NiaycsICd0YmsnXV0sXG4gICAgWydhcHBsaWNhdGlvbi94LXRjbCcsICd0Y2wnXSxcbiAgICBbJ2FwcGxpY2F0aW9uL3gtdGV4JywgJ3RleCddLFxuICAgIFsnYXBwbGljYXRpb24veC10ZXgtdGZtJywgJ3RmbSddLFxuICAgIFsnYXBwbGljYXRpb24veC10ZXhpbmZvJywgWyd0ZXhpJywgJ3RleGluZm8nXV0sXG4gICAgWydhcHBsaWNhdGlvbi94LXRyb2ZmJywgWydyb2ZmJywgJ3QnLCAndHInXV0sXG4gICAgWydhcHBsaWNhdGlvbi94LXRyb2ZmLW1hbicsICdtYW4nXSxcbiAgICBbJ2FwcGxpY2F0aW9uL3gtdHJvZmYtbWUnLCAnbWUnXSxcbiAgICBbJ2FwcGxpY2F0aW9uL3gtdHJvZmYtbXMnLCAnbXMnXSxcbiAgICBbJ2FwcGxpY2F0aW9uL3gtdHJvZmYtbXN2aWRlbycsICdhdmknXSxcbiAgICBbJ2FwcGxpY2F0aW9uL3gtdXN0YXInLCAndXN0YXInXSxcbiAgICBbJ2FwcGxpY2F0aW9uL3gtdmlzaW8nLCBbJ3ZzZCcsICd2c3QnLCAndnN3J11dLFxuICAgIFsnYXBwbGljYXRpb24veC12bmQuYXVkaW9leHBsb3Npb24ubXp6JywgJ216eiddLFxuICAgIFsnYXBwbGljYXRpb24veC12bmQubHMteHBpeCcsICd4cGl4J10sXG4gICAgWydhcHBsaWNhdGlvbi94LXZybWwnLCAndnJtbCddLFxuICAgIFsnYXBwbGljYXRpb24veC13YWlzLXNvdXJjZScsIFsnc3JjJywgJ3dzcmMnXV0sXG4gICAgWydhcHBsaWNhdGlvbi94LXdpbmhlbHAnLCAnaGxwJ10sXG4gICAgWydhcHBsaWNhdGlvbi94LXdpbnRhbGsnLCAnd3RrJ10sXG4gICAgWydhcHBsaWNhdGlvbi94LXdvcmxkJywgWyd3cmwnLCAnc3ZyJ11dLFxuICAgIFsnYXBwbGljYXRpb24veC13cHdpbicsICd3cGQnXSxcbiAgICBbJ2FwcGxpY2F0aW9uL3gtd3JpJywgJ3dyaSddLFxuICAgIFsnYXBwbGljYXRpb24veC14NTA5LWNhLWNlcnQnLCBbJ2NlcicsICdjcnQnLCAnZGVyJ11dLFxuICAgIFsnYXBwbGljYXRpb24veC14NTA5LXVzZXItY2VydCcsICdjcnQnXSxcbiAgICBbJ2FwcGxpY2F0aW9uL3gteGZpZycsICdmaWcnXSxcbiAgICBbJ2FwcGxpY2F0aW9uL3gteHBpbnN0YWxsJywgJ3hwaSddLFxuICAgIFsnYXBwbGljYXRpb24veC16aXAtY29tcHJlc3NlZCcsICd6aXAnXSxcbiAgICBbJ2FwcGxpY2F0aW9uL3hjYXAtZGlmZit4bWwnLCAneGRmJ10sXG4gICAgWydhcHBsaWNhdGlvbi94ZW5jK3htbCcsICd4ZW5jJ10sXG4gICAgWydhcHBsaWNhdGlvbi94aHRtbCt4bWwnLCAneGh0bWwnXSxcbiAgICBbJ2FwcGxpY2F0aW9uL3htbCcsICd4bWwnXSxcbiAgICBbJ2FwcGxpY2F0aW9uL3htbC1kdGQnLCAnZHRkJ10sXG4gICAgWydhcHBsaWNhdGlvbi94b3AreG1sJywgJ3hvcCddLFxuICAgIFsnYXBwbGljYXRpb24veHNsdCt4bWwnLCAneHNsdCddLFxuICAgIFsnYXBwbGljYXRpb24veHNwZit4bWwnLCAneHNwZiddLFxuICAgIFsnYXBwbGljYXRpb24veHYreG1sJywgJ214bWwnXSxcbiAgICBbJ2FwcGxpY2F0aW9uL3lhbmcnLCAneWFuZyddLFxuICAgIFsnYXBwbGljYXRpb24veWluK3htbCcsICd5aW4nXSxcbiAgICBbJ2FwcGxpY2F0aW9uL3luZC5tcy1wa2lwa28nLCAncGtvJ10sXG4gICAgWydhcHBsaWNhdGlvbi96aXAnLCAnemlwJ10sXG4gICAgWydhdWRpby9hZHBjbScsICdhZHAnXSxcbiAgICBbJ2F1ZGlvL2FpZmYnLCBbJ2FpZmYnLCAnYWlmJywgJ2FpZmMnXV0sXG4gICAgWydhdWRpby9iYXNpYycsIFsnc25kJywgJ2F1J11dLFxuICAgIFsnYXVkaW8vaXQnLCAnaXQnXSxcbiAgICBbJ2F1ZGlvL21ha2UnLCBbJ2Z1bmsnLCAnbXknLCAncGZ1bmsnXV0sXG4gICAgWydhdWRpby9tYWtlLm15LmZ1bmsnLCAncGZ1bmsnXSxcbiAgICBbJ2F1ZGlvL21pZCcsIFsnbWlkJywgJ3JtaSddXSxcbiAgICBbJ2F1ZGlvL21pZGknLCBbJ21pZGknLCAna2FyJywgJ21pZCddXSxcbiAgICBbJ2F1ZGlvL21vZCcsICdtb2QnXSxcbiAgICBbJ2F1ZGlvL21wNCcsICdtcDRhJ10sXG4gICAgWydhdWRpby9tcGVnJywgWydtcGdhJywgJ21wMycsICdtMmEnLCAnbXAyJywgJ21wYScsICdtcGcnXV0sXG4gICAgWydhdWRpby9tcGVnMycsICdtcDMnXSxcbiAgICBbJ2F1ZGlvL25zcGF1ZGlvJywgWydsYScsICdsbWEnXV0sXG4gICAgWydhdWRpby9vZ2cnLCAnb2dhJ10sXG4gICAgWydhdWRpby9zM20nLCAnczNtJ10sXG4gICAgWydhdWRpby90c3AtYXVkaW8nLCAndHNpJ10sXG4gICAgWydhdWRpby90c3BsYXllcicsICd0c3AnXSxcbiAgICBbJ2F1ZGlvL3ZuZC5kZWNlLmF1ZGlvJywgJ3V2YSddLFxuICAgIFsnYXVkaW8vdm5kLmRpZ2l0YWwtd2luZHMnLCAnZW9sJ10sXG4gICAgWydhdWRpby92bmQuZHJhJywgJ2RyYSddLFxuICAgIFsnYXVkaW8vdm5kLmR0cycsICdkdHMnXSxcbiAgICBbJ2F1ZGlvL3ZuZC5kdHMuaGQnLCAnZHRzaGQnXSxcbiAgICBbJ2F1ZGlvL3ZuZC5sdWNlbnQudm9pY2UnLCAnbHZwJ10sXG4gICAgWydhdWRpby92bmQubXMtcGxheXJlYWR5Lm1lZGlhLnB5YScsICdweWEnXSxcbiAgICBbJ2F1ZGlvL3ZuZC5udWVyYS5lY2VscDQ4MDAnLCAnZWNlbHA0ODAwJ10sXG4gICAgWydhdWRpby92bmQubnVlcmEuZWNlbHA3NDcwJywgJ2VjZWxwNzQ3MCddLFxuICAgIFsnYXVkaW8vdm5kLm51ZXJhLmVjZWxwOTYwMCcsICdlY2VscDk2MDAnXSxcbiAgICBbJ2F1ZGlvL3ZuZC5xY2VscCcsICdxY3AnXSxcbiAgICBbJ2F1ZGlvL3ZuZC5yaXAnLCAncmlwJ10sXG4gICAgWydhdWRpby92b2MnLCAndm9jJ10sXG4gICAgWydhdWRpby92b3h3YXJlJywgJ3ZveCddLFxuICAgIFsnYXVkaW8vd2F2JywgJ3dhdiddLFxuICAgIFsnYXVkaW8vd2VibScsICd3ZWJhJ10sXG4gICAgWydhdWRpby94LWFhYycsICdhYWMnXSxcbiAgICBbJ2F1ZGlvL3gtYWRwY20nLCAnc25kJ10sXG4gICAgWydhdWRpby94LWFpZmYnLCBbJ2FpZmYnLCAnYWlmJywgJ2FpZmMnXV0sXG4gICAgWydhdWRpby94LWF1JywgJ2F1J10sXG4gICAgWydhdWRpby94LWdzbScsIFsnZ3NkJywgJ2dzbSddXSxcbiAgICBbJ2F1ZGlvL3gtamFtJywgJ2phbSddLFxuICAgIFsnYXVkaW8veC1saXZlYXVkaW8nLCAnbGFtJ10sXG4gICAgWydhdWRpby94LW1pZCcsIFsnbWlkJywgJ21pZGknXV0sXG4gICAgWydhdWRpby94LW1pZGknLCBbJ21pZGknLCAnbWlkJ11dLFxuICAgIFsnYXVkaW8veC1tb2QnLCAnbW9kJ10sXG4gICAgWydhdWRpby94LW1wZWcnLCAnbXAyJ10sXG4gICAgWydhdWRpby94LW1wZWctMycsICdtcDMnXSxcbiAgICBbJ2F1ZGlvL3gtbXBlZ3VybCcsICdtM3UnXSxcbiAgICBbJ2F1ZGlvL3gtbXBlcXVybCcsICdtM3UnXSxcbiAgICBbJ2F1ZGlvL3gtbXMtd2F4JywgJ3dheCddLFxuICAgIFsnYXVkaW8veC1tcy13bWEnLCAnd21hJ10sXG4gICAgWydhdWRpby94LW5zcGF1ZGlvJywgWydsYScsICdsbWEnXV0sXG4gICAgWydhdWRpby94LXBuLXJlYWxhdWRpbycsIFsncmEnLCAncmFtJywgJ3JtJywgJ3JtbScsICdybXAnXV0sXG4gICAgWydhdWRpby94LXBuLXJlYWxhdWRpby1wbHVnaW4nLCBbJ3JhJywgJ3JtcCcsICdycG0nXV0sXG4gICAgWydhdWRpby94LXBzaWQnLCAnc2lkJ10sXG4gICAgWydhdWRpby94LXJlYWxhdWRpbycsICdyYSddLFxuICAgIFsnYXVkaW8veC10d2ludnEnLCAndnFmJ10sXG4gICAgWydhdWRpby94LXR3aW52cS1wbHVnaW4nLCBbJ3ZxZScsICd2cWwnXV0sXG4gICAgWydhdWRpby94LXZuZC5hdWRpb2V4cGxvc2lvbi5tanVpY2VtZWRpYWZpbGUnLCAnbWpmJ10sXG4gICAgWydhdWRpby94LXZvYycsICd2b2MnXSxcbiAgICBbJ2F1ZGlvL3gtd2F2JywgJ3dhdiddLFxuICAgIFsnYXVkaW8veG0nLCAneG0nXSxcbiAgICBbJ2NoZW1pY2FsL3gtY2R4JywgJ2NkeCddLFxuICAgIFsnY2hlbWljYWwveC1jaWYnLCAnY2lmJ10sXG4gICAgWydjaGVtaWNhbC94LWNtZGYnLCAnY21kZiddLFxuICAgIFsnY2hlbWljYWwveC1jbWwnLCAnY21sJ10sXG4gICAgWydjaGVtaWNhbC94LWNzbWwnLCAnY3NtbCddLFxuICAgIFsnY2hlbWljYWwveC1wZGInLCBbJ3BkYicsICd4eXonXV0sXG4gICAgWydjaGVtaWNhbC94LXh5eicsICd4eXonXSxcbiAgICBbJ2RyYXdpbmcveC1kd2YnLCAnZHdmJ10sXG4gICAgWydpLXdvcmxkL2ktdnJtbCcsICdpdnInXSxcbiAgICBbJ2ltYWdlL2JtcCcsIFsnYm1wJywgJ2JtJ11dLFxuICAgIFsnaW1hZ2UvY2dtJywgJ2NnbSddLFxuICAgIFsnaW1hZ2UvY2lzLWNvZCcsICdjb2QnXSxcbiAgICBbJ2ltYWdlL2NtdS1yYXN0ZXInLCBbJ3JhcycsICdyYXN0J11dLFxuICAgIFsnaW1hZ2UvZmlmJywgJ2ZpZiddLFxuICAgIFsnaW1hZ2UvZmxvcmlhbicsIFsnZmxvJywgJ3R1cmJvdCddXSxcbiAgICBbJ2ltYWdlL2czZmF4JywgJ2czJ10sXG4gICAgWydpbWFnZS9naWYnLCAnZ2lmJ10sXG4gICAgWydpbWFnZS9pZWYnLCBbJ2llZicsICdpZWZzJ11dLFxuICAgIFsnaW1hZ2UvanBlZycsIFsnanBlZycsICdqcGUnLCAnanBnJywgJ2pmaWYnLCAnamZpZi10Ym5sJ11dLFxuICAgIFsnaW1hZ2UvanV0dmlzaW9uJywgJ2p1dCddLFxuICAgIFsnaW1hZ2Uva3R4JywgJ2t0eCddLFxuICAgIFsnaW1hZ2UvbmFwbHBzJywgWyduYXAnLCAnbmFwbHBzJ11dLFxuICAgIFsnaW1hZ2UvcGljdCcsIFsncGljJywgJ3BpY3QnXV0sXG4gICAgWydpbWFnZS9waXBlZycsICdqZmlmJ10sXG4gICAgWydpbWFnZS9wanBlZycsIFsnamZpZicsICdqcGUnLCAnanBlZycsICdqcGcnXV0sXG4gICAgWydpbWFnZS9wbmcnLCBbJ3BuZycsICd4LXBuZyddXSxcbiAgICBbJ2ltYWdlL3Bycy5idGlmJywgJ2J0aWYnXSxcbiAgICBbJ2ltYWdlL3N2Zyt4bWwnLCAnc3ZnJ10sXG4gICAgWydpbWFnZS90aWZmJywgWyd0aWYnLCAndGlmZiddXSxcbiAgICBbJ2ltYWdlL3Zhc2EnLCAnbWNmJ10sXG4gICAgWydpbWFnZS92bmQuYWRvYmUucGhvdG9zaG9wJywgJ3BzZCddLFxuICAgIFsnaW1hZ2Uvdm5kLmRlY2UuZ3JhcGhpYycsICd1dmknXSxcbiAgICBbJ2ltYWdlL3ZuZC5kanZ1JywgJ2RqdnUnXSxcbiAgICBbJ2ltYWdlL3ZuZC5kdmIuc3VidGl0bGUnLCAnc3ViJ10sXG4gICAgWydpbWFnZS92bmQuZHdnJywgWydkd2cnLCAnZHhmJywgJ3N2ZiddXSxcbiAgICBbJ2ltYWdlL3ZuZC5keGYnLCAnZHhmJ10sXG4gICAgWydpbWFnZS92bmQuZmFzdGJpZHNoZWV0JywgJ2ZicyddLFxuICAgIFsnaW1hZ2Uvdm5kLmZweCcsICdmcHgnXSxcbiAgICBbJ2ltYWdlL3ZuZC5mc3QnLCAnZnN0J10sXG4gICAgWydpbWFnZS92bmQuZnVqaXhlcm94LmVkbWljcy1tbXInLCAnbW1yJ10sXG4gICAgWydpbWFnZS92bmQuZnVqaXhlcm94LmVkbWljcy1ybGMnLCAncmxjJ10sXG4gICAgWydpbWFnZS92bmQubXMtbW9kaScsICdtZGknXSxcbiAgICBbJ2ltYWdlL3ZuZC5uZXQtZnB4JywgWydmcHgnLCAnbnB4J11dLFxuICAgIFsnaW1hZ2Uvdm5kLnJuLXJlYWxmbGFzaCcsICdyZiddLFxuICAgIFsnaW1hZ2Uvdm5kLnJuLXJlYWxwaXgnLCAncnAnXSxcbiAgICBbJ2ltYWdlL3ZuZC53YXAud2JtcCcsICd3Ym1wJ10sXG4gICAgWydpbWFnZS92bmQueGlmZicsICd4aWYnXSxcbiAgICBbJ2ltYWdlL3dlYnAnLCAnd2VicCddLFxuICAgIFsnaW1hZ2UveC1jbXUtcmFzdGVyJywgJ3JhcyddLFxuICAgIFsnaW1hZ2UveC1jbXgnLCAnY214J10sXG4gICAgWydpbWFnZS94LWR3ZycsIFsnZHdnJywgJ2R4ZicsICdzdmYnXV0sXG4gICAgWydpbWFnZS94LWZyZWVoYW5kJywgJ2ZoJ10sXG4gICAgWydpbWFnZS94LWljb24nLCAnaWNvJ10sXG4gICAgWydpbWFnZS94LWpnJywgJ2FydCddLFxuICAgIFsnaW1hZ2UveC1qcHMnLCAnanBzJ10sXG4gICAgWydpbWFnZS94LW5pZmYnLCBbJ25pZmYnLCAnbmlmJ11dLFxuICAgIFsnaW1hZ2UveC1wY3gnLCAncGN4J10sXG4gICAgWydpbWFnZS94LXBpY3QnLCBbJ3BjdCcsICdwaWMnXV0sXG4gICAgWydpbWFnZS94LXBvcnRhYmxlLWFueW1hcCcsICdwbm0nXSxcbiAgICBbJ2ltYWdlL3gtcG9ydGFibGUtYml0bWFwJywgJ3BibSddLFxuICAgIFsnaW1hZ2UveC1wb3J0YWJsZS1ncmF5bWFwJywgJ3BnbSddLFxuICAgIFsnaW1hZ2UveC1wb3J0YWJsZS1ncmV5bWFwJywgJ3BnbSddLFxuICAgIFsnaW1hZ2UveC1wb3J0YWJsZS1waXhtYXAnLCAncHBtJ10sXG4gICAgWydpbWFnZS94LXF1aWNrdGltZScsIFsncWlmJywgJ3F0aScsICdxdGlmJ11dLFxuICAgIFsnaW1hZ2UveC1yZ2InLCAncmdiJ10sXG4gICAgWydpbWFnZS94LXRpZmYnLCBbJ3RpZicsICd0aWZmJ11dLFxuICAgIFsnaW1hZ2UveC13aW5kb3dzLWJtcCcsICdibXAnXSxcbiAgICBbJ2ltYWdlL3gteGJpdG1hcCcsICd4Ym0nXSxcbiAgICBbJ2ltYWdlL3gteGJtJywgJ3hibSddLFxuICAgIFsnaW1hZ2UveC14cGl4bWFwJywgWyd4cG0nLCAncG0nXV0sXG4gICAgWydpbWFnZS94LXh3ZCcsICd4d2QnXSxcbiAgICBbJ2ltYWdlL3gteHdpbmRvd2R1bXAnLCAneHdkJ10sXG4gICAgWydpbWFnZS94Ym0nLCAneGJtJ10sXG4gICAgWydpbWFnZS94cG0nLCAneHBtJ10sXG4gICAgWydtZXNzYWdlL3JmYzgyMicsIFsnZW1sJywgJ21odCcsICdtaHRtbCcsICdud3MnLCAnbWltZSddXSxcbiAgICBbJ21vZGVsL2lnZXMnLCBbJ2lnZXMnLCAnaWdzJ11dLFxuICAgIFsnbW9kZWwvbWVzaCcsICdtc2gnXSxcbiAgICBbJ21vZGVsL3ZuZC5jb2xsYWRhK3htbCcsICdkYWUnXSxcbiAgICBbJ21vZGVsL3ZuZC5kd2YnLCAnZHdmJ10sXG4gICAgWydtb2RlbC92bmQuZ2RsJywgJ2dkbCddLFxuICAgIFsnbW9kZWwvdm5kLmd0dycsICdndHcnXSxcbiAgICBbJ21vZGVsL3ZuZC5tdHMnLCAnbXRzJ10sXG4gICAgWydtb2RlbC92bmQudnR1JywgJ3Z0dSddLFxuICAgIFsnbW9kZWwvdnJtbCcsIFsndnJtbCcsICd3cmwnLCAnd3J6J11dLFxuICAgIFsnbW9kZWwveC1wb3YnLCAncG92J10sXG4gICAgWydtdWx0aXBhcnQveC1nemlwJywgJ2d6aXAnXSxcbiAgICBbJ211bHRpcGFydC94LXVzdGFyJywgJ3VzdGFyJ10sXG4gICAgWydtdWx0aXBhcnQveC16aXAnLCAnemlwJ10sXG4gICAgWydtdXNpYy9jcmVzY2VuZG8nLCBbJ21pZCcsICdtaWRpJ11dLFxuICAgIFsnbXVzaWMveC1rYXJhb2tlJywgJ2thciddLFxuICAgIFsncGFsZW92dS94LXB2JywgJ3B2dSddLFxuICAgIFsndGV4dC9hc3AnLCAnYXNwJ10sXG4gICAgWyd0ZXh0L2NhbGVuZGFyJywgJ2ljcyddLFxuICAgIFsndGV4dC9jc3MnLCAnY3NzJ10sXG4gICAgWyd0ZXh0L2NzdicsICdjc3YnXSxcbiAgICBbJ3RleHQvZWNtYXNjcmlwdCcsICdqcyddLFxuICAgIFsndGV4dC9oMzIzJywgJzMyMyddLFxuICAgIFsndGV4dC9odG1sJywgWydodG1sJywgJ2h0bScsICdzdG0nLCAnYWNnaScsICdodG1scycsICdodHgnLCAnc2h0bWwnXV0sXG4gICAgWyd0ZXh0L2l1bHMnLCAndWxzJ10sXG4gICAgWyd0ZXh0L2phdmFzY3JpcHQnLCAnanMnXSxcbiAgICBbJ3RleHQvbWNmJywgJ21jZiddLFxuICAgIFsndGV4dC9uMycsICduMyddLFxuICAgIFsndGV4dC9wYXNjYWwnLCAncGFzJ10sXG4gICAgW1xuICAgICAgICAndGV4dC9wbGFpbicsXG4gICAgICAgIFtcbiAgICAgICAgICAgICd0eHQnLFxuICAgICAgICAgICAgJ2JhcycsXG4gICAgICAgICAgICAnYycsXG4gICAgICAgICAgICAnaCcsXG4gICAgICAgICAgICAnYysrJyxcbiAgICAgICAgICAgICdjYycsXG4gICAgICAgICAgICAnY29tJyxcbiAgICAgICAgICAgICdjb25mJyxcbiAgICAgICAgICAgICdjeHgnLFxuICAgICAgICAgICAgJ2RlZicsXG4gICAgICAgICAgICAnZicsXG4gICAgICAgICAgICAnZjkwJyxcbiAgICAgICAgICAgICdmb3InLFxuICAgICAgICAgICAgJ2cnLFxuICAgICAgICAgICAgJ2hoJyxcbiAgICAgICAgICAgICdpZGMnLFxuICAgICAgICAgICAgJ2phdicsXG4gICAgICAgICAgICAnamF2YScsXG4gICAgICAgICAgICAnbGlzdCcsXG4gICAgICAgICAgICAnbG9nJyxcbiAgICAgICAgICAgICdsc3QnLFxuICAgICAgICAgICAgJ20nLFxuICAgICAgICAgICAgJ21hcicsXG4gICAgICAgICAgICAncGwnLFxuICAgICAgICAgICAgJ3NkbWwnLFxuICAgICAgICAgICAgJ3RleHQnXG4gICAgICAgIF1cbiAgICBdLFxuICAgIFsndGV4dC9wbGFpbi1iYXMnLCAncGFyJ10sXG4gICAgWyd0ZXh0L3Bycy5saW5lcy50YWcnLCAnZHNjJ10sXG4gICAgWyd0ZXh0L3JpY2h0ZXh0JywgWydydHgnLCAncnQnLCAncnRmJ11dLFxuICAgIFsndGV4dC9zY3JpcGxldCcsICd3c2MnXSxcbiAgICBbJ3RleHQvc2NyaXB0bGV0JywgJ3NjdCddLFxuICAgIFsndGV4dC9zZ21sJywgWydzZ20nLCAnc2dtbCddXSxcbiAgICBbJ3RleHQvdGFiLXNlcGFyYXRlZC12YWx1ZXMnLCAndHN2J10sXG4gICAgWyd0ZXh0L3Ryb2ZmJywgJ3QnXSxcbiAgICBbJ3RleHQvdHVydGxlJywgJ3R0bCddLFxuICAgIFsndGV4dC91cmktbGlzdCcsIFsndW5pJywgJ3VuaXMnLCAndXJpJywgJ3VyaXMnXV0sXG4gICAgWyd0ZXh0L3ZuZC5hYmMnLCAnYWJjJ10sXG4gICAgWyd0ZXh0L3ZuZC5jdXJsJywgJ2N1cmwnXSxcbiAgICBbJ3RleHQvdm5kLmN1cmwuZGN1cmwnLCAnZGN1cmwnXSxcbiAgICBbJ3RleHQvdm5kLmN1cmwubWN1cmwnLCAnbWN1cmwnXSxcbiAgICBbJ3RleHQvdm5kLmN1cmwuc2N1cmwnLCAnc2N1cmwnXSxcbiAgICBbJ3RleHQvdm5kLmZseScsICdmbHknXSxcbiAgICBbJ3RleHQvdm5kLmZtaS5mbGV4c3RvcicsICdmbHgnXSxcbiAgICBbJ3RleHQvdm5kLmdyYXBodml6JywgJ2d2J10sXG4gICAgWyd0ZXh0L3ZuZC5pbjNkLjNkbWwnLCAnM2RtbCddLFxuICAgIFsndGV4dC92bmQuaW4zZC5zcG90JywgJ3Nwb3QnXSxcbiAgICBbJ3RleHQvdm5kLnJuLXJlYWx0ZXh0JywgJ3J0J10sXG4gICAgWyd0ZXh0L3ZuZC5zdW4uajJtZS5hcHAtZGVzY3JpcHRvcicsICdqYWQnXSxcbiAgICBbJ3RleHQvdm5kLndhcC53bWwnLCAnd21sJ10sXG4gICAgWyd0ZXh0L3ZuZC53YXAud21sc2NyaXB0JywgJ3dtbHMnXSxcbiAgICBbJ3RleHQvd2Vidmlld2h0bWwnLCAnaHR0J10sXG4gICAgWyd0ZXh0L3gtYXNtJywgWydhc20nLCAncyddXSxcbiAgICBbJ3RleHQveC1hdWRpb3NvZnQtaW50cmEnLCAnYWlwJ10sXG4gICAgWyd0ZXh0L3gtYycsIFsnYycsICdjYycsICdjcHAnXV0sXG4gICAgWyd0ZXh0L3gtY29tcG9uZW50JywgJ2h0YyddLFxuICAgIFsndGV4dC94LWZvcnRyYW4nLCBbJ2ZvcicsICdmJywgJ2Y3NycsICdmOTAnXV0sXG4gICAgWyd0ZXh0L3gtaCcsIFsnaCcsICdoaCddXSxcbiAgICBbJ3RleHQveC1qYXZhLXNvdXJjZScsIFsnamF2YScsICdqYXYnXV0sXG4gICAgWyd0ZXh0L3gtamF2YS1zb3VyY2UsamF2YScsICdqYXZhJ10sXG4gICAgWyd0ZXh0L3gtbGEtYXNmJywgJ2xzeCddLFxuICAgIFsndGV4dC94LW0nLCAnbSddLFxuICAgIFsndGV4dC94LXBhc2NhbCcsICdwJ10sXG4gICAgWyd0ZXh0L3gtc2NyaXB0JywgJ2hsYiddLFxuICAgIFsndGV4dC94LXNjcmlwdC5jc2gnLCAnY3NoJ10sXG4gICAgWyd0ZXh0L3gtc2NyaXB0LmVsaXNwJywgJ2VsJ10sXG4gICAgWyd0ZXh0L3gtc2NyaXB0Lmd1aWxlJywgJ3NjbSddLFxuICAgIFsndGV4dC94LXNjcmlwdC5rc2gnLCAna3NoJ10sXG4gICAgWyd0ZXh0L3gtc2NyaXB0Lmxpc3AnLCAnbHNwJ10sXG4gICAgWyd0ZXh0L3gtc2NyaXB0LnBlcmwnLCAncGwnXSxcbiAgICBbJ3RleHQveC1zY3JpcHQucGVybC1tb2R1bGUnLCAncG0nXSxcbiAgICBbJ3RleHQveC1zY3JpcHQucGh5dG9uJywgJ3B5J10sXG4gICAgWyd0ZXh0L3gtc2NyaXB0LnJleHgnLCAncmV4eCddLFxuICAgIFsndGV4dC94LXNjcmlwdC5zY2hlbWUnLCAnc2NtJ10sXG4gICAgWyd0ZXh0L3gtc2NyaXB0LnNoJywgJ3NoJ10sXG4gICAgWyd0ZXh0L3gtc2NyaXB0LnRjbCcsICd0Y2wnXSxcbiAgICBbJ3RleHQveC1zY3JpcHQudGNzaCcsICd0Y3NoJ10sXG4gICAgWyd0ZXh0L3gtc2NyaXB0LnpzaCcsICd6c2gnXSxcbiAgICBbJ3RleHQveC1zZXJ2ZXItcGFyc2VkLWh0bWwnLCBbJ3NodG1sJywgJ3NzaSddXSxcbiAgICBbJ3RleHQveC1zZXRleHQnLCAnZXR4J10sXG4gICAgWyd0ZXh0L3gtc2dtbCcsIFsnc2dtJywgJ3NnbWwnXV0sXG4gICAgWyd0ZXh0L3gtc3BlZWNoJywgWydzcGMnLCAndGFsayddXSxcbiAgICBbJ3RleHQveC11aWwnLCAndWlsJ10sXG4gICAgWyd0ZXh0L3gtdXVlbmNvZGUnLCBbJ3V1JywgJ3V1ZSddXSxcbiAgICBbJ3RleHQveC12Y2FsZW5kYXInLCAndmNzJ10sXG4gICAgWyd0ZXh0L3gtdmNhcmQnLCAndmNmJ10sXG4gICAgWyd0ZXh0L3htbCcsICd4bWwnXSxcbiAgICBbJ3ZpZGVvLzNncHAnLCAnM2dwJ10sXG4gICAgWyd2aWRlby8zZ3BwMicsICczZzInXSxcbiAgICBbJ3ZpZGVvL2FuaW1hZmxleCcsICdhZmwnXSxcbiAgICBbJ3ZpZGVvL2F2aScsICdhdmknXSxcbiAgICBbJ3ZpZGVvL2F2cy12aWRlbycsICdhdnMnXSxcbiAgICBbJ3ZpZGVvL2RsJywgJ2RsJ10sXG4gICAgWyd2aWRlby9mbGknLCAnZmxpJ10sXG4gICAgWyd2aWRlby9nbCcsICdnbCddLFxuICAgIFsndmlkZW8vaDI2MScsICdoMjYxJ10sXG4gICAgWyd2aWRlby9oMjYzJywgJ2gyNjMnXSxcbiAgICBbJ3ZpZGVvL2gyNjQnLCAnaDI2NCddLFxuICAgIFsndmlkZW8vanBlZycsICdqcGd2J10sXG4gICAgWyd2aWRlby9qcG0nLCAnanBtJ10sXG4gICAgWyd2aWRlby9tajInLCAnbWoyJ10sXG4gICAgWyd2aWRlby9tcDQnLCAnbXA0J10sXG4gICAgWyd2aWRlby9tcGVnJywgWydtcGVnJywgJ21wMicsICdtcGEnLCAnbXBlJywgJ21wZycsICdtcHYyJywgJ20xdicsICdtMnYnLCAnbXAzJ11dLFxuICAgIFsndmlkZW8vbXN2aWRlbycsICdhdmknXSxcbiAgICBbJ3ZpZGVvL29nZycsICdvZ3YnXSxcbiAgICBbJ3ZpZGVvL3F1aWNrdGltZScsIFsnbW92JywgJ3F0JywgJ21vb3YnXV0sXG4gICAgWyd2aWRlby92ZG8nLCAndmRvJ10sXG4gICAgWyd2aWRlby92aXZvJywgWyd2aXYnLCAndml2byddXSxcbiAgICBbJ3ZpZGVvL3ZuZC5kZWNlLmhkJywgJ3V2aCddLFxuICAgIFsndmlkZW8vdm5kLmRlY2UubW9iaWxlJywgJ3V2bSddLFxuICAgIFsndmlkZW8vdm5kLmRlY2UucGQnLCAndXZwJ10sXG4gICAgWyd2aWRlby92bmQuZGVjZS5zZCcsICd1dnMnXSxcbiAgICBbJ3ZpZGVvL3ZuZC5kZWNlLnZpZGVvJywgJ3V2diddLFxuICAgIFsndmlkZW8vdm5kLmZ2dCcsICdmdnQnXSxcbiAgICBbJ3ZpZGVvL3ZuZC5tcGVndXJsJywgJ214dSddLFxuICAgIFsndmlkZW8vdm5kLm1zLXBsYXlyZWFkeS5tZWRpYS5weXYnLCAncHl2J10sXG4gICAgWyd2aWRlby92bmQucm4tcmVhbHZpZGVvJywgJ3J2J10sXG4gICAgWyd2aWRlby92bmQudXZ2dS5tcDQnLCAndXZ1J10sXG4gICAgWyd2aWRlby92bmQudml2bycsIFsndml2JywgJ3Zpdm8nXV0sXG4gICAgWyd2aWRlby92b3NhaWMnLCAndm9zJ10sXG4gICAgWyd2aWRlby93ZWJtJywgJ3dlYm0nXSxcbiAgICBbJ3ZpZGVvL3gtYW10LWRlbW9ydW4nLCAneGRyJ10sXG4gICAgWyd2aWRlby94LWFtdC1zaG93cnVuJywgJ3hzciddLFxuICAgIFsndmlkZW8veC1hdG9taWMzZC1mZWF0dXJlJywgJ2ZtZiddLFxuICAgIFsndmlkZW8veC1kbCcsICdkbCddLFxuICAgIFsndmlkZW8veC1kdicsIFsnZGlmJywgJ2R2J11dLFxuICAgIFsndmlkZW8veC1mNHYnLCAnZjR2J10sXG4gICAgWyd2aWRlby94LWZsaScsICdmbGknXSxcbiAgICBbJ3ZpZGVvL3gtZmx2JywgJ2ZsdiddLFxuICAgIFsndmlkZW8veC1nbCcsICdnbCddLFxuICAgIFsndmlkZW8veC1pc3ZpZGVvJywgJ2lzdSddLFxuICAgIFsndmlkZW8veC1sYS1hc2YnLCBbJ2xzZicsICdsc3gnXV0sXG4gICAgWyd2aWRlby94LW00dicsICdtNHYnXSxcbiAgICBbJ3ZpZGVvL3gtbW90aW9uLWpwZWcnLCAnbWpwZyddLFxuICAgIFsndmlkZW8veC1tcGVnJywgWydtcDMnLCAnbXAyJ11dLFxuICAgIFsndmlkZW8veC1tcGVxMmEnLCAnbXAyJ10sXG4gICAgWyd2aWRlby94LW1zLWFzZicsIFsnYXNmJywgJ2FzcicsICdhc3gnXV0sXG4gICAgWyd2aWRlby94LW1zLWFzZi1wbHVnaW4nLCAnYXN4J10sXG4gICAgWyd2aWRlby94LW1zLXdtJywgJ3dtJ10sXG4gICAgWyd2aWRlby94LW1zLXdtdicsICd3bXYnXSxcbiAgICBbJ3ZpZGVvL3gtbXMtd214JywgJ3dteCddLFxuICAgIFsndmlkZW8veC1tcy13dngnLCAnd3Z4J10sXG4gICAgWyd2aWRlby94LW1zdmlkZW8nLCAnYXZpJ10sXG4gICAgWyd2aWRlby94LXF0YycsICdxdGMnXSxcbiAgICBbJ3ZpZGVvL3gtc2NtJywgJ3NjbSddLFxuICAgIFsndmlkZW8veC1zZ2ktbW92aWUnLCBbJ21vdmllJywgJ212J11dLFxuICAgIFsnd2luZG93cy9tZXRhZmlsZScsICd3bWYnXSxcbiAgICBbJ3d3dy9taW1lJywgJ21pbWUnXSxcbiAgICBbJ3gtY29uZmVyZW5jZS94LWNvb2x0YWxrJywgJ2ljZSddLFxuICAgIFsneC1tdXNpYy94LW1pZGknLCBbJ21pZCcsICdtaWRpJ11dLFxuICAgIFsneC13b3JsZC94LTNkbWYnLCBbJzNkbScsICczZG1mJywgJ3FkMycsICdxZDNkJ11dLFxuICAgIFsneC13b3JsZC94LXN2cicsICdzdnInXSxcbiAgICBbJ3gtd29ybGQveC12cm1sJywgWydmbHInLCAndnJtbCcsICd3cmwnLCAnd3J6JywgJ3hhZicsICd4b2YnXV0sXG4gICAgWyd4LXdvcmxkL3gtdnJ0JywgJ3ZydCddLFxuICAgIFsneGdsL2RyYXdpbmcnLCAneGd6J10sXG4gICAgWyd4Z2wvbW92aWUnLCAneG16J11cbl0pO1xuY29uc3QgZXh0ZW5zaW9ucyA9IG5ldyBNYXAoW1xuICAgIFsnMTIzJywgJ2FwcGxpY2F0aW9uL3ZuZC5sb3R1cy0xLTItMyddLFxuICAgIFsnMzIzJywgJ3RleHQvaDMyMyddLFxuICAgIFsnKicsICdhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nXSxcbiAgICBbJzNkbScsICd4LXdvcmxkL3gtM2RtZiddLFxuICAgIFsnM2RtZicsICd4LXdvcmxkL3gtM2RtZiddLFxuICAgIFsnM2RtbCcsICd0ZXh0L3ZuZC5pbjNkLjNkbWwnXSxcbiAgICBbJzNnMicsICd2aWRlby8zZ3BwMiddLFxuICAgIFsnM2dwJywgJ3ZpZGVvLzNncHAnXSxcbiAgICBbJzd6JywgJ2FwcGxpY2F0aW9uL3gtN3otY29tcHJlc3NlZCddLFxuICAgIFsnYScsICdhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nXSxcbiAgICBbJ2FhYicsICdhcHBsaWNhdGlvbi94LWF1dGhvcndhcmUtYmluJ10sXG4gICAgWydhYWMnLCAnYXVkaW8veC1hYWMnXSxcbiAgICBbJ2FhbScsICdhcHBsaWNhdGlvbi94LWF1dGhvcndhcmUtbWFwJ10sXG4gICAgWydhYXMnLCAnYXBwbGljYXRpb24veC1hdXRob3J3YXJlLXNlZyddLFxuICAgIFsnYWJjJywgJ3RleHQvdm5kLmFiYyddLFxuICAgIFsnYWJ3JywgJ2FwcGxpY2F0aW9uL3gtYWJpd29yZCddLFxuICAgIFsnYWMnLCAnYXBwbGljYXRpb24vcGtpeC1hdHRyLWNlcnQnXSxcbiAgICBbJ2FjYycsICdhcHBsaWNhdGlvbi92bmQuYW1lcmljYW5keW5hbWljcy5hY2MnXSxcbiAgICBbJ2FjZScsICdhcHBsaWNhdGlvbi94LWFjZS1jb21wcmVzc2VkJ10sXG4gICAgWydhY2dpJywgJ3RleHQvaHRtbCddLFxuICAgIFsnYWN1JywgJ2FwcGxpY2F0aW9uL3ZuZC5hY3Vjb2JvbCddLFxuICAgIFsnYWN4JywgJ2FwcGxpY2F0aW9uL2ludGVybmV0LXByb3BlcnR5LXN0cmVhbSddLFxuICAgIFsnYWRwJywgJ2F1ZGlvL2FkcGNtJ10sXG4gICAgWydhZXAnLCAnYXBwbGljYXRpb24vdm5kLmF1ZGlvZ3JhcGgnXSxcbiAgICBbJ2FmbCcsICd2aWRlby9hbmltYWZsZXgnXSxcbiAgICBbJ2FmcCcsICdhcHBsaWNhdGlvbi92bmQuaWJtLm1vZGNhcCddLFxuICAgIFsnYWhlYWQnLCAnYXBwbGljYXRpb24vdm5kLmFoZWFkLnNwYWNlJ10sXG4gICAgWydhaScsICdhcHBsaWNhdGlvbi9wb3N0c2NyaXB0J10sXG4gICAgWydhaWYnLCBbJ2F1ZGlvL2FpZmYnLCAnYXVkaW8veC1haWZmJ11dLFxuICAgIFsnYWlmYycsIFsnYXVkaW8vYWlmZicsICdhdWRpby94LWFpZmYnXV0sXG4gICAgWydhaWZmJywgWydhdWRpby9haWZmJywgJ2F1ZGlvL3gtYWlmZiddXSxcbiAgICBbJ2FpbScsICdhcHBsaWNhdGlvbi94LWFpbSddLFxuICAgIFsnYWlwJywgJ3RleHQveC1hdWRpb3NvZnQtaW50cmEnXSxcbiAgICBbJ2FpcicsICdhcHBsaWNhdGlvbi92bmQuYWRvYmUuYWlyLWFwcGxpY2F0aW9uLWluc3RhbGxlci1wYWNrYWdlK3ppcCddLFxuICAgIFsnYWl0JywgJ2FwcGxpY2F0aW9uL3ZuZC5kdmIuYWl0J10sXG4gICAgWydhbWknLCAnYXBwbGljYXRpb24vdm5kLmFtaWdhLmFtaSddLFxuICAgIFsnYW5pJywgJ2FwcGxpY2F0aW9uL3gtbmF2aS1hbmltYXRpb24nXSxcbiAgICBbJ2FvcycsICdhcHBsaWNhdGlvbi94LW5va2lhLTkwMDAtY29tbXVuaWNhdG9yLWFkZC1vbi1zb2Z0d2FyZSddLFxuICAgIFsnYXBrJywgJ2FwcGxpY2F0aW9uL3ZuZC5hbmRyb2lkLnBhY2thZ2UtYXJjaGl2ZSddLFxuICAgIFsnYXBwbGljYXRpb24nLCAnYXBwbGljYXRpb24veC1tcy1hcHBsaWNhdGlvbiddLFxuICAgIFsnYXByJywgJ2FwcGxpY2F0aW9uL3ZuZC5sb3R1cy1hcHByb2FjaCddLFxuICAgIFsnYXBzJywgJ2FwcGxpY2F0aW9uL21pbWUnXSxcbiAgICBbJ2FyYycsICdhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nXSxcbiAgICBbJ2FyaicsIFsnYXBwbGljYXRpb24vYXJqJywgJ2FwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSddXSxcbiAgICBbJ2FydCcsICdpbWFnZS94LWpnJ10sXG4gICAgWydhc2YnLCAndmlkZW8veC1tcy1hc2YnXSxcbiAgICBbJ2FzbScsICd0ZXh0L3gtYXNtJ10sXG4gICAgWydhc28nLCAnYXBwbGljYXRpb24vdm5kLmFjY3BhYy5zaW1wbHkuYXNvJ10sXG4gICAgWydhc3AnLCAndGV4dC9hc3AnXSxcbiAgICBbJ2FzcicsICd2aWRlby94LW1zLWFzZiddLFxuICAgIFsnYXN4JywgWyd2aWRlby94LW1zLWFzZicsICdhcHBsaWNhdGlvbi94LW1wbGF5ZXIyJywgJ3ZpZGVvL3gtbXMtYXNmLXBsdWdpbiddXSxcbiAgICBbJ2F0YycsICdhcHBsaWNhdGlvbi92bmQuYWN1Y29ycCddLFxuICAgIFsnYXRvbWNhdCcsICdhcHBsaWNhdGlvbi9hdG9tY2F0K3htbCddLFxuICAgIFsnYXRvbXN2YycsICdhcHBsaWNhdGlvbi9hdG9tc3ZjK3htbCddLFxuICAgIFsnYXR4JywgJ2FwcGxpY2F0aW9uL3ZuZC5hbnRpeC5nYW1lLWNvbXBvbmVudCddLFxuICAgIFsnYXUnLCBbJ2F1ZGlvL2Jhc2ljJywgJ2F1ZGlvL3gtYXUnXV0sXG4gICAgWydhdmknLCBbJ3ZpZGVvL2F2aScsICd2aWRlby9tc3ZpZGVvJywgJ2FwcGxpY2F0aW9uL3gtdHJvZmYtbXN2aWRlbycsICd2aWRlby94LW1zdmlkZW8nXV0sXG4gICAgWydhdnMnLCAndmlkZW8vYXZzLXZpZGVvJ10sXG4gICAgWydhdycsICdhcHBsaWNhdGlvbi9hcHBsaXh3YXJlJ10sXG4gICAgWydheHMnLCAnYXBwbGljYXRpb24vb2xlc2NyaXB0J10sXG4gICAgWydhemYnLCAnYXBwbGljYXRpb24vdm5kLmFpcnppcC5maWxlc2VjdXJlLmF6ZiddLFxuICAgIFsnYXpzJywgJ2FwcGxpY2F0aW9uL3ZuZC5haXJ6aXAuZmlsZXNlY3VyZS5henMnXSxcbiAgICBbJ2F6dycsICdhcHBsaWNhdGlvbi92bmQuYW1hem9uLmVib29rJ10sXG4gICAgWydiYXMnLCAndGV4dC9wbGFpbiddLFxuICAgIFsnYmNwaW8nLCAnYXBwbGljYXRpb24veC1iY3BpbyddLFxuICAgIFsnYmRmJywgJ2FwcGxpY2F0aW9uL3gtZm9udC1iZGYnXSxcbiAgICBbJ2JkbScsICdhcHBsaWNhdGlvbi92bmQuc3luY21sLmRtK3dieG1sJ10sXG4gICAgWydiZWQnLCAnYXBwbGljYXRpb24vdm5kLnJlYWx2bmMuYmVkJ10sXG4gICAgWydiaDInLCAnYXBwbGljYXRpb24vdm5kLmZ1aml0c3Uub2FzeXNwcnMnXSxcbiAgICBbXG4gICAgICAgICdiaW4nLFxuICAgICAgICBbJ2FwcGxpY2F0aW9uL29jdGV0LXN0cmVhbScsICdhcHBsaWNhdGlvbi9tYWMtYmluYXJ5JywgJ2FwcGxpY2F0aW9uL21hY2JpbmFyeScsICdhcHBsaWNhdGlvbi94LW1hY2JpbmFyeScsICdhcHBsaWNhdGlvbi94LWJpbmFyeSddXG4gICAgXSxcbiAgICBbJ2JtJywgJ2ltYWdlL2JtcCddLFxuICAgIFsnYm1pJywgJ2FwcGxpY2F0aW9uL3ZuZC5ibWknXSxcbiAgICBbJ2JtcCcsIFsnaW1hZ2UvYm1wJywgJ2ltYWdlL3gtd2luZG93cy1ibXAnXV0sXG4gICAgWydib28nLCAnYXBwbGljYXRpb24vYm9vayddLFxuICAgIFsnYm9vaycsICdhcHBsaWNhdGlvbi9ib29rJ10sXG4gICAgWydib3gnLCAnYXBwbGljYXRpb24vdm5kLnByZXZpZXdzeXN0ZW1zLmJveCddLFxuICAgIFsnYm96JywgJ2FwcGxpY2F0aW9uL3gtYnppcDInXSxcbiAgICBbJ2JzaCcsICdhcHBsaWNhdGlvbi94LWJzaCddLFxuICAgIFsnYnRpZicsICdpbWFnZS9wcnMuYnRpZiddLFxuICAgIFsnYnonLCAnYXBwbGljYXRpb24veC1iemlwJ10sXG4gICAgWydiejInLCAnYXBwbGljYXRpb24veC1iemlwMiddLFxuICAgIFsnYycsIFsndGV4dC9wbGFpbicsICd0ZXh0L3gtYyddXSxcbiAgICBbJ2MrKycsICd0ZXh0L3BsYWluJ10sXG4gICAgWydjMTFhbWMnLCAnYXBwbGljYXRpb24vdm5kLmNsdWV0cnVzdC5jYXJ0b21vYmlsZS1jb25maWcnXSxcbiAgICBbJ2MxMWFteicsICdhcHBsaWNhdGlvbi92bmQuY2x1ZXRydXN0LmNhcnRvbW9iaWxlLWNvbmZpZy1wa2cnXSxcbiAgICBbJ2M0ZycsICdhcHBsaWNhdGlvbi92bmQuY2xvbmsuYzRncm91cCddLFxuICAgIFsnY2FiJywgJ2FwcGxpY2F0aW9uL3ZuZC5tcy1jYWItY29tcHJlc3NlZCddLFxuICAgIFsnY2FyJywgJ2FwcGxpY2F0aW9uL3ZuZC5jdXJsLmNhciddLFxuICAgIFsnY2F0JywgWydhcHBsaWNhdGlvbi92bmQubXMtcGtpc2VjY2F0JywgJ2FwcGxpY2F0aW9uL3ZuZC5tcy1wa2kuc2VjY2F0J11dLFxuICAgIFsnY2MnLCBbJ3RleHQvcGxhaW4nLCAndGV4dC94LWMnXV0sXG4gICAgWydjY2FkJywgJ2FwcGxpY2F0aW9uL2NsYXJpc2NhZCddLFxuICAgIFsnY2NvJywgJ2FwcGxpY2F0aW9uL3gtY29jb2EnXSxcbiAgICBbJ2NjeG1sJywgJ2FwcGxpY2F0aW9uL2NjeG1sK3htbCwnXSxcbiAgICBbJ2NkYmNtc2cnLCAnYXBwbGljYXRpb24vdm5kLmNvbnRhY3QuY21zZyddLFxuICAgIFsnY2RmJywgWydhcHBsaWNhdGlvbi9jZGYnLCAnYXBwbGljYXRpb24veC1jZGYnLCAnYXBwbGljYXRpb24veC1uZXRjZGYnXV0sXG4gICAgWydjZGtleScsICdhcHBsaWNhdGlvbi92bmQubWVkaWFzdGF0aW9uLmNka2V5J10sXG4gICAgWydjZG1pYScsICdhcHBsaWNhdGlvbi9jZG1pLWNhcGFiaWxpdHknXSxcbiAgICBbJ2NkbWljJywgJ2FwcGxpY2F0aW9uL2NkbWktY29udGFpbmVyJ10sXG4gICAgWydjZG1pZCcsICdhcHBsaWNhdGlvbi9jZG1pLWRvbWFpbiddLFxuICAgIFsnY2RtaW8nLCAnYXBwbGljYXRpb24vY2RtaS1vYmplY3QnXSxcbiAgICBbJ2NkbWlxJywgJ2FwcGxpY2F0aW9uL2NkbWktcXVldWUnXSxcbiAgICBbJ2NkeCcsICdjaGVtaWNhbC94LWNkeCddLFxuICAgIFsnY2R4bWwnLCAnYXBwbGljYXRpb24vdm5kLmNoZW1kcmF3K3htbCddLFxuICAgIFsnY2R5JywgJ2FwcGxpY2F0aW9uL3ZuZC5jaW5kZXJlbGxhJ10sXG4gICAgWydjZXInLCBbJ2FwcGxpY2F0aW9uL3BraXgtY2VydCcsICdhcHBsaWNhdGlvbi94LXg1MDktY2EtY2VydCddXSxcbiAgICBbJ2NnbScsICdpbWFnZS9jZ20nXSxcbiAgICBbJ2NoYScsICdhcHBsaWNhdGlvbi94LWNoYXQnXSxcbiAgICBbJ2NoYXQnLCAnYXBwbGljYXRpb24veC1jaGF0J10sXG4gICAgWydjaG0nLCAnYXBwbGljYXRpb24vdm5kLm1zLWh0bWxoZWxwJ10sXG4gICAgWydjaHJ0JywgJ2FwcGxpY2F0aW9uL3ZuZC5rZGUua2NoYXJ0J10sXG4gICAgWydjaWYnLCAnY2hlbWljYWwveC1jaWYnXSxcbiAgICBbJ2NpaScsICdhcHBsaWNhdGlvbi92bmQuYW5zZXItd2ViLWNlcnRpZmljYXRlLWlzc3VlLWluaXRpYXRpb24nXSxcbiAgICBbJ2NpbCcsICdhcHBsaWNhdGlvbi92bmQubXMtYXJ0Z2FscnknXSxcbiAgICBbJ2NsYScsICdhcHBsaWNhdGlvbi92bmQuY2xheW1vcmUnXSxcbiAgICBbXG4gICAgICAgICdjbGFzcycsXG4gICAgICAgIFsnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJywgJ2FwcGxpY2F0aW9uL2phdmEnLCAnYXBwbGljYXRpb24vamF2YS1ieXRlLWNvZGUnLCAnYXBwbGljYXRpb24vamF2YS12bScsICdhcHBsaWNhdGlvbi94LWphdmEtY2xhc3MnXVxuICAgIF0sXG4gICAgWydjbGtrJywgJ2FwcGxpY2F0aW9uL3ZuZC5jcmljay5jbGlja2VyLmtleWJvYXJkJ10sXG4gICAgWydjbGtwJywgJ2FwcGxpY2F0aW9uL3ZuZC5jcmljay5jbGlja2VyLnBhbGV0dGUnXSxcbiAgICBbJ2Nsa3QnLCAnYXBwbGljYXRpb24vdm5kLmNyaWNrLmNsaWNrZXIudGVtcGxhdGUnXSxcbiAgICBbJ2Nsa3cnLCAnYXBwbGljYXRpb24vdm5kLmNyaWNrLmNsaWNrZXIud29yZGJhbmsnXSxcbiAgICBbJ2Nsa3gnLCAnYXBwbGljYXRpb24vdm5kLmNyaWNrLmNsaWNrZXInXSxcbiAgICBbJ2NscCcsICdhcHBsaWNhdGlvbi94LW1zY2xpcCddLFxuICAgIFsnY21jJywgJ2FwcGxpY2F0aW9uL3ZuZC5jb3Ntb2NhbGxlciddLFxuICAgIFsnY21kZicsICdjaGVtaWNhbC94LWNtZGYnXSxcbiAgICBbJ2NtbCcsICdjaGVtaWNhbC94LWNtbCddLFxuICAgIFsnY21wJywgJ2FwcGxpY2F0aW9uL3ZuZC55ZWxsb3dyaXZlci1jdXN0b20tbWVudSddLFxuICAgIFsnY214JywgJ2ltYWdlL3gtY214J10sXG4gICAgWydjb2QnLCBbJ2ltYWdlL2Npcy1jb2QnLCAnYXBwbGljYXRpb24vdm5kLnJpbS5jb2QnXV0sXG4gICAgWydjb20nLCBbJ2FwcGxpY2F0aW9uL29jdGV0LXN0cmVhbScsICd0ZXh0L3BsYWluJ11dLFxuICAgIFsnY29uZicsICd0ZXh0L3BsYWluJ10sXG4gICAgWydjcGlvJywgJ2FwcGxpY2F0aW9uL3gtY3BpbyddLFxuICAgIFsnY3BwJywgJ3RleHQveC1jJ10sXG4gICAgWydjcHQnLCBbJ2FwcGxpY2F0aW9uL21hYy1jb21wYWN0cHJvJywgJ2FwcGxpY2F0aW9uL3gtY29tcGFjdHBybycsICdhcHBsaWNhdGlvbi94LWNwdCddXSxcbiAgICBbJ2NyZCcsICdhcHBsaWNhdGlvbi94LW1zY2FyZGZpbGUnXSxcbiAgICBbJ2NybCcsIFsnYXBwbGljYXRpb24vcGtpeC1jcmwnLCAnYXBwbGljYXRpb24vcGtjcy1jcmwnXV0sXG4gICAgWydjcnQnLCBbJ2FwcGxpY2F0aW9uL3BraXgtY2VydCcsICdhcHBsaWNhdGlvbi94LXg1MDktdXNlci1jZXJ0JywgJ2FwcGxpY2F0aW9uL3gteDUwOS1jYS1jZXJ0J11dLFxuICAgIFsnY3J5cHRvbm90ZScsICdhcHBsaWNhdGlvbi92bmQucmlnLmNyeXB0b25vdGUnXSxcbiAgICBbJ2NzaCcsIFsndGV4dC94LXNjcmlwdC5jc2gnLCAnYXBwbGljYXRpb24veC1jc2gnXV0sXG4gICAgWydjc21sJywgJ2NoZW1pY2FsL3gtY3NtbCddLFxuICAgIFsnY3NwJywgJ2FwcGxpY2F0aW9uL3ZuZC5jb21tb25zcGFjZSddLFxuICAgIFsnY3NzJywgWyd0ZXh0L2NzcycsICdhcHBsaWNhdGlvbi94LXBvaW50cGx1cyddXSxcbiAgICBbJ2NzdicsICd0ZXh0L2NzdiddLFxuICAgIFsnY3UnLCAnYXBwbGljYXRpb24vY3Utc2VlbWUnXSxcbiAgICBbJ2N1cmwnLCAndGV4dC92bmQuY3VybCddLFxuICAgIFsnY3d3JywgJ2FwcGxpY2F0aW9uL3Bycy5jd3cnXSxcbiAgICBbJ2N4eCcsICd0ZXh0L3BsYWluJ10sXG4gICAgWydkYWUnLCAnbW9kZWwvdm5kLmNvbGxhZGEreG1sJ10sXG4gICAgWydkYWYnLCAnYXBwbGljYXRpb24vdm5kLm1vYml1cy5kYWYnXSxcbiAgICBbJ2Rhdm1vdW50JywgJ2FwcGxpY2F0aW9uL2Rhdm1vdW50K3htbCddLFxuICAgIFsnZGNyJywgJ2FwcGxpY2F0aW9uL3gtZGlyZWN0b3InXSxcbiAgICBbJ2RjdXJsJywgJ3RleHQvdm5kLmN1cmwuZGN1cmwnXSxcbiAgICBbJ2RkMicsICdhcHBsaWNhdGlvbi92bmQub21hLmRkMit4bWwnXSxcbiAgICBbJ2RkZCcsICdhcHBsaWNhdGlvbi92bmQuZnVqaXhlcm94LmRkZCddLFxuICAgIFsnZGViJywgJ2FwcGxpY2F0aW9uL3gtZGViaWFuLXBhY2thZ2UnXSxcbiAgICBbJ2RlZXB2JywgJ2FwcGxpY2F0aW9uL3gtZGVlcHYnXSxcbiAgICBbJ2RlZicsICd0ZXh0L3BsYWluJ10sXG4gICAgWydkZXInLCAnYXBwbGljYXRpb24veC14NTA5LWNhLWNlcnQnXSxcbiAgICBbJ2RmYWMnLCAnYXBwbGljYXRpb24vdm5kLmRyZWFtZmFjdG9yeSddLFxuICAgIFsnZGlmJywgJ3ZpZGVvL3gtZHYnXSxcbiAgICBbJ2RpcicsICdhcHBsaWNhdGlvbi94LWRpcmVjdG9yJ10sXG4gICAgWydkaXMnLCAnYXBwbGljYXRpb24vdm5kLm1vYml1cy5kaXMnXSxcbiAgICBbJ2RqdnUnLCAnaW1hZ2Uvdm5kLmRqdnUnXSxcbiAgICBbJ2RsJywgWyd2aWRlby9kbCcsICd2aWRlby94LWRsJ11dLFxuICAgIFsnZGxsJywgJ2FwcGxpY2F0aW9uL3gtbXNkb3dubG9hZCddLFxuICAgIFsnZG1zJywgJ2FwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSddLFxuICAgIFsnZG5hJywgJ2FwcGxpY2F0aW9uL3ZuZC5kbmEnXSxcbiAgICBbJ2RvYycsICdhcHBsaWNhdGlvbi9tc3dvcmQnXSxcbiAgICBbJ2RvY20nLCAnYXBwbGljYXRpb24vdm5kLm1zLXdvcmQuZG9jdW1lbnQubWFjcm9lbmFibGVkLjEyJ10sXG4gICAgWydkb2N4JywgJ2FwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC53b3JkcHJvY2Vzc2luZ21sLmRvY3VtZW50J10sXG4gICAgWydkb3QnLCAnYXBwbGljYXRpb24vbXN3b3JkJ10sXG4gICAgWydkb3RtJywgJ2FwcGxpY2F0aW9uL3ZuZC5tcy13b3JkLnRlbXBsYXRlLm1hY3JvZW5hYmxlZC4xMiddLFxuICAgIFsnZG90eCcsICdhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQud29yZHByb2Nlc3NpbmdtbC50ZW1wbGF0ZSddLFxuICAgIFsnZHAnLCBbJ2FwcGxpY2F0aW9uL2NvbW1vbmdyb3VuZCcsICdhcHBsaWNhdGlvbi92bmQub3NnaS5kcCddXSxcbiAgICBbJ2RwZycsICdhcHBsaWNhdGlvbi92bmQuZHBncmFwaCddLFxuICAgIFsnZHJhJywgJ2F1ZGlvL3ZuZC5kcmEnXSxcbiAgICBbJ2RydycsICdhcHBsaWNhdGlvbi9kcmFmdGluZyddLFxuICAgIFsnZHNjJywgJ3RleHQvcHJzLmxpbmVzLnRhZyddLFxuICAgIFsnZHNzYycsICdhcHBsaWNhdGlvbi9kc3NjK2RlciddLFxuICAgIFsnZHRiJywgJ2FwcGxpY2F0aW9uL3gtZHRib29rK3htbCddLFxuICAgIFsnZHRkJywgJ2FwcGxpY2F0aW9uL3htbC1kdGQnXSxcbiAgICBbJ2R0cycsICdhdWRpby92bmQuZHRzJ10sXG4gICAgWydkdHNoZCcsICdhdWRpby92bmQuZHRzLmhkJ10sXG4gICAgWydkdW1wJywgJ2FwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSddLFxuICAgIFsnZHYnLCAndmlkZW8veC1kdiddLFxuICAgIFsnZHZpJywgJ2FwcGxpY2F0aW9uL3gtZHZpJ10sXG4gICAgWydkd2YnLCBbJ21vZGVsL3ZuZC5kd2YnLCAnZHJhd2luZy94LWR3ZiddXSxcbiAgICBbJ2R3ZycsIFsnYXBwbGljYXRpb24vYWNhZCcsICdpbWFnZS92bmQuZHdnJywgJ2ltYWdlL3gtZHdnJ11dLFxuICAgIFsnZHhmJywgWydhcHBsaWNhdGlvbi9keGYnLCAnaW1hZ2Uvdm5kLmR3ZycsICdpbWFnZS92bmQuZHhmJywgJ2ltYWdlL3gtZHdnJ11dLFxuICAgIFsnZHhwJywgJ2FwcGxpY2F0aW9uL3ZuZC5zcG90ZmlyZS5keHAnXSxcbiAgICBbJ2R4cicsICdhcHBsaWNhdGlvbi94LWRpcmVjdG9yJ10sXG4gICAgWydlY2VscDQ4MDAnLCAnYXVkaW8vdm5kLm51ZXJhLmVjZWxwNDgwMCddLFxuICAgIFsnZWNlbHA3NDcwJywgJ2F1ZGlvL3ZuZC5udWVyYS5lY2VscDc0NzAnXSxcbiAgICBbJ2VjZWxwOTYwMCcsICdhdWRpby92bmQubnVlcmEuZWNlbHA5NjAwJ10sXG4gICAgWydlZG0nLCAnYXBwbGljYXRpb24vdm5kLm5vdmFkaWdtLmVkbSddLFxuICAgIFsnZWR4JywgJ2FwcGxpY2F0aW9uL3ZuZC5ub3ZhZGlnbS5lZHgnXSxcbiAgICBbJ2VmaWYnLCAnYXBwbGljYXRpb24vdm5kLnBpY3NlbCddLFxuICAgIFsnZWk2JywgJ2FwcGxpY2F0aW9uL3ZuZC5wZy5vc2FzbGknXSxcbiAgICBbJ2VsJywgJ3RleHQveC1zY3JpcHQuZWxpc3AnXSxcbiAgICBbJ2VsYycsIFsnYXBwbGljYXRpb24veC1lbGMnLCAnYXBwbGljYXRpb24veC1ieXRlY29kZS5lbGlzcCddXSxcbiAgICBbJ2VtbCcsICdtZXNzYWdlL3JmYzgyMiddLFxuICAgIFsnZW1tYScsICdhcHBsaWNhdGlvbi9lbW1hK3htbCddLFxuICAgIFsnZW52JywgJ2FwcGxpY2F0aW9uL3gtZW52b3knXSxcbiAgICBbJ2VvbCcsICdhdWRpby92bmQuZGlnaXRhbC13aW5kcyddLFxuICAgIFsnZW90JywgJ2FwcGxpY2F0aW9uL3ZuZC5tcy1mb250b2JqZWN0J10sXG4gICAgWydlcHMnLCAnYXBwbGljYXRpb24vcG9zdHNjcmlwdCddLFxuICAgIFsnZXB1YicsICdhcHBsaWNhdGlvbi9lcHViK3ppcCddLFxuICAgIFsnZXMnLCBbJ2FwcGxpY2F0aW9uL2VjbWFzY3JpcHQnLCAnYXBwbGljYXRpb24veC1lc3JlaGJlciddXSxcbiAgICBbJ2VzMycsICdhcHBsaWNhdGlvbi92bmQuZXN6aWdubzMreG1sJ10sXG4gICAgWydlc2YnLCAnYXBwbGljYXRpb24vdm5kLmVwc29uLmVzZiddLFxuICAgIFsnZXR4JywgJ3RleHQveC1zZXRleHQnXSxcbiAgICBbJ2V2eScsIFsnYXBwbGljYXRpb24vZW52b3knLCAnYXBwbGljYXRpb24veC1lbnZveSddXSxcbiAgICBbJ2V4ZScsIFsnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJywgJ2FwcGxpY2F0aW9uL3gtbXNkb3dubG9hZCddXSxcbiAgICBbJ2V4aScsICdhcHBsaWNhdGlvbi9leGknXSxcbiAgICBbJ2V4dCcsICdhcHBsaWNhdGlvbi92bmQubm92YWRpZ20uZXh0J10sXG4gICAgWydlejInLCAnYXBwbGljYXRpb24vdm5kLmV6cGl4LWFsYnVtJ10sXG4gICAgWydlejMnLCAnYXBwbGljYXRpb24vdm5kLmV6cGl4LXBhY2thZ2UnXSxcbiAgICBbJ2YnLCBbJ3RleHQvcGxhaW4nLCAndGV4dC94LWZvcnRyYW4nXV0sXG4gICAgWydmNHYnLCAndmlkZW8veC1mNHYnXSxcbiAgICBbJ2Y3NycsICd0ZXh0L3gtZm9ydHJhbiddLFxuICAgIFsnZjkwJywgWyd0ZXh0L3BsYWluJywgJ3RleHQveC1mb3J0cmFuJ11dLFxuICAgIFsnZmJzJywgJ2ltYWdlL3ZuZC5mYXN0Ymlkc2hlZXQnXSxcbiAgICBbJ2ZjcycsICdhcHBsaWNhdGlvbi92bmQuaXNhYy5mY3MnXSxcbiAgICBbJ2ZkZicsICdhcHBsaWNhdGlvbi92bmQuZmRmJ10sXG4gICAgWydmZV9sYXVuY2gnLCAnYXBwbGljYXRpb24vdm5kLmRlbm92by5mY3NlbGF5b3V0LWxpbmsnXSxcbiAgICBbJ2ZnNScsICdhcHBsaWNhdGlvbi92bmQuZnVqaXRzdS5vYXN5c2dwJ10sXG4gICAgWydmaCcsICdpbWFnZS94LWZyZWVoYW5kJ10sXG4gICAgWydmaWYnLCBbJ2FwcGxpY2F0aW9uL2ZyYWN0YWxzJywgJ2ltYWdlL2ZpZiddXSxcbiAgICBbJ2ZpZycsICdhcHBsaWNhdGlvbi94LXhmaWcnXSxcbiAgICBbJ2ZsaScsIFsndmlkZW8vZmxpJywgJ3ZpZGVvL3gtZmxpJ11dLFxuICAgIFsnZmxvJywgWydpbWFnZS9mbG9yaWFuJywgJ2FwcGxpY2F0aW9uL3ZuZC5taWNyb2dyYWZ4LmZsbyddXSxcbiAgICBbJ2ZscicsICd4LXdvcmxkL3gtdnJtbCddLFxuICAgIFsnZmx2JywgJ3ZpZGVvL3gtZmx2J10sXG4gICAgWydmbHcnLCAnYXBwbGljYXRpb24vdm5kLmtkZS5raXZpbyddLFxuICAgIFsnZmx4JywgJ3RleHQvdm5kLmZtaS5mbGV4c3RvciddLFxuICAgIFsnZmx5JywgJ3RleHQvdm5kLmZseSddLFxuICAgIFsnZm0nLCAnYXBwbGljYXRpb24vdm5kLmZyYW1lbWFrZXInXSxcbiAgICBbJ2ZtZicsICd2aWRlby94LWF0b21pYzNkLWZlYXR1cmUnXSxcbiAgICBbJ2ZuYycsICdhcHBsaWNhdGlvbi92bmQuZnJvZ2Fucy5mbmMnXSxcbiAgICBbJ2ZvcicsIFsndGV4dC9wbGFpbicsICd0ZXh0L3gtZm9ydHJhbiddXSxcbiAgICBbJ2ZweCcsIFsnaW1hZ2Uvdm5kLmZweCcsICdpbWFnZS92bmQubmV0LWZweCddXSxcbiAgICBbJ2ZybCcsICdhcHBsaWNhdGlvbi9mcmVlbG9hZGVyJ10sXG4gICAgWydmc2MnLCAnYXBwbGljYXRpb24vdm5kLmZzYy53ZWJsYXVuY2gnXSxcbiAgICBbJ2ZzdCcsICdpbWFnZS92bmQuZnN0J10sXG4gICAgWydmdGMnLCAnYXBwbGljYXRpb24vdm5kLmZsdXh0aW1lLmNsaXAnXSxcbiAgICBbJ2Z0aScsICdhcHBsaWNhdGlvbi92bmQuYW5zZXItd2ViLWZ1bmRzLXRyYW5zZmVyLWluaXRpYXRpb24nXSxcbiAgICBbJ2Z1bmsnLCAnYXVkaW8vbWFrZSddLFxuICAgIFsnZnZ0JywgJ3ZpZGVvL3ZuZC5mdnQnXSxcbiAgICBbJ2Z4cCcsICdhcHBsaWNhdGlvbi92bmQuYWRvYmUuZnhwJ10sXG4gICAgWydmenMnLCAnYXBwbGljYXRpb24vdm5kLmZ1enp5c2hlZXQnXSxcbiAgICBbJ2cnLCAndGV4dC9wbGFpbiddLFxuICAgIFsnZzJ3JywgJ2FwcGxpY2F0aW9uL3ZuZC5nZW9wbGFuJ10sXG4gICAgWydnMycsICdpbWFnZS9nM2ZheCddLFxuICAgIFsnZzN3JywgJ2FwcGxpY2F0aW9uL3ZuZC5nZW9zcGFjZSddLFxuICAgIFsnZ2FjJywgJ2FwcGxpY2F0aW9uL3ZuZC5ncm9vdmUtYWNjb3VudCddLFxuICAgIFsnZ2RsJywgJ21vZGVsL3ZuZC5nZGwnXSxcbiAgICBbJ2dlbycsICdhcHBsaWNhdGlvbi92bmQuZHluYWdlbyddLFxuICAgIFsnZ2VvanNvbicsICdhcHBsaWNhdGlvbi9nZW8ranNvbiddLFxuICAgIFsnZ2V4JywgJ2FwcGxpY2F0aW9uL3ZuZC5nZW9tZXRyeS1leHBsb3JlciddLFxuICAgIFsnZ2diJywgJ2FwcGxpY2F0aW9uL3ZuZC5nZW9nZWJyYS5maWxlJ10sXG4gICAgWydnZ3QnLCAnYXBwbGljYXRpb24vdm5kLmdlb2dlYnJhLnRvb2wnXSxcbiAgICBbJ2doZicsICdhcHBsaWNhdGlvbi92bmQuZ3Jvb3ZlLWhlbHAnXSxcbiAgICBbJ2dpZicsICdpbWFnZS9naWYnXSxcbiAgICBbJ2dpbScsICdhcHBsaWNhdGlvbi92bmQuZ3Jvb3ZlLWlkZW50aXR5LW1lc3NhZ2UnXSxcbiAgICBbJ2dsJywgWyd2aWRlby9nbCcsICd2aWRlby94LWdsJ11dLFxuICAgIFsnZ214JywgJ2FwcGxpY2F0aW9uL3ZuZC5nbXgnXSxcbiAgICBbJ2dudW1lcmljJywgJ2FwcGxpY2F0aW9uL3gtZ251bWVyaWMnXSxcbiAgICBbJ2dwaCcsICdhcHBsaWNhdGlvbi92bmQuZmxvZ3JhcGhpdCddLFxuICAgIFsnZ3FmJywgJ2FwcGxpY2F0aW9uL3ZuZC5ncmFmZXEnXSxcbiAgICBbJ2dyYW0nLCAnYXBwbGljYXRpb24vc3JncyddLFxuICAgIFsnZ3J2JywgJ2FwcGxpY2F0aW9uL3ZuZC5ncm9vdmUtaW5qZWN0b3InXSxcbiAgICBbJ2dyeG1sJywgJ2FwcGxpY2F0aW9uL3NyZ3MreG1sJ10sXG4gICAgWydnc2QnLCAnYXVkaW8veC1nc20nXSxcbiAgICBbJ2dzZicsICdhcHBsaWNhdGlvbi94LWZvbnQtZ2hvc3RzY3JpcHQnXSxcbiAgICBbJ2dzbScsICdhdWRpby94LWdzbSddLFxuICAgIFsnZ3NwJywgJ2FwcGxpY2F0aW9uL3gtZ3NwJ10sXG4gICAgWydnc3MnLCAnYXBwbGljYXRpb24veC1nc3MnXSxcbiAgICBbJ2d0YXInLCAnYXBwbGljYXRpb24veC1ndGFyJ10sXG4gICAgWydndG0nLCAnYXBwbGljYXRpb24vdm5kLmdyb292ZS10b29sLW1lc3NhZ2UnXSxcbiAgICBbJ2d0dycsICdtb2RlbC92bmQuZ3R3J10sXG4gICAgWydndicsICd0ZXh0L3ZuZC5ncmFwaHZpeiddLFxuICAgIFsnZ3h0JywgJ2FwcGxpY2F0aW9uL3ZuZC5nZW9uZXh0J10sXG4gICAgWydneicsIFsnYXBwbGljYXRpb24veC1nemlwJywgJ2FwcGxpY2F0aW9uL3gtY29tcHJlc3NlZCddXSxcbiAgICBbJ2d6aXAnLCBbJ211bHRpcGFydC94LWd6aXAnLCAnYXBwbGljYXRpb24veC1nemlwJ11dLFxuICAgIFsnaCcsIFsndGV4dC9wbGFpbicsICd0ZXh0L3gtaCddXSxcbiAgICBbJ2gyNjEnLCAndmlkZW8vaDI2MSddLFxuICAgIFsnaDI2MycsICd2aWRlby9oMjYzJ10sXG4gICAgWydoMjY0JywgJ3ZpZGVvL2gyNjQnXSxcbiAgICBbJ2hhbCcsICdhcHBsaWNhdGlvbi92bmQuaGFsK3htbCddLFxuICAgIFsnaGJjaScsICdhcHBsaWNhdGlvbi92bmQuaGJjaSddLFxuICAgIFsnaGRmJywgJ2FwcGxpY2F0aW9uL3gtaGRmJ10sXG4gICAgWydoZWxwJywgJ2FwcGxpY2F0aW9uL3gtaGVscGZpbGUnXSxcbiAgICBbJ2hnbCcsICdhcHBsaWNhdGlvbi92bmQuaHAtaHBnbCddLFxuICAgIFsnaGgnLCBbJ3RleHQvcGxhaW4nLCAndGV4dC94LWgnXV0sXG4gICAgWydobGInLCAndGV4dC94LXNjcmlwdCddLFxuICAgIFsnaGxwJywgWydhcHBsaWNhdGlvbi93aW5obHAnLCAnYXBwbGljYXRpb24vaGxwJywgJ2FwcGxpY2F0aW9uL3gtaGVscGZpbGUnLCAnYXBwbGljYXRpb24veC13aW5oZWxwJ11dLFxuICAgIFsnaHBnJywgJ2FwcGxpY2F0aW9uL3ZuZC5ocC1ocGdsJ10sXG4gICAgWydocGdsJywgJ2FwcGxpY2F0aW9uL3ZuZC5ocC1ocGdsJ10sXG4gICAgWydocGlkJywgJ2FwcGxpY2F0aW9uL3ZuZC5ocC1ocGlkJ10sXG4gICAgWydocHMnLCAnYXBwbGljYXRpb24vdm5kLmhwLWhwcyddLFxuICAgIFtcbiAgICAgICAgJ2hxeCcsXG4gICAgICAgIFtcbiAgICAgICAgICAgICdhcHBsaWNhdGlvbi9tYWMtYmluaGV4NDAnLFxuICAgICAgICAgICAgJ2FwcGxpY2F0aW9uL2JpbmhleCcsXG4gICAgICAgICAgICAnYXBwbGljYXRpb24vYmluaGV4NCcsXG4gICAgICAgICAgICAnYXBwbGljYXRpb24vbWFjLWJpbmhleCcsXG4gICAgICAgICAgICAnYXBwbGljYXRpb24veC1iaW5oZXg0MCcsXG4gICAgICAgICAgICAnYXBwbGljYXRpb24veC1tYWMtYmluaGV4NDAnXG4gICAgICAgIF1cbiAgICBdLFxuICAgIFsnaHRhJywgJ2FwcGxpY2F0aW9uL2h0YSddLFxuICAgIFsnaHRjJywgJ3RleHQveC1jb21wb25lbnQnXSxcbiAgICBbJ2h0a2UnLCAnYXBwbGljYXRpb24vdm5kLmtlbmFtZWFhcHAnXSxcbiAgICBbJ2h0bScsICd0ZXh0L2h0bWwnXSxcbiAgICBbJ2h0bWwnLCAndGV4dC9odG1sJ10sXG4gICAgWydodG1scycsICd0ZXh0L2h0bWwnXSxcbiAgICBbJ2h0dCcsICd0ZXh0L3dlYnZpZXdodG1sJ10sXG4gICAgWydodHgnLCAndGV4dC9odG1sJ10sXG4gICAgWydodmQnLCAnYXBwbGljYXRpb24vdm5kLnlhbWFoYS5odi1kaWMnXSxcbiAgICBbJ2h2cCcsICdhcHBsaWNhdGlvbi92bmQueWFtYWhhLmh2LXZvaWNlJ10sXG4gICAgWydodnMnLCAnYXBwbGljYXRpb24vdm5kLnlhbWFoYS5odi1zY3JpcHQnXSxcbiAgICBbJ2kyZycsICdhcHBsaWNhdGlvbi92bmQuaW50ZXJnZW8nXSxcbiAgICBbJ2ljYycsICdhcHBsaWNhdGlvbi92bmQuaWNjcHJvZmlsZSddLFxuICAgIFsnaWNlJywgJ3gtY29uZmVyZW5jZS94LWNvb2x0YWxrJ10sXG4gICAgWydpY28nLCAnaW1hZ2UveC1pY29uJ10sXG4gICAgWydpY3MnLCAndGV4dC9jYWxlbmRhciddLFxuICAgIFsnaWRjJywgJ3RleHQvcGxhaW4nXSxcbiAgICBbJ2llZicsICdpbWFnZS9pZWYnXSxcbiAgICBbJ2llZnMnLCAnaW1hZ2UvaWVmJ10sXG4gICAgWydpZm0nLCAnYXBwbGljYXRpb24vdm5kLnNoYW5hLmluZm9ybWVkLmZvcm1kYXRhJ10sXG4gICAgWydpZ2VzJywgWydhcHBsaWNhdGlvbi9pZ2VzJywgJ21vZGVsL2lnZXMnXV0sXG4gICAgWydpZ2wnLCAnYXBwbGljYXRpb24vdm5kLmlnbG9hZGVyJ10sXG4gICAgWydpZ20nLCAnYXBwbGljYXRpb24vdm5kLmluc29ycy5pZ20nXSxcbiAgICBbJ2lncycsIFsnYXBwbGljYXRpb24vaWdlcycsICdtb2RlbC9pZ2VzJ11dLFxuICAgIFsnaWd4JywgJ2FwcGxpY2F0aW9uL3ZuZC5taWNyb2dyYWZ4LmlneCddLFxuICAgIFsnaWlmJywgJ2FwcGxpY2F0aW9uL3ZuZC5zaGFuYS5pbmZvcm1lZC5pbnRlcmNoYW5nZSddLFxuICAgIFsnaWlpJywgJ2FwcGxpY2F0aW9uL3gtaXBob25lJ10sXG4gICAgWydpbWEnLCAnYXBwbGljYXRpb24veC1pbWEnXSxcbiAgICBbJ2ltYXAnLCAnYXBwbGljYXRpb24veC1odHRwZC1pbWFwJ10sXG4gICAgWydpbXAnLCAnYXBwbGljYXRpb24vdm5kLmFjY3BhYy5zaW1wbHkuaW1wJ10sXG4gICAgWydpbXMnLCAnYXBwbGljYXRpb24vdm5kLm1zLWltcyddLFxuICAgIFsnaW5mJywgJ2FwcGxpY2F0aW9uL2luZiddLFxuICAgIFsnaW5zJywgWydhcHBsaWNhdGlvbi94LWludGVybmV0LXNpZ251cCcsICdhcHBsaWNhdGlvbi94LWludGVybmV0dC1zaWdudXAnXV0sXG4gICAgWydpcCcsICdhcHBsaWNhdGlvbi94LWlwMiddLFxuICAgIFsnaXBmaXgnLCAnYXBwbGljYXRpb24vaXBmaXgnXSxcbiAgICBbJ2lwaycsICdhcHBsaWNhdGlvbi92bmQuc2hhbmEuaW5mb3JtZWQucGFja2FnZSddLFxuICAgIFsnaXJtJywgJ2FwcGxpY2F0aW9uL3ZuZC5pYm0ucmlnaHRzLW1hbmFnZW1lbnQnXSxcbiAgICBbJ2lycCcsICdhcHBsaWNhdGlvbi92bmQuaXJlcG9zaXRvcnkucGFja2FnZSt4bWwnXSxcbiAgICBbJ2lzcCcsICdhcHBsaWNhdGlvbi94LWludGVybmV0LXNpZ251cCddLFxuICAgIFsnaXN1JywgJ3ZpZGVvL3gtaXN2aWRlbyddLFxuICAgIFsnaXQnLCAnYXVkaW8vaXQnXSxcbiAgICBbJ2l0cCcsICdhcHBsaWNhdGlvbi92bmQuc2hhbmEuaW5mb3JtZWQuZm9ybXRlbXBsYXRlJ10sXG4gICAgWydpdicsICdhcHBsaWNhdGlvbi94LWludmVudG9yJ10sXG4gICAgWydpdnAnLCAnYXBwbGljYXRpb24vdm5kLmltbWVydmlzaW9uLWl2cCddLFxuICAgIFsnaXZyJywgJ2ktd29ybGQvaS12cm1sJ10sXG4gICAgWydpdnUnLCAnYXBwbGljYXRpb24vdm5kLmltbWVydmlzaW9uLWl2dSddLFxuICAgIFsnaXZ5JywgJ2FwcGxpY2F0aW9uL3gtbGl2ZXNjcmVlbiddLFxuICAgIFsnamFkJywgJ3RleHQvdm5kLnN1bi5qMm1lLmFwcC1kZXNjcmlwdG9yJ10sXG4gICAgWydqYW0nLCBbJ2FwcGxpY2F0aW9uL3ZuZC5qYW0nLCAnYXVkaW8veC1qYW0nXV0sXG4gICAgWydqYXInLCAnYXBwbGljYXRpb24vamF2YS1hcmNoaXZlJ10sXG4gICAgWydqYXYnLCBbJ3RleHQvcGxhaW4nLCAndGV4dC94LWphdmEtc291cmNlJ11dLFxuICAgIFsnamF2YScsIFsndGV4dC9wbGFpbicsICd0ZXh0L3gtamF2YS1zb3VyY2UsamF2YScsICd0ZXh0L3gtamF2YS1zb3VyY2UnXV0sXG4gICAgWydqY20nLCAnYXBwbGljYXRpb24veC1qYXZhLWNvbW1lcmNlJ10sXG4gICAgWydqZmlmJywgWydpbWFnZS9waXBlZycsICdpbWFnZS9qcGVnJywgJ2ltYWdlL3BqcGVnJ11dLFxuICAgIFsnamZpZi10Ym5sJywgJ2ltYWdlL2pwZWcnXSxcbiAgICBbJ2ppc3AnLCAnYXBwbGljYXRpb24vdm5kLmppc3AnXSxcbiAgICBbJ2psdCcsICdhcHBsaWNhdGlvbi92bmQuaHAtamx5dCddLFxuICAgIFsnam5scCcsICdhcHBsaWNhdGlvbi94LWphdmEtam5scC1maWxlJ10sXG4gICAgWydqb2RhJywgJ2FwcGxpY2F0aW9uL3ZuZC5qb29zdC5qb2RhLWFyY2hpdmUnXSxcbiAgICBbJ2pwZScsIFsnaW1hZ2UvanBlZycsICdpbWFnZS9wanBlZyddXSxcbiAgICBbJ2pwZWcnLCBbJ2ltYWdlL2pwZWcnLCAnaW1hZ2UvcGpwZWcnXV0sXG4gICAgWydqcGcnLCBbJ2ltYWdlL2pwZWcnLCAnaW1hZ2UvcGpwZWcnXV0sXG4gICAgWydqcGd2JywgJ3ZpZGVvL2pwZWcnXSxcbiAgICBbJ2pwbScsICd2aWRlby9qcG0nXSxcbiAgICBbJ2pwcycsICdpbWFnZS94LWpwcyddLFxuICAgIFsnanMnLCBbJ2FwcGxpY2F0aW9uL2phdmFzY3JpcHQnLCAnYXBwbGljYXRpb24vZWNtYXNjcmlwdCcsICd0ZXh0L2phdmFzY3JpcHQnLCAndGV4dC9lY21hc2NyaXB0JywgJ2FwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCddXSxcbiAgICBbJ2pzb24nLCAnYXBwbGljYXRpb24vanNvbiddLFxuICAgIFsnanV0JywgJ2ltYWdlL2p1dHZpc2lvbiddLFxuICAgIFsna2FyJywgWydhdWRpby9taWRpJywgJ211c2ljL3gta2FyYW9rZSddXSxcbiAgICBbJ2thcmJvbicsICdhcHBsaWNhdGlvbi92bmQua2RlLmthcmJvbiddLFxuICAgIFsna2ZvJywgJ2FwcGxpY2F0aW9uL3ZuZC5rZGUua2Zvcm11bGEnXSxcbiAgICBbJ2tpYScsICdhcHBsaWNhdGlvbi92bmQua2lkc3BpcmF0aW9uJ10sXG4gICAgWydrbWwnLCAnYXBwbGljYXRpb24vdm5kLmdvb2dsZS1lYXJ0aC5rbWwreG1sJ10sXG4gICAgWydrbXonLCAnYXBwbGljYXRpb24vdm5kLmdvb2dsZS1lYXJ0aC5rbXonXSxcbiAgICBbJ2tuZScsICdhcHBsaWNhdGlvbi92bmQua2luYXInXSxcbiAgICBbJ2tvbicsICdhcHBsaWNhdGlvbi92bmQua2RlLmtvbnRvdXInXSxcbiAgICBbJ2twcicsICdhcHBsaWNhdGlvbi92bmQua2RlLmtwcmVzZW50ZXInXSxcbiAgICBbJ2tzaCcsIFsnYXBwbGljYXRpb24veC1rc2gnLCAndGV4dC94LXNjcmlwdC5rc2gnXV0sXG4gICAgWydrc3AnLCAnYXBwbGljYXRpb24vdm5kLmtkZS5rc3ByZWFkJ10sXG4gICAgWydrdHgnLCAnaW1hZ2Uva3R4J10sXG4gICAgWydrdHonLCAnYXBwbGljYXRpb24vdm5kLmthaG9vdHonXSxcbiAgICBbJ2t3ZCcsICdhcHBsaWNhdGlvbi92bmQua2RlLmt3b3JkJ10sXG4gICAgWydsYScsIFsnYXVkaW8vbnNwYXVkaW8nLCAnYXVkaW8veC1uc3BhdWRpbyddXSxcbiAgICBbJ2xhbScsICdhdWRpby94LWxpdmVhdWRpbyddLFxuICAgIFsnbGFzeG1sJywgJ2FwcGxpY2F0aW9uL3ZuZC5sYXMubGFzK3htbCddLFxuICAgIFsnbGF0ZXgnLCAnYXBwbGljYXRpb24veC1sYXRleCddLFxuICAgIFsnbGJkJywgJ2FwcGxpY2F0aW9uL3ZuZC5sbGFtYWdyYXBoaWNzLmxpZmUtYmFsYW5jZS5kZXNrdG9wJ10sXG4gICAgWydsYmUnLCAnYXBwbGljYXRpb24vdm5kLmxsYW1hZ3JhcGhpY3MubGlmZS1iYWxhbmNlLmV4Y2hhbmdlK3htbCddLFxuICAgIFsnbGVzJywgJ2FwcGxpY2F0aW9uL3ZuZC5oaGUubGVzc29uLXBsYXllciddLFxuICAgIFsnbGhhJywgWydhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nLCAnYXBwbGljYXRpb24vbGhhJywgJ2FwcGxpY2F0aW9uL3gtbGhhJ11dLFxuICAgIFsnbGh4JywgJ2FwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSddLFxuICAgIFsnbGluazY2JywgJ2FwcGxpY2F0aW9uL3ZuZC5yb3V0ZTY2Lmxpbms2Nit4bWwnXSxcbiAgICBbJ2xpc3QnLCAndGV4dC9wbGFpbiddLFxuICAgIFsnbG1hJywgWydhdWRpby9uc3BhdWRpbycsICdhdWRpby94LW5zcGF1ZGlvJ11dLFxuICAgIFsnbG9nJywgJ3RleHQvcGxhaW4nXSxcbiAgICBbJ2xybScsICdhcHBsaWNhdGlvbi92bmQubXMtbHJtJ10sXG4gICAgWydsc2YnLCAndmlkZW8veC1sYS1hc2YnXSxcbiAgICBbJ2xzcCcsIFsnYXBwbGljYXRpb24veC1saXNwJywgJ3RleHQveC1zY3JpcHQubGlzcCddXSxcbiAgICBbJ2xzdCcsICd0ZXh0L3BsYWluJ10sXG4gICAgWydsc3gnLCBbJ3ZpZGVvL3gtbGEtYXNmJywgJ3RleHQveC1sYS1hc2YnXV0sXG4gICAgWydsdGYnLCAnYXBwbGljYXRpb24vdm5kLmZyb2dhbnMubHRmJ10sXG4gICAgWydsdHgnLCAnYXBwbGljYXRpb24veC1sYXRleCddLFxuICAgIFsnbHZwJywgJ2F1ZGlvL3ZuZC5sdWNlbnQudm9pY2UnXSxcbiAgICBbJ2x3cCcsICdhcHBsaWNhdGlvbi92bmQubG90dXMtd29yZHBybyddLFxuICAgIFsnbHpoJywgWydhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nLCAnYXBwbGljYXRpb24veC1semgnXV0sXG4gICAgWydsengnLCBbJ2FwcGxpY2F0aW9uL2x6eCcsICdhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nLCAnYXBwbGljYXRpb24veC1sengnXV0sXG4gICAgWydtJywgWyd0ZXh0L3BsYWluJywgJ3RleHQveC1tJ11dLFxuICAgIFsnbTEzJywgJ2FwcGxpY2F0aW9uL3gtbXNtZWRpYXZpZXcnXSxcbiAgICBbJ20xNCcsICdhcHBsaWNhdGlvbi94LW1zbWVkaWF2aWV3J10sXG4gICAgWydtMXYnLCAndmlkZW8vbXBlZyddLFxuICAgIFsnbTIxJywgJ2FwcGxpY2F0aW9uL21wMjEnXSxcbiAgICBbJ20yYScsICdhdWRpby9tcGVnJ10sXG4gICAgWydtMnYnLCAndmlkZW8vbXBlZyddLFxuICAgIFsnbTN1JywgWydhdWRpby94LW1wZWd1cmwnLCAnYXVkaW8veC1tcGVxdXJsJ11dLFxuICAgIFsnbTN1OCcsICdhcHBsaWNhdGlvbi92bmQuYXBwbGUubXBlZ3VybCddLFxuICAgIFsnbTR2JywgJ3ZpZGVvL3gtbTR2J10sXG4gICAgWydtYScsICdhcHBsaWNhdGlvbi9tYXRoZW1hdGljYSddLFxuICAgIFsnbWFkcycsICdhcHBsaWNhdGlvbi9tYWRzK3htbCddLFxuICAgIFsnbWFnJywgJ2FwcGxpY2F0aW9uL3ZuZC5lY293aW4uY2hhcnQnXSxcbiAgICBbJ21hbicsICdhcHBsaWNhdGlvbi94LXRyb2ZmLW1hbiddLFxuICAgIFsnbWFwJywgJ2FwcGxpY2F0aW9uL3gtbmF2aW1hcCddLFxuICAgIFsnbWFyJywgJ3RleHQvcGxhaW4nXSxcbiAgICBbJ21hdGhtbCcsICdhcHBsaWNhdGlvbi9tYXRobWwreG1sJ10sXG4gICAgWydtYmQnLCAnYXBwbGljYXRpb24vbWJlZGxldCddLFxuICAgIFsnbWJrJywgJ2FwcGxpY2F0aW9uL3ZuZC5tb2JpdXMubWJrJ10sXG4gICAgWydtYm94JywgJ2FwcGxpY2F0aW9uL21ib3gnXSxcbiAgICBbJ21jJCcsICdhcHBsaWNhdGlvbi94LW1hZ2ljLWNhcC1wYWNrYWdlLTEuMCddLFxuICAgIFsnbWMxJywgJ2FwcGxpY2F0aW9uL3ZuZC5tZWRjYWxjZGF0YSddLFxuICAgIFsnbWNkJywgWydhcHBsaWNhdGlvbi9tY2FkJywgJ2FwcGxpY2F0aW9uL3ZuZC5tY2QnLCAnYXBwbGljYXRpb24veC1tYXRoY2FkJ11dLFxuICAgIFsnbWNmJywgWydpbWFnZS92YXNhJywgJ3RleHQvbWNmJ11dLFxuICAgIFsnbWNwJywgJ2FwcGxpY2F0aW9uL25ldG1jJ10sXG4gICAgWydtY3VybCcsICd0ZXh0L3ZuZC5jdXJsLm1jdXJsJ10sXG4gICAgWydtZGInLCAnYXBwbGljYXRpb24veC1tc2FjY2VzcyddLFxuICAgIFsnbWRpJywgJ2ltYWdlL3ZuZC5tcy1tb2RpJ10sXG4gICAgWydtZScsICdhcHBsaWNhdGlvbi94LXRyb2ZmLW1lJ10sXG4gICAgWydtZXRhNCcsICdhcHBsaWNhdGlvbi9tZXRhbGluazQreG1sJ10sXG4gICAgWydtZXRzJywgJ2FwcGxpY2F0aW9uL21ldHMreG1sJ10sXG4gICAgWydtZm0nLCAnYXBwbGljYXRpb24vdm5kLm1mbXAnXSxcbiAgICBbJ21ncCcsICdhcHBsaWNhdGlvbi92bmQub3NnZW8ubWFwZ3VpZGUucGFja2FnZSddLFxuICAgIFsnbWd6JywgJ2FwcGxpY2F0aW9uL3ZuZC5wcm90ZXVzLm1hZ2F6aW5lJ10sXG4gICAgWydtaHQnLCAnbWVzc2FnZS9yZmM4MjInXSxcbiAgICBbJ21odG1sJywgJ21lc3NhZ2UvcmZjODIyJ10sXG4gICAgWydtaWQnLCBbJ2F1ZGlvL21pZCcsICdhdWRpby9taWRpJywgJ211c2ljL2NyZXNjZW5kbycsICd4LW11c2ljL3gtbWlkaScsICdhdWRpby94LW1pZGknLCAnYXBwbGljYXRpb24veC1taWRpJywgJ2F1ZGlvL3gtbWlkJ11dLFxuICAgIFsnbWlkaScsIFsnYXVkaW8vbWlkaScsICdtdXNpYy9jcmVzY2VuZG8nLCAneC1tdXNpYy94LW1pZGknLCAnYXVkaW8veC1taWRpJywgJ2FwcGxpY2F0aW9uL3gtbWlkaScsICdhdWRpby94LW1pZCddXSxcbiAgICBbJ21pZicsIFsnYXBwbGljYXRpb24vdm5kLm1pZicsICdhcHBsaWNhdGlvbi94LW1pZicsICdhcHBsaWNhdGlvbi94LWZyYW1lJ11dLFxuICAgIFsnbWltZScsIFsnbWVzc2FnZS9yZmM4MjInLCAnd3d3L21pbWUnXV0sXG4gICAgWydtajInLCAndmlkZW8vbWoyJ10sXG4gICAgWydtamYnLCAnYXVkaW8veC12bmQuYXVkaW9leHBsb3Npb24ubWp1aWNlbWVkaWFmaWxlJ10sXG4gICAgWydtanBnJywgJ3ZpZGVvL3gtbW90aW9uLWpwZWcnXSxcbiAgICBbJ21scCcsICdhcHBsaWNhdGlvbi92bmQuZG9sYnkubWxwJ10sXG4gICAgWydtbScsIFsnYXBwbGljYXRpb24vYmFzZTY0JywgJ2FwcGxpY2F0aW9uL3gtbWVtZSddXSxcbiAgICBbJ21tZCcsICdhcHBsaWNhdGlvbi92bmQuY2hpcG51dHMua2FyYW9rZS1tbWQnXSxcbiAgICBbJ21tZScsICdhcHBsaWNhdGlvbi9iYXNlNjQnXSxcbiAgICBbJ21tZicsICdhcHBsaWNhdGlvbi92bmQuc21hZiddLFxuICAgIFsnbW1yJywgJ2ltYWdlL3ZuZC5mdWppeGVyb3guZWRtaWNzLW1tciddLFxuICAgIFsnbW55JywgJ2FwcGxpY2F0aW9uL3gtbXNtb25leSddLFxuICAgIFsnbW9kJywgWydhdWRpby9tb2QnLCAnYXVkaW8veC1tb2QnXV0sXG4gICAgWydtb2RzJywgJ2FwcGxpY2F0aW9uL21vZHMreG1sJ10sXG4gICAgWydtb292JywgJ3ZpZGVvL3F1aWNrdGltZSddLFxuICAgIFsnbW92JywgJ3ZpZGVvL3F1aWNrdGltZSddLFxuICAgIFsnbW92aWUnLCAndmlkZW8veC1zZ2ktbW92aWUnXSxcbiAgICBbJ21wMicsIFsndmlkZW8vbXBlZycsICdhdWRpby9tcGVnJywgJ3ZpZGVvL3gtbXBlZycsICdhdWRpby94LW1wZWcnLCAndmlkZW8veC1tcGVxMmEnXV0sXG4gICAgWydtcDMnLCBbJ2F1ZGlvL21wZWcnLCAnYXVkaW8vbXBlZzMnLCAndmlkZW8vbXBlZycsICdhdWRpby94LW1wZWctMycsICd2aWRlby94LW1wZWcnXV0sXG4gICAgWydtcDQnLCBbJ3ZpZGVvL21wNCcsICdhcHBsaWNhdGlvbi9tcDQnXV0sXG4gICAgWydtcDRhJywgJ2F1ZGlvL21wNCddLFxuICAgIFsnbXBhJywgWyd2aWRlby9tcGVnJywgJ2F1ZGlvL21wZWcnXV0sXG4gICAgWydtcGMnLCBbJ2FwcGxpY2F0aW9uL3ZuZC5tb3BodW4uY2VydGlmaWNhdGUnLCAnYXBwbGljYXRpb24veC1wcm9qZWN0J11dLFxuICAgIFsnbXBlJywgJ3ZpZGVvL21wZWcnXSxcbiAgICBbJ21wZWcnLCAndmlkZW8vbXBlZyddLFxuICAgIFsnbXBnJywgWyd2aWRlby9tcGVnJywgJ2F1ZGlvL21wZWcnXV0sXG4gICAgWydtcGdhJywgJ2F1ZGlvL21wZWcnXSxcbiAgICBbJ21wa2cnLCAnYXBwbGljYXRpb24vdm5kLmFwcGxlLmluc3RhbGxlcit4bWwnXSxcbiAgICBbJ21wbScsICdhcHBsaWNhdGlvbi92bmQuYmx1ZWljZS5tdWx0aXBhc3MnXSxcbiAgICBbJ21wbicsICdhcHBsaWNhdGlvbi92bmQubW9waHVuLmFwcGxpY2F0aW9uJ10sXG4gICAgWydtcHAnLCAnYXBwbGljYXRpb24vdm5kLm1zLXByb2plY3QnXSxcbiAgICBbJ21wdCcsICdhcHBsaWNhdGlvbi94LXByb2plY3QnXSxcbiAgICBbJ21wdicsICdhcHBsaWNhdGlvbi94LXByb2plY3QnXSxcbiAgICBbJ21wdjInLCAndmlkZW8vbXBlZyddLFxuICAgIFsnbXB4JywgJ2FwcGxpY2F0aW9uL3gtcHJvamVjdCddLFxuICAgIFsnbXB5JywgJ2FwcGxpY2F0aW9uL3ZuZC5pYm0ubWluaXBheSddLFxuICAgIFsnbXF5JywgJ2FwcGxpY2F0aW9uL3ZuZC5tb2JpdXMubXF5J10sXG4gICAgWydtcmMnLCAnYXBwbGljYXRpb24vbWFyYyddLFxuICAgIFsnbXJjeCcsICdhcHBsaWNhdGlvbi9tYXJjeG1sK3htbCddLFxuICAgIFsnbXMnLCAnYXBwbGljYXRpb24veC10cm9mZi1tcyddLFxuICAgIFsnbXNjbWwnLCAnYXBwbGljYXRpb24vbWVkaWFzZXJ2ZXJjb250cm9sK3htbCddLFxuICAgIFsnbXNlcScsICdhcHBsaWNhdGlvbi92bmQubXNlcSddLFxuICAgIFsnbXNmJywgJ2FwcGxpY2F0aW9uL3ZuZC5lcHNvbi5tc2YnXSxcbiAgICBbJ21zZycsICdhcHBsaWNhdGlvbi92bmQubXMtb3V0bG9vayddLFxuICAgIFsnbXNoJywgJ21vZGVsL21lc2gnXSxcbiAgICBbJ21zbCcsICdhcHBsaWNhdGlvbi92bmQubW9iaXVzLm1zbCddLFxuICAgIFsnbXN0eScsICdhcHBsaWNhdGlvbi92bmQubXV2ZWUuc3R5bGUnXSxcbiAgICBbJ210cycsICdtb2RlbC92bmQubXRzJ10sXG4gICAgWydtdXMnLCAnYXBwbGljYXRpb24vdm5kLm11c2ljaWFuJ10sXG4gICAgWydtdXNpY3htbCcsICdhcHBsaWNhdGlvbi92bmQucmVjb3JkYXJlLm11c2ljeG1sK3htbCddLFxuICAgIFsnbXYnLCAndmlkZW8veC1zZ2ktbW92aWUnXSxcbiAgICBbJ212YicsICdhcHBsaWNhdGlvbi94LW1zbWVkaWF2aWV3J10sXG4gICAgWydtd2YnLCAnYXBwbGljYXRpb24vdm5kLm1mZXInXSxcbiAgICBbJ214ZicsICdhcHBsaWNhdGlvbi9teGYnXSxcbiAgICBbJ214bCcsICdhcHBsaWNhdGlvbi92bmQucmVjb3JkYXJlLm11c2ljeG1sJ10sXG4gICAgWydteG1sJywgJ2FwcGxpY2F0aW9uL3h2K3htbCddLFxuICAgIFsnbXhzJywgJ2FwcGxpY2F0aW9uL3ZuZC50cmlzY2FwZS5teHMnXSxcbiAgICBbJ214dScsICd2aWRlby92bmQubXBlZ3VybCddLFxuICAgIFsnbXknLCAnYXVkaW8vbWFrZSddLFxuICAgIFsnbXp6JywgJ2FwcGxpY2F0aW9uL3gtdm5kLmF1ZGlvZXhwbG9zaW9uLm16eiddLFxuICAgIFsnbi1nYWdlJywgJ2FwcGxpY2F0aW9uL3ZuZC5ub2tpYS5uLWdhZ2Uuc3ltYmlhbi5pbnN0YWxsJ10sXG4gICAgWyduMycsICd0ZXh0L24zJ10sXG4gICAgWyduYXAnLCAnaW1hZ2UvbmFwbHBzJ10sXG4gICAgWyduYXBscHMnLCAnaW1hZ2UvbmFwbHBzJ10sXG4gICAgWyduYnAnLCAnYXBwbGljYXRpb24vdm5kLndvbGZyYW0ucGxheWVyJ10sXG4gICAgWyduYycsICdhcHBsaWNhdGlvbi94LW5ldGNkZiddLFxuICAgIFsnbmNtJywgJ2FwcGxpY2F0aW9uL3ZuZC5ub2tpYS5jb25maWd1cmF0aW9uLW1lc3NhZ2UnXSxcbiAgICBbJ25jeCcsICdhcHBsaWNhdGlvbi94LWR0Ym5jeCt4bWwnXSxcbiAgICBbJ25nZGF0JywgJ2FwcGxpY2F0aW9uL3ZuZC5ub2tpYS5uLWdhZ2UuZGF0YSddLFxuICAgIFsnbmlmJywgJ2ltYWdlL3gtbmlmZiddLFxuICAgIFsnbmlmZicsICdpbWFnZS94LW5pZmYnXSxcbiAgICBbJ25peCcsICdhcHBsaWNhdGlvbi94LW1peC10cmFuc2ZlciddLFxuICAgIFsnbmx1JywgJ2FwcGxpY2F0aW9uL3ZuZC5uZXVyb2xhbmd1YWdlLm5sdSddLFxuICAgIFsnbm1sJywgJ2FwcGxpY2F0aW9uL3ZuZC5lbmxpdmVuJ10sXG4gICAgWydubmQnLCAnYXBwbGljYXRpb24vdm5kLm5vYmxlbmV0LWRpcmVjdG9yeSddLFxuICAgIFsnbm5zJywgJ2FwcGxpY2F0aW9uL3ZuZC5ub2JsZW5ldC1zZWFsZXInXSxcbiAgICBbJ25udycsICdhcHBsaWNhdGlvbi92bmQubm9ibGVuZXQtd2ViJ10sXG4gICAgWyducHgnLCAnaW1hZ2Uvdm5kLm5ldC1mcHgnXSxcbiAgICBbJ25zYycsICdhcHBsaWNhdGlvbi94LWNvbmZlcmVuY2UnXSxcbiAgICBbJ25zZicsICdhcHBsaWNhdGlvbi92bmQubG90dXMtbm90ZXMnXSxcbiAgICBbJ252ZCcsICdhcHBsaWNhdGlvbi94LW5hdmlkb2MnXSxcbiAgICBbJ253cycsICdtZXNzYWdlL3JmYzgyMiddLFxuICAgIFsnbycsICdhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nXSxcbiAgICBbJ29hMicsICdhcHBsaWNhdGlvbi92bmQuZnVqaXRzdS5vYXN5czInXSxcbiAgICBbJ29hMycsICdhcHBsaWNhdGlvbi92bmQuZnVqaXRzdS5vYXN5czMnXSxcbiAgICBbJ29hcycsICdhcHBsaWNhdGlvbi92bmQuZnVqaXRzdS5vYXN5cyddLFxuICAgIFsnb2JkJywgJ2FwcGxpY2F0aW9uL3gtbXNiaW5kZXInXSxcbiAgICBbJ29kYScsICdhcHBsaWNhdGlvbi9vZGEnXSxcbiAgICBbJ29kYicsICdhcHBsaWNhdGlvbi92bmQub2FzaXMub3BlbmRvY3VtZW50LmRhdGFiYXNlJ10sXG4gICAgWydvZGMnLCAnYXBwbGljYXRpb24vdm5kLm9hc2lzLm9wZW5kb2N1bWVudC5jaGFydCddLFxuICAgIFsnb2RmJywgJ2FwcGxpY2F0aW9uL3ZuZC5vYXNpcy5vcGVuZG9jdW1lbnQuZm9ybXVsYSddLFxuICAgIFsnb2RmdCcsICdhcHBsaWNhdGlvbi92bmQub2FzaXMub3BlbmRvY3VtZW50LmZvcm11bGEtdGVtcGxhdGUnXSxcbiAgICBbJ29kZycsICdhcHBsaWNhdGlvbi92bmQub2FzaXMub3BlbmRvY3VtZW50LmdyYXBoaWNzJ10sXG4gICAgWydvZGknLCAnYXBwbGljYXRpb24vdm5kLm9hc2lzLm9wZW5kb2N1bWVudC5pbWFnZSddLFxuICAgIFsnb2RtJywgJ2FwcGxpY2F0aW9uL3ZuZC5vYXNpcy5vcGVuZG9jdW1lbnQudGV4dC1tYXN0ZXInXSxcbiAgICBbJ29kcCcsICdhcHBsaWNhdGlvbi92bmQub2FzaXMub3BlbmRvY3VtZW50LnByZXNlbnRhdGlvbiddLFxuICAgIFsnb2RzJywgJ2FwcGxpY2F0aW9uL3ZuZC5vYXNpcy5vcGVuZG9jdW1lbnQuc3ByZWFkc2hlZXQnXSxcbiAgICBbJ29kdCcsICdhcHBsaWNhdGlvbi92bmQub2FzaXMub3BlbmRvY3VtZW50LnRleHQnXSxcbiAgICBbJ29nYScsICdhdWRpby9vZ2cnXSxcbiAgICBbJ29ndicsICd2aWRlby9vZ2cnXSxcbiAgICBbJ29neCcsICdhcHBsaWNhdGlvbi9vZ2cnXSxcbiAgICBbJ29tYycsICdhcHBsaWNhdGlvbi94LW9tYyddLFxuICAgIFsnb21jZCcsICdhcHBsaWNhdGlvbi94LW9tY2RhdGFtYWtlciddLFxuICAgIFsnb21jcicsICdhcHBsaWNhdGlvbi94LW9tY3JlZ2VyYXRvciddLFxuICAgIFsnb25ldG9jJywgJ2FwcGxpY2F0aW9uL29uZW5vdGUnXSxcbiAgICBbJ29wZicsICdhcHBsaWNhdGlvbi9vZWJwcy1wYWNrYWdlK3htbCddLFxuICAgIFsnb3JnJywgJ2FwcGxpY2F0aW9uL3ZuZC5sb3R1cy1vcmdhbml6ZXInXSxcbiAgICBbJ29zZicsICdhcHBsaWNhdGlvbi92bmQueWFtYWhhLm9wZW5zY29yZWZvcm1hdCddLFxuICAgIFsnb3NmcHZnJywgJ2FwcGxpY2F0aW9uL3ZuZC55YW1haGEub3BlbnNjb3JlZm9ybWF0Lm9zZnB2Zyt4bWwnXSxcbiAgICBbJ290YycsICdhcHBsaWNhdGlvbi92bmQub2FzaXMub3BlbmRvY3VtZW50LmNoYXJ0LXRlbXBsYXRlJ10sXG4gICAgWydvdGYnLCAnYXBwbGljYXRpb24veC1mb250LW90ZiddLFxuICAgIFsnb3RnJywgJ2FwcGxpY2F0aW9uL3ZuZC5vYXNpcy5vcGVuZG9jdW1lbnQuZ3JhcGhpY3MtdGVtcGxhdGUnXSxcbiAgICBbJ290aCcsICdhcHBsaWNhdGlvbi92bmQub2FzaXMub3BlbmRvY3VtZW50LnRleHQtd2ViJ10sXG4gICAgWydvdGknLCAnYXBwbGljYXRpb24vdm5kLm9hc2lzLm9wZW5kb2N1bWVudC5pbWFnZS10ZW1wbGF0ZSddLFxuICAgIFsnb3RwJywgJ2FwcGxpY2F0aW9uL3ZuZC5vYXNpcy5vcGVuZG9jdW1lbnQucHJlc2VudGF0aW9uLXRlbXBsYXRlJ10sXG4gICAgWydvdHMnLCAnYXBwbGljYXRpb24vdm5kLm9hc2lzLm9wZW5kb2N1bWVudC5zcHJlYWRzaGVldC10ZW1wbGF0ZSddLFxuICAgIFsnb3R0JywgJ2FwcGxpY2F0aW9uL3ZuZC5vYXNpcy5vcGVuZG9jdW1lbnQudGV4dC10ZW1wbGF0ZSddLFxuICAgIFsnb3h0JywgJ2FwcGxpY2F0aW9uL3ZuZC5vcGVub2ZmaWNlb3JnLmV4dGVuc2lvbiddLFxuICAgIFsncCcsICd0ZXh0L3gtcGFzY2FsJ10sXG4gICAgWydwMTAnLCBbJ2FwcGxpY2F0aW9uL3BrY3MxMCcsICdhcHBsaWNhdGlvbi94LXBrY3MxMCddXSxcbiAgICBbJ3AxMicsIFsnYXBwbGljYXRpb24vcGtjcy0xMicsICdhcHBsaWNhdGlvbi94LXBrY3MxMiddXSxcbiAgICBbJ3A3YScsICdhcHBsaWNhdGlvbi94LXBrY3M3LXNpZ25hdHVyZSddLFxuICAgIFsncDdiJywgJ2FwcGxpY2F0aW9uL3gtcGtjczctY2VydGlmaWNhdGVzJ10sXG4gICAgWydwN2MnLCBbJ2FwcGxpY2F0aW9uL3BrY3M3LW1pbWUnLCAnYXBwbGljYXRpb24veC1wa2NzNy1taW1lJ11dLFxuICAgIFsncDdtJywgWydhcHBsaWNhdGlvbi9wa2NzNy1taW1lJywgJ2FwcGxpY2F0aW9uL3gtcGtjczctbWltZSddXSxcbiAgICBbJ3A3cicsICdhcHBsaWNhdGlvbi94LXBrY3M3LWNlcnRyZXFyZXNwJ10sXG4gICAgWydwN3MnLCBbJ2FwcGxpY2F0aW9uL3BrY3M3LXNpZ25hdHVyZScsICdhcHBsaWNhdGlvbi94LXBrY3M3LXNpZ25hdHVyZSddXSxcbiAgICBbJ3A4JywgJ2FwcGxpY2F0aW9uL3BrY3M4J10sXG4gICAgWydwYXInLCAndGV4dC9wbGFpbi1iYXMnXSxcbiAgICBbJ3BhcnQnLCAnYXBwbGljYXRpb24vcHJvX2VuZyddLFxuICAgIFsncGFzJywgJ3RleHQvcGFzY2FsJ10sXG4gICAgWydwYXcnLCAnYXBwbGljYXRpb24vdm5kLnBhd2FhZmlsZSddLFxuICAgIFsncGJkJywgJ2FwcGxpY2F0aW9uL3ZuZC5wb3dlcmJ1aWxkZXI2J10sXG4gICAgWydwYm0nLCAnaW1hZ2UveC1wb3J0YWJsZS1iaXRtYXAnXSxcbiAgICBbJ3BjZicsICdhcHBsaWNhdGlvbi94LWZvbnQtcGNmJ10sXG4gICAgWydwY2wnLCBbJ2FwcGxpY2F0aW9uL3ZuZC5ocC1wY2wnLCAnYXBwbGljYXRpb24veC1wY2wnXV0sXG4gICAgWydwY2x4bCcsICdhcHBsaWNhdGlvbi92bmQuaHAtcGNseGwnXSxcbiAgICBbJ3BjdCcsICdpbWFnZS94LXBpY3QnXSxcbiAgICBbJ3BjdXJsJywgJ2FwcGxpY2F0aW9uL3ZuZC5jdXJsLnBjdXJsJ10sXG4gICAgWydwY3gnLCAnaW1hZ2UveC1wY3gnXSxcbiAgICBbJ3BkYicsIFsnYXBwbGljYXRpb24vdm5kLnBhbG0nLCAnY2hlbWljYWwveC1wZGInXV0sXG4gICAgWydwZGYnLCAnYXBwbGljYXRpb24vcGRmJ10sXG4gICAgWydwZmEnLCAnYXBwbGljYXRpb24veC1mb250LXR5cGUxJ10sXG4gICAgWydwZnInLCAnYXBwbGljYXRpb24vZm9udC10ZHBmciddLFxuICAgIFsncGZ1bmsnLCBbJ2F1ZGlvL21ha2UnLCAnYXVkaW8vbWFrZS5teS5mdW5rJ11dLFxuICAgIFsncGZ4JywgJ2FwcGxpY2F0aW9uL3gtcGtjczEyJ10sXG4gICAgWydwZ20nLCBbJ2ltYWdlL3gtcG9ydGFibGUtZ3JheW1hcCcsICdpbWFnZS94LXBvcnRhYmxlLWdyZXltYXAnXV0sXG4gICAgWydwZ24nLCAnYXBwbGljYXRpb24veC1jaGVzcy1wZ24nXSxcbiAgICBbJ3BncCcsICdhcHBsaWNhdGlvbi9wZ3Atc2lnbmF0dXJlJ10sXG4gICAgWydwaWMnLCBbJ2ltYWdlL3BpY3QnLCAnaW1hZ2UveC1waWN0J11dLFxuICAgIFsncGljdCcsICdpbWFnZS9waWN0J10sXG4gICAgWydwa2cnLCAnYXBwbGljYXRpb24veC1uZXd0b24tY29tcGF0aWJsZS1wa2cnXSxcbiAgICBbJ3BraScsICdhcHBsaWNhdGlvbi9wa2l4Y21wJ10sXG4gICAgWydwa2lwYXRoJywgJ2FwcGxpY2F0aW9uL3BraXgtcGtpcGF0aCddLFxuICAgIFsncGtvJywgWydhcHBsaWNhdGlvbi95bmQubXMtcGtpcGtvJywgJ2FwcGxpY2F0aW9uL3ZuZC5tcy1wa2kucGtvJ11dLFxuICAgIFsncGwnLCBbJ3RleHQvcGxhaW4nLCAndGV4dC94LXNjcmlwdC5wZXJsJ11dLFxuICAgIFsncGxiJywgJ2FwcGxpY2F0aW9uL3ZuZC4zZ3BwLnBpYy1idy1sYXJnZSddLFxuICAgIFsncGxjJywgJ2FwcGxpY2F0aW9uL3ZuZC5tb2JpdXMucGxjJ10sXG4gICAgWydwbGYnLCAnYXBwbGljYXRpb24vdm5kLnBvY2tldGxlYXJuJ10sXG4gICAgWydwbHMnLCAnYXBwbGljYXRpb24vcGxzK3htbCddLFxuICAgIFsncGx4JywgJ2FwcGxpY2F0aW9uL3gtcGl4Y2xzY3JpcHQnXSxcbiAgICBbJ3BtJywgWyd0ZXh0L3gtc2NyaXB0LnBlcmwtbW9kdWxlJywgJ2ltYWdlL3gteHBpeG1hcCddXSxcbiAgICBbJ3BtNCcsICdhcHBsaWNhdGlvbi94LXBhZ2VtYWtlciddLFxuICAgIFsncG01JywgJ2FwcGxpY2F0aW9uL3gtcGFnZW1ha2VyJ10sXG4gICAgWydwbWEnLCAnYXBwbGljYXRpb24veC1wZXJmbW9uJ10sXG4gICAgWydwbWMnLCAnYXBwbGljYXRpb24veC1wZXJmbW9uJ10sXG4gICAgWydwbWwnLCBbJ2FwcGxpY2F0aW9uL3ZuZC5jdGMtcG9zbWwnLCAnYXBwbGljYXRpb24veC1wZXJmbW9uJ11dLFxuICAgIFsncG1yJywgJ2FwcGxpY2F0aW9uL3gtcGVyZm1vbiddLFxuICAgIFsncG13JywgJ2FwcGxpY2F0aW9uL3gtcGVyZm1vbiddLFxuICAgIFsncG5nJywgJ2ltYWdlL3BuZyddLFxuICAgIFsncG5tJywgWydhcHBsaWNhdGlvbi94LXBvcnRhYmxlLWFueW1hcCcsICdpbWFnZS94LXBvcnRhYmxlLWFueW1hcCddXSxcbiAgICBbJ3BvcnRwa2cnLCAnYXBwbGljYXRpb24vdm5kLm1hY3BvcnRzLnBvcnRwa2cnXSxcbiAgICBbJ3BvdCcsIFsnYXBwbGljYXRpb24vdm5kLm1zLXBvd2VycG9pbnQnLCAnYXBwbGljYXRpb24vbXNwb3dlcnBvaW50J11dLFxuICAgIFsncG90bScsICdhcHBsaWNhdGlvbi92bmQubXMtcG93ZXJwb2ludC50ZW1wbGF0ZS5tYWNyb2VuYWJsZWQuMTInXSxcbiAgICBbJ3BvdHgnLCAnYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LnByZXNlbnRhdGlvbm1sLnRlbXBsYXRlJ10sXG4gICAgWydwb3YnLCAnbW9kZWwveC1wb3YnXSxcbiAgICBbJ3BwYScsICdhcHBsaWNhdGlvbi92bmQubXMtcG93ZXJwb2ludCddLFxuICAgIFsncHBhbScsICdhcHBsaWNhdGlvbi92bmQubXMtcG93ZXJwb2ludC5hZGRpbi5tYWNyb2VuYWJsZWQuMTInXSxcbiAgICBbJ3BwZCcsICdhcHBsaWNhdGlvbi92bmQuY3Vwcy1wcGQnXSxcbiAgICBbJ3BwbScsICdpbWFnZS94LXBvcnRhYmxlLXBpeG1hcCddLFxuICAgIFsncHBzJywgWydhcHBsaWNhdGlvbi92bmQubXMtcG93ZXJwb2ludCcsICdhcHBsaWNhdGlvbi9tc3Bvd2VycG9pbnQnXV0sXG4gICAgWydwcHNtJywgJ2FwcGxpY2F0aW9uL3ZuZC5tcy1wb3dlcnBvaW50LnNsaWRlc2hvdy5tYWNyb2VuYWJsZWQuMTInXSxcbiAgICBbJ3Bwc3gnLCAnYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LnByZXNlbnRhdGlvbm1sLnNsaWRlc2hvdyddLFxuICAgIFsncHB0JywgWydhcHBsaWNhdGlvbi92bmQubXMtcG93ZXJwb2ludCcsICdhcHBsaWNhdGlvbi9tc3Bvd2VycG9pbnQnLCAnYXBwbGljYXRpb24vcG93ZXJwb2ludCcsICdhcHBsaWNhdGlvbi94LW1zcG93ZXJwb2ludCddXSxcbiAgICBbJ3BwdG0nLCAnYXBwbGljYXRpb24vdm5kLm1zLXBvd2VycG9pbnQucHJlc2VudGF0aW9uLm1hY3JvZW5hYmxlZC4xMiddLFxuICAgIFsncHB0eCcsICdhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQucHJlc2VudGF0aW9ubWwucHJlc2VudGF0aW9uJ10sXG4gICAgWydwcHonLCAnYXBwbGljYXRpb24vbXNwb3dlcnBvaW50J10sXG4gICAgWydwcmMnLCAnYXBwbGljYXRpb24veC1tb2JpcG9ja2V0LWVib29rJ10sXG4gICAgWydwcmUnLCBbJ2FwcGxpY2F0aW9uL3ZuZC5sb3R1cy1mcmVlbGFuY2UnLCAnYXBwbGljYXRpb24veC1mcmVlbGFuY2UnXV0sXG4gICAgWydwcmYnLCAnYXBwbGljYXRpb24vcGljcy1ydWxlcyddLFxuICAgIFsncHJ0JywgJ2FwcGxpY2F0aW9uL3Byb19lbmcnXSxcbiAgICBbJ3BzJywgJ2FwcGxpY2F0aW9uL3Bvc3RzY3JpcHQnXSxcbiAgICBbJ3BzYicsICdhcHBsaWNhdGlvbi92bmQuM2dwcC5waWMtYnctc21hbGwnXSxcbiAgICBbJ3BzZCcsIFsnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJywgJ2ltYWdlL3ZuZC5hZG9iZS5waG90b3Nob3AnXV0sXG4gICAgWydwc2YnLCAnYXBwbGljYXRpb24veC1mb250LWxpbnV4LXBzZiddLFxuICAgIFsncHNrY3htbCcsICdhcHBsaWNhdGlvbi9wc2tjK3htbCddLFxuICAgIFsncHRpZCcsICdhcHBsaWNhdGlvbi92bmQucHZpLnB0aWQxJ10sXG4gICAgWydwdWInLCAnYXBwbGljYXRpb24veC1tc3B1Ymxpc2hlciddLFxuICAgIFsncHZiJywgJ2FwcGxpY2F0aW9uL3ZuZC4zZ3BwLnBpYy1idy12YXInXSxcbiAgICBbJ3B2dScsICdwYWxlb3Z1L3gtcHYnXSxcbiAgICBbJ3B3bicsICdhcHBsaWNhdGlvbi92bmQuM20ucG9zdC1pdC1ub3RlcyddLFxuICAgIFsncHd6JywgJ2FwcGxpY2F0aW9uL3ZuZC5tcy1wb3dlcnBvaW50J10sXG4gICAgWydweScsICd0ZXh0L3gtc2NyaXB0LnBoeXRvbiddLFxuICAgIFsncHlhJywgJ2F1ZGlvL3ZuZC5tcy1wbGF5cmVhZHkubWVkaWEucHlhJ10sXG4gICAgWydweWMnLCAnYXBwbGljYXRpb24veC1ieXRlY29kZS5weXRob24nXSxcbiAgICBbJ3B5dicsICd2aWRlby92bmQubXMtcGxheXJlYWR5Lm1lZGlhLnB5diddLFxuICAgIFsncWFtJywgJ2FwcGxpY2F0aW9uL3ZuZC5lcHNvbi5xdWlja2FuaW1lJ10sXG4gICAgWydxYm8nLCAnYXBwbGljYXRpb24vdm5kLmludHUucWJvJ10sXG4gICAgWydxY3AnLCAnYXVkaW8vdm5kLnFjZWxwJ10sXG4gICAgWydxZDMnLCAneC13b3JsZC94LTNkbWYnXSxcbiAgICBbJ3FkM2QnLCAneC13b3JsZC94LTNkbWYnXSxcbiAgICBbJ3FmeCcsICdhcHBsaWNhdGlvbi92bmQuaW50dS5xZngnXSxcbiAgICBbJ3FpZicsICdpbWFnZS94LXF1aWNrdGltZSddLFxuICAgIFsncXBzJywgJ2FwcGxpY2F0aW9uL3ZuZC5wdWJsaXNoYXJlLWRlbHRhLXRyZWUnXSxcbiAgICBbJ3F0JywgJ3ZpZGVvL3F1aWNrdGltZSddLFxuICAgIFsncXRjJywgJ3ZpZGVvL3gtcXRjJ10sXG4gICAgWydxdGknLCAnaW1hZ2UveC1xdWlja3RpbWUnXSxcbiAgICBbJ3F0aWYnLCAnaW1hZ2UveC1xdWlja3RpbWUnXSxcbiAgICBbJ3F4ZCcsICdhcHBsaWNhdGlvbi92bmQucXVhcmsucXVhcmt4cHJlc3MnXSxcbiAgICBbJ3JhJywgWydhdWRpby94LXJlYWxhdWRpbycsICdhdWRpby94LXBuLXJlYWxhdWRpbycsICdhdWRpby94LXBuLXJlYWxhdWRpby1wbHVnaW4nXV0sXG4gICAgWydyYW0nLCAnYXVkaW8veC1wbi1yZWFsYXVkaW8nXSxcbiAgICBbJ3JhcicsICdhcHBsaWNhdGlvbi94LXJhci1jb21wcmVzc2VkJ10sXG4gICAgWydyYXMnLCBbJ2ltYWdlL2NtdS1yYXN0ZXInLCAnYXBwbGljYXRpb24veC1jbXUtcmFzdGVyJywgJ2ltYWdlL3gtY211LXJhc3RlciddXSxcbiAgICBbJ3Jhc3QnLCAnaW1hZ2UvY211LXJhc3RlciddLFxuICAgIFsncmNwcm9maWxlJywgJ2FwcGxpY2F0aW9uL3ZuZC5pcHVucGx1Z2dlZC5yY3Byb2ZpbGUnXSxcbiAgICBbJ3JkZicsICdhcHBsaWNhdGlvbi9yZGYreG1sJ10sXG4gICAgWydyZHonLCAnYXBwbGljYXRpb24vdm5kLmRhdGEtdmlzaW9uLnJkeiddLFxuICAgIFsncmVwJywgJ2FwcGxpY2F0aW9uL3ZuZC5idXNpbmVzc29iamVjdHMnXSxcbiAgICBbJ3JlcycsICdhcHBsaWNhdGlvbi94LWR0YnJlc291cmNlK3htbCddLFxuICAgIFsncmV4eCcsICd0ZXh0L3gtc2NyaXB0LnJleHgnXSxcbiAgICBbJ3JmJywgJ2ltYWdlL3ZuZC5ybi1yZWFsZmxhc2gnXSxcbiAgICBbJ3JnYicsICdpbWFnZS94LXJnYiddLFxuICAgIFsncmlmJywgJ2FwcGxpY2F0aW9uL3JlZ2luZm8reG1sJ10sXG4gICAgWydyaXAnLCAnYXVkaW8vdm5kLnJpcCddLFxuICAgIFsncmwnLCAnYXBwbGljYXRpb24vcmVzb3VyY2UtbGlzdHMreG1sJ10sXG4gICAgWydybGMnLCAnaW1hZ2Uvdm5kLmZ1aml4ZXJveC5lZG1pY3MtcmxjJ10sXG4gICAgWydybGQnLCAnYXBwbGljYXRpb24vcmVzb3VyY2UtbGlzdHMtZGlmZit4bWwnXSxcbiAgICBbJ3JtJywgWydhcHBsaWNhdGlvbi92bmQucm4tcmVhbG1lZGlhJywgJ2F1ZGlvL3gtcG4tcmVhbGF1ZGlvJ11dLFxuICAgIFsncm1pJywgJ2F1ZGlvL21pZCddLFxuICAgIFsncm1tJywgJ2F1ZGlvL3gtcG4tcmVhbGF1ZGlvJ10sXG4gICAgWydybXAnLCBbJ2F1ZGlvL3gtcG4tcmVhbGF1ZGlvLXBsdWdpbicsICdhdWRpby94LXBuLXJlYWxhdWRpbyddXSxcbiAgICBbJ3JtcycsICdhcHBsaWNhdGlvbi92bmQuamNwLmphdmFtZS5taWRsZXQtcm1zJ10sXG4gICAgWydybmMnLCAnYXBwbGljYXRpb24vcmVsYXgtbmctY29tcGFjdC1zeW50YXgnXSxcbiAgICBbJ3JuZycsIFsnYXBwbGljYXRpb24vcmluZ2luZy10b25lcycsICdhcHBsaWNhdGlvbi92bmQubm9raWEucmluZ2luZy10b25lJ11dLFxuICAgIFsncm54JywgJ2FwcGxpY2F0aW9uL3ZuZC5ybi1yZWFscGxheWVyJ10sXG4gICAgWydyb2ZmJywgJ2FwcGxpY2F0aW9uL3gtdHJvZmYnXSxcbiAgICBbJ3JwJywgJ2ltYWdlL3ZuZC5ybi1yZWFscGl4J10sXG4gICAgWydycDknLCAnYXBwbGljYXRpb24vdm5kLmNsb2FudG8ucnA5J10sXG4gICAgWydycG0nLCAnYXVkaW8veC1wbi1yZWFsYXVkaW8tcGx1Z2luJ10sXG4gICAgWydycHNzJywgJ2FwcGxpY2F0aW9uL3ZuZC5ub2tpYS5yYWRpby1wcmVzZXRzJ10sXG4gICAgWydycHN0JywgJ2FwcGxpY2F0aW9uL3ZuZC5ub2tpYS5yYWRpby1wcmVzZXQnXSxcbiAgICBbJ3JxJywgJ2FwcGxpY2F0aW9uL3NwYXJxbC1xdWVyeSddLFxuICAgIFsncnMnLCAnYXBwbGljYXRpb24vcmxzLXNlcnZpY2VzK3htbCddLFxuICAgIFsncnNkJywgJ2FwcGxpY2F0aW9uL3JzZCt4bWwnXSxcbiAgICBbJ3J0JywgWyd0ZXh0L3JpY2h0ZXh0JywgJ3RleHQvdm5kLnJuLXJlYWx0ZXh0J11dLFxuICAgIFsncnRmJywgWydhcHBsaWNhdGlvbi9ydGYnLCAndGV4dC9yaWNodGV4dCcsICdhcHBsaWNhdGlvbi94LXJ0ZiddXSxcbiAgICBbJ3J0eCcsIFsndGV4dC9yaWNodGV4dCcsICdhcHBsaWNhdGlvbi9ydGYnXV0sXG4gICAgWydydicsICd2aWRlby92bmQucm4tcmVhbHZpZGVvJ10sXG4gICAgWydzJywgJ3RleHQveC1hc20nXSxcbiAgICBbJ3MzbScsICdhdWRpby9zM20nXSxcbiAgICBbJ3NhZicsICdhcHBsaWNhdGlvbi92bmQueWFtYWhhLnNtYWYtYXVkaW8nXSxcbiAgICBbJ3NhdmVtZScsICdhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nXSxcbiAgICBbJ3NiaycsICdhcHBsaWNhdGlvbi94LXRib29rJ10sXG4gICAgWydzYm1sJywgJ2FwcGxpY2F0aW9uL3NibWwreG1sJ10sXG4gICAgWydzYycsICdhcHBsaWNhdGlvbi92bmQuaWJtLnNlY3VyZS1jb250YWluZXInXSxcbiAgICBbJ3NjZCcsICdhcHBsaWNhdGlvbi94LW1zc2NoZWR1bGUnXSxcbiAgICBbXG4gICAgICAgICdzY20nLFxuICAgICAgICBbJ2FwcGxpY2F0aW9uL3ZuZC5sb3R1cy1zY3JlZW5jYW0nLCAndmlkZW8veC1zY20nLCAndGV4dC94LXNjcmlwdC5ndWlsZScsICdhcHBsaWNhdGlvbi94LWxvdHVzc2NyZWVuY2FtJywgJ3RleHQveC1zY3JpcHQuc2NoZW1lJ11cbiAgICBdLFxuICAgIFsnc2NxJywgJ2FwcGxpY2F0aW9uL3NjdnAtY3YtcmVxdWVzdCddLFxuICAgIFsnc2NzJywgJ2FwcGxpY2F0aW9uL3NjdnAtY3YtcmVzcG9uc2UnXSxcbiAgICBbJ3NjdCcsICd0ZXh0L3NjcmlwdGxldCddLFxuICAgIFsnc2N1cmwnLCAndGV4dC92bmQuY3VybC5zY3VybCddLFxuICAgIFsnc2RhJywgJ2FwcGxpY2F0aW9uL3ZuZC5zdGFyZGl2aXNpb24uZHJhdyddLFxuICAgIFsnc2RjJywgJ2FwcGxpY2F0aW9uL3ZuZC5zdGFyZGl2aXNpb24uY2FsYyddLFxuICAgIFsnc2RkJywgJ2FwcGxpY2F0aW9uL3ZuZC5zdGFyZGl2aXNpb24uaW1wcmVzcyddLFxuICAgIFsnc2RrbScsICdhcHBsaWNhdGlvbi92bmQuc29sZW50LnNka20reG1sJ10sXG4gICAgWydzZG1sJywgJ3RleHQvcGxhaW4nXSxcbiAgICBbJ3NkcCcsIFsnYXBwbGljYXRpb24vc2RwJywgJ2FwcGxpY2F0aW9uL3gtc2RwJ11dLFxuICAgIFsnc2RyJywgJ2FwcGxpY2F0aW9uL3NvdW5kZXInXSxcbiAgICBbJ3NkdycsICdhcHBsaWNhdGlvbi92bmQuc3RhcmRpdmlzaW9uLndyaXRlciddLFxuICAgIFsnc2VhJywgWydhcHBsaWNhdGlvbi9zZWEnLCAnYXBwbGljYXRpb24veC1zZWEnXV0sXG4gICAgWydzZWUnLCAnYXBwbGljYXRpb24vdm5kLnNlZW1haWwnXSxcbiAgICBbJ3NlZWQnLCAnYXBwbGljYXRpb24vdm5kLmZkc24uc2VlZCddLFxuICAgIFsnc2VtYScsICdhcHBsaWNhdGlvbi92bmQuc2VtYSddLFxuICAgIFsnc2VtZCcsICdhcHBsaWNhdGlvbi92bmQuc2VtZCddLFxuICAgIFsnc2VtZicsICdhcHBsaWNhdGlvbi92bmQuc2VtZiddLFxuICAgIFsnc2VyJywgJ2FwcGxpY2F0aW9uL2phdmEtc2VyaWFsaXplZC1vYmplY3QnXSxcbiAgICBbJ3NldCcsICdhcHBsaWNhdGlvbi9zZXQnXSxcbiAgICBbJ3NldHBheScsICdhcHBsaWNhdGlvbi9zZXQtcGF5bWVudC1pbml0aWF0aW9uJ10sXG4gICAgWydzZXRyZWcnLCAnYXBwbGljYXRpb24vc2V0LXJlZ2lzdHJhdGlvbi1pbml0aWF0aW9uJ10sXG4gICAgWydzZmQtaGRzdHgnLCAnYXBwbGljYXRpb24vdm5kLmh5ZHJvc3RhdGl4LnNvZi1kYXRhJ10sXG4gICAgWydzZnMnLCAnYXBwbGljYXRpb24vdm5kLnNwb3RmaXJlLnNmcyddLFxuICAgIFsnc2dsJywgJ2FwcGxpY2F0aW9uL3ZuZC5zdGFyZGl2aXNpb24ud3JpdGVyLWdsb2JhbCddLFxuICAgIFsnc2dtJywgWyd0ZXh0L3NnbWwnLCAndGV4dC94LXNnbWwnXV0sXG4gICAgWydzZ21sJywgWyd0ZXh0L3NnbWwnLCAndGV4dC94LXNnbWwnXV0sXG4gICAgWydzaCcsIFsnYXBwbGljYXRpb24veC1zaGFyJywgJ2FwcGxpY2F0aW9uL3gtYnNoJywgJ2FwcGxpY2F0aW9uL3gtc2gnLCAndGV4dC94LXNjcmlwdC5zaCddXSxcbiAgICBbJ3NoYXInLCBbJ2FwcGxpY2F0aW9uL3gtYnNoJywgJ2FwcGxpY2F0aW9uL3gtc2hhciddXSxcbiAgICBbJ3NoZicsICdhcHBsaWNhdGlvbi9zaGYreG1sJ10sXG4gICAgWydzaHRtbCcsIFsndGV4dC9odG1sJywgJ3RleHQveC1zZXJ2ZXItcGFyc2VkLWh0bWwnXV0sXG4gICAgWydzaWQnLCAnYXVkaW8veC1wc2lkJ10sXG4gICAgWydzaXMnLCAnYXBwbGljYXRpb24vdm5kLnN5bWJpYW4uaW5zdGFsbCddLFxuICAgIFsnc2l0JywgWydhcHBsaWNhdGlvbi94LXN0dWZmaXQnLCAnYXBwbGljYXRpb24veC1zaXQnXV0sXG4gICAgWydzaXR4JywgJ2FwcGxpY2F0aW9uL3gtc3R1ZmZpdHgnXSxcbiAgICBbJ3NrZCcsICdhcHBsaWNhdGlvbi94LWtvYW4nXSxcbiAgICBbJ3NrbScsICdhcHBsaWNhdGlvbi94LWtvYW4nXSxcbiAgICBbJ3NrcCcsIFsnYXBwbGljYXRpb24vdm5kLmtvYW4nLCAnYXBwbGljYXRpb24veC1rb2FuJ11dLFxuICAgIFsnc2t0JywgJ2FwcGxpY2F0aW9uL3gta29hbiddLFxuICAgIFsnc2wnLCAnYXBwbGljYXRpb24veC1zZWVsb2dvJ10sXG4gICAgWydzbGRtJywgJ2FwcGxpY2F0aW9uL3ZuZC5tcy1wb3dlcnBvaW50LnNsaWRlLm1hY3JvZW5hYmxlZC4xMiddLFxuICAgIFsnc2xkeCcsICdhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQucHJlc2VudGF0aW9ubWwuc2xpZGUnXSxcbiAgICBbJ3NsdCcsICdhcHBsaWNhdGlvbi92bmQuZXBzb24uc2FsdCddLFxuICAgIFsnc20nLCAnYXBwbGljYXRpb24vdm5kLnN0ZXBtYW5pYS5zdGVwY2hhcnQnXSxcbiAgICBbJ3NtZicsICdhcHBsaWNhdGlvbi92bmQuc3RhcmRpdmlzaW9uLm1hdGgnXSxcbiAgICBbJ3NtaScsIFsnYXBwbGljYXRpb24vc21pbCcsICdhcHBsaWNhdGlvbi9zbWlsK3htbCddXSxcbiAgICBbJ3NtaWwnLCAnYXBwbGljYXRpb24vc21pbCddLFxuICAgIFsnc25kJywgWydhdWRpby9iYXNpYycsICdhdWRpby94LWFkcGNtJ11dLFxuICAgIFsnc25mJywgJ2FwcGxpY2F0aW9uL3gtZm9udC1zbmYnXSxcbiAgICBbJ3NvbCcsICdhcHBsaWNhdGlvbi9zb2xpZHMnXSxcbiAgICBbJ3NwYycsIFsndGV4dC94LXNwZWVjaCcsICdhcHBsaWNhdGlvbi94LXBrY3M3LWNlcnRpZmljYXRlcyddXSxcbiAgICBbJ3NwZicsICdhcHBsaWNhdGlvbi92bmQueWFtYWhhLnNtYWYtcGhyYXNlJ10sXG4gICAgWydzcGwnLCBbJ2FwcGxpY2F0aW9uL2Z1dHVyZXNwbGFzaCcsICdhcHBsaWNhdGlvbi94LWZ1dHVyZXNwbGFzaCddXSxcbiAgICBbJ3Nwb3QnLCAndGV4dC92bmQuaW4zZC5zcG90J10sXG4gICAgWydzcHAnLCAnYXBwbGljYXRpb24vc2N2cC12cC1yZXNwb25zZSddLFxuICAgIFsnc3BxJywgJ2FwcGxpY2F0aW9uL3NjdnAtdnAtcmVxdWVzdCddLFxuICAgIFsnc3ByJywgJ2FwcGxpY2F0aW9uL3gtc3ByaXRlJ10sXG4gICAgWydzcHJpdGUnLCAnYXBwbGljYXRpb24veC1zcHJpdGUnXSxcbiAgICBbJ3NyYycsICdhcHBsaWNhdGlvbi94LXdhaXMtc291cmNlJ10sXG4gICAgWydzcnUnLCAnYXBwbGljYXRpb24vc3J1K3htbCddLFxuICAgIFsnc3J4JywgJ2FwcGxpY2F0aW9uL3NwYXJxbC1yZXN1bHRzK3htbCddLFxuICAgIFsnc3NlJywgJ2FwcGxpY2F0aW9uL3ZuZC5rb2Rhay1kZXNjcmlwdG9yJ10sXG4gICAgWydzc2YnLCAnYXBwbGljYXRpb24vdm5kLmVwc29uLnNzZiddLFxuICAgIFsnc3NpJywgJ3RleHQveC1zZXJ2ZXItcGFyc2VkLWh0bWwnXSxcbiAgICBbJ3NzbScsICdhcHBsaWNhdGlvbi9zdHJlYW1pbmdtZWRpYSddLFxuICAgIFsnc3NtbCcsICdhcHBsaWNhdGlvbi9zc21sK3htbCddLFxuICAgIFsnc3N0JywgWydhcHBsaWNhdGlvbi92bmQubXMtcGtpY2VydHN0b3JlJywgJ2FwcGxpY2F0aW9uL3ZuZC5tcy1wa2kuY2VydHN0b3JlJ11dLFxuICAgIFsnc3QnLCAnYXBwbGljYXRpb24vdm5kLnNhaWxpbmd0cmFja2VyLnRyYWNrJ10sXG4gICAgWydzdGMnLCAnYXBwbGljYXRpb24vdm5kLnN1bi54bWwuY2FsYy50ZW1wbGF0ZSddLFxuICAgIFsnc3RkJywgJ2FwcGxpY2F0aW9uL3ZuZC5zdW4ueG1sLmRyYXcudGVtcGxhdGUnXSxcbiAgICBbJ3N0ZXAnLCAnYXBwbGljYXRpb24vc3RlcCddLFxuICAgIFsnc3RmJywgJ2FwcGxpY2F0aW9uL3ZuZC53dC5zdGYnXSxcbiAgICBbJ3N0aScsICdhcHBsaWNhdGlvbi92bmQuc3VuLnhtbC5pbXByZXNzLnRlbXBsYXRlJ10sXG4gICAgWydzdGsnLCAnYXBwbGljYXRpb24vaHlwZXJzdHVkaW8nXSxcbiAgICBbJ3N0bCcsIFsnYXBwbGljYXRpb24vdm5kLm1zLXBraXN0bCcsICdhcHBsaWNhdGlvbi9zbGEnLCAnYXBwbGljYXRpb24vdm5kLm1zLXBraS5zdGwnLCAnYXBwbGljYXRpb24veC1uYXZpc3R5bGUnXV0sXG4gICAgWydzdG0nLCAndGV4dC9odG1sJ10sXG4gICAgWydzdHAnLCAnYXBwbGljYXRpb24vc3RlcCddLFxuICAgIFsnc3RyJywgJ2FwcGxpY2F0aW9uL3ZuZC5wZy5mb3JtYXQnXSxcbiAgICBbJ3N0dycsICdhcHBsaWNhdGlvbi92bmQuc3VuLnhtbC53cml0ZXIudGVtcGxhdGUnXSxcbiAgICBbJ3N1YicsICdpbWFnZS92bmQuZHZiLnN1YnRpdGxlJ10sXG4gICAgWydzdXMnLCAnYXBwbGljYXRpb24vdm5kLnN1cy1jYWxlbmRhciddLFxuICAgIFsnc3Y0Y3BpbycsICdhcHBsaWNhdGlvbi94LXN2NGNwaW8nXSxcbiAgICBbJ3N2NGNyYycsICdhcHBsaWNhdGlvbi94LXN2NGNyYyddLFxuICAgIFsnc3ZjJywgJ2FwcGxpY2F0aW9uL3ZuZC5kdmIuc2VydmljZSddLFxuICAgIFsnc3ZkJywgJ2FwcGxpY2F0aW9uL3ZuZC5zdmQnXSxcbiAgICBbJ3N2ZicsIFsnaW1hZ2Uvdm5kLmR3ZycsICdpbWFnZS94LWR3ZyddXSxcbiAgICBbJ3N2ZycsICdpbWFnZS9zdmcreG1sJ10sXG4gICAgWydzdnInLCBbJ3gtd29ybGQveC1zdnInLCAnYXBwbGljYXRpb24veC13b3JsZCddXSxcbiAgICBbJ3N3ZicsICdhcHBsaWNhdGlvbi94LXNob2Nrd2F2ZS1mbGFzaCddLFxuICAgIFsnc3dpJywgJ2FwcGxpY2F0aW9uL3ZuZC5hcmlzdGFuZXR3b3Jrcy5zd2knXSxcbiAgICBbJ3N4YycsICdhcHBsaWNhdGlvbi92bmQuc3VuLnhtbC5jYWxjJ10sXG4gICAgWydzeGQnLCAnYXBwbGljYXRpb24vdm5kLnN1bi54bWwuZHJhdyddLFxuICAgIFsnc3hnJywgJ2FwcGxpY2F0aW9uL3ZuZC5zdW4ueG1sLndyaXRlci5nbG9iYWwnXSxcbiAgICBbJ3N4aScsICdhcHBsaWNhdGlvbi92bmQuc3VuLnhtbC5pbXByZXNzJ10sXG4gICAgWydzeG0nLCAnYXBwbGljYXRpb24vdm5kLnN1bi54bWwubWF0aCddLFxuICAgIFsnc3h3JywgJ2FwcGxpY2F0aW9uL3ZuZC5zdW4ueG1sLndyaXRlciddLFxuICAgIFsndCcsIFsndGV4dC90cm9mZicsICdhcHBsaWNhdGlvbi94LXRyb2ZmJ11dLFxuICAgIFsndGFsaycsICd0ZXh0L3gtc3BlZWNoJ10sXG4gICAgWyd0YW8nLCAnYXBwbGljYXRpb24vdm5kLnRhby5pbnRlbnQtbW9kdWxlLWFyY2hpdmUnXSxcbiAgICBbJ3RhcicsICdhcHBsaWNhdGlvbi94LXRhciddLFxuICAgIFsndGJrJywgWydhcHBsaWNhdGlvbi90b29sYm9vaycsICdhcHBsaWNhdGlvbi94LXRib29rJ11dLFxuICAgIFsndGNhcCcsICdhcHBsaWNhdGlvbi92bmQuM2dwcDIudGNhcCddLFxuICAgIFsndGNsJywgWyd0ZXh0L3gtc2NyaXB0LnRjbCcsICdhcHBsaWNhdGlvbi94LXRjbCddXSxcbiAgICBbJ3Rjc2gnLCAndGV4dC94LXNjcmlwdC50Y3NoJ10sXG4gICAgWyd0ZWFjaGVyJywgJ2FwcGxpY2F0aW9uL3ZuZC5zbWFydC50ZWFjaGVyJ10sXG4gICAgWyd0ZWknLCAnYXBwbGljYXRpb24vdGVpK3htbCddLFxuICAgIFsndGV4JywgJ2FwcGxpY2F0aW9uL3gtdGV4J10sXG4gICAgWyd0ZXhpJywgJ2FwcGxpY2F0aW9uL3gtdGV4aW5mbyddLFxuICAgIFsndGV4aW5mbycsICdhcHBsaWNhdGlvbi94LXRleGluZm8nXSxcbiAgICBbJ3RleHQnLCBbJ2FwcGxpY2F0aW9uL3BsYWluJywgJ3RleHQvcGxhaW4nXV0sXG4gICAgWyd0ZmknLCAnYXBwbGljYXRpb24vdGhyYXVkK3htbCddLFxuICAgIFsndGZtJywgJ2FwcGxpY2F0aW9uL3gtdGV4LXRmbSddLFxuICAgIFsndGd6JywgWydhcHBsaWNhdGlvbi9nbnV0YXInLCAnYXBwbGljYXRpb24veC1jb21wcmVzc2VkJ11dLFxuICAgIFsndGhteCcsICdhcHBsaWNhdGlvbi92bmQubXMtb2ZmaWNldGhlbWUnXSxcbiAgICBbJ3RpZicsIFsnaW1hZ2UvdGlmZicsICdpbWFnZS94LXRpZmYnXV0sXG4gICAgWyd0aWZmJywgWydpbWFnZS90aWZmJywgJ2ltYWdlL3gtdGlmZiddXSxcbiAgICBbJ3RtbycsICdhcHBsaWNhdGlvbi92bmQudG1vYmlsZS1saXZldHYnXSxcbiAgICBbJ3RvcnJlbnQnLCAnYXBwbGljYXRpb24veC1iaXR0b3JyZW50J10sXG4gICAgWyd0cGwnLCAnYXBwbGljYXRpb24vdm5kLmdyb292ZS10b29sLXRlbXBsYXRlJ10sXG4gICAgWyd0cHQnLCAnYXBwbGljYXRpb24vdm5kLnRyaWQudHB0J10sXG4gICAgWyd0cicsICdhcHBsaWNhdGlvbi94LXRyb2ZmJ10sXG4gICAgWyd0cmEnLCAnYXBwbGljYXRpb24vdm5kLnRydWVhcHAnXSxcbiAgICBbJ3RybScsICdhcHBsaWNhdGlvbi94LW1zdGVybWluYWwnXSxcbiAgICBbJ3RzZCcsICdhcHBsaWNhdGlvbi90aW1lc3RhbXBlZC1kYXRhJ10sXG4gICAgWyd0c2knLCAnYXVkaW8vdHNwLWF1ZGlvJ10sXG4gICAgWyd0c3AnLCBbJ2FwcGxpY2F0aW9uL2RzcHR5cGUnLCAnYXVkaW8vdHNwbGF5ZXInXV0sXG4gICAgWyd0c3YnLCAndGV4dC90YWItc2VwYXJhdGVkLXZhbHVlcyddLFxuICAgIFsndHRmJywgJ2FwcGxpY2F0aW9uL3gtZm9udC10dGYnXSxcbiAgICBbJ3R0bCcsICd0ZXh0L3R1cnRsZSddLFxuICAgIFsndHVyYm90JywgJ2ltYWdlL2Zsb3JpYW4nXSxcbiAgICBbJ3R3ZCcsICdhcHBsaWNhdGlvbi92bmQuc2ltdGVjaC1taW5kbWFwcGVyJ10sXG4gICAgWyd0eGQnLCAnYXBwbGljYXRpb24vdm5kLmdlbm9tYXRpeC50dXhlZG8nXSxcbiAgICBbJ3R4ZicsICdhcHBsaWNhdGlvbi92bmQubW9iaXVzLnR4ZiddLFxuICAgIFsndHh0JywgJ3RleHQvcGxhaW4nXSxcbiAgICBbJ3VmZCcsICdhcHBsaWNhdGlvbi92bmQudWZkbCddLFxuICAgIFsndWlsJywgJ3RleHQveC11aWwnXSxcbiAgICBbJ3VscycsICd0ZXh0L2l1bHMnXSxcbiAgICBbJ3VtaicsICdhcHBsaWNhdGlvbi92bmQudW1hamluJ10sXG4gICAgWyd1bmknLCAndGV4dC91cmktbGlzdCddLFxuICAgIFsndW5pcycsICd0ZXh0L3VyaS1saXN0J10sXG4gICAgWyd1bml0eXdlYicsICdhcHBsaWNhdGlvbi92bmQudW5pdHknXSxcbiAgICBbJ3VudicsICdhcHBsaWNhdGlvbi9pLWRlYXMnXSxcbiAgICBbJ3VvbWwnLCAnYXBwbGljYXRpb24vdm5kLnVvbWwreG1sJ10sXG4gICAgWyd1cmknLCAndGV4dC91cmktbGlzdCddLFxuICAgIFsndXJpcycsICd0ZXh0L3VyaS1saXN0J10sXG4gICAgWyd1c3RhcicsIFsnYXBwbGljYXRpb24veC11c3RhcicsICdtdWx0aXBhcnQveC11c3RhciddXSxcbiAgICBbJ3V0eicsICdhcHBsaWNhdGlvbi92bmQudWlxLnRoZW1lJ10sXG4gICAgWyd1dScsIFsnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJywgJ3RleHQveC11dWVuY29kZSddXSxcbiAgICBbJ3V1ZScsICd0ZXh0L3gtdXVlbmNvZGUnXSxcbiAgICBbJ3V2YScsICdhdWRpby92bmQuZGVjZS5hdWRpbyddLFxuICAgIFsndXZoJywgJ3ZpZGVvL3ZuZC5kZWNlLmhkJ10sXG4gICAgWyd1dmknLCAnaW1hZ2Uvdm5kLmRlY2UuZ3JhcGhpYyddLFxuICAgIFsndXZtJywgJ3ZpZGVvL3ZuZC5kZWNlLm1vYmlsZSddLFxuICAgIFsndXZwJywgJ3ZpZGVvL3ZuZC5kZWNlLnBkJ10sXG4gICAgWyd1dnMnLCAndmlkZW8vdm5kLmRlY2Uuc2QnXSxcbiAgICBbJ3V2dScsICd2aWRlby92bmQudXZ2dS5tcDQnXSxcbiAgICBbJ3V2dicsICd2aWRlby92bmQuZGVjZS52aWRlbyddLFxuICAgIFsndmNkJywgJ2FwcGxpY2F0aW9uL3gtY2RsaW5rJ10sXG4gICAgWyd2Y2YnLCAndGV4dC94LXZjYXJkJ10sXG4gICAgWyd2Y2cnLCAnYXBwbGljYXRpb24vdm5kLmdyb292ZS12Y2FyZCddLFxuICAgIFsndmNzJywgJ3RleHQveC12Y2FsZW5kYXInXSxcbiAgICBbJ3ZjeCcsICdhcHBsaWNhdGlvbi92bmQudmN4J10sXG4gICAgWyd2ZGEnLCAnYXBwbGljYXRpb24vdmRhJ10sXG4gICAgWyd2ZG8nLCAndmlkZW8vdmRvJ10sXG4gICAgWyd2ZXcnLCAnYXBwbGljYXRpb24vZ3JvdXB3aXNlJ10sXG4gICAgWyd2aXMnLCAnYXBwbGljYXRpb24vdm5kLnZpc2lvbmFyeSddLFxuICAgIFsndml2JywgWyd2aWRlby92aXZvJywgJ3ZpZGVvL3ZuZC52aXZvJ11dLFxuICAgIFsndml2bycsIFsndmlkZW8vdml2bycsICd2aWRlby92bmQudml2byddXSxcbiAgICBbJ3ZtZCcsICdhcHBsaWNhdGlvbi92b2NhbHRlYy1tZWRpYS1kZXNjJ10sXG4gICAgWyd2bWYnLCAnYXBwbGljYXRpb24vdm9jYWx0ZWMtbWVkaWEtZmlsZSddLFxuICAgIFsndm9jJywgWydhdWRpby92b2MnLCAnYXVkaW8veC12b2MnXV0sXG4gICAgWyd2b3MnLCAndmlkZW8vdm9zYWljJ10sXG4gICAgWyd2b3gnLCAnYXVkaW8vdm94d2FyZSddLFxuICAgIFsndnFlJywgJ2F1ZGlvL3gtdHdpbnZxLXBsdWdpbiddLFxuICAgIFsndnFmJywgJ2F1ZGlvL3gtdHdpbnZxJ10sXG4gICAgWyd2cWwnLCAnYXVkaW8veC10d2ludnEtcGx1Z2luJ10sXG4gICAgWyd2cm1sJywgWydtb2RlbC92cm1sJywgJ3gtd29ybGQveC12cm1sJywgJ2FwcGxpY2F0aW9uL3gtdnJtbCddXSxcbiAgICBbJ3ZydCcsICd4LXdvcmxkL3gtdnJ0J10sXG4gICAgWyd2c2QnLCBbJ2FwcGxpY2F0aW9uL3ZuZC52aXNpbycsICdhcHBsaWNhdGlvbi94LXZpc2lvJ11dLFxuICAgIFsndnNmJywgJ2FwcGxpY2F0aW9uL3ZuZC52c2YnXSxcbiAgICBbJ3ZzdCcsICdhcHBsaWNhdGlvbi94LXZpc2lvJ10sXG4gICAgWyd2c3cnLCAnYXBwbGljYXRpb24veC12aXNpbyddLFxuICAgIFsndnR1JywgJ21vZGVsL3ZuZC52dHUnXSxcbiAgICBbJ3Z4bWwnLCAnYXBwbGljYXRpb24vdm9pY2V4bWwreG1sJ10sXG4gICAgWyd3NjAnLCAnYXBwbGljYXRpb24vd29yZHBlcmZlY3Q2LjAnXSxcbiAgICBbJ3c2MScsICdhcHBsaWNhdGlvbi93b3JkcGVyZmVjdDYuMSddLFxuICAgIFsndzZ3JywgJ2FwcGxpY2F0aW9uL21zd29yZCddLFxuICAgIFsnd2FkJywgJ2FwcGxpY2F0aW9uL3gtZG9vbSddLFxuICAgIFsnd2F2JywgWydhdWRpby93YXYnLCAnYXVkaW8veC13YXYnXV0sXG4gICAgWyd3YXgnLCAnYXVkaW8veC1tcy13YXgnXSxcbiAgICBbJ3diMScsICdhcHBsaWNhdGlvbi94LXFwcm8nXSxcbiAgICBbJ3dibXAnLCAnaW1hZ2Uvdm5kLndhcC53Ym1wJ10sXG4gICAgWyd3YnMnLCAnYXBwbGljYXRpb24vdm5kLmNyaXRpY2FsdG9vbHMud2JzK3htbCddLFxuICAgIFsnd2J4bWwnLCAnYXBwbGljYXRpb24vdm5kLndhcC53YnhtbCddLFxuICAgIFsnd2NtJywgJ2FwcGxpY2F0aW9uL3ZuZC5tcy13b3JrcyddLFxuICAgIFsnd2RiJywgJ2FwcGxpY2F0aW9uL3ZuZC5tcy13b3JrcyddLFxuICAgIFsnd2ViJywgJ2FwcGxpY2F0aW9uL3ZuZC54YXJhJ10sXG4gICAgWyd3ZWJhJywgJ2F1ZGlvL3dlYm0nXSxcbiAgICBbJ3dlYm0nLCAndmlkZW8vd2VibSddLFxuICAgIFsnd2VicCcsICdpbWFnZS93ZWJwJ10sXG4gICAgWyd3ZycsICdhcHBsaWNhdGlvbi92bmQucG1pLndpZGdldCddLFxuICAgIFsnd2d0JywgJ2FwcGxpY2F0aW9uL3dpZGdldCddLFxuICAgIFsnd2l6JywgJ2FwcGxpY2F0aW9uL21zd29yZCddLFxuICAgIFsnd2sxJywgJ2FwcGxpY2F0aW9uL3gtMTIzJ10sXG4gICAgWyd3a3MnLCAnYXBwbGljYXRpb24vdm5kLm1zLXdvcmtzJ10sXG4gICAgWyd3bScsICd2aWRlby94LW1zLXdtJ10sXG4gICAgWyd3bWEnLCAnYXVkaW8veC1tcy13bWEnXSxcbiAgICBbJ3dtZCcsICdhcHBsaWNhdGlvbi94LW1zLXdtZCddLFxuICAgIFsnd21mJywgWyd3aW5kb3dzL21ldGFmaWxlJywgJ2FwcGxpY2F0aW9uL3gtbXNtZXRhZmlsZSddXSxcbiAgICBbJ3dtbCcsICd0ZXh0L3ZuZC53YXAud21sJ10sXG4gICAgWyd3bWxjJywgJ2FwcGxpY2F0aW9uL3ZuZC53YXAud21sYyddLFxuICAgIFsnd21scycsICd0ZXh0L3ZuZC53YXAud21sc2NyaXB0J10sXG4gICAgWyd3bWxzYycsICdhcHBsaWNhdGlvbi92bmQud2FwLndtbHNjcmlwdGMnXSxcbiAgICBbJ3dtdicsICd2aWRlby94LW1zLXdtdiddLFxuICAgIFsnd214JywgJ3ZpZGVvL3gtbXMtd214J10sXG4gICAgWyd3bXonLCAnYXBwbGljYXRpb24veC1tcy13bXonXSxcbiAgICBbJ3dvZmYnLCAnYXBwbGljYXRpb24veC1mb250LXdvZmYnXSxcbiAgICBbJ3dvcmQnLCAnYXBwbGljYXRpb24vbXN3b3JkJ10sXG4gICAgWyd3cCcsICdhcHBsaWNhdGlvbi93b3JkcGVyZmVjdCddLFxuICAgIFsnd3A1JywgWydhcHBsaWNhdGlvbi93b3JkcGVyZmVjdCcsICdhcHBsaWNhdGlvbi93b3JkcGVyZmVjdDYuMCddXSxcbiAgICBbJ3dwNicsICdhcHBsaWNhdGlvbi93b3JkcGVyZmVjdCddLFxuICAgIFsnd3BkJywgWydhcHBsaWNhdGlvbi93b3JkcGVyZmVjdCcsICdhcHBsaWNhdGlvbi92bmQud29yZHBlcmZlY3QnLCAnYXBwbGljYXRpb24veC13cHdpbiddXSxcbiAgICBbJ3dwbCcsICdhcHBsaWNhdGlvbi92bmQubXMtd3BsJ10sXG4gICAgWyd3cHMnLCAnYXBwbGljYXRpb24vdm5kLm1zLXdvcmtzJ10sXG4gICAgWyd3cTEnLCAnYXBwbGljYXRpb24veC1sb3R1cyddLFxuICAgIFsnd3FkJywgJ2FwcGxpY2F0aW9uL3ZuZC53cWQnXSxcbiAgICBbJ3dyaScsIFsnYXBwbGljYXRpb24vbXN3cml0ZScsICdhcHBsaWNhdGlvbi94LXdyaScsICdhcHBsaWNhdGlvbi94LW1zd3JpdGUnXV0sXG4gICAgWyd3cmwnLCBbJ21vZGVsL3ZybWwnLCAneC13b3JsZC94LXZybWwnLCAnYXBwbGljYXRpb24veC13b3JsZCddXSxcbiAgICBbJ3dyeicsIFsnbW9kZWwvdnJtbCcsICd4LXdvcmxkL3gtdnJtbCddXSxcbiAgICBbJ3dzYycsICd0ZXh0L3NjcmlwbGV0J10sXG4gICAgWyd3c2RsJywgJ2FwcGxpY2F0aW9uL3dzZGwreG1sJ10sXG4gICAgWyd3c3BvbGljeScsICdhcHBsaWNhdGlvbi93c3BvbGljeSt4bWwnXSxcbiAgICBbJ3dzcmMnLCAnYXBwbGljYXRpb24veC13YWlzLXNvdXJjZSddLFxuICAgIFsnd3RiJywgJ2FwcGxpY2F0aW9uL3ZuZC53ZWJ0dXJibyddLFxuICAgIFsnd3RrJywgJ2FwcGxpY2F0aW9uL3gtd2ludGFsayddLFxuICAgIFsnd3Z4JywgJ3ZpZGVvL3gtbXMtd3Z4J10sXG4gICAgWyd4LXBuZycsICdpbWFnZS9wbmcnXSxcbiAgICBbJ3gzZCcsICdhcHBsaWNhdGlvbi92bmQuaHpuLTNkLWNyb3Nzd29yZCddLFxuICAgIFsneGFmJywgJ3gtd29ybGQveC12cm1sJ10sXG4gICAgWyd4YXAnLCAnYXBwbGljYXRpb24veC1zaWx2ZXJsaWdodC1hcHAnXSxcbiAgICBbJ3hhcicsICdhcHBsaWNhdGlvbi92bmQueGFyYSddLFxuICAgIFsneGJhcCcsICdhcHBsaWNhdGlvbi94LW1zLXhiYXAnXSxcbiAgICBbJ3hiZCcsICdhcHBsaWNhdGlvbi92bmQuZnVqaXhlcm94LmRvY3V3b3Jrcy5iaW5kZXInXSxcbiAgICBbJ3hibScsIFsnaW1hZ2UveGJtJywgJ2ltYWdlL3gteGJtJywgJ2ltYWdlL3gteGJpdG1hcCddXSxcbiAgICBbJ3hkZicsICdhcHBsaWNhdGlvbi94Y2FwLWRpZmYreG1sJ10sXG4gICAgWyd4ZG0nLCAnYXBwbGljYXRpb24vdm5kLnN5bmNtbC5kbSt4bWwnXSxcbiAgICBbJ3hkcCcsICdhcHBsaWNhdGlvbi92bmQuYWRvYmUueGRwK3htbCddLFxuICAgIFsneGRyJywgJ3ZpZGVvL3gtYW10LWRlbW9ydW4nXSxcbiAgICBbJ3hkc3NjJywgJ2FwcGxpY2F0aW9uL2Rzc2MreG1sJ10sXG4gICAgWyd4ZHcnLCAnYXBwbGljYXRpb24vdm5kLmZ1aml4ZXJveC5kb2N1d29ya3MnXSxcbiAgICBbJ3hlbmMnLCAnYXBwbGljYXRpb24veGVuYyt4bWwnXSxcbiAgICBbJ3hlcicsICdhcHBsaWNhdGlvbi9wYXRjaC1vcHMtZXJyb3IreG1sJ10sXG4gICAgWyd4ZmRmJywgJ2FwcGxpY2F0aW9uL3ZuZC5hZG9iZS54ZmRmJ10sXG4gICAgWyd4ZmRsJywgJ2FwcGxpY2F0aW9uL3ZuZC54ZmRsJ10sXG4gICAgWyd4Z3onLCAneGdsL2RyYXdpbmcnXSxcbiAgICBbJ3hodG1sJywgJ2FwcGxpY2F0aW9uL3hodG1sK3htbCddLFxuICAgIFsneGlmJywgJ2ltYWdlL3ZuZC54aWZmJ10sXG4gICAgWyd4bCcsICdhcHBsaWNhdGlvbi9leGNlbCddLFxuICAgIFsneGxhJywgWydhcHBsaWNhdGlvbi92bmQubXMtZXhjZWwnLCAnYXBwbGljYXRpb24vZXhjZWwnLCAnYXBwbGljYXRpb24veC1tc2V4Y2VsJywgJ2FwcGxpY2F0aW9uL3gtZXhjZWwnXV0sXG4gICAgWyd4bGFtJywgJ2FwcGxpY2F0aW9uL3ZuZC5tcy1leGNlbC5hZGRpbi5tYWNyb2VuYWJsZWQuMTInXSxcbiAgICBbJ3hsYicsIFsnYXBwbGljYXRpb24vZXhjZWwnLCAnYXBwbGljYXRpb24vdm5kLm1zLWV4Y2VsJywgJ2FwcGxpY2F0aW9uL3gtZXhjZWwnXV0sXG4gICAgWyd4bGMnLCBbJ2FwcGxpY2F0aW9uL3ZuZC5tcy1leGNlbCcsICdhcHBsaWNhdGlvbi9leGNlbCcsICdhcHBsaWNhdGlvbi94LWV4Y2VsJ11dLFxuICAgIFsneGxkJywgWydhcHBsaWNhdGlvbi9leGNlbCcsICdhcHBsaWNhdGlvbi94LWV4Y2VsJ11dLFxuICAgIFsneGxrJywgWydhcHBsaWNhdGlvbi9leGNlbCcsICdhcHBsaWNhdGlvbi94LWV4Y2VsJ11dLFxuICAgIFsneGxsJywgWydhcHBsaWNhdGlvbi9leGNlbCcsICdhcHBsaWNhdGlvbi92bmQubXMtZXhjZWwnLCAnYXBwbGljYXRpb24veC1leGNlbCddXSxcbiAgICBbJ3hsbScsIFsnYXBwbGljYXRpb24vdm5kLm1zLWV4Y2VsJywgJ2FwcGxpY2F0aW9uL2V4Y2VsJywgJ2FwcGxpY2F0aW9uL3gtZXhjZWwnXV0sXG4gICAgWyd4bHMnLCBbJ2FwcGxpY2F0aW9uL3ZuZC5tcy1leGNlbCcsICdhcHBsaWNhdGlvbi9leGNlbCcsICdhcHBsaWNhdGlvbi94LW1zZXhjZWwnLCAnYXBwbGljYXRpb24veC1leGNlbCddXSxcbiAgICBbJ3hsc2InLCAnYXBwbGljYXRpb24vdm5kLm1zLWV4Y2VsLnNoZWV0LmJpbmFyeS5tYWNyb2VuYWJsZWQuMTInXSxcbiAgICBbJ3hsc20nLCAnYXBwbGljYXRpb24vdm5kLm1zLWV4Y2VsLnNoZWV0Lm1hY3JvZW5hYmxlZC4xMiddLFxuICAgIFsneGxzeCcsICdhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQuc3ByZWFkc2hlZXRtbC5zaGVldCddLFxuICAgIFsneGx0JywgWydhcHBsaWNhdGlvbi92bmQubXMtZXhjZWwnLCAnYXBwbGljYXRpb24vZXhjZWwnLCAnYXBwbGljYXRpb24veC1leGNlbCddXSxcbiAgICBbJ3hsdG0nLCAnYXBwbGljYXRpb24vdm5kLm1zLWV4Y2VsLnRlbXBsYXRlLm1hY3JvZW5hYmxlZC4xMiddLFxuICAgIFsneGx0eCcsICdhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQuc3ByZWFkc2hlZXRtbC50ZW1wbGF0ZSddLFxuICAgIFsneGx2JywgWydhcHBsaWNhdGlvbi9leGNlbCcsICdhcHBsaWNhdGlvbi94LWV4Y2VsJ11dLFxuICAgIFsneGx3JywgWydhcHBsaWNhdGlvbi92bmQubXMtZXhjZWwnLCAnYXBwbGljYXRpb24vZXhjZWwnLCAnYXBwbGljYXRpb24veC1tc2V4Y2VsJywgJ2FwcGxpY2F0aW9uL3gtZXhjZWwnXV0sXG4gICAgWyd4bScsICdhdWRpby94bSddLFxuICAgIFsneG1sJywgWydhcHBsaWNhdGlvbi94bWwnLCAndGV4dC94bWwnLCAnYXBwbGljYXRpb24vYXRvbSt4bWwnLCAnYXBwbGljYXRpb24vcnNzK3htbCddXSxcbiAgICBbJ3hteicsICd4Z2wvbW92aWUnXSxcbiAgICBbJ3hvJywgJ2FwcGxpY2F0aW9uL3ZuZC5vbHBjLXN1Z2FyJ10sXG4gICAgWyd4b2YnLCAneC13b3JsZC94LXZybWwnXSxcbiAgICBbJ3hvcCcsICdhcHBsaWNhdGlvbi94b3AreG1sJ10sXG4gICAgWyd4cGknLCAnYXBwbGljYXRpb24veC14cGluc3RhbGwnXSxcbiAgICBbJ3hwaXgnLCAnYXBwbGljYXRpb24veC12bmQubHMteHBpeCddLFxuICAgIFsneHBtJywgWydpbWFnZS94cG0nLCAnaW1hZ2UveC14cGl4bWFwJ11dLFxuICAgIFsneHByJywgJ2FwcGxpY2F0aW9uL3ZuZC5pcy14cHInXSxcbiAgICBbJ3hwcycsICdhcHBsaWNhdGlvbi92bmQubXMteHBzZG9jdW1lbnQnXSxcbiAgICBbJ3hwdycsICdhcHBsaWNhdGlvbi92bmQuaW50ZXJjb24uZm9ybW5ldCddLFxuICAgIFsneHNsdCcsICdhcHBsaWNhdGlvbi94c2x0K3htbCddLFxuICAgIFsneHNtJywgJ2FwcGxpY2F0aW9uL3ZuZC5zeW5jbWwreG1sJ10sXG4gICAgWyd4c3BmJywgJ2FwcGxpY2F0aW9uL3hzcGYreG1sJ10sXG4gICAgWyd4c3InLCAndmlkZW8veC1hbXQtc2hvd3J1biddLFxuICAgIFsneHVsJywgJ2FwcGxpY2F0aW9uL3ZuZC5tb3ppbGxhLnh1bCt4bWwnXSxcbiAgICBbJ3h3ZCcsIFsnaW1hZ2UveC14d2QnLCAnaW1hZ2UveC14d2luZG93ZHVtcCddXSxcbiAgICBbJ3h5eicsIFsnY2hlbWljYWwveC14eXonLCAnY2hlbWljYWwveC1wZGInXV0sXG4gICAgWyd5YW5nJywgJ2FwcGxpY2F0aW9uL3lhbmcnXSxcbiAgICBbJ3lpbicsICdhcHBsaWNhdGlvbi95aW4reG1sJ10sXG4gICAgWyd6JywgWydhcHBsaWNhdGlvbi94LWNvbXByZXNzZWQnLCAnYXBwbGljYXRpb24veC1jb21wcmVzcyddXSxcbiAgICBbJ3pheicsICdhcHBsaWNhdGlvbi92bmQuenphenouZGVjayt4bWwnXSxcbiAgICBbJ3ppcCcsIFsnYXBwbGljYXRpb24vemlwJywgJ211bHRpcGFydC94LXppcCcsICdhcHBsaWNhdGlvbi94LXppcC1jb21wcmVzc2VkJywgJ2FwcGxpY2F0aW9uL3gtY29tcHJlc3NlZCddXSxcbiAgICBbJ3ppcicsICdhcHBsaWNhdGlvbi92bmQuenVsJ10sXG4gICAgWyd6bW0nLCAnYXBwbGljYXRpb24vdm5kLmhhbmRoZWxkLWVudGVydGFpbm1lbnQreG1sJ10sXG4gICAgWyd6b28nLCAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJ10sXG4gICAgWyd6c2gnLCAndGV4dC94LXNjcmlwdC56c2gnXVxuXSk7XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICAgIGRldGVjdE1pbWVUeXBlKGZpbGVuYW1lKSB7XG4gICAgICAgIGlmICghZmlsZW5hbWUpIHtcbiAgICAgICAgICAgIHJldHVybiBkZWZhdWx0TWltZVR5cGU7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgcGFyc2VkID0gcGF0aC5wYXJzZShmaWxlbmFtZSk7XG4gICAgICAgIGxldCBleHRlbnNpb24gPSAocGFyc2VkLmV4dC5zdWJzdHIoMSkgfHwgcGFyc2VkLm5hbWUgfHwgJycpLnNwbGl0KCc/Jykuc2hpZnQoKS50cmltKCkudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgbGV0IHZhbHVlID0gZGVmYXVsdE1pbWVUeXBlO1xuXG4gICAgICAgIGlmIChleHRlbnNpb25zLmhhcyhleHRlbnNpb24pKSB7XG4gICAgICAgICAgICB2YWx1ZSA9IGV4dGVuc2lvbnMuZ2V0KGV4dGVuc2lvbik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZVswXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfSxcblxuICAgIGRldGVjdEV4dGVuc2lvbihtaW1lVHlwZSkge1xuICAgICAgICBpZiAoIW1pbWVUeXBlKSB7XG4gICAgICAgICAgICByZXR1cm4gZGVmYXVsdEV4dGVuc2lvbjtcbiAgICAgICAgfVxuICAgICAgICBsZXQgcGFydHMgPSAobWltZVR5cGUgfHwgJycpLnRvTG93ZXJDYXNlKCkudHJpbSgpLnNwbGl0KCcvJyk7XG4gICAgICAgIGxldCByb290VHlwZSA9IHBhcnRzLnNoaWZ0KCkudHJpbSgpO1xuICAgICAgICBsZXQgc3ViVHlwZSA9IHBhcnRzLmpvaW4oJy8nKS50cmltKCk7XG5cbiAgICAgICAgaWYgKG1pbWVUeXBlcy5oYXMocm9vdFR5cGUgKyAnLycgKyBzdWJUeXBlKSkge1xuICAgICAgICAgICAgbGV0IHZhbHVlID0gbWltZVR5cGVzLmdldChyb290VHlwZSArICcvJyArIHN1YlR5cGUpO1xuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlWzBdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9XG5cbiAgICAgICAgc3dpdGNoIChyb290VHlwZSkge1xuICAgICAgICAgICAgY2FzZSAndGV4dCc6XG4gICAgICAgICAgICAgICAgcmV0dXJuICd0eHQnO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICByZXR1cm4gJ2Jpbic7XG4gICAgICAgIH1cbiAgICB9XG59O1xuIl0sIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6WzBdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(action-browser)/./node_modules/.pnpm/nodemailer@7.0.13/node_modules/nodemailer/lib/mime-funcs/mime-types.js\n");
|
||
|
||
/***/ }),
|
||
|
||
/***/ "(action-browser)/./node_modules/.pnpm/nodemailer@7.0.13/node_modules/nodemailer/lib/mime-node/index.js":
|
||
/*!*********************************************************************************************!*\
|
||
!*** ./node_modules/.pnpm/nodemailer@7.0.13/node_modules/nodemailer/lib/mime-node/index.js ***!
|
||
\*********************************************************************************************/
|
||
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
|
||
|
||
eval("/* eslint no-undefined: 0, prefer-spread: 0, no-control-regex: 0 */\n\n\n\nconst crypto = __webpack_require__(/*! crypto */ \"crypto\");\nconst fs = __webpack_require__(/*! fs */ \"fs\");\nconst punycode = __webpack_require__(/*! ../punycode */ \"(action-browser)/./node_modules/.pnpm/nodemailer@7.0.13/node_modules/nodemailer/lib/punycode/index.js\");\nconst PassThrough = (__webpack_require__(/*! stream */ \"stream\").PassThrough);\nconst shared = __webpack_require__(/*! ../shared */ \"(action-browser)/./node_modules/.pnpm/nodemailer@7.0.13/node_modules/nodemailer/lib/shared/index.js\");\n\nconst mimeFuncs = __webpack_require__(/*! ../mime-funcs */ \"(action-browser)/./node_modules/.pnpm/nodemailer@7.0.13/node_modules/nodemailer/lib/mime-funcs/index.js\");\nconst qp = __webpack_require__(/*! ../qp */ \"(action-browser)/./node_modules/.pnpm/nodemailer@7.0.13/node_modules/nodemailer/lib/qp/index.js\");\nconst base64 = __webpack_require__(/*! ../base64 */ \"(action-browser)/./node_modules/.pnpm/nodemailer@7.0.13/node_modules/nodemailer/lib/base64/index.js\");\nconst addressparser = __webpack_require__(/*! ../addressparser */ \"(action-browser)/./node_modules/.pnpm/nodemailer@7.0.13/node_modules/nodemailer/lib/addressparser/index.js\");\nconst nmfetch = __webpack_require__(/*! ../fetch */ \"(action-browser)/./node_modules/.pnpm/nodemailer@7.0.13/node_modules/nodemailer/lib/fetch/index.js\");\nconst LastNewline = __webpack_require__(/*! ./last-newline */ \"(action-browser)/./node_modules/.pnpm/nodemailer@7.0.13/node_modules/nodemailer/lib/mime-node/last-newline.js\");\n\nconst LeWindows = __webpack_require__(/*! ./le-windows */ \"(action-browser)/./node_modules/.pnpm/nodemailer@7.0.13/node_modules/nodemailer/lib/mime-node/le-windows.js\");\nconst LeUnix = __webpack_require__(/*! ./le-unix */ \"(action-browser)/./node_modules/.pnpm/nodemailer@7.0.13/node_modules/nodemailer/lib/mime-node/le-unix.js\");\n\n/**\n * Creates a new mime tree node. Assumes 'multipart/*' as the content type\n * if it is a branch, anything else counts as leaf. If rootNode is missing from\n * the options, assumes this is the root.\n *\n * @param {String} contentType Define the content type for the node. Can be left blank for attachments (derived from filename)\n * @param {Object} [options] optional options\n * @param {Object} [options.rootNode] root node for this tree\n * @param {Object} [options.parentNode] immediate parent for this node\n * @param {Object} [options.filename] filename for an attachment node\n * @param {String} [options.baseBoundary] shared part of the unique multipart boundary\n * @param {Boolean} [options.keepBcc] If true, do not exclude Bcc from the generated headers\n * @param {Function} [options.normalizeHeaderKey] method to normalize header keys for custom caseing\n * @param {String} [options.textEncoding] either 'Q' (the default) or 'B'\n */\nclass MimeNode {\n constructor(contentType, options) {\n this.nodeCounter = 0;\n\n options = options || {};\n\n /**\n * shared part of the unique multipart boundary\n */\n this.baseBoundary = options.baseBoundary || crypto.randomBytes(8).toString('hex');\n this.boundaryPrefix = options.boundaryPrefix || '--_NmP';\n\n this.disableFileAccess = !!options.disableFileAccess;\n this.disableUrlAccess = !!options.disableUrlAccess;\n\n this.normalizeHeaderKey = options.normalizeHeaderKey;\n\n /**\n * If date headers is missing and current node is the root, this value is used instead\n */\n this.date = new Date();\n\n /**\n * Root node for current mime tree\n */\n this.rootNode = options.rootNode || this;\n\n /**\n * If true include Bcc in generated headers (if available)\n */\n this.keepBcc = !!options.keepBcc;\n\n /**\n * If filename is specified but contentType is not (probably an attachment)\n * detect the content type from filename extension\n */\n if (options.filename) {\n /**\n * Filename for this node. Useful with attachments\n */\n this.filename = options.filename;\n if (!contentType) {\n contentType = mimeFuncs.detectMimeType(this.filename.split('.').pop());\n }\n }\n\n /**\n * Indicates which encoding should be used for header strings: \"Q\" or \"B\"\n */\n this.textEncoding = (options.textEncoding || '').toString().trim().charAt(0).toUpperCase();\n\n /**\n * Immediate parent for this node (or undefined if not set)\n */\n this.parentNode = options.parentNode;\n\n /**\n * Hostname for default message-id values\n */\n this.hostname = options.hostname;\n\n /**\n * If set to 'win' then uses \\r\\n, if 'linux' then \\n. If not set (or `raw` is used) then newlines are kept as is.\n */\n this.newline = options.newline;\n\n /**\n * An array for possible child nodes\n */\n this.childNodes = [];\n\n /**\n * Used for generating unique boundaries (prepended to the shared base)\n */\n this._nodeId = ++this.rootNode.nodeCounter;\n\n /**\n * A list of header values for this node in the form of [{key:'', value:''}]\n */\n this._headers = [];\n\n /**\n * True if the content only uses ASCII printable characters\n * @type {Boolean}\n */\n this._isPlainText = false;\n\n /**\n * True if the content is plain text but has longer lines than allowed\n * @type {Boolean}\n */\n this._hasLongLines = false;\n\n /**\n * If set, use instead this value for envelopes instead of generating one\n * @type {Boolean}\n */\n this._envelope = false;\n\n /**\n * If set then use this value as the stream content instead of building it\n * @type {String|Buffer|Stream}\n */\n this._raw = false;\n\n /**\n * Additional transform streams that the message will be piped before\n * exposing by createReadStream\n * @type {Array}\n */\n this._transforms = [];\n\n /**\n * Additional process functions that the message will be piped through before\n * exposing by createReadStream. These functions are run after transforms\n * @type {Array}\n */\n this._processFuncs = [];\n\n /**\n * If content type is set (or derived from the filename) add it to headers\n */\n if (contentType) {\n this.setHeader('Content-Type', contentType);\n }\n }\n\n /////// PUBLIC METHODS\n\n /**\n * Creates and appends a child node.Arguments provided are passed to MimeNode constructor\n *\n * @param {String} [contentType] Optional content type\n * @param {Object} [options] Optional options object\n * @return {Object} Created node object\n */\n createChild(contentType, options) {\n if (!options && typeof contentType === 'object') {\n options = contentType;\n contentType = undefined;\n }\n let node = new MimeNode(contentType, options);\n this.appendChild(node);\n return node;\n }\n\n /**\n * Appends an existing node to the mime tree. Removes the node from an existing\n * tree if needed\n *\n * @param {Object} childNode node to be appended\n * @return {Object} Appended node object\n */\n appendChild(childNode) {\n if (childNode.rootNode !== this.rootNode) {\n childNode.rootNode = this.rootNode;\n childNode._nodeId = ++this.rootNode.nodeCounter;\n }\n\n childNode.parentNode = this;\n\n this.childNodes.push(childNode);\n return childNode;\n }\n\n /**\n * Replaces current node with another node\n *\n * @param {Object} node Replacement node\n * @return {Object} Replacement node\n */\n replace(node) {\n if (node === this) {\n return this;\n }\n\n this.parentNode.childNodes.forEach((childNode, i) => {\n if (childNode === this) {\n node.rootNode = this.rootNode;\n node.parentNode = this.parentNode;\n node._nodeId = this._nodeId;\n\n this.rootNode = this;\n this.parentNode = undefined;\n\n node.parentNode.childNodes[i] = node;\n }\n });\n\n return node;\n }\n\n /**\n * Removes current node from the mime tree\n *\n * @return {Object} removed node\n */\n remove() {\n if (!this.parentNode) {\n return this;\n }\n\n for (let i = this.parentNode.childNodes.length - 1; i >= 0; i--) {\n if (this.parentNode.childNodes[i] === this) {\n this.parentNode.childNodes.splice(i, 1);\n this.parentNode = undefined;\n this.rootNode = this;\n return this;\n }\n }\n }\n\n /**\n * Sets a header value. If the value for selected key exists, it is overwritten.\n * You can set multiple values as well by using [{key:'', value:''}] or\n * {key: 'value'} as the first argument.\n *\n * @param {String|Array|Object} key Header key or a list of key value pairs\n * @param {String} value Header value\n * @return {Object} current node\n */\n setHeader(key, value) {\n let added = false,\n headerValue;\n\n // Allow setting multiple headers at once\n if (!value && key && typeof key === 'object') {\n // allow {key:'content-type', value: 'text/plain'}\n if (key.key && 'value' in key) {\n this.setHeader(key.key, key.value);\n } else if (Array.isArray(key)) {\n // allow [{key:'content-type', value: 'text/plain'}]\n key.forEach(i => {\n this.setHeader(i.key, i.value);\n });\n } else {\n // allow {'content-type': 'text/plain'}\n Object.keys(key).forEach(i => {\n this.setHeader(i, key[i]);\n });\n }\n return this;\n }\n\n key = this._normalizeHeaderKey(key);\n\n headerValue = {\n key,\n value\n };\n\n // Check if the value exists and overwrite\n for (let i = 0, len = this._headers.length; i < len; i++) {\n if (this._headers[i].key === key) {\n if (!added) {\n // replace the first match\n this._headers[i] = headerValue;\n added = true;\n } else {\n // remove following matches\n this._headers.splice(i, 1);\n i--;\n len--;\n }\n }\n }\n\n // match not found, append the value\n if (!added) {\n this._headers.push(headerValue);\n }\n\n return this;\n }\n\n /**\n * Adds a header value. If the value for selected key exists, the value is appended\n * as a new field and old one is not touched.\n * You can set multiple values as well by using [{key:'', value:''}] or\n * {key: 'value'} as the first argument.\n *\n * @param {String|Array|Object} key Header key or a list of key value pairs\n * @param {String} value Header value\n * @return {Object} current node\n */\n addHeader(key, value) {\n // Allow setting multiple headers at once\n if (!value && key && typeof key === 'object') {\n // allow {key:'content-type', value: 'text/plain'}\n if (key.key && key.value) {\n this.addHeader(key.key, key.value);\n } else if (Array.isArray(key)) {\n // allow [{key:'content-type', value: 'text/plain'}]\n key.forEach(i => {\n this.addHeader(i.key, i.value);\n });\n } else {\n // allow {'content-type': 'text/plain'}\n Object.keys(key).forEach(i => {\n this.addHeader(i, key[i]);\n });\n }\n return this;\n } else if (Array.isArray(value)) {\n value.forEach(val => {\n this.addHeader(key, val);\n });\n return this;\n }\n\n this._headers.push({\n key: this._normalizeHeaderKey(key),\n value\n });\n\n return this;\n }\n\n /**\n * Retrieves the first mathcing value of a selected key\n *\n * @param {String} key Key to search for\n * @retun {String} Value for the key\n */\n getHeader(key) {\n key = this._normalizeHeaderKey(key);\n for (let i = 0, len = this._headers.length; i < len; i++) {\n if (this._headers[i].key === key) {\n return this._headers[i].value;\n }\n }\n }\n\n /**\n * Sets body content for current node. If the value is a string, charset is added automatically\n * to Content-Type (if it is text/*). If the value is a Buffer, you need to specify\n * the charset yourself\n *\n * @param (String|Buffer) content Body content\n * @return {Object} current node\n */\n setContent(content) {\n this.content = content;\n if (typeof this.content.pipe === 'function') {\n // pre-stream handler. might be triggered if a stream is set as content\n // and 'error' fires before anything is done with this stream\n this._contentErrorHandler = err => {\n this.content.removeListener('error', this._contentErrorHandler);\n this.content = err;\n };\n this.content.once('error', this._contentErrorHandler);\n } else if (typeof this.content === 'string') {\n this._isPlainText = mimeFuncs.isPlainText(this.content);\n if (this._isPlainText && mimeFuncs.hasLongerLines(this.content, 76)) {\n // If there are lines longer than 76 symbols/bytes do not use 7bit\n this._hasLongLines = true;\n }\n }\n return this;\n }\n\n build(callback) {\n let promise;\n\n if (!callback) {\n promise = new Promise((resolve, reject) => {\n callback = shared.callbackPromise(resolve, reject);\n });\n }\n\n let stream = this.createReadStream();\n let buf = [];\n let buflen = 0;\n let returned = false;\n\n stream.on('readable', () => {\n let chunk;\n\n while ((chunk = stream.read()) !== null) {\n buf.push(chunk);\n buflen += chunk.length;\n }\n });\n\n stream.once('error', err => {\n if (returned) {\n return;\n }\n returned = true;\n\n return callback(err);\n });\n\n stream.once('end', chunk => {\n if (returned) {\n return;\n }\n returned = true;\n\n if (chunk && chunk.length) {\n buf.push(chunk);\n buflen += chunk.length;\n }\n return callback(null, Buffer.concat(buf, buflen));\n });\n\n return promise;\n }\n\n getTransferEncoding() {\n let transferEncoding = false;\n let contentType = (this.getHeader('Content-Type') || '').toString().toLowerCase().trim();\n\n if (this.content) {\n transferEncoding = (this.getHeader('Content-Transfer-Encoding') || '').toString().toLowerCase().trim();\n if (!transferEncoding || !['base64', 'quoted-printable'].includes(transferEncoding)) {\n if (/^text\\//i.test(contentType)) {\n // If there are no special symbols, no need to modify the text\n if (this._isPlainText && !this._hasLongLines) {\n transferEncoding = '7bit';\n } else if (typeof this.content === 'string' || this.content instanceof Buffer) {\n // detect preferred encoding for string value\n transferEncoding = this._getTextEncoding(this.content) === 'Q' ? 'quoted-printable' : 'base64';\n } else {\n // we can not check content for a stream, so either use preferred encoding or fallback to QP\n transferEncoding = this.textEncoding === 'B' ? 'base64' : 'quoted-printable';\n }\n } else if (!/^(multipart|message)\\//i.test(contentType)) {\n transferEncoding = transferEncoding || 'base64';\n }\n }\n }\n return transferEncoding;\n }\n\n /**\n * Builds the header block for the mime node. Append \\r\\n\\r\\n before writing the content\n *\n * @returns {String} Headers\n */\n buildHeaders() {\n let transferEncoding = this.getTransferEncoding();\n let headers = [];\n\n if (transferEncoding) {\n this.setHeader('Content-Transfer-Encoding', transferEncoding);\n }\n\n if (this.filename && !this.getHeader('Content-Disposition')) {\n this.setHeader('Content-Disposition', 'attachment');\n }\n\n // Ensure mandatory header fields\n if (this.rootNode === this) {\n if (!this.getHeader('Date')) {\n this.setHeader('Date', this.date.toUTCString().replace(/GMT/, '+0000'));\n }\n\n // ensure that Message-Id is present\n this.messageId();\n\n if (!this.getHeader('MIME-Version')) {\n this.setHeader('MIME-Version', '1.0');\n }\n\n // Ensure that Content-Type is the last header for the root node\n for (let i = this._headers.length - 2; i >= 0; i--) {\n let header = this._headers[i];\n if (header.key === 'Content-Type') {\n this._headers.splice(i, 1);\n this._headers.push(header);\n }\n }\n }\n\n this._headers.forEach(header => {\n let key = header.key;\n let value = header.value;\n let structured;\n let param;\n let options = {};\n let formattedHeaders = ['From', 'Sender', 'To', 'Cc', 'Bcc', 'Reply-To', 'Date', 'References'];\n\n if (value && typeof value === 'object' && !formattedHeaders.includes(key)) {\n Object.keys(value).forEach(key => {\n if (key !== 'value') {\n options[key] = value[key];\n }\n });\n value = (value.value || '').toString();\n if (!value.trim()) {\n return;\n }\n }\n\n if (options.prepared) {\n // header value is\n if (options.foldLines) {\n headers.push(mimeFuncs.foldLines(key + ': ' + value));\n } else {\n headers.push(key + ': ' + value);\n }\n return;\n }\n\n switch (header.key) {\n case 'Content-Disposition':\n structured = mimeFuncs.parseHeaderValue(value);\n if (this.filename) {\n structured.params.filename = this.filename;\n }\n value = mimeFuncs.buildHeaderValue(structured);\n break;\n\n case 'Content-Type':\n structured = mimeFuncs.parseHeaderValue(value);\n\n this._handleContentType(structured);\n\n if (\n structured.value.match(/^text\\/plain\\b/) &&\n typeof this.content === 'string' &&\n /[\\u0080-\\uFFFF]/.test(this.content)\n ) {\n structured.params.charset = 'utf-8';\n }\n\n value = mimeFuncs.buildHeaderValue(structured);\n\n if (this.filename) {\n // add support for non-compliant clients like QQ webmail\n // we can't build the value with buildHeaderValue as the value is non standard and\n // would be converted to parameter continuation encoding that we do not want\n param = this._encodeWords(this.filename);\n\n if (param !== this.filename || /[\\s'\"\\\\;:/=(),<>@[\\]?]|^-/.test(param)) {\n // include value in quotes if needed\n param = '\"' + param + '\"';\n }\n value += '; name=' + param;\n }\n break;\n\n case 'Bcc':\n if (!this.keepBcc) {\n // skip BCC values\n return;\n }\n break;\n }\n\n value = this._encodeHeaderValue(key, value);\n\n // skip empty lines\n if (!(value || '').toString().trim()) {\n return;\n }\n\n if (typeof this.normalizeHeaderKey === 'function') {\n let normalized = this.normalizeHeaderKey(key, value);\n if (normalized && typeof normalized === 'string' && normalized.length) {\n key = normalized;\n }\n }\n\n headers.push(mimeFuncs.foldLines(key + ': ' + value, 76));\n });\n\n return headers.join('\\r\\n');\n }\n\n /**\n * Streams the rfc2822 message from the current node. If this is a root node,\n * mandatory header fields are set if missing (Date, Message-Id, MIME-Version)\n *\n * @return {String} Compiled message\n */\n createReadStream(options) {\n options = options || {};\n\n let stream = new PassThrough(options);\n let outputStream = stream;\n let transform;\n\n this.stream(stream, options, err => {\n if (err) {\n outputStream.emit('error', err);\n return;\n }\n stream.end();\n });\n\n for (let i = 0, len = this._transforms.length; i < len; i++) {\n transform = typeof this._transforms[i] === 'function' ? this._transforms[i]() : this._transforms[i];\n outputStream.once('error', err => {\n transform.emit('error', err);\n });\n outputStream = outputStream.pipe(transform);\n }\n\n // ensure terminating newline after possible user transforms\n transform = new LastNewline();\n outputStream.once('error', err => {\n transform.emit('error', err);\n });\n outputStream = outputStream.pipe(transform);\n\n // dkim and stuff\n for (let i = 0, len = this._processFuncs.length; i < len; i++) {\n transform = this._processFuncs[i];\n outputStream = transform(outputStream);\n }\n\n if (this.newline) {\n const winbreak = ['win', 'windows', 'dos', '\\r\\n'].includes(this.newline.toString().toLowerCase());\n const newlineTransform = winbreak ? new LeWindows() : new LeUnix();\n\n const stream = outputStream.pipe(newlineTransform);\n outputStream.on('error', err => stream.emit('error', err));\n return stream;\n }\n\n return outputStream;\n }\n\n /**\n * Appends a transform stream object to the transforms list. Final output\n * is passed through this stream before exposing\n *\n * @param {Object} transform Read-Write stream\n */\n transform(transform) {\n this._transforms.push(transform);\n }\n\n /**\n * Appends a post process function. The functon is run after transforms and\n * uses the following syntax\n *\n * processFunc(input) -> outputStream\n *\n * @param {Object} processFunc Read-Write stream\n */\n processFunc(processFunc) {\n this._processFuncs.push(processFunc);\n }\n\n stream(outputStream, options, done) {\n let transferEncoding = this.getTransferEncoding();\n let contentStream;\n let localStream;\n\n // protect actual callback against multiple triggering\n let returned = false;\n let callback = err => {\n if (returned) {\n return;\n }\n returned = true;\n done(err);\n };\n\n // for multipart nodes, push child nodes\n // for content nodes end the stream\n let finalize = () => {\n let childId = 0;\n let processChildNode = () => {\n if (childId >= this.childNodes.length) {\n outputStream.write('\\r\\n--' + this.boundary + '--\\r\\n');\n return callback();\n }\n let child = this.childNodes[childId++];\n outputStream.write((childId > 1 ? '\\r\\n' : '') + '--' + this.boundary + '\\r\\n');\n child.stream(outputStream, options, err => {\n if (err) {\n return callback(err);\n }\n setImmediate(processChildNode);\n });\n };\n\n if (this.multipart) {\n setImmediate(processChildNode);\n } else {\n return callback();\n }\n };\n\n // pushes node content\n let sendContent = () => {\n if (this.content) {\n if (Object.prototype.toString.call(this.content) === '[object Error]') {\n // content is already errored\n return callback(this.content);\n }\n\n if (typeof this.content.pipe === 'function') {\n this.content.removeListener('error', this._contentErrorHandler);\n this._contentErrorHandler = err => callback(err);\n this.content.once('error', this._contentErrorHandler);\n }\n\n let createStream = () => {\n if (['quoted-printable', 'base64'].includes(transferEncoding)) {\n contentStream = new (transferEncoding === 'base64' ? base64 : qp).Encoder(options);\n\n contentStream.pipe(outputStream, {\n end: false\n });\n contentStream.once('end', finalize);\n contentStream.once('error', err => callback(err));\n\n localStream = this._getStream(this.content);\n localStream.pipe(contentStream);\n } else {\n // anything that is not QP or Base54 passes as-is\n localStream = this._getStream(this.content);\n localStream.pipe(outputStream, {\n end: false\n });\n localStream.once('end', finalize);\n }\n\n localStream.once('error', err => callback(err));\n };\n\n if (this.content._resolve) {\n let chunks = [];\n let chunklen = 0;\n let returned = false;\n let sourceStream = this._getStream(this.content);\n sourceStream.on('error', err => {\n if (returned) {\n return;\n }\n returned = true;\n callback(err);\n });\n sourceStream.on('readable', () => {\n let chunk;\n while ((chunk = sourceStream.read()) !== null) {\n chunks.push(chunk);\n chunklen += chunk.length;\n }\n });\n sourceStream.on('end', () => {\n if (returned) {\n return;\n }\n returned = true;\n this.content._resolve = false;\n this.content._resolvedValue = Buffer.concat(chunks, chunklen);\n setImmediate(createStream);\n });\n } else {\n setImmediate(createStream);\n }\n return;\n } else {\n return setImmediate(finalize);\n }\n };\n\n if (this._raw) {\n setImmediate(() => {\n if (Object.prototype.toString.call(this._raw) === '[object Error]') {\n // content is already errored\n return callback(this._raw);\n }\n\n // remove default error handler (if set)\n if (typeof this._raw.pipe === 'function') {\n this._raw.removeListener('error', this._contentErrorHandler);\n }\n\n let raw = this._getStream(this._raw);\n raw.pipe(outputStream, {\n end: false\n });\n raw.on('error', err => outputStream.emit('error', err));\n raw.on('end', finalize);\n });\n } else {\n outputStream.write(this.buildHeaders() + '\\r\\n\\r\\n');\n setImmediate(sendContent);\n }\n }\n\n /**\n * Sets envelope to be used instead of the generated one\n *\n * @return {Object} SMTP envelope in the form of {from: 'from@example.com', to: ['to@example.com']}\n */\n setEnvelope(envelope) {\n let list;\n\n this._envelope = {\n from: false,\n to: []\n };\n\n if (envelope.from) {\n list = [];\n this._convertAddresses(this._parseAddresses(envelope.from), list);\n list = list.filter(address => address && address.address);\n if (list.length && list[0]) {\n this._envelope.from = list[0].address;\n }\n }\n ['to', 'cc', 'bcc'].forEach(key => {\n if (envelope[key]) {\n this._convertAddresses(this._parseAddresses(envelope[key]), this._envelope.to);\n }\n });\n\n this._envelope.to = this._envelope.to.map(to => to.address).filter(address => address);\n\n let standardFields = ['to', 'cc', 'bcc', 'from'];\n Object.keys(envelope).forEach(key => {\n if (!standardFields.includes(key)) {\n this._envelope[key] = envelope[key];\n }\n });\n\n return this;\n }\n\n /**\n * Generates and returns an object with parsed address fields\n *\n * @return {Object} Address object\n */\n getAddresses() {\n let addresses = {};\n\n this._headers.forEach(header => {\n let key = header.key.toLowerCase();\n if (['from', 'sender', 'reply-to', 'to', 'cc', 'bcc'].includes(key)) {\n if (!Array.isArray(addresses[key])) {\n addresses[key] = [];\n }\n\n this._convertAddresses(this._parseAddresses(header.value), addresses[key]);\n }\n });\n\n return addresses;\n }\n\n /**\n * Generates and returns SMTP envelope with the sender address and a list of recipients addresses\n *\n * @return {Object} SMTP envelope in the form of {from: 'from@example.com', to: ['to@example.com']}\n */\n getEnvelope() {\n if (this._envelope) {\n return this._envelope;\n }\n\n let envelope = {\n from: false,\n to: []\n };\n this._headers.forEach(header => {\n let list = [];\n if (header.key === 'From' || (!envelope.from && ['Reply-To', 'Sender'].includes(header.key))) {\n this._convertAddresses(this._parseAddresses(header.value), list);\n if (list.length && list[0]) {\n envelope.from = list[0].address;\n }\n } else if (['To', 'Cc', 'Bcc'].includes(header.key)) {\n this._convertAddresses(this._parseAddresses(header.value), envelope.to);\n }\n });\n\n envelope.to = envelope.to.map(to => to.address);\n\n return envelope;\n }\n\n /**\n * Returns Message-Id value. If it does not exist, then creates one\n *\n * @return {String} Message-Id value\n */\n messageId() {\n let messageId = this.getHeader('Message-ID');\n // You really should define your own Message-Id field!\n if (!messageId) {\n messageId = this._generateMessageId();\n this.setHeader('Message-ID', messageId);\n }\n return messageId;\n }\n\n /**\n * Sets pregenerated content that will be used as the output of this node\n *\n * @param {String|Buffer|Stream} Raw MIME contents\n */\n setRaw(raw) {\n this._raw = raw;\n\n if (this._raw && typeof this._raw.pipe === 'function') {\n // pre-stream handler. might be triggered if a stream is set as content\n // and 'error' fires before anything is done with this stream\n this._contentErrorHandler = err => {\n this._raw.removeListener('error', this._contentErrorHandler);\n this._raw = err;\n };\n this._raw.once('error', this._contentErrorHandler);\n }\n\n return this;\n }\n\n /////// PRIVATE METHODS\n\n /**\n * Detects and returns handle to a stream related with the content.\n *\n * @param {Mixed} content Node content\n * @returns {Object} Stream object\n */\n _getStream(content) {\n let contentStream;\n\n if (content._resolvedValue) {\n // pass string or buffer content as a stream\n contentStream = new PassThrough();\n\n setImmediate(() => {\n try {\n contentStream.end(content._resolvedValue);\n } catch (_err) {\n contentStream.emit('error', _err);\n }\n });\n\n return contentStream;\n } else if (typeof content.pipe === 'function') {\n // assume as stream\n return content;\n } else if (content && typeof content.path === 'string' && !content.href) {\n if (this.disableFileAccess) {\n contentStream = new PassThrough();\n setImmediate(() => contentStream.emit('error', new Error('File access rejected for ' + content.path)));\n return contentStream;\n }\n // read file\n return fs.createReadStream(content.path);\n } else if (content && typeof content.href === 'string') {\n if (this.disableUrlAccess) {\n contentStream = new PassThrough();\n setImmediate(() => contentStream.emit('error', new Error('Url access rejected for ' + content.href)));\n return contentStream;\n }\n // fetch URL\n return nmfetch(content.href, { headers: content.httpHeaders });\n } else {\n // pass string or buffer content as a stream\n contentStream = new PassThrough();\n\n setImmediate(() => {\n try {\n contentStream.end(content || '');\n } catch (_err) {\n contentStream.emit('error', _err);\n }\n });\n return contentStream;\n }\n }\n\n /**\n * Parses addresses. Takes in a single address or an array or an\n * array of address arrays (eg. To: [[first group], [second group],...])\n *\n * @param {Mixed} addresses Addresses to be parsed\n * @return {Array} An array of address objects\n */\n _parseAddresses(addresses) {\n return [].concat.apply(\n [],\n [].concat(addresses).map(address => {\n if (address && address.address) {\n address.address = this._normalizeAddress(address.address);\n address.name = address.name || '';\n return [address];\n }\n return addressparser(address);\n })\n );\n }\n\n /**\n * Normalizes a header key, uses Camel-Case form, except for uppercase MIME-\n *\n * @param {String} key Key to be normalized\n * @return {String} key in Camel-Case form\n */\n _normalizeHeaderKey(key) {\n key = (key || '')\n .toString()\n // no newlines in keys\n .replace(/\\r?\\n|\\r/g, ' ')\n .trim()\n .toLowerCase()\n // use uppercase words, except MIME\n .replace(/^X-SMTPAPI$|^(MIME|DKIM|ARC|BIMI)\\b|^[a-z]|-(SPF|FBL|ID|MD5)$|-[a-z]/gi, c => c.toUpperCase())\n // special case\n .replace(/^Content-Features$/i, 'Content-features');\n\n return key;\n }\n\n /**\n * Checks if the content type is multipart and defines boundary if needed.\n * Doesn't return anything, modifies object argument instead.\n *\n * @param {Object} structured Parsed header value for 'Content-Type' key\n */\n _handleContentType(structured) {\n this.contentType = structured.value.trim().toLowerCase();\n\n this.multipart = /^multipart\\//i.test(this.contentType) ? this.contentType.substr(this.contentType.indexOf('/') + 1) : false;\n\n if (this.multipart) {\n this.boundary = structured.params.boundary = structured.params.boundary || this.boundary || this._generateBoundary();\n } else {\n this.boundary = false;\n }\n }\n\n /**\n * Generates a multipart boundary value\n *\n * @return {String} boundary value\n */\n _generateBoundary() {\n return this.rootNode.boundaryPrefix + '-' + this.rootNode.baseBoundary + '-Part_' + this._nodeId;\n }\n\n /**\n * Encodes a header value for use in the generated rfc2822 email.\n *\n * @param {String} key Header key\n * @param {String} value Header value\n */\n _encodeHeaderValue(key, value) {\n key = this._normalizeHeaderKey(key);\n\n switch (key) {\n // Structured headers\n case 'From':\n case 'Sender':\n case 'To':\n case 'Cc':\n case 'Bcc':\n case 'Reply-To':\n return this._convertAddresses(this._parseAddresses(value));\n\n // values enclosed in <>\n case 'Message-ID':\n case 'In-Reply-To':\n case 'Content-Id':\n value = (value || '').toString().replace(/\\r?\\n|\\r/g, ' ');\n\n if (value.charAt(0) !== '<') {\n value = '<' + value;\n }\n\n if (value.charAt(value.length - 1) !== '>') {\n value = value + '>';\n }\n return value;\n\n // space separated list of values enclosed in <>\n case 'References':\n value = [].concat\n .apply(\n [],\n [].concat(value || '').map(elm => {\n elm = (elm || '')\n .toString()\n .replace(/\\r?\\n|\\r/g, ' ')\n .trim();\n return elm.replace(/<[^>]*>/g, str => str.replace(/\\s/g, '')).split(/\\s+/);\n })\n )\n .map(elm => {\n if (elm.charAt(0) !== '<') {\n elm = '<' + elm;\n }\n if (elm.charAt(elm.length - 1) !== '>') {\n elm = elm + '>';\n }\n return elm;\n });\n\n return value.join(' ').trim();\n\n case 'Date':\n if (Object.prototype.toString.call(value) === '[object Date]') {\n return value.toUTCString().replace(/GMT/, '+0000');\n }\n\n value = (value || '').toString().replace(/\\r?\\n|\\r/g, ' ');\n return this._encodeWords(value);\n\n case 'Content-Type':\n case 'Content-Disposition':\n // if it includes a filename then it is already encoded\n return (value || '').toString().replace(/\\r?\\n|\\r/g, ' ');\n\n default:\n value = (value || '').toString().replace(/\\r?\\n|\\r/g, ' ');\n // encodeWords only encodes if needed, otherwise the original string is returned\n return this._encodeWords(value);\n }\n }\n\n /**\n * Rebuilds address object using punycode and other adjustments\n *\n * @param {Array} addresses An array of address objects\n * @param {Array} [uniqueList] An array to be populated with addresses\n * @return {String} address string\n */\n _convertAddresses(addresses, uniqueList) {\n let values = [];\n\n uniqueList = uniqueList || [];\n\n [].concat(addresses || []).forEach(address => {\n if (address.address) {\n address.address = this._normalizeAddress(address.address);\n\n if (!address.name) {\n values.push(address.address.indexOf(' ') >= 0 ? `<${address.address}>` : `${address.address}`);\n } else if (address.name) {\n values.push(`${this._encodeAddressName(address.name)} <${address.address}>`);\n }\n\n if (address.address) {\n if (!uniqueList.filter(a => a.address === address.address).length) {\n uniqueList.push(address);\n }\n }\n } else if (address.group) {\n let groupListAddresses = (address.group.length ? this._convertAddresses(address.group, uniqueList) : '').trim();\n values.push(`${this._encodeAddressName(address.name)}:${groupListAddresses};`);\n }\n });\n\n return values.join(', ');\n }\n\n /**\n * Normalizes an email address\n *\n * @param {Array} address An array of address objects\n * @return {String} address string\n */\n _normalizeAddress(address) {\n address = (address || '')\n .toString()\n .replace(/[\\x00-\\x1F<>]+/g, ' ') // remove unallowed characters\n .trim();\n\n let lastAt = address.lastIndexOf('@');\n if (lastAt < 0) {\n // Bare username\n return address;\n }\n\n let user = address.substr(0, lastAt);\n let domain = address.substr(lastAt + 1);\n\n // Usernames are not touched and are kept as is even if these include unicode\n // Domains are punycoded by default\n // 'jõgeva.ee' will be converted to 'xn--jgeva-dua.ee'\n // non-unicode domains are left as is\n\n let encodedDomain;\n\n try {\n encodedDomain = punycode.toASCII(domain.toLowerCase());\n } catch (_err) {\n // keep as is?\n }\n\n if (user.indexOf(' ') >= 0) {\n if (user.charAt(0) !== '\"') {\n user = '\"' + user;\n }\n if (user.substr(-1) !== '\"') {\n user = user + '\"';\n }\n }\n\n return `${user}@${encodedDomain}`;\n }\n\n /**\n * If needed, mime encodes the name part\n *\n * @param {String} name Name part of an address\n * @returns {String} Mime word encoded string if needed\n */\n _encodeAddressName(name) {\n if (!/^[\\w ]*$/.test(name)) {\n if (/^[\\x20-\\x7e]*$/.test(name)) {\n return '\"' + name.replace(/([\\\\\"])/g, '\\\\$1') + '\"';\n } else {\n return mimeFuncs.encodeWord(name, this._getTextEncoding(name), 52);\n }\n }\n return name;\n }\n\n /**\n * If needed, mime encodes the name part\n *\n * @param {String} name Name part of an address\n * @returns {String} Mime word encoded string if needed\n */\n _encodeWords(value) {\n // set encodeAll parameter to true even though it is against the recommendation of RFC2047,\n // by default only words that include non-ascii should be converted into encoded words\n // but some clients (eg. Zimbra) do not handle it properly and remove surrounding whitespace\n return mimeFuncs.encodeWords(value, this._getTextEncoding(value), 52, true);\n }\n\n /**\n * Detects best mime encoding for a text value\n *\n * @param {String} value Value to check for\n * @return {String} either 'Q' or 'B'\n */\n _getTextEncoding(value) {\n value = (value || '').toString();\n\n let encoding = this.textEncoding;\n let latinLen;\n let nonLatinLen;\n\n if (!encoding) {\n // count latin alphabet symbols and 8-bit range symbols + control symbols\n // if there are more latin characters, then use quoted-printable\n // encoding, otherwise use base64\n nonLatinLen = (value.match(/[\\x00-\\x08\\x0B\\x0C\\x0E-\\x1F\\u0080-\\uFFFF]/g) || []).length;\n latinLen = (value.match(/[a-z]/gi) || []).length;\n // if there are more latin symbols than binary/unicode, then prefer Q, otherwise B\n encoding = nonLatinLen < latinLen ? 'Q' : 'B';\n }\n return encoding;\n }\n\n /**\n * Generates a message id\n *\n * @return {String} Random Message-ID value\n */\n _generateMessageId() {\n return (\n '<' +\n [2, 2, 2, 6].reduce(\n // crux to generate UUID-like random strings\n (prev, len) => prev + '-' + crypto.randomBytes(len).toString('hex'),\n crypto.randomBytes(4).toString('hex')\n ) +\n '@' +\n // try to use the domain of the FROM address or fallback to server hostname\n (this.getEnvelope().from || this.hostname || 'localhost').split('@').pop() +\n '>'\n );\n }\n}\n\nmodule.exports = MimeNode;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFjdGlvbi1icm93c2VyKS8uL25vZGVfbW9kdWxlcy8ucG5wbS9ub2RlbWFpbGVyQDcuMC4xMy9ub2RlX21vZHVsZXMvbm9kZW1haWxlci9saWIvbWltZS1ub2RlL2luZGV4LmpzIiwibWFwcGluZ3MiOiJBQUFBOztBQUVhOztBQUViLGVBQWUsbUJBQU8sQ0FBQyxzQkFBUTtBQUMvQixXQUFXLG1CQUFPLENBQUMsY0FBSTtBQUN2QixpQkFBaUIsbUJBQU8sQ0FBQywwSEFBYTtBQUN0QyxvQkFBb0IseURBQTZCO0FBQ2pELGVBQWUsbUJBQU8sQ0FBQyxzSEFBVzs7QUFFbEMsa0JBQWtCLG1CQUFPLENBQUMsOEhBQWU7QUFDekMsV0FBVyxtQkFBTyxDQUFDLDhHQUFPO0FBQzFCLGVBQWUsbUJBQU8sQ0FBQyxzSEFBVztBQUNsQyxzQkFBc0IsbUJBQU8sQ0FBQyxvSUFBa0I7QUFDaEQsZ0JBQWdCLG1CQUFPLENBQUMsb0hBQVU7QUFDbEMsb0JBQW9CLG1CQUFPLENBQUMscUlBQWdCOztBQUU1QyxrQkFBa0IsbUJBQU8sQ0FBQyxpSUFBYztBQUN4QyxlQUFlLG1CQUFPLENBQUMsMkhBQVc7O0FBRWxDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkIsV0FBVyxRQUFRO0FBQ25CLFdBQVcsUUFBUTtBQUNuQixXQUFXLFFBQVE7QUFDbkIsV0FBVyxRQUFRO0FBQ25CLFdBQVcsUUFBUTtBQUNuQixXQUFXLFNBQVM7QUFDcEIsV0FBVyxVQUFVO0FBQ3JCLFdBQVcsUUFBUTtBQUNuQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxrRUFBa0UsaUJBQWlCO0FBQ25GO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGtCQUFrQjtBQUNsQjtBQUNBOztBQUVBO0FBQ0E7QUFDQSxrQkFBa0I7QUFDbEI7QUFDQTs7QUFFQTtBQUNBO0FBQ0Esa0JBQWtCO0FBQ2xCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGtCQUFrQjtBQUNsQjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQjtBQUNsQjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQjtBQUNsQjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsUUFBUTtBQUN2QixlQUFlLFFBQVE7QUFDdkIsZ0JBQWdCLFFBQVE7QUFDeEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLFFBQVE7QUFDdkIsZ0JBQWdCLFFBQVE7QUFDeEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLFFBQVE7QUFDdkIsZ0JBQWdCLFFBQVE7QUFDeEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0IsUUFBUTtBQUN4QjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLDREQUE0RCxRQUFRO0FBQ3BFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLHNEQUFzRCxpQkFBaUI7QUFDdkUsUUFBUSxjQUFjO0FBQ3RCO0FBQ0EsZUFBZSxxQkFBcUI7QUFDcEMsZUFBZSxRQUFRO0FBQ3ZCLGdCQUFnQixRQUFRO0FBQ3hCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxzQkFBc0I7QUFDdEI7QUFDQTtBQUNBLGNBQWM7QUFDZCwyQkFBMkIsd0NBQXdDO0FBQ25FO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakIsY0FBYztBQUNkLDBCQUEwQjtBQUMxQjtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLG9EQUFvRCxTQUFTO0FBQzdEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0I7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxzREFBc0QsaUJBQWlCO0FBQ3ZFLFFBQVEsY0FBYztBQUN0QjtBQUNBLGVBQWUscUJBQXFCO0FBQ3BDLGVBQWUsUUFBUTtBQUN2QixnQkFBZ0IsUUFBUTtBQUN4QjtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQjtBQUN0QjtBQUNBO0FBQ0EsY0FBYztBQUNkLDJCQUEyQix3Q0FBd0M7QUFDbkU7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQixjQUFjO0FBQ2QsMEJBQTBCO0FBQzFCO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsUUFBUTtBQUN2QixlQUFlLFFBQVE7QUFDdkI7QUFDQTtBQUNBO0FBQ0Esb0RBQW9ELFNBQVM7QUFDN0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0IsUUFBUTtBQUN4QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQjtBQUN0QjtBQUNBO0FBQ0Esc0JBQXNCO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCLFFBQVE7QUFDekI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsbURBQW1ELFFBQVE7QUFDM0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLGdFQUFnRTtBQUNoRTtBQUNBO0FBQ0E7QUFDQSxvQ0FBb0M7QUFDcEM7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxTQUFTOztBQUVUO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0IsUUFBUTtBQUN4QjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQsdURBQXVELFNBQVM7QUFDaEU7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7O0FBRUE7QUFDQSx5REFBeUQsU0FBUztBQUNsRTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLFFBQVE7QUFDdkI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxRQUFRO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjs7QUFFQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EseUJBQXlCO0FBQ3pCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLHNCQUFzQjtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlCQUF5QjtBQUN6QjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQixrQkFBa0I7QUFDbEI7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQSxhQUFhO0FBQ2IsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQixRQUFRLDhCQUE4QjtBQUN0RDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQixRQUFRO0FBQ3hCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0IsUUFBUSw4QkFBOEI7QUFDdEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQSxTQUFTOztBQUVUOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCLFFBQVE7QUFDeEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsZUFBZSxzQkFBc0I7QUFDckM7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsT0FBTztBQUN0QixpQkFBaUIsUUFBUTtBQUN6QjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0EsYUFBYTs7QUFFYjtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJDQUEyQyw4QkFBOEI7QUFDekUsVUFBVTtBQUNWO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxPQUFPO0FBQ3RCLGdCQUFnQixPQUFPO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLFFBQVE7QUFDdkIsZ0JBQWdCLFFBQVE7QUFDeEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLFFBQVE7QUFDdkI7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQixRQUFRO0FBQ3hCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsUUFBUTtBQUN2QixlQUFlLFFBQVE7QUFDdkI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUJBQXlCO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQjs7QUFFckI7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsZUFBZSxPQUFPO0FBQ3RCLGVBQWUsT0FBTztBQUN0QixnQkFBZ0IsUUFBUTtBQUN4QjtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0Esd0VBQXdFLGdCQUFnQixRQUFRLGdCQUFnQjtBQUNoSCxrQkFBa0I7QUFDbEIsbUNBQW1DLHVDQUF1QyxHQUFHLGdCQUFnQjtBQUM3Rjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0EsK0JBQStCLHNDQUFzQyxHQUFHLG9CQUFvQjtBQUM1RjtBQUNBLFNBQVM7O0FBRVQ7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLE9BQU87QUFDdEIsZ0JBQWdCLFFBQVE7QUFDeEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxrQkFBa0IsS0FBSyxHQUFHLGNBQWM7QUFDeEM7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsZUFBZSxRQUFRO0FBQ3ZCLGlCQUFpQixRQUFRO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLFFBQVE7QUFDdkIsaUJBQWlCLFFBQVE7QUFDekI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsZUFBZSxRQUFRO0FBQ3ZCLGdCQUFnQixRQUFRO0FBQ3hCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0IsUUFBUTtBQUN4QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSIsInNvdXJjZXMiOlsiL1VzZXJzL21hcmNtaW50ZWwvUHJvamVjdHMvZS10aWIuY29tL25vZGVfbW9kdWxlcy8ucG5wbS9ub2RlbWFpbGVyQDcuMC4xMy9ub2RlX21vZHVsZXMvbm9kZW1haWxlci9saWIvbWltZS1ub2RlL2luZGV4LmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludCBuby11bmRlZmluZWQ6IDAsIHByZWZlci1zcHJlYWQ6IDAsIG5vLWNvbnRyb2wtcmVnZXg6IDAgKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCBjcnlwdG8gPSByZXF1aXJlKCdjcnlwdG8nKTtcbmNvbnN0IGZzID0gcmVxdWlyZSgnZnMnKTtcbmNvbnN0IHB1bnljb2RlID0gcmVxdWlyZSgnLi4vcHVueWNvZGUnKTtcbmNvbnN0IFBhc3NUaHJvdWdoID0gcmVxdWlyZSgnc3RyZWFtJykuUGFzc1Rocm91Z2g7XG5jb25zdCBzaGFyZWQgPSByZXF1aXJlKCcuLi9zaGFyZWQnKTtcblxuY29uc3QgbWltZUZ1bmNzID0gcmVxdWlyZSgnLi4vbWltZS1mdW5jcycpO1xuY29uc3QgcXAgPSByZXF1aXJlKCcuLi9xcCcpO1xuY29uc3QgYmFzZTY0ID0gcmVxdWlyZSgnLi4vYmFzZTY0Jyk7XG5jb25zdCBhZGRyZXNzcGFyc2VyID0gcmVxdWlyZSgnLi4vYWRkcmVzc3BhcnNlcicpO1xuY29uc3Qgbm1mZXRjaCA9IHJlcXVpcmUoJy4uL2ZldGNoJyk7XG5jb25zdCBMYXN0TmV3bGluZSA9IHJlcXVpcmUoJy4vbGFzdC1uZXdsaW5lJyk7XG5cbmNvbnN0IExlV2luZG93cyA9IHJlcXVpcmUoJy4vbGUtd2luZG93cycpO1xuY29uc3QgTGVVbml4ID0gcmVxdWlyZSgnLi9sZS11bml4Jyk7XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBtaW1lIHRyZWUgbm9kZS4gQXNzdW1lcyAnbXVsdGlwYXJ0LyonIGFzIHRoZSBjb250ZW50IHR5cGVcbiAqIGlmIGl0IGlzIGEgYnJhbmNoLCBhbnl0aGluZyBlbHNlIGNvdW50cyBhcyBsZWFmLiBJZiByb290Tm9kZSBpcyBtaXNzaW5nIGZyb21cbiAqIHRoZSBvcHRpb25zLCBhc3N1bWVzIHRoaXMgaXMgdGhlIHJvb3QuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IGNvbnRlbnRUeXBlIERlZmluZSB0aGUgY29udGVudCB0eXBlIGZvciB0aGUgbm9kZS4gQ2FuIGJlIGxlZnQgYmxhbmsgZm9yIGF0dGFjaG1lbnRzIChkZXJpdmVkIGZyb20gZmlsZW5hbWUpXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdIG9wdGlvbmFsIG9wdGlvbnNcbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucy5yb290Tm9kZV0gcm9vdCBub2RlIGZvciB0aGlzIHRyZWVcbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucy5wYXJlbnROb2RlXSBpbW1lZGlhdGUgcGFyZW50IGZvciB0aGlzIG5vZGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucy5maWxlbmFtZV0gZmlsZW5hbWUgZm9yIGFuIGF0dGFjaG1lbnQgbm9kZVxuICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLmJhc2VCb3VuZGFyeV0gc2hhcmVkIHBhcnQgb2YgdGhlIHVuaXF1ZSBtdWx0aXBhcnQgYm91bmRhcnlcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMua2VlcEJjY10gSWYgdHJ1ZSwgZG8gbm90IGV4Y2x1ZGUgQmNjIGZyb20gdGhlIGdlbmVyYXRlZCBoZWFkZXJzXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb3B0aW9ucy5ub3JtYWxpemVIZWFkZXJLZXldIG1ldGhvZCB0byBub3JtYWxpemUgaGVhZGVyIGtleXMgZm9yIGN1c3RvbSBjYXNlaW5nXG4gKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMudGV4dEVuY29kaW5nXSBlaXRoZXIgJ1EnICh0aGUgZGVmYXVsdCkgb3IgJ0InXG4gKi9cbmNsYXNzIE1pbWVOb2RlIHtcbiAgICBjb25zdHJ1Y3Rvcihjb250ZW50VHlwZSwgb3B0aW9ucykge1xuICAgICAgICB0aGlzLm5vZGVDb3VudGVyID0gMDtcblxuICAgICAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcblxuICAgICAgICAvKipcbiAgICAgICAgICogc2hhcmVkIHBhcnQgb2YgdGhlIHVuaXF1ZSBtdWx0aXBhcnQgYm91bmRhcnlcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuYmFzZUJvdW5kYXJ5ID0gb3B0aW9ucy5iYXNlQm91bmRhcnkgfHwgY3J5cHRvLnJhbmRvbUJ5dGVzKDgpLnRvU3RyaW5nKCdoZXgnKTtcbiAgICAgICAgdGhpcy5ib3VuZGFyeVByZWZpeCA9IG9wdGlvbnMuYm91bmRhcnlQcmVmaXggfHwgJy0tX05tUCc7XG5cbiAgICAgICAgdGhpcy5kaXNhYmxlRmlsZUFjY2VzcyA9ICEhb3B0aW9ucy5kaXNhYmxlRmlsZUFjY2VzcztcbiAgICAgICAgdGhpcy5kaXNhYmxlVXJsQWNjZXNzID0gISFvcHRpb25zLmRpc2FibGVVcmxBY2Nlc3M7XG5cbiAgICAgICAgdGhpcy5ub3JtYWxpemVIZWFkZXJLZXkgPSBvcHRpb25zLm5vcm1hbGl6ZUhlYWRlcktleTtcblxuICAgICAgICAvKipcbiAgICAgICAgICogSWYgZGF0ZSBoZWFkZXJzIGlzIG1pc3NpbmcgYW5kIGN1cnJlbnQgbm9kZSBpcyB0aGUgcm9vdCwgdGhpcyB2YWx1ZSBpcyB1c2VkIGluc3RlYWRcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuZGF0ZSA9IG5ldyBEYXRlKCk7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJvb3Qgbm9kZSBmb3IgY3VycmVudCBtaW1lIHRyZWVcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMucm9vdE5vZGUgPSBvcHRpb25zLnJvb3ROb2RlIHx8IHRoaXM7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIElmIHRydWUgaW5jbHVkZSBCY2MgaW4gZ2VuZXJhdGVkIGhlYWRlcnMgKGlmIGF2YWlsYWJsZSlcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMua2VlcEJjYyA9ICEhb3B0aW9ucy5rZWVwQmNjO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBJZiBmaWxlbmFtZSBpcyBzcGVjaWZpZWQgYnV0IGNvbnRlbnRUeXBlIGlzIG5vdCAocHJvYmFibHkgYW4gYXR0YWNobWVudClcbiAgICAgICAgICogZGV0ZWN0IHRoZSBjb250ZW50IHR5cGUgZnJvbSBmaWxlbmFtZSBleHRlbnNpb25cbiAgICAgICAgICovXG4gICAgICAgIGlmIChvcHRpb25zLmZpbGVuYW1lKSB7XG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIEZpbGVuYW1lIGZvciB0aGlzIG5vZGUuIFVzZWZ1bCB3aXRoIGF0dGFjaG1lbnRzXG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIHRoaXMuZmlsZW5hbWUgPSBvcHRpb25zLmZpbGVuYW1lO1xuICAgICAgICAgICAgaWYgKCFjb250ZW50VHlwZSkge1xuICAgICAgICAgICAgICAgIGNvbnRlbnRUeXBlID0gbWltZUZ1bmNzLmRldGVjdE1pbWVUeXBlKHRoaXMuZmlsZW5hbWUuc3BsaXQoJy4nKS5wb3AoKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvKipcbiAgICAgICAgICogSW5kaWNhdGVzIHdoaWNoIGVuY29kaW5nIHNob3VsZCBiZSB1c2VkIGZvciBoZWFkZXIgc3RyaW5nczogXCJRXCIgb3IgXCJCXCJcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMudGV4dEVuY29kaW5nID0gKG9wdGlvbnMudGV4dEVuY29kaW5nIHx8ICcnKS50b1N0cmluZygpLnRyaW0oKS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKTtcblxuICAgICAgICAvKipcbiAgICAgICAgICogSW1tZWRpYXRlIHBhcmVudCBmb3IgdGhpcyBub2RlIChvciB1bmRlZmluZWQgaWYgbm90IHNldClcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMucGFyZW50Tm9kZSA9IG9wdGlvbnMucGFyZW50Tm9kZTtcblxuICAgICAgICAvKipcbiAgICAgICAgICogSG9zdG5hbWUgZm9yIGRlZmF1bHQgbWVzc2FnZS1pZCB2YWx1ZXNcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuaG9zdG5hbWUgPSBvcHRpb25zLmhvc3RuYW1lO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBJZiBzZXQgdG8gJ3dpbicgdGhlbiB1c2VzIFxcclxcbiwgaWYgJ2xpbnV4JyB0aGVuIFxcbi4gSWYgbm90IHNldCAob3IgYHJhd2AgaXMgdXNlZCkgdGhlbiBuZXdsaW5lcyBhcmUga2VwdCBhcyBpcy5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMubmV3bGluZSA9IG9wdGlvbnMubmV3bGluZTtcblxuICAgICAgICAvKipcbiAgICAgICAgICogQW4gYXJyYXkgZm9yIHBvc3NpYmxlIGNoaWxkIG5vZGVzXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmNoaWxkTm9kZXMgPSBbXTtcblxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlZCBmb3IgZ2VuZXJhdGluZyB1bmlxdWUgYm91bmRhcmllcyAocHJlcGVuZGVkIHRvIHRoZSBzaGFyZWQgYmFzZSlcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuX25vZGVJZCA9ICsrdGhpcy5yb290Tm9kZS5ub2RlQ291bnRlcjtcblxuICAgICAgICAvKipcbiAgICAgICAgICogQSBsaXN0IG9mIGhlYWRlciB2YWx1ZXMgZm9yIHRoaXMgbm9kZSBpbiB0aGUgZm9ybSBvZiBbe2tleTonJywgdmFsdWU6Jyd9XVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5faGVhZGVycyA9IFtdO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUcnVlIGlmIHRoZSBjb250ZW50IG9ubHkgdXNlcyBBU0NJSSBwcmludGFibGUgY2hhcmFjdGVyc1xuICAgICAgICAgKiBAdHlwZSB7Qm9vbGVhbn1cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuX2lzUGxhaW5UZXh0ID0gZmFsc2U7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRydWUgaWYgdGhlIGNvbnRlbnQgaXMgcGxhaW4gdGV4dCBidXQgaGFzIGxvbmdlciBsaW5lcyB0aGFuIGFsbG93ZWRcbiAgICAgICAgICogQHR5cGUge0Jvb2xlYW59XG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLl9oYXNMb25nTGluZXMgPSBmYWxzZTtcblxuICAgICAgICAvKipcbiAgICAgICAgICogSWYgc2V0LCB1c2UgaW5zdGVhZCB0aGlzIHZhbHVlIGZvciBlbnZlbG9wZXMgaW5zdGVhZCBvZiBnZW5lcmF0aW5nIG9uZVxuICAgICAgICAgKiBAdHlwZSB7Qm9vbGVhbn1cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuX2VudmVsb3BlID0gZmFsc2U7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIElmIHNldCB0aGVuIHVzZSB0aGlzIHZhbHVlIGFzIHRoZSBzdHJlYW0gY29udGVudCBpbnN0ZWFkIG9mIGJ1aWxkaW5nIGl0XG4gICAgICAgICAqIEB0eXBlIHtTdHJpbmd8QnVmZmVyfFN0cmVhbX1cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuX3JhdyA9IGZhbHNlO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBZGRpdGlvbmFsIHRyYW5zZm9ybSBzdHJlYW1zIHRoYXQgdGhlIG1lc3NhZ2Ugd2lsbCBiZSBwaXBlZCBiZWZvcmVcbiAgICAgICAgICogZXhwb3NpbmcgYnkgY3JlYXRlUmVhZFN0cmVhbVxuICAgICAgICAgKiBAdHlwZSB7QXJyYXl9XG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLl90cmFuc2Zvcm1zID0gW107XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEFkZGl0aW9uYWwgcHJvY2VzcyBmdW5jdGlvbnMgdGhhdCB0aGUgbWVzc2FnZSB3aWxsIGJlIHBpcGVkIHRocm91Z2ggYmVmb3JlXG4gICAgICAgICAqIGV4cG9zaW5nIGJ5IGNyZWF0ZVJlYWRTdHJlYW0uIFRoZXNlIGZ1bmN0aW9ucyBhcmUgcnVuIGFmdGVyIHRyYW5zZm9ybXNcbiAgICAgICAgICogQHR5cGUge0FycmF5fVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5fcHJvY2Vzc0Z1bmNzID0gW107XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIElmIGNvbnRlbnQgdHlwZSBpcyBzZXQgKG9yIGRlcml2ZWQgZnJvbSB0aGUgZmlsZW5hbWUpIGFkZCBpdCB0byBoZWFkZXJzXG4gICAgICAgICAqL1xuICAgICAgICBpZiAoY29udGVudFR5cGUpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0SGVhZGVyKCdDb250ZW50LVR5cGUnLCBjb250ZW50VHlwZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLy8vLy8vIFBVQkxJQyBNRVRIT0RTXG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuZCBhcHBlbmRzIGEgY2hpbGQgbm9kZS5Bcmd1bWVudHMgcHJvdmlkZWQgYXJlIHBhc3NlZCB0byBNaW1lTm9kZSBjb25zdHJ1Y3RvclxuICAgICAqXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IFtjb250ZW50VHlwZV0gT3B0aW9uYWwgY29udGVudCB0eXBlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXSBPcHRpb25hbCBvcHRpb25zIG9iamVjdFxuICAgICAqIEByZXR1cm4ge09iamVjdH0gQ3JlYXRlZCBub2RlIG9iamVjdFxuICAgICAqL1xuICAgIGNyZWF0ZUNoaWxkKGNvbnRlbnRUeXBlLCBvcHRpb25zKSB7XG4gICAgICAgIGlmICghb3B0aW9ucyAmJiB0eXBlb2YgY29udGVudFR5cGUgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICBvcHRpb25zID0gY29udGVudFR5cGU7XG4gICAgICAgICAgICBjb250ZW50VHlwZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBsZXQgbm9kZSA9IG5ldyBNaW1lTm9kZShjb250ZW50VHlwZSwgb3B0aW9ucyk7XG4gICAgICAgIHRoaXMuYXBwZW5kQ2hpbGQobm9kZSk7XG4gICAgICAgIHJldHVybiBub2RlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFwcGVuZHMgYW4gZXhpc3Rpbmcgbm9kZSB0byB0aGUgbWltZSB0cmVlLiBSZW1vdmVzIHRoZSBub2RlIGZyb20gYW4gZXhpc3RpbmdcbiAgICAgKiB0cmVlIGlmIG5lZWRlZFxuICAgICAqXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGNoaWxkTm9kZSBub2RlIHRvIGJlIGFwcGVuZGVkXG4gICAgICogQHJldHVybiB7T2JqZWN0fSBBcHBlbmRlZCBub2RlIG9iamVjdFxuICAgICAqL1xuICAgIGFwcGVuZENoaWxkKGNoaWxkTm9kZSkge1xuICAgICAgICBpZiAoY2hpbGROb2RlLnJvb3ROb2RlICE9PSB0aGlzLnJvb3ROb2RlKSB7XG4gICAgICAgICAgICBjaGlsZE5vZGUucm9vdE5vZGUgPSB0aGlzLnJvb3ROb2RlO1xuICAgICAgICAgICAgY2hpbGROb2RlLl9ub2RlSWQgPSArK3RoaXMucm9vdE5vZGUubm9kZUNvdW50ZXI7XG4gICAgICAgIH1cblxuICAgICAgICBjaGlsZE5vZGUucGFyZW50Tm9kZSA9IHRoaXM7XG5cbiAgICAgICAgdGhpcy5jaGlsZE5vZGVzLnB1c2goY2hpbGROb2RlKTtcbiAgICAgICAgcmV0dXJuIGNoaWxkTm9kZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXBsYWNlcyBjdXJyZW50IG5vZGUgd2l0aCBhbm90aGVyIG5vZGVcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBub2RlIFJlcGxhY2VtZW50IG5vZGVcbiAgICAgKiBAcmV0dXJuIHtPYmplY3R9IFJlcGxhY2VtZW50IG5vZGVcbiAgICAgKi9cbiAgICByZXBsYWNlKG5vZGUpIHtcbiAgICAgICAgaWYgKG5vZGUgPT09IHRoaXMpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5wYXJlbnROb2RlLmNoaWxkTm9kZXMuZm9yRWFjaCgoY2hpbGROb2RlLCBpKSA9PiB7XG4gICAgICAgICAgICBpZiAoY2hpbGROb2RlID09PSB0aGlzKSB7XG4gICAgICAgICAgICAgICAgbm9kZS5yb290Tm9kZSA9IHRoaXMucm9vdE5vZGU7XG4gICAgICAgICAgICAgICAgbm9kZS5wYXJlbnROb2RlID0gdGhpcy5wYXJlbnROb2RlO1xuICAgICAgICAgICAgICAgIG5vZGUuX25vZGVJZCA9IHRoaXMuX25vZGVJZDtcblxuICAgICAgICAgICAgICAgIHRoaXMucm9vdE5vZGUgPSB0aGlzO1xuICAgICAgICAgICAgICAgIHRoaXMucGFyZW50Tm9kZSA9IHVuZGVmaW5lZDtcblxuICAgICAgICAgICAgICAgIG5vZGUucGFyZW50Tm9kZS5jaGlsZE5vZGVzW2ldID0gbm9kZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyBjdXJyZW50IG5vZGUgZnJvbSB0aGUgbWltZSB0cmVlXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtPYmplY3R9IHJlbW92ZWQgbm9kZVxuICAgICAqL1xuICAgIHJlbW92ZSgpIHtcbiAgICAgICAgaWYgKCF0aGlzLnBhcmVudE5vZGUpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IHRoaXMucGFyZW50Tm9kZS5jaGlsZE5vZGVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5wYXJlbnROb2RlLmNoaWxkTm9kZXNbaV0gPT09IHRoaXMpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnBhcmVudE5vZGUuY2hpbGROb2Rlcy5zcGxpY2UoaSwgMSk7XG4gICAgICAgICAgICAgICAgdGhpcy5wYXJlbnROb2RlID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIHRoaXMucm9vdE5vZGUgPSB0aGlzO1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyBhIGhlYWRlciB2YWx1ZS4gSWYgdGhlIHZhbHVlIGZvciBzZWxlY3RlZCBrZXkgZXhpc3RzLCBpdCBpcyBvdmVyd3JpdHRlbi5cbiAgICAgKiBZb3UgY2FuIHNldCBtdWx0aXBsZSB2YWx1ZXMgYXMgd2VsbCBieSB1c2luZyBbe2tleTonJywgdmFsdWU6Jyd9XSBvclxuICAgICAqIHtrZXk6ICd2YWx1ZSd9IGFzIHRoZSBmaXJzdCBhcmd1bWVudC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfEFycmF5fE9iamVjdH0ga2V5IEhlYWRlciBrZXkgb3IgYSBsaXN0IG9mIGtleSB2YWx1ZSBwYWlyc1xuICAgICAqIEBwYXJhbSB7U3RyaW5nfSB2YWx1ZSBIZWFkZXIgdmFsdWVcbiAgICAgKiBAcmV0dXJuIHtPYmplY3R9IGN1cnJlbnQgbm9kZVxuICAgICAqL1xuICAgIHNldEhlYWRlcihrZXksIHZhbHVlKSB7XG4gICAgICAgIGxldCBhZGRlZCA9IGZhbHNlLFxuICAgICAgICAgICAgaGVhZGVyVmFsdWU7XG5cbiAgICAgICAgLy8gQWxsb3cgc2V0dGluZyBtdWx0aXBsZSBoZWFkZXJzIGF0IG9uY2VcbiAgICAgICAgaWYgKCF2YWx1ZSAmJiBrZXkgJiYgdHlwZW9mIGtleSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgIC8vIGFsbG93IHtrZXk6J2NvbnRlbnQtdHlwZScsIHZhbHVlOiAndGV4dC9wbGFpbid9XG4gICAgICAgICAgICBpZiAoa2V5LmtleSAmJiAndmFsdWUnIGluIGtleSkge1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0SGVhZGVyKGtleS5rZXksIGtleS52YWx1ZSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoa2V5KSkge1xuICAgICAgICAgICAgICAgIC8vIGFsbG93IFt7a2V5Oidjb250ZW50LXR5cGUnLCB2YWx1ZTogJ3RleHQvcGxhaW4nfV1cbiAgICAgICAgICAgICAgICBrZXkuZm9yRWFjaChpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRIZWFkZXIoaS5rZXksIGkudmFsdWUpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBhbGxvdyB7J2NvbnRlbnQtdHlwZSc6ICd0ZXh0L3BsYWluJ31cbiAgICAgICAgICAgICAgICBPYmplY3Qua2V5cyhrZXkpLmZvckVhY2goaSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0SGVhZGVyKGksIGtleVtpXSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfVxuXG4gICAgICAgIGtleSA9IHRoaXMuX25vcm1hbGl6ZUhlYWRlcktleShrZXkpO1xuXG4gICAgICAgIGhlYWRlclZhbHVlID0ge1xuICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgdmFsdWVcbiAgICAgICAgfTtcblxuICAgICAgICAvLyBDaGVjayBpZiB0aGUgdmFsdWUgZXhpc3RzIGFuZCBvdmVyd3JpdGVcbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IHRoaXMuX2hlYWRlcnMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9oZWFkZXJzW2ldLmtleSA9PT0ga2V5KSB7XG4gICAgICAgICAgICAgICAgaWYgKCFhZGRlZCkge1xuICAgICAgICAgICAgICAgICAgICAvLyByZXBsYWNlIHRoZSBmaXJzdCBtYXRjaFxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9oZWFkZXJzW2ldID0gaGVhZGVyVmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIGFkZGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyByZW1vdmUgZm9sbG93aW5nIG1hdGNoZXNcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5faGVhZGVycy5zcGxpY2UoaSwgMSk7XG4gICAgICAgICAgICAgICAgICAgIGktLTtcbiAgICAgICAgICAgICAgICAgICAgbGVuLS07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gbWF0Y2ggbm90IGZvdW5kLCBhcHBlbmQgdGhlIHZhbHVlXG4gICAgICAgIGlmICghYWRkZWQpIHtcbiAgICAgICAgICAgIHRoaXMuX2hlYWRlcnMucHVzaChoZWFkZXJWYWx1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBZGRzIGEgaGVhZGVyIHZhbHVlLiBJZiB0aGUgdmFsdWUgZm9yIHNlbGVjdGVkIGtleSBleGlzdHMsIHRoZSB2YWx1ZSBpcyBhcHBlbmRlZFxuICAgICAqIGFzIGEgbmV3IGZpZWxkIGFuZCBvbGQgb25lIGlzIG5vdCB0b3VjaGVkLlxuICAgICAqIFlvdSBjYW4gc2V0IG11bHRpcGxlIHZhbHVlcyBhcyB3ZWxsIGJ5IHVzaW5nIFt7a2V5OicnLCB2YWx1ZTonJ31dIG9yXG4gICAgICoge2tleTogJ3ZhbHVlJ30gYXMgdGhlIGZpcnN0IGFyZ3VtZW50LlxuICAgICAqXG4gICAgICogQHBhcmFtIHtTdHJpbmd8QXJyYXl8T2JqZWN0fSBrZXkgSGVhZGVyIGtleSBvciBhIGxpc3Qgb2Yga2V5IHZhbHVlIHBhaXJzXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IHZhbHVlIEhlYWRlciB2YWx1ZVxuICAgICAqIEByZXR1cm4ge09iamVjdH0gY3VycmVudCBub2RlXG4gICAgICovXG4gICAgYWRkSGVhZGVyKGtleSwgdmFsdWUpIHtcbiAgICAgICAgLy8gQWxsb3cgc2V0dGluZyBtdWx0aXBsZSBoZWFkZXJzIGF0IG9uY2VcbiAgICAgICAgaWYgKCF2YWx1ZSAmJiBrZXkgJiYgdHlwZW9mIGtleSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgIC8vIGFsbG93IHtrZXk6J2NvbnRlbnQtdHlwZScsIHZhbHVlOiAndGV4dC9wbGFpbid9XG4gICAgICAgICAgICBpZiAoa2V5LmtleSAmJiBrZXkudmFsdWUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFkZEhlYWRlcihrZXkua2V5LCBrZXkudmFsdWUpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGtleSkpIHtcbiAgICAgICAgICAgICAgICAvLyBhbGxvdyBbe2tleTonY29udGVudC10eXBlJywgdmFsdWU6ICd0ZXh0L3BsYWluJ31dXG4gICAgICAgICAgICAgICAga2V5LmZvckVhY2goaSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkSGVhZGVyKGkua2V5LCBpLnZhbHVlKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gYWxsb3cgeydjb250ZW50LXR5cGUnOiAndGV4dC9wbGFpbid9XG4gICAgICAgICAgICAgICAgT2JqZWN0LmtleXMoa2V5KS5mb3JFYWNoKGkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZEhlYWRlcihpLCBrZXlbaV0pO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICAgIHZhbHVlLmZvckVhY2godmFsID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmFkZEhlYWRlcihrZXksIHZhbCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5faGVhZGVycy5wdXNoKHtcbiAgICAgICAgICAgIGtleTogdGhpcy5fbm9ybWFsaXplSGVhZGVyS2V5KGtleSksXG4gICAgICAgICAgICB2YWx1ZVxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXRyaWV2ZXMgdGhlIGZpcnN0IG1hdGhjaW5nIHZhbHVlIG9mIGEgc2VsZWN0ZWQga2V5XG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30ga2V5IEtleSB0byBzZWFyY2ggZm9yXG4gICAgICogQHJldHVuIHtTdHJpbmd9IFZhbHVlIGZvciB0aGUga2V5XG4gICAgICovXG4gICAgZ2V0SGVhZGVyKGtleSkge1xuICAgICAgICBrZXkgPSB0aGlzLl9ub3JtYWxpemVIZWFkZXJLZXkoa2V5KTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IHRoaXMuX2hlYWRlcnMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9oZWFkZXJzW2ldLmtleSA9PT0ga2V5KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2hlYWRlcnNbaV0udmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIGJvZHkgY29udGVudCBmb3IgY3VycmVudCBub2RlLiBJZiB0aGUgdmFsdWUgaXMgYSBzdHJpbmcsIGNoYXJzZXQgaXMgYWRkZWQgYXV0b21hdGljYWxseVxuICAgICAqIHRvIENvbnRlbnQtVHlwZSAoaWYgaXQgaXMgdGV4dC8qKS4gSWYgdGhlIHZhbHVlIGlzIGEgQnVmZmVyLCB5b3UgbmVlZCB0byBzcGVjaWZ5XG4gICAgICogdGhlIGNoYXJzZXQgeW91cnNlbGZcbiAgICAgKlxuICAgICAqIEBwYXJhbSAoU3RyaW5nfEJ1ZmZlcikgY29udGVudCBCb2R5IGNvbnRlbnRcbiAgICAgKiBAcmV0dXJuIHtPYmplY3R9IGN1cnJlbnQgbm9kZVxuICAgICAqL1xuICAgIHNldENvbnRlbnQoY29udGVudCkge1xuICAgICAgICB0aGlzLmNvbnRlbnQgPSBjb250ZW50O1xuICAgICAgICBpZiAodHlwZW9mIHRoaXMuY29udGVudC5waXBlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAvLyBwcmUtc3RyZWFtIGhhbmRsZXIuIG1pZ2h0IGJlIHRyaWdnZXJlZCBpZiBhIHN0cmVhbSBpcyBzZXQgYXMgY29udGVudFxuICAgICAgICAgICAgLy8gYW5kICdlcnJvcicgZmlyZXMgYmVmb3JlIGFueXRoaW5nIGlzIGRvbmUgd2l0aCB0aGlzIHN0cmVhbVxuICAgICAgICAgICAgdGhpcy5fY29udGVudEVycm9ySGFuZGxlciA9IGVyciA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5jb250ZW50LnJlbW92ZUxpc3RlbmVyKCdlcnJvcicsIHRoaXMuX2NvbnRlbnRFcnJvckhhbmRsZXIpO1xuICAgICAgICAgICAgICAgIHRoaXMuY29udGVudCA9IGVycjtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICB0aGlzLmNvbnRlbnQub25jZSgnZXJyb3InLCB0aGlzLl9jb250ZW50RXJyb3JIYW5kbGVyKTtcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgdGhpcy5jb250ZW50ID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgdGhpcy5faXNQbGFpblRleHQgPSBtaW1lRnVuY3MuaXNQbGFpblRleHQodGhpcy5jb250ZW50KTtcbiAgICAgICAgICAgIGlmICh0aGlzLl9pc1BsYWluVGV4dCAmJiBtaW1lRnVuY3MuaGFzTG9uZ2VyTGluZXModGhpcy5jb250ZW50LCA3NikpIHtcbiAgICAgICAgICAgICAgICAvLyBJZiB0aGVyZSBhcmUgbGluZXMgbG9uZ2VyIHRoYW4gNzYgc3ltYm9scy9ieXRlcyBkbyBub3QgdXNlIDdiaXRcbiAgICAgICAgICAgICAgICB0aGlzLl9oYXNMb25nTGluZXMgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIGJ1aWxkKGNhbGxiYWNrKSB7XG4gICAgICAgIGxldCBwcm9taXNlO1xuXG4gICAgICAgIGlmICghY2FsbGJhY2spIHtcbiAgICAgICAgICAgIHByb21pc2UgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICAgICAgY2FsbGJhY2sgPSBzaGFyZWQuY2FsbGJhY2tQcm9taXNlKHJlc29sdmUsIHJlamVjdCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBzdHJlYW0gPSB0aGlzLmNyZWF0ZVJlYWRTdHJlYW0oKTtcbiAgICAgICAgbGV0IGJ1ZiA9IFtdO1xuICAgICAgICBsZXQgYnVmbGVuID0gMDtcbiAgICAgICAgbGV0IHJldHVybmVkID0gZmFsc2U7XG5cbiAgICAgICAgc3RyZWFtLm9uKCdyZWFkYWJsZScsICgpID0+IHtcbiAgICAgICAgICAgIGxldCBjaHVuaztcblxuICAgICAgICAgICAgd2hpbGUgKChjaHVuayA9IHN0cmVhbS5yZWFkKCkpICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgYnVmLnB1c2goY2h1bmspO1xuICAgICAgICAgICAgICAgIGJ1ZmxlbiArPSBjaHVuay5sZW5ndGg7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHN0cmVhbS5vbmNlKCdlcnJvcicsIGVyciA9PiB7XG4gICAgICAgICAgICBpZiAocmV0dXJuZWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm5lZCA9IHRydWU7XG5cbiAgICAgICAgICAgIHJldHVybiBjYWxsYmFjayhlcnIpO1xuICAgICAgICB9KTtcblxuICAgICAgICBzdHJlYW0ub25jZSgnZW5kJywgY2h1bmsgPT4ge1xuICAgICAgICAgICAgaWYgKHJldHVybmVkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuZWQgPSB0cnVlO1xuXG4gICAgICAgICAgICBpZiAoY2h1bmsgJiYgY2h1bmsubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgYnVmLnB1c2goY2h1bmspO1xuICAgICAgICAgICAgICAgIGJ1ZmxlbiArPSBjaHVuay5sZW5ndGg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gY2FsbGJhY2sobnVsbCwgQnVmZmVyLmNvbmNhdChidWYsIGJ1ZmxlbikpO1xuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gcHJvbWlzZTtcbiAgICB9XG5cbiAgICBnZXRUcmFuc2ZlckVuY29kaW5nKCkge1xuICAgICAgICBsZXQgdHJhbnNmZXJFbmNvZGluZyA9IGZhbHNlO1xuICAgICAgICBsZXQgY29udGVudFR5cGUgPSAodGhpcy5nZXRIZWFkZXIoJ0NvbnRlbnQtVHlwZScpIHx8ICcnKS50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkudHJpbSgpO1xuXG4gICAgICAgIGlmICh0aGlzLmNvbnRlbnQpIHtcbiAgICAgICAgICAgIHRyYW5zZmVyRW5jb2RpbmcgPSAodGhpcy5nZXRIZWFkZXIoJ0NvbnRlbnQtVHJhbnNmZXItRW5jb2RpbmcnKSB8fCAnJykudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpLnRyaW0oKTtcbiAgICAgICAgICAgIGlmICghdHJhbnNmZXJFbmNvZGluZyB8fCAhWydiYXNlNjQnLCAncXVvdGVkLXByaW50YWJsZSddLmluY2x1ZGVzKHRyYW5zZmVyRW5jb2RpbmcpKSB7XG4gICAgICAgICAgICAgICAgaWYgKC9edGV4dFxcLy9pLnRlc3QoY29udGVudFR5cGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZXJlIGFyZSBubyBzcGVjaWFsIHN5bWJvbHMsIG5vIG5lZWQgdG8gbW9kaWZ5IHRoZSB0ZXh0XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl9pc1BsYWluVGV4dCAmJiAhdGhpcy5faGFzTG9uZ0xpbmVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2ZlckVuY29kaW5nID0gJzdiaXQnO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiB0aGlzLmNvbnRlbnQgPT09ICdzdHJpbmcnIHx8IHRoaXMuY29udGVudCBpbnN0YW5jZW9mIEJ1ZmZlcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGV0ZWN0IHByZWZlcnJlZCBlbmNvZGluZyBmb3Igc3RyaW5nIHZhbHVlXG4gICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2ZlckVuY29kaW5nID0gdGhpcy5fZ2V0VGV4dEVuY29kaW5nKHRoaXMuY29udGVudCkgPT09ICdRJyA/ICdxdW90ZWQtcHJpbnRhYmxlJyA6ICdiYXNlNjQnO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2UgY2FuIG5vdCBjaGVjayBjb250ZW50IGZvciBhIHN0cmVhbSwgc28gZWl0aGVyIHVzZSBwcmVmZXJyZWQgZW5jb2Rpbmcgb3IgZmFsbGJhY2sgdG8gUVBcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZmVyRW5jb2RpbmcgPSB0aGlzLnRleHRFbmNvZGluZyA9PT0gJ0InID8gJ2Jhc2U2NCcgOiAncXVvdGVkLXByaW50YWJsZSc7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCEvXihtdWx0aXBhcnR8bWVzc2FnZSlcXC8vaS50ZXN0KGNvbnRlbnRUeXBlKSkge1xuICAgICAgICAgICAgICAgICAgICB0cmFuc2ZlckVuY29kaW5nID0gdHJhbnNmZXJFbmNvZGluZyB8fCAnYmFzZTY0JztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRyYW5zZmVyRW5jb2Rpbmc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQnVpbGRzIHRoZSBoZWFkZXIgYmxvY2sgZm9yIHRoZSBtaW1lIG5vZGUuIEFwcGVuZCBcXHJcXG5cXHJcXG4gYmVmb3JlIHdyaXRpbmcgdGhlIGNvbnRlbnRcbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtTdHJpbmd9IEhlYWRlcnNcbiAgICAgKi9cbiAgICBidWlsZEhlYWRlcnMoKSB7XG4gICAgICAgIGxldCB0cmFuc2ZlckVuY29kaW5nID0gdGhpcy5nZXRUcmFuc2ZlckVuY29kaW5nKCk7XG4gICAgICAgIGxldCBoZWFkZXJzID0gW107XG5cbiAgICAgICAgaWYgKHRyYW5zZmVyRW5jb2RpbmcpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0SGVhZGVyKCdDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nJywgdHJhbnNmZXJFbmNvZGluZyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5maWxlbmFtZSAmJiAhdGhpcy5nZXRIZWFkZXIoJ0NvbnRlbnQtRGlzcG9zaXRpb24nKSkge1xuICAgICAgICAgICAgdGhpcy5zZXRIZWFkZXIoJ0NvbnRlbnQtRGlzcG9zaXRpb24nLCAnYXR0YWNobWVudCcpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRW5zdXJlIG1hbmRhdG9yeSBoZWFkZXIgZmllbGRzXG4gICAgICAgIGlmICh0aGlzLnJvb3ROb2RlID09PSB0aGlzKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuZ2V0SGVhZGVyKCdEYXRlJykpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNldEhlYWRlcignRGF0ZScsIHRoaXMuZGF0ZS50b1VUQ1N0cmluZygpLnJlcGxhY2UoL0dNVC8sICcrMDAwMCcpKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gZW5zdXJlIHRoYXQgTWVzc2FnZS1JZCBpcyBwcmVzZW50XG4gICAgICAgICAgICB0aGlzLm1lc3NhZ2VJZCgpO1xuXG4gICAgICAgICAgICBpZiAoIXRoaXMuZ2V0SGVhZGVyKCdNSU1FLVZlcnNpb24nKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0SGVhZGVyKCdNSU1FLVZlcnNpb24nLCAnMS4wJyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEVuc3VyZSB0aGF0IENvbnRlbnQtVHlwZSBpcyB0aGUgbGFzdCBoZWFkZXIgZm9yIHRoZSByb290IG5vZGVcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSB0aGlzLl9oZWFkZXJzLmxlbmd0aCAtIDI7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgICAgICAgbGV0IGhlYWRlciA9IHRoaXMuX2hlYWRlcnNbaV07XG4gICAgICAgICAgICAgICAgaWYgKGhlYWRlci5rZXkgPT09ICdDb250ZW50LVR5cGUnKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2hlYWRlcnMuc3BsaWNlKGksIDEpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9oZWFkZXJzLnB1c2goaGVhZGVyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9oZWFkZXJzLmZvckVhY2goaGVhZGVyID0+IHtcbiAgICAgICAgICAgIGxldCBrZXkgPSBoZWFkZXIua2V5O1xuICAgICAgICAgICAgbGV0IHZhbHVlID0gaGVhZGVyLnZhbHVlO1xuICAgICAgICAgICAgbGV0IHN0cnVjdHVyZWQ7XG4gICAgICAgICAgICBsZXQgcGFyYW07XG4gICAgICAgICAgICBsZXQgb3B0aW9ucyA9IHt9O1xuICAgICAgICAgICAgbGV0IGZvcm1hdHRlZEhlYWRlcnMgPSBbJ0Zyb20nLCAnU2VuZGVyJywgJ1RvJywgJ0NjJywgJ0JjYycsICdSZXBseS1UbycsICdEYXRlJywgJ1JlZmVyZW5jZXMnXTtcblxuICAgICAgICAgICAgaWYgKHZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgIWZvcm1hdHRlZEhlYWRlcnMuaW5jbHVkZXMoa2V5KSkge1xuICAgICAgICAgICAgICAgIE9iamVjdC5rZXlzKHZhbHVlKS5mb3JFYWNoKGtleSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChrZXkgIT09ICd2YWx1ZScpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnNba2V5XSA9IHZhbHVlW2tleV07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB2YWx1ZSA9ICh2YWx1ZS52YWx1ZSB8fCAnJykudG9TdHJpbmcoKTtcbiAgICAgICAgICAgICAgICBpZiAoIXZhbHVlLnRyaW0oKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAob3B0aW9ucy5wcmVwYXJlZCkge1xuICAgICAgICAgICAgICAgIC8vIGhlYWRlciB2YWx1ZSBpc1xuICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLmZvbGRMaW5lcykge1xuICAgICAgICAgICAgICAgICAgICBoZWFkZXJzLnB1c2gobWltZUZ1bmNzLmZvbGRMaW5lcyhrZXkgKyAnOiAnICsgdmFsdWUpKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBoZWFkZXJzLnB1c2goa2V5ICsgJzogJyArIHZhbHVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBzd2l0Y2ggKGhlYWRlci5rZXkpIHtcbiAgICAgICAgICAgICAgICBjYXNlICdDb250ZW50LURpc3Bvc2l0aW9uJzpcbiAgICAgICAgICAgICAgICAgICAgc3RydWN0dXJlZCA9IG1pbWVGdW5jcy5wYXJzZUhlYWRlclZhbHVlKHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuZmlsZW5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdHVyZWQucGFyYW1zLmZpbGVuYW1lID0gdGhpcy5maWxlbmFtZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IG1pbWVGdW5jcy5idWlsZEhlYWRlclZhbHVlKHN0cnVjdHVyZWQpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgIGNhc2UgJ0NvbnRlbnQtVHlwZSc6XG4gICAgICAgICAgICAgICAgICAgIHN0cnVjdHVyZWQgPSBtaW1lRnVuY3MucGFyc2VIZWFkZXJWYWx1ZSh2YWx1ZSk7XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5faGFuZGxlQ29udGVudFR5cGUoc3RydWN0dXJlZCk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0dXJlZC52YWx1ZS5tYXRjaCgvXnRleHRcXC9wbGFpblxcYi8pICYmXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlb2YgdGhpcy5jb250ZW50ID09PSAnc3RyaW5nJyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgL1tcXHUwMDgwLVxcdUZGRkZdLy50ZXN0KHRoaXMuY29udGVudClcbiAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3R1cmVkLnBhcmFtcy5jaGFyc2V0ID0gJ3V0Zi04JztcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlID0gbWltZUZ1bmNzLmJ1aWxkSGVhZGVyVmFsdWUoc3RydWN0dXJlZCk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuZmlsZW5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFkZCBzdXBwb3J0IGZvciBub24tY29tcGxpYW50IGNsaWVudHMgbGlrZSBRUSB3ZWJtYWlsXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSBjYW4ndCBidWlsZCB0aGUgdmFsdWUgd2l0aCBidWlsZEhlYWRlclZhbHVlIGFzIHRoZSB2YWx1ZSBpcyBub24gc3RhbmRhcmQgYW5kXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB3b3VsZCBiZSBjb252ZXJ0ZWQgdG8gcGFyYW1ldGVyIGNvbnRpbnVhdGlvbiBlbmNvZGluZyB0aGF0IHdlIGRvIG5vdCB3YW50XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJhbSA9IHRoaXMuX2VuY29kZVdvcmRzKHRoaXMuZmlsZW5hbWUpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyYW0gIT09IHRoaXMuZmlsZW5hbWUgfHwgL1tcXHMnXCJcXFxcOzovPSgpLDw+QFtcXF0/XXxeLS8udGVzdChwYXJhbSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbmNsdWRlIHZhbHVlIGluIHF1b3RlcyBpZiBuZWVkZWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbSA9ICdcIicgKyBwYXJhbSArICdcIic7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSArPSAnOyBuYW1lPScgKyBwYXJhbTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgIGNhc2UgJ0JjYyc6XG4gICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5rZWVwQmNjKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBza2lwIEJDQyB2YWx1ZXNcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFsdWUgPSB0aGlzLl9lbmNvZGVIZWFkZXJWYWx1ZShrZXksIHZhbHVlKTtcblxuICAgICAgICAgICAgLy8gc2tpcCBlbXB0eSBsaW5lc1xuICAgICAgICAgICAgaWYgKCEodmFsdWUgfHwgJycpLnRvU3RyaW5nKCkudHJpbSgpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodHlwZW9mIHRoaXMubm9ybWFsaXplSGVhZGVyS2V5ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgbGV0IG5vcm1hbGl6ZWQgPSB0aGlzLm5vcm1hbGl6ZUhlYWRlcktleShrZXksIHZhbHVlKTtcbiAgICAgICAgICAgICAgICBpZiAobm9ybWFsaXplZCAmJiB0eXBlb2Ygbm9ybWFsaXplZCA9PT0gJ3N0cmluZycgJiYgbm9ybWFsaXplZC5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAga2V5ID0gbm9ybWFsaXplZDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGhlYWRlcnMucHVzaChtaW1lRnVuY3MuZm9sZExpbmVzKGtleSArICc6ICcgKyB2YWx1ZSwgNzYpKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIGhlYWRlcnMuam9pbignXFxyXFxuJyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU3RyZWFtcyB0aGUgcmZjMjgyMiBtZXNzYWdlIGZyb20gdGhlIGN1cnJlbnQgbm9kZS4gSWYgdGhpcyBpcyBhIHJvb3Qgbm9kZSxcbiAgICAgKiBtYW5kYXRvcnkgaGVhZGVyIGZpZWxkcyBhcmUgc2V0IGlmIG1pc3NpbmcgKERhdGUsIE1lc3NhZ2UtSWQsIE1JTUUtVmVyc2lvbilcbiAgICAgKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ30gQ29tcGlsZWQgbWVzc2FnZVxuICAgICAqL1xuICAgIGNyZWF0ZVJlYWRTdHJlYW0ob3B0aW9ucykge1xuICAgICAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcblxuICAgICAgICBsZXQgc3RyZWFtID0gbmV3IFBhc3NUaHJvdWdoKG9wdGlvbnMpO1xuICAgICAgICBsZXQgb3V0cHV0U3RyZWFtID0gc3RyZWFtO1xuICAgICAgICBsZXQgdHJhbnNmb3JtO1xuXG4gICAgICAgIHRoaXMuc3RyZWFtKHN0cmVhbSwgb3B0aW9ucywgZXJyID0+IHtcbiAgICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgICAgICBvdXRwdXRTdHJlYW0uZW1pdCgnZXJyb3InLCBlcnIpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHN0cmVhbS5lbmQoKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IHRoaXMuX3RyYW5zZm9ybXMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICAgIHRyYW5zZm9ybSA9IHR5cGVvZiB0aGlzLl90cmFuc2Zvcm1zW2ldID09PSAnZnVuY3Rpb24nID8gdGhpcy5fdHJhbnNmb3Jtc1tpXSgpIDogdGhpcy5fdHJhbnNmb3Jtc1tpXTtcbiAgICAgICAgICAgIG91dHB1dFN0cmVhbS5vbmNlKCdlcnJvcicsIGVyciA9PiB7XG4gICAgICAgICAgICAgICAgdHJhbnNmb3JtLmVtaXQoJ2Vycm9yJywgZXJyKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgb3V0cHV0U3RyZWFtID0gb3V0cHV0U3RyZWFtLnBpcGUodHJhbnNmb3JtKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGVuc3VyZSB0ZXJtaW5hdGluZyBuZXdsaW5lIGFmdGVyIHBvc3NpYmxlIHVzZXIgdHJhbnNmb3Jtc1xuICAgICAgICB0cmFuc2Zvcm0gPSBuZXcgTGFzdE5ld2xpbmUoKTtcbiAgICAgICAgb3V0cHV0U3RyZWFtLm9uY2UoJ2Vycm9yJywgZXJyID0+IHtcbiAgICAgICAgICAgIHRyYW5zZm9ybS5lbWl0KCdlcnJvcicsIGVycik7XG4gICAgICAgIH0pO1xuICAgICAgICBvdXRwdXRTdHJlYW0gPSBvdXRwdXRTdHJlYW0ucGlwZSh0cmFuc2Zvcm0pO1xuXG4gICAgICAgIC8vIGRraW0gYW5kIHN0dWZmXG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSB0aGlzLl9wcm9jZXNzRnVuY3MubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICAgIHRyYW5zZm9ybSA9IHRoaXMuX3Byb2Nlc3NGdW5jc1tpXTtcbiAgICAgICAgICAgIG91dHB1dFN0cmVhbSA9IHRyYW5zZm9ybShvdXRwdXRTdHJlYW0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMubmV3bGluZSkge1xuICAgICAgICAgICAgY29uc3Qgd2luYnJlYWsgPSBbJ3dpbicsICd3aW5kb3dzJywgJ2RvcycsICdcXHJcXG4nXS5pbmNsdWRlcyh0aGlzLm5ld2xpbmUudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpKTtcbiAgICAgICAgICAgIGNvbnN0IG5ld2xpbmVUcmFuc2Zvcm0gPSB3aW5icmVhayA/IG5ldyBMZVdpbmRvd3MoKSA6IG5ldyBMZVVuaXgoKTtcblxuICAgICAgICAgICAgY29uc3Qgc3RyZWFtID0gb3V0cHV0U3RyZWFtLnBpcGUobmV3bGluZVRyYW5zZm9ybSk7XG4gICAgICAgICAgICBvdXRwdXRTdHJlYW0ub24oJ2Vycm9yJywgZXJyID0+IHN0cmVhbS5lbWl0KCdlcnJvcicsIGVycikpO1xuICAgICAgICAgICAgcmV0dXJuIHN0cmVhbTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBvdXRwdXRTdHJlYW07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQXBwZW5kcyBhIHRyYW5zZm9ybSBzdHJlYW0gb2JqZWN0IHRvIHRoZSB0cmFuc2Zvcm1zIGxpc3QuIEZpbmFsIG91dHB1dFxuICAgICAqIGlzIHBhc3NlZCB0aHJvdWdoIHRoaXMgc3RyZWFtIGJlZm9yZSBleHBvc2luZ1xuICAgICAqXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHRyYW5zZm9ybSBSZWFkLVdyaXRlIHN0cmVhbVxuICAgICAqL1xuICAgIHRyYW5zZm9ybSh0cmFuc2Zvcm0pIHtcbiAgICAgICAgdGhpcy5fdHJhbnNmb3Jtcy5wdXNoKHRyYW5zZm9ybSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQXBwZW5kcyBhIHBvc3QgcHJvY2VzcyBmdW5jdGlvbi4gVGhlIGZ1bmN0b24gaXMgcnVuIGFmdGVyIHRyYW5zZm9ybXMgYW5kXG4gICAgICogdXNlcyB0aGUgZm9sbG93aW5nIHN5bnRheFxuICAgICAqXG4gICAgICogICBwcm9jZXNzRnVuYyhpbnB1dCkgLT4gb3V0cHV0U3RyZWFtXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gcHJvY2Vzc0Z1bmMgUmVhZC1Xcml0ZSBzdHJlYW1cbiAgICAgKi9cbiAgICBwcm9jZXNzRnVuYyhwcm9jZXNzRnVuYykge1xuICAgICAgICB0aGlzLl9wcm9jZXNzRnVuY3MucHVzaChwcm9jZXNzRnVuYyk7XG4gICAgfVxuXG4gICAgc3RyZWFtKG91dHB1dFN0cmVhbSwgb3B0aW9ucywgZG9uZSkge1xuICAgICAgICBsZXQgdHJhbnNmZXJFbmNvZGluZyA9IHRoaXMuZ2V0VHJhbnNmZXJFbmNvZGluZygpO1xuICAgICAgICBsZXQgY29udGVudFN0cmVhbTtcbiAgICAgICAgbGV0IGxvY2FsU3RyZWFtO1xuXG4gICAgICAgIC8vIHByb3RlY3QgYWN0dWFsIGNhbGxiYWNrIGFnYWluc3QgbXVsdGlwbGUgdHJpZ2dlcmluZ1xuICAgICAgICBsZXQgcmV0dXJuZWQgPSBmYWxzZTtcbiAgICAgICAgbGV0IGNhbGxiYWNrID0gZXJyID0+IHtcbiAgICAgICAgICAgIGlmIChyZXR1cm5lZCkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybmVkID0gdHJ1ZTtcbiAgICAgICAgICAgIGRvbmUoZXJyKTtcbiAgICAgICAgfTtcblxuICAgICAgICAvLyBmb3IgbXVsdGlwYXJ0IG5vZGVzLCBwdXNoIGNoaWxkIG5vZGVzXG4gICAgICAgIC8vIGZvciBjb250ZW50IG5vZGVzIGVuZCB0aGUgc3RyZWFtXG4gICAgICAgIGxldCBmaW5hbGl6ZSA9ICgpID0+IHtcbiAgICAgICAgICAgIGxldCBjaGlsZElkID0gMDtcbiAgICAgICAgICAgIGxldCBwcm9jZXNzQ2hpbGROb2RlID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChjaGlsZElkID49IHRoaXMuY2hpbGROb2Rlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgb3V0cHV0U3RyZWFtLndyaXRlKCdcXHJcXG4tLScgKyB0aGlzLmJvdW5kYXJ5ICsgJy0tXFxyXFxuJyk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBjYWxsYmFjaygpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBsZXQgY2hpbGQgPSB0aGlzLmNoaWxkTm9kZXNbY2hpbGRJZCsrXTtcbiAgICAgICAgICAgICAgICBvdXRwdXRTdHJlYW0ud3JpdGUoKGNoaWxkSWQgPiAxID8gJ1xcclxcbicgOiAnJykgKyAnLS0nICsgdGhpcy5ib3VuZGFyeSArICdcXHJcXG4nKTtcbiAgICAgICAgICAgICAgICBjaGlsZC5zdHJlYW0ob3V0cHV0U3RyZWFtLCBvcHRpb25zLCBlcnIgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2FsbGJhY2soZXJyKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBzZXRJbW1lZGlhdGUocHJvY2Vzc0NoaWxkTm9kZSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBpZiAodGhpcy5tdWx0aXBhcnQpIHtcbiAgICAgICAgICAgICAgICBzZXRJbW1lZGlhdGUocHJvY2Vzc0NoaWxkTm9kZSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBjYWxsYmFjaygpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIC8vIHB1c2hlcyBub2RlIGNvbnRlbnRcbiAgICAgICAgbGV0IHNlbmRDb250ZW50ID0gKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMuY29udGVudCkge1xuICAgICAgICAgICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodGhpcy5jb250ZW50KSA9PT0gJ1tvYmplY3QgRXJyb3JdJykge1xuICAgICAgICAgICAgICAgICAgICAvLyBjb250ZW50IGlzIGFscmVhZHkgZXJyb3JlZFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2FsbGJhY2sodGhpcy5jb250ZW50KTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHRoaXMuY29udGVudC5waXBlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29udGVudC5yZW1vdmVMaXN0ZW5lcignZXJyb3InLCB0aGlzLl9jb250ZW50RXJyb3JIYW5kbGVyKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fY29udGVudEVycm9ySGFuZGxlciA9IGVyciA9PiBjYWxsYmFjayhlcnIpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRlbnQub25jZSgnZXJyb3InLCB0aGlzLl9jb250ZW50RXJyb3JIYW5kbGVyKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBsZXQgY3JlYXRlU3RyZWFtID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoWydxdW90ZWQtcHJpbnRhYmxlJywgJ2Jhc2U2NCddLmluY2x1ZGVzKHRyYW5zZmVyRW5jb2RpbmcpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50U3RyZWFtID0gbmV3ICh0cmFuc2ZlckVuY29kaW5nID09PSAnYmFzZTY0JyA/IGJhc2U2NCA6IHFwKS5FbmNvZGVyKG9wdGlvbnMpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50U3RyZWFtLnBpcGUob3V0cHV0U3RyZWFtLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kOiBmYWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50U3RyZWFtLm9uY2UoJ2VuZCcsIGZpbmFsaXplKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRTdHJlYW0ub25jZSgnZXJyb3InLCBlcnIgPT4gY2FsbGJhY2soZXJyKSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsU3RyZWFtID0gdGhpcy5fZ2V0U3RyZWFtKHRoaXMuY29udGVudCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBsb2NhbFN0cmVhbS5waXBlKGNvbnRlbnRTdHJlYW0pO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYW55dGhpbmcgdGhhdCBpcyBub3QgUVAgb3IgQmFzZTU0IHBhc3NlcyBhcy1pc1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxTdHJlYW0gPSB0aGlzLl9nZXRTdHJlYW0odGhpcy5jb250ZW50KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsU3RyZWFtLnBpcGUob3V0cHV0U3RyZWFtLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kOiBmYWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBsb2NhbFN0cmVhbS5vbmNlKCdlbmQnLCBmaW5hbGl6ZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBsb2NhbFN0cmVhbS5vbmNlKCdlcnJvcicsIGVyciA9PiBjYWxsYmFjayhlcnIpKTtcbiAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuY29udGVudC5fcmVzb2x2ZSkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgY2h1bmtzID0gW107XG4gICAgICAgICAgICAgICAgICAgIGxldCBjaHVua2xlbiA9IDA7XG4gICAgICAgICAgICAgICAgICAgIGxldCByZXR1cm5lZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBsZXQgc291cmNlU3RyZWFtID0gdGhpcy5fZ2V0U3RyZWFtKHRoaXMuY29udGVudCk7XG4gICAgICAgICAgICAgICAgICAgIHNvdXJjZVN0cmVhbS5vbignZXJyb3InLCBlcnIgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJldHVybmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soZXJyKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHNvdXJjZVN0cmVhbS5vbigncmVhZGFibGUnLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgY2h1bms7XG4gICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoKGNodW5rID0gc291cmNlU3RyZWFtLnJlYWQoKSkgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaHVua3MucHVzaChjaHVuayk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2h1bmtsZW4gKz0gY2h1bmsubGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgc291cmNlU3RyZWFtLm9uKCdlbmQnLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmV0dXJuZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5lZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRlbnQuX3Jlc29sdmUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29udGVudC5fcmVzb2x2ZWRWYWx1ZSA9IEJ1ZmZlci5jb25jYXQoY2h1bmtzLCBjaHVua2xlbik7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRJbW1lZGlhdGUoY3JlYXRlU3RyZWFtKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgc2V0SW1tZWRpYXRlKGNyZWF0ZVN0cmVhbSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHNldEltbWVkaWF0ZShmaW5hbGl6ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKHRoaXMuX3Jhdykge1xuICAgICAgICAgICAgc2V0SW1tZWRpYXRlKCgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHRoaXMuX3JhdykgPT09ICdbb2JqZWN0IEVycm9yXScpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gY29udGVudCBpcyBhbHJlYWR5IGVycm9yZWRcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKHRoaXMuX3Jhdyk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gcmVtb3ZlIGRlZmF1bHQgZXJyb3IgaGFuZGxlciAoaWYgc2V0KVxuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdGhpcy5fcmF3LnBpcGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fcmF3LnJlbW92ZUxpc3RlbmVyKCdlcnJvcicsIHRoaXMuX2NvbnRlbnRFcnJvckhhbmRsZXIpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGxldCByYXcgPSB0aGlzLl9nZXRTdHJlYW0odGhpcy5fcmF3KTtcbiAgICAgICAgICAgICAgICByYXcucGlwZShvdXRwdXRTdHJlYW0sIHtcbiAgICAgICAgICAgICAgICAgICAgZW5kOiBmYWxzZVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHJhdy5vbignZXJyb3InLCBlcnIgPT4gb3V0cHV0U3RyZWFtLmVtaXQoJ2Vycm9yJywgZXJyKSk7XG4gICAgICAgICAgICAgICAgcmF3Lm9uKCdlbmQnLCBmaW5hbGl6ZSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG91dHB1dFN0cmVhbS53cml0ZSh0aGlzLmJ1aWxkSGVhZGVycygpICsgJ1xcclxcblxcclxcbicpO1xuICAgICAgICAgICAgc2V0SW1tZWRpYXRlKHNlbmRDb250ZW50KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgZW52ZWxvcGUgdG8gYmUgdXNlZCBpbnN0ZWFkIG9mIHRoZSBnZW5lcmF0ZWQgb25lXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtPYmplY3R9IFNNVFAgZW52ZWxvcGUgaW4gdGhlIGZvcm0gb2Yge2Zyb206ICdmcm9tQGV4YW1wbGUuY29tJywgdG86IFsndG9AZXhhbXBsZS5jb20nXX1cbiAgICAgKi9cbiAgICBzZXRFbnZlbG9wZShlbnZlbG9wZSkge1xuICAgICAgICBsZXQgbGlzdDtcblxuICAgICAgICB0aGlzLl9lbnZlbG9wZSA9IHtcbiAgICAgICAgICAgIGZyb206IGZhbHNlLFxuICAgICAgICAgICAgdG86IFtdXG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKGVudmVsb3BlLmZyb20pIHtcbiAgICAgICAgICAgIGxpc3QgPSBbXTtcbiAgICAgICAgICAgIHRoaXMuX2NvbnZlcnRBZGRyZXNzZXModGhpcy5fcGFyc2VBZGRyZXNzZXMoZW52ZWxvcGUuZnJvbSksIGxpc3QpO1xuICAgICAgICAgICAgbGlzdCA9IGxpc3QuZmlsdGVyKGFkZHJlc3MgPT4gYWRkcmVzcyAmJiBhZGRyZXNzLmFkZHJlc3MpO1xuICAgICAgICAgICAgaWYgKGxpc3QubGVuZ3RoICYmIGxpc3RbMF0pIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9lbnZlbG9wZS5mcm9tID0gbGlzdFswXS5hZGRyZXNzO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIFsndG8nLCAnY2MnLCAnYmNjJ10uZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICAgICAgaWYgKGVudmVsb3BlW2tleV0pIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9jb252ZXJ0QWRkcmVzc2VzKHRoaXMuX3BhcnNlQWRkcmVzc2VzKGVudmVsb3BlW2tleV0pLCB0aGlzLl9lbnZlbG9wZS50byk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuX2VudmVsb3BlLnRvID0gdGhpcy5fZW52ZWxvcGUudG8ubWFwKHRvID0+IHRvLmFkZHJlc3MpLmZpbHRlcihhZGRyZXNzID0+IGFkZHJlc3MpO1xuXG4gICAgICAgIGxldCBzdGFuZGFyZEZpZWxkcyA9IFsndG8nLCAnY2MnLCAnYmNjJywgJ2Zyb20nXTtcbiAgICAgICAgT2JqZWN0LmtleXMoZW52ZWxvcGUpLmZvckVhY2goa2V5ID0+IHtcbiAgICAgICAgICAgIGlmICghc3RhbmRhcmRGaWVsZHMuaW5jbHVkZXMoa2V5KSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2VudmVsb3BlW2tleV0gPSBlbnZlbG9wZVtrZXldO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZW5lcmF0ZXMgYW5kIHJldHVybnMgYW4gb2JqZWN0IHdpdGggcGFyc2VkIGFkZHJlc3MgZmllbGRzXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtPYmplY3R9IEFkZHJlc3Mgb2JqZWN0XG4gICAgICovXG4gICAgZ2V0QWRkcmVzc2VzKCkge1xuICAgICAgICBsZXQgYWRkcmVzc2VzID0ge307XG5cbiAgICAgICAgdGhpcy5faGVhZGVycy5mb3JFYWNoKGhlYWRlciA9PiB7XG4gICAgICAgICAgICBsZXQga2V5ID0gaGVhZGVyLmtleS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgaWYgKFsnZnJvbScsICdzZW5kZXInLCAncmVwbHktdG8nLCAndG8nLCAnY2MnLCAnYmNjJ10uaW5jbHVkZXMoa2V5KSkge1xuICAgICAgICAgICAgICAgIGlmICghQXJyYXkuaXNBcnJheShhZGRyZXNzZXNba2V5XSkpIHtcbiAgICAgICAgICAgICAgICAgICAgYWRkcmVzc2VzW2tleV0gPSBbXTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB0aGlzLl9jb252ZXJ0QWRkcmVzc2VzKHRoaXMuX3BhcnNlQWRkcmVzc2VzKGhlYWRlci52YWx1ZSksIGFkZHJlc3Nlc1trZXldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIGFkZHJlc3NlcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZW5lcmF0ZXMgYW5kIHJldHVybnMgU01UUCBlbnZlbG9wZSB3aXRoIHRoZSBzZW5kZXIgYWRkcmVzcyBhbmQgYSBsaXN0IG9mIHJlY2lwaWVudHMgYWRkcmVzc2VzXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtPYmplY3R9IFNNVFAgZW52ZWxvcGUgaW4gdGhlIGZvcm0gb2Yge2Zyb206ICdmcm9tQGV4YW1wbGUuY29tJywgdG86IFsndG9AZXhhbXBsZS5jb20nXX1cbiAgICAgKi9cbiAgICBnZXRFbnZlbG9wZSgpIHtcbiAgICAgICAgaWYgKHRoaXMuX2VudmVsb3BlKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fZW52ZWxvcGU7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgZW52ZWxvcGUgPSB7XG4gICAgICAgICAgICBmcm9tOiBmYWxzZSxcbiAgICAgICAgICAgIHRvOiBbXVxuICAgICAgICB9O1xuICAgICAgICB0aGlzLl9oZWFkZXJzLmZvckVhY2goaGVhZGVyID0+IHtcbiAgICAgICAgICAgIGxldCBsaXN0ID0gW107XG4gICAgICAgICAgICBpZiAoaGVhZGVyLmtleSA9PT0gJ0Zyb20nIHx8ICghZW52ZWxvcGUuZnJvbSAmJiBbJ1JlcGx5LVRvJywgJ1NlbmRlciddLmluY2x1ZGVzKGhlYWRlci5rZXkpKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2NvbnZlcnRBZGRyZXNzZXModGhpcy5fcGFyc2VBZGRyZXNzZXMoaGVhZGVyLnZhbHVlKSwgbGlzdCk7XG4gICAgICAgICAgICAgICAgaWYgKGxpc3QubGVuZ3RoICYmIGxpc3RbMF0pIHtcbiAgICAgICAgICAgICAgICAgICAgZW52ZWxvcGUuZnJvbSA9IGxpc3RbMF0uYWRkcmVzcztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKFsnVG8nLCAnQ2MnLCAnQmNjJ10uaW5jbHVkZXMoaGVhZGVyLmtleSkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9jb252ZXJ0QWRkcmVzc2VzKHRoaXMuX3BhcnNlQWRkcmVzc2VzKGhlYWRlci52YWx1ZSksIGVudmVsb3BlLnRvKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgZW52ZWxvcGUudG8gPSBlbnZlbG9wZS50by5tYXAodG8gPT4gdG8uYWRkcmVzcyk7XG5cbiAgICAgICAgcmV0dXJuIGVudmVsb3BlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgTWVzc2FnZS1JZCB2YWx1ZS4gSWYgaXQgZG9lcyBub3QgZXhpc3QsIHRoZW4gY3JlYXRlcyBvbmVcbiAgICAgKlxuICAgICAqIEByZXR1cm4ge1N0cmluZ30gTWVzc2FnZS1JZCB2YWx1ZVxuICAgICAqL1xuICAgIG1lc3NhZ2VJZCgpIHtcbiAgICAgICAgbGV0IG1lc3NhZ2VJZCA9IHRoaXMuZ2V0SGVhZGVyKCdNZXNzYWdlLUlEJyk7XG4gICAgICAgIC8vIFlvdSByZWFsbHkgc2hvdWxkIGRlZmluZSB5b3VyIG93biBNZXNzYWdlLUlkIGZpZWxkIVxuICAgICAgICBpZiAoIW1lc3NhZ2VJZCkge1xuICAgICAgICAgICAgbWVzc2FnZUlkID0gdGhpcy5fZ2VuZXJhdGVNZXNzYWdlSWQoKTtcbiAgICAgICAgICAgIHRoaXMuc2V0SGVhZGVyKCdNZXNzYWdlLUlEJywgbWVzc2FnZUlkKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWVzc2FnZUlkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgcHJlZ2VuZXJhdGVkIGNvbnRlbnQgdGhhdCB3aWxsIGJlIHVzZWQgYXMgdGhlIG91dHB1dCBvZiB0aGlzIG5vZGVcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfEJ1ZmZlcnxTdHJlYW19IFJhdyBNSU1FIGNvbnRlbnRzXG4gICAgICovXG4gICAgc2V0UmF3KHJhdykge1xuICAgICAgICB0aGlzLl9yYXcgPSByYXc7XG5cbiAgICAgICAgaWYgKHRoaXMuX3JhdyAmJiB0eXBlb2YgdGhpcy5fcmF3LnBpcGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIC8vIHByZS1zdHJlYW0gaGFuZGxlci4gbWlnaHQgYmUgdHJpZ2dlcmVkIGlmIGEgc3RyZWFtIGlzIHNldCBhcyBjb250ZW50XG4gICAgICAgICAgICAvLyBhbmQgJ2Vycm9yJyBmaXJlcyBiZWZvcmUgYW55dGhpbmcgaXMgZG9uZSB3aXRoIHRoaXMgc3RyZWFtXG4gICAgICAgICAgICB0aGlzLl9jb250ZW50RXJyb3JIYW5kbGVyID0gZXJyID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLl9yYXcucmVtb3ZlTGlzdGVuZXIoJ2Vycm9yJywgdGhpcy5fY29udGVudEVycm9ySGFuZGxlcik7XG4gICAgICAgICAgICAgICAgdGhpcy5fcmF3ID0gZXJyO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHRoaXMuX3Jhdy5vbmNlKCdlcnJvcicsIHRoaXMuX2NvbnRlbnRFcnJvckhhbmRsZXIpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLy8vLy8vLyBQUklWQVRFIE1FVEhPRFNcblxuICAgIC8qKlxuICAgICAqIERldGVjdHMgYW5kIHJldHVybnMgaGFuZGxlIHRvIGEgc3RyZWFtIHJlbGF0ZWQgd2l0aCB0aGUgY29udGVudC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7TWl4ZWR9IGNvbnRlbnQgTm9kZSBjb250ZW50XG4gICAgICogQHJldHVybnMge09iamVjdH0gU3RyZWFtIG9iamVjdFxuICAgICAqL1xuICAgIF9nZXRTdHJlYW0oY29udGVudCkge1xuICAgICAgICBsZXQgY29udGVudFN0cmVhbTtcblxuICAgICAgICBpZiAoY29udGVudC5fcmVzb2x2ZWRWYWx1ZSkge1xuICAgICAgICAgICAgLy8gcGFzcyBzdHJpbmcgb3IgYnVmZmVyIGNvbnRlbnQgYXMgYSBzdHJlYW1cbiAgICAgICAgICAgIGNvbnRlbnRTdHJlYW0gPSBuZXcgUGFzc1Rocm91Z2goKTtcblxuICAgICAgICAgICAgc2V0SW1tZWRpYXRlKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBjb250ZW50U3RyZWFtLmVuZChjb250ZW50Ll9yZXNvbHZlZFZhbHVlKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChfZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRlbnRTdHJlYW0uZW1pdCgnZXJyb3InLCBfZXJyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgcmV0dXJuIGNvbnRlbnRTdHJlYW07XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGNvbnRlbnQucGlwZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgLy8gYXNzdW1lIGFzIHN0cmVhbVxuICAgICAgICAgICAgcmV0dXJuIGNvbnRlbnQ7XG4gICAgICAgIH0gZWxzZSBpZiAoY29udGVudCAmJiB0eXBlb2YgY29udGVudC5wYXRoID09PSAnc3RyaW5nJyAmJiAhY29udGVudC5ocmVmKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5kaXNhYmxlRmlsZUFjY2Vzcykge1xuICAgICAgICAgICAgICAgIGNvbnRlbnRTdHJlYW0gPSBuZXcgUGFzc1Rocm91Z2goKTtcbiAgICAgICAgICAgICAgICBzZXRJbW1lZGlhdGUoKCkgPT4gY29udGVudFN0cmVhbS5lbWl0KCdlcnJvcicsIG5ldyBFcnJvcignRmlsZSBhY2Nlc3MgcmVqZWN0ZWQgZm9yICcgKyBjb250ZW50LnBhdGgpKSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRlbnRTdHJlYW07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyByZWFkIGZpbGVcbiAgICAgICAgICAgIHJldHVybiBmcy5jcmVhdGVSZWFkU3RyZWFtKGNvbnRlbnQucGF0aCk7XG4gICAgICAgIH0gZWxzZSBpZiAoY29udGVudCAmJiB0eXBlb2YgY29udGVudC5ocmVmID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgaWYgKHRoaXMuZGlzYWJsZVVybEFjY2Vzcykge1xuICAgICAgICAgICAgICAgIGNvbnRlbnRTdHJlYW0gPSBuZXcgUGFzc1Rocm91Z2goKTtcbiAgICAgICAgICAgICAgICBzZXRJbW1lZGlhdGUoKCkgPT4gY29udGVudFN0cmVhbS5lbWl0KCdlcnJvcicsIG5ldyBFcnJvcignVXJsIGFjY2VzcyByZWplY3RlZCBmb3IgJyArIGNvbnRlbnQuaHJlZikpKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gY29udGVudFN0cmVhbTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGZldGNoIFVSTFxuICAgICAgICAgICAgcmV0dXJuIG5tZmV0Y2goY29udGVudC5ocmVmLCB7IGhlYWRlcnM6IGNvbnRlbnQuaHR0cEhlYWRlcnMgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBwYXNzIHN0cmluZyBvciBidWZmZXIgY29udGVudCBhcyBhIHN0cmVhbVxuICAgICAgICAgICAgY29udGVudFN0cmVhbSA9IG5ldyBQYXNzVGhyb3VnaCgpO1xuXG4gICAgICAgICAgICBzZXRJbW1lZGlhdGUoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRlbnRTdHJlYW0uZW5kKGNvbnRlbnQgfHwgJycpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKF9lcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGVudFN0cmVhbS5lbWl0KCdlcnJvcicsIF9lcnIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIGNvbnRlbnRTdHJlYW07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQYXJzZXMgYWRkcmVzc2VzLiBUYWtlcyBpbiBhIHNpbmdsZSBhZGRyZXNzIG9yIGFuIGFycmF5IG9yIGFuXG4gICAgICogYXJyYXkgb2YgYWRkcmVzcyBhcnJheXMgKGVnLiBUbzogW1tmaXJzdCBncm91cF0sIFtzZWNvbmQgZ3JvdXBdLC4uLl0pXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge01peGVkfSBhZGRyZXNzZXMgQWRkcmVzc2VzIHRvIGJlIHBhcnNlZFxuICAgICAqIEByZXR1cm4ge0FycmF5fSBBbiBhcnJheSBvZiBhZGRyZXNzIG9iamVjdHNcbiAgICAgKi9cbiAgICBfcGFyc2VBZGRyZXNzZXMoYWRkcmVzc2VzKSB7XG4gICAgICAgIHJldHVybiBbXS5jb25jYXQuYXBwbHkoXG4gICAgICAgICAgICBbXSxcbiAgICAgICAgICAgIFtdLmNvbmNhdChhZGRyZXNzZXMpLm1hcChhZGRyZXNzID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoYWRkcmVzcyAmJiBhZGRyZXNzLmFkZHJlc3MpIHtcbiAgICAgICAgICAgICAgICAgICAgYWRkcmVzcy5hZGRyZXNzID0gdGhpcy5fbm9ybWFsaXplQWRkcmVzcyhhZGRyZXNzLmFkZHJlc3MpO1xuICAgICAgICAgICAgICAgICAgICBhZGRyZXNzLm5hbWUgPSBhZGRyZXNzLm5hbWUgfHwgJyc7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbYWRkcmVzc107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBhZGRyZXNzcGFyc2VyKGFkZHJlc3MpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBOb3JtYWxpemVzIGEgaGVhZGVyIGtleSwgdXNlcyBDYW1lbC1DYXNlIGZvcm0sIGV4Y2VwdCBmb3IgdXBwZXJjYXNlIE1JTUUtXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30ga2V5IEtleSB0byBiZSBub3JtYWxpemVkXG4gICAgICogQHJldHVybiB7U3RyaW5nfSBrZXkgaW4gQ2FtZWwtQ2FzZSBmb3JtXG4gICAgICovXG4gICAgX25vcm1hbGl6ZUhlYWRlcktleShrZXkpIHtcbiAgICAgICAga2V5ID0gKGtleSB8fCAnJylcbiAgICAgICAgICAgIC50b1N0cmluZygpXG4gICAgICAgICAgICAvLyBubyBuZXdsaW5lcyBpbiBrZXlzXG4gICAgICAgICAgICAucmVwbGFjZSgvXFxyP1xcbnxcXHIvZywgJyAnKVxuICAgICAgICAgICAgLnRyaW0oKVxuICAgICAgICAgICAgLnRvTG93ZXJDYXNlKClcbiAgICAgICAgICAgIC8vIHVzZSB1cHBlcmNhc2Ugd29yZHMsIGV4Y2VwdCBNSU1FXG4gICAgICAgICAgICAucmVwbGFjZSgvXlgtU01UUEFQSSR8XihNSU1FfERLSU18QVJDfEJJTUkpXFxifF5bYS16XXwtKFNQRnxGQkx8SUR8TUQ1KSR8LVthLXpdL2dpLCBjID0+IGMudG9VcHBlckNhc2UoKSlcbiAgICAgICAgICAgIC8vIHNwZWNpYWwgY2FzZVxuICAgICAgICAgICAgLnJlcGxhY2UoL15Db250ZW50LUZlYXR1cmVzJC9pLCAnQ29udGVudC1mZWF0dXJlcycpO1xuXG4gICAgICAgIHJldHVybiBrZXk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIHRoZSBjb250ZW50IHR5cGUgaXMgbXVsdGlwYXJ0IGFuZCBkZWZpbmVzIGJvdW5kYXJ5IGlmIG5lZWRlZC5cbiAgICAgKiBEb2Vzbid0IHJldHVybiBhbnl0aGluZywgbW9kaWZpZXMgb2JqZWN0IGFyZ3VtZW50IGluc3RlYWQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gc3RydWN0dXJlZCBQYXJzZWQgaGVhZGVyIHZhbHVlIGZvciAnQ29udGVudC1UeXBlJyBrZXlcbiAgICAgKi9cbiAgICBfaGFuZGxlQ29udGVudFR5cGUoc3RydWN0dXJlZCkge1xuICAgICAgICB0aGlzLmNvbnRlbnRUeXBlID0gc3RydWN0dXJlZC52YWx1ZS50cmltKCkudG9Mb3dlckNhc2UoKTtcblxuICAgICAgICB0aGlzLm11bHRpcGFydCA9IC9ebXVsdGlwYXJ0XFwvL2kudGVzdCh0aGlzLmNvbnRlbnRUeXBlKSA/IHRoaXMuY29udGVudFR5cGUuc3Vic3RyKHRoaXMuY29udGVudFR5cGUuaW5kZXhPZignLycpICsgMSkgOiBmYWxzZTtcblxuICAgICAgICBpZiAodGhpcy5tdWx0aXBhcnQpIHtcbiAgICAgICAgICAgIHRoaXMuYm91bmRhcnkgPSBzdHJ1Y3R1cmVkLnBhcmFtcy5ib3VuZGFyeSA9IHN0cnVjdHVyZWQucGFyYW1zLmJvdW5kYXJ5IHx8IHRoaXMuYm91bmRhcnkgfHwgdGhpcy5fZ2VuZXJhdGVCb3VuZGFyeSgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5ib3VuZGFyeSA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2VuZXJhdGVzIGEgbXVsdGlwYXJ0IGJvdW5kYXJ5IHZhbHVlXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9IGJvdW5kYXJ5IHZhbHVlXG4gICAgICovXG4gICAgX2dlbmVyYXRlQm91bmRhcnkoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJvb3ROb2RlLmJvdW5kYXJ5UHJlZml4ICsgJy0nICsgdGhpcy5yb290Tm9kZS5iYXNlQm91bmRhcnkgKyAnLVBhcnRfJyArIHRoaXMuX25vZGVJZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFbmNvZGVzIGEgaGVhZGVyIHZhbHVlIGZvciB1c2UgaW4gdGhlIGdlbmVyYXRlZCByZmMyODIyIGVtYWlsLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IGtleSBIZWFkZXIga2V5XG4gICAgICogQHBhcmFtIHtTdHJpbmd9IHZhbHVlIEhlYWRlciB2YWx1ZVxuICAgICAqL1xuICAgIF9lbmNvZGVIZWFkZXJWYWx1ZShrZXksIHZhbHVlKSB7XG4gICAgICAgIGtleSA9IHRoaXMuX25vcm1hbGl6ZUhlYWRlcktleShrZXkpO1xuXG4gICAgICAgIHN3aXRjaCAoa2V5KSB7XG4gICAgICAgICAgICAvLyBTdHJ1Y3R1cmVkIGhlYWRlcnNcbiAgICAgICAgICAgIGNhc2UgJ0Zyb20nOlxuICAgICAgICAgICAgY2FzZSAnU2VuZGVyJzpcbiAgICAgICAgICAgIGNhc2UgJ1RvJzpcbiAgICAgICAgICAgIGNhc2UgJ0NjJzpcbiAgICAgICAgICAgIGNhc2UgJ0JjYyc6XG4gICAgICAgICAgICBjYXNlICdSZXBseS1Ubyc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2NvbnZlcnRBZGRyZXNzZXModGhpcy5fcGFyc2VBZGRyZXNzZXModmFsdWUpKTtcblxuICAgICAgICAgICAgLy8gdmFsdWVzIGVuY2xvc2VkIGluIDw+XG4gICAgICAgICAgICBjYXNlICdNZXNzYWdlLUlEJzpcbiAgICAgICAgICAgIGNhc2UgJ0luLVJlcGx5LVRvJzpcbiAgICAgICAgICAgIGNhc2UgJ0NvbnRlbnQtSWQnOlxuICAgICAgICAgICAgICAgIHZhbHVlID0gKHZhbHVlIHx8ICcnKS50b1N0cmluZygpLnJlcGxhY2UoL1xccj9cXG58XFxyL2csICcgJyk7XG5cbiAgICAgICAgICAgICAgICBpZiAodmFsdWUuY2hhckF0KDApICE9PSAnPCcpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSAnPCcgKyB2YWx1ZTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAodmFsdWUuY2hhckF0KHZhbHVlLmxlbmd0aCAtIDEpICE9PSAnPicpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZSArICc+JztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuXG4gICAgICAgICAgICAvLyBzcGFjZSBzZXBhcmF0ZWQgbGlzdCBvZiB2YWx1ZXMgZW5jbG9zZWQgaW4gPD5cbiAgICAgICAgICAgIGNhc2UgJ1JlZmVyZW5jZXMnOlxuICAgICAgICAgICAgICAgIHZhbHVlID0gW10uY29uY2F0XG4gICAgICAgICAgICAgICAgICAgIC5hcHBseShcbiAgICAgICAgICAgICAgICAgICAgICAgIFtdLFxuICAgICAgICAgICAgICAgICAgICAgICAgW10uY29uY2F0KHZhbHVlIHx8ICcnKS5tYXAoZWxtID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbG0gPSAoZWxtIHx8ICcnKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAudG9TdHJpbmcoKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucmVwbGFjZSgvXFxyP1xcbnxcXHIvZywgJyAnKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAudHJpbSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlbG0ucmVwbGFjZSgvPFtePl0qPi9nLCBzdHIgPT4gc3RyLnJlcGxhY2UoL1xccy9nLCAnJykpLnNwbGl0KC9cXHMrLyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgIC5tYXAoZWxtID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbG0uY2hhckF0KDApICE9PSAnPCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbG0gPSAnPCcgKyBlbG07XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZWxtLmNoYXJBdChlbG0ubGVuZ3RoIC0gMSkgIT09ICc+Jykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsbSA9IGVsbSArICc+JztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlbG07XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlLmpvaW4oJyAnKS50cmltKCk7XG5cbiAgICAgICAgICAgIGNhc2UgJ0RhdGUnOlxuICAgICAgICAgICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsdWUpID09PSAnW29iamVjdCBEYXRlXScpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlLnRvVVRDU3RyaW5nKCkucmVwbGFjZSgvR01ULywgJyswMDAwJyk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdmFsdWUgPSAodmFsdWUgfHwgJycpLnRvU3RyaW5nKCkucmVwbGFjZSgvXFxyP1xcbnxcXHIvZywgJyAnKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fZW5jb2RlV29yZHModmFsdWUpO1xuXG4gICAgICAgICAgICBjYXNlICdDb250ZW50LVR5cGUnOlxuICAgICAgICAgICAgY2FzZSAnQ29udGVudC1EaXNwb3NpdGlvbic6XG4gICAgICAgICAgICAgICAgLy8gaWYgaXQgaW5jbHVkZXMgYSBmaWxlbmFtZSB0aGVuIGl0IGlzIGFscmVhZHkgZW5jb2RlZFxuICAgICAgICAgICAgICAgIHJldHVybiAodmFsdWUgfHwgJycpLnRvU3RyaW5nKCkucmVwbGFjZSgvXFxyP1xcbnxcXHIvZywgJyAnKTtcblxuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICB2YWx1ZSA9ICh2YWx1ZSB8fCAnJykudG9TdHJpbmcoKS5yZXBsYWNlKC9cXHI/XFxufFxcci9nLCAnICcpO1xuICAgICAgICAgICAgICAgIC8vIGVuY29kZVdvcmRzIG9ubHkgZW5jb2RlcyBpZiBuZWVkZWQsIG90aGVyd2lzZSB0aGUgb3JpZ2luYWwgc3RyaW5nIGlzIHJldHVybmVkXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2VuY29kZVdvcmRzKHZhbHVlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlYnVpbGRzIGFkZHJlc3Mgb2JqZWN0IHVzaW5nIHB1bnljb2RlIGFuZCBvdGhlciBhZGp1c3RtZW50c1xuICAgICAqXG4gICAgICogQHBhcmFtIHtBcnJheX0gYWRkcmVzc2VzIEFuIGFycmF5IG9mIGFkZHJlc3Mgb2JqZWN0c1xuICAgICAqIEBwYXJhbSB7QXJyYXl9IFt1bmlxdWVMaXN0XSBBbiBhcnJheSB0byBiZSBwb3B1bGF0ZWQgd2l0aCBhZGRyZXNzZXNcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9IGFkZHJlc3Mgc3RyaW5nXG4gICAgICovXG4gICAgX2NvbnZlcnRBZGRyZXNzZXMoYWRkcmVzc2VzLCB1bmlxdWVMaXN0KSB7XG4gICAgICAgIGxldCB2YWx1ZXMgPSBbXTtcblxuICAgICAgICB1bmlxdWVMaXN0ID0gdW5pcXVlTGlzdCB8fCBbXTtcblxuICAgICAgICBbXS5jb25jYXQoYWRkcmVzc2VzIHx8IFtdKS5mb3JFYWNoKGFkZHJlc3MgPT4ge1xuICAgICAgICAgICAgaWYgKGFkZHJlc3MuYWRkcmVzcykge1xuICAgICAgICAgICAgICAgIGFkZHJlc3MuYWRkcmVzcyA9IHRoaXMuX25vcm1hbGl6ZUFkZHJlc3MoYWRkcmVzcy5hZGRyZXNzKTtcblxuICAgICAgICAgICAgICAgIGlmICghYWRkcmVzcy5uYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlcy5wdXNoKGFkZHJlc3MuYWRkcmVzcy5pbmRleE9mKCcgJykgPj0gMCA/IGA8JHthZGRyZXNzLmFkZHJlc3N9PmAgOiBgJHthZGRyZXNzLmFkZHJlc3N9YCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChhZGRyZXNzLm5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWVzLnB1c2goYCR7dGhpcy5fZW5jb2RlQWRkcmVzc05hbWUoYWRkcmVzcy5uYW1lKX0gPCR7YWRkcmVzcy5hZGRyZXNzfT5gKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoYWRkcmVzcy5hZGRyZXNzKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghdW5pcXVlTGlzdC5maWx0ZXIoYSA9PiBhLmFkZHJlc3MgPT09IGFkZHJlc3MuYWRkcmVzcykubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB1bmlxdWVMaXN0LnB1c2goYWRkcmVzcyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGFkZHJlc3MuZ3JvdXApIHtcbiAgICAgICAgICAgICAgICBsZXQgZ3JvdXBMaXN0QWRkcmVzc2VzID0gKGFkZHJlc3MuZ3JvdXAubGVuZ3RoID8gdGhpcy5fY29udmVydEFkZHJlc3NlcyhhZGRyZXNzLmdyb3VwLCB1bmlxdWVMaXN0KSA6ICcnKS50cmltKCk7XG4gICAgICAgICAgICAgICAgdmFsdWVzLnB1c2goYCR7dGhpcy5fZW5jb2RlQWRkcmVzc05hbWUoYWRkcmVzcy5uYW1lKX06JHtncm91cExpc3RBZGRyZXNzZXN9O2ApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gdmFsdWVzLmpvaW4oJywgJyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTm9ybWFsaXplcyBhbiBlbWFpbCBhZGRyZXNzXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhZGRyZXNzIEFuIGFycmF5IG9mIGFkZHJlc3Mgb2JqZWN0c1xuICAgICAqIEByZXR1cm4ge1N0cmluZ30gYWRkcmVzcyBzdHJpbmdcbiAgICAgKi9cbiAgICBfbm9ybWFsaXplQWRkcmVzcyhhZGRyZXNzKSB7XG4gICAgICAgIGFkZHJlc3MgPSAoYWRkcmVzcyB8fCAnJylcbiAgICAgICAgICAgIC50b1N0cmluZygpXG4gICAgICAgICAgICAucmVwbGFjZSgvW1xceDAwLVxceDFGPD5dKy9nLCAnICcpIC8vIHJlbW92ZSB1bmFsbG93ZWQgY2hhcmFjdGVyc1xuICAgICAgICAgICAgLnRyaW0oKTtcblxuICAgICAgICBsZXQgbGFzdEF0ID0gYWRkcmVzcy5sYXN0SW5kZXhPZignQCcpO1xuICAgICAgICBpZiAobGFzdEF0IDwgMCkge1xuICAgICAgICAgICAgLy8gQmFyZSB1c2VybmFtZVxuICAgICAgICAgICAgcmV0dXJuIGFkZHJlc3M7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgdXNlciA9IGFkZHJlc3Muc3Vic3RyKDAsIGxhc3RBdCk7XG4gICAgICAgIGxldCBkb21haW4gPSBhZGRyZXNzLnN1YnN0cihsYXN0QXQgKyAxKTtcblxuICAgICAgICAvLyBVc2VybmFtZXMgYXJlIG5vdCB0b3VjaGVkIGFuZCBhcmUga2VwdCBhcyBpcyBldmVuIGlmIHRoZXNlIGluY2x1ZGUgdW5pY29kZVxuICAgICAgICAvLyBEb21haW5zIGFyZSBwdW55Y29kZWQgYnkgZGVmYXVsdFxuICAgICAgICAvLyAnasO1Z2V2YS5lZScgd2lsbCBiZSBjb252ZXJ0ZWQgdG8gJ3huLS1qZ2V2YS1kdWEuZWUnXG4gICAgICAgIC8vIG5vbi11bmljb2RlIGRvbWFpbnMgYXJlIGxlZnQgYXMgaXNcblxuICAgICAgICBsZXQgZW5jb2RlZERvbWFpbjtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgZW5jb2RlZERvbWFpbiA9IHB1bnljb2RlLnRvQVNDSUkoZG9tYWluLnRvTG93ZXJDYXNlKCkpO1xuICAgICAgICB9IGNhdGNoIChfZXJyKSB7XG4gICAgICAgICAgICAvLyBrZWVwIGFzIGlzP1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHVzZXIuaW5kZXhPZignICcpID49IDApIHtcbiAgICAgICAgICAgIGlmICh1c2VyLmNoYXJBdCgwKSAhPT0gJ1wiJykge1xuICAgICAgICAgICAgICAgIHVzZXIgPSAnXCInICsgdXNlcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh1c2VyLnN1YnN0cigtMSkgIT09ICdcIicpIHtcbiAgICAgICAgICAgICAgICB1c2VyID0gdXNlciArICdcIic7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYCR7dXNlcn1AJHtlbmNvZGVkRG9tYWlufWA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSWYgbmVlZGVkLCBtaW1lIGVuY29kZXMgdGhlIG5hbWUgcGFydFxuICAgICAqXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IG5hbWUgTmFtZSBwYXJ0IG9mIGFuIGFkZHJlc3NcbiAgICAgKiBAcmV0dXJucyB7U3RyaW5nfSBNaW1lIHdvcmQgZW5jb2RlZCBzdHJpbmcgaWYgbmVlZGVkXG4gICAgICovXG4gICAgX2VuY29kZUFkZHJlc3NOYW1lKG5hbWUpIHtcbiAgICAgICAgaWYgKCEvXltcXHcgXSokLy50ZXN0KG5hbWUpKSB7XG4gICAgICAgICAgICBpZiAoL15bXFx4MjAtXFx4N2VdKiQvLnRlc3QobmFtZSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ1wiJyArIG5hbWUucmVwbGFjZSgvKFtcXFxcXCJdKS9nLCAnXFxcXCQxJykgKyAnXCInO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbWltZUZ1bmNzLmVuY29kZVdvcmQobmFtZSwgdGhpcy5fZ2V0VGV4dEVuY29kaW5nKG5hbWUpLCA1Mik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5hbWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSWYgbmVlZGVkLCBtaW1lIGVuY29kZXMgdGhlIG5hbWUgcGFydFxuICAgICAqXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IG5hbWUgTmFtZSBwYXJ0IG9mIGFuIGFkZHJlc3NcbiAgICAgKiBAcmV0dXJucyB7U3RyaW5nfSBNaW1lIHdvcmQgZW5jb2RlZCBzdHJpbmcgaWYgbmVlZGVkXG4gICAgICovXG4gICAgX2VuY29kZVdvcmRzKHZhbHVlKSB7XG4gICAgICAgIC8vIHNldCBlbmNvZGVBbGwgcGFyYW1ldGVyIHRvIHRydWUgZXZlbiB0aG91Z2ggaXQgaXMgYWdhaW5zdCB0aGUgcmVjb21tZW5kYXRpb24gb2YgUkZDMjA0NyxcbiAgICAgICAgLy8gYnkgZGVmYXVsdCBvbmx5IHdvcmRzIHRoYXQgaW5jbHVkZSBub24tYXNjaWkgc2hvdWxkIGJlIGNvbnZlcnRlZCBpbnRvIGVuY29kZWQgd29yZHNcbiAgICAgICAgLy8gYnV0IHNvbWUgY2xpZW50cyAoZWcuIFppbWJyYSkgZG8gbm90IGhhbmRsZSBpdCBwcm9wZXJseSBhbmQgcmVtb3ZlIHN1cnJvdW5kaW5nIHdoaXRlc3BhY2VcbiAgICAgICAgcmV0dXJuIG1pbWVGdW5jcy5lbmNvZGVXb3Jkcyh2YWx1ZSwgdGhpcy5fZ2V0VGV4dEVuY29kaW5nKHZhbHVlKSwgNTIsIHRydWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERldGVjdHMgYmVzdCBtaW1lIGVuY29kaW5nIGZvciBhIHRleHQgdmFsdWVcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSB2YWx1ZSBWYWx1ZSB0byBjaGVjayBmb3JcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9IGVpdGhlciAnUScgb3IgJ0InXG4gICAgICovXG4gICAgX2dldFRleHRFbmNvZGluZyh2YWx1ZSkge1xuICAgICAgICB2YWx1ZSA9ICh2YWx1ZSB8fCAnJykudG9TdHJpbmcoKTtcblxuICAgICAgICBsZXQgZW5jb2RpbmcgPSB0aGlzLnRleHRFbmNvZGluZztcbiAgICAgICAgbGV0IGxhdGluTGVuO1xuICAgICAgICBsZXQgbm9uTGF0aW5MZW47XG5cbiAgICAgICAgaWYgKCFlbmNvZGluZykge1xuICAgICAgICAgICAgLy8gY291bnQgbGF0aW4gYWxwaGFiZXQgc3ltYm9scyBhbmQgOC1iaXQgcmFuZ2Ugc3ltYm9scyArIGNvbnRyb2wgc3ltYm9sc1xuICAgICAgICAgICAgLy8gaWYgdGhlcmUgYXJlIG1vcmUgbGF0aW4gY2hhcmFjdGVycywgdGhlbiB1c2UgcXVvdGVkLXByaW50YWJsZVxuICAgICAgICAgICAgLy8gZW5jb2RpbmcsIG90aGVyd2lzZSB1c2UgYmFzZTY0XG4gICAgICAgICAgICBub25MYXRpbkxlbiA9ICh2YWx1ZS5tYXRjaCgvW1xceDAwLVxceDA4XFx4MEJcXHgwQ1xceDBFLVxceDFGXFx1MDA4MC1cXHVGRkZGXS9nKSB8fCBbXSkubGVuZ3RoO1xuICAgICAgICAgICAgbGF0aW5MZW4gPSAodmFsdWUubWF0Y2goL1thLXpdL2dpKSB8fCBbXSkubGVuZ3RoO1xuICAgICAgICAgICAgLy8gaWYgdGhlcmUgYXJlIG1vcmUgbGF0aW4gc3ltYm9scyB0aGFuIGJpbmFyeS91bmljb2RlLCB0aGVuIHByZWZlciBRLCBvdGhlcndpc2UgQlxuICAgICAgICAgICAgZW5jb2RpbmcgPSBub25MYXRpbkxlbiA8IGxhdGluTGVuID8gJ1EnIDogJ0InO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBlbmNvZGluZztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZW5lcmF0ZXMgYSBtZXNzYWdlIGlkXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9IFJhbmRvbSBNZXNzYWdlLUlEIHZhbHVlXG4gICAgICovXG4gICAgX2dlbmVyYXRlTWVzc2FnZUlkKCkge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgJzwnICtcbiAgICAgICAgICAgIFsyLCAyLCAyLCA2XS5yZWR1Y2UoXG4gICAgICAgICAgICAgICAgLy8gY3J1eCB0byBnZW5lcmF0ZSBVVUlELWxpa2UgcmFuZG9tIHN0cmluZ3NcbiAgICAgICAgICAgICAgICAocHJldiwgbGVuKSA9PiBwcmV2ICsgJy0nICsgY3J5cHRvLnJhbmRvbUJ5dGVzKGxlbikudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgICAgICAgICAgIGNyeXB0by5yYW5kb21CeXRlcyg0KS50b1N0cmluZygnaGV4JylcbiAgICAgICAgICAgICkgK1xuICAgICAgICAgICAgJ0AnICtcbiAgICAgICAgICAgIC8vIHRyeSB0byB1c2UgdGhlIGRvbWFpbiBvZiB0aGUgRlJPTSBhZGRyZXNzIG9yIGZhbGxiYWNrIHRvIHNlcnZlciBob3N0bmFtZVxuICAgICAgICAgICAgKHRoaXMuZ2V0RW52ZWxvcGUoKS5mcm9tIHx8IHRoaXMuaG9zdG5hbWUgfHwgJ2xvY2FsaG9zdCcpLnNwbGl0KCdAJykucG9wKCkgK1xuICAgICAgICAgICAgJz4nXG4gICAgICAgICk7XG4gICAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IE1pbWVOb2RlO1xuIl0sIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6WzBdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(action-browser)/./node_modules/.pnpm/nodemailer@7.0.13/node_modules/nodemailer/lib/mime-node/index.js\n");
|
||
|
||
/***/ }),
|
||
|
||
/***/ "(action-browser)/./node_modules/.pnpm/nodemailer@7.0.13/node_modules/nodemailer/lib/mime-node/last-newline.js":
|
||
/*!****************************************************************************************************!*\
|
||
!*** ./node_modules/.pnpm/nodemailer@7.0.13/node_modules/nodemailer/lib/mime-node/last-newline.js ***!
|
||
\****************************************************************************************************/
|
||
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
|
||
|
||
eval("\n\nconst Transform = (__webpack_require__(/*! stream */ \"stream\").Transform);\n\nclass LastNewline extends Transform {\n constructor() {\n super();\n this.lastByte = false;\n }\n\n _transform(chunk, encoding, done) {\n if (chunk.length) {\n this.lastByte = chunk[chunk.length - 1];\n }\n\n this.push(chunk);\n done();\n }\n\n _flush(done) {\n if (this.lastByte === 0x0a) {\n return done();\n }\n if (this.lastByte === 0x0d) {\n this.push(Buffer.from('\\n'));\n return done();\n }\n this.push(Buffer.from('\\r\\n'));\n return done();\n }\n}\n\nmodule.exports = LastNewline;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFjdGlvbi1icm93c2VyKS8uL25vZGVfbW9kdWxlcy8ucG5wbS9ub2RlbWFpbGVyQDcuMC4xMy9ub2RlX21vZHVsZXMvbm9kZW1haWxlci9saWIvbWltZS1ub2RlL2xhc3QtbmV3bGluZS5qcyIsIm1hcHBpbmdzIjoiQUFBYTs7QUFFYixrQkFBa0IsdURBQTJCOztBQUU3QztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEiLCJzb3VyY2VzIjpbIi9Vc2Vycy9tYXJjbWludGVsL1Byb2plY3RzL2UtdGliLmNvbS9ub2RlX21vZHVsZXMvLnBucG0vbm9kZW1haWxlckA3LjAuMTMvbm9kZV9tb2R1bGVzL25vZGVtYWlsZXIvbGliL21pbWUtbm9kZS9sYXN0LW5ld2xpbmUuanMiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCBUcmFuc2Zvcm0gPSByZXF1aXJlKCdzdHJlYW0nKS5UcmFuc2Zvcm07XG5cbmNsYXNzIExhc3ROZXdsaW5lIGV4dGVuZHMgVHJhbnNmb3JtIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5sYXN0Qnl0ZSA9IGZhbHNlO1xuICAgIH1cblxuICAgIF90cmFuc2Zvcm0oY2h1bmssIGVuY29kaW5nLCBkb25lKSB7XG4gICAgICAgIGlmIChjaHVuay5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMubGFzdEJ5dGUgPSBjaHVua1tjaHVuay5sZW5ndGggLSAxXTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucHVzaChjaHVuayk7XG4gICAgICAgIGRvbmUoKTtcbiAgICB9XG5cbiAgICBfZmx1c2goZG9uZSkge1xuICAgICAgICBpZiAodGhpcy5sYXN0Qnl0ZSA9PT0gMHgwYSkge1xuICAgICAgICAgICAgcmV0dXJuIGRvbmUoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5sYXN0Qnl0ZSA9PT0gMHgwZCkge1xuICAgICAgICAgICAgdGhpcy5wdXNoKEJ1ZmZlci5mcm9tKCdcXG4nKSk7XG4gICAgICAgICAgICByZXR1cm4gZG9uZSgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucHVzaChCdWZmZXIuZnJvbSgnXFxyXFxuJykpO1xuICAgICAgICByZXR1cm4gZG9uZSgpO1xuICAgIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBMYXN0TmV3bGluZTtcbiJdLCJuYW1lcyI6W10sImlnbm9yZUxpc3QiOlswXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(action-browser)/./node_modules/.pnpm/nodemailer@7.0.13/node_modules/nodemailer/lib/mime-node/last-newline.js\n");
|
||
|
||
/***/ }),
|
||
|
||
/***/ "(action-browser)/./node_modules/.pnpm/nodemailer@7.0.13/node_modules/nodemailer/lib/mime-node/le-unix.js":
|
||
/*!***********************************************************************************************!*\
|
||
!*** ./node_modules/.pnpm/nodemailer@7.0.13/node_modules/nodemailer/lib/mime-node/le-unix.js ***!
|
||
\***********************************************************************************************/
|
||
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
|
||
|
||
eval("\n\nconst stream = __webpack_require__(/*! stream */ \"stream\");\nconst Transform = stream.Transform;\n\n/**\n * Ensures that only <LF> is used for linebreaks\n *\n * @param {Object} options Stream options\n */\nclass LeWindows extends Transform {\n constructor(options) {\n super(options);\n // init Transform\n this.options = options || {};\n }\n\n /**\n * Escapes dots\n */\n _transform(chunk, encoding, done) {\n let buf;\n let lastPos = 0;\n\n for (let i = 0, len = chunk.length; i < len; i++) {\n if (chunk[i] === 0x0d) {\n // \\n\n buf = chunk.slice(lastPos, i);\n lastPos = i + 1;\n this.push(buf);\n }\n }\n if (lastPos && lastPos < chunk.length) {\n buf = chunk.slice(lastPos);\n this.push(buf);\n } else if (!lastPos) {\n this.push(chunk);\n }\n done();\n }\n}\n\nmodule.exports = LeWindows;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFjdGlvbi1icm93c2VyKS8uL25vZGVfbW9kdWxlcy8ucG5wbS9ub2RlbWFpbGVyQDcuMC4xMy9ub2RlX21vZHVsZXMvbm9kZW1haWxlci9saWIvbWltZS1ub2RlL2xlLXVuaXguanMiLCJtYXBwaW5ncyI6IkFBQWE7O0FBRWIsZUFBZSxtQkFBTyxDQUFDLHNCQUFRO0FBQy9COztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsUUFBUTtBQUNuQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsNENBQTRDLFNBQVM7QUFDckQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSIsInNvdXJjZXMiOlsiL1VzZXJzL21hcmNtaW50ZWwvUHJvamVjdHMvZS10aWIuY29tL25vZGVfbW9kdWxlcy8ucG5wbS9ub2RlbWFpbGVyQDcuMC4xMy9ub2RlX21vZHVsZXMvbm9kZW1haWxlci9saWIvbWltZS1ub2RlL2xlLXVuaXguanMiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCBzdHJlYW0gPSByZXF1aXJlKCdzdHJlYW0nKTtcbmNvbnN0IFRyYW5zZm9ybSA9IHN0cmVhbS5UcmFuc2Zvcm07XG5cbi8qKlxuICogRW5zdXJlcyB0aGF0IG9ubHkgPExGPiBpcyB1c2VkIGZvciBsaW5lYnJlYWtzXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgU3RyZWFtIG9wdGlvbnNcbiAqL1xuY2xhc3MgTGVXaW5kb3dzIGV4dGVuZHMgVHJhbnNmb3JtIHtcbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zKSB7XG4gICAgICAgIHN1cGVyKG9wdGlvbnMpO1xuICAgICAgICAvLyBpbml0IFRyYW5zZm9ybVxuICAgICAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEVzY2FwZXMgZG90c1xuICAgICAqL1xuICAgIF90cmFuc2Zvcm0oY2h1bmssIGVuY29kaW5nLCBkb25lKSB7XG4gICAgICAgIGxldCBidWY7XG4gICAgICAgIGxldCBsYXN0UG9zID0gMDtcblxuICAgICAgICBmb3IgKGxldCBpID0gMCwgbGVuID0gY2h1bmsubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChjaHVua1tpXSA9PT0gMHgwZCkge1xuICAgICAgICAgICAgICAgIC8vIFxcblxuICAgICAgICAgICAgICAgIGJ1ZiA9IGNodW5rLnNsaWNlKGxhc3RQb3MsIGkpO1xuICAgICAgICAgICAgICAgIGxhc3RQb3MgPSBpICsgMTtcbiAgICAgICAgICAgICAgICB0aGlzLnB1c2goYnVmKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAobGFzdFBvcyAmJiBsYXN0UG9zIDwgY2h1bmsubGVuZ3RoKSB7XG4gICAgICAgICAgICBidWYgPSBjaHVuay5zbGljZShsYXN0UG9zKTtcbiAgICAgICAgICAgIHRoaXMucHVzaChidWYpO1xuICAgICAgICB9IGVsc2UgaWYgKCFsYXN0UG9zKSB7XG4gICAgICAgICAgICB0aGlzLnB1c2goY2h1bmspO1xuICAgICAgICB9XG4gICAgICAgIGRvbmUoKTtcbiAgICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gTGVXaW5kb3dzO1xuIl0sIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6WzBdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(action-browser)/./node_modules/.pnpm/nodemailer@7.0.13/node_modules/nodemailer/lib/mime-node/le-unix.js\n");
|
||
|
||
/***/ }),
|
||
|
||
/***/ "(action-browser)/./node_modules/.pnpm/nodemailer@7.0.13/node_modules/nodemailer/lib/mime-node/le-windows.js":
|
||
/*!**************************************************************************************************!*\
|
||
!*** ./node_modules/.pnpm/nodemailer@7.0.13/node_modules/nodemailer/lib/mime-node/le-windows.js ***!
|
||
\**************************************************************************************************/
|
||
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
|
||
|
||
eval("\n\nconst stream = __webpack_require__(/*! stream */ \"stream\");\nconst Transform = stream.Transform;\n\n/**\n * Ensures that only <CR><LF> sequences are used for linebreaks\n *\n * @param {Object} options Stream options\n */\nclass LeWindows extends Transform {\n constructor(options) {\n super(options);\n // init Transform\n this.options = options || {};\n this.lastByte = false;\n }\n\n /**\n * Escapes dots\n */\n _transform(chunk, encoding, done) {\n let buf;\n let lastPos = 0;\n\n for (let i = 0, len = chunk.length; i < len; i++) {\n if (chunk[i] === 0x0a) {\n // \\n\n if ((i && chunk[i - 1] !== 0x0d) || (!i && this.lastByte !== 0x0d)) {\n if (i > lastPos) {\n buf = chunk.slice(lastPos, i);\n this.push(buf);\n }\n this.push(Buffer.from('\\r\\n'));\n lastPos = i + 1;\n }\n }\n }\n\n if (lastPos && lastPos < chunk.length) {\n buf = chunk.slice(lastPos);\n this.push(buf);\n } else if (!lastPos) {\n this.push(chunk);\n }\n\n this.lastByte = chunk[chunk.length - 1];\n done();\n }\n}\n\nmodule.exports = LeWindows;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFjdGlvbi1icm93c2VyKS8uL25vZGVfbW9kdWxlcy8ucG5wbS9ub2RlbWFpbGVyQDcuMC4xMy9ub2RlX21vZHVsZXMvbm9kZW1haWxlci9saWIvbWltZS1ub2RlL2xlLXdpbmRvd3MuanMiLCJtYXBwaW5ncyI6IkFBQWE7O0FBRWIsZUFBZSxtQkFBTyxDQUFDLHNCQUFRO0FBQy9COztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsUUFBUTtBQUNuQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSw0Q0FBNEMsU0FBUztBQUNyRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUEiLCJzb3VyY2VzIjpbIi9Vc2Vycy9tYXJjbWludGVsL1Byb2plY3RzL2UtdGliLmNvbS9ub2RlX21vZHVsZXMvLnBucG0vbm9kZW1haWxlckA3LjAuMTMvbm9kZV9tb2R1bGVzL25vZGVtYWlsZXIvbGliL21pbWUtbm9kZS9sZS13aW5kb3dzLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcblxuY29uc3Qgc3RyZWFtID0gcmVxdWlyZSgnc3RyZWFtJyk7XG5jb25zdCBUcmFuc2Zvcm0gPSBzdHJlYW0uVHJhbnNmb3JtO1xuXG4vKipcbiAqIEVuc3VyZXMgdGhhdCBvbmx5IDxDUj48TEY+IHNlcXVlbmNlcyBhcmUgdXNlZCBmb3IgbGluZWJyZWFrc1xuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIFN0cmVhbSBvcHRpb25zXG4gKi9cbmNsYXNzIExlV2luZG93cyBleHRlbmRzIFRyYW5zZm9ybSB7XG4gICAgY29uc3RydWN0b3Iob3B0aW9ucykge1xuICAgICAgICBzdXBlcihvcHRpb25zKTtcbiAgICAgICAgLy8gaW5pdCBUcmFuc2Zvcm1cbiAgICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgICAgICAgdGhpcy5sYXN0Qnl0ZSA9IGZhbHNlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEVzY2FwZXMgZG90c1xuICAgICAqL1xuICAgIF90cmFuc2Zvcm0oY2h1bmssIGVuY29kaW5nLCBkb25lKSB7XG4gICAgICAgIGxldCBidWY7XG4gICAgICAgIGxldCBsYXN0UG9zID0gMDtcblxuICAgICAgICBmb3IgKGxldCBpID0gMCwgbGVuID0gY2h1bmsubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChjaHVua1tpXSA9PT0gMHgwYSkge1xuICAgICAgICAgICAgICAgIC8vIFxcblxuICAgICAgICAgICAgICAgIGlmICgoaSAmJiBjaHVua1tpIC0gMV0gIT09IDB4MGQpIHx8ICghaSAmJiB0aGlzLmxhc3RCeXRlICE9PSAweDBkKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoaSA+IGxhc3RQb3MpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZiA9IGNodW5rLnNsaWNlKGxhc3RQb3MsIGkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wdXNoKGJ1Zik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wdXNoKEJ1ZmZlci5mcm9tKCdcXHJcXG4nKSk7XG4gICAgICAgICAgICAgICAgICAgIGxhc3RQb3MgPSBpICsgMTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobGFzdFBvcyAmJiBsYXN0UG9zIDwgY2h1bmsubGVuZ3RoKSB7XG4gICAgICAgICAgICBidWYgPSBjaHVuay5zbGljZShsYXN0UG9zKTtcbiAgICAgICAgICAgIHRoaXMucHVzaChidWYpO1xuICAgICAgICB9IGVsc2UgaWYgKCFsYXN0UG9zKSB7XG4gICAgICAgICAgICB0aGlzLnB1c2goY2h1bmspO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5sYXN0Qnl0ZSA9IGNodW5rW2NodW5rLmxlbmd0aCAtIDFdO1xuICAgICAgICBkb25lKCk7XG4gICAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IExlV2luZG93cztcbiJdLCJuYW1lcyI6W10sImlnbm9yZUxpc3QiOlswXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(action-browser)/./node_modules/.pnpm/nodemailer@7.0.13/node_modules/nodemailer/lib/mime-node/le-windows.js\n");
|
||
|
||
/***/ }),
|
||
|
||
/***/ "(action-browser)/./node_modules/.pnpm/nodemailer@7.0.13/node_modules/nodemailer/lib/nodemailer.js":
|
||
/*!****************************************************************************************!*\
|
||
!*** ./node_modules/.pnpm/nodemailer@7.0.13/node_modules/nodemailer/lib/nodemailer.js ***!
|
||
\****************************************************************************************/
|
||
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
|
||
|
||
eval("\n\nconst Mailer = __webpack_require__(/*! ./mailer */ \"(action-browser)/./node_modules/.pnpm/nodemailer@7.0.13/node_modules/nodemailer/lib/mailer/index.js\");\nconst shared = __webpack_require__(/*! ./shared */ \"(action-browser)/./node_modules/.pnpm/nodemailer@7.0.13/node_modules/nodemailer/lib/shared/index.js\");\nconst SMTPPool = __webpack_require__(/*! ./smtp-pool */ \"(action-browser)/./node_modules/.pnpm/nodemailer@7.0.13/node_modules/nodemailer/lib/smtp-pool/index.js\");\nconst SMTPTransport = __webpack_require__(/*! ./smtp-transport */ \"(action-browser)/./node_modules/.pnpm/nodemailer@7.0.13/node_modules/nodemailer/lib/smtp-transport/index.js\");\nconst SendmailTransport = __webpack_require__(/*! ./sendmail-transport */ \"(action-browser)/./node_modules/.pnpm/nodemailer@7.0.13/node_modules/nodemailer/lib/sendmail-transport/index.js\");\nconst StreamTransport = __webpack_require__(/*! ./stream-transport */ \"(action-browser)/./node_modules/.pnpm/nodemailer@7.0.13/node_modules/nodemailer/lib/stream-transport/index.js\");\nconst JSONTransport = __webpack_require__(/*! ./json-transport */ \"(action-browser)/./node_modules/.pnpm/nodemailer@7.0.13/node_modules/nodemailer/lib/json-transport/index.js\");\nconst SESTransport = __webpack_require__(/*! ./ses-transport */ \"(action-browser)/./node_modules/.pnpm/nodemailer@7.0.13/node_modules/nodemailer/lib/ses-transport/index.js\");\nconst nmfetch = __webpack_require__(/*! ./fetch */ \"(action-browser)/./node_modules/.pnpm/nodemailer@7.0.13/node_modules/nodemailer/lib/fetch/index.js\");\nconst packageData = __webpack_require__(/*! ../package.json */ \"(action-browser)/./node_modules/.pnpm/nodemailer@7.0.13/node_modules/nodemailer/package.json\");\n\nconst ETHEREAL_API = (process.env.ETHEREAL_API || 'https://api.nodemailer.com').replace(/\\/+$/, '');\nconst ETHEREAL_WEB = (process.env.ETHEREAL_WEB || 'https://ethereal.email').replace(/\\/+$/, '');\nconst ETHEREAL_API_KEY = (process.env.ETHEREAL_API_KEY || '').replace(/\\s*/g, '') || null;\nconst ETHEREAL_CACHE = ['true', 'yes', 'y', '1'].includes((process.env.ETHEREAL_CACHE || 'yes').toString().trim().toLowerCase());\n\nlet testAccount = false;\n\nmodule.exports.createTransport = function (transporter, defaults) {\n let urlConfig;\n let options;\n let mailer;\n\n if (\n // provided transporter is a configuration object, not transporter plugin\n (typeof transporter === 'object' && typeof transporter.send !== 'function') ||\n // provided transporter looks like a connection url\n (typeof transporter === 'string' && /^(smtps?|direct):/i.test(transporter))\n ) {\n if ((urlConfig = typeof transporter === 'string' ? transporter : transporter.url)) {\n // parse a configuration URL into configuration options\n options = shared.parseConnectionUrl(urlConfig);\n } else {\n options = transporter;\n }\n\n if (options.pool) {\n transporter = new SMTPPool(options);\n } else if (options.sendmail) {\n transporter = new SendmailTransport(options);\n } else if (options.streamTransport) {\n transporter = new StreamTransport(options);\n } else if (options.jsonTransport) {\n transporter = new JSONTransport(options);\n } else if (options.SES) {\n if (options.SES.ses && options.SES.aws) {\n let error = new Error(\n 'Using legacy SES configuration, expecting @aws-sdk/client-sesv2, see https://nodemailer.com/transports/ses/'\n );\n error.code = 'LegacyConfig';\n throw error;\n }\n transporter = new SESTransport(options);\n } else {\n transporter = new SMTPTransport(options);\n }\n }\n\n mailer = new Mailer(transporter, options, defaults);\n\n return mailer;\n};\n\nmodule.exports.createTestAccount = function (apiUrl, callback) {\n let promise;\n\n if (!callback && typeof apiUrl === 'function') {\n callback = apiUrl;\n apiUrl = false;\n }\n\n if (!callback) {\n promise = new Promise((resolve, reject) => {\n callback = shared.callbackPromise(resolve, reject);\n });\n }\n\n if (ETHEREAL_CACHE && testAccount) {\n setImmediate(() => callback(null, testAccount));\n return promise;\n }\n\n apiUrl = apiUrl || ETHEREAL_API;\n\n let chunks = [];\n let chunklen = 0;\n\n let requestHeaders = {};\n let requestBody = {\n requestor: packageData.name,\n version: packageData.version\n };\n\n if (ETHEREAL_API_KEY) {\n requestHeaders.Authorization = 'Bearer ' + ETHEREAL_API_KEY;\n }\n\n let req = nmfetch(apiUrl + '/user', {\n contentType: 'application/json',\n method: 'POST',\n headers: requestHeaders,\n body: Buffer.from(JSON.stringify(requestBody))\n });\n\n req.on('readable', () => {\n let chunk;\n while ((chunk = req.read()) !== null) {\n chunks.push(chunk);\n chunklen += chunk.length;\n }\n });\n\n req.once('error', err => callback(err));\n\n req.once('end', () => {\n let res = Buffer.concat(chunks, chunklen);\n let data;\n let err;\n try {\n data = JSON.parse(res.toString());\n } catch (E) {\n err = E;\n }\n if (err) {\n return callback(err);\n }\n if (data.status !== 'success' || data.error) {\n return callback(new Error(data.error || 'Request failed'));\n }\n delete data.status;\n testAccount = data;\n callback(null, testAccount);\n });\n\n return promise;\n};\n\nmodule.exports.getTestMessageUrl = function (info) {\n if (!info || !info.response) {\n return false;\n }\n\n let infoProps = new Map();\n info.response.replace(/\\[([^\\]]+)\\]$/, (m, props) => {\n props.replace(/\\b([A-Z0-9]+)=([^\\s]+)/g, (m, key, value) => {\n infoProps.set(key, value);\n });\n });\n\n if (infoProps.has('STATUS') && infoProps.has('MSGID')) {\n return (testAccount.web || ETHEREAL_WEB) + '/message/' + infoProps.get('MSGID');\n }\n\n return false;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFjdGlvbi1icm93c2VyKS8uL25vZGVfbW9kdWxlcy8ucG5wbS9ub2RlbWFpbGVyQDcuMC4xMy9ub2RlX21vZHVsZXMvbm9kZW1haWxlci9saWIvbm9kZW1haWxlci5qcyIsIm1hcHBpbmdzIjoiQUFBYTs7QUFFYixlQUFlLG1CQUFPLENBQUMscUhBQVU7QUFDakMsZUFBZSxtQkFBTyxDQUFDLHFIQUFVO0FBQ2pDLGlCQUFpQixtQkFBTyxDQUFDLDJIQUFhO0FBQ3RDLHNCQUFzQixtQkFBTyxDQUFDLHFJQUFrQjtBQUNoRCwwQkFBMEIsbUJBQU8sQ0FBQyw2SUFBc0I7QUFDeEQsd0JBQXdCLG1CQUFPLENBQUMseUlBQW9CO0FBQ3BELHNCQUFzQixtQkFBTyxDQUFDLHFJQUFrQjtBQUNoRCxxQkFBcUIsbUJBQU8sQ0FBQyxtSUFBaUI7QUFDOUMsZ0JBQWdCLG1CQUFPLENBQUMsbUhBQVM7QUFDakMsb0JBQW9CLG1CQUFPLENBQUMscUhBQWlCOztBQUU3QztBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQSw4QkFBOEI7QUFDOUI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBOztBQUVBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQSxVQUFVO0FBQ1Y7QUFDQSxVQUFVO0FBQ1Y7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQSxnQ0FBZ0M7QUFDaEM7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTs7QUFFQSxnQ0FBZ0M7QUFDaEM7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULEtBQUs7O0FBRUw7QUFDQTtBQUNBOztBQUVBO0FBQ0EiLCJzb3VyY2VzIjpbIi9Vc2Vycy9tYXJjbWludGVsL1Byb2plY3RzL2UtdGliLmNvbS9ub2RlX21vZHVsZXMvLnBucG0vbm9kZW1haWxlckA3LjAuMTMvbm9kZV9tb2R1bGVzL25vZGVtYWlsZXIvbGliL25vZGVtYWlsZXIuanMiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCBNYWlsZXIgPSByZXF1aXJlKCcuL21haWxlcicpO1xuY29uc3Qgc2hhcmVkID0gcmVxdWlyZSgnLi9zaGFyZWQnKTtcbmNvbnN0IFNNVFBQb29sID0gcmVxdWlyZSgnLi9zbXRwLXBvb2wnKTtcbmNvbnN0IFNNVFBUcmFuc3BvcnQgPSByZXF1aXJlKCcuL3NtdHAtdHJhbnNwb3J0Jyk7XG5jb25zdCBTZW5kbWFpbFRyYW5zcG9ydCA9IHJlcXVpcmUoJy4vc2VuZG1haWwtdHJhbnNwb3J0Jyk7XG5jb25zdCBTdHJlYW1UcmFuc3BvcnQgPSByZXF1aXJlKCcuL3N0cmVhbS10cmFuc3BvcnQnKTtcbmNvbnN0IEpTT05UcmFuc3BvcnQgPSByZXF1aXJlKCcuL2pzb24tdHJhbnNwb3J0Jyk7XG5jb25zdCBTRVNUcmFuc3BvcnQgPSByZXF1aXJlKCcuL3Nlcy10cmFuc3BvcnQnKTtcbmNvbnN0IG5tZmV0Y2ggPSByZXF1aXJlKCcuL2ZldGNoJyk7XG5jb25zdCBwYWNrYWdlRGF0YSA9IHJlcXVpcmUoJy4uL3BhY2thZ2UuanNvbicpO1xuXG5jb25zdCBFVEhFUkVBTF9BUEkgPSAocHJvY2Vzcy5lbnYuRVRIRVJFQUxfQVBJIHx8ICdodHRwczovL2FwaS5ub2RlbWFpbGVyLmNvbScpLnJlcGxhY2UoL1xcLyskLywgJycpO1xuY29uc3QgRVRIRVJFQUxfV0VCID0gKHByb2Nlc3MuZW52LkVUSEVSRUFMX1dFQiB8fCAnaHR0cHM6Ly9ldGhlcmVhbC5lbWFpbCcpLnJlcGxhY2UoL1xcLyskLywgJycpO1xuY29uc3QgRVRIRVJFQUxfQVBJX0tFWSA9IChwcm9jZXNzLmVudi5FVEhFUkVBTF9BUElfS0VZIHx8ICcnKS5yZXBsYWNlKC9cXHMqL2csICcnKSB8fCBudWxsO1xuY29uc3QgRVRIRVJFQUxfQ0FDSEUgPSBbJ3RydWUnLCAneWVzJywgJ3knLCAnMSddLmluY2x1ZGVzKChwcm9jZXNzLmVudi5FVEhFUkVBTF9DQUNIRSB8fCAneWVzJykudG9TdHJpbmcoKS50cmltKCkudG9Mb3dlckNhc2UoKSk7XG5cbmxldCB0ZXN0QWNjb3VudCA9IGZhbHNlO1xuXG5tb2R1bGUuZXhwb3J0cy5jcmVhdGVUcmFuc3BvcnQgPSBmdW5jdGlvbiAodHJhbnNwb3J0ZXIsIGRlZmF1bHRzKSB7XG4gICAgbGV0IHVybENvbmZpZztcbiAgICBsZXQgb3B0aW9ucztcbiAgICBsZXQgbWFpbGVyO1xuXG4gICAgaWYgKFxuICAgICAgICAvLyBwcm92aWRlZCB0cmFuc3BvcnRlciBpcyBhIGNvbmZpZ3VyYXRpb24gb2JqZWN0LCBub3QgdHJhbnNwb3J0ZXIgcGx1Z2luXG4gICAgICAgICh0eXBlb2YgdHJhbnNwb3J0ZXIgPT09ICdvYmplY3QnICYmIHR5cGVvZiB0cmFuc3BvcnRlci5zZW5kICE9PSAnZnVuY3Rpb24nKSB8fFxuICAgICAgICAvLyBwcm92aWRlZCB0cmFuc3BvcnRlciBsb29rcyBsaWtlIGEgY29ubmVjdGlvbiB1cmxcbiAgICAgICAgKHR5cGVvZiB0cmFuc3BvcnRlciA9PT0gJ3N0cmluZycgJiYgL14oc210cHM/fGRpcmVjdCk6L2kudGVzdCh0cmFuc3BvcnRlcikpXG4gICAgKSB7XG4gICAgICAgIGlmICgodXJsQ29uZmlnID0gdHlwZW9mIHRyYW5zcG9ydGVyID09PSAnc3RyaW5nJyA/IHRyYW5zcG9ydGVyIDogdHJhbnNwb3J0ZXIudXJsKSkge1xuICAgICAgICAgICAgLy8gcGFyc2UgYSBjb25maWd1cmF0aW9uIFVSTCBpbnRvIGNvbmZpZ3VyYXRpb24gb3B0aW9uc1xuICAgICAgICAgICAgb3B0aW9ucyA9IHNoYXJlZC5wYXJzZUNvbm5lY3Rpb25VcmwodXJsQ29uZmlnKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG9wdGlvbnMgPSB0cmFuc3BvcnRlcjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChvcHRpb25zLnBvb2wpIHtcbiAgICAgICAgICAgIHRyYW5zcG9ydGVyID0gbmV3IFNNVFBQb29sKG9wdGlvbnMpO1xuICAgICAgICB9IGVsc2UgaWYgKG9wdGlvbnMuc2VuZG1haWwpIHtcbiAgICAgICAgICAgIHRyYW5zcG9ydGVyID0gbmV3IFNlbmRtYWlsVHJhbnNwb3J0KG9wdGlvbnMpO1xuICAgICAgICB9IGVsc2UgaWYgKG9wdGlvbnMuc3RyZWFtVHJhbnNwb3J0KSB7XG4gICAgICAgICAgICB0cmFuc3BvcnRlciA9IG5ldyBTdHJlYW1UcmFuc3BvcnQob3B0aW9ucyk7XG4gICAgICAgIH0gZWxzZSBpZiAob3B0aW9ucy5qc29uVHJhbnNwb3J0KSB7XG4gICAgICAgICAgICB0cmFuc3BvcnRlciA9IG5ldyBKU09OVHJhbnNwb3J0KG9wdGlvbnMpO1xuICAgICAgICB9IGVsc2UgaWYgKG9wdGlvbnMuU0VTKSB7XG4gICAgICAgICAgICBpZiAob3B0aW9ucy5TRVMuc2VzICYmIG9wdGlvbnMuU0VTLmF3cykge1xuICAgICAgICAgICAgICAgIGxldCBlcnJvciA9IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgICAgICAgJ1VzaW5nIGxlZ2FjeSBTRVMgY29uZmlndXJhdGlvbiwgZXhwZWN0aW5nIEBhd3Mtc2RrL2NsaWVudC1zZXN2Miwgc2VlIGh0dHBzOi8vbm9kZW1haWxlci5jb20vdHJhbnNwb3J0cy9zZXMvJ1xuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgZXJyb3IuY29kZSA9ICdMZWdhY3lDb25maWcnO1xuICAgICAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdHJhbnNwb3J0ZXIgPSBuZXcgU0VTVHJhbnNwb3J0KG9wdGlvbnMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdHJhbnNwb3J0ZXIgPSBuZXcgU01UUFRyYW5zcG9ydChvcHRpb25zKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIG1haWxlciA9IG5ldyBNYWlsZXIodHJhbnNwb3J0ZXIsIG9wdGlvbnMsIGRlZmF1bHRzKTtcblxuICAgIHJldHVybiBtYWlsZXI7XG59O1xuXG5tb2R1bGUuZXhwb3J0cy5jcmVhdGVUZXN0QWNjb3VudCA9IGZ1bmN0aW9uIChhcGlVcmwsIGNhbGxiYWNrKSB7XG4gICAgbGV0IHByb21pc2U7XG5cbiAgICBpZiAoIWNhbGxiYWNrICYmIHR5cGVvZiBhcGlVcmwgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgY2FsbGJhY2sgPSBhcGlVcmw7XG4gICAgICAgIGFwaVVybCA9IGZhbHNlO1xuICAgIH1cblxuICAgIGlmICghY2FsbGJhY2spIHtcbiAgICAgICAgcHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIGNhbGxiYWNrID0gc2hhcmVkLmNhbGxiYWNrUHJvbWlzZShyZXNvbHZlLCByZWplY3QpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAoRVRIRVJFQUxfQ0FDSEUgJiYgdGVzdEFjY291bnQpIHtcbiAgICAgICAgc2V0SW1tZWRpYXRlKCgpID0+IGNhbGxiYWNrKG51bGwsIHRlc3RBY2NvdW50KSk7XG4gICAgICAgIHJldHVybiBwcm9taXNlO1xuICAgIH1cblxuICAgIGFwaVVybCA9IGFwaVVybCB8fCBFVEhFUkVBTF9BUEk7XG5cbiAgICBsZXQgY2h1bmtzID0gW107XG4gICAgbGV0IGNodW5rbGVuID0gMDtcblxuICAgIGxldCByZXF1ZXN0SGVhZGVycyA9IHt9O1xuICAgIGxldCByZXF1ZXN0Qm9keSA9IHtcbiAgICAgICAgcmVxdWVzdG9yOiBwYWNrYWdlRGF0YS5uYW1lLFxuICAgICAgICB2ZXJzaW9uOiBwYWNrYWdlRGF0YS52ZXJzaW9uXG4gICAgfTtcblxuICAgIGlmIChFVEhFUkVBTF9BUElfS0VZKSB7XG4gICAgICAgIHJlcXVlc3RIZWFkZXJzLkF1dGhvcml6YXRpb24gPSAnQmVhcmVyICcgKyBFVEhFUkVBTF9BUElfS0VZO1xuICAgIH1cblxuICAgIGxldCByZXEgPSBubWZldGNoKGFwaVVybCArICcvdXNlcicsIHtcbiAgICAgICAgY29udGVudFR5cGU6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgIGhlYWRlcnM6IHJlcXVlc3RIZWFkZXJzLFxuICAgICAgICBib2R5OiBCdWZmZXIuZnJvbShKU09OLnN0cmluZ2lmeShyZXF1ZXN0Qm9keSkpXG4gICAgfSk7XG5cbiAgICByZXEub24oJ3JlYWRhYmxlJywgKCkgPT4ge1xuICAgICAgICBsZXQgY2h1bms7XG4gICAgICAgIHdoaWxlICgoY2h1bmsgPSByZXEucmVhZCgpKSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgY2h1bmtzLnB1c2goY2h1bmspO1xuICAgICAgICAgICAgY2h1bmtsZW4gKz0gY2h1bmsubGVuZ3RoO1xuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICByZXEub25jZSgnZXJyb3InLCBlcnIgPT4gY2FsbGJhY2soZXJyKSk7XG5cbiAgICByZXEub25jZSgnZW5kJywgKCkgPT4ge1xuICAgICAgICBsZXQgcmVzID0gQnVmZmVyLmNvbmNhdChjaHVua3MsIGNodW5rbGVuKTtcbiAgICAgICAgbGV0IGRhdGE7XG4gICAgICAgIGxldCBlcnI7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBkYXRhID0gSlNPTi5wYXJzZShyZXMudG9TdHJpbmcoKSk7XG4gICAgICAgIH0gY2F0Y2ggKEUpIHtcbiAgICAgICAgICAgIGVyciA9IEU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKGVycik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRhdGEuc3RhdHVzICE9PSAnc3VjY2VzcycgfHwgZGF0YS5lcnJvcikge1xuICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKG5ldyBFcnJvcihkYXRhLmVycm9yIHx8ICdSZXF1ZXN0IGZhaWxlZCcpKTtcbiAgICAgICAgfVxuICAgICAgICBkZWxldGUgZGF0YS5zdGF0dXM7XG4gICAgICAgIHRlc3RBY2NvdW50ID0gZGF0YTtcbiAgICAgICAgY2FsbGJhY2sobnVsbCwgdGVzdEFjY291bnQpO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHByb21pc2U7XG59O1xuXG5tb2R1bGUuZXhwb3J0cy5nZXRUZXN0TWVzc2FnZVVybCA9IGZ1bmN0aW9uIChpbmZvKSB7XG4gICAgaWYgKCFpbmZvIHx8ICFpbmZvLnJlc3BvbnNlKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBsZXQgaW5mb1Byb3BzID0gbmV3IE1hcCgpO1xuICAgIGluZm8ucmVzcG9uc2UucmVwbGFjZSgvXFxbKFteXFxdXSspXFxdJC8sIChtLCBwcm9wcykgPT4ge1xuICAgICAgICBwcm9wcy5yZXBsYWNlKC9cXGIoW0EtWjAtOV0rKT0oW15cXHNdKykvZywgKG0sIGtleSwgdmFsdWUpID0+IHtcbiAgICAgICAgICAgIGluZm9Qcm9wcy5zZXQoa2V5LCB2YWx1ZSk7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaWYgKGluZm9Qcm9wcy5oYXMoJ1NUQVRVUycpICYmIGluZm9Qcm9wcy5oYXMoJ01TR0lEJykpIHtcbiAgICAgICAgcmV0dXJuICh0ZXN0QWNjb3VudC53ZWIgfHwgRVRIRVJFQUxfV0VCKSArICcvbWVzc2FnZS8nICsgaW5mb1Byb3BzLmdldCgnTVNHSUQnKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG59O1xuIl0sIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6WzBdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(action-browser)/./node_modules/.pnpm/nodemailer@7.0.13/node_modules/nodemailer/lib/nodemailer.js\n");
|
||
|
||
/***/ }),
|
||
|
||
/***/ "(action-browser)/./node_modules/.pnpm/nodemailer@7.0.13/node_modules/nodemailer/lib/punycode/index.js":
|
||
/*!********************************************************************************************!*\
|
||
!*** ./node_modules/.pnpm/nodemailer@7.0.13/node_modules/nodemailer/lib/punycode/index.js ***!
|
||
\********************************************************************************************/
|
||
/***/ ((module) => {
|
||
|
||
eval("/*\n\nCopied from https://github.com/mathiasbynens/punycode.js/blob/ef3505c8abb5143a00d53ce59077c9f7f4b2ac47/punycode.js\n\nCopyright Mathias Bynens <https://mathiasbynens.be/>\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n*/\n/* eslint callback-return: 0, no-bitwise: 0, eqeqeq: 0, prefer-arrow-callback: 0, object-shorthand: 0 */\n\n\n\n/** Highest positive signed 32-bit float value */\nconst maxInt = 2147483647; // aka. 0x7FFFFFFF or 2^31-1\n\n/** Bootstring parameters */\nconst base = 36;\nconst tMin = 1;\nconst tMax = 26;\nconst skew = 38;\nconst damp = 700;\nconst initialBias = 72;\nconst initialN = 128; // 0x80\nconst delimiter = '-'; // '\\x2D'\n\n/** Regular expressions */\nconst regexPunycode = /^xn--/;\nconst regexNonASCII = /[^\\0-\\x7F]/; // Note: U+007F DEL is excluded too.\nconst regexSeparators = /[\\x2E\\u3002\\uFF0E\\uFF61]/g; // RFC 3490 separators\n\n/** Error messages */\nconst errors = {\n overflow: 'Overflow: input needs wider integers to process',\n 'not-basic': 'Illegal input >= 0x80 (not a basic code point)',\n 'invalid-input': 'Invalid input'\n};\n\n/** Convenience shortcuts */\nconst baseMinusTMin = base - tMin;\nconst floor = Math.floor;\nconst stringFromCharCode = String.fromCharCode;\n\n/*--------------------------------------------------------------------------*/\n\n/**\n * A generic error utility function.\n * @private\n * @param {String} type The error type.\n * @returns {Error} Throws a `RangeError` with the applicable error message.\n */\nfunction error(type) {\n throw new RangeError(errors[type]);\n}\n\n/**\n * A generic `Array#map` utility function.\n * @private\n * @param {Array} array The array to iterate over.\n * @param {Function} callback The function that gets called for every array\n * item.\n * @returns {Array} A new array of values returned by the callback function.\n */\nfunction map(array, callback) {\n const result = [];\n let length = array.length;\n while (length--) {\n result[length] = callback(array[length]);\n }\n return result;\n}\n\n/**\n * A simple `Array#map`-like wrapper to work with domain name strings or email\n * addresses.\n * @private\n * @param {String} domain The domain name or email address.\n * @param {Function} callback The function that gets called for every\n * character.\n * @returns {String} A new string of characters returned by the callback\n * function.\n */\nfunction mapDomain(domain, callback) {\n const parts = domain.split('@');\n let result = '';\n if (parts.length > 1) {\n // In email addresses, only the domain name should be punycoded. Leave\n // the local part (i.e. everything up to `@`) intact.\n result = parts[0] + '@';\n domain = parts[1];\n }\n // Avoid `split(regex)` for IE8 compatibility. See #17.\n domain = domain.replace(regexSeparators, '\\x2E');\n const labels = domain.split('.');\n const encoded = map(labels, callback).join('.');\n return result + encoded;\n}\n\n/**\n * Creates an array containing the numeric code points of each Unicode\n * character in the string. While JavaScript uses UCS-2 internally,\n * this function will convert a pair of surrogate halves (each of which\n * UCS-2 exposes as separate characters) into a single code point,\n * matching UTF-16.\n * @see `punycode.ucs2.encode`\n * @see <https://mathiasbynens.be/notes/javascript-encoding>\n * @memberOf punycode.ucs2\n * @name decode\n * @param {String} string The Unicode input string (UCS-2).\n * @returns {Array} The new array of code points.\n */\nfunction ucs2decode(string) {\n const output = [];\n let counter = 0;\n const length = string.length;\n while (counter < length) {\n const value = string.charCodeAt(counter++);\n if (value >= 0xd800 && value <= 0xdbff && counter < length) {\n // It's a high surrogate, and there is a next character.\n const extra = string.charCodeAt(counter++);\n if ((extra & 0xfc00) == 0xdc00) {\n // Low surrogate.\n output.push(((value & 0x3ff) << 10) + (extra & 0x3ff) + 0x10000);\n } else {\n // It's an unmatched surrogate; only append this code unit, in case the\n // next code unit is the high surrogate of a surrogate pair.\n output.push(value);\n counter--;\n }\n } else {\n output.push(value);\n }\n }\n return output;\n}\n\n/**\n * Creates a string based on an array of numeric code points.\n * @see `punycode.ucs2.decode`\n * @memberOf punycode.ucs2\n * @name encode\n * @param {Array} codePoints The array of numeric code points.\n * @returns {String} The new Unicode string (UCS-2).\n */\nconst ucs2encode = codePoints => String.fromCodePoint(...codePoints);\n\n/**\n * Converts a basic code point into a digit/integer.\n * @see `digitToBasic()`\n * @private\n * @param {Number} codePoint The basic numeric code point value.\n * @returns {Number} The numeric value of a basic code point (for use in\n * representing integers) in the range `0` to `base - 1`, or `base` if\n * the code point does not represent a value.\n */\nconst basicToDigit = function (codePoint) {\n if (codePoint >= 0x30 && codePoint < 0x3a) {\n return 26 + (codePoint - 0x30);\n }\n if (codePoint >= 0x41 && codePoint < 0x5b) {\n return codePoint - 0x41;\n }\n if (codePoint >= 0x61 && codePoint < 0x7b) {\n return codePoint - 0x61;\n }\n return base;\n};\n\n/**\n * Converts a digit/integer into a basic code point.\n * @see `basicToDigit()`\n * @private\n * @param {Number} digit The numeric value of a basic code point.\n * @returns {Number} The basic code point whose value (when used for\n * representing integers) is `digit`, which needs to be in the range\n * `0` to `base - 1`. If `flag` is non-zero, the uppercase form is\n * used; else, the lowercase form is used. The behavior is undefined\n * if `flag` is non-zero and `digit` has no uppercase form.\n */\nconst digitToBasic = function (digit, flag) {\n // 0..25 map to ASCII a..z or A..Z\n // 26..35 map to ASCII 0..9\n return digit + 22 + 75 * (digit < 26) - ((flag != 0) << 5);\n};\n\n/**\n * Bias adaptation function as per section 3.4 of RFC 3492.\n * https://tools.ietf.org/html/rfc3492#section-3.4\n * @private\n */\nconst adapt = function (delta, numPoints, firstTime) {\n let k = 0;\n delta = firstTime ? floor(delta / damp) : delta >> 1;\n delta += floor(delta / numPoints);\n for (; /* no initialization */ delta > (baseMinusTMin * tMax) >> 1; k += base) {\n delta = floor(delta / baseMinusTMin);\n }\n return floor(k + ((baseMinusTMin + 1) * delta) / (delta + skew));\n};\n\n/**\n * Converts a Punycode string of ASCII-only symbols to a string of Unicode\n * symbols.\n * @memberOf punycode\n * @param {String} input The Punycode string of ASCII-only symbols.\n * @returns {String} The resulting string of Unicode symbols.\n */\nconst decode = function (input) {\n // Don't use UCS-2.\n const output = [];\n const inputLength = input.length;\n let i = 0;\n let n = initialN;\n let bias = initialBias;\n\n // Handle the basic code points: let `basic` be the number of input code\n // points before the last delimiter, or `0` if there is none, then copy\n // the first basic code points to the output.\n\n let basic = input.lastIndexOf(delimiter);\n if (basic < 0) {\n basic = 0;\n }\n\n for (let j = 0; j < basic; ++j) {\n // if it's not a basic code point\n if (input.charCodeAt(j) >= 0x80) {\n error('not-basic');\n }\n output.push(input.charCodeAt(j));\n }\n\n // Main decoding loop: start just after the last delimiter if any basic code\n // points were copied; start at the beginning otherwise.\n\n for (let index = basic > 0 ? basic + 1 : 0; index < inputLength /* no final expression */; ) {\n // `index` is the index of the next character to be consumed.\n // Decode a generalized variable-length integer into `delta`,\n // which gets added to `i`. The overflow checking is easier\n // if we increase `i` as we go, then subtract off its starting\n // value at the end to obtain `delta`.\n const oldi = i;\n for (let w = 1, k = base /* no condition */; ; k += base) {\n if (index >= inputLength) {\n error('invalid-input');\n }\n\n const digit = basicToDigit(input.charCodeAt(index++));\n\n if (digit >= base) {\n error('invalid-input');\n }\n if (digit > floor((maxInt - i) / w)) {\n error('overflow');\n }\n\n i += digit * w;\n const t = k <= bias ? tMin : k >= bias + tMax ? tMax : k - bias;\n\n if (digit < t) {\n break;\n }\n\n const baseMinusT = base - t;\n if (w > floor(maxInt / baseMinusT)) {\n error('overflow');\n }\n\n w *= baseMinusT;\n }\n\n const out = output.length + 1;\n bias = adapt(i - oldi, out, oldi == 0);\n\n // `i` was supposed to wrap around from `out` to `0`,\n // incrementing `n` each time, so we'll fix that now:\n if (floor(i / out) > maxInt - n) {\n error('overflow');\n }\n\n n += floor(i / out);\n i %= out;\n\n // Insert `n` at position `i` of the output.\n output.splice(i++, 0, n);\n }\n\n return String.fromCodePoint(...output);\n};\n\n/**\n * Converts a string of Unicode symbols (e.g. a domain name label) to a\n * Punycode string of ASCII-only symbols.\n * @memberOf punycode\n * @param {String} input The string of Unicode symbols.\n * @returns {String} The resulting Punycode string of ASCII-only symbols.\n */\nconst encode = function (input) {\n const output = [];\n\n // Convert the input in UCS-2 to an array of Unicode code points.\n input = ucs2decode(input);\n\n // Cache the length.\n const inputLength = input.length;\n\n // Initialize the state.\n let n = initialN;\n let delta = 0;\n let bias = initialBias;\n\n // Handle the basic code points.\n for (const currentValue of input) {\n if (currentValue < 0x80) {\n output.push(stringFromCharCode(currentValue));\n }\n }\n\n const basicLength = output.length;\n let handledCPCount = basicLength;\n\n // `handledCPCount` is the number of code points that have been handled;\n // `basicLength` is the number of basic code points.\n\n // Finish the basic string with a delimiter unless it's empty.\n if (basicLength) {\n output.push(delimiter);\n }\n\n // Main encoding loop:\n while (handledCPCount < inputLength) {\n // All non-basic code points < n have been handled already. Find the next\n // larger one:\n let m = maxInt;\n for (const currentValue of input) {\n if (currentValue >= n && currentValue < m) {\n m = currentValue;\n }\n }\n\n // Increase `delta` enough to advance the decoder's <n,i> state to <m,0>,\n // but guard against overflow.\n const handledCPCountPlusOne = handledCPCount + 1;\n if (m - n > floor((maxInt - delta) / handledCPCountPlusOne)) {\n error('overflow');\n }\n\n delta += (m - n) * handledCPCountPlusOne;\n n = m;\n\n for (const currentValue of input) {\n if (currentValue < n && ++delta > maxInt) {\n error('overflow');\n }\n if (currentValue === n) {\n // Represent delta as a generalized variable-length integer.\n let q = delta;\n for (let k = base /* no condition */; ; k += base) {\n const t = k <= bias ? tMin : k >= bias + tMax ? tMax : k - bias;\n if (q < t) {\n break;\n }\n const qMinusT = q - t;\n const baseMinusT = base - t;\n output.push(stringFromCharCode(digitToBasic(t + (qMinusT % baseMinusT), 0)));\n q = floor(qMinusT / baseMinusT);\n }\n\n output.push(stringFromCharCode(digitToBasic(q, 0)));\n bias = adapt(delta, handledCPCountPlusOne, handledCPCount === basicLength);\n delta = 0;\n ++handledCPCount;\n }\n }\n\n ++delta;\n ++n;\n }\n return output.join('');\n};\n\n/**\n * Converts a Punycode string representing a domain name or an email address\n * to Unicode. Only the Punycoded parts of the input will be converted, i.e.\n * it doesn't matter if you call it on a string that has already been\n * converted to Unicode.\n * @memberOf punycode\n * @param {String} input The Punycoded domain name or email address to\n * convert to Unicode.\n * @returns {String} The Unicode representation of the given Punycode\n * string.\n */\nconst toUnicode = function (input) {\n return mapDomain(input, function (string) {\n return regexPunycode.test(string) ? decode(string.slice(4).toLowerCase()) : string;\n });\n};\n\n/**\n * Converts a Unicode string representing a domain name or an email address to\n * Punycode. Only the non-ASCII parts of the domain name will be converted,\n * i.e. it doesn't matter if you call it with a domain that's already in\n * ASCII.\n * @memberOf punycode\n * @param {String} input The domain name or email address to convert, as a\n * Unicode string.\n * @returns {String} The Punycode representation of the given domain name or\n * email address.\n */\nconst toASCII = function (input) {\n return mapDomain(input, function (string) {\n return regexNonASCII.test(string) ? 'xn--' + encode(string) : string;\n });\n};\n\n/*--------------------------------------------------------------------------*/\n\n/** Define the public API */\nconst punycode = {\n /**\n * A string representing the current Punycode.js version number.\n * @memberOf punycode\n * @type String\n */\n version: '2.3.1',\n /**\n * An object of methods to convert from JavaScript's internal character\n * representation (UCS-2) to Unicode code points, and back.\n * @see <https://mathiasbynens.be/notes/javascript-encoding>\n * @memberOf punycode\n * @type Object\n */\n ucs2: {\n decode: ucs2decode,\n encode: ucs2encode\n },\n decode: decode,\n encode: encode,\n toASCII: toASCII,\n toUnicode: toUnicode\n};\n\nmodule.exports = punycode;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFjdGlvbi1icm93c2VyKS8uL25vZGVfbW9kdWxlcy8ucG5wbS9ub2RlbWFpbGVyQDcuMC4xMy9ub2RlX21vZHVsZXMvbm9kZW1haWxlci9saWIvcHVueWNvZGUvaW5kZXguanMiLCJtYXBwaW5ncyI6IkFBQUE7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVhOztBQUViO0FBQ0EsMkJBQTJCOztBQUUzQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQjtBQUN0Qix1QkFBdUI7O0FBRXZCO0FBQ0E7QUFDQSxvQ0FBb0M7QUFDcEMscURBQXFEOztBQUVyRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CLGFBQWEsT0FBTztBQUNwQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLE9BQU87QUFDbEIsV0FBVyxVQUFVO0FBQ3JCO0FBQ0EsYUFBYSxPQUFPO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsUUFBUTtBQUNuQixXQUFXLFVBQVU7QUFDckI7QUFDQSxhQUFhLFFBQVE7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsUUFBUTtBQUNuQixhQUFhLE9BQU87QUFDcEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2QsZ0RBQWdEO0FBQ2hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsT0FBTztBQUNsQixhQUFhLFFBQVE7QUFDckI7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsUUFBUTtBQUNuQixhQUFhLFFBQVE7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CLGFBQWEsUUFBUTtBQUNyQjtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsNkRBQTZEO0FBQ3hFO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CLGFBQWEsUUFBUTtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxvQkFBb0IsV0FBVztBQUMvQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSwyQkFBMkI7O0FBRTNCLGdEQUFnRCwrQ0FBK0M7QUFDL0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdURBQXVEO0FBQ3ZEO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsUUFBUTtBQUNuQixhQUFhLFFBQVE7QUFDckI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0RBQXdEO0FBQ3hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkI7QUFDQSxhQUFhLFFBQVE7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkI7QUFDQSxhQUFhLFFBQVE7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSIsInNvdXJjZXMiOlsiL1VzZXJzL21hcmNtaW50ZWwvUHJvamVjdHMvZS10aWIuY29tL25vZGVfbW9kdWxlcy8ucG5wbS9ub2RlbWFpbGVyQDcuMC4xMy9ub2RlX21vZHVsZXMvbm9kZW1haWxlci9saWIvcHVueWNvZGUvaW5kZXguanMiXSwic291cmNlc0NvbnRlbnQiOlsiLypcblxuQ29waWVkIGZyb20gaHR0cHM6Ly9naXRodWIuY29tL21hdGhpYXNieW5lbnMvcHVueWNvZGUuanMvYmxvYi9lZjM1MDVjOGFiYjUxNDNhMDBkNTNjZTU5MDc3YzlmN2Y0YjJhYzQ3L3B1bnljb2RlLmpzXG5cbkNvcHlyaWdodCBNYXRoaWFzIEJ5bmVucyA8aHR0cHM6Ly9tYXRoaWFzYnluZW5zLmJlLz5cblxuUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nXG5hIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGVcblwiU29mdHdhcmVcIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZ1xud2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLFxuZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvXG5wZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG9cbnRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcblxuVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmVcbmluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuXG5USEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELFxuRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GXG5NRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORFxuTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRVxuTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTlxuT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OXG5XSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS5cblxuKi9cbi8qIGVzbGludCBjYWxsYmFjay1yZXR1cm46IDAsIG5vLWJpdHdpc2U6IDAsIGVxZXFlcTogMCwgcHJlZmVyLWFycm93LWNhbGxiYWNrOiAwLCBvYmplY3Qtc2hvcnRoYW5kOiAwICovXG5cbid1c2Ugc3RyaWN0JztcblxuLyoqIEhpZ2hlc3QgcG9zaXRpdmUgc2lnbmVkIDMyLWJpdCBmbG9hdCB2YWx1ZSAqL1xuY29uc3QgbWF4SW50ID0gMjE0NzQ4MzY0NzsgLy8gYWthLiAweDdGRkZGRkZGIG9yIDJeMzEtMVxuXG4vKiogQm9vdHN0cmluZyBwYXJhbWV0ZXJzICovXG5jb25zdCBiYXNlID0gMzY7XG5jb25zdCB0TWluID0gMTtcbmNvbnN0IHRNYXggPSAyNjtcbmNvbnN0IHNrZXcgPSAzODtcbmNvbnN0IGRhbXAgPSA3MDA7XG5jb25zdCBpbml0aWFsQmlhcyA9IDcyO1xuY29uc3QgaW5pdGlhbE4gPSAxMjg7IC8vIDB4ODBcbmNvbnN0IGRlbGltaXRlciA9ICctJzsgLy8gJ1xceDJEJ1xuXG4vKiogUmVndWxhciBleHByZXNzaW9ucyAqL1xuY29uc3QgcmVnZXhQdW55Y29kZSA9IC9eeG4tLS87XG5jb25zdCByZWdleE5vbkFTQ0lJID0gL1teXFwwLVxceDdGXS87IC8vIE5vdGU6IFUrMDA3RiBERUwgaXMgZXhjbHVkZWQgdG9vLlxuY29uc3QgcmVnZXhTZXBhcmF0b3JzID0gL1tcXHgyRVxcdTMwMDJcXHVGRjBFXFx1RkY2MV0vZzsgLy8gUkZDIDM0OTAgc2VwYXJhdG9yc1xuXG4vKiogRXJyb3IgbWVzc2FnZXMgKi9cbmNvbnN0IGVycm9ycyA9IHtcbiAgICBvdmVyZmxvdzogJ092ZXJmbG93OiBpbnB1dCBuZWVkcyB3aWRlciBpbnRlZ2VycyB0byBwcm9jZXNzJyxcbiAgICAnbm90LWJhc2ljJzogJ0lsbGVnYWwgaW5wdXQgPj0gMHg4MCAobm90IGEgYmFzaWMgY29kZSBwb2ludCknLFxuICAgICdpbnZhbGlkLWlucHV0JzogJ0ludmFsaWQgaW5wdXQnXG59O1xuXG4vKiogQ29udmVuaWVuY2Ugc2hvcnRjdXRzICovXG5jb25zdCBiYXNlTWludXNUTWluID0gYmFzZSAtIHRNaW47XG5jb25zdCBmbG9vciA9IE1hdGguZmxvb3I7XG5jb25zdCBzdHJpbmdGcm9tQ2hhckNvZGUgPSBTdHJpbmcuZnJvbUNoYXJDb2RlO1xuXG4vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuLyoqXG4gKiBBIGdlbmVyaWMgZXJyb3IgdXRpbGl0eSBmdW5jdGlvbi5cbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge1N0cmluZ30gdHlwZSBUaGUgZXJyb3IgdHlwZS5cbiAqIEByZXR1cm5zIHtFcnJvcn0gVGhyb3dzIGEgYFJhbmdlRXJyb3JgIHdpdGggdGhlIGFwcGxpY2FibGUgZXJyb3IgbWVzc2FnZS5cbiAqL1xuZnVuY3Rpb24gZXJyb3IodHlwZSkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKGVycm9yc1t0eXBlXSk7XG59XG5cbi8qKlxuICogQSBnZW5lcmljIGBBcnJheSNtYXBgIHV0aWxpdHkgZnVuY3Rpb24uXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGl0ZXJhdGUgb3Zlci5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIFRoZSBmdW5jdGlvbiB0aGF0IGdldHMgY2FsbGVkIGZvciBldmVyeSBhcnJheVxuICogaXRlbS5cbiAqIEByZXR1cm5zIHtBcnJheX0gQSBuZXcgYXJyYXkgb2YgdmFsdWVzIHJldHVybmVkIGJ5IHRoZSBjYWxsYmFjayBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gbWFwKGFycmF5LCBjYWxsYmFjaykge1xuICAgIGNvbnN0IHJlc3VsdCA9IFtdO1xuICAgIGxldCBsZW5ndGggPSBhcnJheS5sZW5ndGg7XG4gICAgd2hpbGUgKGxlbmd0aC0tKSB7XG4gICAgICAgIHJlc3VsdFtsZW5ndGhdID0gY2FsbGJhY2soYXJyYXlbbGVuZ3RoXSk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogQSBzaW1wbGUgYEFycmF5I21hcGAtbGlrZSB3cmFwcGVyIHRvIHdvcmsgd2l0aCBkb21haW4gbmFtZSBzdHJpbmdzIG9yIGVtYWlsXG4gKiBhZGRyZXNzZXMuXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtTdHJpbmd9IGRvbWFpbiBUaGUgZG9tYWluIG5hbWUgb3IgZW1haWwgYWRkcmVzcy5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIFRoZSBmdW5jdGlvbiB0aGF0IGdldHMgY2FsbGVkIGZvciBldmVyeVxuICogY2hhcmFjdGVyLlxuICogQHJldHVybnMge1N0cmluZ30gQSBuZXcgc3RyaW5nIG9mIGNoYXJhY3RlcnMgcmV0dXJuZWQgYnkgdGhlIGNhbGxiYWNrXG4gKiBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gbWFwRG9tYWluKGRvbWFpbiwgY2FsbGJhY2spIHtcbiAgICBjb25zdCBwYXJ0cyA9IGRvbWFpbi5zcGxpdCgnQCcpO1xuICAgIGxldCByZXN1bHQgPSAnJztcbiAgICBpZiAocGFydHMubGVuZ3RoID4gMSkge1xuICAgICAgICAvLyBJbiBlbWFpbCBhZGRyZXNzZXMsIG9ubHkgdGhlIGRvbWFpbiBuYW1lIHNob3VsZCBiZSBwdW55Y29kZWQuIExlYXZlXG4gICAgICAgIC8vIHRoZSBsb2NhbCBwYXJ0IChpLmUuIGV2ZXJ5dGhpbmcgdXAgdG8gYEBgKSBpbnRhY3QuXG4gICAgICAgIHJlc3VsdCA9IHBhcnRzWzBdICsgJ0AnO1xuICAgICAgICBkb21haW4gPSBwYXJ0c1sxXTtcbiAgICB9XG4gICAgLy8gQXZvaWQgYHNwbGl0KHJlZ2V4KWAgZm9yIElFOCBjb21wYXRpYmlsaXR5LiBTZWUgIzE3LlxuICAgIGRvbWFpbiA9IGRvbWFpbi5yZXBsYWNlKHJlZ2V4U2VwYXJhdG9ycywgJ1xceDJFJyk7XG4gICAgY29uc3QgbGFiZWxzID0gZG9tYWluLnNwbGl0KCcuJyk7XG4gICAgY29uc3QgZW5jb2RlZCA9IG1hcChsYWJlbHMsIGNhbGxiYWNrKS5qb2luKCcuJyk7XG4gICAgcmV0dXJuIHJlc3VsdCArIGVuY29kZWQ7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhbiBhcnJheSBjb250YWluaW5nIHRoZSBudW1lcmljIGNvZGUgcG9pbnRzIG9mIGVhY2ggVW5pY29kZVxuICogY2hhcmFjdGVyIGluIHRoZSBzdHJpbmcuIFdoaWxlIEphdmFTY3JpcHQgdXNlcyBVQ1MtMiBpbnRlcm5hbGx5LFxuICogdGhpcyBmdW5jdGlvbiB3aWxsIGNvbnZlcnQgYSBwYWlyIG9mIHN1cnJvZ2F0ZSBoYWx2ZXMgKGVhY2ggb2Ygd2hpY2hcbiAqIFVDUy0yIGV4cG9zZXMgYXMgc2VwYXJhdGUgY2hhcmFjdGVycykgaW50byBhIHNpbmdsZSBjb2RlIHBvaW50LFxuICogbWF0Y2hpbmcgVVRGLTE2LlxuICogQHNlZSBgcHVueWNvZGUudWNzMi5lbmNvZGVgXG4gKiBAc2VlIDxodHRwczovL21hdGhpYXNieW5lbnMuYmUvbm90ZXMvamF2YXNjcmlwdC1lbmNvZGluZz5cbiAqIEBtZW1iZXJPZiBwdW55Y29kZS51Y3MyXG4gKiBAbmFtZSBkZWNvZGVcbiAqIEBwYXJhbSB7U3RyaW5nfSBzdHJpbmcgVGhlIFVuaWNvZGUgaW5wdXQgc3RyaW5nIChVQ1MtMikuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFRoZSBuZXcgYXJyYXkgb2YgY29kZSBwb2ludHMuXG4gKi9cbmZ1bmN0aW9uIHVjczJkZWNvZGUoc3RyaW5nKSB7XG4gICAgY29uc3Qgb3V0cHV0ID0gW107XG4gICAgbGV0IGNvdW50ZXIgPSAwO1xuICAgIGNvbnN0IGxlbmd0aCA9IHN0cmluZy5sZW5ndGg7XG4gICAgd2hpbGUgKGNvdW50ZXIgPCBsZW5ndGgpIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBzdHJpbmcuY2hhckNvZGVBdChjb3VudGVyKyspO1xuICAgICAgICBpZiAodmFsdWUgPj0gMHhkODAwICYmIHZhbHVlIDw9IDB4ZGJmZiAmJiBjb3VudGVyIDwgbGVuZ3RoKSB7XG4gICAgICAgICAgICAvLyBJdCdzIGEgaGlnaCBzdXJyb2dhdGUsIGFuZCB0aGVyZSBpcyBhIG5leHQgY2hhcmFjdGVyLlxuICAgICAgICAgICAgY29uc3QgZXh0cmEgPSBzdHJpbmcuY2hhckNvZGVBdChjb3VudGVyKyspO1xuICAgICAgICAgICAgaWYgKChleHRyYSAmIDB4ZmMwMCkgPT0gMHhkYzAwKSB7XG4gICAgICAgICAgICAgICAgLy8gTG93IHN1cnJvZ2F0ZS5cbiAgICAgICAgICAgICAgICBvdXRwdXQucHVzaCgoKHZhbHVlICYgMHgzZmYpIDw8IDEwKSArIChleHRyYSAmIDB4M2ZmKSArIDB4MTAwMDApO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBJdCdzIGFuIHVubWF0Y2hlZCBzdXJyb2dhdGU7IG9ubHkgYXBwZW5kIHRoaXMgY29kZSB1bml0LCBpbiBjYXNlIHRoZVxuICAgICAgICAgICAgICAgIC8vIG5leHQgY29kZSB1bml0IGlzIHRoZSBoaWdoIHN1cnJvZ2F0ZSBvZiBhIHN1cnJvZ2F0ZSBwYWlyLlxuICAgICAgICAgICAgICAgIG91dHB1dC5wdXNoKHZhbHVlKTtcbiAgICAgICAgICAgICAgICBjb3VudGVyLS07XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBvdXRwdXQucHVzaCh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG91dHB1dDtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgc3RyaW5nIGJhc2VkIG9uIGFuIGFycmF5IG9mIG51bWVyaWMgY29kZSBwb2ludHMuXG4gKiBAc2VlIGBwdW55Y29kZS51Y3MyLmRlY29kZWBcbiAqIEBtZW1iZXJPZiBwdW55Y29kZS51Y3MyXG4gKiBAbmFtZSBlbmNvZGVcbiAqIEBwYXJhbSB7QXJyYXl9IGNvZGVQb2ludHMgVGhlIGFycmF5IG9mIG51bWVyaWMgY29kZSBwb2ludHMuXG4gKiBAcmV0dXJucyB7U3RyaW5nfSBUaGUgbmV3IFVuaWNvZGUgc3RyaW5nIChVQ1MtMikuXG4gKi9cbmNvbnN0IHVjczJlbmNvZGUgPSBjb2RlUG9pbnRzID0+IFN0cmluZy5mcm9tQ29kZVBvaW50KC4uLmNvZGVQb2ludHMpO1xuXG4vKipcbiAqIENvbnZlcnRzIGEgYmFzaWMgY29kZSBwb2ludCBpbnRvIGEgZGlnaXQvaW50ZWdlci5cbiAqIEBzZWUgYGRpZ2l0VG9CYXNpYygpYFxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7TnVtYmVyfSBjb2RlUG9pbnQgVGhlIGJhc2ljIG51bWVyaWMgY29kZSBwb2ludCB2YWx1ZS5cbiAqIEByZXR1cm5zIHtOdW1iZXJ9IFRoZSBudW1lcmljIHZhbHVlIG9mIGEgYmFzaWMgY29kZSBwb2ludCAoZm9yIHVzZSBpblxuICogcmVwcmVzZW50aW5nIGludGVnZXJzKSBpbiB0aGUgcmFuZ2UgYDBgIHRvIGBiYXNlIC0gMWAsIG9yIGBiYXNlYCBpZlxuICogdGhlIGNvZGUgcG9pbnQgZG9lcyBub3QgcmVwcmVzZW50IGEgdmFsdWUuXG4gKi9cbmNvbnN0IGJhc2ljVG9EaWdpdCA9IGZ1bmN0aW9uIChjb2RlUG9pbnQpIHtcbiAgICBpZiAoY29kZVBvaW50ID49IDB4MzAgJiYgY29kZVBvaW50IDwgMHgzYSkge1xuICAgICAgICByZXR1cm4gMjYgKyAoY29kZVBvaW50IC0gMHgzMCk7XG4gICAgfVxuICAgIGlmIChjb2RlUG9pbnQgPj0gMHg0MSAmJiBjb2RlUG9pbnQgPCAweDViKSB7XG4gICAgICAgIHJldHVybiBjb2RlUG9pbnQgLSAweDQxO1xuICAgIH1cbiAgICBpZiAoY29kZVBvaW50ID49IDB4NjEgJiYgY29kZVBvaW50IDwgMHg3Yikge1xuICAgICAgICByZXR1cm4gY29kZVBvaW50IC0gMHg2MTtcbiAgICB9XG4gICAgcmV0dXJuIGJhc2U7XG59O1xuXG4vKipcbiAqIENvbnZlcnRzIGEgZGlnaXQvaW50ZWdlciBpbnRvIGEgYmFzaWMgY29kZSBwb2ludC5cbiAqIEBzZWUgYGJhc2ljVG9EaWdpdCgpYFxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7TnVtYmVyfSBkaWdpdCBUaGUgbnVtZXJpYyB2YWx1ZSBvZiBhIGJhc2ljIGNvZGUgcG9pbnQuXG4gKiBAcmV0dXJucyB7TnVtYmVyfSBUaGUgYmFzaWMgY29kZSBwb2ludCB3aG9zZSB2YWx1ZSAod2hlbiB1c2VkIGZvclxuICogcmVwcmVzZW50aW5nIGludGVnZXJzKSBpcyBgZGlnaXRgLCB3aGljaCBuZWVkcyB0byBiZSBpbiB0aGUgcmFuZ2VcbiAqIGAwYCB0byBgYmFzZSAtIDFgLiBJZiBgZmxhZ2AgaXMgbm9uLXplcm8sIHRoZSB1cHBlcmNhc2UgZm9ybSBpc1xuICogdXNlZDsgZWxzZSwgdGhlIGxvd2VyY2FzZSBmb3JtIGlzIHVzZWQuIFRoZSBiZWhhdmlvciBpcyB1bmRlZmluZWRcbiAqIGlmIGBmbGFnYCBpcyBub24temVybyBhbmQgYGRpZ2l0YCBoYXMgbm8gdXBwZXJjYXNlIGZvcm0uXG4gKi9cbmNvbnN0IGRpZ2l0VG9CYXNpYyA9IGZ1bmN0aW9uIChkaWdpdCwgZmxhZykge1xuICAgIC8vICAwLi4yNSBtYXAgdG8gQVNDSUkgYS4ueiBvciBBLi5aXG4gICAgLy8gMjYuLjM1IG1hcCB0byBBU0NJSSAwLi45XG4gICAgcmV0dXJuIGRpZ2l0ICsgMjIgKyA3NSAqIChkaWdpdCA8IDI2KSAtICgoZmxhZyAhPSAwKSA8PCA1KTtcbn07XG5cbi8qKlxuICogQmlhcyBhZGFwdGF0aW9uIGZ1bmN0aW9uIGFzIHBlciBzZWN0aW9uIDMuNCBvZiBSRkMgMzQ5Mi5cbiAqIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmMzNDkyI3NlY3Rpb24tMy40XG4gKiBAcHJpdmF0ZVxuICovXG5jb25zdCBhZGFwdCA9IGZ1bmN0aW9uIChkZWx0YSwgbnVtUG9pbnRzLCBmaXJzdFRpbWUpIHtcbiAgICBsZXQgayA9IDA7XG4gICAgZGVsdGEgPSBmaXJzdFRpbWUgPyBmbG9vcihkZWx0YSAvIGRhbXApIDogZGVsdGEgPj4gMTtcbiAgICBkZWx0YSArPSBmbG9vcihkZWx0YSAvIG51bVBvaW50cyk7XG4gICAgZm9yICg7IC8qIG5vIGluaXRpYWxpemF0aW9uICovIGRlbHRhID4gKGJhc2VNaW51c1RNaW4gKiB0TWF4KSA+PiAxOyBrICs9IGJhc2UpIHtcbiAgICAgICAgZGVsdGEgPSBmbG9vcihkZWx0YSAvIGJhc2VNaW51c1RNaW4pO1xuICAgIH1cbiAgICByZXR1cm4gZmxvb3IoayArICgoYmFzZU1pbnVzVE1pbiArIDEpICogZGVsdGEpIC8gKGRlbHRhICsgc2tldykpO1xufTtcblxuLyoqXG4gKiBDb252ZXJ0cyBhIFB1bnljb2RlIHN0cmluZyBvZiBBU0NJSS1vbmx5IHN5bWJvbHMgdG8gYSBzdHJpbmcgb2YgVW5pY29kZVxuICogc3ltYm9scy5cbiAqIEBtZW1iZXJPZiBwdW55Y29kZVxuICogQHBhcmFtIHtTdHJpbmd9IGlucHV0IFRoZSBQdW55Y29kZSBzdHJpbmcgb2YgQVNDSUktb25seSBzeW1ib2xzLlxuICogQHJldHVybnMge1N0cmluZ30gVGhlIHJlc3VsdGluZyBzdHJpbmcgb2YgVW5pY29kZSBzeW1ib2xzLlxuICovXG5jb25zdCBkZWNvZGUgPSBmdW5jdGlvbiAoaW5wdXQpIHtcbiAgICAvLyBEb24ndCB1c2UgVUNTLTIuXG4gICAgY29uc3Qgb3V0cHV0ID0gW107XG4gICAgY29uc3QgaW5wdXRMZW5ndGggPSBpbnB1dC5sZW5ndGg7XG4gICAgbGV0IGkgPSAwO1xuICAgIGxldCBuID0gaW5pdGlhbE47XG4gICAgbGV0IGJpYXMgPSBpbml0aWFsQmlhcztcblxuICAgIC8vIEhhbmRsZSB0aGUgYmFzaWMgY29kZSBwb2ludHM6IGxldCBgYmFzaWNgIGJlIHRoZSBudW1iZXIgb2YgaW5wdXQgY29kZVxuICAgIC8vIHBvaW50cyBiZWZvcmUgdGhlIGxhc3QgZGVsaW1pdGVyLCBvciBgMGAgaWYgdGhlcmUgaXMgbm9uZSwgdGhlbiBjb3B5XG4gICAgLy8gdGhlIGZpcnN0IGJhc2ljIGNvZGUgcG9pbnRzIHRvIHRoZSBvdXRwdXQuXG5cbiAgICBsZXQgYmFzaWMgPSBpbnB1dC5sYXN0SW5kZXhPZihkZWxpbWl0ZXIpO1xuICAgIGlmIChiYXNpYyA8IDApIHtcbiAgICAgICAgYmFzaWMgPSAwO1xuICAgIH1cblxuICAgIGZvciAobGV0IGogPSAwOyBqIDwgYmFzaWM7ICsraikge1xuICAgICAgICAvLyBpZiBpdCdzIG5vdCBhIGJhc2ljIGNvZGUgcG9pbnRcbiAgICAgICAgaWYgKGlucHV0LmNoYXJDb2RlQXQoaikgPj0gMHg4MCkge1xuICAgICAgICAgICAgZXJyb3IoJ25vdC1iYXNpYycpO1xuICAgICAgICB9XG4gICAgICAgIG91dHB1dC5wdXNoKGlucHV0LmNoYXJDb2RlQXQoaikpO1xuICAgIH1cblxuICAgIC8vIE1haW4gZGVjb2RpbmcgbG9vcDogc3RhcnQganVzdCBhZnRlciB0aGUgbGFzdCBkZWxpbWl0ZXIgaWYgYW55IGJhc2ljIGNvZGVcbiAgICAvLyBwb2ludHMgd2VyZSBjb3BpZWQ7IHN0YXJ0IGF0IHRoZSBiZWdpbm5pbmcgb3RoZXJ3aXNlLlxuXG4gICAgZm9yIChsZXQgaW5kZXggPSBiYXNpYyA+IDAgPyBiYXNpYyArIDEgOiAwOyBpbmRleCA8IGlucHV0TGVuZ3RoIC8qIG5vIGZpbmFsIGV4cHJlc3Npb24gKi87ICkge1xuICAgICAgICAvLyBgaW5kZXhgIGlzIHRoZSBpbmRleCBvZiB0aGUgbmV4dCBjaGFyYWN0ZXIgdG8gYmUgY29uc3VtZWQuXG4gICAgICAgIC8vIERlY29kZSBhIGdlbmVyYWxpemVkIHZhcmlhYmxlLWxlbmd0aCBpbnRlZ2VyIGludG8gYGRlbHRhYCxcbiAgICAgICAgLy8gd2hpY2ggZ2V0cyBhZGRlZCB0byBgaWAuIFRoZSBvdmVyZmxvdyBjaGVja2luZyBpcyBlYXNpZXJcbiAgICAgICAgLy8gaWYgd2UgaW5jcmVhc2UgYGlgIGFzIHdlIGdvLCB0aGVuIHN1YnRyYWN0IG9mZiBpdHMgc3RhcnRpbmdcbiAgICAgICAgLy8gdmFsdWUgYXQgdGhlIGVuZCB0byBvYnRhaW4gYGRlbHRhYC5cbiAgICAgICAgY29uc3Qgb2xkaSA9IGk7XG4gICAgICAgIGZvciAobGV0IHcgPSAxLCBrID0gYmFzZSAvKiBubyBjb25kaXRpb24gKi87IDsgayArPSBiYXNlKSB7XG4gICAgICAgICAgICBpZiAoaW5kZXggPj0gaW5wdXRMZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBlcnJvcignaW52YWxpZC1pbnB1dCcpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBkaWdpdCA9IGJhc2ljVG9EaWdpdChpbnB1dC5jaGFyQ29kZUF0KGluZGV4KyspKTtcblxuICAgICAgICAgICAgaWYgKGRpZ2l0ID49IGJhc2UpIHtcbiAgICAgICAgICAgICAgICBlcnJvcignaW52YWxpZC1pbnB1dCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGRpZ2l0ID4gZmxvb3IoKG1heEludCAtIGkpIC8gdykpIHtcbiAgICAgICAgICAgICAgICBlcnJvcignb3ZlcmZsb3cnKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaSArPSBkaWdpdCAqIHc7XG4gICAgICAgICAgICBjb25zdCB0ID0gayA8PSBiaWFzID8gdE1pbiA6IGsgPj0gYmlhcyArIHRNYXggPyB0TWF4IDogayAtIGJpYXM7XG5cbiAgICAgICAgICAgIGlmIChkaWdpdCA8IHQpIHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgYmFzZU1pbnVzVCA9IGJhc2UgLSB0O1xuICAgICAgICAgICAgaWYgKHcgPiBmbG9vcihtYXhJbnQgLyBiYXNlTWludXNUKSkge1xuICAgICAgICAgICAgICAgIGVycm9yKCdvdmVyZmxvdycpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB3ICo9IGJhc2VNaW51c1Q7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBvdXQgPSBvdXRwdXQubGVuZ3RoICsgMTtcbiAgICAgICAgYmlhcyA9IGFkYXB0KGkgLSBvbGRpLCBvdXQsIG9sZGkgPT0gMCk7XG5cbiAgICAgICAgLy8gYGlgIHdhcyBzdXBwb3NlZCB0byB3cmFwIGFyb3VuZCBmcm9tIGBvdXRgIHRvIGAwYCxcbiAgICAgICAgLy8gaW5jcmVtZW50aW5nIGBuYCBlYWNoIHRpbWUsIHNvIHdlJ2xsIGZpeCB0aGF0IG5vdzpcbiAgICAgICAgaWYgKGZsb29yKGkgLyBvdXQpID4gbWF4SW50IC0gbikge1xuICAgICAgICAgICAgZXJyb3IoJ292ZXJmbG93Jyk7XG4gICAgICAgIH1cblxuICAgICAgICBuICs9IGZsb29yKGkgLyBvdXQpO1xuICAgICAgICBpICU9IG91dDtcblxuICAgICAgICAvLyBJbnNlcnQgYG5gIGF0IHBvc2l0aW9uIGBpYCBvZiB0aGUgb3V0cHV0LlxuICAgICAgICBvdXRwdXQuc3BsaWNlKGkrKywgMCwgbik7XG4gICAgfVxuXG4gICAgcmV0dXJuIFN0cmluZy5mcm9tQ29kZVBvaW50KC4uLm91dHB1dCk7XG59O1xuXG4vKipcbiAqIENvbnZlcnRzIGEgc3RyaW5nIG9mIFVuaWNvZGUgc3ltYm9scyAoZS5nLiBhIGRvbWFpbiBuYW1lIGxhYmVsKSB0byBhXG4gKiBQdW55Y29kZSBzdHJpbmcgb2YgQVNDSUktb25seSBzeW1ib2xzLlxuICogQG1lbWJlck9mIHB1bnljb2RlXG4gKiBAcGFyYW0ge1N0cmluZ30gaW5wdXQgVGhlIHN0cmluZyBvZiBVbmljb2RlIHN5bWJvbHMuXG4gKiBAcmV0dXJucyB7U3RyaW5nfSBUaGUgcmVzdWx0aW5nIFB1bnljb2RlIHN0cmluZyBvZiBBU0NJSS1vbmx5IHN5bWJvbHMuXG4gKi9cbmNvbnN0IGVuY29kZSA9IGZ1bmN0aW9uIChpbnB1dCkge1xuICAgIGNvbnN0IG91dHB1dCA9IFtdO1xuXG4gICAgLy8gQ29udmVydCB0aGUgaW5wdXQgaW4gVUNTLTIgdG8gYW4gYXJyYXkgb2YgVW5pY29kZSBjb2RlIHBvaW50cy5cbiAgICBpbnB1dCA9IHVjczJkZWNvZGUoaW5wdXQpO1xuXG4gICAgLy8gQ2FjaGUgdGhlIGxlbmd0aC5cbiAgICBjb25zdCBpbnB1dExlbmd0aCA9IGlucHV0Lmxlbmd0aDtcblxuICAgIC8vIEluaXRpYWxpemUgdGhlIHN0YXRlLlxuICAgIGxldCBuID0gaW5pdGlhbE47XG4gICAgbGV0IGRlbHRhID0gMDtcbiAgICBsZXQgYmlhcyA9IGluaXRpYWxCaWFzO1xuXG4gICAgLy8gSGFuZGxlIHRoZSBiYXNpYyBjb2RlIHBvaW50cy5cbiAgICBmb3IgKGNvbnN0IGN1cnJlbnRWYWx1ZSBvZiBpbnB1dCkge1xuICAgICAgICBpZiAoY3VycmVudFZhbHVlIDwgMHg4MCkge1xuICAgICAgICAgICAgb3V0cHV0LnB1c2goc3RyaW5nRnJvbUNoYXJDb2RlKGN1cnJlbnRWYWx1ZSkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgYmFzaWNMZW5ndGggPSBvdXRwdXQubGVuZ3RoO1xuICAgIGxldCBoYW5kbGVkQ1BDb3VudCA9IGJhc2ljTGVuZ3RoO1xuXG4gICAgLy8gYGhhbmRsZWRDUENvdW50YCBpcyB0aGUgbnVtYmVyIG9mIGNvZGUgcG9pbnRzIHRoYXQgaGF2ZSBiZWVuIGhhbmRsZWQ7XG4gICAgLy8gYGJhc2ljTGVuZ3RoYCBpcyB0aGUgbnVtYmVyIG9mIGJhc2ljIGNvZGUgcG9pbnRzLlxuXG4gICAgLy8gRmluaXNoIHRoZSBiYXNpYyBzdHJpbmcgd2l0aCBhIGRlbGltaXRlciB1bmxlc3MgaXQncyBlbXB0eS5cbiAgICBpZiAoYmFzaWNMZW5ndGgpIHtcbiAgICAgICAgb3V0cHV0LnB1c2goZGVsaW1pdGVyKTtcbiAgICB9XG5cbiAgICAvLyBNYWluIGVuY29kaW5nIGxvb3A6XG4gICAgd2hpbGUgKGhhbmRsZWRDUENvdW50IDwgaW5wdXRMZW5ndGgpIHtcbiAgICAgICAgLy8gQWxsIG5vbi1iYXNpYyBjb2RlIHBvaW50cyA8IG4gaGF2ZSBiZWVuIGhhbmRsZWQgYWxyZWFkeS4gRmluZCB0aGUgbmV4dFxuICAgICAgICAvLyBsYXJnZXIgb25lOlxuICAgICAgICBsZXQgbSA9IG1heEludDtcbiAgICAgICAgZm9yIChjb25zdCBjdXJyZW50VmFsdWUgb2YgaW5wdXQpIHtcbiAgICAgICAgICAgIGlmIChjdXJyZW50VmFsdWUgPj0gbiAmJiBjdXJyZW50VmFsdWUgPCBtKSB7XG4gICAgICAgICAgICAgICAgbSA9IGN1cnJlbnRWYWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEluY3JlYXNlIGBkZWx0YWAgZW5vdWdoIHRvIGFkdmFuY2UgdGhlIGRlY29kZXIncyA8bixpPiBzdGF0ZSB0byA8bSwwPixcbiAgICAgICAgLy8gYnV0IGd1YXJkIGFnYWluc3Qgb3ZlcmZsb3cuXG4gICAgICAgIGNvbnN0IGhhbmRsZWRDUENvdW50UGx1c09uZSA9IGhhbmRsZWRDUENvdW50ICsgMTtcbiAgICAgICAgaWYgKG0gLSBuID4gZmxvb3IoKG1heEludCAtIGRlbHRhKSAvIGhhbmRsZWRDUENvdW50UGx1c09uZSkpIHtcbiAgICAgICAgICAgIGVycm9yKCdvdmVyZmxvdycpO1xuICAgICAgICB9XG5cbiAgICAgICAgZGVsdGEgKz0gKG0gLSBuKSAqIGhhbmRsZWRDUENvdW50UGx1c09uZTtcbiAgICAgICAgbiA9IG07XG5cbiAgICAgICAgZm9yIChjb25zdCBjdXJyZW50VmFsdWUgb2YgaW5wdXQpIHtcbiAgICAgICAgICAgIGlmIChjdXJyZW50VmFsdWUgPCBuICYmICsrZGVsdGEgPiBtYXhJbnQpIHtcbiAgICAgICAgICAgICAgICBlcnJvcignb3ZlcmZsb3cnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChjdXJyZW50VmFsdWUgPT09IG4pIHtcbiAgICAgICAgICAgICAgICAvLyBSZXByZXNlbnQgZGVsdGEgYXMgYSBnZW5lcmFsaXplZCB2YXJpYWJsZS1sZW5ndGggaW50ZWdlci5cbiAgICAgICAgICAgICAgICBsZXQgcSA9IGRlbHRhO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGsgPSBiYXNlIC8qIG5vIGNvbmRpdGlvbiAqLzsgOyBrICs9IGJhc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdCA9IGsgPD0gYmlhcyA/IHRNaW4gOiBrID49IGJpYXMgKyB0TWF4ID8gdE1heCA6IGsgLSBiaWFzO1xuICAgICAgICAgICAgICAgICAgICBpZiAocSA8IHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHFNaW51c1QgPSBxIC0gdDtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYmFzZU1pbnVzVCA9IGJhc2UgLSB0O1xuICAgICAgICAgICAgICAgICAgICBvdXRwdXQucHVzaChzdHJpbmdGcm9tQ2hhckNvZGUoZGlnaXRUb0Jhc2ljKHQgKyAocU1pbnVzVCAlIGJhc2VNaW51c1QpLCAwKSkpO1xuICAgICAgICAgICAgICAgICAgICBxID0gZmxvb3IocU1pbnVzVCAvIGJhc2VNaW51c1QpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIG91dHB1dC5wdXNoKHN0cmluZ0Zyb21DaGFyQ29kZShkaWdpdFRvQmFzaWMocSwgMCkpKTtcbiAgICAgICAgICAgICAgICBiaWFzID0gYWRhcHQoZGVsdGEsIGhhbmRsZWRDUENvdW50UGx1c09uZSwgaGFuZGxlZENQQ291bnQgPT09IGJhc2ljTGVuZ3RoKTtcbiAgICAgICAgICAgICAgICBkZWx0YSA9IDA7XG4gICAgICAgICAgICAgICAgKytoYW5kbGVkQ1BDb3VudDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgICsrZGVsdGE7XG4gICAgICAgICsrbjtcbiAgICB9XG4gICAgcmV0dXJuIG91dHB1dC5qb2luKCcnKTtcbn07XG5cbi8qKlxuICogQ29udmVydHMgYSBQdW55Y29kZSBzdHJpbmcgcmVwcmVzZW50aW5nIGEgZG9tYWluIG5hbWUgb3IgYW4gZW1haWwgYWRkcmVzc1xuICogdG8gVW5pY29kZS4gT25seSB0aGUgUHVueWNvZGVkIHBhcnRzIG9mIHRoZSBpbnB1dCB3aWxsIGJlIGNvbnZlcnRlZCwgaS5lLlxuICogaXQgZG9lc24ndCBtYXR0ZXIgaWYgeW91IGNhbGwgaXQgb24gYSBzdHJpbmcgdGhhdCBoYXMgYWxyZWFkeSBiZWVuXG4gKiBjb252ZXJ0ZWQgdG8gVW5pY29kZS5cbiAqIEBtZW1iZXJPZiBwdW55Y29kZVxuICogQHBhcmFtIHtTdHJpbmd9IGlucHV0IFRoZSBQdW55Y29kZWQgZG9tYWluIG5hbWUgb3IgZW1haWwgYWRkcmVzcyB0b1xuICogY29udmVydCB0byBVbmljb2RlLlxuICogQHJldHVybnMge1N0cmluZ30gVGhlIFVuaWNvZGUgcmVwcmVzZW50YXRpb24gb2YgdGhlIGdpdmVuIFB1bnljb2RlXG4gKiBzdHJpbmcuXG4gKi9cbmNvbnN0IHRvVW5pY29kZSA9IGZ1bmN0aW9uIChpbnB1dCkge1xuICAgIHJldHVybiBtYXBEb21haW4oaW5wdXQsIGZ1bmN0aW9uIChzdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIHJlZ2V4UHVueWNvZGUudGVzdChzdHJpbmcpID8gZGVjb2RlKHN0cmluZy5zbGljZSg0KS50b0xvd2VyQ2FzZSgpKSA6IHN0cmluZztcbiAgICB9KTtcbn07XG5cbi8qKlxuICogQ29udmVydHMgYSBVbmljb2RlIHN0cmluZyByZXByZXNlbnRpbmcgYSBkb21haW4gbmFtZSBvciBhbiBlbWFpbCBhZGRyZXNzIHRvXG4gKiBQdW55Y29kZS4gT25seSB0aGUgbm9uLUFTQ0lJIHBhcnRzIG9mIHRoZSBkb21haW4gbmFtZSB3aWxsIGJlIGNvbnZlcnRlZCxcbiAqIGkuZS4gaXQgZG9lc24ndCBtYXR0ZXIgaWYgeW91IGNhbGwgaXQgd2l0aCBhIGRvbWFpbiB0aGF0J3MgYWxyZWFkeSBpblxuICogQVNDSUkuXG4gKiBAbWVtYmVyT2YgcHVueWNvZGVcbiAqIEBwYXJhbSB7U3RyaW5nfSBpbnB1dCBUaGUgZG9tYWluIG5hbWUgb3IgZW1haWwgYWRkcmVzcyB0byBjb252ZXJ0LCBhcyBhXG4gKiBVbmljb2RlIHN0cmluZy5cbiAqIEByZXR1cm5zIHtTdHJpbmd9IFRoZSBQdW55Y29kZSByZXByZXNlbnRhdGlvbiBvZiB0aGUgZ2l2ZW4gZG9tYWluIG5hbWUgb3JcbiAqIGVtYWlsIGFkZHJlc3MuXG4gKi9cbmNvbnN0IHRvQVNDSUkgPSBmdW5jdGlvbiAoaW5wdXQpIHtcbiAgICByZXR1cm4gbWFwRG9tYWluKGlucHV0LCBmdW5jdGlvbiAoc3RyaW5nKSB7XG4gICAgICAgIHJldHVybiByZWdleE5vbkFTQ0lJLnRlc3Qoc3RyaW5nKSA/ICd4bi0tJyArIGVuY29kZShzdHJpbmcpIDogc3RyaW5nO1xuICAgIH0pO1xufTtcblxuLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbi8qKiBEZWZpbmUgdGhlIHB1YmxpYyBBUEkgKi9cbmNvbnN0IHB1bnljb2RlID0ge1xuICAgIC8qKlxuICAgICAqIEEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgY3VycmVudCBQdW55Y29kZS5qcyB2ZXJzaW9uIG51bWJlci5cbiAgICAgKiBAbWVtYmVyT2YgcHVueWNvZGVcbiAgICAgKiBAdHlwZSBTdHJpbmdcbiAgICAgKi9cbiAgICB2ZXJzaW9uOiAnMi4zLjEnLFxuICAgIC8qKlxuICAgICAqIEFuIG9iamVjdCBvZiBtZXRob2RzIHRvIGNvbnZlcnQgZnJvbSBKYXZhU2NyaXB0J3MgaW50ZXJuYWwgY2hhcmFjdGVyXG4gICAgICogcmVwcmVzZW50YXRpb24gKFVDUy0yKSB0byBVbmljb2RlIGNvZGUgcG9pbnRzLCBhbmQgYmFjay5cbiAgICAgKiBAc2VlIDxodHRwczovL21hdGhpYXNieW5lbnMuYmUvbm90ZXMvamF2YXNjcmlwdC1lbmNvZGluZz5cbiAgICAgKiBAbWVtYmVyT2YgcHVueWNvZGVcbiAgICAgKiBAdHlwZSBPYmplY3RcbiAgICAgKi9cbiAgICB1Y3MyOiB7XG4gICAgICAgIGRlY29kZTogdWNzMmRlY29kZSxcbiAgICAgICAgZW5jb2RlOiB1Y3MyZW5jb2RlXG4gICAgfSxcbiAgICBkZWNvZGU6IGRlY29kZSxcbiAgICBlbmNvZGU6IGVuY29kZSxcbiAgICB0b0FTQ0lJOiB0b0FTQ0lJLFxuICAgIHRvVW5pY29kZTogdG9Vbmljb2RlXG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IHB1bnljb2RlO1xuIl0sIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6WzBdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(action-browser)/./node_modules/.pnpm/nodemailer@7.0.13/node_modules/nodemailer/lib/punycode/index.js\n");
|
||
|
||
/***/ }),
|
||
|
||
/***/ "(action-browser)/./node_modules/.pnpm/nodemailer@7.0.13/node_modules/nodemailer/lib/qp/index.js":
|
||
/*!**************************************************************************************!*\
|
||
!*** ./node_modules/.pnpm/nodemailer@7.0.13/node_modules/nodemailer/lib/qp/index.js ***!
|
||
\**************************************************************************************/
|
||
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
|
||
|
||
eval("\n\nconst Transform = (__webpack_require__(/*! stream */ \"stream\").Transform);\n\n/**\n * Encodes a Buffer into a Quoted-Printable encoded string\n *\n * @param {Buffer} buffer Buffer to convert\n * @returns {String} Quoted-Printable encoded string\n */\nfunction encode(buffer) {\n if (typeof buffer === 'string') {\n buffer = Buffer.from(buffer, 'utf-8');\n }\n\n // usable characters that do not need encoding\n let ranges = [\n // https://tools.ietf.org/html/rfc2045#section-6.7\n [0x09], // <TAB>\n [0x0a], // <LF>\n [0x0d], // <CR>\n [0x20, 0x3c], // <SP>!\"#$%&'()*+,-./0123456789:;\n [0x3e, 0x7e] // >?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}\n ];\n let result = '';\n let ord;\n\n for (let i = 0, len = buffer.length; i < len; i++) {\n ord = buffer[i];\n // if the char is in allowed range, then keep as is, unless it is a WS in the end of a line\n if (\n checkRanges(ord, ranges) &&\n !((ord === 0x20 || ord === 0x09) && (i === len - 1 || buffer[i + 1] === 0x0a || buffer[i + 1] === 0x0d))\n ) {\n result += String.fromCharCode(ord);\n continue;\n }\n result += '=' + (ord < 0x10 ? '0' : '') + ord.toString(16).toUpperCase();\n }\n\n return result;\n}\n\n/**\n * Adds soft line breaks to a Quoted-Printable string\n *\n * @param {String} str Quoted-Printable encoded string that might need line wrapping\n * @param {Number} [lineLength=76] Maximum allowed length for a line\n * @returns {String} Soft-wrapped Quoted-Printable encoded string\n */\nfunction wrap(str, lineLength) {\n str = (str || '').toString();\n lineLength = lineLength || 76;\n\n if (str.length <= lineLength) {\n return str;\n }\n\n let pos = 0;\n let len = str.length;\n let match, code, line;\n let lineMargin = Math.floor(lineLength / 3);\n let result = '';\n\n // insert soft linebreaks where needed\n while (pos < len) {\n line = str.substr(pos, lineLength);\n if ((match = line.match(/\\r\\n/))) {\n line = line.substr(0, match.index + match[0].length);\n result += line;\n pos += line.length;\n continue;\n }\n\n if (line.substr(-1) === '\\n') {\n // nothing to change here\n result += line;\n pos += line.length;\n continue;\n } else if ((match = line.substr(-lineMargin).match(/\\n.*?$/))) {\n // truncate to nearest line break\n line = line.substr(0, line.length - (match[0].length - 1));\n result += line;\n pos += line.length;\n continue;\n } else if (line.length > lineLength - lineMargin && (match = line.substr(-lineMargin).match(/[ \\t.,!?][^ \\t.,!?]*$/))) {\n // truncate to nearest space\n line = line.substr(0, line.length - (match[0].length - 1));\n } else if (line.match(/[=][\\da-f]{0,2}$/i)) {\n // push incomplete encoding sequences to the next line\n if ((match = line.match(/[=][\\da-f]{0,1}$/i))) {\n line = line.substr(0, line.length - match[0].length);\n }\n\n // ensure that utf-8 sequences are not split\n while (\n line.length > 3 &&\n line.length < len - pos &&\n !line.match(/^(?:=[\\da-f]{2}){1,4}$/i) &&\n (match = line.match(/[=][\\da-f]{2}$/gi))\n ) {\n code = parseInt(match[0].substr(1, 2), 16);\n if (code < 128) {\n break;\n }\n\n line = line.substr(0, line.length - 3);\n\n if (code >= 0xc0) {\n break;\n }\n }\n }\n\n if (pos + line.length < len && line.substr(-1) !== '\\n') {\n if (line.length === lineLength && line.match(/[=][\\da-f]{2}$/i)) {\n line = line.substr(0, line.length - 3);\n } else if (line.length === lineLength) {\n line = line.substr(0, line.length - 1);\n }\n pos += line.length;\n line += '=\\r\\n';\n } else {\n pos += line.length;\n }\n\n result += line;\n }\n\n return result;\n}\n\n/**\n * Helper function to check if a number is inside provided ranges\n *\n * @param {Number} nr Number to check for\n * @param {Array} ranges An Array of allowed values\n * @returns {Boolean} True if the value was found inside allowed ranges, false otherwise\n */\nfunction checkRanges(nr, ranges) {\n for (let i = ranges.length - 1; i >= 0; i--) {\n if (!ranges[i].length) {\n continue;\n }\n if (ranges[i].length === 1 && nr === ranges[i][0]) {\n return true;\n }\n if (ranges[i].length === 2 && nr >= ranges[i][0] && nr <= ranges[i][1]) {\n return true;\n }\n }\n return false;\n}\n\n/**\n * Creates a transform stream for encoding data to Quoted-Printable encoding\n *\n * @constructor\n * @param {Object} options Stream options\n * @param {Number} [options.lineLength=76] Maximum length for lines, set to false to disable wrapping\n */\nclass Encoder extends Transform {\n constructor(options) {\n super();\n\n // init Transform\n this.options = options || {};\n\n if (this.options.lineLength !== false) {\n this.options.lineLength = this.options.lineLength || 76;\n }\n\n this._curLine = '';\n\n this.inputBytes = 0;\n this.outputBytes = 0;\n }\n\n _transform(chunk, encoding, done) {\n let qp;\n\n if (encoding !== 'buffer') {\n chunk = Buffer.from(chunk, encoding);\n }\n\n if (!chunk || !chunk.length) {\n return done();\n }\n\n this.inputBytes += chunk.length;\n\n if (this.options.lineLength) {\n qp = this._curLine + encode(chunk);\n qp = wrap(qp, this.options.lineLength);\n qp = qp.replace(/(^|\\n)([^\\n]*)$/, (match, lineBreak, lastLine) => {\n this._curLine = lastLine;\n return lineBreak;\n });\n\n if (qp) {\n this.outputBytes += qp.length;\n this.push(qp);\n }\n } else {\n qp = encode(chunk);\n this.outputBytes += qp.length;\n this.push(qp, 'ascii');\n }\n\n done();\n }\n\n _flush(done) {\n if (this._curLine) {\n this.outputBytes += this._curLine.length;\n this.push(this._curLine, 'ascii');\n }\n done();\n }\n}\n\n// expose to the world\nmodule.exports = {\n encode,\n wrap,\n Encoder\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFjdGlvbi1icm93c2VyKS8uL25vZGVfbW9kdWxlcy8ucG5wbS9ub2RlbWFpbGVyQDcuMC4xMy9ub2RlX21vZHVsZXMvbm9kZW1haWxlci9saWIvcXAvaW5kZXguanMiLCJtYXBwaW5ncyI6IkFBQWE7O0FBRWIsa0JBQWtCLHVEQUEyQjs7QUFFN0M7QUFDQTtBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CLGFBQWEsUUFBUTtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0ZBQXNGO0FBQ3RGO0FBQ0E7QUFDQTs7QUFFQSx5Q0FBeUMsU0FBUztBQUNsRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CLFdBQVcsUUFBUTtBQUNuQixhQUFhLFFBQVE7QUFDckI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0EsVUFBVSxnQ0FBZ0MsSUFBSTtBQUM5QztBQUNBLGdEQUFnRCxJQUFJO0FBQ3BEO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQ0FBMEMsRUFBRSxFQUFFLElBQUk7QUFDbEQsZ0RBQWdELEVBQUU7QUFDbEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EscUVBQXFFLEVBQUU7QUFDdkU7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CLFdBQVcsT0FBTztBQUNsQixhQUFhLFNBQVM7QUFDdEI7QUFDQTtBQUNBLG9DQUFvQyxRQUFRO0FBQzVDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsUUFBUTtBQUNuQixXQUFXLFFBQVE7QUFDbkI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhOztBQUViO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIi9Vc2Vycy9tYXJjbWludGVsL1Byb2plY3RzL2UtdGliLmNvbS9ub2RlX21vZHVsZXMvLnBucG0vbm9kZW1haWxlckA3LjAuMTMvbm9kZV9tb2R1bGVzL25vZGVtYWlsZXIvbGliL3FwL2luZGV4LmpzIl0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcblxuY29uc3QgVHJhbnNmb3JtID0gcmVxdWlyZSgnc3RyZWFtJykuVHJhbnNmb3JtO1xuXG4vKipcbiAqIEVuY29kZXMgYSBCdWZmZXIgaW50byBhIFF1b3RlZC1QcmludGFibGUgZW5jb2RlZCBzdHJpbmdcbiAqXG4gKiBAcGFyYW0ge0J1ZmZlcn0gYnVmZmVyIEJ1ZmZlciB0byBjb252ZXJ0XG4gKiBAcmV0dXJucyB7U3RyaW5nfSBRdW90ZWQtUHJpbnRhYmxlIGVuY29kZWQgc3RyaW5nXG4gKi9cbmZ1bmN0aW9uIGVuY29kZShidWZmZXIpIHtcbiAgICBpZiAodHlwZW9mIGJ1ZmZlciA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgYnVmZmVyID0gQnVmZmVyLmZyb20oYnVmZmVyLCAndXRmLTgnKTtcbiAgICB9XG5cbiAgICAvLyB1c2FibGUgY2hhcmFjdGVycyB0aGF0IGRvIG5vdCBuZWVkIGVuY29kaW5nXG4gICAgbGV0IHJhbmdlcyA9IFtcbiAgICAgICAgLy8gaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzIwNDUjc2VjdGlvbi02LjdcbiAgICAgICAgWzB4MDldLCAvLyA8VEFCPlxuICAgICAgICBbMHgwYV0sIC8vIDxMRj5cbiAgICAgICAgWzB4MGRdLCAvLyA8Q1I+XG4gICAgICAgIFsweDIwLCAweDNjXSwgLy8gPFNQPiFcIiMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5OjtcbiAgICAgICAgWzB4M2UsIDB4N2VdIC8vID4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW1xcXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9XG4gICAgXTtcbiAgICBsZXQgcmVzdWx0ID0gJyc7XG4gICAgbGV0IG9yZDtcblxuICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSBidWZmZXIubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgb3JkID0gYnVmZmVyW2ldO1xuICAgICAgICAvLyBpZiB0aGUgY2hhciBpcyBpbiBhbGxvd2VkIHJhbmdlLCB0aGVuIGtlZXAgYXMgaXMsIHVubGVzcyBpdCBpcyBhIFdTIGluIHRoZSBlbmQgb2YgYSBsaW5lXG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIGNoZWNrUmFuZ2VzKG9yZCwgcmFuZ2VzKSAmJlxuICAgICAgICAgICAgISgob3JkID09PSAweDIwIHx8IG9yZCA9PT0gMHgwOSkgJiYgKGkgPT09IGxlbiAtIDEgfHwgYnVmZmVyW2kgKyAxXSA9PT0gMHgwYSB8fCBidWZmZXJbaSArIDFdID09PSAweDBkKSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgICByZXN1bHQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShvcmQpO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgcmVzdWx0ICs9ICc9JyArIChvcmQgPCAweDEwID8gJzAnIDogJycpICsgb3JkLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpO1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogQWRkcyBzb2Z0IGxpbmUgYnJlYWtzIHRvIGEgUXVvdGVkLVByaW50YWJsZSBzdHJpbmdcbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gc3RyIFF1b3RlZC1QcmludGFibGUgZW5jb2RlZCBzdHJpbmcgdGhhdCBtaWdodCBuZWVkIGxpbmUgd3JhcHBpbmdcbiAqIEBwYXJhbSB7TnVtYmVyfSBbbGluZUxlbmd0aD03Nl0gTWF4aW11bSBhbGxvd2VkIGxlbmd0aCBmb3IgYSBsaW5lXG4gKiBAcmV0dXJucyB7U3RyaW5nfSBTb2Z0LXdyYXBwZWQgUXVvdGVkLVByaW50YWJsZSBlbmNvZGVkIHN0cmluZ1xuICovXG5mdW5jdGlvbiB3cmFwKHN0ciwgbGluZUxlbmd0aCkge1xuICAgIHN0ciA9IChzdHIgfHwgJycpLnRvU3RyaW5nKCk7XG4gICAgbGluZUxlbmd0aCA9IGxpbmVMZW5ndGggfHwgNzY7XG5cbiAgICBpZiAoc3RyLmxlbmd0aCA8PSBsaW5lTGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBzdHI7XG4gICAgfVxuXG4gICAgbGV0IHBvcyA9IDA7XG4gICAgbGV0IGxlbiA9IHN0ci5sZW5ndGg7XG4gICAgbGV0IG1hdGNoLCBjb2RlLCBsaW5lO1xuICAgIGxldCBsaW5lTWFyZ2luID0gTWF0aC5mbG9vcihsaW5lTGVuZ3RoIC8gMyk7XG4gICAgbGV0IHJlc3VsdCA9ICcnO1xuXG4gICAgLy8gaW5zZXJ0IHNvZnQgbGluZWJyZWFrcyB3aGVyZSBuZWVkZWRcbiAgICB3aGlsZSAocG9zIDwgbGVuKSB7XG4gICAgICAgIGxpbmUgPSBzdHIuc3Vic3RyKHBvcywgbGluZUxlbmd0aCk7XG4gICAgICAgIGlmICgobWF0Y2ggPSBsaW5lLm1hdGNoKC9cXHJcXG4vKSkpIHtcbiAgICAgICAgICAgIGxpbmUgPSBsaW5lLnN1YnN0cigwLCBtYXRjaC5pbmRleCArIG1hdGNoWzBdLmxlbmd0aCk7XG4gICAgICAgICAgICByZXN1bHQgKz0gbGluZTtcbiAgICAgICAgICAgIHBvcyArPSBsaW5lLmxlbmd0aDtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGxpbmUuc3Vic3RyKC0xKSA9PT0gJ1xcbicpIHtcbiAgICAgICAgICAgIC8vIG5vdGhpbmcgdG8gY2hhbmdlIGhlcmVcbiAgICAgICAgICAgIHJlc3VsdCArPSBsaW5lO1xuICAgICAgICAgICAgcG9zICs9IGxpbmUubGVuZ3RoO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH0gZWxzZSBpZiAoKG1hdGNoID0gbGluZS5zdWJzdHIoLWxpbmVNYXJnaW4pLm1hdGNoKC9cXG4uKj8kLykpKSB7XG4gICAgICAgICAgICAvLyB0cnVuY2F0ZSB0byBuZWFyZXN0IGxpbmUgYnJlYWtcbiAgICAgICAgICAgIGxpbmUgPSBsaW5lLnN1YnN0cigwLCBsaW5lLmxlbmd0aCAtIChtYXRjaFswXS5sZW5ndGggLSAxKSk7XG4gICAgICAgICAgICByZXN1bHQgKz0gbGluZTtcbiAgICAgICAgICAgIHBvcyArPSBsaW5lLmxlbmd0aDtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9IGVsc2UgaWYgKGxpbmUubGVuZ3RoID4gbGluZUxlbmd0aCAtIGxpbmVNYXJnaW4gJiYgKG1hdGNoID0gbGluZS5zdWJzdHIoLWxpbmVNYXJnaW4pLm1hdGNoKC9bIFxcdC4sIT9dW14gXFx0LiwhP10qJC8pKSkge1xuICAgICAgICAgICAgLy8gdHJ1bmNhdGUgdG8gbmVhcmVzdCBzcGFjZVxuICAgICAgICAgICAgbGluZSA9IGxpbmUuc3Vic3RyKDAsIGxpbmUubGVuZ3RoIC0gKG1hdGNoWzBdLmxlbmd0aCAtIDEpKTtcbiAgICAgICAgfSBlbHNlIGlmIChsaW5lLm1hdGNoKC9bPV1bXFxkYS1mXXswLDJ9JC9pKSkge1xuICAgICAgICAgICAgLy8gcHVzaCBpbmNvbXBsZXRlIGVuY29kaW5nIHNlcXVlbmNlcyB0byB0aGUgbmV4dCBsaW5lXG4gICAgICAgICAgICBpZiAoKG1hdGNoID0gbGluZS5tYXRjaCgvWz1dW1xcZGEtZl17MCwxfSQvaSkpKSB7XG4gICAgICAgICAgICAgICAgbGluZSA9IGxpbmUuc3Vic3RyKDAsIGxpbmUubGVuZ3RoIC0gbWF0Y2hbMF0ubGVuZ3RoKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gZW5zdXJlIHRoYXQgdXRmLTggc2VxdWVuY2VzIGFyZSBub3Qgc3BsaXRcbiAgICAgICAgICAgIHdoaWxlIChcbiAgICAgICAgICAgICAgICBsaW5lLmxlbmd0aCA+IDMgJiZcbiAgICAgICAgICAgICAgICBsaW5lLmxlbmd0aCA8IGxlbiAtIHBvcyAmJlxuICAgICAgICAgICAgICAgICFsaW5lLm1hdGNoKC9eKD86PVtcXGRhLWZdezJ9KXsxLDR9JC9pKSAmJlxuICAgICAgICAgICAgICAgIChtYXRjaCA9IGxpbmUubWF0Y2goL1s9XVtcXGRhLWZdezJ9JC9naSkpXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICBjb2RlID0gcGFyc2VJbnQobWF0Y2hbMF0uc3Vic3RyKDEsIDIpLCAxNik7XG4gICAgICAgICAgICAgICAgaWYgKGNvZGUgPCAxMjgpIHtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgbGluZSA9IGxpbmUuc3Vic3RyKDAsIGxpbmUubGVuZ3RoIC0gMyk7XG5cbiAgICAgICAgICAgICAgICBpZiAoY29kZSA+PSAweGMwKSB7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwb3MgKyBsaW5lLmxlbmd0aCA8IGxlbiAmJiBsaW5lLnN1YnN0cigtMSkgIT09ICdcXG4nKSB7XG4gICAgICAgICAgICBpZiAobGluZS5sZW5ndGggPT09IGxpbmVMZW5ndGggJiYgbGluZS5tYXRjaCgvWz1dW1xcZGEtZl17Mn0kL2kpKSB7XG4gICAgICAgICAgICAgICAgbGluZSA9IGxpbmUuc3Vic3RyKDAsIGxpbmUubGVuZ3RoIC0gMyk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGxpbmUubGVuZ3RoID09PSBsaW5lTGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgbGluZSA9IGxpbmUuc3Vic3RyKDAsIGxpbmUubGVuZ3RoIC0gMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwb3MgKz0gbGluZS5sZW5ndGg7XG4gICAgICAgICAgICBsaW5lICs9ICc9XFxyXFxuJztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBvcyArPSBsaW5lLmxlbmd0aDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJlc3VsdCArPSBsaW5lO1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogSGVscGVyIGZ1bmN0aW9uIHRvIGNoZWNrIGlmIGEgbnVtYmVyIGlzIGluc2lkZSBwcm92aWRlZCByYW5nZXNcbiAqXG4gKiBAcGFyYW0ge051bWJlcn0gbnIgTnVtYmVyIHRvIGNoZWNrIGZvclxuICogQHBhcmFtIHtBcnJheX0gcmFuZ2VzIEFuIEFycmF5IG9mIGFsbG93ZWQgdmFsdWVzXG4gKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZiB0aGUgdmFsdWUgd2FzIGZvdW5kIGluc2lkZSBhbGxvd2VkIHJhbmdlcywgZmFsc2Ugb3RoZXJ3aXNlXG4gKi9cbmZ1bmN0aW9uIGNoZWNrUmFuZ2VzKG5yLCByYW5nZXMpIHtcbiAgICBmb3IgKGxldCBpID0gcmFuZ2VzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgIGlmICghcmFuZ2VzW2ldLmxlbmd0aCkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJhbmdlc1tpXS5sZW5ndGggPT09IDEgJiYgbnIgPT09IHJhbmdlc1tpXVswXSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJhbmdlc1tpXS5sZW5ndGggPT09IDIgJiYgbnIgPj0gcmFuZ2VzW2ldWzBdICYmIG5yIDw9IHJhbmdlc1tpXVsxXSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSB0cmFuc2Zvcm0gc3RyZWFtIGZvciBlbmNvZGluZyBkYXRhIHRvIFF1b3RlZC1QcmludGFibGUgZW5jb2RpbmdcbiAqXG4gKiBAY29uc3RydWN0b3JcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIFN0cmVhbSBvcHRpb25zXG4gKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMubGluZUxlbmd0aD03Nl0gTWF4aW11bSBsZW5ndGggZm9yIGxpbmVzLCBzZXQgdG8gZmFsc2UgdG8gZGlzYWJsZSB3cmFwcGluZ1xuICovXG5jbGFzcyBFbmNvZGVyIGV4dGVuZHMgVHJhbnNmb3JtIHtcbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zKSB7XG4gICAgICAgIHN1cGVyKCk7XG5cbiAgICAgICAgLy8gaW5pdCBUcmFuc2Zvcm1cbiAgICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcblxuICAgICAgICBpZiAodGhpcy5vcHRpb25zLmxpbmVMZW5ndGggIT09IGZhbHNlKSB7XG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMubGluZUxlbmd0aCA9IHRoaXMub3B0aW9ucy5saW5lTGVuZ3RoIHx8IDc2O1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fY3VyTGluZSA9ICcnO1xuXG4gICAgICAgIHRoaXMuaW5wdXRCeXRlcyA9IDA7XG4gICAgICAgIHRoaXMub3V0cHV0Qnl0ZXMgPSAwO1xuICAgIH1cblxuICAgIF90cmFuc2Zvcm0oY2h1bmssIGVuY29kaW5nLCBkb25lKSB7XG4gICAgICAgIGxldCBxcDtcblxuICAgICAgICBpZiAoZW5jb2RpbmcgIT09ICdidWZmZXInKSB7XG4gICAgICAgICAgICBjaHVuayA9IEJ1ZmZlci5mcm9tKGNodW5rLCBlbmNvZGluZyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWNodW5rIHx8ICFjaHVuay5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiBkb25lKCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmlucHV0Qnl0ZXMgKz0gY2h1bmsubGVuZ3RoO1xuXG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMubGluZUxlbmd0aCkge1xuICAgICAgICAgICAgcXAgPSB0aGlzLl9jdXJMaW5lICsgZW5jb2RlKGNodW5rKTtcbiAgICAgICAgICAgIHFwID0gd3JhcChxcCwgdGhpcy5vcHRpb25zLmxpbmVMZW5ndGgpO1xuICAgICAgICAgICAgcXAgPSBxcC5yZXBsYWNlKC8oXnxcXG4pKFteXFxuXSopJC8sIChtYXRjaCwgbGluZUJyZWFrLCBsYXN0TGluZSkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuX2N1ckxpbmUgPSBsYXN0TGluZTtcbiAgICAgICAgICAgICAgICByZXR1cm4gbGluZUJyZWFrO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGlmIChxcCkge1xuICAgICAgICAgICAgICAgIHRoaXMub3V0cHV0Qnl0ZXMgKz0gcXAubGVuZ3RoO1xuICAgICAgICAgICAgICAgIHRoaXMucHVzaChxcCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBxcCA9IGVuY29kZShjaHVuayk7XG4gICAgICAgICAgICB0aGlzLm91dHB1dEJ5dGVzICs9IHFwLmxlbmd0aDtcbiAgICAgICAgICAgIHRoaXMucHVzaChxcCwgJ2FzY2lpJyk7XG4gICAgICAgIH1cblxuICAgICAgICBkb25lKCk7XG4gICAgfVxuXG4gICAgX2ZsdXNoKGRvbmUpIHtcbiAgICAgICAgaWYgKHRoaXMuX2N1ckxpbmUpIHtcbiAgICAgICAgICAgIHRoaXMub3V0cHV0Qnl0ZXMgKz0gdGhpcy5fY3VyTGluZS5sZW5ndGg7XG4gICAgICAgICAgICB0aGlzLnB1c2godGhpcy5fY3VyTGluZSwgJ2FzY2lpJyk7XG4gICAgICAgIH1cbiAgICAgICAgZG9uZSgpO1xuICAgIH1cbn1cblxuLy8gZXhwb3NlIHRvIHRoZSB3b3JsZFxubW9kdWxlLmV4cG9ydHMgPSB7XG4gICAgZW5jb2RlLFxuICAgIHdyYXAsXG4gICAgRW5jb2RlclxufTtcbiJdLCJuYW1lcyI6W10sImlnbm9yZUxpc3QiOlswXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(action-browser)/./node_modules/.pnpm/nodemailer@7.0.13/node_modules/nodemailer/lib/qp/index.js\n");
|
||
|
||
/***/ }),
|
||
|
||
/***/ "(action-browser)/./node_modules/.pnpm/nodemailer@7.0.13/node_modules/nodemailer/lib/sendmail-transport/index.js":
|
||
/*!******************************************************************************************************!*\
|
||
!*** ./node_modules/.pnpm/nodemailer@7.0.13/node_modules/nodemailer/lib/sendmail-transport/index.js ***!
|
||
\******************************************************************************************************/
|
||
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
|
||
|
||
eval("\n\nconst spawn = (__webpack_require__(/*! child_process */ \"child_process\").spawn);\nconst packageData = __webpack_require__(/*! ../../package.json */ \"(action-browser)/./node_modules/.pnpm/nodemailer@7.0.13/node_modules/nodemailer/package.json\");\nconst shared = __webpack_require__(/*! ../shared */ \"(action-browser)/./node_modules/.pnpm/nodemailer@7.0.13/node_modules/nodemailer/lib/shared/index.js\");\n\n/**\n * Generates a Transport object for Sendmail\n *\n * Possible options can be the following:\n *\n * * **path** optional path to sendmail binary\n * * **newline** either 'windows' or 'unix'\n * * **args** an array of arguments for the sendmail binary\n *\n * @constructor\n * @param {Object} optional config parameter for Sendmail\n */\nclass SendmailTransport {\n constructor(options) {\n options = options || {};\n\n // use a reference to spawn for mocking purposes\n this._spawn = spawn;\n\n this.options = options || {};\n\n this.name = 'Sendmail';\n this.version = packageData.version;\n\n this.path = 'sendmail';\n this.args = false;\n this.winbreak = false;\n\n this.logger = shared.getLogger(this.options, {\n component: this.options.component || 'sendmail'\n });\n\n if (options) {\n if (typeof options === 'string') {\n this.path = options;\n } else if (typeof options === 'object') {\n if (options.path) {\n this.path = options.path;\n }\n if (Array.isArray(options.args)) {\n this.args = options.args;\n }\n this.winbreak = ['win', 'windows', 'dos', '\\r\\n'].includes((options.newline || '').toString().toLowerCase());\n }\n }\n }\n\n /**\n * <p>Compiles a mailcomposer message and forwards it to handler that sends it.</p>\n *\n * @param {Object} emailMessage MailComposer object\n * @param {Function} callback Callback function to run when the sending is completed\n */\n send(mail, done) {\n // Sendmail strips this header line by itself\n mail.message.keepBcc = true;\n\n let envelope = mail.data.envelope || mail.message.getEnvelope();\n let messageId = mail.message.messageId();\n let args;\n let sendmail;\n let returned;\n\n const hasInvalidAddresses = []\n .concat(envelope.from || [])\n .concat(envelope.to || [])\n .some(addr => /^-/.test(addr));\n if (hasInvalidAddresses) {\n return done(new Error('Can not send mail. Invalid envelope addresses.'));\n }\n\n if (this.args) {\n // force -i to keep single dots\n args = ['-i'].concat(this.args).concat(envelope.to);\n } else {\n args = ['-i'].concat(envelope.from ? ['-f', envelope.from] : []).concat(envelope.to);\n }\n\n let callback = err => {\n if (returned) {\n // ignore any additional responses, already done\n return;\n }\n returned = true;\n if (typeof done === 'function') {\n if (err) {\n return done(err);\n } else {\n return done(null, {\n envelope: mail.data.envelope || mail.message.getEnvelope(),\n messageId,\n response: 'Messages queued for delivery'\n });\n }\n }\n };\n\n try {\n sendmail = this._spawn(this.path, args);\n } catch (E) {\n this.logger.error(\n {\n err: E,\n tnx: 'spawn',\n messageId\n },\n 'Error occurred while spawning sendmail. %s',\n E.message\n );\n return callback(E);\n }\n\n if (sendmail) {\n sendmail.on('error', err => {\n this.logger.error(\n {\n err,\n tnx: 'spawn',\n messageId\n },\n 'Error occurred when sending message %s. %s',\n messageId,\n err.message\n );\n callback(err);\n });\n\n sendmail.once('exit', code => {\n if (!code) {\n return callback();\n }\n let err;\n if (code === 127) {\n err = new Error('Sendmail command not found, process exited with code ' + code);\n } else {\n err = new Error('Sendmail exited with code ' + code);\n }\n\n this.logger.error(\n {\n err,\n tnx: 'stdin',\n messageId\n },\n 'Error sending message %s to sendmail. %s',\n messageId,\n err.message\n );\n callback(err);\n });\n sendmail.once('close', callback);\n\n sendmail.stdin.on('error', err => {\n this.logger.error(\n {\n err,\n tnx: 'stdin',\n messageId\n },\n 'Error occurred when piping message %s to sendmail. %s',\n messageId,\n err.message\n );\n callback(err);\n });\n\n let recipients = [].concat(envelope.to || []);\n if (recipients.length > 3) {\n recipients.push('...and ' + recipients.splice(2).length + ' more');\n }\n this.logger.info(\n {\n tnx: 'send',\n messageId\n },\n 'Sending message %s to <%s>',\n messageId,\n recipients.join(', ')\n );\n\n let sourceStream = mail.message.createReadStream();\n sourceStream.once('error', err => {\n this.logger.error(\n {\n err,\n tnx: 'stdin',\n messageId\n },\n 'Error occurred when generating message %s. %s',\n messageId,\n err.message\n );\n sendmail.kill('SIGINT'); // do not deliver the message\n callback(err);\n });\n\n sourceStream.pipe(sendmail.stdin);\n } else {\n return callback(new Error('sendmail was not found'));\n }\n }\n}\n\nmodule.exports = SendmailTransport;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFjdGlvbi1icm93c2VyKS8uL25vZGVfbW9kdWxlcy8ucG5wbS9ub2RlbWFpbGVyQDcuMC4xMy9ub2RlX21vZHVsZXMvbm9kZW1haWxlci9saWIvc2VuZG1haWwtdHJhbnNwb3J0L2luZGV4LmpzIiwibWFwcGluZ3MiOiJBQUFhOztBQUViLGNBQWMsaUVBQThCO0FBQzVDLG9CQUFvQixtQkFBTyxDQUFDLHdIQUFvQjtBQUNoRCxlQUFlLG1CQUFPLENBQUMsc0hBQVc7O0FBRWxDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsUUFBUTtBQUN2QixlQUFlLFVBQVU7QUFDekI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0I7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhOztBQUViO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCO0FBQ2xCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTs7QUFFYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUNBQXlDO0FBQ3pDO0FBQ0EsYUFBYTs7QUFFYjtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTs7QUFFQSIsInNvdXJjZXMiOlsiL1VzZXJzL21hcmNtaW50ZWwvUHJvamVjdHMvZS10aWIuY29tL25vZGVfbW9kdWxlcy8ucG5wbS9ub2RlbWFpbGVyQDcuMC4xMy9ub2RlX21vZHVsZXMvbm9kZW1haWxlci9saWIvc2VuZG1haWwtdHJhbnNwb3J0L2luZGV4LmpzIl0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcblxuY29uc3Qgc3Bhd24gPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuc3Bhd247XG5jb25zdCBwYWNrYWdlRGF0YSA9IHJlcXVpcmUoJy4uLy4uL3BhY2thZ2UuanNvbicpO1xuY29uc3Qgc2hhcmVkID0gcmVxdWlyZSgnLi4vc2hhcmVkJyk7XG5cbi8qKlxuICogR2VuZXJhdGVzIGEgVHJhbnNwb3J0IG9iamVjdCBmb3IgU2VuZG1haWxcbiAqXG4gKiBQb3NzaWJsZSBvcHRpb25zIGNhbiBiZSB0aGUgZm9sbG93aW5nOlxuICpcbiAqICAqICoqcGF0aCoqIG9wdGlvbmFsIHBhdGggdG8gc2VuZG1haWwgYmluYXJ5XG4gKiAgKiAqKm5ld2xpbmUqKiBlaXRoZXIgJ3dpbmRvd3MnIG9yICd1bml4J1xuICogICogKiphcmdzKiogYW4gYXJyYXkgb2YgYXJndW1lbnRzIGZvciB0aGUgc2VuZG1haWwgYmluYXJ5XG4gKlxuICogQGNvbnN0cnVjdG9yXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9uYWwgY29uZmlnIHBhcmFtZXRlciBmb3IgU2VuZG1haWxcbiAqL1xuY2xhc3MgU2VuZG1haWxUcmFuc3BvcnQge1xuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnMpIHtcbiAgICAgICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cbiAgICAgICAgLy8gdXNlIGEgcmVmZXJlbmNlIHRvIHNwYXduIGZvciBtb2NraW5nIHB1cnBvc2VzXG4gICAgICAgIHRoaXMuX3NwYXduID0gc3Bhd247XG5cbiAgICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcblxuICAgICAgICB0aGlzLm5hbWUgPSAnU2VuZG1haWwnO1xuICAgICAgICB0aGlzLnZlcnNpb24gPSBwYWNrYWdlRGF0YS52ZXJzaW9uO1xuXG4gICAgICAgIHRoaXMucGF0aCA9ICdzZW5kbWFpbCc7XG4gICAgICAgIHRoaXMuYXJncyA9IGZhbHNlO1xuICAgICAgICB0aGlzLndpbmJyZWFrID0gZmFsc2U7XG5cbiAgICAgICAgdGhpcy5sb2dnZXIgPSBzaGFyZWQuZ2V0TG9nZ2VyKHRoaXMub3B0aW9ucywge1xuICAgICAgICAgICAgY29tcG9uZW50OiB0aGlzLm9wdGlvbnMuY29tcG9uZW50IHx8ICdzZW5kbWFpbCdcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKG9wdGlvbnMpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2Ygb3B0aW9ucyA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnBhdGggPSBvcHRpb25zO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2Ygb3B0aW9ucyA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5wYXRoKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGF0aCA9IG9wdGlvbnMucGF0aDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkob3B0aW9ucy5hcmdzKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmFyZ3MgPSBvcHRpb25zLmFyZ3M7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMud2luYnJlYWsgPSBbJ3dpbicsICd3aW5kb3dzJywgJ2RvcycsICdcXHJcXG4nXS5pbmNsdWRlcygob3B0aW9ucy5uZXdsaW5lIHx8ICcnKS50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogPHA+Q29tcGlsZXMgYSBtYWlsY29tcG9zZXIgbWVzc2FnZSBhbmQgZm9yd2FyZHMgaXQgdG8gaGFuZGxlciB0aGF0IHNlbmRzIGl0LjwvcD5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBlbWFpbE1lc3NhZ2UgTWFpbENvbXBvc2VyIG9iamVjdFxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIENhbGxiYWNrIGZ1bmN0aW9uIHRvIHJ1biB3aGVuIHRoZSBzZW5kaW5nIGlzIGNvbXBsZXRlZFxuICAgICAqL1xuICAgIHNlbmQobWFpbCwgZG9uZSkge1xuICAgICAgICAvLyBTZW5kbWFpbCBzdHJpcHMgdGhpcyBoZWFkZXIgbGluZSBieSBpdHNlbGZcbiAgICAgICAgbWFpbC5tZXNzYWdlLmtlZXBCY2MgPSB0cnVlO1xuXG4gICAgICAgIGxldCBlbnZlbG9wZSA9IG1haWwuZGF0YS5lbnZlbG9wZSB8fCBtYWlsLm1lc3NhZ2UuZ2V0RW52ZWxvcGUoKTtcbiAgICAgICAgbGV0IG1lc3NhZ2VJZCA9IG1haWwubWVzc2FnZS5tZXNzYWdlSWQoKTtcbiAgICAgICAgbGV0IGFyZ3M7XG4gICAgICAgIGxldCBzZW5kbWFpbDtcbiAgICAgICAgbGV0IHJldHVybmVkO1xuXG4gICAgICAgIGNvbnN0IGhhc0ludmFsaWRBZGRyZXNzZXMgPSBbXVxuICAgICAgICAgICAgLmNvbmNhdChlbnZlbG9wZS5mcm9tIHx8IFtdKVxuICAgICAgICAgICAgLmNvbmNhdChlbnZlbG9wZS50byB8fCBbXSlcbiAgICAgICAgICAgIC5zb21lKGFkZHIgPT4gL14tLy50ZXN0KGFkZHIpKTtcbiAgICAgICAgaWYgKGhhc0ludmFsaWRBZGRyZXNzZXMpIHtcbiAgICAgICAgICAgIHJldHVybiBkb25lKG5ldyBFcnJvcignQ2FuIG5vdCBzZW5kIG1haWwuIEludmFsaWQgZW52ZWxvcGUgYWRkcmVzc2VzLicpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmFyZ3MpIHtcbiAgICAgICAgICAgIC8vIGZvcmNlIC1pIHRvIGtlZXAgc2luZ2xlIGRvdHNcbiAgICAgICAgICAgIGFyZ3MgPSBbJy1pJ10uY29uY2F0KHRoaXMuYXJncykuY29uY2F0KGVudmVsb3BlLnRvKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGFyZ3MgPSBbJy1pJ10uY29uY2F0KGVudmVsb3BlLmZyb20gPyBbJy1mJywgZW52ZWxvcGUuZnJvbV0gOiBbXSkuY29uY2F0KGVudmVsb3BlLnRvKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBjYWxsYmFjayA9IGVyciA9PiB7XG4gICAgICAgICAgICBpZiAocmV0dXJuZWQpIHtcbiAgICAgICAgICAgICAgICAvLyBpZ25vcmUgYW55IGFkZGl0aW9uYWwgcmVzcG9uc2VzLCBhbHJlYWR5IGRvbmVcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm5lZCA9IHRydWU7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGRvbmUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBkb25lKGVycik7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRvbmUobnVsbCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgZW52ZWxvcGU6IG1haWwuZGF0YS5lbnZlbG9wZSB8fCBtYWlsLm1lc3NhZ2UuZ2V0RW52ZWxvcGUoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlOiAnTWVzc2FnZXMgcXVldWVkIGZvciBkZWxpdmVyeSdcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBzZW5kbWFpbCA9IHRoaXMuX3NwYXduKHRoaXMucGF0aCwgYXJncyk7XG4gICAgICAgIH0gY2F0Y2ggKEUpIHtcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgZXJyOiBFLFxuICAgICAgICAgICAgICAgICAgICB0bng6ICdzcGF3bicsXG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VJZFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgJ0Vycm9yIG9jY3VycmVkIHdoaWxlIHNwYXduaW5nIHNlbmRtYWlsLiAlcycsXG4gICAgICAgICAgICAgICAgRS5tZXNzYWdlXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKEUpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHNlbmRtYWlsKSB7XG4gICAgICAgICAgICBzZW5kbWFpbC5vbignZXJyb3InLCBlcnIgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKFxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlcnIsXG4gICAgICAgICAgICAgICAgICAgICAgICB0bng6ICdzcGF3bicsXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlSWRcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgJ0Vycm9yIG9jY3VycmVkIHdoZW4gc2VuZGluZyBtZXNzYWdlICVzLiAlcycsXG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VJZCxcbiAgICAgICAgICAgICAgICAgICAgZXJyLm1lc3NhZ2VcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVycik7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgc2VuZG1haWwub25jZSgnZXhpdCcsIGNvZGUgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghY29kZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2FsbGJhY2soKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbGV0IGVycjtcbiAgICAgICAgICAgICAgICBpZiAoY29kZSA9PT0gMTI3KSB7XG4gICAgICAgICAgICAgICAgICAgIGVyciA9IG5ldyBFcnJvcignU2VuZG1haWwgY29tbWFuZCBub3QgZm91bmQsIHByb2Nlc3MgZXhpdGVkIHdpdGggY29kZSAnICsgY29kZSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgZXJyID0gbmV3IEVycm9yKCdTZW5kbWFpbCBleGl0ZWQgd2l0aCBjb2RlICcgKyBjb2RlKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcihcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgZXJyLFxuICAgICAgICAgICAgICAgICAgICAgICAgdG54OiAnc3RkaW4nLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZUlkXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICdFcnJvciBzZW5kaW5nIG1lc3NhZ2UgJXMgdG8gc2VuZG1haWwuICVzJyxcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZUlkLFxuICAgICAgICAgICAgICAgICAgICBlcnIubWVzc2FnZVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgY2FsbGJhY2soZXJyKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgc2VuZG1haWwub25jZSgnY2xvc2UnLCBjYWxsYmFjayk7XG5cbiAgICAgICAgICAgIHNlbmRtYWlsLnN0ZGluLm9uKCdlcnJvcicsIGVyciA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVycixcbiAgICAgICAgICAgICAgICAgICAgICAgIHRueDogJ3N0ZGluJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VJZFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAnRXJyb3Igb2NjdXJyZWQgd2hlbiBwaXBpbmcgbWVzc2FnZSAlcyB0byBzZW5kbWFpbC4gJXMnLFxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlSWQsXG4gICAgICAgICAgICAgICAgICAgIGVyci5tZXNzYWdlXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBjYWxsYmFjayhlcnIpO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGxldCByZWNpcGllbnRzID0gW10uY29uY2F0KGVudmVsb3BlLnRvIHx8IFtdKTtcbiAgICAgICAgICAgIGlmIChyZWNpcGllbnRzLmxlbmd0aCA+IDMpIHtcbiAgICAgICAgICAgICAgICByZWNpcGllbnRzLnB1c2goJy4uLmFuZCAnICsgcmVjaXBpZW50cy5zcGxpY2UoMikubGVuZ3RoICsgJyBtb3JlJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmxvZ2dlci5pbmZvKFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgdG54OiAnc2VuZCcsXG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VJZFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgJ1NlbmRpbmcgbWVzc2FnZSAlcyB0byA8JXM+JyxcbiAgICAgICAgICAgICAgICBtZXNzYWdlSWQsXG4gICAgICAgICAgICAgICAgcmVjaXBpZW50cy5qb2luKCcsICcpXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBsZXQgc291cmNlU3RyZWFtID0gbWFpbC5tZXNzYWdlLmNyZWF0ZVJlYWRTdHJlYW0oKTtcbiAgICAgICAgICAgIHNvdXJjZVN0cmVhbS5vbmNlKCdlcnJvcicsIGVyciA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVycixcbiAgICAgICAgICAgICAgICAgICAgICAgIHRueDogJ3N0ZGluJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VJZFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAnRXJyb3Igb2NjdXJyZWQgd2hlbiBnZW5lcmF0aW5nIG1lc3NhZ2UgJXMuICVzJyxcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZUlkLFxuICAgICAgICAgICAgICAgICAgICBlcnIubWVzc2FnZVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgc2VuZG1haWwua2lsbCgnU0lHSU5UJyk7IC8vIGRvIG5vdCBkZWxpdmVyIHRoZSBtZXNzYWdlXG4gICAgICAgICAgICAgICAgY2FsbGJhY2soZXJyKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBzb3VyY2VTdHJlYW0ucGlwZShzZW5kbWFpbC5zdGRpbik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gY2FsbGJhY2sobmV3IEVycm9yKCdzZW5kbWFpbCB3YXMgbm90IGZvdW5kJykpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IFNlbmRtYWlsVHJhbnNwb3J0O1xuIl0sIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6WzBdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(action-browser)/./node_modules/.pnpm/nodemailer@7.0.13/node_modules/nodemailer/lib/sendmail-transport/index.js\n");
|
||
|
||
/***/ }),
|
||
|
||
/***/ "(action-browser)/./node_modules/.pnpm/nodemailer@7.0.13/node_modules/nodemailer/lib/ses-transport/index.js":
|
||
/*!*************************************************************************************************!*\
|
||
!*** ./node_modules/.pnpm/nodemailer@7.0.13/node_modules/nodemailer/lib/ses-transport/index.js ***!
|
||
\*************************************************************************************************/
|
||
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
|
||
|
||
eval("\n\nconst EventEmitter = __webpack_require__(/*! events */ \"events\");\nconst packageData = __webpack_require__(/*! ../../package.json */ \"(action-browser)/./node_modules/.pnpm/nodemailer@7.0.13/node_modules/nodemailer/package.json\");\nconst shared = __webpack_require__(/*! ../shared */ \"(action-browser)/./node_modules/.pnpm/nodemailer@7.0.13/node_modules/nodemailer/lib/shared/index.js\");\nconst LeWindows = __webpack_require__(/*! ../mime-node/le-windows */ \"(action-browser)/./node_modules/.pnpm/nodemailer@7.0.13/node_modules/nodemailer/lib/mime-node/le-windows.js\");\nconst MimeNode = __webpack_require__(/*! ../mime-node */ \"(action-browser)/./node_modules/.pnpm/nodemailer@7.0.13/node_modules/nodemailer/lib/mime-node/index.js\");\n\n/**\n * Generates a Transport object for AWS SES\n *\n * @constructor\n * @param {Object} optional config parameter\n */\nclass SESTransport extends EventEmitter {\n constructor(options) {\n super();\n options = options || {};\n\n this.options = options || {};\n this.ses = this.options.SES;\n\n this.name = 'SESTransport';\n this.version = packageData.version;\n\n this.logger = shared.getLogger(this.options, {\n component: this.options.component || 'ses-transport'\n });\n }\n\n getRegion(cb) {\n if (this.ses.sesClient.config && typeof this.ses.sesClient.config.region === 'function') {\n // promise\n return this.ses.sesClient.config\n .region()\n .then(region => cb(null, region))\n .catch(err => cb(err));\n }\n return cb(null, false);\n }\n\n /**\n * Compiles a mailcomposer message and forwards it to SES\n *\n * @param {Object} emailMessage MailComposer object\n * @param {Function} callback Callback function to run when the sending is completed\n */\n send(mail, callback) {\n let statObject = {\n ts: Date.now(),\n pending: true\n };\n\n let fromHeader = mail.message._headers.find(header => /^from$/i.test(header.key));\n if (fromHeader) {\n let mimeNode = new MimeNode('text/plain');\n fromHeader = mimeNode._convertAddresses(mimeNode._parseAddresses(fromHeader.value));\n }\n\n let envelope = mail.data.envelope || mail.message.getEnvelope();\n let messageId = mail.message.messageId();\n\n let recipients = [].concat(envelope.to || []);\n if (recipients.length > 3) {\n recipients.push('...and ' + recipients.splice(2).length + ' more');\n }\n this.logger.info(\n {\n tnx: 'send',\n messageId\n },\n 'Sending message %s to <%s>',\n messageId,\n recipients.join(', ')\n );\n\n let getRawMessage = next => {\n // do not use Message-ID and Date in DKIM signature\n if (!mail.data._dkim) {\n mail.data._dkim = {};\n }\n if (mail.data._dkim.skipFields && typeof mail.data._dkim.skipFields === 'string') {\n mail.data._dkim.skipFields += ':date:message-id';\n } else {\n mail.data._dkim.skipFields = 'date:message-id';\n }\n\n let sourceStream = mail.message.createReadStream();\n let stream = sourceStream.pipe(new LeWindows());\n let chunks = [];\n let chunklen = 0;\n\n stream.on('readable', () => {\n let chunk;\n while ((chunk = stream.read()) !== null) {\n chunks.push(chunk);\n chunklen += chunk.length;\n }\n });\n\n sourceStream.once('error', err => stream.emit('error', err));\n\n stream.once('error', err => {\n next(err);\n });\n\n stream.once('end', () => next(null, Buffer.concat(chunks, chunklen)));\n };\n\n setImmediate(() =>\n getRawMessage((err, raw) => {\n if (err) {\n this.logger.error(\n {\n err,\n tnx: 'send',\n messageId\n },\n 'Failed creating message for %s. %s',\n messageId,\n err.message\n );\n statObject.pending = false;\n return callback(err);\n }\n\n let sesMessage = {\n Content: {\n Raw: {\n // required\n Data: raw // required\n }\n },\n FromEmailAddress: fromHeader ? fromHeader : envelope.from,\n Destination: {\n ToAddresses: envelope.to\n }\n };\n\n Object.keys(mail.data.ses || {}).forEach(key => {\n sesMessage[key] = mail.data.ses[key];\n });\n\n this.getRegion((err, region) => {\n if (err || !region) {\n region = 'us-east-1';\n }\n\n const command = new this.ses.SendEmailCommand(sesMessage);\n const sendPromise = this.ses.sesClient.send(command);\n\n sendPromise\n .then(data => {\n if (region === 'us-east-1') {\n region = 'email';\n }\n\n statObject.pending = true;\n callback(null, {\n envelope: {\n from: envelope.from,\n to: envelope.to\n },\n messageId: '<' + data.MessageId + (!/@/.test(data.MessageId) ? '@' + region + '.amazonses.com' : '') + '>',\n response: data.MessageId,\n raw\n });\n })\n .catch(err => {\n this.logger.error(\n {\n err,\n tnx: 'send'\n },\n 'Send error for %s: %s',\n messageId,\n err.message\n );\n statObject.pending = false;\n callback(err);\n });\n });\n })\n );\n }\n\n /**\n * Verifies SES configuration\n *\n * @param {Function} callback Callback function\n */\n verify(callback) {\n let promise;\n if (!callback) {\n promise = new Promise((resolve, reject) => {\n callback = shared.callbackPromise(resolve, reject);\n });\n }\n\n const cb = err => {\n if (err && !['InvalidParameterValue', 'MessageRejected'].includes(err.code || err.Code || err.name)) {\n return callback(err);\n }\n return callback(null, true);\n };\n\n const sesMessage = {\n Content: {\n Raw: {\n Data: Buffer.from('From: <invalid@invalid>\\r\\nTo: <invalid@invalid>\\r\\n Subject: Invalid\\r\\n\\r\\nInvalid')\n }\n },\n FromEmailAddress: 'invalid@invalid',\n Destination: {\n ToAddresses: ['invalid@invalid']\n }\n };\n\n this.getRegion((err, region) => {\n if (err || !region) {\n region = 'us-east-1';\n }\n\n const command = new this.ses.SendEmailCommand(sesMessage);\n const sendPromise = this.ses.sesClient.send(command);\n\n sendPromise.then(data => cb(null, data)).catch(err => cb(err));\n });\n\n return promise;\n }\n}\n\nmodule.exports = SESTransport;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFjdGlvbi1icm93c2VyKS8uL25vZGVfbW9kdWxlcy8ucG5wbS9ub2RlbWFpbGVyQDcuMC4xMy9ub2RlX21vZHVsZXMvbm9kZW1haWxlci9saWIvc2VzLXRyYW5zcG9ydC9pbmRleC5qcyIsIm1hcHBpbmdzIjoiQUFBYTs7QUFFYixxQkFBcUIsbUJBQU8sQ0FBQyxzQkFBUTtBQUNyQyxvQkFBb0IsbUJBQU8sQ0FBQyx3SEFBb0I7QUFDaEQsZUFBZSxtQkFBTyxDQUFDLHNIQUFXO0FBQ2xDLGtCQUFrQixtQkFBTyxDQUFDLDRJQUF5QjtBQUNuRCxpQkFBaUIsbUJBQU8sQ0FBQyw0SEFBYzs7QUFFdkM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFNBQVM7QUFDVDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLFFBQVE7QUFDdkIsZUFBZSxVQUFVO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7O0FBRWI7O0FBRUE7QUFDQTtBQUNBLGFBQWE7O0FBRWI7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUJBQXlCO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLCtDQUErQztBQUMvQztBQUNBLGlCQUFpQjs7QUFFakI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQ0FBaUM7QUFDakM7QUFDQTtBQUNBO0FBQ0EsNkJBQTZCO0FBQzdCLHlCQUF5QjtBQUN6QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUNBQWlDO0FBQ2pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlCQUF5QjtBQUN6QixpQkFBaUI7QUFDakIsYUFBYTtBQUNiO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsZUFBZSxVQUFVO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQTs7QUFFQSIsInNvdXJjZXMiOlsiL1VzZXJzL21hcmNtaW50ZWwvUHJvamVjdHMvZS10aWIuY29tL25vZGVfbW9kdWxlcy8ucG5wbS9ub2RlbWFpbGVyQDcuMC4xMy9ub2RlX21vZHVsZXMvbm9kZW1haWxlci9saWIvc2VzLXRyYW5zcG9ydC9pbmRleC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbmNvbnN0IEV2ZW50RW1pdHRlciA9IHJlcXVpcmUoJ2V2ZW50cycpO1xuY29uc3QgcGFja2FnZURhdGEgPSByZXF1aXJlKCcuLi8uLi9wYWNrYWdlLmpzb24nKTtcbmNvbnN0IHNoYXJlZCA9IHJlcXVpcmUoJy4uL3NoYXJlZCcpO1xuY29uc3QgTGVXaW5kb3dzID0gcmVxdWlyZSgnLi4vbWltZS1ub2RlL2xlLXdpbmRvd3MnKTtcbmNvbnN0IE1pbWVOb2RlID0gcmVxdWlyZSgnLi4vbWltZS1ub2RlJyk7XG5cbi8qKlxuICogR2VuZXJhdGVzIGEgVHJhbnNwb3J0IG9iamVjdCBmb3IgQVdTIFNFU1xuICpcbiAqIEBjb25zdHJ1Y3RvclxuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbmFsIGNvbmZpZyBwYXJhbWV0ZXJcbiAqL1xuY2xhc3MgU0VTVHJhbnNwb3J0IGV4dGVuZHMgRXZlbnRFbWl0dGVyIHtcbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuXG4gICAgICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gICAgICAgIHRoaXMuc2VzID0gdGhpcy5vcHRpb25zLlNFUztcblxuICAgICAgICB0aGlzLm5hbWUgPSAnU0VTVHJhbnNwb3J0JztcbiAgICAgICAgdGhpcy52ZXJzaW9uID0gcGFja2FnZURhdGEudmVyc2lvbjtcblxuICAgICAgICB0aGlzLmxvZ2dlciA9IHNoYXJlZC5nZXRMb2dnZXIodGhpcy5vcHRpb25zLCB7XG4gICAgICAgICAgICBjb21wb25lbnQ6IHRoaXMub3B0aW9ucy5jb21wb25lbnQgfHwgJ3Nlcy10cmFuc3BvcnQnXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGdldFJlZ2lvbihjYikge1xuICAgICAgICBpZiAodGhpcy5zZXMuc2VzQ2xpZW50LmNvbmZpZyAmJiB0eXBlb2YgdGhpcy5zZXMuc2VzQ2xpZW50LmNvbmZpZy5yZWdpb24gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIC8vIHByb21pc2VcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnNlcy5zZXNDbGllbnQuY29uZmlnXG4gICAgICAgICAgICAgICAgLnJlZ2lvbigpXG4gICAgICAgICAgICAgICAgLnRoZW4ocmVnaW9uID0+IGNiKG51bGwsIHJlZ2lvbikpXG4gICAgICAgICAgICAgICAgLmNhdGNoKGVyciA9PiBjYihlcnIpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY2IobnVsbCwgZmFsc2UpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbXBpbGVzIGEgbWFpbGNvbXBvc2VyIG1lc3NhZ2UgYW5kIGZvcndhcmRzIGl0IHRvIFNFU1xuICAgICAqXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGVtYWlsTWVzc2FnZSBNYWlsQ29tcG9zZXIgb2JqZWN0XG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgQ2FsbGJhY2sgZnVuY3Rpb24gdG8gcnVuIHdoZW4gdGhlIHNlbmRpbmcgaXMgY29tcGxldGVkXG4gICAgICovXG4gICAgc2VuZChtYWlsLCBjYWxsYmFjaykge1xuICAgICAgICBsZXQgc3RhdE9iamVjdCA9IHtcbiAgICAgICAgICAgIHRzOiBEYXRlLm5vdygpLFxuICAgICAgICAgICAgcGVuZGluZzogdHJ1ZVxuICAgICAgICB9O1xuXG4gICAgICAgIGxldCBmcm9tSGVhZGVyID0gbWFpbC5tZXNzYWdlLl9oZWFkZXJzLmZpbmQoaGVhZGVyID0+IC9eZnJvbSQvaS50ZXN0KGhlYWRlci5rZXkpKTtcbiAgICAgICAgaWYgKGZyb21IZWFkZXIpIHtcbiAgICAgICAgICAgIGxldCBtaW1lTm9kZSA9IG5ldyBNaW1lTm9kZSgndGV4dC9wbGFpbicpO1xuICAgICAgICAgICAgZnJvbUhlYWRlciA9IG1pbWVOb2RlLl9jb252ZXJ0QWRkcmVzc2VzKG1pbWVOb2RlLl9wYXJzZUFkZHJlc3Nlcyhmcm9tSGVhZGVyLnZhbHVlKSk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgZW52ZWxvcGUgPSBtYWlsLmRhdGEuZW52ZWxvcGUgfHwgbWFpbC5tZXNzYWdlLmdldEVudmVsb3BlKCk7XG4gICAgICAgIGxldCBtZXNzYWdlSWQgPSBtYWlsLm1lc3NhZ2UubWVzc2FnZUlkKCk7XG5cbiAgICAgICAgbGV0IHJlY2lwaWVudHMgPSBbXS5jb25jYXQoZW52ZWxvcGUudG8gfHwgW10pO1xuICAgICAgICBpZiAocmVjaXBpZW50cy5sZW5ndGggPiAzKSB7XG4gICAgICAgICAgICByZWNpcGllbnRzLnB1c2goJy4uLmFuZCAnICsgcmVjaXBpZW50cy5zcGxpY2UoMikubGVuZ3RoICsgJyBtb3JlJyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5sb2dnZXIuaW5mbyhcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB0bng6ICdzZW5kJyxcbiAgICAgICAgICAgICAgICBtZXNzYWdlSWRcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnU2VuZGluZyBtZXNzYWdlICVzIHRvIDwlcz4nLFxuICAgICAgICAgICAgbWVzc2FnZUlkLFxuICAgICAgICAgICAgcmVjaXBpZW50cy5qb2luKCcsICcpXG4gICAgICAgICk7XG5cbiAgICAgICAgbGV0IGdldFJhd01lc3NhZ2UgPSBuZXh0ID0+IHtcbiAgICAgICAgICAgIC8vIGRvIG5vdCB1c2UgTWVzc2FnZS1JRCBhbmQgRGF0ZSBpbiBES0lNIHNpZ25hdHVyZVxuICAgICAgICAgICAgaWYgKCFtYWlsLmRhdGEuX2RraW0pIHtcbiAgICAgICAgICAgICAgICBtYWlsLmRhdGEuX2RraW0gPSB7fTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChtYWlsLmRhdGEuX2RraW0uc2tpcEZpZWxkcyAmJiB0eXBlb2YgbWFpbC5kYXRhLl9ka2ltLnNraXBGaWVsZHMgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgbWFpbC5kYXRhLl9ka2ltLnNraXBGaWVsZHMgKz0gJzpkYXRlOm1lc3NhZ2UtaWQnO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBtYWlsLmRhdGEuX2RraW0uc2tpcEZpZWxkcyA9ICdkYXRlOm1lc3NhZ2UtaWQnO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsZXQgc291cmNlU3RyZWFtID0gbWFpbC5tZXNzYWdlLmNyZWF0ZVJlYWRTdHJlYW0oKTtcbiAgICAgICAgICAgIGxldCBzdHJlYW0gPSBzb3VyY2VTdHJlYW0ucGlwZShuZXcgTGVXaW5kb3dzKCkpO1xuICAgICAgICAgICAgbGV0IGNodW5rcyA9IFtdO1xuICAgICAgICAgICAgbGV0IGNodW5rbGVuID0gMDtcblxuICAgICAgICAgICAgc3RyZWFtLm9uKCdyZWFkYWJsZScsICgpID0+IHtcbiAgICAgICAgICAgICAgICBsZXQgY2h1bms7XG4gICAgICAgICAgICAgICAgd2hpbGUgKChjaHVuayA9IHN0cmVhbS5yZWFkKCkpICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNodW5rcy5wdXNoKGNodW5rKTtcbiAgICAgICAgICAgICAgICAgICAgY2h1bmtsZW4gKz0gY2h1bmsubGVuZ3RoO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBzb3VyY2VTdHJlYW0ub25jZSgnZXJyb3InLCBlcnIgPT4gc3RyZWFtLmVtaXQoJ2Vycm9yJywgZXJyKSk7XG5cbiAgICAgICAgICAgIHN0cmVhbS5vbmNlKCdlcnJvcicsIGVyciA9PiB7XG4gICAgICAgICAgICAgICAgbmV4dChlcnIpO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHN0cmVhbS5vbmNlKCdlbmQnLCAoKSA9PiBuZXh0KG51bGwsIEJ1ZmZlci5jb25jYXQoY2h1bmtzLCBjaHVua2xlbikpKTtcbiAgICAgICAgfTtcblxuICAgICAgICBzZXRJbW1lZGlhdGUoKCkgPT5cbiAgICAgICAgICAgIGdldFJhd01lc3NhZ2UoKGVyciwgcmF3KSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcihcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG54OiAnc2VuZCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZUlkXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgJ0ZhaWxlZCBjcmVhdGluZyBtZXNzYWdlIGZvciAlcy4gJXMnLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZUlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgZXJyLm1lc3NhZ2VcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgc3RhdE9iamVjdC5wZW5kaW5nID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBjYWxsYmFjayhlcnIpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGxldCBzZXNNZXNzYWdlID0ge1xuICAgICAgICAgICAgICAgICAgICBDb250ZW50OiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBSYXc6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZXF1aXJlZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGE6IHJhdyAvLyByZXF1aXJlZFxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBGcm9tRW1haWxBZGRyZXNzOiBmcm9tSGVhZGVyID8gZnJvbUhlYWRlciA6IGVudmVsb3BlLmZyb20sXG4gICAgICAgICAgICAgICAgICAgIERlc3RpbmF0aW9uOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBUb0FkZHJlc3NlczogZW52ZWxvcGUudG9cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICBPYmplY3Qua2V5cyhtYWlsLmRhdGEuc2VzIHx8IHt9KS5mb3JFYWNoKGtleSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHNlc01lc3NhZ2Vba2V5XSA9IG1haWwuZGF0YS5zZXNba2V5XTtcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgIHRoaXMuZ2V0UmVnaW9uKChlcnIsIHJlZ2lvbikgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZXJyIHx8ICFyZWdpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lvbiA9ICd1cy1lYXN0LTEnO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY29tbWFuZCA9IG5ldyB0aGlzLnNlcy5TZW5kRW1haWxDb21tYW5kKHNlc01lc3NhZ2UpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBzZW5kUHJvbWlzZSA9IHRoaXMuc2VzLnNlc0NsaWVudC5zZW5kKGNvbW1hbmQpO1xuXG4gICAgICAgICAgICAgICAgICAgIHNlbmRQcm9taXNlXG4gICAgICAgICAgICAgICAgICAgICAgICAudGhlbihkYXRhID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVnaW9uID09PSAndXMtZWFzdC0xJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpb24gPSAnZW1haWwnO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRPYmplY3QucGVuZGluZyA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sobnVsbCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnZlbG9wZToge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbTogZW52ZWxvcGUuZnJvbSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvOiBlbnZlbG9wZS50b1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlSWQ6ICc8JyArIGRhdGEuTWVzc2FnZUlkICsgKCEvQC8udGVzdChkYXRhLk1lc3NhZ2VJZCkgPyAnQCcgKyByZWdpb24gKyAnLmFtYXpvbnNlcy5jb20nIDogJycpICsgJz4nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZTogZGF0YS5NZXNzYWdlSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhd1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgIC5jYXRjaChlcnIgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bng6ICdzZW5kJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnU2VuZCBlcnJvciBmb3IgJXM6ICVzJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZUlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIubWVzc2FnZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdE9iamVjdC5wZW5kaW5nID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soZXJyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBWZXJpZmllcyBTRVMgY29uZmlndXJhdGlvblxuICAgICAqXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgQ2FsbGJhY2sgZnVuY3Rpb25cbiAgICAgKi9cbiAgICB2ZXJpZnkoY2FsbGJhY2spIHtcbiAgICAgICAgbGV0IHByb21pc2U7XG4gICAgICAgIGlmICghY2FsbGJhY2spIHtcbiAgICAgICAgICAgIHByb21pc2UgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICAgICAgY2FsbGJhY2sgPSBzaGFyZWQuY2FsbGJhY2tQcm9taXNlKHJlc29sdmUsIHJlamVjdCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGNiID0gZXJyID0+IHtcbiAgICAgICAgICAgIGlmIChlcnIgJiYgIVsnSW52YWxpZFBhcmFtZXRlclZhbHVlJywgJ01lc3NhZ2VSZWplY3RlZCddLmluY2x1ZGVzKGVyci5jb2RlIHx8IGVyci5Db2RlIHx8IGVyci5uYW1lKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBjYWxsYmFjayhlcnIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKG51bGwsIHRydWUpO1xuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IHNlc01lc3NhZ2UgPSB7XG4gICAgICAgICAgICBDb250ZW50OiB7XG4gICAgICAgICAgICAgICAgUmF3OiB7XG4gICAgICAgICAgICAgICAgICAgIERhdGE6IEJ1ZmZlci5mcm9tKCdGcm9tOiA8aW52YWxpZEBpbnZhbGlkPlxcclxcblRvOiA8aW52YWxpZEBpbnZhbGlkPlxcclxcbiBTdWJqZWN0OiBJbnZhbGlkXFxyXFxuXFxyXFxuSW52YWxpZCcpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIEZyb21FbWFpbEFkZHJlc3M6ICdpbnZhbGlkQGludmFsaWQnLFxuICAgICAgICAgICAgRGVzdGluYXRpb246IHtcbiAgICAgICAgICAgICAgICBUb0FkZHJlc3NlczogWydpbnZhbGlkQGludmFsaWQnXVxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIHRoaXMuZ2V0UmVnaW9uKChlcnIsIHJlZ2lvbikgPT4ge1xuICAgICAgICAgICAgaWYgKGVyciB8fCAhcmVnaW9uKSB7XG4gICAgICAgICAgICAgICAgcmVnaW9uID0gJ3VzLWVhc3QtMSc7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGNvbW1hbmQgPSBuZXcgdGhpcy5zZXMuU2VuZEVtYWlsQ29tbWFuZChzZXNNZXNzYWdlKTtcbiAgICAgICAgICAgIGNvbnN0IHNlbmRQcm9taXNlID0gdGhpcy5zZXMuc2VzQ2xpZW50LnNlbmQoY29tbWFuZCk7XG5cbiAgICAgICAgICAgIHNlbmRQcm9taXNlLnRoZW4oZGF0YSA9PiBjYihudWxsLCBkYXRhKSkuY2F0Y2goZXJyID0+IGNiKGVycikpO1xuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gcHJvbWlzZTtcbiAgICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gU0VTVHJhbnNwb3J0O1xuIl0sIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6WzBdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(action-browser)/./node_modules/.pnpm/nodemailer@7.0.13/node_modules/nodemailer/lib/ses-transport/index.js\n");
|
||
|
||
/***/ }),
|
||
|
||
/***/ "(action-browser)/./node_modules/.pnpm/nodemailer@7.0.13/node_modules/nodemailer/lib/shared/index.js":
|
||
/*!******************************************************************************************!*\
|
||
!*** ./node_modules/.pnpm/nodemailer@7.0.13/node_modules/nodemailer/lib/shared/index.js ***!
|
||
\******************************************************************************************/
|
||
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
|
||
|
||
eval("/* eslint no-console: 0 */\n\n\n\nconst urllib = __webpack_require__(/*! url */ \"url\");\nconst util = __webpack_require__(/*! util */ \"util\");\nconst fs = __webpack_require__(/*! fs */ \"fs\");\nconst nmfetch = __webpack_require__(/*! ../fetch */ \"(action-browser)/./node_modules/.pnpm/nodemailer@7.0.13/node_modules/nodemailer/lib/fetch/index.js\");\nconst dns = __webpack_require__(/*! dns */ \"dns\");\nconst net = __webpack_require__(/*! net */ \"net\");\nconst os = __webpack_require__(/*! os */ \"os\");\n\nconst DNS_TTL = 5 * 60 * 1000;\nconst CACHE_CLEANUP_INTERVAL = 30 * 1000; // Minimum 30 seconds between cleanups\nconst MAX_CACHE_SIZE = 1000; // Maximum number of entries in cache\n\nlet lastCacheCleanup = 0;\nmodule.exports._lastCacheCleanup = () => lastCacheCleanup;\nmodule.exports._resetCacheCleanup = () => {\n lastCacheCleanup = 0;\n};\n\nlet networkInterfaces;\ntry {\n networkInterfaces = os.networkInterfaces();\n} catch (_err) {\n // fails on some systems\n}\n\nmodule.exports.networkInterfaces = networkInterfaces;\n\nconst isFamilySupported = (family, allowInternal) => {\n let networkInterfaces = module.exports.networkInterfaces;\n if (!networkInterfaces) {\n // hope for the best\n return true;\n }\n\n const familySupported =\n // crux that replaces Object.values(networkInterfaces) as Object.values is not supported in nodejs v6\n Object.keys(networkInterfaces)\n .map(key => networkInterfaces[key])\n // crux that replaces .flat() as it is not supported in older Node versions (v10 and older)\n .reduce((acc, val) => acc.concat(val), [])\n .filter(i => !i.internal || allowInternal)\n .filter(i => i.family === 'IPv' + family || i.family === family).length > 0;\n\n return familySupported;\n};\n\nconst resolver = (family, hostname, options, callback) => {\n options = options || {};\n const familySupported = isFamilySupported(family, options.allowInternalNetworkInterfaces);\n\n if (!familySupported) {\n return callback(null, []);\n }\n\n const resolver = dns.Resolver ? new dns.Resolver(options) : dns;\n resolver['resolve' + family](hostname, (err, addresses) => {\n if (err) {\n switch (err.code) {\n case dns.NODATA:\n case dns.NOTFOUND:\n case dns.NOTIMP:\n case dns.SERVFAIL:\n case dns.CONNREFUSED:\n case dns.REFUSED:\n case 'EAI_AGAIN':\n return callback(null, []);\n }\n return callback(err);\n }\n return callback(null, Array.isArray(addresses) ? addresses : [].concat(addresses || []));\n });\n};\n\nconst dnsCache = (module.exports.dnsCache = new Map());\n\nconst formatDNSValue = (value, extra) => {\n if (!value) {\n return Object.assign({}, extra || {});\n }\n\n return Object.assign(\n {\n servername: value.servername,\n host:\n !value.addresses || !value.addresses.length\n ? null\n : value.addresses.length === 1\n ? value.addresses[0]\n : value.addresses[Math.floor(Math.random() * value.addresses.length)]\n },\n extra || {}\n );\n};\n\nmodule.exports.resolveHostname = (options, callback) => {\n options = options || {};\n\n if (!options.host && options.servername) {\n options.host = options.servername;\n }\n\n if (!options.host || net.isIP(options.host)) {\n // nothing to do here\n let value = {\n addresses: [options.host],\n servername: options.servername || false\n };\n return callback(\n null,\n formatDNSValue(value, {\n cached: false\n })\n );\n }\n\n let cached;\n if (dnsCache.has(options.host)) {\n cached = dnsCache.get(options.host);\n\n // Lazy cleanup with time throttling\n const now = Date.now();\n if (now - lastCacheCleanup > CACHE_CLEANUP_INTERVAL) {\n lastCacheCleanup = now;\n\n // Clean up expired entries\n for (const [host, entry] of dnsCache.entries()) {\n if (entry.expires && entry.expires < now) {\n dnsCache.delete(host);\n }\n }\n\n // If cache is still too large, remove oldest entries\n if (dnsCache.size > MAX_CACHE_SIZE) {\n const toDelete = Math.floor(MAX_CACHE_SIZE * 0.1); // Remove 10% of entries\n const keys = Array.from(dnsCache.keys()).slice(0, toDelete);\n keys.forEach(key => dnsCache.delete(key));\n }\n }\n\n if (!cached.expires || cached.expires >= now) {\n return callback(\n null,\n formatDNSValue(cached.value, {\n cached: true\n })\n );\n }\n }\n\n resolver(4, options.host, options, (err, addresses) => {\n if (err) {\n if (cached) {\n dnsCache.set(options.host, {\n value: cached.value,\n expires: Date.now() + (options.dnsTtl || DNS_TTL)\n });\n\n return callback(\n null,\n formatDNSValue(cached.value, {\n cached: true,\n error: err\n })\n );\n }\n return callback(err);\n }\n\n if (addresses && addresses.length) {\n let value = {\n addresses,\n servername: options.servername || options.host\n };\n\n dnsCache.set(options.host, {\n value,\n expires: Date.now() + (options.dnsTtl || DNS_TTL)\n });\n\n return callback(\n null,\n formatDNSValue(value, {\n cached: false\n })\n );\n }\n\n resolver(6, options.host, options, (err, addresses) => {\n if (err) {\n if (cached) {\n dnsCache.set(options.host, {\n value: cached.value,\n expires: Date.now() + (options.dnsTtl || DNS_TTL)\n });\n\n return callback(\n null,\n formatDNSValue(cached.value, {\n cached: true,\n error: err\n })\n );\n }\n return callback(err);\n }\n\n if (addresses && addresses.length) {\n let value = {\n addresses,\n servername: options.servername || options.host\n };\n\n dnsCache.set(options.host, {\n value,\n expires: Date.now() + (options.dnsTtl || DNS_TTL)\n });\n\n return callback(\n null,\n formatDNSValue(value, {\n cached: false\n })\n );\n }\n\n try {\n dns.lookup(options.host, { all: true }, (err, addresses) => {\n if (err) {\n if (cached) {\n dnsCache.set(options.host, {\n value: cached.value,\n expires: Date.now() + (options.dnsTtl || DNS_TTL)\n });\n\n return callback(\n null,\n formatDNSValue(cached.value, {\n cached: true,\n error: err\n })\n );\n }\n return callback(err);\n }\n\n let address = addresses\n ? addresses\n .filter(addr => isFamilySupported(addr.family))\n .map(addr => addr.address)\n .shift()\n : false;\n\n if (addresses && addresses.length && !address) {\n // there are addresses but none can be used\n console.warn(`Failed to resolve IPv${addresses[0].family} addresses with current network`);\n }\n\n if (!address && cached) {\n // nothing was found, fallback to cached value\n return callback(\n null,\n formatDNSValue(cached.value, {\n cached: true\n })\n );\n }\n\n let value = {\n addresses: address ? [address] : [options.host],\n servername: options.servername || options.host\n };\n\n dnsCache.set(options.host, {\n value,\n expires: Date.now() + (options.dnsTtl || DNS_TTL)\n });\n\n return callback(\n null,\n formatDNSValue(value, {\n cached: false\n })\n );\n });\n } catch (_err) {\n if (cached) {\n dnsCache.set(options.host, {\n value: cached.value,\n expires: Date.now() + (options.dnsTtl || DNS_TTL)\n });\n\n return callback(\n null,\n formatDNSValue(cached.value, {\n cached: true,\n error: err\n })\n );\n }\n return callback(err);\n }\n });\n });\n};\n/**\n * Parses connection url to a structured configuration object\n *\n * @param {String} str Connection url\n * @return {Object} Configuration object\n */\nmodule.exports.parseConnectionUrl = str => {\n str = str || '';\n let options = {};\n\n [urllib.parse(str, true)].forEach(url => {\n let auth;\n\n switch (url.protocol) {\n case 'smtp:':\n options.secure = false;\n break;\n case 'smtps:':\n options.secure = true;\n break;\n case 'direct:':\n options.direct = true;\n break;\n }\n\n if (!isNaN(url.port) && Number(url.port)) {\n options.port = Number(url.port);\n }\n\n if (url.hostname) {\n options.host = url.hostname;\n }\n\n if (url.auth) {\n auth = url.auth.split(':');\n\n if (!options.auth) {\n options.auth = {};\n }\n\n options.auth.user = auth.shift();\n options.auth.pass = auth.join(':');\n }\n\n Object.keys(url.query || {}).forEach(key => {\n let obj = options;\n let lKey = key;\n let value = url.query[key];\n\n if (!isNaN(value)) {\n value = Number(value);\n }\n\n switch (value) {\n case 'true':\n value = true;\n break;\n case 'false':\n value = false;\n break;\n }\n\n // tls is nested object\n if (key.indexOf('tls.') === 0) {\n lKey = key.substr(4);\n if (!options.tls) {\n options.tls = {};\n }\n obj = options.tls;\n } else if (key.indexOf('.') >= 0) {\n // ignore nested properties besides tls\n return;\n }\n\n if (!(lKey in obj)) {\n obj[lKey] = value;\n }\n });\n });\n\n return options;\n};\n\nmodule.exports._logFunc = (logger, level, defaults, data, message, ...args) => {\n let entry = {};\n\n Object.keys(defaults || {}).forEach(key => {\n if (key !== 'level') {\n entry[key] = defaults[key];\n }\n });\n\n Object.keys(data || {}).forEach(key => {\n if (key !== 'level') {\n entry[key] = data[key];\n }\n });\n\n logger[level](entry, message, ...args);\n};\n\n/**\n * Returns a bunyan-compatible logger interface. Uses either provided logger or\n * creates a default console logger\n *\n * @param {Object} [options] Options object that might include 'logger' value\n * @return {Object} bunyan compatible logger\n */\nmodule.exports.getLogger = (options, defaults) => {\n options = options || {};\n\n let response = {};\n let levels = ['trace', 'debug', 'info', 'warn', 'error', 'fatal'];\n\n if (!options.logger) {\n // use vanity logger\n levels.forEach(level => {\n response[level] = () => false;\n });\n return response;\n }\n\n let logger = options.logger;\n\n if (options.logger === true) {\n // create console logger\n logger = createDefaultLogger(levels);\n }\n\n levels.forEach(level => {\n response[level] = (data, message, ...args) => {\n module.exports._logFunc(logger, level, defaults, data, message, ...args);\n };\n });\n\n return response;\n};\n\n/**\n * Wrapper for creating a callback that either resolves or rejects a promise\n * based on input\n *\n * @param {Function} resolve Function to run if callback is called\n * @param {Function} reject Function to run if callback ends with an error\n */\nmodule.exports.callbackPromise = (resolve, reject) =>\n function () {\n let args = Array.from(arguments);\n let err = args.shift();\n if (err) {\n reject(err);\n } else {\n resolve(...args);\n }\n };\n\nmodule.exports.parseDataURI = uri => {\n if (typeof uri !== 'string') {\n return null;\n }\n\n // Early return for non-data URIs to avoid unnecessary processing\n if (!uri.startsWith('data:')) {\n return null;\n }\n\n // Find the first comma safely - this prevents ReDoS\n const commaPos = uri.indexOf(',');\n if (commaPos === -1) {\n return null;\n }\n\n const data = uri.substring(commaPos + 1);\n const metaStr = uri.substring('data:'.length, commaPos);\n\n let encoding;\n const metaEntries = metaStr.split(';');\n\n if (metaEntries.length > 0) {\n const lastEntry = metaEntries[metaEntries.length - 1].toLowerCase().trim();\n // Only recognize valid encoding types to prevent manipulation\n if (['base64', 'utf8', 'utf-8'].includes(lastEntry) && lastEntry.indexOf('=') === -1) {\n encoding = lastEntry;\n metaEntries.pop();\n }\n }\n\n const contentType = metaEntries.length > 0 ? metaEntries.shift() : 'application/octet-stream';\n const params = {};\n\n for (let i = 0; i < metaEntries.length; i++) {\n const entry = metaEntries[i];\n const sepPos = entry.indexOf('=');\n if (sepPos > 0) {\n // Ensure there's a key before the '='\n const key = entry.substring(0, sepPos).trim();\n const value = entry.substring(sepPos + 1).trim();\n if (key) {\n params[key] = value;\n }\n }\n }\n\n // Decode data based on encoding with proper error handling\n let bufferData;\n try {\n if (encoding === 'base64') {\n bufferData = Buffer.from(data, 'base64');\n } else {\n try {\n bufferData = Buffer.from(decodeURIComponent(data));\n } catch (_decodeError) {\n bufferData = Buffer.from(data);\n }\n }\n } catch (_bufferError) {\n bufferData = Buffer.alloc(0);\n }\n\n return {\n data: bufferData,\n encoding: encoding || null,\n contentType: contentType || 'application/octet-stream',\n params\n };\n};\n\n/**\n * Resolves a String or a Buffer value for content value. Useful if the value\n * is a Stream or a file or an URL. If the value is a Stream, overwrites\n * the stream object with the resolved value (you can't stream a value twice).\n *\n * This is useful when you want to create a plugin that needs a content value,\n * for example the `html` or `text` value as a String or a Buffer but not as\n * a file path or an URL.\n *\n * @param {Object} data An object or an Array you want to resolve an element for\n * @param {String|Number} key Property name or an Array index\n * @param {Function} callback Callback function with (err, value)\n */\nmodule.exports.resolveContent = (data, key, callback) => {\n let promise;\n\n if (!callback) {\n promise = new Promise((resolve, reject) => {\n callback = module.exports.callbackPromise(resolve, reject);\n });\n }\n\n let content = (data && data[key] && data[key].content) || data[key];\n let contentStream;\n let encoding = ((typeof data[key] === 'object' && data[key].encoding) || 'utf8')\n .toString()\n .toLowerCase()\n .replace(/[-_\\s]/g, '');\n\n if (!content) {\n return callback(null, content);\n }\n\n if (typeof content === 'object') {\n if (typeof content.pipe === 'function') {\n return resolveStream(content, (err, value) => {\n if (err) {\n return callback(err);\n }\n // we can't stream twice the same content, so we need\n // to replace the stream object with the streaming result\n if (data[key].content) {\n data[key].content = value;\n } else {\n data[key] = value;\n }\n callback(null, value);\n });\n } else if (/^https?:\\/\\//i.test(content.path || content.href)) {\n contentStream = nmfetch(content.path || content.href);\n return resolveStream(contentStream, callback);\n } else if (/^data:/i.test(content.path || content.href)) {\n let parsedDataUri = module.exports.parseDataURI(content.path || content.href);\n\n if (!parsedDataUri || !parsedDataUri.data) {\n return callback(null, Buffer.from(0));\n }\n return callback(null, parsedDataUri.data);\n } else if (content.path) {\n return resolveStream(fs.createReadStream(content.path), callback);\n }\n }\n\n if (typeof data[key].content === 'string' && !['utf8', 'usascii', 'ascii'].includes(encoding)) {\n content = Buffer.from(data[key].content, encoding);\n }\n\n // default action, return as is\n setImmediate(() => callback(null, content));\n\n return promise;\n};\n\n/**\n * Copies properties from source objects to target objects\n */\nmodule.exports.assign = function (/* target, ... sources */) {\n let args = Array.from(arguments);\n let target = args.shift() || {};\n\n args.forEach(source => {\n Object.keys(source || {}).forEach(key => {\n if (['tls', 'auth'].includes(key) && source[key] && typeof source[key] === 'object') {\n // tls and auth are special keys that need to be enumerated separately\n // other objects are passed as is\n if (!target[key]) {\n // ensure that target has this key\n target[key] = {};\n }\n Object.keys(source[key]).forEach(subKey => {\n target[key][subKey] = source[key][subKey];\n });\n } else {\n target[key] = source[key];\n }\n });\n });\n return target;\n};\n\nmodule.exports.encodeXText = str => {\n // ! 0x21\n // + 0x2B\n // = 0x3D\n // ~ 0x7E\n if (!/[^\\x21-\\x2A\\x2C-\\x3C\\x3E-\\x7E]/.test(str)) {\n return str;\n }\n let buf = Buffer.from(str);\n let result = '';\n for (let i = 0, len = buf.length; i < len; i++) {\n let c = buf[i];\n if (c < 0x21 || c > 0x7e || c === 0x2b || c === 0x3d) {\n result += '+' + (c < 0x10 ? '0' : '') + c.toString(16).toUpperCase();\n } else {\n result += String.fromCharCode(c);\n }\n }\n return result;\n};\n\n/**\n * Streams a stream value into a Buffer\n *\n * @param {Object} stream Readable stream\n * @param {Function} callback Callback function with (err, value)\n */\nfunction resolveStream(stream, callback) {\n let responded = false;\n let chunks = [];\n let chunklen = 0;\n\n stream.on('error', err => {\n if (responded) {\n return;\n }\n\n responded = true;\n callback(err);\n });\n\n stream.on('readable', () => {\n let chunk;\n while ((chunk = stream.read()) !== null) {\n chunks.push(chunk);\n chunklen += chunk.length;\n }\n });\n\n stream.on('end', () => {\n if (responded) {\n return;\n }\n responded = true;\n\n let value;\n\n try {\n value = Buffer.concat(chunks, chunklen);\n } catch (E) {\n return callback(E);\n }\n callback(null, value);\n });\n}\n\n/**\n * Generates a bunyan-like logger that prints to console\n *\n * @returns {Object} Bunyan logger instance\n */\nfunction createDefaultLogger(levels) {\n let levelMaxLen = 0;\n let levelNames = new Map();\n levels.forEach(level => {\n if (level.length > levelMaxLen) {\n levelMaxLen = level.length;\n }\n });\n\n levels.forEach(level => {\n let levelName = level.toUpperCase();\n if (levelName.length < levelMaxLen) {\n levelName += ' '.repeat(levelMaxLen - levelName.length);\n }\n levelNames.set(level, levelName);\n });\n\n let print = (level, entry, message, ...args) => {\n let prefix = '';\n if (entry) {\n if (entry.tnx === 'server') {\n prefix = 'S: ';\n } else if (entry.tnx === 'client') {\n prefix = 'C: ';\n }\n\n if (entry.sid) {\n prefix = '[' + entry.sid + '] ' + prefix;\n }\n\n if (entry.cid) {\n prefix = '[#' + entry.cid + '] ' + prefix;\n }\n }\n\n message = util.format(message, ...args);\n message.split(/\\r?\\n/).forEach(line => {\n console.log('[%s] %s %s', new Date().toISOString().substr(0, 19).replace(/T/, ' '), levelNames.get(level), prefix + line);\n });\n };\n\n let logger = {};\n levels.forEach(level => {\n logger[level] = print.bind(null, level);\n });\n\n return logger;\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFjdGlvbi1icm93c2VyKS8uL25vZGVfbW9kdWxlcy8ucG5wbS9ub2RlbWFpbGVyQDcuMC4xMy9ub2RlX21vZHVsZXMvbm9kZW1haWxlci9saWIvc2hhcmVkL2luZGV4LmpzIiwibWFwcGluZ3MiOiJBQUFBOztBQUVhOztBQUViLGVBQWUsbUJBQU8sQ0FBQyxnQkFBSztBQUM1QixhQUFhLG1CQUFPLENBQUMsa0JBQU07QUFDM0IsV0FBVyxtQkFBTyxDQUFDLGNBQUk7QUFDdkIsZ0JBQWdCLG1CQUFPLENBQUMsb0hBQVU7QUFDbEMsWUFBWSxtQkFBTyxDQUFDLGdCQUFLO0FBQ3pCLFlBQVksbUJBQU8sQ0FBQyxnQkFBSztBQUN6QixXQUFXLG1CQUFPLENBQUMsY0FBSTs7QUFFdkI7QUFDQSwwQ0FBMEM7QUFDMUMsNkJBQTZCOztBQUU3QjtBQUNBLGdDQUFnQztBQUNoQyxpQ0FBaUM7QUFDakM7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTs7QUFFQSxnQ0FBZ0M7O0FBRWhDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQSxrQkFBa0IsdUJBQXVCOztBQUV6QztBQUNBO0FBQ0EsK0JBQStCLGFBQWE7QUFDNUM7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTs7QUFFQSw4QkFBOEI7QUFDOUI7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsbUVBQW1FO0FBQ25FO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjs7QUFFakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7O0FBRWI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7O0FBRXJCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5QkFBeUI7QUFDekI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7O0FBRWpCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCO0FBQ0E7O0FBRUE7QUFDQSwyQ0FBMkMsV0FBVztBQUN0RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkJBQTZCOztBQUU3QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUNBQWlDO0FBQ2pDO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsNkRBQTZELHFCQUFxQjtBQUNsRjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2QkFBNkI7QUFDN0I7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7O0FBRXJCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUJBQXlCO0FBQ3pCO0FBQ0EsaUJBQWlCO0FBQ2pCLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQjs7QUFFckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlCQUF5QjtBQUN6QjtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkIsWUFBWSxRQUFRO0FBQ3BCO0FBQ0EsaUNBQWlDO0FBQ2pDO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLG1DQUFtQztBQUNuQztBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxLQUFLOztBQUVMO0FBQ0E7O0FBRUEsdUJBQXVCO0FBQ3ZCOztBQUVBLDhCQUE4QjtBQUM5QjtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMLDBCQUEwQjtBQUMxQjtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkIsWUFBWSxRQUFRO0FBQ3BCO0FBQ0Esd0JBQXdCO0FBQ3hCOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsVUFBVTtBQUNyQixXQUFXLFVBQVU7QUFDckI7QUFDQSw4QkFBOEI7QUFDOUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7O0FBRUEsMkJBQTJCO0FBQzNCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSx3Q0FBd0M7O0FBRXhDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSxvQkFBb0Isd0JBQXdCO0FBQzVDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsUUFBUTtBQUNuQixXQUFXLGVBQWU7QUFDMUIsV0FBVyxVQUFVO0FBQ3JCO0FBQ0EsNkJBQTZCO0FBQzdCOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYixVQUFVO0FBQ1Y7QUFDQTtBQUNBLFVBQVU7QUFDVjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7QUFDQTs7QUFFQTtBQUNBLGdDQUFnQztBQUNoQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakIsY0FBYztBQUNkO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7O0FBRUEsMEJBQTBCO0FBQzFCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNDQUFzQyxTQUFTO0FBQy9DO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsUUFBUTtBQUNuQixXQUFXLFVBQVU7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBIiwic291cmNlcyI6WyIvVXNlcnMvbWFyY21pbnRlbC9Qcm9qZWN0cy9lLXRpYi5jb20vbm9kZV9tb2R1bGVzLy5wbnBtL25vZGVtYWlsZXJANy4wLjEzL25vZGVfbW9kdWxlcy9ub2RlbWFpbGVyL2xpYi9zaGFyZWQvaW5kZXguanMiXSwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50IG5vLWNvbnNvbGU6IDAgKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCB1cmxsaWIgPSByZXF1aXJlKCd1cmwnKTtcbmNvbnN0IHV0aWwgPSByZXF1aXJlKCd1dGlsJyk7XG5jb25zdCBmcyA9IHJlcXVpcmUoJ2ZzJyk7XG5jb25zdCBubWZldGNoID0gcmVxdWlyZSgnLi4vZmV0Y2gnKTtcbmNvbnN0IGRucyA9IHJlcXVpcmUoJ2RucycpO1xuY29uc3QgbmV0ID0gcmVxdWlyZSgnbmV0Jyk7XG5jb25zdCBvcyA9IHJlcXVpcmUoJ29zJyk7XG5cbmNvbnN0IEROU19UVEwgPSA1ICogNjAgKiAxMDAwO1xuY29uc3QgQ0FDSEVfQ0xFQU5VUF9JTlRFUlZBTCA9IDMwICogMTAwMDsgLy8gTWluaW11bSAzMCBzZWNvbmRzIGJldHdlZW4gY2xlYW51cHNcbmNvbnN0IE1BWF9DQUNIRV9TSVpFID0gMTAwMDsgLy8gTWF4aW11bSBudW1iZXIgb2YgZW50cmllcyBpbiBjYWNoZVxuXG5sZXQgbGFzdENhY2hlQ2xlYW51cCA9IDA7XG5tb2R1bGUuZXhwb3J0cy5fbGFzdENhY2hlQ2xlYW51cCA9ICgpID0+IGxhc3RDYWNoZUNsZWFudXA7XG5tb2R1bGUuZXhwb3J0cy5fcmVzZXRDYWNoZUNsZWFudXAgPSAoKSA9PiB7XG4gICAgbGFzdENhY2hlQ2xlYW51cCA9IDA7XG59O1xuXG5sZXQgbmV0d29ya0ludGVyZmFjZXM7XG50cnkge1xuICAgIG5ldHdvcmtJbnRlcmZhY2VzID0gb3MubmV0d29ya0ludGVyZmFjZXMoKTtcbn0gY2F0Y2ggKF9lcnIpIHtcbiAgICAvLyBmYWlscyBvbiBzb21lIHN5c3RlbXNcbn1cblxubW9kdWxlLmV4cG9ydHMubmV0d29ya0ludGVyZmFjZXMgPSBuZXR3b3JrSW50ZXJmYWNlcztcblxuY29uc3QgaXNGYW1pbHlTdXBwb3J0ZWQgPSAoZmFtaWx5LCBhbGxvd0ludGVybmFsKSA9PiB7XG4gICAgbGV0IG5ldHdvcmtJbnRlcmZhY2VzID0gbW9kdWxlLmV4cG9ydHMubmV0d29ya0ludGVyZmFjZXM7XG4gICAgaWYgKCFuZXR3b3JrSW50ZXJmYWNlcykge1xuICAgICAgICAvLyBob3BlIGZvciB0aGUgYmVzdFxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBjb25zdCBmYW1pbHlTdXBwb3J0ZWQgPVxuICAgICAgICAvLyBjcnV4IHRoYXQgcmVwbGFjZXMgT2JqZWN0LnZhbHVlcyhuZXR3b3JrSW50ZXJmYWNlcykgYXMgT2JqZWN0LnZhbHVlcyBpcyBub3Qgc3VwcG9ydGVkIGluIG5vZGVqcyB2NlxuICAgICAgICBPYmplY3Qua2V5cyhuZXR3b3JrSW50ZXJmYWNlcylcbiAgICAgICAgICAgIC5tYXAoa2V5ID0+IG5ldHdvcmtJbnRlcmZhY2VzW2tleV0pXG4gICAgICAgICAgICAvLyBjcnV4IHRoYXQgcmVwbGFjZXMgLmZsYXQoKSBhcyBpdCBpcyBub3Qgc3VwcG9ydGVkIGluIG9sZGVyIE5vZGUgdmVyc2lvbnMgKHYxMCBhbmQgb2xkZXIpXG4gICAgICAgICAgICAucmVkdWNlKChhY2MsIHZhbCkgPT4gYWNjLmNvbmNhdCh2YWwpLCBbXSlcbiAgICAgICAgICAgIC5maWx0ZXIoaSA9PiAhaS5pbnRlcm5hbCB8fCBhbGxvd0ludGVybmFsKVxuICAgICAgICAgICAgLmZpbHRlcihpID0+IGkuZmFtaWx5ID09PSAnSVB2JyArIGZhbWlseSB8fCBpLmZhbWlseSA9PT0gZmFtaWx5KS5sZW5ndGggPiAwO1xuXG4gICAgcmV0dXJuIGZhbWlseVN1cHBvcnRlZDtcbn07XG5cbmNvbnN0IHJlc29sdmVyID0gKGZhbWlseSwgaG9zdG5hbWUsIG9wdGlvbnMsIGNhbGxiYWNrKSA9PiB7XG4gICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gICAgY29uc3QgZmFtaWx5U3VwcG9ydGVkID0gaXNGYW1pbHlTdXBwb3J0ZWQoZmFtaWx5LCBvcHRpb25zLmFsbG93SW50ZXJuYWxOZXR3b3JrSW50ZXJmYWNlcyk7XG5cbiAgICBpZiAoIWZhbWlseVN1cHBvcnRlZCkge1xuICAgICAgICByZXR1cm4gY2FsbGJhY2sobnVsbCwgW10pO1xuICAgIH1cblxuICAgIGNvbnN0IHJlc29sdmVyID0gZG5zLlJlc29sdmVyID8gbmV3IGRucy5SZXNvbHZlcihvcHRpb25zKSA6IGRucztcbiAgICByZXNvbHZlclsncmVzb2x2ZScgKyBmYW1pbHldKGhvc3RuYW1lLCAoZXJyLCBhZGRyZXNzZXMpID0+IHtcbiAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgICAgc3dpdGNoIChlcnIuY29kZSkge1xuICAgICAgICAgICAgICAgIGNhc2UgZG5zLk5PREFUQTpcbiAgICAgICAgICAgICAgICBjYXNlIGRucy5OT1RGT1VORDpcbiAgICAgICAgICAgICAgICBjYXNlIGRucy5OT1RJTVA6XG4gICAgICAgICAgICAgICAgY2FzZSBkbnMuU0VSVkZBSUw6XG4gICAgICAgICAgICAgICAgY2FzZSBkbnMuQ09OTlJFRlVTRUQ6XG4gICAgICAgICAgICAgICAgY2FzZSBkbnMuUkVGVVNFRDpcbiAgICAgICAgICAgICAgICBjYXNlICdFQUlfQUdBSU4nOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2FsbGJhY2sobnVsbCwgW10pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKGVycik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNhbGxiYWNrKG51bGwsIEFycmF5LmlzQXJyYXkoYWRkcmVzc2VzKSA/IGFkZHJlc3NlcyA6IFtdLmNvbmNhdChhZGRyZXNzZXMgfHwgW10pKTtcbiAgICB9KTtcbn07XG5cbmNvbnN0IGRuc0NhY2hlID0gKG1vZHVsZS5leHBvcnRzLmRuc0NhY2hlID0gbmV3IE1hcCgpKTtcblxuY29uc3QgZm9ybWF0RE5TVmFsdWUgPSAodmFsdWUsIGV4dHJhKSA9PiB7XG4gICAgaWYgKCF2YWx1ZSkge1xuICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgZXh0cmEgfHwge30pO1xuICAgIH1cblxuICAgIHJldHVybiBPYmplY3QuYXNzaWduKFxuICAgICAgICB7XG4gICAgICAgICAgICBzZXJ2ZXJuYW1lOiB2YWx1ZS5zZXJ2ZXJuYW1lLFxuICAgICAgICAgICAgaG9zdDpcbiAgICAgICAgICAgICAgICAhdmFsdWUuYWRkcmVzc2VzIHx8ICF2YWx1ZS5hZGRyZXNzZXMubGVuZ3RoXG4gICAgICAgICAgICAgICAgICAgID8gbnVsbFxuICAgICAgICAgICAgICAgICAgICA6IHZhbHVlLmFkZHJlc3Nlcy5sZW5ndGggPT09IDFcbiAgICAgICAgICAgICAgICAgICAgICA/IHZhbHVlLmFkZHJlc3Nlc1swXVxuICAgICAgICAgICAgICAgICAgICAgIDogdmFsdWUuYWRkcmVzc2VzW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIHZhbHVlLmFkZHJlc3Nlcy5sZW5ndGgpXVxuICAgICAgICB9LFxuICAgICAgICBleHRyYSB8fCB7fVxuICAgICk7XG59O1xuXG5tb2R1bGUuZXhwb3J0cy5yZXNvbHZlSG9zdG5hbWUgPSAob3B0aW9ucywgY2FsbGJhY2spID0+IHtcbiAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcblxuICAgIGlmICghb3B0aW9ucy5ob3N0ICYmIG9wdGlvbnMuc2VydmVybmFtZSkge1xuICAgICAgICBvcHRpb25zLmhvc3QgPSBvcHRpb25zLnNlcnZlcm5hbWU7XG4gICAgfVxuXG4gICAgaWYgKCFvcHRpb25zLmhvc3QgfHwgbmV0LmlzSVAob3B0aW9ucy5ob3N0KSkge1xuICAgICAgICAvLyBub3RoaW5nIHRvIGRvIGhlcmVcbiAgICAgICAgbGV0IHZhbHVlID0ge1xuICAgICAgICAgICAgYWRkcmVzc2VzOiBbb3B0aW9ucy5ob3N0XSxcbiAgICAgICAgICAgIHNlcnZlcm5hbWU6IG9wdGlvbnMuc2VydmVybmFtZSB8fCBmYWxzZVxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gY2FsbGJhY2soXG4gICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAgZm9ybWF0RE5TVmFsdWUodmFsdWUsIHtcbiAgICAgICAgICAgICAgICBjYWNoZWQ6IGZhbHNlXG4gICAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgIH1cblxuICAgIGxldCBjYWNoZWQ7XG4gICAgaWYgKGRuc0NhY2hlLmhhcyhvcHRpb25zLmhvc3QpKSB7XG4gICAgICAgIGNhY2hlZCA9IGRuc0NhY2hlLmdldChvcHRpb25zLmhvc3QpO1xuXG4gICAgICAgIC8vIExhenkgY2xlYW51cCB3aXRoIHRpbWUgdGhyb3R0bGluZ1xuICAgICAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICAgICAgICBpZiAobm93IC0gbGFzdENhY2hlQ2xlYW51cCA+IENBQ0hFX0NMRUFOVVBfSU5URVJWQUwpIHtcbiAgICAgICAgICAgIGxhc3RDYWNoZUNsZWFudXAgPSBub3c7XG5cbiAgICAgICAgICAgIC8vIENsZWFuIHVwIGV4cGlyZWQgZW50cmllc1xuICAgICAgICAgICAgZm9yIChjb25zdCBbaG9zdCwgZW50cnldIG9mIGRuc0NhY2hlLmVudHJpZXMoKSkge1xuICAgICAgICAgICAgICAgIGlmIChlbnRyeS5leHBpcmVzICYmIGVudHJ5LmV4cGlyZXMgPCBub3cpIHtcbiAgICAgICAgICAgICAgICAgICAgZG5zQ2FjaGUuZGVsZXRlKGhvc3QpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gSWYgY2FjaGUgaXMgc3RpbGwgdG9vIGxhcmdlLCByZW1vdmUgb2xkZXN0IGVudHJpZXNcbiAgICAgICAgICAgIGlmIChkbnNDYWNoZS5zaXplID4gTUFYX0NBQ0hFX1NJWkUpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB0b0RlbGV0ZSA9IE1hdGguZmxvb3IoTUFYX0NBQ0hFX1NJWkUgKiAwLjEpOyAvLyBSZW1vdmUgMTAlIG9mIGVudHJpZXNcbiAgICAgICAgICAgICAgICBjb25zdCBrZXlzID0gQXJyYXkuZnJvbShkbnNDYWNoZS5rZXlzKCkpLnNsaWNlKDAsIHRvRGVsZXRlKTtcbiAgICAgICAgICAgICAgICBrZXlzLmZvckVhY2goa2V5ID0+IGRuc0NhY2hlLmRlbGV0ZShrZXkpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghY2FjaGVkLmV4cGlyZXMgfHwgY2FjaGVkLmV4cGlyZXMgPj0gbm93KSB7XG4gICAgICAgICAgICByZXR1cm4gY2FsbGJhY2soXG4gICAgICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgICAgICBmb3JtYXRETlNWYWx1ZShjYWNoZWQudmFsdWUsIHtcbiAgICAgICAgICAgICAgICAgICAgY2FjaGVkOiB0cnVlXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXNvbHZlcig0LCBvcHRpb25zLmhvc3QsIG9wdGlvbnMsIChlcnIsIGFkZHJlc3NlcykgPT4ge1xuICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICBpZiAoY2FjaGVkKSB7XG4gICAgICAgICAgICAgICAgZG5zQ2FjaGUuc2V0KG9wdGlvbnMuaG9zdCwge1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogY2FjaGVkLnZhbHVlLFxuICAgICAgICAgICAgICAgICAgICBleHBpcmVzOiBEYXRlLm5vdygpICsgKG9wdGlvbnMuZG5zVHRsIHx8IEROU19UVEwpXG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gY2FsbGJhY2soXG4gICAgICAgICAgICAgICAgICAgIG51bGwsXG4gICAgICAgICAgICAgICAgICAgIGZvcm1hdEROU1ZhbHVlKGNhY2hlZC52YWx1ZSwge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FjaGVkOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6IGVyclxuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gY2FsbGJhY2soZXJyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChhZGRyZXNzZXMgJiYgYWRkcmVzc2VzLmxlbmd0aCkge1xuICAgICAgICAgICAgbGV0IHZhbHVlID0ge1xuICAgICAgICAgICAgICAgIGFkZHJlc3NlcyxcbiAgICAgICAgICAgICAgICBzZXJ2ZXJuYW1lOiBvcHRpb25zLnNlcnZlcm5hbWUgfHwgb3B0aW9ucy5ob3N0XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBkbnNDYWNoZS5zZXQob3B0aW9ucy5ob3N0LCB7XG4gICAgICAgICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgICAgICAgZXhwaXJlczogRGF0ZS5ub3coKSArIChvcHRpb25zLmRuc1R0bCB8fCBETlNfVFRMKVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHJldHVybiBjYWxsYmFjayhcbiAgICAgICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAgICAgIGZvcm1hdEROU1ZhbHVlKHZhbHVlLCB7XG4gICAgICAgICAgICAgICAgICAgIGNhY2hlZDogZmFsc2VcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJlc29sdmVyKDYsIG9wdGlvbnMuaG9zdCwgb3B0aW9ucywgKGVyciwgYWRkcmVzc2VzKSA9PiB7XG4gICAgICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICAgICAgaWYgKGNhY2hlZCkge1xuICAgICAgICAgICAgICAgICAgICBkbnNDYWNoZS5zZXQob3B0aW9ucy5ob3N0LCB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogY2FjaGVkLnZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgZXhwaXJlczogRGF0ZS5ub3coKSArIChvcHRpb25zLmRuc1R0bCB8fCBETlNfVFRMKVxuICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2FsbGJhY2soXG4gICAgICAgICAgICAgICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0RE5TVmFsdWUoY2FjaGVkLnZhbHVlLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FjaGVkOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOiBlcnJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBjYWxsYmFjayhlcnIpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoYWRkcmVzc2VzICYmIGFkZHJlc3Nlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBsZXQgdmFsdWUgPSB7XG4gICAgICAgICAgICAgICAgICAgIGFkZHJlc3NlcyxcbiAgICAgICAgICAgICAgICAgICAgc2VydmVybmFtZTogb3B0aW9ucy5zZXJ2ZXJuYW1lIHx8IG9wdGlvbnMuaG9zdFxuICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICBkbnNDYWNoZS5zZXQob3B0aW9ucy5ob3N0LCB7XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgICAgICAgICAgICBleHBpcmVzOiBEYXRlLm5vdygpICsgKG9wdGlvbnMuZG5zVHRsIHx8IEROU19UVEwpXG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gY2FsbGJhY2soXG4gICAgICAgICAgICAgICAgICAgIG51bGwsXG4gICAgICAgICAgICAgICAgICAgIGZvcm1hdEROU1ZhbHVlKHZhbHVlLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYWNoZWQ6IGZhbHNlXG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBkbnMubG9va3VwKG9wdGlvbnMuaG9zdCwgeyBhbGw6IHRydWUgfSwgKGVyciwgYWRkcmVzc2VzKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjYWNoZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkbnNDYWNoZS5zZXQob3B0aW9ucy5ob3N0LCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBjYWNoZWQudmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGlyZXM6IERhdGUubm93KCkgKyAob3B0aW9ucy5kbnNUdGwgfHwgRE5TX1RUTClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjYWxsYmFjayhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0RE5TVmFsdWUoY2FjaGVkLnZhbHVlLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWNoZWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjogZXJyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjYWxsYmFjayhlcnIpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgbGV0IGFkZHJlc3MgPSBhZGRyZXNzZXNcbiAgICAgICAgICAgICAgICAgICAgICAgID8gYWRkcmVzc2VzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKGFkZHIgPT4gaXNGYW1pbHlTdXBwb3J0ZWQoYWRkci5mYW1pbHkpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1hcChhZGRyID0+IGFkZHIuYWRkcmVzcylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zaGlmdCgpXG4gICAgICAgICAgICAgICAgICAgICAgICA6IGZhbHNlO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChhZGRyZXNzZXMgJiYgYWRkcmVzc2VzLmxlbmd0aCAmJiAhYWRkcmVzcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlcmUgYXJlIGFkZHJlc3NlcyBidXQgbm9uZSBjYW4gYmUgdXNlZFxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS53YXJuKGBGYWlsZWQgdG8gcmVzb2x2ZSBJUHYke2FkZHJlc3Nlc1swXS5mYW1pbHl9IGFkZHJlc3NlcyB3aXRoIGN1cnJlbnQgbmV0d29ya2ApO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKCFhZGRyZXNzICYmIGNhY2hlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm90aGluZyB3YXMgZm91bmQsIGZhbGxiYWNrIHRvIGNhY2hlZCB2YWx1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0RE5TVmFsdWUoY2FjaGVkLnZhbHVlLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhY2hlZDogdHJ1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgbGV0IHZhbHVlID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzc2VzOiBhZGRyZXNzID8gW2FkZHJlc3NdIDogW29wdGlvbnMuaG9zdF0sXG4gICAgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJuYW1lOiBvcHRpb25zLnNlcnZlcm5hbWUgfHwgb3B0aW9ucy5ob3N0XG4gICAgICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICAgICAgZG5zQ2FjaGUuc2V0KG9wdGlvbnMuaG9zdCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBleHBpcmVzOiBEYXRlLm5vdygpICsgKG9wdGlvbnMuZG5zVHRsIHx8IEROU19UVEwpXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBjYWxsYmFjayhcbiAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXRETlNWYWx1ZSh2YWx1ZSwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhY2hlZDogZmFsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9IGNhdGNoIChfZXJyKSB7XG4gICAgICAgICAgICAgICAgaWYgKGNhY2hlZCkge1xuICAgICAgICAgICAgICAgICAgICBkbnNDYWNoZS5zZXQob3B0aW9ucy5ob3N0LCB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogY2FjaGVkLnZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgZXhwaXJlczogRGF0ZS5ub3coKSArIChvcHRpb25zLmRuc1R0bCB8fCBETlNfVFRMKVxuICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2FsbGJhY2soXG4gICAgICAgICAgICAgICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0RE5TVmFsdWUoY2FjaGVkLnZhbHVlLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FjaGVkOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOiBlcnJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBjYWxsYmFjayhlcnIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9KTtcbn07XG4vKipcbiAqIFBhcnNlcyBjb25uZWN0aW9uIHVybCB0byBhIHN0cnVjdHVyZWQgY29uZmlndXJhdGlvbiBvYmplY3RcbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gc3RyIENvbm5lY3Rpb24gdXJsXG4gKiBAcmV0dXJuIHtPYmplY3R9IENvbmZpZ3VyYXRpb24gb2JqZWN0XG4gKi9cbm1vZHVsZS5leHBvcnRzLnBhcnNlQ29ubmVjdGlvblVybCA9IHN0ciA9PiB7XG4gICAgc3RyID0gc3RyIHx8ICcnO1xuICAgIGxldCBvcHRpb25zID0ge307XG5cbiAgICBbdXJsbGliLnBhcnNlKHN0ciwgdHJ1ZSldLmZvckVhY2godXJsID0+IHtcbiAgICAgICAgbGV0IGF1dGg7XG5cbiAgICAgICAgc3dpdGNoICh1cmwucHJvdG9jb2wpIHtcbiAgICAgICAgICAgIGNhc2UgJ3NtdHA6JzpcbiAgICAgICAgICAgICAgICBvcHRpb25zLnNlY3VyZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnc210cHM6JzpcbiAgICAgICAgICAgICAgICBvcHRpb25zLnNlY3VyZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdkaXJlY3Q6JzpcbiAgICAgICAgICAgICAgICBvcHRpb25zLmRpcmVjdCA9IHRydWU7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWlzTmFOKHVybC5wb3J0KSAmJiBOdW1iZXIodXJsLnBvcnQpKSB7XG4gICAgICAgICAgICBvcHRpb25zLnBvcnQgPSBOdW1iZXIodXJsLnBvcnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHVybC5ob3N0bmFtZSkge1xuICAgICAgICAgICAgb3B0aW9ucy5ob3N0ID0gdXJsLmhvc3RuYW1lO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHVybC5hdXRoKSB7XG4gICAgICAgICAgICBhdXRoID0gdXJsLmF1dGguc3BsaXQoJzonKTtcblxuICAgICAgICAgICAgaWYgKCFvcHRpb25zLmF1dGgpIHtcbiAgICAgICAgICAgICAgICBvcHRpb25zLmF1dGggPSB7fTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgb3B0aW9ucy5hdXRoLnVzZXIgPSBhdXRoLnNoaWZ0KCk7XG4gICAgICAgICAgICBvcHRpb25zLmF1dGgucGFzcyA9IGF1dGguam9pbignOicpO1xuICAgICAgICB9XG5cbiAgICAgICAgT2JqZWN0LmtleXModXJsLnF1ZXJ5IHx8IHt9KS5mb3JFYWNoKGtleSA9PiB7XG4gICAgICAgICAgICBsZXQgb2JqID0gb3B0aW9ucztcbiAgICAgICAgICAgIGxldCBsS2V5ID0ga2V5O1xuICAgICAgICAgICAgbGV0IHZhbHVlID0gdXJsLnF1ZXJ5W2tleV07XG5cbiAgICAgICAgICAgIGlmICghaXNOYU4odmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgdmFsdWUgPSBOdW1iZXIodmFsdWUpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBzd2l0Y2ggKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAndHJ1ZSc6XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAnZmFsc2UnOlxuICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gdGxzIGlzIG5lc3RlZCBvYmplY3RcbiAgICAgICAgICAgIGlmIChrZXkuaW5kZXhPZigndGxzLicpID09PSAwKSB7XG4gICAgICAgICAgICAgICAgbEtleSA9IGtleS5zdWJzdHIoNCk7XG4gICAgICAgICAgICAgICAgaWYgKCFvcHRpb25zLnRscykge1xuICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnRscyA9IHt9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBvYmogPSBvcHRpb25zLnRscztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoa2V5LmluZGV4T2YoJy4nKSA+PSAwKSB7XG4gICAgICAgICAgICAgICAgLy8gaWdub3JlIG5lc3RlZCBwcm9wZXJ0aWVzIGJlc2lkZXMgdGxzXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoIShsS2V5IGluIG9iaikpIHtcbiAgICAgICAgICAgICAgICBvYmpbbEtleV0gPSB2YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gb3B0aW9ucztcbn07XG5cbm1vZHVsZS5leHBvcnRzLl9sb2dGdW5jID0gKGxvZ2dlciwgbGV2ZWwsIGRlZmF1bHRzLCBkYXRhLCBtZXNzYWdlLCAuLi5hcmdzKSA9PiB7XG4gICAgbGV0IGVudHJ5ID0ge307XG5cbiAgICBPYmplY3Qua2V5cyhkZWZhdWx0cyB8fCB7fSkuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICBpZiAoa2V5ICE9PSAnbGV2ZWwnKSB7XG4gICAgICAgICAgICBlbnRyeVtrZXldID0gZGVmYXVsdHNba2V5XTtcbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgT2JqZWN0LmtleXMoZGF0YSB8fCB7fSkuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICBpZiAoa2V5ICE9PSAnbGV2ZWwnKSB7XG4gICAgICAgICAgICBlbnRyeVtrZXldID0gZGF0YVtrZXldO1xuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICBsb2dnZXJbbGV2ZWxdKGVudHJ5LCBtZXNzYWdlLCAuLi5hcmdzKTtcbn07XG5cbi8qKlxuICogUmV0dXJucyBhIGJ1bnlhbi1jb21wYXRpYmxlIGxvZ2dlciBpbnRlcmZhY2UuIFVzZXMgZWl0aGVyIHByb3ZpZGVkIGxvZ2dlciBvclxuICogY3JlYXRlcyBhIGRlZmF1bHQgY29uc29sZSBsb2dnZXJcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdIE9wdGlvbnMgb2JqZWN0IHRoYXQgbWlnaHQgaW5jbHVkZSAnbG9nZ2VyJyB2YWx1ZVxuICogQHJldHVybiB7T2JqZWN0fSBidW55YW4gY29tcGF0aWJsZSBsb2dnZXJcbiAqL1xubW9kdWxlLmV4cG9ydHMuZ2V0TG9nZ2VyID0gKG9wdGlvbnMsIGRlZmF1bHRzKSA9PiB7XG4gICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cbiAgICBsZXQgcmVzcG9uc2UgPSB7fTtcbiAgICBsZXQgbGV2ZWxzID0gWyd0cmFjZScsICdkZWJ1ZycsICdpbmZvJywgJ3dhcm4nLCAnZXJyb3InLCAnZmF0YWwnXTtcblxuICAgIGlmICghb3B0aW9ucy5sb2dnZXIpIHtcbiAgICAgICAgLy8gdXNlIHZhbml0eSBsb2dnZXJcbiAgICAgICAgbGV2ZWxzLmZvckVhY2gobGV2ZWwgPT4ge1xuICAgICAgICAgICAgcmVzcG9uc2VbbGV2ZWxdID0gKCkgPT4gZmFsc2U7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gcmVzcG9uc2U7XG4gICAgfVxuXG4gICAgbGV0IGxvZ2dlciA9IG9wdGlvbnMubG9nZ2VyO1xuXG4gICAgaWYgKG9wdGlvbnMubG9nZ2VyID09PSB0cnVlKSB7XG4gICAgICAgIC8vIGNyZWF0ZSBjb25zb2xlIGxvZ2dlclxuICAgICAgICBsb2dnZXIgPSBjcmVhdGVEZWZhdWx0TG9nZ2VyKGxldmVscyk7XG4gICAgfVxuXG4gICAgbGV2ZWxzLmZvckVhY2gobGV2ZWwgPT4ge1xuICAgICAgICByZXNwb25zZVtsZXZlbF0gPSAoZGF0YSwgbWVzc2FnZSwgLi4uYXJncykgPT4ge1xuICAgICAgICAgICAgbW9kdWxlLmV4cG9ydHMuX2xvZ0Z1bmMobG9nZ2VyLCBsZXZlbCwgZGVmYXVsdHMsIGRhdGEsIG1lc3NhZ2UsIC4uLmFyZ3MpO1xuICAgICAgICB9O1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHJlc3BvbnNlO1xufTtcblxuLyoqXG4gKiBXcmFwcGVyIGZvciBjcmVhdGluZyBhIGNhbGxiYWNrIHRoYXQgZWl0aGVyIHJlc29sdmVzIG9yIHJlamVjdHMgYSBwcm9taXNlXG4gKiBiYXNlZCBvbiBpbnB1dFxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IHJlc29sdmUgRnVuY3Rpb24gdG8gcnVuIGlmIGNhbGxiYWNrIGlzIGNhbGxlZFxuICogQHBhcmFtIHtGdW5jdGlvbn0gcmVqZWN0IEZ1bmN0aW9uIHRvIHJ1biBpZiBjYWxsYmFjayBlbmRzIHdpdGggYW4gZXJyb3JcbiAqL1xubW9kdWxlLmV4cG9ydHMuY2FsbGJhY2tQcm9taXNlID0gKHJlc29sdmUsIHJlamVjdCkgPT5cbiAgICBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGxldCBhcmdzID0gQXJyYXkuZnJvbShhcmd1bWVudHMpO1xuICAgICAgICBsZXQgZXJyID0gYXJncy5zaGlmdCgpO1xuICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJlc29sdmUoLi4uYXJncyk7XG4gICAgICAgIH1cbiAgICB9O1xuXG5tb2R1bGUuZXhwb3J0cy5wYXJzZURhdGFVUkkgPSB1cmkgPT4ge1xuICAgIGlmICh0eXBlb2YgdXJpICE9PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvLyBFYXJseSByZXR1cm4gZm9yIG5vbi1kYXRhIFVSSXMgdG8gYXZvaWQgdW5uZWNlc3NhcnkgcHJvY2Vzc2luZ1xuICAgIGlmICghdXJpLnN0YXJ0c1dpdGgoJ2RhdGE6JykpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgLy8gRmluZCB0aGUgZmlyc3QgY29tbWEgc2FmZWx5IC0gdGhpcyBwcmV2ZW50cyBSZURvU1xuICAgIGNvbnN0IGNvbW1hUG9zID0gdXJpLmluZGV4T2YoJywnKTtcbiAgICBpZiAoY29tbWFQb3MgPT09IC0xKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IGRhdGEgPSB1cmkuc3Vic3RyaW5nKGNvbW1hUG9zICsgMSk7XG4gICAgY29uc3QgbWV0YVN0ciA9IHVyaS5zdWJzdHJpbmcoJ2RhdGE6Jy5sZW5ndGgsIGNvbW1hUG9zKTtcblxuICAgIGxldCBlbmNvZGluZztcbiAgICBjb25zdCBtZXRhRW50cmllcyA9IG1ldGFTdHIuc3BsaXQoJzsnKTtcblxuICAgIGlmIChtZXRhRW50cmllcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnN0IGxhc3RFbnRyeSA9IG1ldGFFbnRyaWVzW21ldGFFbnRyaWVzLmxlbmd0aCAtIDFdLnRvTG93ZXJDYXNlKCkudHJpbSgpO1xuICAgICAgICAvLyBPbmx5IHJlY29nbml6ZSB2YWxpZCBlbmNvZGluZyB0eXBlcyB0byBwcmV2ZW50IG1hbmlwdWxhdGlvblxuICAgICAgICBpZiAoWydiYXNlNjQnLCAndXRmOCcsICd1dGYtOCddLmluY2x1ZGVzKGxhc3RFbnRyeSkgJiYgbGFzdEVudHJ5LmluZGV4T2YoJz0nKSA9PT0gLTEpIHtcbiAgICAgICAgICAgIGVuY29kaW5nID0gbGFzdEVudHJ5O1xuICAgICAgICAgICAgbWV0YUVudHJpZXMucG9wKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBjb250ZW50VHlwZSA9IG1ldGFFbnRyaWVzLmxlbmd0aCA+IDAgPyBtZXRhRW50cmllcy5zaGlmdCgpIDogJ2FwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSc7XG4gICAgY29uc3QgcGFyYW1zID0ge307XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG1ldGFFbnRyaWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGVudHJ5ID0gbWV0YUVudHJpZXNbaV07XG4gICAgICAgIGNvbnN0IHNlcFBvcyA9IGVudHJ5LmluZGV4T2YoJz0nKTtcbiAgICAgICAgaWYgKHNlcFBvcyA+IDApIHtcbiAgICAgICAgICAgIC8vIEVuc3VyZSB0aGVyZSdzIGEga2V5IGJlZm9yZSB0aGUgJz0nXG4gICAgICAgICAgICBjb25zdCBrZXkgPSBlbnRyeS5zdWJzdHJpbmcoMCwgc2VwUG9zKS50cmltKCk7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGVudHJ5LnN1YnN0cmluZyhzZXBQb3MgKyAxKS50cmltKCk7XG4gICAgICAgICAgICBpZiAoa2V5KSB7XG4gICAgICAgICAgICAgICAgcGFyYW1zW2tleV0gPSB2YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIERlY29kZSBkYXRhIGJhc2VkIG9uIGVuY29kaW5nIHdpdGggcHJvcGVyIGVycm9yIGhhbmRsaW5nXG4gICAgbGV0IGJ1ZmZlckRhdGE7XG4gICAgdHJ5IHtcbiAgICAgICAgaWYgKGVuY29kaW5nID09PSAnYmFzZTY0Jykge1xuICAgICAgICAgICAgYnVmZmVyRGF0YSA9IEJ1ZmZlci5mcm9tKGRhdGEsICdiYXNlNjQnKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgYnVmZmVyRGF0YSA9IEJ1ZmZlci5mcm9tKGRlY29kZVVSSUNvbXBvbmVudChkYXRhKSk7XG4gICAgICAgICAgICB9IGNhdGNoIChfZGVjb2RlRXJyb3IpIHtcbiAgICAgICAgICAgICAgICBidWZmZXJEYXRhID0gQnVmZmVyLmZyb20oZGF0YSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9IGNhdGNoIChfYnVmZmVyRXJyb3IpIHtcbiAgICAgICAgYnVmZmVyRGF0YSA9IEJ1ZmZlci5hbGxvYygwKTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgICBkYXRhOiBidWZmZXJEYXRhLFxuICAgICAgICBlbmNvZGluZzogZW5jb2RpbmcgfHwgbnVsbCxcbiAgICAgICAgY29udGVudFR5cGU6IGNvbnRlbnRUeXBlIHx8ICdhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nLFxuICAgICAgICBwYXJhbXNcbiAgICB9O1xufTtcblxuLyoqXG4gKiBSZXNvbHZlcyBhIFN0cmluZyBvciBhIEJ1ZmZlciB2YWx1ZSBmb3IgY29udGVudCB2YWx1ZS4gVXNlZnVsIGlmIHRoZSB2YWx1ZVxuICogaXMgYSBTdHJlYW0gb3IgYSBmaWxlIG9yIGFuIFVSTC4gSWYgdGhlIHZhbHVlIGlzIGEgU3RyZWFtLCBvdmVyd3JpdGVzXG4gKiB0aGUgc3RyZWFtIG9iamVjdCB3aXRoIHRoZSByZXNvbHZlZCB2YWx1ZSAoeW91IGNhbid0IHN0cmVhbSBhIHZhbHVlIHR3aWNlKS5cbiAqXG4gKiBUaGlzIGlzIHVzZWZ1bCB3aGVuIHlvdSB3YW50IHRvIGNyZWF0ZSBhIHBsdWdpbiB0aGF0IG5lZWRzIGEgY29udGVudCB2YWx1ZSxcbiAqIGZvciBleGFtcGxlIHRoZSBgaHRtbGAgb3IgYHRleHRgIHZhbHVlIGFzIGEgU3RyaW5nIG9yIGEgQnVmZmVyIGJ1dCBub3QgYXNcbiAqIGEgZmlsZSBwYXRoIG9yIGFuIFVSTC5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gZGF0YSBBbiBvYmplY3Qgb3IgYW4gQXJyYXkgeW91IHdhbnQgdG8gcmVzb2x2ZSBhbiBlbGVtZW50IGZvclxuICogQHBhcmFtIHtTdHJpbmd8TnVtYmVyfSBrZXkgUHJvcGVydHkgbmFtZSBvciBhbiBBcnJheSBpbmRleFxuICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgQ2FsbGJhY2sgZnVuY3Rpb24gd2l0aCAoZXJyLCB2YWx1ZSlcbiAqL1xubW9kdWxlLmV4cG9ydHMucmVzb2x2ZUNvbnRlbnQgPSAoZGF0YSwga2V5LCBjYWxsYmFjaykgPT4ge1xuICAgIGxldCBwcm9taXNlO1xuXG4gICAgaWYgKCFjYWxsYmFjaykge1xuICAgICAgICBwcm9taXNlID0gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgY2FsbGJhY2sgPSBtb2R1bGUuZXhwb3J0cy5jYWxsYmFja1Byb21pc2UocmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgbGV0IGNvbnRlbnQgPSAoZGF0YSAmJiBkYXRhW2tleV0gJiYgZGF0YVtrZXldLmNvbnRlbnQpIHx8IGRhdGFba2V5XTtcbiAgICBsZXQgY29udGVudFN0cmVhbTtcbiAgICBsZXQgZW5jb2RpbmcgPSAoKHR5cGVvZiBkYXRhW2tleV0gPT09ICdvYmplY3QnICYmIGRhdGFba2V5XS5lbmNvZGluZykgfHwgJ3V0ZjgnKVxuICAgICAgICAudG9TdHJpbmcoKVxuICAgICAgICAudG9Mb3dlckNhc2UoKVxuICAgICAgICAucmVwbGFjZSgvWy1fXFxzXS9nLCAnJyk7XG5cbiAgICBpZiAoIWNvbnRlbnQpIHtcbiAgICAgICAgcmV0dXJuIGNhbGxiYWNrKG51bGwsIGNvbnRlbnQpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgY29udGVudCA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBjb250ZW50LnBpcGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHJldHVybiByZXNvbHZlU3RyZWFtKGNvbnRlbnQsIChlcnIsIHZhbHVlKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2FsbGJhY2soZXJyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gd2UgY2FuJ3Qgc3RyZWFtIHR3aWNlIHRoZSBzYW1lIGNvbnRlbnQsIHNvIHdlIG5lZWRcbiAgICAgICAgICAgICAgICAvLyB0byByZXBsYWNlIHRoZSBzdHJlYW0gb2JqZWN0IHdpdGggdGhlIHN0cmVhbWluZyByZXN1bHRcbiAgICAgICAgICAgICAgICBpZiAoZGF0YVtrZXldLmNvbnRlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgZGF0YVtrZXldLmNvbnRlbnQgPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBkYXRhW2tleV0gPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2FsbGJhY2sobnVsbCwgdmFsdWUpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSBpZiAoL15odHRwcz86XFwvXFwvL2kudGVzdChjb250ZW50LnBhdGggfHwgY29udGVudC5ocmVmKSkge1xuICAgICAgICAgICAgY29udGVudFN0cmVhbSA9IG5tZmV0Y2goY29udGVudC5wYXRoIHx8IGNvbnRlbnQuaHJlZik7XG4gICAgICAgICAgICByZXR1cm4gcmVzb2x2ZVN0cmVhbShjb250ZW50U3RyZWFtLCBjYWxsYmFjayk7XG4gICAgICAgIH0gZWxzZSBpZiAoL15kYXRhOi9pLnRlc3QoY29udGVudC5wYXRoIHx8IGNvbnRlbnQuaHJlZikpIHtcbiAgICAgICAgICAgIGxldCBwYXJzZWREYXRhVXJpID0gbW9kdWxlLmV4cG9ydHMucGFyc2VEYXRhVVJJKGNvbnRlbnQucGF0aCB8fCBjb250ZW50LmhyZWYpO1xuXG4gICAgICAgICAgICBpZiAoIXBhcnNlZERhdGFVcmkgfHwgIXBhcnNlZERhdGFVcmkuZGF0YSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBjYWxsYmFjayhudWxsLCBCdWZmZXIuZnJvbSgwKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gY2FsbGJhY2sobnVsbCwgcGFyc2VkRGF0YVVyaS5kYXRhKTtcbiAgICAgICAgfSBlbHNlIGlmIChjb250ZW50LnBhdGgpIHtcbiAgICAgICAgICAgIHJldHVybiByZXNvbHZlU3RyZWFtKGZzLmNyZWF0ZVJlYWRTdHJlYW0oY29udGVudC5wYXRoKSwgY2FsbGJhY2spO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBkYXRhW2tleV0uY29udGVudCA9PT0gJ3N0cmluZycgJiYgIVsndXRmOCcsICd1c2FzY2lpJywgJ2FzY2lpJ10uaW5jbHVkZXMoZW5jb2RpbmcpKSB7XG4gICAgICAgIGNvbnRlbnQgPSBCdWZmZXIuZnJvbShkYXRhW2tleV0uY29udGVudCwgZW5jb2RpbmcpO1xuICAgIH1cblxuICAgIC8vIGRlZmF1bHQgYWN0aW9uLCByZXR1cm4gYXMgaXNcbiAgICBzZXRJbW1lZGlhdGUoKCkgPT4gY2FsbGJhY2sobnVsbCwgY29udGVudCkpO1xuXG4gICAgcmV0dXJuIHByb21pc2U7XG59O1xuXG4vKipcbiAqIENvcGllcyBwcm9wZXJ0aWVzIGZyb20gc291cmNlIG9iamVjdHMgdG8gdGFyZ2V0IG9iamVjdHNcbiAqL1xubW9kdWxlLmV4cG9ydHMuYXNzaWduID0gZnVuY3Rpb24gKC8qIHRhcmdldCwgLi4uIHNvdXJjZXMgKi8pIHtcbiAgICBsZXQgYXJncyA9IEFycmF5LmZyb20oYXJndW1lbnRzKTtcbiAgICBsZXQgdGFyZ2V0ID0gYXJncy5zaGlmdCgpIHx8IHt9O1xuXG4gICAgYXJncy5mb3JFYWNoKHNvdXJjZSA9PiB7XG4gICAgICAgIE9iamVjdC5rZXlzKHNvdXJjZSB8fCB7fSkuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICAgICAgaWYgKFsndGxzJywgJ2F1dGgnXS5pbmNsdWRlcyhrZXkpICYmIHNvdXJjZVtrZXldICYmIHR5cGVvZiBzb3VyY2Vba2V5XSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgICAgICAvLyB0bHMgYW5kIGF1dGggYXJlIHNwZWNpYWwga2V5cyB0aGF0IG5lZWQgdG8gYmUgZW51bWVyYXRlZCBzZXBhcmF0ZWx5XG4gICAgICAgICAgICAgICAgLy8gb3RoZXIgb2JqZWN0cyBhcmUgcGFzc2VkIGFzIGlzXG4gICAgICAgICAgICAgICAgaWYgKCF0YXJnZXRba2V5XSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBlbnN1cmUgdGhhdCB0YXJnZXQgaGFzIHRoaXMga2V5XG4gICAgICAgICAgICAgICAgICAgIHRhcmdldFtrZXldID0ge307XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIE9iamVjdC5rZXlzKHNvdXJjZVtrZXldKS5mb3JFYWNoKHN1YktleSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRhcmdldFtrZXldW3N1YktleV0gPSBzb3VyY2Vba2V5XVtzdWJLZXldO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9KTtcbiAgICByZXR1cm4gdGFyZ2V0O1xufTtcblxubW9kdWxlLmV4cG9ydHMuZW5jb2RlWFRleHQgPSBzdHIgPT4ge1xuICAgIC8vICEgMHgyMVxuICAgIC8vICsgMHgyQlxuICAgIC8vID0gMHgzRFxuICAgIC8vIH4gMHg3RVxuICAgIGlmICghL1teXFx4MjEtXFx4MkFcXHgyQy1cXHgzQ1xceDNFLVxceDdFXS8udGVzdChzdHIpKSB7XG4gICAgICAgIHJldHVybiBzdHI7XG4gICAgfVxuICAgIGxldCBidWYgPSBCdWZmZXIuZnJvbShzdHIpO1xuICAgIGxldCByZXN1bHQgPSAnJztcbiAgICBmb3IgKGxldCBpID0gMCwgbGVuID0gYnVmLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgIGxldCBjID0gYnVmW2ldO1xuICAgICAgICBpZiAoYyA8IDB4MjEgfHwgYyA+IDB4N2UgfHwgYyA9PT0gMHgyYiB8fCBjID09PSAweDNkKSB7XG4gICAgICAgICAgICByZXN1bHQgKz0gJysnICsgKGMgPCAweDEwID8gJzAnIDogJycpICsgYy50b1N0cmluZygxNikudG9VcHBlckNhc2UoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJlc3VsdCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGMpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59O1xuXG4vKipcbiAqIFN0cmVhbXMgYSBzdHJlYW0gdmFsdWUgaW50byBhIEJ1ZmZlclxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBzdHJlYW0gUmVhZGFibGUgc3RyZWFtXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBDYWxsYmFjayBmdW5jdGlvbiB3aXRoIChlcnIsIHZhbHVlKVxuICovXG5mdW5jdGlvbiByZXNvbHZlU3RyZWFtKHN0cmVhbSwgY2FsbGJhY2spIHtcbiAgICBsZXQgcmVzcG9uZGVkID0gZmFsc2U7XG4gICAgbGV0IGNodW5rcyA9IFtdO1xuICAgIGxldCBjaHVua2xlbiA9IDA7XG5cbiAgICBzdHJlYW0ub24oJ2Vycm9yJywgZXJyID0+IHtcbiAgICAgICAgaWYgKHJlc3BvbmRlZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgcmVzcG9uZGVkID0gdHJ1ZTtcbiAgICAgICAgY2FsbGJhY2soZXJyKTtcbiAgICB9KTtcblxuICAgIHN0cmVhbS5vbigncmVhZGFibGUnLCAoKSA9PiB7XG4gICAgICAgIGxldCBjaHVuaztcbiAgICAgICAgd2hpbGUgKChjaHVuayA9IHN0cmVhbS5yZWFkKCkpICE9PSBudWxsKSB7XG4gICAgICAgICAgICBjaHVua3MucHVzaChjaHVuayk7XG4gICAgICAgICAgICBjaHVua2xlbiArPSBjaHVuay5sZW5ndGg7XG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIHN0cmVhbS5vbignZW5kJywgKCkgPT4ge1xuICAgICAgICBpZiAocmVzcG9uZGVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgcmVzcG9uZGVkID0gdHJ1ZTtcblxuICAgICAgICBsZXQgdmFsdWU7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHZhbHVlID0gQnVmZmVyLmNvbmNhdChjaHVua3MsIGNodW5rbGVuKTtcbiAgICAgICAgfSBjYXRjaCAoRSkge1xuICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKEUpO1xuICAgICAgICB9XG4gICAgICAgIGNhbGxiYWNrKG51bGwsIHZhbHVlKTtcbiAgICB9KTtcbn1cblxuLyoqXG4gKiBHZW5lcmF0ZXMgYSBidW55YW4tbGlrZSBsb2dnZXIgdGhhdCBwcmludHMgdG8gY29uc29sZVxuICpcbiAqIEByZXR1cm5zIHtPYmplY3R9IEJ1bnlhbiBsb2dnZXIgaW5zdGFuY2VcbiAqL1xuZnVuY3Rpb24gY3JlYXRlRGVmYXVsdExvZ2dlcihsZXZlbHMpIHtcbiAgICBsZXQgbGV2ZWxNYXhMZW4gPSAwO1xuICAgIGxldCBsZXZlbE5hbWVzID0gbmV3IE1hcCgpO1xuICAgIGxldmVscy5mb3JFYWNoKGxldmVsID0+IHtcbiAgICAgICAgaWYgKGxldmVsLmxlbmd0aCA+IGxldmVsTWF4TGVuKSB7XG4gICAgICAgICAgICBsZXZlbE1heExlbiA9IGxldmVsLmxlbmd0aDtcbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgbGV2ZWxzLmZvckVhY2gobGV2ZWwgPT4ge1xuICAgICAgICBsZXQgbGV2ZWxOYW1lID0gbGV2ZWwudG9VcHBlckNhc2UoKTtcbiAgICAgICAgaWYgKGxldmVsTmFtZS5sZW5ndGggPCBsZXZlbE1heExlbikge1xuICAgICAgICAgICAgbGV2ZWxOYW1lICs9ICcgJy5yZXBlYXQobGV2ZWxNYXhMZW4gLSBsZXZlbE5hbWUubGVuZ3RoKTtcbiAgICAgICAgfVxuICAgICAgICBsZXZlbE5hbWVzLnNldChsZXZlbCwgbGV2ZWxOYW1lKTtcbiAgICB9KTtcblxuICAgIGxldCBwcmludCA9IChsZXZlbCwgZW50cnksIG1lc3NhZ2UsIC4uLmFyZ3MpID0+IHtcbiAgICAgICAgbGV0IHByZWZpeCA9ICcnO1xuICAgICAgICBpZiAoZW50cnkpIHtcbiAgICAgICAgICAgIGlmIChlbnRyeS50bnggPT09ICdzZXJ2ZXInKSB7XG4gICAgICAgICAgICAgICAgcHJlZml4ID0gJ1M6ICc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGVudHJ5LnRueCA9PT0gJ2NsaWVudCcpIHtcbiAgICAgICAgICAgICAgICBwcmVmaXggPSAnQzogJztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGVudHJ5LnNpZCkge1xuICAgICAgICAgICAgICAgIHByZWZpeCA9ICdbJyArIGVudHJ5LnNpZCArICddICcgKyBwcmVmaXg7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChlbnRyeS5jaWQpIHtcbiAgICAgICAgICAgICAgICBwcmVmaXggPSAnWyMnICsgZW50cnkuY2lkICsgJ10gJyArIHByZWZpeDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIG1lc3NhZ2UgPSB1dGlsLmZvcm1hdChtZXNzYWdlLCAuLi5hcmdzKTtcbiAgICAgICAgbWVzc2FnZS5zcGxpdCgvXFxyP1xcbi8pLmZvckVhY2gobGluZSA9PiB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnWyVzXSAlcyAlcycsIG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKS5zdWJzdHIoMCwgMTkpLnJlcGxhY2UoL1QvLCAnICcpLCBsZXZlbE5hbWVzLmdldChsZXZlbCksIHByZWZpeCArIGxpbmUpO1xuICAgICAgICB9KTtcbiAgICB9O1xuXG4gICAgbGV0IGxvZ2dlciA9IHt9O1xuICAgIGxldmVscy5mb3JFYWNoKGxldmVsID0+IHtcbiAgICAgICAgbG9nZ2VyW2xldmVsXSA9IHByaW50LmJpbmQobnVsbCwgbGV2ZWwpO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIGxvZ2dlcjtcbn1cbiJdLCJuYW1lcyI6W10sImlnbm9yZUxpc3QiOlswXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(action-browser)/./node_modules/.pnpm/nodemailer@7.0.13/node_modules/nodemailer/lib/shared/index.js\n");
|
||
|
||
/***/ }),
|
||
|
||
/***/ "(action-browser)/./node_modules/.pnpm/nodemailer@7.0.13/node_modules/nodemailer/lib/smtp-connection/data-stream.js":
|
||
/*!*********************************************************************************************************!*\
|
||
!*** ./node_modules/.pnpm/nodemailer@7.0.13/node_modules/nodemailer/lib/smtp-connection/data-stream.js ***!
|
||
\*********************************************************************************************************/
|
||
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
|
||
|
||
eval("\n\nconst stream = __webpack_require__(/*! stream */ \"stream\");\nconst Transform = stream.Transform;\n\n/**\n * Escapes dots in the beginning of lines. Ends the stream with <CR><LF>.<CR><LF>\n * Also makes sure that only <CR><LF> sequences are used for linebreaks\n *\n * @param {Object} options Stream options\n */\nclass DataStream extends Transform {\n constructor(options) {\n super(options);\n // init Transform\n this.options = options || {};\n this._curLine = '';\n\n this.inByteCount = 0;\n this.outByteCount = 0;\n this.lastByte = false;\n }\n\n /**\n * Escapes dots\n */\n _transform(chunk, encoding, done) {\n let chunks = [];\n let chunklen = 0;\n let i,\n len,\n lastPos = 0;\n let buf;\n\n if (!chunk || !chunk.length) {\n return done();\n }\n\n if (typeof chunk === 'string') {\n chunk = Buffer.from(chunk);\n }\n\n this.inByteCount += chunk.length;\n\n for (i = 0, len = chunk.length; i < len; i++) {\n if (chunk[i] === 0x2e) {\n // .\n if ((i && chunk[i - 1] === 0x0a) || (!i && (!this.lastByte || this.lastByte === 0x0a))) {\n buf = chunk.slice(lastPos, i + 1);\n chunks.push(buf);\n chunks.push(Buffer.from('.'));\n chunklen += buf.length + 1;\n lastPos = i + 1;\n }\n } else if (chunk[i] === 0x0a) {\n // .\n if ((i && chunk[i - 1] !== 0x0d) || (!i && this.lastByte !== 0x0d)) {\n if (i > lastPos) {\n buf = chunk.slice(lastPos, i);\n chunks.push(buf);\n chunklen += buf.length + 2;\n } else {\n chunklen += 2;\n }\n chunks.push(Buffer.from('\\r\\n'));\n lastPos = i + 1;\n }\n }\n }\n\n if (chunklen) {\n // add last piece\n if (lastPos < chunk.length) {\n buf = chunk.slice(lastPos);\n chunks.push(buf);\n chunklen += buf.length;\n }\n\n this.outByteCount += chunklen;\n this.push(Buffer.concat(chunks, chunklen));\n } else {\n this.outByteCount += chunk.length;\n this.push(chunk);\n }\n\n this.lastByte = chunk[chunk.length - 1];\n done();\n }\n\n /**\n * Finalizes the stream with a dot on a single line\n */\n _flush(done) {\n let buf;\n if (this.lastByte === 0x0a) {\n buf = Buffer.from('.\\r\\n');\n } else if (this.lastByte === 0x0d) {\n buf = Buffer.from('\\n.\\r\\n');\n } else {\n buf = Buffer.from('\\r\\n.\\r\\n');\n }\n this.outByteCount += buf.length;\n this.push(buf);\n done();\n }\n}\n\nmodule.exports = DataStream;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFjdGlvbi1icm93c2VyKS8uL25vZGVfbW9kdWxlcy8ucG5wbS9ub2RlbWFpbGVyQDcuMC4xMy9ub2RlX21vZHVsZXMvbm9kZW1haWxlci9saWIvc210cC1jb25uZWN0aW9uL2RhdGEtc3RyZWFtLmpzIiwibWFwcGluZ3MiOiJBQUFhOztBQUViLGVBQWUsbUJBQU8sQ0FBQyxzQkFBUTtBQUMvQjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsUUFBUTtBQUNuQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBLHdDQUF3QyxTQUFTO0FBQ2pEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0I7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBIiwic291cmNlcyI6WyIvVXNlcnMvbWFyY21pbnRlbC9Qcm9qZWN0cy9lLXRpYi5jb20vbm9kZV9tb2R1bGVzLy5wbnBtL25vZGVtYWlsZXJANy4wLjEzL25vZGVfbW9kdWxlcy9ub2RlbWFpbGVyL2xpYi9zbXRwLWNvbm5lY3Rpb24vZGF0YS1zdHJlYW0uanMiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCBzdHJlYW0gPSByZXF1aXJlKCdzdHJlYW0nKTtcbmNvbnN0IFRyYW5zZm9ybSA9IHN0cmVhbS5UcmFuc2Zvcm07XG5cbi8qKlxuICogRXNjYXBlcyBkb3RzIGluIHRoZSBiZWdpbm5pbmcgb2YgbGluZXMuIEVuZHMgdGhlIHN0cmVhbSB3aXRoIDxDUj48TEY+LjxDUj48TEY+XG4gKiBBbHNvIG1ha2VzIHN1cmUgdGhhdCBvbmx5IDxDUj48TEY+IHNlcXVlbmNlcyBhcmUgdXNlZCBmb3IgbGluZWJyZWFrc1xuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIFN0cmVhbSBvcHRpb25zXG4gKi9cbmNsYXNzIERhdGFTdHJlYW0gZXh0ZW5kcyBUcmFuc2Zvcm0ge1xuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnMpIHtcbiAgICAgICAgc3VwZXIob3B0aW9ucyk7XG4gICAgICAgIC8vIGluaXQgVHJhbnNmb3JtXG4gICAgICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gICAgICAgIHRoaXMuX2N1ckxpbmUgPSAnJztcblxuICAgICAgICB0aGlzLmluQnl0ZUNvdW50ID0gMDtcbiAgICAgICAgdGhpcy5vdXRCeXRlQ291bnQgPSAwO1xuICAgICAgICB0aGlzLmxhc3RCeXRlID0gZmFsc2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRXNjYXBlcyBkb3RzXG4gICAgICovXG4gICAgX3RyYW5zZm9ybShjaHVuaywgZW5jb2RpbmcsIGRvbmUpIHtcbiAgICAgICAgbGV0IGNodW5rcyA9IFtdO1xuICAgICAgICBsZXQgY2h1bmtsZW4gPSAwO1xuICAgICAgICBsZXQgaSxcbiAgICAgICAgICAgIGxlbixcbiAgICAgICAgICAgIGxhc3RQb3MgPSAwO1xuICAgICAgICBsZXQgYnVmO1xuXG4gICAgICAgIGlmICghY2h1bmsgfHwgIWNodW5rLmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIGRvbmUoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0eXBlb2YgY2h1bmsgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBjaHVuayA9IEJ1ZmZlci5mcm9tKGNodW5rKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuaW5CeXRlQ291bnQgKz0gY2h1bmsubGVuZ3RoO1xuXG4gICAgICAgIGZvciAoaSA9IDAsIGxlbiA9IGNodW5rLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoY2h1bmtbaV0gPT09IDB4MmUpIHtcbiAgICAgICAgICAgICAgICAvLyAuXG4gICAgICAgICAgICAgICAgaWYgKChpICYmIGNodW5rW2kgLSAxXSA9PT0gMHgwYSkgfHwgKCFpICYmICghdGhpcy5sYXN0Qnl0ZSB8fCB0aGlzLmxhc3RCeXRlID09PSAweDBhKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgYnVmID0gY2h1bmsuc2xpY2UobGFzdFBvcywgaSArIDEpO1xuICAgICAgICAgICAgICAgICAgICBjaHVua3MucHVzaChidWYpO1xuICAgICAgICAgICAgICAgICAgICBjaHVua3MucHVzaChCdWZmZXIuZnJvbSgnLicpKTtcbiAgICAgICAgICAgICAgICAgICAgY2h1bmtsZW4gKz0gYnVmLmxlbmd0aCArIDE7XG4gICAgICAgICAgICAgICAgICAgIGxhc3RQb3MgPSBpICsgMTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGNodW5rW2ldID09PSAweDBhKSB7XG4gICAgICAgICAgICAgICAgLy8gLlxuICAgICAgICAgICAgICAgIGlmICgoaSAmJiBjaHVua1tpIC0gMV0gIT09IDB4MGQpIHx8ICghaSAmJiB0aGlzLmxhc3RCeXRlICE9PSAweDBkKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoaSA+IGxhc3RQb3MpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZiA9IGNodW5rLnNsaWNlKGxhc3RQb3MsIGkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2h1bmtzLnB1c2goYnVmKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNodW5rbGVuICs9IGJ1Zi5sZW5ndGggKyAyO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2h1bmtsZW4gKz0gMjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjaHVua3MucHVzaChCdWZmZXIuZnJvbSgnXFxyXFxuJykpO1xuICAgICAgICAgICAgICAgICAgICBsYXN0UG9zID0gaSArIDE7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNodW5rbGVuKSB7XG4gICAgICAgICAgICAvLyBhZGQgbGFzdCBwaWVjZVxuICAgICAgICAgICAgaWYgKGxhc3RQb3MgPCBjaHVuay5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBidWYgPSBjaHVuay5zbGljZShsYXN0UG9zKTtcbiAgICAgICAgICAgICAgICBjaHVua3MucHVzaChidWYpO1xuICAgICAgICAgICAgICAgIGNodW5rbGVuICs9IGJ1Zi5sZW5ndGg7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMub3V0Qnl0ZUNvdW50ICs9IGNodW5rbGVuO1xuICAgICAgICAgICAgdGhpcy5wdXNoKEJ1ZmZlci5jb25jYXQoY2h1bmtzLCBjaHVua2xlbikpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5vdXRCeXRlQ291bnQgKz0gY2h1bmsubGVuZ3RoO1xuICAgICAgICAgICAgdGhpcy5wdXNoKGNodW5rKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMubGFzdEJ5dGUgPSBjaHVua1tjaHVuay5sZW5ndGggLSAxXTtcbiAgICAgICAgZG9uZSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZpbmFsaXplcyB0aGUgc3RyZWFtIHdpdGggYSBkb3Qgb24gYSBzaW5nbGUgbGluZVxuICAgICAqL1xuICAgIF9mbHVzaChkb25lKSB7XG4gICAgICAgIGxldCBidWY7XG4gICAgICAgIGlmICh0aGlzLmxhc3RCeXRlID09PSAweDBhKSB7XG4gICAgICAgICAgICBidWYgPSBCdWZmZXIuZnJvbSgnLlxcclxcbicpO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMubGFzdEJ5dGUgPT09IDB4MGQpIHtcbiAgICAgICAgICAgIGJ1ZiA9IEJ1ZmZlci5mcm9tKCdcXG4uXFxyXFxuJyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBidWYgPSBCdWZmZXIuZnJvbSgnXFxyXFxuLlxcclxcbicpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMub3V0Qnl0ZUNvdW50ICs9IGJ1Zi5sZW5ndGg7XG4gICAgICAgIHRoaXMucHVzaChidWYpO1xuICAgICAgICBkb25lKCk7XG4gICAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IERhdGFTdHJlYW07XG4iXSwibmFtZXMiOltdLCJpZ25vcmVMaXN0IjpbMF0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(action-browser)/./node_modules/.pnpm/nodemailer@7.0.13/node_modules/nodemailer/lib/smtp-connection/data-stream.js\n");
|
||
|
||
/***/ }),
|
||
|
||
/***/ "(action-browser)/./node_modules/.pnpm/nodemailer@7.0.13/node_modules/nodemailer/lib/smtp-connection/http-proxy-client.js":
|
||
/*!***************************************************************************************************************!*\
|
||
!*** ./node_modules/.pnpm/nodemailer@7.0.13/node_modules/nodemailer/lib/smtp-connection/http-proxy-client.js ***!
|
||
\***************************************************************************************************************/
|
||
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
|
||
|
||
eval("\n\n/**\n * Minimal HTTP/S proxy client\n */\n\nconst net = __webpack_require__(/*! net */ \"net\");\nconst tls = __webpack_require__(/*! tls */ \"tls\");\nconst urllib = __webpack_require__(/*! url */ \"url\");\n\n/**\n * Establishes proxied connection to destinationPort\n *\n * httpProxyClient(\"http://localhost:3128/\", 80, \"google.com\", function(err, socket){\n * socket.write(\"GET / HTTP/1.0\\r\\n\\r\\n\");\n * });\n *\n * @param {String} proxyUrl proxy configuration, etg \"http://proxy.host:3128/\"\n * @param {Number} destinationPort Port to open in destination host\n * @param {String} destinationHost Destination hostname\n * @param {Function} callback Callback to run with the rocket object once connection is established\n */\nfunction httpProxyClient(proxyUrl, destinationPort, destinationHost, callback) {\n let proxy = urllib.parse(proxyUrl);\n\n // create a socket connection to the proxy server\n let options;\n let connect;\n let socket;\n\n options = {\n host: proxy.hostname,\n port: Number(proxy.port) ? Number(proxy.port) : proxy.protocol === 'https:' ? 443 : 80\n };\n\n if (proxy.protocol === 'https:') {\n // we can use untrusted proxies as long as we verify actual SMTP certificates\n options.rejectUnauthorized = false;\n connect = tls.connect.bind(tls);\n } else {\n connect = net.connect.bind(net);\n }\n\n // Error harness for initial connection. Once connection is established, the responsibility\n // to handle errors is passed to whoever uses this socket\n let finished = false;\n let tempSocketErr = err => {\n if (finished) {\n return;\n }\n finished = true;\n try {\n socket.destroy();\n } catch (_E) {\n // ignore\n }\n callback(err);\n };\n\n let timeoutErr = () => {\n let err = new Error('Proxy socket timed out');\n err.code = 'ETIMEDOUT';\n tempSocketErr(err);\n };\n\n socket = connect(options, () => {\n if (finished) {\n return;\n }\n\n let reqHeaders = {\n Host: destinationHost + ':' + destinationPort,\n Connection: 'close'\n };\n if (proxy.auth) {\n reqHeaders['Proxy-Authorization'] = 'Basic ' + Buffer.from(proxy.auth).toString('base64');\n }\n\n socket.write(\n // HTTP method\n 'CONNECT ' +\n destinationHost +\n ':' +\n destinationPort +\n ' HTTP/1.1\\r\\n' +\n // HTTP request headers\n Object.keys(reqHeaders)\n .map(key => key + ': ' + reqHeaders[key])\n .join('\\r\\n') +\n // End request\n '\\r\\n\\r\\n'\n );\n\n let headers = '';\n let onSocketData = chunk => {\n let match;\n let remainder;\n\n if (finished) {\n return;\n }\n\n headers += chunk.toString('binary');\n if ((match = headers.match(/\\r\\n\\r\\n/))) {\n socket.removeListener('data', onSocketData);\n\n remainder = headers.substr(match.index + match[0].length);\n headers = headers.substr(0, match.index);\n if (remainder) {\n socket.unshift(Buffer.from(remainder, 'binary'));\n }\n\n // proxy connection is now established\n finished = true;\n\n // check response code\n match = headers.match(/^HTTP\\/\\d+\\.\\d+ (\\d+)/i);\n if (!match || (match[1] || '').charAt(0) !== '2') {\n try {\n socket.destroy();\n } catch (_E) {\n // ignore\n }\n return callback(new Error('Invalid response from proxy' + ((match && ': ' + match[1]) || '')));\n }\n\n socket.removeListener('error', tempSocketErr);\n socket.removeListener('timeout', timeoutErr);\n socket.setTimeout(0);\n\n return callback(null, socket);\n }\n };\n socket.on('data', onSocketData);\n });\n\n socket.setTimeout(httpProxyClient.timeout || 30 * 1000);\n socket.on('timeout', timeoutErr);\n\n socket.once('error', tempSocketErr);\n}\n\nmodule.exports = httpProxyClient;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFjdGlvbi1icm93c2VyKS8uL25vZGVfbW9kdWxlcy8ucG5wbS9ub2RlbWFpbGVyQDcuMC4xMy9ub2RlX21vZHVsZXMvbm9kZW1haWxlci9saWIvc210cC1jb25uZWN0aW9uL2h0dHAtcHJveHktY2xpZW50LmpzIiwibWFwcGluZ3MiOiJBQUFhOztBQUViO0FBQ0E7QUFDQTs7QUFFQSxZQUFZLG1CQUFPLENBQUMsZ0JBQUs7QUFDekIsWUFBWSxtQkFBTyxDQUFDLGdCQUFLO0FBQ3pCLGVBQWUsbUJBQU8sQ0FBQyxnQkFBSzs7QUFFNUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBLFdBQVcsUUFBUTtBQUNuQixXQUFXLFFBQVE7QUFDbkIsV0FBVyxRQUFRO0FBQ25CLFdBQVcsVUFBVTtBQUNyQjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQjtBQUN0QjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSIsInNvdXJjZXMiOlsiL1VzZXJzL21hcmNtaW50ZWwvUHJvamVjdHMvZS10aWIuY29tL25vZGVfbW9kdWxlcy8ucG5wbS9ub2RlbWFpbGVyQDcuMC4xMy9ub2RlX21vZHVsZXMvbm9kZW1haWxlci9saWIvc210cC1jb25uZWN0aW9uL2h0dHAtcHJveHktY2xpZW50LmpzIl0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBNaW5pbWFsIEhUVFAvUyBwcm94eSBjbGllbnRcbiAqL1xuXG5jb25zdCBuZXQgPSByZXF1aXJlKCduZXQnKTtcbmNvbnN0IHRscyA9IHJlcXVpcmUoJ3RscycpO1xuY29uc3QgdXJsbGliID0gcmVxdWlyZSgndXJsJyk7XG5cbi8qKlxuICogRXN0YWJsaXNoZXMgcHJveGllZCBjb25uZWN0aW9uIHRvIGRlc3RpbmF0aW9uUG9ydFxuICpcbiAqIGh0dHBQcm94eUNsaWVudChcImh0dHA6Ly9sb2NhbGhvc3Q6MzEyOC9cIiwgODAsIFwiZ29vZ2xlLmNvbVwiLCBmdW5jdGlvbihlcnIsIHNvY2tldCl7XG4gKiAgICAgc29ja2V0LndyaXRlKFwiR0VUIC8gSFRUUC8xLjBcXHJcXG5cXHJcXG5cIik7XG4gKiB9KTtcbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gcHJveHlVcmwgcHJveHkgY29uZmlndXJhdGlvbiwgZXRnIFwiaHR0cDovL3Byb3h5Lmhvc3Q6MzEyOC9cIlxuICogQHBhcmFtIHtOdW1iZXJ9IGRlc3RpbmF0aW9uUG9ydCBQb3J0IHRvIG9wZW4gaW4gZGVzdGluYXRpb24gaG9zdFxuICogQHBhcmFtIHtTdHJpbmd9IGRlc3RpbmF0aW9uSG9zdCBEZXN0aW5hdGlvbiBob3N0bmFtZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgQ2FsbGJhY2sgdG8gcnVuIHdpdGggdGhlIHJvY2tldCBvYmplY3Qgb25jZSBjb25uZWN0aW9uIGlzIGVzdGFibGlzaGVkXG4gKi9cbmZ1bmN0aW9uIGh0dHBQcm94eUNsaWVudChwcm94eVVybCwgZGVzdGluYXRpb25Qb3J0LCBkZXN0aW5hdGlvbkhvc3QsIGNhbGxiYWNrKSB7XG4gICAgbGV0IHByb3h5ID0gdXJsbGliLnBhcnNlKHByb3h5VXJsKTtcblxuICAgIC8vIGNyZWF0ZSBhIHNvY2tldCBjb25uZWN0aW9uIHRvIHRoZSBwcm94eSBzZXJ2ZXJcbiAgICBsZXQgb3B0aW9ucztcbiAgICBsZXQgY29ubmVjdDtcbiAgICBsZXQgc29ja2V0O1xuXG4gICAgb3B0aW9ucyA9IHtcbiAgICAgICAgaG9zdDogcHJveHkuaG9zdG5hbWUsXG4gICAgICAgIHBvcnQ6IE51bWJlcihwcm94eS5wb3J0KSA/IE51bWJlcihwcm94eS5wb3J0KSA6IHByb3h5LnByb3RvY29sID09PSAnaHR0cHM6JyA/IDQ0MyA6IDgwXG4gICAgfTtcblxuICAgIGlmIChwcm94eS5wcm90b2NvbCA9PT0gJ2h0dHBzOicpIHtcbiAgICAgICAgLy8gd2UgY2FuIHVzZSB1bnRydXN0ZWQgcHJveGllcyBhcyBsb25nIGFzIHdlIHZlcmlmeSBhY3R1YWwgU01UUCBjZXJ0aWZpY2F0ZXNcbiAgICAgICAgb3B0aW9ucy5yZWplY3RVbmF1dGhvcml6ZWQgPSBmYWxzZTtcbiAgICAgICAgY29ubmVjdCA9IHRscy5jb25uZWN0LmJpbmQodGxzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBjb25uZWN0ID0gbmV0LmNvbm5lY3QuYmluZChuZXQpO1xuICAgIH1cblxuICAgIC8vIEVycm9yIGhhcm5lc3MgZm9yIGluaXRpYWwgY29ubmVjdGlvbi4gT25jZSBjb25uZWN0aW9uIGlzIGVzdGFibGlzaGVkLCB0aGUgcmVzcG9uc2liaWxpdHlcbiAgICAvLyB0byBoYW5kbGUgZXJyb3JzIGlzIHBhc3NlZCB0byB3aG9ldmVyIHVzZXMgdGhpcyBzb2NrZXRcbiAgICBsZXQgZmluaXNoZWQgPSBmYWxzZTtcbiAgICBsZXQgdGVtcFNvY2tldEVyciA9IGVyciA9PiB7XG4gICAgICAgIGlmIChmaW5pc2hlZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGZpbmlzaGVkID0gdHJ1ZTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHNvY2tldC5kZXN0cm95KCk7XG4gICAgICAgIH0gY2F0Y2ggKF9FKSB7XG4gICAgICAgICAgICAvLyBpZ25vcmVcbiAgICAgICAgfVxuICAgICAgICBjYWxsYmFjayhlcnIpO1xuICAgIH07XG5cbiAgICBsZXQgdGltZW91dEVyciA9ICgpID0+IHtcbiAgICAgICAgbGV0IGVyciA9IG5ldyBFcnJvcignUHJveHkgc29ja2V0IHRpbWVkIG91dCcpO1xuICAgICAgICBlcnIuY29kZSA9ICdFVElNRURPVVQnO1xuICAgICAgICB0ZW1wU29ja2V0RXJyKGVycik7XG4gICAgfTtcblxuICAgIHNvY2tldCA9IGNvbm5lY3Qob3B0aW9ucywgKCkgPT4ge1xuICAgICAgICBpZiAoZmluaXNoZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCByZXFIZWFkZXJzID0ge1xuICAgICAgICAgICAgSG9zdDogZGVzdGluYXRpb25Ib3N0ICsgJzonICsgZGVzdGluYXRpb25Qb3J0LFxuICAgICAgICAgICAgQ29ubmVjdGlvbjogJ2Nsb3NlJ1xuICAgICAgICB9O1xuICAgICAgICBpZiAocHJveHkuYXV0aCkge1xuICAgICAgICAgICAgcmVxSGVhZGVyc1snUHJveHktQXV0aG9yaXphdGlvbiddID0gJ0Jhc2ljICcgKyBCdWZmZXIuZnJvbShwcm94eS5hdXRoKS50b1N0cmluZygnYmFzZTY0Jyk7XG4gICAgICAgIH1cblxuICAgICAgICBzb2NrZXQud3JpdGUoXG4gICAgICAgICAgICAvLyBIVFRQIG1ldGhvZFxuICAgICAgICAgICAgJ0NPTk5FQ1QgJyArXG4gICAgICAgICAgICAgICAgZGVzdGluYXRpb25Ib3N0ICtcbiAgICAgICAgICAgICAgICAnOicgK1xuICAgICAgICAgICAgICAgIGRlc3RpbmF0aW9uUG9ydCArXG4gICAgICAgICAgICAgICAgJyBIVFRQLzEuMVxcclxcbicgK1xuICAgICAgICAgICAgICAgIC8vIEhUVFAgcmVxdWVzdCBoZWFkZXJzXG4gICAgICAgICAgICAgICAgT2JqZWN0LmtleXMocmVxSGVhZGVycylcbiAgICAgICAgICAgICAgICAgICAgLm1hcChrZXkgPT4ga2V5ICsgJzogJyArIHJlcUhlYWRlcnNba2V5XSlcbiAgICAgICAgICAgICAgICAgICAgLmpvaW4oJ1xcclxcbicpICtcbiAgICAgICAgICAgICAgICAvLyBFbmQgcmVxdWVzdFxuICAgICAgICAgICAgICAgICdcXHJcXG5cXHJcXG4nXG4gICAgICAgICk7XG5cbiAgICAgICAgbGV0IGhlYWRlcnMgPSAnJztcbiAgICAgICAgbGV0IG9uU29ja2V0RGF0YSA9IGNodW5rID0+IHtcbiAgICAgICAgICAgIGxldCBtYXRjaDtcbiAgICAgICAgICAgIGxldCByZW1haW5kZXI7XG5cbiAgICAgICAgICAgIGlmIChmaW5pc2hlZCkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaGVhZGVycyArPSBjaHVuay50b1N0cmluZygnYmluYXJ5Jyk7XG4gICAgICAgICAgICBpZiAoKG1hdGNoID0gaGVhZGVycy5tYXRjaCgvXFxyXFxuXFxyXFxuLykpKSB7XG4gICAgICAgICAgICAgICAgc29ja2V0LnJlbW92ZUxpc3RlbmVyKCdkYXRhJywgb25Tb2NrZXREYXRhKTtcblxuICAgICAgICAgICAgICAgIHJlbWFpbmRlciA9IGhlYWRlcnMuc3Vic3RyKG1hdGNoLmluZGV4ICsgbWF0Y2hbMF0ubGVuZ3RoKTtcbiAgICAgICAgICAgICAgICBoZWFkZXJzID0gaGVhZGVycy5zdWJzdHIoMCwgbWF0Y2guaW5kZXgpO1xuICAgICAgICAgICAgICAgIGlmIChyZW1haW5kZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgc29ja2V0LnVuc2hpZnQoQnVmZmVyLmZyb20ocmVtYWluZGVyLCAnYmluYXJ5JykpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIHByb3h5IGNvbm5lY3Rpb24gaXMgbm93IGVzdGFibGlzaGVkXG4gICAgICAgICAgICAgICAgZmluaXNoZWQgPSB0cnVlO1xuXG4gICAgICAgICAgICAgICAgLy8gY2hlY2sgcmVzcG9uc2UgY29kZVxuICAgICAgICAgICAgICAgIG1hdGNoID0gaGVhZGVycy5tYXRjaCgvXkhUVFBcXC9cXGQrXFwuXFxkKyAoXFxkKykvaSk7XG4gICAgICAgICAgICAgICAgaWYgKCFtYXRjaCB8fCAobWF0Y2hbMV0gfHwgJycpLmNoYXJBdCgwKSAhPT0gJzInKSB7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzb2NrZXQuZGVzdHJveSgpO1xuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChfRSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKG5ldyBFcnJvcignSW52YWxpZCByZXNwb25zZSBmcm9tIHByb3h5JyArICgobWF0Y2ggJiYgJzogJyArIG1hdGNoWzFdKSB8fCAnJykpKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBzb2NrZXQucmVtb3ZlTGlzdGVuZXIoJ2Vycm9yJywgdGVtcFNvY2tldEVycik7XG4gICAgICAgICAgICAgICAgc29ja2V0LnJlbW92ZUxpc3RlbmVyKCd0aW1lb3V0JywgdGltZW91dEVycik7XG4gICAgICAgICAgICAgICAgc29ja2V0LnNldFRpbWVvdXQoMCk7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gY2FsbGJhY2sobnVsbCwgc29ja2V0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgc29ja2V0Lm9uKCdkYXRhJywgb25Tb2NrZXREYXRhKTtcbiAgICB9KTtcblxuICAgIHNvY2tldC5zZXRUaW1lb3V0KGh0dHBQcm94eUNsaWVudC50aW1lb3V0IHx8IDMwICogMTAwMCk7XG4gICAgc29ja2V0Lm9uKCd0aW1lb3V0JywgdGltZW91dEVycik7XG5cbiAgICBzb2NrZXQub25jZSgnZXJyb3InLCB0ZW1wU29ja2V0RXJyKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBodHRwUHJveHlDbGllbnQ7XG4iXSwibmFtZXMiOltdLCJpZ25vcmVMaXN0IjpbMF0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(action-browser)/./node_modules/.pnpm/nodemailer@7.0.13/node_modules/nodemailer/lib/smtp-connection/http-proxy-client.js\n");
|
||
|
||
/***/ }),
|
||
|
||
/***/ "(action-browser)/./node_modules/.pnpm/nodemailer@7.0.13/node_modules/nodemailer/lib/smtp-connection/index.js":
|
||
/*!***************************************************************************************************!*\
|
||
!*** ./node_modules/.pnpm/nodemailer@7.0.13/node_modules/nodemailer/lib/smtp-connection/index.js ***!
|
||
\***************************************************************************************************/
|
||
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
|
||
|
||
eval("\n\nconst packageInfo = __webpack_require__(/*! ../../package.json */ \"(action-browser)/./node_modules/.pnpm/nodemailer@7.0.13/node_modules/nodemailer/package.json\");\nconst EventEmitter = (__webpack_require__(/*! events */ \"events\").EventEmitter);\nconst net = __webpack_require__(/*! net */ \"net\");\nconst tls = __webpack_require__(/*! tls */ \"tls\");\nconst os = __webpack_require__(/*! os */ \"os\");\nconst crypto = __webpack_require__(/*! crypto */ \"crypto\");\nconst DataStream = __webpack_require__(/*! ./data-stream */ \"(action-browser)/./node_modules/.pnpm/nodemailer@7.0.13/node_modules/nodemailer/lib/smtp-connection/data-stream.js\");\nconst PassThrough = (__webpack_require__(/*! stream */ \"stream\").PassThrough);\nconst shared = __webpack_require__(/*! ../shared */ \"(action-browser)/./node_modules/.pnpm/nodemailer@7.0.13/node_modules/nodemailer/lib/shared/index.js\");\n\n// default timeout values in ms\nconst CONNECTION_TIMEOUT = 2 * 60 * 1000; // how much to wait for the connection to be established\nconst SOCKET_TIMEOUT = 10 * 60 * 1000; // how much to wait for socket inactivity before disconnecting the client\nconst GREETING_TIMEOUT = 30 * 1000; // how much to wait after connection is established but SMTP greeting is not receieved\nconst DNS_TIMEOUT = 30 * 1000; // how much to wait for resolveHostname\n\n/**\n * Generates a SMTP connection object\n *\n * Optional options object takes the following possible properties:\n *\n * * **port** - is the port to connect to (defaults to 587 or 465)\n * * **host** - is the hostname or IP address to connect to (defaults to 'localhost')\n * * **secure** - use SSL\n * * **ignoreTLS** - ignore server support for STARTTLS\n * * **requireTLS** - forces the client to use STARTTLS\n * * **name** - the name of the client server\n * * **localAddress** - outbound address to bind to (see: http://nodejs.org/api/net.html#net_net_connect_options_connectionlistener)\n * * **greetingTimeout** - Time to wait in ms until greeting message is received from the server (defaults to 10000)\n * * **connectionTimeout** - how many milliseconds to wait for the connection to establish\n * * **socketTimeout** - Time of inactivity until the connection is closed (defaults to 1 hour)\n * * **dnsTimeout** - Time to wait in ms for the DNS requests to be resolved (defaults to 30 seconds)\n * * **lmtp** - if true, uses LMTP instead of SMTP protocol\n * * **logger** - bunyan compatible logger interface\n * * **debug** - if true pass SMTP traffic to the logger\n * * **tls** - options for createCredentials\n * * **socket** - existing socket to use instead of creating a new one (see: http://nodejs.org/api/net.html#net_class_net_socket)\n * * **secured** - boolean indicates that the provided socket has already been upgraded to tls\n *\n * @constructor\n * @namespace SMTP Client module\n * @param {Object} [options] Option properties\n */\nclass SMTPConnection extends EventEmitter {\n constructor(options) {\n super(options);\n\n this.id = crypto.randomBytes(8).toString('base64').replace(/\\W/g, '');\n this.stage = 'init';\n\n this.options = options || {};\n\n this.secureConnection = !!this.options.secure;\n this.alreadySecured = !!this.options.secured;\n\n this.port = Number(this.options.port) || (this.secureConnection ? 465 : 587);\n this.host = this.options.host || 'localhost';\n\n this.servername = this.options.servername ? this.options.servername : !net.isIP(this.host) ? this.host : false;\n\n this.allowInternalNetworkInterfaces = this.options.allowInternalNetworkInterfaces || false;\n\n if (typeof this.options.secure === 'undefined' && this.port === 465) {\n // if secure option is not set but port is 465, then default to secure\n this.secureConnection = true;\n }\n\n this.name = this.options.name || this._getHostname();\n\n this.logger = shared.getLogger(this.options, {\n component: this.options.component || 'smtp-connection',\n sid: this.id\n });\n\n this.customAuth = new Map();\n Object.keys(this.options.customAuth || {}).forEach(key => {\n let mapKey = (key || '').toString().trim().toUpperCase();\n if (!mapKey) {\n return;\n }\n this.customAuth.set(mapKey, this.options.customAuth[key]);\n });\n\n /**\n * Expose version nr, just for the reference\n * @type {String}\n */\n this.version = packageInfo.version;\n\n /**\n * If true, then the user is authenticated\n * @type {Boolean}\n */\n this.authenticated = false;\n\n /**\n * If set to true, this instance is no longer active\n * @private\n */\n this.destroyed = false;\n\n /**\n * Defines if the current connection is secure or not. If not,\n * STARTTLS can be used if available\n * @private\n */\n this.secure = !!this.secureConnection;\n\n /**\n * Store incomplete messages coming from the server\n * @private\n */\n this._remainder = '';\n\n /**\n * Unprocessed responses from the server\n * @type {Array}\n */\n this._responseQueue = [];\n\n this.lastServerResponse = false;\n\n /**\n * The socket connecting to the server\n * @public\n */\n this._socket = false;\n\n /**\n * Lists supported auth mechanisms\n * @private\n */\n this._supportedAuth = [];\n\n /**\n * Set to true, if EHLO response includes \"AUTH\".\n * If false then authentication is not tried\n */\n this.allowsAuth = false;\n\n /**\n * Includes current envelope (from, to)\n * @private\n */\n this._envelope = false;\n\n /**\n * Lists supported extensions\n * @private\n */\n this._supportedExtensions = [];\n\n /**\n * Defines the maximum allowed size for a single message\n * @private\n */\n this._maxAllowedSize = 0;\n\n /**\n * Function queue to run if a data chunk comes from the server\n * @private\n */\n this._responseActions = [];\n this._recipientQueue = [];\n\n /**\n * Timeout variable for waiting the greeting\n * @private\n */\n this._greetingTimeout = false;\n\n /**\n * Timeout variable for waiting the connection to start\n * @private\n */\n this._connectionTimeout = false;\n\n /**\n * If the socket is deemed already closed\n * @private\n */\n this._destroyed = false;\n\n /**\n * If the socket is already being closed\n * @private\n */\n this._closing = false;\n\n /**\n * Callbacks for socket's listeners\n */\n this._onSocketData = chunk => this._onData(chunk);\n this._onSocketError = error => this._onError(error, 'ESOCKET', false, 'CONN');\n this._onSocketClose = () => this._onClose();\n this._onSocketEnd = () => this._onEnd();\n this._onSocketTimeout = () => this._onTimeout();\n }\n\n /**\n * Creates a connection to a SMTP server and sets up connection\n * listener\n */\n connect(connectCallback) {\n if (typeof connectCallback === 'function') {\n this.once('connect', () => {\n this.logger.debug(\n {\n tnx: 'smtp'\n },\n 'SMTP handshake finished'\n );\n connectCallback();\n });\n\n const isDestroyedMessage = this._isDestroyedMessage('connect');\n if (isDestroyedMessage) {\n return connectCallback(this._formatError(isDestroyedMessage, 'ECONNECTION', false, 'CONN'));\n }\n }\n\n let opts = {\n port: this.port,\n host: this.host,\n allowInternalNetworkInterfaces: this.allowInternalNetworkInterfaces,\n timeout: this.options.dnsTimeout || DNS_TIMEOUT\n };\n\n if (this.options.localAddress) {\n opts.localAddress = this.options.localAddress;\n }\n\n let setupConnectionHandlers = () => {\n this._connectionTimeout = setTimeout(() => {\n this._onError('Connection timeout', 'ETIMEDOUT', false, 'CONN');\n }, this.options.connectionTimeout || CONNECTION_TIMEOUT);\n\n this._socket.on('error', this._onSocketError);\n };\n\n if (this.options.connection) {\n // connection is already opened\n this._socket = this.options.connection;\n setupConnectionHandlers();\n\n if (this.secureConnection && !this.alreadySecured) {\n setImmediate(() =>\n this._upgradeConnection(err => {\n if (err) {\n this._onError(new Error('Error initiating TLS - ' + (err.message || err)), 'ETLS', false, 'CONN');\n return;\n }\n this._onConnect();\n })\n );\n } else {\n setImmediate(() => this._onConnect());\n }\n return;\n } else if (this.options.socket) {\n // socket object is set up but not yet connected\n this._socket = this.options.socket;\n return shared.resolveHostname(opts, (err, resolved) => {\n if (err) {\n return setImmediate(() => this._onError(err, 'EDNS', false, 'CONN'));\n }\n this.logger.debug(\n {\n tnx: 'dns',\n source: opts.host,\n resolved: resolved.host,\n cached: !!resolved.cached\n },\n 'Resolved %s as %s [cache %s]',\n opts.host,\n resolved.host,\n resolved.cached ? 'hit' : 'miss'\n );\n Object.keys(resolved).forEach(key => {\n if (key.charAt(0) !== '_' && resolved[key]) {\n opts[key] = resolved[key];\n }\n });\n try {\n this._socket.connect(this.port, this.host, () => {\n this._socket.setKeepAlive(true);\n this._onConnect();\n });\n setupConnectionHandlers();\n } catch (E) {\n return setImmediate(() => this._onError(E, 'ECONNECTION', false, 'CONN'));\n }\n });\n } else if (this.secureConnection) {\n // connect using tls\n if (this.options.tls) {\n Object.keys(this.options.tls).forEach(key => {\n opts[key] = this.options.tls[key];\n });\n }\n\n // ensure servername for SNI\n if (this.servername && !opts.servername) {\n opts.servername = this.servername;\n }\n\n return shared.resolveHostname(opts, (err, resolved) => {\n if (err) {\n return setImmediate(() => this._onError(err, 'EDNS', false, 'CONN'));\n }\n this.logger.debug(\n {\n tnx: 'dns',\n source: opts.host,\n resolved: resolved.host,\n cached: !!resolved.cached\n },\n 'Resolved %s as %s [cache %s]',\n opts.host,\n resolved.host,\n resolved.cached ? 'hit' : 'miss'\n );\n Object.keys(resolved).forEach(key => {\n if (key.charAt(0) !== '_' && resolved[key]) {\n opts[key] = resolved[key];\n }\n });\n try {\n this._socket = tls.connect(opts, () => {\n this._socket.setKeepAlive(true);\n this._onConnect();\n });\n setupConnectionHandlers();\n } catch (E) {\n return setImmediate(() => this._onError(E, 'ECONNECTION', false, 'CONN'));\n }\n });\n } else {\n // connect using plaintext\n return shared.resolveHostname(opts, (err, resolved) => {\n if (err) {\n return setImmediate(() => this._onError(err, 'EDNS', false, 'CONN'));\n }\n this.logger.debug(\n {\n tnx: 'dns',\n source: opts.host,\n resolved: resolved.host,\n cached: !!resolved.cached\n },\n 'Resolved %s as %s [cache %s]',\n opts.host,\n resolved.host,\n resolved.cached ? 'hit' : 'miss'\n );\n Object.keys(resolved).forEach(key => {\n if (key.charAt(0) !== '_' && resolved[key]) {\n opts[key] = resolved[key];\n }\n });\n try {\n this._socket = net.connect(opts, () => {\n this._socket.setKeepAlive(true);\n this._onConnect();\n });\n setupConnectionHandlers();\n } catch (E) {\n return setImmediate(() => this._onError(E, 'ECONNECTION', false, 'CONN'));\n }\n });\n }\n }\n\n /**\n * Sends QUIT\n */\n quit() {\n this._sendCommand('QUIT');\n this._responseActions.push(this.close);\n }\n\n /**\n * Closes the connection to the server\n */\n close() {\n clearTimeout(this._connectionTimeout);\n clearTimeout(this._greetingTimeout);\n this._responseActions = [];\n\n // allow to run this function only once\n if (this._closing) {\n return;\n }\n this._closing = true;\n\n let closeMethod = 'end';\n\n if (this.stage === 'init') {\n // Close the socket immediately when connection timed out\n closeMethod = 'destroy';\n }\n\n this.logger.debug(\n {\n tnx: 'smtp'\n },\n 'Closing connection to the server using \"%s\"',\n closeMethod\n );\n\n let socket = (this._socket && this._socket.socket) || this._socket;\n\n if (socket && !socket.destroyed) {\n try {\n socket[closeMethod]();\n } catch (_E) {\n // just ignore\n }\n }\n\n this._destroy();\n }\n\n /**\n * Authenticate user\n */\n login(authData, callback) {\n const isDestroyedMessage = this._isDestroyedMessage('login');\n if (isDestroyedMessage) {\n return callback(this._formatError(isDestroyedMessage, 'ECONNECTION', false, 'API'));\n }\n\n this._auth = authData || {};\n // Select SASL authentication method\n this._authMethod = (this._auth.method || '').toString().trim().toUpperCase() || false;\n\n if (!this._authMethod && this._auth.oauth2 && !this._auth.credentials) {\n this._authMethod = 'XOAUTH2';\n } else if (!this._authMethod || (this._authMethod === 'XOAUTH2' && !this._auth.oauth2)) {\n // use first supported\n this._authMethod = (this._supportedAuth[0] || 'PLAIN').toUpperCase().trim();\n }\n\n if (this._authMethod !== 'XOAUTH2' && (!this._auth.credentials || !this._auth.credentials.user || !this._auth.credentials.pass)) {\n if ((this._auth.user && this._auth.pass) || this.customAuth.has(this._authMethod)) {\n this._auth.credentials = {\n user: this._auth.user,\n pass: this._auth.pass,\n options: this._auth.options\n };\n } else {\n return callback(this._formatError('Missing credentials for \"' + this._authMethod + '\"', 'EAUTH', false, 'API'));\n }\n }\n\n if (this.customAuth.has(this._authMethod)) {\n let handler = this.customAuth.get(this._authMethod);\n let lastResponse;\n let returned = false;\n\n let resolve = () => {\n if (returned) {\n return;\n }\n returned = true;\n this.logger.info(\n {\n tnx: 'smtp',\n username: this._auth.user,\n action: 'authenticated',\n method: this._authMethod\n },\n 'User %s authenticated',\n JSON.stringify(this._auth.user)\n );\n this.authenticated = true;\n callback(null, true);\n };\n\n let reject = err => {\n if (returned) {\n return;\n }\n returned = true;\n callback(this._formatError(err, 'EAUTH', lastResponse, 'AUTH ' + this._authMethod));\n };\n\n let handlerResponse = handler({\n auth: this._auth,\n method: this._authMethod,\n\n extensions: [].concat(this._supportedExtensions),\n authMethods: [].concat(this._supportedAuth),\n maxAllowedSize: this._maxAllowedSize || false,\n\n sendCommand: (cmd, done) => {\n let promise;\n\n if (!done) {\n promise = new Promise((resolve, reject) => {\n done = shared.callbackPromise(resolve, reject);\n });\n }\n\n this._responseActions.push(str => {\n lastResponse = str;\n\n let codes = str.match(/^(\\d+)(?:\\s(\\d+\\.\\d+\\.\\d+))?\\s/);\n let data = {\n command: cmd,\n response: str\n };\n if (codes) {\n data.status = Number(codes[1]) || 0;\n if (codes[2]) {\n data.code = codes[2];\n }\n data.text = str.substr(codes[0].length);\n } else {\n data.text = str;\n data.status = 0; // just in case we need to perform numeric comparisons\n }\n done(null, data);\n });\n setImmediate(() => this._sendCommand(cmd));\n\n return promise;\n },\n\n resolve,\n reject\n });\n\n if (handlerResponse && typeof handlerResponse.catch === 'function') {\n // a promise was returned\n handlerResponse.then(resolve).catch(reject);\n }\n\n return;\n }\n\n switch (this._authMethod) {\n case 'XOAUTH2':\n this._handleXOauth2Token(false, callback);\n return;\n case 'LOGIN':\n this._responseActions.push(str => {\n this._actionAUTH_LOGIN_USER(str, callback);\n });\n this._sendCommand('AUTH LOGIN');\n return;\n case 'PLAIN':\n this._responseActions.push(str => {\n this._actionAUTHComplete(str, callback);\n });\n this._sendCommand(\n 'AUTH PLAIN ' +\n Buffer.from(\n //this._auth.user+'\\u0000'+\n '\\u0000' + // skip authorization identity as it causes problems with some servers\n this._auth.credentials.user +\n '\\u0000' +\n this._auth.credentials.pass,\n 'utf-8'\n ).toString('base64'),\n // log entry without passwords\n 'AUTH PLAIN ' +\n Buffer.from(\n //this._auth.user+'\\u0000'+\n '\\u0000' + // skip authorization identity as it causes problems with some servers\n this._auth.credentials.user +\n '\\u0000' +\n '/* secret */',\n 'utf-8'\n ).toString('base64')\n );\n return;\n case 'CRAM-MD5':\n this._responseActions.push(str => {\n this._actionAUTH_CRAM_MD5(str, callback);\n });\n this._sendCommand('AUTH CRAM-MD5');\n return;\n }\n\n return callback(this._formatError('Unknown authentication method \"' + this._authMethod + '\"', 'EAUTH', false, 'API'));\n }\n\n /**\n * Sends a message\n *\n * @param {Object} envelope Envelope object, {from: addr, to: [addr]}\n * @param {Object} message String, Buffer or a Stream\n * @param {Function} callback Callback to return once sending is completed\n */\n send(envelope, message, done) {\n if (!message) {\n return done(this._formatError('Empty message', 'EMESSAGE', false, 'API'));\n }\n\n const isDestroyedMessage = this._isDestroyedMessage('send message');\n if (isDestroyedMessage) {\n return done(this._formatError(isDestroyedMessage, 'ECONNECTION', false, 'API'));\n }\n\n // reject larger messages than allowed\n if (this._maxAllowedSize && envelope.size > this._maxAllowedSize) {\n return setImmediate(() => {\n done(this._formatError('Message size larger than allowed ' + this._maxAllowedSize, 'EMESSAGE', false, 'MAIL FROM'));\n });\n }\n\n // ensure that callback is only called once\n let returned = false;\n let callback = function () {\n if (returned) {\n return;\n }\n returned = true;\n\n done(...arguments);\n };\n\n if (typeof message.on === 'function') {\n message.on('error', err => callback(this._formatError(err, 'ESTREAM', false, 'API')));\n }\n\n let startTime = Date.now();\n this._setEnvelope(envelope, (err, info) => {\n if (err) {\n // create passthrough stream to consume to prevent OOM\n let stream = new PassThrough();\n if (typeof message.pipe === 'function') {\n message.pipe(stream);\n } else {\n stream.write(message);\n stream.end();\n }\n\n return callback(err);\n }\n let envelopeTime = Date.now();\n let stream = this._createSendStream((err, str) => {\n if (err) {\n return callback(err);\n }\n\n info.envelopeTime = envelopeTime - startTime;\n info.messageTime = Date.now() - envelopeTime;\n info.messageSize = stream.outByteCount;\n info.response = str;\n\n return callback(null, info);\n });\n if (typeof message.pipe === 'function') {\n message.pipe(stream);\n } else {\n stream.write(message);\n stream.end();\n }\n });\n }\n\n /**\n * Resets connection state\n *\n * @param {Function} callback Callback to return once connection is reset\n */\n reset(callback) {\n this._sendCommand('RSET');\n this._responseActions.push(str => {\n if (str.charAt(0) !== '2') {\n return callback(this._formatError('Could not reset session state. response=' + str, 'EPROTOCOL', str, 'RSET'));\n }\n this._envelope = false;\n return callback(null, true);\n });\n }\n\n /**\n * Connection listener that is run when the connection to\n * the server is opened\n *\n * @event\n */\n _onConnect() {\n clearTimeout(this._connectionTimeout);\n\n this.logger.info(\n {\n tnx: 'network',\n localAddress: this._socket.localAddress,\n localPort: this._socket.localPort,\n remoteAddress: this._socket.remoteAddress,\n remotePort: this._socket.remotePort\n },\n '%s established to %s:%s',\n this.secure ? 'Secure connection' : 'Connection',\n this._socket.remoteAddress,\n this._socket.remotePort\n );\n\n if (this._destroyed) {\n // Connection was established after we already had canceled it\n this.close();\n return;\n }\n\n this.stage = 'connected';\n\n // clear existing listeners for the socket\n this._socket.removeListener('data', this._onSocketData);\n this._socket.removeListener('timeout', this._onSocketTimeout);\n this._socket.removeListener('close', this._onSocketClose);\n this._socket.removeListener('end', this._onSocketEnd);\n\n this._socket.on('data', this._onSocketData);\n this._socket.once('close', this._onSocketClose);\n this._socket.once('end', this._onSocketEnd);\n\n this._socket.setTimeout(this.options.socketTimeout || SOCKET_TIMEOUT);\n this._socket.on('timeout', this._onSocketTimeout);\n\n this._greetingTimeout = setTimeout(() => {\n // if still waiting for greeting, give up\n if (this._socket && !this._destroyed && this._responseActions[0] === this._actionGreeting) {\n this._onError('Greeting never received', 'ETIMEDOUT', false, 'CONN');\n }\n }, this.options.greetingTimeout || GREETING_TIMEOUT);\n\n this._responseActions.push(this._actionGreeting);\n\n // we have a 'data' listener set up so resume socket if it was paused\n this._socket.resume();\n }\n\n /**\n * 'data' listener for data coming from the server\n *\n * @event\n * @param {Buffer} chunk Data chunk coming from the server\n */\n _onData(chunk) {\n if (this._destroyed || !chunk || !chunk.length) {\n return;\n }\n\n let data = (chunk || '').toString('binary');\n let lines = (this._remainder + data).split(/\\r?\\n/);\n let lastline;\n\n this._remainder = lines.pop();\n\n for (let i = 0, len = lines.length; i < len; i++) {\n if (this._responseQueue.length) {\n lastline = this._responseQueue[this._responseQueue.length - 1];\n if (/^\\d+-/.test(lastline.split('\\n').pop())) {\n this._responseQueue[this._responseQueue.length - 1] += '\\n' + lines[i];\n continue;\n }\n }\n this._responseQueue.push(lines[i]);\n }\n\n if (this._responseQueue.length) {\n lastline = this._responseQueue[this._responseQueue.length - 1];\n if (/^\\d+-/.test(lastline.split('\\n').pop())) {\n return;\n }\n }\n\n this._processResponse();\n }\n\n /**\n * 'error' listener for the socket\n *\n * @event\n * @param {Error} err Error object\n * @param {String} type Error name\n */\n _onError(err, type, data, command) {\n clearTimeout(this._connectionTimeout);\n clearTimeout(this._greetingTimeout);\n\n if (this._destroyed) {\n // just ignore, already closed\n // this might happen when a socket is canceled because of reached timeout\n // but the socket timeout error itself receives only after\n return;\n }\n\n err = this._formatError(err, type, data, command);\n\n const transientCodes = ['ETIMEDOUT', 'ESOCKET', 'ECONNECTION'];\n if (transientCodes.includes(err.code)) {\n this.logger.warn(data, err.message);\n } else {\n this.logger.error(data, err.message);\n }\n\n this.emit('error', err);\n this.close();\n }\n\n _formatError(message, type, response, command) {\n let err;\n\n if (/Error\\]$/i.test(Object.prototype.toString.call(message))) {\n err = message;\n } else {\n err = new Error(message);\n }\n\n if (type && type !== 'Error') {\n err.code = type;\n }\n\n if (response) {\n err.response = response;\n err.message += ': ' + response;\n }\n\n let responseCode = (typeof response === 'string' && Number((response.match(/^\\d+/) || [])[0])) || false;\n if (responseCode) {\n err.responseCode = responseCode;\n }\n\n if (command) {\n err.command = command;\n }\n\n return err;\n }\n\n /**\n * 'close' listener for the socket\n *\n * @event\n */\n _onClose() {\n let serverResponse = false;\n\n if (this._remainder && this._remainder.trim()) {\n if (this.options.debug || this.options.transactionLog) {\n this.logger.debug(\n {\n tnx: 'server'\n },\n this._remainder.replace(/\\r?\\n$/, '')\n );\n }\n this.lastServerResponse = serverResponse = this._remainder.trim();\n }\n\n this.logger.info(\n {\n tnx: 'network'\n },\n 'Connection closed'\n );\n\n if (this.upgrading && !this._destroyed) {\n return this._onError(new Error('Connection closed unexpectedly'), 'ETLS', serverResponse, 'CONN');\n } else if (![this._actionGreeting, this.close].includes(this._responseActions[0]) && !this._destroyed) {\n return this._onError(new Error('Connection closed unexpectedly'), 'ECONNECTION', serverResponse, 'CONN');\n } else if (/^[45]\\d{2}\\b/.test(serverResponse)) {\n return this._onError(new Error('Connection closed unexpectedly'), 'ECONNECTION', serverResponse, 'CONN');\n }\n\n this._destroy();\n }\n\n /**\n * 'end' listener for the socket\n *\n * @event\n */\n _onEnd() {\n if (this._socket && !this._socket.destroyed) {\n this._socket.destroy();\n }\n }\n\n /**\n * 'timeout' listener for the socket\n *\n * @event\n */\n _onTimeout() {\n return this._onError(new Error('Timeout'), 'ETIMEDOUT', false, 'CONN');\n }\n\n /**\n * Destroys the client, emits 'end'\n */\n _destroy() {\n if (this._destroyed) {\n return;\n }\n this._destroyed = true;\n this.emit('end');\n }\n\n /**\n * Upgrades the connection to TLS\n *\n * @param {Function} callback Callback function to run when the connection\n * has been secured\n */\n _upgradeConnection(callback) {\n // do not remove all listeners or it breaks node v0.10 as there's\n // apparently a 'finish' event set that would be cleared as well\n\n // we can safely keep 'error', 'end', 'close' etc. events\n this._socket.removeListener('data', this._onSocketData); // incoming data is going to be gibberish from this point onwards\n this._socket.removeListener('timeout', this._onSocketTimeout); // timeout will be re-set for the new socket object\n\n let socketPlain = this._socket;\n let opts = {\n socket: this._socket,\n host: this.host\n };\n\n Object.keys(this.options.tls || {}).forEach(key => {\n opts[key] = this.options.tls[key];\n });\n\n // ensure servername for SNI\n if (this.servername && !opts.servername) {\n opts.servername = this.servername;\n }\n\n this.upgrading = true;\n // tls.connect is not an asynchronous function however it may still throw errors and requires to be wrapped with try/catch\n try {\n this._socket = tls.connect(opts, () => {\n this.secure = true;\n this.upgrading = false;\n this._socket.on('data', this._onSocketData);\n\n socketPlain.removeListener('close', this._onSocketClose);\n socketPlain.removeListener('end', this._onSocketEnd);\n\n return callback(null, true);\n });\n } catch (err) {\n return callback(err);\n }\n\n this._socket.on('error', this._onSocketError);\n this._socket.once('close', this._onSocketClose);\n this._socket.once('end', this._onSocketEnd);\n\n this._socket.setTimeout(this.options.socketTimeout || SOCKET_TIMEOUT); // 10 min.\n this._socket.on('timeout', this._onSocketTimeout);\n\n // resume in case the socket was paused\n socketPlain.resume();\n }\n\n /**\n * Processes queued responses from the server\n *\n * @param {Boolean} force If true, ignores _processing flag\n */\n _processResponse() {\n if (!this._responseQueue.length) {\n return false;\n }\n\n let str = (this.lastServerResponse = (this._responseQueue.shift() || '').toString());\n\n if (/^\\d+-/.test(str.split('\\n').pop())) {\n // keep waiting for the final part of multiline response\n return;\n }\n\n if (this.options.debug || this.options.transactionLog) {\n this.logger.debug(\n {\n tnx: 'server'\n },\n str.replace(/\\r?\\n$/, '')\n );\n }\n\n if (!str.trim()) {\n // skip unexpected empty lines\n setImmediate(() => this._processResponse());\n }\n\n let action = this._responseActions.shift();\n\n if (typeof action === 'function') {\n action.call(this, str);\n setImmediate(() => this._processResponse());\n } else {\n return this._onError(new Error('Unexpected Response'), 'EPROTOCOL', str, 'CONN');\n }\n }\n\n /**\n * Send a command to the server, append \\r\\n\n *\n * @param {String} str String to be sent to the server\n * @param {String} logStr Optional string to be used for logging instead of the actual string\n */\n _sendCommand(str, logStr) {\n if (this._destroyed) {\n // Connection already closed, can't send any more data\n return;\n }\n\n if (this._socket.destroyed) {\n return this.close();\n }\n\n if (this.options.debug || this.options.transactionLog) {\n this.logger.debug(\n {\n tnx: 'client'\n },\n (logStr || str || '').toString().replace(/\\r?\\n$/, '')\n );\n }\n\n this._socket.write(Buffer.from(str + '\\r\\n', 'utf-8'));\n }\n\n /**\n * Initiates a new message by submitting envelope data, starting with\n * MAIL FROM: command\n *\n * @param {Object} envelope Envelope object in the form of\n * {from:'...', to:['...']}\n * or\n * {from:{address:'...',name:'...'}, to:[address:'...',name:'...']}\n */\n _setEnvelope(envelope, callback) {\n let args = [];\n let useSmtpUtf8 = false;\n\n this._envelope = envelope || {};\n this._envelope.from = ((this._envelope.from && this._envelope.from.address) || this._envelope.from || '').toString().trim();\n\n this._envelope.to = [].concat(this._envelope.to || []).map(to => ((to && to.address) || to || '').toString().trim());\n\n if (!this._envelope.to.length) {\n return callback(this._formatError('No recipients defined', 'EENVELOPE', false, 'API'));\n }\n\n if (this._envelope.from && /[\\r\\n<>]/.test(this._envelope.from)) {\n return callback(this._formatError('Invalid sender ' + JSON.stringify(this._envelope.from), 'EENVELOPE', false, 'API'));\n }\n\n // check if the sender address uses only ASCII characters,\n // otherwise require usage of SMTPUTF8 extension\n if (/[\\x80-\\uFFFF]/.test(this._envelope.from)) {\n useSmtpUtf8 = true;\n }\n\n for (let i = 0, len = this._envelope.to.length; i < len; i++) {\n if (!this._envelope.to[i] || /[\\r\\n<>]/.test(this._envelope.to[i])) {\n return callback(this._formatError('Invalid recipient ' + JSON.stringify(this._envelope.to[i]), 'EENVELOPE', false, 'API'));\n }\n\n // check if the recipients addresses use only ASCII characters,\n // otherwise require usage of SMTPUTF8 extension\n if (/[\\x80-\\uFFFF]/.test(this._envelope.to[i])) {\n useSmtpUtf8 = true;\n }\n }\n\n // clone the recipients array for latter manipulation\n this._envelope.rcptQueue = JSON.parse(JSON.stringify(this._envelope.to || []));\n this._envelope.rejected = [];\n this._envelope.rejectedErrors = [];\n this._envelope.accepted = [];\n\n if (this._envelope.dsn) {\n try {\n this._envelope.dsn = this._setDsnEnvelope(this._envelope.dsn);\n } catch (err) {\n return callback(this._formatError('Invalid DSN ' + err.message, 'EENVELOPE', false, 'API'));\n }\n }\n\n this._responseActions.push(str => {\n this._actionMAIL(str, callback);\n });\n\n // If the server supports SMTPUTF8 and the envelope includes an internationalized\n // email address then append SMTPUTF8 keyword to the MAIL FROM command\n if (useSmtpUtf8 && this._supportedExtensions.includes('SMTPUTF8')) {\n args.push('SMTPUTF8');\n this._usingSmtpUtf8 = true;\n }\n\n // If the server supports 8BITMIME and the message might contain non-ascii bytes\n // then append the 8BITMIME keyword to the MAIL FROM command\n if (this._envelope.use8BitMime && this._supportedExtensions.includes('8BITMIME')) {\n args.push('BODY=8BITMIME');\n this._using8BitMime = true;\n }\n\n if (this._envelope.size && this._supportedExtensions.includes('SIZE')) {\n args.push('SIZE=' + this._envelope.size);\n }\n\n // If the server supports DSN and the envelope includes an DSN prop\n // then append DSN params to the MAIL FROM command\n if (this._envelope.dsn && this._supportedExtensions.includes('DSN')) {\n if (this._envelope.dsn.ret) {\n args.push('RET=' + shared.encodeXText(this._envelope.dsn.ret));\n }\n if (this._envelope.dsn.envid) {\n args.push('ENVID=' + shared.encodeXText(this._envelope.dsn.envid));\n }\n }\n\n // RFC 8689: If the envelope requests REQUIRETLS extension\n // then append REQUIRETLS keyword to the MAIL FROM command\n // Note: REQUIRETLS can only be used over TLS connections and requires server support\n if (this._envelope.requireTLSExtensionEnabled) {\n if (!this.secure) {\n return callback(\n this._formatError('REQUIRETLS can only be used over TLS connections (RFC 8689)', 'EREQUIRETLS', false, 'MAIL FROM')\n );\n }\n if (!this._supportedExtensions.includes('REQUIRETLS')) {\n return callback(\n this._formatError('Server does not support REQUIRETLS extension (RFC 8689)', 'EREQUIRETLS', false, 'MAIL FROM')\n );\n }\n args.push('REQUIRETLS');\n }\n\n this._sendCommand('MAIL FROM:<' + this._envelope.from + '>' + (args.length ? ' ' + args.join(' ') : ''));\n }\n\n _setDsnEnvelope(params) {\n let ret = (params.ret || params.return || '').toString().toUpperCase() || null;\n if (ret) {\n switch (ret) {\n case 'HDRS':\n case 'HEADERS':\n ret = 'HDRS';\n break;\n case 'FULL':\n case 'BODY':\n ret = 'FULL';\n break;\n }\n }\n\n if (ret && !['FULL', 'HDRS'].includes(ret)) {\n throw new Error('ret: ' + JSON.stringify(ret));\n }\n\n let envid = (params.envid || params.id || '').toString() || null;\n\n let notify = params.notify || null;\n if (notify) {\n if (typeof notify === 'string') {\n notify = notify.split(',');\n }\n notify = notify.map(n => n.trim().toUpperCase());\n let validNotify = ['NEVER', 'SUCCESS', 'FAILURE', 'DELAY'];\n let invalidNotify = notify.filter(n => !validNotify.includes(n));\n if (invalidNotify.length || (notify.length > 1 && notify.includes('NEVER'))) {\n throw new Error('notify: ' + JSON.stringify(notify.join(',')));\n }\n notify = notify.join(',');\n }\n\n let orcpt = (params.recipient || params.orcpt || '').toString() || null;\n if (orcpt && orcpt.indexOf(';') < 0) {\n orcpt = 'rfc822;' + orcpt;\n }\n\n return {\n ret,\n envid,\n notify,\n orcpt\n };\n }\n\n _getDsnRcptToArgs() {\n let args = [];\n // If the server supports DSN and the envelope includes an DSN prop\n // then append DSN params to the RCPT TO command\n if (this._envelope.dsn && this._supportedExtensions.includes('DSN')) {\n if (this._envelope.dsn.notify) {\n args.push('NOTIFY=' + shared.encodeXText(this._envelope.dsn.notify));\n }\n if (this._envelope.dsn.orcpt) {\n args.push('ORCPT=' + shared.encodeXText(this._envelope.dsn.orcpt));\n }\n }\n return args.length ? ' ' + args.join(' ') : '';\n }\n\n _createSendStream(callback) {\n let dataStream = new DataStream();\n let logStream;\n\n if (this.options.lmtp) {\n this._envelope.accepted.forEach((recipient, i) => {\n let final = i === this._envelope.accepted.length - 1;\n this._responseActions.push(str => {\n this._actionLMTPStream(recipient, final, str, callback);\n });\n });\n } else {\n this._responseActions.push(str => {\n this._actionSMTPStream(str, callback);\n });\n }\n\n dataStream.pipe(this._socket, {\n end: false\n });\n\n if (this.options.debug) {\n logStream = new PassThrough();\n logStream.on('readable', () => {\n let chunk;\n while ((chunk = logStream.read())) {\n this.logger.debug(\n {\n tnx: 'message'\n },\n chunk.toString('binary').replace(/\\r?\\n$/, '')\n );\n }\n });\n dataStream.pipe(logStream);\n }\n\n dataStream.once('end', () => {\n this.logger.info(\n {\n tnx: 'message',\n inByteCount: dataStream.inByteCount,\n outByteCount: dataStream.outByteCount\n },\n '<%s bytes encoded mime message (source size %s bytes)>',\n dataStream.outByteCount,\n dataStream.inByteCount\n );\n });\n\n return dataStream;\n }\n\n /** ACTIONS **/\n\n /**\n * Will be run after the connection is created and the server sends\n * a greeting. If the incoming message starts with 220 initiate\n * SMTP session by sending EHLO command\n *\n * @param {String} str Message from the server\n */\n _actionGreeting(str) {\n clearTimeout(this._greetingTimeout);\n\n if (str.substr(0, 3) !== '220') {\n this._onError(new Error('Invalid greeting. response=' + str), 'EPROTOCOL', str, 'CONN');\n return;\n }\n\n if (this.options.lmtp) {\n this._responseActions.push(this._actionLHLO);\n this._sendCommand('LHLO ' + this.name);\n } else {\n this._responseActions.push(this._actionEHLO);\n this._sendCommand('EHLO ' + this.name);\n }\n }\n\n /**\n * Handles server response for LHLO command. If it yielded in\n * error, emit 'error', otherwise treat this as an EHLO response\n *\n * @param {String} str Message from the server\n */\n _actionLHLO(str) {\n if (str.charAt(0) !== '2') {\n this._onError(new Error('Invalid LHLO. response=' + str), 'EPROTOCOL', str, 'LHLO');\n return;\n }\n\n this._actionEHLO(str);\n }\n\n /**\n * Handles server response for EHLO command. If it yielded in\n * error, try HELO instead, otherwise initiate TLS negotiation\n * if STARTTLS is supported by the server or move into the\n * authentication phase.\n *\n * @param {String} str Message from the server\n */\n _actionEHLO(str) {\n let match;\n\n if (str.substr(0, 3) === '421') {\n this._onError(new Error('Server terminates connection. response=' + str), 'ECONNECTION', str, 'EHLO');\n return;\n }\n\n if (str.charAt(0) !== '2') {\n if (this.options.requireTLS) {\n this._onError(\n new Error('EHLO failed but HELO does not support required STARTTLS. response=' + str),\n 'ECONNECTION',\n str,\n 'EHLO'\n );\n return;\n }\n\n // Try HELO instead\n this._responseActions.push(this._actionHELO);\n this._sendCommand('HELO ' + this.name);\n return;\n }\n\n this._ehloLines = str\n .split(/\\r?\\n/)\n .map(line => line.replace(/^\\d+[ -]/, '').trim())\n .filter(line => line)\n .slice(1);\n\n // Detect if the server supports STARTTLS\n if (!this.secure && !this.options.ignoreTLS && (/[ -]STARTTLS\\b/im.test(str) || this.options.requireTLS)) {\n this._sendCommand('STARTTLS');\n this._responseActions.push(this._actionSTARTTLS);\n return;\n }\n\n // Detect if the server supports SMTPUTF8\n if (/[ -]SMTPUTF8\\b/im.test(str)) {\n this._supportedExtensions.push('SMTPUTF8');\n }\n\n // Detect if the server supports DSN\n if (/[ -]DSN\\b/im.test(str)) {\n this._supportedExtensions.push('DSN');\n }\n\n // Detect if the server supports 8BITMIME\n if (/[ -]8BITMIME\\b/im.test(str)) {\n this._supportedExtensions.push('8BITMIME');\n }\n\n // Detect if the server supports REQUIRETLS (RFC 8689)\n if (/[ -]REQUIRETLS\\b/im.test(str)) {\n this._supportedExtensions.push('REQUIRETLS');\n }\n\n // Detect if the server supports PIPELINING\n if (/[ -]PIPELINING\\b/im.test(str)) {\n this._supportedExtensions.push('PIPELINING');\n }\n\n // Detect if the server supports AUTH\n if (/[ -]AUTH\\b/i.test(str)) {\n this.allowsAuth = true;\n }\n\n // Detect if the server supports PLAIN auth\n if (/[ -]AUTH(?:(\\s+|=)[^\\n]*\\s+|\\s+|=)PLAIN/i.test(str)) {\n this._supportedAuth.push('PLAIN');\n }\n\n // Detect if the server supports LOGIN auth\n if (/[ -]AUTH(?:(\\s+|=)[^\\n]*\\s+|\\s+|=)LOGIN/i.test(str)) {\n this._supportedAuth.push('LOGIN');\n }\n\n // Detect if the server supports CRAM-MD5 auth\n if (/[ -]AUTH(?:(\\s+|=)[^\\n]*\\s+|\\s+|=)CRAM-MD5/i.test(str)) {\n this._supportedAuth.push('CRAM-MD5');\n }\n\n // Detect if the server supports XOAUTH2 auth\n if (/[ -]AUTH(?:(\\s+|=)[^\\n]*\\s+|\\s+|=)XOAUTH2/i.test(str)) {\n this._supportedAuth.push('XOAUTH2');\n }\n\n // Detect if the server supports SIZE extensions (and the max allowed size)\n if ((match = str.match(/[ -]SIZE(?:[ \\t]+(\\d+))?/im))) {\n this._supportedExtensions.push('SIZE');\n this._maxAllowedSize = Number(match[1]) || 0;\n }\n\n this.emit('connect');\n }\n\n /**\n * Handles server response for HELO command. If it yielded in\n * error, emit 'error', otherwise move into the authentication phase.\n *\n * @param {String} str Message from the server\n */\n _actionHELO(str) {\n if (str.charAt(0) !== '2') {\n this._onError(new Error('Invalid HELO. response=' + str), 'EPROTOCOL', str, 'HELO');\n return;\n }\n\n // assume that authentication is enabled (most probably is not though)\n this.allowsAuth = true;\n\n this.emit('connect');\n }\n\n /**\n * Handles server response for STARTTLS command. If there's an error\n * try HELO instead, otherwise initiate TLS upgrade. If the upgrade\n * succeedes restart the EHLO\n *\n * @param {String} str Message from the server\n */\n _actionSTARTTLS(str) {\n if (str.charAt(0) !== '2') {\n if (this.options.opportunisticTLS) {\n this.logger.info(\n {\n tnx: 'smtp'\n },\n 'Failed STARTTLS upgrade, continuing unencrypted'\n );\n return this.emit('connect');\n }\n this._onError(new Error('Error upgrading connection with STARTTLS'), 'ETLS', str, 'STARTTLS');\n return;\n }\n\n this._upgradeConnection((err, secured) => {\n if (err) {\n this._onError(new Error('Error initiating TLS - ' + (err.message || err)), 'ETLS', false, 'STARTTLS');\n return;\n }\n\n this.logger.info(\n {\n tnx: 'smtp'\n },\n 'Connection upgraded with STARTTLS'\n );\n\n if (secured) {\n // restart session\n if (this.options.lmtp) {\n this._responseActions.push(this._actionLHLO);\n this._sendCommand('LHLO ' + this.name);\n } else {\n this._responseActions.push(this._actionEHLO);\n this._sendCommand('EHLO ' + this.name);\n }\n } else {\n this.emit('connect');\n }\n });\n }\n\n /**\n * Handle the response for AUTH LOGIN command. We are expecting\n * '334 VXNlcm5hbWU6' (base64 for 'Username:'). Data to be sent as\n * response needs to be base64 encoded username. We do not need\n * exact match but settle with 334 response in general as some\n * hosts invalidly use a longer message than VXNlcm5hbWU6\n *\n * @param {String} str Message from the server\n */\n _actionAUTH_LOGIN_USER(str, callback) {\n if (!/^334[ -]/.test(str)) {\n // expecting '334 VXNlcm5hbWU6'\n callback(this._formatError('Invalid login sequence while waiting for \"334 VXNlcm5hbWU6\"', 'EAUTH', str, 'AUTH LOGIN'));\n return;\n }\n\n this._responseActions.push(str => {\n this._actionAUTH_LOGIN_PASS(str, callback);\n });\n\n this._sendCommand(Buffer.from(this._auth.credentials.user + '', 'utf-8').toString('base64'));\n }\n\n /**\n * Handle the response for AUTH CRAM-MD5 command. We are expecting\n * '334 <challenge string>'. Data to be sent as response needs to be\n * base64 decoded challenge string, MD5 hashed using the password as\n * a HMAC key, prefixed by the username and a space, and finally all\n * base64 encoded again.\n *\n * @param {String} str Message from the server\n */\n _actionAUTH_CRAM_MD5(str, callback) {\n let challengeMatch = str.match(/^334\\s+(.+)$/);\n let challengeString = '';\n\n if (!challengeMatch) {\n return callback(\n this._formatError('Invalid login sequence while waiting for server challenge string', 'EAUTH', str, 'AUTH CRAM-MD5')\n );\n } else {\n challengeString = challengeMatch[1];\n }\n\n // Decode from base64\n let base64decoded = Buffer.from(challengeString, 'base64').toString('ascii'),\n hmacMD5 = crypto.createHmac('md5', this._auth.credentials.pass);\n\n hmacMD5.update(base64decoded);\n\n let prepended = this._auth.credentials.user + ' ' + hmacMD5.digest('hex');\n\n this._responseActions.push(str => {\n this._actionAUTH_CRAM_MD5_PASS(str, callback);\n });\n\n this._sendCommand(\n Buffer.from(prepended).toString('base64'),\n // hidden hash for logs\n Buffer.from(this._auth.credentials.user + ' /* secret */').toString('base64')\n );\n }\n\n /**\n * Handles the response to CRAM-MD5 authentication, if there's no error,\n * the user can be considered logged in. Start waiting for a message to send\n *\n * @param {String} str Message from the server\n */\n _actionAUTH_CRAM_MD5_PASS(str, callback) {\n if (!str.match(/^235\\s+/)) {\n return callback(this._formatError('Invalid login sequence while waiting for \"235\"', 'EAUTH', str, 'AUTH CRAM-MD5'));\n }\n\n this.logger.info(\n {\n tnx: 'smtp',\n username: this._auth.user,\n action: 'authenticated',\n method: this._authMethod\n },\n 'User %s authenticated',\n JSON.stringify(this._auth.user)\n );\n this.authenticated = true;\n callback(null, true);\n }\n\n /**\n * Handle the response for AUTH LOGIN command. We are expecting\n * '334 UGFzc3dvcmQ6' (base64 for 'Password:'). Data to be sent as\n * response needs to be base64 encoded password.\n *\n * @param {String} str Message from the server\n */\n _actionAUTH_LOGIN_PASS(str, callback) {\n if (!/^334[ -]/.test(str)) {\n // expecting '334 UGFzc3dvcmQ6'\n return callback(this._formatError('Invalid login sequence while waiting for \"334 UGFzc3dvcmQ6\"', 'EAUTH', str, 'AUTH LOGIN'));\n }\n\n this._responseActions.push(str => {\n this._actionAUTHComplete(str, callback);\n });\n\n this._sendCommand(\n Buffer.from((this._auth.credentials.pass || '').toString(), 'utf-8').toString('base64'),\n // Hidden pass for logs\n Buffer.from('/* secret */', 'utf-8').toString('base64')\n );\n }\n\n /**\n * Handles the response for authentication, if there's no error,\n * the user can be considered logged in. Start waiting for a message to send\n *\n * @param {String} str Message from the server\n */\n _actionAUTHComplete(str, isRetry, callback) {\n if (!callback && typeof isRetry === 'function') {\n callback = isRetry;\n isRetry = false;\n }\n\n if (str.substr(0, 3) === '334') {\n this._responseActions.push(str => {\n if (isRetry || this._authMethod !== 'XOAUTH2') {\n this._actionAUTHComplete(str, true, callback);\n } else {\n // fetch a new OAuth2 access token\n setImmediate(() => this._handleXOauth2Token(true, callback));\n }\n });\n this._sendCommand('');\n return;\n }\n\n if (str.charAt(0) !== '2') {\n this.logger.info(\n {\n tnx: 'smtp',\n username: this._auth.user,\n action: 'authfail',\n method: this._authMethod\n },\n 'User %s failed to authenticate',\n JSON.stringify(this._auth.user)\n );\n return callback(this._formatError('Invalid login', 'EAUTH', str, 'AUTH ' + this._authMethod));\n }\n\n this.logger.info(\n {\n tnx: 'smtp',\n username: this._auth.user,\n action: 'authenticated',\n method: this._authMethod\n },\n 'User %s authenticated',\n JSON.stringify(this._auth.user)\n );\n this.authenticated = true;\n callback(null, true);\n }\n\n /**\n * Handle response for a MAIL FROM: command\n *\n * @param {String} str Message from the server\n */\n _actionMAIL(str, callback) {\n let message, curRecipient;\n if (Number(str.charAt(0)) !== 2) {\n if (this._usingSmtpUtf8 && /^550 /.test(str) && /[\\x80-\\uFFFF]/.test(this._envelope.from)) {\n message = 'Internationalized mailbox name not allowed';\n } else {\n message = 'Mail command failed';\n }\n return callback(this._formatError(message, 'EENVELOPE', str, 'MAIL FROM'));\n }\n\n if (!this._envelope.rcptQueue.length) {\n return callback(this._formatError(\"Can't send mail - no recipients defined\", 'EENVELOPE', false, 'API'));\n } else {\n this._recipientQueue = [];\n\n if (this._supportedExtensions.includes('PIPELINING')) {\n while (this._envelope.rcptQueue.length) {\n curRecipient = this._envelope.rcptQueue.shift();\n this._recipientQueue.push(curRecipient);\n this._responseActions.push(str => {\n this._actionRCPT(str, callback);\n });\n this._sendCommand('RCPT TO:<' + curRecipient + '>' + this._getDsnRcptToArgs());\n }\n } else {\n curRecipient = this._envelope.rcptQueue.shift();\n this._recipientQueue.push(curRecipient);\n this._responseActions.push(str => {\n this._actionRCPT(str, callback);\n });\n this._sendCommand('RCPT TO:<' + curRecipient + '>' + this._getDsnRcptToArgs());\n }\n }\n }\n\n /**\n * Handle response for a RCPT TO: command\n *\n * @param {String} str Message from the server\n */\n _actionRCPT(str, callback) {\n let message,\n err,\n curRecipient = this._recipientQueue.shift();\n if (Number(str.charAt(0)) !== 2) {\n // this is a soft error\n if (this._usingSmtpUtf8 && /^553 /.test(str) && /[\\x80-\\uFFFF]/.test(curRecipient)) {\n message = 'Internationalized mailbox name not allowed';\n } else {\n message = 'Recipient command failed';\n }\n this._envelope.rejected.push(curRecipient);\n // store error for the failed recipient\n err = this._formatError(message, 'EENVELOPE', str, 'RCPT TO');\n err.recipient = curRecipient;\n this._envelope.rejectedErrors.push(err);\n } else {\n this._envelope.accepted.push(curRecipient);\n }\n\n if (!this._envelope.rcptQueue.length && !this._recipientQueue.length) {\n if (this._envelope.rejected.length < this._envelope.to.length) {\n this._responseActions.push(str => {\n this._actionDATA(str, callback);\n });\n this._sendCommand('DATA');\n } else {\n err = this._formatError(\"Can't send mail - all recipients were rejected\", 'EENVELOPE', str, 'RCPT TO');\n err.rejected = this._envelope.rejected;\n err.rejectedErrors = this._envelope.rejectedErrors;\n return callback(err);\n }\n } else if (this._envelope.rcptQueue.length) {\n curRecipient = this._envelope.rcptQueue.shift();\n this._recipientQueue.push(curRecipient);\n this._responseActions.push(str => {\n this._actionRCPT(str, callback);\n });\n this._sendCommand('RCPT TO:<' + curRecipient + '>' + this._getDsnRcptToArgs());\n }\n }\n\n /**\n * Handle response for a DATA command\n *\n * @param {String} str Message from the server\n */\n _actionDATA(str, callback) {\n // response should be 354 but according to this issue https://github.com/eleith/emailjs/issues/24\n // some servers might use 250 instead, so lets check for 2 or 3 as the first digit\n if (!/^[23]/.test(str)) {\n return callback(this._formatError('Data command failed', 'EENVELOPE', str, 'DATA'));\n }\n\n let response = {\n accepted: this._envelope.accepted,\n rejected: this._envelope.rejected\n };\n\n if (this._ehloLines && this._ehloLines.length) {\n response.ehlo = this._ehloLines;\n }\n\n if (this._envelope.rejectedErrors.length) {\n response.rejectedErrors = this._envelope.rejectedErrors;\n }\n\n callback(null, response);\n }\n\n /**\n * Handle response for a DATA stream when using SMTP\n * We expect a single response that defines if the sending succeeded or failed\n *\n * @param {String} str Message from the server\n */\n _actionSMTPStream(str, callback) {\n if (Number(str.charAt(0)) !== 2) {\n // Message failed\n return callback(this._formatError('Message failed', 'EMESSAGE', str, 'DATA'));\n } else {\n // Message sent succesfully\n return callback(null, str);\n }\n }\n\n /**\n * Handle response for a DATA stream\n * We expect a separate response for every recipient. All recipients can either\n * succeed or fail separately\n *\n * @param {String} recipient The recipient this response applies to\n * @param {Boolean} final Is this the final recipient?\n * @param {String} str Message from the server\n */\n _actionLMTPStream(recipient, final, str, callback) {\n let err;\n if (Number(str.charAt(0)) !== 2) {\n // Message failed\n err = this._formatError('Message failed for recipient ' + recipient, 'EMESSAGE', str, 'DATA');\n err.recipient = recipient;\n this._envelope.rejected.push(recipient);\n this._envelope.rejectedErrors.push(err);\n for (let i = 0, len = this._envelope.accepted.length; i < len; i++) {\n if (this._envelope.accepted[i] === recipient) {\n this._envelope.accepted.splice(i, 1);\n }\n }\n }\n if (final) {\n return callback(null, str);\n }\n }\n\n _handleXOauth2Token(isRetry, callback) {\n this._auth.oauth2.getToken(isRetry, (err, accessToken) => {\n if (err) {\n this.logger.info(\n {\n tnx: 'smtp',\n username: this._auth.user,\n action: 'authfail',\n method: this._authMethod\n },\n 'User %s failed to authenticate',\n JSON.stringify(this._auth.user)\n );\n return callback(this._formatError(err, 'EAUTH', false, 'AUTH XOAUTH2'));\n }\n this._responseActions.push(str => {\n this._actionAUTHComplete(str, isRetry, callback);\n });\n this._sendCommand(\n 'AUTH XOAUTH2 ' + this._auth.oauth2.buildXOAuth2Token(accessToken),\n // Hidden for logs\n 'AUTH XOAUTH2 ' + this._auth.oauth2.buildXOAuth2Token('/* secret */')\n );\n });\n }\n\n /**\n *\n * @param {string} command\n * @private\n */\n _isDestroyedMessage(command) {\n if (this._destroyed) {\n return 'Cannot ' + command + ' - smtp connection is already destroyed.';\n }\n\n if (this._socket) {\n if (this._socket.destroyed) {\n return 'Cannot ' + command + ' - smtp connection socket is already destroyed.';\n }\n\n if (!this._socket.writable) {\n return 'Cannot ' + command + ' - smtp connection socket is already half-closed.';\n }\n }\n }\n\n _getHostname() {\n // defaul hostname is machine hostname or [IP]\n let defaultHostname;\n try {\n defaultHostname = os.hostname() || '';\n } catch (_err) {\n // fails on windows 7\n defaultHostname = 'localhost';\n }\n\n // ignore if not FQDN\n if (!defaultHostname || defaultHostname.indexOf('.') < 0) {\n defaultHostname = '[127.0.0.1]';\n }\n\n // IP should be enclosed in []\n if (defaultHostname.match(/^\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}$/)) {\n defaultHostname = '[' + defaultHostname + ']';\n }\n\n return defaultHostname;\n }\n}\n\nmodule.exports = SMTPConnection;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFjdGlvbi1icm93c2VyKS8uL25vZGVfbW9kdWxlcy8ucG5wbS9ub2RlbWFpbGVyQDcuMC4xMy9ub2RlX21vZHVsZXMvbm9kZW1haWxlci9saWIvc210cC1jb25uZWN0aW9uL2luZGV4LmpzIiwibWFwcGluZ3MiOiJBQUFhOztBQUViLG9CQUFvQixtQkFBTyxDQUFDLHdIQUFvQjtBQUNoRCxxQkFBcUIsMERBQThCO0FBQ25ELFlBQVksbUJBQU8sQ0FBQyxnQkFBSztBQUN6QixZQUFZLG1CQUFPLENBQUMsZ0JBQUs7QUFDekIsV0FBVyxtQkFBTyxDQUFDLGNBQUk7QUFDdkIsZUFBZSxtQkFBTyxDQUFDLHNCQUFRO0FBQy9CLG1CQUFtQixtQkFBTyxDQUFDLHlJQUFlO0FBQzFDLG9CQUFvQix5REFBNkI7QUFDakQsZUFBZSxtQkFBTyxDQUFDLHNIQUFXOztBQUVsQztBQUNBLDBDQUEwQztBQUMxQyx1Q0FBdUM7QUFDdkMsb0NBQW9DO0FBQ3BDLCtCQUErQjs7QUFFL0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBLGlEQUFpRDtBQUNqRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0Esa0JBQWtCO0FBQ2xCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGtCQUFrQjtBQUNsQjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGtCQUFrQjtBQUNsQjtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQjtBQUNBO0FBQ0E7QUFDQSxhQUFhOztBQUViO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxhQUFhOztBQUViO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQjtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQjtBQUNBLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0EsYUFBYTtBQUNiLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7QUFDQSxrQkFBa0I7QUFDbEI7QUFDQTtBQUNBLGFBQWE7QUFDYixVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7QUFDQSxrQkFBa0I7QUFDbEI7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSx5QkFBeUI7QUFDekI7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMEJBQTBCO0FBQzFCO0FBQ0EsNkNBQTZDO0FBQzdDO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7O0FBRUE7QUFDQSxpQkFBaUI7O0FBRWpCO0FBQ0E7QUFDQSxhQUFhOztBQUViO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLFFBQVEsMkJBQTJCO0FBQ2xELGVBQWUsUUFBUTtBQUN2QixlQUFlLFVBQVU7QUFDekI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsZUFBZSxVQUFVO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTOztBQUVUOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsUUFBUTtBQUN2QjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQSw0Q0FBNEMsU0FBUztBQUNyRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLE9BQU87QUFDdEIsZUFBZSxRQUFRO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0EsVUFBVSxrQkFBa0IsRUFBRTtBQUM5QjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLFVBQVU7QUFDekI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGlFQUFpRTtBQUNqRSx1RUFBdUU7O0FBRXZFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsMENBQTBDO0FBQzFDO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0EsYUFBYTtBQUNiLFVBQVU7QUFDVjtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSwrRUFBK0U7QUFDL0U7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsU0FBUztBQUN4QjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsUUFBUTtBQUN2QixlQUFlLFFBQVE7QUFDdkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsUUFBUTtBQUN2QixlQUFlO0FBQ2Y7QUFDQSxlQUFlLE1BQU0seUJBQXlCO0FBQzlDO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLHdEQUF3RCxTQUFTO0FBQ2pFO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxxQ0FBcUM7QUFDckMsNEJBQTRCO0FBQzVCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakIsYUFBYTtBQUNiLFVBQVU7QUFDVjtBQUNBO0FBQ0EsYUFBYTtBQUNiOztBQUVBO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5QkFBeUI7QUFDekI7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLFFBQVE7QUFDdkI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsUUFBUTtBQUN2QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLFFBQVE7QUFDdkI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxRQUFRO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsUUFBUTtBQUN2QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0I7QUFDbEI7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLFFBQVE7QUFDdkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsUUFBUTtBQUN2QjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLFFBQVE7QUFDdkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLFFBQVE7QUFDdkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsUUFBUTtBQUN2QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0I7QUFDbEI7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsZUFBZSxRQUFRO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsVUFBVTtBQUNWOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQjtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsUUFBUTtBQUN2QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLFFBQVE7QUFDdkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxRQUFRO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsUUFBUTtBQUN2QixlQUFlLFNBQVM7QUFDeEIsZUFBZSxRQUFRO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtFQUFrRSxTQUFTO0FBQzNFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDs7QUFFQTtBQUNBO0FBQ0EsZUFBZSxRQUFRO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsdUNBQXVDLElBQUksS0FBSyxJQUFJLEtBQUssSUFBSSxLQUFLLElBQUk7QUFDdEU7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEiLCJzb3VyY2VzIjpbIi9Vc2Vycy9tYXJjbWludGVsL1Byb2plY3RzL2UtdGliLmNvbS9ub2RlX21vZHVsZXMvLnBucG0vbm9kZW1haWxlckA3LjAuMTMvbm9kZV9tb2R1bGVzL25vZGVtYWlsZXIvbGliL3NtdHAtY29ubmVjdGlvbi9pbmRleC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbmNvbnN0IHBhY2thZ2VJbmZvID0gcmVxdWlyZSgnLi4vLi4vcGFja2FnZS5qc29uJyk7XG5jb25zdCBFdmVudEVtaXR0ZXIgPSByZXF1aXJlKCdldmVudHMnKS5FdmVudEVtaXR0ZXI7XG5jb25zdCBuZXQgPSByZXF1aXJlKCduZXQnKTtcbmNvbnN0IHRscyA9IHJlcXVpcmUoJ3RscycpO1xuY29uc3Qgb3MgPSByZXF1aXJlKCdvcycpO1xuY29uc3QgY3J5cHRvID0gcmVxdWlyZSgnY3J5cHRvJyk7XG5jb25zdCBEYXRhU3RyZWFtID0gcmVxdWlyZSgnLi9kYXRhLXN0cmVhbScpO1xuY29uc3QgUGFzc1Rocm91Z2ggPSByZXF1aXJlKCdzdHJlYW0nKS5QYXNzVGhyb3VnaDtcbmNvbnN0IHNoYXJlZCA9IHJlcXVpcmUoJy4uL3NoYXJlZCcpO1xuXG4vLyBkZWZhdWx0IHRpbWVvdXQgdmFsdWVzIGluIG1zXG5jb25zdCBDT05ORUNUSU9OX1RJTUVPVVQgPSAyICogNjAgKiAxMDAwOyAvLyBob3cgbXVjaCB0byB3YWl0IGZvciB0aGUgY29ubmVjdGlvbiB0byBiZSBlc3RhYmxpc2hlZFxuY29uc3QgU09DS0VUX1RJTUVPVVQgPSAxMCAqIDYwICogMTAwMDsgLy8gaG93IG11Y2ggdG8gd2FpdCBmb3Igc29ja2V0IGluYWN0aXZpdHkgYmVmb3JlIGRpc2Nvbm5lY3RpbmcgdGhlIGNsaWVudFxuY29uc3QgR1JFRVRJTkdfVElNRU9VVCA9IDMwICogMTAwMDsgLy8gaG93IG11Y2ggdG8gd2FpdCBhZnRlciBjb25uZWN0aW9uIGlzIGVzdGFibGlzaGVkIGJ1dCBTTVRQIGdyZWV0aW5nIGlzIG5vdCByZWNlaWV2ZWRcbmNvbnN0IEROU19USU1FT1VUID0gMzAgKiAxMDAwOyAvLyBob3cgbXVjaCB0byB3YWl0IGZvciByZXNvbHZlSG9zdG5hbWVcblxuLyoqXG4gKiBHZW5lcmF0ZXMgYSBTTVRQIGNvbm5lY3Rpb24gb2JqZWN0XG4gKlxuICogT3B0aW9uYWwgb3B0aW9ucyBvYmplY3QgdGFrZXMgdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBwcm9wZXJ0aWVzOlxuICpcbiAqICAqICoqcG9ydCoqIC0gaXMgdGhlIHBvcnQgdG8gY29ubmVjdCB0byAoZGVmYXVsdHMgdG8gNTg3IG9yIDQ2NSlcbiAqICAqICoqaG9zdCoqIC0gaXMgdGhlIGhvc3RuYW1lIG9yIElQIGFkZHJlc3MgdG8gY29ubmVjdCB0byAoZGVmYXVsdHMgdG8gJ2xvY2FsaG9zdCcpXG4gKiAgKiAqKnNlY3VyZSoqIC0gdXNlIFNTTFxuICogICogKippZ25vcmVUTFMqKiAtIGlnbm9yZSBzZXJ2ZXIgc3VwcG9ydCBmb3IgU1RBUlRUTFNcbiAqICAqICoqcmVxdWlyZVRMUyoqIC0gZm9yY2VzIHRoZSBjbGllbnQgdG8gdXNlIFNUQVJUVExTXG4gKiAgKiAqKm5hbWUqKiAtIHRoZSBuYW1lIG9mIHRoZSBjbGllbnQgc2VydmVyXG4gKiAgKiAqKmxvY2FsQWRkcmVzcyoqIC0gb3V0Ym91bmQgYWRkcmVzcyB0byBiaW5kIHRvIChzZWU6IGh0dHA6Ly9ub2RlanMub3JnL2FwaS9uZXQuaHRtbCNuZXRfbmV0X2Nvbm5lY3Rfb3B0aW9uc19jb25uZWN0aW9ubGlzdGVuZXIpXG4gKiAgKiAqKmdyZWV0aW5nVGltZW91dCoqIC0gVGltZSB0byB3YWl0IGluIG1zIHVudGlsIGdyZWV0aW5nIG1lc3NhZ2UgaXMgcmVjZWl2ZWQgZnJvbSB0aGUgc2VydmVyIChkZWZhdWx0cyB0byAxMDAwMClcbiAqICAqICoqY29ubmVjdGlvblRpbWVvdXQqKiAtIGhvdyBtYW55IG1pbGxpc2Vjb25kcyB0byB3YWl0IGZvciB0aGUgY29ubmVjdGlvbiB0byBlc3RhYmxpc2hcbiAqICAqICoqc29ja2V0VGltZW91dCoqIC0gVGltZSBvZiBpbmFjdGl2aXR5IHVudGlsIHRoZSBjb25uZWN0aW9uIGlzIGNsb3NlZCAoZGVmYXVsdHMgdG8gMSBob3VyKVxuICogICogKipkbnNUaW1lb3V0KiogLSBUaW1lIHRvIHdhaXQgaW4gbXMgZm9yIHRoZSBETlMgcmVxdWVzdHMgdG8gYmUgcmVzb2x2ZWQgKGRlZmF1bHRzIHRvIDMwIHNlY29uZHMpXG4gKiAgKiAqKmxtdHAqKiAtIGlmIHRydWUsIHVzZXMgTE1UUCBpbnN0ZWFkIG9mIFNNVFAgcHJvdG9jb2xcbiAqICAqICoqbG9nZ2VyKiogLSBidW55YW4gY29tcGF0aWJsZSBsb2dnZXIgaW50ZXJmYWNlXG4gKiAgKiAqKmRlYnVnKiogLSBpZiB0cnVlIHBhc3MgU01UUCB0cmFmZmljIHRvIHRoZSBsb2dnZXJcbiAqICAqICoqdGxzKiogLSBvcHRpb25zIGZvciBjcmVhdGVDcmVkZW50aWFsc1xuICogICogKipzb2NrZXQqKiAtIGV4aXN0aW5nIHNvY2tldCB0byB1c2UgaW5zdGVhZCBvZiBjcmVhdGluZyBhIG5ldyBvbmUgKHNlZTogaHR0cDovL25vZGVqcy5vcmcvYXBpL25ldC5odG1sI25ldF9jbGFzc19uZXRfc29ja2V0KVxuICogICogKipzZWN1cmVkKiogLSBib29sZWFuIGluZGljYXRlcyB0aGF0IHRoZSBwcm92aWRlZCBzb2NrZXQgaGFzIGFscmVhZHkgYmVlbiB1cGdyYWRlZCB0byB0bHNcbiAqXG4gKiBAY29uc3RydWN0b3JcbiAqIEBuYW1lc3BhY2UgU01UUCBDbGllbnQgbW9kdWxlXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdIE9wdGlvbiBwcm9wZXJ0aWVzXG4gKi9cbmNsYXNzIFNNVFBDb25uZWN0aW9uIGV4dGVuZHMgRXZlbnRFbWl0dGVyIHtcbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zKSB7XG4gICAgICAgIHN1cGVyKG9wdGlvbnMpO1xuXG4gICAgICAgIHRoaXMuaWQgPSBjcnlwdG8ucmFuZG9tQnl0ZXMoOCkudG9TdHJpbmcoJ2Jhc2U2NCcpLnJlcGxhY2UoL1xcVy9nLCAnJyk7XG4gICAgICAgIHRoaXMuc3RhZ2UgPSAnaW5pdCc7XG5cbiAgICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcblxuICAgICAgICB0aGlzLnNlY3VyZUNvbm5lY3Rpb24gPSAhIXRoaXMub3B0aW9ucy5zZWN1cmU7XG4gICAgICAgIHRoaXMuYWxyZWFkeVNlY3VyZWQgPSAhIXRoaXMub3B0aW9ucy5zZWN1cmVkO1xuXG4gICAgICAgIHRoaXMucG9ydCA9IE51bWJlcih0aGlzLm9wdGlvbnMucG9ydCkgfHwgKHRoaXMuc2VjdXJlQ29ubmVjdGlvbiA/IDQ2NSA6IDU4Nyk7XG4gICAgICAgIHRoaXMuaG9zdCA9IHRoaXMub3B0aW9ucy5ob3N0IHx8ICdsb2NhbGhvc3QnO1xuXG4gICAgICAgIHRoaXMuc2VydmVybmFtZSA9IHRoaXMub3B0aW9ucy5zZXJ2ZXJuYW1lID8gdGhpcy5vcHRpb25zLnNlcnZlcm5hbWUgOiAhbmV0LmlzSVAodGhpcy5ob3N0KSA/IHRoaXMuaG9zdCA6IGZhbHNlO1xuXG4gICAgICAgIHRoaXMuYWxsb3dJbnRlcm5hbE5ldHdvcmtJbnRlcmZhY2VzID0gdGhpcy5vcHRpb25zLmFsbG93SW50ZXJuYWxOZXR3b3JrSW50ZXJmYWNlcyB8fCBmYWxzZTtcblxuICAgICAgICBpZiAodHlwZW9mIHRoaXMub3B0aW9ucy5zZWN1cmUgPT09ICd1bmRlZmluZWQnICYmIHRoaXMucG9ydCA9PT0gNDY1KSB7XG4gICAgICAgICAgICAvLyBpZiBzZWN1cmUgb3B0aW9uIGlzIG5vdCBzZXQgYnV0IHBvcnQgaXMgNDY1LCB0aGVuIGRlZmF1bHQgdG8gc2VjdXJlXG4gICAgICAgICAgICB0aGlzLnNlY3VyZUNvbm5lY3Rpb24gPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5uYW1lID0gdGhpcy5vcHRpb25zLm5hbWUgfHwgdGhpcy5fZ2V0SG9zdG5hbWUoKTtcblxuICAgICAgICB0aGlzLmxvZ2dlciA9IHNoYXJlZC5nZXRMb2dnZXIodGhpcy5vcHRpb25zLCB7XG4gICAgICAgICAgICBjb21wb25lbnQ6IHRoaXMub3B0aW9ucy5jb21wb25lbnQgfHwgJ3NtdHAtY29ubmVjdGlvbicsXG4gICAgICAgICAgICBzaWQ6IHRoaXMuaWRcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5jdXN0b21BdXRoID0gbmV3IE1hcCgpO1xuICAgICAgICBPYmplY3Qua2V5cyh0aGlzLm9wdGlvbnMuY3VzdG9tQXV0aCB8fCB7fSkuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICAgICAgbGV0IG1hcEtleSA9IChrZXkgfHwgJycpLnRvU3RyaW5nKCkudHJpbSgpLnRvVXBwZXJDYXNlKCk7XG4gICAgICAgICAgICBpZiAoIW1hcEtleSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuY3VzdG9tQXV0aC5zZXQobWFwS2V5LCB0aGlzLm9wdGlvbnMuY3VzdG9tQXV0aFtrZXldKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEV4cG9zZSB2ZXJzaW9uIG5yLCBqdXN0IGZvciB0aGUgcmVmZXJlbmNlXG4gICAgICAgICAqIEB0eXBlIHtTdHJpbmd9XG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnZlcnNpb24gPSBwYWNrYWdlSW5mby52ZXJzaW9uO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBJZiB0cnVlLCB0aGVuIHRoZSB1c2VyIGlzIGF1dGhlbnRpY2F0ZWRcbiAgICAgICAgICogQHR5cGUge0Jvb2xlYW59XG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmF1dGhlbnRpY2F0ZWQgPSBmYWxzZTtcblxuICAgICAgICAvKipcbiAgICAgICAgICogSWYgc2V0IHRvIHRydWUsIHRoaXMgaW5zdGFuY2UgaXMgbm8gbG9uZ2VyIGFjdGl2ZVxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5kZXN0cm95ZWQgPSBmYWxzZTtcblxuICAgICAgICAvKipcbiAgICAgICAgICogRGVmaW5lcyBpZiB0aGUgY3VycmVudCBjb25uZWN0aW9uIGlzIHNlY3VyZSBvciBub3QuIElmIG5vdCxcbiAgICAgICAgICogU1RBUlRUTFMgY2FuIGJlIHVzZWQgaWYgYXZhaWxhYmxlXG4gICAgICAgICAqIEBwcml2YXRlXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnNlY3VyZSA9ICEhdGhpcy5zZWN1cmVDb25uZWN0aW9uO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBTdG9yZSBpbmNvbXBsZXRlIG1lc3NhZ2VzIGNvbWluZyBmcm9tIHRoZSBzZXJ2ZXJcbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuX3JlbWFpbmRlciA9ICcnO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVbnByb2Nlc3NlZCByZXNwb25zZXMgZnJvbSB0aGUgc2VydmVyXG4gICAgICAgICAqIEB0eXBlIHtBcnJheX1cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuX3Jlc3BvbnNlUXVldWUgPSBbXTtcblxuICAgICAgICB0aGlzLmxhc3RTZXJ2ZXJSZXNwb25zZSA9IGZhbHNlO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgc29ja2V0IGNvbm5lY3RpbmcgdG8gdGhlIHNlcnZlclxuICAgICAgICAgKiBAcHVibGljXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLl9zb2NrZXQgPSBmYWxzZTtcblxuICAgICAgICAvKipcbiAgICAgICAgICogTGlzdHMgc3VwcG9ydGVkIGF1dGggbWVjaGFuaXNtc1xuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5fc3VwcG9ydGVkQXV0aCA9IFtdO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBTZXQgdG8gdHJ1ZSwgaWYgRUhMTyByZXNwb25zZSBpbmNsdWRlcyBcIkFVVEhcIi5cbiAgICAgICAgICogSWYgZmFsc2UgdGhlbiBhdXRoZW50aWNhdGlvbiBpcyBub3QgdHJpZWRcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuYWxsb3dzQXV0aCA9IGZhbHNlO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBJbmNsdWRlcyBjdXJyZW50IGVudmVsb3BlIChmcm9tLCB0bylcbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuX2VudmVsb3BlID0gZmFsc2U7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIExpc3RzIHN1cHBvcnRlZCBleHRlbnNpb25zXG4gICAgICAgICAqIEBwcml2YXRlXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLl9zdXBwb3J0ZWRFeHRlbnNpb25zID0gW107XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIERlZmluZXMgdGhlIG1heGltdW0gYWxsb3dlZCBzaXplIGZvciBhIHNpbmdsZSBtZXNzYWdlXG4gICAgICAgICAqIEBwcml2YXRlXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLl9tYXhBbGxvd2VkU2l6ZSA9IDA7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEZ1bmN0aW9uIHF1ZXVlIHRvIHJ1biBpZiBhIGRhdGEgY2h1bmsgY29tZXMgZnJvbSB0aGUgc2VydmVyXG4gICAgICAgICAqIEBwcml2YXRlXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLl9yZXNwb25zZUFjdGlvbnMgPSBbXTtcbiAgICAgICAgdGhpcy5fcmVjaXBpZW50UXVldWUgPSBbXTtcblxuICAgICAgICAvKipcbiAgICAgICAgICogVGltZW91dCB2YXJpYWJsZSBmb3Igd2FpdGluZyB0aGUgZ3JlZXRpbmdcbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuX2dyZWV0aW5nVGltZW91dCA9IGZhbHNlO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaW1lb3V0IHZhcmlhYmxlIGZvciB3YWl0aW5nIHRoZSBjb25uZWN0aW9uIHRvIHN0YXJ0XG4gICAgICAgICAqIEBwcml2YXRlXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLl9jb25uZWN0aW9uVGltZW91dCA9IGZhbHNlO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBJZiB0aGUgc29ja2V0IGlzIGRlZW1lZCBhbHJlYWR5IGNsb3NlZFxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5fZGVzdHJveWVkID0gZmFsc2U7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIElmIHRoZSBzb2NrZXQgaXMgYWxyZWFkeSBiZWluZyBjbG9zZWRcbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuX2Nsb3NpbmcgPSBmYWxzZTtcblxuICAgICAgICAvKipcbiAgICAgICAgICogQ2FsbGJhY2tzIGZvciBzb2NrZXQncyBsaXN0ZW5lcnNcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuX29uU29ja2V0RGF0YSA9IGNodW5rID0+IHRoaXMuX29uRGF0YShjaHVuayk7XG4gICAgICAgIHRoaXMuX29uU29ja2V0RXJyb3IgPSBlcnJvciA9PiB0aGlzLl9vbkVycm9yKGVycm9yLCAnRVNPQ0tFVCcsIGZhbHNlLCAnQ09OTicpO1xuICAgICAgICB0aGlzLl9vblNvY2tldENsb3NlID0gKCkgPT4gdGhpcy5fb25DbG9zZSgpO1xuICAgICAgICB0aGlzLl9vblNvY2tldEVuZCA9ICgpID0+IHRoaXMuX29uRW5kKCk7XG4gICAgICAgIHRoaXMuX29uU29ja2V0VGltZW91dCA9ICgpID0+IHRoaXMuX29uVGltZW91dCgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBjb25uZWN0aW9uIHRvIGEgU01UUCBzZXJ2ZXIgYW5kIHNldHMgdXAgY29ubmVjdGlvblxuICAgICAqIGxpc3RlbmVyXG4gICAgICovXG4gICAgY29ubmVjdChjb25uZWN0Q2FsbGJhY2spIHtcbiAgICAgICAgaWYgKHR5cGVvZiBjb25uZWN0Q2FsbGJhY2sgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHRoaXMub25jZSgnY29ubmVjdCcsICgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgdG54OiAnc210cCdcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgJ1NNVFAgaGFuZHNoYWtlIGZpbmlzaGVkJ1xuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgY29ubmVjdENhbGxiYWNrKCk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgY29uc3QgaXNEZXN0cm95ZWRNZXNzYWdlID0gdGhpcy5faXNEZXN0cm95ZWRNZXNzYWdlKCdjb25uZWN0Jyk7XG4gICAgICAgICAgICBpZiAoaXNEZXN0cm95ZWRNZXNzYWdlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvbm5lY3RDYWxsYmFjayh0aGlzLl9mb3JtYXRFcnJvcihpc0Rlc3Ryb3llZE1lc3NhZ2UsICdFQ09OTkVDVElPTicsIGZhbHNlLCAnQ09OTicpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBvcHRzID0ge1xuICAgICAgICAgICAgcG9ydDogdGhpcy5wb3J0LFxuICAgICAgICAgICAgaG9zdDogdGhpcy5ob3N0LFxuICAgICAgICAgICAgYWxsb3dJbnRlcm5hbE5ldHdvcmtJbnRlcmZhY2VzOiB0aGlzLmFsbG93SW50ZXJuYWxOZXR3b3JrSW50ZXJmYWNlcyxcbiAgICAgICAgICAgIHRpbWVvdXQ6IHRoaXMub3B0aW9ucy5kbnNUaW1lb3V0IHx8IEROU19USU1FT1VUXG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5sb2NhbEFkZHJlc3MpIHtcbiAgICAgICAgICAgIG9wdHMubG9jYWxBZGRyZXNzID0gdGhpcy5vcHRpb25zLmxvY2FsQWRkcmVzcztcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBzZXR1cENvbm5lY3Rpb25IYW5kbGVycyA9ICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuX2Nvbm5lY3Rpb25UaW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5fb25FcnJvcignQ29ubmVjdGlvbiB0aW1lb3V0JywgJ0VUSU1FRE9VVCcsIGZhbHNlLCAnQ09OTicpO1xuICAgICAgICAgICAgfSwgdGhpcy5vcHRpb25zLmNvbm5lY3Rpb25UaW1lb3V0IHx8IENPTk5FQ1RJT05fVElNRU9VVCk7XG5cbiAgICAgICAgICAgIHRoaXMuX3NvY2tldC5vbignZXJyb3InLCB0aGlzLl9vblNvY2tldEVycm9yKTtcbiAgICAgICAgfTtcblxuICAgICAgICBpZiAodGhpcy5vcHRpb25zLmNvbm5lY3Rpb24pIHtcbiAgICAgICAgICAgIC8vIGNvbm5lY3Rpb24gaXMgYWxyZWFkeSBvcGVuZWRcbiAgICAgICAgICAgIHRoaXMuX3NvY2tldCA9IHRoaXMub3B0aW9ucy5jb25uZWN0aW9uO1xuICAgICAgICAgICAgc2V0dXBDb25uZWN0aW9uSGFuZGxlcnMoKTtcblxuICAgICAgICAgICAgaWYgKHRoaXMuc2VjdXJlQ29ubmVjdGlvbiAmJiAhdGhpcy5hbHJlYWR5U2VjdXJlZCkge1xuICAgICAgICAgICAgICAgIHNldEltbWVkaWF0ZSgoKSA9PlxuICAgICAgICAgICAgICAgICAgICB0aGlzLl91cGdyYWRlQ29ubmVjdGlvbihlcnIgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX29uRXJyb3IobmV3IEVycm9yKCdFcnJvciBpbml0aWF0aW5nIFRMUyAtICcgKyAoZXJyLm1lc3NhZ2UgfHwgZXJyKSksICdFVExTJywgZmFsc2UsICdDT05OJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fb25Db25uZWN0KCk7XG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgc2V0SW1tZWRpYXRlKCgpID0+IHRoaXMuX29uQ29ubmVjdCgpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLm9wdGlvbnMuc29ja2V0KSB7XG4gICAgICAgICAgICAvLyBzb2NrZXQgb2JqZWN0IGlzIHNldCB1cCBidXQgbm90IHlldCBjb25uZWN0ZWRcbiAgICAgICAgICAgIHRoaXMuX3NvY2tldCA9IHRoaXMub3B0aW9ucy5zb2NrZXQ7XG4gICAgICAgICAgICByZXR1cm4gc2hhcmVkLnJlc29sdmVIb3N0bmFtZShvcHRzLCAoZXJyLCByZXNvbHZlZCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNldEltbWVkaWF0ZSgoKSA9PiB0aGlzLl9vbkVycm9yKGVyciwgJ0VETlMnLCBmYWxzZSwgJ0NPTk4nKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKFxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0bng6ICdkbnMnLFxuICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlOiBvcHRzLmhvc3QsXG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlZDogcmVzb2x2ZWQuaG9zdCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhY2hlZDogISFyZXNvbHZlZC5jYWNoZWRcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgJ1Jlc29sdmVkICVzIGFzICVzIFtjYWNoZSAlc10nLFxuICAgICAgICAgICAgICAgICAgICBvcHRzLmhvc3QsXG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmVkLmhvc3QsXG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmVkLmNhY2hlZCA/ICdoaXQnIDogJ21pc3MnXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBPYmplY3Qua2V5cyhyZXNvbHZlZCkuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoa2V5LmNoYXJBdCgwKSAhPT0gJ18nICYmIHJlc29sdmVkW2tleV0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9wdHNba2V5XSA9IHJlc29sdmVkW2tleV07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9zb2NrZXQuY29ubmVjdCh0aGlzLnBvcnQsIHRoaXMuaG9zdCwgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fc29ja2V0LnNldEtlZXBBbGl2ZSh0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX29uQ29ubmVjdCgpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgc2V0dXBDb25uZWN0aW9uSGFuZGxlcnMoKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChFKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBzZXRJbW1lZGlhdGUoKCkgPT4gdGhpcy5fb25FcnJvcihFLCAnRUNPTk5FQ1RJT04nLCBmYWxzZSwgJ0NPTk4nKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5zZWN1cmVDb25uZWN0aW9uKSB7XG4gICAgICAgICAgICAvLyBjb25uZWN0IHVzaW5nIHRsc1xuICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy50bHMpIHtcbiAgICAgICAgICAgICAgICBPYmplY3Qua2V5cyh0aGlzLm9wdGlvbnMudGxzKS5mb3JFYWNoKGtleSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIG9wdHNba2V5XSA9IHRoaXMub3B0aW9ucy50bHNba2V5XTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gZW5zdXJlIHNlcnZlcm5hbWUgZm9yIFNOSVxuICAgICAgICAgICAgaWYgKHRoaXMuc2VydmVybmFtZSAmJiAhb3B0cy5zZXJ2ZXJuYW1lKSB7XG4gICAgICAgICAgICAgICAgb3B0cy5zZXJ2ZXJuYW1lID0gdGhpcy5zZXJ2ZXJuYW1lO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gc2hhcmVkLnJlc29sdmVIb3N0bmFtZShvcHRzLCAoZXJyLCByZXNvbHZlZCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNldEltbWVkaWF0ZSgoKSA9PiB0aGlzLl9vbkVycm9yKGVyciwgJ0VETlMnLCBmYWxzZSwgJ0NPTk4nKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKFxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0bng6ICdkbnMnLFxuICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlOiBvcHRzLmhvc3QsXG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlZDogcmVzb2x2ZWQuaG9zdCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhY2hlZDogISFyZXNvbHZlZC5jYWNoZWRcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgJ1Jlc29sdmVkICVzIGFzICVzIFtjYWNoZSAlc10nLFxuICAgICAgICAgICAgICAgICAgICBvcHRzLmhvc3QsXG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmVkLmhvc3QsXG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmVkLmNhY2hlZCA/ICdoaXQnIDogJ21pc3MnXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBPYmplY3Qua2V5cyhyZXNvbHZlZCkuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoa2V5LmNoYXJBdCgwKSAhPT0gJ18nICYmIHJlc29sdmVkW2tleV0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9wdHNba2V5XSA9IHJlc29sdmVkW2tleV07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9zb2NrZXQgPSB0bHMuY29ubmVjdChvcHRzLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9zb2NrZXQuc2V0S2VlcEFsaXZlKHRydWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fb25Db25uZWN0KCk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBzZXR1cENvbm5lY3Rpb25IYW5kbGVycygpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNldEltbWVkaWF0ZSgoKSA9PiB0aGlzLl9vbkVycm9yKEUsICdFQ09OTkVDVElPTicsIGZhbHNlLCAnQ09OTicpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIGNvbm5lY3QgdXNpbmcgcGxhaW50ZXh0XG4gICAgICAgICAgICByZXR1cm4gc2hhcmVkLnJlc29sdmVIb3N0bmFtZShvcHRzLCAoZXJyLCByZXNvbHZlZCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNldEltbWVkaWF0ZSgoKSA9PiB0aGlzLl9vbkVycm9yKGVyciwgJ0VETlMnLCBmYWxzZSwgJ0NPTk4nKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKFxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0bng6ICdkbnMnLFxuICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlOiBvcHRzLmhvc3QsXG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlZDogcmVzb2x2ZWQuaG9zdCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhY2hlZDogISFyZXNvbHZlZC5jYWNoZWRcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgJ1Jlc29sdmVkICVzIGFzICVzIFtjYWNoZSAlc10nLFxuICAgICAgICAgICAgICAgICAgICBvcHRzLmhvc3QsXG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmVkLmhvc3QsXG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmVkLmNhY2hlZCA/ICdoaXQnIDogJ21pc3MnXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBPYmplY3Qua2V5cyhyZXNvbHZlZCkuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoa2V5LmNoYXJBdCgwKSAhPT0gJ18nICYmIHJlc29sdmVkW2tleV0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9wdHNba2V5XSA9IHJlc29sdmVkW2tleV07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9zb2NrZXQgPSBuZXQuY29ubmVjdChvcHRzLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9zb2NrZXQuc2V0S2VlcEFsaXZlKHRydWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fb25Db25uZWN0KCk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBzZXR1cENvbm5lY3Rpb25IYW5kbGVycygpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNldEltbWVkaWF0ZSgoKSA9PiB0aGlzLl9vbkVycm9yKEUsICdFQ09OTkVDVElPTicsIGZhbHNlLCAnQ09OTicpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNlbmRzIFFVSVRcbiAgICAgKi9cbiAgICBxdWl0KCkge1xuICAgICAgICB0aGlzLl9zZW5kQ29tbWFuZCgnUVVJVCcpO1xuICAgICAgICB0aGlzLl9yZXNwb25zZUFjdGlvbnMucHVzaCh0aGlzLmNsb3NlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDbG9zZXMgdGhlIGNvbm5lY3Rpb24gdG8gdGhlIHNlcnZlclxuICAgICAqL1xuICAgIGNsb3NlKCkge1xuICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5fY29ubmVjdGlvblRpbWVvdXQpO1xuICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5fZ3JlZXRpbmdUaW1lb3V0KTtcbiAgICAgICAgdGhpcy5fcmVzcG9uc2VBY3Rpb25zID0gW107XG5cbiAgICAgICAgLy8gYWxsb3cgdG8gcnVuIHRoaXMgZnVuY3Rpb24gb25seSBvbmNlXG4gICAgICAgIGlmICh0aGlzLl9jbG9zaW5nKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fY2xvc2luZyA9IHRydWU7XG5cbiAgICAgICAgbGV0IGNsb3NlTWV0aG9kID0gJ2VuZCc7XG5cbiAgICAgICAgaWYgKHRoaXMuc3RhZ2UgPT09ICdpbml0Jykge1xuICAgICAgICAgICAgLy8gQ2xvc2UgdGhlIHNvY2tldCBpbW1lZGlhdGVseSB3aGVuIGNvbm5lY3Rpb24gdGltZWQgb3V0XG4gICAgICAgICAgICBjbG9zZU1ldGhvZCA9ICdkZXN0cm95JztcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHRueDogJ3NtdHAnXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJ0Nsb3NpbmcgY29ubmVjdGlvbiB0byB0aGUgc2VydmVyIHVzaW5nIFwiJXNcIicsXG4gICAgICAgICAgICBjbG9zZU1ldGhvZFxuICAgICAgICApO1xuXG4gICAgICAgIGxldCBzb2NrZXQgPSAodGhpcy5fc29ja2V0ICYmIHRoaXMuX3NvY2tldC5zb2NrZXQpIHx8IHRoaXMuX3NvY2tldDtcblxuICAgICAgICBpZiAoc29ja2V0ICYmICFzb2NrZXQuZGVzdHJveWVkKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHNvY2tldFtjbG9zZU1ldGhvZF0oKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKF9FKSB7XG4gICAgICAgICAgICAgICAgLy8ganVzdCBpZ25vcmVcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2Rlc3Ryb3koKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBdXRoZW50aWNhdGUgdXNlclxuICAgICAqL1xuICAgIGxvZ2luKGF1dGhEYXRhLCBjYWxsYmFjaykge1xuICAgICAgICBjb25zdCBpc0Rlc3Ryb3llZE1lc3NhZ2UgPSB0aGlzLl9pc0Rlc3Ryb3llZE1lc3NhZ2UoJ2xvZ2luJyk7XG4gICAgICAgIGlmIChpc0Rlc3Ryb3llZE1lc3NhZ2UpIHtcbiAgICAgICAgICAgIHJldHVybiBjYWxsYmFjayh0aGlzLl9mb3JtYXRFcnJvcihpc0Rlc3Ryb3llZE1lc3NhZ2UsICdFQ09OTkVDVElPTicsIGZhbHNlLCAnQVBJJykpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fYXV0aCA9IGF1dGhEYXRhIHx8IHt9O1xuICAgICAgICAvLyBTZWxlY3QgU0FTTCBhdXRoZW50aWNhdGlvbiBtZXRob2RcbiAgICAgICAgdGhpcy5fYXV0aE1ldGhvZCA9ICh0aGlzLl9hdXRoLm1ldGhvZCB8fCAnJykudG9TdHJpbmcoKS50cmltKCkudG9VcHBlckNhc2UoKSB8fCBmYWxzZTtcblxuICAgICAgICBpZiAoIXRoaXMuX2F1dGhNZXRob2QgJiYgdGhpcy5fYXV0aC5vYXV0aDIgJiYgIXRoaXMuX2F1dGguY3JlZGVudGlhbHMpIHtcbiAgICAgICAgICAgIHRoaXMuX2F1dGhNZXRob2QgPSAnWE9BVVRIMic7XG4gICAgICAgIH0gZWxzZSBpZiAoIXRoaXMuX2F1dGhNZXRob2QgfHwgKHRoaXMuX2F1dGhNZXRob2QgPT09ICdYT0FVVEgyJyAmJiAhdGhpcy5fYXV0aC5vYXV0aDIpKSB7XG4gICAgICAgICAgICAvLyB1c2UgZmlyc3Qgc3VwcG9ydGVkXG4gICAgICAgICAgICB0aGlzLl9hdXRoTWV0aG9kID0gKHRoaXMuX3N1cHBvcnRlZEF1dGhbMF0gfHwgJ1BMQUlOJykudG9VcHBlckNhc2UoKS50cmltKCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5fYXV0aE1ldGhvZCAhPT0gJ1hPQVVUSDInICYmICghdGhpcy5fYXV0aC5jcmVkZW50aWFscyB8fCAhdGhpcy5fYXV0aC5jcmVkZW50aWFscy51c2VyIHx8ICF0aGlzLl9hdXRoLmNyZWRlbnRpYWxzLnBhc3MpKSB7XG4gICAgICAgICAgICBpZiAoKHRoaXMuX2F1dGgudXNlciAmJiB0aGlzLl9hdXRoLnBhc3MpIHx8IHRoaXMuY3VzdG9tQXV0aC5oYXModGhpcy5fYXV0aE1ldGhvZCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9hdXRoLmNyZWRlbnRpYWxzID0ge1xuICAgICAgICAgICAgICAgICAgICB1c2VyOiB0aGlzLl9hdXRoLnVzZXIsXG4gICAgICAgICAgICAgICAgICAgIHBhc3M6IHRoaXMuX2F1dGgucGFzcyxcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9uczogdGhpcy5fYXV0aC5vcHRpb25zXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKHRoaXMuX2Zvcm1hdEVycm9yKCdNaXNzaW5nIGNyZWRlbnRpYWxzIGZvciBcIicgKyB0aGlzLl9hdXRoTWV0aG9kICsgJ1wiJywgJ0VBVVRIJywgZmFsc2UsICdBUEknKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5jdXN0b21BdXRoLmhhcyh0aGlzLl9hdXRoTWV0aG9kKSkge1xuICAgICAgICAgICAgbGV0IGhhbmRsZXIgPSB0aGlzLmN1c3RvbUF1dGguZ2V0KHRoaXMuX2F1dGhNZXRob2QpO1xuICAgICAgICAgICAgbGV0IGxhc3RSZXNwb25zZTtcbiAgICAgICAgICAgIGxldCByZXR1cm5lZCA9IGZhbHNlO1xuXG4gICAgICAgICAgICBsZXQgcmVzb2x2ZSA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAocmV0dXJuZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm5lZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuaW5mbyhcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgdG54OiAnc210cCcsXG4gICAgICAgICAgICAgICAgICAgICAgICB1c2VybmFtZTogdGhpcy5fYXV0aC51c2VyLFxuICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uOiAnYXV0aGVudGljYXRlZCcsXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXRob2Q6IHRoaXMuX2F1dGhNZXRob2RcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgJ1VzZXIgJXMgYXV0aGVudGljYXRlZCcsXG4gICAgICAgICAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KHRoaXMuX2F1dGgudXNlcilcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIHRoaXMuYXV0aGVudGljYXRlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgY2FsbGJhY2sobnVsbCwgdHJ1ZSk7XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBsZXQgcmVqZWN0ID0gZXJyID0+IHtcbiAgICAgICAgICAgICAgICBpZiAocmV0dXJuZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm5lZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgY2FsbGJhY2sodGhpcy5fZm9ybWF0RXJyb3IoZXJyLCAnRUFVVEgnLCBsYXN0UmVzcG9uc2UsICdBVVRIICcgKyB0aGlzLl9hdXRoTWV0aG9kKSk7XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBsZXQgaGFuZGxlclJlc3BvbnNlID0gaGFuZGxlcih7XG4gICAgICAgICAgICAgICAgYXV0aDogdGhpcy5fYXV0aCxcbiAgICAgICAgICAgICAgICBtZXRob2Q6IHRoaXMuX2F1dGhNZXRob2QsXG5cbiAgICAgICAgICAgICAgICBleHRlbnNpb25zOiBbXS5jb25jYXQodGhpcy5fc3VwcG9ydGVkRXh0ZW5zaW9ucyksXG4gICAgICAgICAgICAgICAgYXV0aE1ldGhvZHM6IFtdLmNvbmNhdCh0aGlzLl9zdXBwb3J0ZWRBdXRoKSxcbiAgICAgICAgICAgICAgICBtYXhBbGxvd2VkU2l6ZTogdGhpcy5fbWF4QWxsb3dlZFNpemUgfHwgZmFsc2UsXG5cbiAgICAgICAgICAgICAgICBzZW5kQ29tbWFuZDogKGNtZCwgZG9uZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBsZXQgcHJvbWlzZTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoIWRvbmUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb21pc2UgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9uZSA9IHNoYXJlZC5jYWxsYmFja1Byb21pc2UocmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fcmVzcG9uc2VBY3Rpb25zLnB1c2goc3RyID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RSZXNwb25zZSA9IHN0cjtcblxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNvZGVzID0gc3RyLm1hdGNoKC9eKFxcZCspKD86XFxzKFxcZCtcXC5cXGQrXFwuXFxkKykpP1xccy8pO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGRhdGEgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZDogY21kLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlOiBzdHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29kZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLnN0YXR1cyA9IE51bWJlcihjb2Rlc1sxXSkgfHwgMDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29kZXNbMl0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5jb2RlID0gY29kZXNbMl07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEudGV4dCA9IHN0ci5zdWJzdHIoY29kZXNbMF0ubGVuZ3RoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS50ZXh0ID0gc3RyO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEuc3RhdHVzID0gMDsgLy8ganVzdCBpbiBjYXNlIHdlIG5lZWQgdG8gcGVyZm9ybSBudW1lcmljIGNvbXBhcmlzb25zXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBkb25lKG51bGwsIGRhdGEpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgc2V0SW1tZWRpYXRlKCgpID0+IHRoaXMuX3NlbmRDb21tYW5kKGNtZCkpO1xuXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBwcm9taXNlO1xuICAgICAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgICAgICByZXNvbHZlLFxuICAgICAgICAgICAgICAgIHJlamVjdFxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGlmIChoYW5kbGVyUmVzcG9uc2UgJiYgdHlwZW9mIGhhbmRsZXJSZXNwb25zZS5jYXRjaCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgIC8vIGEgcHJvbWlzZSB3YXMgcmV0dXJuZWRcbiAgICAgICAgICAgICAgICBoYW5kbGVyUmVzcG9uc2UudGhlbihyZXNvbHZlKS5jYXRjaChyZWplY3QpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBzd2l0Y2ggKHRoaXMuX2F1dGhNZXRob2QpIHtcbiAgICAgICAgICAgIGNhc2UgJ1hPQVVUSDInOlxuICAgICAgICAgICAgICAgIHRoaXMuX2hhbmRsZVhPYXV0aDJUb2tlbihmYWxzZSwgY2FsbGJhY2spO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIGNhc2UgJ0xPR0lOJzpcbiAgICAgICAgICAgICAgICB0aGlzLl9yZXNwb25zZUFjdGlvbnMucHVzaChzdHIgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9hY3Rpb25BVVRIX0xPR0lOX1VTRVIoc3RyLCBjYWxsYmFjayk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgdGhpcy5fc2VuZENvbW1hbmQoJ0FVVEggTE9HSU4nKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICBjYXNlICdQTEFJTic6XG4gICAgICAgICAgICAgICAgdGhpcy5fcmVzcG9uc2VBY3Rpb25zLnB1c2goc3RyID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fYWN0aW9uQVVUSENvbXBsZXRlKHN0ciwgY2FsbGJhY2spO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHRoaXMuX3NlbmRDb21tYW5kKFxuICAgICAgICAgICAgICAgICAgICAnQVVUSCBQTEFJTiAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgIEJ1ZmZlci5mcm9tKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vdGhpcy5fYXV0aC51c2VyKydcXHUwMDAwJytcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXFx1MDAwMCcgKyAvLyBza2lwIGF1dGhvcml6YXRpb24gaWRlbnRpdHkgYXMgaXQgY2F1c2VzIHByb2JsZW1zIHdpdGggc29tZSBzZXJ2ZXJzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2F1dGguY3JlZGVudGlhbHMudXNlciArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcXHUwMDAwJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2F1dGguY3JlZGVudGlhbHMucGFzcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAndXRmLTgnXG4gICAgICAgICAgICAgICAgICAgICAgICApLnRvU3RyaW5nKCdiYXNlNjQnKSxcbiAgICAgICAgICAgICAgICAgICAgLy8gbG9nIGVudHJ5IHdpdGhvdXQgcGFzc3dvcmRzXG4gICAgICAgICAgICAgICAgICAgICdBVVRIIFBMQUlOICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgQnVmZmVyLmZyb20oXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy90aGlzLl9hdXRoLnVzZXIrJ1xcdTAwMDAnK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcXHUwMDAwJyArIC8vIHNraXAgYXV0aG9yaXphdGlvbiBpZGVudGl0eSBhcyBpdCBjYXVzZXMgcHJvYmxlbXMgd2l0aCBzb21lIHNlcnZlcnNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fYXV0aC5jcmVkZW50aWFscy51c2VyICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1xcdTAwMDAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy8qIHNlY3JldCAqLycsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3V0Zi04J1xuICAgICAgICAgICAgICAgICAgICAgICAgKS50b1N0cmluZygnYmFzZTY0JylcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIGNhc2UgJ0NSQU0tTUQ1JzpcbiAgICAgICAgICAgICAgICB0aGlzLl9yZXNwb25zZUFjdGlvbnMucHVzaChzdHIgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9hY3Rpb25BVVRIX0NSQU1fTUQ1KHN0ciwgY2FsbGJhY2spO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHRoaXMuX3NlbmRDb21tYW5kKCdBVVRIIENSQU0tTUQ1Jyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGNhbGxiYWNrKHRoaXMuX2Zvcm1hdEVycm9yKCdVbmtub3duIGF1dGhlbnRpY2F0aW9uIG1ldGhvZCBcIicgKyB0aGlzLl9hdXRoTWV0aG9kICsgJ1wiJywgJ0VBVVRIJywgZmFsc2UsICdBUEknKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2VuZHMgYSBtZXNzYWdlXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gZW52ZWxvcGUgRW52ZWxvcGUgb2JqZWN0LCB7ZnJvbTogYWRkciwgdG86IFthZGRyXX1cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gbWVzc2FnZSBTdHJpbmcsIEJ1ZmZlciBvciBhIFN0cmVhbVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIENhbGxiYWNrIHRvIHJldHVybiBvbmNlIHNlbmRpbmcgaXMgY29tcGxldGVkXG4gICAgICovXG4gICAgc2VuZChlbnZlbG9wZSwgbWVzc2FnZSwgZG9uZSkge1xuICAgICAgICBpZiAoIW1lc3NhZ2UpIHtcbiAgICAgICAgICAgIHJldHVybiBkb25lKHRoaXMuX2Zvcm1hdEVycm9yKCdFbXB0eSBtZXNzYWdlJywgJ0VNRVNTQUdFJywgZmFsc2UsICdBUEknKSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBpc0Rlc3Ryb3llZE1lc3NhZ2UgPSB0aGlzLl9pc0Rlc3Ryb3llZE1lc3NhZ2UoJ3NlbmQgbWVzc2FnZScpO1xuICAgICAgICBpZiAoaXNEZXN0cm95ZWRNZXNzYWdlKSB7XG4gICAgICAgICAgICByZXR1cm4gZG9uZSh0aGlzLl9mb3JtYXRFcnJvcihpc0Rlc3Ryb3llZE1lc3NhZ2UsICdFQ09OTkVDVElPTicsIGZhbHNlLCAnQVBJJykpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gcmVqZWN0IGxhcmdlciBtZXNzYWdlcyB0aGFuIGFsbG93ZWRcbiAgICAgICAgaWYgKHRoaXMuX21heEFsbG93ZWRTaXplICYmIGVudmVsb3BlLnNpemUgPiB0aGlzLl9tYXhBbGxvd2VkU2l6ZSkge1xuICAgICAgICAgICAgcmV0dXJuIHNldEltbWVkaWF0ZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgZG9uZSh0aGlzLl9mb3JtYXRFcnJvcignTWVzc2FnZSBzaXplIGxhcmdlciB0aGFuIGFsbG93ZWQgJyArIHRoaXMuX21heEFsbG93ZWRTaXplLCAnRU1FU1NBR0UnLCBmYWxzZSwgJ01BSUwgRlJPTScpKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gZW5zdXJlIHRoYXQgY2FsbGJhY2sgaXMgb25seSBjYWxsZWQgb25jZVxuICAgICAgICBsZXQgcmV0dXJuZWQgPSBmYWxzZTtcbiAgICAgICAgbGV0IGNhbGxiYWNrID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaWYgKHJldHVybmVkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuZWQgPSB0cnVlO1xuXG4gICAgICAgICAgICBkb25lKC4uLmFyZ3VtZW50cyk7XG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKHR5cGVvZiBtZXNzYWdlLm9uID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBtZXNzYWdlLm9uKCdlcnJvcicsIGVyciA9PiBjYWxsYmFjayh0aGlzLl9mb3JtYXRFcnJvcihlcnIsICdFU1RSRUFNJywgZmFsc2UsICdBUEknKSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHN0YXJ0VGltZSA9IERhdGUubm93KCk7XG4gICAgICAgIHRoaXMuX3NldEVudmVsb3BlKGVudmVsb3BlLCAoZXJyLCBpbmZvKSA9PiB7XG4gICAgICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICAgICAgLy8gY3JlYXRlIHBhc3N0aHJvdWdoIHN0cmVhbSB0byBjb25zdW1lIHRvIHByZXZlbnQgT09NXG4gICAgICAgICAgICAgICAgbGV0IHN0cmVhbSA9IG5ldyBQYXNzVGhyb3VnaCgpO1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgbWVzc2FnZS5waXBlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UucGlwZShzdHJlYW0pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS53cml0ZShtZXNzYWdlKTtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLmVuZCgpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHJldHVybiBjYWxsYmFjayhlcnIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IGVudmVsb3BlVGltZSA9IERhdGUubm93KCk7XG4gICAgICAgICAgICBsZXQgc3RyZWFtID0gdGhpcy5fY3JlYXRlU2VuZFN0cmVhbSgoZXJyLCBzdHIpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBjYWxsYmFjayhlcnIpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGluZm8uZW52ZWxvcGVUaW1lID0gZW52ZWxvcGVUaW1lIC0gc3RhcnRUaW1lO1xuICAgICAgICAgICAgICAgIGluZm8ubWVzc2FnZVRpbWUgPSBEYXRlLm5vdygpIC0gZW52ZWxvcGVUaW1lO1xuICAgICAgICAgICAgICAgIGluZm8ubWVzc2FnZVNpemUgPSBzdHJlYW0ub3V0Qnl0ZUNvdW50O1xuICAgICAgICAgICAgICAgIGluZm8ucmVzcG9uc2UgPSBzdHI7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gY2FsbGJhY2sobnVsbCwgaW5mbyk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgbWVzc2FnZS5waXBlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgbWVzc2FnZS5waXBlKHN0cmVhbSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHN0cmVhbS53cml0ZShtZXNzYWdlKTtcbiAgICAgICAgICAgICAgICBzdHJlYW0uZW5kKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlc2V0cyBjb25uZWN0aW9uIHN0YXRlXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBDYWxsYmFjayB0byByZXR1cm4gb25jZSBjb25uZWN0aW9uIGlzIHJlc2V0XG4gICAgICovXG4gICAgcmVzZXQoY2FsbGJhY2spIHtcbiAgICAgICAgdGhpcy5fc2VuZENvbW1hbmQoJ1JTRVQnKTtcbiAgICAgICAgdGhpcy5fcmVzcG9uc2VBY3Rpb25zLnB1c2goc3RyID0+IHtcbiAgICAgICAgICAgIGlmIChzdHIuY2hhckF0KDApICE9PSAnMicpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY2FsbGJhY2sodGhpcy5fZm9ybWF0RXJyb3IoJ0NvdWxkIG5vdCByZXNldCBzZXNzaW9uIHN0YXRlLiByZXNwb25zZT0nICsgc3RyLCAnRVBST1RPQ09MJywgc3RyLCAnUlNFVCcpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX2VudmVsb3BlID0gZmFsc2U7XG4gICAgICAgICAgICByZXR1cm4gY2FsbGJhY2sobnVsbCwgdHJ1ZSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbm5lY3Rpb24gbGlzdGVuZXIgdGhhdCBpcyBydW4gd2hlbiB0aGUgY29ubmVjdGlvbiB0b1xuICAgICAqIHRoZSBzZXJ2ZXIgaXMgb3BlbmVkXG4gICAgICpcbiAgICAgKiBAZXZlbnRcbiAgICAgKi9cbiAgICBfb25Db25uZWN0KCkge1xuICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5fY29ubmVjdGlvblRpbWVvdXQpO1xuXG4gICAgICAgIHRoaXMubG9nZ2VyLmluZm8oXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdG54OiAnbmV0d29yaycsXG4gICAgICAgICAgICAgICAgbG9jYWxBZGRyZXNzOiB0aGlzLl9zb2NrZXQubG9jYWxBZGRyZXNzLFxuICAgICAgICAgICAgICAgIGxvY2FsUG9ydDogdGhpcy5fc29ja2V0LmxvY2FsUG9ydCxcbiAgICAgICAgICAgICAgICByZW1vdGVBZGRyZXNzOiB0aGlzLl9zb2NrZXQucmVtb3RlQWRkcmVzcyxcbiAgICAgICAgICAgICAgICByZW1vdGVQb3J0OiB0aGlzLl9zb2NrZXQucmVtb3RlUG9ydFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICclcyBlc3RhYmxpc2hlZCB0byAlczolcycsXG4gICAgICAgICAgICB0aGlzLnNlY3VyZSA/ICdTZWN1cmUgY29ubmVjdGlvbicgOiAnQ29ubmVjdGlvbicsXG4gICAgICAgICAgICB0aGlzLl9zb2NrZXQucmVtb3RlQWRkcmVzcyxcbiAgICAgICAgICAgIHRoaXMuX3NvY2tldC5yZW1vdGVQb3J0XG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKHRoaXMuX2Rlc3Ryb3llZCkge1xuICAgICAgICAgICAgLy8gQ29ubmVjdGlvbiB3YXMgZXN0YWJsaXNoZWQgYWZ0ZXIgd2UgYWxyZWFkeSBoYWQgY2FuY2VsZWQgaXRcbiAgICAgICAgICAgIHRoaXMuY2xvc2UoKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuc3RhZ2UgPSAnY29ubmVjdGVkJztcblxuICAgICAgICAvLyBjbGVhciBleGlzdGluZyBsaXN0ZW5lcnMgZm9yIHRoZSBzb2NrZXRcbiAgICAgICAgdGhpcy5fc29ja2V0LnJlbW92ZUxpc3RlbmVyKCdkYXRhJywgdGhpcy5fb25Tb2NrZXREYXRhKTtcbiAgICAgICAgdGhpcy5fc29ja2V0LnJlbW92ZUxpc3RlbmVyKCd0aW1lb3V0JywgdGhpcy5fb25Tb2NrZXRUaW1lb3V0KTtcbiAgICAgICAgdGhpcy5fc29ja2V0LnJlbW92ZUxpc3RlbmVyKCdjbG9zZScsIHRoaXMuX29uU29ja2V0Q2xvc2UpO1xuICAgICAgICB0aGlzLl9zb2NrZXQucmVtb3ZlTGlzdGVuZXIoJ2VuZCcsIHRoaXMuX29uU29ja2V0RW5kKTtcblxuICAgICAgICB0aGlzLl9zb2NrZXQub24oJ2RhdGEnLCB0aGlzLl9vblNvY2tldERhdGEpO1xuICAgICAgICB0aGlzLl9zb2NrZXQub25jZSgnY2xvc2UnLCB0aGlzLl9vblNvY2tldENsb3NlKTtcbiAgICAgICAgdGhpcy5fc29ja2V0Lm9uY2UoJ2VuZCcsIHRoaXMuX29uU29ja2V0RW5kKTtcblxuICAgICAgICB0aGlzLl9zb2NrZXQuc2V0VGltZW91dCh0aGlzLm9wdGlvbnMuc29ja2V0VGltZW91dCB8fCBTT0NLRVRfVElNRU9VVCk7XG4gICAgICAgIHRoaXMuX3NvY2tldC5vbigndGltZW91dCcsIHRoaXMuX29uU29ja2V0VGltZW91dCk7XG5cbiAgICAgICAgdGhpcy5fZ3JlZXRpbmdUaW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAvLyBpZiBzdGlsbCB3YWl0aW5nIGZvciBncmVldGluZywgZ2l2ZSB1cFxuICAgICAgICAgICAgaWYgKHRoaXMuX3NvY2tldCAmJiAhdGhpcy5fZGVzdHJveWVkICYmIHRoaXMuX3Jlc3BvbnNlQWN0aW9uc1swXSA9PT0gdGhpcy5fYWN0aW9uR3JlZXRpbmcpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9vbkVycm9yKCdHcmVldGluZyBuZXZlciByZWNlaXZlZCcsICdFVElNRURPVVQnLCBmYWxzZSwgJ0NPTk4nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSwgdGhpcy5vcHRpb25zLmdyZWV0aW5nVGltZW91dCB8fCBHUkVFVElOR19USU1FT1VUKTtcblxuICAgICAgICB0aGlzLl9yZXNwb25zZUFjdGlvbnMucHVzaCh0aGlzLl9hY3Rpb25HcmVldGluZyk7XG5cbiAgICAgICAgLy8gd2UgaGF2ZSBhICdkYXRhJyBsaXN0ZW5lciBzZXQgdXAgc28gcmVzdW1lIHNvY2tldCBpZiBpdCB3YXMgcGF1c2VkXG4gICAgICAgIHRoaXMuX3NvY2tldC5yZXN1bWUoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiAnZGF0YScgbGlzdGVuZXIgZm9yIGRhdGEgY29taW5nIGZyb20gdGhlIHNlcnZlclxuICAgICAqXG4gICAgICogQGV2ZW50XG4gICAgICogQHBhcmFtIHtCdWZmZXJ9IGNodW5rIERhdGEgY2h1bmsgY29taW5nIGZyb20gdGhlIHNlcnZlclxuICAgICAqL1xuICAgIF9vbkRhdGEoY2h1bmspIHtcbiAgICAgICAgaWYgKHRoaXMuX2Rlc3Ryb3llZCB8fCAhY2h1bmsgfHwgIWNodW5rLmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGRhdGEgPSAoY2h1bmsgfHwgJycpLnRvU3RyaW5nKCdiaW5hcnknKTtcbiAgICAgICAgbGV0IGxpbmVzID0gKHRoaXMuX3JlbWFpbmRlciArIGRhdGEpLnNwbGl0KC9cXHI/XFxuLyk7XG4gICAgICAgIGxldCBsYXN0bGluZTtcblxuICAgICAgICB0aGlzLl9yZW1haW5kZXIgPSBsaW5lcy5wb3AoKTtcblxuICAgICAgICBmb3IgKGxldCBpID0gMCwgbGVuID0gbGluZXMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9yZXNwb25zZVF1ZXVlLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIGxhc3RsaW5lID0gdGhpcy5fcmVzcG9uc2VRdWV1ZVt0aGlzLl9yZXNwb25zZVF1ZXVlLmxlbmd0aCAtIDFdO1xuICAgICAgICAgICAgICAgIGlmICgvXlxcZCstLy50ZXN0KGxhc3RsaW5lLnNwbGl0KCdcXG4nKS5wb3AoKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fcmVzcG9uc2VRdWV1ZVt0aGlzLl9yZXNwb25zZVF1ZXVlLmxlbmd0aCAtIDFdICs9ICdcXG4nICsgbGluZXNbaV07XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX3Jlc3BvbnNlUXVldWUucHVzaChsaW5lc1tpXSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5fcmVzcG9uc2VRdWV1ZS5sZW5ndGgpIHtcbiAgICAgICAgICAgIGxhc3RsaW5lID0gdGhpcy5fcmVzcG9uc2VRdWV1ZVt0aGlzLl9yZXNwb25zZVF1ZXVlLmxlbmd0aCAtIDFdO1xuICAgICAgICAgICAgaWYgKC9eXFxkKy0vLnRlc3QobGFzdGxpbmUuc3BsaXQoJ1xcbicpLnBvcCgpKSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX3Byb2Nlc3NSZXNwb25zZSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqICdlcnJvcicgbGlzdGVuZXIgZm9yIHRoZSBzb2NrZXRcbiAgICAgKlxuICAgICAqIEBldmVudFxuICAgICAqIEBwYXJhbSB7RXJyb3J9IGVyciBFcnJvciBvYmplY3RcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gdHlwZSBFcnJvciBuYW1lXG4gICAgICovXG4gICAgX29uRXJyb3IoZXJyLCB0eXBlLCBkYXRhLCBjb21tYW5kKSB7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aGlzLl9jb25uZWN0aW9uVGltZW91dCk7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aGlzLl9ncmVldGluZ1RpbWVvdXQpO1xuXG4gICAgICAgIGlmICh0aGlzLl9kZXN0cm95ZWQpIHtcbiAgICAgICAgICAgIC8vIGp1c3QgaWdub3JlLCBhbHJlYWR5IGNsb3NlZFxuICAgICAgICAgICAgLy8gdGhpcyBtaWdodCBoYXBwZW4gd2hlbiBhIHNvY2tldCBpcyBjYW5jZWxlZCBiZWNhdXNlIG9mIHJlYWNoZWQgdGltZW91dFxuICAgICAgICAgICAgLy8gYnV0IHRoZSBzb2NrZXQgdGltZW91dCBlcnJvciBpdHNlbGYgcmVjZWl2ZXMgb25seSBhZnRlclxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgZXJyID0gdGhpcy5fZm9ybWF0RXJyb3IoZXJyLCB0eXBlLCBkYXRhLCBjb21tYW5kKTtcblxuICAgICAgICBjb25zdCB0cmFuc2llbnRDb2RlcyA9IFsnRVRJTUVET1VUJywgJ0VTT0NLRVQnLCAnRUNPTk5FQ1RJT04nXTtcbiAgICAgICAgaWYgKHRyYW5zaWVudENvZGVzLmluY2x1ZGVzKGVyci5jb2RlKSkge1xuICAgICAgICAgICAgdGhpcy5sb2dnZXIud2FybihkYXRhLCBlcnIubWVzc2FnZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcihkYXRhLCBlcnIubWVzc2FnZSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmVtaXQoJ2Vycm9yJywgZXJyKTtcbiAgICAgICAgdGhpcy5jbG9zZSgpO1xuICAgIH1cblxuICAgIF9mb3JtYXRFcnJvcihtZXNzYWdlLCB0eXBlLCByZXNwb25zZSwgY29tbWFuZCkge1xuICAgICAgICBsZXQgZXJyO1xuXG4gICAgICAgIGlmICgvRXJyb3JcXF0kL2kudGVzdChPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobWVzc2FnZSkpKSB7XG4gICAgICAgICAgICBlcnIgPSBtZXNzYWdlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZXJyID0gbmV3IEVycm9yKG1lc3NhZ2UpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHR5cGUgJiYgdHlwZSAhPT0gJ0Vycm9yJykge1xuICAgICAgICAgICAgZXJyLmNvZGUgPSB0eXBlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHJlc3BvbnNlKSB7XG4gICAgICAgICAgICBlcnIucmVzcG9uc2UgPSByZXNwb25zZTtcbiAgICAgICAgICAgIGVyci5tZXNzYWdlICs9ICc6ICcgKyByZXNwb25zZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCByZXNwb25zZUNvZGUgPSAodHlwZW9mIHJlc3BvbnNlID09PSAnc3RyaW5nJyAmJiBOdW1iZXIoKHJlc3BvbnNlLm1hdGNoKC9eXFxkKy8pIHx8IFtdKVswXSkpIHx8IGZhbHNlO1xuICAgICAgICBpZiAocmVzcG9uc2VDb2RlKSB7XG4gICAgICAgICAgICBlcnIucmVzcG9uc2VDb2RlID0gcmVzcG9uc2VDb2RlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbW1hbmQpIHtcbiAgICAgICAgICAgIGVyci5jb21tYW5kID0gY29tbWFuZDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBlcnI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogJ2Nsb3NlJyBsaXN0ZW5lciBmb3IgdGhlIHNvY2tldFxuICAgICAqXG4gICAgICogQGV2ZW50XG4gICAgICovXG4gICAgX29uQ2xvc2UoKSB7XG4gICAgICAgIGxldCBzZXJ2ZXJSZXNwb25zZSA9IGZhbHNlO1xuXG4gICAgICAgIGlmICh0aGlzLl9yZW1haW5kZXIgJiYgdGhpcy5fcmVtYWluZGVyLnRyaW0oKSkge1xuICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5kZWJ1ZyB8fCB0aGlzLm9wdGlvbnMudHJhbnNhY3Rpb25Mb2cpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgdG54OiAnc2VydmVyJ1xuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9yZW1haW5kZXIucmVwbGFjZSgvXFxyP1xcbiQvLCAnJylcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5sYXN0U2VydmVyUmVzcG9uc2UgPSBzZXJ2ZXJSZXNwb25zZSA9IHRoaXMuX3JlbWFpbmRlci50cmltKCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmxvZ2dlci5pbmZvKFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHRueDogJ25ldHdvcmsnXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJ0Nvbm5lY3Rpb24gY2xvc2VkJ1xuICAgICAgICApO1xuXG4gICAgICAgIGlmICh0aGlzLnVwZ3JhZGluZyAmJiAhdGhpcy5fZGVzdHJveWVkKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fb25FcnJvcihuZXcgRXJyb3IoJ0Nvbm5lY3Rpb24gY2xvc2VkIHVuZXhwZWN0ZWRseScpLCAnRVRMUycsIHNlcnZlclJlc3BvbnNlLCAnQ09OTicpO1xuICAgICAgICB9IGVsc2UgaWYgKCFbdGhpcy5fYWN0aW9uR3JlZXRpbmcsIHRoaXMuY2xvc2VdLmluY2x1ZGVzKHRoaXMuX3Jlc3BvbnNlQWN0aW9uc1swXSkgJiYgIXRoaXMuX2Rlc3Ryb3llZCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX29uRXJyb3IobmV3IEVycm9yKCdDb25uZWN0aW9uIGNsb3NlZCB1bmV4cGVjdGVkbHknKSwgJ0VDT05ORUNUSU9OJywgc2VydmVyUmVzcG9uc2UsICdDT05OJyk7XG4gICAgICAgIH0gZWxzZSBpZiAoL15bNDVdXFxkezJ9XFxiLy50ZXN0KHNlcnZlclJlc3BvbnNlKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX29uRXJyb3IobmV3IEVycm9yKCdDb25uZWN0aW9uIGNsb3NlZCB1bmV4cGVjdGVkbHknKSwgJ0VDT05ORUNUSU9OJywgc2VydmVyUmVzcG9uc2UsICdDT05OJyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9kZXN0cm95KCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogJ2VuZCcgbGlzdGVuZXIgZm9yIHRoZSBzb2NrZXRcbiAgICAgKlxuICAgICAqIEBldmVudFxuICAgICAqL1xuICAgIF9vbkVuZCgpIHtcbiAgICAgICAgaWYgKHRoaXMuX3NvY2tldCAmJiAhdGhpcy5fc29ja2V0LmRlc3Ryb3llZCkge1xuICAgICAgICAgICAgdGhpcy5fc29ja2V0LmRlc3Ryb3koKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqICd0aW1lb3V0JyBsaXN0ZW5lciBmb3IgdGhlIHNvY2tldFxuICAgICAqXG4gICAgICogQGV2ZW50XG4gICAgICovXG4gICAgX29uVGltZW91dCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX29uRXJyb3IobmV3IEVycm9yKCdUaW1lb3V0JyksICdFVElNRURPVVQnLCBmYWxzZSwgJ0NPTk4nKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZXN0cm95cyB0aGUgY2xpZW50LCBlbWl0cyAnZW5kJ1xuICAgICAqL1xuICAgIF9kZXN0cm95KCkge1xuICAgICAgICBpZiAodGhpcy5fZGVzdHJveWVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fZGVzdHJveWVkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5lbWl0KCdlbmQnKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVcGdyYWRlcyB0aGUgY29ubmVjdGlvbiB0byBUTFNcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIENhbGxiYWNrIGZ1bmN0aW9uIHRvIHJ1biB3aGVuIHRoZSBjb25uZWN0aW9uXG4gICAgICogICAgICAgIGhhcyBiZWVuIHNlY3VyZWRcbiAgICAgKi9cbiAgICBfdXBncmFkZUNvbm5lY3Rpb24oY2FsbGJhY2spIHtcbiAgICAgICAgLy8gZG8gbm90IHJlbW92ZSBhbGwgbGlzdGVuZXJzIG9yIGl0IGJyZWFrcyBub2RlIHYwLjEwIGFzIHRoZXJlJ3NcbiAgICAgICAgLy8gYXBwYXJlbnRseSBhICdmaW5pc2gnIGV2ZW50IHNldCB0aGF0IHdvdWxkIGJlIGNsZWFyZWQgYXMgd2VsbFxuXG4gICAgICAgIC8vIHdlIGNhbiBzYWZlbHkga2VlcCAnZXJyb3InLCAnZW5kJywgJ2Nsb3NlJyBldGMuIGV2ZW50c1xuICAgICAgICB0aGlzLl9zb2NrZXQucmVtb3ZlTGlzdGVuZXIoJ2RhdGEnLCB0aGlzLl9vblNvY2tldERhdGEpOyAvLyBpbmNvbWluZyBkYXRhIGlzIGdvaW5nIHRvIGJlIGdpYmJlcmlzaCBmcm9tIHRoaXMgcG9pbnQgb253YXJkc1xuICAgICAgICB0aGlzLl9zb2NrZXQucmVtb3ZlTGlzdGVuZXIoJ3RpbWVvdXQnLCB0aGlzLl9vblNvY2tldFRpbWVvdXQpOyAvLyB0aW1lb3V0IHdpbGwgYmUgcmUtc2V0IGZvciB0aGUgbmV3IHNvY2tldCBvYmplY3RcblxuICAgICAgICBsZXQgc29ja2V0UGxhaW4gPSB0aGlzLl9zb2NrZXQ7XG4gICAgICAgIGxldCBvcHRzID0ge1xuICAgICAgICAgICAgc29ja2V0OiB0aGlzLl9zb2NrZXQsXG4gICAgICAgICAgICBob3N0OiB0aGlzLmhvc3RcbiAgICAgICAgfTtcblxuICAgICAgICBPYmplY3Qua2V5cyh0aGlzLm9wdGlvbnMudGxzIHx8IHt9KS5mb3JFYWNoKGtleSA9PiB7XG4gICAgICAgICAgICBvcHRzW2tleV0gPSB0aGlzLm9wdGlvbnMudGxzW2tleV07XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIGVuc3VyZSBzZXJ2ZXJuYW1lIGZvciBTTklcbiAgICAgICAgaWYgKHRoaXMuc2VydmVybmFtZSAmJiAhb3B0cy5zZXJ2ZXJuYW1lKSB7XG4gICAgICAgICAgICBvcHRzLnNlcnZlcm5hbWUgPSB0aGlzLnNlcnZlcm5hbWU7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnVwZ3JhZGluZyA9IHRydWU7XG4gICAgICAgIC8vIHRscy5jb25uZWN0IGlzIG5vdCBhbiBhc3luY2hyb25vdXMgZnVuY3Rpb24gaG93ZXZlciBpdCBtYXkgc3RpbGwgdGhyb3cgZXJyb3JzIGFuZCByZXF1aXJlcyB0byBiZSB3cmFwcGVkIHdpdGggdHJ5L2NhdGNoXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB0aGlzLl9zb2NrZXQgPSB0bHMuY29ubmVjdChvcHRzLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZWN1cmUgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHRoaXMudXBncmFkaW5nID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgdGhpcy5fc29ja2V0Lm9uKCdkYXRhJywgdGhpcy5fb25Tb2NrZXREYXRhKTtcblxuICAgICAgICAgICAgICAgIHNvY2tldFBsYWluLnJlbW92ZUxpc3RlbmVyKCdjbG9zZScsIHRoaXMuX29uU29ja2V0Q2xvc2UpO1xuICAgICAgICAgICAgICAgIHNvY2tldFBsYWluLnJlbW92ZUxpc3RlbmVyKCdlbmQnLCB0aGlzLl9vblNvY2tldEVuZCk7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gY2FsbGJhY2sobnVsbCwgdHJ1ZSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICByZXR1cm4gY2FsbGJhY2soZXJyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX3NvY2tldC5vbignZXJyb3InLCB0aGlzLl9vblNvY2tldEVycm9yKTtcbiAgICAgICAgdGhpcy5fc29ja2V0Lm9uY2UoJ2Nsb3NlJywgdGhpcy5fb25Tb2NrZXRDbG9zZSk7XG4gICAgICAgIHRoaXMuX3NvY2tldC5vbmNlKCdlbmQnLCB0aGlzLl9vblNvY2tldEVuZCk7XG5cbiAgICAgICAgdGhpcy5fc29ja2V0LnNldFRpbWVvdXQodGhpcy5vcHRpb25zLnNvY2tldFRpbWVvdXQgfHwgU09DS0VUX1RJTUVPVVQpOyAvLyAxMCBtaW4uXG4gICAgICAgIHRoaXMuX3NvY2tldC5vbigndGltZW91dCcsIHRoaXMuX29uU29ja2V0VGltZW91dCk7XG5cbiAgICAgICAgLy8gcmVzdW1lIGluIGNhc2UgdGhlIHNvY2tldCB3YXMgcGF1c2VkXG4gICAgICAgIHNvY2tldFBsYWluLnJlc3VtZSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFByb2Nlc3NlcyBxdWV1ZWQgcmVzcG9uc2VzIGZyb20gdGhlIHNlcnZlclxuICAgICAqXG4gICAgICogQHBhcmFtIHtCb29sZWFufSBmb3JjZSBJZiB0cnVlLCBpZ25vcmVzIF9wcm9jZXNzaW5nIGZsYWdcbiAgICAgKi9cbiAgICBfcHJvY2Vzc1Jlc3BvbnNlKCkge1xuICAgICAgICBpZiAoIXRoaXMuX3Jlc3BvbnNlUXVldWUubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgc3RyID0gKHRoaXMubGFzdFNlcnZlclJlc3BvbnNlID0gKHRoaXMuX3Jlc3BvbnNlUXVldWUuc2hpZnQoKSB8fCAnJykudG9TdHJpbmcoKSk7XG5cbiAgICAgICAgaWYgKC9eXFxkKy0vLnRlc3Qoc3RyLnNwbGl0KCdcXG4nKS5wb3AoKSkpIHtcbiAgICAgICAgICAgIC8vIGtlZXAgd2FpdGluZyBmb3IgdGhlIGZpbmFsIHBhcnQgb2YgbXVsdGlsaW5lIHJlc3BvbnNlXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5vcHRpb25zLmRlYnVnIHx8IHRoaXMub3B0aW9ucy50cmFuc2FjdGlvbkxvZykge1xuICAgICAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICB0bng6ICdzZXJ2ZXInXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBzdHIucmVwbGFjZSgvXFxyP1xcbiQvLCAnJylcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXN0ci50cmltKCkpIHtcbiAgICAgICAgICAgIC8vIHNraXAgdW5leHBlY3RlZCBlbXB0eSBsaW5lc1xuICAgICAgICAgICAgc2V0SW1tZWRpYXRlKCgpID0+IHRoaXMuX3Byb2Nlc3NSZXNwb25zZSgpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBhY3Rpb24gPSB0aGlzLl9yZXNwb25zZUFjdGlvbnMuc2hpZnQoKTtcblxuICAgICAgICBpZiAodHlwZW9mIGFjdGlvbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgYWN0aW9uLmNhbGwodGhpcywgc3RyKTtcbiAgICAgICAgICAgIHNldEltbWVkaWF0ZSgoKSA9PiB0aGlzLl9wcm9jZXNzUmVzcG9uc2UoKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fb25FcnJvcihuZXcgRXJyb3IoJ1VuZXhwZWN0ZWQgUmVzcG9uc2UnKSwgJ0VQUk9UT0NPTCcsIHN0ciwgJ0NPTk4nKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNlbmQgYSBjb21tYW5kIHRvIHRoZSBzZXJ2ZXIsIGFwcGVuZCBcXHJcXG5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBzdHIgU3RyaW5nIHRvIGJlIHNlbnQgdG8gdGhlIHNlcnZlclxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBsb2dTdHIgT3B0aW9uYWwgc3RyaW5nIHRvIGJlIHVzZWQgZm9yIGxvZ2dpbmcgaW5zdGVhZCBvZiB0aGUgYWN0dWFsIHN0cmluZ1xuICAgICAqL1xuICAgIF9zZW5kQ29tbWFuZChzdHIsIGxvZ1N0cikge1xuICAgICAgICBpZiAodGhpcy5fZGVzdHJveWVkKSB7XG4gICAgICAgICAgICAvLyBDb25uZWN0aW9uIGFscmVhZHkgY2xvc2VkLCBjYW4ndCBzZW5kIGFueSBtb3JlIGRhdGFcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLl9zb2NrZXQuZGVzdHJveWVkKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jbG9zZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5kZWJ1ZyB8fCB0aGlzLm9wdGlvbnMudHJhbnNhY3Rpb25Mb2cpIHtcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgdG54OiAnY2xpZW50J1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgKGxvZ1N0ciB8fCBzdHIgfHwgJycpLnRvU3RyaW5nKCkucmVwbGFjZSgvXFxyP1xcbiQvLCAnJylcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9zb2NrZXQud3JpdGUoQnVmZmVyLmZyb20oc3RyICsgJ1xcclxcbicsICd1dGYtOCcpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJbml0aWF0ZXMgYSBuZXcgbWVzc2FnZSBieSBzdWJtaXR0aW5nIGVudmVsb3BlIGRhdGEsIHN0YXJ0aW5nIHdpdGhcbiAgICAgKiBNQUlMIEZST006IGNvbW1hbmRcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBlbnZlbG9wZSBFbnZlbG9wZSBvYmplY3QgaW4gdGhlIGZvcm0gb2ZcbiAgICAgKiAgICAgICAge2Zyb206Jy4uLicsIHRvOlsnLi4uJ119XG4gICAgICogICAgICAgIG9yXG4gICAgICogICAgICAgIHtmcm9tOnthZGRyZXNzOicuLi4nLG5hbWU6Jy4uLid9LCB0bzpbYWRkcmVzczonLi4uJyxuYW1lOicuLi4nXX1cbiAgICAgKi9cbiAgICBfc2V0RW52ZWxvcGUoZW52ZWxvcGUsIGNhbGxiYWNrKSB7XG4gICAgICAgIGxldCBhcmdzID0gW107XG4gICAgICAgIGxldCB1c2VTbXRwVXRmOCA9IGZhbHNlO1xuXG4gICAgICAgIHRoaXMuX2VudmVsb3BlID0gZW52ZWxvcGUgfHwge307XG4gICAgICAgIHRoaXMuX2VudmVsb3BlLmZyb20gPSAoKHRoaXMuX2VudmVsb3BlLmZyb20gJiYgdGhpcy5fZW52ZWxvcGUuZnJvbS5hZGRyZXNzKSB8fCB0aGlzLl9lbnZlbG9wZS5mcm9tIHx8ICcnKS50b1N0cmluZygpLnRyaW0oKTtcblxuICAgICAgICB0aGlzLl9lbnZlbG9wZS50byA9IFtdLmNvbmNhdCh0aGlzLl9lbnZlbG9wZS50byB8fCBbXSkubWFwKHRvID0+ICgodG8gJiYgdG8uYWRkcmVzcykgfHwgdG8gfHwgJycpLnRvU3RyaW5nKCkudHJpbSgpKTtcblxuICAgICAgICBpZiAoIXRoaXMuX2VudmVsb3BlLnRvLmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKHRoaXMuX2Zvcm1hdEVycm9yKCdObyByZWNpcGllbnRzIGRlZmluZWQnLCAnRUVOVkVMT1BFJywgZmFsc2UsICdBUEknKSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5fZW52ZWxvcGUuZnJvbSAmJiAvW1xcclxcbjw+XS8udGVzdCh0aGlzLl9lbnZlbG9wZS5mcm9tKSkge1xuICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKHRoaXMuX2Zvcm1hdEVycm9yKCdJbnZhbGlkIHNlbmRlciAnICsgSlNPTi5zdHJpbmdpZnkodGhpcy5fZW52ZWxvcGUuZnJvbSksICdFRU5WRUxPUEUnLCBmYWxzZSwgJ0FQSScpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGNoZWNrIGlmIHRoZSBzZW5kZXIgYWRkcmVzcyB1c2VzIG9ubHkgQVNDSUkgY2hhcmFjdGVycyxcbiAgICAgICAgLy8gb3RoZXJ3aXNlIHJlcXVpcmUgdXNhZ2Ugb2YgU01UUFVURjggZXh0ZW5zaW9uXG4gICAgICAgIGlmICgvW1xceDgwLVxcdUZGRkZdLy50ZXN0KHRoaXMuX2VudmVsb3BlLmZyb20pKSB7XG4gICAgICAgICAgICB1c2VTbXRwVXRmOCA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGxldCBpID0gMCwgbGVuID0gdGhpcy5fZW52ZWxvcGUudG8ubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5fZW52ZWxvcGUudG9baV0gfHwgL1tcXHJcXG48Pl0vLnRlc3QodGhpcy5fZW52ZWxvcGUudG9baV0pKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKHRoaXMuX2Zvcm1hdEVycm9yKCdJbnZhbGlkIHJlY2lwaWVudCAnICsgSlNPTi5zdHJpbmdpZnkodGhpcy5fZW52ZWxvcGUudG9baV0pLCAnRUVOVkVMT1BFJywgZmFsc2UsICdBUEknKSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIGNoZWNrIGlmIHRoZSByZWNpcGllbnRzIGFkZHJlc3NlcyB1c2Ugb25seSBBU0NJSSBjaGFyYWN0ZXJzLFxuICAgICAgICAgICAgLy8gb3RoZXJ3aXNlIHJlcXVpcmUgdXNhZ2Ugb2YgU01UUFVURjggZXh0ZW5zaW9uXG4gICAgICAgICAgICBpZiAoL1tcXHg4MC1cXHVGRkZGXS8udGVzdCh0aGlzLl9lbnZlbG9wZS50b1tpXSkpIHtcbiAgICAgICAgICAgICAgICB1c2VTbXRwVXRmOCA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBjbG9uZSB0aGUgcmVjaXBpZW50cyBhcnJheSBmb3IgbGF0dGVyIG1hbmlwdWxhdGlvblxuICAgICAgICB0aGlzLl9lbnZlbG9wZS5yY3B0UXVldWUgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHRoaXMuX2VudmVsb3BlLnRvIHx8IFtdKSk7XG4gICAgICAgIHRoaXMuX2VudmVsb3BlLnJlamVjdGVkID0gW107XG4gICAgICAgIHRoaXMuX2VudmVsb3BlLnJlamVjdGVkRXJyb3JzID0gW107XG4gICAgICAgIHRoaXMuX2VudmVsb3BlLmFjY2VwdGVkID0gW107XG5cbiAgICAgICAgaWYgKHRoaXMuX2VudmVsb3BlLmRzbikge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICB0aGlzLl9lbnZlbG9wZS5kc24gPSB0aGlzLl9zZXREc25FbnZlbG9wZSh0aGlzLl9lbnZlbG9wZS5kc24pO1xuICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKHRoaXMuX2Zvcm1hdEVycm9yKCdJbnZhbGlkIERTTiAnICsgZXJyLm1lc3NhZ2UsICdFRU5WRUxPUEUnLCBmYWxzZSwgJ0FQSScpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX3Jlc3BvbnNlQWN0aW9ucy5wdXNoKHN0ciA9PiB7XG4gICAgICAgICAgICB0aGlzLl9hY3Rpb25NQUlMKHN0ciwgY2FsbGJhY2spO1xuICAgICAgICB9KTtcblxuICAgICAgICAvLyBJZiB0aGUgc2VydmVyIHN1cHBvcnRzIFNNVFBVVEY4IGFuZCB0aGUgZW52ZWxvcGUgaW5jbHVkZXMgYW4gaW50ZXJuYXRpb25hbGl6ZWRcbiAgICAgICAgLy8gZW1haWwgYWRkcmVzcyB0aGVuIGFwcGVuZCBTTVRQVVRGOCBrZXl3b3JkIHRvIHRoZSBNQUlMIEZST00gY29tbWFuZFxuICAgICAgICBpZiAodXNlU210cFV0ZjggJiYgdGhpcy5fc3VwcG9ydGVkRXh0ZW5zaW9ucy5pbmNsdWRlcygnU01UUFVURjgnKSkge1xuICAgICAgICAgICAgYXJncy5wdXNoKCdTTVRQVVRGOCcpO1xuICAgICAgICAgICAgdGhpcy5fdXNpbmdTbXRwVXRmOCA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJZiB0aGUgc2VydmVyIHN1cHBvcnRzIDhCSVRNSU1FIGFuZCB0aGUgbWVzc2FnZSBtaWdodCBjb250YWluIG5vbi1hc2NpaSBieXRlc1xuICAgICAgICAvLyB0aGVuIGFwcGVuZCB0aGUgOEJJVE1JTUUga2V5d29yZCB0byB0aGUgTUFJTCBGUk9NIGNvbW1hbmRcbiAgICAgICAgaWYgKHRoaXMuX2VudmVsb3BlLnVzZThCaXRNaW1lICYmIHRoaXMuX3N1cHBvcnRlZEV4dGVuc2lvbnMuaW5jbHVkZXMoJzhCSVRNSU1FJykpIHtcbiAgICAgICAgICAgIGFyZ3MucHVzaCgnQk9EWT04QklUTUlNRScpO1xuICAgICAgICAgICAgdGhpcy5fdXNpbmc4Qml0TWltZSA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5fZW52ZWxvcGUuc2l6ZSAmJiB0aGlzLl9zdXBwb3J0ZWRFeHRlbnNpb25zLmluY2x1ZGVzKCdTSVpFJykpIHtcbiAgICAgICAgICAgIGFyZ3MucHVzaCgnU0laRT0nICsgdGhpcy5fZW52ZWxvcGUuc2l6ZSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJZiB0aGUgc2VydmVyIHN1cHBvcnRzIERTTiBhbmQgdGhlIGVudmVsb3BlIGluY2x1ZGVzIGFuIERTTiBwcm9wXG4gICAgICAgIC8vIHRoZW4gYXBwZW5kIERTTiBwYXJhbXMgdG8gdGhlIE1BSUwgRlJPTSBjb21tYW5kXG4gICAgICAgIGlmICh0aGlzLl9lbnZlbG9wZS5kc24gJiYgdGhpcy5fc3VwcG9ydGVkRXh0ZW5zaW9ucy5pbmNsdWRlcygnRFNOJykpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9lbnZlbG9wZS5kc24ucmV0KSB7XG4gICAgICAgICAgICAgICAgYXJncy5wdXNoKCdSRVQ9JyArIHNoYXJlZC5lbmNvZGVYVGV4dCh0aGlzLl9lbnZlbG9wZS5kc24ucmV0KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5fZW52ZWxvcGUuZHNuLmVudmlkKSB7XG4gICAgICAgICAgICAgICAgYXJncy5wdXNoKCdFTlZJRD0nICsgc2hhcmVkLmVuY29kZVhUZXh0KHRoaXMuX2VudmVsb3BlLmRzbi5lbnZpZCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gUkZDIDg2ODk6IElmIHRoZSBlbnZlbG9wZSByZXF1ZXN0cyBSRVFVSVJFVExTIGV4dGVuc2lvblxuICAgICAgICAvLyB0aGVuIGFwcGVuZCBSRVFVSVJFVExTIGtleXdvcmQgdG8gdGhlIE1BSUwgRlJPTSBjb21tYW5kXG4gICAgICAgIC8vIE5vdGU6IFJFUVVJUkVUTFMgY2FuIG9ubHkgYmUgdXNlZCBvdmVyIFRMUyBjb25uZWN0aW9ucyBhbmQgcmVxdWlyZXMgc2VydmVyIHN1cHBvcnRcbiAgICAgICAgaWYgKHRoaXMuX2VudmVsb3BlLnJlcXVpcmVUTFNFeHRlbnNpb25FbmFibGVkKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuc2VjdXJlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKFxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9mb3JtYXRFcnJvcignUkVRVUlSRVRMUyBjYW4gb25seSBiZSB1c2VkIG92ZXIgVExTIGNvbm5lY3Rpb25zIChSRkMgODY4OSknLCAnRVJFUVVJUkVUTFMnLCBmYWxzZSwgJ01BSUwgRlJPTScpXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghdGhpcy5fc3VwcG9ydGVkRXh0ZW5zaW9ucy5pbmNsdWRlcygnUkVRVUlSRVRMUycpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKFxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9mb3JtYXRFcnJvcignU2VydmVyIGRvZXMgbm90IHN1cHBvcnQgUkVRVUlSRVRMUyBleHRlbnNpb24gKFJGQyA4Njg5KScsICdFUkVRVUlSRVRMUycsIGZhbHNlLCAnTUFJTCBGUk9NJylcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYXJncy5wdXNoKCdSRVFVSVJFVExTJyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9zZW5kQ29tbWFuZCgnTUFJTCBGUk9NOjwnICsgdGhpcy5fZW52ZWxvcGUuZnJvbSArICc+JyArIChhcmdzLmxlbmd0aCA/ICcgJyArIGFyZ3Muam9pbignICcpIDogJycpKTtcbiAgICB9XG5cbiAgICBfc2V0RHNuRW52ZWxvcGUocGFyYW1zKSB7XG4gICAgICAgIGxldCByZXQgPSAocGFyYW1zLnJldCB8fCBwYXJhbXMucmV0dXJuIHx8ICcnKS50b1N0cmluZygpLnRvVXBwZXJDYXNlKCkgfHwgbnVsbDtcbiAgICAgICAgaWYgKHJldCkge1xuICAgICAgICAgICAgc3dpdGNoIChyZXQpIHtcbiAgICAgICAgICAgICAgICBjYXNlICdIRFJTJzpcbiAgICAgICAgICAgICAgICBjYXNlICdIRUFERVJTJzpcbiAgICAgICAgICAgICAgICAgICAgcmV0ID0gJ0hEUlMnO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICdGVUxMJzpcbiAgICAgICAgICAgICAgICBjYXNlICdCT0RZJzpcbiAgICAgICAgICAgICAgICAgICAgcmV0ID0gJ0ZVTEwnO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChyZXQgJiYgIVsnRlVMTCcsICdIRFJTJ10uaW5jbHVkZXMocmV0KSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdyZXQ6ICcgKyBKU09OLnN0cmluZ2lmeShyZXQpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBlbnZpZCA9IChwYXJhbXMuZW52aWQgfHwgcGFyYW1zLmlkIHx8ICcnKS50b1N0cmluZygpIHx8IG51bGw7XG5cbiAgICAgICAgbGV0IG5vdGlmeSA9IHBhcmFtcy5ub3RpZnkgfHwgbnVsbDtcbiAgICAgICAgaWYgKG5vdGlmeSkge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBub3RpZnkgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgbm90aWZ5ID0gbm90aWZ5LnNwbGl0KCcsJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBub3RpZnkgPSBub3RpZnkubWFwKG4gPT4gbi50cmltKCkudG9VcHBlckNhc2UoKSk7XG4gICAgICAgICAgICBsZXQgdmFsaWROb3RpZnkgPSBbJ05FVkVSJywgJ1NVQ0NFU1MnLCAnRkFJTFVSRScsICdERUxBWSddO1xuICAgICAgICAgICAgbGV0IGludmFsaWROb3RpZnkgPSBub3RpZnkuZmlsdGVyKG4gPT4gIXZhbGlkTm90aWZ5LmluY2x1ZGVzKG4pKTtcbiAgICAgICAgICAgIGlmIChpbnZhbGlkTm90aWZ5Lmxlbmd0aCB8fCAobm90aWZ5Lmxlbmd0aCA+IDEgJiYgbm90aWZ5LmluY2x1ZGVzKCdORVZFUicpKSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignbm90aWZ5OiAnICsgSlNPTi5zdHJpbmdpZnkobm90aWZ5LmpvaW4oJywnKSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbm90aWZ5ID0gbm90aWZ5LmpvaW4oJywnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBvcmNwdCA9IChwYXJhbXMucmVjaXBpZW50IHx8IHBhcmFtcy5vcmNwdCB8fCAnJykudG9TdHJpbmcoKSB8fCBudWxsO1xuICAgICAgICBpZiAob3JjcHQgJiYgb3JjcHQuaW5kZXhPZignOycpIDwgMCkge1xuICAgICAgICAgICAgb3JjcHQgPSAncmZjODIyOycgKyBvcmNwdDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICByZXQsXG4gICAgICAgICAgICBlbnZpZCxcbiAgICAgICAgICAgIG5vdGlmeSxcbiAgICAgICAgICAgIG9yY3B0XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgX2dldERzblJjcHRUb0FyZ3MoKSB7XG4gICAgICAgIGxldCBhcmdzID0gW107XG4gICAgICAgIC8vIElmIHRoZSBzZXJ2ZXIgc3VwcG9ydHMgRFNOIGFuZCB0aGUgZW52ZWxvcGUgaW5jbHVkZXMgYW4gRFNOIHByb3BcbiAgICAgICAgLy8gdGhlbiBhcHBlbmQgRFNOIHBhcmFtcyB0byB0aGUgUkNQVCBUTyBjb21tYW5kXG4gICAgICAgIGlmICh0aGlzLl9lbnZlbG9wZS5kc24gJiYgdGhpcy5fc3VwcG9ydGVkRXh0ZW5zaW9ucy5pbmNsdWRlcygnRFNOJykpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9lbnZlbG9wZS5kc24ubm90aWZ5KSB7XG4gICAgICAgICAgICAgICAgYXJncy5wdXNoKCdOT1RJRlk9JyArIHNoYXJlZC5lbmNvZGVYVGV4dCh0aGlzLl9lbnZlbG9wZS5kc24ubm90aWZ5KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5fZW52ZWxvcGUuZHNuLm9yY3B0KSB7XG4gICAgICAgICAgICAgICAgYXJncy5wdXNoKCdPUkNQVD0nICsgc2hhcmVkLmVuY29kZVhUZXh0KHRoaXMuX2VudmVsb3BlLmRzbi5vcmNwdCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhcmdzLmxlbmd0aCA/ICcgJyArIGFyZ3Muam9pbignICcpIDogJyc7XG4gICAgfVxuXG4gICAgX2NyZWF0ZVNlbmRTdHJlYW0oY2FsbGJhY2spIHtcbiAgICAgICAgbGV0IGRhdGFTdHJlYW0gPSBuZXcgRGF0YVN0cmVhbSgpO1xuICAgICAgICBsZXQgbG9nU3RyZWFtO1xuXG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMubG10cCkge1xuICAgICAgICAgICAgdGhpcy5fZW52ZWxvcGUuYWNjZXB0ZWQuZm9yRWFjaCgocmVjaXBpZW50LCBpKSA9PiB7XG4gICAgICAgICAgICAgICAgbGV0IGZpbmFsID0gaSA9PT0gdGhpcy5fZW52ZWxvcGUuYWNjZXB0ZWQubGVuZ3RoIC0gMTtcbiAgICAgICAgICAgICAgICB0aGlzLl9yZXNwb25zZUFjdGlvbnMucHVzaChzdHIgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9hY3Rpb25MTVRQU3RyZWFtKHJlY2lwaWVudCwgZmluYWwsIHN0ciwgY2FsbGJhY2spO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9yZXNwb25zZUFjdGlvbnMucHVzaChzdHIgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuX2FjdGlvblNNVFBTdHJlYW0oc3RyLCBjYWxsYmFjayk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGRhdGFTdHJlYW0ucGlwZSh0aGlzLl9zb2NrZXQsIHtcbiAgICAgICAgICAgIGVuZDogZmFsc2VcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5kZWJ1Zykge1xuICAgICAgICAgICAgbG9nU3RyZWFtID0gbmV3IFBhc3NUaHJvdWdoKCk7XG4gICAgICAgICAgICBsb2dTdHJlYW0ub24oJ3JlYWRhYmxlJywgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGxldCBjaHVuaztcbiAgICAgICAgICAgICAgICB3aGlsZSAoKGNodW5rID0gbG9nU3RyZWFtLnJlYWQoKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG54OiAnbWVzc2FnZSdcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICBjaHVuay50b1N0cmluZygnYmluYXJ5JykucmVwbGFjZSgvXFxyP1xcbiQvLCAnJylcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGRhdGFTdHJlYW0ucGlwZShsb2dTdHJlYW0pO1xuICAgICAgICB9XG5cbiAgICAgICAgZGF0YVN0cmVhbS5vbmNlKCdlbmQnLCAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlci5pbmZvKFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgdG54OiAnbWVzc2FnZScsXG4gICAgICAgICAgICAgICAgICAgIGluQnl0ZUNvdW50OiBkYXRhU3RyZWFtLmluQnl0ZUNvdW50LFxuICAgICAgICAgICAgICAgICAgICBvdXRCeXRlQ291bnQ6IGRhdGFTdHJlYW0ub3V0Qnl0ZUNvdW50XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAnPCVzIGJ5dGVzIGVuY29kZWQgbWltZSBtZXNzYWdlIChzb3VyY2Ugc2l6ZSAlcyBieXRlcyk+JyxcbiAgICAgICAgICAgICAgICBkYXRhU3RyZWFtLm91dEJ5dGVDb3VudCxcbiAgICAgICAgICAgICAgICBkYXRhU3RyZWFtLmluQnl0ZUNvdW50XG4gICAgICAgICAgICApO1xuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gZGF0YVN0cmVhbTtcbiAgICB9XG5cbiAgICAvKiogQUNUSU9OUyAqKi9cblxuICAgIC8qKlxuICAgICAqIFdpbGwgYmUgcnVuIGFmdGVyIHRoZSBjb25uZWN0aW9uIGlzIGNyZWF0ZWQgYW5kIHRoZSBzZXJ2ZXIgc2VuZHNcbiAgICAgKiBhIGdyZWV0aW5nLiBJZiB0aGUgaW5jb21pbmcgbWVzc2FnZSBzdGFydHMgd2l0aCAyMjAgaW5pdGlhdGVcbiAgICAgKiBTTVRQIHNlc3Npb24gYnkgc2VuZGluZyBFSExPIGNvbW1hbmRcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBzdHIgTWVzc2FnZSBmcm9tIHRoZSBzZXJ2ZXJcbiAgICAgKi9cbiAgICBfYWN0aW9uR3JlZXRpbmcoc3RyKSB7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aGlzLl9ncmVldGluZ1RpbWVvdXQpO1xuXG4gICAgICAgIGlmIChzdHIuc3Vic3RyKDAsIDMpICE9PSAnMjIwJykge1xuICAgICAgICAgICAgdGhpcy5fb25FcnJvcihuZXcgRXJyb3IoJ0ludmFsaWQgZ3JlZXRpbmcuIHJlc3BvbnNlPScgKyBzdHIpLCAnRVBST1RPQ09MJywgc3RyLCAnQ09OTicpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5sbXRwKSB7XG4gICAgICAgICAgICB0aGlzLl9yZXNwb25zZUFjdGlvbnMucHVzaCh0aGlzLl9hY3Rpb25MSExPKTtcbiAgICAgICAgICAgIHRoaXMuX3NlbmRDb21tYW5kKCdMSExPICcgKyB0aGlzLm5hbWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fcmVzcG9uc2VBY3Rpb25zLnB1c2godGhpcy5fYWN0aW9uRUhMTyk7XG4gICAgICAgICAgICB0aGlzLl9zZW5kQ29tbWFuZCgnRUhMTyAnICsgdGhpcy5uYW1lKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEhhbmRsZXMgc2VydmVyIHJlc3BvbnNlIGZvciBMSExPIGNvbW1hbmQuIElmIGl0IHlpZWxkZWQgaW5cbiAgICAgKiBlcnJvciwgZW1pdCAnZXJyb3InLCBvdGhlcndpc2UgdHJlYXQgdGhpcyBhcyBhbiBFSExPIHJlc3BvbnNlXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gc3RyIE1lc3NhZ2UgZnJvbSB0aGUgc2VydmVyXG4gICAgICovXG4gICAgX2FjdGlvbkxITE8oc3RyKSB7XG4gICAgICAgIGlmIChzdHIuY2hhckF0KDApICE9PSAnMicpIHtcbiAgICAgICAgICAgIHRoaXMuX29uRXJyb3IobmV3IEVycm9yKCdJbnZhbGlkIExITE8uIHJlc3BvbnNlPScgKyBzdHIpLCAnRVBST1RPQ09MJywgc3RyLCAnTEhMTycpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fYWN0aW9uRUhMTyhzdHIpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEhhbmRsZXMgc2VydmVyIHJlc3BvbnNlIGZvciBFSExPIGNvbW1hbmQuIElmIGl0IHlpZWxkZWQgaW5cbiAgICAgKiBlcnJvciwgdHJ5IEhFTE8gaW5zdGVhZCwgb3RoZXJ3aXNlIGluaXRpYXRlIFRMUyBuZWdvdGlhdGlvblxuICAgICAqIGlmIFNUQVJUVExTIGlzIHN1cHBvcnRlZCBieSB0aGUgc2VydmVyIG9yIG1vdmUgaW50byB0aGVcbiAgICAgKiBhdXRoZW50aWNhdGlvbiBwaGFzZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBzdHIgTWVzc2FnZSBmcm9tIHRoZSBzZXJ2ZXJcbiAgICAgKi9cbiAgICBfYWN0aW9uRUhMTyhzdHIpIHtcbiAgICAgICAgbGV0IG1hdGNoO1xuXG4gICAgICAgIGlmIChzdHIuc3Vic3RyKDAsIDMpID09PSAnNDIxJykge1xuICAgICAgICAgICAgdGhpcy5fb25FcnJvcihuZXcgRXJyb3IoJ1NlcnZlciB0ZXJtaW5hdGVzIGNvbm5lY3Rpb24uIHJlc3BvbnNlPScgKyBzdHIpLCAnRUNPTk5FQ1RJT04nLCBzdHIsICdFSExPJyk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc3RyLmNoYXJBdCgwKSAhPT0gJzInKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnJlcXVpcmVUTFMpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9vbkVycm9yKFxuICAgICAgICAgICAgICAgICAgICBuZXcgRXJyb3IoJ0VITE8gZmFpbGVkIGJ1dCBIRUxPIGRvZXMgbm90IHN1cHBvcnQgcmVxdWlyZWQgU1RBUlRUTFMuIHJlc3BvbnNlPScgKyBzdHIpLFxuICAgICAgICAgICAgICAgICAgICAnRUNPTk5FQ1RJT04nLFxuICAgICAgICAgICAgICAgICAgICBzdHIsXG4gICAgICAgICAgICAgICAgICAgICdFSExPJ1xuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBUcnkgSEVMTyBpbnN0ZWFkXG4gICAgICAgICAgICB0aGlzLl9yZXNwb25zZUFjdGlvbnMucHVzaCh0aGlzLl9hY3Rpb25IRUxPKTtcbiAgICAgICAgICAgIHRoaXMuX3NlbmRDb21tYW5kKCdIRUxPICcgKyB0aGlzLm5hbWUpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fZWhsb0xpbmVzID0gc3RyXG4gICAgICAgICAgICAuc3BsaXQoL1xccj9cXG4vKVxuICAgICAgICAgICAgLm1hcChsaW5lID0+IGxpbmUucmVwbGFjZSgvXlxcZCtbIC1dLywgJycpLnRyaW0oKSlcbiAgICAgICAgICAgIC5maWx0ZXIobGluZSA9PiBsaW5lKVxuICAgICAgICAgICAgLnNsaWNlKDEpO1xuXG4gICAgICAgIC8vIERldGVjdCBpZiB0aGUgc2VydmVyIHN1cHBvcnRzIFNUQVJUVExTXG4gICAgICAgIGlmICghdGhpcy5zZWN1cmUgJiYgIXRoaXMub3B0aW9ucy5pZ25vcmVUTFMgJiYgKC9bIC1dU1RBUlRUTFNcXGIvaW0udGVzdChzdHIpIHx8IHRoaXMub3B0aW9ucy5yZXF1aXJlVExTKSkge1xuICAgICAgICAgICAgdGhpcy5fc2VuZENvbW1hbmQoJ1NUQVJUVExTJyk7XG4gICAgICAgICAgICB0aGlzLl9yZXNwb25zZUFjdGlvbnMucHVzaCh0aGlzLl9hY3Rpb25TVEFSVFRMUyk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBEZXRlY3QgaWYgdGhlIHNlcnZlciBzdXBwb3J0cyBTTVRQVVRGOFxuICAgICAgICBpZiAoL1sgLV1TTVRQVVRGOFxcYi9pbS50ZXN0KHN0cikpIHtcbiAgICAgICAgICAgIHRoaXMuX3N1cHBvcnRlZEV4dGVuc2lvbnMucHVzaCgnU01UUFVURjgnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIERldGVjdCBpZiB0aGUgc2VydmVyIHN1cHBvcnRzIERTTlxuICAgICAgICBpZiAoL1sgLV1EU05cXGIvaW0udGVzdChzdHIpKSB7XG4gICAgICAgICAgICB0aGlzLl9zdXBwb3J0ZWRFeHRlbnNpb25zLnB1c2goJ0RTTicpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRGV0ZWN0IGlmIHRoZSBzZXJ2ZXIgc3VwcG9ydHMgOEJJVE1JTUVcbiAgICAgICAgaWYgKC9bIC1dOEJJVE1JTUVcXGIvaW0udGVzdChzdHIpKSB7XG4gICAgICAgICAgICB0aGlzLl9zdXBwb3J0ZWRFeHRlbnNpb25zLnB1c2goJzhCSVRNSU1FJyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBEZXRlY3QgaWYgdGhlIHNlcnZlciBzdXBwb3J0cyBSRVFVSVJFVExTIChSRkMgODY4OSlcbiAgICAgICAgaWYgKC9bIC1dUkVRVUlSRVRMU1xcYi9pbS50ZXN0KHN0cikpIHtcbiAgICAgICAgICAgIHRoaXMuX3N1cHBvcnRlZEV4dGVuc2lvbnMucHVzaCgnUkVRVUlSRVRMUycpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRGV0ZWN0IGlmIHRoZSBzZXJ2ZXIgc3VwcG9ydHMgUElQRUxJTklOR1xuICAgICAgICBpZiAoL1sgLV1QSVBFTElOSU5HXFxiL2ltLnRlc3Qoc3RyKSkge1xuICAgICAgICAgICAgdGhpcy5fc3VwcG9ydGVkRXh0ZW5zaW9ucy5wdXNoKCdQSVBFTElOSU5HJyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBEZXRlY3QgaWYgdGhlIHNlcnZlciBzdXBwb3J0cyBBVVRIXG4gICAgICAgIGlmICgvWyAtXUFVVEhcXGIvaS50ZXN0KHN0cikpIHtcbiAgICAgICAgICAgIHRoaXMuYWxsb3dzQXV0aCA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBEZXRlY3QgaWYgdGhlIHNlcnZlciBzdXBwb3J0cyBQTEFJTiBhdXRoXG4gICAgICAgIGlmICgvWyAtXUFVVEgoPzooXFxzK3w9KVteXFxuXSpcXHMrfFxccyt8PSlQTEFJTi9pLnRlc3Qoc3RyKSkge1xuICAgICAgICAgICAgdGhpcy5fc3VwcG9ydGVkQXV0aC5wdXNoKCdQTEFJTicpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRGV0ZWN0IGlmIHRoZSBzZXJ2ZXIgc3VwcG9ydHMgTE9HSU4gYXV0aFxuICAgICAgICBpZiAoL1sgLV1BVVRIKD86KFxccyt8PSlbXlxcbl0qXFxzK3xcXHMrfD0pTE9HSU4vaS50ZXN0KHN0cikpIHtcbiAgICAgICAgICAgIHRoaXMuX3N1cHBvcnRlZEF1dGgucHVzaCgnTE9HSU4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIERldGVjdCBpZiB0aGUgc2VydmVyIHN1cHBvcnRzIENSQU0tTUQ1IGF1dGhcbiAgICAgICAgaWYgKC9bIC1dQVVUSCg/OihcXHMrfD0pW15cXG5dKlxccyt8XFxzK3w9KUNSQU0tTUQ1L2kudGVzdChzdHIpKSB7XG4gICAgICAgICAgICB0aGlzLl9zdXBwb3J0ZWRBdXRoLnB1c2goJ0NSQU0tTUQ1Jyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBEZXRlY3QgaWYgdGhlIHNlcnZlciBzdXBwb3J0cyBYT0FVVEgyIGF1dGhcbiAgICAgICAgaWYgKC9bIC1dQVVUSCg/OihcXHMrfD0pW15cXG5dKlxccyt8XFxzK3w9KVhPQVVUSDIvaS50ZXN0KHN0cikpIHtcbiAgICAgICAgICAgIHRoaXMuX3N1cHBvcnRlZEF1dGgucHVzaCgnWE9BVVRIMicpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRGV0ZWN0IGlmIHRoZSBzZXJ2ZXIgc3VwcG9ydHMgU0laRSBleHRlbnNpb25zIChhbmQgdGhlIG1heCBhbGxvd2VkIHNpemUpXG4gICAgICAgIGlmICgobWF0Y2ggPSBzdHIubWF0Y2goL1sgLV1TSVpFKD86WyBcXHRdKyhcXGQrKSk/L2ltKSkpIHtcbiAgICAgICAgICAgIHRoaXMuX3N1cHBvcnRlZEV4dGVuc2lvbnMucHVzaCgnU0laRScpO1xuICAgICAgICAgICAgdGhpcy5fbWF4QWxsb3dlZFNpemUgPSBOdW1iZXIobWF0Y2hbMV0pIHx8IDA7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmVtaXQoJ2Nvbm5lY3QnKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBIYW5kbGVzIHNlcnZlciByZXNwb25zZSBmb3IgSEVMTyBjb21tYW5kLiBJZiBpdCB5aWVsZGVkIGluXG4gICAgICogZXJyb3IsIGVtaXQgJ2Vycm9yJywgb3RoZXJ3aXNlIG1vdmUgaW50byB0aGUgYXV0aGVudGljYXRpb24gcGhhc2UuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gc3RyIE1lc3NhZ2UgZnJvbSB0aGUgc2VydmVyXG4gICAgICovXG4gICAgX2FjdGlvbkhFTE8oc3RyKSB7XG4gICAgICAgIGlmIChzdHIuY2hhckF0KDApICE9PSAnMicpIHtcbiAgICAgICAgICAgIHRoaXMuX29uRXJyb3IobmV3IEVycm9yKCdJbnZhbGlkIEhFTE8uIHJlc3BvbnNlPScgKyBzdHIpLCAnRVBST1RPQ09MJywgc3RyLCAnSEVMTycpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gYXNzdW1lIHRoYXQgYXV0aGVudGljYXRpb24gaXMgZW5hYmxlZCAobW9zdCBwcm9iYWJseSBpcyBub3QgdGhvdWdoKVxuICAgICAgICB0aGlzLmFsbG93c0F1dGggPSB0cnVlO1xuXG4gICAgICAgIHRoaXMuZW1pdCgnY29ubmVjdCcpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEhhbmRsZXMgc2VydmVyIHJlc3BvbnNlIGZvciBTVEFSVFRMUyBjb21tYW5kLiBJZiB0aGVyZSdzIGFuIGVycm9yXG4gICAgICogdHJ5IEhFTE8gaW5zdGVhZCwgb3RoZXJ3aXNlIGluaXRpYXRlIFRMUyB1cGdyYWRlLiBJZiB0aGUgdXBncmFkZVxuICAgICAqIHN1Y2NlZWRlcyByZXN0YXJ0IHRoZSBFSExPXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gc3RyIE1lc3NhZ2UgZnJvbSB0aGUgc2VydmVyXG4gICAgICovXG4gICAgX2FjdGlvblNUQVJUVExTKHN0cikge1xuICAgICAgICBpZiAoc3RyLmNoYXJBdCgwKSAhPT0gJzInKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLm9wcG9ydHVuaXN0aWNUTFMpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5pbmZvKFxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0bng6ICdzbXRwJ1xuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAnRmFpbGVkIFNUQVJUVExTIHVwZ3JhZGUsIGNvbnRpbnVpbmcgdW5lbmNyeXB0ZWQnXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5lbWl0KCdjb25uZWN0Jyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLl9vbkVycm9yKG5ldyBFcnJvcignRXJyb3IgdXBncmFkaW5nIGNvbm5lY3Rpb24gd2l0aCBTVEFSVFRMUycpLCAnRVRMUycsIHN0ciwgJ1NUQVJUVExTJyk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl91cGdyYWRlQ29ubmVjdGlvbigoZXJyLCBzZWN1cmVkKSA9PiB7XG4gICAgICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fb25FcnJvcihuZXcgRXJyb3IoJ0Vycm9yIGluaXRpYXRpbmcgVExTIC0gJyArIChlcnIubWVzc2FnZSB8fCBlcnIpKSwgJ0VUTFMnLCBmYWxzZSwgJ1NUQVJUVExTJyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLmxvZ2dlci5pbmZvKFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgdG54OiAnc210cCdcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICdDb25uZWN0aW9uIHVwZ3JhZGVkIHdpdGggU1RBUlRUTFMnXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBpZiAoc2VjdXJlZCkge1xuICAgICAgICAgICAgICAgIC8vIHJlc3RhcnQgc2Vzc2lvblxuICAgICAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMubG10cCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9yZXNwb25zZUFjdGlvbnMucHVzaCh0aGlzLl9hY3Rpb25MSExPKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fc2VuZENvbW1hbmQoJ0xITE8gJyArIHRoaXMubmFtZSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fcmVzcG9uc2VBY3Rpb25zLnB1c2godGhpcy5fYWN0aW9uRUhMTyk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3NlbmRDb21tYW5kKCdFSExPICcgKyB0aGlzLm5hbWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5lbWl0KCdjb25uZWN0Jyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEhhbmRsZSB0aGUgcmVzcG9uc2UgZm9yIEFVVEggTE9HSU4gY29tbWFuZC4gV2UgYXJlIGV4cGVjdGluZ1xuICAgICAqICczMzQgVlhObGNtNWhiV1U2JyAoYmFzZTY0IGZvciAnVXNlcm5hbWU6JykuIERhdGEgdG8gYmUgc2VudCBhc1xuICAgICAqIHJlc3BvbnNlIG5lZWRzIHRvIGJlIGJhc2U2NCBlbmNvZGVkIHVzZXJuYW1lLiBXZSBkbyBub3QgbmVlZFxuICAgICAqIGV4YWN0IG1hdGNoIGJ1dCBzZXR0bGUgd2l0aCAzMzQgcmVzcG9uc2UgaW4gZ2VuZXJhbCBhcyBzb21lXG4gICAgICogaG9zdHMgaW52YWxpZGx5IHVzZSBhIGxvbmdlciBtZXNzYWdlIHRoYW4gVlhObGNtNWhiV1U2XG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gc3RyIE1lc3NhZ2UgZnJvbSB0aGUgc2VydmVyXG4gICAgICovXG4gICAgX2FjdGlvbkFVVEhfTE9HSU5fVVNFUihzdHIsIGNhbGxiYWNrKSB7XG4gICAgICAgIGlmICghL14zMzRbIC1dLy50ZXN0KHN0cikpIHtcbiAgICAgICAgICAgIC8vIGV4cGVjdGluZyAnMzM0IFZYTmxjbTVoYldVNidcbiAgICAgICAgICAgIGNhbGxiYWNrKHRoaXMuX2Zvcm1hdEVycm9yKCdJbnZhbGlkIGxvZ2luIHNlcXVlbmNlIHdoaWxlIHdhaXRpbmcgZm9yIFwiMzM0IFZYTmxjbTVoYldVNlwiJywgJ0VBVVRIJywgc3RyLCAnQVVUSCBMT0dJTicpKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX3Jlc3BvbnNlQWN0aW9ucy5wdXNoKHN0ciA9PiB7XG4gICAgICAgICAgICB0aGlzLl9hY3Rpb25BVVRIX0xPR0lOX1BBU1Moc3RyLCBjYWxsYmFjayk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuX3NlbmRDb21tYW5kKEJ1ZmZlci5mcm9tKHRoaXMuX2F1dGguY3JlZGVudGlhbHMudXNlciArICcnLCAndXRmLTgnKS50b1N0cmluZygnYmFzZTY0JykpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEhhbmRsZSB0aGUgcmVzcG9uc2UgZm9yIEFVVEggQ1JBTS1NRDUgY29tbWFuZC4gV2UgYXJlIGV4cGVjdGluZ1xuICAgICAqICczMzQgPGNoYWxsZW5nZSBzdHJpbmc+Jy4gRGF0YSB0byBiZSBzZW50IGFzIHJlc3BvbnNlIG5lZWRzIHRvIGJlXG4gICAgICogYmFzZTY0IGRlY29kZWQgY2hhbGxlbmdlIHN0cmluZywgTUQ1IGhhc2hlZCB1c2luZyB0aGUgcGFzc3dvcmQgYXNcbiAgICAgKiBhIEhNQUMga2V5LCBwcmVmaXhlZCBieSB0aGUgdXNlcm5hbWUgYW5kIGEgc3BhY2UsIGFuZCBmaW5hbGx5IGFsbFxuICAgICAqIGJhc2U2NCBlbmNvZGVkIGFnYWluLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IHN0ciBNZXNzYWdlIGZyb20gdGhlIHNlcnZlclxuICAgICAqL1xuICAgIF9hY3Rpb25BVVRIX0NSQU1fTUQ1KHN0ciwgY2FsbGJhY2spIHtcbiAgICAgICAgbGV0IGNoYWxsZW5nZU1hdGNoID0gc3RyLm1hdGNoKC9eMzM0XFxzKyguKykkLyk7XG4gICAgICAgIGxldCBjaGFsbGVuZ2VTdHJpbmcgPSAnJztcblxuICAgICAgICBpZiAoIWNoYWxsZW5nZU1hdGNoKSB7XG4gICAgICAgICAgICByZXR1cm4gY2FsbGJhY2soXG4gICAgICAgICAgICAgICAgdGhpcy5fZm9ybWF0RXJyb3IoJ0ludmFsaWQgbG9naW4gc2VxdWVuY2Ugd2hpbGUgd2FpdGluZyBmb3Igc2VydmVyIGNoYWxsZW5nZSBzdHJpbmcnLCAnRUFVVEgnLCBzdHIsICdBVVRIIENSQU0tTUQ1JylcbiAgICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjaGFsbGVuZ2VTdHJpbmcgPSBjaGFsbGVuZ2VNYXRjaFsxXTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIERlY29kZSBmcm9tIGJhc2U2NFxuICAgICAgICBsZXQgYmFzZTY0ZGVjb2RlZCA9IEJ1ZmZlci5mcm9tKGNoYWxsZW5nZVN0cmluZywgJ2Jhc2U2NCcpLnRvU3RyaW5nKCdhc2NpaScpLFxuICAgICAgICAgICAgaG1hY01ENSA9IGNyeXB0by5jcmVhdGVIbWFjKCdtZDUnLCB0aGlzLl9hdXRoLmNyZWRlbnRpYWxzLnBhc3MpO1xuXG4gICAgICAgIGhtYWNNRDUudXBkYXRlKGJhc2U2NGRlY29kZWQpO1xuXG4gICAgICAgIGxldCBwcmVwZW5kZWQgPSB0aGlzLl9hdXRoLmNyZWRlbnRpYWxzLnVzZXIgKyAnICcgKyBobWFjTUQ1LmRpZ2VzdCgnaGV4Jyk7XG5cbiAgICAgICAgdGhpcy5fcmVzcG9uc2VBY3Rpb25zLnB1c2goc3RyID0+IHtcbiAgICAgICAgICAgIHRoaXMuX2FjdGlvbkFVVEhfQ1JBTV9NRDVfUEFTUyhzdHIsIGNhbGxiYWNrKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5fc2VuZENvbW1hbmQoXG4gICAgICAgICAgICBCdWZmZXIuZnJvbShwcmVwZW5kZWQpLnRvU3RyaW5nKCdiYXNlNjQnKSxcbiAgICAgICAgICAgIC8vIGhpZGRlbiBoYXNoIGZvciBsb2dzXG4gICAgICAgICAgICBCdWZmZXIuZnJvbSh0aGlzLl9hdXRoLmNyZWRlbnRpYWxzLnVzZXIgKyAnIC8qIHNlY3JldCAqLycpLnRvU3RyaW5nKCdiYXNlNjQnKVxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEhhbmRsZXMgdGhlIHJlc3BvbnNlIHRvIENSQU0tTUQ1IGF1dGhlbnRpY2F0aW9uLCBpZiB0aGVyZSdzIG5vIGVycm9yLFxuICAgICAqIHRoZSB1c2VyIGNhbiBiZSBjb25zaWRlcmVkIGxvZ2dlZCBpbi4gU3RhcnQgd2FpdGluZyBmb3IgYSBtZXNzYWdlIHRvIHNlbmRcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBzdHIgTWVzc2FnZSBmcm9tIHRoZSBzZXJ2ZXJcbiAgICAgKi9cbiAgICBfYWN0aW9uQVVUSF9DUkFNX01ENV9QQVNTKHN0ciwgY2FsbGJhY2spIHtcbiAgICAgICAgaWYgKCFzdHIubWF0Y2goL14yMzVcXHMrLykpIHtcbiAgICAgICAgICAgIHJldHVybiBjYWxsYmFjayh0aGlzLl9mb3JtYXRFcnJvcignSW52YWxpZCBsb2dpbiBzZXF1ZW5jZSB3aGlsZSB3YWl0aW5nIGZvciBcIjIzNVwiJywgJ0VBVVRIJywgc3RyLCAnQVVUSCBDUkFNLU1ENScpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMubG9nZ2VyLmluZm8oXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdG54OiAnc210cCcsXG4gICAgICAgICAgICAgICAgdXNlcm5hbWU6IHRoaXMuX2F1dGgudXNlcixcbiAgICAgICAgICAgICAgICBhY3Rpb246ICdhdXRoZW50aWNhdGVkJyxcbiAgICAgICAgICAgICAgICBtZXRob2Q6IHRoaXMuX2F1dGhNZXRob2RcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnVXNlciAlcyBhdXRoZW50aWNhdGVkJyxcbiAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KHRoaXMuX2F1dGgudXNlcilcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5hdXRoZW50aWNhdGVkID0gdHJ1ZTtcbiAgICAgICAgY2FsbGJhY2sobnVsbCwgdHJ1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSGFuZGxlIHRoZSByZXNwb25zZSBmb3IgQVVUSCBMT0dJTiBjb21tYW5kLiBXZSBhcmUgZXhwZWN0aW5nXG4gICAgICogJzMzNCBVR0Z6YzNkdmNtUTYnIChiYXNlNjQgZm9yICdQYXNzd29yZDonKS4gRGF0YSB0byBiZSBzZW50IGFzXG4gICAgICogcmVzcG9uc2UgbmVlZHMgdG8gYmUgYmFzZTY0IGVuY29kZWQgcGFzc3dvcmQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gc3RyIE1lc3NhZ2UgZnJvbSB0aGUgc2VydmVyXG4gICAgICovXG4gICAgX2FjdGlvbkFVVEhfTE9HSU5fUEFTUyhzdHIsIGNhbGxiYWNrKSB7XG4gICAgICAgIGlmICghL14zMzRbIC1dLy50ZXN0KHN0cikpIHtcbiAgICAgICAgICAgIC8vIGV4cGVjdGluZyAnMzM0IFVHRnpjM2R2Y21RNidcbiAgICAgICAgICAgIHJldHVybiBjYWxsYmFjayh0aGlzLl9mb3JtYXRFcnJvcignSW52YWxpZCBsb2dpbiBzZXF1ZW5jZSB3aGlsZSB3YWl0aW5nIGZvciBcIjMzNCBVR0Z6YzNkdmNtUTZcIicsICdFQVVUSCcsIHN0ciwgJ0FVVEggTE9HSU4nKSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9yZXNwb25zZUFjdGlvbnMucHVzaChzdHIgPT4ge1xuICAgICAgICAgICAgdGhpcy5fYWN0aW9uQVVUSENvbXBsZXRlKHN0ciwgY2FsbGJhY2spO1xuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLl9zZW5kQ29tbWFuZChcbiAgICAgICAgICAgIEJ1ZmZlci5mcm9tKCh0aGlzLl9hdXRoLmNyZWRlbnRpYWxzLnBhc3MgfHwgJycpLnRvU3RyaW5nKCksICd1dGYtOCcpLnRvU3RyaW5nKCdiYXNlNjQnKSxcbiAgICAgICAgICAgIC8vIEhpZGRlbiBwYXNzIGZvciBsb2dzXG4gICAgICAgICAgICBCdWZmZXIuZnJvbSgnLyogc2VjcmV0ICovJywgJ3V0Zi04JykudG9TdHJpbmcoJ2Jhc2U2NCcpXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSGFuZGxlcyB0aGUgcmVzcG9uc2UgZm9yIGF1dGhlbnRpY2F0aW9uLCBpZiB0aGVyZSdzIG5vIGVycm9yLFxuICAgICAqIHRoZSB1c2VyIGNhbiBiZSBjb25zaWRlcmVkIGxvZ2dlZCBpbi4gU3RhcnQgd2FpdGluZyBmb3IgYSBtZXNzYWdlIHRvIHNlbmRcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBzdHIgTWVzc2FnZSBmcm9tIHRoZSBzZXJ2ZXJcbiAgICAgKi9cbiAgICBfYWN0aW9uQVVUSENvbXBsZXRlKHN0ciwgaXNSZXRyeSwgY2FsbGJhY2spIHtcbiAgICAgICAgaWYgKCFjYWxsYmFjayAmJiB0eXBlb2YgaXNSZXRyeSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgY2FsbGJhY2sgPSBpc1JldHJ5O1xuICAgICAgICAgICAgaXNSZXRyeSA9IGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHN0ci5zdWJzdHIoMCwgMykgPT09ICczMzQnKSB7XG4gICAgICAgICAgICB0aGlzLl9yZXNwb25zZUFjdGlvbnMucHVzaChzdHIgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChpc1JldHJ5IHx8IHRoaXMuX2F1dGhNZXRob2QgIT09ICdYT0FVVEgyJykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9hY3Rpb25BVVRIQ29tcGxldGUoc3RyLCB0cnVlLCBjYWxsYmFjayk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gZmV0Y2ggYSBuZXcgT0F1dGgyIGFjY2VzcyB0b2tlblxuICAgICAgICAgICAgICAgICAgICBzZXRJbW1lZGlhdGUoKCkgPT4gdGhpcy5faGFuZGxlWE9hdXRoMlRva2VuKHRydWUsIGNhbGxiYWNrKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLl9zZW5kQ29tbWFuZCgnJyk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc3RyLmNoYXJBdCgwKSAhPT0gJzInKSB7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlci5pbmZvKFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgdG54OiAnc210cCcsXG4gICAgICAgICAgICAgICAgICAgIHVzZXJuYW1lOiB0aGlzLl9hdXRoLnVzZXIsXG4gICAgICAgICAgICAgICAgICAgIGFjdGlvbjogJ2F1dGhmYWlsJyxcbiAgICAgICAgICAgICAgICAgICAgbWV0aG9kOiB0aGlzLl9hdXRoTWV0aG9kXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAnVXNlciAlcyBmYWlsZWQgdG8gYXV0aGVudGljYXRlJyxcbiAgICAgICAgICAgICAgICBKU09OLnN0cmluZ2lmeSh0aGlzLl9hdXRoLnVzZXIpXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKHRoaXMuX2Zvcm1hdEVycm9yKCdJbnZhbGlkIGxvZ2luJywgJ0VBVVRIJywgc3RyLCAnQVVUSCAnICsgdGhpcy5fYXV0aE1ldGhvZCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5sb2dnZXIuaW5mbyhcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB0bng6ICdzbXRwJyxcbiAgICAgICAgICAgICAgICB1c2VybmFtZTogdGhpcy5fYXV0aC51c2VyLFxuICAgICAgICAgICAgICAgIGFjdGlvbjogJ2F1dGhlbnRpY2F0ZWQnLFxuICAgICAgICAgICAgICAgIG1ldGhvZDogdGhpcy5fYXV0aE1ldGhvZFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICdVc2VyICVzIGF1dGhlbnRpY2F0ZWQnLFxuICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkodGhpcy5fYXV0aC51c2VyKVxuICAgICAgICApO1xuICAgICAgICB0aGlzLmF1dGhlbnRpY2F0ZWQgPSB0cnVlO1xuICAgICAgICBjYWxsYmFjayhudWxsLCB0cnVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBIYW5kbGUgcmVzcG9uc2UgZm9yIGEgTUFJTCBGUk9NOiBjb21tYW5kXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gc3RyIE1lc3NhZ2UgZnJvbSB0aGUgc2VydmVyXG4gICAgICovXG4gICAgX2FjdGlvbk1BSUwoc3RyLCBjYWxsYmFjaykge1xuICAgICAgICBsZXQgbWVzc2FnZSwgY3VyUmVjaXBpZW50O1xuICAgICAgICBpZiAoTnVtYmVyKHN0ci5jaGFyQXQoMCkpICE9PSAyKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5fdXNpbmdTbXRwVXRmOCAmJiAvXjU1MCAvLnRlc3Qoc3RyKSAmJiAvW1xceDgwLVxcdUZGRkZdLy50ZXN0KHRoaXMuX2VudmVsb3BlLmZyb20pKSB7XG4gICAgICAgICAgICAgICAgbWVzc2FnZSA9ICdJbnRlcm5hdGlvbmFsaXplZCBtYWlsYm94IG5hbWUgbm90IGFsbG93ZWQnO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBtZXNzYWdlID0gJ01haWwgY29tbWFuZCBmYWlsZWQnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKHRoaXMuX2Zvcm1hdEVycm9yKG1lc3NhZ2UsICdFRU5WRUxPUEUnLCBzdHIsICdNQUlMIEZST00nKSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMuX2VudmVsb3BlLnJjcHRRdWV1ZS5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiBjYWxsYmFjayh0aGlzLl9mb3JtYXRFcnJvcihcIkNhbid0IHNlbmQgbWFpbCAtIG5vIHJlY2lwaWVudHMgZGVmaW5lZFwiLCAnRUVOVkVMT1BFJywgZmFsc2UsICdBUEknKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9yZWNpcGllbnRRdWV1ZSA9IFtdO1xuXG4gICAgICAgICAgICBpZiAodGhpcy5fc3VwcG9ydGVkRXh0ZW5zaW9ucy5pbmNsdWRlcygnUElQRUxJTklORycpKSB7XG4gICAgICAgICAgICAgICAgd2hpbGUgKHRoaXMuX2VudmVsb3BlLnJjcHRRdWV1ZS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgY3VyUmVjaXBpZW50ID0gdGhpcy5fZW52ZWxvcGUucmNwdFF1ZXVlLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3JlY2lwaWVudFF1ZXVlLnB1c2goY3VyUmVjaXBpZW50KTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fcmVzcG9uc2VBY3Rpb25zLnB1c2goc3RyID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2FjdGlvblJDUFQoc3RyLCBjYWxsYmFjayk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9zZW5kQ29tbWFuZCgnUkNQVCBUTzo8JyArIGN1clJlY2lwaWVudCArICc+JyArIHRoaXMuX2dldERzblJjcHRUb0FyZ3MoKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjdXJSZWNpcGllbnQgPSB0aGlzLl9lbnZlbG9wZS5yY3B0UXVldWUuc2hpZnQoKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9yZWNpcGllbnRRdWV1ZS5wdXNoKGN1clJlY2lwaWVudCk7XG4gICAgICAgICAgICAgICAgdGhpcy5fcmVzcG9uc2VBY3Rpb25zLnB1c2goc3RyID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fYWN0aW9uUkNQVChzdHIsIGNhbGxiYWNrKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB0aGlzLl9zZW5kQ29tbWFuZCgnUkNQVCBUTzo8JyArIGN1clJlY2lwaWVudCArICc+JyArIHRoaXMuX2dldERzblJjcHRUb0FyZ3MoKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBIYW5kbGUgcmVzcG9uc2UgZm9yIGEgUkNQVCBUTzogY29tbWFuZFxuICAgICAqXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IHN0ciBNZXNzYWdlIGZyb20gdGhlIHNlcnZlclxuICAgICAqL1xuICAgIF9hY3Rpb25SQ1BUKHN0ciwgY2FsbGJhY2spIHtcbiAgICAgICAgbGV0IG1lc3NhZ2UsXG4gICAgICAgICAgICBlcnIsXG4gICAgICAgICAgICBjdXJSZWNpcGllbnQgPSB0aGlzLl9yZWNpcGllbnRRdWV1ZS5zaGlmdCgpO1xuICAgICAgICBpZiAoTnVtYmVyKHN0ci5jaGFyQXQoMCkpICE9PSAyKSB7XG4gICAgICAgICAgICAvLyB0aGlzIGlzIGEgc29mdCBlcnJvclxuICAgICAgICAgICAgaWYgKHRoaXMuX3VzaW5nU210cFV0ZjggJiYgL141NTMgLy50ZXN0KHN0cikgJiYgL1tcXHg4MC1cXHVGRkZGXS8udGVzdChjdXJSZWNpcGllbnQpKSB7XG4gICAgICAgICAgICAgICAgbWVzc2FnZSA9ICdJbnRlcm5hdGlvbmFsaXplZCBtYWlsYm94IG5hbWUgbm90IGFsbG93ZWQnO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBtZXNzYWdlID0gJ1JlY2lwaWVudCBjb21tYW5kIGZhaWxlZCc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLl9lbnZlbG9wZS5yZWplY3RlZC5wdXNoKGN1clJlY2lwaWVudCk7XG4gICAgICAgICAgICAvLyBzdG9yZSBlcnJvciBmb3IgdGhlIGZhaWxlZCByZWNpcGllbnRcbiAgICAgICAgICAgIGVyciA9IHRoaXMuX2Zvcm1hdEVycm9yKG1lc3NhZ2UsICdFRU5WRUxPUEUnLCBzdHIsICdSQ1BUIFRPJyk7XG4gICAgICAgICAgICBlcnIucmVjaXBpZW50ID0gY3VyUmVjaXBpZW50O1xuICAgICAgICAgICAgdGhpcy5fZW52ZWxvcGUucmVqZWN0ZWRFcnJvcnMucHVzaChlcnIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fZW52ZWxvcGUuYWNjZXB0ZWQucHVzaChjdXJSZWNpcGllbnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0aGlzLl9lbnZlbG9wZS5yY3B0UXVldWUubGVuZ3RoICYmICF0aGlzLl9yZWNpcGllbnRRdWV1ZS5sZW5ndGgpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9lbnZlbG9wZS5yZWplY3RlZC5sZW5ndGggPCB0aGlzLl9lbnZlbG9wZS50by5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9yZXNwb25zZUFjdGlvbnMucHVzaChzdHIgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9hY3Rpb25EQVRBKHN0ciwgY2FsbGJhY2spO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHRoaXMuX3NlbmRDb21tYW5kKCdEQVRBJyk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGVyciA9IHRoaXMuX2Zvcm1hdEVycm9yKFwiQ2FuJ3Qgc2VuZCBtYWlsIC0gYWxsIHJlY2lwaWVudHMgd2VyZSByZWplY3RlZFwiLCAnRUVOVkVMT1BFJywgc3RyLCAnUkNQVCBUTycpO1xuICAgICAgICAgICAgICAgIGVyci5yZWplY3RlZCA9IHRoaXMuX2VudmVsb3BlLnJlamVjdGVkO1xuICAgICAgICAgICAgICAgIGVyci5yZWplY3RlZEVycm9ycyA9IHRoaXMuX2VudmVsb3BlLnJlamVjdGVkRXJyb3JzO1xuICAgICAgICAgICAgICAgIHJldHVybiBjYWxsYmFjayhlcnIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuX2VudmVsb3BlLnJjcHRRdWV1ZS5sZW5ndGgpIHtcbiAgICAgICAgICAgIGN1clJlY2lwaWVudCA9IHRoaXMuX2VudmVsb3BlLnJjcHRRdWV1ZS5zaGlmdCgpO1xuICAgICAgICAgICAgdGhpcy5fcmVjaXBpZW50UXVldWUucHVzaChjdXJSZWNpcGllbnQpO1xuICAgICAgICAgICAgdGhpcy5fcmVzcG9uc2VBY3Rpb25zLnB1c2goc3RyID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLl9hY3Rpb25SQ1BUKHN0ciwgY2FsbGJhY2spO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLl9zZW5kQ29tbWFuZCgnUkNQVCBUTzo8JyArIGN1clJlY2lwaWVudCArICc+JyArIHRoaXMuX2dldERzblJjcHRUb0FyZ3MoKSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBIYW5kbGUgcmVzcG9uc2UgZm9yIGEgREFUQSBjb21tYW5kXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gc3RyIE1lc3NhZ2UgZnJvbSB0aGUgc2VydmVyXG4gICAgICovXG4gICAgX2FjdGlvbkRBVEEoc3RyLCBjYWxsYmFjaykge1xuICAgICAgICAvLyByZXNwb25zZSBzaG91bGQgYmUgMzU0IGJ1dCBhY2NvcmRpbmcgdG8gdGhpcyBpc3N1ZSBodHRwczovL2dpdGh1Yi5jb20vZWxlaXRoL2VtYWlsanMvaXNzdWVzLzI0XG4gICAgICAgIC8vIHNvbWUgc2VydmVycyBtaWdodCB1c2UgMjUwIGluc3RlYWQsIHNvIGxldHMgY2hlY2sgZm9yIDIgb3IgMyBhcyB0aGUgZmlyc3QgZGlnaXRcbiAgICAgICAgaWYgKCEvXlsyM10vLnRlc3Qoc3RyKSkge1xuICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKHRoaXMuX2Zvcm1hdEVycm9yKCdEYXRhIGNvbW1hbmQgZmFpbGVkJywgJ0VFTlZFTE9QRScsIHN0ciwgJ0RBVEEnKSk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgcmVzcG9uc2UgPSB7XG4gICAgICAgICAgICBhY2NlcHRlZDogdGhpcy5fZW52ZWxvcGUuYWNjZXB0ZWQsXG4gICAgICAgICAgICByZWplY3RlZDogdGhpcy5fZW52ZWxvcGUucmVqZWN0ZWRcbiAgICAgICAgfTtcblxuICAgICAgICBpZiAodGhpcy5fZWhsb0xpbmVzICYmIHRoaXMuX2VobG9MaW5lcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJlc3BvbnNlLmVobG8gPSB0aGlzLl9laGxvTGluZXM7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5fZW52ZWxvcGUucmVqZWN0ZWRFcnJvcnMubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXNwb25zZS5yZWplY3RlZEVycm9ycyA9IHRoaXMuX2VudmVsb3BlLnJlamVjdGVkRXJyb3JzO1xuICAgICAgICB9XG5cbiAgICAgICAgY2FsbGJhY2sobnVsbCwgcmVzcG9uc2UpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEhhbmRsZSByZXNwb25zZSBmb3IgYSBEQVRBIHN0cmVhbSB3aGVuIHVzaW5nIFNNVFBcbiAgICAgKiBXZSBleHBlY3QgYSBzaW5nbGUgcmVzcG9uc2UgdGhhdCBkZWZpbmVzIGlmIHRoZSBzZW5kaW5nIHN1Y2NlZWRlZCBvciBmYWlsZWRcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBzdHIgTWVzc2FnZSBmcm9tIHRoZSBzZXJ2ZXJcbiAgICAgKi9cbiAgICBfYWN0aW9uU01UUFN0cmVhbShzdHIsIGNhbGxiYWNrKSB7XG4gICAgICAgIGlmIChOdW1iZXIoc3RyLmNoYXJBdCgwKSkgIT09IDIpIHtcbiAgICAgICAgICAgIC8vIE1lc3NhZ2UgZmFpbGVkXG4gICAgICAgICAgICByZXR1cm4gY2FsbGJhY2sodGhpcy5fZm9ybWF0RXJyb3IoJ01lc3NhZ2UgZmFpbGVkJywgJ0VNRVNTQUdFJywgc3RyLCAnREFUQScpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIE1lc3NhZ2Ugc2VudCBzdWNjZXNmdWxseVxuICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKG51bGwsIHN0cik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBIYW5kbGUgcmVzcG9uc2UgZm9yIGEgREFUQSBzdHJlYW1cbiAgICAgKiBXZSBleHBlY3QgYSBzZXBhcmF0ZSByZXNwb25zZSBmb3IgZXZlcnkgcmVjaXBpZW50LiBBbGwgcmVjaXBpZW50cyBjYW4gZWl0aGVyXG4gICAgICogc3VjY2VlZCBvciBmYWlsIHNlcGFyYXRlbHlcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSByZWNpcGllbnQgVGhlIHJlY2lwaWVudCB0aGlzIHJlc3BvbnNlIGFwcGxpZXMgdG9cbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IGZpbmFsIElzIHRoaXMgdGhlIGZpbmFsIHJlY2lwaWVudD9cbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gc3RyIE1lc3NhZ2UgZnJvbSB0aGUgc2VydmVyXG4gICAgICovXG4gICAgX2FjdGlvbkxNVFBTdHJlYW0ocmVjaXBpZW50LCBmaW5hbCwgc3RyLCBjYWxsYmFjaykge1xuICAgICAgICBsZXQgZXJyO1xuICAgICAgICBpZiAoTnVtYmVyKHN0ci5jaGFyQXQoMCkpICE9PSAyKSB7XG4gICAgICAgICAgICAvLyBNZXNzYWdlIGZhaWxlZFxuICAgICAgICAgICAgZXJyID0gdGhpcy5fZm9ybWF0RXJyb3IoJ01lc3NhZ2UgZmFpbGVkIGZvciByZWNpcGllbnQgJyArIHJlY2lwaWVudCwgJ0VNRVNTQUdFJywgc3RyLCAnREFUQScpO1xuICAgICAgICAgICAgZXJyLnJlY2lwaWVudCA9IHJlY2lwaWVudDtcbiAgICAgICAgICAgIHRoaXMuX2VudmVsb3BlLnJlamVjdGVkLnB1c2gocmVjaXBpZW50KTtcbiAgICAgICAgICAgIHRoaXMuX2VudmVsb3BlLnJlamVjdGVkRXJyb3JzLnB1c2goZXJyKTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSB0aGlzLl9lbnZlbG9wZS5hY2NlcHRlZC5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9lbnZlbG9wZS5hY2NlcHRlZFtpXSA9PT0gcmVjaXBpZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2VudmVsb3BlLmFjY2VwdGVkLnNwbGljZShpLCAxKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGZpbmFsKSB7XG4gICAgICAgICAgICByZXR1cm4gY2FsbGJhY2sobnVsbCwgc3RyKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIF9oYW5kbGVYT2F1dGgyVG9rZW4oaXNSZXRyeSwgY2FsbGJhY2spIHtcbiAgICAgICAgdGhpcy5fYXV0aC5vYXV0aDIuZ2V0VG9rZW4oaXNSZXRyeSwgKGVyciwgYWNjZXNzVG9rZW4pID0+IHtcbiAgICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5pbmZvKFxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0bng6ICdzbXRwJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJuYW1lOiB0aGlzLl9hdXRoLnVzZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb246ICdhdXRoZmFpbCcsXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXRob2Q6IHRoaXMuX2F1dGhNZXRob2RcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgJ1VzZXIgJXMgZmFpbGVkIHRvIGF1dGhlbnRpY2F0ZScsXG4gICAgICAgICAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KHRoaXMuX2F1dGgudXNlcilcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIHJldHVybiBjYWxsYmFjayh0aGlzLl9mb3JtYXRFcnJvcihlcnIsICdFQVVUSCcsIGZhbHNlLCAnQVVUSCBYT0FVVEgyJykpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5fcmVzcG9uc2VBY3Rpb25zLnB1c2goc3RyID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLl9hY3Rpb25BVVRIQ29tcGxldGUoc3RyLCBpc1JldHJ5LCBjYWxsYmFjayk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMuX3NlbmRDb21tYW5kKFxuICAgICAgICAgICAgICAgICdBVVRIIFhPQVVUSDIgJyArIHRoaXMuX2F1dGgub2F1dGgyLmJ1aWxkWE9BdXRoMlRva2VuKGFjY2Vzc1Rva2VuKSxcbiAgICAgICAgICAgICAgICAvLyAgSGlkZGVuIGZvciBsb2dzXG4gICAgICAgICAgICAgICAgJ0FVVEggWE9BVVRIMiAnICsgdGhpcy5fYXV0aC5vYXV0aDIuYnVpbGRYT0F1dGgyVG9rZW4oJy8qIHNlY3JldCAqLycpXG4gICAgICAgICAgICApO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBjb21tYW5kXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBfaXNEZXN0cm95ZWRNZXNzYWdlKGNvbW1hbmQpIHtcbiAgICAgICAgaWYgKHRoaXMuX2Rlc3Ryb3llZCkge1xuICAgICAgICAgICAgcmV0dXJuICdDYW5ub3QgJyArIGNvbW1hbmQgKyAnIC0gc210cCBjb25uZWN0aW9uIGlzIGFscmVhZHkgZGVzdHJveWVkLic7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5fc29ja2V0KSB7XG4gICAgICAgICAgICBpZiAodGhpcy5fc29ja2V0LmRlc3Ryb3llZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAnQ2Fubm90ICcgKyBjb21tYW5kICsgJyAtIHNtdHAgY29ubmVjdGlvbiBzb2NrZXQgaXMgYWxyZWFkeSBkZXN0cm95ZWQuJztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKCF0aGlzLl9zb2NrZXQud3JpdGFibGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ0Nhbm5vdCAnICsgY29tbWFuZCArICcgLSBzbXRwIGNvbm5lY3Rpb24gc29ja2V0IGlzIGFscmVhZHkgaGFsZi1jbG9zZWQuJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIF9nZXRIb3N0bmFtZSgpIHtcbiAgICAgICAgLy8gZGVmYXVsIGhvc3RuYW1lIGlzIG1hY2hpbmUgaG9zdG5hbWUgb3IgW0lQXVxuICAgICAgICBsZXQgZGVmYXVsdEhvc3RuYW1lO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgZGVmYXVsdEhvc3RuYW1lID0gb3MuaG9zdG5hbWUoKSB8fCAnJztcbiAgICAgICAgfSBjYXRjaCAoX2Vycikge1xuICAgICAgICAgICAgLy8gZmFpbHMgb24gd2luZG93cyA3XG4gICAgICAgICAgICBkZWZhdWx0SG9zdG5hbWUgPSAnbG9jYWxob3N0JztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGlnbm9yZSBpZiBub3QgRlFETlxuICAgICAgICBpZiAoIWRlZmF1bHRIb3N0bmFtZSB8fCBkZWZhdWx0SG9zdG5hbWUuaW5kZXhPZignLicpIDwgMCkge1xuICAgICAgICAgICAgZGVmYXVsdEhvc3RuYW1lID0gJ1sxMjcuMC4wLjFdJztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIElQIHNob3VsZCBiZSBlbmNsb3NlZCBpbiBbXVxuICAgICAgICBpZiAoZGVmYXVsdEhvc3RuYW1lLm1hdGNoKC9eXFxkezEsM31cXC5cXGR7MSwzfVxcLlxcZHsxLDN9XFwuXFxkezEsM30kLykpIHtcbiAgICAgICAgICAgIGRlZmF1bHRIb3N0bmFtZSA9ICdbJyArIGRlZmF1bHRIb3N0bmFtZSArICddJztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBkZWZhdWx0SG9zdG5hbWU7XG4gICAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IFNNVFBDb25uZWN0aW9uO1xuIl0sIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6WzBdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(action-browser)/./node_modules/.pnpm/nodemailer@7.0.13/node_modules/nodemailer/lib/smtp-connection/index.js\n");
|
||
|
||
/***/ }),
|
||
|
||
/***/ "(action-browser)/./node_modules/.pnpm/nodemailer@7.0.13/node_modules/nodemailer/lib/smtp-pool/index.js":
|
||
/*!*********************************************************************************************!*\
|
||
!*** ./node_modules/.pnpm/nodemailer@7.0.13/node_modules/nodemailer/lib/smtp-pool/index.js ***!
|
||
\*********************************************************************************************/
|
||
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
|
||
|
||
eval("\n\nconst EventEmitter = __webpack_require__(/*! events */ \"events\");\nconst PoolResource = __webpack_require__(/*! ./pool-resource */ \"(action-browser)/./node_modules/.pnpm/nodemailer@7.0.13/node_modules/nodemailer/lib/smtp-pool/pool-resource.js\");\nconst SMTPConnection = __webpack_require__(/*! ../smtp-connection */ \"(action-browser)/./node_modules/.pnpm/nodemailer@7.0.13/node_modules/nodemailer/lib/smtp-connection/index.js\");\nconst wellKnown = __webpack_require__(/*! ../well-known */ \"(action-browser)/./node_modules/.pnpm/nodemailer@7.0.13/node_modules/nodemailer/lib/well-known/index.js\");\nconst shared = __webpack_require__(/*! ../shared */ \"(action-browser)/./node_modules/.pnpm/nodemailer@7.0.13/node_modules/nodemailer/lib/shared/index.js\");\nconst packageData = __webpack_require__(/*! ../../package.json */ \"(action-browser)/./node_modules/.pnpm/nodemailer@7.0.13/node_modules/nodemailer/package.json\");\n\n/**\n * Creates a SMTP pool transport object for Nodemailer\n *\n * @constructor\n * @param {Object} options SMTP Connection options\n */\nclass SMTPPool extends EventEmitter {\n constructor(options) {\n super();\n\n options = options || {};\n if (typeof options === 'string') {\n options = {\n url: options\n };\n }\n\n let urlData;\n let service = options.service;\n\n if (typeof options.getSocket === 'function') {\n this.getSocket = options.getSocket;\n }\n\n if (options.url) {\n urlData = shared.parseConnectionUrl(options.url);\n service = service || urlData.service;\n }\n\n this.options = shared.assign(\n false, // create new object\n options, // regular options\n urlData, // url options\n service && wellKnown(service) // wellknown options\n );\n\n this.options.maxConnections = this.options.maxConnections || 5;\n this.options.maxMessages = this.options.maxMessages || 100;\n\n this.logger = shared.getLogger(this.options, {\n component: this.options.component || 'smtp-pool'\n });\n\n // temporary object\n let connection = new SMTPConnection(this.options);\n\n this.name = 'SMTP (pool)';\n this.version = packageData.version + '[client:' + connection.version + ']';\n\n this._rateLimit = {\n counter: 0,\n timeout: null,\n waiting: [],\n checkpoint: false,\n delta: Number(this.options.rateDelta) || 1000,\n limit: Number(this.options.rateLimit) || 0\n };\n this._closed = false;\n this._queue = [];\n this._connections = [];\n this._connectionCounter = 0;\n\n this.idling = true;\n\n setImmediate(() => {\n if (this.idling) {\n this.emit('idle');\n }\n });\n }\n\n /**\n * Placeholder function for creating proxy sockets. This method immediatelly returns\n * without a socket\n *\n * @param {Object} options Connection options\n * @param {Function} callback Callback function to run with the socket keys\n */\n getSocket(options, callback) {\n // return immediatelly\n return setImmediate(() => callback(null, false));\n }\n\n /**\n * Queues an e-mail to be sent using the selected settings\n *\n * @param {Object} mail Mail object\n * @param {Function} callback Callback function\n */\n send(mail, callback) {\n if (this._closed) {\n return false;\n }\n\n this._queue.push({\n mail,\n requeueAttempts: 0,\n callback\n });\n\n if (this.idling && this._queue.length >= this.options.maxConnections) {\n this.idling = false;\n }\n\n setImmediate(() => this._processMessages());\n\n return true;\n }\n\n /**\n * Closes all connections in the pool. If there is a message being sent, the connection\n * is closed later\n */\n close() {\n let connection;\n let len = this._connections.length;\n this._closed = true;\n\n // clear rate limit timer if it exists\n clearTimeout(this._rateLimit.timeout);\n\n if (!len && !this._queue.length) {\n return;\n }\n\n // remove all available connections\n for (let i = len - 1; i >= 0; i--) {\n if (this._connections[i] && this._connections[i].available) {\n connection = this._connections[i];\n connection.close();\n this.logger.info(\n {\n tnx: 'connection',\n cid: connection.id,\n action: 'removed'\n },\n 'Connection #%s removed',\n connection.id\n );\n }\n }\n\n if (len && !this._connections.length) {\n this.logger.debug(\n {\n tnx: 'connection'\n },\n 'All connections removed'\n );\n }\n\n if (!this._queue.length) {\n return;\n }\n\n // make sure that entire queue would be cleaned\n let invokeCallbacks = () => {\n if (!this._queue.length) {\n this.logger.debug(\n {\n tnx: 'connection'\n },\n 'Pending queue entries cleared'\n );\n return;\n }\n let entry = this._queue.shift();\n if (entry && typeof entry.callback === 'function') {\n try {\n entry.callback(new Error('Connection pool was closed'));\n } catch (E) {\n this.logger.error(\n {\n err: E,\n tnx: 'callback',\n cid: connection.id\n },\n 'Callback error for #%s: %s',\n connection.id,\n E.message\n );\n }\n }\n setImmediate(invokeCallbacks);\n };\n setImmediate(invokeCallbacks);\n }\n\n /**\n * Check the queue and available connections. If there is a message to be sent and there is\n * an available connection, then use this connection to send the mail\n */\n _processMessages() {\n let connection;\n let i, len;\n\n // do nothing if already closed\n if (this._closed) {\n return;\n }\n\n // do nothing if queue is empty\n if (!this._queue.length) {\n if (!this.idling) {\n // no pending jobs\n this.idling = true;\n this.emit('idle');\n }\n return;\n }\n\n // find first available connection\n for (i = 0, len = this._connections.length; i < len; i++) {\n if (this._connections[i].available) {\n connection = this._connections[i];\n break;\n }\n }\n\n if (!connection && this._connections.length < this.options.maxConnections) {\n connection = this._createConnection();\n }\n\n if (!connection) {\n // no more free connection slots available\n this.idling = false;\n return;\n }\n\n // check if there is free space in the processing queue\n if (!this.idling && this._queue.length < this.options.maxConnections) {\n this.idling = true;\n this.emit('idle');\n }\n\n let entry = (connection.queueEntry = this._queue.shift());\n entry.messageId = (connection.queueEntry.mail.message.getHeader('message-id') || '').replace(/[<>\\s]/g, '');\n\n connection.available = false;\n\n this.logger.debug(\n {\n tnx: 'pool',\n cid: connection.id,\n messageId: entry.messageId,\n action: 'assign'\n },\n 'Assigned message <%s> to #%s (%s)',\n entry.messageId,\n connection.id,\n connection.messages + 1\n );\n\n if (this._rateLimit.limit) {\n this._rateLimit.counter++;\n if (!this._rateLimit.checkpoint) {\n this._rateLimit.checkpoint = Date.now();\n }\n }\n\n connection.send(entry.mail, (err, info) => {\n // only process callback if current handler is not changed\n if (entry === connection.queueEntry) {\n try {\n entry.callback(err, info);\n } catch (E) {\n this.logger.error(\n {\n err: E,\n tnx: 'callback',\n cid: connection.id\n },\n 'Callback error for #%s: %s',\n connection.id,\n E.message\n );\n }\n connection.queueEntry = false;\n }\n });\n }\n\n /**\n * Creates a new pool resource\n */\n _createConnection() {\n let connection = new PoolResource(this);\n\n connection.id = ++this._connectionCounter;\n\n this.logger.info(\n {\n tnx: 'pool',\n cid: connection.id,\n action: 'conection'\n },\n 'Created new pool resource #%s',\n connection.id\n );\n\n // resource comes available\n connection.on('available', () => {\n this.logger.debug(\n {\n tnx: 'connection',\n cid: connection.id,\n action: 'available'\n },\n 'Connection #%s became available',\n connection.id\n );\n\n if (this._closed) {\n // if already closed run close() that will remove this connections from connections list\n this.close();\n } else {\n // check if there's anything else to send\n this._processMessages();\n }\n });\n\n // resource is terminated with an error\n connection.once('error', err => {\n if (err.code !== 'EMAXLIMIT') {\n this.logger.warn(\n {\n err,\n tnx: 'pool',\n cid: connection.id\n },\n 'Pool Error for #%s: %s',\n connection.id,\n err.message\n );\n } else {\n this.logger.debug(\n {\n tnx: 'pool',\n cid: connection.id,\n action: 'maxlimit'\n },\n 'Max messages limit exchausted for #%s',\n connection.id\n );\n }\n\n if (connection.queueEntry) {\n try {\n connection.queueEntry.callback(err);\n } catch (E) {\n this.logger.error(\n {\n err: E,\n tnx: 'callback',\n cid: connection.id\n },\n 'Callback error for #%s: %s',\n connection.id,\n E.message\n );\n }\n connection.queueEntry = false;\n }\n\n // remove the erroneus connection from connections list\n this._removeConnection(connection);\n\n this._continueProcessing();\n });\n\n connection.once('close', () => {\n this.logger.info(\n {\n tnx: 'connection',\n cid: connection.id,\n action: 'closed'\n },\n 'Connection #%s was closed',\n connection.id\n );\n\n this._removeConnection(connection);\n\n if (connection.queueEntry) {\n // If the connection closed when sending, add the message to the queue again\n // if max number of requeues is not reached yet\n // Note that we must wait a bit.. because the callback of the 'error' handler might be called\n // in the next event loop\n setTimeout(() => {\n if (connection.queueEntry) {\n if (this._shouldRequeuOnConnectionClose(connection.queueEntry)) {\n this._requeueEntryOnConnectionClose(connection);\n } else {\n this._failDeliveryOnConnectionClose(connection);\n }\n }\n this._continueProcessing();\n }, 50);\n } else {\n if (!this._closed && this.idling && !this._connections.length) {\n this.emit('clear');\n }\n\n this._continueProcessing();\n }\n });\n\n this._connections.push(connection);\n\n return connection;\n }\n\n _shouldRequeuOnConnectionClose(queueEntry) {\n if (this.options.maxRequeues === undefined || this.options.maxRequeues < 0) {\n return true;\n }\n\n return queueEntry.requeueAttempts < this.options.maxRequeues;\n }\n\n _failDeliveryOnConnectionClose(connection) {\n if (connection.queueEntry && connection.queueEntry.callback) {\n try {\n connection.queueEntry.callback(new Error('Reached maximum number of retries after connection was closed'));\n } catch (E) {\n this.logger.error(\n {\n err: E,\n tnx: 'callback',\n messageId: connection.queueEntry.messageId,\n cid: connection.id\n },\n 'Callback error for #%s: %s',\n connection.id,\n E.message\n );\n }\n connection.queueEntry = false;\n }\n }\n\n _requeueEntryOnConnectionClose(connection) {\n connection.queueEntry.requeueAttempts = connection.queueEntry.requeueAttempts + 1;\n this.logger.debug(\n {\n tnx: 'pool',\n cid: connection.id,\n messageId: connection.queueEntry.messageId,\n action: 'requeue'\n },\n 'Re-queued message <%s> for #%s. Attempt: #%s',\n connection.queueEntry.messageId,\n connection.id,\n connection.queueEntry.requeueAttempts\n );\n this._queue.unshift(connection.queueEntry);\n connection.queueEntry = false;\n }\n\n /**\n * Continue to process message if the pool hasn't closed\n */\n _continueProcessing() {\n if (this._closed) {\n this.close();\n } else {\n setTimeout(() => this._processMessages(), 100);\n }\n }\n\n /**\n * Remove resource from pool\n *\n * @param {Object} connection The PoolResource to remove\n */\n _removeConnection(connection) {\n let index = this._connections.indexOf(connection);\n\n if (index !== -1) {\n this._connections.splice(index, 1);\n }\n }\n\n /**\n * Checks if connections have hit current rate limit and if so, queues the availability callback\n *\n * @param {Function} callback Callback function to run once rate limiter has been cleared\n */\n _checkRateLimit(callback) {\n if (!this._rateLimit.limit) {\n return callback();\n }\n\n let now = Date.now();\n\n if (this._rateLimit.counter < this._rateLimit.limit) {\n return callback();\n }\n\n this._rateLimit.waiting.push(callback);\n\n if (this._rateLimit.checkpoint <= now - this._rateLimit.delta) {\n return this._clearRateLimit();\n } else if (!this._rateLimit.timeout) {\n this._rateLimit.timeout = setTimeout(() => this._clearRateLimit(), this._rateLimit.delta - (now - this._rateLimit.checkpoint));\n this._rateLimit.checkpoint = now;\n }\n }\n\n /**\n * Clears current rate limit limitation and runs paused callback\n */\n _clearRateLimit() {\n clearTimeout(this._rateLimit.timeout);\n this._rateLimit.timeout = null;\n this._rateLimit.counter = 0;\n this._rateLimit.checkpoint = false;\n\n // resume all paused connections\n while (this._rateLimit.waiting.length) {\n let cb = this._rateLimit.waiting.shift();\n setImmediate(cb);\n }\n }\n\n /**\n * Returns true if there are free slots in the queue\n */\n isIdle() {\n return this.idling;\n }\n\n /**\n * Verifies SMTP configuration\n *\n * @param {Function} callback Callback function\n */\n verify(callback) {\n let promise;\n\n if (!callback) {\n promise = new Promise((resolve, reject) => {\n callback = shared.callbackPromise(resolve, reject);\n });\n }\n\n let auth = new PoolResource(this).auth;\n\n this.getSocket(this.options, (err, socketOptions) => {\n if (err) {\n return callback(err);\n }\n\n let options = this.options;\n if (socketOptions && socketOptions.connection) {\n this.logger.info(\n {\n tnx: 'proxy',\n remoteAddress: socketOptions.connection.remoteAddress,\n remotePort: socketOptions.connection.remotePort,\n destHost: options.host || '',\n destPort: options.port || '',\n action: 'connected'\n },\n 'Using proxied socket from %s:%s to %s:%s',\n socketOptions.connection.remoteAddress,\n socketOptions.connection.remotePort,\n options.host || '',\n options.port || ''\n );\n options = shared.assign(false, options);\n Object.keys(socketOptions).forEach(key => {\n options[key] = socketOptions[key];\n });\n }\n\n let connection = new SMTPConnection(options);\n let returned = false;\n\n connection.once('error', err => {\n if (returned) {\n return;\n }\n returned = true;\n connection.close();\n return callback(err);\n });\n\n connection.once('end', () => {\n if (returned) {\n return;\n }\n returned = true;\n return callback(new Error('Connection closed'));\n });\n\n let finalize = () => {\n if (returned) {\n return;\n }\n returned = true;\n connection.quit();\n return callback(null, true);\n };\n\n connection.connect(() => {\n if (returned) {\n return;\n }\n\n if (auth && (connection.allowsAuth || options.forceAuth)) {\n connection.login(auth, err => {\n if (returned) {\n return;\n }\n\n if (err) {\n returned = true;\n connection.close();\n return callback(err);\n }\n\n finalize();\n });\n } else if (!auth && connection.allowsAuth && options.forceAuth) {\n let err = new Error('Authentication info was not provided');\n err.code = 'NoAuth';\n\n returned = true;\n connection.close();\n return callback(err);\n } else {\n finalize();\n }\n });\n });\n\n return promise;\n }\n}\n\n// expose to the world\nmodule.exports = SMTPPool;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFjdGlvbi1icm93c2VyKS8uL25vZGVfbW9kdWxlcy8ucG5wbS9ub2RlbWFpbGVyQDcuMC4xMy9ub2RlX21vZHVsZXMvbm9kZW1haWxlci9saWIvc210cC1wb29sL2luZGV4LmpzIiwibWFwcGluZ3MiOiJBQUFhOztBQUViLHFCQUFxQixtQkFBTyxDQUFDLHNCQUFRO0FBQ3JDLHFCQUFxQixtQkFBTyxDQUFDLHVJQUFpQjtBQUM5Qyx1QkFBdUIsbUJBQU8sQ0FBQyx3SUFBb0I7QUFDbkQsa0JBQWtCLG1CQUFPLENBQUMsOEhBQWU7QUFDekMsZUFBZSxtQkFBTyxDQUFDLHNIQUFXO0FBQ2xDLG9CQUFvQixtQkFBTyxDQUFDLHdIQUFvQjs7QUFFaEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLFFBQVE7QUFDdkIsZUFBZSxVQUFVO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsZUFBZSxRQUFRO0FBQ3ZCLGVBQWUsVUFBVTtBQUN6QjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsOEJBQThCLFFBQVE7QUFDdEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0I7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlCQUF5QjtBQUN6QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxvREFBb0QsU0FBUztBQUM3RDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUJBQXlCO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0I7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlCQUF5QjtBQUN6QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBCQUEwQjtBQUMxQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQixjQUFjO0FBQ2Q7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxTQUFTOztBQUVUOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLFFBQVE7QUFDdkI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsVUFBVTtBQUN6QjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLFVBQVU7QUFDekI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7O0FBRWI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTs7QUFFYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLHFCQUFxQjtBQUNyQixrQkFBa0I7QUFDbEI7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0I7QUFDbEI7QUFDQTtBQUNBLGFBQWE7QUFDYixTQUFTOztBQUVUO0FBQ0E7QUFDQTs7QUFFQTtBQUNBIiwic291cmNlcyI6WyIvVXNlcnMvbWFyY21pbnRlbC9Qcm9qZWN0cy9lLXRpYi5jb20vbm9kZV9tb2R1bGVzLy5wbnBtL25vZGVtYWlsZXJANy4wLjEzL25vZGVfbW9kdWxlcy9ub2RlbWFpbGVyL2xpYi9zbXRwLXBvb2wvaW5kZXguanMiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCBFdmVudEVtaXR0ZXIgPSByZXF1aXJlKCdldmVudHMnKTtcbmNvbnN0IFBvb2xSZXNvdXJjZSA9IHJlcXVpcmUoJy4vcG9vbC1yZXNvdXJjZScpO1xuY29uc3QgU01UUENvbm5lY3Rpb24gPSByZXF1aXJlKCcuLi9zbXRwLWNvbm5lY3Rpb24nKTtcbmNvbnN0IHdlbGxLbm93biA9IHJlcXVpcmUoJy4uL3dlbGwta25vd24nKTtcbmNvbnN0IHNoYXJlZCA9IHJlcXVpcmUoJy4uL3NoYXJlZCcpO1xuY29uc3QgcGFja2FnZURhdGEgPSByZXF1aXJlKCcuLi8uLi9wYWNrYWdlLmpzb24nKTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgU01UUCBwb29sIHRyYW5zcG9ydCBvYmplY3QgZm9yIE5vZGVtYWlsZXJcbiAqXG4gKiBAY29uc3RydWN0b3JcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIFNNVFAgQ29ubmVjdGlvbiBvcHRpb25zXG4gKi9cbmNsYXNzIFNNVFBQb29sIGV4dGVuZHMgRXZlbnRFbWl0dGVyIHtcbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zKSB7XG4gICAgICAgIHN1cGVyKCk7XG5cbiAgICAgICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gICAgICAgIGlmICh0eXBlb2Ygb3B0aW9ucyA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIG9wdGlvbnMgPSB7XG4gICAgICAgICAgICAgICAgdXJsOiBvcHRpb25zXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHVybERhdGE7XG4gICAgICAgIGxldCBzZXJ2aWNlID0gb3B0aW9ucy5zZXJ2aWNlO1xuXG4gICAgICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5nZXRTb2NrZXQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHRoaXMuZ2V0U29ja2V0ID0gb3B0aW9ucy5nZXRTb2NrZXQ7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAob3B0aW9ucy51cmwpIHtcbiAgICAgICAgICAgIHVybERhdGEgPSBzaGFyZWQucGFyc2VDb25uZWN0aW9uVXJsKG9wdGlvbnMudXJsKTtcbiAgICAgICAgICAgIHNlcnZpY2UgPSBzZXJ2aWNlIHx8IHVybERhdGEuc2VydmljZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMub3B0aW9ucyA9IHNoYXJlZC5hc3NpZ24oXG4gICAgICAgICAgICBmYWxzZSwgLy8gY3JlYXRlIG5ldyBvYmplY3RcbiAgICAgICAgICAgIG9wdGlvbnMsIC8vIHJlZ3VsYXIgb3B0aW9uc1xuICAgICAgICAgICAgdXJsRGF0YSwgLy8gdXJsIG9wdGlvbnNcbiAgICAgICAgICAgIHNlcnZpY2UgJiYgd2VsbEtub3duKHNlcnZpY2UpIC8vIHdlbGxrbm93biBvcHRpb25zXG4gICAgICAgICk7XG5cbiAgICAgICAgdGhpcy5vcHRpb25zLm1heENvbm5lY3Rpb25zID0gdGhpcy5vcHRpb25zLm1heENvbm5lY3Rpb25zIHx8IDU7XG4gICAgICAgIHRoaXMub3B0aW9ucy5tYXhNZXNzYWdlcyA9IHRoaXMub3B0aW9ucy5tYXhNZXNzYWdlcyB8fCAxMDA7XG5cbiAgICAgICAgdGhpcy5sb2dnZXIgPSBzaGFyZWQuZ2V0TG9nZ2VyKHRoaXMub3B0aW9ucywge1xuICAgICAgICAgICAgY29tcG9uZW50OiB0aGlzLm9wdGlvbnMuY29tcG9uZW50IHx8ICdzbXRwLXBvb2wnXG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIHRlbXBvcmFyeSBvYmplY3RcbiAgICAgICAgbGV0IGNvbm5lY3Rpb24gPSBuZXcgU01UUENvbm5lY3Rpb24odGhpcy5vcHRpb25zKTtcblxuICAgICAgICB0aGlzLm5hbWUgPSAnU01UUCAocG9vbCknO1xuICAgICAgICB0aGlzLnZlcnNpb24gPSBwYWNrYWdlRGF0YS52ZXJzaW9uICsgJ1tjbGllbnQ6JyArIGNvbm5lY3Rpb24udmVyc2lvbiArICddJztcblxuICAgICAgICB0aGlzLl9yYXRlTGltaXQgPSB7XG4gICAgICAgICAgICBjb3VudGVyOiAwLFxuICAgICAgICAgICAgdGltZW91dDogbnVsbCxcbiAgICAgICAgICAgIHdhaXRpbmc6IFtdLFxuICAgICAgICAgICAgY2hlY2twb2ludDogZmFsc2UsXG4gICAgICAgICAgICBkZWx0YTogTnVtYmVyKHRoaXMub3B0aW9ucy5yYXRlRGVsdGEpIHx8IDEwMDAsXG4gICAgICAgICAgICBsaW1pdDogTnVtYmVyKHRoaXMub3B0aW9ucy5yYXRlTGltaXQpIHx8IDBcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5fY2xvc2VkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX3F1ZXVlID0gW107XG4gICAgICAgIHRoaXMuX2Nvbm5lY3Rpb25zID0gW107XG4gICAgICAgIHRoaXMuX2Nvbm5lY3Rpb25Db3VudGVyID0gMDtcblxuICAgICAgICB0aGlzLmlkbGluZyA9IHRydWU7XG5cbiAgICAgICAgc2V0SW1tZWRpYXRlKCgpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLmlkbGluZykge1xuICAgICAgICAgICAgICAgIHRoaXMuZW1pdCgnaWRsZScpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQbGFjZWhvbGRlciBmdW5jdGlvbiBmb3IgY3JlYXRpbmcgcHJveHkgc29ja2V0cy4gVGhpcyBtZXRob2QgaW1tZWRpYXRlbGx5IHJldHVybnNcbiAgICAgKiB3aXRob3V0IGEgc29ja2V0XG4gICAgICpcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyBDb25uZWN0aW9uIG9wdGlvbnNcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBDYWxsYmFjayBmdW5jdGlvbiB0byBydW4gd2l0aCB0aGUgc29ja2V0IGtleXNcbiAgICAgKi9cbiAgICBnZXRTb2NrZXQob3B0aW9ucywgY2FsbGJhY2spIHtcbiAgICAgICAgLy8gcmV0dXJuIGltbWVkaWF0ZWxseVxuICAgICAgICByZXR1cm4gc2V0SW1tZWRpYXRlKCgpID0+IGNhbGxiYWNrKG51bGwsIGZhbHNlKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUXVldWVzIGFuIGUtbWFpbCB0byBiZSBzZW50IHVzaW5nIHRoZSBzZWxlY3RlZCBzZXR0aW5nc1xuICAgICAqXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG1haWwgTWFpbCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBDYWxsYmFjayBmdW5jdGlvblxuICAgICAqL1xuICAgIHNlbmQobWFpbCwgY2FsbGJhY2spIHtcbiAgICAgICAgaWYgKHRoaXMuX2Nsb3NlZCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fcXVldWUucHVzaCh7XG4gICAgICAgICAgICBtYWlsLFxuICAgICAgICAgICAgcmVxdWV1ZUF0dGVtcHRzOiAwLFxuICAgICAgICAgICAgY2FsbGJhY2tcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKHRoaXMuaWRsaW5nICYmIHRoaXMuX3F1ZXVlLmxlbmd0aCA+PSB0aGlzLm9wdGlvbnMubWF4Q29ubmVjdGlvbnMpIHtcbiAgICAgICAgICAgIHRoaXMuaWRsaW5nID0gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBzZXRJbW1lZGlhdGUoKCkgPT4gdGhpcy5fcHJvY2Vzc01lc3NhZ2VzKCkpO1xuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENsb3NlcyBhbGwgY29ubmVjdGlvbnMgaW4gdGhlIHBvb2wuIElmIHRoZXJlIGlzIGEgbWVzc2FnZSBiZWluZyBzZW50LCB0aGUgY29ubmVjdGlvblxuICAgICAqIGlzIGNsb3NlZCBsYXRlclxuICAgICAqL1xuICAgIGNsb3NlKCkge1xuICAgICAgICBsZXQgY29ubmVjdGlvbjtcbiAgICAgICAgbGV0IGxlbiA9IHRoaXMuX2Nvbm5lY3Rpb25zLmxlbmd0aDtcbiAgICAgICAgdGhpcy5fY2xvc2VkID0gdHJ1ZTtcblxuICAgICAgICAvLyBjbGVhciByYXRlIGxpbWl0IHRpbWVyIGlmIGl0IGV4aXN0c1xuICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5fcmF0ZUxpbWl0LnRpbWVvdXQpO1xuXG4gICAgICAgIGlmICghbGVuICYmICF0aGlzLl9xdWV1ZS5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHJlbW92ZSBhbGwgYXZhaWxhYmxlIGNvbm5lY3Rpb25zXG4gICAgICAgIGZvciAobGV0IGkgPSBsZW4gLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICAgICAgaWYgKHRoaXMuX2Nvbm5lY3Rpb25zW2ldICYmIHRoaXMuX2Nvbm5lY3Rpb25zW2ldLmF2YWlsYWJsZSkge1xuICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24gPSB0aGlzLl9jb25uZWN0aW9uc1tpXTtcbiAgICAgICAgICAgICAgICBjb25uZWN0aW9uLmNsb3NlKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuaW5mbyhcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgdG54OiAnY29ubmVjdGlvbicsXG4gICAgICAgICAgICAgICAgICAgICAgICBjaWQ6IGNvbm5lY3Rpb24uaWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb246ICdyZW1vdmVkJ1xuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAnQ29ubmVjdGlvbiAjJXMgcmVtb3ZlZCcsXG4gICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24uaWRcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGxlbiAmJiAhdGhpcy5fY29ubmVjdGlvbnMubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHRueDogJ2Nvbm5lY3Rpb24nXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAnQWxsIGNvbm5lY3Rpb25zIHJlbW92ZWQnXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0aGlzLl9xdWV1ZS5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIG1ha2Ugc3VyZSB0aGF0IGVudGlyZSBxdWV1ZSB3b3VsZCBiZSBjbGVhbmVkXG4gICAgICAgIGxldCBpbnZva2VDYWxsYmFja3MgPSAoKSA9PiB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuX3F1ZXVlLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKFxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0bng6ICdjb25uZWN0aW9uJ1xuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAnUGVuZGluZyBxdWV1ZSBlbnRyaWVzIGNsZWFyZWQnXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgZW50cnkgPSB0aGlzLl9xdWV1ZS5zaGlmdCgpO1xuICAgICAgICAgICAgaWYgKGVudHJ5ICYmIHR5cGVvZiBlbnRyeS5jYWxsYmFjayA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGVudHJ5LmNhbGxiYWNrKG5ldyBFcnJvcignQ29ubmVjdGlvbiBwb29sIHdhcyBjbG9zZWQnKSk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoRSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcihcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnI6IEUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG54OiAnY2FsbGJhY2snLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNpZDogY29ubmVjdGlvbi5pZFxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICdDYWxsYmFjayBlcnJvciBmb3IgIyVzOiAlcycsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uLmlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgRS5tZXNzYWdlXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc2V0SW1tZWRpYXRlKGludm9rZUNhbGxiYWNrcyk7XG4gICAgICAgIH07XG4gICAgICAgIHNldEltbWVkaWF0ZShpbnZva2VDYWxsYmFja3MpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrIHRoZSBxdWV1ZSBhbmQgYXZhaWxhYmxlIGNvbm5lY3Rpb25zLiBJZiB0aGVyZSBpcyBhIG1lc3NhZ2UgdG8gYmUgc2VudCBhbmQgdGhlcmUgaXNcbiAgICAgKiBhbiBhdmFpbGFibGUgY29ubmVjdGlvbiwgdGhlbiB1c2UgdGhpcyBjb25uZWN0aW9uIHRvIHNlbmQgdGhlIG1haWxcbiAgICAgKi9cbiAgICBfcHJvY2Vzc01lc3NhZ2VzKCkge1xuICAgICAgICBsZXQgY29ubmVjdGlvbjtcbiAgICAgICAgbGV0IGksIGxlbjtcblxuICAgICAgICAvLyBkbyBub3RoaW5nIGlmIGFscmVhZHkgY2xvc2VkXG4gICAgICAgIGlmICh0aGlzLl9jbG9zZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGRvIG5vdGhpbmcgaWYgcXVldWUgaXMgZW1wdHlcbiAgICAgICAgaWYgKCF0aGlzLl9xdWV1ZS5sZW5ndGgpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5pZGxpbmcpIHtcbiAgICAgICAgICAgICAgICAvLyBubyBwZW5kaW5nIGpvYnNcbiAgICAgICAgICAgICAgICB0aGlzLmlkbGluZyA9IHRydWU7XG4gICAgICAgICAgICAgICAgdGhpcy5lbWl0KCdpZGxlJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBmaW5kIGZpcnN0IGF2YWlsYWJsZSBjb25uZWN0aW9uXG4gICAgICAgIGZvciAoaSA9IDAsIGxlbiA9IHRoaXMuX2Nvbm5lY3Rpb25zLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5fY29ubmVjdGlvbnNbaV0uYXZhaWxhYmxlKSB7XG4gICAgICAgICAgICAgICAgY29ubmVjdGlvbiA9IHRoaXMuX2Nvbm5lY3Rpb25zW2ldO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFjb25uZWN0aW9uICYmIHRoaXMuX2Nvbm5lY3Rpb25zLmxlbmd0aCA8IHRoaXMub3B0aW9ucy5tYXhDb25uZWN0aW9ucykge1xuICAgICAgICAgICAgY29ubmVjdGlvbiA9IHRoaXMuX2NyZWF0ZUNvbm5lY3Rpb24oKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghY29ubmVjdGlvbikge1xuICAgICAgICAgICAgLy8gbm8gbW9yZSBmcmVlIGNvbm5lY3Rpb24gc2xvdHMgYXZhaWxhYmxlXG4gICAgICAgICAgICB0aGlzLmlkbGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gY2hlY2sgaWYgdGhlcmUgaXMgZnJlZSBzcGFjZSBpbiB0aGUgcHJvY2Vzc2luZyBxdWV1ZVxuICAgICAgICBpZiAoIXRoaXMuaWRsaW5nICYmIHRoaXMuX3F1ZXVlLmxlbmd0aCA8IHRoaXMub3B0aW9ucy5tYXhDb25uZWN0aW9ucykge1xuICAgICAgICAgICAgdGhpcy5pZGxpbmcgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5lbWl0KCdpZGxlJyk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgZW50cnkgPSAoY29ubmVjdGlvbi5xdWV1ZUVudHJ5ID0gdGhpcy5fcXVldWUuc2hpZnQoKSk7XG4gICAgICAgIGVudHJ5Lm1lc3NhZ2VJZCA9IChjb25uZWN0aW9uLnF1ZXVlRW50cnkubWFpbC5tZXNzYWdlLmdldEhlYWRlcignbWVzc2FnZS1pZCcpIHx8ICcnKS5yZXBsYWNlKC9bPD5cXHNdL2csICcnKTtcblxuICAgICAgICBjb25uZWN0aW9uLmF2YWlsYWJsZSA9IGZhbHNlO1xuXG4gICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHRueDogJ3Bvb2wnLFxuICAgICAgICAgICAgICAgIGNpZDogY29ubmVjdGlvbi5pZCxcbiAgICAgICAgICAgICAgICBtZXNzYWdlSWQ6IGVudHJ5Lm1lc3NhZ2VJZCxcbiAgICAgICAgICAgICAgICBhY3Rpb246ICdhc3NpZ24nXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJ0Fzc2lnbmVkIG1lc3NhZ2UgPCVzPiB0byAjJXMgKCVzKScsXG4gICAgICAgICAgICBlbnRyeS5tZXNzYWdlSWQsXG4gICAgICAgICAgICBjb25uZWN0aW9uLmlkLFxuICAgICAgICAgICAgY29ubmVjdGlvbi5tZXNzYWdlcyArIDFcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAodGhpcy5fcmF0ZUxpbWl0LmxpbWl0KSB7XG4gICAgICAgICAgICB0aGlzLl9yYXRlTGltaXQuY291bnRlcisrO1xuICAgICAgICAgICAgaWYgKCF0aGlzLl9yYXRlTGltaXQuY2hlY2twb2ludCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3JhdGVMaW1pdC5jaGVja3BvaW50ID0gRGF0ZS5ub3coKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbm5lY3Rpb24uc2VuZChlbnRyeS5tYWlsLCAoZXJyLCBpbmZvKSA9PiB7XG4gICAgICAgICAgICAvLyBvbmx5IHByb2Nlc3MgY2FsbGJhY2sgaWYgY3VycmVudCBoYW5kbGVyIGlzIG5vdCBjaGFuZ2VkXG4gICAgICAgICAgICBpZiAoZW50cnkgPT09IGNvbm5lY3Rpb24ucXVldWVFbnRyeSkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGVudHJ5LmNhbGxiYWNrKGVyciwgaW5mbyk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoRSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcihcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnI6IEUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG54OiAnY2FsbGJhY2snLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNpZDogY29ubmVjdGlvbi5pZFxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICdDYWxsYmFjayBlcnJvciBmb3IgIyVzOiAlcycsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uLmlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgRS5tZXNzYWdlXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24ucXVldWVFbnRyeSA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IHBvb2wgcmVzb3VyY2VcbiAgICAgKi9cbiAgICBfY3JlYXRlQ29ubmVjdGlvbigpIHtcbiAgICAgICAgbGV0IGNvbm5lY3Rpb24gPSBuZXcgUG9vbFJlc291cmNlKHRoaXMpO1xuXG4gICAgICAgIGNvbm5lY3Rpb24uaWQgPSArK3RoaXMuX2Nvbm5lY3Rpb25Db3VudGVyO1xuXG4gICAgICAgIHRoaXMubG9nZ2VyLmluZm8oXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdG54OiAncG9vbCcsXG4gICAgICAgICAgICAgICAgY2lkOiBjb25uZWN0aW9uLmlkLFxuICAgICAgICAgICAgICAgIGFjdGlvbjogJ2NvbmVjdGlvbidcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnQ3JlYXRlZCBuZXcgcG9vbCByZXNvdXJjZSAjJXMnLFxuICAgICAgICAgICAgY29ubmVjdGlvbi5pZFxuICAgICAgICApO1xuXG4gICAgICAgIC8vIHJlc291cmNlIGNvbWVzIGF2YWlsYWJsZVxuICAgICAgICBjb25uZWN0aW9uLm9uKCdhdmFpbGFibGUnLCAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHRueDogJ2Nvbm5lY3Rpb24nLFxuICAgICAgICAgICAgICAgICAgICBjaWQ6IGNvbm5lY3Rpb24uaWQsXG4gICAgICAgICAgICAgICAgICAgIGFjdGlvbjogJ2F2YWlsYWJsZSdcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICdDb25uZWN0aW9uICMlcyBiZWNhbWUgYXZhaWxhYmxlJyxcbiAgICAgICAgICAgICAgICBjb25uZWN0aW9uLmlkXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBpZiAodGhpcy5fY2xvc2VkKSB7XG4gICAgICAgICAgICAgICAgLy8gaWYgYWxyZWFkeSBjbG9zZWQgcnVuIGNsb3NlKCkgdGhhdCB3aWxsIHJlbW92ZSB0aGlzIGNvbm5lY3Rpb25zIGZyb20gY29ubmVjdGlvbnMgbGlzdFxuICAgICAgICAgICAgICAgIHRoaXMuY2xvc2UoKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gY2hlY2sgaWYgdGhlcmUncyBhbnl0aGluZyBlbHNlIHRvIHNlbmRcbiAgICAgICAgICAgICAgICB0aGlzLl9wcm9jZXNzTWVzc2FnZXMoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gcmVzb3VyY2UgaXMgdGVybWluYXRlZCB3aXRoIGFuIGVycm9yXG4gICAgICAgIGNvbm5lY3Rpb24ub25jZSgnZXJyb3InLCBlcnIgPT4ge1xuICAgICAgICAgICAgaWYgKGVyci5jb2RlICE9PSAnRU1BWExJTUlUJykge1xuICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLndhcm4oXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVycixcbiAgICAgICAgICAgICAgICAgICAgICAgIHRueDogJ3Bvb2wnLFxuICAgICAgICAgICAgICAgICAgICAgICAgY2lkOiBjb25uZWN0aW9uLmlkXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICdQb29sIEVycm9yIGZvciAjJXM6ICVzJyxcbiAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbi5pZCxcbiAgICAgICAgICAgICAgICAgICAgZXJyLm1lc3NhZ2VcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgdG54OiAncG9vbCcsXG4gICAgICAgICAgICAgICAgICAgICAgICBjaWQ6IGNvbm5lY3Rpb24uaWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb246ICdtYXhsaW1pdCdcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgJ01heCBtZXNzYWdlcyBsaW1pdCBleGNoYXVzdGVkIGZvciAjJXMnLFxuICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uLmlkXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGNvbm5lY3Rpb24ucXVldWVFbnRyeSkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24ucXVldWVFbnRyeS5jYWxsYmFjayhlcnIpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyOiBFLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRueDogJ2NhbGxiYWNrJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaWQ6IGNvbm5lY3Rpb24uaWRcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAnQ2FsbGJhY2sgZXJyb3IgZm9yICMlczogJXMnLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbi5pZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIEUubWVzc2FnZVxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25uZWN0aW9uLnF1ZXVlRW50cnkgPSBmYWxzZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gcmVtb3ZlIHRoZSBlcnJvbmV1cyBjb25uZWN0aW9uIGZyb20gY29ubmVjdGlvbnMgbGlzdFxuICAgICAgICAgICAgdGhpcy5fcmVtb3ZlQ29ubmVjdGlvbihjb25uZWN0aW9uKTtcblxuICAgICAgICAgICAgdGhpcy5fY29udGludWVQcm9jZXNzaW5nKCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbm5lY3Rpb24ub25jZSgnY2xvc2UnLCAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlci5pbmZvKFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgdG54OiAnY29ubmVjdGlvbicsXG4gICAgICAgICAgICAgICAgICAgIGNpZDogY29ubmVjdGlvbi5pZCxcbiAgICAgICAgICAgICAgICAgICAgYWN0aW9uOiAnY2xvc2VkJ1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgJ0Nvbm5lY3Rpb24gIyVzIHdhcyBjbG9zZWQnLFxuICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24uaWRcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIHRoaXMuX3JlbW92ZUNvbm5lY3Rpb24oY29ubmVjdGlvbik7XG5cbiAgICAgICAgICAgIGlmIChjb25uZWN0aW9uLnF1ZXVlRW50cnkpIHtcbiAgICAgICAgICAgICAgICAvLyBJZiB0aGUgY29ubmVjdGlvbiBjbG9zZWQgd2hlbiBzZW5kaW5nLCBhZGQgdGhlIG1lc3NhZ2UgdG8gdGhlIHF1ZXVlIGFnYWluXG4gICAgICAgICAgICAgICAgLy8gaWYgbWF4IG51bWJlciBvZiByZXF1ZXVlcyBpcyBub3QgcmVhY2hlZCB5ZXRcbiAgICAgICAgICAgICAgICAvLyBOb3RlIHRoYXQgd2UgbXVzdCB3YWl0IGEgYml0Li4gYmVjYXVzZSB0aGUgY2FsbGJhY2sgb2YgdGhlICdlcnJvcicgaGFuZGxlciBtaWdodCBiZSBjYWxsZWRcbiAgICAgICAgICAgICAgICAvLyBpbiB0aGUgbmV4dCBldmVudCBsb29wXG4gICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjb25uZWN0aW9uLnF1ZXVlRW50cnkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl9zaG91bGRSZXF1ZXVPbkNvbm5lY3Rpb25DbG9zZShjb25uZWN0aW9uLnF1ZXVlRW50cnkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fcmVxdWV1ZUVudHJ5T25Db25uZWN0aW9uQ2xvc2UoY29ubmVjdGlvbik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2ZhaWxEZWxpdmVyeU9uQ29ubmVjdGlvbkNsb3NlKGNvbm5lY3Rpb24pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2NvbnRpbnVlUHJvY2Vzc2luZygpO1xuICAgICAgICAgICAgICAgIH0sIDUwKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLl9jbG9zZWQgJiYgdGhpcy5pZGxpbmcgJiYgIXRoaXMuX2Nvbm5lY3Rpb25zLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmVtaXQoJ2NsZWFyJyk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdGhpcy5fY29udGludWVQcm9jZXNzaW5nKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuX2Nvbm5lY3Rpb25zLnB1c2goY29ubmVjdGlvbik7XG5cbiAgICAgICAgcmV0dXJuIGNvbm5lY3Rpb247XG4gICAgfVxuXG4gICAgX3Nob3VsZFJlcXVldU9uQ29ubmVjdGlvbkNsb3NlKHF1ZXVlRW50cnkpIHtcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5tYXhSZXF1ZXVlcyA9PT0gdW5kZWZpbmVkIHx8IHRoaXMub3B0aW9ucy5tYXhSZXF1ZXVlcyA8IDApIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHF1ZXVlRW50cnkucmVxdWV1ZUF0dGVtcHRzIDwgdGhpcy5vcHRpb25zLm1heFJlcXVldWVzO1xuICAgIH1cblxuICAgIF9mYWlsRGVsaXZlcnlPbkNvbm5lY3Rpb25DbG9zZShjb25uZWN0aW9uKSB7XG4gICAgICAgIGlmIChjb25uZWN0aW9uLnF1ZXVlRW50cnkgJiYgY29ubmVjdGlvbi5xdWV1ZUVudHJ5LmNhbGxiYWNrKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24ucXVldWVFbnRyeS5jYWxsYmFjayhuZXcgRXJyb3IoJ1JlYWNoZWQgbWF4aW11bSBudW1iZXIgb2YgcmV0cmllcyBhZnRlciBjb25uZWN0aW9uIHdhcyBjbG9zZWQnKSk7XG4gICAgICAgICAgICB9IGNhdGNoIChFKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVycjogRSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRueDogJ2NhbGxiYWNrJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VJZDogY29ubmVjdGlvbi5xdWV1ZUVudHJ5Lm1lc3NhZ2VJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNpZDogY29ubmVjdGlvbi5pZFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAnQ2FsbGJhY2sgZXJyb3IgZm9yICMlczogJXMnLFxuICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uLmlkLFxuICAgICAgICAgICAgICAgICAgICBFLm1lc3NhZ2VcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29ubmVjdGlvbi5xdWV1ZUVudHJ5ID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBfcmVxdWV1ZUVudHJ5T25Db25uZWN0aW9uQ2xvc2UoY29ubmVjdGlvbikge1xuICAgICAgICBjb25uZWN0aW9uLnF1ZXVlRW50cnkucmVxdWV1ZUF0dGVtcHRzID0gY29ubmVjdGlvbi5xdWV1ZUVudHJ5LnJlcXVldWVBdHRlbXB0cyArIDE7XG4gICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHRueDogJ3Bvb2wnLFxuICAgICAgICAgICAgICAgIGNpZDogY29ubmVjdGlvbi5pZCxcbiAgICAgICAgICAgICAgICBtZXNzYWdlSWQ6IGNvbm5lY3Rpb24ucXVldWVFbnRyeS5tZXNzYWdlSWQsXG4gICAgICAgICAgICAgICAgYWN0aW9uOiAncmVxdWV1ZSdcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnUmUtcXVldWVkIG1lc3NhZ2UgPCVzPiBmb3IgIyVzLiBBdHRlbXB0OiAjJXMnLFxuICAgICAgICAgICAgY29ubmVjdGlvbi5xdWV1ZUVudHJ5Lm1lc3NhZ2VJZCxcbiAgICAgICAgICAgIGNvbm5lY3Rpb24uaWQsXG4gICAgICAgICAgICBjb25uZWN0aW9uLnF1ZXVlRW50cnkucmVxdWV1ZUF0dGVtcHRzXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuX3F1ZXVlLnVuc2hpZnQoY29ubmVjdGlvbi5xdWV1ZUVudHJ5KTtcbiAgICAgICAgY29ubmVjdGlvbi5xdWV1ZUVudHJ5ID0gZmFsc2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29udGludWUgdG8gcHJvY2VzcyBtZXNzYWdlIGlmIHRoZSBwb29sIGhhc24ndCBjbG9zZWRcbiAgICAgKi9cbiAgICBfY29udGludWVQcm9jZXNzaW5nKCkge1xuICAgICAgICBpZiAodGhpcy5fY2xvc2VkKSB7XG4gICAgICAgICAgICB0aGlzLmNsb3NlKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMuX3Byb2Nlc3NNZXNzYWdlcygpLCAxMDApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlIHJlc291cmNlIGZyb20gcG9vbFxuICAgICAqXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGNvbm5lY3Rpb24gVGhlIFBvb2xSZXNvdXJjZSB0byByZW1vdmVcbiAgICAgKi9cbiAgICBfcmVtb3ZlQ29ubmVjdGlvbihjb25uZWN0aW9uKSB7XG4gICAgICAgIGxldCBpbmRleCA9IHRoaXMuX2Nvbm5lY3Rpb25zLmluZGV4T2YoY29ubmVjdGlvbik7XG5cbiAgICAgICAgaWYgKGluZGV4ICE9PSAtMSkge1xuICAgICAgICAgICAgdGhpcy5fY29ubmVjdGlvbnMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBjb25uZWN0aW9ucyBoYXZlIGhpdCBjdXJyZW50IHJhdGUgbGltaXQgYW5kIGlmIHNvLCBxdWV1ZXMgdGhlIGF2YWlsYWJpbGl0eSBjYWxsYmFja1xuICAgICAqXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgQ2FsbGJhY2sgZnVuY3Rpb24gdG8gcnVuIG9uY2UgcmF0ZSBsaW1pdGVyIGhhcyBiZWVuIGNsZWFyZWRcbiAgICAgKi9cbiAgICBfY2hlY2tSYXRlTGltaXQoY2FsbGJhY2spIHtcbiAgICAgICAgaWYgKCF0aGlzLl9yYXRlTGltaXQubGltaXQpIHtcbiAgICAgICAgICAgIHJldHVybiBjYWxsYmFjaygpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IG5vdyA9IERhdGUubm93KCk7XG5cbiAgICAgICAgaWYgKHRoaXMuX3JhdGVMaW1pdC5jb3VudGVyIDwgdGhpcy5fcmF0ZUxpbWl0LmxpbWl0KSB7XG4gICAgICAgICAgICByZXR1cm4gY2FsbGJhY2soKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX3JhdGVMaW1pdC53YWl0aW5nLnB1c2goY2FsbGJhY2spO1xuXG4gICAgICAgIGlmICh0aGlzLl9yYXRlTGltaXQuY2hlY2twb2ludCA8PSBub3cgLSB0aGlzLl9yYXRlTGltaXQuZGVsdGEpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9jbGVhclJhdGVMaW1pdCgpO1xuICAgICAgICB9IGVsc2UgaWYgKCF0aGlzLl9yYXRlTGltaXQudGltZW91dCkge1xuICAgICAgICAgICAgdGhpcy5fcmF0ZUxpbWl0LnRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHRoaXMuX2NsZWFyUmF0ZUxpbWl0KCksIHRoaXMuX3JhdGVMaW1pdC5kZWx0YSAtIChub3cgLSB0aGlzLl9yYXRlTGltaXQuY2hlY2twb2ludCkpO1xuICAgICAgICAgICAgdGhpcy5fcmF0ZUxpbWl0LmNoZWNrcG9pbnQgPSBub3c7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDbGVhcnMgY3VycmVudCByYXRlIGxpbWl0IGxpbWl0YXRpb24gYW5kIHJ1bnMgcGF1c2VkIGNhbGxiYWNrXG4gICAgICovXG4gICAgX2NsZWFyUmF0ZUxpbWl0KCkge1xuICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5fcmF0ZUxpbWl0LnRpbWVvdXQpO1xuICAgICAgICB0aGlzLl9yYXRlTGltaXQudGltZW91dCA9IG51bGw7XG4gICAgICAgIHRoaXMuX3JhdGVMaW1pdC5jb3VudGVyID0gMDtcbiAgICAgICAgdGhpcy5fcmF0ZUxpbWl0LmNoZWNrcG9pbnQgPSBmYWxzZTtcblxuICAgICAgICAvLyByZXN1bWUgYWxsIHBhdXNlZCBjb25uZWN0aW9uc1xuICAgICAgICB3aGlsZSAodGhpcy5fcmF0ZUxpbWl0LndhaXRpbmcubGVuZ3RoKSB7XG4gICAgICAgICAgICBsZXQgY2IgPSB0aGlzLl9yYXRlTGltaXQud2FpdGluZy5zaGlmdCgpO1xuICAgICAgICAgICAgc2V0SW1tZWRpYXRlKGNiKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGVyZSBhcmUgZnJlZSBzbG90cyBpbiB0aGUgcXVldWVcbiAgICAgKi9cbiAgICBpc0lkbGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmlkbGluZztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBWZXJpZmllcyBTTVRQIGNvbmZpZ3VyYXRpb25cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIENhbGxiYWNrIGZ1bmN0aW9uXG4gICAgICovXG4gICAgdmVyaWZ5KGNhbGxiYWNrKSB7XG4gICAgICAgIGxldCBwcm9taXNlO1xuXG4gICAgICAgIGlmICghY2FsbGJhY2spIHtcbiAgICAgICAgICAgIHByb21pc2UgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICAgICAgY2FsbGJhY2sgPSBzaGFyZWQuY2FsbGJhY2tQcm9taXNlKHJlc29sdmUsIHJlamVjdCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBhdXRoID0gbmV3IFBvb2xSZXNvdXJjZSh0aGlzKS5hdXRoO1xuXG4gICAgICAgIHRoaXMuZ2V0U29ja2V0KHRoaXMub3B0aW9ucywgKGVyciwgc29ja2V0T3B0aW9ucykgPT4ge1xuICAgICAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgICAgICAgIHJldHVybiBjYWxsYmFjayhlcnIpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsZXQgb3B0aW9ucyA9IHRoaXMub3B0aW9ucztcbiAgICAgICAgICAgIGlmIChzb2NrZXRPcHRpb25zICYmIHNvY2tldE9wdGlvbnMuY29ubmVjdGlvbikge1xuICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmluZm8oXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRueDogJ3Byb3h5JyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlbW90ZUFkZHJlc3M6IHNvY2tldE9wdGlvbnMuY29ubmVjdGlvbi5yZW1vdGVBZGRyZXNzLFxuICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3RlUG9ydDogc29ja2V0T3B0aW9ucy5jb25uZWN0aW9uLnJlbW90ZVBvcnQsXG4gICAgICAgICAgICAgICAgICAgICAgICBkZXN0SG9zdDogb3B0aW9ucy5ob3N0IHx8ICcnLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGVzdFBvcnQ6IG9wdGlvbnMucG9ydCB8fCAnJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbjogJ2Nvbm5lY3RlZCdcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgJ1VzaW5nIHByb3hpZWQgc29ja2V0IGZyb20gJXM6JXMgdG8gJXM6JXMnLFxuICAgICAgICAgICAgICAgICAgICBzb2NrZXRPcHRpb25zLmNvbm5lY3Rpb24ucmVtb3RlQWRkcmVzcyxcbiAgICAgICAgICAgICAgICAgICAgc29ja2V0T3B0aW9ucy5jb25uZWN0aW9uLnJlbW90ZVBvcnQsXG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuaG9zdCB8fCAnJyxcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5wb3J0IHx8ICcnXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBvcHRpb25zID0gc2hhcmVkLmFzc2lnbihmYWxzZSwgb3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgT2JqZWN0LmtleXMoc29ja2V0T3B0aW9ucykuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBvcHRpb25zW2tleV0gPSBzb2NrZXRPcHRpb25zW2tleV07XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxldCBjb25uZWN0aW9uID0gbmV3IFNNVFBDb25uZWN0aW9uKG9wdGlvbnMpO1xuICAgICAgICAgICAgbGV0IHJldHVybmVkID0gZmFsc2U7XG5cbiAgICAgICAgICAgIGNvbm5lY3Rpb24ub25jZSgnZXJyb3InLCBlcnIgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChyZXR1cm5lZCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybmVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBjb25uZWN0aW9uLmNsb3NlKCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKGVycik7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgY29ubmVjdGlvbi5vbmNlKCdlbmQnLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHJldHVybmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHJldHVybiBjYWxsYmFjayhuZXcgRXJyb3IoJ0Nvbm5lY3Rpb24gY2xvc2VkJykpO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGxldCBmaW5hbGl6ZSA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAocmV0dXJuZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm5lZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgY29ubmVjdGlvbi5xdWl0KCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKG51bGwsIHRydWUpO1xuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgY29ubmVjdGlvbi5jb25uZWN0KCgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAocmV0dXJuZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChhdXRoICYmIChjb25uZWN0aW9uLmFsbG93c0F1dGggfHwgb3B0aW9ucy5mb3JjZUF1dGgpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24ubG9naW4oYXV0aCwgZXJyID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXR1cm5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybmVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uLmNsb3NlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKGVycik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsaXplKCk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIWF1dGggJiYgY29ubmVjdGlvbi5hbGxvd3NBdXRoICYmIG9wdGlvbnMuZm9yY2VBdXRoKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBlcnIgPSBuZXcgRXJyb3IoJ0F1dGhlbnRpY2F0aW9uIGluZm8gd2FzIG5vdCBwcm92aWRlZCcpO1xuICAgICAgICAgICAgICAgICAgICBlcnIuY29kZSA9ICdOb0F1dGgnO1xuXG4gICAgICAgICAgICAgICAgICAgIHJldHVybmVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbi5jbG9zZSgpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2FsbGJhY2soZXJyKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBmaW5hbGl6ZSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gcHJvbWlzZTtcbiAgICB9XG59XG5cbi8vIGV4cG9zZSB0byB0aGUgd29ybGRcbm1vZHVsZS5leHBvcnRzID0gU01UUFBvb2w7XG4iXSwibmFtZXMiOltdLCJpZ25vcmVMaXN0IjpbMF0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(action-browser)/./node_modules/.pnpm/nodemailer@7.0.13/node_modules/nodemailer/lib/smtp-pool/index.js\n");
|
||
|
||
/***/ }),
|
||
|
||
/***/ "(action-browser)/./node_modules/.pnpm/nodemailer@7.0.13/node_modules/nodemailer/lib/smtp-pool/pool-resource.js":
|
||
/*!*****************************************************************************************************!*\
|
||
!*** ./node_modules/.pnpm/nodemailer@7.0.13/node_modules/nodemailer/lib/smtp-pool/pool-resource.js ***!
|
||
\*****************************************************************************************************/
|
||
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
|
||
|
||
eval("\n\nconst SMTPConnection = __webpack_require__(/*! ../smtp-connection */ \"(action-browser)/./node_modules/.pnpm/nodemailer@7.0.13/node_modules/nodemailer/lib/smtp-connection/index.js\");\nconst assign = (__webpack_require__(/*! ../shared */ \"(action-browser)/./node_modules/.pnpm/nodemailer@7.0.13/node_modules/nodemailer/lib/shared/index.js\").assign);\nconst XOAuth2 = __webpack_require__(/*! ../xoauth2 */ \"(action-browser)/./node_modules/.pnpm/nodemailer@7.0.13/node_modules/nodemailer/lib/xoauth2/index.js\");\nconst EventEmitter = __webpack_require__(/*! events */ \"events\");\n\n/**\n * Creates an element for the pool\n *\n * @constructor\n * @param {Object} options SMTPPool instance\n */\nclass PoolResource extends EventEmitter {\n constructor(pool) {\n super();\n\n this.pool = pool;\n this.options = pool.options;\n this.logger = this.pool.logger;\n\n if (this.options.auth) {\n switch ((this.options.auth.type || '').toString().toUpperCase()) {\n case 'OAUTH2': {\n let oauth2 = new XOAuth2(this.options.auth, this.logger);\n oauth2.provisionCallback =\n (this.pool.mailer && this.pool.mailer.get('oauth2_provision_cb')) || oauth2.provisionCallback;\n this.auth = {\n type: 'OAUTH2',\n user: this.options.auth.user,\n oauth2,\n method: 'XOAUTH2'\n };\n oauth2.on('token', token => this.pool.mailer.emit('token', token));\n oauth2.on('error', err => this.emit('error', err));\n break;\n }\n default:\n if (!this.options.auth.user && !this.options.auth.pass) {\n break;\n }\n this.auth = {\n type: (this.options.auth.type || '').toString().toUpperCase() || 'LOGIN',\n user: this.options.auth.user,\n credentials: {\n user: this.options.auth.user || '',\n pass: this.options.auth.pass,\n options: this.options.auth.options\n },\n method: (this.options.auth.method || '').trim().toUpperCase() || this.options.authMethod || false\n };\n }\n }\n\n this._connection = false;\n this._connected = false;\n\n this.messages = 0;\n this.available = true;\n }\n\n /**\n * Initiates a connection to the SMTP server\n *\n * @param {Function} callback Callback function to run once the connection is established or failed\n */\n connect(callback) {\n this.pool.getSocket(this.options, (err, socketOptions) => {\n if (err) {\n return callback(err);\n }\n\n let returned = false;\n let options = this.options;\n if (socketOptions && socketOptions.connection) {\n this.logger.info(\n {\n tnx: 'proxy',\n remoteAddress: socketOptions.connection.remoteAddress,\n remotePort: socketOptions.connection.remotePort,\n destHost: options.host || '',\n destPort: options.port || '',\n action: 'connected'\n },\n 'Using proxied socket from %s:%s to %s:%s',\n socketOptions.connection.remoteAddress,\n socketOptions.connection.remotePort,\n options.host || '',\n options.port || ''\n );\n\n options = assign(false, options);\n Object.keys(socketOptions).forEach(key => {\n options[key] = socketOptions[key];\n });\n }\n\n this.connection = new SMTPConnection(options);\n\n this.connection.once('error', err => {\n this.emit('error', err);\n if (returned) {\n return;\n }\n returned = true;\n return callback(err);\n });\n\n this.connection.once('end', () => {\n this.close();\n if (returned) {\n return;\n }\n returned = true;\n\n let timer = setTimeout(() => {\n if (returned) {\n return;\n }\n // still have not returned, this means we have an unexpected connection close\n let err = new Error('Unexpected socket close');\n if (this.connection && this.connection._socket && this.connection._socket.upgrading) {\n // starttls connection errors\n err.code = 'ETLS';\n }\n callback(err);\n }, 1000);\n\n try {\n timer.unref();\n } catch (_E) {\n // Ignore. Happens on envs with non-node timer implementation\n }\n });\n\n this.connection.connect(() => {\n if (returned) {\n return;\n }\n\n if (this.auth && (this.connection.allowsAuth || options.forceAuth)) {\n this.connection.login(this.auth, err => {\n if (returned) {\n return;\n }\n returned = true;\n\n if (err) {\n this.connection.close();\n this.emit('error', err);\n return callback(err);\n }\n\n this._connected = true;\n callback(null, true);\n });\n } else {\n returned = true;\n this._connected = true;\n return callback(null, true);\n }\n });\n });\n }\n\n /**\n * Sends an e-mail to be sent using the selected settings\n *\n * @param {Object} mail Mail object\n * @param {Function} callback Callback function\n */\n send(mail, callback) {\n if (!this._connected) {\n return this.connect(err => {\n if (err) {\n return callback(err);\n }\n return this.send(mail, callback);\n });\n }\n\n let envelope = mail.message.getEnvelope();\n let messageId = mail.message.messageId();\n\n let recipients = [].concat(envelope.to || []);\n if (recipients.length > 3) {\n recipients.push('...and ' + recipients.splice(2).length + ' more');\n }\n this.logger.info(\n {\n tnx: 'send',\n messageId,\n cid: this.id\n },\n 'Sending message %s using #%s to <%s>',\n messageId,\n this.id,\n recipients.join(', ')\n );\n\n if (mail.data.dsn) {\n envelope.dsn = mail.data.dsn;\n }\n\n // RFC 8689: Pass requireTLSExtensionEnabled to envelope for MAIL FROM parameter\n if (mail.data.requireTLSExtensionEnabled) {\n envelope.requireTLSExtensionEnabled = mail.data.requireTLSExtensionEnabled;\n }\n\n this.connection.send(envelope, mail.message.createReadStream(), (err, info) => {\n this.messages++;\n\n if (err) {\n this.connection.close();\n this.emit('error', err);\n return callback(err);\n }\n\n info.envelope = {\n from: envelope.from,\n to: envelope.to\n };\n info.messageId = messageId;\n\n setImmediate(() => {\n let err;\n if (this.messages >= this.options.maxMessages) {\n err = new Error('Resource exhausted');\n err.code = 'EMAXLIMIT';\n this.connection.close();\n this.emit('error', err);\n } else {\n this.pool._checkRateLimit(() => {\n this.available = true;\n this.emit('available');\n });\n }\n });\n\n callback(null, info);\n });\n }\n\n /**\n * Closes the connection\n */\n close() {\n this._connected = false;\n if (this.auth && this.auth.oauth2) {\n this.auth.oauth2.removeAllListeners();\n }\n if (this.connection) {\n this.connection.close();\n }\n this.emit('close');\n }\n}\n\nmodule.exports = PoolResource;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFjdGlvbi1icm93c2VyKS8uL25vZGVfbW9kdWxlcy8ucG5wbS9ub2RlbWFpbGVyQDcuMC4xMy9ub2RlX21vZHVsZXMvbm9kZW1haWxlci9saWIvc210cC1wb29sL3Bvb2wtcmVzb3VyY2UuanMiLCJtYXBwaW5ncyI6IkFBQWE7O0FBRWIsdUJBQXVCLG1CQUFPLENBQUMsd0lBQW9CO0FBQ25ELGVBQWUsb0pBQTJCO0FBQzFDLGdCQUFnQixtQkFBTyxDQUFDLHdIQUFZO0FBQ3BDLHFCQUFxQixtQkFBTyxDQUFDLHNCQUFROztBQUVyQztBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsUUFBUTtBQUNuQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUJBQXlCO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsVUFBVTtBQUN6QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTs7QUFFYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjs7QUFFakI7QUFDQTtBQUNBLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0EsYUFBYTs7QUFFYjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYixTQUFTO0FBQ1Q7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsZUFBZSxRQUFRO0FBQ3ZCLGVBQWUsVUFBVTtBQUN6QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQjtBQUNBLGFBQWE7O0FBRWI7QUFDQSxTQUFTO0FBQ1Q7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSIsInNvdXJjZXMiOlsiL1VzZXJzL21hcmNtaW50ZWwvUHJvamVjdHMvZS10aWIuY29tL25vZGVfbW9kdWxlcy8ucG5wbS9ub2RlbWFpbGVyQDcuMC4xMy9ub2RlX21vZHVsZXMvbm9kZW1haWxlci9saWIvc210cC1wb29sL3Bvb2wtcmVzb3VyY2UuanMiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCBTTVRQQ29ubmVjdGlvbiA9IHJlcXVpcmUoJy4uL3NtdHAtY29ubmVjdGlvbicpO1xuY29uc3QgYXNzaWduID0gcmVxdWlyZSgnLi4vc2hhcmVkJykuYXNzaWduO1xuY29uc3QgWE9BdXRoMiA9IHJlcXVpcmUoJy4uL3hvYXV0aDInKTtcbmNvbnN0IEV2ZW50RW1pdHRlciA9IHJlcXVpcmUoJ2V2ZW50cycpO1xuXG4vKipcbiAqIENyZWF0ZXMgYW4gZWxlbWVudCBmb3IgdGhlIHBvb2xcbiAqXG4gKiBAY29uc3RydWN0b3JcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIFNNVFBQb29sIGluc3RhbmNlXG4gKi9cbmNsYXNzIFBvb2xSZXNvdXJjZSBleHRlbmRzIEV2ZW50RW1pdHRlciB7XG4gICAgY29uc3RydWN0b3IocG9vbCkge1xuICAgICAgICBzdXBlcigpO1xuXG4gICAgICAgIHRoaXMucG9vbCA9IHBvb2w7XG4gICAgICAgIHRoaXMub3B0aW9ucyA9IHBvb2wub3B0aW9ucztcbiAgICAgICAgdGhpcy5sb2dnZXIgPSB0aGlzLnBvb2wubG9nZ2VyO1xuXG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMuYXV0aCkge1xuICAgICAgICAgICAgc3dpdGNoICgodGhpcy5vcHRpb25zLmF1dGgudHlwZSB8fCAnJykudG9TdHJpbmcoKS50b1VwcGVyQ2FzZSgpKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAnT0FVVEgyJzoge1xuICAgICAgICAgICAgICAgICAgICBsZXQgb2F1dGgyID0gbmV3IFhPQXV0aDIodGhpcy5vcHRpb25zLmF1dGgsIHRoaXMubG9nZ2VyKTtcbiAgICAgICAgICAgICAgICAgICAgb2F1dGgyLnByb3Zpc2lvbkNhbGxiYWNrID1cbiAgICAgICAgICAgICAgICAgICAgICAgICh0aGlzLnBvb2wubWFpbGVyICYmIHRoaXMucG9vbC5tYWlsZXIuZ2V0KCdvYXV0aDJfcHJvdmlzaW9uX2NiJykpIHx8IG9hdXRoMi5wcm92aXNpb25DYWxsYmFjaztcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hdXRoID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ09BVVRIMicsXG4gICAgICAgICAgICAgICAgICAgICAgICB1c2VyOiB0aGlzLm9wdGlvbnMuYXV0aC51c2VyLFxuICAgICAgICAgICAgICAgICAgICAgICAgb2F1dGgyLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kOiAnWE9BVVRIMidcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgb2F1dGgyLm9uKCd0b2tlbicsIHRva2VuID0+IHRoaXMucG9vbC5tYWlsZXIuZW1pdCgndG9rZW4nLCB0b2tlbikpO1xuICAgICAgICAgICAgICAgICAgICBvYXV0aDIub24oJ2Vycm9yJywgZXJyID0+IHRoaXMuZW1pdCgnZXJyb3InLCBlcnIpKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLmF1dGgudXNlciAmJiAhdGhpcy5vcHRpb25zLmF1dGgucGFzcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hdXRoID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogKHRoaXMub3B0aW9ucy5hdXRoLnR5cGUgfHwgJycpLnRvU3RyaW5nKCkudG9VcHBlckNhc2UoKSB8fCAnTE9HSU4nLFxuICAgICAgICAgICAgICAgICAgICAgICAgdXNlcjogdGhpcy5vcHRpb25zLmF1dGgudXNlcixcbiAgICAgICAgICAgICAgICAgICAgICAgIGNyZWRlbnRpYWxzOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlcjogdGhpcy5vcHRpb25zLmF1dGgudXNlciB8fCAnJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzOiB0aGlzLm9wdGlvbnMuYXV0aC5wYXNzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnM6IHRoaXMub3B0aW9ucy5hdXRoLm9wdGlvbnNcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXRob2Q6ICh0aGlzLm9wdGlvbnMuYXV0aC5tZXRob2QgfHwgJycpLnRyaW0oKS50b1VwcGVyQ2FzZSgpIHx8IHRoaXMub3B0aW9ucy5hdXRoTWV0aG9kIHx8IGZhbHNlXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9jb25uZWN0aW9uID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX2Nvbm5lY3RlZCA9IGZhbHNlO1xuXG4gICAgICAgIHRoaXMubWVzc2FnZXMgPSAwO1xuICAgICAgICB0aGlzLmF2YWlsYWJsZSA9IHRydWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSW5pdGlhdGVzIGEgY29ubmVjdGlvbiB0byB0aGUgU01UUCBzZXJ2ZXJcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIENhbGxiYWNrIGZ1bmN0aW9uIHRvIHJ1biBvbmNlIHRoZSBjb25uZWN0aW9uIGlzIGVzdGFibGlzaGVkIG9yIGZhaWxlZFxuICAgICAqL1xuICAgIGNvbm5lY3QoY2FsbGJhY2spIHtcbiAgICAgICAgdGhpcy5wb29sLmdldFNvY2tldCh0aGlzLm9wdGlvbnMsIChlcnIsIHNvY2tldE9wdGlvbnMpID0+IHtcbiAgICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY2FsbGJhY2soZXJyKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbGV0IHJldHVybmVkID0gZmFsc2U7XG4gICAgICAgICAgICBsZXQgb3B0aW9ucyA9IHRoaXMub3B0aW9ucztcbiAgICAgICAgICAgIGlmIChzb2NrZXRPcHRpb25zICYmIHNvY2tldE9wdGlvbnMuY29ubmVjdGlvbikge1xuICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmluZm8oXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRueDogJ3Byb3h5JyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlbW90ZUFkZHJlc3M6IHNvY2tldE9wdGlvbnMuY29ubmVjdGlvbi5yZW1vdGVBZGRyZXNzLFxuICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3RlUG9ydDogc29ja2V0T3B0aW9ucy5jb25uZWN0aW9uLnJlbW90ZVBvcnQsXG4gICAgICAgICAgICAgICAgICAgICAgICBkZXN0SG9zdDogb3B0aW9ucy5ob3N0IHx8ICcnLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGVzdFBvcnQ6IG9wdGlvbnMucG9ydCB8fCAnJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbjogJ2Nvbm5lY3RlZCdcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgJ1VzaW5nIHByb3hpZWQgc29ja2V0IGZyb20gJXM6JXMgdG8gJXM6JXMnLFxuICAgICAgICAgICAgICAgICAgICBzb2NrZXRPcHRpb25zLmNvbm5lY3Rpb24ucmVtb3RlQWRkcmVzcyxcbiAgICAgICAgICAgICAgICAgICAgc29ja2V0T3B0aW9ucy5jb25uZWN0aW9uLnJlbW90ZVBvcnQsXG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuaG9zdCB8fCAnJyxcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5wb3J0IHx8ICcnXG4gICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgIG9wdGlvbnMgPSBhc3NpZ24oZmFsc2UsIG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgIE9iamVjdC5rZXlzKHNvY2tldE9wdGlvbnMpLmZvckVhY2goa2V5ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9uc1trZXldID0gc29ja2V0T3B0aW9uc1trZXldO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLmNvbm5lY3Rpb24gPSBuZXcgU01UUENvbm5lY3Rpb24ob3B0aW9ucyk7XG5cbiAgICAgICAgICAgIHRoaXMuY29ubmVjdGlvbi5vbmNlKCdlcnJvcicsIGVyciA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5lbWl0KCdlcnJvcicsIGVycik7XG4gICAgICAgICAgICAgICAgaWYgKHJldHVybmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHJldHVybiBjYWxsYmFjayhlcnIpO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHRoaXMuY29ubmVjdGlvbi5vbmNlKCdlbmQnLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5jbG9zZSgpO1xuICAgICAgICAgICAgICAgIGlmIChyZXR1cm5lZCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybmVkID0gdHJ1ZTtcblxuICAgICAgICAgICAgICAgIGxldCB0aW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAocmV0dXJuZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAvLyBzdGlsbCBoYXZlIG5vdCByZXR1cm5lZCwgdGhpcyBtZWFucyB3ZSBoYXZlIGFuIHVuZXhwZWN0ZWQgY29ubmVjdGlvbiBjbG9zZVxuICAgICAgICAgICAgICAgICAgICBsZXQgZXJyID0gbmV3IEVycm9yKCdVbmV4cGVjdGVkIHNvY2tldCBjbG9zZScpO1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5jb25uZWN0aW9uICYmIHRoaXMuY29ubmVjdGlvbi5fc29ja2V0ICYmIHRoaXMuY29ubmVjdGlvbi5fc29ja2V0LnVwZ3JhZGluZykge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RhcnR0bHMgY29ubmVjdGlvbiBlcnJvcnNcbiAgICAgICAgICAgICAgICAgICAgICAgIGVyci5jb2RlID0gJ0VUTFMnO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVycik7XG4gICAgICAgICAgICAgICAgfSwgMTAwMCk7XG5cbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICB0aW1lci51bnJlZigpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKF9FKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIElnbm9yZS4gSGFwcGVucyBvbiBlbnZzIHdpdGggbm9uLW5vZGUgdGltZXIgaW1wbGVtZW50YXRpb25cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgdGhpcy5jb25uZWN0aW9uLmNvbm5lY3QoKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChyZXR1cm5lZCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuYXV0aCAmJiAodGhpcy5jb25uZWN0aW9uLmFsbG93c0F1dGggfHwgb3B0aW9ucy5mb3JjZUF1dGgpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29ubmVjdGlvbi5sb2dpbih0aGlzLmF1dGgsIGVyciA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmV0dXJuZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5lZCA9IHRydWU7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbm5lY3Rpb24uY2xvc2UoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmVtaXQoJ2Vycm9yJywgZXJyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2FsbGJhY2soZXJyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fY29ubmVjdGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKG51bGwsIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm5lZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2Nvbm5lY3RlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBjYWxsYmFjayhudWxsLCB0cnVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2VuZHMgYW4gZS1tYWlsIHRvIGJlIHNlbnQgdXNpbmcgdGhlIHNlbGVjdGVkIHNldHRpbmdzXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gbWFpbCBNYWlsIG9iamVjdFxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIENhbGxiYWNrIGZ1bmN0aW9uXG4gICAgICovXG4gICAgc2VuZChtYWlsLCBjYWxsYmFjaykge1xuICAgICAgICBpZiAoIXRoaXMuX2Nvbm5lY3RlZCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29ubmVjdChlcnIgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKGVycik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnNlbmQobWFpbCwgY2FsbGJhY2spO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgZW52ZWxvcGUgPSBtYWlsLm1lc3NhZ2UuZ2V0RW52ZWxvcGUoKTtcbiAgICAgICAgbGV0IG1lc3NhZ2VJZCA9IG1haWwubWVzc2FnZS5tZXNzYWdlSWQoKTtcblxuICAgICAgICBsZXQgcmVjaXBpZW50cyA9IFtdLmNvbmNhdChlbnZlbG9wZS50byB8fCBbXSk7XG4gICAgICAgIGlmIChyZWNpcGllbnRzLmxlbmd0aCA+IDMpIHtcbiAgICAgICAgICAgIHJlY2lwaWVudHMucHVzaCgnLi4uYW5kICcgKyByZWNpcGllbnRzLnNwbGljZSgyKS5sZW5ndGggKyAnIG1vcmUnKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmxvZ2dlci5pbmZvKFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHRueDogJ3NlbmQnLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2VJZCxcbiAgICAgICAgICAgICAgICBjaWQ6IHRoaXMuaWRcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnU2VuZGluZyBtZXNzYWdlICVzIHVzaW5nICMlcyB0byA8JXM+JyxcbiAgICAgICAgICAgIG1lc3NhZ2VJZCxcbiAgICAgICAgICAgIHRoaXMuaWQsXG4gICAgICAgICAgICByZWNpcGllbnRzLmpvaW4oJywgJylcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAobWFpbC5kYXRhLmRzbikge1xuICAgICAgICAgICAgZW52ZWxvcGUuZHNuID0gbWFpbC5kYXRhLmRzbjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFJGQyA4Njg5OiBQYXNzIHJlcXVpcmVUTFNFeHRlbnNpb25FbmFibGVkIHRvIGVudmVsb3BlIGZvciBNQUlMIEZST00gcGFyYW1ldGVyXG4gICAgICAgIGlmIChtYWlsLmRhdGEucmVxdWlyZVRMU0V4dGVuc2lvbkVuYWJsZWQpIHtcbiAgICAgICAgICAgIGVudmVsb3BlLnJlcXVpcmVUTFNFeHRlbnNpb25FbmFibGVkID0gbWFpbC5kYXRhLnJlcXVpcmVUTFNFeHRlbnNpb25FbmFibGVkO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jb25uZWN0aW9uLnNlbmQoZW52ZWxvcGUsIG1haWwubWVzc2FnZS5jcmVhdGVSZWFkU3RyZWFtKCksIChlcnIsIGluZm8pID0+IHtcbiAgICAgICAgICAgIHRoaXMubWVzc2FnZXMrKztcblxuICAgICAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgICAgICAgIHRoaXMuY29ubmVjdGlvbi5jbG9zZSgpO1xuICAgICAgICAgICAgICAgIHRoaXMuZW1pdCgnZXJyb3InLCBlcnIpO1xuICAgICAgICAgICAgICAgIHJldHVybiBjYWxsYmFjayhlcnIpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpbmZvLmVudmVsb3BlID0ge1xuICAgICAgICAgICAgICAgIGZyb206IGVudmVsb3BlLmZyb20sXG4gICAgICAgICAgICAgICAgdG86IGVudmVsb3BlLnRvXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgaW5mby5tZXNzYWdlSWQgPSBtZXNzYWdlSWQ7XG5cbiAgICAgICAgICAgIHNldEltbWVkaWF0ZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgbGV0IGVycjtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5tZXNzYWdlcyA+PSB0aGlzLm9wdGlvbnMubWF4TWVzc2FnZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgZXJyID0gbmV3IEVycm9yKCdSZXNvdXJjZSBleGhhdXN0ZWQnKTtcbiAgICAgICAgICAgICAgICAgICAgZXJyLmNvZGUgPSAnRU1BWExJTUlUJztcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb25uZWN0aW9uLmNsb3NlKCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZW1pdCgnZXJyb3InLCBlcnIpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucG9vbC5fY2hlY2tSYXRlTGltaXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hdmFpbGFibGUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5lbWl0KCdhdmFpbGFibGUnKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGNhbGxiYWNrKG51bGwsIGluZm8pO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDbG9zZXMgdGhlIGNvbm5lY3Rpb25cbiAgICAgKi9cbiAgICBjbG9zZSgpIHtcbiAgICAgICAgdGhpcy5fY29ubmVjdGVkID0gZmFsc2U7XG4gICAgICAgIGlmICh0aGlzLmF1dGggJiYgdGhpcy5hdXRoLm9hdXRoMikge1xuICAgICAgICAgICAgdGhpcy5hdXRoLm9hdXRoMi5yZW1vdmVBbGxMaXN0ZW5lcnMoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5jb25uZWN0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLmNvbm5lY3Rpb24uY2xvc2UoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmVtaXQoJ2Nsb3NlJyk7XG4gICAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IFBvb2xSZXNvdXJjZTtcbiJdLCJuYW1lcyI6W10sImlnbm9yZUxpc3QiOlswXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(action-browser)/./node_modules/.pnpm/nodemailer@7.0.13/node_modules/nodemailer/lib/smtp-pool/pool-resource.js\n");
|
||
|
||
/***/ }),
|
||
|
||
/***/ "(action-browser)/./node_modules/.pnpm/nodemailer@7.0.13/node_modules/nodemailer/lib/smtp-transport/index.js":
|
||
/*!**************************************************************************************************!*\
|
||
!*** ./node_modules/.pnpm/nodemailer@7.0.13/node_modules/nodemailer/lib/smtp-transport/index.js ***!
|
||
\**************************************************************************************************/
|
||
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
|
||
|
||
eval("\n\nconst EventEmitter = __webpack_require__(/*! events */ \"events\");\nconst SMTPConnection = __webpack_require__(/*! ../smtp-connection */ \"(action-browser)/./node_modules/.pnpm/nodemailer@7.0.13/node_modules/nodemailer/lib/smtp-connection/index.js\");\nconst wellKnown = __webpack_require__(/*! ../well-known */ \"(action-browser)/./node_modules/.pnpm/nodemailer@7.0.13/node_modules/nodemailer/lib/well-known/index.js\");\nconst shared = __webpack_require__(/*! ../shared */ \"(action-browser)/./node_modules/.pnpm/nodemailer@7.0.13/node_modules/nodemailer/lib/shared/index.js\");\nconst XOAuth2 = __webpack_require__(/*! ../xoauth2 */ \"(action-browser)/./node_modules/.pnpm/nodemailer@7.0.13/node_modules/nodemailer/lib/xoauth2/index.js\");\nconst packageData = __webpack_require__(/*! ../../package.json */ \"(action-browser)/./node_modules/.pnpm/nodemailer@7.0.13/node_modules/nodemailer/package.json\");\n\n/**\n * Creates a SMTP transport object for Nodemailer\n *\n * @constructor\n * @param {Object} options Connection options\n */\nclass SMTPTransport extends EventEmitter {\n constructor(options) {\n super();\n\n options = options || {};\n\n if (typeof options === 'string') {\n options = {\n url: options\n };\n }\n\n let urlData;\n let service = options.service;\n\n if (typeof options.getSocket === 'function') {\n this.getSocket = options.getSocket;\n }\n\n if (options.url) {\n urlData = shared.parseConnectionUrl(options.url);\n service = service || urlData.service;\n }\n\n this.options = shared.assign(\n false, // create new object\n options, // regular options\n urlData, // url options\n service && wellKnown(service) // wellknown options\n );\n\n this.logger = shared.getLogger(this.options, {\n component: this.options.component || 'smtp-transport'\n });\n\n // temporary object\n let connection = new SMTPConnection(this.options);\n\n this.name = 'SMTP';\n this.version = packageData.version + '[client:' + connection.version + ']';\n\n if (this.options.auth) {\n this.auth = this.getAuth({});\n }\n }\n\n /**\n * Placeholder function for creating proxy sockets. This method immediatelly returns\n * without a socket\n *\n * @param {Object} options Connection options\n * @param {Function} callback Callback function to run with the socket keys\n */\n getSocket(options, callback) {\n // return immediatelly\n return setImmediate(() => callback(null, false));\n }\n\n getAuth(authOpts) {\n if (!authOpts) {\n return this.auth;\n }\n\n let hasAuth = false;\n let authData = {};\n\n if (this.options.auth && typeof this.options.auth === 'object') {\n Object.keys(this.options.auth).forEach(key => {\n hasAuth = true;\n authData[key] = this.options.auth[key];\n });\n }\n\n if (authOpts && typeof authOpts === 'object') {\n Object.keys(authOpts).forEach(key => {\n hasAuth = true;\n authData[key] = authOpts[key];\n });\n }\n\n if (!hasAuth) {\n return false;\n }\n\n switch ((authData.type || '').toString().toUpperCase()) {\n case 'OAUTH2': {\n if (!authData.service && !authData.user) {\n return false;\n }\n let oauth2 = new XOAuth2(authData, this.logger);\n oauth2.provisionCallback = (this.mailer && this.mailer.get('oauth2_provision_cb')) || oauth2.provisionCallback;\n oauth2.on('token', token => this.mailer.emit('token', token));\n oauth2.on('error', err => this.emit('error', err));\n return {\n type: 'OAUTH2',\n user: authData.user,\n oauth2,\n method: 'XOAUTH2'\n };\n }\n default:\n return {\n type: (authData.type || '').toString().toUpperCase() || 'LOGIN',\n user: authData.user,\n credentials: {\n user: authData.user || '',\n pass: authData.pass,\n options: authData.options\n },\n method: (authData.method || '').trim().toUpperCase() || this.options.authMethod || false\n };\n }\n }\n\n /**\n * Sends an e-mail using the selected settings\n *\n * @param {Object} mail Mail object\n * @param {Function} callback Callback function\n */\n send(mail, callback) {\n this.getSocket(this.options, (err, socketOptions) => {\n if (err) {\n return callback(err);\n }\n\n let returned = false;\n let options = this.options;\n if (socketOptions && socketOptions.connection) {\n this.logger.info(\n {\n tnx: 'proxy',\n remoteAddress: socketOptions.connection.remoteAddress,\n remotePort: socketOptions.connection.remotePort,\n destHost: options.host || '',\n destPort: options.port || '',\n action: 'connected'\n },\n 'Using proxied socket from %s:%s to %s:%s',\n socketOptions.connection.remoteAddress,\n socketOptions.connection.remotePort,\n options.host || '',\n options.port || ''\n );\n\n // only copy options if we need to modify it\n options = shared.assign(false, options);\n Object.keys(socketOptions).forEach(key => {\n options[key] = socketOptions[key];\n });\n }\n\n let connection = new SMTPConnection(options);\n\n connection.once('error', err => {\n if (returned) {\n return;\n }\n returned = true;\n connection.close();\n return callback(err);\n });\n\n connection.once('end', () => {\n if (returned) {\n return;\n }\n\n let timer = setTimeout(() => {\n if (returned) {\n return;\n }\n returned = true;\n // still have not returned, this means we have an unexpected connection close\n let err = new Error('Unexpected socket close');\n if (connection && connection._socket && connection._socket.upgrading) {\n // starttls connection errors\n err.code = 'ETLS';\n }\n callback(err);\n }, 1000);\n\n try {\n timer.unref();\n } catch (_E) {\n // Ignore. Happens on envs with non-node timer implementation\n }\n });\n\n let sendMessage = () => {\n let envelope = mail.message.getEnvelope();\n let messageId = mail.message.messageId();\n\n let recipients = [].concat(envelope.to || []);\n if (recipients.length > 3) {\n recipients.push('...and ' + recipients.splice(2).length + ' more');\n }\n\n if (mail.data.dsn) {\n envelope.dsn = mail.data.dsn;\n }\n\n // RFC 8689: Pass requireTLSExtensionEnabled to envelope for MAIL FROM parameter\n if (mail.data.requireTLSExtensionEnabled) {\n envelope.requireTLSExtensionEnabled = mail.data.requireTLSExtensionEnabled;\n }\n\n this.logger.info(\n {\n tnx: 'send',\n messageId\n },\n 'Sending message %s to <%s>',\n messageId,\n recipients.join(', ')\n );\n\n connection.send(envelope, mail.message.createReadStream(), (err, info) => {\n returned = true;\n connection.close();\n if (err) {\n this.logger.error(\n {\n err,\n tnx: 'send'\n },\n 'Send error for %s: %s',\n messageId,\n err.message\n );\n return callback(err);\n }\n info.envelope = {\n from: envelope.from,\n to: envelope.to\n };\n info.messageId = messageId;\n try {\n return callback(null, info);\n } catch (E) {\n this.logger.error(\n {\n err: E,\n tnx: 'callback'\n },\n 'Callback error for %s: %s',\n messageId,\n E.message\n );\n }\n });\n };\n\n connection.connect(() => {\n if (returned) {\n return;\n }\n\n let auth = this.getAuth(mail.data.auth);\n\n if (auth && (connection.allowsAuth || options.forceAuth)) {\n connection.login(auth, err => {\n if (auth && auth !== this.auth && auth.oauth2) {\n auth.oauth2.removeAllListeners();\n }\n if (returned) {\n return;\n }\n\n if (err) {\n returned = true;\n connection.close();\n return callback(err);\n }\n\n sendMessage();\n });\n } else {\n sendMessage();\n }\n });\n });\n }\n\n /**\n * Verifies SMTP configuration\n *\n * @param {Function} callback Callback function\n */\n verify(callback) {\n let promise;\n\n if (!callback) {\n promise = new Promise((resolve, reject) => {\n callback = shared.callbackPromise(resolve, reject);\n });\n }\n\n this.getSocket(this.options, (err, socketOptions) => {\n if (err) {\n return callback(err);\n }\n\n let options = this.options;\n if (socketOptions && socketOptions.connection) {\n this.logger.info(\n {\n tnx: 'proxy',\n remoteAddress: socketOptions.connection.remoteAddress,\n remotePort: socketOptions.connection.remotePort,\n destHost: options.host || '',\n destPort: options.port || '',\n action: 'connected'\n },\n 'Using proxied socket from %s:%s to %s:%s',\n socketOptions.connection.remoteAddress,\n socketOptions.connection.remotePort,\n options.host || '',\n options.port || ''\n );\n\n options = shared.assign(false, options);\n Object.keys(socketOptions).forEach(key => {\n options[key] = socketOptions[key];\n });\n }\n\n let connection = new SMTPConnection(options);\n let returned = false;\n\n connection.once('error', err => {\n if (returned) {\n return;\n }\n returned = true;\n connection.close();\n return callback(err);\n });\n\n connection.once('end', () => {\n if (returned) {\n return;\n }\n returned = true;\n return callback(new Error('Connection closed'));\n });\n\n let finalize = () => {\n if (returned) {\n return;\n }\n returned = true;\n connection.quit();\n return callback(null, true);\n };\n\n connection.connect(() => {\n if (returned) {\n return;\n }\n\n let authData = this.getAuth({});\n\n if (authData && (connection.allowsAuth || options.forceAuth)) {\n connection.login(authData, err => {\n if (returned) {\n return;\n }\n\n if (err) {\n returned = true;\n connection.close();\n return callback(err);\n }\n\n finalize();\n });\n } else if (!authData && connection.allowsAuth && options.forceAuth) {\n let err = new Error('Authentication info was not provided');\n err.code = 'NoAuth';\n\n returned = true;\n connection.close();\n return callback(err);\n } else {\n finalize();\n }\n });\n });\n\n return promise;\n }\n\n /**\n * Releases resources\n */\n close() {\n if (this.auth && this.auth.oauth2) {\n this.auth.oauth2.removeAllListeners();\n }\n this.emit('close');\n }\n}\n\n// expose to the world\nmodule.exports = SMTPTransport;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFjdGlvbi1icm93c2VyKS8uL25vZGVfbW9kdWxlcy8ucG5wbS9ub2RlbWFpbGVyQDcuMC4xMy9ub2RlX21vZHVsZXMvbm9kZW1haWxlci9saWIvc210cC10cmFuc3BvcnQvaW5kZXguanMiLCJtYXBwaW5ncyI6IkFBQWE7O0FBRWIscUJBQXFCLG1CQUFPLENBQUMsc0JBQVE7QUFDckMsdUJBQXVCLG1CQUFPLENBQUMsd0lBQW9CO0FBQ25ELGtCQUFrQixtQkFBTyxDQUFDLDhIQUFlO0FBQ3pDLGVBQWUsbUJBQU8sQ0FBQyxzSEFBVztBQUNsQyxnQkFBZ0IsbUJBQU8sQ0FBQyx3SEFBWTtBQUNwQyxvQkFBb0IsbUJBQU8sQ0FBQyx3SEFBb0I7O0FBRWhEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLHVDQUF1QztBQUN2QztBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxRQUFRO0FBQ3ZCLGVBQWUsVUFBVTtBQUN6QjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLFFBQVE7QUFDdkIsZUFBZSxVQUFVO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7O0FBRWI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCOztBQUVqQjtBQUNBO0FBQ0Esa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQSxhQUFhOztBQUViO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZCQUE2QjtBQUM3QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQjtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZCQUE2QjtBQUM3QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLHFCQUFxQjtBQUNyQixrQkFBa0I7QUFDbEI7QUFDQTtBQUNBLGFBQWE7QUFDYixTQUFTO0FBQ1Q7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsZUFBZSxVQUFVO0FBQ3pCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTs7QUFFYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhOztBQUViO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsOENBQThDOztBQUU5QztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxxQkFBcUI7QUFDckIsa0JBQWtCO0FBQ2xCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQSxhQUFhO0FBQ2IsU0FBUzs7QUFFVDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EiLCJzb3VyY2VzIjpbIi9Vc2Vycy9tYXJjbWludGVsL1Byb2plY3RzL2UtdGliLmNvbS9ub2RlX21vZHVsZXMvLnBucG0vbm9kZW1haWxlckA3LjAuMTMvbm9kZV9tb2R1bGVzL25vZGVtYWlsZXIvbGliL3NtdHAtdHJhbnNwb3J0L2luZGV4LmpzIl0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcblxuY29uc3QgRXZlbnRFbWl0dGVyID0gcmVxdWlyZSgnZXZlbnRzJyk7XG5jb25zdCBTTVRQQ29ubmVjdGlvbiA9IHJlcXVpcmUoJy4uL3NtdHAtY29ubmVjdGlvbicpO1xuY29uc3Qgd2VsbEtub3duID0gcmVxdWlyZSgnLi4vd2VsbC1rbm93bicpO1xuY29uc3Qgc2hhcmVkID0gcmVxdWlyZSgnLi4vc2hhcmVkJyk7XG5jb25zdCBYT0F1dGgyID0gcmVxdWlyZSgnLi4veG9hdXRoMicpO1xuY29uc3QgcGFja2FnZURhdGEgPSByZXF1aXJlKCcuLi8uLi9wYWNrYWdlLmpzb24nKTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgU01UUCB0cmFuc3BvcnQgb2JqZWN0IGZvciBOb2RlbWFpbGVyXG4gKlxuICogQGNvbnN0cnVjdG9yXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyBDb25uZWN0aW9uIG9wdGlvbnNcbiAqL1xuY2xhc3MgU01UUFRyYW5zcG9ydCBleHRlbmRzIEV2ZW50RW1pdHRlciB7XG4gICAgY29uc3RydWN0b3Iob3B0aW9ucykge1xuICAgICAgICBzdXBlcigpO1xuXG4gICAgICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuXG4gICAgICAgIGlmICh0eXBlb2Ygb3B0aW9ucyA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIG9wdGlvbnMgPSB7XG4gICAgICAgICAgICAgICAgdXJsOiBvcHRpb25zXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHVybERhdGE7XG4gICAgICAgIGxldCBzZXJ2aWNlID0gb3B0aW9ucy5zZXJ2aWNlO1xuXG4gICAgICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5nZXRTb2NrZXQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHRoaXMuZ2V0U29ja2V0ID0gb3B0aW9ucy5nZXRTb2NrZXQ7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAob3B0aW9ucy51cmwpIHtcbiAgICAgICAgICAgIHVybERhdGEgPSBzaGFyZWQucGFyc2VDb25uZWN0aW9uVXJsKG9wdGlvbnMudXJsKTtcbiAgICAgICAgICAgIHNlcnZpY2UgPSBzZXJ2aWNlIHx8IHVybERhdGEuc2VydmljZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMub3B0aW9ucyA9IHNoYXJlZC5hc3NpZ24oXG4gICAgICAgICAgICBmYWxzZSwgLy8gY3JlYXRlIG5ldyBvYmplY3RcbiAgICAgICAgICAgIG9wdGlvbnMsIC8vIHJlZ3VsYXIgb3B0aW9uc1xuICAgICAgICAgICAgdXJsRGF0YSwgLy8gdXJsIG9wdGlvbnNcbiAgICAgICAgICAgIHNlcnZpY2UgJiYgd2VsbEtub3duKHNlcnZpY2UpIC8vIHdlbGxrbm93biBvcHRpb25zXG4gICAgICAgICk7XG5cbiAgICAgICAgdGhpcy5sb2dnZXIgPSBzaGFyZWQuZ2V0TG9nZ2VyKHRoaXMub3B0aW9ucywge1xuICAgICAgICAgICAgY29tcG9uZW50OiB0aGlzLm9wdGlvbnMuY29tcG9uZW50IHx8ICdzbXRwLXRyYW5zcG9ydCdcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gdGVtcG9yYXJ5IG9iamVjdFxuICAgICAgICBsZXQgY29ubmVjdGlvbiA9IG5ldyBTTVRQQ29ubmVjdGlvbih0aGlzLm9wdGlvbnMpO1xuXG4gICAgICAgIHRoaXMubmFtZSA9ICdTTVRQJztcbiAgICAgICAgdGhpcy52ZXJzaW9uID0gcGFja2FnZURhdGEudmVyc2lvbiArICdbY2xpZW50OicgKyBjb25uZWN0aW9uLnZlcnNpb24gKyAnXSc7XG5cbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5hdXRoKSB7XG4gICAgICAgICAgICB0aGlzLmF1dGggPSB0aGlzLmdldEF1dGgoe30pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGxhY2Vob2xkZXIgZnVuY3Rpb24gZm9yIGNyZWF0aW5nIHByb3h5IHNvY2tldHMuIFRoaXMgbWV0aG9kIGltbWVkaWF0ZWxseSByZXR1cm5zXG4gICAgICogd2l0aG91dCBhIHNvY2tldFxuICAgICAqXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgQ29ubmVjdGlvbiBvcHRpb25zXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgQ2FsbGJhY2sgZnVuY3Rpb24gdG8gcnVuIHdpdGggdGhlIHNvY2tldCBrZXlzXG4gICAgICovXG4gICAgZ2V0U29ja2V0KG9wdGlvbnMsIGNhbGxiYWNrKSB7XG4gICAgICAgIC8vIHJldHVybiBpbW1lZGlhdGVsbHlcbiAgICAgICAgcmV0dXJuIHNldEltbWVkaWF0ZSgoKSA9PiBjYWxsYmFjayhudWxsLCBmYWxzZSkpO1xuICAgIH1cblxuICAgIGdldEF1dGgoYXV0aE9wdHMpIHtcbiAgICAgICAgaWYgKCFhdXRoT3B0cykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuYXV0aDtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBoYXNBdXRoID0gZmFsc2U7XG4gICAgICAgIGxldCBhdXRoRGF0YSA9IHt9O1xuXG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMuYXV0aCAmJiB0eXBlb2YgdGhpcy5vcHRpb25zLmF1dGggPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICBPYmplY3Qua2V5cyh0aGlzLm9wdGlvbnMuYXV0aCkuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICAgICAgICAgIGhhc0F1dGggPSB0cnVlO1xuICAgICAgICAgICAgICAgIGF1dGhEYXRhW2tleV0gPSB0aGlzLm9wdGlvbnMuYXV0aFtrZXldO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoYXV0aE9wdHMgJiYgdHlwZW9mIGF1dGhPcHRzID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgT2JqZWN0LmtleXMoYXV0aE9wdHMpLmZvckVhY2goa2V5ID0+IHtcbiAgICAgICAgICAgICAgICBoYXNBdXRoID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBhdXRoRGF0YVtrZXldID0gYXV0aE9wdHNba2V5XTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFoYXNBdXRoKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBzd2l0Y2ggKChhdXRoRGF0YS50eXBlIHx8ICcnKS50b1N0cmluZygpLnRvVXBwZXJDYXNlKCkpIHtcbiAgICAgICAgICAgIGNhc2UgJ09BVVRIMic6IHtcbiAgICAgICAgICAgICAgICBpZiAoIWF1dGhEYXRhLnNlcnZpY2UgJiYgIWF1dGhEYXRhLnVzZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBsZXQgb2F1dGgyID0gbmV3IFhPQXV0aDIoYXV0aERhdGEsIHRoaXMubG9nZ2VyKTtcbiAgICAgICAgICAgICAgICBvYXV0aDIucHJvdmlzaW9uQ2FsbGJhY2sgPSAodGhpcy5tYWlsZXIgJiYgdGhpcy5tYWlsZXIuZ2V0KCdvYXV0aDJfcHJvdmlzaW9uX2NiJykpIHx8IG9hdXRoMi5wcm92aXNpb25DYWxsYmFjaztcbiAgICAgICAgICAgICAgICBvYXV0aDIub24oJ3Rva2VuJywgdG9rZW4gPT4gdGhpcy5tYWlsZXIuZW1pdCgndG9rZW4nLCB0b2tlbikpO1xuICAgICAgICAgICAgICAgIG9hdXRoMi5vbignZXJyb3InLCBlcnIgPT4gdGhpcy5lbWl0KCdlcnJvcicsIGVycikpO1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICdPQVVUSDInLFxuICAgICAgICAgICAgICAgICAgICB1c2VyOiBhdXRoRGF0YS51c2VyLFxuICAgICAgICAgICAgICAgICAgICBvYXV0aDIsXG4gICAgICAgICAgICAgICAgICAgIG1ldGhvZDogJ1hPQVVUSDInXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogKGF1dGhEYXRhLnR5cGUgfHwgJycpLnRvU3RyaW5nKCkudG9VcHBlckNhc2UoKSB8fCAnTE9HSU4nLFxuICAgICAgICAgICAgICAgICAgICB1c2VyOiBhdXRoRGF0YS51c2VyLFxuICAgICAgICAgICAgICAgICAgICBjcmVkZW50aWFsczoge1xuICAgICAgICAgICAgICAgICAgICAgICAgdXNlcjogYXV0aERhdGEudXNlciB8fCAnJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhc3M6IGF1dGhEYXRhLnBhc3MsXG4gICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zOiBhdXRoRGF0YS5vcHRpb25zXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIG1ldGhvZDogKGF1dGhEYXRhLm1ldGhvZCB8fCAnJykudHJpbSgpLnRvVXBwZXJDYXNlKCkgfHwgdGhpcy5vcHRpb25zLmF1dGhNZXRob2QgfHwgZmFsc2VcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2VuZHMgYW4gZS1tYWlsIHVzaW5nIHRoZSBzZWxlY3RlZCBzZXR0aW5nc1xuICAgICAqXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG1haWwgTWFpbCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBDYWxsYmFjayBmdW5jdGlvblxuICAgICAqL1xuICAgIHNlbmQobWFpbCwgY2FsbGJhY2spIHtcbiAgICAgICAgdGhpcy5nZXRTb2NrZXQodGhpcy5vcHRpb25zLCAoZXJyLCBzb2NrZXRPcHRpb25zKSA9PiB7XG4gICAgICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKGVycik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxldCByZXR1cm5lZCA9IGZhbHNlO1xuICAgICAgICAgICAgbGV0IG9wdGlvbnMgPSB0aGlzLm9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoc29ja2V0T3B0aW9ucyAmJiBzb2NrZXRPcHRpb25zLmNvbm5lY3Rpb24pIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5pbmZvKFxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0bng6ICdwcm94eScsXG4gICAgICAgICAgICAgICAgICAgICAgICByZW1vdGVBZGRyZXNzOiBzb2NrZXRPcHRpb25zLmNvbm5lY3Rpb24ucmVtb3RlQWRkcmVzcyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlbW90ZVBvcnQ6IHNvY2tldE9wdGlvbnMuY29ubmVjdGlvbi5yZW1vdGVQb3J0LFxuICAgICAgICAgICAgICAgICAgICAgICAgZGVzdEhvc3Q6IG9wdGlvbnMuaG9zdCB8fCAnJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RQb3J0OiBvcHRpb25zLnBvcnQgfHwgJycsXG4gICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb246ICdjb25uZWN0ZWQnXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICdVc2luZyBwcm94aWVkIHNvY2tldCBmcm9tICVzOiVzIHRvICVzOiVzJyxcbiAgICAgICAgICAgICAgICAgICAgc29ja2V0T3B0aW9ucy5jb25uZWN0aW9uLnJlbW90ZUFkZHJlc3MsXG4gICAgICAgICAgICAgICAgICAgIHNvY2tldE9wdGlvbnMuY29ubmVjdGlvbi5yZW1vdGVQb3J0LFxuICAgICAgICAgICAgICAgICAgICBvcHRpb25zLmhvc3QgfHwgJycsXG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbnMucG9ydCB8fCAnJ1xuICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICAvLyBvbmx5IGNvcHkgb3B0aW9ucyBpZiB3ZSBuZWVkIHRvIG1vZGlmeSBpdFxuICAgICAgICAgICAgICAgIG9wdGlvbnMgPSBzaGFyZWQuYXNzaWduKGZhbHNlLCBvcHRpb25zKTtcbiAgICAgICAgICAgICAgICBPYmplY3Qua2V5cyhzb2NrZXRPcHRpb25zKS5mb3JFYWNoKGtleSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbnNba2V5XSA9IHNvY2tldE9wdGlvbnNba2V5XTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbGV0IGNvbm5lY3Rpb24gPSBuZXcgU01UUENvbm5lY3Rpb24ob3B0aW9ucyk7XG5cbiAgICAgICAgICAgIGNvbm5lY3Rpb24ub25jZSgnZXJyb3InLCBlcnIgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChyZXR1cm5lZCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybmVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBjb25uZWN0aW9uLmNsb3NlKCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKGVycik7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgY29ubmVjdGlvbi5vbmNlKCdlbmQnLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHJldHVybmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBsZXQgdGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJldHVybmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAvLyBzdGlsbCBoYXZlIG5vdCByZXR1cm5lZCwgdGhpcyBtZWFucyB3ZSBoYXZlIGFuIHVuZXhwZWN0ZWQgY29ubmVjdGlvbiBjbG9zZVxuICAgICAgICAgICAgICAgICAgICBsZXQgZXJyID0gbmV3IEVycm9yKCdVbmV4cGVjdGVkIHNvY2tldCBjbG9zZScpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoY29ubmVjdGlvbiAmJiBjb25uZWN0aW9uLl9zb2NrZXQgJiYgY29ubmVjdGlvbi5fc29ja2V0LnVwZ3JhZGluZykge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RhcnR0bHMgY29ubmVjdGlvbiBlcnJvcnNcbiAgICAgICAgICAgICAgICAgICAgICAgIGVyci5jb2RlID0gJ0VUTFMnO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVycik7XG4gICAgICAgICAgICAgICAgfSwgMTAwMCk7XG5cbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICB0aW1lci51bnJlZigpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKF9FKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIElnbm9yZS4gSGFwcGVucyBvbiBlbnZzIHdpdGggbm9uLW5vZGUgdGltZXIgaW1wbGVtZW50YXRpb25cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgbGV0IHNlbmRNZXNzYWdlID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIGxldCBlbnZlbG9wZSA9IG1haWwubWVzc2FnZS5nZXRFbnZlbG9wZSgpO1xuICAgICAgICAgICAgICAgIGxldCBtZXNzYWdlSWQgPSBtYWlsLm1lc3NhZ2UubWVzc2FnZUlkKCk7XG5cbiAgICAgICAgICAgICAgICBsZXQgcmVjaXBpZW50cyA9IFtdLmNvbmNhdChlbnZlbG9wZS50byB8fCBbXSk7XG4gICAgICAgICAgICAgICAgaWYgKHJlY2lwaWVudHMubGVuZ3RoID4gMykge1xuICAgICAgICAgICAgICAgICAgICByZWNpcGllbnRzLnB1c2goJy4uLmFuZCAnICsgcmVjaXBpZW50cy5zcGxpY2UoMikubGVuZ3RoICsgJyBtb3JlJyk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKG1haWwuZGF0YS5kc24pIHtcbiAgICAgICAgICAgICAgICAgICAgZW52ZWxvcGUuZHNuID0gbWFpbC5kYXRhLmRzbjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBSRkMgODY4OTogUGFzcyByZXF1aXJlVExTRXh0ZW5zaW9uRW5hYmxlZCB0byBlbnZlbG9wZSBmb3IgTUFJTCBGUk9NIHBhcmFtZXRlclxuICAgICAgICAgICAgICAgIGlmIChtYWlsLmRhdGEucmVxdWlyZVRMU0V4dGVuc2lvbkVuYWJsZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgZW52ZWxvcGUucmVxdWlyZVRMU0V4dGVuc2lvbkVuYWJsZWQgPSBtYWlsLmRhdGEucmVxdWlyZVRMU0V4dGVuc2lvbkVuYWJsZWQ7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuaW5mbyhcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgdG54OiAnc2VuZCcsXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlSWRcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgJ1NlbmRpbmcgbWVzc2FnZSAlcyB0byA8JXM+JyxcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZUlkLFxuICAgICAgICAgICAgICAgICAgICByZWNpcGllbnRzLmpvaW4oJywgJylcbiAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgY29ubmVjdGlvbi5zZW5kKGVudmVsb3BlLCBtYWlsLm1lc3NhZ2UuY3JlYXRlUmVhZFN0cmVhbSgpLCAoZXJyLCBpbmZvKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybmVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbi5jbG9zZSgpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG54OiAnc2VuZCdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdTZW5kIGVycm9yIGZvciAlczogJXMnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIubWVzc2FnZVxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjYWxsYmFjayhlcnIpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGluZm8uZW52ZWxvcGUgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmcm9tOiBlbnZlbG9wZS5mcm9tLFxuICAgICAgICAgICAgICAgICAgICAgICAgdG86IGVudmVsb3BlLnRvXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIGluZm8ubWVzc2FnZUlkID0gbWVzc2FnZUlkO1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKG51bGwsIGluZm8pO1xuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChFKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycjogRSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG54OiAnY2FsbGJhY2snXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQ2FsbGJhY2sgZXJyb3IgZm9yICVzOiAlcycsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZUlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEUubWVzc2FnZVxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgY29ubmVjdGlvbi5jb25uZWN0KCgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAocmV0dXJuZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGxldCBhdXRoID0gdGhpcy5nZXRBdXRoKG1haWwuZGF0YS5hdXRoKTtcblxuICAgICAgICAgICAgICAgIGlmIChhdXRoICYmIChjb25uZWN0aW9uLmFsbG93c0F1dGggfHwgb3B0aW9ucy5mb3JjZUF1dGgpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24ubG9naW4oYXV0aCwgZXJyID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhdXRoICYmIGF1dGggIT09IHRoaXMuYXV0aCAmJiBhdXRoLm9hdXRoMikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dGgub2F1dGgyLnJlbW92ZUFsbExpc3RlbmVycygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJldHVybmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24uY2xvc2UoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2FsbGJhY2soZXJyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgc2VuZE1lc3NhZ2UoKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgc2VuZE1lc3NhZ2UoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVmVyaWZpZXMgU01UUCBjb25maWd1cmF0aW9uXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBDYWxsYmFjayBmdW5jdGlvblxuICAgICAqL1xuICAgIHZlcmlmeShjYWxsYmFjaykge1xuICAgICAgICBsZXQgcHJvbWlzZTtcblxuICAgICAgICBpZiAoIWNhbGxiYWNrKSB7XG4gICAgICAgICAgICBwcm9taXNlID0gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrID0gc2hhcmVkLmNhbGxiYWNrUHJvbWlzZShyZXNvbHZlLCByZWplY3QpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmdldFNvY2tldCh0aGlzLm9wdGlvbnMsIChlcnIsIHNvY2tldE9wdGlvbnMpID0+IHtcbiAgICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY2FsbGJhY2soZXJyKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbGV0IG9wdGlvbnMgPSB0aGlzLm9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoc29ja2V0T3B0aW9ucyAmJiBzb2NrZXRPcHRpb25zLmNvbm5lY3Rpb24pIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5pbmZvKFxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0bng6ICdwcm94eScsXG4gICAgICAgICAgICAgICAgICAgICAgICByZW1vdGVBZGRyZXNzOiBzb2NrZXRPcHRpb25zLmNvbm5lY3Rpb24ucmVtb3RlQWRkcmVzcyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlbW90ZVBvcnQ6IHNvY2tldE9wdGlvbnMuY29ubmVjdGlvbi5yZW1vdGVQb3J0LFxuICAgICAgICAgICAgICAgICAgICAgICAgZGVzdEhvc3Q6IG9wdGlvbnMuaG9zdCB8fCAnJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RQb3J0OiBvcHRpb25zLnBvcnQgfHwgJycsXG4gICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb246ICdjb25uZWN0ZWQnXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICdVc2luZyBwcm94aWVkIHNvY2tldCBmcm9tICVzOiVzIHRvICVzOiVzJyxcbiAgICAgICAgICAgICAgICAgICAgc29ja2V0T3B0aW9ucy5jb25uZWN0aW9uLnJlbW90ZUFkZHJlc3MsXG4gICAgICAgICAgICAgICAgICAgIHNvY2tldE9wdGlvbnMuY29ubmVjdGlvbi5yZW1vdGVQb3J0LFxuICAgICAgICAgICAgICAgICAgICBvcHRpb25zLmhvc3QgfHwgJycsXG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbnMucG9ydCB8fCAnJ1xuICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICBvcHRpb25zID0gc2hhcmVkLmFzc2lnbihmYWxzZSwgb3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgT2JqZWN0LmtleXMoc29ja2V0T3B0aW9ucykuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBvcHRpb25zW2tleV0gPSBzb2NrZXRPcHRpb25zW2tleV07XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxldCBjb25uZWN0aW9uID0gbmV3IFNNVFBDb25uZWN0aW9uKG9wdGlvbnMpO1xuICAgICAgICAgICAgbGV0IHJldHVybmVkID0gZmFsc2U7XG5cbiAgICAgICAgICAgIGNvbm5lY3Rpb24ub25jZSgnZXJyb3InLCBlcnIgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChyZXR1cm5lZCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybmVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBjb25uZWN0aW9uLmNsb3NlKCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKGVycik7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgY29ubmVjdGlvbi5vbmNlKCdlbmQnLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHJldHVybmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHJldHVybiBjYWxsYmFjayhuZXcgRXJyb3IoJ0Nvbm5lY3Rpb24gY2xvc2VkJykpO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGxldCBmaW5hbGl6ZSA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAocmV0dXJuZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm5lZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgY29ubmVjdGlvbi5xdWl0KCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKG51bGwsIHRydWUpO1xuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgY29ubmVjdGlvbi5jb25uZWN0KCgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAocmV0dXJuZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGxldCBhdXRoRGF0YSA9IHRoaXMuZ2V0QXV0aCh7fSk7XG5cbiAgICAgICAgICAgICAgICBpZiAoYXV0aERhdGEgJiYgKGNvbm5lY3Rpb24uYWxsb3dzQXV0aCB8fCBvcHRpb25zLmZvcmNlQXV0aCkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbi5sb2dpbihhdXRoRGF0YSwgZXJyID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXR1cm5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybmVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uLmNsb3NlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKGVycik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsaXplKCk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIWF1dGhEYXRhICYmIGNvbm5lY3Rpb24uYWxsb3dzQXV0aCAmJiBvcHRpb25zLmZvcmNlQXV0aCkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgZXJyID0gbmV3IEVycm9yKCdBdXRoZW50aWNhdGlvbiBpbmZvIHdhcyBub3QgcHJvdmlkZWQnKTtcbiAgICAgICAgICAgICAgICAgICAgZXJyLmNvZGUgPSAnTm9BdXRoJztcblxuICAgICAgICAgICAgICAgICAgICByZXR1cm5lZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24uY2xvc2UoKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKGVycik7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgZmluYWxpemUoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIHByb21pc2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVsZWFzZXMgcmVzb3VyY2VzXG4gICAgICovXG4gICAgY2xvc2UoKSB7XG4gICAgICAgIGlmICh0aGlzLmF1dGggJiYgdGhpcy5hdXRoLm9hdXRoMikge1xuICAgICAgICAgICAgdGhpcy5hdXRoLm9hdXRoMi5yZW1vdmVBbGxMaXN0ZW5lcnMoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmVtaXQoJ2Nsb3NlJyk7XG4gICAgfVxufVxuXG4vLyBleHBvc2UgdG8gdGhlIHdvcmxkXG5tb2R1bGUuZXhwb3J0cyA9IFNNVFBUcmFuc3BvcnQ7XG4iXSwibmFtZXMiOltdLCJpZ25vcmVMaXN0IjpbMF0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(action-browser)/./node_modules/.pnpm/nodemailer@7.0.13/node_modules/nodemailer/lib/smtp-transport/index.js\n");
|
||
|
||
/***/ }),
|
||
|
||
/***/ "(action-browser)/./node_modules/.pnpm/nodemailer@7.0.13/node_modules/nodemailer/lib/stream-transport/index.js":
|
||
/*!****************************************************************************************************!*\
|
||
!*** ./node_modules/.pnpm/nodemailer@7.0.13/node_modules/nodemailer/lib/stream-transport/index.js ***!
|
||
\****************************************************************************************************/
|
||
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
|
||
|
||
eval("\n\nconst packageData = __webpack_require__(/*! ../../package.json */ \"(action-browser)/./node_modules/.pnpm/nodemailer@7.0.13/node_modules/nodemailer/package.json\");\nconst shared = __webpack_require__(/*! ../shared */ \"(action-browser)/./node_modules/.pnpm/nodemailer@7.0.13/node_modules/nodemailer/lib/shared/index.js\");\n\n/**\n * Generates a Transport object for streaming\n *\n * Possible options can be the following:\n *\n * * **buffer** if true, then returns the message as a Buffer object instead of a stream\n * * **newline** either 'windows' or 'unix'\n *\n * @constructor\n * @param {Object} optional config parameter\n */\nclass StreamTransport {\n constructor(options) {\n options = options || {};\n\n this.options = options || {};\n\n this.name = 'StreamTransport';\n this.version = packageData.version;\n\n this.logger = shared.getLogger(this.options, {\n component: this.options.component || 'stream-transport'\n });\n\n this.winbreak = ['win', 'windows', 'dos', '\\r\\n'].includes((options.newline || '').toString().toLowerCase());\n }\n\n /**\n * Compiles a mailcomposer message and forwards it to handler that sends it\n *\n * @param {Object} emailMessage MailComposer object\n * @param {Function} callback Callback function to run when the sending is completed\n */\n send(mail, done) {\n // We probably need this in the output\n mail.message.keepBcc = true;\n\n let envelope = mail.data.envelope || mail.message.getEnvelope();\n let messageId = mail.message.messageId();\n\n let recipients = [].concat(envelope.to || []);\n if (recipients.length > 3) {\n recipients.push('...and ' + recipients.splice(2).length + ' more');\n }\n this.logger.info(\n {\n tnx: 'send',\n messageId\n },\n 'Sending message %s to <%s> using %s line breaks',\n messageId,\n recipients.join(', '),\n this.winbreak ? '<CR><LF>' : '<LF>'\n );\n\n setImmediate(() => {\n let stream;\n\n try {\n stream = mail.message.createReadStream();\n } catch (E) {\n this.logger.error(\n {\n err: E,\n tnx: 'send',\n messageId\n },\n 'Creating send stream failed for %s. %s',\n messageId,\n E.message\n );\n return done(E);\n }\n\n if (!this.options.buffer) {\n stream.once('error', err => {\n this.logger.error(\n {\n err,\n tnx: 'send',\n messageId\n },\n 'Failed creating message for %s. %s',\n messageId,\n err.message\n );\n });\n return done(null, {\n envelope: mail.data.envelope || mail.message.getEnvelope(),\n messageId,\n message: stream\n });\n }\n\n let chunks = [];\n let chunklen = 0;\n stream.on('readable', () => {\n let chunk;\n while ((chunk = stream.read()) !== null) {\n chunks.push(chunk);\n chunklen += chunk.length;\n }\n });\n\n stream.once('error', err => {\n this.logger.error(\n {\n err,\n tnx: 'send',\n messageId\n },\n 'Failed creating message for %s. %s',\n messageId,\n err.message\n );\n return done(err);\n });\n\n stream.on('end', () =>\n done(null, {\n envelope: mail.data.envelope || mail.message.getEnvelope(),\n messageId,\n message: Buffer.concat(chunks, chunklen)\n })\n );\n });\n }\n}\n\nmodule.exports = StreamTransport;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFjdGlvbi1icm93c2VyKS8uL25vZGVfbW9kdWxlcy8ucG5wbS9ub2RlbWFpbGVyQDcuMC4xMy9ub2RlX21vZHVsZXMvbm9kZW1haWxlci9saWIvc3RyZWFtLXRyYW5zcG9ydC9pbmRleC5qcyIsIm1hcHBpbmdzIjoiQUFBYTs7QUFFYixvQkFBb0IsbUJBQU8sQ0FBQyx3SEFBb0I7QUFDaEQsZUFBZSxtQkFBTyxDQUFDLHNIQUFXOztBQUVsQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsUUFBUTtBQUN2QixlQUFlLFVBQVU7QUFDekI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUJBQXlCO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhOztBQUViO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTs7QUFFYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0EsU0FBUztBQUNUO0FBQ0E7O0FBRUEiLCJzb3VyY2VzIjpbIi9Vc2Vycy9tYXJjbWludGVsL1Byb2plY3RzL2UtdGliLmNvbS9ub2RlX21vZHVsZXMvLnBucG0vbm9kZW1haWxlckA3LjAuMTMvbm9kZV9tb2R1bGVzL25vZGVtYWlsZXIvbGliL3N0cmVhbS10cmFuc3BvcnQvaW5kZXguanMiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCBwYWNrYWdlRGF0YSA9IHJlcXVpcmUoJy4uLy4uL3BhY2thZ2UuanNvbicpO1xuY29uc3Qgc2hhcmVkID0gcmVxdWlyZSgnLi4vc2hhcmVkJyk7XG5cbi8qKlxuICogR2VuZXJhdGVzIGEgVHJhbnNwb3J0IG9iamVjdCBmb3Igc3RyZWFtaW5nXG4gKlxuICogUG9zc2libGUgb3B0aW9ucyBjYW4gYmUgdGhlIGZvbGxvd2luZzpcbiAqXG4gKiAgKiAqKmJ1ZmZlcioqIGlmIHRydWUsIHRoZW4gcmV0dXJucyB0aGUgbWVzc2FnZSBhcyBhIEJ1ZmZlciBvYmplY3QgaW5zdGVhZCBvZiBhIHN0cmVhbVxuICogICogKipuZXdsaW5lKiogZWl0aGVyICd3aW5kb3dzJyBvciAndW5peCdcbiAqXG4gKiBAY29uc3RydWN0b3JcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25hbCBjb25maWcgcGFyYW1ldGVyXG4gKi9cbmNsYXNzIFN0cmVhbVRyYW5zcG9ydCB7XG4gICAgY29uc3RydWN0b3Iob3B0aW9ucykge1xuICAgICAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcblxuICAgICAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuXG4gICAgICAgIHRoaXMubmFtZSA9ICdTdHJlYW1UcmFuc3BvcnQnO1xuICAgICAgICB0aGlzLnZlcnNpb24gPSBwYWNrYWdlRGF0YS52ZXJzaW9uO1xuXG4gICAgICAgIHRoaXMubG9nZ2VyID0gc2hhcmVkLmdldExvZ2dlcih0aGlzLm9wdGlvbnMsIHtcbiAgICAgICAgICAgIGNvbXBvbmVudDogdGhpcy5vcHRpb25zLmNvbXBvbmVudCB8fCAnc3RyZWFtLXRyYW5zcG9ydCdcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy53aW5icmVhayA9IFsnd2luJywgJ3dpbmRvd3MnLCAnZG9zJywgJ1xcclxcbiddLmluY2x1ZGVzKChvcHRpb25zLm5ld2xpbmUgfHwgJycpLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29tcGlsZXMgYSBtYWlsY29tcG9zZXIgbWVzc2FnZSBhbmQgZm9yd2FyZHMgaXQgdG8gaGFuZGxlciB0aGF0IHNlbmRzIGl0XG4gICAgICpcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gZW1haWxNZXNzYWdlIE1haWxDb21wb3NlciBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBDYWxsYmFjayBmdW5jdGlvbiB0byBydW4gd2hlbiB0aGUgc2VuZGluZyBpcyBjb21wbGV0ZWRcbiAgICAgKi9cbiAgICBzZW5kKG1haWwsIGRvbmUpIHtcbiAgICAgICAgLy8gV2UgcHJvYmFibHkgbmVlZCB0aGlzIGluIHRoZSBvdXRwdXRcbiAgICAgICAgbWFpbC5tZXNzYWdlLmtlZXBCY2MgPSB0cnVlO1xuXG4gICAgICAgIGxldCBlbnZlbG9wZSA9IG1haWwuZGF0YS5lbnZlbG9wZSB8fCBtYWlsLm1lc3NhZ2UuZ2V0RW52ZWxvcGUoKTtcbiAgICAgICAgbGV0IG1lc3NhZ2VJZCA9IG1haWwubWVzc2FnZS5tZXNzYWdlSWQoKTtcblxuICAgICAgICBsZXQgcmVjaXBpZW50cyA9IFtdLmNvbmNhdChlbnZlbG9wZS50byB8fCBbXSk7XG4gICAgICAgIGlmIChyZWNpcGllbnRzLmxlbmd0aCA+IDMpIHtcbiAgICAgICAgICAgIHJlY2lwaWVudHMucHVzaCgnLi4uYW5kICcgKyByZWNpcGllbnRzLnNwbGljZSgyKS5sZW5ndGggKyAnIG1vcmUnKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmxvZ2dlci5pbmZvKFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHRueDogJ3NlbmQnLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2VJZFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICdTZW5kaW5nIG1lc3NhZ2UgJXMgdG8gPCVzPiB1c2luZyAlcyBsaW5lIGJyZWFrcycsXG4gICAgICAgICAgICBtZXNzYWdlSWQsXG4gICAgICAgICAgICByZWNpcGllbnRzLmpvaW4oJywgJyksXG4gICAgICAgICAgICB0aGlzLndpbmJyZWFrID8gJzxDUj48TEY+JyA6ICc8TEY+J1xuICAgICAgICApO1xuXG4gICAgICAgIHNldEltbWVkaWF0ZSgoKSA9PiB7XG4gICAgICAgICAgICBsZXQgc3RyZWFtO1xuXG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHN0cmVhbSA9IG1haWwubWVzc2FnZS5jcmVhdGVSZWFkU3RyZWFtKCk7XG4gICAgICAgICAgICB9IGNhdGNoIChFKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVycjogRSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRueDogJ3NlbmQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZUlkXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICdDcmVhdGluZyBzZW5kIHN0cmVhbSBmYWlsZWQgZm9yICVzLiAlcycsXG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VJZCxcbiAgICAgICAgICAgICAgICAgICAgRS5tZXNzYWdlXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZG9uZShFKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMuYnVmZmVyKSB7XG4gICAgICAgICAgICAgICAgc3RyZWFtLm9uY2UoJ2Vycm9yJywgZXJyID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRueDogJ3NlbmQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VJZFxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICdGYWlsZWQgY3JlYXRpbmcgbWVzc2FnZSBmb3IgJXMuICVzJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGVyci5tZXNzYWdlXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGRvbmUobnVsbCwge1xuICAgICAgICAgICAgICAgICAgICBlbnZlbG9wZTogbWFpbC5kYXRhLmVudmVsb3BlIHx8IG1haWwubWVzc2FnZS5nZXRFbnZlbG9wZSgpLFxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlSWQsXG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IHN0cmVhbVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsZXQgY2h1bmtzID0gW107XG4gICAgICAgICAgICBsZXQgY2h1bmtsZW4gPSAwO1xuICAgICAgICAgICAgc3RyZWFtLm9uKCdyZWFkYWJsZScsICgpID0+IHtcbiAgICAgICAgICAgICAgICBsZXQgY2h1bms7XG4gICAgICAgICAgICAgICAgd2hpbGUgKChjaHVuayA9IHN0cmVhbS5yZWFkKCkpICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNodW5rcy5wdXNoKGNodW5rKTtcbiAgICAgICAgICAgICAgICAgICAgY2h1bmtsZW4gKz0gY2h1bmsubGVuZ3RoO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBzdHJlYW0ub25jZSgnZXJyb3InLCBlcnIgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKFxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlcnIsXG4gICAgICAgICAgICAgICAgICAgICAgICB0bng6ICdzZW5kJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VJZFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAnRmFpbGVkIGNyZWF0aW5nIG1lc3NhZ2UgZm9yICVzLiAlcycsXG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VJZCxcbiAgICAgICAgICAgICAgICAgICAgZXJyLm1lc3NhZ2VcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIHJldHVybiBkb25lKGVycik7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgc3RyZWFtLm9uKCdlbmQnLCAoKSA9PlxuICAgICAgICAgICAgICAgIGRvbmUobnVsbCwge1xuICAgICAgICAgICAgICAgICAgICBlbnZlbG9wZTogbWFpbC5kYXRhLmVudmVsb3BlIHx8IG1haWwubWVzc2FnZS5nZXRFbnZlbG9wZSgpLFxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlSWQsXG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IEJ1ZmZlci5jb25jYXQoY2h1bmtzLCBjaHVua2xlbilcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSk7XG4gICAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IFN0cmVhbVRyYW5zcG9ydDtcbiJdLCJuYW1lcyI6W10sImlnbm9yZUxpc3QiOlswXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(action-browser)/./node_modules/.pnpm/nodemailer@7.0.13/node_modules/nodemailer/lib/stream-transport/index.js\n");
|
||
|
||
/***/ }),
|
||
|
||
/***/ "(action-browser)/./node_modules/.pnpm/nodemailer@7.0.13/node_modules/nodemailer/lib/well-known/index.js":
|
||
/*!**********************************************************************************************!*\
|
||
!*** ./node_modules/.pnpm/nodemailer@7.0.13/node_modules/nodemailer/lib/well-known/index.js ***!
|
||
\**********************************************************************************************/
|
||
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
|
||
|
||
eval("\n\nconst services = __webpack_require__(/*! ./services.json */ \"(action-browser)/./node_modules/.pnpm/nodemailer@7.0.13/node_modules/nodemailer/lib/well-known/services.json\");\nconst normalized = {};\n\nObject.keys(services).forEach(key => {\n let service = services[key];\n\n normalized[normalizeKey(key)] = normalizeService(service);\n\n [].concat(service.aliases || []).forEach(alias => {\n normalized[normalizeKey(alias)] = normalizeService(service);\n });\n\n [].concat(service.domains || []).forEach(domain => {\n normalized[normalizeKey(domain)] = normalizeService(service);\n });\n});\n\nfunction normalizeKey(key) {\n return key.replace(/[^a-zA-Z0-9.-]/g, '').toLowerCase();\n}\n\nfunction normalizeService(service) {\n let filter = ['domains', 'aliases'];\n let response = {};\n\n Object.keys(service).forEach(key => {\n if (filter.indexOf(key) < 0) {\n response[key] = service[key];\n }\n });\n\n return response;\n}\n\n/**\n * Resolves SMTP config for given key. Key can be a name (like 'Gmail'), alias (like 'Google Mail') or\n * an email address (like 'test@googlemail.com').\n *\n * @param {String} key [description]\n * @returns {Object} SMTP config or false if not found\n */\nmodule.exports = function (key) {\n key = normalizeKey(key.split('@').pop());\n return normalized[key] || false;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFjdGlvbi1icm93c2VyKS8uL25vZGVfbW9kdWxlcy8ucG5wbS9ub2RlbWFpbGVyQDcuMC4xMy9ub2RlX21vZHVsZXMvbm9kZW1haWxlci9saWIvd2VsbC1rbm93bi9pbmRleC5qcyIsIm1hcHBpbmdzIjoiQUFBYTs7QUFFYixpQkFBaUIsbUJBQU8sQ0FBQyxxSUFBaUI7QUFDMUM7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0EsS0FBSztBQUNMLENBQUM7O0FBRUQ7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsUUFBUTtBQUNuQixhQUFhLFFBQVE7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsiL1VzZXJzL21hcmNtaW50ZWwvUHJvamVjdHMvZS10aWIuY29tL25vZGVfbW9kdWxlcy8ucG5wbS9ub2RlbWFpbGVyQDcuMC4xMy9ub2RlX21vZHVsZXMvbm9kZW1haWxlci9saWIvd2VsbC1rbm93bi9pbmRleC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbmNvbnN0IHNlcnZpY2VzID0gcmVxdWlyZSgnLi9zZXJ2aWNlcy5qc29uJyk7XG5jb25zdCBub3JtYWxpemVkID0ge307XG5cbk9iamVjdC5rZXlzKHNlcnZpY2VzKS5mb3JFYWNoKGtleSA9PiB7XG4gICAgbGV0IHNlcnZpY2UgPSBzZXJ2aWNlc1trZXldO1xuXG4gICAgbm9ybWFsaXplZFtub3JtYWxpemVLZXkoa2V5KV0gPSBub3JtYWxpemVTZXJ2aWNlKHNlcnZpY2UpO1xuXG4gICAgW10uY29uY2F0KHNlcnZpY2UuYWxpYXNlcyB8fCBbXSkuZm9yRWFjaChhbGlhcyA9PiB7XG4gICAgICAgIG5vcm1hbGl6ZWRbbm9ybWFsaXplS2V5KGFsaWFzKV0gPSBub3JtYWxpemVTZXJ2aWNlKHNlcnZpY2UpO1xuICAgIH0pO1xuXG4gICAgW10uY29uY2F0KHNlcnZpY2UuZG9tYWlucyB8fCBbXSkuZm9yRWFjaChkb21haW4gPT4ge1xuICAgICAgICBub3JtYWxpemVkW25vcm1hbGl6ZUtleShkb21haW4pXSA9IG5vcm1hbGl6ZVNlcnZpY2Uoc2VydmljZSk7XG4gICAgfSk7XG59KTtcblxuZnVuY3Rpb24gbm9ybWFsaXplS2V5KGtleSkge1xuICAgIHJldHVybiBrZXkucmVwbGFjZSgvW15hLXpBLVowLTkuLV0vZywgJycpLnRvTG93ZXJDYXNlKCk7XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZVNlcnZpY2Uoc2VydmljZSkge1xuICAgIGxldCBmaWx0ZXIgPSBbJ2RvbWFpbnMnLCAnYWxpYXNlcyddO1xuICAgIGxldCByZXNwb25zZSA9IHt9O1xuXG4gICAgT2JqZWN0LmtleXMoc2VydmljZSkuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICBpZiAoZmlsdGVyLmluZGV4T2Yoa2V5KSA8IDApIHtcbiAgICAgICAgICAgIHJlc3BvbnNlW2tleV0gPSBzZXJ2aWNlW2tleV07XG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiByZXNwb25zZTtcbn1cblxuLyoqXG4gKiBSZXNvbHZlcyBTTVRQIGNvbmZpZyBmb3IgZ2l2ZW4ga2V5LiBLZXkgY2FuIGJlIGEgbmFtZSAobGlrZSAnR21haWwnKSwgYWxpYXMgKGxpa2UgJ0dvb2dsZSBNYWlsJykgb3JcbiAqIGFuIGVtYWlsIGFkZHJlc3MgKGxpa2UgJ3Rlc3RAZ29vZ2xlbWFpbC5jb20nKS5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30ga2V5IFtkZXNjcmlwdGlvbl1cbiAqIEByZXR1cm5zIHtPYmplY3R9IFNNVFAgY29uZmlnIG9yIGZhbHNlIGlmIG5vdCBmb3VuZFxuICovXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChrZXkpIHtcbiAgICBrZXkgPSBub3JtYWxpemVLZXkoa2V5LnNwbGl0KCdAJykucG9wKCkpO1xuICAgIHJldHVybiBub3JtYWxpemVkW2tleV0gfHwgZmFsc2U7XG59O1xuIl0sIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6WzBdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(action-browser)/./node_modules/.pnpm/nodemailer@7.0.13/node_modules/nodemailer/lib/well-known/index.js\n");
|
||
|
||
/***/ }),
|
||
|
||
/***/ "(action-browser)/./node_modules/.pnpm/nodemailer@7.0.13/node_modules/nodemailer/lib/well-known/services.json":
|
||
/*!***************************************************************************************************!*\
|
||
!*** ./node_modules/.pnpm/nodemailer@7.0.13/node_modules/nodemailer/lib/well-known/services.json ***!
|
||
\***************************************************************************************************/
|
||
/***/ ((module) => {
|
||
|
||
module.exports = /*#__PURE__*/JSON.parse('{"126":{"description":"126 Mail (NetEase)","host":"smtp.126.com","port":465,"secure":true},"163":{"description":"163 Mail (NetEase)","host":"smtp.163.com","port":465,"secure":true},"1und1":{"description":"1&1 Mail (German hosting provider)","host":"smtp.1und1.de","port":465,"secure":true,"authMethod":"LOGIN"},"Aliyun":{"description":"Alibaba Cloud Mail","domains":["aliyun.com"],"host":"smtp.aliyun.com","port":465,"secure":true},"AliyunQiye":{"description":"Alibaba Cloud Enterprise Mail","host":"smtp.qiye.aliyun.com","port":465,"secure":true},"AOL":{"description":"AOL Mail","domains":["aol.com"],"host":"smtp.aol.com","port":587},"Aruba":{"description":"Aruba PEC (Italian email provider)","domains":["aruba.it","pec.aruba.it"],"aliases":["Aruba PEC"],"host":"smtps.aruba.it","port":465,"secure":true,"authMethod":"LOGIN"},"Bluewin":{"description":"Bluewin (Swiss email provider)","host":"smtpauths.bluewin.ch","domains":["bluewin.ch"],"port":465},"BOL":{"description":"BOL Mail (Brazilian provider)","domains":["bol.com.br"],"host":"smtp.bol.com.br","port":587,"requireTLS":true},"DebugMail":{"description":"DebugMail (email testing service)","host":"debugmail.io","port":25},"Disroot":{"description":"Disroot (privacy-focused provider)","domains":["disroot.org"],"host":"disroot.org","port":587,"secure":false,"authMethod":"LOGIN"},"DynectEmail":{"description":"Dyn Email Delivery","aliases":["Dynect"],"host":"smtp.dynect.net","port":25},"ElasticEmail":{"description":"Elastic Email","aliases":["Elastic Email"],"host":"smtp.elasticemail.com","port":465,"secure":true},"Ethereal":{"description":"Ethereal Email (email testing service)","aliases":["ethereal.email"],"host":"smtp.ethereal.email","port":587},"FastMail":{"description":"FastMail","domains":["fastmail.fm"],"host":"smtp.fastmail.com","port":465,"secure":true},"Feishu Mail":{"description":"Feishu Mail (Lark)","aliases":["Feishu","FeishuMail"],"domains":["www.feishu.cn"],"host":"smtp.feishu.cn","port":465,"secure":true},"Forward Email":{"description":"Forward Email (email forwarding service)","aliases":["FE","ForwardEmail"],"domains":["forwardemail.net"],"host":"smtp.forwardemail.net","port":465,"secure":true},"GandiMail":{"description":"Gandi Mail","aliases":["Gandi","Gandi Mail"],"host":"mail.gandi.net","port":587},"Gmail":{"description":"Gmail","aliases":["Google Mail"],"domains":["gmail.com","googlemail.com"],"host":"smtp.gmail.com","port":465,"secure":true},"GMX":{"description":"GMX Mail","domains":["gmx.com","gmx.net","gmx.de"],"host":"mail.gmx.com","port":587},"Godaddy":{"description":"GoDaddy Email (US)","host":"smtpout.secureserver.net","port":25},"GodaddyAsia":{"description":"GoDaddy Email (Asia)","host":"smtp.asia.secureserver.net","port":25},"GodaddyEurope":{"description":"GoDaddy Email (Europe)","host":"smtp.europe.secureserver.net","port":25},"hot.ee":{"description":"Hot.ee (Estonian email provider)","host":"mail.hot.ee"},"Hotmail":{"description":"Outlook.com / Hotmail","aliases":["Outlook","Outlook.com","Hotmail.com"],"domains":["hotmail.com","outlook.com"],"host":"smtp-mail.outlook.com","port":587},"iCloud":{"description":"iCloud Mail","aliases":["Me","Mac"],"domains":["me.com","mac.com"],"host":"smtp.mail.me.com","port":587},"Infomaniak":{"description":"Infomaniak Mail (Swiss hosting provider)","host":"mail.infomaniak.com","domains":["ik.me","ikmail.com","etik.com"],"port":587},"KolabNow":{"description":"KolabNow (secure email service)","domains":["kolabnow.com"],"aliases":["Kolab"],"host":"smtp.kolabnow.com","port":465,"secure":true,"authMethod":"LOGIN"},"Loopia":{"description":"Loopia (Swedish hosting provider)","host":"mailcluster.loopia.se","port":465},"Loops":{"description":"Loops","host":"smtp.loops.so","port":587},"mail.ee":{"description":"Mail.ee (Estonian email provider)","host":"smtp.mail.ee"},"Mail.ru":{"description":"Mail.ru","host":"smtp.mail.ru","port":465,"secure":true},"Mailcatch.app":{"description":"Mailcatch (email testing service)","host":"sandbox-smtp.mailcatch.app","port":2525},"Maildev":{"description":"MailDev (local email testing)","port":1025,"ignoreTLS":true},"MailerSend":{"description":"MailerSend","host":"smtp.mailersend.net","port":587},"Mailgun":{"description":"Mailgun","host":"smtp.mailgun.org","port":465,"secure":true},"Mailjet":{"description":"Mailjet","host":"in.mailjet.com","port":587},"Mailosaur":{"description":"Mailosaur (email testing service)","host":"mailosaur.io","port":25},"Mailtrap":{"description":"Mailtrap","host":"live.smtp.mailtrap.io","port":587},"Mandrill":{"description":"Mandrill (by Mailchimp)","host":"smtp.mandrillapp.com","port":587},"Naver":{"description":"Naver Mail (Korean email provider)","host":"smtp.naver.com","port":587},"OhMySMTP":{"description":"OhMySMTP (email delivery service)","host":"smtp.ohmysmtp.com","port":587,"secure":false},"One":{"description":"One.com Email","host":"send.one.com","port":465,"secure":true},"OpenMailBox":{"description":"OpenMailBox","aliases":["OMB","openmailbox.org"],"host":"smtp.openmailbox.org","port":465,"secure":true},"Outlook365":{"description":"Microsoft 365 / Office 365","host":"smtp.office365.com","port":587,"secure":false},"Postmark":{"description":"Postmark","aliases":["PostmarkApp"],"host":"smtp.postmarkapp.com","port":2525},"Proton":{"description":"Proton Mail","aliases":["ProtonMail","Proton.me","Protonmail.com","Protonmail.ch"],"domains":["proton.me","protonmail.com","pm.me","protonmail.ch"],"host":"smtp.protonmail.ch","port":587,"requireTLS":true},"qiye.aliyun":{"description":"Alibaba Mail Enterprise Edition","host":"smtp.mxhichina.com","port":"465","secure":true},"QQ":{"description":"QQ Mail","domains":["qq.com"],"host":"smtp.qq.com","port":465,"secure":true},"QQex":{"description":"QQ Enterprise Mail","aliases":["QQ Enterprise"],"domains":["exmail.qq.com"],"host":"smtp.exmail.qq.com","port":465,"secure":true},"Resend":{"description":"Resend","host":"smtp.resend.com","port":465,"secure":true},"Runbox":{"description":"Runbox (Norwegian email provider)","domains":["runbox.com"],"host":"smtp.runbox.com","port":465,"secure":true},"SendCloud":{"description":"SendCloud (Chinese email delivery)","host":"smtp.sendcloud.net","port":2525},"SendGrid":{"description":"SendGrid","host":"smtp.sendgrid.net","port":587},"SendinBlue":{"description":"Brevo (formerly Sendinblue)","aliases":["Brevo"],"host":"smtp-relay.brevo.com","port":587},"SendPulse":{"description":"SendPulse","host":"smtp-pulse.com","port":465,"secure":true},"SES":{"description":"AWS SES US East (N. Virginia)","host":"email-smtp.us-east-1.amazonaws.com","port":465,"secure":true},"SES-AP-NORTHEAST-1":{"description":"AWS SES Asia Pacific (Tokyo)","host":"email-smtp.ap-northeast-1.amazonaws.com","port":465,"secure":true},"SES-AP-NORTHEAST-2":{"description":"AWS SES Asia Pacific (Seoul)","host":"email-smtp.ap-northeast-2.amazonaws.com","port":465,"secure":true},"SES-AP-NORTHEAST-3":{"description":"AWS SES Asia Pacific (Osaka)","host":"email-smtp.ap-northeast-3.amazonaws.com","port":465,"secure":true},"SES-AP-SOUTH-1":{"description":"AWS SES Asia Pacific (Mumbai)","host":"email-smtp.ap-south-1.amazonaws.com","port":465,"secure":true},"SES-AP-SOUTHEAST-1":{"description":"AWS SES Asia Pacific (Singapore)","host":"email-smtp.ap-southeast-1.amazonaws.com","port":465,"secure":true},"SES-AP-SOUTHEAST-2":{"description":"AWS SES Asia Pacific (Sydney)","host":"email-smtp.ap-southeast-2.amazonaws.com","port":465,"secure":true},"SES-CA-CENTRAL-1":{"description":"AWS SES Canada (Central)","host":"email-smtp.ca-central-1.amazonaws.com","port":465,"secure":true},"SES-EU-CENTRAL-1":{"description":"AWS SES Europe (Frankfurt)","host":"email-smtp.eu-central-1.amazonaws.com","port":465,"secure":true},"SES-EU-NORTH-1":{"description":"AWS SES Europe (Stockholm)","host":"email-smtp.eu-north-1.amazonaws.com","port":465,"secure":true},"SES-EU-WEST-1":{"description":"AWS SES Europe (Ireland)","host":"email-smtp.eu-west-1.amazonaws.com","port":465,"secure":true},"SES-EU-WEST-2":{"description":"AWS SES Europe (London)","host":"email-smtp.eu-west-2.amazonaws.com","port":465,"secure":true},"SES-EU-WEST-3":{"description":"AWS SES Europe (Paris)","host":"email-smtp.eu-west-3.amazonaws.com","port":465,"secure":true},"SES-SA-EAST-1":{"description":"AWS SES South America (São Paulo)","host":"email-smtp.sa-east-1.amazonaws.com","port":465,"secure":true},"SES-US-EAST-1":{"description":"AWS SES US East (N. Virginia)","host":"email-smtp.us-east-1.amazonaws.com","port":465,"secure":true},"SES-US-EAST-2":{"description":"AWS SES US East (Ohio)","host":"email-smtp.us-east-2.amazonaws.com","port":465,"secure":true},"SES-US-GOV-EAST-1":{"description":"AWS SES GovCloud (US-East)","host":"email-smtp.us-gov-east-1.amazonaws.com","port":465,"secure":true},"SES-US-GOV-WEST-1":{"description":"AWS SES GovCloud (US-West)","host":"email-smtp.us-gov-west-1.amazonaws.com","port":465,"secure":true},"SES-US-WEST-1":{"description":"AWS SES US West (N. California)","host":"email-smtp.us-west-1.amazonaws.com","port":465,"secure":true},"SES-US-WEST-2":{"description":"AWS SES US West (Oregon)","host":"email-smtp.us-west-2.amazonaws.com","port":465,"secure":true},"Seznam":{"description":"Seznam Email (Czech email provider)","aliases":["Seznam Email"],"domains":["seznam.cz","email.cz","post.cz","spoluzaci.cz"],"host":"smtp.seznam.cz","port":465,"secure":true},"SMTP2GO":{"description":"SMTP2GO","host":"mail.smtp2go.com","port":2525},"Sparkpost":{"description":"SparkPost","aliases":["SparkPost","SparkPost Mail"],"domains":["sparkpost.com"],"host":"smtp.sparkpostmail.com","port":587,"secure":false},"Tipimail":{"description":"Tipimail (email delivery service)","host":"smtp.tipimail.com","port":587},"Tutanota":{"description":"Tutanota (Tuta Mail)","domains":["tutanota.com","tuta.com","tutanota.de","tuta.io"],"host":"smtp.tutanota.com","port":465,"secure":true},"Yahoo":{"description":"Yahoo Mail","domains":["yahoo.com"],"host":"smtp.mail.yahoo.com","port":465,"secure":true},"Yandex":{"description":"Yandex Mail","domains":["yandex.ru"],"host":"smtp.yandex.ru","port":465,"secure":true},"Zimbra":{"description":"Zimbra Mail Server","aliases":["Zimbra Collaboration"],"host":"smtp.zimbra.com","port":587,"requireTLS":true},"Zoho":{"description":"Zoho Mail","host":"smtp.zoho.com","port":465,"secure":true,"authMethod":"LOGIN"}}');
|
||
|
||
/***/ }),
|
||
|
||
/***/ "(action-browser)/./node_modules/.pnpm/nodemailer@7.0.13/node_modules/nodemailer/lib/xoauth2/index.js":
|
||
/*!*******************************************************************************************!*\
|
||
!*** ./node_modules/.pnpm/nodemailer@7.0.13/node_modules/nodemailer/lib/xoauth2/index.js ***!
|
||
\*******************************************************************************************/
|
||
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
|
||
|
||
eval("\nconst Stream = (__webpack_require__(/*! stream */ \"stream\").Stream);\nconst nmfetch = __webpack_require__(/*! ../fetch */ \"(action-browser)/./node_modules/.pnpm/nodemailer@7.0.13/node_modules/nodemailer/lib/fetch/index.js\");\nconst crypto = __webpack_require__(/*! crypto */ \"crypto\");\nconst shared = __webpack_require__(/*! ../shared */ \"(action-browser)/./node_modules/.pnpm/nodemailer@7.0.13/node_modules/nodemailer/lib/shared/index.js\");\n/**\n * XOAUTH2 access_token generator for Gmail.\n * Create client ID for web applications in Google API console to use it.\n * See Offline Access for receiving the needed refreshToken for an user\n * https://developers.google.com/accounts/docs/OAuth2WebServer#offline\n *\n * Usage for generating access tokens with a custom method using provisionCallback:\n * provisionCallback(user, renew, callback)\n * * user is the username to get the token for\n * * renew is a boolean that if true indicates that existing token failed and needs to be renewed\n * * callback is the callback to run with (error, accessToken [, expires])\n * * accessToken is a string\n * * expires is an optional expire time in milliseconds\n * If provisionCallback is used, then Nodemailer does not try to attempt generating the token by itself\n *\n * @constructor\n * @param {Object} options Client information for token generation\n * @param {String} options.user User e-mail address\n * @param {String} options.clientId Client ID value\n * @param {String} options.clientSecret Client secret value\n * @param {String} options.refreshToken Refresh token for an user\n * @param {String} options.accessUrl Endpoint for token generation, defaults to 'https://accounts.google.com/o/oauth2/token'\n * @param {String} options.accessToken An existing valid accessToken\n * @param {String} options.privateKey Private key for JSW\n * @param {Number} options.expires Optional Access Token expire time in ms\n * @param {Number} options.timeout Optional TTL for Access Token in seconds\n * @param {Function} options.provisionCallback Function to run when a new access token is required\n */ class XOAuth2 extends Stream {\n constructor(options, logger){\n super();\n this.options = options || {};\n if (options && options.serviceClient) {\n if (!options.privateKey || !options.user) {\n setImmediate(()=>this.emit('error', new Error('Options \"privateKey\" and \"user\" are required for service account!')));\n return;\n }\n let serviceRequestTimeout = Math.min(Math.max(Number(this.options.serviceRequestTimeout) || 0, 0), 3600);\n this.options.serviceRequestTimeout = serviceRequestTimeout || 5 * 60;\n }\n this.logger = shared.getLogger({\n logger\n }, {\n component: this.options.component || 'OAuth2'\n });\n this.provisionCallback = typeof this.options.provisionCallback === 'function' ? this.options.provisionCallback : false;\n this.options.accessUrl = this.options.accessUrl || 'https://accounts.google.com/o/oauth2/token';\n this.options.customHeaders = this.options.customHeaders || {};\n this.options.customParams = this.options.customParams || {};\n this.accessToken = this.options.accessToken || false;\n if (this.options.expires && Number(this.options.expires)) {\n this.expires = this.options.expires;\n } else {\n let timeout = Math.max(Number(this.options.timeout) || 0, 0);\n this.expires = timeout && Date.now() + timeout * 1000 || 0;\n }\n this.renewing = false; // Track if renewal is in progress\n this.renewalQueue = []; // Queue for pending requests during renewal\n }\n /**\n * Returns or generates (if previous has expired) a XOAuth2 token\n *\n * @param {Boolean} renew If false then use cached access token (if available)\n * @param {Function} callback Callback function with error object and token string\n */ getToken(renew, callback) {\n if (!renew && this.accessToken && (!this.expires || this.expires > Date.now())) {\n this.logger.debug({\n tnx: 'OAUTH2',\n user: this.options.user,\n action: 'reuse'\n }, 'Reusing existing access token for %s', this.options.user);\n return callback(null, this.accessToken);\n }\n // check if it is possible to renew, if not, return the current token or error\n if (!this.provisionCallback && !this.options.refreshToken && !this.options.serviceClient) {\n if (this.accessToken) {\n this.logger.debug({\n tnx: 'OAUTH2',\n user: this.options.user,\n action: 'reuse'\n }, 'Reusing existing access token (no refresh capability) for %s', this.options.user);\n return callback(null, this.accessToken);\n }\n this.logger.error({\n tnx: 'OAUTH2',\n user: this.options.user,\n action: 'renew'\n }, 'Cannot renew access token for %s: No refresh mechanism available', this.options.user);\n return callback(new Error(\"Can't create new access token for user\"));\n }\n // If renewal already in progress, queue this request instead of starting another\n if (this.renewing) {\n return this.renewalQueue.push({\n renew,\n callback\n });\n }\n this.renewing = true;\n // Handles token renewal completion - processes queued requests and cleans up\n const generateCallback = (err, accessToken)=>{\n this.renewalQueue.forEach((item)=>item.callback(err, accessToken));\n this.renewalQueue = [];\n this.renewing = false;\n if (err) {\n this.logger.error({\n err,\n tnx: 'OAUTH2',\n user: this.options.user,\n action: 'renew'\n }, 'Failed generating new Access Token for %s', this.options.user);\n } else {\n this.logger.info({\n tnx: 'OAUTH2',\n user: this.options.user,\n action: 'renew'\n }, 'Generated new Access Token for %s', this.options.user);\n }\n // Complete original request\n callback(err, accessToken);\n };\n if (this.provisionCallback) {\n this.provisionCallback(this.options.user, !!renew, (err, accessToken, expires)=>{\n if (!err && accessToken) {\n this.accessToken = accessToken;\n this.expires = expires || 0;\n }\n generateCallback(err, accessToken);\n });\n } else {\n this.generateToken(generateCallback);\n }\n }\n /**\n * Updates token values\n *\n * @param {String} accessToken New access token\n * @param {Number} timeout Access token lifetime in seconds\n *\n * Emits 'token': { user: User email-address, accessToken: the new accessToken, timeout: TTL in seconds}\n */ updateToken(accessToken, timeout) {\n this.accessToken = accessToken;\n timeout = Math.max(Number(timeout) || 0, 0);\n this.expires = timeout && Date.now() + timeout * 1000 || 0;\n this.emit('token', {\n user: this.options.user,\n accessToken: accessToken || '',\n expires: this.expires\n });\n }\n /**\n * Generates a new XOAuth2 token with the credentials provided at initialization\n *\n * @param {Function} callback Callback function with error object and token string\n */ generateToken(callback) {\n let urlOptions;\n let loggedUrlOptions;\n if (this.options.serviceClient) {\n // service account - https://developers.google.com/identity/protocols/OAuth2ServiceAccount\n let iat = Math.floor(Date.now() / 1000); // unix time\n let tokenData = {\n iss: this.options.serviceClient,\n scope: this.options.scope || 'https://mail.google.com/',\n sub: this.options.user,\n aud: this.options.accessUrl,\n iat,\n exp: iat + this.options.serviceRequestTimeout\n };\n let token;\n try {\n token = this.jwtSignRS256(tokenData);\n } catch (_err) {\n return callback(new Error(\"Can't generate token. Check your auth options\"));\n }\n urlOptions = {\n grant_type: 'urn:ietf:params:oauth:grant-type:jwt-bearer',\n assertion: token\n };\n loggedUrlOptions = {\n grant_type: 'urn:ietf:params:oauth:grant-type:jwt-bearer',\n assertion: tokenData\n };\n } else {\n if (!this.options.refreshToken) {\n return callback(new Error(\"Can't create new access token for user\"));\n }\n // web app - https://developers.google.com/identity/protocols/OAuth2WebServer\n urlOptions = {\n client_id: this.options.clientId || '',\n client_secret: this.options.clientSecret || '',\n refresh_token: this.options.refreshToken,\n grant_type: 'refresh_token'\n };\n loggedUrlOptions = {\n client_id: this.options.clientId || '',\n client_secret: (this.options.clientSecret || '').substr(0, 6) + '...',\n refresh_token: (this.options.refreshToken || '').substr(0, 6) + '...',\n grant_type: 'refresh_token'\n };\n }\n Object.keys(this.options.customParams).forEach((key)=>{\n urlOptions[key] = this.options.customParams[key];\n loggedUrlOptions[key] = this.options.customParams[key];\n });\n this.logger.debug({\n tnx: 'OAUTH2',\n user: this.options.user,\n action: 'generate'\n }, 'Requesting token using: %s', JSON.stringify(loggedUrlOptions));\n this.postRequest(this.options.accessUrl, urlOptions, this.options, (error, body)=>{\n let data;\n if (error) {\n return callback(error);\n }\n try {\n data = JSON.parse(body.toString());\n } catch (E) {\n return callback(E);\n }\n if (!data || typeof data !== 'object') {\n this.logger.debug({\n tnx: 'OAUTH2',\n user: this.options.user,\n action: 'post'\n }, 'Response: %s', (body || '').toString());\n return callback(new Error('Invalid authentication response'));\n }\n let logData = {};\n Object.keys(data).forEach((key)=>{\n if (key !== 'access_token') {\n logData[key] = data[key];\n } else {\n logData[key] = (data[key] || '').toString().substr(0, 6) + '...';\n }\n });\n this.logger.debug({\n tnx: 'OAUTH2',\n user: this.options.user,\n action: 'post'\n }, 'Response: %s', JSON.stringify(logData));\n if (data.error) {\n // Error Response : https://tools.ietf.org/html/rfc6749#section-5.2\n let errorMessage = data.error;\n if (data.error_description) {\n errorMessage += ': ' + data.error_description;\n }\n if (data.error_uri) {\n errorMessage += ' (' + data.error_uri + ')';\n }\n return callback(new Error(errorMessage));\n }\n if (data.access_token) {\n this.updateToken(data.access_token, data.expires_in);\n return callback(null, this.accessToken);\n }\n return callback(new Error('No access token'));\n });\n }\n /**\n * Converts an access_token and user id into a base64 encoded XOAuth2 token\n *\n * @param {String} [accessToken] Access token string\n * @return {String} Base64 encoded token for IMAP or SMTP login\n */ buildXOAuth2Token(accessToken) {\n let authData = [\n 'user=' + (this.options.user || ''),\n 'auth=Bearer ' + (accessToken || this.accessToken),\n '',\n ''\n ];\n return Buffer.from(authData.join('\\x01'), 'utf-8').toString('base64');\n }\n /**\n * Custom POST request handler.\n * This is only needed to keep paths short in Windows – usually this module\n * is a dependency of a dependency and if it tries to require something\n * like the request module the paths get way too long to handle for Windows.\n * As we do only a simple POST request we do not actually require complicated\n * logic support (no redirects, no nothing) anyway.\n *\n * @param {String} url Url to POST to\n * @param {String|Buffer} payload Payload to POST\n * @param {Function} callback Callback function with (err, buff)\n */ postRequest(url, payload, params, callback) {\n let returned = false;\n let chunks = [];\n let chunklen = 0;\n let req = nmfetch(url, {\n method: 'post',\n headers: params.customHeaders,\n body: payload,\n allowErrorResponse: true\n });\n req.on('readable', ()=>{\n let chunk;\n while((chunk = req.read()) !== null){\n chunks.push(chunk);\n chunklen += chunk.length;\n }\n });\n req.once('error', (err)=>{\n if (returned) {\n return;\n }\n returned = true;\n return callback(err);\n });\n req.once('end', ()=>{\n if (returned) {\n return;\n }\n returned = true;\n return callback(null, Buffer.concat(chunks, chunklen));\n });\n }\n /**\n * Encodes a buffer or a string into Base64url format\n *\n * @param {Buffer|String} data The data to convert\n * @return {String} The encoded string\n */ toBase64URL(data) {\n if (typeof data === 'string') {\n data = Buffer.from(data);\n }\n return data.toString('base64').replace(/[=]+/g, '') // remove '='s\n .replace(/\\+/g, '-') // '+' → '-'\n .replace(/\\//g, '_'); // '/' → '_'\n }\n /**\n * Creates a JSON Web Token signed with RS256 (SHA256 + RSA)\n *\n * @param {Object} payload The payload to include in the generated token\n * @return {String} The generated and signed token\n */ jwtSignRS256(payload) {\n payload = [\n '{\"alg\":\"RS256\",\"typ\":\"JWT\"}',\n JSON.stringify(payload)\n ].map((val)=>this.toBase64URL(val)).join('.');\n let signature = crypto.createSign('RSA-SHA256').update(payload).sign(this.options.privateKey);\n return payload + '.' + this.toBase64URL(signature);\n }\n}\nmodule.exports = XOAuth2;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFjdGlvbi1icm93c2VyKS8uL25vZGVfbW9kdWxlcy8ucG5wbS9ub2RlbWFpbGVyQDcuMC4xMy9ub2RlX21vZHVsZXMvbm9kZW1haWxlci9saWIveG9hdXRoMi9pbmRleC5qcyIsIm1hcHBpbmdzIjoiQUFBYTtBQUViLE1BQU1BLFNBQVNDLG9EQUF3QjtBQUN2QyxNQUFNQyxVQUFVRCxtQkFBT0EsQ0FBQyxvSEFBVTtBQUNsQyxNQUFNRSxTQUFTRixtQkFBT0EsQ0FBQyxzQkFBUTtBQUMvQixNQUFNRyxTQUFTSCxtQkFBT0EsQ0FBQyxzSEFBVztBQUVsQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0NBMkJDLEdBQ0QsTUFBTUksZ0JBQWdCTDtJQUNsQixZQUFZTSxPQUFPLEVBQUVDLE1BQU0sQ0FBRTtRQUN6QixLQUFLO1FBRUwsSUFBSSxDQUFDRCxPQUFPLEdBQUdBLFdBQVcsQ0FBQztRQUUzQixJQUFJQSxXQUFXQSxRQUFRRSxhQUFhLEVBQUU7WUFDbEMsSUFBSSxDQUFDRixRQUFRRyxVQUFVLElBQUksQ0FBQ0gsUUFBUUksSUFBSSxFQUFFO2dCQUN0Q0MsYUFBYSxJQUFNLElBQUksQ0FBQ0MsSUFBSSxDQUFDLFNBQVMsSUFBSUMsTUFBTTtnQkFDaEQ7WUFDSjtZQUVBLElBQUlDLHdCQUF3QkMsS0FBS0MsR0FBRyxDQUFDRCxLQUFLRSxHQUFHLENBQUNDLE9BQU8sSUFBSSxDQUFDWixPQUFPLENBQUNRLHFCQUFxQixLQUFLLEdBQUcsSUFBSTtZQUNuRyxJQUFJLENBQUNSLE9BQU8sQ0FBQ1EscUJBQXFCLEdBQUdBLHlCQUF5QixJQUFJO1FBQ3RFO1FBRUEsSUFBSSxDQUFDUCxNQUFNLEdBQUdILE9BQU9lLFNBQVMsQ0FDMUI7WUFDSVo7UUFDSixHQUNBO1lBQ0lhLFdBQVcsSUFBSSxDQUFDZCxPQUFPLENBQUNjLFNBQVMsSUFBSTtRQUN6QztRQUdKLElBQUksQ0FBQ0MsaUJBQWlCLEdBQUcsT0FBTyxJQUFJLENBQUNmLE9BQU8sQ0FBQ2UsaUJBQWlCLEtBQUssYUFBYSxJQUFJLENBQUNmLE9BQU8sQ0FBQ2UsaUJBQWlCLEdBQUc7UUFFakgsSUFBSSxDQUFDZixPQUFPLENBQUNnQixTQUFTLEdBQUcsSUFBSSxDQUFDaEIsT0FBTyxDQUFDZ0IsU0FBUyxJQUFJO1FBQ25ELElBQUksQ0FBQ2hCLE9BQU8sQ0FBQ2lCLGFBQWEsR0FBRyxJQUFJLENBQUNqQixPQUFPLENBQUNpQixhQUFhLElBQUksQ0FBQztRQUM1RCxJQUFJLENBQUNqQixPQUFPLENBQUNrQixZQUFZLEdBQUcsSUFBSSxDQUFDbEIsT0FBTyxDQUFDa0IsWUFBWSxJQUFJLENBQUM7UUFFMUQsSUFBSSxDQUFDQyxXQUFXLEdBQUcsSUFBSSxDQUFDbkIsT0FBTyxDQUFDbUIsV0FBVyxJQUFJO1FBRS9DLElBQUksSUFBSSxDQUFDbkIsT0FBTyxDQUFDb0IsT0FBTyxJQUFJUixPQUFPLElBQUksQ0FBQ1osT0FBTyxDQUFDb0IsT0FBTyxHQUFHO1lBQ3RELElBQUksQ0FBQ0EsT0FBTyxHQUFHLElBQUksQ0FBQ3BCLE9BQU8sQ0FBQ29CLE9BQU87UUFDdkMsT0FBTztZQUNILElBQUlDLFVBQVVaLEtBQUtFLEdBQUcsQ0FBQ0MsT0FBTyxJQUFJLENBQUNaLE9BQU8sQ0FBQ3FCLE9BQU8sS0FBSyxHQUFHO1lBQzFELElBQUksQ0FBQ0QsT0FBTyxHQUFHLFdBQVlFLEtBQUtDLEdBQUcsS0FBS0YsVUFBVSxRQUFTO1FBQy9EO1FBRUEsSUFBSSxDQUFDRyxRQUFRLEdBQUcsT0FBTyxrQ0FBa0M7UUFDekQsSUFBSSxDQUFDQyxZQUFZLEdBQUcsRUFBRSxFQUFFLDRDQUE0QztJQUN4RTtJQUVBOzs7OztLQUtDLEdBQ0RDLFNBQVNDLEtBQUssRUFBRUMsUUFBUSxFQUFFO1FBQ3RCLElBQUksQ0FBQ0QsU0FBUyxJQUFJLENBQUNSLFdBQVcsSUFBSyxFQUFDLElBQUksQ0FBQ0MsT0FBTyxJQUFJLElBQUksQ0FBQ0EsT0FBTyxHQUFHRSxLQUFLQyxHQUFHLEVBQUMsR0FBSTtZQUM1RSxJQUFJLENBQUN0QixNQUFNLENBQUM0QixLQUFLLENBQ2I7Z0JBQ0lDLEtBQUs7Z0JBQ0wxQixNQUFNLElBQUksQ0FBQ0osT0FBTyxDQUFDSSxJQUFJO2dCQUN2QjJCLFFBQVE7WUFDWixHQUNBLHdDQUNBLElBQUksQ0FBQy9CLE9BQU8sQ0FBQ0ksSUFBSTtZQUVyQixPQUFPd0IsU0FBUyxNQUFNLElBQUksQ0FBQ1QsV0FBVztRQUMxQztRQUVBLDhFQUE4RTtRQUM5RSxJQUFJLENBQUMsSUFBSSxDQUFDSixpQkFBaUIsSUFBSSxDQUFDLElBQUksQ0FBQ2YsT0FBTyxDQUFDZ0MsWUFBWSxJQUFJLENBQUMsSUFBSSxDQUFDaEMsT0FBTyxDQUFDRSxhQUFhLEVBQUU7WUFDdEYsSUFBSSxJQUFJLENBQUNpQixXQUFXLEVBQUU7Z0JBQ2xCLElBQUksQ0FBQ2xCLE1BQU0sQ0FBQzRCLEtBQUssQ0FDYjtvQkFDSUMsS0FBSztvQkFDTDFCLE1BQU0sSUFBSSxDQUFDSixPQUFPLENBQUNJLElBQUk7b0JBQ3ZCMkIsUUFBUTtnQkFDWixHQUNBLGdFQUNBLElBQUksQ0FBQy9CLE9BQU8sQ0FBQ0ksSUFBSTtnQkFFckIsT0FBT3dCLFNBQVMsTUFBTSxJQUFJLENBQUNULFdBQVc7WUFDMUM7WUFDQSxJQUFJLENBQUNsQixNQUFNLENBQUNnQyxLQUFLLENBQ2I7Z0JBQ0lILEtBQUs7Z0JBQ0wxQixNQUFNLElBQUksQ0FBQ0osT0FBTyxDQUFDSSxJQUFJO2dCQUN2QjJCLFFBQVE7WUFDWixHQUNBLG9FQUNBLElBQUksQ0FBQy9CLE9BQU8sQ0FBQ0ksSUFBSTtZQUVyQixPQUFPd0IsU0FBUyxJQUFJckIsTUFBTTtRQUM5QjtRQUVBLGlGQUFpRjtRQUNqRixJQUFJLElBQUksQ0FBQ2lCLFFBQVEsRUFBRTtZQUNmLE9BQU8sSUFBSSxDQUFDQyxZQUFZLENBQUNTLElBQUksQ0FBQztnQkFBRVA7Z0JBQU9DO1lBQVM7UUFDcEQ7UUFFQSxJQUFJLENBQUNKLFFBQVEsR0FBRztRQUVoQiw2RUFBNkU7UUFDN0UsTUFBTVcsbUJBQW1CLENBQUNDLEtBQUtqQjtZQUMzQixJQUFJLENBQUNNLFlBQVksQ0FBQ1ksT0FBTyxDQUFDQyxDQUFBQSxPQUFRQSxLQUFLVixRQUFRLENBQUNRLEtBQUtqQjtZQUNyRCxJQUFJLENBQUNNLFlBQVksR0FBRyxFQUFFO1lBQ3RCLElBQUksQ0FBQ0QsUUFBUSxHQUFHO1lBRWhCLElBQUlZLEtBQUs7Z0JBQ0wsSUFBSSxDQUFDbkMsTUFBTSxDQUFDZ0MsS0FBSyxDQUNiO29CQUNJRztvQkFDQU4sS0FBSztvQkFDTDFCLE1BQU0sSUFBSSxDQUFDSixPQUFPLENBQUNJLElBQUk7b0JBQ3ZCMkIsUUFBUTtnQkFDWixHQUNBLDZDQUNBLElBQUksQ0FBQy9CLE9BQU8sQ0FBQ0ksSUFBSTtZQUV6QixPQUFPO2dCQUNILElBQUksQ0FBQ0gsTUFBTSxDQUFDc0MsSUFBSSxDQUNaO29CQUNJVCxLQUFLO29CQUNMMUIsTUFBTSxJQUFJLENBQUNKLE9BQU8sQ0FBQ0ksSUFBSTtvQkFDdkIyQixRQUFRO2dCQUNaLEdBQ0EscUNBQ0EsSUFBSSxDQUFDL0IsT0FBTyxDQUFDSSxJQUFJO1lBRXpCO1lBQ0EsNEJBQTRCO1lBQzVCd0IsU0FBU1EsS0FBS2pCO1FBQ2xCO1FBRUEsSUFBSSxJQUFJLENBQUNKLGlCQUFpQixFQUFFO1lBQ3hCLElBQUksQ0FBQ0EsaUJBQWlCLENBQUMsSUFBSSxDQUFDZixPQUFPLENBQUNJLElBQUksRUFBRSxDQUFDLENBQUN1QixPQUFPLENBQUNTLEtBQUtqQixhQUFhQztnQkFDbEUsSUFBSSxDQUFDZ0IsT0FBT2pCLGFBQWE7b0JBQ3JCLElBQUksQ0FBQ0EsV0FBVyxHQUFHQTtvQkFDbkIsSUFBSSxDQUFDQyxPQUFPLEdBQUdBLFdBQVc7Z0JBQzlCO2dCQUNBZSxpQkFBaUJDLEtBQUtqQjtZQUMxQjtRQUNKLE9BQU87WUFDSCxJQUFJLENBQUNxQixhQUFhLENBQUNMO1FBQ3ZCO0lBQ0o7SUFFQTs7Ozs7OztLQU9DLEdBQ0RNLFlBQVl0QixXQUFXLEVBQUVFLE9BQU8sRUFBRTtRQUM5QixJQUFJLENBQUNGLFdBQVcsR0FBR0E7UUFDbkJFLFVBQVVaLEtBQUtFLEdBQUcsQ0FBQ0MsT0FBT1MsWUFBWSxHQUFHO1FBQ3pDLElBQUksQ0FBQ0QsT0FBTyxHQUFHLFdBQVlFLEtBQUtDLEdBQUcsS0FBS0YsVUFBVSxRQUFTO1FBRTNELElBQUksQ0FBQ2YsSUFBSSxDQUFDLFNBQVM7WUFDZkYsTUFBTSxJQUFJLENBQUNKLE9BQU8sQ0FBQ0ksSUFBSTtZQUN2QmUsYUFBYUEsZUFBZTtZQUM1QkMsU0FBUyxJQUFJLENBQUNBLE9BQU87UUFDekI7SUFDSjtJQUVBOzs7O0tBSUMsR0FDRG9CLGNBQWNaLFFBQVEsRUFBRTtRQUNwQixJQUFJYztRQUNKLElBQUlDO1FBQ0osSUFBSSxJQUFJLENBQUMzQyxPQUFPLENBQUNFLGFBQWEsRUFBRTtZQUM1QiwwRkFBMEY7WUFDMUYsSUFBSTBDLE1BQU1uQyxLQUFLb0MsS0FBSyxDQUFDdkIsS0FBS0MsR0FBRyxLQUFLLE9BQU8sWUFBWTtZQUNyRCxJQUFJdUIsWUFBWTtnQkFDWkMsS0FBSyxJQUFJLENBQUMvQyxPQUFPLENBQUNFLGFBQWE7Z0JBQy9COEMsT0FBTyxJQUFJLENBQUNoRCxPQUFPLENBQUNnRCxLQUFLLElBQUk7Z0JBQzdCQyxLQUFLLElBQUksQ0FBQ2pELE9BQU8sQ0FBQ0ksSUFBSTtnQkFDdEI4QyxLQUFLLElBQUksQ0FBQ2xELE9BQU8sQ0FBQ2dCLFNBQVM7Z0JBQzNCNEI7Z0JBQ0FPLEtBQUtQLE1BQU0sSUFBSSxDQUFDNUMsT0FBTyxDQUFDUSxxQkFBcUI7WUFDakQ7WUFDQSxJQUFJNEM7WUFDSixJQUFJO2dCQUNBQSxRQUFRLElBQUksQ0FBQ0MsWUFBWSxDQUFDUDtZQUM5QixFQUFFLE9BQU9RLE1BQU07Z0JBQ1gsT0FBTzFCLFNBQVMsSUFBSXJCLE1BQU07WUFDOUI7WUFFQW1DLGFBQWE7Z0JBQ1RhLFlBQVk7Z0JBQ1pDLFdBQVdKO1lBQ2Y7WUFFQVQsbUJBQW1CO2dCQUNmWSxZQUFZO2dCQUNaQyxXQUFXVjtZQUNmO1FBQ0osT0FBTztZQUNILElBQUksQ0FBQyxJQUFJLENBQUM5QyxPQUFPLENBQUNnQyxZQUFZLEVBQUU7Z0JBQzVCLE9BQU9KLFNBQVMsSUFBSXJCLE1BQU07WUFDOUI7WUFFQSw2RUFBNkU7WUFDN0VtQyxhQUFhO2dCQUNUZSxXQUFXLElBQUksQ0FBQ3pELE9BQU8sQ0FBQzBELFFBQVEsSUFBSTtnQkFDcENDLGVBQWUsSUFBSSxDQUFDM0QsT0FBTyxDQUFDNEQsWUFBWSxJQUFJO2dCQUM1Q0MsZUFBZSxJQUFJLENBQUM3RCxPQUFPLENBQUNnQyxZQUFZO2dCQUN4Q3VCLFlBQVk7WUFDaEI7WUFFQVosbUJBQW1CO2dCQUNmYyxXQUFXLElBQUksQ0FBQ3pELE9BQU8sQ0FBQzBELFFBQVEsSUFBSTtnQkFDcENDLGVBQWUsQ0FBQyxJQUFJLENBQUMzRCxPQUFPLENBQUM0RCxZQUFZLElBQUksRUFBQyxFQUFHRSxNQUFNLENBQUMsR0FBRyxLQUFLO2dCQUNoRUQsZUFBZSxDQUFDLElBQUksQ0FBQzdELE9BQU8sQ0FBQ2dDLFlBQVksSUFBSSxFQUFDLEVBQUc4QixNQUFNLENBQUMsR0FBRyxLQUFLO2dCQUNoRVAsWUFBWTtZQUNoQjtRQUNKO1FBRUFRLE9BQU9DLElBQUksQ0FBQyxJQUFJLENBQUNoRSxPQUFPLENBQUNrQixZQUFZLEVBQUVtQixPQUFPLENBQUM0QixDQUFBQTtZQUMzQ3ZCLFVBQVUsQ0FBQ3VCLElBQUksR0FBRyxJQUFJLENBQUNqRSxPQUFPLENBQUNrQixZQUFZLENBQUMrQyxJQUFJO1lBQ2hEdEIsZ0JBQWdCLENBQUNzQixJQUFJLEdBQUcsSUFBSSxDQUFDakUsT0FBTyxDQUFDa0IsWUFBWSxDQUFDK0MsSUFBSTtRQUMxRDtRQUVBLElBQUksQ0FBQ2hFLE1BQU0sQ0FBQzRCLEtBQUssQ0FDYjtZQUNJQyxLQUFLO1lBQ0wxQixNQUFNLElBQUksQ0FBQ0osT0FBTyxDQUFDSSxJQUFJO1lBQ3ZCMkIsUUFBUTtRQUNaLEdBQ0EsOEJBQ0FtQyxLQUFLQyxTQUFTLENBQUN4QjtRQUduQixJQUFJLENBQUN5QixXQUFXLENBQUMsSUFBSSxDQUFDcEUsT0FBTyxDQUFDZ0IsU0FBUyxFQUFFMEIsWUFBWSxJQUFJLENBQUMxQyxPQUFPLEVBQUUsQ0FBQ2lDLE9BQU9vQztZQUN2RSxJQUFJQztZQUVKLElBQUlyQyxPQUFPO2dCQUNQLE9BQU9MLFNBQVNLO1lBQ3BCO1lBRUEsSUFBSTtnQkFDQXFDLE9BQU9KLEtBQUtLLEtBQUssQ0FBQ0YsS0FBS0csUUFBUTtZQUNuQyxFQUFFLE9BQU9DLEdBQUc7Z0JBQ1IsT0FBTzdDLFNBQVM2QztZQUNwQjtZQUVBLElBQUksQ0FBQ0gsUUFBUSxPQUFPQSxTQUFTLFVBQVU7Z0JBQ25DLElBQUksQ0FBQ3JFLE1BQU0sQ0FBQzRCLEtBQUssQ0FDYjtvQkFDSUMsS0FBSztvQkFDTDFCLE1BQU0sSUFBSSxDQUFDSixPQUFPLENBQUNJLElBQUk7b0JBQ3ZCMkIsUUFBUTtnQkFDWixHQUNBLGdCQUNBLENBQUNzQyxRQUFRLEVBQUMsRUFBR0csUUFBUTtnQkFFekIsT0FBTzVDLFNBQVMsSUFBSXJCLE1BQU07WUFDOUI7WUFFQSxJQUFJbUUsVUFBVSxDQUFDO1lBQ2ZYLE9BQU9DLElBQUksQ0FBQ00sTUFBTWpDLE9BQU8sQ0FBQzRCLENBQUFBO2dCQUN0QixJQUFJQSxRQUFRLGdCQUFnQjtvQkFDeEJTLE9BQU8sQ0FBQ1QsSUFBSSxHQUFHSyxJQUFJLENBQUNMLElBQUk7Z0JBQzVCLE9BQU87b0JBQ0hTLE9BQU8sQ0FBQ1QsSUFBSSxHQUFHLENBQUNLLElBQUksQ0FBQ0wsSUFBSSxJQUFJLEVBQUMsRUFBR08sUUFBUSxHQUFHVixNQUFNLENBQUMsR0FBRyxLQUFLO2dCQUMvRDtZQUNKO1lBRUEsSUFBSSxDQUFDN0QsTUFBTSxDQUFDNEIsS0FBSyxDQUNiO2dCQUNJQyxLQUFLO2dCQUNMMUIsTUFBTSxJQUFJLENBQUNKLE9BQU8sQ0FBQ0ksSUFBSTtnQkFDdkIyQixRQUFRO1lBQ1osR0FDQSxnQkFDQW1DLEtBQUtDLFNBQVMsQ0FBQ087WUFHbkIsSUFBSUosS0FBS3JDLEtBQUssRUFBRTtnQkFDWixtRUFBbUU7Z0JBQ25FLElBQUkwQyxlQUFlTCxLQUFLckMsS0FBSztnQkFDN0IsSUFBSXFDLEtBQUtNLGlCQUFpQixFQUFFO29CQUN4QkQsZ0JBQWdCLE9BQU9MLEtBQUtNLGlCQUFpQjtnQkFDakQ7Z0JBQ0EsSUFBSU4sS0FBS08sU0FBUyxFQUFFO29CQUNoQkYsZ0JBQWdCLE9BQU9MLEtBQUtPLFNBQVMsR0FBRztnQkFDNUM7Z0JBQ0EsT0FBT2pELFNBQVMsSUFBSXJCLE1BQU1vRTtZQUM5QjtZQUVBLElBQUlMLEtBQUtRLFlBQVksRUFBRTtnQkFDbkIsSUFBSSxDQUFDckMsV0FBVyxDQUFDNkIsS0FBS1EsWUFBWSxFQUFFUixLQUFLUyxVQUFVO2dCQUNuRCxPQUFPbkQsU0FBUyxNQUFNLElBQUksQ0FBQ1QsV0FBVztZQUMxQztZQUVBLE9BQU9TLFNBQVMsSUFBSXJCLE1BQU07UUFDOUI7SUFDSjtJQUVBOzs7OztLQUtDLEdBQ0R5RSxrQkFBa0I3RCxXQUFXLEVBQUU7UUFDM0IsSUFBSThELFdBQVc7WUFBQyxVQUFXLEtBQUksQ0FBQ2pGLE9BQU8sQ0FBQ0ksSUFBSSxJQUFJLEVBQUM7WUFBSSxpQkFBa0JlLENBQUFBLGVBQWUsSUFBSSxDQUFDQSxXQUFXO1lBQUc7WUFBSTtTQUFHO1FBQ2hILE9BQU8rRCxPQUFPQyxJQUFJLENBQUNGLFNBQVNHLElBQUksQ0FBQyxTQUFTLFNBQVNaLFFBQVEsQ0FBQztJQUNoRTtJQUVBOzs7Ozs7Ozs7OztLQVdDLEdBQ0RKLFlBQVlpQixHQUFHLEVBQUVDLE9BQU8sRUFBRUMsTUFBTSxFQUFFM0QsUUFBUSxFQUFFO1FBQ3hDLElBQUk0RCxXQUFXO1FBRWYsSUFBSUMsU0FBUyxFQUFFO1FBQ2YsSUFBSUMsV0FBVztRQUVmLElBQUlDLE1BQU0vRixRQUFReUYsS0FBSztZQUNuQk8sUUFBUTtZQUNSQyxTQUFTTixPQUFPdEUsYUFBYTtZQUM3Qm9ELE1BQU1pQjtZQUNOUSxvQkFBb0I7UUFDeEI7UUFFQUgsSUFBSUksRUFBRSxDQUFDLFlBQVk7WUFDZixJQUFJQztZQUNKLE1BQU8sQ0FBQ0EsUUFBUUwsSUFBSU0sSUFBSSxFQUFDLE1BQU8sS0FBTTtnQkFDbENSLE9BQU92RCxJQUFJLENBQUM4RDtnQkFDWk4sWUFBWU0sTUFBTUUsTUFBTTtZQUM1QjtRQUNKO1FBRUFQLElBQUlRLElBQUksQ0FBQyxTQUFTL0QsQ0FBQUE7WUFDZCxJQUFJb0QsVUFBVTtnQkFDVjtZQUNKO1lBQ0FBLFdBQVc7WUFDWCxPQUFPNUQsU0FBU1E7UUFDcEI7UUFFQXVELElBQUlRLElBQUksQ0FBQyxPQUFPO1lBQ1osSUFBSVgsVUFBVTtnQkFDVjtZQUNKO1lBQ0FBLFdBQVc7WUFDWCxPQUFPNUQsU0FBUyxNQUFNc0QsT0FBT2tCLE1BQU0sQ0FBQ1gsUUFBUUM7UUFDaEQ7SUFDSjtJQUVBOzs7OztLQUtDLEdBQ0RXLFlBQVkvQixJQUFJLEVBQUU7UUFDZCxJQUFJLE9BQU9BLFNBQVMsVUFBVTtZQUMxQkEsT0FBT1ksT0FBT0MsSUFBSSxDQUFDYjtRQUN2QjtRQUVBLE9BQU9BLEtBQ0ZFLFFBQVEsQ0FBQyxVQUNUOEIsT0FBTyxDQUFDLFNBQVMsSUFBSSxjQUFjO1NBQ25DQSxPQUFPLENBQUMsT0FBTyxLQUFLLFlBQVk7U0FDaENBLE9BQU8sQ0FBQyxPQUFPLE1BQU0sWUFBWTtJQUMxQztJQUVBOzs7OztLQUtDLEdBQ0RqRCxhQUFhaUMsT0FBTyxFQUFFO1FBQ2xCQSxVQUFVO1lBQUM7WUFBK0JwQixLQUFLQyxTQUFTLENBQUNtQjtTQUFTLENBQUNpQixHQUFHLENBQUNDLENBQUFBLE1BQU8sSUFBSSxDQUFDSCxXQUFXLENBQUNHLE1BQU1wQixJQUFJLENBQUM7UUFDMUcsSUFBSXFCLFlBQVk1RyxPQUFPNkcsVUFBVSxDQUFDLGNBQWNDLE1BQU0sQ0FBQ3JCLFNBQVNzQixJQUFJLENBQUMsSUFBSSxDQUFDNUcsT0FBTyxDQUFDRyxVQUFVO1FBQzVGLE9BQU9tRixVQUFVLE1BQU0sSUFBSSxDQUFDZSxXQUFXLENBQUNJO0lBQzVDO0FBQ0o7QUFFQUksT0FBT0MsT0FBTyxHQUFHL0ciLCJzb3VyY2VzIjpbIi9Vc2Vycy9tYXJjbWludGVsL1Byb2plY3RzL2UtdGliLmNvbS9ub2RlX21vZHVsZXMvLnBucG0vbm9kZW1haWxlckA3LjAuMTMvbm9kZV9tb2R1bGVzL25vZGVtYWlsZXIvbGliL3hvYXV0aDIvaW5kZXguanMiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCBTdHJlYW0gPSByZXF1aXJlKCdzdHJlYW0nKS5TdHJlYW07XG5jb25zdCBubWZldGNoID0gcmVxdWlyZSgnLi4vZmV0Y2gnKTtcbmNvbnN0IGNyeXB0byA9IHJlcXVpcmUoJ2NyeXB0bycpO1xuY29uc3Qgc2hhcmVkID0gcmVxdWlyZSgnLi4vc2hhcmVkJyk7XG5cbi8qKlxuICogWE9BVVRIMiBhY2Nlc3NfdG9rZW4gZ2VuZXJhdG9yIGZvciBHbWFpbC5cbiAqIENyZWF0ZSBjbGllbnQgSUQgZm9yIHdlYiBhcHBsaWNhdGlvbnMgaW4gR29vZ2xlIEFQSSBjb25zb2xlIHRvIHVzZSBpdC5cbiAqIFNlZSBPZmZsaW5lIEFjY2VzcyBmb3IgcmVjZWl2aW5nIHRoZSBuZWVkZWQgcmVmcmVzaFRva2VuIGZvciBhbiB1c2VyXG4gKiBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9hY2NvdW50cy9kb2NzL09BdXRoMldlYlNlcnZlciNvZmZsaW5lXG4gKlxuICogVXNhZ2UgZm9yIGdlbmVyYXRpbmcgYWNjZXNzIHRva2VucyB3aXRoIGEgY3VzdG9tIG1ldGhvZCB1c2luZyBwcm92aXNpb25DYWxsYmFjazpcbiAqIHByb3Zpc2lvbkNhbGxiYWNrKHVzZXIsIHJlbmV3LCBjYWxsYmFjaylcbiAqICAgKiB1c2VyIGlzIHRoZSB1c2VybmFtZSB0byBnZXQgdGhlIHRva2VuIGZvclxuICogICAqIHJlbmV3IGlzIGEgYm9vbGVhbiB0aGF0IGlmIHRydWUgaW5kaWNhdGVzIHRoYXQgZXhpc3RpbmcgdG9rZW4gZmFpbGVkIGFuZCBuZWVkcyB0byBiZSByZW5ld2VkXG4gKiAgICogY2FsbGJhY2sgaXMgdGhlIGNhbGxiYWNrIHRvIHJ1biB3aXRoIChlcnJvciwgYWNjZXNzVG9rZW4gWywgZXhwaXJlc10pXG4gKiAgICAgKiBhY2Nlc3NUb2tlbiBpcyBhIHN0cmluZ1xuICogICAgICogZXhwaXJlcyBpcyBhbiBvcHRpb25hbCBleHBpcmUgdGltZSBpbiBtaWxsaXNlY29uZHNcbiAqIElmIHByb3Zpc2lvbkNhbGxiYWNrIGlzIHVzZWQsIHRoZW4gTm9kZW1haWxlciBkb2VzIG5vdCB0cnkgdG8gYXR0ZW1wdCBnZW5lcmF0aW5nIHRoZSB0b2tlbiBieSBpdHNlbGZcbiAqXG4gKiBAY29uc3RydWN0b3JcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIENsaWVudCBpbmZvcm1hdGlvbiBmb3IgdG9rZW4gZ2VuZXJhdGlvblxuICogQHBhcmFtIHtTdHJpbmd9IG9wdGlvbnMudXNlciBVc2VyIGUtbWFpbCBhZGRyZXNzXG4gKiBAcGFyYW0ge1N0cmluZ30gb3B0aW9ucy5jbGllbnRJZCBDbGllbnQgSUQgdmFsdWVcbiAqIEBwYXJhbSB7U3RyaW5nfSBvcHRpb25zLmNsaWVudFNlY3JldCBDbGllbnQgc2VjcmV0IHZhbHVlXG4gKiBAcGFyYW0ge1N0cmluZ30gb3B0aW9ucy5yZWZyZXNoVG9rZW4gUmVmcmVzaCB0b2tlbiBmb3IgYW4gdXNlclxuICogQHBhcmFtIHtTdHJpbmd9IG9wdGlvbnMuYWNjZXNzVXJsIEVuZHBvaW50IGZvciB0b2tlbiBnZW5lcmF0aW9uLCBkZWZhdWx0cyB0byAnaHR0cHM6Ly9hY2NvdW50cy5nb29nbGUuY29tL28vb2F1dGgyL3Rva2VuJ1xuICogQHBhcmFtIHtTdHJpbmd9IG9wdGlvbnMuYWNjZXNzVG9rZW4gQW4gZXhpc3RpbmcgdmFsaWQgYWNjZXNzVG9rZW5cbiAqIEBwYXJhbSB7U3RyaW5nfSBvcHRpb25zLnByaXZhdGVLZXkgUHJpdmF0ZSBrZXkgZm9yIEpTV1xuICogQHBhcmFtIHtOdW1iZXJ9IG9wdGlvbnMuZXhwaXJlcyBPcHRpb25hbCBBY2Nlc3MgVG9rZW4gZXhwaXJlIHRpbWUgaW4gbXNcbiAqIEBwYXJhbSB7TnVtYmVyfSBvcHRpb25zLnRpbWVvdXQgT3B0aW9uYWwgVFRMIGZvciBBY2Nlc3MgVG9rZW4gaW4gc2Vjb25kc1xuICogQHBhcmFtIHtGdW5jdGlvbn0gb3B0aW9ucy5wcm92aXNpb25DYWxsYmFjayBGdW5jdGlvbiB0byBydW4gd2hlbiBhIG5ldyBhY2Nlc3MgdG9rZW4gaXMgcmVxdWlyZWRcbiAqL1xuY2xhc3MgWE9BdXRoMiBleHRlbmRzIFN0cmVhbSB7XG4gICAgY29uc3RydWN0b3Iob3B0aW9ucywgbG9nZ2VyKSB7XG4gICAgICAgIHN1cGVyKCk7XG5cbiAgICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcblxuICAgICAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLnNlcnZpY2VDbGllbnQpIHtcbiAgICAgICAgICAgIGlmICghb3B0aW9ucy5wcml2YXRlS2V5IHx8ICFvcHRpb25zLnVzZXIpIHtcbiAgICAgICAgICAgICAgICBzZXRJbW1lZGlhdGUoKCkgPT4gdGhpcy5lbWl0KCdlcnJvcicsIG5ldyBFcnJvcignT3B0aW9ucyBcInByaXZhdGVLZXlcIiBhbmQgXCJ1c2VyXCIgYXJlIHJlcXVpcmVkIGZvciBzZXJ2aWNlIGFjY291bnQhJykpKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxldCBzZXJ2aWNlUmVxdWVzdFRpbWVvdXQgPSBNYXRoLm1pbihNYXRoLm1heChOdW1iZXIodGhpcy5vcHRpb25zLnNlcnZpY2VSZXF1ZXN0VGltZW91dCkgfHwgMCwgMCksIDM2MDApO1xuICAgICAgICAgICAgdGhpcy5vcHRpb25zLnNlcnZpY2VSZXF1ZXN0VGltZW91dCA9IHNlcnZpY2VSZXF1ZXN0VGltZW91dCB8fCA1ICogNjA7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmxvZ2dlciA9IHNoYXJlZC5nZXRMb2dnZXIoXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgbG9nZ2VyXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGNvbXBvbmVudDogdGhpcy5vcHRpb25zLmNvbXBvbmVudCB8fCAnT0F1dGgyJ1xuICAgICAgICAgICAgfVxuICAgICAgICApO1xuXG4gICAgICAgIHRoaXMucHJvdmlzaW9uQ2FsbGJhY2sgPSB0eXBlb2YgdGhpcy5vcHRpb25zLnByb3Zpc2lvbkNhbGxiYWNrID09PSAnZnVuY3Rpb24nID8gdGhpcy5vcHRpb25zLnByb3Zpc2lvbkNhbGxiYWNrIDogZmFsc2U7XG5cbiAgICAgICAgdGhpcy5vcHRpb25zLmFjY2Vzc1VybCA9IHRoaXMub3B0aW9ucy5hY2Nlc3NVcmwgfHwgJ2h0dHBzOi8vYWNjb3VudHMuZ29vZ2xlLmNvbS9vL29hdXRoMi90b2tlbic7XG4gICAgICAgIHRoaXMub3B0aW9ucy5jdXN0b21IZWFkZXJzID0gdGhpcy5vcHRpb25zLmN1c3RvbUhlYWRlcnMgfHwge307XG4gICAgICAgIHRoaXMub3B0aW9ucy5jdXN0b21QYXJhbXMgPSB0aGlzLm9wdGlvbnMuY3VzdG9tUGFyYW1zIHx8IHt9O1xuXG4gICAgICAgIHRoaXMuYWNjZXNzVG9rZW4gPSB0aGlzLm9wdGlvbnMuYWNjZXNzVG9rZW4gfHwgZmFsc2U7XG5cbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5leHBpcmVzICYmIE51bWJlcih0aGlzLm9wdGlvbnMuZXhwaXJlcykpIHtcbiAgICAgICAgICAgIHRoaXMuZXhwaXJlcyA9IHRoaXMub3B0aW9ucy5leHBpcmVzO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbGV0IHRpbWVvdXQgPSBNYXRoLm1heChOdW1iZXIodGhpcy5vcHRpb25zLnRpbWVvdXQpIHx8IDAsIDApO1xuICAgICAgICAgICAgdGhpcy5leHBpcmVzID0gKHRpbWVvdXQgJiYgRGF0ZS5ub3coKSArIHRpbWVvdXQgKiAxMDAwKSB8fCAwO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5yZW5ld2luZyA9IGZhbHNlOyAvLyBUcmFjayBpZiByZW5ld2FsIGlzIGluIHByb2dyZXNzXG4gICAgICAgIHRoaXMucmVuZXdhbFF1ZXVlID0gW107IC8vIFF1ZXVlIGZvciBwZW5kaW5nIHJlcXVlc3RzIGR1cmluZyByZW5ld2FsXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBvciBnZW5lcmF0ZXMgKGlmIHByZXZpb3VzIGhhcyBleHBpcmVkKSBhIFhPQXV0aDIgdG9rZW5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gcmVuZXcgSWYgZmFsc2UgdGhlbiB1c2UgY2FjaGVkIGFjY2VzcyB0b2tlbiAoaWYgYXZhaWxhYmxlKVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIENhbGxiYWNrIGZ1bmN0aW9uIHdpdGggZXJyb3Igb2JqZWN0IGFuZCB0b2tlbiBzdHJpbmdcbiAgICAgKi9cbiAgICBnZXRUb2tlbihyZW5ldywgY2FsbGJhY2spIHtcbiAgICAgICAgaWYgKCFyZW5ldyAmJiB0aGlzLmFjY2Vzc1Rva2VuICYmICghdGhpcy5leHBpcmVzIHx8IHRoaXMuZXhwaXJlcyA+IERhdGUubm93KCkpKSB7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHRueDogJ09BVVRIMicsXG4gICAgICAgICAgICAgICAgICAgIHVzZXI6IHRoaXMub3B0aW9ucy51c2VyLFxuICAgICAgICAgICAgICAgICAgICBhY3Rpb246ICdyZXVzZSdcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICdSZXVzaW5nIGV4aXN0aW5nIGFjY2VzcyB0b2tlbiBmb3IgJXMnLFxuICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy51c2VyXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKG51bGwsIHRoaXMuYWNjZXNzVG9rZW4pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gY2hlY2sgaWYgaXQgaXMgcG9zc2libGUgdG8gcmVuZXcsIGlmIG5vdCwgcmV0dXJuIHRoZSBjdXJyZW50IHRva2VuIG9yIGVycm9yXG4gICAgICAgIGlmICghdGhpcy5wcm92aXNpb25DYWxsYmFjayAmJiAhdGhpcy5vcHRpb25zLnJlZnJlc2hUb2tlbiAmJiAhdGhpcy5vcHRpb25zLnNlcnZpY2VDbGllbnQpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmFjY2Vzc1Rva2VuKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRueDogJ09BVVRIMicsXG4gICAgICAgICAgICAgICAgICAgICAgICB1c2VyOiB0aGlzLm9wdGlvbnMudXNlcixcbiAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbjogJ3JldXNlJ1xuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAnUmV1c2luZyBleGlzdGluZyBhY2Nlc3MgdG9rZW4gKG5vIHJlZnJlc2ggY2FwYWJpbGl0eSkgZm9yICVzJyxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnVzZXJcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIHJldHVybiBjYWxsYmFjayhudWxsLCB0aGlzLmFjY2Vzc1Rva2VuKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgdG54OiAnT0FVVEgyJyxcbiAgICAgICAgICAgICAgICAgICAgdXNlcjogdGhpcy5vcHRpb25zLnVzZXIsXG4gICAgICAgICAgICAgICAgICAgIGFjdGlvbjogJ3JlbmV3J1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgJ0Nhbm5vdCByZW5ldyBhY2Nlc3MgdG9rZW4gZm9yICVzOiBObyByZWZyZXNoIG1lY2hhbmlzbSBhdmFpbGFibGUnLFxuICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy51c2VyXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKG5ldyBFcnJvcihcIkNhbid0IGNyZWF0ZSBuZXcgYWNjZXNzIHRva2VuIGZvciB1c2VyXCIpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIElmIHJlbmV3YWwgYWxyZWFkeSBpbiBwcm9ncmVzcywgcXVldWUgdGhpcyByZXF1ZXN0IGluc3RlYWQgb2Ygc3RhcnRpbmcgYW5vdGhlclxuICAgICAgICBpZiAodGhpcy5yZW5ld2luZykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucmVuZXdhbFF1ZXVlLnB1c2goeyByZW5ldywgY2FsbGJhY2sgfSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnJlbmV3aW5nID0gdHJ1ZTtcblxuICAgICAgICAvLyBIYW5kbGVzIHRva2VuIHJlbmV3YWwgY29tcGxldGlvbiAtIHByb2Nlc3NlcyBxdWV1ZWQgcmVxdWVzdHMgYW5kIGNsZWFucyB1cFxuICAgICAgICBjb25zdCBnZW5lcmF0ZUNhbGxiYWNrID0gKGVyciwgYWNjZXNzVG9rZW4pID0+IHtcbiAgICAgICAgICAgIHRoaXMucmVuZXdhbFF1ZXVlLmZvckVhY2goaXRlbSA9PiBpdGVtLmNhbGxiYWNrKGVyciwgYWNjZXNzVG9rZW4pKTtcbiAgICAgICAgICAgIHRoaXMucmVuZXdhbFF1ZXVlID0gW107XG4gICAgICAgICAgICB0aGlzLnJlbmV3aW5nID0gZmFsc2U7XG5cbiAgICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcihcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgZXJyLFxuICAgICAgICAgICAgICAgICAgICAgICAgdG54OiAnT0FVVEgyJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHVzZXI6IHRoaXMub3B0aW9ucy51c2VyLFxuICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uOiAncmVuZXcnXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICdGYWlsZWQgZ2VuZXJhdGluZyBuZXcgQWNjZXNzIFRva2VuIGZvciAlcycsXG4gICAgICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy51c2VyXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuaW5mbyhcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgdG54OiAnT0FVVEgyJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHVzZXI6IHRoaXMub3B0aW9ucy51c2VyLFxuICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uOiAncmVuZXcnXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICdHZW5lcmF0ZWQgbmV3IEFjY2VzcyBUb2tlbiBmb3IgJXMnLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMudXNlclxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBDb21wbGV0ZSBvcmlnaW5hbCByZXF1ZXN0XG4gICAgICAgICAgICBjYWxsYmFjayhlcnIsIGFjY2Vzc1Rva2VuKTtcbiAgICAgICAgfTtcblxuICAgICAgICBpZiAodGhpcy5wcm92aXNpb25DYWxsYmFjaykge1xuICAgICAgICAgICAgdGhpcy5wcm92aXNpb25DYWxsYmFjayh0aGlzLm9wdGlvbnMudXNlciwgISFyZW5ldywgKGVyciwgYWNjZXNzVG9rZW4sIGV4cGlyZXMpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIWVyciAmJiBhY2Nlc3NUb2tlbikge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmFjY2Vzc1Rva2VuID0gYWNjZXNzVG9rZW47XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZXhwaXJlcyA9IGV4cGlyZXMgfHwgMDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZ2VuZXJhdGVDYWxsYmFjayhlcnIsIGFjY2Vzc1Rva2VuKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5nZW5lcmF0ZVRva2VuKGdlbmVyYXRlQ2FsbGJhY2spO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXBkYXRlcyB0b2tlbiB2YWx1ZXNcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBhY2Nlc3NUb2tlbiBOZXcgYWNjZXNzIHRva2VuXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IHRpbWVvdXQgQWNjZXNzIHRva2VuIGxpZmV0aW1lIGluIHNlY29uZHNcbiAgICAgKlxuICAgICAqIEVtaXRzICd0b2tlbic6IHsgdXNlcjogVXNlciBlbWFpbC1hZGRyZXNzLCBhY2Nlc3NUb2tlbjogdGhlIG5ldyBhY2Nlc3NUb2tlbiwgdGltZW91dDogVFRMIGluIHNlY29uZHN9XG4gICAgICovXG4gICAgdXBkYXRlVG9rZW4oYWNjZXNzVG9rZW4sIHRpbWVvdXQpIHtcbiAgICAgICAgdGhpcy5hY2Nlc3NUb2tlbiA9IGFjY2Vzc1Rva2VuO1xuICAgICAgICB0aW1lb3V0ID0gTWF0aC5tYXgoTnVtYmVyKHRpbWVvdXQpIHx8IDAsIDApO1xuICAgICAgICB0aGlzLmV4cGlyZXMgPSAodGltZW91dCAmJiBEYXRlLm5vdygpICsgdGltZW91dCAqIDEwMDApIHx8IDA7XG5cbiAgICAgICAgdGhpcy5lbWl0KCd0b2tlbicsIHtcbiAgICAgICAgICAgIHVzZXI6IHRoaXMub3B0aW9ucy51c2VyLFxuICAgICAgICAgICAgYWNjZXNzVG9rZW46IGFjY2Vzc1Rva2VuIHx8ICcnLFxuICAgICAgICAgICAgZXhwaXJlczogdGhpcy5leHBpcmVzXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdlbmVyYXRlcyBhIG5ldyBYT0F1dGgyIHRva2VuIHdpdGggdGhlIGNyZWRlbnRpYWxzIHByb3ZpZGVkIGF0IGluaXRpYWxpemF0aW9uXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBDYWxsYmFjayBmdW5jdGlvbiB3aXRoIGVycm9yIG9iamVjdCBhbmQgdG9rZW4gc3RyaW5nXG4gICAgICovXG4gICAgZ2VuZXJhdGVUb2tlbihjYWxsYmFjaykge1xuICAgICAgICBsZXQgdXJsT3B0aW9ucztcbiAgICAgICAgbGV0IGxvZ2dlZFVybE9wdGlvbnM7XG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMuc2VydmljZUNsaWVudCkge1xuICAgICAgICAgICAgLy8gc2VydmljZSBhY2NvdW50IC0gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vaWRlbnRpdHkvcHJvdG9jb2xzL09BdXRoMlNlcnZpY2VBY2NvdW50XG4gICAgICAgICAgICBsZXQgaWF0ID0gTWF0aC5mbG9vcihEYXRlLm5vdygpIC8gMTAwMCk7IC8vIHVuaXggdGltZVxuICAgICAgICAgICAgbGV0IHRva2VuRGF0YSA9IHtcbiAgICAgICAgICAgICAgICBpc3M6IHRoaXMub3B0aW9ucy5zZXJ2aWNlQ2xpZW50LFxuICAgICAgICAgICAgICAgIHNjb3BlOiB0aGlzLm9wdGlvbnMuc2NvcGUgfHwgJ2h0dHBzOi8vbWFpbC5nb29nbGUuY29tLycsXG4gICAgICAgICAgICAgICAgc3ViOiB0aGlzLm9wdGlvbnMudXNlcixcbiAgICAgICAgICAgICAgICBhdWQ6IHRoaXMub3B0aW9ucy5hY2Nlc3NVcmwsXG4gICAgICAgICAgICAgICAgaWF0LFxuICAgICAgICAgICAgICAgIGV4cDogaWF0ICsgdGhpcy5vcHRpb25zLnNlcnZpY2VSZXF1ZXN0VGltZW91dFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGxldCB0b2tlbjtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgdG9rZW4gPSB0aGlzLmp3dFNpZ25SUzI1Nih0b2tlbkRhdGEpO1xuICAgICAgICAgICAgfSBjYXRjaCAoX2Vycikge1xuICAgICAgICAgICAgICAgIHJldHVybiBjYWxsYmFjayhuZXcgRXJyb3IoXCJDYW4ndCBnZW5lcmF0ZSB0b2tlbi4gQ2hlY2sgeW91ciBhdXRoIG9wdGlvbnNcIikpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB1cmxPcHRpb25zID0ge1xuICAgICAgICAgICAgICAgIGdyYW50X3R5cGU6ICd1cm46aWV0ZjpwYXJhbXM6b2F1dGg6Z3JhbnQtdHlwZTpqd3QtYmVhcmVyJyxcbiAgICAgICAgICAgICAgICBhc3NlcnRpb246IHRva2VuXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBsb2dnZWRVcmxPcHRpb25zID0ge1xuICAgICAgICAgICAgICAgIGdyYW50X3R5cGU6ICd1cm46aWV0ZjpwYXJhbXM6b2F1dGg6Z3JhbnQtdHlwZTpqd3QtYmVhcmVyJyxcbiAgICAgICAgICAgICAgICBhc3NlcnRpb246IHRva2VuRGF0YVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLnJlZnJlc2hUb2tlbikge1xuICAgICAgICAgICAgICAgIHJldHVybiBjYWxsYmFjayhuZXcgRXJyb3IoXCJDYW4ndCBjcmVhdGUgbmV3IGFjY2VzcyB0b2tlbiBmb3IgdXNlclwiKSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIHdlYiBhcHAgLSBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9pZGVudGl0eS9wcm90b2NvbHMvT0F1dGgyV2ViU2VydmVyXG4gICAgICAgICAgICB1cmxPcHRpb25zID0ge1xuICAgICAgICAgICAgICAgIGNsaWVudF9pZDogdGhpcy5vcHRpb25zLmNsaWVudElkIHx8ICcnLFxuICAgICAgICAgICAgICAgIGNsaWVudF9zZWNyZXQ6IHRoaXMub3B0aW9ucy5jbGllbnRTZWNyZXQgfHwgJycsXG4gICAgICAgICAgICAgICAgcmVmcmVzaF90b2tlbjogdGhpcy5vcHRpb25zLnJlZnJlc2hUb2tlbixcbiAgICAgICAgICAgICAgICBncmFudF90eXBlOiAncmVmcmVzaF90b2tlbidcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIGxvZ2dlZFVybE9wdGlvbnMgPSB7XG4gICAgICAgICAgICAgICAgY2xpZW50X2lkOiB0aGlzLm9wdGlvbnMuY2xpZW50SWQgfHwgJycsXG4gICAgICAgICAgICAgICAgY2xpZW50X3NlY3JldDogKHRoaXMub3B0aW9ucy5jbGllbnRTZWNyZXQgfHwgJycpLnN1YnN0cigwLCA2KSArICcuLi4nLFxuICAgICAgICAgICAgICAgIHJlZnJlc2hfdG9rZW46ICh0aGlzLm9wdGlvbnMucmVmcmVzaFRva2VuIHx8ICcnKS5zdWJzdHIoMCwgNikgKyAnLi4uJyxcbiAgICAgICAgICAgICAgICBncmFudF90eXBlOiAncmVmcmVzaF90b2tlbidcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICBPYmplY3Qua2V5cyh0aGlzLm9wdGlvbnMuY3VzdG9tUGFyYW1zKS5mb3JFYWNoKGtleSA9PiB7XG4gICAgICAgICAgICB1cmxPcHRpb25zW2tleV0gPSB0aGlzLm9wdGlvbnMuY3VzdG9tUGFyYW1zW2tleV07XG4gICAgICAgICAgICBsb2dnZWRVcmxPcHRpb25zW2tleV0gPSB0aGlzLm9wdGlvbnMuY3VzdG9tUGFyYW1zW2tleV07XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHRueDogJ09BVVRIMicsXG4gICAgICAgICAgICAgICAgdXNlcjogdGhpcy5vcHRpb25zLnVzZXIsXG4gICAgICAgICAgICAgICAgYWN0aW9uOiAnZ2VuZXJhdGUnXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJ1JlcXVlc3RpbmcgdG9rZW4gdXNpbmc6ICVzJyxcbiAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KGxvZ2dlZFVybE9wdGlvbnMpXG4gICAgICAgICk7XG5cbiAgICAgICAgdGhpcy5wb3N0UmVxdWVzdCh0aGlzLm9wdGlvbnMuYWNjZXNzVXJsLCB1cmxPcHRpb25zLCB0aGlzLm9wdGlvbnMsIChlcnJvciwgYm9keSkgPT4ge1xuICAgICAgICAgICAgbGV0IGRhdGE7XG5cbiAgICAgICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgICAgICAgIHJldHVybiBjYWxsYmFjayhlcnJvcik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgZGF0YSA9IEpTT04ucGFyc2UoYm9keS50b1N0cmluZygpKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKEUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY2FsbGJhY2soRSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICghZGF0YSB8fCB0eXBlb2YgZGF0YSAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgdG54OiAnT0FVVEgyJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHVzZXI6IHRoaXMub3B0aW9ucy51c2VyLFxuICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uOiAncG9zdCdcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgJ1Jlc3BvbnNlOiAlcycsXG4gICAgICAgICAgICAgICAgICAgIChib2R5IHx8ICcnKS50b1N0cmluZygpXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gY2FsbGJhY2sobmV3IEVycm9yKCdJbnZhbGlkIGF1dGhlbnRpY2F0aW9uIHJlc3BvbnNlJykpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsZXQgbG9nRGF0YSA9IHt9O1xuICAgICAgICAgICAgT2JqZWN0LmtleXMoZGF0YSkuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChrZXkgIT09ICdhY2Nlc3NfdG9rZW4nKSB7XG4gICAgICAgICAgICAgICAgICAgIGxvZ0RhdGFba2V5XSA9IGRhdGFba2V5XTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBsb2dEYXRhW2tleV0gPSAoZGF0YVtrZXldIHx8ICcnKS50b1N0cmluZygpLnN1YnN0cigwLCA2KSArICcuLi4nO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHRueDogJ09BVVRIMicsXG4gICAgICAgICAgICAgICAgICAgIHVzZXI6IHRoaXMub3B0aW9ucy51c2VyLFxuICAgICAgICAgICAgICAgICAgICBhY3Rpb246ICdwb3N0J1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgJ1Jlc3BvbnNlOiAlcycsXG4gICAgICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkobG9nRGF0YSlcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIGlmIChkYXRhLmVycm9yKSB7XG4gICAgICAgICAgICAgICAgLy8gRXJyb3IgUmVzcG9uc2UgOiBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNjc0OSNzZWN0aW9uLTUuMlxuICAgICAgICAgICAgICAgIGxldCBlcnJvck1lc3NhZ2UgPSBkYXRhLmVycm9yO1xuICAgICAgICAgICAgICAgIGlmIChkYXRhLmVycm9yX2Rlc2NyaXB0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgIGVycm9yTWVzc2FnZSArPSAnOiAnICsgZGF0YS5lcnJvcl9kZXNjcmlwdGlvbjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGRhdGEuZXJyb3JfdXJpKSB7XG4gICAgICAgICAgICAgICAgICAgIGVycm9yTWVzc2FnZSArPSAnICgnICsgZGF0YS5lcnJvcl91cmkgKyAnKSc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBjYWxsYmFjayhuZXcgRXJyb3IoZXJyb3JNZXNzYWdlKSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChkYXRhLmFjY2Vzc190b2tlbikge1xuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlVG9rZW4oZGF0YS5hY2Nlc3NfdG9rZW4sIGRhdGEuZXhwaXJlc19pbik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKG51bGwsIHRoaXMuYWNjZXNzVG9rZW4pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gY2FsbGJhY2sobmV3IEVycm9yKCdObyBhY2Nlc3MgdG9rZW4nKSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIGFuIGFjY2Vzc190b2tlbiBhbmQgdXNlciBpZCBpbnRvIGEgYmFzZTY0IGVuY29kZWQgWE9BdXRoMiB0b2tlblxuICAgICAqXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IFthY2Nlc3NUb2tlbl0gQWNjZXNzIHRva2VuIHN0cmluZ1xuICAgICAqIEByZXR1cm4ge1N0cmluZ30gQmFzZTY0IGVuY29kZWQgdG9rZW4gZm9yIElNQVAgb3IgU01UUCBsb2dpblxuICAgICAqL1xuICAgIGJ1aWxkWE9BdXRoMlRva2VuKGFjY2Vzc1Rva2VuKSB7XG4gICAgICAgIGxldCBhdXRoRGF0YSA9IFsndXNlcj0nICsgKHRoaXMub3B0aW9ucy51c2VyIHx8ICcnKSwgJ2F1dGg9QmVhcmVyICcgKyAoYWNjZXNzVG9rZW4gfHwgdGhpcy5hY2Nlc3NUb2tlbiksICcnLCAnJ107XG4gICAgICAgIHJldHVybiBCdWZmZXIuZnJvbShhdXRoRGF0YS5qb2luKCdcXHgwMScpLCAndXRmLTgnKS50b1N0cmluZygnYmFzZTY0Jyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3VzdG9tIFBPU1QgcmVxdWVzdCBoYW5kbGVyLlxuICAgICAqIFRoaXMgaXMgb25seSBuZWVkZWQgdG8ga2VlcCBwYXRocyBzaG9ydCBpbiBXaW5kb3dzIOKAkyB1c3VhbGx5IHRoaXMgbW9kdWxlXG4gICAgICogaXMgYSBkZXBlbmRlbmN5IG9mIGEgZGVwZW5kZW5jeSBhbmQgaWYgaXQgdHJpZXMgdG8gcmVxdWlyZSBzb21ldGhpbmdcbiAgICAgKiBsaWtlIHRoZSByZXF1ZXN0IG1vZHVsZSB0aGUgcGF0aHMgZ2V0IHdheSB0b28gbG9uZyB0byBoYW5kbGUgZm9yIFdpbmRvd3MuXG4gICAgICogQXMgd2UgZG8gb25seSBhIHNpbXBsZSBQT1NUIHJlcXVlc3Qgd2UgZG8gbm90IGFjdHVhbGx5IHJlcXVpcmUgY29tcGxpY2F0ZWRcbiAgICAgKiBsb2dpYyBzdXBwb3J0IChubyByZWRpcmVjdHMsIG5vIG5vdGhpbmcpIGFueXdheS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSB1cmwgVXJsIHRvIFBPU1QgdG9cbiAgICAgKiBAcGFyYW0ge1N0cmluZ3xCdWZmZXJ9IHBheWxvYWQgUGF5bG9hZCB0byBQT1NUXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgQ2FsbGJhY2sgZnVuY3Rpb24gd2l0aCAoZXJyLCBidWZmKVxuICAgICAqL1xuICAgIHBvc3RSZXF1ZXN0KHVybCwgcGF5bG9hZCwgcGFyYW1zLCBjYWxsYmFjaykge1xuICAgICAgICBsZXQgcmV0dXJuZWQgPSBmYWxzZTtcblxuICAgICAgICBsZXQgY2h1bmtzID0gW107XG4gICAgICAgIGxldCBjaHVua2xlbiA9IDA7XG5cbiAgICAgICAgbGV0IHJlcSA9IG5tZmV0Y2godXJsLCB7XG4gICAgICAgICAgICBtZXRob2Q6ICdwb3N0JyxcbiAgICAgICAgICAgIGhlYWRlcnM6IHBhcmFtcy5jdXN0b21IZWFkZXJzLFxuICAgICAgICAgICAgYm9keTogcGF5bG9hZCxcbiAgICAgICAgICAgIGFsbG93RXJyb3JSZXNwb25zZTogdHJ1ZVxuICAgICAgICB9KTtcblxuICAgICAgICByZXEub24oJ3JlYWRhYmxlJywgKCkgPT4ge1xuICAgICAgICAgICAgbGV0IGNodW5rO1xuICAgICAgICAgICAgd2hpbGUgKChjaHVuayA9IHJlcS5yZWFkKCkpICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgY2h1bmtzLnB1c2goY2h1bmspO1xuICAgICAgICAgICAgICAgIGNodW5rbGVuICs9IGNodW5rLmxlbmd0aDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmVxLm9uY2UoJ2Vycm9yJywgZXJyID0+IHtcbiAgICAgICAgICAgIGlmIChyZXR1cm5lZCkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybmVkID0gdHJ1ZTtcbiAgICAgICAgICAgIHJldHVybiBjYWxsYmFjayhlcnIpO1xuICAgICAgICB9KTtcblxuICAgICAgICByZXEub25jZSgnZW5kJywgKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHJldHVybmVkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuZWQgPSB0cnVlO1xuICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKG51bGwsIEJ1ZmZlci5jb25jYXQoY2h1bmtzLCBjaHVua2xlbikpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFbmNvZGVzIGEgYnVmZmVyIG9yIGEgc3RyaW5nIGludG8gQmFzZTY0dXJsIGZvcm1hdFxuICAgICAqXG4gICAgICogQHBhcmFtIHtCdWZmZXJ8U3RyaW5nfSBkYXRhIFRoZSBkYXRhIHRvIGNvbnZlcnRcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9IFRoZSBlbmNvZGVkIHN0cmluZ1xuICAgICAqL1xuICAgIHRvQmFzZTY0VVJMKGRhdGEpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBkYXRhID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgZGF0YSA9IEJ1ZmZlci5mcm9tKGRhdGEpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGRhdGFcbiAgICAgICAgICAgIC50b1N0cmluZygnYmFzZTY0JylcbiAgICAgICAgICAgIC5yZXBsYWNlKC9bPV0rL2csICcnKSAvLyByZW1vdmUgJz0nc1xuICAgICAgICAgICAgLnJlcGxhY2UoL1xcKy9nLCAnLScpIC8vICcrJyDihpIgJy0nXG4gICAgICAgICAgICAucmVwbGFjZSgvXFwvL2csICdfJyk7IC8vICcvJyDihpIgJ18nXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIEpTT04gV2ViIFRva2VuIHNpZ25lZCB3aXRoIFJTMjU2IChTSEEyNTYgKyBSU0EpXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gcGF5bG9hZCBUaGUgcGF5bG9hZCB0byBpbmNsdWRlIGluIHRoZSBnZW5lcmF0ZWQgdG9rZW5cbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9IFRoZSBnZW5lcmF0ZWQgYW5kIHNpZ25lZCB0b2tlblxuICAgICAqL1xuICAgIGp3dFNpZ25SUzI1NihwYXlsb2FkKSB7XG4gICAgICAgIHBheWxvYWQgPSBbJ3tcImFsZ1wiOlwiUlMyNTZcIixcInR5cFwiOlwiSldUXCJ9JywgSlNPTi5zdHJpbmdpZnkocGF5bG9hZCldLm1hcCh2YWwgPT4gdGhpcy50b0Jhc2U2NFVSTCh2YWwpKS5qb2luKCcuJyk7XG4gICAgICAgIGxldCBzaWduYXR1cmUgPSBjcnlwdG8uY3JlYXRlU2lnbignUlNBLVNIQTI1NicpLnVwZGF0ZShwYXlsb2FkKS5zaWduKHRoaXMub3B0aW9ucy5wcml2YXRlS2V5KTtcbiAgICAgICAgcmV0dXJuIHBheWxvYWQgKyAnLicgKyB0aGlzLnRvQmFzZTY0VVJMKHNpZ25hdHVyZSk7XG4gICAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IFhPQXV0aDI7XG4iXSwibmFtZXMiOlsiU3RyZWFtIiwicmVxdWlyZSIsIm5tZmV0Y2giLCJjcnlwdG8iLCJzaGFyZWQiLCJYT0F1dGgyIiwib3B0aW9ucyIsImxvZ2dlciIsInNlcnZpY2VDbGllbnQiLCJwcml2YXRlS2V5IiwidXNlciIsInNldEltbWVkaWF0ZSIsImVtaXQiLCJFcnJvciIsInNlcnZpY2VSZXF1ZXN0VGltZW91dCIsIk1hdGgiLCJtaW4iLCJtYXgiLCJOdW1iZXIiLCJnZXRMb2dnZXIiLCJjb21wb25lbnQiLCJwcm92aXNpb25DYWxsYmFjayIsImFjY2Vzc1VybCIsImN1c3RvbUhlYWRlcnMiLCJjdXN0b21QYXJhbXMiLCJhY2Nlc3NUb2tlbiIsImV4cGlyZXMiLCJ0aW1lb3V0IiwiRGF0ZSIsIm5vdyIsInJlbmV3aW5nIiwicmVuZXdhbFF1ZXVlIiwiZ2V0VG9rZW4iLCJyZW5ldyIsImNhbGxiYWNrIiwiZGVidWciLCJ0bngiLCJhY3Rpb24iLCJyZWZyZXNoVG9rZW4iLCJlcnJvciIsInB1c2giLCJnZW5lcmF0ZUNhbGxiYWNrIiwiZXJyIiwiZm9yRWFjaCIsIml0ZW0iLCJpbmZvIiwiZ2VuZXJhdGVUb2tlbiIsInVwZGF0ZVRva2VuIiwidXJsT3B0aW9ucyIsImxvZ2dlZFVybE9wdGlvbnMiLCJpYXQiLCJmbG9vciIsInRva2VuRGF0YSIsImlzcyIsInNjb3BlIiwic3ViIiwiYXVkIiwiZXhwIiwidG9rZW4iLCJqd3RTaWduUlMyNTYiLCJfZXJyIiwiZ3JhbnRfdHlwZSIsImFzc2VydGlvbiIsImNsaWVudF9pZCIsImNsaWVudElkIiwiY2xpZW50X3NlY3JldCIsImNsaWVudFNlY3JldCIsInJlZnJlc2hfdG9rZW4iLCJzdWJzdHIiLCJPYmplY3QiLCJrZXlzIiwia2V5IiwiSlNPTiIsInN0cmluZ2lmeSIsInBvc3RSZXF1ZXN0IiwiYm9keSIsImRhdGEiLCJwYXJzZSIsInRvU3RyaW5nIiwiRSIsImxvZ0RhdGEiLCJlcnJvck1lc3NhZ2UiLCJlcnJvcl9kZXNjcmlwdGlvbiIsImVycm9yX3VyaSIsImFjY2Vzc190b2tlbiIsImV4cGlyZXNfaW4iLCJidWlsZFhPQXV0aDJUb2tlbiIsImF1dGhEYXRhIiwiQnVmZmVyIiwiZnJvbSIsImpvaW4iLCJ1cmwiLCJwYXlsb2FkIiwicGFyYW1zIiwicmV0dXJuZWQiLCJjaHVua3MiLCJjaHVua2xlbiIsInJlcSIsIm1ldGhvZCIsImhlYWRlcnMiLCJhbGxvd0Vycm9yUmVzcG9uc2UiLCJvbiIsImNodW5rIiwicmVhZCIsImxlbmd0aCIsIm9uY2UiLCJjb25jYXQiLCJ0b0Jhc2U2NFVSTCIsInJlcGxhY2UiLCJtYXAiLCJ2YWwiLCJzaWduYXR1cmUiLCJjcmVhdGVTaWduIiwidXBkYXRlIiwic2lnbiIsIm1vZHVsZSIsImV4cG9ydHMiXSwiaWdub3JlTGlzdCI6WzBdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(action-browser)/./node_modules/.pnpm/nodemailer@7.0.13/node_modules/nodemailer/lib/xoauth2/index.js\n");
|
||
|
||
/***/ }),
|
||
|
||
/***/ "(action-browser)/./node_modules/.pnpm/nodemailer@7.0.13/node_modules/nodemailer/package.json":
|
||
/*!***********************************************************************************!*\
|
||
!*** ./node_modules/.pnpm/nodemailer@7.0.13/node_modules/nodemailer/package.json ***!
|
||
\***********************************************************************************/
|
||
/***/ ((module) => {
|
||
|
||
module.exports = /*#__PURE__*/JSON.parse('{"name":"nodemailer","version":"7.0.13","description":"Easy as cake e-mail sending from your Node.js applications","main":"lib/nodemailer.js","scripts":{"test":"node --test --test-concurrency=1 test/**/*.test.js test/**/*-test.js","test:coverage":"c8 node --test --test-concurrency=1 test/**/*.test.js test/**/*-test.js","format":"prettier --write \\"**/*.{js,json,md}\\"","format:check":"prettier --check \\"**/*.{js,json,md}\\"","lint":"eslint .","lint:fix":"eslint . --fix","update":"rm -rf node_modules/ package-lock.json && ncu -u && npm install"},"repository":{"type":"git","url":"https://github.com/nodemailer/nodemailer.git"},"keywords":["Nodemailer"],"author":"Andris Reinman","license":"MIT-0","bugs":{"url":"https://github.com/nodemailer/nodemailer/issues"},"homepage":"https://nodemailer.com/","devDependencies":{"@aws-sdk/client-sesv2":"3.975.0","bunyan":"1.8.15","c8":"10.1.3","eslint":"9.39.2","eslint-config-prettier":"10.1.8","globals":"17.1.0","libbase64":"1.3.0","libmime":"5.3.7","libqp":"2.1.1","nodemailer-ntlm-auth":"1.0.4","prettier":"3.8.1","proxy":"1.0.2","proxy-test-server":"1.0.0","smtp-server":"3.18.0"},"engines":{"node":">=6.0.0"}}');
|
||
|
||
/***/ })
|
||
|
||
};
|
||
; |