115 lines
292 KiB
JavaScript
115 lines
292 KiB
JavaScript
"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/mailparser";
|
|
exports.ids = ["vendor-chunks/mailparser"];
|
|
exports.modules = {
|
|
|
|
/***/ "(action-browser)/./node_modules/mailparser/index.js":
|
|
/*!******************************************!*\
|
|
!*** ./node_modules/mailparser/index.js ***!
|
|
\******************************************/
|
|
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
|
|
|
|
eval("\n\nconst MailParser = __webpack_require__(/*! ./lib/mail-parser */ \"(action-browser)/./node_modules/mailparser/lib/mail-parser.js\");\nconst simpleParser = __webpack_require__(/*! ./lib/simple-parser */ \"(action-browser)/./node_modules/mailparser/lib/simple-parser.js\");\n\nmodule.exports = {\n MailParser,\n simpleParser\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFjdGlvbi1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9tYWlscGFyc2VyL2luZGV4LmpzIiwibWFwcGluZ3MiOiJBQUFhOztBQUViLG1CQUFtQixtQkFBTyxDQUFDLHdGQUFtQjtBQUM5QyxxQkFBcUIsbUJBQU8sQ0FBQyw0RkFBcUI7O0FBRWxEO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyIvaG9tZS9hbG1hL25leHRnZW4vTmVhaC1tYWlsL25vZGVfbW9kdWxlcy9tYWlscGFyc2VyL2luZGV4LmpzIl0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcblxuY29uc3QgTWFpbFBhcnNlciA9IHJlcXVpcmUoJy4vbGliL21haWwtcGFyc2VyJyk7XG5jb25zdCBzaW1wbGVQYXJzZXIgPSByZXF1aXJlKCcuL2xpYi9zaW1wbGUtcGFyc2VyJyk7XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICAgIE1haWxQYXJzZXIsXG4gICAgc2ltcGxlUGFyc2VyXG59O1xuIl0sIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6WzBdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(action-browser)/./node_modules/mailparser/index.js\n");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "(action-browser)/./node_modules/mailparser/lib/mail-parser.js":
|
|
/*!****************************************************!*\
|
|
!*** ./node_modules/mailparser/lib/mail-parser.js ***!
|
|
\****************************************************/
|
|
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
|
|
|
|
eval("\n\nconst mailsplit = __webpack_require__(/*! mailsplit */ \"(action-browser)/./node_modules/mailsplit/index.js\");\nconst libmime = __webpack_require__(/*! libmime */ \"(action-browser)/./node_modules/libmime/lib/libmime.js\");\nconst addressparser = __webpack_require__(/*! nodemailer/lib/addressparser */ \"(action-browser)/./node_modules/mailparser/node_modules/nodemailer/lib/addressparser/index.js\");\nconst Transform = (__webpack_require__(/*! stream */ \"stream\").Transform);\nconst Splitter = mailsplit.Splitter;\nconst punycode = __webpack_require__(/*! punycode.js */ \"(action-browser)/./node_modules/punycode.js/punycode.es6.js\");\nconst FlowedDecoder = __webpack_require__(/*! mailsplit/lib/flowed-decoder */ \"(action-browser)/./node_modules/mailsplit/lib/flowed-decoder.js\");\nconst StreamHash = __webpack_require__(/*! ./stream-hash */ \"(action-browser)/./node_modules/mailparser/lib/stream-hash.js\");\nconst iconv = __webpack_require__(/*! iconv-lite */ \"(action-browser)/./node_modules/iconv-lite/lib/index.js\");\nconst { htmlToText } = __webpack_require__(/*! html-to-text */ \"(action-browser)/./node_modules/html-to-text/lib/html-to-text.cjs\");\nconst he = __webpack_require__(/*! he */ \"(action-browser)/./node_modules/he/he.js\");\nconst linkify = __webpack_require__(/*! linkify-it */ \"(action-browser)/./node_modules/linkify-it/build/index.cjs.js\")();\nconst tlds = __webpack_require__(/*! tlds */ \"(action-browser)/./node_modules/tlds/index.json\");\nconst encodingJapanese = __webpack_require__(/*! encoding-japanese */ \"(action-browser)/./node_modules/encoding-japanese/src/index.js\");\n\nlinkify\n .tlds(tlds) // Reload with full tlds list\n .tlds('onion', true) // Add unofficial `.onion` domain\n .add('git:', 'http:') // Add `git:` ptotocol as \"alias\"\n .add('ftp:', null) // Disable `ftp:` ptotocol\n .set({ fuzzyIP: true, fuzzyLink: true, fuzzyEmail: true });\n\n// twitter linkifier from\n// https://github.com/markdown-it/linkify-it#example-2-add-twitter-mentions-handler\nlinkify.add('@', {\n validate(text, pos, self) {\n let tail = text.slice(pos);\n\n if (!self.re.twitter) {\n self.re.twitter = new RegExp('^([a-zA-Z0-9_]){1,15}(?!_)(?=$|' + self.re.src_ZPCc + ')');\n }\n if (self.re.twitter.test(tail)) {\n // Linkifier allows punctuation chars before prefix,\n // but we additionally disable `@` (\"@@mention\" is invalid)\n if (pos >= 2 && tail[pos - 2] === '@') {\n return false;\n }\n return tail.match(self.re.twitter)[0].length;\n }\n return 0;\n },\n normalize(match) {\n match.url = 'https://twitter.com/' + match.url.replace(/^@/, '');\n }\n});\n\nclass IconvDecoder extends Transform {\n constructor(Iconv, charset) {\n super();\n\n // Iconv throws error on ks_c_5601-1987 when it is mapped to EUC-KR\n // https://github.com/bnoordhuis/node-iconv/issues/169\n if (charset.toLowerCase() === 'ks_c_5601-1987') {\n charset = 'CP949';\n }\n this.stream = new Iconv(charset, 'UTF-8//TRANSLIT//IGNORE');\n\n this.inputEnded = false;\n this.endCb = false;\n\n this.stream.on('error', err => this.emit('error', err));\n this.stream.on('data', chunk => this.push(chunk));\n this.stream.on('end', () => {\n this.inputEnded = true;\n if (typeof this.endCb === 'function') {\n this.endCb();\n }\n });\n }\n\n _transform(chunk, encoding, done) {\n this.stream.write(chunk);\n done();\n }\n\n _flush(done) {\n this.endCb = done;\n this.stream.end();\n }\n}\n\nclass JPDecoder extends Transform {\n constructor(charset) {\n super();\n\n this.charset = charset;\n this.chunks = [];\n this.chunklen = 0;\n }\n\n _transform(chunk, encoding, done) {\n if (typeof chunk === 'string') {\n chunk = Buffer.from(chunk, encoding);\n }\n\n this.chunks.push(chunk);\n this.chunklen += chunk.length;\n done();\n }\n\n _flush(done) {\n let input = Buffer.concat(this.chunks, this.chunklen);\n try {\n let output = encodingJapanese.convert(input, {\n to: 'UNICODE', // to_encoding\n from: this.charset, // from_encoding\n type: 'string'\n });\n if (typeof output === 'string') {\n output = Buffer.from(output);\n }\n this.push(output);\n } catch (err) {\n // keep as is on errors\n this.push(input);\n }\n\n done();\n }\n}\n\nclass MailParser extends Transform {\n constructor(config) {\n super({\n readableObjectMode: true,\n writableObjectMode: false\n });\n\n this.options = config || {};\n this.splitter = new Splitter(config);\n this.finished = false;\n this.waitingEnd = false;\n\n this.headers = false;\n this.headerLines = false;\n\n this.endReceived = false;\n this.reading = false;\n this.hasFailed = false;\n\n this.tree = false;\n this.curnode = false;\n this.waitUntilAttachmentEnd = false;\n this.attachmentCallback = false;\n\n this.hasHtml = false;\n this.hasText = false;\n\n this.text = false;\n this.html = false;\n this.textAsHtml = false;\n\n this.attachmentList = [];\n\n this.boundaries = [];\n\n this.textTypes = ['text/plain', 'text/html'].concat(!this.options.keepDeliveryStatus ? 'message/delivery-status' : []);\n\n this.decoder = this.getDecoder();\n\n this.splitter.on('readable', () => {\n if (this.reading) {\n return false;\n }\n this.readData();\n });\n\n this.splitter.on('end', () => {\n this.endReceived = true;\n if (!this.reading) {\n this.endStream();\n }\n });\n\n this.splitter.on('error', err => {\n this.hasFailed = true;\n if (typeof this.waitingEnd === 'function') {\n return this.waitingEnd(err);\n }\n this.emit('error', err);\n });\n\n this.libmime = new libmime.Libmime({ Iconv: this.options.Iconv });\n }\n\n getDecoder() {\n if (this.options.Iconv) {\n const Iconv = this.options.Iconv;\n // create wrapper\n return {\n decodeStream(charset) {\n return new IconvDecoder(Iconv, charset);\n }\n };\n } else {\n return {\n decodeStream(charset) {\n charset = (charset || 'ascii').toString().trim().toLowerCase();\n if (/^jis|^iso-?2022-?jp|^EUCJP/i.test(charset)) {\n // special case not supported by iconv-lite\n return new JPDecoder(charset);\n }\n\n return iconv.decodeStream(charset);\n }\n };\n }\n }\n\n readData() {\n if (this.hasFailed) {\n return false;\n }\n this.reading = true;\n let data = this.splitter.read();\n if (data === null) {\n this.reading = false;\n if (this.endReceived) {\n this.endStream();\n }\n return;\n }\n\n this.processChunk(data, err => {\n if (err) {\n if (typeof this.waitingEnd === 'function') {\n return this.waitingEnd(err);\n }\n return this.emit('error', err);\n }\n setImmediate(() => this.readData());\n });\n }\n\n endStream() {\n this.finished = true;\n\n if (this.curnode && this.curnode.decoder) {\n this.curnode.decoder.end();\n }\n if (typeof this.waitingEnd === 'function') {\n this.waitingEnd();\n }\n }\n\n _transform(chunk, encoding, done) {\n if (!chunk || !chunk.length) {\n return done();\n }\n\n if (this.splitter.write(chunk) === false) {\n return this.splitter.once('drain', () => {\n done();\n });\n } else {\n return done();\n }\n }\n\n _flush(done) {\n setImmediate(() => this.splitter.end());\n if (this.finished) {\n return this.cleanup(done);\n }\n this.waitingEnd = () => {\n this.cleanup(() => {\n done();\n });\n };\n }\n\n cleanup(done) {\n let finish = () => {\n try {\n let t = this.getTextContent();\n this.push(t);\n } catch (err) {\n return this.emit('error', err);\n }\n\n done();\n };\n\n if (this.curnode && this.curnode.decoder && this.curnode.decoder.readable && !this.decoderEnded) {\n (this.curnode.contentStream || this.curnode.decoder).once('end', () => {\n finish();\n });\n this.curnode.decoder.end();\n } else {\n setImmediate(() => {\n finish();\n });\n }\n }\n\n processHeaders(lines) {\n let headers = new Map();\n (lines || []).forEach(line => {\n let key = line.key;\n let value = ((this.libmime.decodeHeader(line.line) || {}).value || '').toString().trim();\n value = Buffer.from(value, 'binary').toString();\n switch (key) {\n case 'content-type':\n case 'content-disposition':\n case 'dkim-signature':\n value = this.libmime.parseHeaderValue(value);\n if (value.value) {\n value.value = this.libmime.decodeWords(value.value);\n }\n Object.keys((value && value.params) || {}).forEach(key => {\n try {\n value.params[key] = this.libmime.decodeWords(value.params[key]);\n } catch (E) {\n // ignore, keep as is\n }\n });\n break;\n case 'date': {\n let dateValue = new Date(value);\n if (isNaN(dateValue)) {\n // date parsing failed :S\n dateValue = new Date();\n }\n value = dateValue;\n break;\n }\n case 'subject':\n try {\n value = this.libmime.decodeWords(value);\n } catch (E) {\n // ignore, keep as is\n }\n break;\n case 'references':\n try {\n value = this.libmime.decodeWords(value);\n } catch (E) {\n // ignore\n }\n value = value.split(/\\s+/).map(this.ensureMessageIDFormat);\n break;\n case 'message-id':\n case 'in-reply-to':\n try {\n value = this.libmime.decodeWords(value);\n } catch (E) {\n // ignore\n }\n value = this.ensureMessageIDFormat(value);\n break;\n case 'priority':\n case 'x-priority':\n case 'x-msmail-priority':\n case 'importance':\n key = 'priority';\n value = this.parsePriority(value);\n break;\n case 'from':\n case 'to':\n case 'cc':\n case 'bcc':\n case 'sender':\n case 'reply-to':\n case 'delivered-to':\n case 'return-path':\n case 'disposition-notification-to':\n value = addressparser(value);\n this.decodeAddresses(value);\n value = {\n value,\n html: this.getAddressesHTML(value),\n text: this.getAddressesText(value)\n };\n break;\n }\n\n // handle list-* keys\n if (key.substr(0, 5) === 'list-') {\n value = this.parseListHeader(key.substr(5), value);\n key = 'list';\n }\n\n if (value) {\n if (!headers.has(key)) {\n headers.set(key, [].concat(value || []));\n } else if (Array.isArray(value)) {\n headers.set(key, headers.get(key).concat(value));\n } else {\n headers.get(key).push(value);\n }\n }\n });\n\n // keep only the first value\n let singleKeys = [\n 'message-id',\n 'content-id',\n 'from',\n 'sender',\n 'in-reply-to',\n 'reply-to',\n 'subject',\n 'date',\n 'content-disposition',\n 'content-type',\n 'content-transfer-encoding',\n 'priority',\n 'mime-version',\n 'content-description',\n 'precedence',\n 'errors-to',\n 'disposition-notification-to'\n ];\n\n headers.forEach((value, key) => {\n if (Array.isArray(value)) {\n if (singleKeys.includes(key) && value.length) {\n headers.set(key, value[value.length - 1]);\n } else if (value.length === 1) {\n headers.set(key, value[0]);\n }\n }\n\n if (key === 'list') {\n // normalize List-* headers\n let listValue = {};\n [].concat(value || []).forEach(val => {\n Object.keys(val || {}).forEach(listKey => {\n listValue[listKey] = val[listKey];\n });\n });\n headers.set(key, listValue);\n }\n });\n\n return headers;\n }\n\n parseListHeader(key, value) {\n let addresses = addressparser(value);\n let response = {};\n let data = addresses\n .map(address => {\n if (/^https?:/i.test(address.name)) {\n response.url = address.name;\n } else if (address.name) {\n response.name = address.name;\n }\n if (/^mailto:/.test(address.address)) {\n response.mail = address.address.substr(7);\n } else if (address.address && address.address.indexOf('@') < 0) {\n response.id = address.address;\n } else if (address.address) {\n response.mail = address.address;\n }\n if (Object.keys(response).length) {\n return response;\n }\n return false;\n })\n .filter(address => address);\n if (data.length) {\n return {\n [key]: response\n };\n }\n return false;\n }\n\n parsePriority(value) {\n value = value.toLowerCase().trim();\n if (!isNaN(parseInt(value, 10))) {\n // support \"X-Priority: 1 (Highest)\"\n value = parseInt(value, 10) || 0;\n if (value === 3) {\n return 'normal';\n } else if (value > 3) {\n return 'low';\n } else {\n return 'high';\n }\n } else {\n switch (value) {\n case 'non-urgent':\n case 'low':\n return 'low';\n case 'urgent':\n case 'high':\n return 'high';\n }\n }\n return 'normal';\n }\n\n ensureMessageIDFormat(value) {\n if (!value.length) {\n return false;\n }\n\n if (value.charAt(0) !== '<') {\n value = '<' + value;\n }\n\n if (value.charAt(value.length - 1) !== '>') {\n value += '>';\n }\n\n return value;\n }\n\n decodeAddresses(addresses) {\n let processedAddress = new WeakSet();\n for (let i = 0; i < addresses.length; i++) {\n let address = addresses[i];\n address.name = (address.name || '').toString().trim();\n\n if (!address.address && /^(=\\?([^?]+)\\?[Bb]\\?[^?]*\\?=)(\\s*=\\?([^?]+)\\?[Bb]\\?[^?]*\\?=)*$/.test(address.name) && !processedAddress.has(address)) {\n let parsed = addressparser(this.libmime.decodeWords(address.name));\n if (parsed.length) {\n parsed.forEach(entry => {\n processedAddress.add(entry);\n addresses.push(entry);\n });\n }\n\n // remove current element\n addresses.splice(i, 1);\n i--;\n continue;\n }\n\n if (address.name) {\n try {\n address.name = this.libmime.decodeWords(address.name);\n } catch (E) {\n //ignore, keep as is\n }\n }\n if (/@xn--/.test(address.address)) {\n try {\n address.address =\n address.address.substr(0, address.address.lastIndexOf('@') + 1) +\n punycode.toUnicode(address.address.substr(address.address.lastIndexOf('@') + 1));\n } catch (E) {\n // Not a valid punycode string; keep as is\n }\n }\n if (address.group) {\n this.decodeAddresses(address.group);\n }\n }\n }\n\n createNode(node) {\n let contentType = node.contentType;\n let disposition = node.disposition;\n let encoding = node.encoding;\n let charset = node.charset;\n\n if (!contentType && node.root) {\n contentType = 'text/plain';\n }\n\n let newNode = {\n node,\n headerLines: node.headers.lines,\n headers: this.processHeaders(node.headers.getList()),\n contentType,\n children: []\n };\n\n if (!/^multipart\\//i.test(contentType)) {\n if (disposition && !['attachment', 'inline'].includes(disposition)) {\n disposition = 'attachment';\n }\n\n if (!disposition && !this.textTypes.includes(contentType)) {\n newNode.disposition = 'attachment';\n } else {\n newNode.disposition = disposition || 'inline';\n }\n\n newNode.isAttachment = !this.textTypes.includes(contentType) || newNode.disposition !== 'inline';\n\n newNode.encoding = ['quoted-printable', 'base64'].includes(encoding) ? encoding : 'binary';\n\n if (charset) {\n newNode.charset = charset;\n }\n\n let decoder = node.getDecoder();\n decoder.on('end', () => {\n this.decoderEnded = true;\n });\n newNode.decoder = decoder;\n }\n\n if (node.root) {\n this.headers = newNode.headers;\n this.headerLines = newNode.headerLines;\n }\n\n // find location in tree\n\n if (!this.tree) {\n newNode.root = true;\n this.curnode = this.tree = newNode;\n return newNode;\n }\n\n // immediate child of root node\n if (!this.curnode.parent) {\n newNode.parent = this.curnode;\n this.curnode.children.push(newNode);\n this.curnode = newNode;\n return newNode;\n }\n\n // siblings\n if (this.curnode.parent.node === node.parentNode) {\n newNode.parent = this.curnode.parent;\n this.curnode.parent.children.push(newNode);\n this.curnode = newNode;\n return newNode;\n }\n\n // first child\n if (this.curnode.node === node.parentNode) {\n newNode.parent = this.curnode;\n this.curnode.children.push(newNode);\n this.curnode = newNode;\n return newNode;\n }\n\n // move up\n let parentNode = this.curnode;\n while ((parentNode = parentNode.parent)) {\n if (parentNode.node === node.parentNode) {\n newNode.parent = parentNode;\n parentNode.children.push(newNode);\n this.curnode = newNode;\n return newNode;\n }\n }\n\n // should never happen, can't detect parent\n this.curnode = newNode;\n return newNode;\n }\n\n getTextContent() {\n let text = [];\n let html = [];\n let processNode = (alternative, level, node) => {\n if (node.showMeta) {\n let meta = ['From', 'Subject', 'Date', 'To', 'Cc', 'Bcc']\n .map(fkey => {\n let key = fkey.toLowerCase();\n if (!node.headers.has(key)) {\n return false;\n }\n let value = node.headers.get(key);\n if (!value) {\n return false;\n }\n return {\n key: fkey,\n value: Array.isArray(value) ? value[value.length - 1] : value\n };\n })\n .filter(entry => entry);\n if (this.hasHtml) {\n html.push(\n '<table class=\"mp_head\">' +\n meta\n .map(entry => {\n let value = entry.value;\n switch (entry.key) {\n case 'From':\n case 'To':\n case 'Cc':\n case 'Bcc':\n value = value.html;\n break;\n case 'Date':\n value = this.options.formatDateString ? this.options.formatDateString(value) : value.toUTCString();\n break;\n case 'Subject':\n value = '<strong>' + he.encode(value) + '</strong>';\n break;\n default:\n value = he.encode(value);\n }\n\n return '<tr><td class=\"mp_head_key\">' + he.encode(entry.key) + ':</td><td class=\"mp_head_value\">' + value + '<td></tr>';\n })\n .join('\\n') +\n '<table>'\n );\n }\n if (this.hasText) {\n text.push(\n '\\n' +\n meta\n .map(entry => {\n let value = entry.value;\n switch (entry.key) {\n case 'From':\n case 'To':\n case 'Cc':\n case 'Bcc':\n value = value.text;\n break;\n case 'Date':\n value = this.options.formatDateString ? this.options.formatDateString(value) : value.toUTCString();\n break;\n }\n return entry.key + ': ' + value;\n })\n .join('\\n') +\n '\\n'\n );\n }\n }\n if (node.textContent) {\n if (node.contentType === 'text/plain') {\n text.push(node.textContent);\n if (!alternative && this.hasHtml) {\n html.push(this.textToHtml(node.textContent));\n }\n } else if (node.contentType === 'message/delivery-status' && !this.options.keepDeliveryStatus) {\n text.push(node.textContent);\n if (!alternative && this.hasHtml) {\n html.push(this.textToHtml(node.textContent));\n }\n } else if (node.contentType === 'text/html') {\n let failedToParseHtml = false;\n if ((!alternative && this.hasText) || (node.root && !this.hasText)) {\n if (this.options.skipHtmlToText) {\n text.push('');\n } else if (node.textContent.length > this.options.maxHtmlLengthToParse) {\n this.emit('error', new Error(`HTML too long for parsing ${node.textContent.length} bytes`));\n text.push('Invalid HTML content (too long)');\n failedToParseHtml = true;\n } else {\n try {\n text.push(htmlToText(node.textContent));\n } catch (err) {\n this.emit('error', new Error('Failed to parse HTML'));\n text.push('Invalid HTML content');\n failedToParseHtml = true;\n }\n }\n }\n if (!failedToParseHtml) {\n html.push(node.textContent);\n }\n }\n }\n alternative = alternative || node.contentType === 'multipart/alternative';\n if (node.children) {\n node.children.forEach(subNode => {\n processNode(alternative, level + 1, subNode);\n });\n }\n };\n\n processNode(false, 0, this.tree);\n\n let response = {\n type: 'text'\n };\n if (html.length) {\n this.html = response.html = html.join('<br/>\\n');\n }\n if (text.length) {\n this.text = response.text = text.join('\\n');\n this.textAsHtml = response.textAsHtml = text.map(part => this.textToHtml(part)).join('<br/>\\n');\n }\n return response;\n }\n\n processChunk(data, done) {\n let partId = null;\n if (data._parentBoundary) {\n partId = this._getPartId(data._parentBoundary);\n }\n switch (data.type) {\n case 'node': {\n let node = this.createNode(data);\n if (node === this.tree) {\n ['subject', 'references', 'date', 'to', 'from', 'to', 'cc', 'bcc', 'message-id', 'in-reply-to', 'reply-to'].forEach(key => {\n if (node.headers.has(key)) {\n this[key.replace(/-([a-z])/g, (m, c) => c.toUpperCase())] = node.headers.get(key);\n }\n });\n this.emit('headers', node.headers);\n\n if (node.headerLines) {\n this.emit('headerLines', node.headerLines);\n } \n }\n\n if (data.contentType === 'message/rfc822' && data.messageNode) {\n break;\n }\n\n if (data.parentNode && data.parentNode.contentType === 'message/rfc822') {\n node.showMeta = true;\n }\n\n if (node.isAttachment) {\n let contentType = node.contentType;\n if (node.contentType === 'application/octet-stream' && data.filename) {\n contentType = this.libmime.detectMimeType(data.filename) || 'application/octet-stream';\n }\n\n let attachment = {\n type: 'attachment',\n content: null,\n contentType,\n partId,\n release: () => {\n attachment.release = null;\n if (this.waitUntilAttachmentEnd && typeof this.attachmentCallback === 'function') {\n setImmediate(this.attachmentCallback);\n }\n this.attachmentCallback = false;\n this.waitUntilAttachmentEnd = false;\n }\n };\n\n let algo = this.options.checksumAlgo || 'md5';\n let hasher = new StreamHash(attachment, algo);\n node.decoder.on('error', err => {\n hasher.emit('error', err);\n });\n\n node.decoder.on('readable', () => {\n let chunk;\n\n while ((chunk = node.decoder.read()) !== null) {\n hasher.write(chunk);\n }\n });\n\n node.decoder.once('end', () => {\n hasher.end();\n });\n\n //node.decoder.pipe(hasher);\n attachment.content = hasher;\n\n this.waitUntilAttachmentEnd = true;\n if (data.disposition) {\n attachment.contentDisposition = data.disposition;\n }\n\n if (data.filename) {\n attachment.filename = data.filename;\n }\n\n if (node.headers.has('content-id')) {\n attachment.contentId = [].concat(node.headers.get('content-id') || []).shift();\n attachment.cid = attachment.contentId.trim().replace(/^<|>$/g, '').trim();\n // check if the attachment is \"related\" to text content like an embedded image etc\n let parentNode = node;\n while ((parentNode = parentNode.parent)) {\n if (parentNode.contentType === 'multipart/related') {\n attachment.related = true;\n }\n }\n }\n\n attachment.headers = node.headers;\n this.push(attachment);\n this.attachmentList.push(attachment);\n } else if (node.disposition === 'inline') {\n let chunks = [];\n let chunklen = 0;\n node.contentStream = node.decoder;\n\n if (node.contentType === 'text/plain') {\n this.hasText = true;\n } else if (node.contentType === 'text/html') {\n this.hasHtml = true;\n } else if (node.contentType === 'message/delivery-status' && !this.options.keepDeliveryStatus) {\n this.hasText = true;\n }\n\n if (node.node.flowed) {\n let contentStream = node.contentStream;\n let flowDecoder = new FlowedDecoder({\n delSp: node.node.delSp\n });\n contentStream.on('error', err => {\n flowDecoder.emit('error', err);\n });\n contentStream.pipe(flowDecoder);\n node.contentStream = flowDecoder;\n }\n\n let charset = node.charset || 'utf-8';\n //charset = charset || 'windows-1257';\n\n if (!['ascii', 'usascii', 'utf8'].includes(charset.toLowerCase().replace(/[^a-z0-9]+/g, ''))) {\n try {\n let contentStream = node.contentStream;\n let decodeStream = this.decoder.decodeStream(charset);\n contentStream.on('error', err => {\n decodeStream.emit('error', err);\n });\n contentStream.pipe(decodeStream);\n node.contentStream = decodeStream;\n } catch (E) {\n // do not decode charset\n }\n }\n\n node.contentStream.on('readable', () => {\n let chunk;\n while ((chunk = node.contentStream.read()) !== null) {\n if (typeof chunk === 'string') {\n chunk = Buffer.from(chunk);\n }\n chunks.push(chunk);\n chunklen += chunk.length;\n }\n });\n\n node.contentStream.once('end', () => {\n node.textContent = Buffer.concat(chunks, chunklen).toString().replace(/\\r?\\n/g, '\\n');\n });\n\n node.contentStream.once('error', err => {\n this.emit('error', err);\n });\n }\n\n break;\n }\n\n case 'data':\n if (this.curnode && this.curnode.decoder) {\n this.curnode.decoder.end();\n }\n\n if (this.waitUntilAttachmentEnd) {\n this.attachmentCallback = done;\n return;\n }\n\n // multipart message structure\n // this is not related to any specific 'node' block as it includes\n // everything between the end of some node body and between the next header\n //process.stdout.write(data.value);\n break;\n\n case 'body':\n if (this.curnode && this.curnode.decoder && this.curnode.decoder.writable) {\n if (this.curnode.decoder.write(data.value) === false) {\n return this.curnode.decoder.once('drain', done);\n }\n }\n\n // Leaf element body. Includes the body for the last 'node' block. You might\n // have several 'body' calls for a single 'node' block\n //process.stdout.write(data.value);\n break;\n }\n\n setImmediate(done);\n }\n\n _getPartId(parentBoundary) {\n let boundaryIndex = this.boundaries.findIndex(item => item.name === parentBoundary);\n if (boundaryIndex === -1) {\n this.boundaries.push({ name: parentBoundary, count: 1 });\n boundaryIndex = this.boundaries.length - 1;\n } else {\n this.boundaries[boundaryIndex].count++;\n }\n let partId = '1';\n for (let i = 0; i <= boundaryIndex; i++) {\n if (i === 0) partId = this.boundaries[i].count.toString();\n else partId += '.' + this.boundaries[i].count.toString();\n }\n return partId;\n }\n\n getAddressesHTML(value) {\n let formatSingleLevel = addresses =>\n addresses\n .map(address => {\n let str = '<span class=\"mp_address_group\">';\n if (address.name) {\n str += '<span class=\"mp_address_name\">' + he.encode(address.name) + (address.group ? ': ' : '') + '</span>';\n }\n if (address.address) {\n let link = '<a href=\"mailto:' + he.encode(address.address) + '\" class=\"mp_address_email\">' + he.encode(address.address) + '</a>';\n if (address.name) {\n str += ' <' + link + '>';\n } else {\n str += link;\n }\n }\n if (address.group) {\n str += formatSingleLevel(address.group) + ';';\n }\n return str + '</span>';\n })\n .join(', ');\n return formatSingleLevel([].concat(value || []));\n }\n\n getAddressesText(value) {\n let formatSingleLevel = addresses =>\n addresses\n .map(address => {\n let str = '';\n if (address.name) {\n str += `\"${address.name}\"` + (address.group ? ': ' : '');\n }\n if (address.address) {\n let link = address.address;\n if (address.name) {\n str += ' <' + link + '>';\n } else {\n str += link;\n }\n }\n if (address.group) {\n str += formatSingleLevel(address.group) + ';';\n }\n return str;\n })\n .join(', ');\n return formatSingleLevel([].concat(value || []));\n }\n\n updateImageLinks(replaceCallback, done) {\n if (!this.html) {\n return setImmediate(() => done(null, false));\n }\n\n let cids = new Map();\n let html = (this.html || '').toString();\n\n if (this.options.skipImageLinks) {\n return done(null, html);\n }\n\n html.replace(/\\bcid:([^'\"\\s]{1,256})/g, (match, cid) => {\n for (let i = 0, len = this.attachmentList.length; i < len; i++) {\n if (this.attachmentList[i].cid === cid && /^image\\/[\\w]+$/i.test(this.attachmentList[i].contentType)) {\n cids.set(cid, {\n attachment: this.attachmentList[i]\n });\n break;\n }\n }\n return match;\n });\n\n let cidList = [];\n cids.forEach(entry => {\n cidList.push(entry);\n });\n\n let pos = 0;\n let processNext = () => {\n if (pos >= cidList.length) {\n html = html.replace(/\\bcid:([^'\"\\s]{1,256})/g, (match, cid) => {\n if (cids.has(cid) && cids.get(cid).url) {\n return cids.get(cid).url;\n }\n return match;\n });\n\n return done(null, html);\n }\n let entry = cidList[pos++];\n replaceCallback(entry.attachment, (err, url) => {\n if (err) {\n return setImmediate(() => done(err));\n }\n entry.url = url;\n setImmediate(processNext);\n });\n };\n\n setImmediate(processNext);\n }\n\n textToHtml(str) {\n if (this.options.skipTextToHtml) {\n return '';\n }\n str = (str || '').toString();\n let encoded;\n\n let linkified = false;\n if (!this.options.skipTextLinks) {\n try {\n if (linkify.pretest(str)) {\n linkified = true;\n let links = linkify.match(str) || [];\n let result = [];\n let last = 0;\n\n links.forEach(link => {\n if (last < link.index) {\n let textPart = he\n // encode special chars\n .encode(str.slice(last, link.index), {\n useNamedReferences: true\n });\n result.push(textPart);\n }\n\n result.push(`<a href=\"${link.url}\">${link.text}</a>`);\n\n last = link.lastIndex;\n });\n\n let textPart = he\n // encode special chars\n .encode(str.slice(last), {\n useNamedReferences: true\n });\n result.push(textPart);\n\n encoded = result.join('');\n }\n } catch (E) {\n // failed, don't linkify\n }\n }\n\n if (!linkified) {\n encoded = he\n // encode special chars\n .encode(str, {\n useNamedReferences: true\n });\n }\n\n let text =\n '<p>' +\n encoded\n .replace(/\\r?\\n/g, '\\n')\n .trim() // normalize line endings\n .replace(/[ \\t]+$/gm, '')\n .trim() // trim empty line endings\n .replace(/\\n\\n+/g, '</p><p>')\n .trim() // insert <p> to multiple linebreaks\n .replace(/\\n/g, '<br/>') + // insert <br> to single linebreaks\n '</p>';\n\n return text;\n }\n}\n\nmodule.exports = MailParser;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFjdGlvbi1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9tYWlscGFyc2VyL2xpYi9tYWlsLXBhcnNlci5qcyIsIm1hcHBpbmdzIjoiQUFBYTs7QUFFYixrQkFBa0IsbUJBQU8sQ0FBQyxxRUFBVztBQUNyQyxnQkFBZ0IsbUJBQU8sQ0FBQyx1RUFBUztBQUNqQyxzQkFBc0IsbUJBQU8sQ0FBQyxtSUFBOEI7QUFDNUQsa0JBQWtCLHVEQUEyQjtBQUM3QztBQUNBLGlCQUFpQixtQkFBTyxDQUFDLGdGQUFhO0FBQ3RDLHNCQUFzQixtQkFBTyxDQUFDLHFHQUE4QjtBQUM1RCxtQkFBbUIsbUJBQU8sQ0FBQyxvRkFBZTtBQUMxQyxjQUFjLG1CQUFPLENBQUMsMkVBQVk7QUFDbEMsUUFBUSxhQUFhLEVBQUUsbUJBQU8sQ0FBQyx1RkFBYztBQUM3QyxXQUFXLG1CQUFPLENBQUMsb0RBQUk7QUFDdkIsZ0JBQWdCLG1CQUFPLENBQUMsaUZBQVk7QUFDcEMsYUFBYSxtQkFBTyxDQUFDLDZEQUFNO0FBQzNCLHlCQUF5QixtQkFBTyxDQUFDLHlGQUFtQjs7QUFFcEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsa0RBQWtEOztBQUU3RDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsMERBQTBELEtBQUs7QUFDL0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTOztBQUVULDZDQUE2QywyQkFBMkI7QUFDeEU7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYixVQUFVO0FBQ1Y7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0VBQW9FO0FBQ3BFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZEQUE2RDtBQUM3RDtBQUNBO0FBQ0EsMEJBQTBCO0FBQzFCO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0I7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0I7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQjtBQUNsQjtBQUNBLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0I7QUFDbEI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUNBQXlDO0FBQ3pDO0FBQ0EscUJBQXFCO0FBQ3JCLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCO0FBQ2xCO0FBQ0Esa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLHdCQUF3QixzQkFBc0I7QUFDOUM7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0I7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQjtBQUNsQixvREFBb0Q7QUFDcEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxpQ0FBaUM7QUFDakM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQ0FBaUM7QUFDakM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBCQUEwQjtBQUMxQixzRkFBc0YseUJBQXlCO0FBQy9HO0FBQ0E7QUFDQSwwQkFBMEI7QUFDMUI7QUFDQTtBQUNBLDhCQUE4QjtBQUM5QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7O0FBRXJCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EscUJBQXFCOztBQUVyQjtBQUNBO0FBQ0EscUJBQXFCOztBQUVyQjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLHNCQUFzQjtBQUN0QjtBQUNBLHNCQUFzQjtBQUN0QjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUJBQXlCO0FBQ3pCO0FBQ0E7QUFDQSx5QkFBeUI7QUFDekI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkJBQTZCO0FBQzdCO0FBQ0E7QUFDQSwwQkFBMEI7QUFDMUI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQjs7QUFFckI7QUFDQTtBQUNBLHFCQUFxQjs7QUFFckI7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQjs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxtQ0FBbUMsZ0NBQWdDO0FBQ25FO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixvQkFBb0I7QUFDNUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUNBQXlDLGdCQUFnQjtBQUN6RCwwQkFBMEI7QUFDMUI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvRUFBb0U7QUFDcEU7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUNBQW1DLGFBQWE7QUFDaEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBCQUEwQjtBQUMxQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9FQUFvRTtBQUNwRTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSxxQ0FBcUMsTUFBTTtBQUMzQyw4REFBOEQsU0FBUztBQUN2RTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBO0FBQ0Esb0RBQW9ELE1BQU07QUFDMUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7O0FBRWpCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlDQUFpQztBQUNqQztBQUNBOztBQUVBLGdEQUFnRCxTQUFTLElBQUksVUFBVTs7QUFFdkU7QUFDQSxxQkFBcUI7O0FBRXJCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUJBQXlCO0FBQ3pCOztBQUVBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEiLCJzb3VyY2VzIjpbIi9ob21lL2FsbWEvbmV4dGdlbi9OZWFoLW1haWwvbm9kZV9tb2R1bGVzL21haWxwYXJzZXIvbGliL21haWwtcGFyc2VyLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcblxuY29uc3QgbWFpbHNwbGl0ID0gcmVxdWlyZSgnbWFpbHNwbGl0Jyk7XG5jb25zdCBsaWJtaW1lID0gcmVxdWlyZSgnbGlibWltZScpO1xuY29uc3QgYWRkcmVzc3BhcnNlciA9IHJlcXVpcmUoJ25vZGVtYWlsZXIvbGliL2FkZHJlc3NwYXJzZXInKTtcbmNvbnN0IFRyYW5zZm9ybSA9IHJlcXVpcmUoJ3N0cmVhbScpLlRyYW5zZm9ybTtcbmNvbnN0IFNwbGl0dGVyID0gbWFpbHNwbGl0LlNwbGl0dGVyO1xuY29uc3QgcHVueWNvZGUgPSByZXF1aXJlKCdwdW55Y29kZS5qcycpO1xuY29uc3QgRmxvd2VkRGVjb2RlciA9IHJlcXVpcmUoJ21haWxzcGxpdC9saWIvZmxvd2VkLWRlY29kZXInKTtcbmNvbnN0IFN0cmVhbUhhc2ggPSByZXF1aXJlKCcuL3N0cmVhbS1oYXNoJyk7XG5jb25zdCBpY29udiA9IHJlcXVpcmUoJ2ljb252LWxpdGUnKTtcbmNvbnN0IHsgaHRtbFRvVGV4dCB9ID0gcmVxdWlyZSgnaHRtbC10by10ZXh0Jyk7XG5jb25zdCBoZSA9IHJlcXVpcmUoJ2hlJyk7XG5jb25zdCBsaW5raWZ5ID0gcmVxdWlyZSgnbGlua2lmeS1pdCcpKCk7XG5jb25zdCB0bGRzID0gcmVxdWlyZSgndGxkcycpO1xuY29uc3QgZW5jb2RpbmdKYXBhbmVzZSA9IHJlcXVpcmUoJ2VuY29kaW5nLWphcGFuZXNlJyk7XG5cbmxpbmtpZnlcbiAgICAudGxkcyh0bGRzKSAvLyBSZWxvYWQgd2l0aCBmdWxsIHRsZHMgbGlzdFxuICAgIC50bGRzKCdvbmlvbicsIHRydWUpIC8vIEFkZCB1bm9mZmljaWFsIGAub25pb25gIGRvbWFpblxuICAgIC5hZGQoJ2dpdDonLCAnaHR0cDonKSAvLyBBZGQgYGdpdDpgIHB0b3RvY29sIGFzIFwiYWxpYXNcIlxuICAgIC5hZGQoJ2Z0cDonLCBudWxsKSAvLyBEaXNhYmxlIGBmdHA6YCBwdG90b2NvbFxuICAgIC5zZXQoeyBmdXp6eUlQOiB0cnVlLCBmdXp6eUxpbms6IHRydWUsIGZ1enp5RW1haWw6IHRydWUgfSk7XG5cbi8vIHR3aXR0ZXIgbGlua2lmaWVyIGZyb21cbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXJrZG93bi1pdC9saW5raWZ5LWl0I2V4YW1wbGUtMi1hZGQtdHdpdHRlci1tZW50aW9ucy1oYW5kbGVyXG5saW5raWZ5LmFkZCgnQCcsIHtcbiAgICB2YWxpZGF0ZSh0ZXh0LCBwb3MsIHNlbGYpIHtcbiAgICAgICAgbGV0IHRhaWwgPSB0ZXh0LnNsaWNlKHBvcyk7XG5cbiAgICAgICAgaWYgKCFzZWxmLnJlLnR3aXR0ZXIpIHtcbiAgICAgICAgICAgIHNlbGYucmUudHdpdHRlciA9IG5ldyBSZWdFeHAoJ14oW2EtekEtWjAtOV9dKXsxLDE1fSg/IV8pKD89JHwnICsgc2VsZi5yZS5zcmNfWlBDYyArICcpJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNlbGYucmUudHdpdHRlci50ZXN0KHRhaWwpKSB7XG4gICAgICAgICAgICAvLyBMaW5raWZpZXIgYWxsb3dzIHB1bmN0dWF0aW9uIGNoYXJzIGJlZm9yZSBwcmVmaXgsXG4gICAgICAgICAgICAvLyBidXQgd2UgYWRkaXRpb25hbGx5IGRpc2FibGUgYEBgIChcIkBAbWVudGlvblwiIGlzIGludmFsaWQpXG4gICAgICAgICAgICBpZiAocG9zID49IDIgJiYgdGFpbFtwb3MgLSAyXSA9PT0gJ0AnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRhaWwubWF0Y2goc2VsZi5yZS50d2l0dGVyKVswXS5sZW5ndGg7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIDA7XG4gICAgfSxcbiAgICBub3JtYWxpemUobWF0Y2gpIHtcbiAgICAgICAgbWF0Y2gudXJsID0gJ2h0dHBzOi8vdHdpdHRlci5jb20vJyArIG1hdGNoLnVybC5yZXBsYWNlKC9eQC8sICcnKTtcbiAgICB9XG59KTtcblxuY2xhc3MgSWNvbnZEZWNvZGVyIGV4dGVuZHMgVHJhbnNmb3JtIHtcbiAgICBjb25zdHJ1Y3RvcihJY29udiwgY2hhcnNldCkge1xuICAgICAgICBzdXBlcigpO1xuXG4gICAgICAgIC8vIEljb252IHRocm93cyBlcnJvciBvbiBrc19jXzU2MDEtMTk4NyB3aGVuIGl0IGlzIG1hcHBlZCB0byBFVUMtS1JcbiAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2Jub29yZGh1aXMvbm9kZS1pY29udi9pc3N1ZXMvMTY5XG4gICAgICAgIGlmIChjaGFyc2V0LnRvTG93ZXJDYXNlKCkgPT09ICdrc19jXzU2MDEtMTk4NycpIHtcbiAgICAgICAgICAgIGNoYXJzZXQgPSAnQ1A5NDknO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc3RyZWFtID0gbmV3IEljb252KGNoYXJzZXQsICdVVEYtOC8vVFJBTlNMSVQvL0lHTk9SRScpO1xuXG4gICAgICAgIHRoaXMuaW5wdXRFbmRlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmVuZENiID0gZmFsc2U7XG5cbiAgICAgICAgdGhpcy5zdHJlYW0ub24oJ2Vycm9yJywgZXJyID0+IHRoaXMuZW1pdCgnZXJyb3InLCBlcnIpKTtcbiAgICAgICAgdGhpcy5zdHJlYW0ub24oJ2RhdGEnLCBjaHVuayA9PiB0aGlzLnB1c2goY2h1bmspKTtcbiAgICAgICAgdGhpcy5zdHJlYW0ub24oJ2VuZCcsICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuaW5wdXRFbmRlZCA9IHRydWU7XG4gICAgICAgICAgICBpZiAodHlwZW9mIHRoaXMuZW5kQ2IgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmVuZENiKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIF90cmFuc2Zvcm0oY2h1bmssIGVuY29kaW5nLCBkb25lKSB7XG4gICAgICAgIHRoaXMuc3RyZWFtLndyaXRlKGNodW5rKTtcbiAgICAgICAgZG9uZSgpO1xuICAgIH1cblxuICAgIF9mbHVzaChkb25lKSB7XG4gICAgICAgIHRoaXMuZW5kQ2IgPSBkb25lO1xuICAgICAgICB0aGlzLnN0cmVhbS5lbmQoKTtcbiAgICB9XG59XG5cbmNsYXNzIEpQRGVjb2RlciBleHRlbmRzIFRyYW5zZm9ybSB7XG4gICAgY29uc3RydWN0b3IoY2hhcnNldCkge1xuICAgICAgICBzdXBlcigpO1xuXG4gICAgICAgIHRoaXMuY2hhcnNldCA9IGNoYXJzZXQ7XG4gICAgICAgIHRoaXMuY2h1bmtzID0gW107XG4gICAgICAgIHRoaXMuY2h1bmtsZW4gPSAwO1xuICAgIH1cblxuICAgIF90cmFuc2Zvcm0oY2h1bmssIGVuY29kaW5nLCBkb25lKSB7XG4gICAgICAgIGlmICh0eXBlb2YgY2h1bmsgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBjaHVuayA9IEJ1ZmZlci5mcm9tKGNodW5rLCBlbmNvZGluZyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNodW5rcy5wdXNoKGNodW5rKTtcbiAgICAgICAgdGhpcy5jaHVua2xlbiArPSBjaHVuay5sZW5ndGg7XG4gICAgICAgIGRvbmUoKTtcbiAgICB9XG5cbiAgICBfZmx1c2goZG9uZSkge1xuICAgICAgICBsZXQgaW5wdXQgPSBCdWZmZXIuY29uY2F0KHRoaXMuY2h1bmtzLCB0aGlzLmNodW5rbGVuKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGxldCBvdXRwdXQgPSBlbmNvZGluZ0phcGFuZXNlLmNvbnZlcnQoaW5wdXQsIHtcbiAgICAgICAgICAgICAgICB0bzogJ1VOSUNPREUnLCAvLyB0b19lbmNvZGluZ1xuICAgICAgICAgICAgICAgIGZyb206IHRoaXMuY2hhcnNldCwgLy8gZnJvbV9lbmNvZGluZ1xuICAgICAgICAgICAgICAgIHR5cGU6ICdzdHJpbmcnXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmICh0eXBlb2Ygb3V0cHV0ID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgIG91dHB1dCA9IEJ1ZmZlci5mcm9tKG91dHB1dCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnB1c2gob3V0cHV0KTtcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAvLyBrZWVwIGFzIGlzIG9uIGVycm9yc1xuICAgICAgICAgICAgdGhpcy5wdXNoKGlucHV0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGRvbmUoKTtcbiAgICB9XG59XG5cbmNsYXNzIE1haWxQYXJzZXIgZXh0ZW5kcyBUcmFuc2Zvcm0ge1xuICAgIGNvbnN0cnVjdG9yKGNvbmZpZykge1xuICAgICAgICBzdXBlcih7XG4gICAgICAgICAgICByZWFkYWJsZU9iamVjdE1vZGU6IHRydWUsXG4gICAgICAgICAgICB3cml0YWJsZU9iamVjdE1vZGU6IGZhbHNlXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMub3B0aW9ucyA9IGNvbmZpZyB8fCB7fTtcbiAgICAgICAgdGhpcy5zcGxpdHRlciA9IG5ldyBTcGxpdHRlcihjb25maWcpO1xuICAgICAgICB0aGlzLmZpbmlzaGVkID0gZmFsc2U7XG4gICAgICAgIHRoaXMud2FpdGluZ0VuZCA9IGZhbHNlO1xuXG4gICAgICAgIHRoaXMuaGVhZGVycyA9IGZhbHNlO1xuICAgICAgICB0aGlzLmhlYWRlckxpbmVzID0gZmFsc2U7XG5cbiAgICAgICAgdGhpcy5lbmRSZWNlaXZlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLnJlYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5oYXNGYWlsZWQgPSBmYWxzZTtcblxuICAgICAgICB0aGlzLnRyZWUgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5jdXJub2RlID0gZmFsc2U7XG4gICAgICAgIHRoaXMud2FpdFVudGlsQXR0YWNobWVudEVuZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmF0dGFjaG1lbnRDYWxsYmFjayA9IGZhbHNlO1xuXG4gICAgICAgIHRoaXMuaGFzSHRtbCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmhhc1RleHQgPSBmYWxzZTtcblxuICAgICAgICB0aGlzLnRleHQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5odG1sID0gZmFsc2U7XG4gICAgICAgIHRoaXMudGV4dEFzSHRtbCA9IGZhbHNlO1xuXG4gICAgICAgIHRoaXMuYXR0YWNobWVudExpc3QgPSBbXTtcblxuICAgICAgICB0aGlzLmJvdW5kYXJpZXMgPSBbXTtcblxuICAgICAgICB0aGlzLnRleHRUeXBlcyA9IFsndGV4dC9wbGFpbicsICd0ZXh0L2h0bWwnXS5jb25jYXQoIXRoaXMub3B0aW9ucy5rZWVwRGVsaXZlcnlTdGF0dXMgPyAnbWVzc2FnZS9kZWxpdmVyeS1zdGF0dXMnIDogW10pO1xuXG4gICAgICAgIHRoaXMuZGVjb2RlciA9IHRoaXMuZ2V0RGVjb2RlcigpO1xuXG4gICAgICAgIHRoaXMuc3BsaXR0ZXIub24oJ3JlYWRhYmxlJywgKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMucmVhZGluZykge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMucmVhZERhdGEoKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5zcGxpdHRlci5vbignZW5kJywgKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5lbmRSZWNlaXZlZCA9IHRydWU7XG4gICAgICAgICAgICBpZiAoIXRoaXMucmVhZGluZykge1xuICAgICAgICAgICAgICAgIHRoaXMuZW5kU3RyZWFtKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuc3BsaXR0ZXIub24oJ2Vycm9yJywgZXJyID0+IHtcbiAgICAgICAgICAgIHRoaXMuaGFzRmFpbGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgdGhpcy53YWl0aW5nRW5kID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMud2FpdGluZ0VuZChlcnIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5lbWl0KCdlcnJvcicsIGVycik7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMubGlibWltZSA9IG5ldyBsaWJtaW1lLkxpYm1pbWUoeyBJY29udjogdGhpcy5vcHRpb25zLkljb252IH0pO1xuICAgIH1cblxuICAgIGdldERlY29kZXIoKSB7XG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMuSWNvbnYpIHtcbiAgICAgICAgICAgIGNvbnN0IEljb252ID0gdGhpcy5vcHRpb25zLkljb252O1xuICAgICAgICAgICAgLy8gY3JlYXRlIHdyYXBwZXJcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgZGVjb2RlU3RyZWFtKGNoYXJzZXQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBJY29udkRlY29kZXIoSWNvbnYsIGNoYXJzZXQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGRlY29kZVN0cmVhbShjaGFyc2V0KSB7XG4gICAgICAgICAgICAgICAgICAgIGNoYXJzZXQgPSAoY2hhcnNldCB8fCAnYXNjaWknKS50b1N0cmluZygpLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoL15qaXN8Xmlzby0/MjAyMi0/anB8XkVVQ0pQL2kudGVzdChjaGFyc2V0KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3BlY2lhbCBjYXNlIG5vdCBzdXBwb3J0ZWQgYnkgaWNvbnYtbGl0ZVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBKUERlY29kZXIoY2hhcnNldCk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gaWNvbnYuZGVjb2RlU3RyZWFtKGNoYXJzZXQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZWFkRGF0YSgpIHtcbiAgICAgICAgaWYgKHRoaXMuaGFzRmFpbGVkKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5yZWFkaW5nID0gdHJ1ZTtcbiAgICAgICAgbGV0IGRhdGEgPSB0aGlzLnNwbGl0dGVyLnJlYWQoKTtcbiAgICAgICAgaWYgKGRhdGEgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMucmVhZGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgaWYgKHRoaXMuZW5kUmVjZWl2ZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmVuZFN0cmVhbSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5wcm9jZXNzQ2h1bmsoZGF0YSwgZXJyID0+IHtcbiAgICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHRoaXMud2FpdGluZ0VuZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy53YWl0aW5nRW5kKGVycik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmVtaXQoJ2Vycm9yJywgZXJyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHNldEltbWVkaWF0ZSgoKSA9PiB0aGlzLnJlYWREYXRhKCkpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBlbmRTdHJlYW0oKSB7XG4gICAgICAgIHRoaXMuZmluaXNoZWQgPSB0cnVlO1xuXG4gICAgICAgIGlmICh0aGlzLmN1cm5vZGUgJiYgdGhpcy5jdXJub2RlLmRlY29kZXIpIHtcbiAgICAgICAgICAgIHRoaXMuY3Vybm9kZS5kZWNvZGVyLmVuZCgpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy53YWl0aW5nRW5kID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICB0aGlzLndhaXRpbmdFbmQoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIF90cmFuc2Zvcm0oY2h1bmssIGVuY29kaW5nLCBkb25lKSB7XG4gICAgICAgIGlmICghY2h1bmsgfHwgIWNodW5rLmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIGRvbmUoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLnNwbGl0dGVyLndyaXRlKGNodW5rKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnNwbGl0dGVyLm9uY2UoJ2RyYWluJywgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGRvbmUoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGRvbmUoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIF9mbHVzaChkb25lKSB7XG4gICAgICAgIHNldEltbWVkaWF0ZSgoKSA9PiB0aGlzLnNwbGl0dGVyLmVuZCgpKTtcbiAgICAgICAgaWYgKHRoaXMuZmluaXNoZWQpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNsZWFudXAoZG9uZSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy53YWl0aW5nRW5kID0gKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5jbGVhbnVwKCgpID0+IHtcbiAgICAgICAgICAgICAgICBkb25lKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBjbGVhbnVwKGRvbmUpIHtcbiAgICAgICAgbGV0IGZpbmlzaCA9ICgpID0+IHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgbGV0IHQgPSB0aGlzLmdldFRleHRDb250ZW50KCk7XG4gICAgICAgICAgICAgICAgdGhpcy5wdXNoKHQpO1xuICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZW1pdCgnZXJyb3InLCBlcnIpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBkb25lKCk7XG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKHRoaXMuY3Vybm9kZSAmJiB0aGlzLmN1cm5vZGUuZGVjb2RlciAmJiB0aGlzLmN1cm5vZGUuZGVjb2Rlci5yZWFkYWJsZSAmJiAhdGhpcy5kZWNvZGVyRW5kZWQpIHtcbiAgICAgICAgICAgICh0aGlzLmN1cm5vZGUuY29udGVudFN0cmVhbSB8fCB0aGlzLmN1cm5vZGUuZGVjb2Rlcikub25jZSgnZW5kJywgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGZpbmlzaCgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLmN1cm5vZGUuZGVjb2Rlci5lbmQoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHNldEltbWVkaWF0ZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgZmluaXNoKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByb2Nlc3NIZWFkZXJzKGxpbmVzKSB7XG4gICAgICAgIGxldCBoZWFkZXJzID0gbmV3IE1hcCgpO1xuICAgICAgICAobGluZXMgfHwgW10pLmZvckVhY2gobGluZSA9PiB7XG4gICAgICAgICAgICBsZXQga2V5ID0gbGluZS5rZXk7XG4gICAgICAgICAgICBsZXQgdmFsdWUgPSAoKHRoaXMubGlibWltZS5kZWNvZGVIZWFkZXIobGluZS5saW5lKSB8fCB7fSkudmFsdWUgfHwgJycpLnRvU3RyaW5nKCkudHJpbSgpO1xuICAgICAgICAgICAgdmFsdWUgPSBCdWZmZXIuZnJvbSh2YWx1ZSwgJ2JpbmFyeScpLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICBzd2l0Y2ggKGtleSkge1xuICAgICAgICAgICAgICAgIGNhc2UgJ2NvbnRlbnQtdHlwZSc6XG4gICAgICAgICAgICAgICAgY2FzZSAnY29udGVudC1kaXNwb3NpdGlvbic6XG4gICAgICAgICAgICAgICAgY2FzZSAnZGtpbS1zaWduYXR1cmUnOlxuICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHRoaXMubGlibWltZS5wYXJzZUhlYWRlclZhbHVlKHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlLnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZS52YWx1ZSA9IHRoaXMubGlibWltZS5kZWNvZGVXb3Jkcyh2YWx1ZS52YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmtleXMoKHZhbHVlICYmIHZhbHVlLnBhcmFtcykgfHwge30pLmZvckVhY2goa2V5ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUucGFyYW1zW2tleV0gPSB0aGlzLmxpYm1pbWUuZGVjb2RlV29yZHModmFsdWUucGFyYW1zW2tleV0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoRSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZSwga2VlcCBhcyBpc1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAnZGF0ZSc6IHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGRhdGVWYWx1ZSA9IG5ldyBEYXRlKHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzTmFOKGRhdGVWYWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRhdGUgcGFyc2luZyBmYWlsZWQgOlNcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGVWYWx1ZSA9IG5ldyBEYXRlKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBkYXRlVmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXNlICdzdWJqZWN0JzpcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gdGhpcy5saWJtaW1lLmRlY29kZVdvcmRzKHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoRSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlLCBrZWVwIGFzIGlzXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAncmVmZXJlbmNlcyc6XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHRoaXMubGlibWltZS5kZWNvZGVXb3Jkcyh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsdWUuc3BsaXQoL1xccysvKS5tYXAodGhpcy5lbnN1cmVNZXNzYWdlSURGb3JtYXQpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICdtZXNzYWdlLWlkJzpcbiAgICAgICAgICAgICAgICBjYXNlICdpbi1yZXBseS10byc6XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHRoaXMubGlibWltZS5kZWNvZGVXb3Jkcyh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlID0gdGhpcy5lbnN1cmVNZXNzYWdlSURGb3JtYXQodmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICdwcmlvcml0eSc6XG4gICAgICAgICAgICAgICAgY2FzZSAneC1wcmlvcml0eSc6XG4gICAgICAgICAgICAgICAgY2FzZSAneC1tc21haWwtcHJpb3JpdHknOlxuICAgICAgICAgICAgICAgIGNhc2UgJ2ltcG9ydGFuY2UnOlxuICAgICAgICAgICAgICAgICAgICBrZXkgPSAncHJpb3JpdHknO1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHRoaXMucGFyc2VQcmlvcml0eSh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ2Zyb20nOlxuICAgICAgICAgICAgICAgIGNhc2UgJ3RvJzpcbiAgICAgICAgICAgICAgICBjYXNlICdjYyc6XG4gICAgICAgICAgICAgICAgY2FzZSAnYmNjJzpcbiAgICAgICAgICAgICAgICBjYXNlICdzZW5kZXInOlxuICAgICAgICAgICAgICAgIGNhc2UgJ3JlcGx5LXRvJzpcbiAgICAgICAgICAgICAgICBjYXNlICdkZWxpdmVyZWQtdG8nOlxuICAgICAgICAgICAgICAgIGNhc2UgJ3JldHVybi1wYXRoJzpcbiAgICAgICAgICAgICAgICBjYXNlICdkaXNwb3NpdGlvbi1ub3RpZmljYXRpb24tdG8nOlxuICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IGFkZHJlc3NwYXJzZXIodmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRlY29kZUFkZHJlc3Nlcyh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBodG1sOiB0aGlzLmdldEFkZHJlc3Nlc0hUTUwodmFsdWUpLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGV4dDogdGhpcy5nZXRBZGRyZXNzZXNUZXh0KHZhbHVlKVxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gaGFuZGxlIGxpc3QtKiBrZXlzXG4gICAgICAgICAgICBpZiAoa2V5LnN1YnN0cigwLCA1KSA9PT0gJ2xpc3QtJykge1xuICAgICAgICAgICAgICAgIHZhbHVlID0gdGhpcy5wYXJzZUxpc3RIZWFkZXIoa2V5LnN1YnN0cig1KSwgdmFsdWUpO1xuICAgICAgICAgICAgICAgIGtleSA9ICdsaXN0JztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFoZWFkZXJzLmhhcyhrZXkpKSB7XG4gICAgICAgICAgICAgICAgICAgIGhlYWRlcnMuc2V0KGtleSwgW10uY29uY2F0KHZhbHVlIHx8IFtdKSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgICBoZWFkZXJzLnNldChrZXksIGhlYWRlcnMuZ2V0KGtleSkuY29uY2F0KHZhbHVlKSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgaGVhZGVycy5nZXQoa2V5KS5wdXNoKHZhbHVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIGtlZXAgb25seSB0aGUgZmlyc3QgdmFsdWVcbiAgICAgICAgbGV0IHNpbmdsZUtleXMgPSBbXG4gICAgICAgICAgICAnbWVzc2FnZS1pZCcsXG4gICAgICAgICAgICAnY29udGVudC1pZCcsXG4gICAgICAgICAgICAnZnJvbScsXG4gICAgICAgICAgICAnc2VuZGVyJyxcbiAgICAgICAgICAgICdpbi1yZXBseS10bycsXG4gICAgICAgICAgICAncmVwbHktdG8nLFxuICAgICAgICAgICAgJ3N1YmplY3QnLFxuICAgICAgICAgICAgJ2RhdGUnLFxuICAgICAgICAgICAgJ2NvbnRlbnQtZGlzcG9zaXRpb24nLFxuICAgICAgICAgICAgJ2NvbnRlbnQtdHlwZScsXG4gICAgICAgICAgICAnY29udGVudC10cmFuc2Zlci1lbmNvZGluZycsXG4gICAgICAgICAgICAncHJpb3JpdHknLFxuICAgICAgICAgICAgJ21pbWUtdmVyc2lvbicsXG4gICAgICAgICAgICAnY29udGVudC1kZXNjcmlwdGlvbicsXG4gICAgICAgICAgICAncHJlY2VkZW5jZScsXG4gICAgICAgICAgICAnZXJyb3JzLXRvJyxcbiAgICAgICAgICAgICdkaXNwb3NpdGlvbi1ub3RpZmljYXRpb24tdG8nXG4gICAgICAgIF07XG5cbiAgICAgICAgaGVhZGVycy5mb3JFYWNoKCh2YWx1ZSwga2V5KSA9PiB7XG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICBpZiAoc2luZ2xlS2V5cy5pbmNsdWRlcyhrZXkpICYmIHZhbHVlLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICBoZWFkZXJzLnNldChrZXksIHZhbHVlW3ZhbHVlLmxlbmd0aCAtIDFdKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgICAgICAgICBoZWFkZXJzLnNldChrZXksIHZhbHVlWzBdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChrZXkgPT09ICdsaXN0Jykge1xuICAgICAgICAgICAgICAgIC8vIG5vcm1hbGl6ZSBMaXN0LSogaGVhZGVyc1xuICAgICAgICAgICAgICAgIGxldCBsaXN0VmFsdWUgPSB7fTtcbiAgICAgICAgICAgICAgICBbXS5jb25jYXQodmFsdWUgfHwgW10pLmZvckVhY2godmFsID0+IHtcbiAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmtleXModmFsIHx8IHt9KS5mb3JFYWNoKGxpc3RLZXkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGlzdFZhbHVlW2xpc3RLZXldID0gdmFsW2xpc3RLZXldO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBoZWFkZXJzLnNldChrZXksIGxpc3RWYWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBoZWFkZXJzO1xuICAgIH1cblxuICAgIHBhcnNlTGlzdEhlYWRlcihrZXksIHZhbHVlKSB7XG4gICAgICAgIGxldCBhZGRyZXNzZXMgPSBhZGRyZXNzcGFyc2VyKHZhbHVlKTtcbiAgICAgICAgbGV0IHJlc3BvbnNlID0ge307XG4gICAgICAgIGxldCBkYXRhID0gYWRkcmVzc2VzXG4gICAgICAgICAgICAubWFwKGFkZHJlc3MgPT4ge1xuICAgICAgICAgICAgICAgIGlmICgvXmh0dHBzPzovaS50ZXN0KGFkZHJlc3MubmFtZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UudXJsID0gYWRkcmVzcy5uYW1lO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYWRkcmVzcy5uYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLm5hbWUgPSBhZGRyZXNzLm5hbWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICgvXm1haWx0bzovLnRlc3QoYWRkcmVzcy5hZGRyZXNzKSkge1xuICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5tYWlsID0gYWRkcmVzcy5hZGRyZXNzLnN1YnN0cig3KTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGFkZHJlc3MuYWRkcmVzcyAmJiBhZGRyZXNzLmFkZHJlc3MuaW5kZXhPZignQCcpIDwgMCkge1xuICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5pZCA9IGFkZHJlc3MuYWRkcmVzcztcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGFkZHJlc3MuYWRkcmVzcykge1xuICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5tYWlsID0gYWRkcmVzcy5hZGRyZXNzO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoT2JqZWN0LmtleXMocmVzcG9uc2UpLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzcG9uc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAuZmlsdGVyKGFkZHJlc3MgPT4gYWRkcmVzcyk7XG4gICAgICAgIGlmIChkYXRhLmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBba2V5XTogcmVzcG9uc2VcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHBhcnNlUHJpb3JpdHkodmFsdWUpIHtcbiAgICAgICAgdmFsdWUgPSB2YWx1ZS50b0xvd2VyQ2FzZSgpLnRyaW0oKTtcbiAgICAgICAgaWYgKCFpc05hTihwYXJzZUludCh2YWx1ZSwgMTApKSkge1xuICAgICAgICAgICAgLy8gc3VwcG9ydCBcIlgtUHJpb3JpdHk6IDEgKEhpZ2hlc3QpXCJcbiAgICAgICAgICAgIHZhbHVlID0gcGFyc2VJbnQodmFsdWUsIDEwKSB8fCAwO1xuICAgICAgICAgICAgaWYgKHZhbHVlID09PSAzKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICdub3JtYWwnO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSA+IDMpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ2xvdyc7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiAnaGlnaCc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzd2l0Y2ggKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAnbm9uLXVyZ2VudCc6XG4gICAgICAgICAgICAgICAgY2FzZSAnbG93JzpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdsb3cnO1xuICAgICAgICAgICAgICAgIGNhc2UgJ3VyZ2VudCc6XG4gICAgICAgICAgICAgICAgY2FzZSAnaGlnaCc6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAnaGlnaCc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICdub3JtYWwnO1xuICAgIH1cblxuICAgIGVuc3VyZU1lc3NhZ2VJREZvcm1hdCh2YWx1ZSkge1xuICAgICAgICBpZiAoIXZhbHVlLmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHZhbHVlLmNoYXJBdCgwKSAhPT0gJzwnKSB7XG4gICAgICAgICAgICB2YWx1ZSA9ICc8JyArIHZhbHVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHZhbHVlLmNoYXJBdCh2YWx1ZS5sZW5ndGggLSAxKSAhPT0gJz4nKSB7XG4gICAgICAgICAgICB2YWx1ZSArPSAnPic7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuXG4gICAgZGVjb2RlQWRkcmVzc2VzKGFkZHJlc3Nlcykge1xuICAgICAgICBsZXQgcHJvY2Vzc2VkQWRkcmVzcyA9IG5ldyBXZWFrU2V0KCk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYWRkcmVzc2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgYWRkcmVzcyA9IGFkZHJlc3Nlc1tpXTtcbiAgICAgICAgICAgIGFkZHJlc3MubmFtZSA9IChhZGRyZXNzLm5hbWUgfHwgJycpLnRvU3RyaW5nKCkudHJpbSgpO1xuXG4gICAgICAgICAgICBpZiAoIWFkZHJlc3MuYWRkcmVzcyAmJiAvXig9XFw/KFteP10rKVxcP1tCYl1cXD9bXj9dKlxcPz0pKFxccyo9XFw/KFteP10rKVxcP1tCYl1cXD9bXj9dKlxcPz0pKiQvLnRlc3QoYWRkcmVzcy5uYW1lKSAmJiAhcHJvY2Vzc2VkQWRkcmVzcy5oYXMoYWRkcmVzcykpIHtcbiAgICAgICAgICAgICAgICBsZXQgcGFyc2VkID0gYWRkcmVzc3BhcnNlcih0aGlzLmxpYm1pbWUuZGVjb2RlV29yZHMoYWRkcmVzcy5uYW1lKSk7XG4gICAgICAgICAgICAgICAgaWYgKHBhcnNlZC5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgcGFyc2VkLmZvckVhY2goZW50cnkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc2VkQWRkcmVzcy5hZGQoZW50cnkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzc2VzLnB1c2goZW50cnkpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyByZW1vdmUgY3VycmVudCBlbGVtZW50XG4gICAgICAgICAgICAgICAgYWRkcmVzc2VzLnNwbGljZShpLCAxKTtcbiAgICAgICAgICAgICAgICBpLS07XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChhZGRyZXNzLm5hbWUpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBhZGRyZXNzLm5hbWUgPSB0aGlzLmxpYm1pbWUuZGVjb2RlV29yZHMoYWRkcmVzcy5uYW1lKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChFKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vaWdub3JlLCBrZWVwIGFzIGlzXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKC9AeG4tLS8udGVzdChhZGRyZXNzLmFkZHJlc3MpKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgYWRkcmVzcy5hZGRyZXNzID1cbiAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3MuYWRkcmVzcy5zdWJzdHIoMCwgYWRkcmVzcy5hZGRyZXNzLmxhc3RJbmRleE9mKCdAJykgKyAxKSArXG4gICAgICAgICAgICAgICAgICAgICAgICBwdW55Y29kZS50b1VuaWNvZGUoYWRkcmVzcy5hZGRyZXNzLnN1YnN0cihhZGRyZXNzLmFkZHJlc3MubGFzdEluZGV4T2YoJ0AnKSArIDEpKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChFKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIE5vdCBhIHZhbGlkIHB1bnljb2RlIHN0cmluZzsga2VlcCBhcyBpc1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChhZGRyZXNzLmdyb3VwKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kZWNvZGVBZGRyZXNzZXMoYWRkcmVzcy5ncm91cCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBjcmVhdGVOb2RlKG5vZGUpIHtcbiAgICAgICAgbGV0IGNvbnRlbnRUeXBlID0gbm9kZS5jb250ZW50VHlwZTtcbiAgICAgICAgbGV0IGRpc3Bvc2l0aW9uID0gbm9kZS5kaXNwb3NpdGlvbjtcbiAgICAgICAgbGV0IGVuY29kaW5nID0gbm9kZS5lbmNvZGluZztcbiAgICAgICAgbGV0IGNoYXJzZXQgPSBub2RlLmNoYXJzZXQ7XG5cbiAgICAgICAgaWYgKCFjb250ZW50VHlwZSAmJiBub2RlLnJvb3QpIHtcbiAgICAgICAgICAgIGNvbnRlbnRUeXBlID0gJ3RleHQvcGxhaW4nO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IG5ld05vZGUgPSB7XG4gICAgICAgICAgICBub2RlLFxuICAgICAgICAgICAgaGVhZGVyTGluZXM6IG5vZGUuaGVhZGVycy5saW5lcyxcbiAgICAgICAgICAgIGhlYWRlcnM6IHRoaXMucHJvY2Vzc0hlYWRlcnMobm9kZS5oZWFkZXJzLmdldExpc3QoKSksXG4gICAgICAgICAgICBjb250ZW50VHlwZSxcbiAgICAgICAgICAgIGNoaWxkcmVuOiBbXVxuICAgICAgICB9O1xuXG4gICAgICAgIGlmICghL15tdWx0aXBhcnRcXC8vaS50ZXN0KGNvbnRlbnRUeXBlKSkge1xuICAgICAgICAgICAgaWYgKGRpc3Bvc2l0aW9uICYmICFbJ2F0dGFjaG1lbnQnLCAnaW5saW5lJ10uaW5jbHVkZXMoZGlzcG9zaXRpb24pKSB7XG4gICAgICAgICAgICAgICAgZGlzcG9zaXRpb24gPSAnYXR0YWNobWVudCc7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICghZGlzcG9zaXRpb24gJiYgIXRoaXMudGV4dFR5cGVzLmluY2x1ZGVzKGNvbnRlbnRUeXBlKSkge1xuICAgICAgICAgICAgICAgIG5ld05vZGUuZGlzcG9zaXRpb24gPSAnYXR0YWNobWVudCc7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIG5ld05vZGUuZGlzcG9zaXRpb24gPSBkaXNwb3NpdGlvbiB8fCAnaW5saW5lJztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbmV3Tm9kZS5pc0F0dGFjaG1lbnQgPSAhdGhpcy50ZXh0VHlwZXMuaW5jbHVkZXMoY29udGVudFR5cGUpIHx8IG5ld05vZGUuZGlzcG9zaXRpb24gIT09ICdpbmxpbmUnO1xuXG4gICAgICAgICAgICBuZXdOb2RlLmVuY29kaW5nID0gWydxdW90ZWQtcHJpbnRhYmxlJywgJ2Jhc2U2NCddLmluY2x1ZGVzKGVuY29kaW5nKSA/IGVuY29kaW5nIDogJ2JpbmFyeSc7XG5cbiAgICAgICAgICAgIGlmIChjaGFyc2V0KSB7XG4gICAgICAgICAgICAgICAgbmV3Tm9kZS5jaGFyc2V0ID0gY2hhcnNldDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbGV0IGRlY29kZXIgPSBub2RlLmdldERlY29kZXIoKTtcbiAgICAgICAgICAgIGRlY29kZXIub24oJ2VuZCcsICgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmRlY29kZXJFbmRlZCA9IHRydWU7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIG5ld05vZGUuZGVjb2RlciA9IGRlY29kZXI7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobm9kZS5yb290KSB7XG4gICAgICAgICAgICB0aGlzLmhlYWRlcnMgPSBuZXdOb2RlLmhlYWRlcnM7XG4gICAgICAgICAgICB0aGlzLmhlYWRlckxpbmVzID0gbmV3Tm9kZS5oZWFkZXJMaW5lcztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGZpbmQgbG9jYXRpb24gaW4gdHJlZVxuXG4gICAgICAgIGlmICghdGhpcy50cmVlKSB7XG4gICAgICAgICAgICBuZXdOb2RlLnJvb3QgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5jdXJub2RlID0gdGhpcy50cmVlID0gbmV3Tm9kZTtcbiAgICAgICAgICAgIHJldHVybiBuZXdOb2RlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gaW1tZWRpYXRlIGNoaWxkIG9mIHJvb3Qgbm9kZVxuICAgICAgICBpZiAoIXRoaXMuY3Vybm9kZS5wYXJlbnQpIHtcbiAgICAgICAgICAgIG5ld05vZGUucGFyZW50ID0gdGhpcy5jdXJub2RlO1xuICAgICAgICAgICAgdGhpcy5jdXJub2RlLmNoaWxkcmVuLnB1c2gobmV3Tm9kZSk7XG4gICAgICAgICAgICB0aGlzLmN1cm5vZGUgPSBuZXdOb2RlO1xuICAgICAgICAgICAgcmV0dXJuIG5ld05vZGU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBzaWJsaW5nc1xuICAgICAgICBpZiAodGhpcy5jdXJub2RlLnBhcmVudC5ub2RlID09PSBub2RlLnBhcmVudE5vZGUpIHtcbiAgICAgICAgICAgIG5ld05vZGUucGFyZW50ID0gdGhpcy5jdXJub2RlLnBhcmVudDtcbiAgICAgICAgICAgIHRoaXMuY3Vybm9kZS5wYXJlbnQuY2hpbGRyZW4ucHVzaChuZXdOb2RlKTtcbiAgICAgICAgICAgIHRoaXMuY3Vybm9kZSA9IG5ld05vZGU7XG4gICAgICAgICAgICByZXR1cm4gbmV3Tm9kZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGZpcnN0IGNoaWxkXG4gICAgICAgIGlmICh0aGlzLmN1cm5vZGUubm9kZSA9PT0gbm9kZS5wYXJlbnROb2RlKSB7XG4gICAgICAgICAgICBuZXdOb2RlLnBhcmVudCA9IHRoaXMuY3Vybm9kZTtcbiAgICAgICAgICAgIHRoaXMuY3Vybm9kZS5jaGlsZHJlbi5wdXNoKG5ld05vZGUpO1xuICAgICAgICAgICAgdGhpcy5jdXJub2RlID0gbmV3Tm9kZTtcbiAgICAgICAgICAgIHJldHVybiBuZXdOb2RlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gbW92ZSB1cFxuICAgICAgICBsZXQgcGFyZW50Tm9kZSA9IHRoaXMuY3Vybm9kZTtcbiAgICAgICAgd2hpbGUgKChwYXJlbnROb2RlID0gcGFyZW50Tm9kZS5wYXJlbnQpKSB7XG4gICAgICAgICAgICBpZiAocGFyZW50Tm9kZS5ub2RlID09PSBub2RlLnBhcmVudE5vZGUpIHtcbiAgICAgICAgICAgICAgICBuZXdOb2RlLnBhcmVudCA9IHBhcmVudE5vZGU7XG4gICAgICAgICAgICAgICAgcGFyZW50Tm9kZS5jaGlsZHJlbi5wdXNoKG5ld05vZGUpO1xuICAgICAgICAgICAgICAgIHRoaXMuY3Vybm9kZSA9IG5ld05vZGU7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ld05vZGU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBzaG91bGQgbmV2ZXIgaGFwcGVuLCBjYW4ndCBkZXRlY3QgcGFyZW50XG4gICAgICAgIHRoaXMuY3Vybm9kZSA9IG5ld05vZGU7XG4gICAgICAgIHJldHVybiBuZXdOb2RlO1xuICAgIH1cblxuICAgIGdldFRleHRDb250ZW50KCkge1xuICAgICAgICBsZXQgdGV4dCA9IFtdO1xuICAgICAgICBsZXQgaHRtbCA9IFtdO1xuICAgICAgICBsZXQgcHJvY2Vzc05vZGUgPSAoYWx0ZXJuYXRpdmUsIGxldmVsLCBub2RlKSA9PiB7XG4gICAgICAgICAgICBpZiAobm9kZS5zaG93TWV0YSkge1xuICAgICAgICAgICAgICAgIGxldCBtZXRhID0gWydGcm9tJywgJ1N1YmplY3QnLCAnRGF0ZScsICdUbycsICdDYycsICdCY2MnXVxuICAgICAgICAgICAgICAgICAgICAubWFwKGZrZXkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGtleSA9IGZrZXkudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbm9kZS5oZWFkZXJzLmhhcyhrZXkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHZhbHVlID0gbm9kZS5oZWFkZXJzLmdldChrZXkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF2YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5OiBma2V5LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBBcnJheS5pc0FycmF5KHZhbHVlKSA/IHZhbHVlW3ZhbHVlLmxlbmd0aCAtIDFdIDogdmFsdWVcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoZW50cnkgPT4gZW50cnkpO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmhhc0h0bWwpIHtcbiAgICAgICAgICAgICAgICAgICAgaHRtbC5wdXNoKFxuICAgICAgICAgICAgICAgICAgICAgICAgJzx0YWJsZSBjbGFzcz1cIm1wX2hlYWRcIj4nICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAoZW50cnkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHZhbHVlID0gZW50cnkudmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGVudHJ5LmtleSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ0Zyb20nOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ1RvJzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdDYyc6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnQmNjJzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS5odG1sO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdEYXRlJzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSB0aGlzLm9wdGlvbnMuZm9ybWF0RGF0ZVN0cmluZyA/IHRoaXMub3B0aW9ucy5mb3JtYXREYXRlU3RyaW5nKHZhbHVlKSA6IHZhbHVlLnRvVVRDU3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ1N1YmplY3QnOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9ICc8c3Ryb25nPicgKyBoZS5lbmNvZGUodmFsdWUpICsgJzwvc3Ryb25nPic7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gaGUuZW5jb2RlKHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICc8dHI+PHRkIGNsYXNzPVwibXBfaGVhZF9rZXlcIj4nICsgaGUuZW5jb2RlKGVudHJ5LmtleSkgKyAnOjwvdGQ+PHRkIGNsYXNzPVwibXBfaGVhZF92YWx1ZVwiPicgKyB2YWx1ZSArICc8dGQ+PC90cj4nO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuam9pbignXFxuJykgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICc8dGFibGU+J1xuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5oYXNUZXh0KSB7XG4gICAgICAgICAgICAgICAgICAgIHRleHQucHVzaChcbiAgICAgICAgICAgICAgICAgICAgICAgICdcXG4nICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAoZW50cnkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHZhbHVlID0gZW50cnkudmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGVudHJ5LmtleSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ0Zyb20nOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ1RvJzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdDYyc6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnQmNjJzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS50ZXh0O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdEYXRlJzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSB0aGlzLm9wdGlvbnMuZm9ybWF0RGF0ZVN0cmluZyA/IHRoaXMub3B0aW9ucy5mb3JtYXREYXRlU3RyaW5nKHZhbHVlKSA6IHZhbHVlLnRvVVRDU3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudHJ5LmtleSArICc6ICcgKyB2YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmpvaW4oJ1xcbicpICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXFxuJ1xuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChub2RlLnRleHRDb250ZW50KSB7XG4gICAgICAgICAgICAgICAgaWYgKG5vZGUuY29udGVudFR5cGUgPT09ICd0ZXh0L3BsYWluJykge1xuICAgICAgICAgICAgICAgICAgICB0ZXh0LnB1c2gobm9kZS50ZXh0Q29udGVudCk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghYWx0ZXJuYXRpdmUgJiYgdGhpcy5oYXNIdG1sKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBodG1sLnB1c2godGhpcy50ZXh0VG9IdG1sKG5vZGUudGV4dENvbnRlbnQpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobm9kZS5jb250ZW50VHlwZSA9PT0gJ21lc3NhZ2UvZGVsaXZlcnktc3RhdHVzJyAmJiAhdGhpcy5vcHRpb25zLmtlZXBEZWxpdmVyeVN0YXR1cykge1xuICAgICAgICAgICAgICAgICAgICB0ZXh0LnB1c2gobm9kZS50ZXh0Q29udGVudCk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghYWx0ZXJuYXRpdmUgJiYgdGhpcy5oYXNIdG1sKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBodG1sLnB1c2godGhpcy50ZXh0VG9IdG1sKG5vZGUudGV4dENvbnRlbnQpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobm9kZS5jb250ZW50VHlwZSA9PT0gJ3RleHQvaHRtbCcpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGZhaWxlZFRvUGFyc2VIdG1sID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIGlmICgoIWFsdGVybmF0aXZlICYmIHRoaXMuaGFzVGV4dCkgfHwgKG5vZGUucm9vdCAmJiAhdGhpcy5oYXNUZXh0KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5za2lwSHRtbFRvVGV4dCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQucHVzaCgnJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG5vZGUudGV4dENvbnRlbnQubGVuZ3RoID4gdGhpcy5vcHRpb25zLm1heEh0bWxMZW5ndGhUb1BhcnNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5lbWl0KCdlcnJvcicsIG5ldyBFcnJvcihgSFRNTCB0b28gbG9uZyBmb3IgcGFyc2luZyAke25vZGUudGV4dENvbnRlbnQubGVuZ3RofSBieXRlc2ApKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0LnB1c2goJ0ludmFsaWQgSFRNTCBjb250ZW50ICh0b28gbG9uZyknKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWlsZWRUb1BhcnNlSHRtbCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQucHVzaChodG1sVG9UZXh0KG5vZGUudGV4dENvbnRlbnQpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5lbWl0KCdlcnJvcicsIG5ldyBFcnJvcignRmFpbGVkIHRvIHBhcnNlIEhUTUwnKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQucHVzaCgnSW52YWxpZCBIVE1MIGNvbnRlbnQnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFpbGVkVG9QYXJzZUh0bWwgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoIWZhaWxlZFRvUGFyc2VIdG1sKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBodG1sLnB1c2gobm9kZS50ZXh0Q29udGVudCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhbHRlcm5hdGl2ZSA9IGFsdGVybmF0aXZlIHx8IG5vZGUuY29udGVudFR5cGUgPT09ICdtdWx0aXBhcnQvYWx0ZXJuYXRpdmUnO1xuICAgICAgICAgICAgaWYgKG5vZGUuY2hpbGRyZW4pIHtcbiAgICAgICAgICAgICAgICBub2RlLmNoaWxkcmVuLmZvckVhY2goc3ViTm9kZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHByb2Nlc3NOb2RlKGFsdGVybmF0aXZlLCBsZXZlbCArIDEsIHN1Yk5vZGUpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIHByb2Nlc3NOb2RlKGZhbHNlLCAwLCB0aGlzLnRyZWUpO1xuXG4gICAgICAgIGxldCByZXNwb25zZSA9IHtcbiAgICAgICAgICAgIHR5cGU6ICd0ZXh0J1xuICAgICAgICB9O1xuICAgICAgICBpZiAoaHRtbC5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMuaHRtbCA9IHJlc3BvbnNlLmh0bWwgPSBodG1sLmpvaW4oJzxici8+XFxuJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRleHQubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLnRleHQgPSByZXNwb25zZS50ZXh0ID0gdGV4dC5qb2luKCdcXG4nKTtcbiAgICAgICAgICAgIHRoaXMudGV4dEFzSHRtbCA9IHJlc3BvbnNlLnRleHRBc0h0bWwgPSB0ZXh0Lm1hcChwYXJ0ID0+IHRoaXMudGV4dFRvSHRtbChwYXJ0KSkuam9pbignPGJyLz5cXG4nKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzcG9uc2U7XG4gICAgfVxuXG4gICAgcHJvY2Vzc0NodW5rKGRhdGEsIGRvbmUpIHtcbiAgICAgICAgbGV0IHBhcnRJZCA9IG51bGw7XG4gICAgICAgIGlmIChkYXRhLl9wYXJlbnRCb3VuZGFyeSkge1xuICAgICAgICAgICAgcGFydElkID0gdGhpcy5fZ2V0UGFydElkKGRhdGEuX3BhcmVudEJvdW5kYXJ5KTtcbiAgICAgICAgfVxuICAgICAgICBzd2l0Y2ggKGRhdGEudHlwZSkge1xuICAgICAgICAgICAgY2FzZSAnbm9kZSc6IHtcbiAgICAgICAgICAgICAgICBsZXQgbm9kZSA9IHRoaXMuY3JlYXRlTm9kZShkYXRhKTtcbiAgICAgICAgICAgICAgICBpZiAobm9kZSA9PT0gdGhpcy50cmVlKSB7XG4gICAgICAgICAgICAgICAgICAgIFsnc3ViamVjdCcsICdyZWZlcmVuY2VzJywgJ2RhdGUnLCAndG8nLCAnZnJvbScsICd0bycsICdjYycsICdiY2MnLCAnbWVzc2FnZS1pZCcsICdpbi1yZXBseS10bycsICdyZXBseS10byddLmZvckVhY2goa2V5ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChub2RlLmhlYWRlcnMuaGFzKGtleSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzW2tleS5yZXBsYWNlKC8tKFthLXpdKS9nLCAobSwgYykgPT4gYy50b1VwcGVyQ2FzZSgpKV0gPSBub2RlLmhlYWRlcnMuZ2V0KGtleSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmVtaXQoJ2hlYWRlcnMnLCBub2RlLmhlYWRlcnMpO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChub2RlLmhlYWRlckxpbmVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmVtaXQoJ2hlYWRlckxpbmVzJywgbm9kZS5oZWFkZXJMaW5lcyk7XG4gICAgICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChkYXRhLmNvbnRlbnRUeXBlID09PSAnbWVzc2FnZS9yZmM4MjInICYmIGRhdGEubWVzc2FnZU5vZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKGRhdGEucGFyZW50Tm9kZSAmJiBkYXRhLnBhcmVudE5vZGUuY29udGVudFR5cGUgPT09ICdtZXNzYWdlL3JmYzgyMicpIHtcbiAgICAgICAgICAgICAgICAgICAgbm9kZS5zaG93TWV0YSA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKG5vZGUuaXNBdHRhY2htZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBjb250ZW50VHlwZSA9IG5vZGUuY29udGVudFR5cGU7XG4gICAgICAgICAgICAgICAgICAgIGlmIChub2RlLmNvbnRlbnRUeXBlID09PSAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJyAmJiBkYXRhLmZpbGVuYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50VHlwZSA9IHRoaXMubGlibWltZS5kZXRlY3RNaW1lVHlwZShkYXRhLmZpbGVuYW1lKSB8fCAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJztcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGxldCBhdHRhY2htZW50ID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2F0dGFjaG1lbnQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudDogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRUeXBlLFxuICAgICAgICAgICAgICAgICAgICAgICAgcGFydElkLFxuICAgICAgICAgICAgICAgICAgICAgICAgcmVsZWFzZTogKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dGFjaG1lbnQucmVsZWFzZSA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMud2FpdFVudGlsQXR0YWNobWVudEVuZCAmJiB0eXBlb2YgdGhpcy5hdHRhY2htZW50Q2FsbGJhY2sgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SW1tZWRpYXRlKHRoaXMuYXR0YWNobWVudENhbGxiYWNrKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hdHRhY2htZW50Q2FsbGJhY2sgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLndhaXRVbnRpbEF0dGFjaG1lbnRFbmQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgICAgICBsZXQgYWxnbyA9IHRoaXMub3B0aW9ucy5jaGVja3N1bUFsZ28gfHwgJ21kNSc7XG4gICAgICAgICAgICAgICAgICAgIGxldCBoYXNoZXIgPSBuZXcgU3RyZWFtSGFzaChhdHRhY2htZW50LCBhbGdvKTtcbiAgICAgICAgICAgICAgICAgICAgbm9kZS5kZWNvZGVyLm9uKCdlcnJvcicsIGVyciA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBoYXNoZXIuZW1pdCgnZXJyb3InLCBlcnIpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICBub2RlLmRlY29kZXIub24oJ3JlYWRhYmxlJywgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNodW5rO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoKGNodW5rID0gbm9kZS5kZWNvZGVyLnJlYWQoKSkgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNoZXIud3JpdGUoY2h1bmspO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICBub2RlLmRlY29kZXIub25jZSgnZW5kJywgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaGFzaGVyLmVuZCgpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICAvL25vZGUuZGVjb2Rlci5waXBlKGhhc2hlcik7XG4gICAgICAgICAgICAgICAgICAgIGF0dGFjaG1lbnQuY29udGVudCA9IGhhc2hlcjtcblxuICAgICAgICAgICAgICAgICAgICB0aGlzLndhaXRVbnRpbEF0dGFjaG1lbnRFbmQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YS5kaXNwb3NpdGlvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgYXR0YWNobWVudC5jb250ZW50RGlzcG9zaXRpb24gPSBkYXRhLmRpc3Bvc2l0aW9uO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGEuZmlsZW5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGF0dGFjaG1lbnQuZmlsZW5hbWUgPSBkYXRhLmZpbGVuYW1lO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKG5vZGUuaGVhZGVycy5oYXMoJ2NvbnRlbnQtaWQnKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYXR0YWNobWVudC5jb250ZW50SWQgPSBbXS5jb25jYXQobm9kZS5oZWFkZXJzLmdldCgnY29udGVudC1pZCcpIHx8IFtdKS5zaGlmdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYXR0YWNobWVudC5jaWQgPSBhdHRhY2htZW50LmNvbnRlbnRJZC50cmltKCkucmVwbGFjZSgvXjx8PiQvZywgJycpLnRyaW0oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNoZWNrIGlmIHRoZSBhdHRhY2htZW50IGlzIFwicmVsYXRlZFwiIHRvIHRleHQgY29udGVudCBsaWtlIGFuIGVtYmVkZGVkIGltYWdlIGV0Y1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHBhcmVudE5vZGUgPSBub2RlO1xuICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKChwYXJlbnROb2RlID0gcGFyZW50Tm9kZS5wYXJlbnQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmVudE5vZGUuY29udGVudFR5cGUgPT09ICdtdWx0aXBhcnQvcmVsYXRlZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0YWNobWVudC5yZWxhdGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBhdHRhY2htZW50LmhlYWRlcnMgPSBub2RlLmhlYWRlcnM7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucHVzaChhdHRhY2htZW50KTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hdHRhY2htZW50TGlzdC5wdXNoKGF0dGFjaG1lbnQpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobm9kZS5kaXNwb3NpdGlvbiA9PT0gJ2lubGluZScpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGNodW5rcyA9IFtdO1xuICAgICAgICAgICAgICAgICAgICBsZXQgY2h1bmtsZW4gPSAwO1xuICAgICAgICAgICAgICAgICAgICBub2RlLmNvbnRlbnRTdHJlYW0gPSBub2RlLmRlY29kZXI7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKG5vZGUuY29udGVudFR5cGUgPT09ICd0ZXh0L3BsYWluJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5oYXNUZXh0ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChub2RlLmNvbnRlbnRUeXBlID09PSAndGV4dC9odG1sJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5oYXNIdG1sID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChub2RlLmNvbnRlbnRUeXBlID09PSAnbWVzc2FnZS9kZWxpdmVyeS1zdGF0dXMnICYmICF0aGlzLm9wdGlvbnMua2VlcERlbGl2ZXJ5U3RhdHVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmhhc1RleHQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKG5vZGUubm9kZS5mbG93ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjb250ZW50U3RyZWFtID0gbm9kZS5jb250ZW50U3RyZWFtO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGZsb3dEZWNvZGVyID0gbmV3IEZsb3dlZERlY29kZXIoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbFNwOiBub2RlLm5vZGUuZGVsU3BcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudFN0cmVhbS5vbignZXJyb3InLCBlcnIgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb3dEZWNvZGVyLmVtaXQoJ2Vycm9yJywgZXJyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudFN0cmVhbS5waXBlKGZsb3dEZWNvZGVyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUuY29udGVudFN0cmVhbSA9IGZsb3dEZWNvZGVyO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgbGV0IGNoYXJzZXQgPSBub2RlLmNoYXJzZXQgfHwgJ3V0Zi04JztcbiAgICAgICAgICAgICAgICAgICAgLy9jaGFyc2V0ID0gY2hhcnNldCB8fCAnd2luZG93cy0xMjU3JztcblxuICAgICAgICAgICAgICAgICAgICBpZiAoIVsnYXNjaWknLCAndXNhc2NpaScsICd1dGY4J10uaW5jbHVkZXMoY2hhcnNldC50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoL1teYS16MC05XSsvZywgJycpKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgY29udGVudFN0cmVhbSA9IG5vZGUuY29udGVudFN0cmVhbTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZGVjb2RlU3RyZWFtID0gdGhpcy5kZWNvZGVyLmRlY29kZVN0cmVhbShjaGFyc2V0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50U3RyZWFtLm9uKCdlcnJvcicsIGVyciA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZVN0cmVhbS5lbWl0KCdlcnJvcicsIGVycik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudFN0cmVhbS5waXBlKGRlY29kZVN0cmVhbSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS5jb250ZW50U3RyZWFtID0gZGVjb2RlU3RyZWFtO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoRSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRvIG5vdCBkZWNvZGUgY2hhcnNldFxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgbm9kZS5jb250ZW50U3RyZWFtLm9uKCdyZWFkYWJsZScsICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjaHVuaztcbiAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICgoY2h1bmsgPSBub2RlLmNvbnRlbnRTdHJlYW0ucmVhZCgpKSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgY2h1bmsgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNodW5rID0gQnVmZmVyLmZyb20oY2h1bmspO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaHVua3MucHVzaChjaHVuayk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2h1bmtsZW4gKz0gY2h1bmsubGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICBub2RlLmNvbnRlbnRTdHJlYW0ub25jZSgnZW5kJywgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS50ZXh0Q29udGVudCA9IEJ1ZmZlci5jb25jYXQoY2h1bmtzLCBjaHVua2xlbikudG9TdHJpbmcoKS5yZXBsYWNlKC9cXHI/XFxuL2csICdcXG4nKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgbm9kZS5jb250ZW50U3RyZWFtLm9uY2UoJ2Vycm9yJywgZXJyID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZW1pdCgnZXJyb3InLCBlcnIpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY2FzZSAnZGF0YSc6XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuY3Vybm9kZSAmJiB0aGlzLmN1cm5vZGUuZGVjb2Rlcikge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cm5vZGUuZGVjb2Rlci5lbmQoKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAodGhpcy53YWl0VW50aWxBdHRhY2htZW50RW5kKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYXR0YWNobWVudENhbGxiYWNrID0gZG9uZTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIG11bHRpcGFydCBtZXNzYWdlIHN0cnVjdHVyZVxuICAgICAgICAgICAgICAgIC8vIHRoaXMgaXMgbm90IHJlbGF0ZWQgdG8gYW55IHNwZWNpZmljICdub2RlJyBibG9jayBhcyBpdCBpbmNsdWRlc1xuICAgICAgICAgICAgICAgIC8vIGV2ZXJ5dGhpbmcgYmV0d2VlbiB0aGUgZW5kIG9mIHNvbWUgbm9kZSBib2R5IGFuZCBiZXR3ZWVuIHRoZSBuZXh0IGhlYWRlclxuICAgICAgICAgICAgICAgIC8vcHJvY2Vzcy5zdGRvdXQud3JpdGUoZGF0YS52YWx1ZSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIGNhc2UgJ2JvZHknOlxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmN1cm5vZGUgJiYgdGhpcy5jdXJub2RlLmRlY29kZXIgJiYgdGhpcy5jdXJub2RlLmRlY29kZXIud3JpdGFibGUpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuY3Vybm9kZS5kZWNvZGVyLndyaXRlKGRhdGEudmFsdWUpID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY3Vybm9kZS5kZWNvZGVyLm9uY2UoJ2RyYWluJywgZG9uZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBMZWFmIGVsZW1lbnQgYm9keS4gSW5jbHVkZXMgdGhlIGJvZHkgZm9yIHRoZSBsYXN0ICdub2RlJyBibG9jay4gWW91IG1pZ2h0XG4gICAgICAgICAgICAgICAgLy8gaGF2ZSBzZXZlcmFsICdib2R5JyBjYWxscyBmb3IgYSBzaW5nbGUgJ25vZGUnIGJsb2NrXG4gICAgICAgICAgICAgICAgLy9wcm9jZXNzLnN0ZG91dC53cml0ZShkYXRhLnZhbHVlKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIHNldEltbWVkaWF0ZShkb25lKTtcbiAgICB9XG5cbiAgICBfZ2V0UGFydElkKHBhcmVudEJvdW5kYXJ5KSB7XG4gICAgICAgIGxldCBib3VuZGFyeUluZGV4ID0gdGhpcy5ib3VuZGFyaWVzLmZpbmRJbmRleChpdGVtID0+IGl0ZW0ubmFtZSA9PT0gcGFyZW50Qm91bmRhcnkpO1xuICAgICAgICBpZiAoYm91bmRhcnlJbmRleCA9PT0gLTEpIHtcbiAgICAgICAgICAgIHRoaXMuYm91bmRhcmllcy5wdXNoKHsgbmFtZTogcGFyZW50Qm91bmRhcnksIGNvdW50OiAxIH0pO1xuICAgICAgICAgICAgYm91bmRhcnlJbmRleCA9IHRoaXMuYm91bmRhcmllcy5sZW5ndGggLSAxO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5ib3VuZGFyaWVzW2JvdW5kYXJ5SW5kZXhdLmNvdW50Kys7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHBhcnRJZCA9ICcxJztcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPD0gYm91bmRhcnlJbmRleDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoaSA9PT0gMCkgcGFydElkID0gdGhpcy5ib3VuZGFyaWVzW2ldLmNvdW50LnRvU3RyaW5nKCk7XG4gICAgICAgICAgICBlbHNlIHBhcnRJZCArPSAnLicgKyB0aGlzLmJvdW5kYXJpZXNbaV0uY291bnQudG9TdHJpbmcoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcGFydElkO1xuICAgIH1cblxuICAgIGdldEFkZHJlc3Nlc0hUTUwodmFsdWUpIHtcbiAgICAgICAgbGV0IGZvcm1hdFNpbmdsZUxldmVsID0gYWRkcmVzc2VzID0+XG4gICAgICAgICAgICBhZGRyZXNzZXNcbiAgICAgICAgICAgICAgICAubWFwKGFkZHJlc3MgPT4ge1xuICAgICAgICAgICAgICAgICAgICBsZXQgc3RyID0gJzxzcGFuIGNsYXNzPVwibXBfYWRkcmVzc19ncm91cFwiPic7XG4gICAgICAgICAgICAgICAgICAgIGlmIChhZGRyZXNzLm5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0ciArPSAnPHNwYW4gY2xhc3M9XCJtcF9hZGRyZXNzX25hbWVcIj4nICsgaGUuZW5jb2RlKGFkZHJlc3MubmFtZSkgKyAoYWRkcmVzcy5ncm91cCA/ICc6ICcgOiAnJykgKyAnPC9zcGFuPic7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKGFkZHJlc3MuYWRkcmVzcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGxpbmsgPSAnPGEgaHJlZj1cIm1haWx0bzonICsgaGUuZW5jb2RlKGFkZHJlc3MuYWRkcmVzcykgKyAnXCIgY2xhc3M9XCJtcF9hZGRyZXNzX2VtYWlsXCI+JyArIGhlLmVuY29kZShhZGRyZXNzLmFkZHJlc3MpICsgJzwvYT4nO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFkZHJlc3MubmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ciArPSAnICZsdDsnICsgbGluayArICcmZ3Q7JztcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyICs9IGxpbms7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKGFkZHJlc3MuZ3JvdXApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0ciArPSBmb3JtYXRTaW5nbGVMZXZlbChhZGRyZXNzLmdyb3VwKSArICc7JztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RyICsgJzwvc3Bhbj4nO1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgLmpvaW4oJywgJyk7XG4gICAgICAgIHJldHVybiBmb3JtYXRTaW5nbGVMZXZlbChbXS5jb25jYXQodmFsdWUgfHwgW10pKTtcbiAgICB9XG5cbiAgICBnZXRBZGRyZXNzZXNUZXh0KHZhbHVlKSB7XG4gICAgICAgIGxldCBmb3JtYXRTaW5nbGVMZXZlbCA9IGFkZHJlc3NlcyA9PlxuICAgICAgICAgICAgYWRkcmVzc2VzXG4gICAgICAgICAgICAgICAgLm1hcChhZGRyZXNzID0+IHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHN0ciA9ICcnO1xuICAgICAgICAgICAgICAgICAgICBpZiAoYWRkcmVzcy5uYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdHIgKz0gYFwiJHthZGRyZXNzLm5hbWV9XCJgICsgKGFkZHJlc3MuZ3JvdXAgPyAnOiAnIDogJycpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChhZGRyZXNzLmFkZHJlc3MpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBsaW5rID0gYWRkcmVzcy5hZGRyZXNzO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFkZHJlc3MubmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ciArPSAnIDwnICsgbGluayArICc+JztcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyICs9IGxpbms7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKGFkZHJlc3MuZ3JvdXApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0ciArPSBmb3JtYXRTaW5nbGVMZXZlbChhZGRyZXNzLmdyb3VwKSArICc7JztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RyO1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgLmpvaW4oJywgJyk7XG4gICAgICAgIHJldHVybiBmb3JtYXRTaW5nbGVMZXZlbChbXS5jb25jYXQodmFsdWUgfHwgW10pKTtcbiAgICB9XG5cbiAgICB1cGRhdGVJbWFnZUxpbmtzKHJlcGxhY2VDYWxsYmFjaywgZG9uZSkge1xuICAgICAgICBpZiAoIXRoaXMuaHRtbCkge1xuICAgICAgICAgICAgcmV0dXJuIHNldEltbWVkaWF0ZSgoKSA9PiBkb25lKG51bGwsIGZhbHNlKSk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgY2lkcyA9IG5ldyBNYXAoKTtcbiAgICAgICAgbGV0IGh0bWwgPSAodGhpcy5odG1sIHx8ICcnKS50b1N0cmluZygpO1xuXG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMuc2tpcEltYWdlTGlua3MpIHtcbiAgICAgICAgICAgIHJldHVybiBkb25lKG51bGwsIGh0bWwpO1xuICAgICAgICB9XG5cbiAgICAgICAgaHRtbC5yZXBsYWNlKC9cXGJjaWQ6KFteJ1wiXFxzXXsxLDI1Nn0pL2csIChtYXRjaCwgY2lkKSA9PiB7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMCwgbGVuID0gdGhpcy5hdHRhY2htZW50TGlzdC5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmF0dGFjaG1lbnRMaXN0W2ldLmNpZCA9PT0gY2lkICYmIC9eaW1hZ2VcXC9bXFx3XSskL2kudGVzdCh0aGlzLmF0dGFjaG1lbnRMaXN0W2ldLmNvbnRlbnRUeXBlKSkge1xuICAgICAgICAgICAgICAgICAgICBjaWRzLnNldChjaWQsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGF0dGFjaG1lbnQ6IHRoaXMuYXR0YWNobWVudExpc3RbaV1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBtYXRjaDtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgbGV0IGNpZExpc3QgPSBbXTtcbiAgICAgICAgY2lkcy5mb3JFYWNoKGVudHJ5ID0+IHtcbiAgICAgICAgICAgIGNpZExpc3QucHVzaChlbnRyeSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGxldCBwb3MgPSAwO1xuICAgICAgICBsZXQgcHJvY2Vzc05leHQgPSAoKSA9PiB7XG4gICAgICAgICAgICBpZiAocG9zID49IGNpZExpc3QubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgaHRtbCA9IGh0bWwucmVwbGFjZSgvXFxiY2lkOihbXidcIlxcc117MSwyNTZ9KS9nLCAobWF0Y2gsIGNpZCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoY2lkcy5oYXMoY2lkKSAmJiBjaWRzLmdldChjaWQpLnVybCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNpZHMuZ2V0KGNpZCkudXJsO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBtYXRjaDtcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgIHJldHVybiBkb25lKG51bGwsIGh0bWwpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IGVudHJ5ID0gY2lkTGlzdFtwb3MrK107XG4gICAgICAgICAgICByZXBsYWNlQ2FsbGJhY2soZW50cnkuYXR0YWNobWVudCwgKGVyciwgdXJsKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2V0SW1tZWRpYXRlKCgpID0+IGRvbmUoZXJyKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVudHJ5LnVybCA9IHVybDtcbiAgICAgICAgICAgICAgICBzZXRJbW1lZGlhdGUocHJvY2Vzc05leHQpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH07XG5cbiAgICAgICAgc2V0SW1tZWRpYXRlKHByb2Nlc3NOZXh0KTtcbiAgICB9XG5cbiAgICB0ZXh0VG9IdG1sKHN0cikge1xuICAgICAgICBpZiAodGhpcy5vcHRpb25zLnNraXBUZXh0VG9IdG1sKSB7XG4gICAgICAgICAgICByZXR1cm4gJyc7XG4gICAgICAgIH1cbiAgICAgICAgc3RyID0gKHN0ciB8fCAnJykudG9TdHJpbmcoKTtcbiAgICAgICAgbGV0IGVuY29kZWQ7XG5cbiAgICAgICAgbGV0IGxpbmtpZmllZCA9IGZhbHNlO1xuICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy5za2lwVGV4dExpbmtzKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGlmIChsaW5raWZ5LnByZXRlc3Qoc3RyKSkge1xuICAgICAgICAgICAgICAgICAgICBsaW5raWZpZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBsZXQgbGlua3MgPSBsaW5raWZ5Lm1hdGNoKHN0cikgfHwgW107XG4gICAgICAgICAgICAgICAgICAgIGxldCByZXN1bHQgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGxhc3QgPSAwO1xuXG4gICAgICAgICAgICAgICAgICAgIGxpbmtzLmZvckVhY2gobGluayA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobGFzdCA8IGxpbmsuaW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgdGV4dFBhcnQgPSBoZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBlbmNvZGUgc3BlY2lhbCBjaGFyc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZW5jb2RlKHN0ci5zbGljZShsYXN0LCBsaW5rLmluZGV4KSwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlTmFtZWRSZWZlcmVuY2VzOiB0cnVlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHRleHRQYXJ0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goYDxhIGhyZWY9XCIke2xpbmsudXJsfVwiPiR7bGluay50ZXh0fTwvYT5gKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgbGFzdCA9IGxpbmsubGFzdEluZGV4O1xuICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICBsZXQgdGV4dFBhcnQgPSBoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZW5jb2RlIHNwZWNpYWwgY2hhcnNcbiAgICAgICAgICAgICAgICAgICAgICAgIC5lbmNvZGUoc3RyLnNsaWNlKGxhc3QpLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlTmFtZWRSZWZlcmVuY2VzOiB0cnVlXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2godGV4dFBhcnQpO1xuXG4gICAgICAgICAgICAgICAgICAgIGVuY29kZWQgPSByZXN1bHQuam9pbignJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBjYXRjaCAoRSkge1xuICAgICAgICAgICAgICAgIC8vIGZhaWxlZCwgZG9uJ3QgbGlua2lmeVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFsaW5raWZpZWQpIHtcbiAgICAgICAgICAgIGVuY29kZWQgPSBoZVxuICAgICAgICAgICAgICAgIC8vIGVuY29kZSBzcGVjaWFsIGNoYXJzXG4gICAgICAgICAgICAgICAgLmVuY29kZShzdHIsIHtcbiAgICAgICAgICAgICAgICAgICAgdXNlTmFtZWRSZWZlcmVuY2VzOiB0cnVlXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgdGV4dCA9XG4gICAgICAgICAgICAnPHA+JyArXG4gICAgICAgICAgICBlbmNvZGVkXG4gICAgICAgICAgICAgICAgLnJlcGxhY2UoL1xccj9cXG4vZywgJ1xcbicpXG4gICAgICAgICAgICAgICAgLnRyaW0oKSAvLyBub3JtYWxpemUgbGluZSBlbmRpbmdzXG4gICAgICAgICAgICAgICAgLnJlcGxhY2UoL1sgXFx0XSskL2dtLCAnJylcbiAgICAgICAgICAgICAgICAudHJpbSgpIC8vIHRyaW0gZW1wdHkgbGluZSBlbmRpbmdzXG4gICAgICAgICAgICAgICAgLnJlcGxhY2UoL1xcblxcbisvZywgJzwvcD48cD4nKVxuICAgICAgICAgICAgICAgIC50cmltKCkgLy8gaW5zZXJ0IDxwPiB0byBtdWx0aXBsZSBsaW5lYnJlYWtzXG4gICAgICAgICAgICAgICAgLnJlcGxhY2UoL1xcbi9nLCAnPGJyLz4nKSArIC8vIGluc2VydCA8YnI+IHRvIHNpbmdsZSBsaW5lYnJlYWtzXG4gICAgICAgICAgICAnPC9wPic7XG5cbiAgICAgICAgcmV0dXJuIHRleHQ7XG4gICAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IE1haWxQYXJzZXI7XG4iXSwibmFtZXMiOltdLCJpZ25vcmVMaXN0IjpbMF0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(action-browser)/./node_modules/mailparser/lib/mail-parser.js\n");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "(action-browser)/./node_modules/mailparser/lib/simple-parser.js":
|
|
/*!******************************************************!*\
|
|
!*** ./node_modules/mailparser/lib/simple-parser.js ***!
|
|
\******************************************************/
|
|
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
|
|
|
|
eval("\n\nconst MailParser = __webpack_require__(/*! ./mail-parser.js */ \"(action-browser)/./node_modules/mailparser/lib/mail-parser.js\");\n\nmodule.exports = (input, options, callback) => {\n if (input === null || input === undefined) {\n throw new TypeError('Input cannot be null or undefined.');\n }\n\n if (!callback && typeof options === 'function') {\n callback = options;\n options = false;\n }\n\n let promise;\n if (!callback) {\n promise = new Promise((resolve, reject) => {\n callback = callbackPromise(resolve, reject);\n });\n }\n\n options = options || {};\n let keepCidLinks = !!options.keepCidLinks;\n\n let mail = {\n attachments: []\n };\n\n let parser = new MailParser(options);\n\n parser.on('error', err => {\n callback(err);\n });\n\n parser.on('headers', headers => {\n mail.headers = headers;\n mail.headerLines = parser.headerLines;\n });\n\n let reading = false;\n let reader = () => {\n reading = true;\n\n let data = parser.read();\n\n if (data === null) {\n reading = false;\n return;\n }\n\n if (data.type === 'text') {\n Object.keys(data).forEach(key => {\n if (['text', 'html', 'textAsHtml'].includes(key)) {\n mail[key] = data[key];\n }\n });\n }\n\n if (data.type === 'attachment') {\n mail.attachments.push(data);\n\n let chunks = [];\n let chunklen = 0;\n data.content.on('readable', () => {\n let chunk;\n while ((chunk = data.content.read()) !== null) {\n chunks.push(chunk);\n chunklen += chunk.length;\n }\n });\n\n data.content.on('end', () => {\n data.content = Buffer.concat(chunks, chunklen);\n data.release();\n reader();\n });\n } else {\n reader();\n }\n };\n\n parser.on('readable', () => {\n if (!reading) {\n reader();\n }\n });\n\n parser.on('end', () => {\n ['subject', 'references', 'date', 'to', 'from', 'to', 'cc', 'bcc', 'message-id', 'in-reply-to', 'reply-to'].forEach(key => {\n if (mail.headers && mail.headers.has(key)) {\n mail[key.replace(/-([a-z])/g, (m, c) => c.toUpperCase())] = mail.headers.get(key);\n }\n });\n\n if (keepCidLinks) {\n return callback(null, mail);\n }\n parser.updateImageLinks(\n (attachment, done) => done(false, 'data:' + attachment.contentType + ';base64,' + attachment.content.toString('base64')),\n (err, html) => {\n if (err) {\n return callback(err);\n }\n mail.html = html;\n\n callback(null, mail);\n }\n );\n });\n\n if (typeof input === 'string') {\n parser.end(Buffer.from(input));\n } else if (Buffer.isBuffer(input)) {\n parser.end(input);\n } else {\n input\n .once('error', err => {\n input.destroy();\n parser.destroy();\n callback(err);\n })\n .pipe(parser);\n }\n\n return promise;\n};\n\nfunction callbackPromise(resolve, reject) {\n return function (...args) {\n let err = args.shift();\n if (err) {\n reject(err);\n } else {\n resolve(...args);\n }\n };\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFjdGlvbi1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9tYWlscGFyc2VyL2xpYi9zaW1wbGUtcGFyc2VyLmpzIiwibWFwcGluZ3MiOiJBQUFhOztBQUViLG1CQUFtQixtQkFBTyxDQUFDLHVGQUFrQjs7QUFFN0M7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhOztBQUViO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiLFVBQVU7QUFDVjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUZBQW1GO0FBQ25GO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIi9ob21lL2FsbWEvbmV4dGdlbi9OZWFoLW1haWwvbm9kZV9tb2R1bGVzL21haWxwYXJzZXIvbGliL3NpbXBsZS1wYXJzZXIuanMiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCBNYWlsUGFyc2VyID0gcmVxdWlyZSgnLi9tYWlsLXBhcnNlci5qcycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IChpbnB1dCwgb3B0aW9ucywgY2FsbGJhY2spID0+IHtcbiAgICBpZiAoaW5wdXQgPT09IG51bGwgfHwgaW5wdXQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdJbnB1dCBjYW5ub3QgYmUgbnVsbCBvciB1bmRlZmluZWQuJyk7XG4gICAgfVxuXG4gICAgaWYgKCFjYWxsYmFjayAmJiB0eXBlb2Ygb3B0aW9ucyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBjYWxsYmFjayA9IG9wdGlvbnM7XG4gICAgICAgIG9wdGlvbnMgPSBmYWxzZTtcbiAgICB9XG5cbiAgICBsZXQgcHJvbWlzZTtcbiAgICBpZiAoIWNhbGxiYWNrKSB7XG4gICAgICAgIHByb21pc2UgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICBjYWxsYmFjayA9IGNhbGxiYWNrUHJvbWlzZShyZXNvbHZlLCByZWplY3QpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgICBsZXQga2VlcENpZExpbmtzID0gISFvcHRpb25zLmtlZXBDaWRMaW5rcztcblxuICAgIGxldCBtYWlsID0ge1xuICAgICAgICBhdHRhY2htZW50czogW11cbiAgICB9O1xuXG4gICAgbGV0IHBhcnNlciA9IG5ldyBNYWlsUGFyc2VyKG9wdGlvbnMpO1xuXG4gICAgcGFyc2VyLm9uKCdlcnJvcicsIGVyciA9PiB7XG4gICAgICAgIGNhbGxiYWNrKGVycik7XG4gICAgfSk7XG5cbiAgICBwYXJzZXIub24oJ2hlYWRlcnMnLCBoZWFkZXJzID0+IHtcbiAgICAgICAgbWFpbC5oZWFkZXJzID0gaGVhZGVycztcbiAgICAgICAgbWFpbC5oZWFkZXJMaW5lcyA9IHBhcnNlci5oZWFkZXJMaW5lcztcbiAgICB9KTtcblxuICAgIGxldCByZWFkaW5nID0gZmFsc2U7XG4gICAgbGV0IHJlYWRlciA9ICgpID0+IHtcbiAgICAgICAgcmVhZGluZyA9IHRydWU7XG5cbiAgICAgICAgbGV0IGRhdGEgPSBwYXJzZXIucmVhZCgpO1xuXG4gICAgICAgIGlmIChkYXRhID09PSBudWxsKSB7XG4gICAgICAgICAgICByZWFkaW5nID0gZmFsc2U7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZGF0YS50eXBlID09PSAndGV4dCcpIHtcbiAgICAgICAgICAgIE9iamVjdC5rZXlzKGRhdGEpLmZvckVhY2goa2V5ID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoWyd0ZXh0JywgJ2h0bWwnLCAndGV4dEFzSHRtbCddLmluY2x1ZGVzKGtleSkpIHtcbiAgICAgICAgICAgICAgICAgICAgbWFpbFtrZXldID0gZGF0YVtrZXldO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGRhdGEudHlwZSA9PT0gJ2F0dGFjaG1lbnQnKSB7XG4gICAgICAgICAgICBtYWlsLmF0dGFjaG1lbnRzLnB1c2goZGF0YSk7XG5cbiAgICAgICAgICAgIGxldCBjaHVua3MgPSBbXTtcbiAgICAgICAgICAgIGxldCBjaHVua2xlbiA9IDA7XG4gICAgICAgICAgICBkYXRhLmNvbnRlbnQub24oJ3JlYWRhYmxlJywgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGxldCBjaHVuaztcbiAgICAgICAgICAgICAgICB3aGlsZSAoKGNodW5rID0gZGF0YS5jb250ZW50LnJlYWQoKSkgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2h1bmtzLnB1c2goY2h1bmspO1xuICAgICAgICAgICAgICAgICAgICBjaHVua2xlbiArPSBjaHVuay5sZW5ndGg7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGRhdGEuY29udGVudC5vbignZW5kJywgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGRhdGEuY29udGVudCA9IEJ1ZmZlci5jb25jYXQoY2h1bmtzLCBjaHVua2xlbik7XG4gICAgICAgICAgICAgICAgZGF0YS5yZWxlYXNlKCk7XG4gICAgICAgICAgICAgICAgcmVhZGVyKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJlYWRlcigpO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIHBhcnNlci5vbigncmVhZGFibGUnLCAoKSA9PiB7XG4gICAgICAgIGlmICghcmVhZGluZykge1xuICAgICAgICAgICAgcmVhZGVyKCk7XG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIHBhcnNlci5vbignZW5kJywgKCkgPT4ge1xuICAgICAgICBbJ3N1YmplY3QnLCAncmVmZXJlbmNlcycsICdkYXRlJywgJ3RvJywgJ2Zyb20nLCAndG8nLCAnY2MnLCAnYmNjJywgJ21lc3NhZ2UtaWQnLCAnaW4tcmVwbHktdG8nLCAncmVwbHktdG8nXS5mb3JFYWNoKGtleSA9PiB7XG4gICAgICAgICAgICBpZiAobWFpbC5oZWFkZXJzICYmIG1haWwuaGVhZGVycy5oYXMoa2V5KSkge1xuICAgICAgICAgICAgICAgIG1haWxba2V5LnJlcGxhY2UoLy0oW2Etel0pL2csIChtLCBjKSA9PiBjLnRvVXBwZXJDYXNlKCkpXSA9IG1haWwuaGVhZGVycy5nZXQoa2V5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKGtlZXBDaWRMaW5rcykge1xuICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKG51bGwsIG1haWwpO1xuICAgICAgICB9XG4gICAgICAgIHBhcnNlci51cGRhdGVJbWFnZUxpbmtzKFxuICAgICAgICAgICAgKGF0dGFjaG1lbnQsIGRvbmUpID0+IGRvbmUoZmFsc2UsICdkYXRhOicgKyBhdHRhY2htZW50LmNvbnRlbnRUeXBlICsgJztiYXNlNjQsJyArIGF0dGFjaG1lbnQuY29udGVudC50b1N0cmluZygnYmFzZTY0JykpLFxuICAgICAgICAgICAgKGVyciwgaHRtbCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKGVycik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIG1haWwuaHRtbCA9IGh0bWw7XG5cbiAgICAgICAgICAgICAgICBjYWxsYmFjayhudWxsLCBtYWlsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICB9KTtcblxuICAgIGlmICh0eXBlb2YgaW5wdXQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHBhcnNlci5lbmQoQnVmZmVyLmZyb20oaW5wdXQpKTtcbiAgICB9IGVsc2UgaWYgKEJ1ZmZlci5pc0J1ZmZlcihpbnB1dCkpIHtcbiAgICAgICAgcGFyc2VyLmVuZChpbnB1dCk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgaW5wdXRcbiAgICAgICAgICAgIC5vbmNlKCdlcnJvcicsIGVyciA9PiB7XG4gICAgICAgICAgICAgICAgaW5wdXQuZGVzdHJveSgpO1xuICAgICAgICAgICAgICAgIHBhcnNlci5kZXN0cm95KCk7XG4gICAgICAgICAgICAgICAgY2FsbGJhY2soZXJyKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAucGlwZShwYXJzZXIpO1xuICAgIH1cblxuICAgIHJldHVybiBwcm9taXNlO1xufTtcblxuZnVuY3Rpb24gY2FsbGJhY2tQcm9taXNlKHJlc29sdmUsIHJlamVjdCkge1xuICAgIHJldHVybiBmdW5jdGlvbiAoLi4uYXJncykge1xuICAgICAgICBsZXQgZXJyID0gYXJncy5zaGlmdCgpO1xuICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJlc29sdmUoLi4uYXJncyk7XG4gICAgICAgIH1cbiAgICB9O1xufVxuIl0sIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6WzBdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(action-browser)/./node_modules/mailparser/lib/simple-parser.js\n");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "(action-browser)/./node_modules/mailparser/lib/stream-hash.js":
|
|
/*!****************************************************!*\
|
|
!*** ./node_modules/mailparser/lib/stream-hash.js ***!
|
|
\****************************************************/
|
|
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
|
|
|
|
eval("\n\nconst crypto = __webpack_require__(/*! crypto */ \"crypto\");\nconst Transform = (__webpack_require__(/*! stream */ \"stream\").Transform);\n\nclass StreamHash extends Transform {\n constructor(attachment, algo) {\n super();\n this.attachment = attachment;\n this.algo = (algo || 'md5').toLowerCase();\n this.hash = crypto.createHash(algo);\n this.byteCount = 0;\n }\n\n _transform(chunk, encoding, done) {\n this.hash.update(chunk);\n this.byteCount += chunk.length;\n done(null, chunk);\n }\n\n _flush(done) {\n this.attachment.checksum = this.hash.digest('hex');\n this.attachment.size = this.byteCount;\n done();\n }\n}\n\nmodule.exports = StreamHash;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFjdGlvbi1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9tYWlscGFyc2VyL2xpYi9zdHJlYW0taGFzaC5qcyIsIm1hcHBpbmdzIjoiQUFBYTs7QUFFYixlQUFlLG1CQUFPLENBQUMsc0JBQVE7QUFDL0Isa0JBQWtCLHVEQUEyQjs7QUFFN0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSIsInNvdXJjZXMiOlsiL2hvbWUvYWxtYS9uZXh0Z2VuL05lYWgtbWFpbC9ub2RlX21vZHVsZXMvbWFpbHBhcnNlci9saWIvc3RyZWFtLWhhc2guanMiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCBjcnlwdG8gPSByZXF1aXJlKCdjcnlwdG8nKTtcbmNvbnN0IFRyYW5zZm9ybSA9IHJlcXVpcmUoJ3N0cmVhbScpLlRyYW5zZm9ybTtcblxuY2xhc3MgU3RyZWFtSGFzaCBleHRlbmRzIFRyYW5zZm9ybSB7XG4gICAgY29uc3RydWN0b3IoYXR0YWNobWVudCwgYWxnbykge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLmF0dGFjaG1lbnQgPSBhdHRhY2htZW50O1xuICAgICAgICB0aGlzLmFsZ28gPSAoYWxnbyB8fCAnbWQ1JykudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgdGhpcy5oYXNoID0gY3J5cHRvLmNyZWF0ZUhhc2goYWxnbyk7XG4gICAgICAgIHRoaXMuYnl0ZUNvdW50ID0gMDtcbiAgICB9XG5cbiAgICBfdHJhbnNmb3JtKGNodW5rLCBlbmNvZGluZywgZG9uZSkge1xuICAgICAgICB0aGlzLmhhc2gudXBkYXRlKGNodW5rKTtcbiAgICAgICAgdGhpcy5ieXRlQ291bnQgKz0gY2h1bmsubGVuZ3RoO1xuICAgICAgICBkb25lKG51bGwsIGNodW5rKTtcbiAgICB9XG5cbiAgICBfZmx1c2goZG9uZSkge1xuICAgICAgICB0aGlzLmF0dGFjaG1lbnQuY2hlY2tzdW0gPSB0aGlzLmhhc2guZGlnZXN0KCdoZXgnKTtcbiAgICAgICAgdGhpcy5hdHRhY2htZW50LnNpemUgPSB0aGlzLmJ5dGVDb3VudDtcbiAgICAgICAgZG9uZSgpO1xuICAgIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBTdHJlYW1IYXNoO1xuIl0sIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6WzBdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(action-browser)/./node_modules/mailparser/lib/stream-hash.js\n");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "(action-browser)/./node_modules/mailparser/node_modules/nodemailer/lib/addressparser/index.js":
|
|
/*!************************************************************************************!*\
|
|
!*** ./node_modules/mailparser/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 * @return {Object} Address object\n */\nfunction _handleAddress(tokens) {\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 };\n let i;\n let len;\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 break;\n case '(':\n state = 'comment';\n break;\n case ':':\n state = 'group';\n isGroup = true;\n break;\n default:\n state = 'text';\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 } else {\n data[state].push(token.value);\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 addresses.push({\n name: data.text || (address && address.name),\n group: data.group.length ? addressparser(data.group.join(',')) : []\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 if (data.text[i].match(/^[^@\\s]+@[^@\\s]+$/)) {\n data.address = data.text.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 // 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 // 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 * 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 * @return {Array} An array of address objects\n */\nfunction addressparser(str, options) {\n options = options || {};\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);\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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFjdGlvbi1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9tYWlscGFyc2VyL25vZGVfbW9kdWxlcy9ub2RlbWFpbGVyL2xpYi9hZGRyZXNzcGFyc2VyL2luZGV4LmpzIiwibWFwcGluZ3MiOiJBQUFhOztBQUViO0FBQ0E7QUFDQTtBQUNBLFdBQVcsT0FBTztBQUNsQixZQUFZLFFBQVE7QUFDcEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLHFDQUFxQyxTQUFTO0FBQzlDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULE1BQU07QUFDTjtBQUNBO0FBQ0EsMkNBQTJDLFFBQVE7QUFDbkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLCtDQUErQyxRQUFRO0FBQ3ZEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0I7QUFDbEI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CO0FBQ25CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQixPQUFPO0FBQ3ZCO0FBQ0E7QUFDQTs7QUFFQSwrQ0FBK0MsU0FBUztBQUN4RDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsUUFBUTtBQUN2QjtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTs7QUFFQSwyREFBMkQ7QUFDM0Q7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVMsd0NBQXdDO0FBQ2pEO0FBQ0EsV0FBVyxRQUFRO0FBQ25CLFlBQVksT0FBTztBQUNuQjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxtRkFBbUY7QUFDbkY7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSIsInNvdXJjZXMiOlsiL2hvbWUvYWxtYS9uZXh0Z2VuL05lYWgtbWFpbC9ub2RlX21vZHVsZXMvbWFpbHBhcnNlci9ub2RlX21vZHVsZXMvbm9kZW1haWxlci9saWIvYWRkcmVzc3BhcnNlci9pbmRleC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbi8qKlxuICogQ29udmVydHMgdG9rZW5zIGZvciBhIHNpbmdsZSBhZGRyZXNzIGludG8gYW4gYWRkcmVzcyBvYmplY3RcbiAqXG4gKiBAcGFyYW0ge0FycmF5fSB0b2tlbnMgVG9rZW5zIG9iamVjdFxuICogQHJldHVybiB7T2JqZWN0fSBBZGRyZXNzIG9iamVjdFxuICovXG5mdW5jdGlvbiBfaGFuZGxlQWRkcmVzcyh0b2tlbnMpIHtcbiAgICBsZXQgaXNHcm91cCA9IGZhbHNlO1xuICAgIGxldCBzdGF0ZSA9ICd0ZXh0JztcbiAgICBsZXQgYWRkcmVzcztcbiAgICBsZXQgYWRkcmVzc2VzID0gW107XG4gICAgbGV0IGRhdGEgPSB7XG4gICAgICAgIGFkZHJlc3M6IFtdLFxuICAgICAgICBjb21tZW50OiBbXSxcbiAgICAgICAgZ3JvdXA6IFtdLFxuICAgICAgICB0ZXh0OiBbXVxuICAgIH07XG4gICAgbGV0IGk7XG4gICAgbGV0IGxlbjtcblxuICAgIC8vIEZpbHRlciBvdXQgPGFkZHJlc3Nlcz4sIChjb21tZW50cykgYW5kIHJlZ3VsYXIgdGV4dFxuICAgIGZvciAoaSA9IDAsIGxlbiA9IHRva2Vucy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgICBsZXQgdG9rZW4gPSB0b2tlbnNbaV07XG4gICAgICAgIGxldCBwcmV2VG9rZW4gPSBpID8gdG9rZW5zW2kgLSAxXSA6IG51bGw7XG4gICAgICAgIGlmICh0b2tlbi50eXBlID09PSAnb3BlcmF0b3InKSB7XG4gICAgICAgICAgICBzd2l0Y2ggKHRva2VuLnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAnPCc6XG4gICAgICAgICAgICAgICAgICAgIHN0YXRlID0gJ2FkZHJlc3MnO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICcoJzpcbiAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSAnY29tbWVudCc7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJzonOlxuICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9ICdncm91cCc7XG4gICAgICAgICAgICAgICAgICAgIGlzR3JvdXAgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9ICd0ZXh0JztcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAodG9rZW4udmFsdWUpIHtcbiAgICAgICAgICAgIGlmIChzdGF0ZSA9PT0gJ2FkZHJlc3MnKSB7XG4gICAgICAgICAgICAgICAgLy8gaGFuZGxlIHVzZSBjYXNlIHdoZXJlIHVucXVvdGVkIG5hbWUgaW5jbHVkZXMgYSBcIjxcIlxuICAgICAgICAgICAgICAgIC8vIEFwcGxlIE1haWwgdHJ1bmNhdGVzIGV2ZXJ5dGhpbmcgYmV0d2VlbiBhbiB1bmV4cGVjdGVkIDwgYW5kIGFuIGFkZHJlc3NcbiAgICAgICAgICAgICAgICAvLyBhbmQgc28gd2lsbCB3ZVxuICAgICAgICAgICAgICAgIHRva2VuLnZhbHVlID0gdG9rZW4udmFsdWUucmVwbGFjZSgvXltePF0qPFxccyovLCAnJyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChwcmV2VG9rZW4gJiYgcHJldlRva2VuLm5vQnJlYWsgJiYgZGF0YVtzdGF0ZV0ubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgLy8gam9pbiB2YWx1ZXNcbiAgICAgICAgICAgICAgICBkYXRhW3N0YXRlXVtkYXRhW3N0YXRlXS5sZW5ndGggLSAxXSArPSB0b2tlbi52YWx1ZTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZGF0YVtzdGF0ZV0ucHVzaCh0b2tlbi52YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBJZiB0aGVyZSBpcyBubyB0ZXh0IGJ1dCBhIGNvbW1lbnQsIHJlcGxhY2UgdGhlIHR3b1xuICAgIGlmICghZGF0YS50ZXh0Lmxlbmd0aCAmJiBkYXRhLmNvbW1lbnQubGVuZ3RoKSB7XG4gICAgICAgIGRhdGEudGV4dCA9IGRhdGEuY29tbWVudDtcbiAgICAgICAgZGF0YS5jb21tZW50ID0gW107XG4gICAgfVxuXG4gICAgaWYgKGlzR3JvdXApIHtcbiAgICAgICAgLy8gaHR0cDovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjMjgyMiNhcHBlbmRpeC1BLjEuM1xuICAgICAgICBkYXRhLnRleHQgPSBkYXRhLnRleHQuam9pbignICcpO1xuICAgICAgICBhZGRyZXNzZXMucHVzaCh7XG4gICAgICAgICAgICBuYW1lOiBkYXRhLnRleHQgfHwgKGFkZHJlc3MgJiYgYWRkcmVzcy5uYW1lKSxcbiAgICAgICAgICAgIGdyb3VwOiBkYXRhLmdyb3VwLmxlbmd0aCA/IGFkZHJlc3NwYXJzZXIoZGF0YS5ncm91cC5qb2luKCcsJykpIDogW11cbiAgICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgLy8gSWYgbm8gYWRkcmVzcyB3YXMgZm91bmQsIHRyeSB0byBkZXRlY3Qgb25lIGZyb20gcmVndWxhciB0ZXh0XG4gICAgICAgIGlmICghZGF0YS5hZGRyZXNzLmxlbmd0aCAmJiBkYXRhLnRleHQubGVuZ3RoKSB7XG4gICAgICAgICAgICBmb3IgKGkgPSBkYXRhLnRleHQubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgICAgICAgICBpZiAoZGF0YS50ZXh0W2ldLm1hdGNoKC9eW15AXFxzXStAW15AXFxzXSskLykpIHtcbiAgICAgICAgICAgICAgICAgICAgZGF0YS5hZGRyZXNzID0gZGF0YS50ZXh0LnNwbGljZShpLCAxKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsZXQgX3JlZ2V4SGFuZGxlciA9IGZ1bmN0aW9uIChhZGRyZXNzKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFkYXRhLmFkZHJlc3MubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGEuYWRkcmVzcyA9IFthZGRyZXNzLnRyaW0oKV07XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAnICc7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFkZHJlc3M7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgLy8gc3RpbGwgbm8gYWRkcmVzc1xuICAgICAgICAgICAgaWYgKCFkYXRhLmFkZHJlc3MubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgZm9yIChpID0gZGF0YS50ZXh0Lmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGZpeGVkIHRoZSByZWdleCB0byBwYXJzZSBlbWFpbCBhZGRyZXNzIGNvcnJlY3RseSB3aGVuIGVtYWlsIGFkZHJlc3MgaGFzIG1vcmUgdGhhbiBvbmUgQFxuICAgICAgICAgICAgICAgICAgICBkYXRhLnRleHRbaV0gPSBkYXRhLnRleHRbaV0ucmVwbGFjZSgvXFxzKlxcYlteQFxcc10rQFteXFxzXStcXGJcXHMqLywgX3JlZ2V4SGFuZGxlcikudHJpbSgpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YS5hZGRyZXNzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJZiB0aGVyZSdzIHN0aWxsIGlzIG5vIHRleHQgYnV0IGEgY29tbWVudCBleGl4dHMsIHJlcGxhY2UgdGhlIHR3b1xuICAgICAgICBpZiAoIWRhdGEudGV4dC5sZW5ndGggJiYgZGF0YS5jb21tZW50Lmxlbmd0aCkge1xuICAgICAgICAgICAgZGF0YS50ZXh0ID0gZGF0YS5jb21tZW50O1xuICAgICAgICAgICAgZGF0YS5jb21tZW50ID0gW107XG4gICAgICAgIH1cblxuICAgICAgICAvLyBLZWVwIG9ubHkgdGhlIGZpcnN0IGFkZHJlc3Mgb2NjdXJlbmNlLCBwdXNoIG90aGVycyB0byByZWd1bGFyIHRleHRcbiAgICAgICAgaWYgKGRhdGEuYWRkcmVzcy5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICBkYXRhLnRleHQgPSBkYXRhLnRleHQuY29uY2F0KGRhdGEuYWRkcmVzcy5zcGxpY2UoMSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSm9pbiB2YWx1ZXMgd2l0aCBzcGFjZXNcbiAgICAgICAgZGF0YS50ZXh0ID0gZGF0YS50ZXh0LmpvaW4oJyAnKTtcbiAgICAgICAgZGF0YS5hZGRyZXNzID0gZGF0YS5hZGRyZXNzLmpvaW4oJyAnKTtcblxuICAgICAgICBpZiAoIWRhdGEuYWRkcmVzcyAmJiBpc0dyb3VwKSB7XG4gICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBhZGRyZXNzID0ge1xuICAgICAgICAgICAgICAgIGFkZHJlc3M6IGRhdGEuYWRkcmVzcyB8fCBkYXRhLnRleHQgfHwgJycsXG4gICAgICAgICAgICAgICAgbmFtZTogZGF0YS50ZXh0IHx8IGRhdGEuYWRkcmVzcyB8fCAnJ1xuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgaWYgKGFkZHJlc3MuYWRkcmVzcyA9PT0gYWRkcmVzcy5uYW1lKSB7XG4gICAgICAgICAgICAgICAgaWYgKChhZGRyZXNzLmFkZHJlc3MgfHwgJycpLm1hdGNoKC9ALykpIHtcbiAgICAgICAgICAgICAgICAgICAgYWRkcmVzcy5uYW1lID0gJyc7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgYWRkcmVzcy5hZGRyZXNzID0gJyc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBhZGRyZXNzZXMucHVzaChhZGRyZXNzKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBhZGRyZXNzZXM7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIFRva2VuaXplciBvYmplY3QgZm9yIHRva2VuaXppbmcgYWRkcmVzcyBmaWVsZCBzdHJpbmdzXG4gKlxuICogQGNvbnN0cnVjdG9yXG4gKiBAcGFyYW0ge1N0cmluZ30gc3RyIEFkZHJlc3MgZmllbGQgc3RyaW5nXG4gKi9cbmNsYXNzIFRva2VuaXplciB7XG4gICAgY29uc3RydWN0b3Ioc3RyKSB7XG4gICAgICAgIHRoaXMuc3RyID0gKHN0ciB8fCAnJykudG9TdHJpbmcoKTtcbiAgICAgICAgdGhpcy5vcGVyYXRvckN1cnJlbnQgPSAnJztcbiAgICAgICAgdGhpcy5vcGVyYXRvckV4cGVjdGluZyA9ICcnO1xuICAgICAgICB0aGlzLm5vZGUgPSBudWxsO1xuICAgICAgICB0aGlzLmVzY2FwZWQgPSBmYWxzZTtcblxuICAgICAgICB0aGlzLmxpc3QgPSBbXTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIE9wZXJhdG9yIHRva2VucyBhbmQgd2hpY2ggdG9rZW5zIGFyZSBleHBlY3RlZCB0byBlbmQgdGhlIHNlcXVlbmNlXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLm9wZXJhdG9ycyA9IHtcbiAgICAgICAgICAgICdcIic6ICdcIicsXG4gICAgICAgICAgICAnKCc6ICcpJyxcbiAgICAgICAgICAgICc8JzogJz4nLFxuICAgICAgICAgICAgJywnOiAnJyxcbiAgICAgICAgICAgICc6JzogJzsnLFxuICAgICAgICAgICAgLy8gU2VtaWNvbG9ucyBhcmUgbm90IGEgbGVnYWwgZGVsaW1pdGVyIHBlciB0aGUgUkZDMjgyMiBncmFtbWFyIG90aGVyXG4gICAgICAgICAgICAvLyB0aGFuIGZvciB0ZXJtaW5hdGluZyBhIGdyb3VwLCBidXQgdGhleSBhcmUgYWxzbyBub3QgdmFsaWQgZm9yIGFueVxuICAgICAgICAgICAgLy8gb3RoZXIgdXNlIGluIHRoaXMgY29udGV4dC4gIEdpdmVuIHRoYXQgc29tZSBtYWlsIGNsaWVudHMgaGF2ZVxuICAgICAgICAgICAgLy8gaGlzdG9yaWNhbGx5IGFsbG93ZWQgdGhlIHNlbWljb2xvbiBhcyBhIGRlbGltaXRlciBlcXVpdmFsZW50IHRvIHRoZVxuICAgICAgICAgICAgLy8gY29tbWEgaW4gdGhlaXIgVUksIGl0IG1ha2VzIHNlbnNlIHRvIHRyZWF0IHRoZW0gdGhlIHNhbWUgYXMgYSBjb21tYVxuICAgICAgICAgICAgLy8gd2hlbiB1c2VkIG91dHNpZGUgb2YgYSBncm91cC5cbiAgICAgICAgICAgICc7JzogJydcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUb2tlbml6ZXMgdGhlIG9yaWdpbmFsIGlucHV0IHN0cmluZ1xuICAgICAqXG4gICAgICogQHJldHVybiB7QXJyYXl9IEFuIGFycmF5IG9mIG9wZXJhdG9yfHRleHQgdG9rZW5zXG4gICAgICovXG4gICAgdG9rZW5pemUoKSB7XG4gICAgICAgIGxldCBsaXN0ID0gW107XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IHRoaXMuc3RyLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgY2hyID0gdGhpcy5zdHIuY2hhckF0KGkpO1xuICAgICAgICAgICAgbGV0IG5leHRDaHIgPSBpIDwgbGVuIC0gMSA/IHRoaXMuc3RyLmNoYXJBdChpICsgMSkgOiBudWxsO1xuICAgICAgICAgICAgdGhpcy5jaGVja0NoYXIoY2hyLCBuZXh0Q2hyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMubGlzdC5mb3JFYWNoKG5vZGUgPT4ge1xuICAgICAgICAgICAgbm9kZS52YWx1ZSA9IChub2RlLnZhbHVlIHx8ICcnKS50b1N0cmluZygpLnRyaW0oKTtcbiAgICAgICAgICAgIGlmIChub2RlLnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgbGlzdC5wdXNoKG5vZGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gbGlzdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYSBjaGFyYWN0ZXIgaXMgYW4gb3BlcmF0b3Igb3IgdGV4dCBhbmQgYWN0cyBhY2NvcmRpbmdseVxuICAgICAqXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IGNociBDaGFyYWN0ZXIgZnJvbSB0aGUgYWRkcmVzcyBmaWVsZFxuICAgICAqL1xuICAgIGNoZWNrQ2hhcihjaHIsIG5leHRDaHIpIHtcbiAgICAgICAgaWYgKHRoaXMuZXNjYXBlZCkge1xuICAgICAgICAgICAgLy8gaWdub3JlIG5leHQgY29uZGl0aW9uIGJsb2Nrc1xuICAgICAgICB9IGVsc2UgaWYgKGNociA9PT0gdGhpcy5vcGVyYXRvckV4cGVjdGluZykge1xuICAgICAgICAgICAgdGhpcy5ub2RlID0ge1xuICAgICAgICAgICAgICAgIHR5cGU6ICdvcGVyYXRvcicsXG4gICAgICAgICAgICAgICAgdmFsdWU6IGNoclxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgaWYgKG5leHRDaHIgJiYgIVsnICcsICdcXHQnLCAnXFxyJywgJ1xcbicsICcsJywgJzsnXS5pbmNsdWRlcyhuZXh0Q2hyKSkge1xuICAgICAgICAgICAgICAgIHRoaXMubm9kZS5ub0JyZWFrID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5saXN0LnB1c2godGhpcy5ub2RlKTtcbiAgICAgICAgICAgIHRoaXMubm9kZSA9IG51bGw7XG4gICAgICAgICAgICB0aGlzLm9wZXJhdG9yRXhwZWN0aW5nID0gJyc7XG4gICAgICAgICAgICB0aGlzLmVzY2FwZWQgPSBmYWxzZTtcblxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9IGVsc2UgaWYgKCF0aGlzLm9wZXJhdG9yRXhwZWN0aW5nICYmIGNociBpbiB0aGlzLm9wZXJhdG9ycykge1xuICAgICAgICAgICAgdGhpcy5ub2RlID0ge1xuICAgICAgICAgICAgICAgIHR5cGU6ICdvcGVyYXRvcicsXG4gICAgICAgICAgICAgICAgdmFsdWU6IGNoclxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHRoaXMubGlzdC5wdXNoKHRoaXMubm9kZSk7XG4gICAgICAgICAgICB0aGlzLm5vZGUgPSBudWxsO1xuICAgICAgICAgICAgdGhpcy5vcGVyYXRvckV4cGVjdGluZyA9IHRoaXMub3BlcmF0b3JzW2Nocl07XG4gICAgICAgICAgICB0aGlzLmVzY2FwZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfSBlbHNlIGlmIChbJ1wiJywgXCInXCJdLmluY2x1ZGVzKHRoaXMub3BlcmF0b3JFeHBlY3RpbmcpICYmIGNociA9PT0gJ1xcXFwnKSB7XG4gICAgICAgICAgICB0aGlzLmVzY2FwZWQgPSB0cnVlO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0aGlzLm5vZGUpIHtcbiAgICAgICAgICAgIHRoaXMubm9kZSA9IHtcbiAgICAgICAgICAgICAgICB0eXBlOiAndGV4dCcsXG4gICAgICAgICAgICAgICAgdmFsdWU6ICcnXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdGhpcy5saXN0LnB1c2godGhpcy5ub2RlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjaHIgPT09ICdcXG4nKSB7XG4gICAgICAgICAgICAvLyBDb252ZXJ0IG5ld2xpbmVzIHRvIHNwYWNlcy4gQ2FycmlhZ2UgcmV0dXJuIGlzIGlnbm9yZWQgYXMgXFxyIGFuZCBcXG4gdXN1YWxseVxuICAgICAgICAgICAgLy8gZ28gdG9nZXRoZXIgYW55d2F5IGFuZCB0aGVyZSBhbHJlYWR5IGlzIGEgV1MgZm9yIFxcbi4gTG9uZSBcXHIgbWVhbnMgc29tZXRoaW5nIGlzIGZpc2h5LlxuICAgICAgICAgICAgY2hyID0gJyAnO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNoci5jaGFyQ29kZUF0KDApID49IDB4MjEgfHwgWycgJywgJ1xcdCddLmluY2x1ZGVzKGNocikpIHtcbiAgICAgICAgICAgIC8vIHNraXAgY29tbWFuZCBieXRlc1xuICAgICAgICAgICAgdGhpcy5ub2RlLnZhbHVlICs9IGNocjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZXNjYXBlZCA9IGZhbHNlO1xuICAgIH1cbn1cblxuLyoqXG4gKiBQYXJzZXMgc3RydWN0dXJlZCBlLW1haWwgYWRkcmVzc2VzIGZyb20gYW4gYWRkcmVzcyBmaWVsZFxuICpcbiAqIEV4YW1wbGU6XG4gKlxuICogICAgJ05hbWUgPGFkZHJlc3NAZG9tYWluPidcbiAqXG4gKiB3aWxsIGJlIGNvbnZlcnRlZCB0b1xuICpcbiAqICAgICBbe25hbWU6ICdOYW1lJywgYWRkcmVzczogJ2FkZHJlc3NAZG9tYWluJ31dXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHN0ciBBZGRyZXNzIGZpZWxkXG4gKiBAcmV0dXJuIHtBcnJheX0gQW4gYXJyYXkgb2YgYWRkcmVzcyBvYmplY3RzXG4gKi9cbmZ1bmN0aW9uIGFkZHJlc3NwYXJzZXIoc3RyLCBvcHRpb25zKSB7XG4gICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cbiAgICBsZXQgdG9rZW5pemVyID0gbmV3IFRva2VuaXplcihzdHIpO1xuICAgIGxldCB0b2tlbnMgPSB0b2tlbml6ZXIudG9rZW5pemUoKTtcblxuICAgIGxldCBhZGRyZXNzZXMgPSBbXTtcbiAgICBsZXQgYWRkcmVzcyA9IFtdO1xuICAgIGxldCBwYXJzZWRBZGRyZXNzZXMgPSBbXTtcblxuICAgIHRva2Vucy5mb3JFYWNoKHRva2VuID0+IHtcbiAgICAgICAgaWYgKHRva2VuLnR5cGUgPT09ICdvcGVyYXRvcicgJiYgKHRva2VuLnZhbHVlID09PSAnLCcgfHwgdG9rZW4udmFsdWUgPT09ICc7JykpIHtcbiAgICAgICAgICAgIGlmIChhZGRyZXNzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIGFkZHJlc3Nlcy5wdXNoKGFkZHJlc3MpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYWRkcmVzcyA9IFtdO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYWRkcmVzcy5wdXNoKHRva2VuKTtcbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgaWYgKGFkZHJlc3MubGVuZ3RoKSB7XG4gICAgICAgIGFkZHJlc3Nlcy5wdXNoKGFkZHJlc3MpO1xuICAgIH1cblxuICAgIGFkZHJlc3Nlcy5mb3JFYWNoKGFkZHJlc3MgPT4ge1xuICAgICAgICBhZGRyZXNzID0gX2hhbmRsZUFkZHJlc3MoYWRkcmVzcyk7XG4gICAgICAgIGlmIChhZGRyZXNzLmxlbmd0aCkge1xuICAgICAgICAgICAgcGFyc2VkQWRkcmVzc2VzID0gcGFyc2VkQWRkcmVzc2VzLmNvbmNhdChhZGRyZXNzKTtcbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgaWYgKG9wdGlvbnMuZmxhdHRlbikge1xuICAgICAgICBsZXQgYWRkcmVzc2VzID0gW107XG4gICAgICAgIGxldCB3YWxrQWRkcmVzc0xpc3QgPSBsaXN0ID0+IHtcbiAgICAgICAgICAgIGxpc3QuZm9yRWFjaChhZGRyZXNzID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoYWRkcmVzcy5ncm91cCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gd2Fsa0FkZHJlc3NMaXN0KGFkZHJlc3MuZ3JvdXApO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGFkZHJlc3Nlcy5wdXNoKGFkZHJlc3MpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9O1xuICAgICAgICB3YWxrQWRkcmVzc0xpc3QocGFyc2VkQWRkcmVzc2VzKTtcbiAgICAgICAgcmV0dXJuIGFkZHJlc3NlcztcbiAgICB9XG5cbiAgICByZXR1cm4gcGFyc2VkQWRkcmVzc2VzO1xufVxuXG4vLyBleHBvc2UgdG8gdGhlIHdvcmxkXG5tb2R1bGUuZXhwb3J0cyA9IGFkZHJlc3NwYXJzZXI7XG4iXSwibmFtZXMiOltdLCJpZ25vcmVMaXN0IjpbMF0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(action-browser)/./node_modules/mailparser/node_modules/nodemailer/lib/addressparser/index.js\n");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "(rsc)/./node_modules/mailparser/index.js":
|
|
/*!******************************************!*\
|
|
!*** ./node_modules/mailparser/index.js ***!
|
|
\******************************************/
|
|
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
|
|
|
|
eval("\n\nconst MailParser = __webpack_require__(/*! ./lib/mail-parser */ \"(rsc)/./node_modules/mailparser/lib/mail-parser.js\");\nconst simpleParser = __webpack_require__(/*! ./lib/simple-parser */ \"(rsc)/./node_modules/mailparser/lib/simple-parser.js\");\n\nmodule.exports = {\n MailParser,\n simpleParser\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHJzYykvLi9ub2RlX21vZHVsZXMvbWFpbHBhcnNlci9pbmRleC5qcyIsIm1hcHBpbmdzIjoiQUFBYTs7QUFFYixtQkFBbUIsbUJBQU8sQ0FBQyw2RUFBbUI7QUFDOUMscUJBQXFCLG1CQUFPLENBQUMsaUZBQXFCOztBQUVsRDtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsiL2hvbWUvYWxtYS9uZXh0Z2VuL05lYWgtbWFpbC9ub2RlX21vZHVsZXMvbWFpbHBhcnNlci9pbmRleC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbmNvbnN0IE1haWxQYXJzZXIgPSByZXF1aXJlKCcuL2xpYi9tYWlsLXBhcnNlcicpO1xuY29uc3Qgc2ltcGxlUGFyc2VyID0gcmVxdWlyZSgnLi9saWIvc2ltcGxlLXBhcnNlcicpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgICBNYWlsUGFyc2VyLFxuICAgIHNpbXBsZVBhcnNlclxufTtcbiJdLCJuYW1lcyI6W10sImlnbm9yZUxpc3QiOlswXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(rsc)/./node_modules/mailparser/index.js\n");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "(rsc)/./node_modules/mailparser/lib/mail-parser.js":
|
|
/*!****************************************************!*\
|
|
!*** ./node_modules/mailparser/lib/mail-parser.js ***!
|
|
\****************************************************/
|
|
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
|
|
|
|
eval("\n\nconst mailsplit = __webpack_require__(/*! mailsplit */ \"(rsc)/./node_modules/mailsplit/index.js\");\nconst libmime = __webpack_require__(/*! libmime */ \"(rsc)/./node_modules/libmime/lib/libmime.js\");\nconst addressparser = __webpack_require__(/*! nodemailer/lib/addressparser */ \"(rsc)/./node_modules/mailparser/node_modules/nodemailer/lib/addressparser/index.js\");\nconst Transform = (__webpack_require__(/*! stream */ \"stream\").Transform);\nconst Splitter = mailsplit.Splitter;\nconst punycode = __webpack_require__(/*! punycode.js */ \"(rsc)/./node_modules/punycode.js/punycode.es6.js\");\nconst FlowedDecoder = __webpack_require__(/*! mailsplit/lib/flowed-decoder */ \"(rsc)/./node_modules/mailsplit/lib/flowed-decoder.js\");\nconst StreamHash = __webpack_require__(/*! ./stream-hash */ \"(rsc)/./node_modules/mailparser/lib/stream-hash.js\");\nconst iconv = __webpack_require__(/*! iconv-lite */ \"(rsc)/./node_modules/iconv-lite/lib/index.js\");\nconst { htmlToText } = __webpack_require__(/*! html-to-text */ \"(rsc)/./node_modules/html-to-text/lib/html-to-text.cjs\");\nconst he = __webpack_require__(/*! he */ \"(rsc)/./node_modules/he/he.js\");\nconst linkify = __webpack_require__(/*! linkify-it */ \"(rsc)/./node_modules/linkify-it/build/index.cjs.js\")();\nconst tlds = __webpack_require__(/*! tlds */ \"(rsc)/./node_modules/tlds/index.json\");\nconst encodingJapanese = __webpack_require__(/*! encoding-japanese */ \"(rsc)/./node_modules/encoding-japanese/src/index.js\");\n\nlinkify\n .tlds(tlds) // Reload with full tlds list\n .tlds('onion', true) // Add unofficial `.onion` domain\n .add('git:', 'http:') // Add `git:` ptotocol as \"alias\"\n .add('ftp:', null) // Disable `ftp:` ptotocol\n .set({ fuzzyIP: true, fuzzyLink: true, fuzzyEmail: true });\n\n// twitter linkifier from\n// https://github.com/markdown-it/linkify-it#example-2-add-twitter-mentions-handler\nlinkify.add('@', {\n validate(text, pos, self) {\n let tail = text.slice(pos);\n\n if (!self.re.twitter) {\n self.re.twitter = new RegExp('^([a-zA-Z0-9_]){1,15}(?!_)(?=$|' + self.re.src_ZPCc + ')');\n }\n if (self.re.twitter.test(tail)) {\n // Linkifier allows punctuation chars before prefix,\n // but we additionally disable `@` (\"@@mention\" is invalid)\n if (pos >= 2 && tail[pos - 2] === '@') {\n return false;\n }\n return tail.match(self.re.twitter)[0].length;\n }\n return 0;\n },\n normalize(match) {\n match.url = 'https://twitter.com/' + match.url.replace(/^@/, '');\n }\n});\n\nclass IconvDecoder extends Transform {\n constructor(Iconv, charset) {\n super();\n\n // Iconv throws error on ks_c_5601-1987 when it is mapped to EUC-KR\n // https://github.com/bnoordhuis/node-iconv/issues/169\n if (charset.toLowerCase() === 'ks_c_5601-1987') {\n charset = 'CP949';\n }\n this.stream = new Iconv(charset, 'UTF-8//TRANSLIT//IGNORE');\n\n this.inputEnded = false;\n this.endCb = false;\n\n this.stream.on('error', err => this.emit('error', err));\n this.stream.on('data', chunk => this.push(chunk));\n this.stream.on('end', () => {\n this.inputEnded = true;\n if (typeof this.endCb === 'function') {\n this.endCb();\n }\n });\n }\n\n _transform(chunk, encoding, done) {\n this.stream.write(chunk);\n done();\n }\n\n _flush(done) {\n this.endCb = done;\n this.stream.end();\n }\n}\n\nclass JPDecoder extends Transform {\n constructor(charset) {\n super();\n\n this.charset = charset;\n this.chunks = [];\n this.chunklen = 0;\n }\n\n _transform(chunk, encoding, done) {\n if (typeof chunk === 'string') {\n chunk = Buffer.from(chunk, encoding);\n }\n\n this.chunks.push(chunk);\n this.chunklen += chunk.length;\n done();\n }\n\n _flush(done) {\n let input = Buffer.concat(this.chunks, this.chunklen);\n try {\n let output = encodingJapanese.convert(input, {\n to: 'UNICODE', // to_encoding\n from: this.charset, // from_encoding\n type: 'string'\n });\n if (typeof output === 'string') {\n output = Buffer.from(output);\n }\n this.push(output);\n } catch (err) {\n // keep as is on errors\n this.push(input);\n }\n\n done();\n }\n}\n\nclass MailParser extends Transform {\n constructor(config) {\n super({\n readableObjectMode: true,\n writableObjectMode: false\n });\n\n this.options = config || {};\n this.splitter = new Splitter(config);\n this.finished = false;\n this.waitingEnd = false;\n\n this.headers = false;\n this.headerLines = false;\n\n this.endReceived = false;\n this.reading = false;\n this.hasFailed = false;\n\n this.tree = false;\n this.curnode = false;\n this.waitUntilAttachmentEnd = false;\n this.attachmentCallback = false;\n\n this.hasHtml = false;\n this.hasText = false;\n\n this.text = false;\n this.html = false;\n this.textAsHtml = false;\n\n this.attachmentList = [];\n\n this.boundaries = [];\n\n this.textTypes = ['text/plain', 'text/html'].concat(!this.options.keepDeliveryStatus ? 'message/delivery-status' : []);\n\n this.decoder = this.getDecoder();\n\n this.splitter.on('readable', () => {\n if (this.reading) {\n return false;\n }\n this.readData();\n });\n\n this.splitter.on('end', () => {\n this.endReceived = true;\n if (!this.reading) {\n this.endStream();\n }\n });\n\n this.splitter.on('error', err => {\n this.hasFailed = true;\n if (typeof this.waitingEnd === 'function') {\n return this.waitingEnd(err);\n }\n this.emit('error', err);\n });\n\n this.libmime = new libmime.Libmime({ Iconv: this.options.Iconv });\n }\n\n getDecoder() {\n if (this.options.Iconv) {\n const Iconv = this.options.Iconv;\n // create wrapper\n return {\n decodeStream(charset) {\n return new IconvDecoder(Iconv, charset);\n }\n };\n } else {\n return {\n decodeStream(charset) {\n charset = (charset || 'ascii').toString().trim().toLowerCase();\n if (/^jis|^iso-?2022-?jp|^EUCJP/i.test(charset)) {\n // special case not supported by iconv-lite\n return new JPDecoder(charset);\n }\n\n return iconv.decodeStream(charset);\n }\n };\n }\n }\n\n readData() {\n if (this.hasFailed) {\n return false;\n }\n this.reading = true;\n let data = this.splitter.read();\n if (data === null) {\n this.reading = false;\n if (this.endReceived) {\n this.endStream();\n }\n return;\n }\n\n this.processChunk(data, err => {\n if (err) {\n if (typeof this.waitingEnd === 'function') {\n return this.waitingEnd(err);\n }\n return this.emit('error', err);\n }\n setImmediate(() => this.readData());\n });\n }\n\n endStream() {\n this.finished = true;\n\n if (this.curnode && this.curnode.decoder) {\n this.curnode.decoder.end();\n }\n if (typeof this.waitingEnd === 'function') {\n this.waitingEnd();\n }\n }\n\n _transform(chunk, encoding, done) {\n if (!chunk || !chunk.length) {\n return done();\n }\n\n if (this.splitter.write(chunk) === false) {\n return this.splitter.once('drain', () => {\n done();\n });\n } else {\n return done();\n }\n }\n\n _flush(done) {\n setImmediate(() => this.splitter.end());\n if (this.finished) {\n return this.cleanup(done);\n }\n this.waitingEnd = () => {\n this.cleanup(() => {\n done();\n });\n };\n }\n\n cleanup(done) {\n let finish = () => {\n try {\n let t = this.getTextContent();\n this.push(t);\n } catch (err) {\n return this.emit('error', err);\n }\n\n done();\n };\n\n if (this.curnode && this.curnode.decoder && this.curnode.decoder.readable && !this.decoderEnded) {\n (this.curnode.contentStream || this.curnode.decoder).once('end', () => {\n finish();\n });\n this.curnode.decoder.end();\n } else {\n setImmediate(() => {\n finish();\n });\n }\n }\n\n processHeaders(lines) {\n let headers = new Map();\n (lines || []).forEach(line => {\n let key = line.key;\n let value = ((this.libmime.decodeHeader(line.line) || {}).value || '').toString().trim();\n value = Buffer.from(value, 'binary').toString();\n switch (key) {\n case 'content-type':\n case 'content-disposition':\n case 'dkim-signature':\n value = this.libmime.parseHeaderValue(value);\n if (value.value) {\n value.value = this.libmime.decodeWords(value.value);\n }\n Object.keys((value && value.params) || {}).forEach(key => {\n try {\n value.params[key] = this.libmime.decodeWords(value.params[key]);\n } catch (E) {\n // ignore, keep as is\n }\n });\n break;\n case 'date': {\n let dateValue = new Date(value);\n if (isNaN(dateValue)) {\n // date parsing failed :S\n dateValue = new Date();\n }\n value = dateValue;\n break;\n }\n case 'subject':\n try {\n value = this.libmime.decodeWords(value);\n } catch (E) {\n // ignore, keep as is\n }\n break;\n case 'references':\n try {\n value = this.libmime.decodeWords(value);\n } catch (E) {\n // ignore\n }\n value = value.split(/\\s+/).map(this.ensureMessageIDFormat);\n break;\n case 'message-id':\n case 'in-reply-to':\n try {\n value = this.libmime.decodeWords(value);\n } catch (E) {\n // ignore\n }\n value = this.ensureMessageIDFormat(value);\n break;\n case 'priority':\n case 'x-priority':\n case 'x-msmail-priority':\n case 'importance':\n key = 'priority';\n value = this.parsePriority(value);\n break;\n case 'from':\n case 'to':\n case 'cc':\n case 'bcc':\n case 'sender':\n case 'reply-to':\n case 'delivered-to':\n case 'return-path':\n case 'disposition-notification-to':\n value = addressparser(value);\n this.decodeAddresses(value);\n value = {\n value,\n html: this.getAddressesHTML(value),\n text: this.getAddressesText(value)\n };\n break;\n }\n\n // handle list-* keys\n if (key.substr(0, 5) === 'list-') {\n value = this.parseListHeader(key.substr(5), value);\n key = 'list';\n }\n\n if (value) {\n if (!headers.has(key)) {\n headers.set(key, [].concat(value || []));\n } else if (Array.isArray(value)) {\n headers.set(key, headers.get(key).concat(value));\n } else {\n headers.get(key).push(value);\n }\n }\n });\n\n // keep only the first value\n let singleKeys = [\n 'message-id',\n 'content-id',\n 'from',\n 'sender',\n 'in-reply-to',\n 'reply-to',\n 'subject',\n 'date',\n 'content-disposition',\n 'content-type',\n 'content-transfer-encoding',\n 'priority',\n 'mime-version',\n 'content-description',\n 'precedence',\n 'errors-to',\n 'disposition-notification-to'\n ];\n\n headers.forEach((value, key) => {\n if (Array.isArray(value)) {\n if (singleKeys.includes(key) && value.length) {\n headers.set(key, value[value.length - 1]);\n } else if (value.length === 1) {\n headers.set(key, value[0]);\n }\n }\n\n if (key === 'list') {\n // normalize List-* headers\n let listValue = {};\n [].concat(value || []).forEach(val => {\n Object.keys(val || {}).forEach(listKey => {\n listValue[listKey] = val[listKey];\n });\n });\n headers.set(key, listValue);\n }\n });\n\n return headers;\n }\n\n parseListHeader(key, value) {\n let addresses = addressparser(value);\n let response = {};\n let data = addresses\n .map(address => {\n if (/^https?:/i.test(address.name)) {\n response.url = address.name;\n } else if (address.name) {\n response.name = address.name;\n }\n if (/^mailto:/.test(address.address)) {\n response.mail = address.address.substr(7);\n } else if (address.address && address.address.indexOf('@') < 0) {\n response.id = address.address;\n } else if (address.address) {\n response.mail = address.address;\n }\n if (Object.keys(response).length) {\n return response;\n }\n return false;\n })\n .filter(address => address);\n if (data.length) {\n return {\n [key]: response\n };\n }\n return false;\n }\n\n parsePriority(value) {\n value = value.toLowerCase().trim();\n if (!isNaN(parseInt(value, 10))) {\n // support \"X-Priority: 1 (Highest)\"\n value = parseInt(value, 10) || 0;\n if (value === 3) {\n return 'normal';\n } else if (value > 3) {\n return 'low';\n } else {\n return 'high';\n }\n } else {\n switch (value) {\n case 'non-urgent':\n case 'low':\n return 'low';\n case 'urgent':\n case 'high':\n return 'high';\n }\n }\n return 'normal';\n }\n\n ensureMessageIDFormat(value) {\n if (!value.length) {\n return false;\n }\n\n if (value.charAt(0) !== '<') {\n value = '<' + value;\n }\n\n if (value.charAt(value.length - 1) !== '>') {\n value += '>';\n }\n\n return value;\n }\n\n decodeAddresses(addresses) {\n let processedAddress = new WeakSet();\n for (let i = 0; i < addresses.length; i++) {\n let address = addresses[i];\n address.name = (address.name || '').toString().trim();\n\n if (!address.address && /^(=\\?([^?]+)\\?[Bb]\\?[^?]*\\?=)(\\s*=\\?([^?]+)\\?[Bb]\\?[^?]*\\?=)*$/.test(address.name) && !processedAddress.has(address)) {\n let parsed = addressparser(this.libmime.decodeWords(address.name));\n if (parsed.length) {\n parsed.forEach(entry => {\n processedAddress.add(entry);\n addresses.push(entry);\n });\n }\n\n // remove current element\n addresses.splice(i, 1);\n i--;\n continue;\n }\n\n if (address.name) {\n try {\n address.name = this.libmime.decodeWords(address.name);\n } catch (E) {\n //ignore, keep as is\n }\n }\n if (/@xn--/.test(address.address)) {\n try {\n address.address =\n address.address.substr(0, address.address.lastIndexOf('@') + 1) +\n punycode.toUnicode(address.address.substr(address.address.lastIndexOf('@') + 1));\n } catch (E) {\n // Not a valid punycode string; keep as is\n }\n }\n if (address.group) {\n this.decodeAddresses(address.group);\n }\n }\n }\n\n createNode(node) {\n let contentType = node.contentType;\n let disposition = node.disposition;\n let encoding = node.encoding;\n let charset = node.charset;\n\n if (!contentType && node.root) {\n contentType = 'text/plain';\n }\n\n let newNode = {\n node,\n headerLines: node.headers.lines,\n headers: this.processHeaders(node.headers.getList()),\n contentType,\n children: []\n };\n\n if (!/^multipart\\//i.test(contentType)) {\n if (disposition && !['attachment', 'inline'].includes(disposition)) {\n disposition = 'attachment';\n }\n\n if (!disposition && !this.textTypes.includes(contentType)) {\n newNode.disposition = 'attachment';\n } else {\n newNode.disposition = disposition || 'inline';\n }\n\n newNode.isAttachment = !this.textTypes.includes(contentType) || newNode.disposition !== 'inline';\n\n newNode.encoding = ['quoted-printable', 'base64'].includes(encoding) ? encoding : 'binary';\n\n if (charset) {\n newNode.charset = charset;\n }\n\n let decoder = node.getDecoder();\n decoder.on('end', () => {\n this.decoderEnded = true;\n });\n newNode.decoder = decoder;\n }\n\n if (node.root) {\n this.headers = newNode.headers;\n this.headerLines = newNode.headerLines;\n }\n\n // find location in tree\n\n if (!this.tree) {\n newNode.root = true;\n this.curnode = this.tree = newNode;\n return newNode;\n }\n\n // immediate child of root node\n if (!this.curnode.parent) {\n newNode.parent = this.curnode;\n this.curnode.children.push(newNode);\n this.curnode = newNode;\n return newNode;\n }\n\n // siblings\n if (this.curnode.parent.node === node.parentNode) {\n newNode.parent = this.curnode.parent;\n this.curnode.parent.children.push(newNode);\n this.curnode = newNode;\n return newNode;\n }\n\n // first child\n if (this.curnode.node === node.parentNode) {\n newNode.parent = this.curnode;\n this.curnode.children.push(newNode);\n this.curnode = newNode;\n return newNode;\n }\n\n // move up\n let parentNode = this.curnode;\n while ((parentNode = parentNode.parent)) {\n if (parentNode.node === node.parentNode) {\n newNode.parent = parentNode;\n parentNode.children.push(newNode);\n this.curnode = newNode;\n return newNode;\n }\n }\n\n // should never happen, can't detect parent\n this.curnode = newNode;\n return newNode;\n }\n\n getTextContent() {\n let text = [];\n let html = [];\n let processNode = (alternative, level, node) => {\n if (node.showMeta) {\n let meta = ['From', 'Subject', 'Date', 'To', 'Cc', 'Bcc']\n .map(fkey => {\n let key = fkey.toLowerCase();\n if (!node.headers.has(key)) {\n return false;\n }\n let value = node.headers.get(key);\n if (!value) {\n return false;\n }\n return {\n key: fkey,\n value: Array.isArray(value) ? value[value.length - 1] : value\n };\n })\n .filter(entry => entry);\n if (this.hasHtml) {\n html.push(\n '<table class=\"mp_head\">' +\n meta\n .map(entry => {\n let value = entry.value;\n switch (entry.key) {\n case 'From':\n case 'To':\n case 'Cc':\n case 'Bcc':\n value = value.html;\n break;\n case 'Date':\n value = this.options.formatDateString ? this.options.formatDateString(value) : value.toUTCString();\n break;\n case 'Subject':\n value = '<strong>' + he.encode(value) + '</strong>';\n break;\n default:\n value = he.encode(value);\n }\n\n return '<tr><td class=\"mp_head_key\">' + he.encode(entry.key) + ':</td><td class=\"mp_head_value\">' + value + '<td></tr>';\n })\n .join('\\n') +\n '<table>'\n );\n }\n if (this.hasText) {\n text.push(\n '\\n' +\n meta\n .map(entry => {\n let value = entry.value;\n switch (entry.key) {\n case 'From':\n case 'To':\n case 'Cc':\n case 'Bcc':\n value = value.text;\n break;\n case 'Date':\n value = this.options.formatDateString ? this.options.formatDateString(value) : value.toUTCString();\n break;\n }\n return entry.key + ': ' + value;\n })\n .join('\\n') +\n '\\n'\n );\n }\n }\n if (node.textContent) {\n if (node.contentType === 'text/plain') {\n text.push(node.textContent);\n if (!alternative && this.hasHtml) {\n html.push(this.textToHtml(node.textContent));\n }\n } else if (node.contentType === 'message/delivery-status' && !this.options.keepDeliveryStatus) {\n text.push(node.textContent);\n if (!alternative && this.hasHtml) {\n html.push(this.textToHtml(node.textContent));\n }\n } else if (node.contentType === 'text/html') {\n let failedToParseHtml = false;\n if ((!alternative && this.hasText) || (node.root && !this.hasText)) {\n if (this.options.skipHtmlToText) {\n text.push('');\n } else if (node.textContent.length > this.options.maxHtmlLengthToParse) {\n this.emit('error', new Error(`HTML too long for parsing ${node.textContent.length} bytes`));\n text.push('Invalid HTML content (too long)');\n failedToParseHtml = true;\n } else {\n try {\n text.push(htmlToText(node.textContent));\n } catch (err) {\n this.emit('error', new Error('Failed to parse HTML'));\n text.push('Invalid HTML content');\n failedToParseHtml = true;\n }\n }\n }\n if (!failedToParseHtml) {\n html.push(node.textContent);\n }\n }\n }\n alternative = alternative || node.contentType === 'multipart/alternative';\n if (node.children) {\n node.children.forEach(subNode => {\n processNode(alternative, level + 1, subNode);\n });\n }\n };\n\n processNode(false, 0, this.tree);\n\n let response = {\n type: 'text'\n };\n if (html.length) {\n this.html = response.html = html.join('<br/>\\n');\n }\n if (text.length) {\n this.text = response.text = text.join('\\n');\n this.textAsHtml = response.textAsHtml = text.map(part => this.textToHtml(part)).join('<br/>\\n');\n }\n return response;\n }\n\n processChunk(data, done) {\n let partId = null;\n if (data._parentBoundary) {\n partId = this._getPartId(data._parentBoundary);\n }\n switch (data.type) {\n case 'node': {\n let node = this.createNode(data);\n if (node === this.tree) {\n ['subject', 'references', 'date', 'to', 'from', 'to', 'cc', 'bcc', 'message-id', 'in-reply-to', 'reply-to'].forEach(key => {\n if (node.headers.has(key)) {\n this[key.replace(/-([a-z])/g, (m, c) => c.toUpperCase())] = node.headers.get(key);\n }\n });\n this.emit('headers', node.headers);\n\n if (node.headerLines) {\n this.emit('headerLines', node.headerLines);\n } \n }\n\n if (data.contentType === 'message/rfc822' && data.messageNode) {\n break;\n }\n\n if (data.parentNode && data.parentNode.contentType === 'message/rfc822') {\n node.showMeta = true;\n }\n\n if (node.isAttachment) {\n let contentType = node.contentType;\n if (node.contentType === 'application/octet-stream' && data.filename) {\n contentType = this.libmime.detectMimeType(data.filename) || 'application/octet-stream';\n }\n\n let attachment = {\n type: 'attachment',\n content: null,\n contentType,\n partId,\n release: () => {\n attachment.release = null;\n if (this.waitUntilAttachmentEnd && typeof this.attachmentCallback === 'function') {\n setImmediate(this.attachmentCallback);\n }\n this.attachmentCallback = false;\n this.waitUntilAttachmentEnd = false;\n }\n };\n\n let algo = this.options.checksumAlgo || 'md5';\n let hasher = new StreamHash(attachment, algo);\n node.decoder.on('error', err => {\n hasher.emit('error', err);\n });\n\n node.decoder.on('readable', () => {\n let chunk;\n\n while ((chunk = node.decoder.read()) !== null) {\n hasher.write(chunk);\n }\n });\n\n node.decoder.once('end', () => {\n hasher.end();\n });\n\n //node.decoder.pipe(hasher);\n attachment.content = hasher;\n\n this.waitUntilAttachmentEnd = true;\n if (data.disposition) {\n attachment.contentDisposition = data.disposition;\n }\n\n if (data.filename) {\n attachment.filename = data.filename;\n }\n\n if (node.headers.has('content-id')) {\n attachment.contentId = [].concat(node.headers.get('content-id') || []).shift();\n attachment.cid = attachment.contentId.trim().replace(/^<|>$/g, '').trim();\n // check if the attachment is \"related\" to text content like an embedded image etc\n let parentNode = node;\n while ((parentNode = parentNode.parent)) {\n if (parentNode.contentType === 'multipart/related') {\n attachment.related = true;\n }\n }\n }\n\n attachment.headers = node.headers;\n this.push(attachment);\n this.attachmentList.push(attachment);\n } else if (node.disposition === 'inline') {\n let chunks = [];\n let chunklen = 0;\n node.contentStream = node.decoder;\n\n if (node.contentType === 'text/plain') {\n this.hasText = true;\n } else if (node.contentType === 'text/html') {\n this.hasHtml = true;\n } else if (node.contentType === 'message/delivery-status' && !this.options.keepDeliveryStatus) {\n this.hasText = true;\n }\n\n if (node.node.flowed) {\n let contentStream = node.contentStream;\n let flowDecoder = new FlowedDecoder({\n delSp: node.node.delSp\n });\n contentStream.on('error', err => {\n flowDecoder.emit('error', err);\n });\n contentStream.pipe(flowDecoder);\n node.contentStream = flowDecoder;\n }\n\n let charset = node.charset || 'utf-8';\n //charset = charset || 'windows-1257';\n\n if (!['ascii', 'usascii', 'utf8'].includes(charset.toLowerCase().replace(/[^a-z0-9]+/g, ''))) {\n try {\n let contentStream = node.contentStream;\n let decodeStream = this.decoder.decodeStream(charset);\n contentStream.on('error', err => {\n decodeStream.emit('error', err);\n });\n contentStream.pipe(decodeStream);\n node.contentStream = decodeStream;\n } catch (E) {\n // do not decode charset\n }\n }\n\n node.contentStream.on('readable', () => {\n let chunk;\n while ((chunk = node.contentStream.read()) !== null) {\n if (typeof chunk === 'string') {\n chunk = Buffer.from(chunk);\n }\n chunks.push(chunk);\n chunklen += chunk.length;\n }\n });\n\n node.contentStream.once('end', () => {\n node.textContent = Buffer.concat(chunks, chunklen).toString().replace(/\\r?\\n/g, '\\n');\n });\n\n node.contentStream.once('error', err => {\n this.emit('error', err);\n });\n }\n\n break;\n }\n\n case 'data':\n if (this.curnode && this.curnode.decoder) {\n this.curnode.decoder.end();\n }\n\n if (this.waitUntilAttachmentEnd) {\n this.attachmentCallback = done;\n return;\n }\n\n // multipart message structure\n // this is not related to any specific 'node' block as it includes\n // everything between the end of some node body and between the next header\n //process.stdout.write(data.value);\n break;\n\n case 'body':\n if (this.curnode && this.curnode.decoder && this.curnode.decoder.writable) {\n if (this.curnode.decoder.write(data.value) === false) {\n return this.curnode.decoder.once('drain', done);\n }\n }\n\n // Leaf element body. Includes the body for the last 'node' block. You might\n // have several 'body' calls for a single 'node' block\n //process.stdout.write(data.value);\n break;\n }\n\n setImmediate(done);\n }\n\n _getPartId(parentBoundary) {\n let boundaryIndex = this.boundaries.findIndex(item => item.name === parentBoundary);\n if (boundaryIndex === -1) {\n this.boundaries.push({ name: parentBoundary, count: 1 });\n boundaryIndex = this.boundaries.length - 1;\n } else {\n this.boundaries[boundaryIndex].count++;\n }\n let partId = '1';\n for (let i = 0; i <= boundaryIndex; i++) {\n if (i === 0) partId = this.boundaries[i].count.toString();\n else partId += '.' + this.boundaries[i].count.toString();\n }\n return partId;\n }\n\n getAddressesHTML(value) {\n let formatSingleLevel = addresses =>\n addresses\n .map(address => {\n let str = '<span class=\"mp_address_group\">';\n if (address.name) {\n str += '<span class=\"mp_address_name\">' + he.encode(address.name) + (address.group ? ': ' : '') + '</span>';\n }\n if (address.address) {\n let link = '<a href=\"mailto:' + he.encode(address.address) + '\" class=\"mp_address_email\">' + he.encode(address.address) + '</a>';\n if (address.name) {\n str += ' <' + link + '>';\n } else {\n str += link;\n }\n }\n if (address.group) {\n str += formatSingleLevel(address.group) + ';';\n }\n return str + '</span>';\n })\n .join(', ');\n return formatSingleLevel([].concat(value || []));\n }\n\n getAddressesText(value) {\n let formatSingleLevel = addresses =>\n addresses\n .map(address => {\n let str = '';\n if (address.name) {\n str += `\"${address.name}\"` + (address.group ? ': ' : '');\n }\n if (address.address) {\n let link = address.address;\n if (address.name) {\n str += ' <' + link + '>';\n } else {\n str += link;\n }\n }\n if (address.group) {\n str += formatSingleLevel(address.group) + ';';\n }\n return str;\n })\n .join(', ');\n return formatSingleLevel([].concat(value || []));\n }\n\n updateImageLinks(replaceCallback, done) {\n if (!this.html) {\n return setImmediate(() => done(null, false));\n }\n\n let cids = new Map();\n let html = (this.html || '').toString();\n\n if (this.options.skipImageLinks) {\n return done(null, html);\n }\n\n html.replace(/\\bcid:([^'\"\\s]{1,256})/g, (match, cid) => {\n for (let i = 0, len = this.attachmentList.length; i < len; i++) {\n if (this.attachmentList[i].cid === cid && /^image\\/[\\w]+$/i.test(this.attachmentList[i].contentType)) {\n cids.set(cid, {\n attachment: this.attachmentList[i]\n });\n break;\n }\n }\n return match;\n });\n\n let cidList = [];\n cids.forEach(entry => {\n cidList.push(entry);\n });\n\n let pos = 0;\n let processNext = () => {\n if (pos >= cidList.length) {\n html = html.replace(/\\bcid:([^'\"\\s]{1,256})/g, (match, cid) => {\n if (cids.has(cid) && cids.get(cid).url) {\n return cids.get(cid).url;\n }\n return match;\n });\n\n return done(null, html);\n }\n let entry = cidList[pos++];\n replaceCallback(entry.attachment, (err, url) => {\n if (err) {\n return setImmediate(() => done(err));\n }\n entry.url = url;\n setImmediate(processNext);\n });\n };\n\n setImmediate(processNext);\n }\n\n textToHtml(str) {\n if (this.options.skipTextToHtml) {\n return '';\n }\n str = (str || '').toString();\n let encoded;\n\n let linkified = false;\n if (!this.options.skipTextLinks) {\n try {\n if (linkify.pretest(str)) {\n linkified = true;\n let links = linkify.match(str) || [];\n let result = [];\n let last = 0;\n\n links.forEach(link => {\n if (last < link.index) {\n let textPart = he\n // encode special chars\n .encode(str.slice(last, link.index), {\n useNamedReferences: true\n });\n result.push(textPart);\n }\n\n result.push(`<a href=\"${link.url}\">${link.text}</a>`);\n\n last = link.lastIndex;\n });\n\n let textPart = he\n // encode special chars\n .encode(str.slice(last), {\n useNamedReferences: true\n });\n result.push(textPart);\n\n encoded = result.join('');\n }\n } catch (E) {\n // failed, don't linkify\n }\n }\n\n if (!linkified) {\n encoded = he\n // encode special chars\n .encode(str, {\n useNamedReferences: true\n });\n }\n\n let text =\n '<p>' +\n encoded\n .replace(/\\r?\\n/g, '\\n')\n .trim() // normalize line endings\n .replace(/[ \\t]+$/gm, '')\n .trim() // trim empty line endings\n .replace(/\\n\\n+/g, '</p><p>')\n .trim() // insert <p> to multiple linebreaks\n .replace(/\\n/g, '<br/>') + // insert <br> to single linebreaks\n '</p>';\n\n return text;\n }\n}\n\nmodule.exports = MailParser;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHJzYykvLi9ub2RlX21vZHVsZXMvbWFpbHBhcnNlci9saWIvbWFpbC1wYXJzZXIuanMiLCJtYXBwaW5ncyI6IkFBQWE7O0FBRWIsa0JBQWtCLG1CQUFPLENBQUMsMERBQVc7QUFDckMsZ0JBQWdCLG1CQUFPLENBQUMsNERBQVM7QUFDakMsc0JBQXNCLG1CQUFPLENBQUMsd0hBQThCO0FBQzVELGtCQUFrQix1REFBMkI7QUFDN0M7QUFDQSxpQkFBaUIsbUJBQU8sQ0FBQyxxRUFBYTtBQUN0QyxzQkFBc0IsbUJBQU8sQ0FBQywwRkFBOEI7QUFDNUQsbUJBQW1CLG1CQUFPLENBQUMseUVBQWU7QUFDMUMsY0FBYyxtQkFBTyxDQUFDLGdFQUFZO0FBQ2xDLFFBQVEsYUFBYSxFQUFFLG1CQUFPLENBQUMsNEVBQWM7QUFDN0MsV0FBVyxtQkFBTyxDQUFDLHlDQUFJO0FBQ3ZCLGdCQUFnQixtQkFBTyxDQUFDLHNFQUFZO0FBQ3BDLGFBQWEsbUJBQU8sQ0FBQyxrREFBTTtBQUMzQix5QkFBeUIsbUJBQU8sQ0FBQyw4RUFBbUI7O0FBRXBEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLGtEQUFrRDs7QUFFN0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLDBEQUEwRCxLQUFLO0FBQy9EO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVCw2Q0FBNkMsMkJBQTJCO0FBQ3hFOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2IsVUFBVTtBQUNWO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9FQUFvRTtBQUNwRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2REFBNkQ7QUFDN0Q7QUFDQTtBQUNBLDBCQUEwQjtBQUMxQjtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQjtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0I7QUFDbEI7QUFDQSxrQkFBa0I7QUFDbEI7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlDQUF5QztBQUN6QztBQUNBLHFCQUFxQjtBQUNyQixpQkFBaUI7QUFDakI7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQjtBQUNsQjtBQUNBLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSx3QkFBd0Isc0JBQXNCO0FBQzlDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0I7QUFDbEIsb0RBQW9EO0FBQ3BEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsaUNBQWlDO0FBQ2pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUNBQWlDO0FBQ2pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0I7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0I7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQkFBMEI7QUFDMUIsc0ZBQXNGLHlCQUF5QjtBQUMvRztBQUNBO0FBQ0EsMEJBQTBCO0FBQzFCO0FBQ0E7QUFDQSw4QkFBOEI7QUFDOUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCOztBQUVyQjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQjs7QUFFckI7QUFDQTtBQUNBLHFCQUFxQjs7QUFFckI7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0I7QUFDbEI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxzQkFBc0I7QUFDdEI7QUFDQSxzQkFBc0I7QUFDdEI7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlCQUF5QjtBQUN6QjtBQUNBO0FBQ0EseUJBQXlCO0FBQ3pCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZCQUE2QjtBQUM3QjtBQUNBO0FBQ0EsMEJBQTBCO0FBQzFCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7O0FBRXJCO0FBQ0E7QUFDQSxxQkFBcUI7O0FBRXJCO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsbUNBQW1DLGdDQUFnQztBQUNuRTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQSx3QkFBd0Isb0JBQW9CO0FBQzVDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlDQUF5QyxnQkFBZ0I7QUFDekQsMEJBQTBCO0FBQzFCO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0VBQW9FO0FBQ3BFO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1DQUFtQyxhQUFhO0FBQ2hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQkFBMEI7QUFDMUI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvRUFBb0U7QUFDcEU7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEscUNBQXFDLE1BQU07QUFDM0MsOERBQThELFNBQVM7QUFDdkU7QUFDQTtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQTtBQUNBLG9EQUFvRCxNQUFNO0FBQzFEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCOztBQUVqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQ0FBaUM7QUFDakM7QUFDQTs7QUFFQSxnREFBZ0QsU0FBUyxJQUFJLFVBQVU7O0FBRXZFO0FBQ0EscUJBQXFCOztBQUVyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlCQUF5QjtBQUN6Qjs7QUFFQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBIiwic291cmNlcyI6WyIvaG9tZS9hbG1hL25leHRnZW4vTmVhaC1tYWlsL25vZGVfbW9kdWxlcy9tYWlscGFyc2VyL2xpYi9tYWlsLXBhcnNlci5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbmNvbnN0IG1haWxzcGxpdCA9IHJlcXVpcmUoJ21haWxzcGxpdCcpO1xuY29uc3QgbGlibWltZSA9IHJlcXVpcmUoJ2xpYm1pbWUnKTtcbmNvbnN0IGFkZHJlc3NwYXJzZXIgPSByZXF1aXJlKCdub2RlbWFpbGVyL2xpYi9hZGRyZXNzcGFyc2VyJyk7XG5jb25zdCBUcmFuc2Zvcm0gPSByZXF1aXJlKCdzdHJlYW0nKS5UcmFuc2Zvcm07XG5jb25zdCBTcGxpdHRlciA9IG1haWxzcGxpdC5TcGxpdHRlcjtcbmNvbnN0IHB1bnljb2RlID0gcmVxdWlyZSgncHVueWNvZGUuanMnKTtcbmNvbnN0IEZsb3dlZERlY29kZXIgPSByZXF1aXJlKCdtYWlsc3BsaXQvbGliL2Zsb3dlZC1kZWNvZGVyJyk7XG5jb25zdCBTdHJlYW1IYXNoID0gcmVxdWlyZSgnLi9zdHJlYW0taGFzaCcpO1xuY29uc3QgaWNvbnYgPSByZXF1aXJlKCdpY29udi1saXRlJyk7XG5jb25zdCB7IGh0bWxUb1RleHQgfSA9IHJlcXVpcmUoJ2h0bWwtdG8tdGV4dCcpO1xuY29uc3QgaGUgPSByZXF1aXJlKCdoZScpO1xuY29uc3QgbGlua2lmeSA9IHJlcXVpcmUoJ2xpbmtpZnktaXQnKSgpO1xuY29uc3QgdGxkcyA9IHJlcXVpcmUoJ3RsZHMnKTtcbmNvbnN0IGVuY29kaW5nSmFwYW5lc2UgPSByZXF1aXJlKCdlbmNvZGluZy1qYXBhbmVzZScpO1xuXG5saW5raWZ5XG4gICAgLnRsZHModGxkcykgLy8gUmVsb2FkIHdpdGggZnVsbCB0bGRzIGxpc3RcbiAgICAudGxkcygnb25pb24nLCB0cnVlKSAvLyBBZGQgdW5vZmZpY2lhbCBgLm9uaW9uYCBkb21haW5cbiAgICAuYWRkKCdnaXQ6JywgJ2h0dHA6JykgLy8gQWRkIGBnaXQ6YCBwdG90b2NvbCBhcyBcImFsaWFzXCJcbiAgICAuYWRkKCdmdHA6JywgbnVsbCkgLy8gRGlzYWJsZSBgZnRwOmAgcHRvdG9jb2xcbiAgICAuc2V0KHsgZnV6enlJUDogdHJ1ZSwgZnV6enlMaW5rOiB0cnVlLCBmdXp6eUVtYWlsOiB0cnVlIH0pO1xuXG4vLyB0d2l0dGVyIGxpbmtpZmllciBmcm9tXG4vLyBodHRwczovL2dpdGh1Yi5jb20vbWFya2Rvd24taXQvbGlua2lmeS1pdCNleGFtcGxlLTItYWRkLXR3aXR0ZXItbWVudGlvbnMtaGFuZGxlclxubGlua2lmeS5hZGQoJ0AnLCB7XG4gICAgdmFsaWRhdGUodGV4dCwgcG9zLCBzZWxmKSB7XG4gICAgICAgIGxldCB0YWlsID0gdGV4dC5zbGljZShwb3MpO1xuXG4gICAgICAgIGlmICghc2VsZi5yZS50d2l0dGVyKSB7XG4gICAgICAgICAgICBzZWxmLnJlLnR3aXR0ZXIgPSBuZXcgUmVnRXhwKCdeKFthLXpBLVowLTlfXSl7MSwxNX0oPyFfKSg/PSR8JyArIHNlbGYucmUuc3JjX1pQQ2MgKyAnKScpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzZWxmLnJlLnR3aXR0ZXIudGVzdCh0YWlsKSkge1xuICAgICAgICAgICAgLy8gTGlua2lmaWVyIGFsbG93cyBwdW5jdHVhdGlvbiBjaGFycyBiZWZvcmUgcHJlZml4LFxuICAgICAgICAgICAgLy8gYnV0IHdlIGFkZGl0aW9uYWxseSBkaXNhYmxlIGBAYCAoXCJAQG1lbnRpb25cIiBpcyBpbnZhbGlkKVxuICAgICAgICAgICAgaWYgKHBvcyA+PSAyICYmIHRhaWxbcG9zIC0gMl0gPT09ICdAJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0YWlsLm1hdGNoKHNlbGYucmUudHdpdHRlcilbMF0ubGVuZ3RoO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAwO1xuICAgIH0sXG4gICAgbm9ybWFsaXplKG1hdGNoKSB7XG4gICAgICAgIG1hdGNoLnVybCA9ICdodHRwczovL3R3aXR0ZXIuY29tLycgKyBtYXRjaC51cmwucmVwbGFjZSgvXkAvLCAnJyk7XG4gICAgfVxufSk7XG5cbmNsYXNzIEljb252RGVjb2RlciBleHRlbmRzIFRyYW5zZm9ybSB7XG4gICAgY29uc3RydWN0b3IoSWNvbnYsIGNoYXJzZXQpIHtcbiAgICAgICAgc3VwZXIoKTtcblxuICAgICAgICAvLyBJY29udiB0aHJvd3MgZXJyb3Igb24ga3NfY181NjAxLTE5ODcgd2hlbiBpdCBpcyBtYXBwZWQgdG8gRVVDLUtSXG4gICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9ibm9vcmRodWlzL25vZGUtaWNvbnYvaXNzdWVzLzE2OVxuICAgICAgICBpZiAoY2hhcnNldC50b0xvd2VyQ2FzZSgpID09PSAna3NfY181NjAxLTE5ODcnKSB7XG4gICAgICAgICAgICBjaGFyc2V0ID0gJ0NQOTQ5JztcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnN0cmVhbSA9IG5ldyBJY29udihjaGFyc2V0LCAnVVRGLTgvL1RSQU5TTElULy9JR05PUkUnKTtcblxuICAgICAgICB0aGlzLmlucHV0RW5kZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5lbmRDYiA9IGZhbHNlO1xuXG4gICAgICAgIHRoaXMuc3RyZWFtLm9uKCdlcnJvcicsIGVyciA9PiB0aGlzLmVtaXQoJ2Vycm9yJywgZXJyKSk7XG4gICAgICAgIHRoaXMuc3RyZWFtLm9uKCdkYXRhJywgY2h1bmsgPT4gdGhpcy5wdXNoKGNodW5rKSk7XG4gICAgICAgIHRoaXMuc3RyZWFtLm9uKCdlbmQnLCAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmlucHV0RW5kZWQgPSB0cnVlO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmVuZENiID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5lbmRDYigpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBfdHJhbnNmb3JtKGNodW5rLCBlbmNvZGluZywgZG9uZSkge1xuICAgICAgICB0aGlzLnN0cmVhbS53cml0ZShjaHVuayk7XG4gICAgICAgIGRvbmUoKTtcbiAgICB9XG5cbiAgICBfZmx1c2goZG9uZSkge1xuICAgICAgICB0aGlzLmVuZENiID0gZG9uZTtcbiAgICAgICAgdGhpcy5zdHJlYW0uZW5kKCk7XG4gICAgfVxufVxuXG5jbGFzcyBKUERlY29kZXIgZXh0ZW5kcyBUcmFuc2Zvcm0ge1xuICAgIGNvbnN0cnVjdG9yKGNoYXJzZXQpIHtcbiAgICAgICAgc3VwZXIoKTtcblxuICAgICAgICB0aGlzLmNoYXJzZXQgPSBjaGFyc2V0O1xuICAgICAgICB0aGlzLmNodW5rcyA9IFtdO1xuICAgICAgICB0aGlzLmNodW5rbGVuID0gMDtcbiAgICB9XG5cbiAgICBfdHJhbnNmb3JtKGNodW5rLCBlbmNvZGluZywgZG9uZSkge1xuICAgICAgICBpZiAodHlwZW9mIGNodW5rID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgY2h1bmsgPSBCdWZmZXIuZnJvbShjaHVuaywgZW5jb2RpbmcpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jaHVua3MucHVzaChjaHVuayk7XG4gICAgICAgIHRoaXMuY2h1bmtsZW4gKz0gY2h1bmsubGVuZ3RoO1xuICAgICAgICBkb25lKCk7XG4gICAgfVxuXG4gICAgX2ZsdXNoKGRvbmUpIHtcbiAgICAgICAgbGV0IGlucHV0ID0gQnVmZmVyLmNvbmNhdCh0aGlzLmNodW5rcywgdGhpcy5jaHVua2xlbik7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBsZXQgb3V0cHV0ID0gZW5jb2RpbmdKYXBhbmVzZS5jb252ZXJ0KGlucHV0LCB7XG4gICAgICAgICAgICAgICAgdG86ICdVTklDT0RFJywgLy8gdG9fZW5jb2RpbmdcbiAgICAgICAgICAgICAgICBmcm9tOiB0aGlzLmNoYXJzZXQsIC8vIGZyb21fZW5jb2RpbmdcbiAgICAgICAgICAgICAgICB0eXBlOiAnc3RyaW5nJ1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAodHlwZW9mIG91dHB1dCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICBvdXRwdXQgPSBCdWZmZXIuZnJvbShvdXRwdXQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5wdXNoKG91dHB1dCk7XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgLy8ga2VlcCBhcyBpcyBvbiBlcnJvcnNcbiAgICAgICAgICAgIHRoaXMucHVzaChpbnB1dCk7XG4gICAgICAgIH1cblxuICAgICAgICBkb25lKCk7XG4gICAgfVxufVxuXG5jbGFzcyBNYWlsUGFyc2VyIGV4dGVuZHMgVHJhbnNmb3JtIHtcbiAgICBjb25zdHJ1Y3Rvcihjb25maWcpIHtcbiAgICAgICAgc3VwZXIoe1xuICAgICAgICAgICAgcmVhZGFibGVPYmplY3RNb2RlOiB0cnVlLFxuICAgICAgICAgICAgd3JpdGFibGVPYmplY3RNb2RlOiBmYWxzZVxuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLm9wdGlvbnMgPSBjb25maWcgfHwge307XG4gICAgICAgIHRoaXMuc3BsaXR0ZXIgPSBuZXcgU3BsaXR0ZXIoY29uZmlnKTtcbiAgICAgICAgdGhpcy5maW5pc2hlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLndhaXRpbmdFbmQgPSBmYWxzZTtcblxuICAgICAgICB0aGlzLmhlYWRlcnMgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5oZWFkZXJMaW5lcyA9IGZhbHNlO1xuXG4gICAgICAgIHRoaXMuZW5kUmVjZWl2ZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5yZWFkaW5nID0gZmFsc2U7XG4gICAgICAgIHRoaXMuaGFzRmFpbGVkID0gZmFsc2U7XG5cbiAgICAgICAgdGhpcy50cmVlID0gZmFsc2U7XG4gICAgICAgIHRoaXMuY3Vybm9kZSA9IGZhbHNlO1xuICAgICAgICB0aGlzLndhaXRVbnRpbEF0dGFjaG1lbnRFbmQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5hdHRhY2htZW50Q2FsbGJhY2sgPSBmYWxzZTtcblxuICAgICAgICB0aGlzLmhhc0h0bWwgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5oYXNUZXh0ID0gZmFsc2U7XG5cbiAgICAgICAgdGhpcy50ZXh0ID0gZmFsc2U7XG4gICAgICAgIHRoaXMuaHRtbCA9IGZhbHNlO1xuICAgICAgICB0aGlzLnRleHRBc0h0bWwgPSBmYWxzZTtcblxuICAgICAgICB0aGlzLmF0dGFjaG1lbnRMaXN0ID0gW107XG5cbiAgICAgICAgdGhpcy5ib3VuZGFyaWVzID0gW107XG5cbiAgICAgICAgdGhpcy50ZXh0VHlwZXMgPSBbJ3RleHQvcGxhaW4nLCAndGV4dC9odG1sJ10uY29uY2F0KCF0aGlzLm9wdGlvbnMua2VlcERlbGl2ZXJ5U3RhdHVzID8gJ21lc3NhZ2UvZGVsaXZlcnktc3RhdHVzJyA6IFtdKTtcblxuICAgICAgICB0aGlzLmRlY29kZXIgPSB0aGlzLmdldERlY29kZXIoKTtcblxuICAgICAgICB0aGlzLnNwbGl0dGVyLm9uKCdyZWFkYWJsZScsICgpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLnJlYWRpbmcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnJlYWREYXRhKCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuc3BsaXR0ZXIub24oJ2VuZCcsICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuZW5kUmVjZWl2ZWQgPSB0cnVlO1xuICAgICAgICAgICAgaWYgKCF0aGlzLnJlYWRpbmcpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmVuZFN0cmVhbSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLnNwbGl0dGVyLm9uKCdlcnJvcicsIGVyciA9PiB7XG4gICAgICAgICAgICB0aGlzLmhhc0ZhaWxlZCA9IHRydWU7XG4gICAgICAgICAgICBpZiAodHlwZW9mIHRoaXMud2FpdGluZ0VuZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLndhaXRpbmdFbmQoZXJyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuZW1pdCgnZXJyb3InLCBlcnIpO1xuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLmxpYm1pbWUgPSBuZXcgbGlibWltZS5MaWJtaW1lKHsgSWNvbnY6IHRoaXMub3B0aW9ucy5JY29udiB9KTtcbiAgICB9XG5cbiAgICBnZXREZWNvZGVyKCkge1xuICAgICAgICBpZiAodGhpcy5vcHRpb25zLkljb252KSB7XG4gICAgICAgICAgICBjb25zdCBJY29udiA9IHRoaXMub3B0aW9ucy5JY29udjtcbiAgICAgICAgICAgIC8vIGNyZWF0ZSB3cmFwcGVyXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGRlY29kZVN0cmVhbShjaGFyc2V0KSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgSWNvbnZEZWNvZGVyKEljb252LCBjaGFyc2V0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBkZWNvZGVTdHJlYW0oY2hhcnNldCkge1xuICAgICAgICAgICAgICAgICAgICBjaGFyc2V0ID0gKGNoYXJzZXQgfHwgJ2FzY2lpJykudG9TdHJpbmcoKS50cmltKCkudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKC9eamlzfF5pc28tPzIwMjItP2pwfF5FVUNKUC9pLnRlc3QoY2hhcnNldCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNwZWNpYWwgY2FzZSBub3Qgc3VwcG9ydGVkIGJ5IGljb252LWxpdGVcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgSlBEZWNvZGVyKGNoYXJzZXQpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGljb252LmRlY29kZVN0cmVhbShjaGFyc2V0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmVhZERhdGEoKSB7XG4gICAgICAgIGlmICh0aGlzLmhhc0ZhaWxlZCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucmVhZGluZyA9IHRydWU7XG4gICAgICAgIGxldCBkYXRhID0gdGhpcy5zcGxpdHRlci5yZWFkKCk7XG4gICAgICAgIGlmIChkYXRhID09PSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLnJlYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgIGlmICh0aGlzLmVuZFJlY2VpdmVkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5lbmRTdHJlYW0oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucHJvY2Vzc0NodW5rKGRhdGEsIGVyciA9PiB7XG4gICAgICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB0aGlzLndhaXRpbmdFbmQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMud2FpdGluZ0VuZChlcnIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5lbWl0KCdlcnJvcicsIGVycik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzZXRJbW1lZGlhdGUoKCkgPT4gdGhpcy5yZWFkRGF0YSgpKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgZW5kU3RyZWFtKCkge1xuICAgICAgICB0aGlzLmZpbmlzaGVkID0gdHJ1ZTtcblxuICAgICAgICBpZiAodGhpcy5jdXJub2RlICYmIHRoaXMuY3Vybm9kZS5kZWNvZGVyKSB7XG4gICAgICAgICAgICB0aGlzLmN1cm5vZGUuZGVjb2Rlci5lbmQoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHRoaXMud2FpdGluZ0VuZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgdGhpcy53YWl0aW5nRW5kKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBfdHJhbnNmb3JtKGNodW5rLCBlbmNvZGluZywgZG9uZSkge1xuICAgICAgICBpZiAoIWNodW5rIHx8ICFjaHVuay5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiBkb25lKCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5zcGxpdHRlci53cml0ZShjaHVuaykgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5zcGxpdHRlci5vbmNlKCdkcmFpbicsICgpID0+IHtcbiAgICAgICAgICAgICAgICBkb25lKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBkb25lKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBfZmx1c2goZG9uZSkge1xuICAgICAgICBzZXRJbW1lZGlhdGUoKCkgPT4gdGhpcy5zcGxpdHRlci5lbmQoKSk7XG4gICAgICAgIGlmICh0aGlzLmZpbmlzaGVkKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jbGVhbnVwKGRvbmUpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMud2FpdGluZ0VuZCA9ICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuY2xlYW51cCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgZG9uZSgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgY2xlYW51cChkb25lKSB7XG4gICAgICAgIGxldCBmaW5pc2ggPSAoKSA9PiB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGxldCB0ID0gdGhpcy5nZXRUZXh0Q29udGVudCgpO1xuICAgICAgICAgICAgICAgIHRoaXMucHVzaCh0KTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmVtaXQoJ2Vycm9yJywgZXJyKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZG9uZSgpO1xuICAgICAgICB9O1xuXG4gICAgICAgIGlmICh0aGlzLmN1cm5vZGUgJiYgdGhpcy5jdXJub2RlLmRlY29kZXIgJiYgdGhpcy5jdXJub2RlLmRlY29kZXIucmVhZGFibGUgJiYgIXRoaXMuZGVjb2RlckVuZGVkKSB7XG4gICAgICAgICAgICAodGhpcy5jdXJub2RlLmNvbnRlbnRTdHJlYW0gfHwgdGhpcy5jdXJub2RlLmRlY29kZXIpLm9uY2UoJ2VuZCcsICgpID0+IHtcbiAgICAgICAgICAgICAgICBmaW5pc2goKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5jdXJub2RlLmRlY29kZXIuZW5kKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzZXRJbW1lZGlhdGUoKCkgPT4ge1xuICAgICAgICAgICAgICAgIGZpbmlzaCgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcm9jZXNzSGVhZGVycyhsaW5lcykge1xuICAgICAgICBsZXQgaGVhZGVycyA9IG5ldyBNYXAoKTtcbiAgICAgICAgKGxpbmVzIHx8IFtdKS5mb3JFYWNoKGxpbmUgPT4ge1xuICAgICAgICAgICAgbGV0IGtleSA9IGxpbmUua2V5O1xuICAgICAgICAgICAgbGV0IHZhbHVlID0gKCh0aGlzLmxpYm1pbWUuZGVjb2RlSGVhZGVyKGxpbmUubGluZSkgfHwge30pLnZhbHVlIHx8ICcnKS50b1N0cmluZygpLnRyaW0oKTtcbiAgICAgICAgICAgIHZhbHVlID0gQnVmZmVyLmZyb20odmFsdWUsICdiaW5hcnknKS50b1N0cmluZygpO1xuICAgICAgICAgICAgc3dpdGNoIChrZXkpIHtcbiAgICAgICAgICAgICAgICBjYXNlICdjb250ZW50LXR5cGUnOlxuICAgICAgICAgICAgICAgIGNhc2UgJ2NvbnRlbnQtZGlzcG9zaXRpb24nOlxuICAgICAgICAgICAgICAgIGNhc2UgJ2RraW0tc2lnbmF0dXJlJzpcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSB0aGlzLmxpYm1pbWUucGFyc2VIZWFkZXJWYWx1ZSh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZS52YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUudmFsdWUgPSB0aGlzLmxpYm1pbWUuZGVjb2RlV29yZHModmFsdWUudmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIE9iamVjdC5rZXlzKCh2YWx1ZSAmJiB2YWx1ZS5wYXJhbXMpIHx8IHt9KS5mb3JFYWNoKGtleSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlLnBhcmFtc1trZXldID0gdGhpcy5saWJtaW1lLmRlY29kZVdvcmRzKHZhbHVlLnBhcmFtc1trZXldKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmUsIGtlZXAgYXMgaXNcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ2RhdGUnOiB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBkYXRlVmFsdWUgPSBuZXcgRGF0ZSh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpc05hTihkYXRlVmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBkYXRlIHBhcnNpbmcgZmFpbGVkIDpTXG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRlVmFsdWUgPSBuZXcgRGF0ZSgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlID0gZGF0ZVZhbHVlO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2FzZSAnc3ViamVjdCc6XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHRoaXMubGlibWltZS5kZWNvZGVXb3Jkcyh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZSwga2VlcCBhcyBpc1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ3JlZmVyZW5jZXMnOlxuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSB0aGlzLmxpYm1pbWUuZGVjb2RlV29yZHModmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChFKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmVcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnNwbGl0KC9cXHMrLykubWFwKHRoaXMuZW5zdXJlTWVzc2FnZUlERm9ybWF0KTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAnbWVzc2FnZS1pZCc6XG4gICAgICAgICAgICAgICAgY2FzZSAnaW4tcmVwbHktdG8nOlxuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSB0aGlzLmxpYm1pbWUuZGVjb2RlV29yZHModmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChFKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmVcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHRoaXMuZW5zdXJlTWVzc2FnZUlERm9ybWF0KHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAncHJpb3JpdHknOlxuICAgICAgICAgICAgICAgIGNhc2UgJ3gtcHJpb3JpdHknOlxuICAgICAgICAgICAgICAgIGNhc2UgJ3gtbXNtYWlsLXByaW9yaXR5JzpcbiAgICAgICAgICAgICAgICBjYXNlICdpbXBvcnRhbmNlJzpcbiAgICAgICAgICAgICAgICAgICAga2V5ID0gJ3ByaW9yaXR5JztcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSB0aGlzLnBhcnNlUHJpb3JpdHkodmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICdmcm9tJzpcbiAgICAgICAgICAgICAgICBjYXNlICd0byc6XG4gICAgICAgICAgICAgICAgY2FzZSAnY2MnOlxuICAgICAgICAgICAgICAgIGNhc2UgJ2JjYyc6XG4gICAgICAgICAgICAgICAgY2FzZSAnc2VuZGVyJzpcbiAgICAgICAgICAgICAgICBjYXNlICdyZXBseS10byc6XG4gICAgICAgICAgICAgICAgY2FzZSAnZGVsaXZlcmVkLXRvJzpcbiAgICAgICAgICAgICAgICBjYXNlICdyZXR1cm4tcGF0aCc6XG4gICAgICAgICAgICAgICAgY2FzZSAnZGlzcG9zaXRpb24tbm90aWZpY2F0aW9uLXRvJzpcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBhZGRyZXNzcGFyc2VyKHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kZWNvZGVBZGRyZXNzZXModmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgaHRtbDogdGhpcy5nZXRBZGRyZXNzZXNIVE1MKHZhbHVlKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ6IHRoaXMuZ2V0QWRkcmVzc2VzVGV4dCh2YWx1ZSlcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIGhhbmRsZSBsaXN0LSoga2V5c1xuICAgICAgICAgICAgaWYgKGtleS5zdWJzdHIoMCwgNSkgPT09ICdsaXN0LScpIHtcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IHRoaXMucGFyc2VMaXN0SGVhZGVyKGtleS5zdWJzdHIoNSksIHZhbHVlKTtcbiAgICAgICAgICAgICAgICBrZXkgPSAnbGlzdCc7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIGlmICghaGVhZGVycy5oYXMoa2V5KSkge1xuICAgICAgICAgICAgICAgICAgICBoZWFkZXJzLnNldChrZXksIFtdLmNvbmNhdCh2YWx1ZSB8fCBbXSkpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgaGVhZGVycy5zZXQoa2V5LCBoZWFkZXJzLmdldChrZXkpLmNvbmNhdCh2YWx1ZSkpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGhlYWRlcnMuZ2V0KGtleSkucHVzaCh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBrZWVwIG9ubHkgdGhlIGZpcnN0IHZhbHVlXG4gICAgICAgIGxldCBzaW5nbGVLZXlzID0gW1xuICAgICAgICAgICAgJ21lc3NhZ2UtaWQnLFxuICAgICAgICAgICAgJ2NvbnRlbnQtaWQnLFxuICAgICAgICAgICAgJ2Zyb20nLFxuICAgICAgICAgICAgJ3NlbmRlcicsXG4gICAgICAgICAgICAnaW4tcmVwbHktdG8nLFxuICAgICAgICAgICAgJ3JlcGx5LXRvJyxcbiAgICAgICAgICAgICdzdWJqZWN0JyxcbiAgICAgICAgICAgICdkYXRlJyxcbiAgICAgICAgICAgICdjb250ZW50LWRpc3Bvc2l0aW9uJyxcbiAgICAgICAgICAgICdjb250ZW50LXR5cGUnLFxuICAgICAgICAgICAgJ2NvbnRlbnQtdHJhbnNmZXItZW5jb2RpbmcnLFxuICAgICAgICAgICAgJ3ByaW9yaXR5JyxcbiAgICAgICAgICAgICdtaW1lLXZlcnNpb24nLFxuICAgICAgICAgICAgJ2NvbnRlbnQtZGVzY3JpcHRpb24nLFxuICAgICAgICAgICAgJ3ByZWNlZGVuY2UnLFxuICAgICAgICAgICAgJ2Vycm9ycy10bycsXG4gICAgICAgICAgICAnZGlzcG9zaXRpb24tbm90aWZpY2F0aW9uLXRvJ1xuICAgICAgICBdO1xuXG4gICAgICAgIGhlYWRlcnMuZm9yRWFjaCgodmFsdWUsIGtleSkgPT4ge1xuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgaWYgKHNpbmdsZUtleXMuaW5jbHVkZXMoa2V5KSAmJiB2YWx1ZS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgaGVhZGVycy5zZXQoa2V5LCB2YWx1ZVt2YWx1ZS5sZW5ndGggLSAxXSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZS5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgaGVhZGVycy5zZXQoa2V5LCB2YWx1ZVswXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoa2V5ID09PSAnbGlzdCcpIHtcbiAgICAgICAgICAgICAgICAvLyBub3JtYWxpemUgTGlzdC0qIGhlYWRlcnNcbiAgICAgICAgICAgICAgICBsZXQgbGlzdFZhbHVlID0ge307XG4gICAgICAgICAgICAgICAgW10uY29uY2F0KHZhbHVlIHx8IFtdKS5mb3JFYWNoKHZhbCA9PiB7XG4gICAgICAgICAgICAgICAgICAgIE9iamVjdC5rZXlzKHZhbCB8fCB7fSkuZm9yRWFjaChsaXN0S2V5ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RWYWx1ZVtsaXN0S2V5XSA9IHZhbFtsaXN0S2V5XTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgaGVhZGVycy5zZXQoa2V5LCBsaXN0VmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gaGVhZGVycztcbiAgICB9XG5cbiAgICBwYXJzZUxpc3RIZWFkZXIoa2V5LCB2YWx1ZSkge1xuICAgICAgICBsZXQgYWRkcmVzc2VzID0gYWRkcmVzc3BhcnNlcih2YWx1ZSk7XG4gICAgICAgIGxldCByZXNwb25zZSA9IHt9O1xuICAgICAgICBsZXQgZGF0YSA9IGFkZHJlc3Nlc1xuICAgICAgICAgICAgLm1hcChhZGRyZXNzID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoL15odHRwcz86L2kudGVzdChhZGRyZXNzLm5hbWUpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLnVybCA9IGFkZHJlc3MubmFtZTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGFkZHJlc3MubmFtZSkge1xuICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5uYW1lID0gYWRkcmVzcy5uYW1lO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoL15tYWlsdG86Ly50ZXN0KGFkZHJlc3MuYWRkcmVzcykpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UubWFpbCA9IGFkZHJlc3MuYWRkcmVzcy5zdWJzdHIoNyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChhZGRyZXNzLmFkZHJlc3MgJiYgYWRkcmVzcy5hZGRyZXNzLmluZGV4T2YoJ0AnKSA8IDApIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UuaWQgPSBhZGRyZXNzLmFkZHJlc3M7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChhZGRyZXNzLmFkZHJlc3MpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UubWFpbCA9IGFkZHJlc3MuYWRkcmVzcztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKE9iamVjdC5rZXlzKHJlc3BvbnNlKS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLmZpbHRlcihhZGRyZXNzID0+IGFkZHJlc3MpO1xuICAgICAgICBpZiAoZGF0YS5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgW2tleV06IHJlc3BvbnNlXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBwYXJzZVByaW9yaXR5KHZhbHVlKSB7XG4gICAgICAgIHZhbHVlID0gdmFsdWUudG9Mb3dlckNhc2UoKS50cmltKCk7XG4gICAgICAgIGlmICghaXNOYU4ocGFyc2VJbnQodmFsdWUsIDEwKSkpIHtcbiAgICAgICAgICAgIC8vIHN1cHBvcnQgXCJYLVByaW9yaXR5OiAxIChIaWdoZXN0KVwiXG4gICAgICAgICAgICB2YWx1ZSA9IHBhcnNlSW50KHZhbHVlLCAxMCkgfHwgMDtcbiAgICAgICAgICAgIGlmICh2YWx1ZSA9PT0gMykge1xuICAgICAgICAgICAgICAgIHJldHVybiAnbm9ybWFsJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUgPiAzKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICdsb3cnO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ2hpZ2gnO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc3dpdGNoICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIGNhc2UgJ25vbi11cmdlbnQnOlxuICAgICAgICAgICAgICAgIGNhc2UgJ2xvdyc6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAnbG93JztcbiAgICAgICAgICAgICAgICBjYXNlICd1cmdlbnQnOlxuICAgICAgICAgICAgICAgIGNhc2UgJ2hpZ2gnOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ2hpZ2gnO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiAnbm9ybWFsJztcbiAgICB9XG5cbiAgICBlbnN1cmVNZXNzYWdlSURGb3JtYXQodmFsdWUpIHtcbiAgICAgICAgaWYgKCF2YWx1ZS5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh2YWx1ZS5jaGFyQXQoMCkgIT09ICc8Jykge1xuICAgICAgICAgICAgdmFsdWUgPSAnPCcgKyB2YWx1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh2YWx1ZS5jaGFyQXQodmFsdWUubGVuZ3RoIC0gMSkgIT09ICc+Jykge1xuICAgICAgICAgICAgdmFsdWUgKz0gJz4nO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cblxuICAgIGRlY29kZUFkZHJlc3NlcyhhZGRyZXNzZXMpIHtcbiAgICAgICAgbGV0IHByb2Nlc3NlZEFkZHJlc3MgPSBuZXcgV2Vha1NldCgpO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFkZHJlc3Nlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IGFkZHJlc3MgPSBhZGRyZXNzZXNbaV07XG4gICAgICAgICAgICBhZGRyZXNzLm5hbWUgPSAoYWRkcmVzcy5uYW1lIHx8ICcnKS50b1N0cmluZygpLnRyaW0oKTtcblxuICAgICAgICAgICAgaWYgKCFhZGRyZXNzLmFkZHJlc3MgJiYgL14oPVxcPyhbXj9dKylcXD9bQmJdXFw/W14/XSpcXD89KShcXHMqPVxcPyhbXj9dKylcXD9bQmJdXFw/W14/XSpcXD89KSokLy50ZXN0KGFkZHJlc3MubmFtZSkgJiYgIXByb2Nlc3NlZEFkZHJlc3MuaGFzKGFkZHJlc3MpKSB7XG4gICAgICAgICAgICAgICAgbGV0IHBhcnNlZCA9IGFkZHJlc3NwYXJzZXIodGhpcy5saWJtaW1lLmRlY29kZVdvcmRzKGFkZHJlc3MubmFtZSkpO1xuICAgICAgICAgICAgICAgIGlmIChwYXJzZWQubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIHBhcnNlZC5mb3JFYWNoKGVudHJ5ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NlZEFkZHJlc3MuYWRkKGVudHJ5KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3Nlcy5wdXNoKGVudHJ5KTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gcmVtb3ZlIGN1cnJlbnQgZWxlbWVudFxuICAgICAgICAgICAgICAgIGFkZHJlc3Nlcy5zcGxpY2UoaSwgMSk7XG4gICAgICAgICAgICAgICAgaS0tO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoYWRkcmVzcy5uYW1lKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgYWRkcmVzcy5uYW1lID0gdGhpcy5saWJtaW1lLmRlY29kZVdvcmRzKGFkZHJlc3MubmFtZSk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoRSkge1xuICAgICAgICAgICAgICAgICAgICAvL2lnbm9yZSwga2VlcCBhcyBpc1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICgvQHhuLS0vLnRlc3QoYWRkcmVzcy5hZGRyZXNzKSkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGFkZHJlc3MuYWRkcmVzcyA9XG4gICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzLmFkZHJlc3Muc3Vic3RyKDAsIGFkZHJlc3MuYWRkcmVzcy5sYXN0SW5kZXhPZignQCcpICsgMSkgK1xuICAgICAgICAgICAgICAgICAgICAgICAgcHVueWNvZGUudG9Vbmljb2RlKGFkZHJlc3MuYWRkcmVzcy5zdWJzdHIoYWRkcmVzcy5hZGRyZXNzLmxhc3RJbmRleE9mKCdAJykgKyAxKSk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoRSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBOb3QgYSB2YWxpZCBwdW55Y29kZSBzdHJpbmc7IGtlZXAgYXMgaXNcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoYWRkcmVzcy5ncm91cCkge1xuICAgICAgICAgICAgICAgIHRoaXMuZGVjb2RlQWRkcmVzc2VzKGFkZHJlc3MuZ3JvdXApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgY3JlYXRlTm9kZShub2RlKSB7XG4gICAgICAgIGxldCBjb250ZW50VHlwZSA9IG5vZGUuY29udGVudFR5cGU7XG4gICAgICAgIGxldCBkaXNwb3NpdGlvbiA9IG5vZGUuZGlzcG9zaXRpb247XG4gICAgICAgIGxldCBlbmNvZGluZyA9IG5vZGUuZW5jb2Rpbmc7XG4gICAgICAgIGxldCBjaGFyc2V0ID0gbm9kZS5jaGFyc2V0O1xuXG4gICAgICAgIGlmICghY29udGVudFR5cGUgJiYgbm9kZS5yb290KSB7XG4gICAgICAgICAgICBjb250ZW50VHlwZSA9ICd0ZXh0L3BsYWluJztcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBuZXdOb2RlID0ge1xuICAgICAgICAgICAgbm9kZSxcbiAgICAgICAgICAgIGhlYWRlckxpbmVzOiBub2RlLmhlYWRlcnMubGluZXMsXG4gICAgICAgICAgICBoZWFkZXJzOiB0aGlzLnByb2Nlc3NIZWFkZXJzKG5vZGUuaGVhZGVycy5nZXRMaXN0KCkpLFxuICAgICAgICAgICAgY29udGVudFR5cGUsXG4gICAgICAgICAgICBjaGlsZHJlbjogW11cbiAgICAgICAgfTtcblxuICAgICAgICBpZiAoIS9ebXVsdGlwYXJ0XFwvL2kudGVzdChjb250ZW50VHlwZSkpIHtcbiAgICAgICAgICAgIGlmIChkaXNwb3NpdGlvbiAmJiAhWydhdHRhY2htZW50JywgJ2lubGluZSddLmluY2x1ZGVzKGRpc3Bvc2l0aW9uKSkge1xuICAgICAgICAgICAgICAgIGRpc3Bvc2l0aW9uID0gJ2F0dGFjaG1lbnQnO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoIWRpc3Bvc2l0aW9uICYmICF0aGlzLnRleHRUeXBlcy5pbmNsdWRlcyhjb250ZW50VHlwZSkpIHtcbiAgICAgICAgICAgICAgICBuZXdOb2RlLmRpc3Bvc2l0aW9uID0gJ2F0dGFjaG1lbnQnO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBuZXdOb2RlLmRpc3Bvc2l0aW9uID0gZGlzcG9zaXRpb24gfHwgJ2lubGluZSc7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIG5ld05vZGUuaXNBdHRhY2htZW50ID0gIXRoaXMudGV4dFR5cGVzLmluY2x1ZGVzKGNvbnRlbnRUeXBlKSB8fCBuZXdOb2RlLmRpc3Bvc2l0aW9uICE9PSAnaW5saW5lJztcblxuICAgICAgICAgICAgbmV3Tm9kZS5lbmNvZGluZyA9IFsncXVvdGVkLXByaW50YWJsZScsICdiYXNlNjQnXS5pbmNsdWRlcyhlbmNvZGluZykgPyBlbmNvZGluZyA6ICdiaW5hcnknO1xuXG4gICAgICAgICAgICBpZiAoY2hhcnNldCkge1xuICAgICAgICAgICAgICAgIG5ld05vZGUuY2hhcnNldCA9IGNoYXJzZXQ7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxldCBkZWNvZGVyID0gbm9kZS5nZXREZWNvZGVyKCk7XG4gICAgICAgICAgICBkZWNvZGVyLm9uKCdlbmQnLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5kZWNvZGVyRW5kZWQgPSB0cnVlO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBuZXdOb2RlLmRlY29kZXIgPSBkZWNvZGVyO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG5vZGUucm9vdCkge1xuICAgICAgICAgICAgdGhpcy5oZWFkZXJzID0gbmV3Tm9kZS5oZWFkZXJzO1xuICAgICAgICAgICAgdGhpcy5oZWFkZXJMaW5lcyA9IG5ld05vZGUuaGVhZGVyTGluZXM7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBmaW5kIGxvY2F0aW9uIGluIHRyZWVcblxuICAgICAgICBpZiAoIXRoaXMudHJlZSkge1xuICAgICAgICAgICAgbmV3Tm9kZS5yb290ID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMuY3Vybm9kZSA9IHRoaXMudHJlZSA9IG5ld05vZGU7XG4gICAgICAgICAgICByZXR1cm4gbmV3Tm9kZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGltbWVkaWF0ZSBjaGlsZCBvZiByb290IG5vZGVcbiAgICAgICAgaWYgKCF0aGlzLmN1cm5vZGUucGFyZW50KSB7XG4gICAgICAgICAgICBuZXdOb2RlLnBhcmVudCA9IHRoaXMuY3Vybm9kZTtcbiAgICAgICAgICAgIHRoaXMuY3Vybm9kZS5jaGlsZHJlbi5wdXNoKG5ld05vZGUpO1xuICAgICAgICAgICAgdGhpcy5jdXJub2RlID0gbmV3Tm9kZTtcbiAgICAgICAgICAgIHJldHVybiBuZXdOb2RlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gc2libGluZ3NcbiAgICAgICAgaWYgKHRoaXMuY3Vybm9kZS5wYXJlbnQubm9kZSA9PT0gbm9kZS5wYXJlbnROb2RlKSB7XG4gICAgICAgICAgICBuZXdOb2RlLnBhcmVudCA9IHRoaXMuY3Vybm9kZS5wYXJlbnQ7XG4gICAgICAgICAgICB0aGlzLmN1cm5vZGUucGFyZW50LmNoaWxkcmVuLnB1c2gobmV3Tm9kZSk7XG4gICAgICAgICAgICB0aGlzLmN1cm5vZGUgPSBuZXdOb2RlO1xuICAgICAgICAgICAgcmV0dXJuIG5ld05vZGU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBmaXJzdCBjaGlsZFxuICAgICAgICBpZiAodGhpcy5jdXJub2RlLm5vZGUgPT09IG5vZGUucGFyZW50Tm9kZSkge1xuICAgICAgICAgICAgbmV3Tm9kZS5wYXJlbnQgPSB0aGlzLmN1cm5vZGU7XG4gICAgICAgICAgICB0aGlzLmN1cm5vZGUuY2hpbGRyZW4ucHVzaChuZXdOb2RlKTtcbiAgICAgICAgICAgIHRoaXMuY3Vybm9kZSA9IG5ld05vZGU7XG4gICAgICAgICAgICByZXR1cm4gbmV3Tm9kZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIG1vdmUgdXBcbiAgICAgICAgbGV0IHBhcmVudE5vZGUgPSB0aGlzLmN1cm5vZGU7XG4gICAgICAgIHdoaWxlICgocGFyZW50Tm9kZSA9IHBhcmVudE5vZGUucGFyZW50KSkge1xuICAgICAgICAgICAgaWYgKHBhcmVudE5vZGUubm9kZSA9PT0gbm9kZS5wYXJlbnROb2RlKSB7XG4gICAgICAgICAgICAgICAgbmV3Tm9kZS5wYXJlbnQgPSBwYXJlbnROb2RlO1xuICAgICAgICAgICAgICAgIHBhcmVudE5vZGUuY2hpbGRyZW4ucHVzaChuZXdOb2RlKTtcbiAgICAgICAgICAgICAgICB0aGlzLmN1cm5vZGUgPSBuZXdOb2RlO1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXdOb2RlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gc2hvdWxkIG5ldmVyIGhhcHBlbiwgY2FuJ3QgZGV0ZWN0IHBhcmVudFxuICAgICAgICB0aGlzLmN1cm5vZGUgPSBuZXdOb2RlO1xuICAgICAgICByZXR1cm4gbmV3Tm9kZTtcbiAgICB9XG5cbiAgICBnZXRUZXh0Q29udGVudCgpIHtcbiAgICAgICAgbGV0IHRleHQgPSBbXTtcbiAgICAgICAgbGV0IGh0bWwgPSBbXTtcbiAgICAgICAgbGV0IHByb2Nlc3NOb2RlID0gKGFsdGVybmF0aXZlLCBsZXZlbCwgbm9kZSkgPT4ge1xuICAgICAgICAgICAgaWYgKG5vZGUuc2hvd01ldGEpIHtcbiAgICAgICAgICAgICAgICBsZXQgbWV0YSA9IFsnRnJvbScsICdTdWJqZWN0JywgJ0RhdGUnLCAnVG8nLCAnQ2MnLCAnQmNjJ11cbiAgICAgICAgICAgICAgICAgICAgLm1hcChma2V5ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBrZXkgPSBma2V5LnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW5vZGUuaGVhZGVycy5oYXMoa2V5KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB2YWx1ZSA9IG5vZGUuaGVhZGVycy5nZXQoa2V5KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleTogZmtleSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZVt2YWx1ZS5sZW5ndGggLSAxXSA6IHZhbHVlXG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKGVudHJ5ID0+IGVudHJ5KTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5oYXNIdG1sKSB7XG4gICAgICAgICAgICAgICAgICAgIGh0bWwucHVzaChcbiAgICAgICAgICAgICAgICAgICAgICAgICc8dGFibGUgY2xhc3M9XCJtcF9oZWFkXCI+JyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0YVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubWFwKGVudHJ5ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB2YWx1ZSA9IGVudHJ5LnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChlbnRyeS5rZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdGcm9tJzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdUbyc6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnQ2MnOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ0JjYyc6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsdWUuaHRtbDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnRGF0ZSc6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gdGhpcy5vcHRpb25zLmZvcm1hdERhdGVTdHJpbmcgPyB0aGlzLm9wdGlvbnMuZm9ybWF0RGF0ZVN0cmluZyh2YWx1ZSkgOiB2YWx1ZS50b1VUQ1N0cmluZygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdTdWJqZWN0JzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSAnPHN0cm9uZz4nICsgaGUuZW5jb2RlKHZhbHVlKSArICc8L3N0cm9uZz4nO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IGhlLmVuY29kZSh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnPHRyPjx0ZCBjbGFzcz1cIm1wX2hlYWRfa2V5XCI+JyArIGhlLmVuY29kZShlbnRyeS5rZXkpICsgJzo8L3RkPjx0ZCBjbGFzcz1cIm1wX2hlYWRfdmFsdWVcIj4nICsgdmFsdWUgKyAnPHRkPjwvdHI+JztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmpvaW4oJ1xcbicpICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPHRhYmxlPidcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaGFzVGV4dCkge1xuICAgICAgICAgICAgICAgICAgICB0ZXh0LnB1c2goXG4gICAgICAgICAgICAgICAgICAgICAgICAnXFxuJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0YVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubWFwKGVudHJ5ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB2YWx1ZSA9IGVudHJ5LnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChlbnRyeS5rZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdGcm9tJzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdUbyc6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnQ2MnOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ0JjYyc6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsdWUudGV4dDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnRGF0ZSc6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gdGhpcy5vcHRpb25zLmZvcm1hdERhdGVTdHJpbmcgPyB0aGlzLm9wdGlvbnMuZm9ybWF0RGF0ZVN0cmluZyh2YWx1ZSkgOiB2YWx1ZS50b1VUQ1N0cmluZygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnRyeS5rZXkgKyAnOiAnICsgdmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5qb2luKCdcXG4nKSArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1xcbidcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobm9kZS50ZXh0Q29udGVudCkge1xuICAgICAgICAgICAgICAgIGlmIChub2RlLmNvbnRlbnRUeXBlID09PSAndGV4dC9wbGFpbicpIHtcbiAgICAgICAgICAgICAgICAgICAgdGV4dC5wdXNoKG5vZGUudGV4dENvbnRlbnQpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWFsdGVybmF0aXZlICYmIHRoaXMuaGFzSHRtbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaHRtbC5wdXNoKHRoaXMudGV4dFRvSHRtbChub2RlLnRleHRDb250ZW50KSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG5vZGUuY29udGVudFR5cGUgPT09ICdtZXNzYWdlL2RlbGl2ZXJ5LXN0YXR1cycgJiYgIXRoaXMub3B0aW9ucy5rZWVwRGVsaXZlcnlTdGF0dXMpIHtcbiAgICAgICAgICAgICAgICAgICAgdGV4dC5wdXNoKG5vZGUudGV4dENvbnRlbnQpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWFsdGVybmF0aXZlICYmIHRoaXMuaGFzSHRtbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaHRtbC5wdXNoKHRoaXMudGV4dFRvSHRtbChub2RlLnRleHRDb250ZW50KSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG5vZGUuY29udGVudFR5cGUgPT09ICd0ZXh0L2h0bWwnKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBmYWlsZWRUb1BhcnNlSHRtbCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBpZiAoKCFhbHRlcm5hdGl2ZSAmJiB0aGlzLmhhc1RleHQpIHx8IChub2RlLnJvb3QgJiYgIXRoaXMuaGFzVGV4dCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuc2tpcEh0bWxUb1RleHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0LnB1c2goJycpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChub2RlLnRleHRDb250ZW50Lmxlbmd0aCA+IHRoaXMub3B0aW9ucy5tYXhIdG1sTGVuZ3RoVG9QYXJzZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZW1pdCgnZXJyb3InLCBuZXcgRXJyb3IoYEhUTUwgdG9vIGxvbmcgZm9yIHBhcnNpbmcgJHtub2RlLnRleHRDb250ZW50Lmxlbmd0aH0gYnl0ZXNgKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dC5wdXNoKCdJbnZhbGlkIEhUTUwgY29udGVudCAodG9vIGxvbmcpJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFpbGVkVG9QYXJzZUh0bWwgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0LnB1c2goaHRtbFRvVGV4dChub2RlLnRleHRDb250ZW50KSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZW1pdCgnZXJyb3InLCBuZXcgRXJyb3IoJ0ZhaWxlZCB0byBwYXJzZSBIVE1MJykpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0LnB1c2goJ0ludmFsaWQgSFRNTCBjb250ZW50Jyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhaWxlZFRvUGFyc2VIdG1sID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKCFmYWlsZWRUb1BhcnNlSHRtbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaHRtbC5wdXNoKG5vZGUudGV4dENvbnRlbnQpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYWx0ZXJuYXRpdmUgPSBhbHRlcm5hdGl2ZSB8fCBub2RlLmNvbnRlbnRUeXBlID09PSAnbXVsdGlwYXJ0L2FsdGVybmF0aXZlJztcbiAgICAgICAgICAgIGlmIChub2RlLmNoaWxkcmVuKSB7XG4gICAgICAgICAgICAgICAgbm9kZS5jaGlsZHJlbi5mb3JFYWNoKHN1Yk5vZGUgPT4ge1xuICAgICAgICAgICAgICAgICAgICBwcm9jZXNzTm9kZShhbHRlcm5hdGl2ZSwgbGV2ZWwgKyAxLCBzdWJOb2RlKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICBwcm9jZXNzTm9kZShmYWxzZSwgMCwgdGhpcy50cmVlKTtcblxuICAgICAgICBsZXQgcmVzcG9uc2UgPSB7XG4gICAgICAgICAgICB0eXBlOiAndGV4dCdcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKGh0bWwubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLmh0bWwgPSByZXNwb25zZS5odG1sID0gaHRtbC5qb2luKCc8YnIvPlxcbicpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0ZXh0Lmxlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy50ZXh0ID0gcmVzcG9uc2UudGV4dCA9IHRleHQuam9pbignXFxuJyk7XG4gICAgICAgICAgICB0aGlzLnRleHRBc0h0bWwgPSByZXNwb25zZS50ZXh0QXNIdG1sID0gdGV4dC5tYXAocGFydCA9PiB0aGlzLnRleHRUb0h0bWwocGFydCkpLmpvaW4oJzxici8+XFxuJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3BvbnNlO1xuICAgIH1cblxuICAgIHByb2Nlc3NDaHVuayhkYXRhLCBkb25lKSB7XG4gICAgICAgIGxldCBwYXJ0SWQgPSBudWxsO1xuICAgICAgICBpZiAoZGF0YS5fcGFyZW50Qm91bmRhcnkpIHtcbiAgICAgICAgICAgIHBhcnRJZCA9IHRoaXMuX2dldFBhcnRJZChkYXRhLl9wYXJlbnRCb3VuZGFyeSk7XG4gICAgICAgIH1cbiAgICAgICAgc3dpdGNoIChkYXRhLnR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgJ25vZGUnOiB7XG4gICAgICAgICAgICAgICAgbGV0IG5vZGUgPSB0aGlzLmNyZWF0ZU5vZGUoZGF0YSk7XG4gICAgICAgICAgICAgICAgaWYgKG5vZGUgPT09IHRoaXMudHJlZSkge1xuICAgICAgICAgICAgICAgICAgICBbJ3N1YmplY3QnLCAncmVmZXJlbmNlcycsICdkYXRlJywgJ3RvJywgJ2Zyb20nLCAndG8nLCAnY2MnLCAnYmNjJywgJ21lc3NhZ2UtaWQnLCAnaW4tcmVwbHktdG8nLCAncmVwbHktdG8nXS5mb3JFYWNoKGtleSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobm9kZS5oZWFkZXJzLmhhcyhrZXkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpc1trZXkucmVwbGFjZSgvLShbYS16XSkvZywgKG0sIGMpID0+IGMudG9VcHBlckNhc2UoKSldID0gbm9kZS5oZWFkZXJzLmdldChrZXkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5lbWl0KCdoZWFkZXJzJywgbm9kZS5oZWFkZXJzKTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAobm9kZS5oZWFkZXJMaW5lcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5lbWl0KCdoZWFkZXJMaW5lcycsIG5vZGUuaGVhZGVyTGluZXMpO1xuICAgICAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoZGF0YS5jb250ZW50VHlwZSA9PT0gJ21lc3NhZ2UvcmZjODIyJyAmJiBkYXRhLm1lc3NhZ2VOb2RlKSB7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChkYXRhLnBhcmVudE5vZGUgJiYgZGF0YS5wYXJlbnROb2RlLmNvbnRlbnRUeXBlID09PSAnbWVzc2FnZS9yZmM4MjInKSB7XG4gICAgICAgICAgICAgICAgICAgIG5vZGUuc2hvd01ldGEgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChub2RlLmlzQXR0YWNobWVudCkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgY29udGVudFR5cGUgPSBub2RlLmNvbnRlbnRUeXBlO1xuICAgICAgICAgICAgICAgICAgICBpZiAobm9kZS5jb250ZW50VHlwZSA9PT0gJ2FwcGxpY2F0aW9uL29jdGV0LXN0cmVhbScgJiYgZGF0YS5maWxlbmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudFR5cGUgPSB0aGlzLmxpYm1pbWUuZGV0ZWN0TWltZVR5cGUoZGF0YS5maWxlbmFtZSkgfHwgJ2FwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSc7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBsZXQgYXR0YWNobWVudCA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdhdHRhY2htZW50JyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQ6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50VHlwZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcnRJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlbGVhc2U6ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRhY2htZW50LnJlbGVhc2UgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLndhaXRVbnRpbEF0dGFjaG1lbnRFbmQgJiYgdHlwZW9mIHRoaXMuYXR0YWNobWVudENhbGxiYWNrID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldEltbWVkaWF0ZSh0aGlzLmF0dGFjaG1lbnRDYWxsYmFjayk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYXR0YWNobWVudENhbGxiYWNrID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy53YWl0VW50aWxBdHRhY2htZW50RW5kID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICAgICAgbGV0IGFsZ28gPSB0aGlzLm9wdGlvbnMuY2hlY2tzdW1BbGdvIHx8ICdtZDUnO1xuICAgICAgICAgICAgICAgICAgICBsZXQgaGFzaGVyID0gbmV3IFN0cmVhbUhhc2goYXR0YWNobWVudCwgYWxnbyk7XG4gICAgICAgICAgICAgICAgICAgIG5vZGUuZGVjb2Rlci5vbignZXJyb3InLCBlcnIgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaGFzaGVyLmVtaXQoJ2Vycm9yJywgZXJyKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgbm9kZS5kZWNvZGVyLm9uKCdyZWFkYWJsZScsICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjaHVuaztcblxuICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKChjaHVuayA9IG5vZGUuZGVjb2Rlci5yZWFkKCkpICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzaGVyLndyaXRlKGNodW5rKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgbm9kZS5kZWNvZGVyLm9uY2UoJ2VuZCcsICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGhhc2hlci5lbmQoKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgLy9ub2RlLmRlY29kZXIucGlwZShoYXNoZXIpO1xuICAgICAgICAgICAgICAgICAgICBhdHRhY2htZW50LmNvbnRlbnQgPSBoYXNoZXI7XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy53YWl0VW50aWxBdHRhY2htZW50RW5kID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGEuZGlzcG9zaXRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGF0dGFjaG1lbnQuY29udGVudERpc3Bvc2l0aW9uID0gZGF0YS5kaXNwb3NpdGlvbjtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGlmIChkYXRhLmZpbGVuYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhdHRhY2htZW50LmZpbGVuYW1lID0gZGF0YS5maWxlbmFtZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGlmIChub2RlLmhlYWRlcnMuaGFzKCdjb250ZW50LWlkJykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGF0dGFjaG1lbnQuY29udGVudElkID0gW10uY29uY2F0KG5vZGUuaGVhZGVycy5nZXQoJ2NvbnRlbnQtaWQnKSB8fCBbXSkuc2hpZnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGF0dGFjaG1lbnQuY2lkID0gYXR0YWNobWVudC5jb250ZW50SWQudHJpbSgpLnJlcGxhY2UoL148fD4kL2csICcnKS50cmltKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjaGVjayBpZiB0aGUgYXR0YWNobWVudCBpcyBcInJlbGF0ZWRcIiB0byB0ZXh0IGNvbnRlbnQgbGlrZSBhbiBlbWJlZGRlZCBpbWFnZSBldGNcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBwYXJlbnROb2RlID0gbm9kZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICgocGFyZW50Tm9kZSA9IHBhcmVudE5vZGUucGFyZW50KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXJlbnROb2RlLmNvbnRlbnRUeXBlID09PSAnbXVsdGlwYXJ0L3JlbGF0ZWQnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dGFjaG1lbnQucmVsYXRlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgYXR0YWNobWVudC5oZWFkZXJzID0gbm9kZS5oZWFkZXJzO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnB1c2goYXR0YWNobWVudCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYXR0YWNobWVudExpc3QucHVzaChhdHRhY2htZW50KTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG5vZGUuZGlzcG9zaXRpb24gPT09ICdpbmxpbmUnKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBjaHVua3MgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGNodW5rbGVuID0gMDtcbiAgICAgICAgICAgICAgICAgICAgbm9kZS5jb250ZW50U3RyZWFtID0gbm9kZS5kZWNvZGVyO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChub2RlLmNvbnRlbnRUeXBlID09PSAndGV4dC9wbGFpbicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaGFzVGV4dCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobm9kZS5jb250ZW50VHlwZSA9PT0gJ3RleHQvaHRtbCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaGFzSHRtbCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobm9kZS5jb250ZW50VHlwZSA9PT0gJ21lc3NhZ2UvZGVsaXZlcnktc3RhdHVzJyAmJiAhdGhpcy5vcHRpb25zLmtlZXBEZWxpdmVyeVN0YXR1cykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5oYXNUZXh0ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGlmIChub2RlLm5vZGUuZmxvd2VkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgY29udGVudFN0cmVhbSA9IG5vZGUuY29udGVudFN0cmVhbTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBmbG93RGVjb2RlciA9IG5ldyBGbG93ZWREZWNvZGVyKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxTcDogbm9kZS5ub2RlLmRlbFNwXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRTdHJlYW0ub24oJ2Vycm9yJywgZXJyID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG93RGVjb2Rlci5lbWl0KCdlcnJvcicsIGVycik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRTdHJlYW0ucGlwZShmbG93RGVjb2Rlcik7XG4gICAgICAgICAgICAgICAgICAgICAgICBub2RlLmNvbnRlbnRTdHJlYW0gPSBmbG93RGVjb2RlcjtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGxldCBjaGFyc2V0ID0gbm9kZS5jaGFyc2V0IHx8ICd1dGYtOCc7XG4gICAgICAgICAgICAgICAgICAgIC8vY2hhcnNldCA9IGNoYXJzZXQgfHwgJ3dpbmRvd3MtMTI1Nyc7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKCFbJ2FzY2lpJywgJ3VzYXNjaWknLCAndXRmOCddLmluY2x1ZGVzKGNoYXJzZXQudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9bXmEtejAtOV0rL2csICcnKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNvbnRlbnRTdHJlYW0gPSBub2RlLmNvbnRlbnRTdHJlYW07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGRlY29kZVN0cmVhbSA9IHRoaXMuZGVjb2Rlci5kZWNvZGVTdHJlYW0oY2hhcnNldCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudFN0cmVhbS5vbignZXJyb3InLCBlcnIgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVTdHJlYW0uZW1pdCgnZXJyb3InLCBlcnIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRTdHJlYW0ucGlwZShkZWNvZGVTdHJlYW0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUuY29udGVudFN0cmVhbSA9IGRlY29kZVN0cmVhbTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkbyBub3QgZGVjb2RlIGNoYXJzZXRcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIG5vZGUuY29udGVudFN0cmVhbS5vbigncmVhZGFibGUnLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgY2h1bms7XG4gICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoKGNodW5rID0gbm9kZS5jb250ZW50U3RyZWFtLnJlYWQoKSkgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGNodW5rID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaHVuayA9IEJ1ZmZlci5mcm9tKGNodW5rKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2h1bmtzLnB1c2goY2h1bmspO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNodW5rbGVuICs9IGNodW5rLmxlbmd0aDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgbm9kZS5jb250ZW50U3RyZWFtLm9uY2UoJ2VuZCcsICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUudGV4dENvbnRlbnQgPSBCdWZmZXIuY29uY2F0KGNodW5rcywgY2h1bmtsZW4pLnRvU3RyaW5nKCkucmVwbGFjZSgvXFxyP1xcbi9nLCAnXFxuJyk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgIG5vZGUuY29udGVudFN0cmVhbS5vbmNlKCdlcnJvcicsIGVyciA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmVtaXQoJ2Vycm9yJywgZXJyKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNhc2UgJ2RhdGEnOlxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmN1cm5vZGUgJiYgdGhpcy5jdXJub2RlLmRlY29kZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJub2RlLmRlY29kZXIuZW5kKCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMud2FpdFVudGlsQXR0YWNobWVudEVuZCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmF0dGFjaG1lbnRDYWxsYmFjayA9IGRvbmU7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBtdWx0aXBhcnQgbWVzc2FnZSBzdHJ1Y3R1cmVcbiAgICAgICAgICAgICAgICAvLyB0aGlzIGlzIG5vdCByZWxhdGVkIHRvIGFueSBzcGVjaWZpYyAnbm9kZScgYmxvY2sgYXMgaXQgaW5jbHVkZXNcbiAgICAgICAgICAgICAgICAvLyBldmVyeXRoaW5nIGJldHdlZW4gdGhlIGVuZCBvZiBzb21lIG5vZGUgYm9keSBhbmQgYmV0d2VlbiB0aGUgbmV4dCBoZWFkZXJcbiAgICAgICAgICAgICAgICAvL3Byb2Nlc3Muc3Rkb3V0LndyaXRlKGRhdGEudmFsdWUpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICBjYXNlICdib2R5JzpcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5jdXJub2RlICYmIHRoaXMuY3Vybm9kZS5kZWNvZGVyICYmIHRoaXMuY3Vybm9kZS5kZWNvZGVyLndyaXRhYmxlKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmN1cm5vZGUuZGVjb2Rlci53cml0ZShkYXRhLnZhbHVlKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmN1cm5vZGUuZGVjb2Rlci5vbmNlKCdkcmFpbicsIGRvbmUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gTGVhZiBlbGVtZW50IGJvZHkuIEluY2x1ZGVzIHRoZSBib2R5IGZvciB0aGUgbGFzdCAnbm9kZScgYmxvY2suIFlvdSBtaWdodFxuICAgICAgICAgICAgICAgIC8vIGhhdmUgc2V2ZXJhbCAnYm9keScgY2FsbHMgZm9yIGEgc2luZ2xlICdub2RlJyBibG9ja1xuICAgICAgICAgICAgICAgIC8vcHJvY2Vzcy5zdGRvdXQud3JpdGUoZGF0YS52YWx1ZSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBzZXRJbW1lZGlhdGUoZG9uZSk7XG4gICAgfVxuXG4gICAgX2dldFBhcnRJZChwYXJlbnRCb3VuZGFyeSkge1xuICAgICAgICBsZXQgYm91bmRhcnlJbmRleCA9IHRoaXMuYm91bmRhcmllcy5maW5kSW5kZXgoaXRlbSA9PiBpdGVtLm5hbWUgPT09IHBhcmVudEJvdW5kYXJ5KTtcbiAgICAgICAgaWYgKGJvdW5kYXJ5SW5kZXggPT09IC0xKSB7XG4gICAgICAgICAgICB0aGlzLmJvdW5kYXJpZXMucHVzaCh7IG5hbWU6IHBhcmVudEJvdW5kYXJ5LCBjb3VudDogMSB9KTtcbiAgICAgICAgICAgIGJvdW5kYXJ5SW5kZXggPSB0aGlzLmJvdW5kYXJpZXMubGVuZ3RoIC0gMTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuYm91bmRhcmllc1tib3VuZGFyeUluZGV4XS5jb3VudCsrO1xuICAgICAgICB9XG4gICAgICAgIGxldCBwYXJ0SWQgPSAnMSc7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDw9IGJvdW5kYXJ5SW5kZXg7IGkrKykge1xuICAgICAgICAgICAgaWYgKGkgPT09IDApIHBhcnRJZCA9IHRoaXMuYm91bmRhcmllc1tpXS5jb3VudC50b1N0cmluZygpO1xuICAgICAgICAgICAgZWxzZSBwYXJ0SWQgKz0gJy4nICsgdGhpcy5ib3VuZGFyaWVzW2ldLmNvdW50LnRvU3RyaW5nKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHBhcnRJZDtcbiAgICB9XG5cbiAgICBnZXRBZGRyZXNzZXNIVE1MKHZhbHVlKSB7XG4gICAgICAgIGxldCBmb3JtYXRTaW5nbGVMZXZlbCA9IGFkZHJlc3NlcyA9PlxuICAgICAgICAgICAgYWRkcmVzc2VzXG4gICAgICAgICAgICAgICAgLm1hcChhZGRyZXNzID0+IHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHN0ciA9ICc8c3BhbiBjbGFzcz1cIm1wX2FkZHJlc3NfZ3JvdXBcIj4nO1xuICAgICAgICAgICAgICAgICAgICBpZiAoYWRkcmVzcy5uYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdHIgKz0gJzxzcGFuIGNsYXNzPVwibXBfYWRkcmVzc19uYW1lXCI+JyArIGhlLmVuY29kZShhZGRyZXNzLm5hbWUpICsgKGFkZHJlc3MuZ3JvdXAgPyAnOiAnIDogJycpICsgJzwvc3Bhbj4nO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChhZGRyZXNzLmFkZHJlc3MpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBsaW5rID0gJzxhIGhyZWY9XCJtYWlsdG86JyArIGhlLmVuY29kZShhZGRyZXNzLmFkZHJlc3MpICsgJ1wiIGNsYXNzPVwibXBfYWRkcmVzc19lbWFpbFwiPicgKyBoZS5lbmNvZGUoYWRkcmVzcy5hZGRyZXNzKSArICc8L2E+JztcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhZGRyZXNzLm5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHIgKz0gJyAmbHQ7JyArIGxpbmsgKyAnJmd0Oyc7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ciArPSBsaW5rO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChhZGRyZXNzLmdyb3VwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdHIgKz0gZm9ybWF0U2luZ2xlTGV2ZWwoYWRkcmVzcy5ncm91cCkgKyAnOyc7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0ciArICc8L3NwYW4+JztcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC5qb2luKCcsICcpO1xuICAgICAgICByZXR1cm4gZm9ybWF0U2luZ2xlTGV2ZWwoW10uY29uY2F0KHZhbHVlIHx8IFtdKSk7XG4gICAgfVxuXG4gICAgZ2V0QWRkcmVzc2VzVGV4dCh2YWx1ZSkge1xuICAgICAgICBsZXQgZm9ybWF0U2luZ2xlTGV2ZWwgPSBhZGRyZXNzZXMgPT5cbiAgICAgICAgICAgIGFkZHJlc3Nlc1xuICAgICAgICAgICAgICAgIC5tYXAoYWRkcmVzcyA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBzdHIgPSAnJztcbiAgICAgICAgICAgICAgICAgICAgaWYgKGFkZHJlc3MubmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3RyICs9IGBcIiR7YWRkcmVzcy5uYW1lfVwiYCArIChhZGRyZXNzLmdyb3VwID8gJzogJyA6ICcnKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoYWRkcmVzcy5hZGRyZXNzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgbGluayA9IGFkZHJlc3MuYWRkcmVzcztcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhZGRyZXNzLm5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHIgKz0gJyA8JyArIGxpbmsgKyAnPic7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ciArPSBsaW5rO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChhZGRyZXNzLmdyb3VwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdHIgKz0gZm9ybWF0U2luZ2xlTGV2ZWwoYWRkcmVzcy5ncm91cCkgKyAnOyc7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0cjtcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC5qb2luKCcsICcpO1xuICAgICAgICByZXR1cm4gZm9ybWF0U2luZ2xlTGV2ZWwoW10uY29uY2F0KHZhbHVlIHx8IFtdKSk7XG4gICAgfVxuXG4gICAgdXBkYXRlSW1hZ2VMaW5rcyhyZXBsYWNlQ2FsbGJhY2ssIGRvbmUpIHtcbiAgICAgICAgaWYgKCF0aGlzLmh0bWwpIHtcbiAgICAgICAgICAgIHJldHVybiBzZXRJbW1lZGlhdGUoKCkgPT4gZG9uZShudWxsLCBmYWxzZSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGNpZHMgPSBuZXcgTWFwKCk7XG4gICAgICAgIGxldCBodG1sID0gKHRoaXMuaHRtbCB8fCAnJykudG9TdHJpbmcoKTtcblxuICAgICAgICBpZiAodGhpcy5vcHRpb25zLnNraXBJbWFnZUxpbmtzKSB7XG4gICAgICAgICAgICByZXR1cm4gZG9uZShudWxsLCBodG1sKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGh0bWwucmVwbGFjZSgvXFxiY2lkOihbXidcIlxcc117MSwyNTZ9KS9nLCAobWF0Y2gsIGNpZCkgPT4ge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IHRoaXMuYXR0YWNobWVudExpc3QubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5hdHRhY2htZW50TGlzdFtpXS5jaWQgPT09IGNpZCAmJiAvXmltYWdlXFwvW1xcd10rJC9pLnRlc3QodGhpcy5hdHRhY2htZW50TGlzdFtpXS5jb250ZW50VHlwZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgY2lkcy5zZXQoY2lkLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhdHRhY2htZW50OiB0aGlzLmF0dGFjaG1lbnRMaXN0W2ldXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbWF0Y2g7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGxldCBjaWRMaXN0ID0gW107XG4gICAgICAgIGNpZHMuZm9yRWFjaChlbnRyeSA9PiB7XG4gICAgICAgICAgICBjaWRMaXN0LnB1c2goZW50cnkpO1xuICAgICAgICB9KTtcblxuICAgICAgICBsZXQgcG9zID0gMDtcbiAgICAgICAgbGV0IHByb2Nlc3NOZXh0ID0gKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHBvcyA+PSBjaWRMaXN0Lmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIGh0bWwgPSBodG1sLnJlcGxhY2UoL1xcYmNpZDooW14nXCJcXHNdezEsMjU2fSkvZywgKG1hdGNoLCBjaWQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNpZHMuaGFzKGNpZCkgJiYgY2lkcy5nZXQoY2lkKS51cmwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjaWRzLmdldChjaWQpLnVybDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWF0Y2g7XG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gZG9uZShudWxsLCBodG1sKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCBlbnRyeSA9IGNpZExpc3RbcG9zKytdO1xuICAgICAgICAgICAgcmVwbGFjZUNhbGxiYWNrKGVudHJ5LmF0dGFjaG1lbnQsIChlcnIsIHVybCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNldEltbWVkaWF0ZSgoKSA9PiBkb25lKGVycikpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbnRyeS51cmwgPSB1cmw7XG4gICAgICAgICAgICAgICAgc2V0SW1tZWRpYXRlKHByb2Nlc3NOZXh0KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9O1xuXG4gICAgICAgIHNldEltbWVkaWF0ZShwcm9jZXNzTmV4dCk7XG4gICAgfVxuXG4gICAgdGV4dFRvSHRtbChzdHIpIHtcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5za2lwVGV4dFRvSHRtbCkge1xuICAgICAgICAgICAgcmV0dXJuICcnO1xuICAgICAgICB9XG4gICAgICAgIHN0ciA9IChzdHIgfHwgJycpLnRvU3RyaW5nKCk7XG4gICAgICAgIGxldCBlbmNvZGVkO1xuXG4gICAgICAgIGxldCBsaW5raWZpZWQgPSBmYWxzZTtcbiAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMuc2tpcFRleHRMaW5rcykge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBpZiAobGlua2lmeS5wcmV0ZXN0KHN0cikpIHtcbiAgICAgICAgICAgICAgICAgICAgbGlua2lmaWVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGxpbmtzID0gbGlua2lmeS5tYXRjaChzdHIpIHx8IFtdO1xuICAgICAgICAgICAgICAgICAgICBsZXQgcmVzdWx0ID0gW107XG4gICAgICAgICAgICAgICAgICAgIGxldCBsYXN0ID0gMDtcblxuICAgICAgICAgICAgICAgICAgICBsaW5rcy5mb3JFYWNoKGxpbmsgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxhc3QgPCBsaW5rLmluZGV4KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRleHRQYXJ0ID0gaGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZW5jb2RlIHNwZWNpYWwgY2hhcnNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmVuY29kZShzdHIuc2xpY2UobGFzdCwgbGluay5pbmRleCksIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZU5hbWVkUmVmZXJlbmNlczogdHJ1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaCh0ZXh0UGFydCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKGA8YSBocmVmPVwiJHtsaW5rLnVybH1cIj4ke2xpbmsudGV4dH08L2E+YCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGxhc3QgPSBsaW5rLmxhc3RJbmRleDtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgbGV0IHRleHRQYXJ0ID0gaGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVuY29kZSBzcGVjaWFsIGNoYXJzXG4gICAgICAgICAgICAgICAgICAgICAgICAuZW5jb2RlKHN0ci5zbGljZShsYXN0KSwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZU5hbWVkUmVmZXJlbmNlczogdHJ1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHRleHRQYXJ0KTtcblxuICAgICAgICAgICAgICAgICAgICBlbmNvZGVkID0gcmVzdWx0LmpvaW4oJycpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gY2F0Y2ggKEUpIHtcbiAgICAgICAgICAgICAgICAvLyBmYWlsZWQsIGRvbid0IGxpbmtpZnlcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghbGlua2lmaWVkKSB7XG4gICAgICAgICAgICBlbmNvZGVkID0gaGVcbiAgICAgICAgICAgICAgICAvLyBlbmNvZGUgc3BlY2lhbCBjaGFyc1xuICAgICAgICAgICAgICAgIC5lbmNvZGUoc3RyLCB7XG4gICAgICAgICAgICAgICAgICAgIHVzZU5hbWVkUmVmZXJlbmNlczogdHJ1ZVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHRleHQgPVxuICAgICAgICAgICAgJzxwPicgK1xuICAgICAgICAgICAgZW5jb2RlZFxuICAgICAgICAgICAgICAgIC5yZXBsYWNlKC9cXHI/XFxuL2csICdcXG4nKVxuICAgICAgICAgICAgICAgIC50cmltKCkgLy8gbm9ybWFsaXplIGxpbmUgZW5kaW5nc1xuICAgICAgICAgICAgICAgIC5yZXBsYWNlKC9bIFxcdF0rJC9nbSwgJycpXG4gICAgICAgICAgICAgICAgLnRyaW0oKSAvLyB0cmltIGVtcHR5IGxpbmUgZW5kaW5nc1xuICAgICAgICAgICAgICAgIC5yZXBsYWNlKC9cXG5cXG4rL2csICc8L3A+PHA+JylcbiAgICAgICAgICAgICAgICAudHJpbSgpIC8vIGluc2VydCA8cD4gdG8gbXVsdGlwbGUgbGluZWJyZWFrc1xuICAgICAgICAgICAgICAgIC5yZXBsYWNlKC9cXG4vZywgJzxici8+JykgKyAvLyBpbnNlcnQgPGJyPiB0byBzaW5nbGUgbGluZWJyZWFrc1xuICAgICAgICAgICAgJzwvcD4nO1xuXG4gICAgICAgIHJldHVybiB0ZXh0O1xuICAgIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBNYWlsUGFyc2VyO1xuIl0sIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6WzBdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(rsc)/./node_modules/mailparser/lib/mail-parser.js\n");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "(rsc)/./node_modules/mailparser/lib/simple-parser.js":
|
|
/*!******************************************************!*\
|
|
!*** ./node_modules/mailparser/lib/simple-parser.js ***!
|
|
\******************************************************/
|
|
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
|
|
|
|
eval("\n\nconst MailParser = __webpack_require__(/*! ./mail-parser.js */ \"(rsc)/./node_modules/mailparser/lib/mail-parser.js\");\n\nmodule.exports = (input, options, callback) => {\n if (input === null || input === undefined) {\n throw new TypeError('Input cannot be null or undefined.');\n }\n\n if (!callback && typeof options === 'function') {\n callback = options;\n options = false;\n }\n\n let promise;\n if (!callback) {\n promise = new Promise((resolve, reject) => {\n callback = callbackPromise(resolve, reject);\n });\n }\n\n options = options || {};\n let keepCidLinks = !!options.keepCidLinks;\n\n let mail = {\n attachments: []\n };\n\n let parser = new MailParser(options);\n\n parser.on('error', err => {\n callback(err);\n });\n\n parser.on('headers', headers => {\n mail.headers = headers;\n mail.headerLines = parser.headerLines;\n });\n\n let reading = false;\n let reader = () => {\n reading = true;\n\n let data = parser.read();\n\n if (data === null) {\n reading = false;\n return;\n }\n\n if (data.type === 'text') {\n Object.keys(data).forEach(key => {\n if (['text', 'html', 'textAsHtml'].includes(key)) {\n mail[key] = data[key];\n }\n });\n }\n\n if (data.type === 'attachment') {\n mail.attachments.push(data);\n\n let chunks = [];\n let chunklen = 0;\n data.content.on('readable', () => {\n let chunk;\n while ((chunk = data.content.read()) !== null) {\n chunks.push(chunk);\n chunklen += chunk.length;\n }\n });\n\n data.content.on('end', () => {\n data.content = Buffer.concat(chunks, chunklen);\n data.release();\n reader();\n });\n } else {\n reader();\n }\n };\n\n parser.on('readable', () => {\n if (!reading) {\n reader();\n }\n });\n\n parser.on('end', () => {\n ['subject', 'references', 'date', 'to', 'from', 'to', 'cc', 'bcc', 'message-id', 'in-reply-to', 'reply-to'].forEach(key => {\n if (mail.headers && mail.headers.has(key)) {\n mail[key.replace(/-([a-z])/g, (m, c) => c.toUpperCase())] = mail.headers.get(key);\n }\n });\n\n if (keepCidLinks) {\n return callback(null, mail);\n }\n parser.updateImageLinks(\n (attachment, done) => done(false, 'data:' + attachment.contentType + ';base64,' + attachment.content.toString('base64')),\n (err, html) => {\n if (err) {\n return callback(err);\n }\n mail.html = html;\n\n callback(null, mail);\n }\n );\n });\n\n if (typeof input === 'string') {\n parser.end(Buffer.from(input));\n } else if (Buffer.isBuffer(input)) {\n parser.end(input);\n } else {\n input\n .once('error', err => {\n input.destroy();\n parser.destroy();\n callback(err);\n })\n .pipe(parser);\n }\n\n return promise;\n};\n\nfunction callbackPromise(resolve, reject) {\n return function (...args) {\n let err = args.shift();\n if (err) {\n reject(err);\n } else {\n resolve(...args);\n }\n };\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHJzYykvLi9ub2RlX21vZHVsZXMvbWFpbHBhcnNlci9saWIvc2ltcGxlLXBhcnNlci5qcyIsIm1hcHBpbmdzIjoiQUFBYTs7QUFFYixtQkFBbUIsbUJBQU8sQ0FBQyw0RUFBa0I7O0FBRTdDO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTs7QUFFYjtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYixVQUFVO0FBQ1Y7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1GQUFtRjtBQUNuRjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyIvaG9tZS9hbG1hL25leHRnZW4vTmVhaC1tYWlsL25vZGVfbW9kdWxlcy9tYWlscGFyc2VyL2xpYi9zaW1wbGUtcGFyc2VyLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcblxuY29uc3QgTWFpbFBhcnNlciA9IHJlcXVpcmUoJy4vbWFpbC1wYXJzZXIuanMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSAoaW5wdXQsIG9wdGlvbnMsIGNhbGxiYWNrKSA9PiB7XG4gICAgaWYgKGlucHV0ID09PSBudWxsIHx8IGlucHV0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignSW5wdXQgY2Fubm90IGJlIG51bGwgb3IgdW5kZWZpbmVkLicpO1xuICAgIH1cblxuICAgIGlmICghY2FsbGJhY2sgJiYgdHlwZW9mIG9wdGlvbnMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgY2FsbGJhY2sgPSBvcHRpb25zO1xuICAgICAgICBvcHRpb25zID0gZmFsc2U7XG4gICAgfVxuXG4gICAgbGV0IHByb21pc2U7XG4gICAgaWYgKCFjYWxsYmFjaykge1xuICAgICAgICBwcm9taXNlID0gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgY2FsbGJhY2sgPSBjYWxsYmFja1Byb21pc2UocmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gICAgbGV0IGtlZXBDaWRMaW5rcyA9ICEhb3B0aW9ucy5rZWVwQ2lkTGlua3M7XG5cbiAgICBsZXQgbWFpbCA9IHtcbiAgICAgICAgYXR0YWNobWVudHM6IFtdXG4gICAgfTtcblxuICAgIGxldCBwYXJzZXIgPSBuZXcgTWFpbFBhcnNlcihvcHRpb25zKTtcblxuICAgIHBhcnNlci5vbignZXJyb3InLCBlcnIgPT4ge1xuICAgICAgICBjYWxsYmFjayhlcnIpO1xuICAgIH0pO1xuXG4gICAgcGFyc2VyLm9uKCdoZWFkZXJzJywgaGVhZGVycyA9PiB7XG4gICAgICAgIG1haWwuaGVhZGVycyA9IGhlYWRlcnM7XG4gICAgICAgIG1haWwuaGVhZGVyTGluZXMgPSBwYXJzZXIuaGVhZGVyTGluZXM7XG4gICAgfSk7XG5cbiAgICBsZXQgcmVhZGluZyA9IGZhbHNlO1xuICAgIGxldCByZWFkZXIgPSAoKSA9PiB7XG4gICAgICAgIHJlYWRpbmcgPSB0cnVlO1xuXG4gICAgICAgIGxldCBkYXRhID0gcGFyc2VyLnJlYWQoKTtcblxuICAgICAgICBpZiAoZGF0YSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcmVhZGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGRhdGEudHlwZSA9PT0gJ3RleHQnKSB7XG4gICAgICAgICAgICBPYmplY3Qua2V5cyhkYXRhKS5mb3JFYWNoKGtleSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKFsndGV4dCcsICdodG1sJywgJ3RleHRBc0h0bWwnXS5pbmNsdWRlcyhrZXkpKSB7XG4gICAgICAgICAgICAgICAgICAgIG1haWxba2V5XSA9IGRhdGFba2V5XTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChkYXRhLnR5cGUgPT09ICdhdHRhY2htZW50Jykge1xuICAgICAgICAgICAgbWFpbC5hdHRhY2htZW50cy5wdXNoKGRhdGEpO1xuXG4gICAgICAgICAgICBsZXQgY2h1bmtzID0gW107XG4gICAgICAgICAgICBsZXQgY2h1bmtsZW4gPSAwO1xuICAgICAgICAgICAgZGF0YS5jb250ZW50Lm9uKCdyZWFkYWJsZScsICgpID0+IHtcbiAgICAgICAgICAgICAgICBsZXQgY2h1bms7XG4gICAgICAgICAgICAgICAgd2hpbGUgKChjaHVuayA9IGRhdGEuY29udGVudC5yZWFkKCkpICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNodW5rcy5wdXNoKGNodW5rKTtcbiAgICAgICAgICAgICAgICAgICAgY2h1bmtsZW4gKz0gY2h1bmsubGVuZ3RoO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBkYXRhLmNvbnRlbnQub24oJ2VuZCcsICgpID0+IHtcbiAgICAgICAgICAgICAgICBkYXRhLmNvbnRlbnQgPSBCdWZmZXIuY29uY2F0KGNodW5rcywgY2h1bmtsZW4pO1xuICAgICAgICAgICAgICAgIGRhdGEucmVsZWFzZSgpO1xuICAgICAgICAgICAgICAgIHJlYWRlcigpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZWFkZXIoKTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICBwYXJzZXIub24oJ3JlYWRhYmxlJywgKCkgPT4ge1xuICAgICAgICBpZiAoIXJlYWRpbmcpIHtcbiAgICAgICAgICAgIHJlYWRlcigpO1xuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICBwYXJzZXIub24oJ2VuZCcsICgpID0+IHtcbiAgICAgICAgWydzdWJqZWN0JywgJ3JlZmVyZW5jZXMnLCAnZGF0ZScsICd0bycsICdmcm9tJywgJ3RvJywgJ2NjJywgJ2JjYycsICdtZXNzYWdlLWlkJywgJ2luLXJlcGx5LXRvJywgJ3JlcGx5LXRvJ10uZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICAgICAgaWYgKG1haWwuaGVhZGVycyAmJiBtYWlsLmhlYWRlcnMuaGFzKGtleSkpIHtcbiAgICAgICAgICAgICAgICBtYWlsW2tleS5yZXBsYWNlKC8tKFthLXpdKS9nLCAobSwgYykgPT4gYy50b1VwcGVyQ2FzZSgpKV0gPSBtYWlsLmhlYWRlcnMuZ2V0KGtleSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmIChrZWVwQ2lkTGlua3MpIHtcbiAgICAgICAgICAgIHJldHVybiBjYWxsYmFjayhudWxsLCBtYWlsKTtcbiAgICAgICAgfVxuICAgICAgICBwYXJzZXIudXBkYXRlSW1hZ2VMaW5rcyhcbiAgICAgICAgICAgIChhdHRhY2htZW50LCBkb25lKSA9PiBkb25lKGZhbHNlLCAnZGF0YTonICsgYXR0YWNobWVudC5jb250ZW50VHlwZSArICc7YmFzZTY0LCcgKyBhdHRhY2htZW50LmNvbnRlbnQudG9TdHJpbmcoJ2Jhc2U2NCcpKSxcbiAgICAgICAgICAgIChlcnIsIGh0bWwpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBjYWxsYmFjayhlcnIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBtYWlsLmh0bWwgPSBodG1sO1xuXG4gICAgICAgICAgICAgICAgY2FsbGJhY2sobnVsbCwgbWFpbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpZiAodHlwZW9mIGlucHV0ID09PSAnc3RyaW5nJykge1xuICAgICAgICBwYXJzZXIuZW5kKEJ1ZmZlci5mcm9tKGlucHV0KSk7XG4gICAgfSBlbHNlIGlmIChCdWZmZXIuaXNCdWZmZXIoaW5wdXQpKSB7XG4gICAgICAgIHBhcnNlci5lbmQoaW5wdXQpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGlucHV0XG4gICAgICAgICAgICAub25jZSgnZXJyb3InLCBlcnIgPT4ge1xuICAgICAgICAgICAgICAgIGlucHV0LmRlc3Ryb3koKTtcbiAgICAgICAgICAgICAgICBwYXJzZXIuZGVzdHJveSgpO1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVycik7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLnBpcGUocGFyc2VyKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcHJvbWlzZTtcbn07XG5cbmZ1bmN0aW9uIGNhbGxiYWNrUHJvbWlzZShyZXNvbHZlLCByZWplY3QpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKC4uLmFyZ3MpIHtcbiAgICAgICAgbGV0IGVyciA9IGFyZ3Muc2hpZnQoKTtcbiAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgICAgcmVqZWN0KGVycik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXNvbHZlKC4uLmFyZ3MpO1xuICAgICAgICB9XG4gICAgfTtcbn1cbiJdLCJuYW1lcyI6W10sImlnbm9yZUxpc3QiOlswXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(rsc)/./node_modules/mailparser/lib/simple-parser.js\n");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "(rsc)/./node_modules/mailparser/lib/stream-hash.js":
|
|
/*!****************************************************!*\
|
|
!*** ./node_modules/mailparser/lib/stream-hash.js ***!
|
|
\****************************************************/
|
|
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
|
|
|
|
eval("\n\nconst crypto = __webpack_require__(/*! crypto */ \"crypto\");\nconst Transform = (__webpack_require__(/*! stream */ \"stream\").Transform);\n\nclass StreamHash extends Transform {\n constructor(attachment, algo) {\n super();\n this.attachment = attachment;\n this.algo = (algo || 'md5').toLowerCase();\n this.hash = crypto.createHash(algo);\n this.byteCount = 0;\n }\n\n _transform(chunk, encoding, done) {\n this.hash.update(chunk);\n this.byteCount += chunk.length;\n done(null, chunk);\n }\n\n _flush(done) {\n this.attachment.checksum = this.hash.digest('hex');\n this.attachment.size = this.byteCount;\n done();\n }\n}\n\nmodule.exports = StreamHash;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHJzYykvLi9ub2RlX21vZHVsZXMvbWFpbHBhcnNlci9saWIvc3RyZWFtLWhhc2guanMiLCJtYXBwaW5ncyI6IkFBQWE7O0FBRWIsZUFBZSxtQkFBTyxDQUFDLHNCQUFRO0FBQy9CLGtCQUFrQix1REFBMkI7O0FBRTdDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEiLCJzb3VyY2VzIjpbIi9ob21lL2FsbWEvbmV4dGdlbi9OZWFoLW1haWwvbm9kZV9tb2R1bGVzL21haWxwYXJzZXIvbGliL3N0cmVhbS1oYXNoLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcblxuY29uc3QgY3J5cHRvID0gcmVxdWlyZSgnY3J5cHRvJyk7XG5jb25zdCBUcmFuc2Zvcm0gPSByZXF1aXJlKCdzdHJlYW0nKS5UcmFuc2Zvcm07XG5cbmNsYXNzIFN0cmVhbUhhc2ggZXh0ZW5kcyBUcmFuc2Zvcm0ge1xuICAgIGNvbnN0cnVjdG9yKGF0dGFjaG1lbnQsIGFsZ28pIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5hdHRhY2htZW50ID0gYXR0YWNobWVudDtcbiAgICAgICAgdGhpcy5hbGdvID0gKGFsZ28gfHwgJ21kNScpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIHRoaXMuaGFzaCA9IGNyeXB0by5jcmVhdGVIYXNoKGFsZ28pO1xuICAgICAgICB0aGlzLmJ5dGVDb3VudCA9IDA7XG4gICAgfVxuXG4gICAgX3RyYW5zZm9ybShjaHVuaywgZW5jb2RpbmcsIGRvbmUpIHtcbiAgICAgICAgdGhpcy5oYXNoLnVwZGF0ZShjaHVuayk7XG4gICAgICAgIHRoaXMuYnl0ZUNvdW50ICs9IGNodW5rLmxlbmd0aDtcbiAgICAgICAgZG9uZShudWxsLCBjaHVuayk7XG4gICAgfVxuXG4gICAgX2ZsdXNoKGRvbmUpIHtcbiAgICAgICAgdGhpcy5hdHRhY2htZW50LmNoZWNrc3VtID0gdGhpcy5oYXNoLmRpZ2VzdCgnaGV4Jyk7XG4gICAgICAgIHRoaXMuYXR0YWNobWVudC5zaXplID0gdGhpcy5ieXRlQ291bnQ7XG4gICAgICAgIGRvbmUoKTtcbiAgICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gU3RyZWFtSGFzaDtcbiJdLCJuYW1lcyI6W10sImlnbm9yZUxpc3QiOlswXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(rsc)/./node_modules/mailparser/lib/stream-hash.js\n");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "(rsc)/./node_modules/mailparser/node_modules/nodemailer/lib/addressparser/index.js":
|
|
/*!************************************************************************************!*\
|
|
!*** ./node_modules/mailparser/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 * @return {Object} Address object\n */\nfunction _handleAddress(tokens) {\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 };\n let i;\n let len;\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 break;\n case '(':\n state = 'comment';\n break;\n case ':':\n state = 'group';\n isGroup = true;\n break;\n default:\n state = 'text';\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 } else {\n data[state].push(token.value);\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 addresses.push({\n name: data.text || (address && address.name),\n group: data.group.length ? addressparser(data.group.join(',')) : []\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 if (data.text[i].match(/^[^@\\s]+@[^@\\s]+$/)) {\n data.address = data.text.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 // 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 // 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 * 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 * @return {Array} An array of address objects\n */\nfunction addressparser(str, options) {\n options = options || {};\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);\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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHJzYykvLi9ub2RlX21vZHVsZXMvbWFpbHBhcnNlci9ub2RlX21vZHVsZXMvbm9kZW1haWxlci9saWIvYWRkcmVzc3BhcnNlci9pbmRleC5qcyIsIm1hcHBpbmdzIjoiQUFBYTs7QUFFYjtBQUNBO0FBQ0E7QUFDQSxXQUFXLE9BQU87QUFDbEIsWUFBWSxRQUFRO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxxQ0FBcUMsU0FBUztBQUM5QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxNQUFNO0FBQ047QUFDQTtBQUNBLDJDQUEyQyxRQUFRO0FBQ25EO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0I7QUFDbEI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSwrQ0FBK0MsUUFBUTtBQUN2RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsUUFBUTtBQUNuQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQjtBQUNuQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0IsT0FBTztBQUN2QjtBQUNBO0FBQ0E7O0FBRUEsK0NBQStDLFNBQVM7QUFDeEQ7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLFFBQVE7QUFDdkI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsMkRBQTJEO0FBQzNEO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTLHdDQUF3QztBQUNqRDtBQUNBLFdBQVcsUUFBUTtBQUNuQixZQUFZLE9BQU87QUFDbkI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsbUZBQW1GO0FBQ25GO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0I7QUFDbEI7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0EiLCJzb3VyY2VzIjpbIi9ob21lL2FsbWEvbmV4dGdlbi9OZWFoLW1haWwvbm9kZV9tb2R1bGVzL21haWxwYXJzZXIvbm9kZV9tb2R1bGVzL25vZGVtYWlsZXIvbGliL2FkZHJlc3NwYXJzZXIvaW5kZXguanMiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIENvbnZlcnRzIHRva2VucyBmb3IgYSBzaW5nbGUgYWRkcmVzcyBpbnRvIGFuIGFkZHJlc3Mgb2JqZWN0XG4gKlxuICogQHBhcmFtIHtBcnJheX0gdG9rZW5zIFRva2VucyBvYmplY3RcbiAqIEByZXR1cm4ge09iamVjdH0gQWRkcmVzcyBvYmplY3RcbiAqL1xuZnVuY3Rpb24gX2hhbmRsZUFkZHJlc3ModG9rZW5zKSB7XG4gICAgbGV0IGlzR3JvdXAgPSBmYWxzZTtcbiAgICBsZXQgc3RhdGUgPSAndGV4dCc7XG4gICAgbGV0IGFkZHJlc3M7XG4gICAgbGV0IGFkZHJlc3NlcyA9IFtdO1xuICAgIGxldCBkYXRhID0ge1xuICAgICAgICBhZGRyZXNzOiBbXSxcbiAgICAgICAgY29tbWVudDogW10sXG4gICAgICAgIGdyb3VwOiBbXSxcbiAgICAgICAgdGV4dDogW11cbiAgICB9O1xuICAgIGxldCBpO1xuICAgIGxldCBsZW47XG5cbiAgICAvLyBGaWx0ZXIgb3V0IDxhZGRyZXNzZXM+LCAoY29tbWVudHMpIGFuZCByZWd1bGFyIHRleHRcbiAgICBmb3IgKGkgPSAwLCBsZW4gPSB0b2tlbnMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgbGV0IHRva2VuID0gdG9rZW5zW2ldO1xuICAgICAgICBsZXQgcHJldlRva2VuID0gaSA/IHRva2Vuc1tpIC0gMV0gOiBudWxsO1xuICAgICAgICBpZiAodG9rZW4udHlwZSA9PT0gJ29wZXJhdG9yJykge1xuICAgICAgICAgICAgc3dpdGNoICh0b2tlbi52YWx1ZSkge1xuICAgICAgICAgICAgICAgIGNhc2UgJzwnOlxuICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9ICdhZGRyZXNzJztcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAnKCc6XG4gICAgICAgICAgICAgICAgICAgIHN0YXRlID0gJ2NvbW1lbnQnO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICc6JzpcbiAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSAnZ3JvdXAnO1xuICAgICAgICAgICAgICAgICAgICBpc0dyb3VwID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSAndGV4dCc7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHRva2VuLnZhbHVlKSB7XG4gICAgICAgICAgICBpZiAoc3RhdGUgPT09ICdhZGRyZXNzJykge1xuICAgICAgICAgICAgICAgIC8vIGhhbmRsZSB1c2UgY2FzZSB3aGVyZSB1bnF1b3RlZCBuYW1lIGluY2x1ZGVzIGEgXCI8XCJcbiAgICAgICAgICAgICAgICAvLyBBcHBsZSBNYWlsIHRydW5jYXRlcyBldmVyeXRoaW5nIGJldHdlZW4gYW4gdW5leHBlY3RlZCA8IGFuZCBhbiBhZGRyZXNzXG4gICAgICAgICAgICAgICAgLy8gYW5kIHNvIHdpbGwgd2VcbiAgICAgICAgICAgICAgICB0b2tlbi52YWx1ZSA9IHRva2VuLnZhbHVlLnJlcGxhY2UoL15bXjxdKjxcXHMqLywgJycpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAocHJldlRva2VuICYmIHByZXZUb2tlbi5ub0JyZWFrICYmIGRhdGFbc3RhdGVdLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIC8vIGpvaW4gdmFsdWVzXG4gICAgICAgICAgICAgICAgZGF0YVtzdGF0ZV1bZGF0YVtzdGF0ZV0ubGVuZ3RoIC0gMV0gKz0gdG9rZW4udmFsdWU7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGRhdGFbc3RhdGVdLnB1c2godG9rZW4udmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gSWYgdGhlcmUgaXMgbm8gdGV4dCBidXQgYSBjb21tZW50LCByZXBsYWNlIHRoZSB0d29cbiAgICBpZiAoIWRhdGEudGV4dC5sZW5ndGggJiYgZGF0YS5jb21tZW50Lmxlbmd0aCkge1xuICAgICAgICBkYXRhLnRleHQgPSBkYXRhLmNvbW1lbnQ7XG4gICAgICAgIGRhdGEuY29tbWVudCA9IFtdO1xuICAgIH1cblxuICAgIGlmIChpc0dyb3VwKSB7XG4gICAgICAgIC8vIGh0dHA6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzI4MjIjYXBwZW5kaXgtQS4xLjNcbiAgICAgICAgZGF0YS50ZXh0ID0gZGF0YS50ZXh0LmpvaW4oJyAnKTtcbiAgICAgICAgYWRkcmVzc2VzLnB1c2goe1xuICAgICAgICAgICAgbmFtZTogZGF0YS50ZXh0IHx8IChhZGRyZXNzICYmIGFkZHJlc3MubmFtZSksXG4gICAgICAgICAgICBncm91cDogZGF0YS5ncm91cC5sZW5ndGggPyBhZGRyZXNzcGFyc2VyKGRhdGEuZ3JvdXAuam9pbignLCcpKSA6IFtdXG4gICAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIElmIG5vIGFkZHJlc3Mgd2FzIGZvdW5kLCB0cnkgdG8gZGV0ZWN0IG9uZSBmcm9tIHJlZ3VsYXIgdGV4dFxuICAgICAgICBpZiAoIWRhdGEuYWRkcmVzcy5sZW5ndGggJiYgZGF0YS50ZXh0Lmxlbmd0aCkge1xuICAgICAgICAgICAgZm9yIChpID0gZGF0YS50ZXh0Lmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgICAgICAgaWYgKGRhdGEudGV4dFtpXS5tYXRjaCgvXlteQFxcc10rQFteQFxcc10rJC8pKSB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGEuYWRkcmVzcyA9IGRhdGEudGV4dC5zcGxpY2UoaSwgMSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbGV0IF9yZWdleEhhbmRsZXIgPSBmdW5jdGlvbiAoYWRkcmVzcykge1xuICAgICAgICAgICAgICAgIGlmICghZGF0YS5hZGRyZXNzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICBkYXRhLmFkZHJlc3MgPSBbYWRkcmVzcy50cmltKCldO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gJyAnO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBhZGRyZXNzO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIC8vIHN0aWxsIG5vIGFkZHJlc3NcbiAgICAgICAgICAgIGlmICghZGF0YS5hZGRyZXNzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIGZvciAoaSA9IGRhdGEudGV4dC5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBmaXhlZCB0aGUgcmVnZXggdG8gcGFyc2UgZW1haWwgYWRkcmVzcyBjb3JyZWN0bHkgd2hlbiBlbWFpbCBhZGRyZXNzIGhhcyBtb3JlIHRoYW4gb25lIEBcbiAgICAgICAgICAgICAgICAgICAgZGF0YS50ZXh0W2ldID0gZGF0YS50ZXh0W2ldLnJlcGxhY2UoL1xccypcXGJbXkBcXHNdK0BbXlxcc10rXFxiXFxzKi8sIF9yZWdleEhhbmRsZXIpLnRyaW0oKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGEuYWRkcmVzcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gSWYgdGhlcmUncyBzdGlsbCBpcyBubyB0ZXh0IGJ1dCBhIGNvbW1lbnQgZXhpeHRzLCByZXBsYWNlIHRoZSB0d29cbiAgICAgICAgaWYgKCFkYXRhLnRleHQubGVuZ3RoICYmIGRhdGEuY29tbWVudC5sZW5ndGgpIHtcbiAgICAgICAgICAgIGRhdGEudGV4dCA9IGRhdGEuY29tbWVudDtcbiAgICAgICAgICAgIGRhdGEuY29tbWVudCA9IFtdO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gS2VlcCBvbmx5IHRoZSBmaXJzdCBhZGRyZXNzIG9jY3VyZW5jZSwgcHVzaCBvdGhlcnMgdG8gcmVndWxhciB0ZXh0XG4gICAgICAgIGlmIChkYXRhLmFkZHJlc3MubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgZGF0YS50ZXh0ID0gZGF0YS50ZXh0LmNvbmNhdChkYXRhLmFkZHJlc3Muc3BsaWNlKDEpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEpvaW4gdmFsdWVzIHdpdGggc3BhY2VzXG4gICAgICAgIGRhdGEudGV4dCA9IGRhdGEudGV4dC5qb2luKCcgJyk7XG4gICAgICAgIGRhdGEuYWRkcmVzcyA9IGRhdGEuYWRkcmVzcy5qb2luKCcgJyk7XG5cbiAgICAgICAgaWYgKCFkYXRhLmFkZHJlc3MgJiYgaXNHcm91cCkge1xuICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYWRkcmVzcyA9IHtcbiAgICAgICAgICAgICAgICBhZGRyZXNzOiBkYXRhLmFkZHJlc3MgfHwgZGF0YS50ZXh0IHx8ICcnLFxuICAgICAgICAgICAgICAgIG5hbWU6IGRhdGEudGV4dCB8fCBkYXRhLmFkZHJlc3MgfHwgJydcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIGlmIChhZGRyZXNzLmFkZHJlc3MgPT09IGFkZHJlc3MubmFtZSkge1xuICAgICAgICAgICAgICAgIGlmICgoYWRkcmVzcy5hZGRyZXNzIHx8ICcnKS5tYXRjaCgvQC8pKSB7XG4gICAgICAgICAgICAgICAgICAgIGFkZHJlc3MubmFtZSA9ICcnO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGFkZHJlc3MuYWRkcmVzcyA9ICcnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgYWRkcmVzc2VzLnB1c2goYWRkcmVzcyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gYWRkcmVzc2VzO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBUb2tlbml6ZXIgb2JqZWN0IGZvciB0b2tlbml6aW5nIGFkZHJlc3MgZmllbGQgc3RyaW5nc1xuICpcbiAqIEBjb25zdHJ1Y3RvclxuICogQHBhcmFtIHtTdHJpbmd9IHN0ciBBZGRyZXNzIGZpZWxkIHN0cmluZ1xuICovXG5jbGFzcyBUb2tlbml6ZXIge1xuICAgIGNvbnN0cnVjdG9yKHN0cikge1xuICAgICAgICB0aGlzLnN0ciA9IChzdHIgfHwgJycpLnRvU3RyaW5nKCk7XG4gICAgICAgIHRoaXMub3BlcmF0b3JDdXJyZW50ID0gJyc7XG4gICAgICAgIHRoaXMub3BlcmF0b3JFeHBlY3RpbmcgPSAnJztcbiAgICAgICAgdGhpcy5ub2RlID0gbnVsbDtcbiAgICAgICAgdGhpcy5lc2NhcGVkID0gZmFsc2U7XG5cbiAgICAgICAgdGhpcy5saXN0ID0gW107XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBPcGVyYXRvciB0b2tlbnMgYW5kIHdoaWNoIHRva2VucyBhcmUgZXhwZWN0ZWQgdG8gZW5kIHRoZSBzZXF1ZW5jZVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5vcGVyYXRvcnMgPSB7XG4gICAgICAgICAgICAnXCInOiAnXCInLFxuICAgICAgICAgICAgJygnOiAnKScsXG4gICAgICAgICAgICAnPCc6ICc+JyxcbiAgICAgICAgICAgICcsJzogJycsXG4gICAgICAgICAgICAnOic6ICc7JyxcbiAgICAgICAgICAgIC8vIFNlbWljb2xvbnMgYXJlIG5vdCBhIGxlZ2FsIGRlbGltaXRlciBwZXIgdGhlIFJGQzI4MjIgZ3JhbW1hciBvdGhlclxuICAgICAgICAgICAgLy8gdGhhbiBmb3IgdGVybWluYXRpbmcgYSBncm91cCwgYnV0IHRoZXkgYXJlIGFsc28gbm90IHZhbGlkIGZvciBhbnlcbiAgICAgICAgICAgIC8vIG90aGVyIHVzZSBpbiB0aGlzIGNvbnRleHQuICBHaXZlbiB0aGF0IHNvbWUgbWFpbCBjbGllbnRzIGhhdmVcbiAgICAgICAgICAgIC8vIGhpc3RvcmljYWxseSBhbGxvd2VkIHRoZSBzZW1pY29sb24gYXMgYSBkZWxpbWl0ZXIgZXF1aXZhbGVudCB0byB0aGVcbiAgICAgICAgICAgIC8vIGNvbW1hIGluIHRoZWlyIFVJLCBpdCBtYWtlcyBzZW5zZSB0byB0cmVhdCB0aGVtIHRoZSBzYW1lIGFzIGEgY29tbWFcbiAgICAgICAgICAgIC8vIHdoZW4gdXNlZCBvdXRzaWRlIG9mIGEgZ3JvdXAuXG4gICAgICAgICAgICAnOyc6ICcnXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVG9rZW5pemVzIHRoZSBvcmlnaW5hbCBpbnB1dCBzdHJpbmdcbiAgICAgKlxuICAgICAqIEByZXR1cm4ge0FycmF5fSBBbiBhcnJheSBvZiBvcGVyYXRvcnx0ZXh0IHRva2Vuc1xuICAgICAqL1xuICAgIHRva2VuaXplKCkge1xuICAgICAgICBsZXQgbGlzdCA9IFtdO1xuXG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSB0aGlzLnN0ci5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgbGV0IGNociA9IHRoaXMuc3RyLmNoYXJBdChpKTtcbiAgICAgICAgICAgIGxldCBuZXh0Q2hyID0gaSA8IGxlbiAtIDEgPyB0aGlzLnN0ci5jaGFyQXQoaSArIDEpIDogbnVsbDtcbiAgICAgICAgICAgIHRoaXMuY2hlY2tDaGFyKGNociwgbmV4dENocik7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmxpc3QuZm9yRWFjaChub2RlID0+IHtcbiAgICAgICAgICAgIG5vZGUudmFsdWUgPSAobm9kZS52YWx1ZSB8fCAnJykudG9TdHJpbmcoKS50cmltKCk7XG4gICAgICAgICAgICBpZiAobm9kZS52YWx1ZSkge1xuICAgICAgICAgICAgICAgIGxpc3QucHVzaChub2RlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIGxpc3Q7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGEgY2hhcmFjdGVyIGlzIGFuIG9wZXJhdG9yIG9yIHRleHQgYW5kIGFjdHMgYWNjb3JkaW5nbHlcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBjaHIgQ2hhcmFjdGVyIGZyb20gdGhlIGFkZHJlc3MgZmllbGRcbiAgICAgKi9cbiAgICBjaGVja0NoYXIoY2hyLCBuZXh0Q2hyKSB7XG4gICAgICAgIGlmICh0aGlzLmVzY2FwZWQpIHtcbiAgICAgICAgICAgIC8vIGlnbm9yZSBuZXh0IGNvbmRpdGlvbiBibG9ja3NcbiAgICAgICAgfSBlbHNlIGlmIChjaHIgPT09IHRoaXMub3BlcmF0b3JFeHBlY3RpbmcpIHtcbiAgICAgICAgICAgIHRoaXMubm9kZSA9IHtcbiAgICAgICAgICAgICAgICB0eXBlOiAnb3BlcmF0b3InLFxuICAgICAgICAgICAgICAgIHZhbHVlOiBjaHJcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIGlmIChuZXh0Q2hyICYmICFbJyAnLCAnXFx0JywgJ1xccicsICdcXG4nLCAnLCcsICc7J10uaW5jbHVkZXMobmV4dENocikpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm5vZGUubm9CcmVhayA9IHRydWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMubGlzdC5wdXNoKHRoaXMubm9kZSk7XG4gICAgICAgICAgICB0aGlzLm5vZGUgPSBudWxsO1xuICAgICAgICAgICAgdGhpcy5vcGVyYXRvckV4cGVjdGluZyA9ICcnO1xuICAgICAgICAgICAgdGhpcy5lc2NhcGVkID0gZmFsc2U7XG5cbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfSBlbHNlIGlmICghdGhpcy5vcGVyYXRvckV4cGVjdGluZyAmJiBjaHIgaW4gdGhpcy5vcGVyYXRvcnMpIHtcbiAgICAgICAgICAgIHRoaXMubm9kZSA9IHtcbiAgICAgICAgICAgICAgICB0eXBlOiAnb3BlcmF0b3InLFxuICAgICAgICAgICAgICAgIHZhbHVlOiBjaHJcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICB0aGlzLmxpc3QucHVzaCh0aGlzLm5vZGUpO1xuICAgICAgICAgICAgdGhpcy5ub2RlID0gbnVsbDtcbiAgICAgICAgICAgIHRoaXMub3BlcmF0b3JFeHBlY3RpbmcgPSB0aGlzLm9wZXJhdG9yc1tjaHJdO1xuICAgICAgICAgICAgdGhpcy5lc2NhcGVkID0gZmFsc2U7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH0gZWxzZSBpZiAoWydcIicsIFwiJ1wiXS5pbmNsdWRlcyh0aGlzLm9wZXJhdG9yRXhwZWN0aW5nKSAmJiBjaHIgPT09ICdcXFxcJykge1xuICAgICAgICAgICAgdGhpcy5lc2NhcGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhpcy5ub2RlKSB7XG4gICAgICAgICAgICB0aGlzLm5vZGUgPSB7XG4gICAgICAgICAgICAgICAgdHlwZTogJ3RleHQnLFxuICAgICAgICAgICAgICAgIHZhbHVlOiAnJ1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHRoaXMubGlzdC5wdXNoKHRoaXMubm9kZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY2hyID09PSAnXFxuJykge1xuICAgICAgICAgICAgLy8gQ29udmVydCBuZXdsaW5lcyB0byBzcGFjZXMuIENhcnJpYWdlIHJldHVybiBpcyBpZ25vcmVkIGFzIFxcciBhbmQgXFxuIHVzdWFsbHlcbiAgICAgICAgICAgIC8vIGdvIHRvZ2V0aGVyIGFueXdheSBhbmQgdGhlcmUgYWxyZWFkeSBpcyBhIFdTIGZvciBcXG4uIExvbmUgXFxyIG1lYW5zIHNvbWV0aGluZyBpcyBmaXNoeS5cbiAgICAgICAgICAgIGNociA9ICcgJztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjaHIuY2hhckNvZGVBdCgwKSA+PSAweDIxIHx8IFsnICcsICdcXHQnXS5pbmNsdWRlcyhjaHIpKSB7XG4gICAgICAgICAgICAvLyBza2lwIGNvbW1hbmQgYnl0ZXNcbiAgICAgICAgICAgIHRoaXMubm9kZS52YWx1ZSArPSBjaHI7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmVzY2FwZWQgPSBmYWxzZTtcbiAgICB9XG59XG5cbi8qKlxuICogUGFyc2VzIHN0cnVjdHVyZWQgZS1tYWlsIGFkZHJlc3NlcyBmcm9tIGFuIGFkZHJlc3MgZmllbGRcbiAqXG4gKiBFeGFtcGxlOlxuICpcbiAqICAgICdOYW1lIDxhZGRyZXNzQGRvbWFpbj4nXG4gKlxuICogd2lsbCBiZSBjb252ZXJ0ZWQgdG9cbiAqXG4gKiAgICAgW3tuYW1lOiAnTmFtZScsIGFkZHJlc3M6ICdhZGRyZXNzQGRvbWFpbid9XVxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBzdHIgQWRkcmVzcyBmaWVsZFxuICogQHJldHVybiB7QXJyYXl9IEFuIGFycmF5IG9mIGFkZHJlc3Mgb2JqZWN0c1xuICovXG5mdW5jdGlvbiBhZGRyZXNzcGFyc2VyKHN0ciwgb3B0aW9ucykge1xuICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuXG4gICAgbGV0IHRva2VuaXplciA9IG5ldyBUb2tlbml6ZXIoc3RyKTtcbiAgICBsZXQgdG9rZW5zID0gdG9rZW5pemVyLnRva2VuaXplKCk7XG5cbiAgICBsZXQgYWRkcmVzc2VzID0gW107XG4gICAgbGV0IGFkZHJlc3MgPSBbXTtcbiAgICBsZXQgcGFyc2VkQWRkcmVzc2VzID0gW107XG5cbiAgICB0b2tlbnMuZm9yRWFjaCh0b2tlbiA9PiB7XG4gICAgICAgIGlmICh0b2tlbi50eXBlID09PSAnb3BlcmF0b3InICYmICh0b2tlbi52YWx1ZSA9PT0gJywnIHx8IHRva2VuLnZhbHVlID09PSAnOycpKSB7XG4gICAgICAgICAgICBpZiAoYWRkcmVzcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBhZGRyZXNzZXMucHVzaChhZGRyZXNzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGFkZHJlc3MgPSBbXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGFkZHJlc3MucHVzaCh0b2tlbik7XG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIGlmIChhZGRyZXNzLmxlbmd0aCkge1xuICAgICAgICBhZGRyZXNzZXMucHVzaChhZGRyZXNzKTtcbiAgICB9XG5cbiAgICBhZGRyZXNzZXMuZm9yRWFjaChhZGRyZXNzID0+IHtcbiAgICAgICAgYWRkcmVzcyA9IF9oYW5kbGVBZGRyZXNzKGFkZHJlc3MpO1xuICAgICAgICBpZiAoYWRkcmVzcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHBhcnNlZEFkZHJlc3NlcyA9IHBhcnNlZEFkZHJlc3Nlcy5jb25jYXQoYWRkcmVzcyk7XG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIGlmIChvcHRpb25zLmZsYXR0ZW4pIHtcbiAgICAgICAgbGV0IGFkZHJlc3NlcyA9IFtdO1xuICAgICAgICBsZXQgd2Fsa0FkZHJlc3NMaXN0ID0gbGlzdCA9PiB7XG4gICAgICAgICAgICBsaXN0LmZvckVhY2goYWRkcmVzcyA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGFkZHJlc3MuZ3JvdXApIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHdhbGtBZGRyZXNzTGlzdChhZGRyZXNzLmdyb3VwKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBhZGRyZXNzZXMucHVzaChhZGRyZXNzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfTtcbiAgICAgICAgd2Fsa0FkZHJlc3NMaXN0KHBhcnNlZEFkZHJlc3Nlcyk7XG4gICAgICAgIHJldHVybiBhZGRyZXNzZXM7XG4gICAgfVxuXG4gICAgcmV0dXJuIHBhcnNlZEFkZHJlc3Nlcztcbn1cblxuLy8gZXhwb3NlIHRvIHRoZSB3b3JsZFxubW9kdWxlLmV4cG9ydHMgPSBhZGRyZXNzcGFyc2VyO1xuIl0sIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6WzBdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(rsc)/./node_modules/mailparser/node_modules/nodemailer/lib/addressparser/index.js\n");
|
|
|
|
/***/ })
|
|
|
|
};
|
|
; |