1115 lines
2.0 MiB
1115 lines
2.0 MiB
"use strict";
|
|
/*
|
|
* ATTENTION: An "eval-source-map" devtool has been used.
|
|
* This devtool is neither made for production nor for readable output files.
|
|
* It uses "eval()" calls to create a separate source file with attached SourceMaps in the browser devtools.
|
|
* If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/)
|
|
* or disable the default devtool with "devtool: false".
|
|
* If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/).
|
|
*/
|
|
exports.id = "vendor-chunks/imapflow";
|
|
exports.ids = ["vendor-chunks/imapflow"];
|
|
exports.modules = {
|
|
|
|
/***/ "(action-browser)/./node_modules/imapflow/lib/charsets.js":
|
|
/*!***********************************************!*\
|
|
!*** ./node_modules/imapflow/lib/charsets.js ***!
|
|
\***********************************************/
|
|
/***/ ((module) => {
|
|
|
|
eval("\n\nconst CHARACTER_SETS = [\n 'US-ASCII',\n 'ISO-8859-1',\n 'ISO-8859-2',\n 'ISO-8859-3',\n 'ISO-8859-4',\n 'ISO-8859-5',\n 'ISO-8859-6',\n 'ISO-8859-7',\n 'ISO-8859-8',\n 'ISO-8859-9',\n 'ISO-8859-10',\n 'ISO_6937-2-add',\n 'JIS_X0201',\n 'JIS_Encoding',\n 'Shift_JIS',\n 'EUC-JP',\n 'Extended_UNIX_Code_Fixed_Width_for_Japanese',\n 'BS_4730',\n 'SEN_850200_C',\n 'IT',\n 'ES',\n 'DIN_66003',\n 'NS_4551-1',\n 'NF_Z_62-010',\n 'ISO-10646-UTF-1',\n 'ISO_646.basic:1983',\n 'INVARIANT',\n 'ISO_646.irv:1983',\n 'NATS-SEFI',\n 'NATS-SEFI-ADD',\n 'NATS-DANO',\n 'NATS-DANO-ADD',\n 'SEN_850200_B',\n 'KS_C_5601-1987',\n 'ISO-2022-KR',\n 'EUC-KR',\n 'ISO-2022-JP',\n 'ISO-2022-JP-2',\n 'JIS_C6220-1969-jp',\n 'JIS_C6220-1969-ro',\n 'PT',\n 'greek7-old',\n 'latin-greek',\n 'NF_Z_62-010_(1973)',\n 'Latin-greek-1',\n 'ISO_5427',\n 'JIS_C6226-1978',\n 'BS_viewdata',\n 'INIS',\n 'INIS-8',\n 'INIS-cyrillic',\n 'ISO_5427:1981',\n 'ISO_5428:1980',\n 'GB_1988-80',\n 'GB_2312-80',\n 'NS_4551-2',\n 'videotex-suppl',\n 'PT2',\n 'ES2',\n 'MSZ_7795.3',\n 'JIS_C6226-1983',\n 'greek7',\n 'ASMO_449',\n 'iso-ir-90',\n 'JIS_C6229-1984-a',\n 'JIS_C6229-1984-b',\n 'JIS_C6229-1984-b-add',\n 'JIS_C6229-1984-hand',\n 'JIS_C6229-1984-hand-add',\n 'JIS_C6229-1984-kana',\n 'ISO_2033-1983',\n 'ANSI_X3.110-1983',\n 'T.61-7bit',\n 'T.61-8bit',\n 'ECMA-cyrillic',\n 'CSA_Z243.4-1985-1',\n 'CSA_Z243.4-1985-2',\n 'CSA_Z243.4-1985-gr',\n 'ISO-8859-6-E',\n 'ISO-8859-6-I',\n 'T.101-G2',\n 'ISO-8859-8-E',\n 'ISO-8859-8-I',\n 'CSN_369103',\n 'JUS_I.B1.002',\n 'IEC_P27-1',\n 'JUS_I.B1.003-serb',\n 'JUS_I.B1.003-mac',\n 'greek-ccitt',\n 'NC_NC00-10:81',\n 'ISO_6937-2-25',\n 'GOST_19768-74',\n 'ISO_8859-supp',\n 'ISO_10367-box',\n 'latin-lap',\n 'JIS_X0212-1990',\n 'DS_2089',\n 'us-dk',\n 'dk-us',\n 'KSC5636',\n 'UNICODE-1-1-UTF-7',\n 'ISO-2022-CN',\n 'ISO-2022-CN-EXT',\n 'UTF-8',\n 'ISO-8859-13',\n 'ISO-8859-14',\n 'ISO-8859-15',\n 'ISO-8859-16',\n 'GBK',\n 'GB18030',\n 'OSD_EBCDIC_DF04_15',\n 'OSD_EBCDIC_DF03_IRV',\n 'OSD_EBCDIC_DF04_1',\n 'ISO-11548-1',\n 'KZ-1048',\n 'ISO-10646-UCS-2',\n 'ISO-10646-UCS-4',\n 'ISO-10646-UCS-Basic',\n 'ISO-10646-Unicode-Latin1',\n 'ISO-10646-J-1',\n 'ISO-Unicode-IBM-1261',\n 'ISO-Unicode-IBM-1268',\n 'ISO-Unicode-IBM-1276',\n 'ISO-Unicode-IBM-1264',\n 'ISO-Unicode-IBM-1265',\n 'UNICODE-1-1',\n 'SCSU',\n 'UTF-7',\n 'UTF-16BE',\n 'UTF-16LE',\n 'UTF-16',\n 'CESU-8',\n 'UTF-32',\n 'UTF-32BE',\n 'UTF-32LE',\n 'BOCU-1',\n 'ISO-8859-1-Windows-3.0-Latin-1',\n 'ISO-8859-1-Windows-3.1-Latin-1',\n 'ISO-8859-2-Windows-Latin-2',\n 'ISO-8859-9-Windows-Latin-5',\n 'hp-roman8',\n 'Adobe-Standard-Encoding',\n 'Ventura-US',\n 'Ventura-International',\n 'DEC-MCS',\n 'IBM850',\n 'PC8-Danish-Norwegian',\n 'IBM862',\n 'PC8-Turkish',\n 'IBM-Symbols',\n 'IBM-Thai',\n 'HP-Legal',\n 'HP-Pi-font',\n 'HP-Math8',\n 'Adobe-Symbol-Encoding',\n 'HP-DeskTop',\n 'Ventura-Math',\n 'Microsoft-Publishing',\n 'Windows-31J',\n 'GB2312',\n 'Big5',\n 'macintosh',\n 'IBM037',\n 'IBM038',\n 'IBM273',\n 'IBM274',\n 'IBM275',\n 'IBM277',\n 'IBM278',\n 'IBM280',\n 'IBM281',\n 'IBM284',\n 'IBM285',\n 'IBM290',\n 'IBM297',\n 'IBM420',\n 'IBM423',\n 'IBM424',\n 'IBM437',\n 'IBM500',\n 'IBM851',\n 'IBM852',\n 'IBM855',\n 'IBM857',\n 'IBM860',\n 'IBM861',\n 'IBM863',\n 'IBM864',\n 'IBM865',\n 'IBM868',\n 'IBM869',\n 'IBM870',\n 'IBM871',\n 'IBM880',\n 'IBM891',\n 'IBM903',\n 'IBM904',\n 'IBM905',\n 'IBM918',\n 'IBM1026',\n 'EBCDIC-AT-DE',\n 'EBCDIC-AT-DE-A',\n 'EBCDIC-CA-FR',\n 'EBCDIC-DK-NO',\n 'EBCDIC-DK-NO-A',\n 'EBCDIC-FI-SE',\n 'EBCDIC-FI-SE-A',\n 'EBCDIC-FR',\n 'EBCDIC-IT',\n 'EBCDIC-PT',\n 'EBCDIC-ES',\n 'EBCDIC-ES-A',\n 'EBCDIC-ES-S',\n 'EBCDIC-UK',\n 'EBCDIC-US',\n 'UNKNOWN-8BIT',\n 'MNEMONIC',\n 'MNEM',\n 'VISCII',\n 'VIQR',\n 'KOI8-R',\n 'HZ-GB-2312',\n 'IBM866',\n 'IBM775',\n 'KOI8-U',\n 'IBM00858',\n 'IBM00924',\n 'IBM01140',\n 'IBM01141',\n 'IBM01142',\n 'IBM01143',\n 'IBM01144',\n 'IBM01145',\n 'IBM01146',\n 'IBM01147',\n 'IBM01148',\n 'IBM01149',\n 'Big5-HKSCS',\n 'IBM1047',\n 'PTCP154',\n 'Amiga-1251',\n 'KOI7-switched',\n 'BRF',\n 'TSCII',\n 'CP51932',\n 'windows-874',\n 'windows-1250',\n 'windows-1251',\n 'windows-1252',\n 'windows-1253',\n 'windows-1254',\n 'windows-1255',\n 'windows-1256',\n 'windows-1257',\n 'windows-1258',\n 'TIS-620',\n 'CP50220'\n];\n\nconst CHARSET_MAP = new Map();\n\nCHARACTER_SETS.forEach(entry => {\n let key = entry.replace(/[_-\\s]/g, '').toLowerCase();\n let modifiedKey = key\n .replace(/^windows/, 'win')\n .replace(/^usascii/, 'ascii')\n .replace(/^iso8859/, 'latin');\n CHARSET_MAP.set(key, entry);\n if (!CHARSET_MAP.has(modifiedKey)) {\n CHARSET_MAP.set(modifiedKey, entry);\n }\n});\n\nmodule.exports.resolveCharset = charset => {\n let key = charset.replace(/[_-\\s]/g, '').toLowerCase();\n if (CHARSET_MAP.has(key)) {\n return CHARSET_MAP.get(key);\n }\n return null;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFjdGlvbi1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9pbWFwZmxvdy9saWIvY2hhcnNldHMuanMiLCJtYXBwaW5ncyI6IkFBQWE7O0FBRWI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVELDZCQUE2QjtBQUM3QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIi9ob21lL2FsbWEvbmV4dGdlbi9OZWFoLW1haWwvbm9kZV9tb2R1bGVzL2ltYXBmbG93L2xpYi9jaGFyc2V0cy5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbmNvbnN0IENIQVJBQ1RFUl9TRVRTID0gW1xuICAgICdVUy1BU0NJSScsXG4gICAgJ0lTTy04ODU5LTEnLFxuICAgICdJU08tODg1OS0yJyxcbiAgICAnSVNPLTg4NTktMycsXG4gICAgJ0lTTy04ODU5LTQnLFxuICAgICdJU08tODg1OS01JyxcbiAgICAnSVNPLTg4NTktNicsXG4gICAgJ0lTTy04ODU5LTcnLFxuICAgICdJU08tODg1OS04JyxcbiAgICAnSVNPLTg4NTktOScsXG4gICAgJ0lTTy04ODU5LTEwJyxcbiAgICAnSVNPXzY5MzctMi1hZGQnLFxuICAgICdKSVNfWDAyMDEnLFxuICAgICdKSVNfRW5jb2RpbmcnLFxuICAgICdTaGlmdF9KSVMnLFxuICAgICdFVUMtSlAnLFxuICAgICdFeHRlbmRlZF9VTklYX0NvZGVfRml4ZWRfV2lkdGhfZm9yX0phcGFuZXNlJyxcbiAgICAnQlNfNDczMCcsXG4gICAgJ1NFTl84NTAyMDBfQycsXG4gICAgJ0lUJyxcbiAgICAnRVMnLFxuICAgICdESU5fNjYwMDMnLFxuICAgICdOU180NTUxLTEnLFxuICAgICdORl9aXzYyLTAxMCcsXG4gICAgJ0lTTy0xMDY0Ni1VVEYtMScsXG4gICAgJ0lTT182NDYuYmFzaWM6MTk4MycsXG4gICAgJ0lOVkFSSUFOVCcsXG4gICAgJ0lTT182NDYuaXJ2OjE5ODMnLFxuICAgICdOQVRTLVNFRkknLFxuICAgICdOQVRTLVNFRkktQUREJyxcbiAgICAnTkFUUy1EQU5PJyxcbiAgICAnTkFUUy1EQU5PLUFERCcsXG4gICAgJ1NFTl84NTAyMDBfQicsXG4gICAgJ0tTX0NfNTYwMS0xOTg3JyxcbiAgICAnSVNPLTIwMjItS1InLFxuICAgICdFVUMtS1InLFxuICAgICdJU08tMjAyMi1KUCcsXG4gICAgJ0lTTy0yMDIyLUpQLTInLFxuICAgICdKSVNfQzYyMjAtMTk2OS1qcCcsXG4gICAgJ0pJU19DNjIyMC0xOTY5LXJvJyxcbiAgICAnUFQnLFxuICAgICdncmVlazctb2xkJyxcbiAgICAnbGF0aW4tZ3JlZWsnLFxuICAgICdORl9aXzYyLTAxMF8oMTk3MyknLFxuICAgICdMYXRpbi1ncmVlay0xJyxcbiAgICAnSVNPXzU0MjcnLFxuICAgICdKSVNfQzYyMjYtMTk3OCcsXG4gICAgJ0JTX3ZpZXdkYXRhJyxcbiAgICAnSU5JUycsXG4gICAgJ0lOSVMtOCcsXG4gICAgJ0lOSVMtY3lyaWxsaWMnLFxuICAgICdJU09fNTQyNzoxOTgxJyxcbiAgICAnSVNPXzU0Mjg6MTk4MCcsXG4gICAgJ0dCXzE5ODgtODAnLFxuICAgICdHQl8yMzEyLTgwJyxcbiAgICAnTlNfNDU1MS0yJyxcbiAgICAndmlkZW90ZXgtc3VwcGwnLFxuICAgICdQVDInLFxuICAgICdFUzInLFxuICAgICdNU1pfNzc5NS4zJyxcbiAgICAnSklTX0M2MjI2LTE5ODMnLFxuICAgICdncmVlazcnLFxuICAgICdBU01PXzQ0OScsXG4gICAgJ2lzby1pci05MCcsXG4gICAgJ0pJU19DNjIyOS0xOTg0LWEnLFxuICAgICdKSVNfQzYyMjktMTk4NC1iJyxcbiAgICAnSklTX0M2MjI5LTE5ODQtYi1hZGQnLFxuICAgICdKSVNfQzYyMjktMTk4NC1oYW5kJyxcbiAgICAnSklTX0M2MjI5LTE5ODQtaGFuZC1hZGQnLFxuICAgICdKSVNfQzYyMjktMTk4NC1rYW5hJyxcbiAgICAnSVNPXzIwMzMtMTk4MycsXG4gICAgJ0FOU0lfWDMuMTEwLTE5ODMnLFxuICAgICdULjYxLTdiaXQnLFxuICAgICdULjYxLThiaXQnLFxuICAgICdFQ01BLWN5cmlsbGljJyxcbiAgICAnQ1NBX1oyNDMuNC0xOTg1LTEnLFxuICAgICdDU0FfWjI0My40LTE5ODUtMicsXG4gICAgJ0NTQV9aMjQzLjQtMTk4NS1ncicsXG4gICAgJ0lTTy04ODU5LTYtRScsXG4gICAgJ0lTTy04ODU5LTYtSScsXG4gICAgJ1QuMTAxLUcyJyxcbiAgICAnSVNPLTg4NTktOC1FJyxcbiAgICAnSVNPLTg4NTktOC1JJyxcbiAgICAnQ1NOXzM2OTEwMycsXG4gICAgJ0pVU19JLkIxLjAwMicsXG4gICAgJ0lFQ19QMjctMScsXG4gICAgJ0pVU19JLkIxLjAwMy1zZXJiJyxcbiAgICAnSlVTX0kuQjEuMDAzLW1hYycsXG4gICAgJ2dyZWVrLWNjaXR0JyxcbiAgICAnTkNfTkMwMC0xMDo4MScsXG4gICAgJ0lTT182OTM3LTItMjUnLFxuICAgICdHT1NUXzE5NzY4LTc0JyxcbiAgICAnSVNPXzg4NTktc3VwcCcsXG4gICAgJ0lTT18xMDM2Ny1ib3gnLFxuICAgICdsYXRpbi1sYXAnLFxuICAgICdKSVNfWDAyMTItMTk5MCcsXG4gICAgJ0RTXzIwODknLFxuICAgICd1cy1kaycsXG4gICAgJ2RrLXVzJyxcbiAgICAnS1NDNTYzNicsXG4gICAgJ1VOSUNPREUtMS0xLVVURi03JyxcbiAgICAnSVNPLTIwMjItQ04nLFxuICAgICdJU08tMjAyMi1DTi1FWFQnLFxuICAgICdVVEYtOCcsXG4gICAgJ0lTTy04ODU5LTEzJyxcbiAgICAnSVNPLTg4NTktMTQnLFxuICAgICdJU08tODg1OS0xNScsXG4gICAgJ0lTTy04ODU5LTE2JyxcbiAgICAnR0JLJyxcbiAgICAnR0IxODAzMCcsXG4gICAgJ09TRF9FQkNESUNfREYwNF8xNScsXG4gICAgJ09TRF9FQkNESUNfREYwM19JUlYnLFxuICAgICdPU0RfRUJDRElDX0RGMDRfMScsXG4gICAgJ0lTTy0xMTU0OC0xJyxcbiAgICAnS1otMTA0OCcsXG4gICAgJ0lTTy0xMDY0Ni1VQ1MtMicsXG4gICAgJ0lTTy0xMDY0Ni1VQ1MtNCcsXG4gICAgJ0lTTy0xMDY0Ni1VQ1MtQmFzaWMnLFxuICAgICdJU08tMTA2NDYtVW5pY29kZS1MYXRpbjEnLFxuICAgICdJU08tMTA2NDYtSi0xJyxcbiAgICAnSVNPLVVuaWNvZGUtSUJNLTEyNjEnLFxuICAgICdJU08tVW5pY29kZS1JQk0tMTI2OCcsXG4gICAgJ0lTTy1Vbmljb2RlLUlCTS0xMjc2JyxcbiAgICAnSVNPLVVuaWNvZGUtSUJNLTEyNjQnLFxuICAgICdJU08tVW5pY29kZS1JQk0tMTI2NScsXG4gICAgJ1VOSUNPREUtMS0xJyxcbiAgICAnU0NTVScsXG4gICAgJ1VURi03JyxcbiAgICAnVVRGLTE2QkUnLFxuICAgICdVVEYtMTZMRScsXG4gICAgJ1VURi0xNicsXG4gICAgJ0NFU1UtOCcsXG4gICAgJ1VURi0zMicsXG4gICAgJ1VURi0zMkJFJyxcbiAgICAnVVRGLTMyTEUnLFxuICAgICdCT0NVLTEnLFxuICAgICdJU08tODg1OS0xLVdpbmRvd3MtMy4wLUxhdGluLTEnLFxuICAgICdJU08tODg1OS0xLVdpbmRvd3MtMy4xLUxhdGluLTEnLFxuICAgICdJU08tODg1OS0yLVdpbmRvd3MtTGF0aW4tMicsXG4gICAgJ0lTTy04ODU5LTktV2luZG93cy1MYXRpbi01JyxcbiAgICAnaHAtcm9tYW44JyxcbiAgICAnQWRvYmUtU3RhbmRhcmQtRW5jb2RpbmcnLFxuICAgICdWZW50dXJhLVVTJyxcbiAgICAnVmVudHVyYS1JbnRlcm5hdGlvbmFsJyxcbiAgICAnREVDLU1DUycsXG4gICAgJ0lCTTg1MCcsXG4gICAgJ1BDOC1EYW5pc2gtTm9yd2VnaWFuJyxcbiAgICAnSUJNODYyJyxcbiAgICAnUEM4LVR1cmtpc2gnLFxuICAgICdJQk0tU3ltYm9scycsXG4gICAgJ0lCTS1UaGFpJyxcbiAgICAnSFAtTGVnYWwnLFxuICAgICdIUC1QaS1mb250JyxcbiAgICAnSFAtTWF0aDgnLFxuICAgICdBZG9iZS1TeW1ib2wtRW5jb2RpbmcnLFxuICAgICdIUC1EZXNrVG9wJyxcbiAgICAnVmVudHVyYS1NYXRoJyxcbiAgICAnTWljcm9zb2Z0LVB1Ymxpc2hpbmcnLFxuICAgICdXaW5kb3dzLTMxSicsXG4gICAgJ0dCMjMxMicsXG4gICAgJ0JpZzUnLFxuICAgICdtYWNpbnRvc2gnLFxuICAgICdJQk0wMzcnLFxuICAgICdJQk0wMzgnLFxuICAgICdJQk0yNzMnLFxuICAgICdJQk0yNzQnLFxuICAgICdJQk0yNzUnLFxuICAgICdJQk0yNzcnLFxuICAgICdJQk0yNzgnLFxuICAgICdJQk0yODAnLFxuICAgICdJQk0yODEnLFxuICAgICdJQk0yODQnLFxuICAgICdJQk0yODUnLFxuICAgICdJQk0yOTAnLFxuICAgICdJQk0yOTcnLFxuICAgICdJQk00MjAnLFxuICAgICdJQk00MjMnLFxuICAgICdJQk00MjQnLFxuICAgICdJQk00MzcnLFxuICAgICdJQk01MDAnLFxuICAgICdJQk04NTEnLFxuICAgICdJQk04NTInLFxuICAgICdJQk04NTUnLFxuICAgICdJQk04NTcnLFxuICAgICdJQk04NjAnLFxuICAgICdJQk04NjEnLFxuICAgICdJQk04NjMnLFxuICAgICdJQk04NjQnLFxuICAgICdJQk04NjUnLFxuICAgICdJQk04NjgnLFxuICAgICdJQk04NjknLFxuICAgICdJQk04NzAnLFxuICAgICdJQk04NzEnLFxuICAgICdJQk04ODAnLFxuICAgICdJQk04OTEnLFxuICAgICdJQk05MDMnLFxuICAgICdJQk05MDQnLFxuICAgICdJQk05MDUnLFxuICAgICdJQk05MTgnLFxuICAgICdJQk0xMDI2JyxcbiAgICAnRUJDRElDLUFULURFJyxcbiAgICAnRUJDRElDLUFULURFLUEnLFxuICAgICdFQkNESUMtQ0EtRlInLFxuICAgICdFQkNESUMtREstTk8nLFxuICAgICdFQkNESUMtREstTk8tQScsXG4gICAgJ0VCQ0RJQy1GSS1TRScsXG4gICAgJ0VCQ0RJQy1GSS1TRS1BJyxcbiAgICAnRUJDRElDLUZSJyxcbiAgICAnRUJDRElDLUlUJyxcbiAgICAnRUJDRElDLVBUJyxcbiAgICAnRUJDRElDLUVTJyxcbiAgICAnRUJDRElDLUVTLUEnLFxuICAgICdFQkNESUMtRVMtUycsXG4gICAgJ0VCQ0RJQy1VSycsXG4gICAgJ0VCQ0RJQy1VUycsXG4gICAgJ1VOS05PV04tOEJJVCcsXG4gICAgJ01ORU1PTklDJyxcbiAgICAnTU5FTScsXG4gICAgJ1ZJU0NJSScsXG4gICAgJ1ZJUVInLFxuICAgICdLT0k4LVInLFxuICAgICdIWi1HQi0yMzEyJyxcbiAgICAnSUJNODY2JyxcbiAgICAnSUJNNzc1JyxcbiAgICAnS09JOC1VJyxcbiAgICAnSUJNMDA4NTgnLFxuICAgICdJQk0wMDkyNCcsXG4gICAgJ0lCTTAxMTQwJyxcbiAgICAnSUJNMDExNDEnLFxuICAgICdJQk0wMTE0MicsXG4gICAgJ0lCTTAxMTQzJyxcbiAgICAnSUJNMDExNDQnLFxuICAgICdJQk0wMTE0NScsXG4gICAgJ0lCTTAxMTQ2JyxcbiAgICAnSUJNMDExNDcnLFxuICAgICdJQk0wMTE0OCcsXG4gICAgJ0lCTTAxMTQ5JyxcbiAgICAnQmlnNS1IS1NDUycsXG4gICAgJ0lCTTEwNDcnLFxuICAgICdQVENQMTU0JyxcbiAgICAnQW1pZ2EtMTI1MScsXG4gICAgJ0tPSTctc3dpdGNoZWQnLFxuICAgICdCUkYnLFxuICAgICdUU0NJSScsXG4gICAgJ0NQNTE5MzInLFxuICAgICd3aW5kb3dzLTg3NCcsXG4gICAgJ3dpbmRvd3MtMTI1MCcsXG4gICAgJ3dpbmRvd3MtMTI1MScsXG4gICAgJ3dpbmRvd3MtMTI1MicsXG4gICAgJ3dpbmRvd3MtMTI1MycsXG4gICAgJ3dpbmRvd3MtMTI1NCcsXG4gICAgJ3dpbmRvd3MtMTI1NScsXG4gICAgJ3dpbmRvd3MtMTI1NicsXG4gICAgJ3dpbmRvd3MtMTI1NycsXG4gICAgJ3dpbmRvd3MtMTI1OCcsXG4gICAgJ1RJUy02MjAnLFxuICAgICdDUDUwMjIwJ1xuXTtcblxuY29uc3QgQ0hBUlNFVF9NQVAgPSBuZXcgTWFwKCk7XG5cbkNIQVJBQ1RFUl9TRVRTLmZvckVhY2goZW50cnkgPT4ge1xuICAgIGxldCBrZXkgPSBlbnRyeS5yZXBsYWNlKC9bXy1cXHNdL2csICcnKS50b0xvd2VyQ2FzZSgpO1xuICAgIGxldCBtb2RpZmllZEtleSA9IGtleVxuICAgICAgICAucmVwbGFjZSgvXndpbmRvd3MvLCAnd2luJylcbiAgICAgICAgLnJlcGxhY2UoL151c2FzY2lpLywgJ2FzY2lpJylcbiAgICAgICAgLnJlcGxhY2UoL15pc284ODU5LywgJ2xhdGluJyk7XG4gICAgQ0hBUlNFVF9NQVAuc2V0KGtleSwgZW50cnkpO1xuICAgIGlmICghQ0hBUlNFVF9NQVAuaGFzKG1vZGlmaWVkS2V5KSkge1xuICAgICAgICBDSEFSU0VUX01BUC5zZXQobW9kaWZpZWRLZXksIGVudHJ5KTtcbiAgICB9XG59KTtcblxubW9kdWxlLmV4cG9ydHMucmVzb2x2ZUNoYXJzZXQgPSBjaGFyc2V0ID0+IHtcbiAgICBsZXQga2V5ID0gY2hhcnNldC5yZXBsYWNlKC9bXy1cXHNdL2csICcnKS50b0xvd2VyQ2FzZSgpO1xuICAgIGlmIChDSEFSU0VUX01BUC5oYXMoa2V5KSkge1xuICAgICAgICByZXR1cm4gQ0hBUlNFVF9NQVAuZ2V0KGtleSk7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xufTtcbiJdLCJuYW1lcyI6W10sImlnbm9yZUxpc3QiOlswXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(action-browser)/./node_modules/imapflow/lib/charsets.js\n");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "(action-browser)/./node_modules/imapflow/lib/commands/append.js":
|
|
/*!******************************************************!*\
|
|
!*** ./node_modules/imapflow/lib/commands/append.js ***!
|
|
\******************************************************/
|
|
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
|
|
|
|
eval("\n\nconst { getStatusCode, formatFlag, canUseFlag, formatDateTime, normalizePath, encodePath, comparePaths, getErrorText } = __webpack_require__(/*! ../tools.js */ \"(action-browser)/./node_modules/imapflow/lib/tools.js\");\n\n// Appends a message to a mailbox\nmodule.exports = async (connection, destination, content, flags, idate) => {\n if (![connection.states.AUTHENTICATED, connection.states.SELECTED].includes(connection.state) || !destination) {\n // nothing to do here\n return;\n }\n\n if (connection.capabilities.has('APPENDLIMIT')) {\n let appendLimit = connection.capabilities.get('APPENDLIMIT');\n if (typeof appendLimit === 'number' && appendLimit < content.length) {\n let err = new Error('Message content too big for APPENDLIMIT=' + appendLimit);\n err.serverResponseCode = 'APPENDLIMIT';\n throw err;\n }\n }\n\n destination = normalizePath(connection, destination);\n\n let expectExists = comparePaths(connection, connection.mailbox.path, destination);\n\n flags = (Array.isArray(flags) ? flags : [].concat(flags || []))\n .map(flag => flag && formatFlag(flag.toString()))\n .filter(flag => flag && canUseFlag(connection.mailbox, flag));\n\n let attributes = [{ type: 'ATOM', value: encodePath(connection, destination) }];\n\n idate = idate ? formatDateTime(idate) : false;\n\n if (flags.length || idate) {\n attributes.push(flags.map(flag => ({ type: 'ATOM', value: flag })));\n }\n\n if (idate) {\n attributes.push({ type: 'STRING', value: idate }); // force quotes as required by date-time\n }\n\n let isLiteral8 = false;\n if (connection.capabilities.has('BINARY') && !connection.disableBinary) {\n if (typeof content === 'string') {\n content = Buffer.from(content);\n }\n // Value is literal8 if it contains NULL bytes. The server must support the BINARY extension\n // and if it does not then send the value as a regular literal and hope for the best\n isLiteral8 = content.indexOf(Buffer.from([0])) >= 0;\n }\n\n attributes.push({ type: 'LITERAL', value: content, isLiteral8 });\n\n let map = { destination };\n if (connection.mailbox && connection.mailbox.path) {\n map.path = connection.mailbox.path;\n }\n\n let response;\n try {\n response = await connection.exec('APPEND', attributes, {\n untagged: expectExists\n ? {\n EXISTS: async untagged => {\n map.seq = Number(untagged.command);\n\n if (expectExists) {\n let prevCount = connection.mailbox.exists;\n if (map.seq !== prevCount) {\n connection.mailbox.exists = map.seq;\n connection.emit('exists', {\n path: connection.mailbox.path,\n count: map.seq,\n prevCount\n });\n }\n }\n }\n }\n : false\n });\n\n let section = response.response.attributes && response.response.attributes[0] && response.response.attributes[0].section;\n if (section && section.length) {\n let responseCode = section[0] && typeof section[0].value === 'string' ? section[0].value : '';\n switch (responseCode.toUpperCase()) {\n case 'APPENDUID':\n {\n let uidValidity = section[1] && typeof section[1].value === 'string' && !isNaN(section[1].value) ? BigInt(section[1].value) : false;\n let uid = section[2] && typeof section[2].value === 'string' && !isNaN(section[2].value) ? Number(section[2].value) : false;\n if (uidValidity) {\n map.uidValidity = uidValidity;\n }\n if (uid) {\n map.uid = uid;\n }\n }\n break;\n }\n }\n\n response.next();\n\n if (expectExists && !map.seq) {\n // try to use NOOP to get the new sequence number\n try {\n response = await connection.exec('NOOP', false, {\n untagged: {\n EXISTS: async untagged => {\n map.seq = Number(untagged.command);\n\n if (expectExists) {\n let prevCount = connection.mailbox.exists;\n if (map.seq !== prevCount) {\n connection.mailbox.exists = map.seq;\n connection.emit('exists', {\n path: connection.mailbox.path,\n count: map.seq,\n prevCount\n });\n }\n }\n }\n },\n comment: 'Sequence not found from APPEND output'\n });\n response.next();\n } catch (err) {\n connection.log.warn({ err, cid: connection.id });\n }\n }\n\n if (map.seq && !map.uid) {\n let list = await connection.search({ seq: map.seq }, { uid: true });\n if (list && list.length) {\n map.uid = list[0];\n }\n }\n\n return map;\n } catch (err) {\n let errorCode = getStatusCode(err.response);\n if (errorCode) {\n err.serverResponseCode = errorCode;\n }\n err.response = await getErrorText(err.response);\n\n connection.log.warn({ err, cid: connection.id });\n throw err;\n }\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFjdGlvbi1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9pbWFwZmxvdy9saWIvY29tbWFuZHMvYXBwZW5kLmpzIiwibWFwcGluZ3MiOiJBQUFhOztBQUViLFFBQVEsK0dBQStHLEVBQUUsbUJBQU8sQ0FBQywwRUFBYTs7QUFFOUk7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBLHdCQUF3QiwwREFBMEQ7O0FBRWxGOztBQUVBO0FBQ0EsNkNBQTZDLDJCQUEyQjtBQUN4RTs7QUFFQTtBQUNBLDBCQUEwQiw4QkFBOEIsR0FBRztBQUMzRDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsc0JBQXNCLDZDQUE2Qzs7QUFFbkUsZ0JBQWdCO0FBQ2hCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUNBQW1DO0FBQ25DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUNBQXFDO0FBQ3JDO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQjtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBLGNBQWM7QUFDZCxzQ0FBc0MseUJBQXlCO0FBQy9EO0FBQ0E7O0FBRUE7QUFDQSxpREFBaUQsY0FBYyxJQUFJLFdBQVc7QUFDOUU7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSw4QkFBOEIseUJBQXlCO0FBQ3ZEO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsiL2hvbWUvYWxtYS9uZXh0Z2VuL05lYWgtbWFpbC9ub2RlX21vZHVsZXMvaW1hcGZsb3cvbGliL2NvbW1hbmRzL2FwcGVuZC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbmNvbnN0IHsgZ2V0U3RhdHVzQ29kZSwgZm9ybWF0RmxhZywgY2FuVXNlRmxhZywgZm9ybWF0RGF0ZVRpbWUsIG5vcm1hbGl6ZVBhdGgsIGVuY29kZVBhdGgsIGNvbXBhcmVQYXRocywgZ2V0RXJyb3JUZXh0IH0gPSByZXF1aXJlKCcuLi90b29scy5qcycpO1xuXG4vLyBBcHBlbmRzIGEgbWVzc2FnZSB0byBhIG1haWxib3hcbm1vZHVsZS5leHBvcnRzID0gYXN5bmMgKGNvbm5lY3Rpb24sIGRlc3RpbmF0aW9uLCBjb250ZW50LCBmbGFncywgaWRhdGUpID0+IHtcbiAgICBpZiAoIVtjb25uZWN0aW9uLnN0YXRlcy5BVVRIRU5USUNBVEVELCBjb25uZWN0aW9uLnN0YXRlcy5TRUxFQ1RFRF0uaW5jbHVkZXMoY29ubmVjdGlvbi5zdGF0ZSkgfHwgIWRlc3RpbmF0aW9uKSB7XG4gICAgICAgIC8vIG5vdGhpbmcgdG8gZG8gaGVyZVxuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGNvbm5lY3Rpb24uY2FwYWJpbGl0aWVzLmhhcygnQVBQRU5ETElNSVQnKSkge1xuICAgICAgICBsZXQgYXBwZW5kTGltaXQgPSBjb25uZWN0aW9uLmNhcGFiaWxpdGllcy5nZXQoJ0FQUEVORExJTUlUJyk7XG4gICAgICAgIGlmICh0eXBlb2YgYXBwZW5kTGltaXQgPT09ICdudW1iZXInICYmIGFwcGVuZExpbWl0IDwgY29udGVudC5sZW5ndGgpIHtcbiAgICAgICAgICAgIGxldCBlcnIgPSBuZXcgRXJyb3IoJ01lc3NhZ2UgY29udGVudCB0b28gYmlnIGZvciBBUFBFTkRMSU1JVD0nICsgYXBwZW5kTGltaXQpO1xuICAgICAgICAgICAgZXJyLnNlcnZlclJlc3BvbnNlQ29kZSA9ICdBUFBFTkRMSU1JVCc7XG4gICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBkZXN0aW5hdGlvbiA9IG5vcm1hbGl6ZVBhdGgoY29ubmVjdGlvbiwgZGVzdGluYXRpb24pO1xuXG4gICAgbGV0IGV4cGVjdEV4aXN0cyA9IGNvbXBhcmVQYXRocyhjb25uZWN0aW9uLCBjb25uZWN0aW9uLm1haWxib3gucGF0aCwgZGVzdGluYXRpb24pO1xuXG4gICAgZmxhZ3MgPSAoQXJyYXkuaXNBcnJheShmbGFncykgPyBmbGFncyA6IFtdLmNvbmNhdChmbGFncyB8fCBbXSkpXG4gICAgICAgIC5tYXAoZmxhZyA9PiBmbGFnICYmIGZvcm1hdEZsYWcoZmxhZy50b1N0cmluZygpKSlcbiAgICAgICAgLmZpbHRlcihmbGFnID0+IGZsYWcgJiYgY2FuVXNlRmxhZyhjb25uZWN0aW9uLm1haWxib3gsIGZsYWcpKTtcblxuICAgIGxldCBhdHRyaWJ1dGVzID0gW3sgdHlwZTogJ0FUT00nLCB2YWx1ZTogZW5jb2RlUGF0aChjb25uZWN0aW9uLCBkZXN0aW5hdGlvbikgfV07XG5cbiAgICBpZGF0ZSA9IGlkYXRlID8gZm9ybWF0RGF0ZVRpbWUoaWRhdGUpIDogZmFsc2U7XG5cbiAgICBpZiAoZmxhZ3MubGVuZ3RoIHx8IGlkYXRlKSB7XG4gICAgICAgIGF0dHJpYnV0ZXMucHVzaChmbGFncy5tYXAoZmxhZyA9PiAoeyB0eXBlOiAnQVRPTScsIHZhbHVlOiBmbGFnIH0pKSk7XG4gICAgfVxuXG4gICAgaWYgKGlkYXRlKSB7XG4gICAgICAgIGF0dHJpYnV0ZXMucHVzaCh7IHR5cGU6ICdTVFJJTkcnLCB2YWx1ZTogaWRhdGUgfSk7IC8vIGZvcmNlIHF1b3RlcyBhcyByZXF1aXJlZCBieSBkYXRlLXRpbWVcbiAgICB9XG5cbiAgICBsZXQgaXNMaXRlcmFsOCA9IGZhbHNlO1xuICAgIGlmIChjb25uZWN0aW9uLmNhcGFiaWxpdGllcy5oYXMoJ0JJTkFSWScpICYmICFjb25uZWN0aW9uLmRpc2FibGVCaW5hcnkpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBjb250ZW50ID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgY29udGVudCA9IEJ1ZmZlci5mcm9tKGNvbnRlbnQpO1xuICAgICAgICB9XG4gICAgICAgIC8vIFZhbHVlIGlzIGxpdGVyYWw4IGlmIGl0IGNvbnRhaW5zIE5VTEwgYnl0ZXMuIFRoZSBzZXJ2ZXIgbXVzdCBzdXBwb3J0IHRoZSBCSU5BUlkgZXh0ZW5zaW9uXG4gICAgICAgIC8vIGFuZCBpZiBpdCBkb2VzIG5vdCB0aGVuIHNlbmQgdGhlIHZhbHVlIGFzIGEgcmVndWxhciBsaXRlcmFsIGFuZCBob3BlIGZvciB0aGUgYmVzdFxuICAgICAgICBpc0xpdGVyYWw4ID0gY29udGVudC5pbmRleE9mKEJ1ZmZlci5mcm9tKFswXSkpID49IDA7XG4gICAgfVxuXG4gICAgYXR0cmlidXRlcy5wdXNoKHsgdHlwZTogJ0xJVEVSQUwnLCB2YWx1ZTogY29udGVudCwgaXNMaXRlcmFsOCB9KTtcblxuICAgIGxldCBtYXAgPSB7IGRlc3RpbmF0aW9uIH07XG4gICAgaWYgKGNvbm5lY3Rpb24ubWFpbGJveCAmJiBjb25uZWN0aW9uLm1haWxib3gucGF0aCkge1xuICAgICAgICBtYXAucGF0aCA9IGNvbm5lY3Rpb24ubWFpbGJveC5wYXRoO1xuICAgIH1cblxuICAgIGxldCByZXNwb25zZTtcbiAgICB0cnkge1xuICAgICAgICByZXNwb25zZSA9IGF3YWl0IGNvbm5lY3Rpb24uZXhlYygnQVBQRU5EJywgYXR0cmlidXRlcywge1xuICAgICAgICAgICAgdW50YWdnZWQ6IGV4cGVjdEV4aXN0c1xuICAgICAgICAgICAgICAgID8ge1xuICAgICAgICAgICAgICAgICAgICAgIEVYSVNUUzogYXN5bmMgdW50YWdnZWQgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBtYXAuc2VxID0gTnVtYmVyKHVudGFnZ2VkLmNvbW1hbmQpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChleHBlY3RFeGlzdHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBwcmV2Q291bnQgPSBjb25uZWN0aW9uLm1haWxib3guZXhpc3RzO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1hcC5zZXEgIT09IHByZXZDb3VudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24ubWFpbGJveC5leGlzdHMgPSBtYXAuc2VxO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24uZW1pdCgnZXhpc3RzJywge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRoOiBjb25uZWN0aW9uLm1haWxib3gucGF0aCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6IG1hcC5zZXEsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXZDb3VudFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIDogZmFsc2VcbiAgICAgICAgfSk7XG5cbiAgICAgICAgbGV0IHNlY3Rpb24gPSByZXNwb25zZS5yZXNwb25zZS5hdHRyaWJ1dGVzICYmIHJlc3BvbnNlLnJlc3BvbnNlLmF0dHJpYnV0ZXNbMF0gJiYgcmVzcG9uc2UucmVzcG9uc2UuYXR0cmlidXRlc1swXS5zZWN0aW9uO1xuICAgICAgICBpZiAoc2VjdGlvbiAmJiBzZWN0aW9uLmxlbmd0aCkge1xuICAgICAgICAgICAgbGV0IHJlc3BvbnNlQ29kZSA9IHNlY3Rpb25bMF0gJiYgdHlwZW9mIHNlY3Rpb25bMF0udmFsdWUgPT09ICdzdHJpbmcnID8gc2VjdGlvblswXS52YWx1ZSA6ICcnO1xuICAgICAgICAgICAgc3dpdGNoIChyZXNwb25zZUNvZGUudG9VcHBlckNhc2UoKSkge1xuICAgICAgICAgICAgICAgIGNhc2UgJ0FQUEVORFVJRCc6XG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB1aWRWYWxpZGl0eSA9IHNlY3Rpb25bMV0gJiYgdHlwZW9mIHNlY3Rpb25bMV0udmFsdWUgPT09ICdzdHJpbmcnICYmICFpc05hTihzZWN0aW9uWzFdLnZhbHVlKSA/IEJpZ0ludChzZWN0aW9uWzFdLnZhbHVlKSA6IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHVpZCA9IHNlY3Rpb25bMl0gJiYgdHlwZW9mIHNlY3Rpb25bMl0udmFsdWUgPT09ICdzdHJpbmcnICYmICFpc05hTihzZWN0aW9uWzJdLnZhbHVlKSA/IE51bWJlcihzZWN0aW9uWzJdLnZhbHVlKSA6IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHVpZFZhbGlkaXR5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwLnVpZFZhbGlkaXR5ID0gdWlkVmFsaWRpdHk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodWlkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwLnVpZCA9IHVpZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJlc3BvbnNlLm5leHQoKTtcblxuICAgICAgICBpZiAoZXhwZWN0RXhpc3RzICYmICFtYXAuc2VxKSB7XG4gICAgICAgICAgICAvLyB0cnkgdG8gdXNlIE5PT1AgdG8gZ2V0IHRoZSBuZXcgc2VxdWVuY2UgbnVtYmVyXG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlID0gYXdhaXQgY29ubmVjdGlvbi5leGVjKCdOT09QJywgZmFsc2UsIHtcbiAgICAgICAgICAgICAgICAgICAgdW50YWdnZWQ6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIEVYSVNUUzogYXN5bmMgdW50YWdnZWQgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcC5zZXEgPSBOdW1iZXIodW50YWdnZWQuY29tbWFuZCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXhwZWN0RXhpc3RzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBwcmV2Q291bnQgPSBjb25uZWN0aW9uLm1haWxib3guZXhpc3RzO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobWFwLnNlcSAhPT0gcHJldkNvdW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uLm1haWxib3guZXhpc3RzID0gbWFwLnNlcTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24uZW1pdCgnZXhpc3RzJywge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGg6IGNvbm5lY3Rpb24ubWFpbGJveC5wYXRoLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OiBtYXAuc2VxLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXZDb3VudFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIGNvbW1lbnQ6ICdTZXF1ZW5jZSBub3QgZm91bmQgZnJvbSBBUFBFTkQgb3V0cHV0J1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlLm5leHQoKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24ubG9nLndhcm4oeyBlcnIsIGNpZDogY29ubmVjdGlvbi5pZCB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChtYXAuc2VxICYmICFtYXAudWlkKSB7XG4gICAgICAgICAgICBsZXQgbGlzdCA9IGF3YWl0IGNvbm5lY3Rpb24uc2VhcmNoKHsgc2VxOiBtYXAuc2VxIH0sIHsgdWlkOiB0cnVlIH0pO1xuICAgICAgICAgICAgaWYgKGxpc3QgJiYgbGlzdC5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBtYXAudWlkID0gbGlzdFswXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBtYXA7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGxldCBlcnJvckNvZGUgPSBnZXRTdGF0dXNDb2RlKGVyci5yZXNwb25zZSk7XG4gICAgICAgIGlmIChlcnJvckNvZGUpIHtcbiAgICAgICAgICAgIGVyci5zZXJ2ZXJSZXNwb25zZUNvZGUgPSBlcnJvckNvZGU7XG4gICAgICAgIH1cbiAgICAgICAgZXJyLnJlc3BvbnNlID0gYXdhaXQgZ2V0RXJyb3JUZXh0KGVyci5yZXNwb25zZSk7XG5cbiAgICAgICAgY29ubmVjdGlvbi5sb2cud2Fybih7IGVyciwgY2lkOiBjb25uZWN0aW9uLmlkIH0pO1xuICAgICAgICB0aHJvdyBlcnI7XG4gICAgfVxufTtcbiJdLCJuYW1lcyI6W10sImlnbm9yZUxpc3QiOlswXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(action-browser)/./node_modules/imapflow/lib/commands/append.js\n");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "(action-browser)/./node_modules/imapflow/lib/commands/authenticate.js":
|
|
/*!************************************************************!*\
|
|
!*** ./node_modules/imapflow/lib/commands/authenticate.js ***!
|
|
\************************************************************/
|
|
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
|
|
|
|
eval("\n\nconst { getStatusCode, getErrorText } = __webpack_require__(/*! ../tools.js */ \"(action-browser)/./node_modules/imapflow/lib/tools.js\");\n\nasync function authOauth(connection, username, accessToken) {\n let oauthbearer;\n let command;\n let breaker;\n\n if (connection.capabilities.has('AUTH=OAUTHBEARER')) {\n oauthbearer = [`n,a=${username},`, `host=${connection.servername}`, `port=993`, `auth=Bearer ${accessToken}`, '', ''].join('\\x01');\n command = 'OAUTHBEARER';\n breaker = 'AQ==';\n } else if (connection.capabilities.has('AUTH=XOAUTH') || connection.capabilities.has('AUTH=XOAUTH2')) {\n oauthbearer = [`user=${username}`, `auth=Bearer ${accessToken}`, '', ''].join('\\x01');\n command = 'XOAUTH2';\n breaker = '';\n }\n\n let errorResponse = false;\n try {\n let response = await connection.exec(\n 'AUTHENTICATE',\n [\n { type: 'ATOM', value: command },\n { type: 'ATOM', value: Buffer.from(oauthbearer).toString('base64'), sensitive: true }\n ],\n {\n onPlusTag: async resp => {\n if (resp.attributes && resp.attributes[0] && resp.attributes[0].type === 'TEXT') {\n try {\n errorResponse = JSON.parse(Buffer.from(resp.attributes[0].value, 'base64').toString());\n } catch (err) {\n connection.log.debug({ errorResponse: resp.attributes[0].value, err });\n }\n }\n\n connection.log.debug({ src: 'c', msg: breaker, comment: `Error response for ${command}` });\n connection.write(breaker);\n }\n }\n );\n response.next();\n\n connection.authCapabilities.set(`AUTH=${command}`, true);\n\n return username;\n } catch (err) {\n let errorCode = getStatusCode(err.response);\n if (errorCode) {\n err.serverResponseCode = errorCode;\n }\n err.authenticationFailed = true;\n err.response = await getErrorText(err.response);\n if (errorResponse) {\n err.oauthError = errorResponse;\n }\n throw err;\n }\n}\n\nasync function authLogin(connection, username, password) {\n let errorResponse = false;\n try {\n let response = await connection.exec('AUTHENTICATE', [{ type: 'ATOM', value: 'LOGIN' }], {\n onPlusTag: async resp => {\n if (resp.attributes && resp.attributes[0] && resp.attributes[0].type === 'TEXT') {\n let question = Buffer.from(resp.attributes[0].value, 'base64').toString();\n switch (\n question.toLowerCase().replace(/[:\\x00]*$/, '') // eslint-disable-line no-control-regex\n ) {\n case 'username':\n case 'user name': {\n let encodedUsername = Buffer.from(username).toString('base64');\n connection.log.debug({ src: 'c', msg: encodedUsername, comment: `Encoded username for AUTH=LOGIN` });\n connection.write(encodedUsername);\n break;\n }\n\n case 'password':\n connection.log.debug({ src: 'c', msg: '(* value hidden *)', comment: `Encoded password for AUTH=LOGIN` });\n connection.write(Buffer.from(password).toString('base64'));\n break;\n\n default: {\n let error = new Error(`Unknown LOGIN question \"${question}\"`);\n throw error;\n }\n }\n }\n }\n });\n\n response.next();\n\n connection.authCapabilities.set(`AUTH=LOGIN`, true);\n\n return username;\n } catch (err) {\n let errorCode = getStatusCode(err.response);\n if (errorCode) {\n err.serverResponseCode = errorCode;\n }\n err.authenticationFailed = true;\n err.response = await getErrorText(err.response);\n if (errorResponse) {\n err.oauthError = errorResponse;\n }\n throw err;\n }\n}\n\nasync function authPlain(connection, username, password) {\n let errorResponse = false;\n try {\n let response = await connection.exec('AUTHENTICATE', [{ type: 'ATOM', value: 'PLAIN' }], {\n onPlusTag: async () => {\n let encodedResponse = Buffer.from(['', username, password].join('\\x00')).toString('base64');\n let loggedResponse = Buffer.from(['', username, '(* value hidden *)'].join('\\x00')).toString('base64');\n connection.log.debug({ src: 'c', msg: loggedResponse, comment: `Encoded response for AUTH=PLAIN` });\n connection.write(encodedResponse);\n }\n });\n\n response.next();\n\n connection.authCapabilities.set(`AUTH=PLAIN`, true);\n\n return username;\n } catch (err) {\n let errorCode = getStatusCode(err.response);\n if (errorCode) {\n err.serverResponseCode = errorCode;\n }\n err.authenticationFailed = true;\n err.response = await getErrorText(err.response);\n if (errorResponse) {\n err.oauthError = errorResponse;\n }\n throw err;\n }\n}\n\n// Authenticates user using LOGIN\nmodule.exports = async (connection, username, { accessToken, password, loginMethod }) => {\n if (connection.state !== connection.states.NOT_AUTHENTICATED) {\n // nothing to do here\n return;\n }\n\n if (accessToken) {\n // AUTH=OAUTHBEARER and AUTH=XOAUTH in the context of OAuth2 or very similar so we can handle these together\n if (connection.capabilities.has('AUTH=OAUTHBEARER') || connection.capabilities.has('AUTH=XOAUTH') || connection.capabilities.has('AUTH=XOAUTH2')) {\n return await authOauth(connection, username, accessToken);\n }\n }\n\n if (password) {\n if ((!loginMethod && connection.capabilities.has('AUTH=PLAIN')) || loginMethod === 'AUTH=PLAIN') {\n return await authPlain(connection, username, password);\n }\n\n if ((!loginMethod && connection.capabilities.has('AUTH=LOGIN')) || loginMethod === 'AUTH=LOGIN') {\n return await authLogin(connection, username, password);\n }\n }\n\n throw new Error('Unsupported authentication mechanism');\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFjdGlvbi1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9pbWFwZmxvdy9saWIvY29tbWFuZHMvYXV0aGVudGljYXRlLmpzIiwibWFwcGluZ3MiOiJBQUFhOztBQUViLFFBQVEsOEJBQThCLEVBQUUsbUJBQU8sQ0FBQywwRUFBYTs7QUFFN0Q7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSw4QkFBOEIsU0FBUyxZQUFZLHNCQUFzQiw4QkFBOEIsWUFBWTtBQUNuSDtBQUNBO0FBQ0EsTUFBTTtBQUNOLCtCQUErQixTQUFTLGtCQUFrQixZQUFZO0FBQ3RFO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLDhCQUE4QjtBQUNoRCxrQkFBa0I7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMEJBQTBCO0FBQzFCLG1EQUFtRCw4Q0FBOEM7QUFDakc7QUFDQTs7QUFFQSwyQ0FBMkMsdURBQXVELFFBQVEsR0FBRztBQUM3RztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLGdEQUFnRCxRQUFROztBQUV4RDtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsZ0VBQWdFLDhCQUE4QjtBQUM5RjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtREFBbUQsNEVBQTRFO0FBQy9IO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLG1EQUFtRCxpRkFBaUY7QUFDcEk7QUFDQTs7QUFFQTtBQUNBLDZFQUE2RSxTQUFTO0FBQ3RGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTOztBQUVUOztBQUVBOztBQUVBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxnRUFBZ0UsOEJBQThCO0FBQzlGO0FBQ0E7QUFDQTtBQUNBLHVDQUF1QywyRUFBMkU7QUFDbEg7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7O0FBRUE7O0FBRUE7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsZ0RBQWdELG9DQUFvQztBQUNwRjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSIsInNvdXJjZXMiOlsiL2hvbWUvYWxtYS9uZXh0Z2VuL05lYWgtbWFpbC9ub2RlX21vZHVsZXMvaW1hcGZsb3cvbGliL2NvbW1hbmRzL2F1dGhlbnRpY2F0ZS5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbmNvbnN0IHsgZ2V0U3RhdHVzQ29kZSwgZ2V0RXJyb3JUZXh0IH0gPSByZXF1aXJlKCcuLi90b29scy5qcycpO1xuXG5hc3luYyBmdW5jdGlvbiBhdXRoT2F1dGgoY29ubmVjdGlvbiwgdXNlcm5hbWUsIGFjY2Vzc1Rva2VuKSB7XG4gICAgbGV0IG9hdXRoYmVhcmVyO1xuICAgIGxldCBjb21tYW5kO1xuICAgIGxldCBicmVha2VyO1xuXG4gICAgaWYgKGNvbm5lY3Rpb24uY2FwYWJpbGl0aWVzLmhhcygnQVVUSD1PQVVUSEJFQVJFUicpKSB7XG4gICAgICAgIG9hdXRoYmVhcmVyID0gW2BuLGE9JHt1c2VybmFtZX0sYCwgYGhvc3Q9JHtjb25uZWN0aW9uLnNlcnZlcm5hbWV9YCwgYHBvcnQ9OTkzYCwgYGF1dGg9QmVhcmVyICR7YWNjZXNzVG9rZW59YCwgJycsICcnXS5qb2luKCdcXHgwMScpO1xuICAgICAgICBjb21tYW5kID0gJ09BVVRIQkVBUkVSJztcbiAgICAgICAgYnJlYWtlciA9ICdBUT09JztcbiAgICB9IGVsc2UgaWYgKGNvbm5lY3Rpb24uY2FwYWJpbGl0aWVzLmhhcygnQVVUSD1YT0FVVEgnKSB8fCBjb25uZWN0aW9uLmNhcGFiaWxpdGllcy5oYXMoJ0FVVEg9WE9BVVRIMicpKSB7XG4gICAgICAgIG9hdXRoYmVhcmVyID0gW2B1c2VyPSR7dXNlcm5hbWV9YCwgYGF1dGg9QmVhcmVyICR7YWNjZXNzVG9rZW59YCwgJycsICcnXS5qb2luKCdcXHgwMScpO1xuICAgICAgICBjb21tYW5kID0gJ1hPQVVUSDInO1xuICAgICAgICBicmVha2VyID0gJyc7XG4gICAgfVxuXG4gICAgbGV0IGVycm9yUmVzcG9uc2UgPSBmYWxzZTtcbiAgICB0cnkge1xuICAgICAgICBsZXQgcmVzcG9uc2UgPSBhd2FpdCBjb25uZWN0aW9uLmV4ZWMoXG4gICAgICAgICAgICAnQVVUSEVOVElDQVRFJyxcbiAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICB7IHR5cGU6ICdBVE9NJywgdmFsdWU6IGNvbW1hbmQgfSxcbiAgICAgICAgICAgICAgICB7IHR5cGU6ICdBVE9NJywgdmFsdWU6IEJ1ZmZlci5mcm9tKG9hdXRoYmVhcmVyKS50b1N0cmluZygnYmFzZTY0JyksIHNlbnNpdGl2ZTogdHJ1ZSB9XG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIG9uUGx1c1RhZzogYXN5bmMgcmVzcCA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXNwLmF0dHJpYnV0ZXMgJiYgcmVzcC5hdHRyaWJ1dGVzWzBdICYmIHJlc3AuYXR0cmlidXRlc1swXS50eXBlID09PSAnVEVYVCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JSZXNwb25zZSA9IEpTT04ucGFyc2UoQnVmZmVyLmZyb20ocmVzcC5hdHRyaWJ1dGVzWzBdLnZhbHVlLCAnYmFzZTY0JykudG9TdHJpbmcoKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uLmxvZy5kZWJ1Zyh7IGVycm9yUmVzcG9uc2U6IHJlc3AuYXR0cmlidXRlc1swXS52YWx1ZSwgZXJyIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbi5sb2cuZGVidWcoeyBzcmM6ICdjJywgbXNnOiBicmVha2VyLCBjb21tZW50OiBgRXJyb3IgcmVzcG9uc2UgZm9yICR7Y29tbWFuZH1gIH0pO1xuICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uLndyaXRlKGJyZWFrZXIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICAgICAgcmVzcG9uc2UubmV4dCgpO1xuXG4gICAgICAgIGNvbm5lY3Rpb24uYXV0aENhcGFiaWxpdGllcy5zZXQoYEFVVEg9JHtjb21tYW5kfWAsIHRydWUpO1xuXG4gICAgICAgIHJldHVybiB1c2VybmFtZTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgbGV0IGVycm9yQ29kZSA9IGdldFN0YXR1c0NvZGUoZXJyLnJlc3BvbnNlKTtcbiAgICAgICAgaWYgKGVycm9yQ29kZSkge1xuICAgICAgICAgICAgZXJyLnNlcnZlclJlc3BvbnNlQ29kZSA9IGVycm9yQ29kZTtcbiAgICAgICAgfVxuICAgICAgICBlcnIuYXV0aGVudGljYXRpb25GYWlsZWQgPSB0cnVlO1xuICAgICAgICBlcnIucmVzcG9uc2UgPSBhd2FpdCBnZXRFcnJvclRleHQoZXJyLnJlc3BvbnNlKTtcbiAgICAgICAgaWYgKGVycm9yUmVzcG9uc2UpIHtcbiAgICAgICAgICAgIGVyci5vYXV0aEVycm9yID0gZXJyb3JSZXNwb25zZTtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBlcnI7XG4gICAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBhdXRoTG9naW4oY29ubmVjdGlvbiwgdXNlcm5hbWUsIHBhc3N3b3JkKSB7XG4gICAgbGV0IGVycm9yUmVzcG9uc2UgPSBmYWxzZTtcbiAgICB0cnkge1xuICAgICAgICBsZXQgcmVzcG9uc2UgPSBhd2FpdCBjb25uZWN0aW9uLmV4ZWMoJ0FVVEhFTlRJQ0FURScsIFt7IHR5cGU6ICdBVE9NJywgdmFsdWU6ICdMT0dJTicgfV0sIHtcbiAgICAgICAgICAgIG9uUGx1c1RhZzogYXN5bmMgcmVzcCA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHJlc3AuYXR0cmlidXRlcyAmJiByZXNwLmF0dHJpYnV0ZXNbMF0gJiYgcmVzcC5hdHRyaWJ1dGVzWzBdLnR5cGUgPT09ICdURVhUJykge1xuICAgICAgICAgICAgICAgICAgICBsZXQgcXVlc3Rpb24gPSBCdWZmZXIuZnJvbShyZXNwLmF0dHJpYnV0ZXNbMF0udmFsdWUsICdiYXNlNjQnKS50b1N0cmluZygpO1xuICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKFxuICAgICAgICAgICAgICAgICAgICAgICAgcXVlc3Rpb24udG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9bOlxceDAwXSokLywgJycpIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tY29udHJvbC1yZWdleFxuICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3VzZXJuYW1lJzpcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3VzZXIgbmFtZSc6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZW5jb2RlZFVzZXJuYW1lID0gQnVmZmVyLmZyb20odXNlcm5hbWUpLnRvU3RyaW5nKCdiYXNlNjQnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uLmxvZy5kZWJ1Zyh7IHNyYzogJ2MnLCBtc2c6IGVuY29kZWRVc2VybmFtZSwgY29tbWVudDogYEVuY29kZWQgdXNlcm5hbWUgZm9yIEFVVEg9TE9HSU5gIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24ud3JpdGUoZW5jb2RlZFVzZXJuYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAncGFzc3dvcmQnOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24ubG9nLmRlYnVnKHsgc3JjOiAnYycsIG1zZzogJygqIHZhbHVlIGhpZGRlbiAqKScsIGNvbW1lbnQ6IGBFbmNvZGVkIHBhc3N3b3JkIGZvciBBVVRIPUxPR0lOYCB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uLndyaXRlKEJ1ZmZlci5mcm9tKHBhc3N3b3JkKS50b1N0cmluZygnYmFzZTY0JykpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGVycm9yID0gbmV3IEVycm9yKGBVbmtub3duIExPR0lOIHF1ZXN0aW9uIFwiJHtxdWVzdGlvbn1cImApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICByZXNwb25zZS5uZXh0KCk7XG5cbiAgICAgICAgY29ubmVjdGlvbi5hdXRoQ2FwYWJpbGl0aWVzLnNldChgQVVUSD1MT0dJTmAsIHRydWUpO1xuXG4gICAgICAgIHJldHVybiB1c2VybmFtZTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgbGV0IGVycm9yQ29kZSA9IGdldFN0YXR1c0NvZGUoZXJyLnJlc3BvbnNlKTtcbiAgICAgICAgaWYgKGVycm9yQ29kZSkge1xuICAgICAgICAgICAgZXJyLnNlcnZlclJlc3BvbnNlQ29kZSA9IGVycm9yQ29kZTtcbiAgICAgICAgfVxuICAgICAgICBlcnIuYXV0aGVudGljYXRpb25GYWlsZWQgPSB0cnVlO1xuICAgICAgICBlcnIucmVzcG9uc2UgPSBhd2FpdCBnZXRFcnJvclRleHQoZXJyLnJlc3BvbnNlKTtcbiAgICAgICAgaWYgKGVycm9yUmVzcG9uc2UpIHtcbiAgICAgICAgICAgIGVyci5vYXV0aEVycm9yID0gZXJyb3JSZXNwb25zZTtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBlcnI7XG4gICAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBhdXRoUGxhaW4oY29ubmVjdGlvbiwgdXNlcm5hbWUsIHBhc3N3b3JkKSB7XG4gICAgbGV0IGVycm9yUmVzcG9uc2UgPSBmYWxzZTtcbiAgICB0cnkge1xuICAgICAgICBsZXQgcmVzcG9uc2UgPSBhd2FpdCBjb25uZWN0aW9uLmV4ZWMoJ0FVVEhFTlRJQ0FURScsIFt7IHR5cGU6ICdBVE9NJywgdmFsdWU6ICdQTEFJTicgfV0sIHtcbiAgICAgICAgICAgIG9uUGx1c1RhZzogYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGxldCBlbmNvZGVkUmVzcG9uc2UgPSBCdWZmZXIuZnJvbShbJycsIHVzZXJuYW1lLCBwYXNzd29yZF0uam9pbignXFx4MDAnKSkudG9TdHJpbmcoJ2Jhc2U2NCcpO1xuICAgICAgICAgICAgICAgIGxldCBsb2dnZWRSZXNwb25zZSA9IEJ1ZmZlci5mcm9tKFsnJywgdXNlcm5hbWUsICcoKiB2YWx1ZSBoaWRkZW4gKiknXS5qb2luKCdcXHgwMCcpKS50b1N0cmluZygnYmFzZTY0Jyk7XG4gICAgICAgICAgICAgICAgY29ubmVjdGlvbi5sb2cuZGVidWcoeyBzcmM6ICdjJywgbXNnOiBsb2dnZWRSZXNwb25zZSwgY29tbWVudDogYEVuY29kZWQgcmVzcG9uc2UgZm9yIEFVVEg9UExBSU5gIH0pO1xuICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24ud3JpdGUoZW5jb2RlZFJlc3BvbnNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmVzcG9uc2UubmV4dCgpO1xuXG4gICAgICAgIGNvbm5lY3Rpb24uYXV0aENhcGFiaWxpdGllcy5zZXQoYEFVVEg9UExBSU5gLCB0cnVlKTtcblxuICAgICAgICByZXR1cm4gdXNlcm5hbWU7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGxldCBlcnJvckNvZGUgPSBnZXRTdGF0dXNDb2RlKGVyci5yZXNwb25zZSk7XG4gICAgICAgIGlmIChlcnJvckNvZGUpIHtcbiAgICAgICAgICAgIGVyci5zZXJ2ZXJSZXNwb25zZUNvZGUgPSBlcnJvckNvZGU7XG4gICAgICAgIH1cbiAgICAgICAgZXJyLmF1dGhlbnRpY2F0aW9uRmFpbGVkID0gdHJ1ZTtcbiAgICAgICAgZXJyLnJlc3BvbnNlID0gYXdhaXQgZ2V0RXJyb3JUZXh0KGVyci5yZXNwb25zZSk7XG4gICAgICAgIGlmIChlcnJvclJlc3BvbnNlKSB7XG4gICAgICAgICAgICBlcnIub2F1dGhFcnJvciA9IGVycm9yUmVzcG9uc2U7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgZXJyO1xuICAgIH1cbn1cblxuLy8gQXV0aGVudGljYXRlcyB1c2VyIHVzaW5nIExPR0lOXG5tb2R1bGUuZXhwb3J0cyA9IGFzeW5jIChjb25uZWN0aW9uLCB1c2VybmFtZSwgeyBhY2Nlc3NUb2tlbiwgcGFzc3dvcmQsIGxvZ2luTWV0aG9kIH0pID0+IHtcbiAgICBpZiAoY29ubmVjdGlvbi5zdGF0ZSAhPT0gY29ubmVjdGlvbi5zdGF0ZXMuTk9UX0FVVEhFTlRJQ0FURUQpIHtcbiAgICAgICAgLy8gbm90aGluZyB0byBkbyBoZXJlXG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoYWNjZXNzVG9rZW4pIHtcbiAgICAgICAgLy8gQVVUSD1PQVVUSEJFQVJFUiBhbmQgQVVUSD1YT0FVVEggaW4gdGhlIGNvbnRleHQgb2YgT0F1dGgyIG9yIHZlcnkgc2ltaWxhciBzbyB3ZSBjYW4gaGFuZGxlIHRoZXNlIHRvZ2V0aGVyXG4gICAgICAgIGlmIChjb25uZWN0aW9uLmNhcGFiaWxpdGllcy5oYXMoJ0FVVEg9T0FVVEhCRUFSRVInKSB8fCBjb25uZWN0aW9uLmNhcGFiaWxpdGllcy5oYXMoJ0FVVEg9WE9BVVRIJykgfHwgY29ubmVjdGlvbi5jYXBhYmlsaXRpZXMuaGFzKCdBVVRIPVhPQVVUSDInKSkge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IGF1dGhPYXV0aChjb25uZWN0aW9uLCB1c2VybmFtZSwgYWNjZXNzVG9rZW4pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHBhc3N3b3JkKSB7XG4gICAgICAgIGlmICgoIWxvZ2luTWV0aG9kICYmIGNvbm5lY3Rpb24uY2FwYWJpbGl0aWVzLmhhcygnQVVUSD1QTEFJTicpKSB8fCBsb2dpbk1ldGhvZCA9PT0gJ0FVVEg9UExBSU4nKSB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgYXV0aFBsYWluKGNvbm5lY3Rpb24sIHVzZXJuYW1lLCBwYXNzd29yZCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoKCFsb2dpbk1ldGhvZCAmJiBjb25uZWN0aW9uLmNhcGFiaWxpdGllcy5oYXMoJ0FVVEg9TE9HSU4nKSkgfHwgbG9naW5NZXRob2QgPT09ICdBVVRIPUxPR0lOJykge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IGF1dGhMb2dpbihjb25uZWN0aW9uLCB1c2VybmFtZSwgcGFzc3dvcmQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IEVycm9yKCdVbnN1cHBvcnRlZCBhdXRoZW50aWNhdGlvbiBtZWNoYW5pc20nKTtcbn07XG4iXSwibmFtZXMiOltdLCJpZ25vcmVMaXN0IjpbMF0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(action-browser)/./node_modules/imapflow/lib/commands/authenticate.js\n");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "(action-browser)/./node_modules/imapflow/lib/commands/capability.js":
|
|
/*!**********************************************************!*\
|
|
!*** ./node_modules/imapflow/lib/commands/capability.js ***!
|
|
\**********************************************************/
|
|
/***/ ((module) => {
|
|
|
|
eval("\n\n// Refresh capabilities from server\nmodule.exports = async connection => {\n if (connection.capabilities.size && !connection.expectCapabilityUpdate) {\n return connection.capabilities;\n }\n\n let response;\n try {\n // untagged capability response is processed by global handler\n response = await connection.exec('CAPABILITY');\n\n response.next();\n return connection.capabilities;\n } catch (err) {\n connection.log.warn({ err, cid: connection.id });\n return false;\n }\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFjdGlvbi1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9pbWFwZmxvdy9saWIvY29tbWFuZHMvY2FwYWJpbGl0eS5qcyIsIm1hcHBpbmdzIjoiQUFBYTs7QUFFYjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxNQUFNO0FBQ04sOEJBQThCLHlCQUF5QjtBQUN2RDtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIi9ob21lL2FsbWEvbmV4dGdlbi9OZWFoLW1haWwvbm9kZV9tb2R1bGVzL2ltYXBmbG93L2xpYi9jb21tYW5kcy9jYXBhYmlsaXR5LmpzIl0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcblxuLy8gUmVmcmVzaCBjYXBhYmlsaXRpZXMgZnJvbSBzZXJ2ZXJcbm1vZHVsZS5leHBvcnRzID0gYXN5bmMgY29ubmVjdGlvbiA9PiB7XG4gICAgaWYgKGNvbm5lY3Rpb24uY2FwYWJpbGl0aWVzLnNpemUgJiYgIWNvbm5lY3Rpb24uZXhwZWN0Q2FwYWJpbGl0eVVwZGF0ZSkge1xuICAgICAgICByZXR1cm4gY29ubmVjdGlvbi5jYXBhYmlsaXRpZXM7XG4gICAgfVxuXG4gICAgbGV0IHJlc3BvbnNlO1xuICAgIHRyeSB7XG4gICAgICAgIC8vIHVudGFnZ2VkIGNhcGFiaWxpdHkgcmVzcG9uc2UgaXMgcHJvY2Vzc2VkIGJ5IGdsb2JhbCBoYW5kbGVyXG4gICAgICAgIHJlc3BvbnNlID0gYXdhaXQgY29ubmVjdGlvbi5leGVjKCdDQVBBQklMSVRZJyk7XG5cbiAgICAgICAgcmVzcG9uc2UubmV4dCgpO1xuICAgICAgICByZXR1cm4gY29ubmVjdGlvbi5jYXBhYmlsaXRpZXM7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGNvbm5lY3Rpb24ubG9nLndhcm4oeyBlcnIsIGNpZDogY29ubmVjdGlvbi5pZCB9KTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbn07XG4iXSwibmFtZXMiOltdLCJpZ25vcmVMaXN0IjpbMF0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(action-browser)/./node_modules/imapflow/lib/commands/capability.js\n");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "(action-browser)/./node_modules/imapflow/lib/commands/close.js":
|
|
/*!*****************************************************!*\
|
|
!*** ./node_modules/imapflow/lib/commands/close.js ***!
|
|
\*****************************************************/
|
|
/***/ ((module) => {
|
|
|
|
eval("\n\n// Closes a mailbox\nmodule.exports = async connection => {\n if (connection.state !== connection.states.SELECTED) {\n // nothing to do here\n return;\n }\n\n let response;\n try {\n response = await connection.exec('CLOSE');\n response.next();\n\n let currentMailbox = connection.mailbox;\n connection.mailbox = false;\n connection.currentSelectCommand = false;\n connection.state = connection.states.AUTHENTICATED;\n\n if (currentMailbox) {\n connection.emit('mailboxClose', currentMailbox);\n }\n return true;\n } catch (err) {\n connection.log.warn({ err, cid: connection.id });\n return false;\n }\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFjdGlvbi1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9pbWFwZmxvdy9saWIvY29tbWFuZHMvY2xvc2UuanMiLCJtYXBwaW5ncyI6IkFBQWE7O0FBRWI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOLDhCQUE4Qix5QkFBeUI7QUFDdkQ7QUFDQTtBQUNBIiwic291cmNlcyI6WyIvaG9tZS9hbG1hL25leHRnZW4vTmVhaC1tYWlsL25vZGVfbW9kdWxlcy9pbWFwZmxvdy9saWIvY29tbWFuZHMvY2xvc2UuanMiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG4vLyBDbG9zZXMgYSBtYWlsYm94XG5tb2R1bGUuZXhwb3J0cyA9IGFzeW5jIGNvbm5lY3Rpb24gPT4ge1xuICAgIGlmIChjb25uZWN0aW9uLnN0YXRlICE9PSBjb25uZWN0aW9uLnN0YXRlcy5TRUxFQ1RFRCkge1xuICAgICAgICAvLyBub3RoaW5nIHRvIGRvIGhlcmVcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGxldCByZXNwb25zZTtcbiAgICB0cnkge1xuICAgICAgICByZXNwb25zZSA9IGF3YWl0IGNvbm5lY3Rpb24uZXhlYygnQ0xPU0UnKTtcbiAgICAgICAgcmVzcG9uc2UubmV4dCgpO1xuXG4gICAgICAgIGxldCBjdXJyZW50TWFpbGJveCA9IGNvbm5lY3Rpb24ubWFpbGJveDtcbiAgICAgICAgY29ubmVjdGlvbi5tYWlsYm94ID0gZmFsc2U7XG4gICAgICAgIGNvbm5lY3Rpb24uY3VycmVudFNlbGVjdENvbW1hbmQgPSBmYWxzZTtcbiAgICAgICAgY29ubmVjdGlvbi5zdGF0ZSA9IGNvbm5lY3Rpb24uc3RhdGVzLkFVVEhFTlRJQ0FURUQ7XG5cbiAgICAgICAgaWYgKGN1cnJlbnRNYWlsYm94KSB7XG4gICAgICAgICAgICBjb25uZWN0aW9uLmVtaXQoJ21haWxib3hDbG9zZScsIGN1cnJlbnRNYWlsYm94KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgY29ubmVjdGlvbi5sb2cud2Fybih7IGVyciwgY2lkOiBjb25uZWN0aW9uLmlkIH0pO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxufTtcbiJdLCJuYW1lcyI6W10sImlnbm9yZUxpc3QiOlswXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(action-browser)/./node_modules/imapflow/lib/commands/close.js\n");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "(action-browser)/./node_modules/imapflow/lib/commands/compress.js":
|
|
/*!********************************************************!*\
|
|
!*** ./node_modules/imapflow/lib/commands/compress.js ***!
|
|
\********************************************************/
|
|
/***/ ((module) => {
|
|
|
|
eval("\n\n// Requests compression from server\nmodule.exports = async connection => {\n if (!connection.capabilities.has('COMPRESS=DEFLATE') || connection._inflate) {\n // nothing to do here\n return false;\n }\n\n let response;\n try {\n response = await connection.exec('COMPRESS', [{ type: 'ATOM', value: 'DEFLATE' }]);\n response.next();\n return true;\n } catch (err) {\n connection.log.warn({ err, cid: connection.id });\n return false;\n }\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFjdGlvbi1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9pbWFwZmxvdy9saWIvY29tbWFuZHMvY29tcHJlc3MuanMiLCJtYXBwaW5ncyI6IkFBQWE7O0FBRWI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSx3REFBd0QsZ0NBQWdDO0FBQ3hGO0FBQ0E7QUFDQSxNQUFNO0FBQ04sOEJBQThCLHlCQUF5QjtBQUN2RDtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIi9ob21lL2FsbWEvbmV4dGdlbi9OZWFoLW1haWwvbm9kZV9tb2R1bGVzL2ltYXBmbG93L2xpYi9jb21tYW5kcy9jb21wcmVzcy5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbi8vIFJlcXVlc3RzIGNvbXByZXNzaW9uIGZyb20gc2VydmVyXG5tb2R1bGUuZXhwb3J0cyA9IGFzeW5jIGNvbm5lY3Rpb24gPT4ge1xuICAgIGlmICghY29ubmVjdGlvbi5jYXBhYmlsaXRpZXMuaGFzKCdDT01QUkVTUz1ERUZMQVRFJykgfHwgY29ubmVjdGlvbi5faW5mbGF0ZSkge1xuICAgICAgICAvLyBub3RoaW5nIHRvIGRvIGhlcmVcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGxldCByZXNwb25zZTtcbiAgICB0cnkge1xuICAgICAgICByZXNwb25zZSA9IGF3YWl0IGNvbm5lY3Rpb24uZXhlYygnQ09NUFJFU1MnLCBbeyB0eXBlOiAnQVRPTScsIHZhbHVlOiAnREVGTEFURScgfV0pO1xuICAgICAgICByZXNwb25zZS5uZXh0KCk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBjb25uZWN0aW9uLmxvZy53YXJuKHsgZXJyLCBjaWQ6IGNvbm5lY3Rpb24uaWQgfSk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG59O1xuIl0sIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6WzBdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(action-browser)/./node_modules/imapflow/lib/commands/compress.js\n");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "(action-browser)/./node_modules/imapflow/lib/commands/copy.js":
|
|
/*!****************************************************!*\
|
|
!*** ./node_modules/imapflow/lib/commands/copy.js ***!
|
|
\****************************************************/
|
|
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
|
|
|
|
eval("\n\nconst { getStatusCode, normalizePath, encodePath, expandRange, getErrorText } = __webpack_require__(/*! ../tools.js */ \"(action-browser)/./node_modules/imapflow/lib/tools.js\");\n\n// Copies messages from current mailbox to some other mailbox\nmodule.exports = async (connection, range, destination, options) => {\n if (connection.state !== connection.states.SELECTED || !range || !destination) {\n // nothing to do here\n return;\n }\n\n options = options || {};\n destination = normalizePath(connection, destination);\n\n let attributes = [\n { type: 'SEQUENCE', value: range },\n { type: 'ATOM', value: encodePath(connection, destination) }\n ];\n\n let response;\n try {\n response = await connection.exec(options.uid ? 'UID COPY' : 'COPY', attributes);\n response.next();\n\n let map = { path: connection.mailbox.path, destination };\n let section = response.response.attributes && response.response.attributes[0] && response.response.attributes[0].section;\n let responseCode = section && section.length && section[0] && typeof section[0].value === 'string' ? section[0].value : '';\n switch (responseCode) {\n case 'COPYUID':\n {\n let uidValidity = section[1] && typeof section[1].value === 'string' && !isNaN(section[1].value) ? BigInt(section[1].value) : false;\n if (uidValidity) {\n map.uidValidity = uidValidity;\n }\n\n let sourceUids = section[2] && typeof section[2].value === 'string' ? expandRange(section[2].value) : false;\n let destinationUids = section[3] && typeof section[3].value === 'string' ? expandRange(section[3].value) : false;\n if (sourceUids && destinationUids && sourceUids.length === destinationUids.length) {\n map.uidMap = new Map(sourceUids.map((uid, i) => [uid, destinationUids[i]]));\n }\n }\n break;\n }\n\n return map;\n } catch (err) {\n let errorCode = getStatusCode(err.response);\n if (errorCode) {\n err.serverResponseCode = errorCode;\n }\n err.response = await getErrorText(err.response);\n\n connection.log.warn({ err, cid: connection.id });\n return false;\n }\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFjdGlvbi1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9pbWFwZmxvdy9saWIvY29tbWFuZHMvY29weS5qcyIsIm1hcHBpbmdzIjoiQUFBYTs7QUFFYixRQUFRLHNFQUFzRSxFQUFFLG1CQUFPLENBQUMsMEVBQWE7O0FBRXJHO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0EsVUFBVSxnQ0FBZ0M7QUFDMUMsVUFBVTtBQUNWOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLG9CQUFvQjtBQUNwQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLDhCQUE4Qix5QkFBeUI7QUFDdkQ7QUFDQTtBQUNBIiwic291cmNlcyI6WyIvaG9tZS9hbG1hL25leHRnZW4vTmVhaC1tYWlsL25vZGVfbW9kdWxlcy9pbWFwZmxvdy9saWIvY29tbWFuZHMvY29weS5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbmNvbnN0IHsgZ2V0U3RhdHVzQ29kZSwgbm9ybWFsaXplUGF0aCwgZW5jb2RlUGF0aCwgZXhwYW5kUmFuZ2UsIGdldEVycm9yVGV4dCB9ID0gcmVxdWlyZSgnLi4vdG9vbHMuanMnKTtcblxuLy8gQ29waWVzIG1lc3NhZ2VzIGZyb20gY3VycmVudCBtYWlsYm94IHRvIHNvbWUgb3RoZXIgbWFpbGJveFxubW9kdWxlLmV4cG9ydHMgPSBhc3luYyAoY29ubmVjdGlvbiwgcmFuZ2UsIGRlc3RpbmF0aW9uLCBvcHRpb25zKSA9PiB7XG4gICAgaWYgKGNvbm5lY3Rpb24uc3RhdGUgIT09IGNvbm5lY3Rpb24uc3RhdGVzLlNFTEVDVEVEIHx8ICFyYW5nZSB8fCAhZGVzdGluYXRpb24pIHtcbiAgICAgICAgLy8gbm90aGluZyB0byBkbyBoZXJlXG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgICBkZXN0aW5hdGlvbiA9IG5vcm1hbGl6ZVBhdGgoY29ubmVjdGlvbiwgZGVzdGluYXRpb24pO1xuXG4gICAgbGV0IGF0dHJpYnV0ZXMgPSBbXG4gICAgICAgIHsgdHlwZTogJ1NFUVVFTkNFJywgdmFsdWU6IHJhbmdlIH0sXG4gICAgICAgIHsgdHlwZTogJ0FUT00nLCB2YWx1ZTogZW5jb2RlUGF0aChjb25uZWN0aW9uLCBkZXN0aW5hdGlvbikgfVxuICAgIF07XG5cbiAgICBsZXQgcmVzcG9uc2U7XG4gICAgdHJ5IHtcbiAgICAgICAgcmVzcG9uc2UgPSBhd2FpdCBjb25uZWN0aW9uLmV4ZWMob3B0aW9ucy51aWQgPyAnVUlEIENPUFknIDogJ0NPUFknLCBhdHRyaWJ1dGVzKTtcbiAgICAgICAgcmVzcG9uc2UubmV4dCgpO1xuXG4gICAgICAgIGxldCBtYXAgPSB7IHBhdGg6IGNvbm5lY3Rpb24ubWFpbGJveC5wYXRoLCBkZXN0aW5hdGlvbiB9O1xuICAgICAgICBsZXQgc2VjdGlvbiA9IHJlc3BvbnNlLnJlc3BvbnNlLmF0dHJpYnV0ZXMgJiYgcmVzcG9uc2UucmVzcG9uc2UuYXR0cmlidXRlc1swXSAmJiByZXNwb25zZS5yZXNwb25zZS5hdHRyaWJ1dGVzWzBdLnNlY3Rpb247XG4gICAgICAgIGxldCByZXNwb25zZUNvZGUgPSBzZWN0aW9uICYmIHNlY3Rpb24ubGVuZ3RoICYmIHNlY3Rpb25bMF0gJiYgdHlwZW9mIHNlY3Rpb25bMF0udmFsdWUgPT09ICdzdHJpbmcnID8gc2VjdGlvblswXS52YWx1ZSA6ICcnO1xuICAgICAgICBzd2l0Y2ggKHJlc3BvbnNlQ29kZSkge1xuICAgICAgICAgICAgY2FzZSAnQ09QWVVJRCc6XG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBsZXQgdWlkVmFsaWRpdHkgPSBzZWN0aW9uWzFdICYmIHR5cGVvZiBzZWN0aW9uWzFdLnZhbHVlID09PSAnc3RyaW5nJyAmJiAhaXNOYU4oc2VjdGlvblsxXS52YWx1ZSkgPyBCaWdJbnQoc2VjdGlvblsxXS52YWx1ZSkgOiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHVpZFZhbGlkaXR5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtYXAudWlkVmFsaWRpdHkgPSB1aWRWYWxpZGl0eTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGxldCBzb3VyY2VVaWRzID0gc2VjdGlvblsyXSAmJiB0eXBlb2Ygc2VjdGlvblsyXS52YWx1ZSA9PT0gJ3N0cmluZycgPyBleHBhbmRSYW5nZShzZWN0aW9uWzJdLnZhbHVlKSA6IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBsZXQgZGVzdGluYXRpb25VaWRzID0gc2VjdGlvblszXSAmJiB0eXBlb2Ygc2VjdGlvblszXS52YWx1ZSA9PT0gJ3N0cmluZycgPyBleHBhbmRSYW5nZShzZWN0aW9uWzNdLnZhbHVlKSA6IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBpZiAoc291cmNlVWlkcyAmJiBkZXN0aW5hdGlvblVpZHMgJiYgc291cmNlVWlkcy5sZW5ndGggPT09IGRlc3RpbmF0aW9uVWlkcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1hcC51aWRNYXAgPSBuZXcgTWFwKHNvdXJjZVVpZHMubWFwKCh1aWQsIGkpID0+IFt1aWQsIGRlc3RpbmF0aW9uVWlkc1tpXV0pKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBtYXA7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGxldCBlcnJvckNvZGUgPSBnZXRTdGF0dXNDb2RlKGVyci5yZXNwb25zZSk7XG4gICAgICAgIGlmIChlcnJvckNvZGUpIHtcbiAgICAgICAgICAgIGVyci5zZXJ2ZXJSZXNwb25zZUNvZGUgPSBlcnJvckNvZGU7XG4gICAgICAgIH1cbiAgICAgICAgZXJyLnJlc3BvbnNlID0gYXdhaXQgZ2V0RXJyb3JUZXh0KGVyci5yZXNwb25zZSk7XG5cbiAgICAgICAgY29ubmVjdGlvbi5sb2cud2Fybih7IGVyciwgY2lkOiBjb25uZWN0aW9uLmlkIH0pO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxufTtcbiJdLCJuYW1lcyI6W10sImlnbm9yZUxpc3QiOlswXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(action-browser)/./node_modules/imapflow/lib/commands/copy.js\n");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "(action-browser)/./node_modules/imapflow/lib/commands/create.js":
|
|
/*!******************************************************!*\
|
|
!*** ./node_modules/imapflow/lib/commands/create.js ***!
|
|
\******************************************************/
|
|
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
|
|
|
|
eval("\n\nconst { encodePath, normalizePath, getStatusCode, getErrorText } = __webpack_require__(/*! ../tools.js */ \"(action-browser)/./node_modules/imapflow/lib/tools.js\");\n\n// Creates a new mailbox\nmodule.exports = async (connection, path) => {\n if (![connection.states.AUTHENTICATED, connection.states.SELECTED].includes(connection.state)) {\n // nothing to do here\n return;\n }\n\n path = normalizePath(connection, path);\n\n let response;\n try {\n let map = {\n path\n };\n response = await connection.exec('CREATE', [{ type: 'ATOM', value: encodePath(connection, path) }]);\n\n let section =\n response.response.attributes &&\n response.response.attributes[0] &&\n response.response.attributes[0].section &&\n response.response.attributes[0].section.length\n ? response.response.attributes[0].section\n : false;\n\n if (section) {\n let key;\n section.forEach((attribute, i) => {\n if (i % 2 === 0) {\n key = attribute && typeof attribute.value === 'string' ? attribute.value : false;\n return;\n }\n\n if (!key) {\n return;\n }\n\n let value;\n switch (key.toLowerCase()) {\n case 'mailboxid':\n key = 'mailboxId';\n value = Array.isArray(attribute) && attribute[0] && typeof attribute[0].value === 'string' ? attribute[0].value : false;\n break;\n }\n\n if (key && value) {\n map[key] = value;\n }\n });\n }\n\n map.created = true;\n response.next();\n\n //make sure we are subscribed to the new folder as well\n await connection.run('SUBSCRIBE', path);\n\n return map;\n } catch (err) {\n let errorCode = getStatusCode(err.response);\n if (errorCode) {\n err.serverResponseCode = errorCode;\n }\n err.response = await getErrorText(err.response);\n\n switch (errorCode) {\n case 'ALREADYEXISTS':\n // no need to do anything, mailbox already exists\n return {\n path,\n created: false\n };\n }\n\n if (errorCode) {\n err.serverResponseCode = errorCode;\n }\n\n connection.log.warn({ err, cid: connection.id });\n throw err;\n }\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFjdGlvbi1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9pbWFwZmxvdy9saWIvY29tbWFuZHMvY3JlYXRlLmpzIiwibWFwcGluZ3MiOiJBQUFhOztBQUViLFFBQVEseURBQXlELEVBQUUsbUJBQU8sQ0FBQywwRUFBYTs7QUFFeEY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzREFBc0QsbURBQW1EOztBQUV6RztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLDhCQUE4Qix5QkFBeUI7QUFDdkQ7QUFDQTtBQUNBIiwic291cmNlcyI6WyIvaG9tZS9hbG1hL25leHRnZW4vTmVhaC1tYWlsL25vZGVfbW9kdWxlcy9pbWFwZmxvdy9saWIvY29tbWFuZHMvY3JlYXRlLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcblxuY29uc3QgeyBlbmNvZGVQYXRoLCBub3JtYWxpemVQYXRoLCBnZXRTdGF0dXNDb2RlLCBnZXRFcnJvclRleHQgfSA9IHJlcXVpcmUoJy4uL3Rvb2xzLmpzJyk7XG5cbi8vIENyZWF0ZXMgYSBuZXcgbWFpbGJveFxubW9kdWxlLmV4cG9ydHMgPSBhc3luYyAoY29ubmVjdGlvbiwgcGF0aCkgPT4ge1xuICAgIGlmICghW2Nvbm5lY3Rpb24uc3RhdGVzLkFVVEhFTlRJQ0FURUQsIGNvbm5lY3Rpb24uc3RhdGVzLlNFTEVDVEVEXS5pbmNsdWRlcyhjb25uZWN0aW9uLnN0YXRlKSkge1xuICAgICAgICAvLyBub3RoaW5nIHRvIGRvIGhlcmVcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHBhdGggPSBub3JtYWxpemVQYXRoKGNvbm5lY3Rpb24sIHBhdGgpO1xuXG4gICAgbGV0IHJlc3BvbnNlO1xuICAgIHRyeSB7XG4gICAgICAgIGxldCBtYXAgPSB7XG4gICAgICAgICAgICBwYXRoXG4gICAgICAgIH07XG4gICAgICAgIHJlc3BvbnNlID0gYXdhaXQgY29ubmVjdGlvbi5leGVjKCdDUkVBVEUnLCBbeyB0eXBlOiAnQVRPTScsIHZhbHVlOiBlbmNvZGVQYXRoKGNvbm5lY3Rpb24sIHBhdGgpIH1dKTtcblxuICAgICAgICBsZXQgc2VjdGlvbiA9XG4gICAgICAgICAgICByZXNwb25zZS5yZXNwb25zZS5hdHRyaWJ1dGVzICYmXG4gICAgICAgICAgICByZXNwb25zZS5yZXNwb25zZS5hdHRyaWJ1dGVzWzBdICYmXG4gICAgICAgICAgICByZXNwb25zZS5yZXNwb25zZS5hdHRyaWJ1dGVzWzBdLnNlY3Rpb24gJiZcbiAgICAgICAgICAgIHJlc3BvbnNlLnJlc3BvbnNlLmF0dHJpYnV0ZXNbMF0uc2VjdGlvbi5sZW5ndGhcbiAgICAgICAgICAgICAgICA/IHJlc3BvbnNlLnJlc3BvbnNlLmF0dHJpYnV0ZXNbMF0uc2VjdGlvblxuICAgICAgICAgICAgICAgIDogZmFsc2U7XG5cbiAgICAgICAgaWYgKHNlY3Rpb24pIHtcbiAgICAgICAgICAgIGxldCBrZXk7XG4gICAgICAgICAgICBzZWN0aW9uLmZvckVhY2goKGF0dHJpYnV0ZSwgaSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChpICUgMiA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICBrZXkgPSBhdHRyaWJ1dGUgJiYgdHlwZW9mIGF0dHJpYnV0ZS52YWx1ZSA9PT0gJ3N0cmluZycgPyBhdHRyaWJ1dGUudmFsdWUgOiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmICgha2V5KSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBsZXQgdmFsdWU7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChrZXkudG9Mb3dlckNhc2UoKSkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlICdtYWlsYm94aWQnOlxuICAgICAgICAgICAgICAgICAgICAgICAga2V5ID0gJ21haWxib3hJZCc7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IEFycmF5LmlzQXJyYXkoYXR0cmlidXRlKSAmJiBhdHRyaWJ1dGVbMF0gJiYgdHlwZW9mIGF0dHJpYnV0ZVswXS52YWx1ZSA9PT0gJ3N0cmluZycgPyBhdHRyaWJ1dGVbMF0udmFsdWUgOiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChrZXkgJiYgdmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgbWFwW2tleV0gPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIG1hcC5jcmVhdGVkID0gdHJ1ZTtcbiAgICAgICAgcmVzcG9uc2UubmV4dCgpO1xuXG4gICAgICAgIC8vbWFrZSBzdXJlIHdlIGFyZSBzdWJzY3JpYmVkIHRvIHRoZSBuZXcgZm9sZGVyIGFzIHdlbGxcbiAgICAgICAgYXdhaXQgY29ubmVjdGlvbi5ydW4oJ1NVQlNDUklCRScsIHBhdGgpO1xuXG4gICAgICAgIHJldHVybiBtYXA7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGxldCBlcnJvckNvZGUgPSBnZXRTdGF0dXNDb2RlKGVyci5yZXNwb25zZSk7XG4gICAgICAgIGlmIChlcnJvckNvZGUpIHtcbiAgICAgICAgICAgIGVyci5zZXJ2ZXJSZXNwb25zZUNvZGUgPSBlcnJvckNvZGU7XG4gICAgICAgIH1cbiAgICAgICAgZXJyLnJlc3BvbnNlID0gYXdhaXQgZ2V0RXJyb3JUZXh0KGVyci5yZXNwb25zZSk7XG5cbiAgICAgICAgc3dpdGNoIChlcnJvckNvZGUpIHtcbiAgICAgICAgICAgIGNhc2UgJ0FMUkVBRFlFWElTVFMnOlxuICAgICAgICAgICAgICAgIC8vIG5vIG5lZWQgdG8gZG8gYW55dGhpbmcsIG1haWxib3ggYWxyZWFkeSBleGlzdHNcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICBwYXRoLFxuICAgICAgICAgICAgICAgICAgICBjcmVhdGVkOiBmYWxzZVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZXJyb3JDb2RlKSB7XG4gICAgICAgICAgICBlcnIuc2VydmVyUmVzcG9uc2VDb2RlID0gZXJyb3JDb2RlO1xuICAgICAgICB9XG5cbiAgICAgICAgY29ubmVjdGlvbi5sb2cud2Fybih7IGVyciwgY2lkOiBjb25uZWN0aW9uLmlkIH0pO1xuICAgICAgICB0aHJvdyBlcnI7XG4gICAgfVxufTtcbiJdLCJuYW1lcyI6W10sImlnbm9yZUxpc3QiOlswXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(action-browser)/./node_modules/imapflow/lib/commands/create.js\n");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "(action-browser)/./node_modules/imapflow/lib/commands/delete.js":
|
|
/*!******************************************************!*\
|
|
!*** ./node_modules/imapflow/lib/commands/delete.js ***!
|
|
\******************************************************/
|
|
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
|
|
|
|
eval("\n\nconst { encodePath, normalizePath, getStatusCode, getErrorText } = __webpack_require__(/*! ../tools.js */ \"(action-browser)/./node_modules/imapflow/lib/tools.js\");\n\n// Deletes an existing mailbox\nmodule.exports = async (connection, path) => {\n if (![connection.states.AUTHENTICATED, connection.states.SELECTED].includes(connection.state)) {\n // nothing to do here\n return;\n }\n\n path = normalizePath(connection, path);\n\n if (connection.states.SELECTED && connection.mailbox.path === path) {\n await connection.run('CLOSE');\n }\n\n let response;\n try {\n let map = {\n path\n };\n response = await connection.exec('DELETE', [{ type: 'ATOM', value: encodePath(connection, path) }]);\n response.next();\n return map;\n } catch (err) {\n let errorCode = getStatusCode(err.response);\n if (errorCode) {\n err.serverResponseCode = errorCode;\n }\n err.response = await getErrorText(err.response);\n\n connection.log.warn({ err, cid: connection.id });\n throw err;\n }\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFjdGlvbi1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9pbWFwZmxvdy9saWIvY29tbWFuZHMvZGVsZXRlLmpzIiwibWFwcGluZ3MiOiJBQUFhOztBQUViLFFBQVEseURBQXlELEVBQUUsbUJBQU8sQ0FBQywwRUFBYTs7QUFFeEY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0RBQXNELG1EQUFtRDtBQUN6RztBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsOEJBQThCLHlCQUF5QjtBQUN2RDtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIi9ob21lL2FsbWEvbmV4dGdlbi9OZWFoLW1haWwvbm9kZV9tb2R1bGVzL2ltYXBmbG93L2xpYi9jb21tYW5kcy9kZWxldGUuanMiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCB7IGVuY29kZVBhdGgsIG5vcm1hbGl6ZVBhdGgsIGdldFN0YXR1c0NvZGUsIGdldEVycm9yVGV4dCB9ID0gcmVxdWlyZSgnLi4vdG9vbHMuanMnKTtcblxuLy8gRGVsZXRlcyBhbiBleGlzdGluZyBtYWlsYm94XG5tb2R1bGUuZXhwb3J0cyA9IGFzeW5jIChjb25uZWN0aW9uLCBwYXRoKSA9PiB7XG4gICAgaWYgKCFbY29ubmVjdGlvbi5zdGF0ZXMuQVVUSEVOVElDQVRFRCwgY29ubmVjdGlvbi5zdGF0ZXMuU0VMRUNURURdLmluY2x1ZGVzKGNvbm5lY3Rpb24uc3RhdGUpKSB7XG4gICAgICAgIC8vIG5vdGhpbmcgdG8gZG8gaGVyZVxuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgcGF0aCA9IG5vcm1hbGl6ZVBhdGgoY29ubmVjdGlvbiwgcGF0aCk7XG5cbiAgICBpZiAoY29ubmVjdGlvbi5zdGF0ZXMuU0VMRUNURUQgJiYgY29ubmVjdGlvbi5tYWlsYm94LnBhdGggPT09IHBhdGgpIHtcbiAgICAgICAgYXdhaXQgY29ubmVjdGlvbi5ydW4oJ0NMT1NFJyk7XG4gICAgfVxuXG4gICAgbGV0IHJlc3BvbnNlO1xuICAgIHRyeSB7XG4gICAgICAgIGxldCBtYXAgPSB7XG4gICAgICAgICAgICBwYXRoXG4gICAgICAgIH07XG4gICAgICAgIHJlc3BvbnNlID0gYXdhaXQgY29ubmVjdGlvbi5leGVjKCdERUxFVEUnLCBbeyB0eXBlOiAnQVRPTScsIHZhbHVlOiBlbmNvZGVQYXRoKGNvbm5lY3Rpb24sIHBhdGgpIH1dKTtcbiAgICAgICAgcmVzcG9uc2UubmV4dCgpO1xuICAgICAgICByZXR1cm4gbWFwO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBsZXQgZXJyb3JDb2RlID0gZ2V0U3RhdHVzQ29kZShlcnIucmVzcG9uc2UpO1xuICAgICAgICBpZiAoZXJyb3JDb2RlKSB7XG4gICAgICAgICAgICBlcnIuc2VydmVyUmVzcG9uc2VDb2RlID0gZXJyb3JDb2RlO1xuICAgICAgICB9XG4gICAgICAgIGVyci5yZXNwb25zZSA9IGF3YWl0IGdldEVycm9yVGV4dChlcnIucmVzcG9uc2UpO1xuXG4gICAgICAgIGNvbm5lY3Rpb24ubG9nLndhcm4oeyBlcnIsIGNpZDogY29ubmVjdGlvbi5pZCB9KTtcbiAgICAgICAgdGhyb3cgZXJyO1xuICAgIH1cbn07XG4iXSwibmFtZXMiOltdLCJpZ25vcmVMaXN0IjpbMF0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(action-browser)/./node_modules/imapflow/lib/commands/delete.js\n");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "(action-browser)/./node_modules/imapflow/lib/commands/enable.js":
|
|
/*!******************************************************!*\
|
|
!*** ./node_modules/imapflow/lib/commands/enable.js ***!
|
|
\******************************************************/
|
|
/***/ ((module) => {
|
|
|
|
eval("\n\n// Enables extensions\nmodule.exports = async (connection, extensionList) => {\n if (!connection.capabilities.has('ENABLE') || connection.state !== connection.states.AUTHENTICATED) {\n // nothing to do here\n return;\n }\n\n extensionList = extensionList.filter(extension => connection.capabilities.has(extension.toUpperCase()));\n if (!extensionList.length) {\n return;\n }\n\n let response;\n try {\n let enabled = new Set();\n response = await connection.exec(\n 'ENABLE',\n extensionList.map(extension => ({ type: 'ATOM', value: extension.toUpperCase() })),\n {\n untagged: {\n ENABLED: async untagged => {\n if (!untagged.attributes || !untagged.attributes.length) {\n return;\n }\n untagged.attributes.forEach(attr => {\n if (attr.value && typeof attr.value === 'string') {\n enabled.add(attr.value.toUpperCase().trim());\n }\n });\n }\n }\n }\n );\n connection.enabled = enabled;\n response.next();\n return enabled;\n } catch (err) {\n connection.log.warn({ err, cid: connection.id });\n return false;\n }\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFjdGlvbi1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9pbWFwZmxvdy9saWIvY29tbWFuZHMvZW5hYmxlLmpzIiwibWFwcGluZ3MiOiJBQUFhOztBQUViO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOENBQThDLDhDQUE4QztBQUM1RjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlCQUF5QjtBQUN6QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTiw4QkFBOEIseUJBQXlCO0FBQ3ZEO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsiL2hvbWUvYWxtYS9uZXh0Z2VuL05lYWgtbWFpbC9ub2RlX21vZHVsZXMvaW1hcGZsb3cvbGliL2NvbW1hbmRzL2VuYWJsZS5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbi8vIEVuYWJsZXMgZXh0ZW5zaW9uc1xubW9kdWxlLmV4cG9ydHMgPSBhc3luYyAoY29ubmVjdGlvbiwgZXh0ZW5zaW9uTGlzdCkgPT4ge1xuICAgIGlmICghY29ubmVjdGlvbi5jYXBhYmlsaXRpZXMuaGFzKCdFTkFCTEUnKSB8fCBjb25uZWN0aW9uLnN0YXRlICE9PSBjb25uZWN0aW9uLnN0YXRlcy5BVVRIRU5USUNBVEVEKSB7XG4gICAgICAgIC8vIG5vdGhpbmcgdG8gZG8gaGVyZVxuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZXh0ZW5zaW9uTGlzdCA9IGV4dGVuc2lvbkxpc3QuZmlsdGVyKGV4dGVuc2lvbiA9PiBjb25uZWN0aW9uLmNhcGFiaWxpdGllcy5oYXMoZXh0ZW5zaW9uLnRvVXBwZXJDYXNlKCkpKTtcbiAgICBpZiAoIWV4dGVuc2lvbkxpc3QubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsZXQgcmVzcG9uc2U7XG4gICAgdHJ5IHtcbiAgICAgICAgbGV0IGVuYWJsZWQgPSBuZXcgU2V0KCk7XG4gICAgICAgIHJlc3BvbnNlID0gYXdhaXQgY29ubmVjdGlvbi5leGVjKFxuICAgICAgICAgICAgJ0VOQUJMRScsXG4gICAgICAgICAgICBleHRlbnNpb25MaXN0Lm1hcChleHRlbnNpb24gPT4gKHsgdHlwZTogJ0FUT00nLCB2YWx1ZTogZXh0ZW5zaW9uLnRvVXBwZXJDYXNlKCkgfSkpLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHVudGFnZ2VkOiB7XG4gICAgICAgICAgICAgICAgICAgIEVOQUJMRUQ6IGFzeW5jIHVudGFnZ2VkID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdW50YWdnZWQuYXR0cmlidXRlcyB8fCAhdW50YWdnZWQuYXR0cmlidXRlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB1bnRhZ2dlZC5hdHRyaWJ1dGVzLmZvckVhY2goYXR0ciA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGF0dHIudmFsdWUgJiYgdHlwZW9mIGF0dHIudmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuYWJsZWQuYWRkKGF0dHIudmFsdWUudG9VcHBlckNhc2UoKS50cmltKCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICApO1xuICAgICAgICBjb25uZWN0aW9uLmVuYWJsZWQgPSBlbmFibGVkO1xuICAgICAgICByZXNwb25zZS5uZXh0KCk7XG4gICAgICAgIHJldHVybiBlbmFibGVkO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBjb25uZWN0aW9uLmxvZy53YXJuKHsgZXJyLCBjaWQ6IGNvbm5lY3Rpb24uaWQgfSk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG59O1xuIl0sIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6WzBdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(action-browser)/./node_modules/imapflow/lib/commands/enable.js\n");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "(action-browser)/./node_modules/imapflow/lib/commands/expunge.js":
|
|
/*!*******************************************************!*\
|
|
!*** ./node_modules/imapflow/lib/commands/expunge.js ***!
|
|
\*******************************************************/
|
|
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
|
|
|
|
eval("\n\nconst { getStatusCode, getErrorText } = __webpack_require__(/*! ../tools.js */ \"(action-browser)/./node_modules/imapflow/lib/tools.js\");\n\n// Deletes specified messages\nmodule.exports = async (connection, range, options) => {\n if (connection.state !== connection.states.SELECTED || !range) {\n // nothing to do here\n return;\n }\n\n options = options || {};\n\n await connection.messageFlagsAdd(range, ['\\\\Deleted'], options);\n\n let byUid = options.uid && connection.capabilities.has('UIDPLUS');\n let command = byUid ? 'UID EXPUNGE' : 'EXPUNGE';\n let attributes = byUid ? [{ type: 'SEQUENCE', value: range }] : false;\n\n let response;\n try {\n response = await connection.exec(command, attributes);\n\n // A OK [HIGHESTMODSEQ 9122] Expunge completed (0.010 + 0.000 + 0.012 secs).\n let section = response.response.attributes && response.response.attributes[0] && response.response.attributes[0].section;\n let responseCode = section && section.length && section[0] && typeof section[0].value === 'string' ? section[0].value : '';\n if (responseCode.toUpperCase() === 'HIGHESTMODSEQ') {\n let highestModseq = section[1] && typeof section[1].value === 'string' && !isNaN(section[1].value) ? BigInt(section[1].value) : false;\n if (highestModseq && (!connection.mailbox.highestModseq || highestModseq > connection.mailbox.highestModseq)) {\n connection.mailbox.highestModseq = highestModseq;\n }\n }\n\n response.next();\n return true;\n } catch (err) {\n let errorCode = getStatusCode(err.response);\n if (errorCode) {\n err.serverResponseCode = errorCode;\n }\n err.response = await getErrorText(err.response);\n\n connection.log.warn({ err, cid: connection.id });\n return false;\n }\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFjdGlvbi1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9pbWFwZmxvdy9saWIvY29tbWFuZHMvZXhwdW5nZS5qcyIsIm1hcHBpbmdzIjoiQUFBYTs7QUFFYixRQUFRLDhCQUE4QixFQUFFLG1CQUFPLENBQUMsMEVBQWE7O0FBRTdEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0EsZ0NBQWdDLGdDQUFnQzs7QUFFaEU7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsOEJBQThCLHlCQUF5QjtBQUN2RDtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIi9ob21lL2FsbWEvbmV4dGdlbi9OZWFoLW1haWwvbm9kZV9tb2R1bGVzL2ltYXBmbG93L2xpYi9jb21tYW5kcy9leHB1bmdlLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcblxuY29uc3QgeyBnZXRTdGF0dXNDb2RlLCBnZXRFcnJvclRleHQgfSA9IHJlcXVpcmUoJy4uL3Rvb2xzLmpzJyk7XG5cbi8vIERlbGV0ZXMgc3BlY2lmaWVkIG1lc3NhZ2VzXG5tb2R1bGUuZXhwb3J0cyA9IGFzeW5jIChjb25uZWN0aW9uLCByYW5nZSwgb3B0aW9ucykgPT4ge1xuICAgIGlmIChjb25uZWN0aW9uLnN0YXRlICE9PSBjb25uZWN0aW9uLnN0YXRlcy5TRUxFQ1RFRCB8fCAhcmFuZ2UpIHtcbiAgICAgICAgLy8gbm90aGluZyB0byBkbyBoZXJlXG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcblxuICAgIGF3YWl0IGNvbm5lY3Rpb24ubWVzc2FnZUZsYWdzQWRkKHJhbmdlLCBbJ1xcXFxEZWxldGVkJ10sIG9wdGlvbnMpO1xuXG4gICAgbGV0IGJ5VWlkID0gb3B0aW9ucy51aWQgJiYgY29ubmVjdGlvbi5jYXBhYmlsaXRpZXMuaGFzKCdVSURQTFVTJyk7XG4gICAgbGV0IGNvbW1hbmQgPSBieVVpZCA/ICdVSUQgRVhQVU5HRScgOiAnRVhQVU5HRSc7XG4gICAgbGV0IGF0dHJpYnV0ZXMgPSBieVVpZCA/IFt7IHR5cGU6ICdTRVFVRU5DRScsIHZhbHVlOiByYW5nZSB9XSA6IGZhbHNlO1xuXG4gICAgbGV0IHJlc3BvbnNlO1xuICAgIHRyeSB7XG4gICAgICAgIHJlc3BvbnNlID0gYXdhaXQgY29ubmVjdGlvbi5leGVjKGNvbW1hbmQsIGF0dHJpYnV0ZXMpO1xuXG4gICAgICAgIC8vIEEgT0sgW0hJR0hFU1RNT0RTRVEgOTEyMl0gRXhwdW5nZSBjb21wbGV0ZWQgKDAuMDEwICsgMC4wMDAgKyAwLjAxMiBzZWNzKS5cbiAgICAgICAgbGV0IHNlY3Rpb24gPSByZXNwb25zZS5yZXNwb25zZS5hdHRyaWJ1dGVzICYmIHJlc3BvbnNlLnJlc3BvbnNlLmF0dHJpYnV0ZXNbMF0gJiYgcmVzcG9uc2UucmVzcG9uc2UuYXR0cmlidXRlc1swXS5zZWN0aW9uO1xuICAgICAgICBsZXQgcmVzcG9uc2VDb2RlID0gc2VjdGlvbiAmJiBzZWN0aW9uLmxlbmd0aCAmJiBzZWN0aW9uWzBdICYmIHR5cGVvZiBzZWN0aW9uWzBdLnZhbHVlID09PSAnc3RyaW5nJyA/IHNlY3Rpb25bMF0udmFsdWUgOiAnJztcbiAgICAgICAgaWYgKHJlc3BvbnNlQ29kZS50b1VwcGVyQ2FzZSgpID09PSAnSElHSEVTVE1PRFNFUScpIHtcbiAgICAgICAgICAgIGxldCBoaWdoZXN0TW9kc2VxID0gc2VjdGlvblsxXSAmJiB0eXBlb2Ygc2VjdGlvblsxXS52YWx1ZSA9PT0gJ3N0cmluZycgJiYgIWlzTmFOKHNlY3Rpb25bMV0udmFsdWUpID8gQmlnSW50KHNlY3Rpb25bMV0udmFsdWUpIDogZmFsc2U7XG4gICAgICAgICAgICBpZiAoaGlnaGVzdE1vZHNlcSAmJiAoIWNvbm5lY3Rpb24ubWFpbGJveC5oaWdoZXN0TW9kc2VxIHx8IGhpZ2hlc3RNb2RzZXEgPiBjb25uZWN0aW9uLm1haWxib3guaGlnaGVzdE1vZHNlcSkpIHtcbiAgICAgICAgICAgICAgICBjb25uZWN0aW9uLm1haWxib3guaGlnaGVzdE1vZHNlcSA9IGhpZ2hlc3RNb2RzZXE7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXNwb25zZS5uZXh0KCk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBsZXQgZXJyb3JDb2RlID0gZ2V0U3RhdHVzQ29kZShlcnIucmVzcG9uc2UpO1xuICAgICAgICBpZiAoZXJyb3JDb2RlKSB7XG4gICAgICAgICAgICBlcnIuc2VydmVyUmVzcG9uc2VDb2RlID0gZXJyb3JDb2RlO1xuICAgICAgICB9XG4gICAgICAgIGVyci5yZXNwb25zZSA9IGF3YWl0IGdldEVycm9yVGV4dChlcnIucmVzcG9uc2UpO1xuXG4gICAgICAgIGNvbm5lY3Rpb24ubG9nLndhcm4oeyBlcnIsIGNpZDogY29ubmVjdGlvbi5pZCB9KTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbn07XG4iXSwibmFtZXMiOltdLCJpZ25vcmVMaXN0IjpbMF0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(action-browser)/./node_modules/imapflow/lib/commands/expunge.js\n");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "(action-browser)/./node_modules/imapflow/lib/commands/fetch.js":
|
|
/*!*****************************************************!*\
|
|
!*** ./node_modules/imapflow/lib/commands/fetch.js ***!
|
|
\*****************************************************/
|
|
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
|
|
|
|
eval("\n\nconst { formatMessageResponse } = __webpack_require__(/*! ../tools */ \"(action-browser)/./node_modules/imapflow/lib/tools.js\");\n\n// Fetches emails from server\nmodule.exports = async (connection, range, query, options) => {\n if (connection.state !== connection.states.SELECTED || !range) {\n // nothing to do here\n return;\n }\n\n options = options || {};\n\n let mailbox = connection.mailbox;\n\n const commandKey = connection.capabilities.has('BINARY') && options.binary && !connection.disableBinary ? 'BINARY' : 'BODY';\n\n let retryCount = 0;\n while (retryCount < 4) {\n let messages = {\n count: 0,\n list: []\n };\n\n let response;\n try {\n let attributes = [{ type: 'SEQUENCE', value: (range || '*').toString() }];\n\n let queryStructure = [];\n\n let setBodyPeek = (attributes, partial) => {\n let bodyPeek = {\n type: 'ATOM',\n value: `${commandKey}.PEEK`,\n section: [],\n partial\n };\n\n if (Array.isArray(attributes)) {\n attributes.forEach(attribute => {\n bodyPeek.section.push(attribute);\n });\n } else if (attributes) {\n bodyPeek.section.push(attributes);\n }\n\n queryStructure.push(bodyPeek);\n };\n\n ['all', 'fast', 'full', 'uid', 'flags', 'bodyStructure', 'envelope', 'internalDate'].forEach(key => {\n if (query[key]) {\n queryStructure.push({ type: 'ATOM', value: key.toUpperCase() });\n }\n });\n\n if (query.size) {\n queryStructure.push({ type: 'ATOM', value: 'RFC822.SIZE' });\n }\n\n if (query.source) {\n let partial;\n if (typeof query.source === 'object' && (query.source.start || query.source.maxLength)) {\n partial = [Number(query.source.start) || 0];\n if (query.source.maxLength && !isNaN(query.source.maxLength)) {\n partial.push(Number(query.source.maxLength));\n }\n }\n queryStructure.push({ type: 'ATOM', value: `${commandKey}.PEEK`, section: [], partial });\n }\n\n // if possible, always request for unique email id\n if (connection.capabilities.has('OBJECTID')) {\n queryStructure.push({ type: 'ATOM', value: 'EMAILID' });\n } else if (connection.capabilities.has('X-GM-EXT-1')) {\n queryStructure.push({ type: 'ATOM', value: 'X-GM-MSGID' });\n }\n\n if (query.threadId) {\n if (connection.capabilities.has('OBJECTID')) {\n queryStructure.push({ type: 'ATOM', value: 'THREADID' });\n } else if (connection.capabilities.has('X-GM-EXT-1')) {\n queryStructure.push({ type: 'ATOM', value: 'X-GM-THRID' });\n }\n }\n\n if (query.labels) {\n if (connection.capabilities.has('X-GM-EXT-1')) {\n queryStructure.push({ type: 'ATOM', value: 'X-GM-LABELS' });\n }\n }\n\n // always ask for modseq if possible\n if (connection.enabled.has('CONDSTORE') && !mailbox.noModseq) {\n queryStructure.push({ type: 'ATOM', value: 'MODSEQ' });\n }\n\n // always make sure to include UID in the request as well even though server might auto-add it itself\n if (!query.uid) {\n queryStructure.push({ type: 'ATOM', value: 'UID' });\n }\n\n if (query.headers) {\n if (Array.isArray(query.headers)) {\n setBodyPeek([{ type: 'ATOM', value: 'HEADER.FIELDS' }, query.headers.map(header => ({ type: 'ATOM', value: header }))]);\n } else {\n setBodyPeek({ type: 'ATOM', value: 'HEADER' });\n }\n }\n\n if (query.bodyParts && query.bodyParts.length) {\n query.bodyParts.forEach(part => {\n if (!part) {\n return;\n }\n let key;\n let partial;\n if (typeof part === 'object') {\n if (!part.key || typeof part.key !== 'string') {\n return;\n }\n key = part.key.toUpperCase();\n if (part.start || part.maxLength) {\n partial = [Number(part.start) || 0];\n if (part.maxLength && !isNaN(part.maxLength)) {\n partial.push(Number(part.maxLength));\n }\n }\n } else if (typeof part === 'string') {\n key = part.toUpperCase();\n } else {\n return;\n }\n\n setBodyPeek({ type: 'ATOM', value: key }, partial);\n });\n }\n\n if (queryStructure.length === 1) {\n queryStructure = queryStructure.pop();\n }\n\n attributes.push(queryStructure);\n\n if (options.changedSince && connection.enabled.has('CONDSTORE') && !mailbox.noModseq) {\n let changedSinceArgs = [\n {\n type: 'ATOM',\n value: 'CHANGEDSINCE'\n },\n {\n type: 'ATOM',\n value: options.changedSince.toString()\n }\n ];\n\n if (options.uid && connection.enabled.has('QRESYNC')) {\n changedSinceArgs.push({\n type: 'ATOM',\n value: 'VANISHED'\n });\n }\n\n attributes.push(changedSinceArgs);\n }\n\n response = await connection.exec(options.uid ? 'UID FETCH' : 'FETCH', attributes, {\n untagged: {\n FETCH: async untagged => {\n messages.count++;\n let formatted = await formatMessageResponse(untagged, mailbox);\n if (typeof options.onUntaggedFetch === 'function') {\n await new Promise((resolve, reject) => {\n options.onUntaggedFetch(formatted, err => {\n if (err) {\n reject(err);\n } else {\n resolve();\n }\n });\n });\n } else {\n messages.list.push(formatted);\n }\n }\n }\n });\n\n response.next();\n return messages;\n } catch (err) {\n if (err.code === 'ETHROTTLE') {\n // retrying\n connection.log.warn({\n msg: 'Retrying throttled request',\n cid: connection.id,\n code: err.code,\n response: err.responseText,\n throttleReset: err.throttleReset,\n retryCount\n });\n retryCount++;\n continue;\n }\n\n connection.log.warn({ err, cid: connection.id });\n throw err;\n }\n }\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFjdGlvbi1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9pbWFwZmxvdy9saWIvY29tbWFuZHMvZmV0Y2guanMiLCJtYXBwaW5ncyI6IkFBQWE7O0FBRWIsUUFBUSx3QkFBd0IsRUFBRSxtQkFBTyxDQUFDLHVFQUFVOztBQUVwRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxnQ0FBZ0Msb0RBQW9EOztBQUVwRjs7QUFFQTtBQUNBO0FBQ0E7QUFDQSw4QkFBOEIsV0FBVztBQUN6QztBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCLGtCQUFrQjtBQUNsQjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLDBDQUEwQyx3Q0FBd0M7QUFDbEY7QUFDQSxhQUFhOztBQUViO0FBQ0Esc0NBQXNDLG9DQUFvQztBQUMxRTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0NBQXNDLHdCQUF3QixXQUFXLDhCQUE4QjtBQUN2Rzs7QUFFQTtBQUNBO0FBQ0Esc0NBQXNDLGdDQUFnQztBQUN0RSxjQUFjO0FBQ2Qsc0NBQXNDLG1DQUFtQztBQUN6RTs7QUFFQTtBQUNBO0FBQ0EsMENBQTBDLGlDQUFpQztBQUMzRSxrQkFBa0I7QUFDbEIsMENBQTBDLG1DQUFtQztBQUM3RTtBQUNBOztBQUVBO0FBQ0E7QUFDQSwwQ0FBMEMsb0NBQW9DO0FBQzlFO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLHNDQUFzQywrQkFBK0I7QUFDckU7O0FBRUE7QUFDQTtBQUNBLHNDQUFzQyw0QkFBNEI7QUFDbEU7O0FBRUE7QUFDQTtBQUNBLG1DQUFtQyxzQ0FBc0MsaUNBQWlDLDZCQUE2QjtBQUN2SSxrQkFBa0I7QUFDbEIsa0NBQWtDLCtCQUErQjtBQUNqRTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQjtBQUN0QjtBQUNBLHNCQUFzQjtBQUN0QjtBQUNBOztBQUVBLGtDQUFrQywwQkFBMEI7QUFDNUQsaUJBQWlCO0FBQ2pCOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNDQUFzQztBQUN0QztBQUNBO0FBQ0EsaUNBQWlDO0FBQ2pDLDZCQUE2QjtBQUM3QiwwQkFBMEI7QUFDMUI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhOztBQUViO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTs7QUFFQSxrQ0FBa0MseUJBQXlCO0FBQzNEO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyIvaG9tZS9hbG1hL25leHRnZW4vTmVhaC1tYWlsL25vZGVfbW9kdWxlcy9pbWFwZmxvdy9saWIvY29tbWFuZHMvZmV0Y2guanMiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCB7IGZvcm1hdE1lc3NhZ2VSZXNwb25zZSB9ID0gcmVxdWlyZSgnLi4vdG9vbHMnKTtcblxuLy8gRmV0Y2hlcyBlbWFpbHMgZnJvbSBzZXJ2ZXJcbm1vZHVsZS5leHBvcnRzID0gYXN5bmMgKGNvbm5lY3Rpb24sIHJhbmdlLCBxdWVyeSwgb3B0aW9ucykgPT4ge1xuICAgIGlmIChjb25uZWN0aW9uLnN0YXRlICE9PSBjb25uZWN0aW9uLnN0YXRlcy5TRUxFQ1RFRCB8fCAhcmFuZ2UpIHtcbiAgICAgICAgLy8gbm90aGluZyB0byBkbyBoZXJlXG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcblxuICAgIGxldCBtYWlsYm94ID0gY29ubmVjdGlvbi5tYWlsYm94O1xuXG4gICAgY29uc3QgY29tbWFuZEtleSA9IGNvbm5lY3Rpb24uY2FwYWJpbGl0aWVzLmhhcygnQklOQVJZJykgJiYgb3B0aW9ucy5iaW5hcnkgJiYgIWNvbm5lY3Rpb24uZGlzYWJsZUJpbmFyeSA/ICdCSU5BUlknIDogJ0JPRFknO1xuXG4gICAgbGV0IHJldHJ5Q291bnQgPSAwO1xuICAgIHdoaWxlIChyZXRyeUNvdW50IDwgNCkge1xuICAgICAgICBsZXQgbWVzc2FnZXMgPSB7XG4gICAgICAgICAgICBjb3VudDogMCxcbiAgICAgICAgICAgIGxpc3Q6IFtdXG4gICAgICAgIH07XG5cbiAgICAgICAgbGV0IHJlc3BvbnNlO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgbGV0IGF0dHJpYnV0ZXMgPSBbeyB0eXBlOiAnU0VRVUVOQ0UnLCB2YWx1ZTogKHJhbmdlIHx8ICcqJykudG9TdHJpbmcoKSB9XTtcblxuICAgICAgICAgICAgbGV0IHF1ZXJ5U3RydWN0dXJlID0gW107XG5cbiAgICAgICAgICAgIGxldCBzZXRCb2R5UGVlayA9IChhdHRyaWJ1dGVzLCBwYXJ0aWFsKSA9PiB7XG4gICAgICAgICAgICAgICAgbGV0IGJvZHlQZWVrID0ge1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnQVRPTScsXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiBgJHtjb21tYW5kS2V5fS5QRUVLYCxcbiAgICAgICAgICAgICAgICAgICAgc2VjdGlvbjogW10sXG4gICAgICAgICAgICAgICAgICAgIHBhcnRpYWxcbiAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoYXR0cmlidXRlcykpIHtcbiAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlcy5mb3JFYWNoKGF0dHJpYnV0ZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBib2R5UGVlay5zZWN0aW9uLnB1c2goYXR0cmlidXRlKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChhdHRyaWJ1dGVzKSB7XG4gICAgICAgICAgICAgICAgICAgIGJvZHlQZWVrLnNlY3Rpb24ucHVzaChhdHRyaWJ1dGVzKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBxdWVyeVN0cnVjdHVyZS5wdXNoKGJvZHlQZWVrKTtcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIFsnYWxsJywgJ2Zhc3QnLCAnZnVsbCcsICd1aWQnLCAnZmxhZ3MnLCAnYm9keVN0cnVjdHVyZScsICdlbnZlbG9wZScsICdpbnRlcm5hbERhdGUnXS5mb3JFYWNoKGtleSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHF1ZXJ5W2tleV0pIHtcbiAgICAgICAgICAgICAgICAgICAgcXVlcnlTdHJ1Y3R1cmUucHVzaCh7IHR5cGU6ICdBVE9NJywgdmFsdWU6IGtleS50b1VwcGVyQ2FzZSgpIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBpZiAocXVlcnkuc2l6ZSkge1xuICAgICAgICAgICAgICAgIHF1ZXJ5U3RydWN0dXJlLnB1c2goeyB0eXBlOiAnQVRPTScsIHZhbHVlOiAnUkZDODIyLlNJWkUnIH0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAocXVlcnkuc291cmNlKSB7XG4gICAgICAgICAgICAgICAgbGV0IHBhcnRpYWw7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBxdWVyeS5zb3VyY2UgPT09ICdvYmplY3QnICYmIChxdWVyeS5zb3VyY2Uuc3RhcnQgfHwgcXVlcnkuc291cmNlLm1heExlbmd0aCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcGFydGlhbCA9IFtOdW1iZXIocXVlcnkuc291cmNlLnN0YXJ0KSB8fCAwXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHF1ZXJ5LnNvdXJjZS5tYXhMZW5ndGggJiYgIWlzTmFOKHF1ZXJ5LnNvdXJjZS5tYXhMZW5ndGgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJ0aWFsLnB1c2goTnVtYmVyKHF1ZXJ5LnNvdXJjZS5tYXhMZW5ndGgpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBxdWVyeVN0cnVjdHVyZS5wdXNoKHsgdHlwZTogJ0FUT00nLCB2YWx1ZTogYCR7Y29tbWFuZEtleX0uUEVFS2AsIHNlY3Rpb246IFtdLCBwYXJ0aWFsIH0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBpZiBwb3NzaWJsZSwgYWx3YXlzIHJlcXVlc3QgZm9yIHVuaXF1ZSBlbWFpbCBpZFxuICAgICAgICAgICAgaWYgKGNvbm5lY3Rpb24uY2FwYWJpbGl0aWVzLmhhcygnT0JKRUNUSUQnKSkge1xuICAgICAgICAgICAgICAgIHF1ZXJ5U3RydWN0dXJlLnB1c2goeyB0eXBlOiAnQVRPTScsIHZhbHVlOiAnRU1BSUxJRCcgfSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGNvbm5lY3Rpb24uY2FwYWJpbGl0aWVzLmhhcygnWC1HTS1FWFQtMScpKSB7XG4gICAgICAgICAgICAgICAgcXVlcnlTdHJ1Y3R1cmUucHVzaCh7IHR5cGU6ICdBVE9NJywgdmFsdWU6ICdYLUdNLU1TR0lEJyB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHF1ZXJ5LnRocmVhZElkKSB7XG4gICAgICAgICAgICAgICAgaWYgKGNvbm5lY3Rpb24uY2FwYWJpbGl0aWVzLmhhcygnT0JKRUNUSUQnKSkge1xuICAgICAgICAgICAgICAgICAgICBxdWVyeVN0cnVjdHVyZS5wdXNoKHsgdHlwZTogJ0FUT00nLCB2YWx1ZTogJ1RIUkVBRElEJyB9KTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNvbm5lY3Rpb24uY2FwYWJpbGl0aWVzLmhhcygnWC1HTS1FWFQtMScpKSB7XG4gICAgICAgICAgICAgICAgICAgIHF1ZXJ5U3RydWN0dXJlLnB1c2goeyB0eXBlOiAnQVRPTScsIHZhbHVlOiAnWC1HTS1USFJJRCcgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAocXVlcnkubGFiZWxzKSB7XG4gICAgICAgICAgICAgICAgaWYgKGNvbm5lY3Rpb24uY2FwYWJpbGl0aWVzLmhhcygnWC1HTS1FWFQtMScpKSB7XG4gICAgICAgICAgICAgICAgICAgIHF1ZXJ5U3RydWN0dXJlLnB1c2goeyB0eXBlOiAnQVRPTScsIHZhbHVlOiAnWC1HTS1MQUJFTFMnIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gYWx3YXlzIGFzayBmb3IgbW9kc2VxIGlmIHBvc3NpYmxlXG4gICAgICAgICAgICBpZiAoY29ubmVjdGlvbi5lbmFibGVkLmhhcygnQ09ORFNUT1JFJykgJiYgIW1haWxib3gubm9Nb2RzZXEpIHtcbiAgICAgICAgICAgICAgICBxdWVyeVN0cnVjdHVyZS5wdXNoKHsgdHlwZTogJ0FUT00nLCB2YWx1ZTogJ01PRFNFUScgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIGFsd2F5cyBtYWtlIHN1cmUgdG8gaW5jbHVkZSBVSUQgaW4gdGhlIHJlcXVlc3QgYXMgd2VsbCBldmVuIHRob3VnaCBzZXJ2ZXIgbWlnaHQgYXV0by1hZGQgaXQgaXRzZWxmXG4gICAgICAgICAgICBpZiAoIXF1ZXJ5LnVpZCkge1xuICAgICAgICAgICAgICAgIHF1ZXJ5U3RydWN0dXJlLnB1c2goeyB0eXBlOiAnQVRPTScsIHZhbHVlOiAnVUlEJyB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHF1ZXJ5LmhlYWRlcnMpIHtcbiAgICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShxdWVyeS5oZWFkZXJzKSkge1xuICAgICAgICAgICAgICAgICAgICBzZXRCb2R5UGVlayhbeyB0eXBlOiAnQVRPTScsIHZhbHVlOiAnSEVBREVSLkZJRUxEUycgfSwgcXVlcnkuaGVhZGVycy5tYXAoaGVhZGVyID0+ICh7IHR5cGU6ICdBVE9NJywgdmFsdWU6IGhlYWRlciB9KSldKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBzZXRCb2R5UGVlayh7IHR5cGU6ICdBVE9NJywgdmFsdWU6ICdIRUFERVInIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHF1ZXJ5LmJvZHlQYXJ0cyAmJiBxdWVyeS5ib2R5UGFydHMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgcXVlcnkuYm9keVBhcnRzLmZvckVhY2gocGFydCA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghcGFydCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGxldCBrZXk7XG4gICAgICAgICAgICAgICAgICAgIGxldCBwYXJ0aWFsO1xuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHBhcnQgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXBhcnQua2V5IHx8IHR5cGVvZiBwYXJ0LmtleSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBrZXkgPSBwYXJ0LmtleS50b1VwcGVyQ2FzZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhcnQuc3RhcnQgfHwgcGFydC5tYXhMZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0aWFsID0gW051bWJlcihwYXJ0LnN0YXJ0KSB8fCAwXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFydC5tYXhMZW5ndGggJiYgIWlzTmFOKHBhcnQubWF4TGVuZ3RoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0aWFsLnB1c2goTnVtYmVyKHBhcnQubWF4TGVuZ3RoKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBwYXJ0ID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgICAgICAgICAga2V5ID0gcGFydC50b1VwcGVyQ2FzZSgpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgc2V0Qm9keVBlZWsoeyB0eXBlOiAnQVRPTScsIHZhbHVlOiBrZXkgfSwgcGFydGlhbCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChxdWVyeVN0cnVjdHVyZS5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgICAgICBxdWVyeVN0cnVjdHVyZSA9IHF1ZXJ5U3RydWN0dXJlLnBvcCgpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBhdHRyaWJ1dGVzLnB1c2gocXVlcnlTdHJ1Y3R1cmUpO1xuXG4gICAgICAgICAgICBpZiAob3B0aW9ucy5jaGFuZ2VkU2luY2UgJiYgY29ubmVjdGlvbi5lbmFibGVkLmhhcygnQ09ORFNUT1JFJykgJiYgIW1haWxib3gubm9Nb2RzZXEpIHtcbiAgICAgICAgICAgICAgICBsZXQgY2hhbmdlZFNpbmNlQXJncyA9IFtcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ0FUT00nLFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6ICdDSEFOR0VEU0lOQ0UnXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdBVE9NJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBvcHRpb25zLmNoYW5nZWRTaW5jZS50b1N0cmluZygpXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBdO1xuXG4gICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMudWlkICYmIGNvbm5lY3Rpb24uZW5hYmxlZC5oYXMoJ1FSRVNZTkMnKSkge1xuICAgICAgICAgICAgICAgICAgICBjaGFuZ2VkU2luY2VBcmdzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ0FUT00nLFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6ICdWQU5JU0hFRCdcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgYXR0cmlidXRlcy5wdXNoKGNoYW5nZWRTaW5jZUFyZ3MpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXNwb25zZSA9IGF3YWl0IGNvbm5lY3Rpb24uZXhlYyhvcHRpb25zLnVpZCA/ICdVSUQgRkVUQ0gnIDogJ0ZFVENIJywgYXR0cmlidXRlcywge1xuICAgICAgICAgICAgICAgIHVudGFnZ2VkOiB7XG4gICAgICAgICAgICAgICAgICAgIEZFVENIOiBhc3luYyB1bnRhZ2dlZCA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlcy5jb3VudCsrO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGZvcm1hdHRlZCA9IGF3YWl0IGZvcm1hdE1lc3NhZ2VSZXNwb25zZSh1bnRhZ2dlZCwgbWFpbGJveCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIG9wdGlvbnMub25VbnRhZ2dlZEZldGNoID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLm9uVW50YWdnZWRGZXRjaChmb3JtYXR0ZWQsIGVyciA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGVycik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VzLmxpc3QucHVzaChmb3JtYXR0ZWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHJlc3BvbnNlLm5leHQoKTtcbiAgICAgICAgICAgIHJldHVybiBtZXNzYWdlcztcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICBpZiAoZXJyLmNvZGUgPT09ICdFVEhST1RUTEUnKSB7XG4gICAgICAgICAgICAgICAgLy8gcmV0cnlpbmdcbiAgICAgICAgICAgICAgICBjb25uZWN0aW9uLmxvZy53YXJuKHtcbiAgICAgICAgICAgICAgICAgICAgbXNnOiAnUmV0cnlpbmcgdGhyb3R0bGVkIHJlcXVlc3QnLFxuICAgICAgICAgICAgICAgICAgICBjaWQ6IGNvbm5lY3Rpb24uaWQsXG4gICAgICAgICAgICAgICAgICAgIGNvZGU6IGVyci5jb2RlLFxuICAgICAgICAgICAgICAgICAgICByZXNwb25zZTogZXJyLnJlc3BvbnNlVGV4dCxcbiAgICAgICAgICAgICAgICAgICAgdGhyb3R0bGVSZXNldDogZXJyLnRocm90dGxlUmVzZXQsXG4gICAgICAgICAgICAgICAgICAgIHJldHJ5Q291bnRcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICByZXRyeUNvdW50Kys7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbm5lY3Rpb24ubG9nLndhcm4oeyBlcnIsIGNpZDogY29ubmVjdGlvbi5pZCB9KTtcbiAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgfVxuICAgIH1cbn07XG4iXSwibmFtZXMiOltdLCJpZ25vcmVMaXN0IjpbMF0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(action-browser)/./node_modules/imapflow/lib/commands/fetch.js\n");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "(action-browser)/./node_modules/imapflow/lib/commands/id.js":
|
|
/*!**************************************************!*\
|
|
!*** ./node_modules/imapflow/lib/commands/id.js ***!
|
|
\**************************************************/
|
|
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
|
|
|
|
eval("\n\nconst { formatDateTime } = __webpack_require__(/*! ../tools.js */ \"(action-browser)/./node_modules/imapflow/lib/tools.js\");\n\n// Sends ID info to server and updates server info data based on response\nmodule.exports = async (connection, clientInfo) => {\n if (!connection.capabilities.has('ID')) {\n // nothing to do here\n return;\n }\n\n let response;\n try {\n let map = {};\n\n // convert object into an array of value tuples\n let formattedClientInfo = !clientInfo\n ? null\n : Object.keys(clientInfo)\n .map(key => [key, formatValue(key, clientInfo[key])])\n .filter(entry => entry[1])\n .flatMap(entry => entry);\n\n if (formattedClientInfo && !formattedClientInfo.length) {\n // value array has no elements\n formattedClientInfo = null;\n }\n\n response = await connection.exec('ID', [formattedClientInfo], {\n untagged: {\n ID: async untagged => {\n let params = untagged.attributes && untagged.attributes[0];\n let key;\n (Array.isArray(params) ? params : [].concat(params || [])).forEach((val, i) => {\n if (i % 2 === 0) {\n key = val.value;\n } else if (typeof key === 'string' && typeof val.value === 'string') {\n map[key.toLowerCase().trim()] = val.value;\n }\n });\n }\n }\n });\n connection.serverInfo = map;\n response.next();\n return map;\n } catch (err) {\n connection.log.warn({ err, cid: connection.id });\n return false;\n }\n};\n\nfunction formatValue(key, value) {\n switch (key.toLowerCase()) {\n case 'date':\n // Date has to be in imap date-time format\n return formatDateTime(value);\n default:\n // Other values are strings without newlines\n return (value || '').toString().replace(/\\s+/g, ' ');\n }\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFjdGlvbi1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9pbWFwZmxvdy9saWIvY29tbWFuZHMvaWQuanMiLCJtYXBwaW5ncyI6IkFBQWE7O0FBRWIsUUFBUSxpQkFBaUIsRUFBRSxtQkFBTyxDQUFDLDBFQUFhOztBQUVoRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQkFBMEI7QUFDMUI7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQjtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTiw4QkFBOEIseUJBQXlCO0FBQ3ZEO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsiL2hvbWUvYWxtYS9uZXh0Z2VuL05lYWgtbWFpbC9ub2RlX21vZHVsZXMvaW1hcGZsb3cvbGliL2NvbW1hbmRzL2lkLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcblxuY29uc3QgeyBmb3JtYXREYXRlVGltZSB9ID0gcmVxdWlyZSgnLi4vdG9vbHMuanMnKTtcblxuLy8gU2VuZHMgSUQgaW5mbyB0byBzZXJ2ZXIgYW5kIHVwZGF0ZXMgc2VydmVyIGluZm8gZGF0YSBiYXNlZCBvbiByZXNwb25zZVxubW9kdWxlLmV4cG9ydHMgPSBhc3luYyAoY29ubmVjdGlvbiwgY2xpZW50SW5mbykgPT4ge1xuICAgIGlmICghY29ubmVjdGlvbi5jYXBhYmlsaXRpZXMuaGFzKCdJRCcpKSB7XG4gICAgICAgIC8vIG5vdGhpbmcgdG8gZG8gaGVyZVxuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbGV0IHJlc3BvbnNlO1xuICAgIHRyeSB7XG4gICAgICAgIGxldCBtYXAgPSB7fTtcblxuICAgICAgICAvLyBjb252ZXJ0IG9iamVjdCBpbnRvIGFuIGFycmF5IG9mIHZhbHVlIHR1cGxlc1xuICAgICAgICBsZXQgZm9ybWF0dGVkQ2xpZW50SW5mbyA9ICFjbGllbnRJbmZvXG4gICAgICAgICAgICA/IG51bGxcbiAgICAgICAgICAgIDogT2JqZWN0LmtleXMoY2xpZW50SW5mbylcbiAgICAgICAgICAgICAgICAgIC5tYXAoa2V5ID0+IFtrZXksIGZvcm1hdFZhbHVlKGtleSwgY2xpZW50SW5mb1trZXldKV0pXG4gICAgICAgICAgICAgICAgICAuZmlsdGVyKGVudHJ5ID0+IGVudHJ5WzFdKVxuICAgICAgICAgICAgICAgICAgLmZsYXRNYXAoZW50cnkgPT4gZW50cnkpO1xuXG4gICAgICAgIGlmIChmb3JtYXR0ZWRDbGllbnRJbmZvICYmICFmb3JtYXR0ZWRDbGllbnRJbmZvLmxlbmd0aCkge1xuICAgICAgICAgICAgLy8gdmFsdWUgYXJyYXkgaGFzIG5vIGVsZW1lbnRzXG4gICAgICAgICAgICBmb3JtYXR0ZWRDbGllbnRJbmZvID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJlc3BvbnNlID0gYXdhaXQgY29ubmVjdGlvbi5leGVjKCdJRCcsIFtmb3JtYXR0ZWRDbGllbnRJbmZvXSwge1xuICAgICAgICAgICAgdW50YWdnZWQ6IHtcbiAgICAgICAgICAgICAgICBJRDogYXN5bmMgdW50YWdnZWQgPT4ge1xuICAgICAgICAgICAgICAgICAgICBsZXQgcGFyYW1zID0gdW50YWdnZWQuYXR0cmlidXRlcyAmJiB1bnRhZ2dlZC5hdHRyaWJ1dGVzWzBdO1xuICAgICAgICAgICAgICAgICAgICBsZXQga2V5O1xuICAgICAgICAgICAgICAgICAgICAoQXJyYXkuaXNBcnJheShwYXJhbXMpID8gcGFyYW1zIDogW10uY29uY2F0KHBhcmFtcyB8fCBbXSkpLmZvckVhY2goKHZhbCwgaSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGkgJSAyID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5ID0gdmFsLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2Yga2V5ID09PSAnc3RyaW5nJyAmJiB0eXBlb2YgdmFsLnZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcFtrZXkudG9Mb3dlckNhc2UoKS50cmltKCldID0gdmFsLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBjb25uZWN0aW9uLnNlcnZlckluZm8gPSBtYXA7XG4gICAgICAgIHJlc3BvbnNlLm5leHQoKTtcbiAgICAgICAgcmV0dXJuIG1hcDtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgY29ubmVjdGlvbi5sb2cud2Fybih7IGVyciwgY2lkOiBjb25uZWN0aW9uLmlkIH0pO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxufTtcblxuZnVuY3Rpb24gZm9ybWF0VmFsdWUoa2V5LCB2YWx1ZSkge1xuICAgIHN3aXRjaCAoa2V5LnRvTG93ZXJDYXNlKCkpIHtcbiAgICAgICAgY2FzZSAnZGF0ZSc6XG4gICAgICAgICAgICAvLyBEYXRlIGhhcyB0byBiZSBpbiBpbWFwIGRhdGUtdGltZSBmb3JtYXRcbiAgICAgICAgICAgIHJldHVybiBmb3JtYXREYXRlVGltZSh2YWx1ZSk7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAvLyBPdGhlciB2YWx1ZXMgYXJlIHN0cmluZ3Mgd2l0aG91dCBuZXdsaW5lc1xuICAgICAgICAgICAgcmV0dXJuICh2YWx1ZSB8fCAnJykudG9TdHJpbmcoKS5yZXBsYWNlKC9cXHMrL2csICcgJyk7XG4gICAgfVxufVxuIl0sIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6WzBdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(action-browser)/./node_modules/imapflow/lib/commands/id.js\n");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "(action-browser)/./node_modules/imapflow/lib/commands/idle.js":
|
|
/*!****************************************************!*\
|
|
!*** ./node_modules/imapflow/lib/commands/idle.js ***!
|
|
\****************************************************/
|
|
/***/ ((module) => {
|
|
|
|
eval("\n\nconst NOOP_INTERVAL = 2 * 60 * 1000;\n\nasync function runIdle(connection) {\n let response;\n\n let preCheckWaitQueue = [];\n try {\n connection.idling = true;\n\n //let idleSent = false;\n let doneRequested = false;\n let doneSent = false;\n let canEnd = false;\n\n let preCheck = async () => {\n doneRequested = true;\n if (canEnd && !doneSent) {\n connection.log.debug({\n src: 'c',\n msg: `DONE`,\n comment: `breaking IDLE`,\n lockId: connection.currentLock?.lockId,\n path: connection.mailbox && connection.mailbox.path\n });\n connection.write('DONE');\n doneSent = true;\n\n connection.idling = false;\n connection.preCheck = false; // unset itself\n\n while (preCheckWaitQueue.length) {\n let { resolve } = preCheckWaitQueue.shift();\n resolve();\n }\n }\n };\n\n let connectionPreCheck = () => {\n let handler = new Promise((resolve, reject) => {\n preCheckWaitQueue.push({ resolve, reject });\n });\n\n connection.log.trace({\n msg: 'Requesting IDLE break',\n lockId: connection.currentLock?.lockId,\n path: connection.mailbox && connection.mailbox.path,\n queued: preCheckWaitQueue.length,\n doneRequested,\n canEnd,\n doneSent\n });\n\n preCheck().catch(err => connection.log.warn({ err, cid: connection.id }));\n\n return handler;\n };\n\n connection.preCheck = connectionPreCheck;\n\n response = await connection.exec('IDLE', false, {\n onPlusTag: async () => {\n connection.log.debug({ msg: `Initiated IDLE, waiting for server input`, lockId: connection.currentLock?.lockId, doneRequested });\n canEnd = true;\n if (doneRequested) {\n try {\n await preCheck();\n } catch (err) {\n connection.log.warn({ err, cid: connection.id });\n }\n }\n },\n onSend: () => {\n //idleSent = true;\n }\n });\n\n // unset before response.next() if preCheck function is not already cleared (usually is)\n if (typeof connection.preCheck === 'function' && connection.preCheck === connectionPreCheck) {\n connection.log.trace({\n msg: 'Clearing pre-check function',\n lockId: connection.currentLock?.lockId,\n path: connection.mailbox && connection.mailbox.path,\n queued: preCheckWaitQueue.length,\n doneRequested,\n canEnd,\n doneSent\n });\n connection.preCheck = false;\n while (preCheckWaitQueue.length) {\n let { resolve } = preCheckWaitQueue.shift();\n resolve();\n }\n }\n\n response.next();\n return;\n } catch (err) {\n connection.preCheck = false;\n connection.idling = false;\n\n connection.log.warn({ err, cid: connection.id });\n while (preCheckWaitQueue.length) {\n let { reject } = preCheckWaitQueue.shift();\n reject(err);\n }\n return false;\n }\n}\n\n// Listens for changes in mailbox\nmodule.exports = async (connection, maxIdleTime) => {\n if (connection.state !== connection.states.SELECTED) {\n // nothing to do here\n return;\n }\n\n if (connection.capabilities.has('IDLE')) {\n let idleTimer;\n let stillIdling = false;\n let runIdleLoop = async () => {\n if (maxIdleTime) {\n idleTimer = setTimeout(() => {\n if (connection.idling) {\n if (typeof connection.preCheck === 'function') {\n stillIdling = true;\n // request IDLE break if IDLE has been running for allowed time\n connection.log.trace({ msg: 'Max allowed IDLE time reached', cid: connection.id });\n connection.preCheck().catch(err => connection.log.warn({ err, cid: connection.id }));\n }\n }\n }, maxIdleTime);\n }\n let resp = await runIdle(connection);\n clearTimeout(idleTimer);\n if (stillIdling) {\n stillIdling = false;\n return runIdleLoop();\n }\n return resp;\n };\n return runIdleLoop();\n }\n\n let idleTimer;\n return new Promise(resolve => {\n if (!connection.currentSelectCommand) {\n return resolve();\n }\n\n // no IDLE support, fallback to NOOP'ing\n connection.preCheck = async () => {\n connection.preCheck = false; // unset itself\n clearTimeout(idleTimer);\n connection.log.debug({ src: 'c', msg: `breaking NOOP loop` });\n connection.idling = false;\n resolve();\n };\n\n let selectCommand = connection.currentSelectCommand;\n\n let idleCheck = async () => {\n let response;\n switch (connection.missingIdleCommand) {\n case 'SELECT':\n // FIXME: somehow a loop occurs after some time of idling with SELECT\n connection.log.debug({ src: 'c', msg: `Running SELECT to detect changes in folder` });\n response = await connection.exec(selectCommand.command, selectCommand.arguments);\n break;\n\n case 'STATUS':\n {\n let statusArgs = [selectCommand.arguments[0], []]; // path\n for (let key of ['MESSAGES', 'UIDNEXT', 'UIDVALIDITY', 'UNSEEN']) {\n statusArgs[1].push({ type: 'ATOM', value: key.toUpperCase() });\n }\n connection.log.debug({ src: 'c', msg: `Running STATUS to detect changes in folder` });\n response = await connection.exec('STATUS', statusArgs);\n }\n break;\n\n case 'NOOP':\n default:\n response = await connection.exec('NOOP', false, { comment: 'IDLE not supported' });\n break;\n }\n response.next();\n };\n\n let noopInterval = maxIdleTime ? Math.min(NOOP_INTERVAL, maxIdleTime) : NOOP_INTERVAL;\n\n let runLoop = () => {\n idleCheck()\n .then(() => {\n clearTimeout(idleTimer);\n idleTimer = setTimeout(runLoop, noopInterval);\n })\n .catch(err => {\n clearTimeout(idleTimer);\n connection.preCheck = false;\n connection.log.warn({ err, cid: connection.id });\n resolve();\n });\n };\n\n connection.log.debug({ src: 'c', msg: `initiated NOOP loop` });\n connection.idling = true;\n runLoop();\n });\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFjdGlvbi1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9pbWFwZmxvdy9saWIvY29tbWFuZHMvaWRsZS5qcyIsIm1hcHBpbmdzIjoiQUFBYTs7QUFFYjs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTs7QUFFQTtBQUNBLDZDQUE2Qzs7QUFFN0M7QUFDQSwwQkFBMEIsVUFBVTtBQUNwQztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EseUNBQXlDLGlCQUFpQjtBQUMxRCxhQUFhOztBQUViO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhOztBQUViLDBEQUEwRCx5QkFBeUI7O0FBRW5GO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLHVDQUF1Qyx3R0FBd0c7QUFDL0k7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0I7QUFDdEIsOENBQThDLHlCQUF5QjtBQUN2RTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBLHNCQUFzQixVQUFVO0FBQ2hDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7O0FBRUEsOEJBQThCLHlCQUF5QjtBQUN2RDtBQUNBLGtCQUFrQixTQUFTO0FBQzNCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbURBQW1ELDBEQUEwRDtBQUM3RyxxRkFBcUYseUJBQXlCO0FBQzlHO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSx5Q0FBeUM7QUFDekM7QUFDQSxtQ0FBbUMscUNBQXFDO0FBQ3hFO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkNBQTJDLDZEQUE2RDtBQUN4RztBQUNBOztBQUVBO0FBQ0E7QUFDQSwyRUFBMkU7QUFDM0U7QUFDQSxpREFBaUQsd0NBQXdDO0FBQ3pGO0FBQ0EsK0NBQStDLDZEQUE2RDtBQUM1RztBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLHNFQUFzRSwrQkFBK0I7QUFDckc7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQSwwQ0FBMEMseUJBQXlCO0FBQ25FO0FBQ0EsaUJBQWlCO0FBQ2pCOztBQUVBLCtCQUErQixzQ0FBc0M7QUFDckU7QUFDQTtBQUNBLEtBQUs7QUFDTCIsInNvdXJjZXMiOlsiL2hvbWUvYWxtYS9uZXh0Z2VuL05lYWgtbWFpbC9ub2RlX21vZHVsZXMvaW1hcGZsb3cvbGliL2NvbW1hbmRzL2lkbGUuanMiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCBOT09QX0lOVEVSVkFMID0gMiAqIDYwICogMTAwMDtcblxuYXN5bmMgZnVuY3Rpb24gcnVuSWRsZShjb25uZWN0aW9uKSB7XG4gICAgbGV0IHJlc3BvbnNlO1xuXG4gICAgbGV0IHByZUNoZWNrV2FpdFF1ZXVlID0gW107XG4gICAgdHJ5IHtcbiAgICAgICAgY29ubmVjdGlvbi5pZGxpbmcgPSB0cnVlO1xuXG4gICAgICAgIC8vbGV0IGlkbGVTZW50ID0gZmFsc2U7XG4gICAgICAgIGxldCBkb25lUmVxdWVzdGVkID0gZmFsc2U7XG4gICAgICAgIGxldCBkb25lU2VudCA9IGZhbHNlO1xuICAgICAgICBsZXQgY2FuRW5kID0gZmFsc2U7XG5cbiAgICAgICAgbGV0IHByZUNoZWNrID0gYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgZG9uZVJlcXVlc3RlZCA9IHRydWU7XG4gICAgICAgICAgICBpZiAoY2FuRW5kICYmICFkb25lU2VudCkge1xuICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24ubG9nLmRlYnVnKHtcbiAgICAgICAgICAgICAgICAgICAgc3JjOiAnYycsXG4gICAgICAgICAgICAgICAgICAgIG1zZzogYERPTkVgLFxuICAgICAgICAgICAgICAgICAgICBjb21tZW50OiBgYnJlYWtpbmcgSURMRWAsXG4gICAgICAgICAgICAgICAgICAgIGxvY2tJZDogY29ubmVjdGlvbi5jdXJyZW50TG9jaz8ubG9ja0lkLFxuICAgICAgICAgICAgICAgICAgICBwYXRoOiBjb25uZWN0aW9uLm1haWxib3ggJiYgY29ubmVjdGlvbi5tYWlsYm94LnBhdGhcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBjb25uZWN0aW9uLndyaXRlKCdET05FJyk7XG4gICAgICAgICAgICAgICAgZG9uZVNlbnQgPSB0cnVlO1xuXG4gICAgICAgICAgICAgICAgY29ubmVjdGlvbi5pZGxpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBjb25uZWN0aW9uLnByZUNoZWNrID0gZmFsc2U7IC8vIHVuc2V0IGl0c2VsZlxuXG4gICAgICAgICAgICAgICAgd2hpbGUgKHByZUNoZWNrV2FpdFF1ZXVlLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgeyByZXNvbHZlIH0gPSBwcmVDaGVja1dhaXRRdWV1ZS5zaGlmdCgpO1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIGxldCBjb25uZWN0aW9uUHJlQ2hlY2sgPSAoKSA9PiB7XG4gICAgICAgICAgICBsZXQgaGFuZGxlciA9IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgICAgICBwcmVDaGVja1dhaXRRdWV1ZS5wdXNoKHsgcmVzb2x2ZSwgcmVqZWN0IH0pO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGNvbm5lY3Rpb24ubG9nLnRyYWNlKHtcbiAgICAgICAgICAgICAgICBtc2c6ICdSZXF1ZXN0aW5nIElETEUgYnJlYWsnLFxuICAgICAgICAgICAgICAgIGxvY2tJZDogY29ubmVjdGlvbi5jdXJyZW50TG9jaz8ubG9ja0lkLFxuICAgICAgICAgICAgICAgIHBhdGg6IGNvbm5lY3Rpb24ubWFpbGJveCAmJiBjb25uZWN0aW9uLm1haWxib3gucGF0aCxcbiAgICAgICAgICAgICAgICBxdWV1ZWQ6IHByZUNoZWNrV2FpdFF1ZXVlLmxlbmd0aCxcbiAgICAgICAgICAgICAgICBkb25lUmVxdWVzdGVkLFxuICAgICAgICAgICAgICAgIGNhbkVuZCxcbiAgICAgICAgICAgICAgICBkb25lU2VudFxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHByZUNoZWNrKCkuY2F0Y2goZXJyID0+IGNvbm5lY3Rpb24ubG9nLndhcm4oeyBlcnIsIGNpZDogY29ubmVjdGlvbi5pZCB9KSk7XG5cbiAgICAgICAgICAgIHJldHVybiBoYW5kbGVyO1xuICAgICAgICB9O1xuXG4gICAgICAgIGNvbm5lY3Rpb24ucHJlQ2hlY2sgPSBjb25uZWN0aW9uUHJlQ2hlY2s7XG5cbiAgICAgICAgcmVzcG9uc2UgPSBhd2FpdCBjb25uZWN0aW9uLmV4ZWMoJ0lETEUnLCBmYWxzZSwge1xuICAgICAgICAgICAgb25QbHVzVGFnOiBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29ubmVjdGlvbi5sb2cuZGVidWcoeyBtc2c6IGBJbml0aWF0ZWQgSURMRSwgd2FpdGluZyBmb3Igc2VydmVyIGlucHV0YCwgbG9ja0lkOiBjb25uZWN0aW9uLmN1cnJlbnRMb2NrPy5sb2NrSWQsIGRvbmVSZXF1ZXN0ZWQgfSk7XG4gICAgICAgICAgICAgICAgY2FuRW5kID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBpZiAoZG9uZVJlcXVlc3RlZCkge1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgcHJlQ2hlY2soKTtcbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uLmxvZy53YXJuKHsgZXJyLCBjaWQ6IGNvbm5lY3Rpb24uaWQgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgb25TZW5kOiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgLy9pZGxlU2VudCA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIHVuc2V0IGJlZm9yZSByZXNwb25zZS5uZXh0KCkgaWYgcHJlQ2hlY2sgZnVuY3Rpb24gaXMgbm90IGFscmVhZHkgY2xlYXJlZCAodXN1YWxseSBpcylcbiAgICAgICAgaWYgKHR5cGVvZiBjb25uZWN0aW9uLnByZUNoZWNrID09PSAnZnVuY3Rpb24nICYmIGNvbm5lY3Rpb24ucHJlQ2hlY2sgPT09IGNvbm5lY3Rpb25QcmVDaGVjaykge1xuICAgICAgICAgICAgY29ubmVjdGlvbi5sb2cudHJhY2Uoe1xuICAgICAgICAgICAgICAgIG1zZzogJ0NsZWFyaW5nIHByZS1jaGVjayBmdW5jdGlvbicsXG4gICAgICAgICAgICAgICAgbG9ja0lkOiBjb25uZWN0aW9uLmN1cnJlbnRMb2NrPy5sb2NrSWQsXG4gICAgICAgICAgICAgICAgcGF0aDogY29ubmVjdGlvbi5tYWlsYm94ICYmIGNvbm5lY3Rpb24ubWFpbGJveC5wYXRoLFxuICAgICAgICAgICAgICAgIHF1ZXVlZDogcHJlQ2hlY2tXYWl0UXVldWUubGVuZ3RoLFxuICAgICAgICAgICAgICAgIGRvbmVSZXF1ZXN0ZWQsXG4gICAgICAgICAgICAgICAgY2FuRW5kLFxuICAgICAgICAgICAgICAgIGRvbmVTZW50XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGNvbm5lY3Rpb24ucHJlQ2hlY2sgPSBmYWxzZTtcbiAgICAgICAgICAgIHdoaWxlIChwcmVDaGVja1dhaXRRdWV1ZS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBsZXQgeyByZXNvbHZlIH0gPSBwcmVDaGVja1dhaXRRdWV1ZS5zaGlmdCgpO1xuICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJlc3BvbnNlLm5leHQoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBjb25uZWN0aW9uLnByZUNoZWNrID0gZmFsc2U7XG4gICAgICAgIGNvbm5lY3Rpb24uaWRsaW5nID0gZmFsc2U7XG5cbiAgICAgICAgY29ubmVjdGlvbi5sb2cud2Fybih7IGVyciwgY2lkOiBjb25uZWN0aW9uLmlkIH0pO1xuICAgICAgICB3aGlsZSAocHJlQ2hlY2tXYWl0UXVldWUubGVuZ3RoKSB7XG4gICAgICAgICAgICBsZXQgeyByZWplY3QgfSA9IHByZUNoZWNrV2FpdFF1ZXVlLnNoaWZ0KCk7XG4gICAgICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxufVxuXG4vLyBMaXN0ZW5zIGZvciBjaGFuZ2VzIGluIG1haWxib3hcbm1vZHVsZS5leHBvcnRzID0gYXN5bmMgKGNvbm5lY3Rpb24sIG1heElkbGVUaW1lKSA9PiB7XG4gICAgaWYgKGNvbm5lY3Rpb24uc3RhdGUgIT09IGNvbm5lY3Rpb24uc3RhdGVzLlNFTEVDVEVEKSB7XG4gICAgICAgIC8vIG5vdGhpbmcgdG8gZG8gaGVyZVxuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGNvbm5lY3Rpb24uY2FwYWJpbGl0aWVzLmhhcygnSURMRScpKSB7XG4gICAgICAgIGxldCBpZGxlVGltZXI7XG4gICAgICAgIGxldCBzdGlsbElkbGluZyA9IGZhbHNlO1xuICAgICAgICBsZXQgcnVuSWRsZUxvb3AgPSBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBpZiAobWF4SWRsZVRpbWUpIHtcbiAgICAgICAgICAgICAgICBpZGxlVGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbm5lY3Rpb24uaWRsaW5nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGNvbm5lY3Rpb24ucHJlQ2hlY2sgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGlsbElkbGluZyA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVxdWVzdCBJRExFIGJyZWFrIGlmIElETEUgaGFzIGJlZW4gcnVubmluZyBmb3IgYWxsb3dlZCB0aW1lXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbi5sb2cudHJhY2UoeyBtc2c6ICdNYXggYWxsb3dlZCBJRExFIHRpbWUgcmVhY2hlZCcsIGNpZDogY29ubmVjdGlvbi5pZCB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uLnByZUNoZWNrKCkuY2F0Y2goZXJyID0+IGNvbm5lY3Rpb24ubG9nLndhcm4oeyBlcnIsIGNpZDogY29ubmVjdGlvbi5pZCB9KSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LCBtYXhJZGxlVGltZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgcmVzcCA9IGF3YWl0IHJ1bklkbGUoY29ubmVjdGlvbik7XG4gICAgICAgICAgICBjbGVhclRpbWVvdXQoaWRsZVRpbWVyKTtcbiAgICAgICAgICAgIGlmIChzdGlsbElkbGluZykge1xuICAgICAgICAgICAgICAgIHN0aWxsSWRsaW5nID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJ1bklkbGVMb29wKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmVzcDtcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIHJ1bklkbGVMb29wKCk7XG4gICAgfVxuXG4gICAgbGV0IGlkbGVUaW1lcjtcbiAgICByZXR1cm4gbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XG4gICAgICAgIGlmICghY29ubmVjdGlvbi5jdXJyZW50U2VsZWN0Q29tbWFuZCkge1xuICAgICAgICAgICAgcmV0dXJuIHJlc29sdmUoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIG5vIElETEUgc3VwcG9ydCwgZmFsbGJhY2sgdG8gTk9PUCdpbmdcbiAgICAgICAgY29ubmVjdGlvbi5wcmVDaGVjayA9IGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIGNvbm5lY3Rpb24ucHJlQ2hlY2sgPSBmYWxzZTsgLy8gdW5zZXQgaXRzZWxmXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQoaWRsZVRpbWVyKTtcbiAgICAgICAgICAgIGNvbm5lY3Rpb24ubG9nLmRlYnVnKHsgc3JjOiAnYycsIG1zZzogYGJyZWFraW5nIE5PT1AgbG9vcGAgfSk7XG4gICAgICAgICAgICBjb25uZWN0aW9uLmlkbGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICB9O1xuXG4gICAgICAgIGxldCBzZWxlY3RDb21tYW5kID0gY29ubmVjdGlvbi5jdXJyZW50U2VsZWN0Q29tbWFuZDtcblxuICAgICAgICBsZXQgaWRsZUNoZWNrID0gYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3BvbnNlO1xuICAgICAgICAgICAgc3dpdGNoIChjb25uZWN0aW9uLm1pc3NpbmdJZGxlQ29tbWFuZCkge1xuICAgICAgICAgICAgICAgIGNhc2UgJ1NFTEVDVCc6XG4gICAgICAgICAgICAgICAgICAgIC8vIEZJWE1FOiBzb21laG93IGEgbG9vcCBvY2N1cnMgYWZ0ZXIgc29tZSB0aW1lIG9mIGlkbGluZyB3aXRoIFNFTEVDVFxuICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uLmxvZy5kZWJ1Zyh7IHNyYzogJ2MnLCBtc2c6IGBSdW5uaW5nIFNFTEVDVCB0byBkZXRlY3QgY2hhbmdlcyBpbiBmb2xkZXJgIH0pO1xuICAgICAgICAgICAgICAgICAgICByZXNwb25zZSA9IGF3YWl0IGNvbm5lY3Rpb24uZXhlYyhzZWxlY3RDb21tYW5kLmNvbW1hbmQsIHNlbGVjdENvbW1hbmQuYXJndW1lbnRzKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgICBjYXNlICdTVEFUVVMnOlxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgc3RhdHVzQXJncyA9IFtzZWxlY3RDb21tYW5kLmFyZ3VtZW50c1swXSwgW11dOyAvLyBwYXRoXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBrZXkgb2YgWydNRVNTQUdFUycsICdVSURORVhUJywgJ1VJRFZBTElESVRZJywgJ1VOU0VFTiddKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzQXJnc1sxXS5wdXNoKHsgdHlwZTogJ0FUT00nLCB2YWx1ZToga2V5LnRvVXBwZXJDYXNlKCkgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uLmxvZy5kZWJ1Zyh7IHNyYzogJ2MnLCBtc2c6IGBSdW5uaW5nIFNUQVRVUyB0byBkZXRlY3QgY2hhbmdlcyBpbiBmb2xkZXJgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UgPSBhd2FpdCBjb25uZWN0aW9uLmV4ZWMoJ1NUQVRVUycsIHN0YXR1c0FyZ3MpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgY2FzZSAnTk9PUCc6XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UgPSBhd2FpdCBjb25uZWN0aW9uLmV4ZWMoJ05PT1AnLCBmYWxzZSwgeyBjb21tZW50OiAnSURMRSBub3Qgc3VwcG9ydGVkJyB9KTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXNwb25zZS5uZXh0KCk7XG4gICAgICAgIH07XG5cbiAgICAgICAgbGV0IG5vb3BJbnRlcnZhbCA9IG1heElkbGVUaW1lID8gTWF0aC5taW4oTk9PUF9JTlRFUlZBTCwgbWF4SWRsZVRpbWUpIDogTk9PUF9JTlRFUlZBTDtcblxuICAgICAgICBsZXQgcnVuTG9vcCA9ICgpID0+IHtcbiAgICAgICAgICAgIGlkbGVDaGVjaygpXG4gICAgICAgICAgICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQoaWRsZVRpbWVyKTtcbiAgICAgICAgICAgICAgICAgICAgaWRsZVRpbWVyID0gc2V0VGltZW91dChydW5Mb29wLCBub29wSW50ZXJ2YWwpO1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgLmNhdGNoKGVyciA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChpZGxlVGltZXIpO1xuICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uLnByZUNoZWNrID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24ubG9nLndhcm4oeyBlcnIsIGNpZDogY29ubmVjdGlvbi5pZCB9KTtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICB9O1xuXG4gICAgICAgIGNvbm5lY3Rpb24ubG9nLmRlYnVnKHsgc3JjOiAnYycsIG1zZzogYGluaXRpYXRlZCBOT09QIGxvb3BgIH0pO1xuICAgICAgICBjb25uZWN0aW9uLmlkbGluZyA9IHRydWU7XG4gICAgICAgIHJ1bkxvb3AoKTtcbiAgICB9KTtcbn07XG4iXSwibmFtZXMiOltdLCJpZ25vcmVMaXN0IjpbMF0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(action-browser)/./node_modules/imapflow/lib/commands/idle.js\n");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "(action-browser)/./node_modules/imapflow/lib/commands/list.js":
|
|
/*!****************************************************!*\
|
|
!*** ./node_modules/imapflow/lib/commands/list.js ***!
|
|
\****************************************************/
|
|
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
|
|
|
|
eval("\n\nconst { decodePath, encodePath, normalizePath } = __webpack_require__(/*! ../tools.js */ \"(action-browser)/./node_modules/imapflow/lib/tools.js\");\nconst { specialUse } = __webpack_require__(/*! ../special-use */ \"(action-browser)/./node_modules/imapflow/lib/special-use.js\");\n\n// Lists mailboxes from server\nmodule.exports = async (connection, reference, mailbox, options) => {\n options = options || {};\n\n const FLAG_SORT_ORDER = ['\\\\Inbox', '\\\\Flagged', '\\\\Sent', '\\\\Drafts', '\\\\All', '\\\\Archive', '\\\\Junk', '\\\\Trash'];\n const SOURCE_SORT_ORDER = ['user', 'extension', 'name'];\n\n let listCommand = connection.capabilities.has('XLIST') && !connection.capabilities.has('SPECIAL-USE') ? 'XLIST' : 'LIST';\n\n let response;\n try {\n let entries = [];\n\n let statusMap = new Map();\n let returnArgs = [];\n let statusQueryAttributes = [];\n\n if (options.statusQuery) {\n Object.keys(options.statusQuery || {}).forEach(key => {\n if (!options.statusQuery[key]) {\n return;\n }\n\n switch (key.toUpperCase()) {\n case 'MESSAGES':\n case 'RECENT':\n case 'UIDNEXT':\n case 'UIDVALIDITY':\n case 'UNSEEN':\n statusQueryAttributes.push({ type: 'ATOM', value: key.toUpperCase() });\n break;\n\n case 'HIGHESTMODSEQ':\n if (connection.capabilities.has('CONDSTORE')) {\n statusQueryAttributes.push({ type: 'ATOM', value: key.toUpperCase() });\n }\n break;\n }\n });\n }\n\n if (listCommand === 'LIST' && connection.capabilities.has('LIST-STATUS') && statusQueryAttributes.length) {\n returnArgs.push({ type: 'ATOM', value: 'STATUS' }, statusQueryAttributes);\n if (connection.capabilities.has('SPECIAL-USE')) {\n returnArgs.push({ type: 'ATOM', value: 'SPECIAL-USE' });\n }\n }\n\n let specialUseMatches = {};\n let addSpecialUseMatch = (entry, type, source) => {\n if (!specialUseMatches[type]) {\n specialUseMatches[type] = [];\n }\n specialUseMatches[type].push({ entry, source });\n };\n\n let specialUseHints = {};\n if (options.specialUseHints && typeof options.specialUseHints === 'object') {\n for (let type of Object.keys(options.specialUseHints)) {\n if (\n ['sent', 'junk', 'trash', 'drafts', 'archive'].includes(type) &&\n options.specialUseHints[type] &&\n typeof options.specialUseHints[type] === 'string'\n ) {\n specialUseHints[normalizePath(connection, options.specialUseHints[type])] = `\\\\${type.replace(/^./, c => c.toUpperCase())}`;\n }\n }\n }\n\n let runList = async (reference, mailbox) => {\n const cmdArgs = [encodePath(connection, reference), encodePath(connection, mailbox)];\n\n if (returnArgs.length) {\n cmdArgs.push({ type: 'ATOM', value: 'RETURN' }, returnArgs);\n }\n\n response = await connection.exec(listCommand, cmdArgs, {\n untagged: {\n [listCommand]: async untagged => {\n if (!untagged.attributes || !untagged.attributes.length) {\n return;\n }\n\n let entry = {\n path: normalizePath(connection, decodePath(connection, (untagged.attributes[2] && untagged.attributes[2].value) || '')),\n pathAsListed: (untagged.attributes[2] && untagged.attributes[2].value) || '',\n flags: new Set(untagged.attributes[0].map(entry => entry.value)),\n delimiter: untagged.attributes[1] && untagged.attributes[1].value,\n listed: true\n };\n\n if (specialUseHints[entry.path]) {\n addSpecialUseMatch(entry, specialUseHints[entry.path], 'user');\n }\n\n if (listCommand === 'XLIST' && entry.flags.has('\\\\Inbox')) {\n // XLIST specific flag, ignore\n entry.flags.delete('\\\\Inbox');\n if (entry.path !== 'INBOX') {\n // XLIST may use localised inbox name\n addSpecialUseMatch(entry, '\\\\Inbox', 'extension');\n }\n }\n\n if (entry.path.toUpperCase() === 'INBOX') {\n addSpecialUseMatch(entry, '\\\\Inbox', 'name');\n }\n\n if (entry.delimiter && entry.path.charAt(0) === entry.delimiter) {\n entry.path = entry.path.slice(1);\n }\n\n entry.parentPath = entry.delimiter && entry.path ? entry.path.substr(0, entry.path.lastIndexOf(entry.delimiter)) : '';\n entry.parent = entry.delimiter ? entry.path.split(entry.delimiter) : [entry.path];\n entry.name = entry.parent.pop();\n\n let { flag: specialUseFlag, source: flagSource } = specialUse(\n connection.capabilities.has('XLIST') || connection.capabilities.has('SPECIAL-USE'),\n entry\n );\n\n if (specialUseFlag) {\n addSpecialUseMatch(entry, specialUseFlag, flagSource);\n }\n\n entries.push(entry);\n },\n\n STATUS: async untagged => {\n let statusPath = normalizePath(connection, decodePath(connection, (untagged.attributes[0] && untagged.attributes[0].value) || ''));\n let statusList = untagged.attributes && Array.isArray(untagged.attributes[1]) ? untagged.attributes[1] : false;\n if (!statusList || !statusPath) {\n return;\n }\n\n let key;\n\n let map = { path: statusPath };\n\n statusList.forEach((entry, i) => {\n if (i % 2 === 0) {\n key = entry && typeof entry.value === 'string' ? entry.value : false;\n return;\n }\n if (!key || !entry || typeof entry.value !== 'string') {\n return;\n }\n let value = false;\n switch (key.toUpperCase()) {\n case 'MESSAGES':\n key = 'messages';\n value = !isNaN(entry.value) ? Number(entry.value) : false;\n break;\n\n case 'RECENT':\n key = 'recent';\n value = !isNaN(entry.value) ? Number(entry.value) : false;\n break;\n\n case 'UIDNEXT':\n key = 'uidNext';\n value = !isNaN(entry.value) ? Number(entry.value) : false;\n break;\n\n case 'UIDVALIDITY':\n key = 'uidValidity';\n value = !isNaN(entry.value) ? BigInt(entry.value) : false;\n break;\n\n case 'UNSEEN':\n key = 'unseen';\n value = !isNaN(entry.value) ? Number(entry.value) : false;\n break;\n\n case 'HIGHESTMODSEQ':\n key = 'highestModseq';\n value = !isNaN(entry.value) ? BigInt(entry.value) : false;\n break;\n }\n if (value === false) {\n return;\n }\n\n map[key] = value;\n });\n\n statusMap.set(statusPath, map);\n }\n }\n });\n response.next();\n };\n\n let normalizedReference = normalizePath(connection, reference || '');\n await runList(normalizedReference, normalizePath(connection, mailbox || '', true));\n\n if (options.listOnly) {\n return entries;\n }\n\n if (normalizedReference && !specialUseMatches['\\\\Inbox']) {\n // INBOX was most probably not included in the listing if namespace was used\n await runList('', 'INBOX');\n }\n\n if (options.statusQuery) {\n for (let entry of entries) {\n if (!entry.flags.has('\\\\Noselect') && !entry.flags.has('\\\\NonExistent')) {\n if (statusMap.has(entry.path)) {\n entry.status = statusMap.get(entry.path);\n } else if (!statusMap.size) {\n // run STATUS command\n try {\n entry.status = await connection.run('STATUS', entry.path, options.statusQuery);\n } catch (err) {\n entry.status = { error: err };\n }\n }\n }\n }\n }\n\n response = await connection.exec(\n 'LSUB',\n [encodePath(connection, normalizePath(connection, reference || '')), encodePath(connection, normalizePath(connection, mailbox || '', true))],\n {\n untagged: {\n LSUB: async untagged => {\n if (!untagged.attributes || !untagged.attributes.length) {\n return;\n }\n\n let entry = {\n path: normalizePath(connection, decodePath(connection, (untagged.attributes[2] && untagged.attributes[2].value) || '')),\n pathAsListed: (untagged.attributes[2] && untagged.attributes[2].value) || '',\n flags: new Set(untagged.attributes[0].map(entry => entry.value)),\n delimiter: untagged.attributes[1] && untagged.attributes[1].value,\n subscribed: true\n };\n\n if (entry.path.toUpperCase() === 'INBOX') {\n addSpecialUseMatch(entry, '\\\\Inbox', 'name');\n }\n\n if (entry.delimiter && entry.path.charAt(0) === entry.delimiter) {\n entry.path = entry.path.slice(1);\n }\n\n entry.parentPath = entry.delimiter && entry.path ? entry.path.substr(0, entry.path.lastIndexOf(entry.delimiter)) : '';\n entry.parent = entry.delimiter ? entry.path.split(entry.delimiter) : [entry.path];\n entry.name = entry.parent.pop();\n\n let existing = entries.find(existing => existing.path === entry.path);\n if (existing) {\n existing.subscribed = true;\n entry.flags.forEach(flag => existing.flags.add(flag));\n } else {\n // ignore non-listed folders\n /*\n let specialUseFlag = specialUse(connection.capabilities.has('XLIST') || connection.capabilities.has('SPECIAL-USE'), entry);\n if (specialUseFlag && !flagsSeen.has(specialUseFlag)) {\n entry.specialUse = specialUseFlag;\n }\n entries.push(entry);\n */\n }\n }\n }\n }\n );\n response.next();\n\n for (let type of Object.keys(specialUseMatches)) {\n let sortedEntries = specialUseMatches[type].sort((a, b) => {\n let aSource = SOURCE_SORT_ORDER.indexOf(a.source);\n let bSource = SOURCE_SORT_ORDER.indexOf(b.source);\n if (aSource === bSource) {\n return a.entry.path.localeCompare(b.entry.path);\n }\n return aSource - bSource;\n });\n\n if (!sortedEntries[0].entry.specialUse) {\n sortedEntries[0].entry.specialUse = type;\n sortedEntries[0].entry.specialUseSource = sortedEntries[0].source;\n }\n }\n\n let inboxEntry = entries.find(entry => entry.specialUse === '\\\\Inbox');\n if (inboxEntry && !inboxEntry.subscribed) {\n // override server settings and make INBOX always as subscribed\n inboxEntry.subscribed = true;\n }\n\n return entries.sort((a, b) => {\n if (a.specialUse && !b.specialUse) {\n return -1;\n }\n if (!a.specialUse && b.specialUse) {\n return 1;\n }\n if (a.specialUse && b.specialUse) {\n return FLAG_SORT_ORDER.indexOf(a.specialUse) - FLAG_SORT_ORDER.indexOf(b.specialUse);\n }\n\n let aList = [].concat(a.parent).concat(a.name);\n let bList = [].concat(b.parent).concat(b.name);\n\n for (let i = 0; i < aList.length; i++) {\n let aPart = aList[i];\n let bPart = bList[i];\n if (aPart !== bPart) {\n return aPart.localeCompare(bPart || '');\n }\n }\n\n return a.path.localeCompare(b.path);\n });\n } catch (err) {\n connection.log.warn({ msg: 'Failed to list folders', err, cid: connection.id });\n throw err;\n }\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFjdGlvbi1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9pbWFwZmxvdy9saWIvY29tbWFuZHMvbGlzdC5qcyIsIm1hcHBpbmdzIjoiQUFBYTs7QUFFYixRQUFRLHdDQUF3QyxFQUFFLG1CQUFPLENBQUMsMEVBQWE7QUFDdkUsUUFBUSxhQUFhLEVBQUUsbUJBQU8sQ0FBQyxtRkFBZ0I7O0FBRS9DO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxpREFBaUQ7QUFDakQ7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFEQUFxRCx3Q0FBd0M7QUFDN0Y7O0FBRUE7QUFDQTtBQUNBLHlEQUF5RCx3Q0FBd0M7QUFDakc7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiOztBQUVBO0FBQ0EsOEJBQThCLCtCQUErQjtBQUM3RDtBQUNBLGtDQUFrQyxvQ0FBb0M7QUFDdEU7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkNBQTJDLGVBQWU7QUFDMUQ7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFHQUFxRyx5Q0FBeUM7QUFDOUk7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSwrQkFBK0IsK0JBQStCO0FBQzlEOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSw4QkFBOEIsMkNBQTJDO0FBQ3pFO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxxQkFBcUI7O0FBRXJCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQSxvQ0FBb0M7O0FBRXBDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLHlCQUF5Qjs7QUFFekI7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQjtBQUN0QjtBQUNBO0FBQ0E7QUFDQSwwQkFBMEI7QUFDMUIsNkNBQTZDO0FBQzdDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMEJBQTBCO0FBQzFCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7O0FBRWI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUEsNEJBQTRCLGtCQUFrQjtBQUM5QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxTQUFTO0FBQ1QsTUFBTTtBQUNOLDhCQUE4Qix3REFBd0Q7QUFDdEY7QUFDQTtBQUNBIiwic291cmNlcyI6WyIvaG9tZS9hbG1hL25leHRnZW4vTmVhaC1tYWlsL25vZGVfbW9kdWxlcy9pbWFwZmxvdy9saWIvY29tbWFuZHMvbGlzdC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbmNvbnN0IHsgZGVjb2RlUGF0aCwgZW5jb2RlUGF0aCwgbm9ybWFsaXplUGF0aCB9ID0gcmVxdWlyZSgnLi4vdG9vbHMuanMnKTtcbmNvbnN0IHsgc3BlY2lhbFVzZSB9ID0gcmVxdWlyZSgnLi4vc3BlY2lhbC11c2UnKTtcblxuLy8gTGlzdHMgbWFpbGJveGVzIGZyb20gc2VydmVyXG5tb2R1bGUuZXhwb3J0cyA9IGFzeW5jIChjb25uZWN0aW9uLCByZWZlcmVuY2UsIG1haWxib3gsIG9wdGlvbnMpID0+IHtcbiAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcblxuICAgIGNvbnN0IEZMQUdfU09SVF9PUkRFUiA9IFsnXFxcXEluYm94JywgJ1xcXFxGbGFnZ2VkJywgJ1xcXFxTZW50JywgJ1xcXFxEcmFmdHMnLCAnXFxcXEFsbCcsICdcXFxcQXJjaGl2ZScsICdcXFxcSnVuaycsICdcXFxcVHJhc2gnXTtcbiAgICBjb25zdCBTT1VSQ0VfU09SVF9PUkRFUiA9IFsndXNlcicsICdleHRlbnNpb24nLCAnbmFtZSddO1xuXG4gICAgbGV0IGxpc3RDb21tYW5kID0gY29ubmVjdGlvbi5jYXBhYmlsaXRpZXMuaGFzKCdYTElTVCcpICYmICFjb25uZWN0aW9uLmNhcGFiaWxpdGllcy5oYXMoJ1NQRUNJQUwtVVNFJykgPyAnWExJU1QnIDogJ0xJU1QnO1xuXG4gICAgbGV0IHJlc3BvbnNlO1xuICAgIHRyeSB7XG4gICAgICAgIGxldCBlbnRyaWVzID0gW107XG5cbiAgICAgICAgbGV0IHN0YXR1c01hcCA9IG5ldyBNYXAoKTtcbiAgICAgICAgbGV0IHJldHVybkFyZ3MgPSBbXTtcbiAgICAgICAgbGV0IHN0YXR1c1F1ZXJ5QXR0cmlidXRlcyA9IFtdO1xuXG4gICAgICAgIGlmIChvcHRpb25zLnN0YXR1c1F1ZXJ5KSB7XG4gICAgICAgICAgICBPYmplY3Qua2V5cyhvcHRpb25zLnN0YXR1c1F1ZXJ5IHx8IHt9KS5mb3JFYWNoKGtleSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCFvcHRpb25zLnN0YXR1c1F1ZXJ5W2tleV0pIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHN3aXRjaCAoa2V5LnRvVXBwZXJDYXNlKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnTUVTU0FHRVMnOlxuICAgICAgICAgICAgICAgICAgICBjYXNlICdSRUNFTlQnOlxuICAgICAgICAgICAgICAgICAgICBjYXNlICdVSURORVhUJzpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnVUlEVkFMSURJVFknOlxuICAgICAgICAgICAgICAgICAgICBjYXNlICdVTlNFRU4nOlxuICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzUXVlcnlBdHRyaWJ1dGVzLnB1c2goeyB0eXBlOiAnQVRPTScsIHZhbHVlOiBrZXkudG9VcHBlckNhc2UoKSB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ0hJR0hFU1RNT0RTRVEnOlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbm5lY3Rpb24uY2FwYWJpbGl0aWVzLmhhcygnQ09ORFNUT1JFJykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXNRdWVyeUF0dHJpYnV0ZXMucHVzaCh7IHR5cGU6ICdBVE9NJywgdmFsdWU6IGtleS50b1VwcGVyQ2FzZSgpIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobGlzdENvbW1hbmQgPT09ICdMSVNUJyAmJiBjb25uZWN0aW9uLmNhcGFiaWxpdGllcy5oYXMoJ0xJU1QtU1RBVFVTJykgJiYgc3RhdHVzUXVlcnlBdHRyaWJ1dGVzLmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuQXJncy5wdXNoKHsgdHlwZTogJ0FUT00nLCB2YWx1ZTogJ1NUQVRVUycgfSwgc3RhdHVzUXVlcnlBdHRyaWJ1dGVzKTtcbiAgICAgICAgICAgIGlmIChjb25uZWN0aW9uLmNhcGFiaWxpdGllcy5oYXMoJ1NQRUNJQUwtVVNFJykpIHtcbiAgICAgICAgICAgICAgICByZXR1cm5BcmdzLnB1c2goeyB0eXBlOiAnQVRPTScsIHZhbHVlOiAnU1BFQ0lBTC1VU0UnIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHNwZWNpYWxVc2VNYXRjaGVzID0ge307XG4gICAgICAgIGxldCBhZGRTcGVjaWFsVXNlTWF0Y2ggPSAoZW50cnksIHR5cGUsIHNvdXJjZSkgPT4ge1xuICAgICAgICAgICAgaWYgKCFzcGVjaWFsVXNlTWF0Y2hlc1t0eXBlXSkge1xuICAgICAgICAgICAgICAgIHNwZWNpYWxVc2VNYXRjaGVzW3R5cGVdID0gW107XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzcGVjaWFsVXNlTWF0Y2hlc1t0eXBlXS5wdXNoKHsgZW50cnksIHNvdXJjZSB9KTtcbiAgICAgICAgfTtcblxuICAgICAgICBsZXQgc3BlY2lhbFVzZUhpbnRzID0ge307XG4gICAgICAgIGlmIChvcHRpb25zLnNwZWNpYWxVc2VIaW50cyAmJiB0eXBlb2Ygb3B0aW9ucy5zcGVjaWFsVXNlSGludHMgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICBmb3IgKGxldCB0eXBlIG9mIE9iamVjdC5rZXlzKG9wdGlvbnMuc3BlY2lhbFVzZUhpbnRzKSkge1xuICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgWydzZW50JywgJ2p1bmsnLCAndHJhc2gnLCAnZHJhZnRzJywgJ2FyY2hpdmUnXS5pbmNsdWRlcyh0eXBlKSAmJlxuICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnNwZWNpYWxVc2VIaW50c1t0eXBlXSAmJlxuICAgICAgICAgICAgICAgICAgICB0eXBlb2Ygb3B0aW9ucy5zcGVjaWFsVXNlSGludHNbdHlwZV0gPT09ICdzdHJpbmcnXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIHNwZWNpYWxVc2VIaW50c1tub3JtYWxpemVQYXRoKGNvbm5lY3Rpb24sIG9wdGlvbnMuc3BlY2lhbFVzZUhpbnRzW3R5cGVdKV0gPSBgXFxcXCR7dHlwZS5yZXBsYWNlKC9eLi8sIGMgPT4gYy50b1VwcGVyQ2FzZSgpKX1gO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBydW5MaXN0ID0gYXN5bmMgKHJlZmVyZW5jZSwgbWFpbGJveCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgY21kQXJncyA9IFtlbmNvZGVQYXRoKGNvbm5lY3Rpb24sIHJlZmVyZW5jZSksIGVuY29kZVBhdGgoY29ubmVjdGlvbiwgbWFpbGJveCldO1xuXG4gICAgICAgICAgICBpZiAocmV0dXJuQXJncy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBjbWRBcmdzLnB1c2goeyB0eXBlOiAnQVRPTScsIHZhbHVlOiAnUkVUVVJOJyB9LCByZXR1cm5BcmdzKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmVzcG9uc2UgPSBhd2FpdCBjb25uZWN0aW9uLmV4ZWMobGlzdENvbW1hbmQsIGNtZEFyZ3MsIHtcbiAgICAgICAgICAgICAgICB1bnRhZ2dlZDoge1xuICAgICAgICAgICAgICAgICAgICBbbGlzdENvbW1hbmRdOiBhc3luYyB1bnRhZ2dlZCA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXVudGFnZ2VkLmF0dHJpYnV0ZXMgfHwgIXVudGFnZ2VkLmF0dHJpYnV0ZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgZW50cnkgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aDogbm9ybWFsaXplUGF0aChjb25uZWN0aW9uLCBkZWNvZGVQYXRoKGNvbm5lY3Rpb24sICh1bnRhZ2dlZC5hdHRyaWJ1dGVzWzJdICYmIHVudGFnZ2VkLmF0dHJpYnV0ZXNbMl0udmFsdWUpIHx8ICcnKSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aEFzTGlzdGVkOiAodW50YWdnZWQuYXR0cmlidXRlc1syXSAmJiB1bnRhZ2dlZC5hdHRyaWJ1dGVzWzJdLnZhbHVlKSB8fCAnJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFnczogbmV3IFNldCh1bnRhZ2dlZC5hdHRyaWJ1dGVzWzBdLm1hcChlbnRyeSA9PiBlbnRyeS52YWx1ZSkpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGltaXRlcjogdW50YWdnZWQuYXR0cmlidXRlc1sxXSAmJiB1bnRhZ2dlZC5hdHRyaWJ1dGVzWzFdLnZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RlZDogdHJ1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNwZWNpYWxVc2VIaW50c1tlbnRyeS5wYXRoXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZFNwZWNpYWxVc2VNYXRjaChlbnRyeSwgc3BlY2lhbFVzZUhpbnRzW2VudHJ5LnBhdGhdLCAndXNlcicpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobGlzdENvbW1hbmQgPT09ICdYTElTVCcgJiYgZW50cnkuZmxhZ3MuaGFzKCdcXFxcSW5ib3gnKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFhMSVNUIHNwZWNpZmljIGZsYWcsIGlnbm9yZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5LmZsYWdzLmRlbGV0ZSgnXFxcXEluYm94Jyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVudHJ5LnBhdGggIT09ICdJTkJPWCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gWExJU1QgbWF5IHVzZSBsb2NhbGlzZWQgaW5ib3ggbmFtZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRTcGVjaWFsVXNlTWF0Y2goZW50cnksICdcXFxcSW5ib3gnLCAnZXh0ZW5zaW9uJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZW50cnkucGF0aC50b1VwcGVyQ2FzZSgpID09PSAnSU5CT1gnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkU3BlY2lhbFVzZU1hdGNoKGVudHJ5LCAnXFxcXEluYm94JywgJ25hbWUnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVudHJ5LmRlbGltaXRlciAmJiBlbnRyeS5wYXRoLmNoYXJBdCgwKSA9PT0gZW50cnkuZGVsaW1pdGVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cnkucGF0aCA9IGVudHJ5LnBhdGguc2xpY2UoMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5LnBhcmVudFBhdGggPSBlbnRyeS5kZWxpbWl0ZXIgJiYgZW50cnkucGF0aCA/IGVudHJ5LnBhdGguc3Vic3RyKDAsIGVudHJ5LnBhdGgubGFzdEluZGV4T2YoZW50cnkuZGVsaW1pdGVyKSkgOiAnJztcbiAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5LnBhcmVudCA9IGVudHJ5LmRlbGltaXRlciA/IGVudHJ5LnBhdGguc3BsaXQoZW50cnkuZGVsaW1pdGVyKSA6IFtlbnRyeS5wYXRoXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5Lm5hbWUgPSBlbnRyeS5wYXJlbnQucG9wKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB7IGZsYWc6IHNwZWNpYWxVc2VGbGFnLCBzb3VyY2U6IGZsYWdTb3VyY2UgfSA9IHNwZWNpYWxVc2UoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbi5jYXBhYmlsaXRpZXMuaGFzKCdYTElTVCcpIHx8IGNvbm5lY3Rpb24uY2FwYWJpbGl0aWVzLmhhcygnU1BFQ0lBTC1VU0UnKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeVxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNwZWNpYWxVc2VGbGFnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkU3BlY2lhbFVzZU1hdGNoKGVudHJ5LCBzcGVjaWFsVXNlRmxhZywgZmxhZ1NvdXJjZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGVudHJpZXMucHVzaChlbnRyeSk7XG4gICAgICAgICAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgICAgICAgICAgU1RBVFVTOiBhc3luYyB1bnRhZ2dlZCA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgc3RhdHVzUGF0aCA9IG5vcm1hbGl6ZVBhdGgoY29ubmVjdGlvbiwgZGVjb2RlUGF0aChjb25uZWN0aW9uLCAodW50YWdnZWQuYXR0cmlidXRlc1swXSAmJiB1bnRhZ2dlZC5hdHRyaWJ1dGVzWzBdLnZhbHVlKSB8fCAnJykpO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHN0YXR1c0xpc3QgPSB1bnRhZ2dlZC5hdHRyaWJ1dGVzICYmIEFycmF5LmlzQXJyYXkodW50YWdnZWQuYXR0cmlidXRlc1sxXSkgPyB1bnRhZ2dlZC5hdHRyaWJ1dGVzWzFdIDogZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXN0YXR1c0xpc3QgfHwgIXN0YXR1c1BhdGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBrZXk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBtYXAgPSB7IHBhdGg6IHN0YXR1c1BhdGggfTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzTGlzdC5mb3JFYWNoKChlbnRyeSwgaSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpICUgMiA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXkgPSBlbnRyeSAmJiB0eXBlb2YgZW50cnkudmFsdWUgPT09ICdzdHJpbmcnID8gZW50cnkudmFsdWUgOiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWtleSB8fCAhZW50cnkgfHwgdHlwZW9mIGVudHJ5LnZhbHVlICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB2YWx1ZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoa2V5LnRvVXBwZXJDYXNlKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnTUVTU0FHRVMnOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5ID0gJ21lc3NhZ2VzJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gIWlzTmFOKGVudHJ5LnZhbHVlKSA/IE51bWJlcihlbnRyeS52YWx1ZSkgOiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ1JFQ0VOVCc6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXkgPSAncmVjZW50JztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gIWlzTmFOKGVudHJ5LnZhbHVlKSA/IE51bWJlcihlbnRyeS52YWx1ZSkgOiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ1VJRE5FWFQnOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5ID0gJ3VpZE5leHQnO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSAhaXNOYU4oZW50cnkudmFsdWUpID8gTnVtYmVyKGVudHJ5LnZhbHVlKSA6IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnVUlEVkFMSURJVFknOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5ID0gJ3VpZFZhbGlkaXR5JztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gIWlzTmFOKGVudHJ5LnZhbHVlKSA/IEJpZ0ludChlbnRyeS52YWx1ZSkgOiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ1VOU0VFTic6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXkgPSAndW5zZWVuJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gIWlzTmFOKGVudHJ5LnZhbHVlKSA/IE51bWJlcihlbnRyeS52YWx1ZSkgOiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ0hJR0hFU1RNT0RTRVEnOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5ID0gJ2hpZ2hlc3RNb2RzZXEnO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSAhaXNOYU4oZW50cnkudmFsdWUpID8gQmlnSW50KGVudHJ5LnZhbHVlKSA6IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcFtrZXldID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzTWFwLnNldChzdGF0dXNQYXRoLCBtYXApO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXNwb25zZS5uZXh0KCk7XG4gICAgICAgIH07XG5cbiAgICAgICAgbGV0IG5vcm1hbGl6ZWRSZWZlcmVuY2UgPSBub3JtYWxpemVQYXRoKGNvbm5lY3Rpb24sIHJlZmVyZW5jZSB8fCAnJyk7XG4gICAgICAgIGF3YWl0IHJ1bkxpc3Qobm9ybWFsaXplZFJlZmVyZW5jZSwgbm9ybWFsaXplUGF0aChjb25uZWN0aW9uLCBtYWlsYm94IHx8ICcnLCB0cnVlKSk7XG5cbiAgICAgICAgaWYgKG9wdGlvbnMubGlzdE9ubHkpIHtcbiAgICAgICAgICAgIHJldHVybiBlbnRyaWVzO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG5vcm1hbGl6ZWRSZWZlcmVuY2UgJiYgIXNwZWNpYWxVc2VNYXRjaGVzWydcXFxcSW5ib3gnXSkge1xuICAgICAgICAgICAgLy8gSU5CT1ggd2FzIG1vc3QgcHJvYmFibHkgbm90IGluY2x1ZGVkIGluIHRoZSBsaXN0aW5nIGlmIG5hbWVzcGFjZSB3YXMgdXNlZFxuICAgICAgICAgICAgYXdhaXQgcnVuTGlzdCgnJywgJ0lOQk9YJyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAob3B0aW9ucy5zdGF0dXNRdWVyeSkge1xuICAgICAgICAgICAgZm9yIChsZXQgZW50cnkgb2YgZW50cmllcykge1xuICAgICAgICAgICAgICAgIGlmICghZW50cnkuZmxhZ3MuaGFzKCdcXFxcTm9zZWxlY3QnKSAmJiAhZW50cnkuZmxhZ3MuaGFzKCdcXFxcTm9uRXhpc3RlbnQnKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzTWFwLmhhcyhlbnRyeS5wYXRoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZW50cnkuc3RhdHVzID0gc3RhdHVzTWFwLmdldChlbnRyeS5wYXRoKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghc3RhdHVzTWFwLnNpemUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJ1biBTVEFUVVMgY29tbWFuZFxuICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeS5zdGF0dXMgPSBhd2FpdCBjb25uZWN0aW9uLnJ1bignU1RBVFVTJywgZW50cnkucGF0aCwgb3B0aW9ucy5zdGF0dXNRdWVyeSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeS5zdGF0dXMgPSB7IGVycm9yOiBlcnIgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJlc3BvbnNlID0gYXdhaXQgY29ubmVjdGlvbi5leGVjKFxuICAgICAgICAgICAgJ0xTVUInLFxuICAgICAgICAgICAgW2VuY29kZVBhdGgoY29ubmVjdGlvbiwgbm9ybWFsaXplUGF0aChjb25uZWN0aW9uLCByZWZlcmVuY2UgfHwgJycpKSwgZW5jb2RlUGF0aChjb25uZWN0aW9uLCBub3JtYWxpemVQYXRoKGNvbm5lY3Rpb24sIG1haWxib3ggfHwgJycsIHRydWUpKV0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdW50YWdnZWQ6IHtcbiAgICAgICAgICAgICAgICAgICAgTFNVQjogYXN5bmMgdW50YWdnZWQgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF1bnRhZ2dlZC5hdHRyaWJ1dGVzIHx8ICF1bnRhZ2dlZC5hdHRyaWJ1dGVzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGVudHJ5ID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGg6IG5vcm1hbGl6ZVBhdGgoY29ubmVjdGlvbiwgZGVjb2RlUGF0aChjb25uZWN0aW9uLCAodW50YWdnZWQuYXR0cmlidXRlc1syXSAmJiB1bnRhZ2dlZC5hdHRyaWJ1dGVzWzJdLnZhbHVlKSB8fCAnJykpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGhBc0xpc3RlZDogKHVudGFnZ2VkLmF0dHJpYnV0ZXNbMl0gJiYgdW50YWdnZWQuYXR0cmlidXRlc1syXS52YWx1ZSkgfHwgJycsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3M6IG5ldyBTZXQodW50YWdnZWQuYXR0cmlidXRlc1swXS5tYXAoZW50cnkgPT4gZW50cnkudmFsdWUpKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxpbWl0ZXI6IHVudGFnZ2VkLmF0dHJpYnV0ZXNbMV0gJiYgdW50YWdnZWQuYXR0cmlidXRlc1sxXS52YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJzY3JpYmVkOiB0cnVlXG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZW50cnkucGF0aC50b1VwcGVyQ2FzZSgpID09PSAnSU5CT1gnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkU3BlY2lhbFVzZU1hdGNoKGVudHJ5LCAnXFxcXEluYm94JywgJ25hbWUnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVudHJ5LmRlbGltaXRlciAmJiBlbnRyeS5wYXRoLmNoYXJBdCgwKSA9PT0gZW50cnkuZGVsaW1pdGVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cnkucGF0aCA9IGVudHJ5LnBhdGguc2xpY2UoMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5LnBhcmVudFBhdGggPSBlbnRyeS5kZWxpbWl0ZXIgJiYgZW50cnkucGF0aCA/IGVudHJ5LnBhdGguc3Vic3RyKDAsIGVudHJ5LnBhdGgubGFzdEluZGV4T2YoZW50cnkuZGVsaW1pdGVyKSkgOiAnJztcbiAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5LnBhcmVudCA9IGVudHJ5LmRlbGltaXRlciA/IGVudHJ5LnBhdGguc3BsaXQoZW50cnkuZGVsaW1pdGVyKSA6IFtlbnRyeS5wYXRoXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5Lm5hbWUgPSBlbnRyeS5wYXJlbnQucG9wKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBleGlzdGluZyA9IGVudHJpZXMuZmluZChleGlzdGluZyA9PiBleGlzdGluZy5wYXRoID09PSBlbnRyeS5wYXRoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChleGlzdGluZykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nLnN1YnNjcmliZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5LmZsYWdzLmZvckVhY2goZmxhZyA9PiBleGlzdGluZy5mbGFncy5hZGQoZmxhZykpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmUgbm9uLWxpc3RlZCBmb2xkZXJzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLypcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgc3BlY2lhbFVzZUZsYWcgPSBzcGVjaWFsVXNlKGNvbm5lY3Rpb24uY2FwYWJpbGl0aWVzLmhhcygnWExJU1QnKSB8fCBjb25uZWN0aW9uLmNhcGFiaWxpdGllcy5oYXMoJ1NQRUNJQUwtVVNFJyksIGVudHJ5KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3BlY2lhbFVzZUZsYWcgJiYgIWZsYWdzU2Vlbi5oYXMoc3BlY2lhbFVzZUZsYWcpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5LnNwZWNpYWxVc2UgPSBzcGVjaWFsVXNlRmxhZztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cmllcy5wdXNoKGVudHJ5KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICApO1xuICAgICAgICByZXNwb25zZS5uZXh0KCk7XG5cbiAgICAgICAgZm9yIChsZXQgdHlwZSBvZiBPYmplY3Qua2V5cyhzcGVjaWFsVXNlTWF0Y2hlcykpIHtcbiAgICAgICAgICAgIGxldCBzb3J0ZWRFbnRyaWVzID0gc3BlY2lhbFVzZU1hdGNoZXNbdHlwZV0uc29ydCgoYSwgYikgPT4ge1xuICAgICAgICAgICAgICAgIGxldCBhU291cmNlID0gU09VUkNFX1NPUlRfT1JERVIuaW5kZXhPZihhLnNvdXJjZSk7XG4gICAgICAgICAgICAgICAgbGV0IGJTb3VyY2UgPSBTT1VSQ0VfU09SVF9PUkRFUi5pbmRleE9mKGIuc291cmNlKTtcbiAgICAgICAgICAgICAgICBpZiAoYVNvdXJjZSA9PT0gYlNvdXJjZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYS5lbnRyeS5wYXRoLmxvY2FsZUNvbXBhcmUoYi5lbnRyeS5wYXRoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGFTb3VyY2UgLSBiU291cmNlO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGlmICghc29ydGVkRW50cmllc1swXS5lbnRyeS5zcGVjaWFsVXNlKSB7XG4gICAgICAgICAgICAgICAgc29ydGVkRW50cmllc1swXS5lbnRyeS5zcGVjaWFsVXNlID0gdHlwZTtcbiAgICAgICAgICAgICAgICBzb3J0ZWRFbnRyaWVzWzBdLmVudHJ5LnNwZWNpYWxVc2VTb3VyY2UgPSBzb3J0ZWRFbnRyaWVzWzBdLnNvdXJjZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBpbmJveEVudHJ5ID0gZW50cmllcy5maW5kKGVudHJ5ID0+IGVudHJ5LnNwZWNpYWxVc2UgPT09ICdcXFxcSW5ib3gnKTtcbiAgICAgICAgaWYgKGluYm94RW50cnkgJiYgIWluYm94RW50cnkuc3Vic2NyaWJlZCkge1xuICAgICAgICAgICAgLy8gb3ZlcnJpZGUgc2VydmVyIHNldHRpbmdzIGFuZCBtYWtlIElOQk9YIGFsd2F5cyBhcyBzdWJzY3JpYmVkXG4gICAgICAgICAgICBpbmJveEVudHJ5LnN1YnNjcmliZWQgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGVudHJpZXMuc29ydCgoYSwgYikgPT4ge1xuICAgICAgICAgICAgaWYgKGEuc3BlY2lhbFVzZSAmJiAhYi5zcGVjaWFsVXNlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFhLnNwZWNpYWxVc2UgJiYgYi5zcGVjaWFsVXNlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIDE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoYS5zcGVjaWFsVXNlICYmIGIuc3BlY2lhbFVzZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBGTEFHX1NPUlRfT1JERVIuaW5kZXhPZihhLnNwZWNpYWxVc2UpIC0gRkxBR19TT1JUX09SREVSLmluZGV4T2YoYi5zcGVjaWFsVXNlKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbGV0IGFMaXN0ID0gW10uY29uY2F0KGEucGFyZW50KS5jb25jYXQoYS5uYW1lKTtcbiAgICAgICAgICAgIGxldCBiTGlzdCA9IFtdLmNvbmNhdChiLnBhcmVudCkuY29uY2F0KGIubmFtZSk7XG5cbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYUxpc3QubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBsZXQgYVBhcnQgPSBhTGlzdFtpXTtcbiAgICAgICAgICAgICAgICBsZXQgYlBhcnQgPSBiTGlzdFtpXTtcbiAgICAgICAgICAgICAgICBpZiAoYVBhcnQgIT09IGJQYXJ0KSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBhUGFydC5sb2NhbGVDb21wYXJlKGJQYXJ0IHx8ICcnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBhLnBhdGgubG9jYWxlQ29tcGFyZShiLnBhdGgpO1xuICAgICAgICB9KTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgY29ubmVjdGlvbi5sb2cud2Fybih7IG1zZzogJ0ZhaWxlZCB0byBsaXN0IGZvbGRlcnMnLCBlcnIsIGNpZDogY29ubmVjdGlvbi5pZCB9KTtcbiAgICAgICAgdGhyb3cgZXJyO1xuICAgIH1cbn07XG4iXSwibmFtZXMiOltdLCJpZ25vcmVMaXN0IjpbMF0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(action-browser)/./node_modules/imapflow/lib/commands/list.js\n");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "(action-browser)/./node_modules/imapflow/lib/commands/login.js":
|
|
/*!*****************************************************!*\
|
|
!*** ./node_modules/imapflow/lib/commands/login.js ***!
|
|
\*****************************************************/
|
|
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
|
|
|
|
eval("\n\nconst { getStatusCode, getErrorText } = __webpack_require__(/*! ../tools.js */ \"(action-browser)/./node_modules/imapflow/lib/tools.js\");\n\n// Authenticates user using LOGIN\nmodule.exports = async (connection, username, password) => {\n if (connection.state !== connection.states.NOT_AUTHENTICATED) {\n // nothing to do here\n return;\n }\n\n try {\n let response = await connection.exec('LOGIN', [\n { type: 'STRING', value: username },\n { type: 'STRING', value: password, sensitive: true }\n ]);\n response.next();\n\n connection.authCapabilities.set('LOGIN', true);\n\n return username;\n } catch (err) {\n let errorCode = getStatusCode(err.response);\n if (errorCode) {\n err.serverResponseCode = errorCode;\n }\n err.authenticationFailed = true;\n err.response = await getErrorText(err.response);\n throw err;\n }\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFjdGlvbi1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9pbWFwZmxvdy9saWIvY29tbWFuZHMvbG9naW4uanMiLCJtYXBwaW5ncyI6IkFBQWE7O0FBRWIsUUFBUSw4QkFBOEIsRUFBRSxtQkFBTyxDQUFDLDBFQUFhOztBQUU3RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGNBQWMsaUNBQWlDO0FBQy9DLGNBQWM7QUFDZDtBQUNBOztBQUVBOztBQUVBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsiL2hvbWUvYWxtYS9uZXh0Z2VuL05lYWgtbWFpbC9ub2RlX21vZHVsZXMvaW1hcGZsb3cvbGliL2NvbW1hbmRzL2xvZ2luLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcblxuY29uc3QgeyBnZXRTdGF0dXNDb2RlLCBnZXRFcnJvclRleHQgfSA9IHJlcXVpcmUoJy4uL3Rvb2xzLmpzJyk7XG5cbi8vIEF1dGhlbnRpY2F0ZXMgdXNlciB1c2luZyBMT0dJTlxubW9kdWxlLmV4cG9ydHMgPSBhc3luYyAoY29ubmVjdGlvbiwgdXNlcm5hbWUsIHBhc3N3b3JkKSA9PiB7XG4gICAgaWYgKGNvbm5lY3Rpb24uc3RhdGUgIT09IGNvbm5lY3Rpb24uc3RhdGVzLk5PVF9BVVRIRU5USUNBVEVEKSB7XG4gICAgICAgIC8vIG5vdGhpbmcgdG8gZG8gaGVyZVxuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgICAgbGV0IHJlc3BvbnNlID0gYXdhaXQgY29ubmVjdGlvbi5leGVjKCdMT0dJTicsIFtcbiAgICAgICAgICAgIHsgdHlwZTogJ1NUUklORycsIHZhbHVlOiB1c2VybmFtZSB9LFxuICAgICAgICAgICAgeyB0eXBlOiAnU1RSSU5HJywgdmFsdWU6IHBhc3N3b3JkLCBzZW5zaXRpdmU6IHRydWUgfVxuICAgICAgICBdKTtcbiAgICAgICAgcmVzcG9uc2UubmV4dCgpO1xuXG4gICAgICAgIGNvbm5lY3Rpb24uYXV0aENhcGFiaWxpdGllcy5zZXQoJ0xPR0lOJywgdHJ1ZSk7XG5cbiAgICAgICAgcmV0dXJuIHVzZXJuYW1lO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBsZXQgZXJyb3JDb2RlID0gZ2V0U3RhdHVzQ29kZShlcnIucmVzcG9uc2UpO1xuICAgICAgICBpZiAoZXJyb3JDb2RlKSB7XG4gICAgICAgICAgICBlcnIuc2VydmVyUmVzcG9uc2VDb2RlID0gZXJyb3JDb2RlO1xuICAgICAgICB9XG4gICAgICAgIGVyci5hdXRoZW50aWNhdGlvbkZhaWxlZCA9IHRydWU7XG4gICAgICAgIGVyci5yZXNwb25zZSA9IGF3YWl0IGdldEVycm9yVGV4dChlcnIucmVzcG9uc2UpO1xuICAgICAgICB0aHJvdyBlcnI7XG4gICAgfVxufTtcbiJdLCJuYW1lcyI6W10sImlnbm9yZUxpc3QiOlswXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(action-browser)/./node_modules/imapflow/lib/commands/login.js\n");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "(action-browser)/./node_modules/imapflow/lib/commands/logout.js":
|
|
/*!******************************************************!*\
|
|
!*** ./node_modules/imapflow/lib/commands/logout.js ***!
|
|
\******************************************************/
|
|
/***/ ((module) => {
|
|
|
|
eval("\n\n// Logs out user and closes connection\nmodule.exports = async connection => {\n if (connection.state === connection.states.LOGOUT) {\n // nothing to do here\n return false;\n }\n\n if (connection.state === connection.states.NOT_AUTHENTICATED) {\n connection.state = connection.states.LOGOUT;\n connection.close();\n return false;\n }\n\n let response;\n try {\n response = await connection.exec('LOGOUT');\n return true;\n } catch (err) {\n if (err.code === 'NoConnection') {\n return true;\n }\n connection.log.warn({ err, cid: connection.id });\n return false;\n } finally {\n // close even if command failed\n connection.state = connection.states.LOGOUT;\n if (response && typeof response.next === 'function') {\n response.next();\n }\n connection.close();\n }\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFjdGlvbi1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9pbWFwZmxvdy9saWIvY29tbWFuZHMvbG9nb3V0LmpzIiwibWFwcGluZ3MiOiJBQUFhOztBQUViO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBLDhCQUE4Qix5QkFBeUI7QUFDdkQ7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsiL2hvbWUvYWxtYS9uZXh0Z2VuL05lYWgtbWFpbC9ub2RlX21vZHVsZXMvaW1hcGZsb3cvbGliL2NvbW1hbmRzL2xvZ291dC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbi8vIExvZ3Mgb3V0IHVzZXIgYW5kIGNsb3NlcyBjb25uZWN0aW9uXG5tb2R1bGUuZXhwb3J0cyA9IGFzeW5jIGNvbm5lY3Rpb24gPT4ge1xuICAgIGlmIChjb25uZWN0aW9uLnN0YXRlID09PSBjb25uZWN0aW9uLnN0YXRlcy5MT0dPVVQpIHtcbiAgICAgICAgLy8gbm90aGluZyB0byBkbyBoZXJlXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAoY29ubmVjdGlvbi5zdGF0ZSA9PT0gY29ubmVjdGlvbi5zdGF0ZXMuTk9UX0FVVEhFTlRJQ0FURUQpIHtcbiAgICAgICAgY29ubmVjdGlvbi5zdGF0ZSA9IGNvbm5lY3Rpb24uc3RhdGVzLkxPR09VVDtcbiAgICAgICAgY29ubmVjdGlvbi5jbG9zZSgpO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgbGV0IHJlc3BvbnNlO1xuICAgIHRyeSB7XG4gICAgICAgIHJlc3BvbnNlID0gYXdhaXQgY29ubmVjdGlvbi5leGVjKCdMT0dPVVQnKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGlmIChlcnIuY29kZSA9PT0gJ05vQ29ubmVjdGlvbicpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGNvbm5lY3Rpb24ubG9nLndhcm4oeyBlcnIsIGNpZDogY29ubmVjdGlvbi5pZCB9KTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0gZmluYWxseSB7XG4gICAgICAgIC8vIGNsb3NlIGV2ZW4gaWYgY29tbWFuZCBmYWlsZWRcbiAgICAgICAgY29ubmVjdGlvbi5zdGF0ZSA9IGNvbm5lY3Rpb24uc3RhdGVzLkxPR09VVDtcbiAgICAgICAgaWYgKHJlc3BvbnNlICYmIHR5cGVvZiByZXNwb25zZS5uZXh0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICByZXNwb25zZS5uZXh0KCk7XG4gICAgICAgIH1cbiAgICAgICAgY29ubmVjdGlvbi5jbG9zZSgpO1xuICAgIH1cbn07XG4iXSwibmFtZXMiOltdLCJpZ25vcmVMaXN0IjpbMF0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(action-browser)/./node_modules/imapflow/lib/commands/logout.js\n");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "(action-browser)/./node_modules/imapflow/lib/commands/move.js":
|
|
/*!****************************************************!*\
|
|
!*** ./node_modules/imapflow/lib/commands/move.js ***!
|
|
\****************************************************/
|
|
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
|
|
|
|
eval("\n\nconst { getStatusCode, normalizePath, encodePath, expandRange, getErrorText } = __webpack_require__(/*! ../tools.js */ \"(action-browser)/./node_modules/imapflow/lib/tools.js\");\n\n// Moves messages from current mailbox to some other mailbox\nmodule.exports = async (connection, range, destination, options) => {\n if (connection.state !== connection.states.SELECTED || !range || !destination) {\n // nothing to do here\n return;\n }\n\n options = options || {};\n destination = normalizePath(connection, destination);\n\n let attributes = [\n { type: 'SEQUENCE', value: range },\n { type: 'ATOM', value: encodePath(connection, destination) }\n ];\n\n let map = { path: connection.mailbox.path, destination };\n\n if (!connection.capabilities.has('MOVE')) {\n let result = await connection.messageCopy(range, destination, options);\n await connection.messageDelete(range, Object.assign({ silent: true }, options));\n return result;\n }\n\n let checkMoveInfo = response => {\n let section = response.attributes && response.attributes[0] && response.attributes[0].section;\n let responseCode = section && section.length && section[0] && typeof section[0].value === 'string' ? section[0].value : '';\n switch (responseCode) {\n case 'COPYUID':\n {\n let uidValidity = section[1] && typeof section[1].value === 'string' && !isNaN(section[1].value) ? BigInt(section[1].value) : false;\n if (uidValidity) {\n map.uidValidity = uidValidity;\n }\n\n let sourceUids = section[2] && typeof section[2].value === 'string' ? expandRange(section[2].value) : false;\n let destinationUids = section[3] && typeof section[3].value === 'string' ? expandRange(section[3].value) : false;\n if (sourceUids && destinationUids && sourceUids.length === destinationUids.length) {\n map.uidMap = new Map(sourceUids.map((uid, i) => [uid, destinationUids[i]]));\n }\n }\n break;\n }\n };\n\n let response;\n try {\n response = await connection.exec(options.uid ? 'UID MOVE' : 'MOVE', attributes, {\n untagged: {\n OK: async untagged => {\n checkMoveInfo(untagged);\n }\n }\n });\n response.next();\n\n checkMoveInfo(response.response);\n return map;\n } catch (err) {\n let errorCode = getStatusCode(err.response);\n if (errorCode) {\n err.serverResponseCode = errorCode;\n }\n err.response = await getErrorText(err.response);\n\n connection.log.warn({ err, cid: connection.id });\n return false;\n }\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFjdGlvbi1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9pbWFwZmxvdy9saWIvY29tbWFuZHMvbW92ZS5qcyIsIm1hcHBpbmdzIjoiQUFBYTs7QUFFYixRQUFRLHNFQUFzRSxFQUFFLG1CQUFPLENBQUMsMEVBQWE7O0FBRXJHO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0EsVUFBVSxnQ0FBZ0M7QUFDMUMsVUFBVTtBQUNWOztBQUVBLGdCQUFnQjs7QUFFaEI7QUFDQTtBQUNBLDhEQUE4RCxjQUFjO0FBQzVFO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7O0FBRUE7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLDhCQUE4Qix5QkFBeUI7QUFDdkQ7QUFDQTtBQUNBIiwic291cmNlcyI6WyIvaG9tZS9hbG1hL25leHRnZW4vTmVhaC1tYWlsL25vZGVfbW9kdWxlcy9pbWFwZmxvdy9saWIvY29tbWFuZHMvbW92ZS5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbmNvbnN0IHsgZ2V0U3RhdHVzQ29kZSwgbm9ybWFsaXplUGF0aCwgZW5jb2RlUGF0aCwgZXhwYW5kUmFuZ2UsIGdldEVycm9yVGV4dCB9ID0gcmVxdWlyZSgnLi4vdG9vbHMuanMnKTtcblxuLy8gTW92ZXMgbWVzc2FnZXMgZnJvbSBjdXJyZW50IG1haWxib3ggdG8gc29tZSBvdGhlciBtYWlsYm94XG5tb2R1bGUuZXhwb3J0cyA9IGFzeW5jIChjb25uZWN0aW9uLCByYW5nZSwgZGVzdGluYXRpb24sIG9wdGlvbnMpID0+IHtcbiAgICBpZiAoY29ubmVjdGlvbi5zdGF0ZSAhPT0gY29ubmVjdGlvbi5zdGF0ZXMuU0VMRUNURUQgfHwgIXJhbmdlIHx8ICFkZXN0aW5hdGlvbikge1xuICAgICAgICAvLyBub3RoaW5nIHRvIGRvIGhlcmVcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICAgIGRlc3RpbmF0aW9uID0gbm9ybWFsaXplUGF0aChjb25uZWN0aW9uLCBkZXN0aW5hdGlvbik7XG5cbiAgICBsZXQgYXR0cmlidXRlcyA9IFtcbiAgICAgICAgeyB0eXBlOiAnU0VRVUVOQ0UnLCB2YWx1ZTogcmFuZ2UgfSxcbiAgICAgICAgeyB0eXBlOiAnQVRPTScsIHZhbHVlOiBlbmNvZGVQYXRoKGNvbm5lY3Rpb24sIGRlc3RpbmF0aW9uKSB9XG4gICAgXTtcblxuICAgIGxldCBtYXAgPSB7IHBhdGg6IGNvbm5lY3Rpb24ubWFpbGJveC5wYXRoLCBkZXN0aW5hdGlvbiB9O1xuXG4gICAgaWYgKCFjb25uZWN0aW9uLmNhcGFiaWxpdGllcy5oYXMoJ01PVkUnKSkge1xuICAgICAgICBsZXQgcmVzdWx0ID0gYXdhaXQgY29ubmVjdGlvbi5tZXNzYWdlQ29weShyYW5nZSwgZGVzdGluYXRpb24sIG9wdGlvbnMpO1xuICAgICAgICBhd2FpdCBjb25uZWN0aW9uLm1lc3NhZ2VEZWxldGUocmFuZ2UsIE9iamVjdC5hc3NpZ24oeyBzaWxlbnQ6IHRydWUgfSwgb3B0aW9ucykpO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIGxldCBjaGVja01vdmVJbmZvID0gcmVzcG9uc2UgPT4ge1xuICAgICAgICBsZXQgc2VjdGlvbiA9IHJlc3BvbnNlLmF0dHJpYnV0ZXMgJiYgcmVzcG9uc2UuYXR0cmlidXRlc1swXSAmJiByZXNwb25zZS5hdHRyaWJ1dGVzWzBdLnNlY3Rpb247XG4gICAgICAgIGxldCByZXNwb25zZUNvZGUgPSBzZWN0aW9uICYmIHNlY3Rpb24ubGVuZ3RoICYmIHNlY3Rpb25bMF0gJiYgdHlwZW9mIHNlY3Rpb25bMF0udmFsdWUgPT09ICdzdHJpbmcnID8gc2VjdGlvblswXS52YWx1ZSA6ICcnO1xuICAgICAgICBzd2l0Y2ggKHJlc3BvbnNlQ29kZSkge1xuICAgICAgICAgICAgY2FzZSAnQ09QWVVJRCc6XG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBsZXQgdWlkVmFsaWRpdHkgPSBzZWN0aW9uWzFdICYmIHR5cGVvZiBzZWN0aW9uWzFdLnZhbHVlID09PSAnc3RyaW5nJyAmJiAhaXNOYU4oc2VjdGlvblsxXS52YWx1ZSkgPyBCaWdJbnQoc2VjdGlvblsxXS52YWx1ZSkgOiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHVpZFZhbGlkaXR5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtYXAudWlkVmFsaWRpdHkgPSB1aWRWYWxpZGl0eTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGxldCBzb3VyY2VVaWRzID0gc2VjdGlvblsyXSAmJiB0eXBlb2Ygc2VjdGlvblsyXS52YWx1ZSA9PT0gJ3N0cmluZycgPyBleHBhbmRSYW5nZShzZWN0aW9uWzJdLnZhbHVlKSA6IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBsZXQgZGVzdGluYXRpb25VaWRzID0gc2VjdGlvblszXSAmJiB0eXBlb2Ygc2VjdGlvblszXS52YWx1ZSA9PT0gJ3N0cmluZycgPyBleHBhbmRSYW5nZShzZWN0aW9uWzNdLnZhbHVlKSA6IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBpZiAoc291cmNlVWlkcyAmJiBkZXN0aW5hdGlvblVpZHMgJiYgc291cmNlVWlkcy5sZW5ndGggPT09IGRlc3RpbmF0aW9uVWlkcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1hcC51aWRNYXAgPSBuZXcgTWFwKHNvdXJjZVVpZHMubWFwKCh1aWQsIGkpID0+IFt1aWQsIGRlc3RpbmF0aW9uVWlkc1tpXV0pKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICBsZXQgcmVzcG9uc2U7XG4gICAgdHJ5IHtcbiAgICAgICAgcmVzcG9uc2UgPSBhd2FpdCBjb25uZWN0aW9uLmV4ZWMob3B0aW9ucy51aWQgPyAnVUlEIE1PVkUnIDogJ01PVkUnLCBhdHRyaWJ1dGVzLCB7XG4gICAgICAgICAgICB1bnRhZ2dlZDoge1xuICAgICAgICAgICAgICAgIE9LOiBhc3luYyB1bnRhZ2dlZCA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNoZWNrTW92ZUluZm8odW50YWdnZWQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJlc3BvbnNlLm5leHQoKTtcblxuICAgICAgICBjaGVja01vdmVJbmZvKHJlc3BvbnNlLnJlc3BvbnNlKTtcbiAgICAgICAgcmV0dXJuIG1hcDtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgbGV0IGVycm9yQ29kZSA9IGdldFN0YXR1c0NvZGUoZXJyLnJlc3BvbnNlKTtcbiAgICAgICAgaWYgKGVycm9yQ29kZSkge1xuICAgICAgICAgICAgZXJyLnNlcnZlclJlc3BvbnNlQ29kZSA9IGVycm9yQ29kZTtcbiAgICAgICAgfVxuICAgICAgICBlcnIucmVzcG9uc2UgPSBhd2FpdCBnZXRFcnJvclRleHQoZXJyLnJlc3BvbnNlKTtcblxuICAgICAgICBjb25uZWN0aW9uLmxvZy53YXJuKHsgZXJyLCBjaWQ6IGNvbm5lY3Rpb24uaWQgfSk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG59O1xuIl0sIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6WzBdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(action-browser)/./node_modules/imapflow/lib/commands/move.js\n");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "(action-browser)/./node_modules/imapflow/lib/commands/namespace.js":
|
|
/*!*********************************************************!*\
|
|
!*** ./node_modules/imapflow/lib/commands/namespace.js ***!
|
|
\*********************************************************/
|
|
/***/ ((module) => {
|
|
|
|
eval("\n\n// Requests NAMESPACE info from server\nmodule.exports = async connection => {\n if (![connection.states.AUTHENTICATED, connection.states.SELECTED].includes(connection.state)) {\n // nothing to do here\n return;\n }\n\n if (!connection.capabilities.has('NAMESPACE')) {\n // try to derive from listing\n let { prefix, delimiter } = await getListPrefix(connection);\n if (delimiter && prefix && prefix.charAt(prefix.length - 1) !== delimiter) {\n prefix += delimiter;\n }\n let map = {\n personal: [{ prefix: prefix || '', delimiter }],\n other: false,\n shared: false\n };\n connection.namespaces = map;\n connection.namespace = connection.namespaces.personal[0];\n return connection.namespace;\n }\n\n let response;\n try {\n let map = {};\n response = await connection.exec('NAMESPACE', false, {\n untagged: {\n NAMESPACE: async untagged => {\n if (!untagged.attributes || !untagged.attributes.length) {\n return;\n }\n map.personal = getNamsepaceInfo(untagged.attributes[0]);\n map.other = getNamsepaceInfo(untagged.attributes[1]);\n map.shared = getNamsepaceInfo(untagged.attributes[2]);\n }\n }\n });\n connection.namespaces = map;\n\n // make sure that we have the first personal namespace always set\n if (!connection.namespaces.personal[0]) {\n connection.namespaces.personal[0] = { prefix: '', delimiter: '.' };\n }\n connection.namespaces.personal[0].prefix = connection.namespaces.personal[0].prefix || '';\n response.next();\n\n connection.namespace = connection.namespaces.personal[0];\n\n return connection.namespace;\n } catch (err) {\n connection.log.warn({ err, cid: connection.id });\n return {\n error: true,\n status: err.responseStatus,\n text: err.responseText\n };\n }\n};\n\nasync function getListPrefix(connection) {\n let response;\n try {\n let map = {};\n response = await connection.exec('LIST', ['', ''], {\n untagged: {\n LIST: async untagged => {\n if (!untagged.attributes || !untagged.attributes.length) {\n return;\n }\n\n map.flags = new Set(untagged.attributes[0].map(entry => entry.value));\n map.delimiter = untagged.attributes[1] && untagged.attributes[1].value;\n map.prefix = (untagged.attributes[2] && untagged.attributes[2].value) || '';\n if (map.delimiter && map.prefix.charAt(0) === map.delimiter) {\n map.prefix = map.prefix.slice(1);\n }\n }\n }\n });\n response.next();\n return map;\n } catch (err) {\n connection.log.warn({ err, cid: connection.id });\n return {};\n }\n}\n\nfunction getNamsepaceInfo(attribute) {\n if (!attribute || !attribute.length) {\n return false;\n }\n\n return attribute\n .filter(entry => entry.length >= 2 && typeof entry[0].value === 'string' && typeof entry[1].value === 'string')\n .map(entry => {\n let prefix = entry[0].value;\n let delimiter = entry[1].value;\n\n if (delimiter && prefix && prefix.charAt(prefix.length - 1) !== delimiter) {\n prefix += delimiter;\n }\n return { prefix, delimiter };\n });\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFjdGlvbi1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9pbWFwZmxvdy9saWIvY29tbWFuZHMvbmFtZXNwYWNlLmpzIiwibWFwcGluZ3MiOiJBQUFhOztBQUViO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsY0FBYyxvQkFBb0I7QUFDbEM7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5QkFBeUIsaUNBQWlDO0FBQzFEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7O0FBRUE7QUFDQTtBQUNBLGtEQUFrRDtBQUNsRDtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQSxNQUFNO0FBQ04sOEJBQThCLHlCQUF5QjtBQUN2RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxNQUFNO0FBQ04sOEJBQThCLHlCQUF5QjtBQUN2RDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckIsU0FBUztBQUNUIiwic291cmNlcyI6WyIvaG9tZS9hbG1hL25leHRnZW4vTmVhaC1tYWlsL25vZGVfbW9kdWxlcy9pbWFwZmxvdy9saWIvY29tbWFuZHMvbmFtZXNwYWNlLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcblxuLy8gUmVxdWVzdHMgTkFNRVNQQUNFIGluZm8gZnJvbSBzZXJ2ZXJcbm1vZHVsZS5leHBvcnRzID0gYXN5bmMgY29ubmVjdGlvbiA9PiB7XG4gICAgaWYgKCFbY29ubmVjdGlvbi5zdGF0ZXMuQVVUSEVOVElDQVRFRCwgY29ubmVjdGlvbi5zdGF0ZXMuU0VMRUNURURdLmluY2x1ZGVzKGNvbm5lY3Rpb24uc3RhdGUpKSB7XG4gICAgICAgIC8vIG5vdGhpbmcgdG8gZG8gaGVyZVxuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCFjb25uZWN0aW9uLmNhcGFiaWxpdGllcy5oYXMoJ05BTUVTUEFDRScpKSB7XG4gICAgICAgIC8vIHRyeSB0byBkZXJpdmUgZnJvbSBsaXN0aW5nXG4gICAgICAgIGxldCB7IHByZWZpeCwgZGVsaW1pdGVyIH0gPSBhd2FpdCBnZXRMaXN0UHJlZml4KGNvbm5lY3Rpb24pO1xuICAgICAgICBpZiAoZGVsaW1pdGVyICYmIHByZWZpeCAmJiBwcmVmaXguY2hhckF0KHByZWZpeC5sZW5ndGggLSAxKSAhPT0gZGVsaW1pdGVyKSB7XG4gICAgICAgICAgICBwcmVmaXggKz0gZGVsaW1pdGVyO1xuICAgICAgICB9XG4gICAgICAgIGxldCBtYXAgPSB7XG4gICAgICAgICAgICBwZXJzb25hbDogW3sgcHJlZml4OiBwcmVmaXggfHwgJycsIGRlbGltaXRlciB9XSxcbiAgICAgICAgICAgIG90aGVyOiBmYWxzZSxcbiAgICAgICAgICAgIHNoYXJlZDogZmFsc2VcbiAgICAgICAgfTtcbiAgICAgICAgY29ubmVjdGlvbi5uYW1lc3BhY2VzID0gbWFwO1xuICAgICAgICBjb25uZWN0aW9uLm5hbWVzcGFjZSA9IGNvbm5lY3Rpb24ubmFtZXNwYWNlcy5wZXJzb25hbFswXTtcbiAgICAgICAgcmV0dXJuIGNvbm5lY3Rpb24ubmFtZXNwYWNlO1xuICAgIH1cblxuICAgIGxldCByZXNwb25zZTtcbiAgICB0cnkge1xuICAgICAgICBsZXQgbWFwID0ge307XG4gICAgICAgIHJlc3BvbnNlID0gYXdhaXQgY29ubmVjdGlvbi5leGVjKCdOQU1FU1BBQ0UnLCBmYWxzZSwge1xuICAgICAgICAgICAgdW50YWdnZWQ6IHtcbiAgICAgICAgICAgICAgICBOQU1FU1BBQ0U6IGFzeW5jIHVudGFnZ2VkID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCF1bnRhZ2dlZC5hdHRyaWJ1dGVzIHx8ICF1bnRhZ2dlZC5hdHRyaWJ1dGVzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIG1hcC5wZXJzb25hbCA9IGdldE5hbXNlcGFjZUluZm8odW50YWdnZWQuYXR0cmlidXRlc1swXSk7XG4gICAgICAgICAgICAgICAgICAgIG1hcC5vdGhlciA9IGdldE5hbXNlcGFjZUluZm8odW50YWdnZWQuYXR0cmlidXRlc1sxXSk7XG4gICAgICAgICAgICAgICAgICAgIG1hcC5zaGFyZWQgPSBnZXROYW1zZXBhY2VJbmZvKHVudGFnZ2VkLmF0dHJpYnV0ZXNbMl0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGNvbm5lY3Rpb24ubmFtZXNwYWNlcyA9IG1hcDtcblxuICAgICAgICAvLyBtYWtlIHN1cmUgdGhhdCB3ZSBoYXZlIHRoZSBmaXJzdCBwZXJzb25hbCBuYW1lc3BhY2UgYWx3YXlzIHNldFxuICAgICAgICBpZiAoIWNvbm5lY3Rpb24ubmFtZXNwYWNlcy5wZXJzb25hbFswXSkge1xuICAgICAgICAgICAgY29ubmVjdGlvbi5uYW1lc3BhY2VzLnBlcnNvbmFsWzBdID0geyBwcmVmaXg6ICcnLCBkZWxpbWl0ZXI6ICcuJyB9O1xuICAgICAgICB9XG4gICAgICAgIGNvbm5lY3Rpb24ubmFtZXNwYWNlcy5wZXJzb25hbFswXS5wcmVmaXggPSBjb25uZWN0aW9uLm5hbWVzcGFjZXMucGVyc29uYWxbMF0ucHJlZml4IHx8ICcnO1xuICAgICAgICByZXNwb25zZS5uZXh0KCk7XG5cbiAgICAgICAgY29ubmVjdGlvbi5uYW1lc3BhY2UgPSBjb25uZWN0aW9uLm5hbWVzcGFjZXMucGVyc29uYWxbMF07XG5cbiAgICAgICAgcmV0dXJuIGNvbm5lY3Rpb24ubmFtZXNwYWNlO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBjb25uZWN0aW9uLmxvZy53YXJuKHsgZXJyLCBjaWQ6IGNvbm5lY3Rpb24uaWQgfSk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBlcnJvcjogdHJ1ZSxcbiAgICAgICAgICAgIHN0YXR1czogZXJyLnJlc3BvbnNlU3RhdHVzLFxuICAgICAgICAgICAgdGV4dDogZXJyLnJlc3BvbnNlVGV4dFxuICAgICAgICB9O1xuICAgIH1cbn07XG5cbmFzeW5jIGZ1bmN0aW9uIGdldExpc3RQcmVmaXgoY29ubmVjdGlvbikge1xuICAgIGxldCByZXNwb25zZTtcbiAgICB0cnkge1xuICAgICAgICBsZXQgbWFwID0ge307XG4gICAgICAgIHJlc3BvbnNlID0gYXdhaXQgY29ubmVjdGlvbi5leGVjKCdMSVNUJywgWycnLCAnJ10sIHtcbiAgICAgICAgICAgIHVudGFnZ2VkOiB7XG4gICAgICAgICAgICAgICAgTElTVDogYXN5bmMgdW50YWdnZWQgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXVudGFnZ2VkLmF0dHJpYnV0ZXMgfHwgIXVudGFnZ2VkLmF0dHJpYnV0ZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBtYXAuZmxhZ3MgPSBuZXcgU2V0KHVudGFnZ2VkLmF0dHJpYnV0ZXNbMF0ubWFwKGVudHJ5ID0+IGVudHJ5LnZhbHVlKSk7XG4gICAgICAgICAgICAgICAgICAgIG1hcC5kZWxpbWl0ZXIgPSB1bnRhZ2dlZC5hdHRyaWJ1dGVzWzFdICYmIHVudGFnZ2VkLmF0dHJpYnV0ZXNbMV0udmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIG1hcC5wcmVmaXggPSAodW50YWdnZWQuYXR0cmlidXRlc1syXSAmJiB1bnRhZ2dlZC5hdHRyaWJ1dGVzWzJdLnZhbHVlKSB8fCAnJztcbiAgICAgICAgICAgICAgICAgICAgaWYgKG1hcC5kZWxpbWl0ZXIgJiYgbWFwLnByZWZpeC5jaGFyQXQoMCkgPT09IG1hcC5kZWxpbWl0ZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1hcC5wcmVmaXggPSBtYXAucHJlZml4LnNsaWNlKDEpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmVzcG9uc2UubmV4dCgpO1xuICAgICAgICByZXR1cm4gbWFwO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBjb25uZWN0aW9uLmxvZy53YXJuKHsgZXJyLCBjaWQ6IGNvbm5lY3Rpb24uaWQgfSk7XG4gICAgICAgIHJldHVybiB7fTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGdldE5hbXNlcGFjZUluZm8oYXR0cmlidXRlKSB7XG4gICAgaWYgKCFhdHRyaWJ1dGUgfHwgIWF0dHJpYnV0ZS5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiBhdHRyaWJ1dGVcbiAgICAgICAgLmZpbHRlcihlbnRyeSA9PiBlbnRyeS5sZW5ndGggPj0gMiAmJiB0eXBlb2YgZW50cnlbMF0udmFsdWUgPT09ICdzdHJpbmcnICYmIHR5cGVvZiBlbnRyeVsxXS52YWx1ZSA9PT0gJ3N0cmluZycpXG4gICAgICAgIC5tYXAoZW50cnkgPT4ge1xuICAgICAgICAgICAgbGV0IHByZWZpeCA9IGVudHJ5WzBdLnZhbHVlO1xuICAgICAgICAgICAgbGV0IGRlbGltaXRlciA9IGVudHJ5WzFdLnZhbHVlO1xuXG4gICAgICAgICAgICBpZiAoZGVsaW1pdGVyICYmIHByZWZpeCAmJiBwcmVmaXguY2hhckF0KHByZWZpeC5sZW5ndGggLSAxKSAhPT0gZGVsaW1pdGVyKSB7XG4gICAgICAgICAgICAgICAgcHJlZml4ICs9IGRlbGltaXRlcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB7IHByZWZpeCwgZGVsaW1pdGVyIH07XG4gICAgICAgIH0pO1xufVxuIl0sIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6WzBdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(action-browser)/./node_modules/imapflow/lib/commands/namespace.js\n");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "(action-browser)/./node_modules/imapflow/lib/commands/noop.js":
|
|
/*!****************************************************!*\
|
|
!*** ./node_modules/imapflow/lib/commands/noop.js ***!
|
|
\****************************************************/
|
|
/***/ ((module) => {
|
|
|
|
eval("\n\n// Sends a NO-OP command\nmodule.exports = async connection => {\n try {\n let response = await connection.exec('NOOP', false, { comment: 'Requested by command' });\n response.next();\n return true;\n } catch (err) {\n connection.log.warn({ err, cid: connection.id });\n return false;\n }\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFjdGlvbi1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9pbWFwZmxvdy9saWIvY29tbWFuZHMvbm9vcC5qcyIsIm1hcHBpbmdzIjoiQUFBYTs7QUFFYjtBQUNBO0FBQ0E7QUFDQSw4REFBOEQsaUNBQWlDO0FBQy9GO0FBQ0E7QUFDQSxNQUFNO0FBQ04sOEJBQThCLHlCQUF5QjtBQUN2RDtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIi9ob21lL2FsbWEvbmV4dGdlbi9OZWFoLW1haWwvbm9kZV9tb2R1bGVzL2ltYXBmbG93L2xpYi9jb21tYW5kcy9ub29wLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcblxuLy8gU2VuZHMgYSBOTy1PUCBjb21tYW5kXG5tb2R1bGUuZXhwb3J0cyA9IGFzeW5jIGNvbm5lY3Rpb24gPT4ge1xuICAgIHRyeSB7XG4gICAgICAgIGxldCByZXNwb25zZSA9IGF3YWl0IGNvbm5lY3Rpb24uZXhlYygnTk9PUCcsIGZhbHNlLCB7IGNvbW1lbnQ6ICdSZXF1ZXN0ZWQgYnkgY29tbWFuZCcgfSk7XG4gICAgICAgIHJlc3BvbnNlLm5leHQoKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGNvbm5lY3Rpb24ubG9nLndhcm4oeyBlcnIsIGNpZDogY29ubmVjdGlvbi5pZCB9KTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbn07XG4iXSwibmFtZXMiOltdLCJpZ25vcmVMaXN0IjpbMF0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(action-browser)/./node_modules/imapflow/lib/commands/noop.js\n");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "(action-browser)/./node_modules/imapflow/lib/commands/quota.js":
|
|
/*!*****************************************************!*\
|
|
!*** ./node_modules/imapflow/lib/commands/quota.js ***!
|
|
\*****************************************************/
|
|
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
|
|
|
|
eval("\n\nconst { encodePath, getStatusCode, normalizePath, getErrorText } = __webpack_require__(/*! ../tools.js */ \"(action-browser)/./node_modules/imapflow/lib/tools.js\");\n\n// Requests quota information for a mailbox\nmodule.exports = async (connection, path) => {\n if (![connection.states.AUTHENTICATED, connection.states.SELECTED].includes(connection.state) || !path) {\n // nothing to do here\n return;\n }\n\n if (!connection.capabilities.has('QUOTA')) {\n return false;\n }\n\n path = normalizePath(connection, path);\n\n let map = { path };\n\n let processQuotaResponse = untagged => {\n let attributes = untagged.attributes && untagged.attributes[1];\n if (!attributes || !attributes.length) {\n return false;\n }\n\n let key = false;\n attributes.forEach((attribute, i) => {\n if (i % 3 === 0) {\n key = attribute && typeof attribute.value === 'string' ? attribute.value.toLowerCase() : false;\n return;\n }\n if (!key) {\n return;\n }\n\n let value = attribute && typeof attribute.value === 'string' && !isNaN(attribute.value) ? Number(attribute.value) : false;\n if (value === false) {\n return;\n }\n\n if (i % 3 === 1) {\n // usage\n if (!map[key]) {\n map[key] = {};\n }\n map[key].usage = value * (key === 'storage' ? 1024 : 1);\n }\n\n if (i % 3 === 2) {\n // limit\n if (!map[key]) {\n map[key] = {};\n }\n map[key].limit = value * (key === 'storage' ? 1024 : 1);\n\n if (map[key].limit) {\n map[key].status = Math.round(((map[key].usage || 0) / map[key].limit) * 100) + '%';\n }\n }\n });\n };\n\n let quotaFound = false;\n let response;\n try {\n response = await connection.exec('GETQUOTAROOT', [{ type: 'ATOM', value: encodePath(connection, path) }], {\n untagged: {\n QUOTAROOT: async untagged => {\n let quotaRoot =\n untagged.attributes && untagged.attributes[1] && typeof untagged.attributes[1].value === 'string'\n ? untagged.attributes[1].value\n : false;\n if (quotaRoot) {\n map.quotaRoot = quotaRoot;\n }\n },\n QUOTA: async untagged => {\n quotaFound = true;\n processQuotaResponse(untagged);\n }\n }\n });\n\n response.next();\n\n if (map.quotaRoot && !quotaFound) {\n response = await connection.exec('GETQUOTA', [{ type: 'ATOM', value: map.quotaRoot }], {\n untagged: {\n QUOTA: async untagged => {\n processQuotaResponse(untagged);\n }\n }\n });\n }\n\n return map;\n } catch (err) {\n let errorCode = getStatusCode(err.response);\n if (errorCode) {\n err.serverResponseCode = errorCode;\n }\n err.response = await getErrorText(err.response);\n\n connection.log.warn({ err, cid: connection.id });\n return false;\n }\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFjdGlvbi1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9pbWFwZmxvdy9saWIvY29tbWFuZHMvcXVvdGEuanMiLCJtYXBwaW5ncyI6IkFBQWE7O0FBRWIsUUFBUSx5REFBeUQsRUFBRSxtQkFBTyxDQUFDLDBFQUFhOztBQUV4RjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBLGdCQUFnQjs7QUFFaEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUOztBQUVBO0FBQ0E7QUFDQTtBQUNBLDREQUE0RCxtREFBbUQ7QUFDL0c7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTOztBQUVUOztBQUVBO0FBQ0EsNERBQTRELG9DQUFvQztBQUNoRztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiOztBQUVBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsOEJBQThCLHlCQUF5QjtBQUN2RDtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIi9ob21lL2FsbWEvbmV4dGdlbi9OZWFoLW1haWwvbm9kZV9tb2R1bGVzL2ltYXBmbG93L2xpYi9jb21tYW5kcy9xdW90YS5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbmNvbnN0IHsgZW5jb2RlUGF0aCwgZ2V0U3RhdHVzQ29kZSwgbm9ybWFsaXplUGF0aCwgZ2V0RXJyb3JUZXh0IH0gPSByZXF1aXJlKCcuLi90b29scy5qcycpO1xuXG4vLyBSZXF1ZXN0cyBxdW90YSBpbmZvcm1hdGlvbiBmb3IgYSBtYWlsYm94XG5tb2R1bGUuZXhwb3J0cyA9IGFzeW5jIChjb25uZWN0aW9uLCBwYXRoKSA9PiB7XG4gICAgaWYgKCFbY29ubmVjdGlvbi5zdGF0ZXMuQVVUSEVOVElDQVRFRCwgY29ubmVjdGlvbi5zdGF0ZXMuU0VMRUNURURdLmluY2x1ZGVzKGNvbm5lY3Rpb24uc3RhdGUpIHx8ICFwYXRoKSB7XG4gICAgICAgIC8vIG5vdGhpbmcgdG8gZG8gaGVyZVxuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCFjb25uZWN0aW9uLmNhcGFiaWxpdGllcy5oYXMoJ1FVT1RBJykpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHBhdGggPSBub3JtYWxpemVQYXRoKGNvbm5lY3Rpb24sIHBhdGgpO1xuXG4gICAgbGV0IG1hcCA9IHsgcGF0aCB9O1xuXG4gICAgbGV0IHByb2Nlc3NRdW90YVJlc3BvbnNlID0gdW50YWdnZWQgPT4ge1xuICAgICAgICBsZXQgYXR0cmlidXRlcyA9IHVudGFnZ2VkLmF0dHJpYnV0ZXMgJiYgdW50YWdnZWQuYXR0cmlidXRlc1sxXTtcbiAgICAgICAgaWYgKCFhdHRyaWJ1dGVzIHx8ICFhdHRyaWJ1dGVzLmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGtleSA9IGZhbHNlO1xuICAgICAgICBhdHRyaWJ1dGVzLmZvckVhY2goKGF0dHJpYnV0ZSwgaSkgPT4ge1xuICAgICAgICAgICAgaWYgKGkgJSAzID09PSAwKSB7XG4gICAgICAgICAgICAgICAga2V5ID0gYXR0cmlidXRlICYmIHR5cGVvZiBhdHRyaWJ1dGUudmFsdWUgPT09ICdzdHJpbmcnID8gYXR0cmlidXRlLnZhbHVlLnRvTG93ZXJDYXNlKCkgOiBmYWxzZTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIWtleSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbGV0IHZhbHVlID0gYXR0cmlidXRlICYmIHR5cGVvZiBhdHRyaWJ1dGUudmFsdWUgPT09ICdzdHJpbmcnICYmICFpc05hTihhdHRyaWJ1dGUudmFsdWUpID8gTnVtYmVyKGF0dHJpYnV0ZS52YWx1ZSkgOiBmYWxzZTtcbiAgICAgICAgICAgIGlmICh2YWx1ZSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChpICUgMyA9PT0gMSkge1xuICAgICAgICAgICAgICAgIC8vIHVzYWdlXG4gICAgICAgICAgICAgICAgaWYgKCFtYXBba2V5XSkge1xuICAgICAgICAgICAgICAgICAgICBtYXBba2V5XSA9IHt9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBtYXBba2V5XS51c2FnZSA9IHZhbHVlICogKGtleSA9PT0gJ3N0b3JhZ2UnID8gMTAyNCA6IDEpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoaSAlIDMgPT09IDIpIHtcbiAgICAgICAgICAgICAgICAvLyBsaW1pdFxuICAgICAgICAgICAgICAgIGlmICghbWFwW2tleV0pIHtcbiAgICAgICAgICAgICAgICAgICAgbWFwW2tleV0gPSB7fTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbWFwW2tleV0ubGltaXQgPSB2YWx1ZSAqIChrZXkgPT09ICdzdG9yYWdlJyA/IDEwMjQgOiAxKTtcblxuICAgICAgICAgICAgICAgIGlmIChtYXBba2V5XS5saW1pdCkge1xuICAgICAgICAgICAgICAgICAgICBtYXBba2V5XS5zdGF0dXMgPSBNYXRoLnJvdW5kKCgobWFwW2tleV0udXNhZ2UgfHwgMCkgLyBtYXBba2V5XS5saW1pdCkgKiAxMDApICsgJyUnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfTtcblxuICAgIGxldCBxdW90YUZvdW5kID0gZmFsc2U7XG4gICAgbGV0IHJlc3BvbnNlO1xuICAgIHRyeSB7XG4gICAgICAgIHJlc3BvbnNlID0gYXdhaXQgY29ubmVjdGlvbi5leGVjKCdHRVRRVU9UQVJPT1QnLCBbeyB0eXBlOiAnQVRPTScsIHZhbHVlOiBlbmNvZGVQYXRoKGNvbm5lY3Rpb24sIHBhdGgpIH1dLCB7XG4gICAgICAgICAgICB1bnRhZ2dlZDoge1xuICAgICAgICAgICAgICAgIFFVT1RBUk9PVDogYXN5bmMgdW50YWdnZWQgPT4ge1xuICAgICAgICAgICAgICAgICAgICBsZXQgcXVvdGFSb290ID1cbiAgICAgICAgICAgICAgICAgICAgICAgIHVudGFnZ2VkLmF0dHJpYnV0ZXMgJiYgdW50YWdnZWQuYXR0cmlidXRlc1sxXSAmJiB0eXBlb2YgdW50YWdnZWQuYXR0cmlidXRlc1sxXS52YWx1ZSA9PT0gJ3N0cmluZydcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IHVudGFnZ2VkLmF0dHJpYnV0ZXNbMV0udmFsdWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBpZiAocXVvdGFSb290KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtYXAucXVvdGFSb290ID0gcXVvdGFSb290O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBRVU9UQTogYXN5bmMgdW50YWdnZWQgPT4ge1xuICAgICAgICAgICAgICAgICAgICBxdW90YUZvdW5kID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc1F1b3RhUmVzcG9uc2UodW50YWdnZWQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmVzcG9uc2UubmV4dCgpO1xuXG4gICAgICAgIGlmIChtYXAucXVvdGFSb290ICYmICFxdW90YUZvdW5kKSB7XG4gICAgICAgICAgICByZXNwb25zZSA9IGF3YWl0IGNvbm5lY3Rpb24uZXhlYygnR0VUUVVPVEEnLCBbeyB0eXBlOiAnQVRPTScsIHZhbHVlOiBtYXAucXVvdGFSb290IH1dLCB7XG4gICAgICAgICAgICAgICAgdW50YWdnZWQ6IHtcbiAgICAgICAgICAgICAgICAgICAgUVVPVEE6IGFzeW5jIHVudGFnZ2VkID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NRdW90YVJlc3BvbnNlKHVudGFnZ2VkKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG1hcDtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgbGV0IGVycm9yQ29kZSA9IGdldFN0YXR1c0NvZGUoZXJyLnJlc3BvbnNlKTtcbiAgICAgICAgaWYgKGVycm9yQ29kZSkge1xuICAgICAgICAgICAgZXJyLnNlcnZlclJlc3BvbnNlQ29kZSA9IGVycm9yQ29kZTtcbiAgICAgICAgfVxuICAgICAgICBlcnIucmVzcG9uc2UgPSBhd2FpdCBnZXRFcnJvclRleHQoZXJyLnJlc3BvbnNlKTtcblxuICAgICAgICBjb25uZWN0aW9uLmxvZy53YXJuKHsgZXJyLCBjaWQ6IGNvbm5lY3Rpb24uaWQgfSk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG59O1xuIl0sIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6WzBdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(action-browser)/./node_modules/imapflow/lib/commands/quota.js\n");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "(action-browser)/./node_modules/imapflow/lib/commands/rename.js":
|
|
/*!******************************************************!*\
|
|
!*** ./node_modules/imapflow/lib/commands/rename.js ***!
|
|
\******************************************************/
|
|
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
|
|
|
|
eval("\n\nconst { encodePath, normalizePath, getStatusCode, getErrorText } = __webpack_require__(/*! ../tools.js */ \"(action-browser)/./node_modules/imapflow/lib/tools.js\");\n\n// Renames existing mailbox\nmodule.exports = async (connection, path, newPath) => {\n if (![connection.states.AUTHENTICATED, connection.states.SELECTED].includes(connection.state)) {\n // nothing to do here\n return;\n }\n\n path = normalizePath(connection, path);\n newPath = normalizePath(connection, newPath);\n\n if (connection.states.SELECTED && connection.mailbox.path === path) {\n await connection.run('CLOSE');\n }\n\n let response;\n try {\n let map = {\n path,\n newPath\n };\n response = await connection.exec('RENAME', [\n { type: 'ATOM', value: encodePath(connection, path) },\n { type: 'ATOM', value: encodePath(connection, newPath) }\n ]);\n response.next();\n return map;\n } catch (err) {\n let errorCode = getStatusCode(err.response);\n if (errorCode) {\n err.serverResponseCode = errorCode;\n }\n err.response = await getErrorText(err.response);\n\n connection.log.warn({ err, cid: connection.id });\n throw err;\n }\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFjdGlvbi1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9pbWFwZmxvdy9saWIvY29tbWFuZHMvcmVuYW1lLmpzIiwibWFwcGluZ3MiOiJBQUFhOztBQUViLFFBQVEseURBQXlELEVBQUUsbUJBQU8sQ0FBQywwRUFBYTs7QUFFeEY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYyxtREFBbUQ7QUFDakUsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLDhCQUE4Qix5QkFBeUI7QUFDdkQ7QUFDQTtBQUNBIiwic291cmNlcyI6WyIvaG9tZS9hbG1hL25leHRnZW4vTmVhaC1tYWlsL25vZGVfbW9kdWxlcy9pbWFwZmxvdy9saWIvY29tbWFuZHMvcmVuYW1lLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcblxuY29uc3QgeyBlbmNvZGVQYXRoLCBub3JtYWxpemVQYXRoLCBnZXRTdGF0dXNDb2RlLCBnZXRFcnJvclRleHQgfSA9IHJlcXVpcmUoJy4uL3Rvb2xzLmpzJyk7XG5cbi8vIFJlbmFtZXMgZXhpc3RpbmcgbWFpbGJveFxubW9kdWxlLmV4cG9ydHMgPSBhc3luYyAoY29ubmVjdGlvbiwgcGF0aCwgbmV3UGF0aCkgPT4ge1xuICAgIGlmICghW2Nvbm5lY3Rpb24uc3RhdGVzLkFVVEhFTlRJQ0FURUQsIGNvbm5lY3Rpb24uc3RhdGVzLlNFTEVDVEVEXS5pbmNsdWRlcyhjb25uZWN0aW9uLnN0YXRlKSkge1xuICAgICAgICAvLyBub3RoaW5nIHRvIGRvIGhlcmVcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHBhdGggPSBub3JtYWxpemVQYXRoKGNvbm5lY3Rpb24sIHBhdGgpO1xuICAgIG5ld1BhdGggPSBub3JtYWxpemVQYXRoKGNvbm5lY3Rpb24sIG5ld1BhdGgpO1xuXG4gICAgaWYgKGNvbm5lY3Rpb24uc3RhdGVzLlNFTEVDVEVEICYmIGNvbm5lY3Rpb24ubWFpbGJveC5wYXRoID09PSBwYXRoKSB7XG4gICAgICAgIGF3YWl0IGNvbm5lY3Rpb24ucnVuKCdDTE9TRScpO1xuICAgIH1cblxuICAgIGxldCByZXNwb25zZTtcbiAgICB0cnkge1xuICAgICAgICBsZXQgbWFwID0ge1xuICAgICAgICAgICAgcGF0aCxcbiAgICAgICAgICAgIG5ld1BhdGhcbiAgICAgICAgfTtcbiAgICAgICAgcmVzcG9uc2UgPSBhd2FpdCBjb25uZWN0aW9uLmV4ZWMoJ1JFTkFNRScsIFtcbiAgICAgICAgICAgIHsgdHlwZTogJ0FUT00nLCB2YWx1ZTogZW5jb2RlUGF0aChjb25uZWN0aW9uLCBwYXRoKSB9LFxuICAgICAgICAgICAgeyB0eXBlOiAnQVRPTScsIHZhbHVlOiBlbmNvZGVQYXRoKGNvbm5lY3Rpb24sIG5ld1BhdGgpIH1cbiAgICAgICAgXSk7XG4gICAgICAgIHJlc3BvbnNlLm5leHQoKTtcbiAgICAgICAgcmV0dXJuIG1hcDtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgbGV0IGVycm9yQ29kZSA9IGdldFN0YXR1c0NvZGUoZXJyLnJlc3BvbnNlKTtcbiAgICAgICAgaWYgKGVycm9yQ29kZSkge1xuICAgICAgICAgICAgZXJyLnNlcnZlclJlc3BvbnNlQ29kZSA9IGVycm9yQ29kZTtcbiAgICAgICAgfVxuICAgICAgICBlcnIucmVzcG9uc2UgPSBhd2FpdCBnZXRFcnJvclRleHQoZXJyLnJlc3BvbnNlKTtcblxuICAgICAgICBjb25uZWN0aW9uLmxvZy53YXJuKHsgZXJyLCBjaWQ6IGNvbm5lY3Rpb24uaWQgfSk7XG4gICAgICAgIHRocm93IGVycjtcbiAgICB9XG59O1xuIl0sIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6WzBdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(action-browser)/./node_modules/imapflow/lib/commands/rename.js\n");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "(action-browser)/./node_modules/imapflow/lib/commands/search.js":
|
|
/*!******************************************************!*\
|
|
!*** ./node_modules/imapflow/lib/commands/search.js ***!
|
|
\******************************************************/
|
|
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
|
|
|
|
eval("\n\nconst { getStatusCode, getErrorText } = __webpack_require__(/*! ../tools.js */ \"(action-browser)/./node_modules/imapflow/lib/tools.js\");\nconst { searchCompiler } = __webpack_require__(/*! ../search-compiler.js */ \"(action-browser)/./node_modules/imapflow/lib/search-compiler.js\");\n\n// Updates flags for a message\nmodule.exports = async (connection, query, options) => {\n if (connection.state !== connection.states.SELECTED) {\n // nothing to do here\n return false;\n }\n\n options = options || {};\n\n let attributes;\n\n if (!query || query === true || (typeof query === 'object' && (!Object.keys(query).length || (Object.keys(query).length === 1 && query.all)))) {\n // search for all messages\n attributes = [{ type: 'ATOM', value: 'ALL' }];\n } else if (query && typeof query === 'object') {\n // normal query\n attributes = searchCompiler(connection, query);\n } else {\n return false;\n }\n\n let results = new Set();\n let response;\n try {\n response = await connection.exec(options.uid ? 'UID SEARCH' : 'SEARCH', attributes, {\n untagged: {\n SEARCH: async untagged => {\n if (untagged && untagged.attributes && untagged.attributes.length) {\n untagged.attributes.forEach(attribute => {\n if (attribute && attribute.value && typeof attribute.value === 'string' && !isNaN(attribute.value)) {\n results.add(Number(attribute.value));\n }\n });\n }\n }\n }\n });\n response.next();\n return Array.from(results).sort((a, b) => a - b);\n } catch (err) {\n let errorCode = getStatusCode(err.response);\n if (errorCode) {\n err.serverResponseCode = errorCode;\n }\n err.response = await getErrorText(err.response);\n\n connection.log.warn({ err, cid: connection.id });\n return false;\n }\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFjdGlvbi1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9pbWFwZmxvdy9saWIvY29tbWFuZHMvc2VhcmNoLmpzIiwibWFwcGluZ3MiOiJBQUFhOztBQUViLFFBQVEsOEJBQThCLEVBQUUsbUJBQU8sQ0FBQywwRUFBYTtBQUM3RCxRQUFRLGlCQUFpQixFQUFFLG1CQUFPLENBQUMsOEZBQXVCOztBQUUxRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLHdCQUF3Qiw0QkFBNEI7QUFDcEQsTUFBTTtBQUNOO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUJBQXlCO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsOEJBQThCLHlCQUF5QjtBQUN2RDtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIi9ob21lL2FsbWEvbmV4dGdlbi9OZWFoLW1haWwvbm9kZV9tb2R1bGVzL2ltYXBmbG93L2xpYi9jb21tYW5kcy9zZWFyY2guanMiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCB7IGdldFN0YXR1c0NvZGUsIGdldEVycm9yVGV4dCB9ID0gcmVxdWlyZSgnLi4vdG9vbHMuanMnKTtcbmNvbnN0IHsgc2VhcmNoQ29tcGlsZXIgfSA9IHJlcXVpcmUoJy4uL3NlYXJjaC1jb21waWxlci5qcycpO1xuXG4vLyBVcGRhdGVzIGZsYWdzIGZvciBhIG1lc3NhZ2Vcbm1vZHVsZS5leHBvcnRzID0gYXN5bmMgKGNvbm5lY3Rpb24sIHF1ZXJ5LCBvcHRpb25zKSA9PiB7XG4gICAgaWYgKGNvbm5lY3Rpb24uc3RhdGUgIT09IGNvbm5lY3Rpb24uc3RhdGVzLlNFTEVDVEVEKSB7XG4gICAgICAgIC8vIG5vdGhpbmcgdG8gZG8gaGVyZVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cbiAgICBsZXQgYXR0cmlidXRlcztcblxuICAgIGlmICghcXVlcnkgfHwgcXVlcnkgPT09IHRydWUgfHwgKHR5cGVvZiBxdWVyeSA9PT0gJ29iamVjdCcgJiYgKCFPYmplY3Qua2V5cyhxdWVyeSkubGVuZ3RoIHx8IChPYmplY3Qua2V5cyhxdWVyeSkubGVuZ3RoID09PSAxICYmIHF1ZXJ5LmFsbCkpKSkge1xuICAgICAgICAvLyBzZWFyY2ggZm9yIGFsbCBtZXNzYWdlc1xuICAgICAgICBhdHRyaWJ1dGVzID0gW3sgdHlwZTogJ0FUT00nLCB2YWx1ZTogJ0FMTCcgfV07XG4gICAgfSBlbHNlIGlmIChxdWVyeSAmJiB0eXBlb2YgcXVlcnkgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIC8vIG5vcm1hbCBxdWVyeVxuICAgICAgICBhdHRyaWJ1dGVzID0gc2VhcmNoQ29tcGlsZXIoY29ubmVjdGlvbiwgcXVlcnkpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBsZXQgcmVzdWx0cyA9IG5ldyBTZXQoKTtcbiAgICBsZXQgcmVzcG9uc2U7XG4gICAgdHJ5IHtcbiAgICAgICAgcmVzcG9uc2UgPSBhd2FpdCBjb25uZWN0aW9uLmV4ZWMob3B0aW9ucy51aWQgPyAnVUlEIFNFQVJDSCcgOiAnU0VBUkNIJywgYXR0cmlidXRlcywge1xuICAgICAgICAgICAgdW50YWdnZWQ6IHtcbiAgICAgICAgICAgICAgICBTRUFSQ0g6IGFzeW5jIHVudGFnZ2VkID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHVudGFnZ2VkICYmIHVudGFnZ2VkLmF0dHJpYnV0ZXMgJiYgdW50YWdnZWQuYXR0cmlidXRlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHVudGFnZ2VkLmF0dHJpYnV0ZXMuZm9yRWFjaChhdHRyaWJ1dGUgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhdHRyaWJ1dGUgJiYgYXR0cmlidXRlLnZhbHVlICYmIHR5cGVvZiBhdHRyaWJ1dGUudmFsdWUgPT09ICdzdHJpbmcnICYmICFpc05hTihhdHRyaWJ1dGUudmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHMuYWRkKE51bWJlcihhdHRyaWJ1dGUudmFsdWUpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJlc3BvbnNlLm5leHQoKTtcbiAgICAgICAgcmV0dXJuIEFycmF5LmZyb20ocmVzdWx0cykuc29ydCgoYSwgYikgPT4gYSAtIGIpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBsZXQgZXJyb3JDb2RlID0gZ2V0U3RhdHVzQ29kZShlcnIucmVzcG9uc2UpO1xuICAgICAgICBpZiAoZXJyb3JDb2RlKSB7XG4gICAgICAgICAgICBlcnIuc2VydmVyUmVzcG9uc2VDb2RlID0gZXJyb3JDb2RlO1xuICAgICAgICB9XG4gICAgICAgIGVyci5yZXNwb25zZSA9IGF3YWl0IGdldEVycm9yVGV4dChlcnIucmVzcG9uc2UpO1xuXG4gICAgICAgIGNvbm5lY3Rpb24ubG9nLndhcm4oeyBlcnIsIGNpZDogY29ubmVjdGlvbi5pZCB9KTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbn07XG4iXSwibmFtZXMiOltdLCJpZ25vcmVMaXN0IjpbMF0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(action-browser)/./node_modules/imapflow/lib/commands/search.js\n");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "(action-browser)/./node_modules/imapflow/lib/commands/select.js":
|
|
/*!******************************************************!*\
|
|
!*** ./node_modules/imapflow/lib/commands/select.js ***!
|
|
\******************************************************/
|
|
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
|
|
|
|
eval("\n\nconst { encodePath, normalizePath, getStatusCode, getErrorText } = __webpack_require__(/*! ../tools.js */ \"(action-browser)/./node_modules/imapflow/lib/tools.js\");\n\n// Selects a mailbox\nmodule.exports = async (connection, path, options) => {\n if (![connection.states.AUTHENTICATED, connection.states.SELECTED].includes(connection.state)) {\n // nothing to do here\n return;\n }\n options = options || {};\n\n path = normalizePath(connection, path);\n\n if (!connection.folders.has(path)) {\n let folders = await connection.run('LIST', '', path);\n if (!folders) {\n throw new Error('Failed to fetch folders');\n }\n folders.forEach(folder => {\n connection.folders.set(folder.path, folder);\n });\n }\n\n let folderListData = connection.folders.has(path) ? connection.folders.get(path) : false;\n\n let response;\n try {\n let map = { path };\n if (folderListData) {\n ['delimiter', 'specialUse', 'subscribed', 'listed'].forEach(key => {\n if (folderListData[key]) {\n map[key] = folderListData[key];\n }\n });\n }\n\n let extraArgs = [];\n if (connection.enabled.has('QRESYNC') && options.changedSince && options.uidValidity) {\n extraArgs.push([\n { type: 'ATOM', value: 'QRESYNC' },\n [\n { type: 'ATOM', value: options.uidValidity?.toString() },\n { type: 'ATOM', value: options.changedSince.toString() }\n ]\n ]);\n map.qresync = true;\n }\n\n let encodedPath = encodePath(connection, path);\n\n let selectCommand = {\n command: !options.readOnly ? 'SELECT' : 'EXAMINE',\n arguments: [{ type: encodedPath.indexOf('&') >= 0 ? 'STRING' : 'ATOM', value: encodedPath }].concat(extraArgs || [])\n };\n\n response = await connection.exec(selectCommand.command, selectCommand.arguments, {\n untagged: {\n OK: async untagged => {\n if (!untagged.attributes || !untagged.attributes.length) {\n return;\n }\n let section = !untagged.attributes[0].value && untagged.attributes[0].section;\n if (section && section.length > 1 && section[0].type === 'ATOM' && typeof section[0].value === 'string') {\n let key = section[0].value.toLowerCase();\n let value;\n\n if (typeof section[1].value === 'string') {\n value = section[1].value;\n } else if (Array.isArray(section[1])) {\n value = section[1].map(entry => (typeof entry.value === 'string' ? entry.value : false)).filter(entry => entry);\n }\n\n switch (key) {\n case 'highestmodseq':\n key = 'highestModseq';\n if (/^[0-9]+$/.test(value)) {\n value = BigInt(value);\n }\n break;\n\n case 'mailboxid':\n key = 'mailboxId';\n if (Array.isArray(value) && value.length) {\n value = value[0];\n }\n break;\n\n case 'permanentflags':\n key = 'permanentFlags';\n value = new Set(value);\n break;\n\n case 'uidnext':\n key = 'uidNext';\n value = Number(value);\n break;\n\n case 'uidvalidity':\n key = 'uidValidity';\n if (/^[0-9]+$/.test(value)) {\n value = BigInt(value);\n }\n break;\n }\n\n map[key] = value;\n }\n\n if (section && section.length === 1 && section[0].type === 'ATOM' && typeof section[0].value === 'string') {\n let key = section[0].value.toLowerCase();\n switch (key) {\n case 'nomodseq':\n key = 'noModseq';\n map[key] = true;\n break;\n }\n }\n },\n FLAGS: async untagged => {\n if (!untagged.attributes || (!untagged.attributes.length && Array.isArray(untagged.attributes[0]))) {\n return;\n }\n let flags = untagged.attributes[0].map(flag => (typeof flag.value === 'string' ? flag.value : false)).filter(flag => flag);\n map.flags = new Set(flags);\n },\n EXISTS: async untagged => {\n let num = Number(untagged.command);\n if (isNaN(num)) {\n return false;\n }\n\n map.exists = num;\n },\n VANISHED: async untagged => {\n await connection.untaggedVanished(\n untagged,\n // mailbox is not yet open, so use a dummy mailbox object\n { path, uidNext: false, uidValidity: false }\n );\n },\n // we should only get an untagged FETCH for a SELECT/EXAMINE if QRESYNC was asked for\n FETCH: async untagged => {\n await connection.untaggedFetch(\n untagged,\n // mailbox is not yet open, so use a dummy mailbox object\n { path, uidNext: false, uidValidity: false }\n );\n }\n }\n });\n\n let section = !response.response.attributes[0].value && response.response.attributes[0].section;\n if (section && section.length && section[0].type === 'ATOM' && typeof section[0].value === 'string') {\n switch (section[0].value.toUpperCase()) {\n case 'READ-ONLY':\n map.readOnly = true;\n break;\n case 'READ-WRITE':\n default:\n map.readOnly = false;\n break;\n }\n }\n\n if (\n map.qresync &&\n // UIDVALIDITY must be the same\n (options.uidValidity !== map.uidValidity ||\n // HIGHESTMODSEQ response must be present\n !map.highestModseq ||\n // NOMODSEQ is not allowed\n map.noModseq)\n ) {\n // QRESYNC does not apply here, so unset it\n map.qresync = false;\n }\n\n let currentMailbox = connection.mailbox;\n connection.mailbox = false;\n\n if (currentMailbox && currentMailbox.path !== path) {\n connection.emit('mailboxClose', currentMailbox);\n }\n\n connection.mailbox = map;\n connection.currentSelectCommand = selectCommand;\n connection.state = connection.states.SELECTED;\n\n if (!currentMailbox || currentMailbox.path !== path) {\n connection.emit('mailboxOpen', connection.mailbox);\n }\n\n response.next();\n return map;\n } catch (err) {\n let errorCode = getStatusCode(err.response);\n if (errorCode) {\n err.serverResponseCode = errorCode;\n }\n err.response = await getErrorText(err.response);\n\n if (connection.state === connection.states.SELECTED) {\n // reset selected state\n\n let currentMailbox = connection.mailbox;\n\n connection.mailbox = false;\n connection.currentSelectCommand = false;\n connection.state = connection.states.AUTHENTICATED;\n\n if (currentMailbox) {\n connection.emit('mailboxClose', currentMailbox);\n }\n }\n\n connection.log.warn({ err, cid: connection.id });\n throw err;\n }\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFjdGlvbi1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9pbWFwZmxvdy9saWIvY29tbWFuZHMvc2VsZWN0LmpzIiwibWFwcGluZ3MiOiJBQUFhOztBQUViLFFBQVEseURBQXlELEVBQUUsbUJBQU8sQ0FBQywwRUFBYTs7QUFFeEY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLG9CQUFvQjtBQUNwQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQixnQ0FBZ0M7QUFDbEQ7QUFDQSxzQkFBc0Isc0RBQXNEO0FBQzVFLHNCQUFzQjtBQUN0QjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0EsMEJBQTBCLDZFQUE2RTtBQUN2Rzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsMEJBQTBCO0FBQzFCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMEJBQTBCO0FBQzFCO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQkFBMEI7QUFDMUI7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLDhCQUE4Qix5QkFBeUI7QUFDdkQ7QUFDQTtBQUNBIiwic291cmNlcyI6WyIvaG9tZS9hbG1hL25leHRnZW4vTmVhaC1tYWlsL25vZGVfbW9kdWxlcy9pbWFwZmxvdy9saWIvY29tbWFuZHMvc2VsZWN0LmpzIl0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcblxuY29uc3QgeyBlbmNvZGVQYXRoLCBub3JtYWxpemVQYXRoLCBnZXRTdGF0dXNDb2RlLCBnZXRFcnJvclRleHQgfSA9IHJlcXVpcmUoJy4uL3Rvb2xzLmpzJyk7XG5cbi8vIFNlbGVjdHMgYSBtYWlsYm94XG5tb2R1bGUuZXhwb3J0cyA9IGFzeW5jIChjb25uZWN0aW9uLCBwYXRoLCBvcHRpb25zKSA9PiB7XG4gICAgaWYgKCFbY29ubmVjdGlvbi5zdGF0ZXMuQVVUSEVOVElDQVRFRCwgY29ubmVjdGlvbi5zdGF0ZXMuU0VMRUNURURdLmluY2x1ZGVzKGNvbm5lY3Rpb24uc3RhdGUpKSB7XG4gICAgICAgIC8vIG5vdGhpbmcgdG8gZG8gaGVyZVxuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuXG4gICAgcGF0aCA9IG5vcm1hbGl6ZVBhdGgoY29ubmVjdGlvbiwgcGF0aCk7XG5cbiAgICBpZiAoIWNvbm5lY3Rpb24uZm9sZGVycy5oYXMocGF0aCkpIHtcbiAgICAgICAgbGV0IGZvbGRlcnMgPSBhd2FpdCBjb25uZWN0aW9uLnJ1bignTElTVCcsICcnLCBwYXRoKTtcbiAgICAgICAgaWYgKCFmb2xkZXJzKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZhaWxlZCB0byBmZXRjaCBmb2xkZXJzJyk7XG4gICAgICAgIH1cbiAgICAgICAgZm9sZGVycy5mb3JFYWNoKGZvbGRlciA9PiB7XG4gICAgICAgICAgICBjb25uZWN0aW9uLmZvbGRlcnMuc2V0KGZvbGRlci5wYXRoLCBmb2xkZXIpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBsZXQgZm9sZGVyTGlzdERhdGEgPSBjb25uZWN0aW9uLmZvbGRlcnMuaGFzKHBhdGgpID8gY29ubmVjdGlvbi5mb2xkZXJzLmdldChwYXRoKSA6IGZhbHNlO1xuXG4gICAgbGV0IHJlc3BvbnNlO1xuICAgIHRyeSB7XG4gICAgICAgIGxldCBtYXAgPSB7IHBhdGggfTtcbiAgICAgICAgaWYgKGZvbGRlckxpc3REYXRhKSB7XG4gICAgICAgICAgICBbJ2RlbGltaXRlcicsICdzcGVjaWFsVXNlJywgJ3N1YnNjcmliZWQnLCAnbGlzdGVkJ10uZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChmb2xkZXJMaXN0RGF0YVtrZXldKSB7XG4gICAgICAgICAgICAgICAgICAgIG1hcFtrZXldID0gZm9sZGVyTGlzdERhdGFba2V5XTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBleHRyYUFyZ3MgPSBbXTtcbiAgICAgICAgaWYgKGNvbm5lY3Rpb24uZW5hYmxlZC5oYXMoJ1FSRVNZTkMnKSAmJiBvcHRpb25zLmNoYW5nZWRTaW5jZSAmJiBvcHRpb25zLnVpZFZhbGlkaXR5KSB7XG4gICAgICAgICAgICBleHRyYUFyZ3MucHVzaChbXG4gICAgICAgICAgICAgICAgeyB0eXBlOiAnQVRPTScsIHZhbHVlOiAnUVJFU1lOQycgfSxcbiAgICAgICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgICAgIHsgdHlwZTogJ0FUT00nLCB2YWx1ZTogb3B0aW9ucy51aWRWYWxpZGl0eT8udG9TdHJpbmcoKSB9LFxuICAgICAgICAgICAgICAgICAgICB7IHR5cGU6ICdBVE9NJywgdmFsdWU6IG9wdGlvbnMuY2hhbmdlZFNpbmNlLnRvU3RyaW5nKCkgfVxuICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgIF0pO1xuICAgICAgICAgICAgbWFwLnFyZXN5bmMgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGVuY29kZWRQYXRoID0gZW5jb2RlUGF0aChjb25uZWN0aW9uLCBwYXRoKTtcblxuICAgICAgICBsZXQgc2VsZWN0Q29tbWFuZCA9IHtcbiAgICAgICAgICAgIGNvbW1hbmQ6ICFvcHRpb25zLnJlYWRPbmx5ID8gJ1NFTEVDVCcgOiAnRVhBTUlORScsXG4gICAgICAgICAgICBhcmd1bWVudHM6IFt7IHR5cGU6IGVuY29kZWRQYXRoLmluZGV4T2YoJyYnKSA+PSAwID8gJ1NUUklORycgOiAnQVRPTScsIHZhbHVlOiBlbmNvZGVkUGF0aCB9XS5jb25jYXQoZXh0cmFBcmdzIHx8IFtdKVxuICAgICAgICB9O1xuXG4gICAgICAgIHJlc3BvbnNlID0gYXdhaXQgY29ubmVjdGlvbi5leGVjKHNlbGVjdENvbW1hbmQuY29tbWFuZCwgc2VsZWN0Q29tbWFuZC5hcmd1bWVudHMsIHtcbiAgICAgICAgICAgIHVudGFnZ2VkOiB7XG4gICAgICAgICAgICAgICAgT0s6IGFzeW5jIHVudGFnZ2VkID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCF1bnRhZ2dlZC5hdHRyaWJ1dGVzIHx8ICF1bnRhZ2dlZC5hdHRyaWJ1dGVzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGxldCBzZWN0aW9uID0gIXVudGFnZ2VkLmF0dHJpYnV0ZXNbMF0udmFsdWUgJiYgdW50YWdnZWQuYXR0cmlidXRlc1swXS5zZWN0aW9uO1xuICAgICAgICAgICAgICAgICAgICBpZiAoc2VjdGlvbiAmJiBzZWN0aW9uLmxlbmd0aCA+IDEgJiYgc2VjdGlvblswXS50eXBlID09PSAnQVRPTScgJiYgdHlwZW9mIHNlY3Rpb25bMF0udmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQga2V5ID0gc2VjdGlvblswXS52YWx1ZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHZhbHVlO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHNlY3Rpb25bMV0udmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBzZWN0aW9uWzFdLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KHNlY3Rpb25bMV0pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBzZWN0aW9uWzFdLm1hcChlbnRyeSA9PiAodHlwZW9mIGVudHJ5LnZhbHVlID09PSAnc3RyaW5nJyA/IGVudHJ5LnZhbHVlIDogZmFsc2UpKS5maWx0ZXIoZW50cnkgPT4gZW50cnkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGtleSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2hpZ2hlc3Rtb2RzZXEnOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXkgPSAnaGlnaGVzdE1vZHNlcSc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgvXlswLTldKyQvLnRlc3QodmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IEJpZ0ludCh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdtYWlsYm94aWQnOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXkgPSAnbWFpbGJveElkJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpICYmIHZhbHVlLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZVswXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3Blcm1hbmVudGZsYWdzJzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5ID0gJ3Blcm1hbmVudEZsYWdzJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBuZXcgU2V0KHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICd1aWRuZXh0JzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5ID0gJ3VpZE5leHQnO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IE51bWJlcih2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAndWlkdmFsaWRpdHknOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXkgPSAndWlkVmFsaWRpdHknO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoL15bMC05XSskLy50ZXN0KHZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBCaWdJbnQodmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXBba2V5XSA9IHZhbHVlO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHNlY3Rpb24gJiYgc2VjdGlvbi5sZW5ndGggPT09IDEgJiYgc2VjdGlvblswXS50eXBlID09PSAnQVRPTScgJiYgdHlwZW9mIHNlY3Rpb25bMF0udmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQga2V5ID0gc2VjdGlvblswXS52YWx1ZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChrZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdub21vZHNlcSc6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleSA9ICdub01vZHNlcSc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcFtrZXldID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIEZMQUdTOiBhc3luYyB1bnRhZ2dlZCA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghdW50YWdnZWQuYXR0cmlidXRlcyB8fCAoIXVudGFnZ2VkLmF0dHJpYnV0ZXMubGVuZ3RoICYmIEFycmF5LmlzQXJyYXkodW50YWdnZWQuYXR0cmlidXRlc1swXSkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbGV0IGZsYWdzID0gdW50YWdnZWQuYXR0cmlidXRlc1swXS5tYXAoZmxhZyA9PiAodHlwZW9mIGZsYWcudmFsdWUgPT09ICdzdHJpbmcnID8gZmxhZy52YWx1ZSA6IGZhbHNlKSkuZmlsdGVyKGZsYWcgPT4gZmxhZyk7XG4gICAgICAgICAgICAgICAgICAgIG1hcC5mbGFncyA9IG5ldyBTZXQoZmxhZ3MpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgRVhJU1RTOiBhc3luYyB1bnRhZ2dlZCA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBudW0gPSBOdW1iZXIodW50YWdnZWQuY29tbWFuZCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpc05hTihudW0pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBtYXAuZXhpc3RzID0gbnVtO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgVkFOSVNIRUQ6IGFzeW5jIHVudGFnZ2VkID0+IHtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgY29ubmVjdGlvbi51bnRhZ2dlZFZhbmlzaGVkKFxuICAgICAgICAgICAgICAgICAgICAgICAgdW50YWdnZWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBtYWlsYm94IGlzIG5vdCB5ZXQgb3Blbiwgc28gdXNlIGEgZHVtbXkgbWFpbGJveCBvYmplY3RcbiAgICAgICAgICAgICAgICAgICAgICAgIHsgcGF0aCwgdWlkTmV4dDogZmFsc2UsIHVpZFZhbGlkaXR5OiBmYWxzZSB9XG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAvLyB3ZSBzaG91bGQgb25seSBnZXQgYW4gdW50YWdnZWQgRkVUQ0ggZm9yIGEgU0VMRUNUL0VYQU1JTkUgaWYgUVJFU1lOQyB3YXMgYXNrZWQgZm9yXG4gICAgICAgICAgICAgICAgRkVUQ0g6IGFzeW5jIHVudGFnZ2VkID0+IHtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgY29ubmVjdGlvbi51bnRhZ2dlZEZldGNoKFxuICAgICAgICAgICAgICAgICAgICAgICAgdW50YWdnZWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBtYWlsYm94IGlzIG5vdCB5ZXQgb3Blbiwgc28gdXNlIGEgZHVtbXkgbWFpbGJveCBvYmplY3RcbiAgICAgICAgICAgICAgICAgICAgICAgIHsgcGF0aCwgdWlkTmV4dDogZmFsc2UsIHVpZFZhbGlkaXR5OiBmYWxzZSB9XG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBsZXQgc2VjdGlvbiA9ICFyZXNwb25zZS5yZXNwb25zZS5hdHRyaWJ1dGVzWzBdLnZhbHVlICYmIHJlc3BvbnNlLnJlc3BvbnNlLmF0dHJpYnV0ZXNbMF0uc2VjdGlvbjtcbiAgICAgICAgaWYgKHNlY3Rpb24gJiYgc2VjdGlvbi5sZW5ndGggJiYgc2VjdGlvblswXS50eXBlID09PSAnQVRPTScgJiYgdHlwZW9mIHNlY3Rpb25bMF0udmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBzd2l0Y2ggKHNlY3Rpb25bMF0udmFsdWUudG9VcHBlckNhc2UoKSkge1xuICAgICAgICAgICAgICAgIGNhc2UgJ1JFQUQtT05MWSc6XG4gICAgICAgICAgICAgICAgICAgIG1hcC5yZWFkT25seSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ1JFQUQtV1JJVEUnOlxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIG1hcC5yZWFkT25seSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIG1hcC5xcmVzeW5jICYmXG4gICAgICAgICAgICAvLyBVSURWQUxJRElUWSBtdXN0IGJlIHRoZSBzYW1lXG4gICAgICAgICAgICAob3B0aW9ucy51aWRWYWxpZGl0eSAhPT0gbWFwLnVpZFZhbGlkaXR5IHx8XG4gICAgICAgICAgICAgICAgLy8gSElHSEVTVE1PRFNFUSByZXNwb25zZSBtdXN0IGJlIHByZXNlbnRcbiAgICAgICAgICAgICAgICAhbWFwLmhpZ2hlc3RNb2RzZXEgfHxcbiAgICAgICAgICAgICAgICAvLyBOT01PRFNFUSBpcyBub3QgYWxsb3dlZFxuICAgICAgICAgICAgICAgIG1hcC5ub01vZHNlcSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgICAvLyBRUkVTWU5DIGRvZXMgbm90IGFwcGx5IGhlcmUsIHNvIHVuc2V0IGl0XG4gICAgICAgICAgICBtYXAucXJlc3luYyA9IGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGN1cnJlbnRNYWlsYm94ID0gY29ubmVjdGlvbi5tYWlsYm94O1xuICAgICAgICBjb25uZWN0aW9uLm1haWxib3ggPSBmYWxzZTtcblxuICAgICAgICBpZiAoY3VycmVudE1haWxib3ggJiYgY3VycmVudE1haWxib3gucGF0aCAhPT0gcGF0aCkge1xuICAgICAgICAgICAgY29ubmVjdGlvbi5lbWl0KCdtYWlsYm94Q2xvc2UnLCBjdXJyZW50TWFpbGJveCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25uZWN0aW9uLm1haWxib3ggPSBtYXA7XG4gICAgICAgIGNvbm5lY3Rpb24uY3VycmVudFNlbGVjdENvbW1hbmQgPSBzZWxlY3RDb21tYW5kO1xuICAgICAgICBjb25uZWN0aW9uLnN0YXRlID0gY29ubmVjdGlvbi5zdGF0ZXMuU0VMRUNURUQ7XG5cbiAgICAgICAgaWYgKCFjdXJyZW50TWFpbGJveCB8fCBjdXJyZW50TWFpbGJveC5wYXRoICE9PSBwYXRoKSB7XG4gICAgICAgICAgICBjb25uZWN0aW9uLmVtaXQoJ21haWxib3hPcGVuJywgY29ubmVjdGlvbi5tYWlsYm94KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJlc3BvbnNlLm5leHQoKTtcbiAgICAgICAgcmV0dXJuIG1hcDtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgbGV0IGVycm9yQ29kZSA9IGdldFN0YXR1c0NvZGUoZXJyLnJlc3BvbnNlKTtcbiAgICAgICAgaWYgKGVycm9yQ29kZSkge1xuICAgICAgICAgICAgZXJyLnNlcnZlclJlc3BvbnNlQ29kZSA9IGVycm9yQ29kZTtcbiAgICAgICAgfVxuICAgICAgICBlcnIucmVzcG9uc2UgPSBhd2FpdCBnZXRFcnJvclRleHQoZXJyLnJlc3BvbnNlKTtcblxuICAgICAgICBpZiAoY29ubmVjdGlvbi5zdGF0ZSA9PT0gY29ubmVjdGlvbi5zdGF0ZXMuU0VMRUNURUQpIHtcbiAgICAgICAgICAgIC8vIHJlc2V0IHNlbGVjdGVkIHN0YXRlXG5cbiAgICAgICAgICAgIGxldCBjdXJyZW50TWFpbGJveCA9IGNvbm5lY3Rpb24ubWFpbGJveDtcblxuICAgICAgICAgICAgY29ubmVjdGlvbi5tYWlsYm94ID0gZmFsc2U7XG4gICAgICAgICAgICBjb25uZWN0aW9uLmN1cnJlbnRTZWxlY3RDb21tYW5kID0gZmFsc2U7XG4gICAgICAgICAgICBjb25uZWN0aW9uLnN0YXRlID0gY29ubmVjdGlvbi5zdGF0ZXMuQVVUSEVOVElDQVRFRDtcblxuICAgICAgICAgICAgaWYgKGN1cnJlbnRNYWlsYm94KSB7XG4gICAgICAgICAgICAgICAgY29ubmVjdGlvbi5lbWl0KCdtYWlsYm94Q2xvc2UnLCBjdXJyZW50TWFpbGJveCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25uZWN0aW9uLmxvZy53YXJuKHsgZXJyLCBjaWQ6IGNvbm5lY3Rpb24uaWQgfSk7XG4gICAgICAgIHRocm93IGVycjtcbiAgICB9XG59O1xuIl0sIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6WzBdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(action-browser)/./node_modules/imapflow/lib/commands/select.js\n");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "(action-browser)/./node_modules/imapflow/lib/commands/starttls.js":
|
|
/*!********************************************************!*\
|
|
!*** ./node_modules/imapflow/lib/commands/starttls.js ***!
|
|
\********************************************************/
|
|
/***/ ((module) => {
|
|
|
|
eval("\n\n// Requests STARTTLS info from server\nmodule.exports = async connection => {\n if (!connection.capabilities.has('STARTTLS') || connection.secureConnection) {\n // nothing to do here\n return false;\n }\n\n let response;\n try {\n response = await connection.exec('STARTTLS');\n response.next();\n return true;\n } catch (err) {\n connection.log.warn({ err, cid: connection.id });\n return false;\n }\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFjdGlvbi1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9pbWFwZmxvdy9saWIvY29tbWFuZHMvc3RhcnR0bHMuanMiLCJtYXBwaW5ncyI6IkFBQWE7O0FBRWI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ04sOEJBQThCLHlCQUF5QjtBQUN2RDtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIi9ob21lL2FsbWEvbmV4dGdlbi9OZWFoLW1haWwvbm9kZV9tb2R1bGVzL2ltYXBmbG93L2xpYi9jb21tYW5kcy9zdGFydHRscy5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbi8vIFJlcXVlc3RzIFNUQVJUVExTIGluZm8gZnJvbSBzZXJ2ZXJcbm1vZHVsZS5leHBvcnRzID0gYXN5bmMgY29ubmVjdGlvbiA9PiB7XG4gICAgaWYgKCFjb25uZWN0aW9uLmNhcGFiaWxpdGllcy5oYXMoJ1NUQVJUVExTJykgfHwgY29ubmVjdGlvbi5zZWN1cmVDb25uZWN0aW9uKSB7XG4gICAgICAgIC8vIG5vdGhpbmcgdG8gZG8gaGVyZVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgbGV0IHJlc3BvbnNlO1xuICAgIHRyeSB7XG4gICAgICAgIHJlc3BvbnNlID0gYXdhaXQgY29ubmVjdGlvbi5leGVjKCdTVEFSVFRMUycpO1xuICAgICAgICByZXNwb25zZS5uZXh0KCk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBjb25uZWN0aW9uLmxvZy53YXJuKHsgZXJyLCBjaWQ6IGNvbm5lY3Rpb24uaWQgfSk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG59O1xuIl0sIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6WzBdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(action-browser)/./node_modules/imapflow/lib/commands/starttls.js\n");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "(action-browser)/./node_modules/imapflow/lib/commands/status.js":
|
|
/*!******************************************************!*\
|
|
!*** ./node_modules/imapflow/lib/commands/status.js ***!
|
|
\******************************************************/
|
|
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
|
|
|
|
eval("\n\nconst { encodePath, normalizePath } = __webpack_require__(/*! ../tools.js */ \"(action-browser)/./node_modules/imapflow/lib/tools.js\");\n\n// Requests info about a mailbox\nmodule.exports = async (connection, path, query) => {\n if (![connection.states.AUTHENTICATED, connection.states.SELECTED].includes(connection.state) || !path) {\n // nothing to do here\n return false;\n }\n\n path = normalizePath(connection, path);\n let encodedPath = encodePath(connection, path);\n\n let attributes = [{ type: encodedPath.indexOf('&') >= 0 ? 'STRING' : 'ATOM', value: encodedPath }];\n\n let queryAttributes = [];\n Object.keys(query || {}).forEach(key => {\n if (!query[key]) {\n return;\n }\n\n switch (key.toUpperCase()) {\n case 'MESSAGES':\n case 'RECENT':\n case 'UIDNEXT':\n case 'UIDVALIDITY':\n case 'UNSEEN':\n queryAttributes.push({ type: 'ATOM', value: key.toUpperCase() });\n break;\n\n case 'HIGHESTMODSEQ':\n if (connection.capabilities.has('CONDSTORE')) {\n queryAttributes.push({ type: 'ATOM', value: key.toUpperCase() });\n }\n break;\n }\n });\n\n if (!queryAttributes.length) {\n return false;\n }\n\n attributes.push(queryAttributes);\n\n let response;\n try {\n let map = { path };\n response = await connection.exec('STATUS', attributes, {\n untagged: {\n STATUS: async untagged => {\n // If STATUS is for current mailbox then update mailbox values\n let updateCurrent = connection.state === connection.states.SELECTED && path === connection.mailbox.path;\n\n let list = untagged.attributes && Array.isArray(untagged.attributes[1]) ? untagged.attributes[1] : false;\n if (!list) {\n return;\n }\n let key;\n list.forEach((entry, i) => {\n if (i % 2 === 0) {\n key = entry && typeof entry.value === 'string' ? entry.value : false;\n return;\n }\n if (!key || !entry || typeof entry.value !== 'string') {\n return;\n }\n let value = false;\n switch (key.toUpperCase()) {\n case 'MESSAGES':\n key = 'messages';\n value = !isNaN(entry.value) ? Number(entry.value) : false;\n if (updateCurrent) {\n let prevCount = connection.mailbox.exists;\n if (prevCount !== value) {\n // somehow message count in current folder has changed?\n connection.mailbox.exists = value;\n connection.emit('exists', {\n path,\n count: value,\n prevCount\n });\n }\n }\n break;\n\n case 'RECENT':\n key = 'recent';\n value = !isNaN(entry.value) ? Number(entry.value) : false;\n break;\n\n case 'UIDNEXT':\n key = 'uidNext';\n value = !isNaN(entry.value) ? Number(entry.value) : false;\n if (updateCurrent) {\n connection.mailbox.uidNext = value;\n }\n break;\n\n case 'UIDVALIDITY':\n key = 'uidValidity';\n value = !isNaN(entry.value) ? BigInt(entry.value) : false;\n break;\n\n case 'UNSEEN':\n key = 'unseen';\n value = !isNaN(entry.value) ? Number(entry.value) : false;\n break;\n\n case 'HIGHESTMODSEQ':\n key = 'highestModseq';\n value = !isNaN(entry.value) ? BigInt(entry.value) : false;\n if (updateCurrent) {\n connection.mailbox.highestModseq = value;\n }\n break;\n }\n if (value === false) {\n return;\n }\n\n map[key] = value;\n });\n }\n }\n });\n response.next();\n return map;\n } catch (err) {\n if (err.responseStatus === 'NO') {\n let folders = await connection.run('LIST', '', path, { listOnly: true });\n if (folders && !folders.length) {\n let error = new Error(`Mailbox doesn't exist: ${path}`);\n error.code = 'NotFound';\n error.response = err;\n throw error;\n }\n }\n\n connection.log.warn({ err, cid: connection.id });\n return false;\n }\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFjdGlvbi1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9pbWFwZmxvdy9saWIvY29tbWFuZHMvc3RhdHVzLmpzIiwibWFwcGluZ3MiOiJBQUFhOztBQUViLFFBQVEsNEJBQTRCLEVBQUUsbUJBQU8sQ0FBQywwRUFBYTs7QUFFM0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUEsd0JBQXdCLDZFQUE2RTs7QUFFckc7QUFDQSwyQkFBMkI7QUFDM0I7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVDQUF1Qyx3Q0FBd0M7QUFDL0U7O0FBRUE7QUFDQTtBQUNBLDJDQUEyQyx3Q0FBd0M7QUFDbkY7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLG9CQUFvQjtBQUNwQjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlDQUF5QztBQUN6QztBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLHFCQUFxQjtBQUNyQjtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQSxtRUFBbUUsZ0JBQWdCO0FBQ25GO0FBQ0EsZ0VBQWdFLEtBQUs7QUFDckU7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSw4QkFBOEIseUJBQXlCO0FBQ3ZEO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsiL2hvbWUvYWxtYS9uZXh0Z2VuL05lYWgtbWFpbC9ub2RlX21vZHVsZXMvaW1hcGZsb3cvbGliL2NvbW1hbmRzL3N0YXR1cy5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbmNvbnN0IHsgZW5jb2RlUGF0aCwgbm9ybWFsaXplUGF0aCB9ID0gcmVxdWlyZSgnLi4vdG9vbHMuanMnKTtcblxuLy8gUmVxdWVzdHMgaW5mbyBhYm91dCBhIG1haWxib3hcbm1vZHVsZS5leHBvcnRzID0gYXN5bmMgKGNvbm5lY3Rpb24sIHBhdGgsIHF1ZXJ5KSA9PiB7XG4gICAgaWYgKCFbY29ubmVjdGlvbi5zdGF0ZXMuQVVUSEVOVElDQVRFRCwgY29ubmVjdGlvbi5zdGF0ZXMuU0VMRUNURURdLmluY2x1ZGVzKGNvbm5lY3Rpb24uc3RhdGUpIHx8ICFwYXRoKSB7XG4gICAgICAgIC8vIG5vdGhpbmcgdG8gZG8gaGVyZVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcGF0aCA9IG5vcm1hbGl6ZVBhdGgoY29ubmVjdGlvbiwgcGF0aCk7XG4gICAgbGV0IGVuY29kZWRQYXRoID0gZW5jb2RlUGF0aChjb25uZWN0aW9uLCBwYXRoKTtcblxuICAgIGxldCBhdHRyaWJ1dGVzID0gW3sgdHlwZTogZW5jb2RlZFBhdGguaW5kZXhPZignJicpID49IDAgPyAnU1RSSU5HJyA6ICdBVE9NJywgdmFsdWU6IGVuY29kZWRQYXRoIH1dO1xuXG4gICAgbGV0IHF1ZXJ5QXR0cmlidXRlcyA9IFtdO1xuICAgIE9iamVjdC5rZXlzKHF1ZXJ5IHx8IHt9KS5mb3JFYWNoKGtleSA9PiB7XG4gICAgICAgIGlmICghcXVlcnlba2V5XSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgc3dpdGNoIChrZXkudG9VcHBlckNhc2UoKSkge1xuICAgICAgICAgICAgY2FzZSAnTUVTU0FHRVMnOlxuICAgICAgICAgICAgY2FzZSAnUkVDRU5UJzpcbiAgICAgICAgICAgIGNhc2UgJ1VJRE5FWFQnOlxuICAgICAgICAgICAgY2FzZSAnVUlEVkFMSURJVFknOlxuICAgICAgICAgICAgY2FzZSAnVU5TRUVOJzpcbiAgICAgICAgICAgICAgICBxdWVyeUF0dHJpYnV0ZXMucHVzaCh7IHR5cGU6ICdBVE9NJywgdmFsdWU6IGtleS50b1VwcGVyQ2FzZSgpIH0pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICBjYXNlICdISUdIRVNUTU9EU0VRJzpcbiAgICAgICAgICAgICAgICBpZiAoY29ubmVjdGlvbi5jYXBhYmlsaXRpZXMuaGFzKCdDT05EU1RPUkUnKSkge1xuICAgICAgICAgICAgICAgICAgICBxdWVyeUF0dHJpYnV0ZXMucHVzaCh7IHR5cGU6ICdBVE9NJywgdmFsdWU6IGtleS50b1VwcGVyQ2FzZSgpIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgaWYgKCFxdWVyeUF0dHJpYnV0ZXMubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBhdHRyaWJ1dGVzLnB1c2gocXVlcnlBdHRyaWJ1dGVzKTtcblxuICAgIGxldCByZXNwb25zZTtcbiAgICB0cnkge1xuICAgICAgICBsZXQgbWFwID0geyBwYXRoIH07XG4gICAgICAgIHJlc3BvbnNlID0gYXdhaXQgY29ubmVjdGlvbi5leGVjKCdTVEFUVVMnLCBhdHRyaWJ1dGVzLCB7XG4gICAgICAgICAgICB1bnRhZ2dlZDoge1xuICAgICAgICAgICAgICAgIFNUQVRVUzogYXN5bmMgdW50YWdnZWQgPT4ge1xuICAgICAgICAgICAgICAgICAgICAvLyBJZiBTVEFUVVMgaXMgZm9yIGN1cnJlbnQgbWFpbGJveCB0aGVuIHVwZGF0ZSBtYWlsYm94IHZhbHVlc1xuICAgICAgICAgICAgICAgICAgICBsZXQgdXBkYXRlQ3VycmVudCA9IGNvbm5lY3Rpb24uc3RhdGUgPT09IGNvbm5lY3Rpb24uc3RhdGVzLlNFTEVDVEVEICYmIHBhdGggPT09IGNvbm5lY3Rpb24ubWFpbGJveC5wYXRoO1xuXG4gICAgICAgICAgICAgICAgICAgIGxldCBsaXN0ID0gdW50YWdnZWQuYXR0cmlidXRlcyAmJiBBcnJheS5pc0FycmF5KHVudGFnZ2VkLmF0dHJpYnV0ZXNbMV0pID8gdW50YWdnZWQuYXR0cmlidXRlc1sxXSA6IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWxpc3QpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBsZXQga2V5O1xuICAgICAgICAgICAgICAgICAgICBsaXN0LmZvckVhY2goKGVudHJ5LCBpKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaSAlIDIgPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXkgPSBlbnRyeSAmJiB0eXBlb2YgZW50cnkudmFsdWUgPT09ICdzdHJpbmcnID8gZW50cnkudmFsdWUgOiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWtleSB8fCAhZW50cnkgfHwgdHlwZW9mIGVudHJ5LnZhbHVlICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB2YWx1ZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChrZXkudG9VcHBlckNhc2UoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ01FU1NBR0VTJzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5ID0gJ21lc3NhZ2VzJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSAhaXNOYU4oZW50cnkudmFsdWUpID8gTnVtYmVyKGVudHJ5LnZhbHVlKSA6IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodXBkYXRlQ3VycmVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHByZXZDb3VudCA9IGNvbm5lY3Rpb24ubWFpbGJveC5leGlzdHM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJldkNvdW50ICE9PSB2YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNvbWVob3cgbWVzc2FnZSBjb3VudCBpbiBjdXJyZW50IGZvbGRlciBoYXMgY2hhbmdlZD9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uLm1haWxib3guZXhpc3RzID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbi5lbWl0KCdleGlzdHMnLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGgsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OiB2YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldkNvdW50XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdSRUNFTlQnOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXkgPSAncmVjZW50JztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSAhaXNOYU4oZW50cnkudmFsdWUpID8gTnVtYmVyKGVudHJ5LnZhbHVlKSA6IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ1VJRE5FWFQnOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXkgPSAndWlkTmV4dCc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gIWlzTmFOKGVudHJ5LnZhbHVlKSA/IE51bWJlcihlbnRyeS52YWx1ZSkgOiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHVwZGF0ZUN1cnJlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24ubWFpbGJveC51aWROZXh0ID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdVSURWQUxJRElUWSc6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleSA9ICd1aWRWYWxpZGl0eSc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gIWlzTmFOKGVudHJ5LnZhbHVlKSA/IEJpZ0ludChlbnRyeS52YWx1ZSkgOiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdVTlNFRU4nOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXkgPSAndW5zZWVuJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSAhaXNOYU4oZW50cnkudmFsdWUpID8gTnVtYmVyKGVudHJ5LnZhbHVlKSA6IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ0hJR0hFU1RNT0RTRVEnOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXkgPSAnaGlnaGVzdE1vZHNlcSc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gIWlzTmFOKGVudHJ5LnZhbHVlKSA/IEJpZ0ludChlbnRyeS52YWx1ZSkgOiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHVwZGF0ZUN1cnJlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24ubWFpbGJveC5oaWdoZXN0TW9kc2VxID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXBba2V5XSA9IHZhbHVlO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICByZXNwb25zZS5uZXh0KCk7XG4gICAgICAgIHJldHVybiBtYXA7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGlmIChlcnIucmVzcG9uc2VTdGF0dXMgPT09ICdOTycpIHtcbiAgICAgICAgICAgIGxldCBmb2xkZXJzID0gYXdhaXQgY29ubmVjdGlvbi5ydW4oJ0xJU1QnLCAnJywgcGF0aCwgeyBsaXN0T25seTogdHJ1ZSB9KTtcbiAgICAgICAgICAgIGlmIChmb2xkZXJzICYmICFmb2xkZXJzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIGxldCBlcnJvciA9IG5ldyBFcnJvcihgTWFpbGJveCBkb2Vzbid0IGV4aXN0OiAke3BhdGh9YCk7XG4gICAgICAgICAgICAgICAgZXJyb3IuY29kZSA9ICdOb3RGb3VuZCc7XG4gICAgICAgICAgICAgICAgZXJyb3IucmVzcG9uc2UgPSBlcnI7XG4gICAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25uZWN0aW9uLmxvZy53YXJuKHsgZXJyLCBjaWQ6IGNvbm5lY3Rpb24uaWQgfSk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG59O1xuIl0sIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6WzBdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(action-browser)/./node_modules/imapflow/lib/commands/status.js\n");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "(action-browser)/./node_modules/imapflow/lib/commands/store.js":
|
|
/*!*****************************************************!*\
|
|
!*** ./node_modules/imapflow/lib/commands/store.js ***!
|
|
\*****************************************************/
|
|
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
|
|
|
|
eval("\n\nconst { getStatusCode, formatFlag, canUseFlag, getErrorText } = __webpack_require__(/*! ../tools.js */ \"(action-browser)/./node_modules/imapflow/lib/tools.js\");\n\n// Updates flags for a message\nmodule.exports = async (connection, range, flags, options) => {\n if (connection.state !== connection.states.SELECTED || !range || (options.useLabels && !connection.capabilities.has('X-GM-EXT-1'))) {\n // nothing to do here\n return false;\n }\n\n options = options || {};\n let operation;\n\n operation = 'FLAGS';\n\n if (options.useLabels) {\n operation = 'X-GM-LABELS';\n } else if (options.silent) {\n operation = `${operation}.SILENT`;\n }\n\n switch ((options.operation || '').toLowerCase()) {\n case 'set':\n // do nothing, keep operation value as is\n break;\n case 'remove':\n operation = `-${operation}`;\n break;\n case 'add':\n default:\n operation = `+${operation}`;\n break;\n }\n\n flags = (Array.isArray(flags) ? flags : [].concat(flags || []))\n .map(flag => {\n flag = formatFlag(flag);\n\n if (!canUseFlag(connection.mailbox, flag) && operation !== 'remove') {\n // it does not seem that we can set this flag\n return false;\n }\n\n return flag;\n })\n .filter(flag => flag);\n\n if (!flags.length && options.operation !== 'set') {\n // nothing to do here\n return false;\n }\n\n let attributes = [{ type: 'SEQUENCE', value: range }, { type: 'ATOM', value: operation }, flags.map(flag => ({ type: 'ATOM', value: flag }))];\n\n if (options.unchangedSince && connection.enabled.has('CONDSTORE') && !connection.mailbox.noModseq) {\n attributes.push([\n {\n type: 'ATOM',\n value: 'UNCHANGEDSINCE'\n },\n {\n type: 'ATOM',\n value: options.unchangedSince.toString()\n }\n ]);\n }\n\n let response;\n try {\n response = await connection.exec(options.uid ? 'UID STORE' : 'STORE', attributes);\n response.next();\n return true;\n } catch (err) {\n let errorCode = getStatusCode(err.response);\n if (errorCode) {\n err.serverResponseCode = errorCode;\n }\n err.response = await getErrorText(err.response);\n\n connection.log.warn({ err, cid: connection.id });\n return false;\n }\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFjdGlvbi1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9pbWFwZmxvdy9saWIvY29tbWFuZHMvc3RvcmUuanMiLCJtYXBwaW5ncyI6IkFBQWE7O0FBRWIsUUFBUSxzREFBc0QsRUFBRSxtQkFBTyxDQUFDLDBFQUFhOztBQUVyRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0EsTUFBTTtBQUNOLHVCQUF1QixVQUFVO0FBQ2pDOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0QkFBNEIsVUFBVTtBQUN0QztBQUNBO0FBQ0E7QUFDQSw0QkFBNEIsVUFBVTtBQUN0QztBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLFNBQVM7QUFDVDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSx3QkFBd0IsZ0NBQWdDLElBQUksZ0NBQWdDLHVCQUF1QiwyQkFBMkI7O0FBRTlJO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSw4QkFBOEIseUJBQXlCO0FBQ3ZEO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsiL2hvbWUvYWxtYS9uZXh0Z2VuL05lYWgtbWFpbC9ub2RlX21vZHVsZXMvaW1hcGZsb3cvbGliL2NvbW1hbmRzL3N0b3JlLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcblxuY29uc3QgeyBnZXRTdGF0dXNDb2RlLCBmb3JtYXRGbGFnLCBjYW5Vc2VGbGFnLCBnZXRFcnJvclRleHQgfSA9IHJlcXVpcmUoJy4uL3Rvb2xzLmpzJyk7XG5cbi8vIFVwZGF0ZXMgZmxhZ3MgZm9yIGEgbWVzc2FnZVxubW9kdWxlLmV4cG9ydHMgPSBhc3luYyAoY29ubmVjdGlvbiwgcmFuZ2UsIGZsYWdzLCBvcHRpb25zKSA9PiB7XG4gICAgaWYgKGNvbm5lY3Rpb24uc3RhdGUgIT09IGNvbm5lY3Rpb24uc3RhdGVzLlNFTEVDVEVEIHx8ICFyYW5nZSB8fCAob3B0aW9ucy51c2VMYWJlbHMgJiYgIWNvbm5lY3Rpb24uY2FwYWJpbGl0aWVzLmhhcygnWC1HTS1FWFQtMScpKSkge1xuICAgICAgICAvLyBub3RoaW5nIHRvIGRvIGhlcmVcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICAgIGxldCBvcGVyYXRpb247XG5cbiAgICBvcGVyYXRpb24gPSAnRkxBR1MnO1xuXG4gICAgaWYgKG9wdGlvbnMudXNlTGFiZWxzKSB7XG4gICAgICAgIG9wZXJhdGlvbiA9ICdYLUdNLUxBQkVMUyc7XG4gICAgfSBlbHNlIGlmIChvcHRpb25zLnNpbGVudCkge1xuICAgICAgICBvcGVyYXRpb24gPSBgJHtvcGVyYXRpb259LlNJTEVOVGA7XG4gICAgfVxuXG4gICAgc3dpdGNoICgob3B0aW9ucy5vcGVyYXRpb24gfHwgJycpLnRvTG93ZXJDYXNlKCkpIHtcbiAgICAgICAgY2FzZSAnc2V0JzpcbiAgICAgICAgICAgIC8vIGRvIG5vdGhpbmcsIGtlZXAgb3BlcmF0aW9uIHZhbHVlIGFzIGlzXG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAncmVtb3ZlJzpcbiAgICAgICAgICAgIG9wZXJhdGlvbiA9IGAtJHtvcGVyYXRpb259YDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdhZGQnOlxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgb3BlcmF0aW9uID0gYCske29wZXJhdGlvbn1gO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgZmxhZ3MgPSAoQXJyYXkuaXNBcnJheShmbGFncykgPyBmbGFncyA6IFtdLmNvbmNhdChmbGFncyB8fCBbXSkpXG4gICAgICAgIC5tYXAoZmxhZyA9PiB7XG4gICAgICAgICAgICBmbGFnID0gZm9ybWF0RmxhZyhmbGFnKTtcblxuICAgICAgICAgICAgaWYgKCFjYW5Vc2VGbGFnKGNvbm5lY3Rpb24ubWFpbGJveCwgZmxhZykgJiYgb3BlcmF0aW9uICE9PSAncmVtb3ZlJykge1xuICAgICAgICAgICAgICAgIC8vIGl0IGRvZXMgbm90IHNlZW0gdGhhdCB3ZSBjYW4gc2V0IHRoaXMgZmxhZ1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIGZsYWc7XG4gICAgICAgIH0pXG4gICAgICAgIC5maWx0ZXIoZmxhZyA9PiBmbGFnKTtcblxuICAgIGlmICghZmxhZ3MubGVuZ3RoICYmIG9wdGlvbnMub3BlcmF0aW9uICE9PSAnc2V0Jykge1xuICAgICAgICAvLyBub3RoaW5nIHRvIGRvIGhlcmVcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGxldCBhdHRyaWJ1dGVzID0gW3sgdHlwZTogJ1NFUVVFTkNFJywgdmFsdWU6IHJhbmdlIH0sIHsgdHlwZTogJ0FUT00nLCB2YWx1ZTogb3BlcmF0aW9uIH0sIGZsYWdzLm1hcChmbGFnID0+ICh7IHR5cGU6ICdBVE9NJywgdmFsdWU6IGZsYWcgfSkpXTtcblxuICAgIGlmIChvcHRpb25zLnVuY2hhbmdlZFNpbmNlICYmIGNvbm5lY3Rpb24uZW5hYmxlZC5oYXMoJ0NPTkRTVE9SRScpICYmICFjb25uZWN0aW9uLm1haWxib3gubm9Nb2RzZXEpIHtcbiAgICAgICAgYXR0cmlidXRlcy5wdXNoKFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB0eXBlOiAnQVRPTScsXG4gICAgICAgICAgICAgICAgdmFsdWU6ICdVTkNIQU5HRURTSU5DRSdcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdHlwZTogJ0FUT00nLFxuICAgICAgICAgICAgICAgIHZhbHVlOiBvcHRpb25zLnVuY2hhbmdlZFNpbmNlLnRvU3RyaW5nKClcbiAgICAgICAgICAgIH1cbiAgICAgICAgXSk7XG4gICAgfVxuXG4gICAgbGV0IHJlc3BvbnNlO1xuICAgIHRyeSB7XG4gICAgICAgIHJlc3BvbnNlID0gYXdhaXQgY29ubmVjdGlvbi5leGVjKG9wdGlvbnMudWlkID8gJ1VJRCBTVE9SRScgOiAnU1RPUkUnLCBhdHRyaWJ1dGVzKTtcbiAgICAgICAgcmVzcG9uc2UubmV4dCgpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgbGV0IGVycm9yQ29kZSA9IGdldFN0YXR1c0NvZGUoZXJyLnJlc3BvbnNlKTtcbiAgICAgICAgaWYgKGVycm9yQ29kZSkge1xuICAgICAgICAgICAgZXJyLnNlcnZlclJlc3BvbnNlQ29kZSA9IGVycm9yQ29kZTtcbiAgICAgICAgfVxuICAgICAgICBlcnIucmVzcG9uc2UgPSBhd2FpdCBnZXRFcnJvclRleHQoZXJyLnJlc3BvbnNlKTtcblxuICAgICAgICBjb25uZWN0aW9uLmxvZy53YXJuKHsgZXJyLCBjaWQ6IGNvbm5lY3Rpb24uaWQgfSk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG59O1xuIl0sIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6WzBdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(action-browser)/./node_modules/imapflow/lib/commands/store.js\n");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "(action-browser)/./node_modules/imapflow/lib/commands/subscribe.js":
|
|
/*!*********************************************************!*\
|
|
!*** ./node_modules/imapflow/lib/commands/subscribe.js ***!
|
|
\*********************************************************/
|
|
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
|
|
|
|
eval("\n\nconst { encodePath, normalizePath, getStatusCode, getErrorText } = __webpack_require__(/*! ../tools.js */ \"(action-browser)/./node_modules/imapflow/lib/tools.js\");\n\n// Subscribes to a mailbox\nmodule.exports = async (connection, path) => {\n if (![connection.states.AUTHENTICATED, connection.states.SELECTED].includes(connection.state)) {\n // nothing to do here\n return;\n }\n\n path = normalizePath(connection, path);\n\n let response;\n try {\n response = await connection.exec('SUBSCRIBE', [{ type: 'ATOM', value: encodePath(connection, path) }]);\n response.next();\n return true;\n } catch (err) {\n let errorCode = getStatusCode(err.response);\n if (errorCode) {\n err.serverResponseCode = errorCode;\n }\n err.response = await getErrorText(err.response);\n\n connection.log.warn({ err, cid: connection.id });\n return false;\n }\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFjdGlvbi1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9pbWFwZmxvdy9saWIvY29tbWFuZHMvc3Vic2NyaWJlLmpzIiwibWFwcGluZ3MiOiJBQUFhOztBQUViLFFBQVEseURBQXlELEVBQUUsbUJBQU8sQ0FBQywwRUFBYTs7QUFFeEY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQSx5REFBeUQsbURBQW1EO0FBQzVHO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSw4QkFBOEIseUJBQXlCO0FBQ3ZEO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsiL2hvbWUvYWxtYS9uZXh0Z2VuL05lYWgtbWFpbC9ub2RlX21vZHVsZXMvaW1hcGZsb3cvbGliL2NvbW1hbmRzL3N1YnNjcmliZS5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbmNvbnN0IHsgZW5jb2RlUGF0aCwgbm9ybWFsaXplUGF0aCwgZ2V0U3RhdHVzQ29kZSwgZ2V0RXJyb3JUZXh0IH0gPSByZXF1aXJlKCcuLi90b29scy5qcycpO1xuXG4vLyBTdWJzY3JpYmVzIHRvIGEgbWFpbGJveFxubW9kdWxlLmV4cG9ydHMgPSBhc3luYyAoY29ubmVjdGlvbiwgcGF0aCkgPT4ge1xuICAgIGlmICghW2Nvbm5lY3Rpb24uc3RhdGVzLkFVVEhFTlRJQ0FURUQsIGNvbm5lY3Rpb24uc3RhdGVzLlNFTEVDVEVEXS5pbmNsdWRlcyhjb25uZWN0aW9uLnN0YXRlKSkge1xuICAgICAgICAvLyBub3RoaW5nIHRvIGRvIGhlcmVcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHBhdGggPSBub3JtYWxpemVQYXRoKGNvbm5lY3Rpb24sIHBhdGgpO1xuXG4gICAgbGV0IHJlc3BvbnNlO1xuICAgIHRyeSB7XG4gICAgICAgIHJlc3BvbnNlID0gYXdhaXQgY29ubmVjdGlvbi5leGVjKCdTVUJTQ1JJQkUnLCBbeyB0eXBlOiAnQVRPTScsIHZhbHVlOiBlbmNvZGVQYXRoKGNvbm5lY3Rpb24sIHBhdGgpIH1dKTtcbiAgICAgICAgcmVzcG9uc2UubmV4dCgpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgbGV0IGVycm9yQ29kZSA9IGdldFN0YXR1c0NvZGUoZXJyLnJlc3BvbnNlKTtcbiAgICAgICAgaWYgKGVycm9yQ29kZSkge1xuICAgICAgICAgICAgZXJyLnNlcnZlclJlc3BvbnNlQ29kZSA9IGVycm9yQ29kZTtcbiAgICAgICAgfVxuICAgICAgICBlcnIucmVzcG9uc2UgPSBhd2FpdCBnZXRFcnJvclRleHQoZXJyLnJlc3BvbnNlKTtcblxuICAgICAgICBjb25uZWN0aW9uLmxvZy53YXJuKHsgZXJyLCBjaWQ6IGNvbm5lY3Rpb24uaWQgfSk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG59O1xuIl0sIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6WzBdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(action-browser)/./node_modules/imapflow/lib/commands/subscribe.js\n");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "(action-browser)/./node_modules/imapflow/lib/commands/unsubscribe.js":
|
|
/*!***********************************************************!*\
|
|
!*** ./node_modules/imapflow/lib/commands/unsubscribe.js ***!
|
|
\***********************************************************/
|
|
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
|
|
|
|
eval("\n\nconst { encodePath, normalizePath, getStatusCode, getErrorText } = __webpack_require__(/*! ../tools.js */ \"(action-browser)/./node_modules/imapflow/lib/tools.js\");\n\n// Unsubscribes from a mailbox\nmodule.exports = async (connection, path) => {\n if (![connection.states.AUTHENTICATED, connection.states.SELECTED].includes(connection.state)) {\n // nothing to do here\n return;\n }\n\n path = normalizePath(connection, path);\n\n let response;\n try {\n response = await connection.exec('UNSUBSCRIBE', [{ type: 'ATOM', value: encodePath(connection, path) }]);\n response.next();\n return true;\n } catch (err) {\n let errorCode = getStatusCode(err.response);\n if (errorCode) {\n err.serverResponseCode = errorCode;\n }\n\n err.response = await getErrorText(err.response);\n\n connection.log.warn({ err, cid: connection.id });\n return false;\n }\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFjdGlvbi1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9pbWFwZmxvdy9saWIvY29tbWFuZHMvdW5zdWJzY3JpYmUuanMiLCJtYXBwaW5ncyI6IkFBQWE7O0FBRWIsUUFBUSx5REFBeUQsRUFBRSxtQkFBTyxDQUFDLDBFQUFhOztBQUV4RjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLDJEQUEyRCxtREFBbUQ7QUFDOUc7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQSw4QkFBOEIseUJBQXlCO0FBQ3ZEO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsiL2hvbWUvYWxtYS9uZXh0Z2VuL05lYWgtbWFpbC9ub2RlX21vZHVsZXMvaW1hcGZsb3cvbGliL2NvbW1hbmRzL3Vuc3Vic2NyaWJlLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcblxuY29uc3QgeyBlbmNvZGVQYXRoLCBub3JtYWxpemVQYXRoLCBnZXRTdGF0dXNDb2RlLCBnZXRFcnJvclRleHQgfSA9IHJlcXVpcmUoJy4uL3Rvb2xzLmpzJyk7XG5cbi8vIFVuc3Vic2NyaWJlcyBmcm9tIGEgbWFpbGJveFxubW9kdWxlLmV4cG9ydHMgPSBhc3luYyAoY29ubmVjdGlvbiwgcGF0aCkgPT4ge1xuICAgIGlmICghW2Nvbm5lY3Rpb24uc3RhdGVzLkFVVEhFTlRJQ0FURUQsIGNvbm5lY3Rpb24uc3RhdGVzLlNFTEVDVEVEXS5pbmNsdWRlcyhjb25uZWN0aW9uLnN0YXRlKSkge1xuICAgICAgICAvLyBub3RoaW5nIHRvIGRvIGhlcmVcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHBhdGggPSBub3JtYWxpemVQYXRoKGNvbm5lY3Rpb24sIHBhdGgpO1xuXG4gICAgbGV0IHJlc3BvbnNlO1xuICAgIHRyeSB7XG4gICAgICAgIHJlc3BvbnNlID0gYXdhaXQgY29ubmVjdGlvbi5leGVjKCdVTlNVQlNDUklCRScsIFt7IHR5cGU6ICdBVE9NJywgdmFsdWU6IGVuY29kZVBhdGgoY29ubmVjdGlvbiwgcGF0aCkgfV0pO1xuICAgICAgICByZXNwb25zZS5uZXh0KCk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBsZXQgZXJyb3JDb2RlID0gZ2V0U3RhdHVzQ29kZShlcnIucmVzcG9uc2UpO1xuICAgICAgICBpZiAoZXJyb3JDb2RlKSB7XG4gICAgICAgICAgICBlcnIuc2VydmVyUmVzcG9uc2VDb2RlID0gZXJyb3JDb2RlO1xuICAgICAgICB9XG5cbiAgICAgICAgZXJyLnJlc3BvbnNlID0gYXdhaXQgZ2V0RXJyb3JUZXh0KGVyci5yZXNwb25zZSk7XG5cbiAgICAgICAgY29ubmVjdGlvbi5sb2cud2Fybih7IGVyciwgY2lkOiBjb25uZWN0aW9uLmlkIH0pO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxufTtcbiJdLCJuYW1lcyI6W10sImlnbm9yZUxpc3QiOlswXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(action-browser)/./node_modules/imapflow/lib/commands/unsubscribe.js\n");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "(action-browser)/./node_modules/imapflow/lib/handler/imap-compiler.js":
|
|
/*!************************************************************!*\
|
|
!*** ./node_modules/imapflow/lib/handler/imap-compiler.js ***!
|
|
\************************************************************/
|
|
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
|
|
|
|
eval("/* eslint no-console: 0, new-cap: 0 */\n\n\n\nconst imapFormalSyntax = __webpack_require__(/*! ./imap-formal-syntax */ \"(action-browser)/./node_modules/imapflow/lib/handler/imap-formal-syntax.js\");\n\nconst formatRespEntry = (entry, returnEmpty) => {\n if (typeof entry === 'string') {\n return Buffer.from(entry);\n }\n\n if (typeof entry === 'number') {\n return Buffer.from(entry.toString());\n }\n\n if (Buffer.isBuffer(entry)) {\n return entry;\n }\n\n if (returnEmpty) {\n return null;\n }\n\n return Buffer.alloc(0);\n};\n\n/**\n * Compiles an input object into\n */\nmodule.exports = async (response, options) => {\n let { asArray, isLogging, literalPlus, literalMinus } = options || {};\n const respParts = [];\n\n let resp = [].concat(formatRespEntry(response.tag, true) || []).concat(response.command ? formatRespEntry(' ' + response.command) : []);\n let val;\n let lastType;\n\n let walk = async (node, options) => {\n options = options || {};\n\n let lastRespEntry = resp.length && resp[resp.length - 1];\n let lastRespByte = (lastRespEntry && lastRespEntry.length && lastRespEntry[lastRespEntry.length - 1]) || '';\n if (typeof lastRespByte === 'number') {\n lastRespByte = String.fromCharCode(lastRespByte);\n }\n\n if (lastType === 'LITERAL' || (!['(', '<', '['].includes(lastRespByte) && resp.length)) {\n if (options.subArray) {\n // ignore separator\n } else {\n resp.push(formatRespEntry(' '));\n }\n }\n\n if (node && node.buffer && !Buffer.isBuffer(node)) {\n // mongodb binary\n node = node.buffer;\n }\n\n if (Array.isArray(node)) {\n lastType = 'LIST';\n resp.push(formatRespEntry('('));\n\n // check if we need to skip separator WS between two arrays\n let subArray = node.length > 1 && Array.isArray(node[0]);\n\n for (let child of node) {\n if (subArray && !Array.isArray(child)) {\n subArray = false;\n }\n await walk(child, { subArray });\n }\n\n resp.push(formatRespEntry(')'));\n return;\n }\n\n if (!node && typeof node !== 'string' && typeof node !== 'number' && !Buffer.isBuffer(node)) {\n resp.push(formatRespEntry('NIL'));\n return;\n }\n\n if (typeof node === 'string' || Buffer.isBuffer(node)) {\n if (isLogging && node.length > 100) {\n resp.push(formatRespEntry('\"(* ' + node.length + 'B string *)\"'));\n } else {\n resp.push(formatRespEntry(JSON.stringify(node.toString())));\n }\n return;\n }\n\n if (typeof node === 'number') {\n resp.push(formatRespEntry(Math.round(node) || 0)); // Only integers allowed\n return;\n }\n\n lastType = node.type;\n\n if (isLogging && node.sensitive) {\n resp.push(formatRespEntry('\"(* value hidden *)\"'));\n return;\n }\n\n switch (node.type.toUpperCase()) {\n case 'LITERAL':\n if (isLogging) {\n resp.push(formatRespEntry('\"(* ' + node.value.length + 'B literal *)\"'));\n } else {\n let literalLength = !node.value ? 0 : Math.max(node.value.length, 0);\n\n let canAppend = !asArray || literalPlus || (literalMinus && literalLength <= 4096);\n let usePlus = canAppend && (literalMinus || literalPlus);\n\n resp.push(formatRespEntry(`${node.isLiteral8 ? '~' : ''}{${literalLength}${usePlus ? '+' : ''}}\\r\\n`));\n\n if (canAppend) {\n if (node.value && node.value.length) {\n resp.push(formatRespEntry(node.value));\n }\n } else {\n respParts.push(resp);\n resp = [].concat(formatRespEntry(node.value, true) || []);\n }\n }\n break;\n\n case 'STRING':\n if (isLogging && node.value.length > 100) {\n resp.push(formatRespEntry('\"(* ' + node.value.length + 'B string *)\"'));\n } else {\n resp.push(formatRespEntry(JSON.stringify((node.value || '').toString())));\n }\n break;\n\n case 'TEXT':\n case 'SEQUENCE':\n if (node.value) {\n resp.push(formatRespEntry(node.value));\n }\n break;\n\n case 'NUMBER':\n resp.push(formatRespEntry(node.value || 0));\n break;\n\n case 'ATOM':\n case 'SECTION':\n val = (node.value || '').toString();\n\n if (!node.section || val) {\n if (node.value === '' || imapFormalSyntax.verify(val.charAt(0) === '\\\\' ? val.substr(1) : val, imapFormalSyntax['ATOM-CHAR']()) >= 0) {\n val = JSON.stringify(val);\n }\n\n resp.push(formatRespEntry(val));\n }\n\n if (node.section) {\n resp.push(formatRespEntry('['));\n\n for (let child of node.section) {\n await walk(child);\n }\n\n resp.push(formatRespEntry(']'));\n }\n if (node.partial) {\n resp.push(formatRespEntry(`<${node.partial.join('.')}>`));\n }\n break;\n }\n };\n\n if (response.attributes) {\n let attributes = Array.isArray(response.attributes) ? response.attributes : [].concat(response.attributes);\n for (let child of attributes) {\n await walk(child);\n }\n }\n\n if (resp.length) {\n respParts.push(resp);\n }\n\n for (let i = 0; i < respParts.length; i++) {\n respParts[i] = Buffer.concat(respParts[i]);\n }\n\n return asArray ? respParts : respParts.flatMap(entry => entry);\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFjdGlvbi1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9pbWFwZmxvdy9saWIvaGFuZGxlci9pbWFwLWNvbXBpbGVyLmpzIiwibWFwcGluZ3MiOiJBQUFBOztBQUVhOztBQUViLHlCQUF5QixtQkFBTyxDQUFDLHdHQUFzQjs7QUFFdkQ7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVUsZ0RBQWdEO0FBQzFEOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9DQUFvQyxVQUFVO0FBQzlDOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSwrREFBK0Q7QUFDL0Q7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQjtBQUNsQjs7QUFFQTtBQUNBOztBQUVBLGlEQUFpRCw0QkFBNEIsRUFBRSxjQUFjLEVBQUUsb0JBQW9COztBQUVuSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQjtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxrREFBa0QsdUJBQXVCO0FBQ3pFO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEsb0JBQW9CLHNCQUFzQjtBQUMxQztBQUNBOztBQUVBO0FBQ0EiLCJzb3VyY2VzIjpbIi9ob21lL2FsbWEvbmV4dGdlbi9OZWFoLW1haWwvbm9kZV9tb2R1bGVzL2ltYXBmbG93L2xpYi9oYW5kbGVyL2ltYXAtY29tcGlsZXIuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50IG5vLWNvbnNvbGU6IDAsIG5ldy1jYXA6IDAgKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCBpbWFwRm9ybWFsU3ludGF4ID0gcmVxdWlyZSgnLi9pbWFwLWZvcm1hbC1zeW50YXgnKTtcblxuY29uc3QgZm9ybWF0UmVzcEVudHJ5ID0gKGVudHJ5LCByZXR1cm5FbXB0eSkgPT4ge1xuICAgIGlmICh0eXBlb2YgZW50cnkgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVybiBCdWZmZXIuZnJvbShlbnRyeSk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBlbnRyeSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgcmV0dXJuIEJ1ZmZlci5mcm9tKGVudHJ5LnRvU3RyaW5nKCkpO1xuICAgIH1cblxuICAgIGlmIChCdWZmZXIuaXNCdWZmZXIoZW50cnkpKSB7XG4gICAgICAgIHJldHVybiBlbnRyeTtcbiAgICB9XG5cbiAgICBpZiAocmV0dXJuRW1wdHkpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIEJ1ZmZlci5hbGxvYygwKTtcbn07XG5cbi8qKlxuICogQ29tcGlsZXMgYW4gaW5wdXQgb2JqZWN0IGludG9cbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBhc3luYyAocmVzcG9uc2UsIG9wdGlvbnMpID0+IHtcbiAgICBsZXQgeyBhc0FycmF5LCBpc0xvZ2dpbmcsIGxpdGVyYWxQbHVzLCBsaXRlcmFsTWludXMgfSA9IG9wdGlvbnMgfHwge307XG4gICAgY29uc3QgcmVzcFBhcnRzID0gW107XG5cbiAgICBsZXQgcmVzcCA9IFtdLmNvbmNhdChmb3JtYXRSZXNwRW50cnkocmVzcG9uc2UudGFnLCB0cnVlKSB8fCBbXSkuY29uY2F0KHJlc3BvbnNlLmNvbW1hbmQgPyBmb3JtYXRSZXNwRW50cnkoJyAnICsgcmVzcG9uc2UuY29tbWFuZCkgOiBbXSk7XG4gICAgbGV0IHZhbDtcbiAgICBsZXQgbGFzdFR5cGU7XG5cbiAgICBsZXQgd2FsayA9IGFzeW5jIChub2RlLCBvcHRpb25zKSA9PiB7XG4gICAgICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuXG4gICAgICAgIGxldCBsYXN0UmVzcEVudHJ5ID0gcmVzcC5sZW5ndGggJiYgcmVzcFtyZXNwLmxlbmd0aCAtIDFdO1xuICAgICAgICBsZXQgbGFzdFJlc3BCeXRlID0gKGxhc3RSZXNwRW50cnkgJiYgbGFzdFJlc3BFbnRyeS5sZW5ndGggJiYgbGFzdFJlc3BFbnRyeVtsYXN0UmVzcEVudHJ5Lmxlbmd0aCAtIDFdKSB8fCAnJztcbiAgICAgICAgaWYgKHR5cGVvZiBsYXN0UmVzcEJ5dGUgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICBsYXN0UmVzcEJ5dGUgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGxhc3RSZXNwQnl0ZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobGFzdFR5cGUgPT09ICdMSVRFUkFMJyB8fCAoIVsnKCcsICc8JywgJ1snXS5pbmNsdWRlcyhsYXN0UmVzcEJ5dGUpICYmIHJlc3AubGVuZ3RoKSkge1xuICAgICAgICAgICAgaWYgKG9wdGlvbnMuc3ViQXJyYXkpIHtcbiAgICAgICAgICAgICAgICAvLyBpZ25vcmUgc2VwYXJhdG9yXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlc3AucHVzaChmb3JtYXRSZXNwRW50cnkoJyAnKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobm9kZSAmJiBub2RlLmJ1ZmZlciAmJiAhQnVmZmVyLmlzQnVmZmVyKG5vZGUpKSB7XG4gICAgICAgICAgICAvLyBtb25nb2RiIGJpbmFyeVxuICAgICAgICAgICAgbm9kZSA9IG5vZGUuYnVmZmVyO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkobm9kZSkpIHtcbiAgICAgICAgICAgIGxhc3RUeXBlID0gJ0xJU1QnO1xuICAgICAgICAgICAgcmVzcC5wdXNoKGZvcm1hdFJlc3BFbnRyeSgnKCcpKTtcblxuICAgICAgICAgICAgLy8gY2hlY2sgaWYgd2UgbmVlZCB0byBza2lwIHNlcGFyYXRvciBXUyBiZXR3ZWVuIHR3byBhcnJheXNcbiAgICAgICAgICAgIGxldCBzdWJBcnJheSA9IG5vZGUubGVuZ3RoID4gMSAmJiBBcnJheS5pc0FycmF5KG5vZGVbMF0pO1xuXG4gICAgICAgICAgICBmb3IgKGxldCBjaGlsZCBvZiBub2RlKSB7XG4gICAgICAgICAgICAgICAgaWYgKHN1YkFycmF5ICYmICFBcnJheS5pc0FycmF5KGNoaWxkKSkge1xuICAgICAgICAgICAgICAgICAgICBzdWJBcnJheSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBhd2FpdCB3YWxrKGNoaWxkLCB7IHN1YkFycmF5IH0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXNwLnB1c2goZm9ybWF0UmVzcEVudHJ5KCcpJykpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFub2RlICYmIHR5cGVvZiBub2RlICE9PSAnc3RyaW5nJyAmJiB0eXBlb2Ygbm9kZSAhPT0gJ251bWJlcicgJiYgIUJ1ZmZlci5pc0J1ZmZlcihub2RlKSkge1xuICAgICAgICAgICAgcmVzcC5wdXNoKGZvcm1hdFJlc3BFbnRyeSgnTklMJykpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHR5cGVvZiBub2RlID09PSAnc3RyaW5nJyB8fCBCdWZmZXIuaXNCdWZmZXIobm9kZSkpIHtcbiAgICAgICAgICAgIGlmIChpc0xvZ2dpbmcgJiYgbm9kZS5sZW5ndGggPiAxMDApIHtcbiAgICAgICAgICAgICAgICByZXNwLnB1c2goZm9ybWF0UmVzcEVudHJ5KCdcIigqICcgKyBub2RlLmxlbmd0aCArICdCIHN0cmluZyAqKVwiJykpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXNwLnB1c2goZm9ybWF0UmVzcEVudHJ5KEpTT04uc3RyaW5naWZ5KG5vZGUudG9TdHJpbmcoKSkpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0eXBlb2Ygbm9kZSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgIHJlc3AucHVzaChmb3JtYXRSZXNwRW50cnkoTWF0aC5yb3VuZChub2RlKSB8fCAwKSk7IC8vIE9ubHkgaW50ZWdlcnMgYWxsb3dlZFxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgbGFzdFR5cGUgPSBub2RlLnR5cGU7XG5cbiAgICAgICAgaWYgKGlzTG9nZ2luZyAmJiBub2RlLnNlbnNpdGl2ZSkge1xuICAgICAgICAgICAgcmVzcC5wdXNoKGZvcm1hdFJlc3BFbnRyeSgnXCIoKiB2YWx1ZSBoaWRkZW4gKilcIicpKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHN3aXRjaCAobm9kZS50eXBlLnRvVXBwZXJDYXNlKCkpIHtcbiAgICAgICAgICAgIGNhc2UgJ0xJVEVSQUwnOlxuICAgICAgICAgICAgICAgIGlmIChpc0xvZ2dpbmcpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzcC5wdXNoKGZvcm1hdFJlc3BFbnRyeSgnXCIoKiAnICsgbm9kZS52YWx1ZS5sZW5ndGggKyAnQiBsaXRlcmFsICopXCInKSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGxpdGVyYWxMZW5ndGggPSAhbm9kZS52YWx1ZSA/IDAgOiBNYXRoLm1heChub2RlLnZhbHVlLmxlbmd0aCwgMCk7XG5cbiAgICAgICAgICAgICAgICAgICAgbGV0IGNhbkFwcGVuZCA9ICFhc0FycmF5IHx8IGxpdGVyYWxQbHVzIHx8IChsaXRlcmFsTWludXMgJiYgbGl0ZXJhbExlbmd0aCA8PSA0MDk2KTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHVzZVBsdXMgPSBjYW5BcHBlbmQgJiYgKGxpdGVyYWxNaW51cyB8fCBsaXRlcmFsUGx1cyk7XG5cbiAgICAgICAgICAgICAgICAgICAgcmVzcC5wdXNoKGZvcm1hdFJlc3BFbnRyeShgJHtub2RlLmlzTGl0ZXJhbDggPyAnficgOiAnJ317JHtsaXRlcmFsTGVuZ3RofSR7dXNlUGx1cyA/ICcrJyA6ICcnfX1cXHJcXG5gKSk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGNhbkFwcGVuZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5vZGUudmFsdWUgJiYgbm9kZS52YWx1ZS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwLnB1c2goZm9ybWF0UmVzcEVudHJ5KG5vZGUudmFsdWUpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BQYXJ0cy5wdXNoKHJlc3ApO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzcCA9IFtdLmNvbmNhdChmb3JtYXRSZXNwRW50cnkobm9kZS52YWx1ZSwgdHJ1ZSkgfHwgW10pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICBjYXNlICdTVFJJTkcnOlxuICAgICAgICAgICAgICAgIGlmIChpc0xvZ2dpbmcgJiYgbm9kZS52YWx1ZS5sZW5ndGggPiAxMDApIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzcC5wdXNoKGZvcm1hdFJlc3BFbnRyeSgnXCIoKiAnICsgbm9kZS52YWx1ZS5sZW5ndGggKyAnQiBzdHJpbmcgKilcIicpKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXNwLnB1c2goZm9ybWF0UmVzcEVudHJ5KEpTT04uc3RyaW5naWZ5KChub2RlLnZhbHVlIHx8ICcnKS50b1N0cmluZygpKSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgY2FzZSAnVEVYVCc6XG4gICAgICAgICAgICBjYXNlICdTRVFVRU5DRSc6XG4gICAgICAgICAgICAgICAgaWYgKG5vZGUudmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzcC5wdXNoKGZvcm1hdFJlc3BFbnRyeShub2RlLnZhbHVlKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICBjYXNlICdOVU1CRVInOlxuICAgICAgICAgICAgICAgIHJlc3AucHVzaChmb3JtYXRSZXNwRW50cnkobm9kZS52YWx1ZSB8fCAwKSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIGNhc2UgJ0FUT00nOlxuICAgICAgICAgICAgY2FzZSAnU0VDVElPTic6XG4gICAgICAgICAgICAgICAgdmFsID0gKG5vZGUudmFsdWUgfHwgJycpLnRvU3RyaW5nKCk7XG5cbiAgICAgICAgICAgICAgICBpZiAoIW5vZGUuc2VjdGlvbiB8fCB2YWwpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG5vZGUudmFsdWUgPT09ICcnIHx8IGltYXBGb3JtYWxTeW50YXgudmVyaWZ5KHZhbC5jaGFyQXQoMCkgPT09ICdcXFxcJyA/IHZhbC5zdWJzdHIoMSkgOiB2YWwsIGltYXBGb3JtYWxTeW50YXhbJ0FUT00tQ0hBUiddKCkpID49IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbCA9IEpTT04uc3RyaW5naWZ5KHZhbCk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICByZXNwLnB1c2goZm9ybWF0UmVzcEVudHJ5KHZhbCkpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChub2RlLnNlY3Rpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzcC5wdXNoKGZvcm1hdFJlc3BFbnRyeSgnWycpKTtcblxuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBjaGlsZCBvZiBub2RlLnNlY3Rpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHdhbGsoY2hpbGQpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgcmVzcC5wdXNoKGZvcm1hdFJlc3BFbnRyeSgnXScpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKG5vZGUucGFydGlhbCkge1xuICAgICAgICAgICAgICAgICAgICByZXNwLnB1c2goZm9ybWF0UmVzcEVudHJ5KGA8JHtub2RlLnBhcnRpYWwuam9pbignLicpfT5gKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIGlmIChyZXNwb25zZS5hdHRyaWJ1dGVzKSB7XG4gICAgICAgIGxldCBhdHRyaWJ1dGVzID0gQXJyYXkuaXNBcnJheShyZXNwb25zZS5hdHRyaWJ1dGVzKSA/IHJlc3BvbnNlLmF0dHJpYnV0ZXMgOiBbXS5jb25jYXQocmVzcG9uc2UuYXR0cmlidXRlcyk7XG4gICAgICAgIGZvciAobGV0IGNoaWxkIG9mIGF0dHJpYnV0ZXMpIHtcbiAgICAgICAgICAgIGF3YWl0IHdhbGsoY2hpbGQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHJlc3AubGVuZ3RoKSB7XG4gICAgICAgIHJlc3BQYXJ0cy5wdXNoKHJlc3ApO1xuICAgIH1cblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmVzcFBhcnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHJlc3BQYXJ0c1tpXSA9IEJ1ZmZlci5jb25jYXQocmVzcFBhcnRzW2ldKTtcbiAgICB9XG5cbiAgICByZXR1cm4gYXNBcnJheSA/IHJlc3BQYXJ0cyA6IHJlc3BQYXJ0cy5mbGF0TWFwKGVudHJ5ID0+IGVudHJ5KTtcbn07XG4iXSwibmFtZXMiOltdLCJpZ25vcmVMaXN0IjpbMF0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(action-browser)/./node_modules/imapflow/lib/handler/imap-compiler.js\n");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "(action-browser)/./node_modules/imapflow/lib/handler/imap-formal-syntax.js":
|
|
/*!*****************************************************************!*\
|
|
!*** ./node_modules/imapflow/lib/handler/imap-formal-syntax.js ***!
|
|
\*****************************************************************/
|
|
/***/ ((module) => {
|
|
|
|
eval("/* eslint object-shorthand:0, new-cap: 0, no-useless-concat: 0 */\n\n\n\n// IMAP Formal Syntax\n// http://tools.ietf.org/html/rfc3501#section-9\n\nfunction expandRange(start, end) {\n let chars = [];\n for (let i = start; i <= end; i++) {\n chars.push(i);\n }\n return String.fromCharCode(...chars);\n}\n\nfunction excludeChars(source, exclude) {\n let sourceArr = Array.prototype.slice.call(source);\n for (let i = sourceArr.length - 1; i >= 0; i--) {\n if (exclude.indexOf(sourceArr[i]) >= 0) {\n sourceArr.splice(i, 1);\n }\n }\n return sourceArr.join('');\n}\n\nmodule.exports = {\n CHAR() {\n let value = expandRange(0x01, 0x7f);\n this.CHAR = function () {\n return value;\n };\n return value;\n },\n\n CHAR8() {\n let value = expandRange(0x01, 0xff);\n this.CHAR8 = function () {\n return value;\n };\n return value;\n },\n\n SP() {\n return ' ';\n },\n\n CTL() {\n let value = expandRange(0x00, 0x1f) + '\\x7F';\n this.CTL = function () {\n return value;\n };\n return value;\n },\n\n DQUOTE() {\n return '\"';\n },\n\n ALPHA() {\n let value = expandRange(0x41, 0x5a) + expandRange(0x61, 0x7a);\n this.ALPHA = function () {\n return value;\n };\n return value;\n },\n\n DIGIT() {\n let value = expandRange(0x30, 0x39);\n this.DIGIT = function () {\n return value;\n };\n return value;\n },\n\n 'ATOM-CHAR'() {\n let value = excludeChars(this.CHAR(), this['atom-specials']());\n this['ATOM-CHAR'] = function () {\n return value;\n };\n return value;\n },\n\n 'ASTRING-CHAR'() {\n let value = this['ATOM-CHAR']() + this['resp-specials']();\n this['ASTRING-CHAR'] = function () {\n return value;\n };\n return value;\n },\n\n 'TEXT-CHAR'() {\n let value = excludeChars(this.CHAR(), '\\r\\n');\n this['TEXT-CHAR'] = function () {\n return value;\n };\n return value;\n },\n\n 'atom-specials'() {\n let value = '(' + ')' + '{' + this.SP() + this.CTL() + this['list-wildcards']() + this['quoted-specials']() + this['resp-specials']();\n this['atom-specials'] = function () {\n return value;\n };\n return value;\n },\n\n 'list-wildcards'() {\n return '%' + '*';\n },\n\n 'quoted-specials'() {\n let value = this.DQUOTE() + '\\\\';\n this['quoted-specials'] = function () {\n return value;\n };\n return value;\n },\n\n 'resp-specials'() {\n return ']';\n },\n\n tag() {\n let value = excludeChars(this['ASTRING-CHAR'](), '+');\n this.tag = function () {\n return value;\n };\n return value;\n },\n\n command() {\n let value = this.ALPHA() + this.DIGIT() + '-';\n this.command = function () {\n return value;\n };\n return value;\n },\n\n verify(str, allowedChars) {\n for (let i = 0, len = str.length; i < len; i++) {\n if (allowedChars.indexOf(str.charAt(i)) < 0) {\n return i;\n }\n }\n return -1;\n }\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFjdGlvbi1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9pbWFwZmxvdy9saWIvaGFuZGxlci9pbWFwLWZvcm1hbC1zeW50YXguanMiLCJtYXBwaW5ncyI6IkFBQUE7O0FBRWE7O0FBRWI7QUFDQTs7QUFFQTtBQUNBO0FBQ0Esd0JBQXdCLFVBQVU7QUFDbEM7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLHVDQUF1QyxRQUFRO0FBQy9DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBLGtDQUFrQztBQUNsQztBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQSwwQ0FBMEMsU0FBUztBQUNuRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsiL2hvbWUvYWxtYS9uZXh0Z2VuL05lYWgtbWFpbC9ub2RlX21vZHVsZXMvaW1hcGZsb3cvbGliL2hhbmRsZXIvaW1hcC1mb3JtYWwtc3ludGF4LmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludCBvYmplY3Qtc2hvcnRoYW5kOjAsIG5ldy1jYXA6IDAsIG5vLXVzZWxlc3MtY29uY2F0OiAwICovXG5cbid1c2Ugc3RyaWN0JztcblxuLy8gSU1BUCBGb3JtYWwgU3ludGF4XG4vLyBodHRwOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmMzNTAxI3NlY3Rpb24tOVxuXG5mdW5jdGlvbiBleHBhbmRSYW5nZShzdGFydCwgZW5kKSB7XG4gICAgbGV0IGNoYXJzID0gW107XG4gICAgZm9yIChsZXQgaSA9IHN0YXJ0OyBpIDw9IGVuZDsgaSsrKSB7XG4gICAgICAgIGNoYXJzLnB1c2goaSk7XG4gICAgfVxuICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKC4uLmNoYXJzKTtcbn1cblxuZnVuY3Rpb24gZXhjbHVkZUNoYXJzKHNvdXJjZSwgZXhjbHVkZSkge1xuICAgIGxldCBzb3VyY2VBcnIgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChzb3VyY2UpO1xuICAgIGZvciAobGV0IGkgPSBzb3VyY2VBcnIubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgaWYgKGV4Y2x1ZGUuaW5kZXhPZihzb3VyY2VBcnJbaV0pID49IDApIHtcbiAgICAgICAgICAgIHNvdXJjZUFyci5zcGxpY2UoaSwgMSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHNvdXJjZUFyci5qb2luKCcnKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gICAgQ0hBUigpIHtcbiAgICAgICAgbGV0IHZhbHVlID0gZXhwYW5kUmFuZ2UoMHgwMSwgMHg3Zik7XG4gICAgICAgIHRoaXMuQ0hBUiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH0sXG5cbiAgICBDSEFSOCgpIHtcbiAgICAgICAgbGV0IHZhbHVlID0gZXhwYW5kUmFuZ2UoMHgwMSwgMHhmZik7XG4gICAgICAgIHRoaXMuQ0hBUjggPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9LFxuXG4gICAgU1AoKSB7XG4gICAgICAgIHJldHVybiAnICc7XG4gICAgfSxcblxuICAgIENUTCgpIHtcbiAgICAgICAgbGV0IHZhbHVlID0gZXhwYW5kUmFuZ2UoMHgwMCwgMHgxZikgKyAnXFx4N0YnO1xuICAgICAgICB0aGlzLkNUTCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH0sXG5cbiAgICBEUVVPVEUoKSB7XG4gICAgICAgIHJldHVybiAnXCInO1xuICAgIH0sXG5cbiAgICBBTFBIQSgpIHtcbiAgICAgICAgbGV0IHZhbHVlID0gZXhwYW5kUmFuZ2UoMHg0MSwgMHg1YSkgKyBleHBhbmRSYW5nZSgweDYxLCAweDdhKTtcbiAgICAgICAgdGhpcy5BTFBIQSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH0sXG5cbiAgICBESUdJVCgpIHtcbiAgICAgICAgbGV0IHZhbHVlID0gZXhwYW5kUmFuZ2UoMHgzMCwgMHgzOSk7XG4gICAgICAgIHRoaXMuRElHSVQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9LFxuXG4gICAgJ0FUT00tQ0hBUicoKSB7XG4gICAgICAgIGxldCB2YWx1ZSA9IGV4Y2x1ZGVDaGFycyh0aGlzLkNIQVIoKSwgdGhpc1snYXRvbS1zcGVjaWFscyddKCkpO1xuICAgICAgICB0aGlzWydBVE9NLUNIQVInXSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH0sXG5cbiAgICAnQVNUUklORy1DSEFSJygpIHtcbiAgICAgICAgbGV0IHZhbHVlID0gdGhpc1snQVRPTS1DSEFSJ10oKSArIHRoaXNbJ3Jlc3Atc3BlY2lhbHMnXSgpO1xuICAgICAgICB0aGlzWydBU1RSSU5HLUNIQVInXSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH0sXG5cbiAgICAnVEVYVC1DSEFSJygpIHtcbiAgICAgICAgbGV0IHZhbHVlID0gZXhjbHVkZUNoYXJzKHRoaXMuQ0hBUigpLCAnXFxyXFxuJyk7XG4gICAgICAgIHRoaXNbJ1RFWFQtQ0hBUiddID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfSxcblxuICAgICdhdG9tLXNwZWNpYWxzJygpIHtcbiAgICAgICAgbGV0IHZhbHVlID0gJygnICsgJyknICsgJ3snICsgdGhpcy5TUCgpICsgdGhpcy5DVEwoKSArIHRoaXNbJ2xpc3Qtd2lsZGNhcmRzJ10oKSArIHRoaXNbJ3F1b3RlZC1zcGVjaWFscyddKCkgKyB0aGlzWydyZXNwLXNwZWNpYWxzJ10oKTtcbiAgICAgICAgdGhpc1snYXRvbS1zcGVjaWFscyddID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfSxcblxuICAgICdsaXN0LXdpbGRjYXJkcycoKSB7XG4gICAgICAgIHJldHVybiAnJScgKyAnKic7XG4gICAgfSxcblxuICAgICdxdW90ZWQtc3BlY2lhbHMnKCkge1xuICAgICAgICBsZXQgdmFsdWUgPSB0aGlzLkRRVU9URSgpICsgJ1xcXFwnO1xuICAgICAgICB0aGlzWydxdW90ZWQtc3BlY2lhbHMnXSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH0sXG5cbiAgICAncmVzcC1zcGVjaWFscycoKSB7XG4gICAgICAgIHJldHVybiAnXSc7XG4gICAgfSxcblxuICAgIHRhZygpIHtcbiAgICAgICAgbGV0IHZhbHVlID0gZXhjbHVkZUNoYXJzKHRoaXNbJ0FTVFJJTkctQ0hBUiddKCksICcrJyk7XG4gICAgICAgIHRoaXMudGFnID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfSxcblxuICAgIGNvbW1hbmQoKSB7XG4gICAgICAgIGxldCB2YWx1ZSA9IHRoaXMuQUxQSEEoKSArIHRoaXMuRElHSVQoKSArICctJztcbiAgICAgICAgdGhpcy5jb21tYW5kID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfSxcblxuICAgIHZlcmlmeShzdHIsIGFsbG93ZWRDaGFycykge1xuICAgICAgICBmb3IgKGxldCBpID0gMCwgbGVuID0gc3RyLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoYWxsb3dlZENoYXJzLmluZGV4T2Yoc3RyLmNoYXJBdChpKSkgPCAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIC0xO1xuICAgIH1cbn07XG4iXSwibmFtZXMiOltdLCJpZ25vcmVMaXN0IjpbMF0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(action-browser)/./node_modules/imapflow/lib/handler/imap-formal-syntax.js\n");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "(action-browser)/./node_modules/imapflow/lib/handler/imap-handler.js":
|
|
/*!***********************************************************!*\
|
|
!*** ./node_modules/imapflow/lib/handler/imap-handler.js ***!
|
|
\***********************************************************/
|
|
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
|
|
|
|
eval("\n\nconst parser = __webpack_require__(/*! ./imap-parser */ \"(action-browser)/./node_modules/imapflow/lib/handler/imap-parser.js\");\nconst compiler = __webpack_require__(/*! ./imap-compiler */ \"(action-browser)/./node_modules/imapflow/lib/handler/imap-compiler.js\");\n\nmodule.exports = {\n parser,\n compiler\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFjdGlvbi1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9pbWFwZmxvdy9saWIvaGFuZGxlci9pbWFwLWhhbmRsZXIuanMiLCJtYXBwaW5ncyI6IkFBQWE7O0FBRWIsZUFBZSxtQkFBTyxDQUFDLDBGQUFlO0FBQ3RDLGlCQUFpQixtQkFBTyxDQUFDLDhGQUFpQjs7QUFFMUM7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIi9ob21lL2FsbWEvbmV4dGdlbi9OZWFoLW1haWwvbm9kZV9tb2R1bGVzL2ltYXBmbG93L2xpYi9oYW5kbGVyL2ltYXAtaGFuZGxlci5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbmNvbnN0IHBhcnNlciA9IHJlcXVpcmUoJy4vaW1hcC1wYXJzZXInKTtcbmNvbnN0IGNvbXBpbGVyID0gcmVxdWlyZSgnLi9pbWFwLWNvbXBpbGVyJyk7XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICAgIHBhcnNlcixcbiAgICBjb21waWxlclxufTtcbiJdLCJuYW1lcyI6W10sImlnbm9yZUxpc3QiOlswXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(action-browser)/./node_modules/imapflow/lib/handler/imap-handler.js\n");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "(action-browser)/./node_modules/imapflow/lib/handler/imap-parser.js":
|
|
/*!**********************************************************!*\
|
|
!*** ./node_modules/imapflow/lib/handler/imap-parser.js ***!
|
|
\**********************************************************/
|
|
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
|
|
|
|
eval("\n\nconst imapFormalSyntax = __webpack_require__(/*! ./imap-formal-syntax */ \"(action-browser)/./node_modules/imapflow/lib/handler/imap-formal-syntax.js\");\nconst { ParserInstance } = __webpack_require__(/*! ./parser-instance */ \"(action-browser)/./node_modules/imapflow/lib/handler/parser-instance.js\");\n\nmodule.exports = async (command, options) => {\n options = options || {};\n\n let nullBytesRemoved = 0;\n\n // special case with a buggy IMAP server where responses are padded with zero bytes\n if (command[0] === 0) {\n // find the first non null byte and trim\n for (let i = 0; i < command.length; i++) {\n if (command[i] !== 0) {\n // trim to here\n command = command.slice(i);\n nullBytesRemoved = i;\n break;\n }\n }\n }\n\n const parser = new ParserInstance(command, options);\n const response = {};\n\n try {\n response.tag = await parser.getTag();\n\n await parser.getSpace();\n\n response.command = await parser.getCommand();\n\n if (nullBytesRemoved) {\n response.nullBytesRemoved = nullBytesRemoved;\n }\n\n if (['UID', 'AUTHENTICATE'].indexOf((response.command || '').toUpperCase()) >= 0) {\n await parser.getSpace();\n response.command += ' ' + (await parser.getElement(imapFormalSyntax.command()));\n }\n\n if (parser.remainder.trim().length) {\n await parser.getSpace();\n response.attributes = await parser.getAttributes();\n }\n\n if (parser.humanReadable) {\n response.attributes = (response.attributes || []).concat({\n type: 'TEXT',\n value: parser.humanReadable\n });\n }\n } catch (err) {\n if (err.code === 'ParserErrorExchange' && err.parserContext && err.parserContext.value) {\n return err.parserContext.value;\n }\n throw err;\n }\n\n return response;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFjdGlvbi1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9pbWFwZmxvdy9saWIvaGFuZGxlci9pbWFwLXBhcnNlci5qcyIsIm1hcHBpbmdzIjoiQUFBYTs7QUFFYix5QkFBeUIsbUJBQU8sQ0FBQyx3R0FBc0I7QUFDdkQsUUFBUSxpQkFBaUIsRUFBRSxtQkFBTyxDQUFDLGtHQUFtQjs7QUFFdEQ7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0Isb0JBQW9CO0FBQzVDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EiLCJzb3VyY2VzIjpbIi9ob21lL2FsbWEvbmV4dGdlbi9OZWFoLW1haWwvbm9kZV9tb2R1bGVzL2ltYXBmbG93L2xpYi9oYW5kbGVyL2ltYXAtcGFyc2VyLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcblxuY29uc3QgaW1hcEZvcm1hbFN5bnRheCA9IHJlcXVpcmUoJy4vaW1hcC1mb3JtYWwtc3ludGF4Jyk7XG5jb25zdCB7IFBhcnNlckluc3RhbmNlIH0gPSByZXF1aXJlKCcuL3BhcnNlci1pbnN0YW5jZScpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGFzeW5jIChjb21tYW5kLCBvcHRpb25zKSA9PiB7XG4gICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cbiAgICBsZXQgbnVsbEJ5dGVzUmVtb3ZlZCA9IDA7XG5cbiAgICAvLyBzcGVjaWFsIGNhc2Ugd2l0aCBhIGJ1Z2d5IElNQVAgc2VydmVyIHdoZXJlIHJlc3BvbnNlcyBhcmUgcGFkZGVkIHdpdGggemVybyBieXRlc1xuICAgIGlmIChjb21tYW5kWzBdID09PSAwKSB7XG4gICAgICAgIC8vIGZpbmQgdGhlIGZpcnN0IG5vbiBudWxsIGJ5dGUgYW5kIHRyaW1cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb21tYW5kLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoY29tbWFuZFtpXSAhPT0gMCkge1xuICAgICAgICAgICAgICAgIC8vIHRyaW0gdG8gaGVyZVxuICAgICAgICAgICAgICAgIGNvbW1hbmQgPSBjb21tYW5kLnNsaWNlKGkpO1xuICAgICAgICAgICAgICAgIG51bGxCeXRlc1JlbW92ZWQgPSBpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgcGFyc2VyID0gbmV3IFBhcnNlckluc3RhbmNlKGNvbW1hbmQsIG9wdGlvbnMpO1xuICAgIGNvbnN0IHJlc3BvbnNlID0ge307XG5cbiAgICB0cnkge1xuICAgICAgICByZXNwb25zZS50YWcgPSBhd2FpdCBwYXJzZXIuZ2V0VGFnKCk7XG5cbiAgICAgICAgYXdhaXQgcGFyc2VyLmdldFNwYWNlKCk7XG5cbiAgICAgICAgcmVzcG9uc2UuY29tbWFuZCA9IGF3YWl0IHBhcnNlci5nZXRDb21tYW5kKCk7XG5cbiAgICAgICAgaWYgKG51bGxCeXRlc1JlbW92ZWQpIHtcbiAgICAgICAgICAgIHJlc3BvbnNlLm51bGxCeXRlc1JlbW92ZWQgPSBudWxsQnl0ZXNSZW1vdmVkO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKFsnVUlEJywgJ0FVVEhFTlRJQ0FURSddLmluZGV4T2YoKHJlc3BvbnNlLmNvbW1hbmQgfHwgJycpLnRvVXBwZXJDYXNlKCkpID49IDApIHtcbiAgICAgICAgICAgIGF3YWl0IHBhcnNlci5nZXRTcGFjZSgpO1xuICAgICAgICAgICAgcmVzcG9uc2UuY29tbWFuZCArPSAnICcgKyAoYXdhaXQgcGFyc2VyLmdldEVsZW1lbnQoaW1hcEZvcm1hbFN5bnRheC5jb21tYW5kKCkpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwYXJzZXIucmVtYWluZGVyLnRyaW0oKS5sZW5ndGgpIHtcbiAgICAgICAgICAgIGF3YWl0IHBhcnNlci5nZXRTcGFjZSgpO1xuICAgICAgICAgICAgcmVzcG9uc2UuYXR0cmlidXRlcyA9IGF3YWl0IHBhcnNlci5nZXRBdHRyaWJ1dGVzKCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocGFyc2VyLmh1bWFuUmVhZGFibGUpIHtcbiAgICAgICAgICAgIHJlc3BvbnNlLmF0dHJpYnV0ZXMgPSAocmVzcG9uc2UuYXR0cmlidXRlcyB8fCBbXSkuY29uY2F0KHtcbiAgICAgICAgICAgICAgICB0eXBlOiAnVEVYVCcsXG4gICAgICAgICAgICAgICAgdmFsdWU6IHBhcnNlci5odW1hblJlYWRhYmxlXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBpZiAoZXJyLmNvZGUgPT09ICdQYXJzZXJFcnJvckV4Y2hhbmdlJyAmJiBlcnIucGFyc2VyQ29udGV4dCAmJiBlcnIucGFyc2VyQ29udGV4dC52YWx1ZSkge1xuICAgICAgICAgICAgcmV0dXJuIGVyci5wYXJzZXJDb250ZXh0LnZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIHRocm93IGVycjtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzcG9uc2U7XG59O1xuIl0sIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6WzBdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(action-browser)/./node_modules/imapflow/lib/handler/imap-parser.js\n");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "(action-browser)/./node_modules/imapflow/lib/handler/imap-stream.js":
|
|
/*!**********************************************************!*\
|
|
!*** ./node_modules/imapflow/lib/handler/imap-stream.js ***!
|
|
\**********************************************************/
|
|
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
|
|
|
|
eval("\n\nconst Transform = (__webpack_require__(/*! stream */ \"stream\").Transform);\nconst logger = __webpack_require__(/*! ../logger */ \"(action-browser)/./node_modules/imapflow/lib/logger.js\");\n\nconst LINE = 0x01;\nconst LITERAL = 0x02;\n\nconst LF = 0x0a;\nconst CR = 0x0d;\nconst NUM_0 = 0x30;\nconst NUM_9 = 0x39;\nconst CURLY_OPEN = 0x7b;\nconst CURLY_CLOSE = 0x7d;\n\nclass ImapStream extends Transform {\n constructor(options) {\n super({\n //writableHighWaterMark: 3,\n readableObjectMode: true,\n writableObjectMode: false\n });\n\n this.options = options || {};\n this.cid = this.options.cid;\n\n this.log =\n this.options.logger && typeof this.options.logger === 'object'\n ? this.options.logger\n : logger.child({\n component: 'imap-connection',\n cid: this.cid\n });\n\n this.readBytesCounter = 0;\n\n this.state = LINE;\n this.literalWaiting = 0;\n this.inputBuffer = []; // lines\n this.lineBuffer = []; // current line\n this.literalBuffer = [];\n this.literals = [];\n\n this.compress = false;\n this.secureConnection = this.options.secureConnection;\n\n this.processingInput = false;\n this.inputQueue = []; // unprocessed input chunks\n }\n\n checkLiteralMarker(line) {\n if (!line || !line.length) {\n return false;\n }\n\n let pos = line.length - 1;\n\n if (line[pos] === LF) {\n pos--;\n } else {\n return false;\n }\n if (pos >= 0 && line[pos] === CR) {\n pos--;\n }\n if (pos < 0) {\n return false;\n }\n\n if (!pos || line[pos] !== CURLY_CLOSE) {\n return false;\n }\n pos--;\n\n let numBytes = [];\n for (; pos > 0; pos--) {\n let c = line[pos];\n if (c >= NUM_0 && c <= NUM_9) {\n numBytes.unshift(c);\n continue;\n }\n if (c === CURLY_OPEN && numBytes.length) {\n this.state = LITERAL;\n this.literalWaiting = Number(Buffer.from(numBytes).toString());\n return true;\n }\n return false;\n }\n return false;\n }\n\n async processInputChunk(chunk, startPos) {\n startPos = startPos || 0;\n if (startPos >= chunk.length) {\n return;\n }\n\n switch (this.state) {\n case LINE: {\n let lineStart = startPos;\n for (let i = startPos, len = chunk.length; i < len; i++) {\n if (chunk[i] === LF) {\n // line end found\n this.lineBuffer.push(chunk.slice(lineStart, i + 1));\n lineStart = i + 1;\n\n let line = Buffer.concat(this.lineBuffer);\n\n this.inputBuffer.push(line);\n this.lineBuffer = [];\n\n // try to detect if this is a literal start\n if (this.checkLiteralMarker(line)) {\n // switch into line mode and start over\n return await this.processInputChunk(chunk, lineStart);\n }\n\n // reached end of command input, emit it\n let payload = this.inputBuffer.length === 1 ? this.inputBuffer[0] : Buffer.concat(this.inputBuffer);\n let literals = this.literals;\n this.inputBuffer = [];\n this.literals = [];\n\n if (payload.length) {\n // remove final line terminator\n let skipBytes = 0;\n if (payload.length >= 1 && payload[payload.length - 1] === LF) {\n skipBytes++;\n if (payload.length >= 2 && payload[payload.length - 2] === CR) {\n skipBytes++;\n }\n }\n\n if (skipBytes) {\n payload = payload.slice(0, payload.length - skipBytes);\n }\n\n if (payload.length) {\n await new Promise(resolve => {\n this.push({ payload, literals, next: resolve });\n });\n }\n }\n }\n }\n if (lineStart < chunk.length) {\n this.lineBuffer.push(chunk.slice(lineStart));\n }\n break;\n }\n\n case LITERAL: {\n // exactly until end of chunk\n if (chunk.length === startPos + this.literalWaiting) {\n if (!startPos) {\n this.literalBuffer.push(chunk);\n } else {\n this.literalBuffer.push(chunk.slice(startPos));\n }\n\n this.literalWaiting -= chunk.length;\n this.literals.push(Buffer.concat(this.literalBuffer));\n this.literalBuffer = [];\n this.state = LINE;\n\n return;\n } else if (chunk.length > startPos + this.literalWaiting) {\n let partial = chunk.slice(startPos, startPos + this.literalWaiting);\n this.literalBuffer.push(partial);\n startPos += partial.length;\n this.literalWaiting -= partial.length;\n this.literals.push(Buffer.concat(this.literalBuffer));\n this.literalBuffer = [];\n this.state = LINE;\n\n return await this.processInputChunk(chunk, startPos);\n } else {\n let partial = chunk.slice(startPos);\n this.literalBuffer.push(partial);\n startPos += partial.length;\n this.literalWaiting -= partial.length;\n return;\n }\n }\n }\n }\n\n async processInput() {\n let data;\n while ((data = this.inputQueue.shift())) {\n await this.processInputChunk(data.chunk);\n // mark chunk as processed\n data.next();\n }\n }\n\n _transform(chunk, encoding, next) {\n if (typeof chunk === 'string') {\n chunk = Buffer.from(chunk, encoding);\n }\n\n if (!chunk || !chunk.length) {\n return next();\n }\n\n this.readBytesCounter += chunk.length;\n\n if (this.options.logRaw) {\n this.log.trace({\n src: 's',\n msg: 'read from socket',\n data: chunk.toString('base64'),\n compress: !!this.compress,\n secure: !!this.secureConnection,\n cid: this.cid\n });\n }\n\n if (chunk && chunk.length) {\n this.inputQueue.push({ chunk, next });\n }\n\n if (!this.processingInput) {\n this.processingInput = true;\n this.processInput()\n .catch(err => this.emit('error', err))\n .finally(() => (this.processingInput = false));\n }\n }\n\n _flush(next) {\n next();\n }\n}\n\nmodule.exports.ImapStream = ImapStream;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFjdGlvbi1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9pbWFwZmxvdy9saWIvaGFuZGxlci9pbWFwLXN0cmVhbS5qcyIsIm1hcHBpbmdzIjoiQUFBYTs7QUFFYixrQkFBa0IsdURBQTJCO0FBQzdDLGVBQWUsbUJBQU8sQ0FBQyx5RUFBVzs7QUFFbEM7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQjs7QUFFbkI7O0FBRUE7QUFDQTtBQUNBLCtCQUErQjtBQUMvQiw4QkFBOEI7QUFDOUI7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0EsOEJBQThCO0FBQzlCOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGVBQWUsU0FBUztBQUN4QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsMkRBQTJELFNBQVM7QUFDcEU7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsZ0RBQWdELGtDQUFrQztBQUNsRixpQ0FBaUM7QUFDakM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0I7QUFDdEI7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjs7QUFFQTtBQUNBLG1DQUFtQyxhQUFhO0FBQ2hEOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLHlCQUF5QiIsInNvdXJjZXMiOlsiL2hvbWUvYWxtYS9uZXh0Z2VuL05lYWgtbWFpbC9ub2RlX21vZHVsZXMvaW1hcGZsb3cvbGliL2hhbmRsZXIvaW1hcC1zdHJlYW0uanMiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCBUcmFuc2Zvcm0gPSByZXF1aXJlKCdzdHJlYW0nKS5UcmFuc2Zvcm07XG5jb25zdCBsb2dnZXIgPSByZXF1aXJlKCcuLi9sb2dnZXInKTtcblxuY29uc3QgTElORSA9IDB4MDE7XG5jb25zdCBMSVRFUkFMID0gMHgwMjtcblxuY29uc3QgTEYgPSAweDBhO1xuY29uc3QgQ1IgPSAweDBkO1xuY29uc3QgTlVNXzAgPSAweDMwO1xuY29uc3QgTlVNXzkgPSAweDM5O1xuY29uc3QgQ1VSTFlfT1BFTiA9IDB4N2I7XG5jb25zdCBDVVJMWV9DTE9TRSA9IDB4N2Q7XG5cbmNsYXNzIEltYXBTdHJlYW0gZXh0ZW5kcyBUcmFuc2Zvcm0ge1xuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnMpIHtcbiAgICAgICAgc3VwZXIoe1xuICAgICAgICAgICAgLy93cml0YWJsZUhpZ2hXYXRlck1hcms6IDMsXG4gICAgICAgICAgICByZWFkYWJsZU9iamVjdE1vZGU6IHRydWUsXG4gICAgICAgICAgICB3cml0YWJsZU9iamVjdE1vZGU6IGZhbHNlXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gICAgICAgIHRoaXMuY2lkID0gdGhpcy5vcHRpb25zLmNpZDtcblxuICAgICAgICB0aGlzLmxvZyA9XG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMubG9nZ2VyICYmIHR5cGVvZiB0aGlzLm9wdGlvbnMubG9nZ2VyID09PSAnb2JqZWN0J1xuICAgICAgICAgICAgICAgID8gdGhpcy5vcHRpb25zLmxvZ2dlclxuICAgICAgICAgICAgICAgIDogbG9nZ2VyLmNoaWxkKHtcbiAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQ6ICdpbWFwLWNvbm5lY3Rpb24nLFxuICAgICAgICAgICAgICAgICAgICAgIGNpZDogdGhpcy5jaWRcbiAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMucmVhZEJ5dGVzQ291bnRlciA9IDA7XG5cbiAgICAgICAgdGhpcy5zdGF0ZSA9IExJTkU7XG4gICAgICAgIHRoaXMubGl0ZXJhbFdhaXRpbmcgPSAwO1xuICAgICAgICB0aGlzLmlucHV0QnVmZmVyID0gW107IC8vIGxpbmVzXG4gICAgICAgIHRoaXMubGluZUJ1ZmZlciA9IFtdOyAvLyBjdXJyZW50IGxpbmVcbiAgICAgICAgdGhpcy5saXRlcmFsQnVmZmVyID0gW107XG4gICAgICAgIHRoaXMubGl0ZXJhbHMgPSBbXTtcblxuICAgICAgICB0aGlzLmNvbXByZXNzID0gZmFsc2U7XG4gICAgICAgIHRoaXMuc2VjdXJlQ29ubmVjdGlvbiA9IHRoaXMub3B0aW9ucy5zZWN1cmVDb25uZWN0aW9uO1xuXG4gICAgICAgIHRoaXMucHJvY2Vzc2luZ0lucHV0ID0gZmFsc2U7XG4gICAgICAgIHRoaXMuaW5wdXRRdWV1ZSA9IFtdOyAvLyB1bnByb2Nlc3NlZCBpbnB1dCBjaHVua3NcbiAgICB9XG5cbiAgICBjaGVja0xpdGVyYWxNYXJrZXIobGluZSkge1xuICAgICAgICBpZiAoIWxpbmUgfHwgIWxpbmUubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgcG9zID0gbGluZS5sZW5ndGggLSAxO1xuXG4gICAgICAgIGlmIChsaW5lW3Bvc10gPT09IExGKSB7XG4gICAgICAgICAgICBwb3MtLTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocG9zID49IDAgJiYgbGluZVtwb3NdID09PSBDUikge1xuICAgICAgICAgICAgcG9zLS07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBvcyA8IDApIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghcG9zIHx8IGxpbmVbcG9zXSAhPT0gQ1VSTFlfQ0xPU0UpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBwb3MtLTtcblxuICAgICAgICBsZXQgbnVtQnl0ZXMgPSBbXTtcbiAgICAgICAgZm9yICg7IHBvcyA+IDA7IHBvcy0tKSB7XG4gICAgICAgICAgICBsZXQgYyA9IGxpbmVbcG9zXTtcbiAgICAgICAgICAgIGlmIChjID49IE5VTV8wICYmIGMgPD0gTlVNXzkpIHtcbiAgICAgICAgICAgICAgICBudW1CeXRlcy51bnNoaWZ0KGMpO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGMgPT09IENVUkxZX09QRU4gJiYgbnVtQnl0ZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IExJVEVSQUw7XG4gICAgICAgICAgICAgICAgdGhpcy5saXRlcmFsV2FpdGluZyA9IE51bWJlcihCdWZmZXIuZnJvbShudW1CeXRlcykudG9TdHJpbmcoKSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGFzeW5jIHByb2Nlc3NJbnB1dENodW5rKGNodW5rLCBzdGFydFBvcykge1xuICAgICAgICBzdGFydFBvcyA9IHN0YXJ0UG9zIHx8IDA7XG4gICAgICAgIGlmIChzdGFydFBvcyA+PSBjaHVuay5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHN3aXRjaCAodGhpcy5zdGF0ZSkge1xuICAgICAgICAgICAgY2FzZSBMSU5FOiB7XG4gICAgICAgICAgICAgICAgbGV0IGxpbmVTdGFydCA9IHN0YXJ0UG9zO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSBzdGFydFBvcywgbGVuID0gY2h1bmsubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNodW5rW2ldID09PSBMRikge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGluZSBlbmQgZm91bmRcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubGluZUJ1ZmZlci5wdXNoKGNodW5rLnNsaWNlKGxpbmVTdGFydCwgaSArIDEpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVTdGFydCA9IGkgKyAxO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgbGluZSA9IEJ1ZmZlci5jb25jYXQodGhpcy5saW5lQnVmZmVyKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pbnB1dEJ1ZmZlci5wdXNoKGxpbmUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5saW5lQnVmZmVyID0gW107XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRyeSB0byBkZXRlY3QgaWYgdGhpcyBpcyBhIGxpdGVyYWwgc3RhcnRcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmNoZWNrTGl0ZXJhbE1hcmtlcihsaW5lKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN3aXRjaCBpbnRvIGxpbmUgbW9kZSBhbmQgc3RhcnQgb3ZlclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLnByb2Nlc3NJbnB1dENodW5rKGNodW5rLCBsaW5lU3RhcnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyByZWFjaGVkIGVuZCBvZiBjb21tYW5kIGlucHV0LCBlbWl0IGl0XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgcGF5bG9hZCA9IHRoaXMuaW5wdXRCdWZmZXIubGVuZ3RoID09PSAxID8gdGhpcy5pbnB1dEJ1ZmZlclswXSA6IEJ1ZmZlci5jb25jYXQodGhpcy5pbnB1dEJ1ZmZlcik7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgbGl0ZXJhbHMgPSB0aGlzLmxpdGVyYWxzO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pbnB1dEJ1ZmZlciA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5saXRlcmFscyA9IFtdO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocGF5bG9hZC5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZW1vdmUgZmluYWwgbGluZSB0ZXJtaW5hdG9yXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHNraXBCeXRlcyA9IDA7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBheWxvYWQubGVuZ3RoID49IDEgJiYgcGF5bG9hZFtwYXlsb2FkLmxlbmd0aCAtIDFdID09PSBMRikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBza2lwQnl0ZXMrKztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBheWxvYWQubGVuZ3RoID49IDIgJiYgcGF5bG9hZFtwYXlsb2FkLmxlbmd0aCAtIDJdID09PSBDUikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2tpcEJ5dGVzKys7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2tpcEJ5dGVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBheWxvYWQgPSBwYXlsb2FkLnNsaWNlKDAsIHBheWxvYWQubGVuZ3RoIC0gc2tpcEJ5dGVzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGF5bG9hZC5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnB1c2goeyBwYXlsb2FkLCBsaXRlcmFscywgbmV4dDogcmVzb2x2ZSB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChsaW5lU3RhcnQgPCBjaHVuay5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5saW5lQnVmZmVyLnB1c2goY2h1bmsuc2xpY2UobGluZVN0YXJ0KSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjYXNlIExJVEVSQUw6IHtcbiAgICAgICAgICAgICAgICAvLyBleGFjdGx5IHVudGlsIGVuZCBvZiBjaHVua1xuICAgICAgICAgICAgICAgIGlmIChjaHVuay5sZW5ndGggPT09IHN0YXJ0UG9zICsgdGhpcy5saXRlcmFsV2FpdGluZykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXN0YXJ0UG9zKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxpdGVyYWxCdWZmZXIucHVzaChjaHVuayk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxpdGVyYWxCdWZmZXIucHVzaChjaHVuay5zbGljZShzdGFydFBvcykpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5saXRlcmFsV2FpdGluZyAtPSBjaHVuay5sZW5ndGg7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubGl0ZXJhbHMucHVzaChCdWZmZXIuY29uY2F0KHRoaXMubGl0ZXJhbEJ1ZmZlcikpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmxpdGVyYWxCdWZmZXIgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IExJTkU7XG5cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2h1bmsubGVuZ3RoID4gc3RhcnRQb3MgKyB0aGlzLmxpdGVyYWxXYWl0aW5nKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBwYXJ0aWFsID0gY2h1bmsuc2xpY2Uoc3RhcnRQb3MsIHN0YXJ0UG9zICsgdGhpcy5saXRlcmFsV2FpdGluZyk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubGl0ZXJhbEJ1ZmZlci5wdXNoKHBhcnRpYWwpO1xuICAgICAgICAgICAgICAgICAgICBzdGFydFBvcyArPSBwYXJ0aWFsLmxlbmd0aDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5saXRlcmFsV2FpdGluZyAtPSBwYXJ0aWFsLmxlbmd0aDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5saXRlcmFscy5wdXNoKEJ1ZmZlci5jb25jYXQodGhpcy5saXRlcmFsQnVmZmVyKSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubGl0ZXJhbEJ1ZmZlciA9IFtdO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnN0YXRlID0gTElORTtcblxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5wcm9jZXNzSW5wdXRDaHVuayhjaHVuaywgc3RhcnRQb3MpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBwYXJ0aWFsID0gY2h1bmsuc2xpY2Uoc3RhcnRQb3MpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmxpdGVyYWxCdWZmZXIucHVzaChwYXJ0aWFsKTtcbiAgICAgICAgICAgICAgICAgICAgc3RhcnRQb3MgKz0gcGFydGlhbC5sZW5ndGg7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubGl0ZXJhbFdhaXRpbmcgLT0gcGFydGlhbC5sZW5ndGg7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhc3luYyBwcm9jZXNzSW5wdXQoKSB7XG4gICAgICAgIGxldCBkYXRhO1xuICAgICAgICB3aGlsZSAoKGRhdGEgPSB0aGlzLmlucHV0UXVldWUuc2hpZnQoKSkpIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMucHJvY2Vzc0lucHV0Q2h1bmsoZGF0YS5jaHVuayk7XG4gICAgICAgICAgICAvLyBtYXJrIGNodW5rIGFzIHByb2Nlc3NlZFxuICAgICAgICAgICAgZGF0YS5uZXh0KCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBfdHJhbnNmb3JtKGNodW5rLCBlbmNvZGluZywgbmV4dCkge1xuICAgICAgICBpZiAodHlwZW9mIGNodW5rID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgY2h1bmsgPSBCdWZmZXIuZnJvbShjaHVuaywgZW5jb2RpbmcpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFjaHVuayB8fCAhY2h1bmsubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV4dCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5yZWFkQnl0ZXNDb3VudGVyICs9IGNodW5rLmxlbmd0aDtcblxuICAgICAgICBpZiAodGhpcy5vcHRpb25zLmxvZ1Jhdykge1xuICAgICAgICAgICAgdGhpcy5sb2cudHJhY2Uoe1xuICAgICAgICAgICAgICAgIHNyYzogJ3MnLFxuICAgICAgICAgICAgICAgIG1zZzogJ3JlYWQgZnJvbSBzb2NrZXQnLFxuICAgICAgICAgICAgICAgIGRhdGE6IGNodW5rLnRvU3RyaW5nKCdiYXNlNjQnKSxcbiAgICAgICAgICAgICAgICBjb21wcmVzczogISF0aGlzLmNvbXByZXNzLFxuICAgICAgICAgICAgICAgIHNlY3VyZTogISF0aGlzLnNlY3VyZUNvbm5lY3Rpb24sXG4gICAgICAgICAgICAgICAgY2lkOiB0aGlzLmNpZFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY2h1bmsgJiYgY2h1bmsubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLmlucHV0UXVldWUucHVzaCh7IGNodW5rLCBuZXh0IH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0aGlzLnByb2Nlc3NpbmdJbnB1dCkge1xuICAgICAgICAgICAgdGhpcy5wcm9jZXNzaW5nSW5wdXQgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5wcm9jZXNzSW5wdXQoKVxuICAgICAgICAgICAgICAgIC5jYXRjaChlcnIgPT4gdGhpcy5lbWl0KCdlcnJvcicsIGVycikpXG4gICAgICAgICAgICAgICAgLmZpbmFsbHkoKCkgPT4gKHRoaXMucHJvY2Vzc2luZ0lucHV0ID0gZmFsc2UpKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIF9mbHVzaChuZXh0KSB7XG4gICAgICAgIG5leHQoKTtcbiAgICB9XG59XG5cbm1vZHVsZS5leHBvcnRzLkltYXBTdHJlYW0gPSBJbWFwU3RyZWFtO1xuIl0sIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6WzBdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(action-browser)/./node_modules/imapflow/lib/handler/imap-stream.js\n");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "(action-browser)/./node_modules/imapflow/lib/handler/parser-instance.js":
|
|
/*!**************************************************************!*\
|
|
!*** ./node_modules/imapflow/lib/handler/parser-instance.js ***!
|
|
\**************************************************************/
|
|
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
|
|
|
|
eval("/* eslint new-cap: 0 */\n\n\n\nconst imapFormalSyntax = __webpack_require__(/*! ./imap-formal-syntax */ \"(action-browser)/./node_modules/imapflow/lib/handler/imap-formal-syntax.js\");\n\nconst { TokenParser } = __webpack_require__(/*! ./token-parser */ \"(action-browser)/./node_modules/imapflow/lib/handler/token-parser.js\");\n\nclass ParserInstance {\n constructor(input, options) {\n this.input = (input || '').toString();\n this.options = options || {};\n this.remainder = this.input;\n this.pos = 0;\n }\n\n async getTag() {\n if (!this.tag) {\n this.tag = await this.getElement(imapFormalSyntax.tag() + '*+', true);\n }\n return this.tag;\n }\n\n async getCommand() {\n if (this.tag === '+') {\n // special case\n this.humanReadable = this.remainder.trim();\n this.remainder = '';\n\n return '';\n }\n\n if (!this.command) {\n this.command = await this.getElement(imapFormalSyntax.command());\n }\n\n switch ((this.command || '').toString().toUpperCase()) {\n case 'OK':\n case 'NO':\n case 'BAD':\n case 'PREAUTH':\n case 'BYE':\n {\n let match = this.remainder.match(/^\\s+\\[/);\n if (match) {\n let nesting = 1;\n for (let i = match[0].length; i <= this.remainder.length; i++) {\n let c = this.remainder[i];\n\n if (c === '[') {\n nesting++;\n } else if (c === ']') {\n nesting--;\n }\n if (!nesting) {\n this.humanReadable = this.remainder.substring(i + 1).trim();\n this.remainder = this.remainder.substring(0, i + 1);\n break;\n }\n }\n } else {\n this.humanReadable = this.remainder.trim();\n this.remainder = '';\n }\n }\n break;\n }\n\n return this.command;\n }\n\n async getElement(syntax) {\n let match, element, errPos;\n\n if (this.remainder.match(/^\\s/)) {\n let error = new Error(`Unexpected whitespace at position ${this.pos} [E1]`);\n error.code = 'ParserError1';\n error.parserContext = { input: this.input, pos: this.pos };\n throw error;\n }\n\n if ((match = this.remainder.match(/^\\s*[^\\s]+(?=\\s|$)/))) {\n element = match[0];\n if ((errPos = imapFormalSyntax.verify(element, syntax)) >= 0) {\n if (this.tag === 'Server' && element === 'Unavailable.') {\n // Exchange error\n let error = new Error(`Server returned an error: ${this.input}`);\n error.code = 'ParserErrorExchange';\n error.parserContext = {\n input: this.input,\n element,\n pos: this.pos,\n value: {\n tag: '*',\n command: 'BAD',\n attributes: [{ type: 'TEXT', value: this.input }]\n }\n };\n throw error;\n }\n\n let error = new Error(`Unexpected char at position ${this.pos + errPos} [E2: ${JSON.stringify(element.charAt(errPos))}]`);\n error.code = 'ParserError2';\n error.parserContext = { input: this.input, element, pos: this.pos };\n throw error;\n }\n } else {\n let error = new Error(`Unexpected end of input at position ${this.pos} [E3]`);\n error.code = 'ParserError3';\n error.parserContext = { input: this.input, pos: this.pos };\n throw error;\n }\n\n this.pos += match[0].length;\n this.remainder = this.remainder.substr(match[0].length);\n\n return element;\n }\n\n async getSpace() {\n if (!this.remainder.length) {\n if (this.tag === '+' && this.pos === 1) {\n // special case, empty + response\n return;\n }\n\n let error = new Error(`Unexpected end of input at position ${this.pos} [E4]`);\n error.code = 'ParserError4';\n error.parserContext = { input: this.input, pos: this.pos };\n throw error;\n }\n\n if (imapFormalSyntax.verify(this.remainder.charAt(0), imapFormalSyntax.SP()) >= 0) {\n let error = new Error(`Unexpected char at position ${this.pos} [E5: ${JSON.stringify(this.remainder.charAt(0))}]`);\n error.code = 'ParserError5';\n error.parserContext = { input: this.input, element: this.remainder, pos: this.pos };\n throw error;\n }\n\n this.pos++;\n this.remainder = this.remainder.substr(1);\n }\n\n async getAttributes() {\n if (!this.remainder.length) {\n let error = new Error(`Unexpected end of input at position ${this.pos} [E6]`);\n error.code = 'ParserError6';\n error.parserContext = { input: this.input, pos: this.pos };\n throw error;\n }\n\n if (this.remainder.match(/^\\s/)) {\n let error = new Error(`Unexpected whitespace at position ${this.pos} [E7]`);\n error.code = 'ParserError7';\n error.parserContext = { input: this.input, element: this.remainder, pos: this.pos };\n throw error;\n }\n\n const tokenParser = new TokenParser(this, this.pos, this.remainder, this.options);\n\n return await tokenParser.getAttributes();\n }\n}\n\nmodule.exports.ParserInstance = ParserInstance;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFjdGlvbi1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9pbWFwZmxvdy9saWIvaGFuZGxlci9wYXJzZXItaW5zdGFuY2UuanMiLCJtYXBwaW5ncyI6IkFBQUE7O0FBRWE7O0FBRWIseUJBQXlCLG1CQUFPLENBQUMsd0dBQXNCOztBQUV2RCxRQUFRLGNBQWMsRUFBRSxtQkFBTyxDQUFDLDRGQUFnQjs7QUFFaEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzREFBc0QsNEJBQTRCO0FBQ2xGOztBQUVBO0FBQ0E7QUFDQSw4QkFBOEI7QUFDOUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQjtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0EsdUVBQXVFLFVBQVU7QUFDakY7QUFDQSxvQ0FBb0M7QUFDcEM7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUVBQXVFLFdBQVc7QUFDbEY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJDQUEyQyxpQ0FBaUM7QUFDNUU7QUFDQTtBQUNBO0FBQ0E7O0FBRUEscUVBQXFFLG1CQUFtQixPQUFPLHVDQUF1QztBQUN0STtBQUNBLHdDQUF3QztBQUN4QztBQUNBO0FBQ0EsVUFBVTtBQUNWLHlFQUF5RSxVQUFVO0FBQ25GO0FBQ0Esb0NBQW9DO0FBQ3BDO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSx5RUFBeUUsVUFBVTtBQUNuRjtBQUNBLG9DQUFvQztBQUNwQztBQUNBOztBQUVBO0FBQ0EsaUVBQWlFLFVBQVUsT0FBTyx5Q0FBeUM7QUFDM0g7QUFDQSxvQ0FBb0M7QUFDcEM7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLHlFQUF5RSxVQUFVO0FBQ25GO0FBQ0Esb0NBQW9DO0FBQ3BDO0FBQ0E7O0FBRUE7QUFDQSx1RUFBdUUsVUFBVTtBQUNqRjtBQUNBLG9DQUFvQztBQUNwQztBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSw2QkFBNkIiLCJzb3VyY2VzIjpbIi9ob21lL2FsbWEvbmV4dGdlbi9OZWFoLW1haWwvbm9kZV9tb2R1bGVzL2ltYXBmbG93L2xpYi9oYW5kbGVyL3BhcnNlci1pbnN0YW5jZS5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQgbmV3LWNhcDogMCAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbmNvbnN0IGltYXBGb3JtYWxTeW50YXggPSByZXF1aXJlKCcuL2ltYXAtZm9ybWFsLXN5bnRheCcpO1xuXG5jb25zdCB7IFRva2VuUGFyc2VyIH0gPSByZXF1aXJlKCcuL3Rva2VuLXBhcnNlcicpO1xuXG5jbGFzcyBQYXJzZXJJbnN0YW5jZSB7XG4gICAgY29uc3RydWN0b3IoaW5wdXQsIG9wdGlvbnMpIHtcbiAgICAgICAgdGhpcy5pbnB1dCA9IChpbnB1dCB8fCAnJykudG9TdHJpbmcoKTtcbiAgICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgICAgICAgdGhpcy5yZW1haW5kZXIgPSB0aGlzLmlucHV0O1xuICAgICAgICB0aGlzLnBvcyA9IDA7XG4gICAgfVxuXG4gICAgYXN5bmMgZ2V0VGFnKCkge1xuICAgICAgICBpZiAoIXRoaXMudGFnKSB7XG4gICAgICAgICAgICB0aGlzLnRhZyA9IGF3YWl0IHRoaXMuZ2V0RWxlbWVudChpbWFwRm9ybWFsU3ludGF4LnRhZygpICsgJyorJywgdHJ1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMudGFnO1xuICAgIH1cblxuICAgIGFzeW5jIGdldENvbW1hbmQoKSB7XG4gICAgICAgIGlmICh0aGlzLnRhZyA9PT0gJysnKSB7XG4gICAgICAgICAgICAvLyBzcGVjaWFsIGNhc2VcbiAgICAgICAgICAgIHRoaXMuaHVtYW5SZWFkYWJsZSA9IHRoaXMucmVtYWluZGVyLnRyaW0oKTtcbiAgICAgICAgICAgIHRoaXMucmVtYWluZGVyID0gJyc7XG5cbiAgICAgICAgICAgIHJldHVybiAnJztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhpcy5jb21tYW5kKSB7XG4gICAgICAgICAgICB0aGlzLmNvbW1hbmQgPSBhd2FpdCB0aGlzLmdldEVsZW1lbnQoaW1hcEZvcm1hbFN5bnRheC5jb21tYW5kKCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgc3dpdGNoICgodGhpcy5jb21tYW5kIHx8ICcnKS50b1N0cmluZygpLnRvVXBwZXJDYXNlKCkpIHtcbiAgICAgICAgICAgIGNhc2UgJ09LJzpcbiAgICAgICAgICAgIGNhc2UgJ05PJzpcbiAgICAgICAgICAgIGNhc2UgJ0JBRCc6XG4gICAgICAgICAgICBjYXNlICdQUkVBVVRIJzpcbiAgICAgICAgICAgIGNhc2UgJ0JZRSc6XG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBsZXQgbWF0Y2ggPSB0aGlzLnJlbWFpbmRlci5tYXRjaCgvXlxccytcXFsvKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG1hdGNoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgbmVzdGluZyA9IDE7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gbWF0Y2hbMF0ubGVuZ3RoOyBpIDw9IHRoaXMucmVtYWluZGVyLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGMgPSB0aGlzLnJlbWFpbmRlcltpXTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjID09PSAnWycpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmVzdGluZysrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYyA9PT0gJ10nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lc3RpbmctLTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFuZXN0aW5nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaHVtYW5SZWFkYWJsZSA9IHRoaXMucmVtYWluZGVyLnN1YnN0cmluZyhpICsgMSkudHJpbSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbWFpbmRlciA9IHRoaXMucmVtYWluZGVyLnN1YnN0cmluZygwLCBpICsgMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaHVtYW5SZWFkYWJsZSA9IHRoaXMucmVtYWluZGVyLnRyaW0oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVtYWluZGVyID0gJyc7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5jb21tYW5kO1xuICAgIH1cblxuICAgIGFzeW5jIGdldEVsZW1lbnQoc3ludGF4KSB7XG4gICAgICAgIGxldCBtYXRjaCwgZWxlbWVudCwgZXJyUG9zO1xuXG4gICAgICAgIGlmICh0aGlzLnJlbWFpbmRlci5tYXRjaCgvXlxccy8pKSB7XG4gICAgICAgICAgICBsZXQgZXJyb3IgPSBuZXcgRXJyb3IoYFVuZXhwZWN0ZWQgd2hpdGVzcGFjZSBhdCBwb3NpdGlvbiAke3RoaXMucG9zfSBbRTFdYCk7XG4gICAgICAgICAgICBlcnJvci5jb2RlID0gJ1BhcnNlckVycm9yMSc7XG4gICAgICAgICAgICBlcnJvci5wYXJzZXJDb250ZXh0ID0geyBpbnB1dDogdGhpcy5pbnB1dCwgcG9zOiB0aGlzLnBvcyB9O1xuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoKG1hdGNoID0gdGhpcy5yZW1haW5kZXIubWF0Y2goL15cXHMqW15cXHNdKyg/PVxcc3wkKS8pKSkge1xuICAgICAgICAgICAgZWxlbWVudCA9IG1hdGNoWzBdO1xuICAgICAgICAgICAgaWYgKChlcnJQb3MgPSBpbWFwRm9ybWFsU3ludGF4LnZlcmlmeShlbGVtZW50LCBzeW50YXgpKSA+PSAwKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMudGFnID09PSAnU2VydmVyJyAmJiBlbGVtZW50ID09PSAnVW5hdmFpbGFibGUuJykge1xuICAgICAgICAgICAgICAgICAgICAvLyBFeGNoYW5nZSBlcnJvclxuICAgICAgICAgICAgICAgICAgICBsZXQgZXJyb3IgPSBuZXcgRXJyb3IoYFNlcnZlciByZXR1cm5lZCBhbiBlcnJvcjogJHt0aGlzLmlucHV0fWApO1xuICAgICAgICAgICAgICAgICAgICBlcnJvci5jb2RlID0gJ1BhcnNlckVycm9yRXhjaGFuZ2UnO1xuICAgICAgICAgICAgICAgICAgICBlcnJvci5wYXJzZXJDb250ZXh0ID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQ6IHRoaXMuaW5wdXQsXG4gICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgcG9zOiB0aGlzLnBvcyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFnOiAnKicsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZDogJ0JBRCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlczogW3sgdHlwZTogJ1RFWFQnLCB2YWx1ZTogdGhpcy5pbnB1dCB9XVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBsZXQgZXJyb3IgPSBuZXcgRXJyb3IoYFVuZXhwZWN0ZWQgY2hhciBhdCBwb3NpdGlvbiAke3RoaXMucG9zICsgZXJyUG9zfSBbRTI6ICR7SlNPTi5zdHJpbmdpZnkoZWxlbWVudC5jaGFyQXQoZXJyUG9zKSl9XWApO1xuICAgICAgICAgICAgICAgIGVycm9yLmNvZGUgPSAnUGFyc2VyRXJyb3IyJztcbiAgICAgICAgICAgICAgICBlcnJvci5wYXJzZXJDb250ZXh0ID0geyBpbnB1dDogdGhpcy5pbnB1dCwgZWxlbWVudCwgcG9zOiB0aGlzLnBvcyB9O1xuICAgICAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbGV0IGVycm9yID0gbmV3IEVycm9yKGBVbmV4cGVjdGVkIGVuZCBvZiBpbnB1dCBhdCBwb3NpdGlvbiAke3RoaXMucG9zfSBbRTNdYCk7XG4gICAgICAgICAgICBlcnJvci5jb2RlID0gJ1BhcnNlckVycm9yMyc7XG4gICAgICAgICAgICBlcnJvci5wYXJzZXJDb250ZXh0ID0geyBpbnB1dDogdGhpcy5pbnB1dCwgcG9zOiB0aGlzLnBvcyB9O1xuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnBvcyArPSBtYXRjaFswXS5sZW5ndGg7XG4gICAgICAgIHRoaXMucmVtYWluZGVyID0gdGhpcy5yZW1haW5kZXIuc3Vic3RyKG1hdGNoWzBdLmxlbmd0aCk7XG5cbiAgICAgICAgcmV0dXJuIGVsZW1lbnQ7XG4gICAgfVxuXG4gICAgYXN5bmMgZ2V0U3BhY2UoKSB7XG4gICAgICAgIGlmICghdGhpcy5yZW1haW5kZXIubGVuZ3RoKSB7XG4gICAgICAgICAgICBpZiAodGhpcy50YWcgPT09ICcrJyAmJiB0aGlzLnBvcyA9PT0gMSkge1xuICAgICAgICAgICAgICAgIC8vIHNwZWNpYWwgY2FzZSwgZW1wdHkgKyByZXNwb25zZVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbGV0IGVycm9yID0gbmV3IEVycm9yKGBVbmV4cGVjdGVkIGVuZCBvZiBpbnB1dCBhdCBwb3NpdGlvbiAke3RoaXMucG9zfSBbRTRdYCk7XG4gICAgICAgICAgICBlcnJvci5jb2RlID0gJ1BhcnNlckVycm9yNCc7XG4gICAgICAgICAgICBlcnJvci5wYXJzZXJDb250ZXh0ID0geyBpbnB1dDogdGhpcy5pbnB1dCwgcG9zOiB0aGlzLnBvcyB9O1xuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaW1hcEZvcm1hbFN5bnRheC52ZXJpZnkodGhpcy5yZW1haW5kZXIuY2hhckF0KDApLCBpbWFwRm9ybWFsU3ludGF4LlNQKCkpID49IDApIHtcbiAgICAgICAgICAgIGxldCBlcnJvciA9IG5ldyBFcnJvcihgVW5leHBlY3RlZCBjaGFyIGF0IHBvc2l0aW9uICR7dGhpcy5wb3N9IFtFNTogJHtKU09OLnN0cmluZ2lmeSh0aGlzLnJlbWFpbmRlci5jaGFyQXQoMCkpfV1gKTtcbiAgICAgICAgICAgIGVycm9yLmNvZGUgPSAnUGFyc2VyRXJyb3I1JztcbiAgICAgICAgICAgIGVycm9yLnBhcnNlckNvbnRleHQgPSB7IGlucHV0OiB0aGlzLmlucHV0LCBlbGVtZW50OiB0aGlzLnJlbWFpbmRlciwgcG9zOiB0aGlzLnBvcyB9O1xuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnBvcysrO1xuICAgICAgICB0aGlzLnJlbWFpbmRlciA9IHRoaXMucmVtYWluZGVyLnN1YnN0cigxKTtcbiAgICB9XG5cbiAgICBhc3luYyBnZXRBdHRyaWJ1dGVzKCkge1xuICAgICAgICBpZiAoIXRoaXMucmVtYWluZGVyLmxlbmd0aCkge1xuICAgICAgICAgICAgbGV0IGVycm9yID0gbmV3IEVycm9yKGBVbmV4cGVjdGVkIGVuZCBvZiBpbnB1dCBhdCBwb3NpdGlvbiAke3RoaXMucG9zfSBbRTZdYCk7XG4gICAgICAgICAgICBlcnJvci5jb2RlID0gJ1BhcnNlckVycm9yNic7XG4gICAgICAgICAgICBlcnJvci5wYXJzZXJDb250ZXh0ID0geyBpbnB1dDogdGhpcy5pbnB1dCwgcG9zOiB0aGlzLnBvcyB9O1xuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5yZW1haW5kZXIubWF0Y2goL15cXHMvKSkge1xuICAgICAgICAgICAgbGV0IGVycm9yID0gbmV3IEVycm9yKGBVbmV4cGVjdGVkIHdoaXRlc3BhY2UgYXQgcG9zaXRpb24gJHt0aGlzLnBvc30gW0U3XWApO1xuICAgICAgICAgICAgZXJyb3IuY29kZSA9ICdQYXJzZXJFcnJvcjcnO1xuICAgICAgICAgICAgZXJyb3IucGFyc2VyQ29udGV4dCA9IHsgaW5wdXQ6IHRoaXMuaW5wdXQsIGVsZW1lbnQ6IHRoaXMucmVtYWluZGVyLCBwb3M6IHRoaXMucG9zIH07XG4gICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHRva2VuUGFyc2VyID0gbmV3IFRva2VuUGFyc2VyKHRoaXMsIHRoaXMucG9zLCB0aGlzLnJlbWFpbmRlciwgdGhpcy5vcHRpb25zKTtcblxuICAgICAgICByZXR1cm4gYXdhaXQgdG9rZW5QYXJzZXIuZ2V0QXR0cmlidXRlcygpO1xuICAgIH1cbn1cblxubW9kdWxlLmV4cG9ydHMuUGFyc2VySW5zdGFuY2UgPSBQYXJzZXJJbnN0YW5jZTtcbiJdLCJuYW1lcyI6W10sImlnbm9yZUxpc3QiOlswXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(action-browser)/./node_modules/imapflow/lib/handler/parser-instance.js\n");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "(action-browser)/./node_modules/imapflow/lib/handler/token-parser.js":
|
|
/*!***********************************************************!*\
|
|
!*** ./node_modules/imapflow/lib/handler/token-parser.js ***!
|
|
\***********************************************************/
|
|
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
|
|
|
|
eval("/* eslint new-cap: 0 */\n\n\n\nconst imapFormalSyntax = __webpack_require__(/*! ./imap-formal-syntax */ \"(action-browser)/./node_modules/imapflow/lib/handler/imap-formal-syntax.js\");\n\nconst STATE_ATOM = 0x001;\nconst STATE_LITERAL = 0x002;\nconst STATE_NORMAL = 0x003;\nconst STATE_PARTIAL = 0x004;\nconst STATE_SEQUENCE = 0x005;\nconst STATE_STRING = 0x006;\nconst STATE_TEXT = 0x007;\n\nconst RE_DIGITS = /^\\d+$/;\nconst RE_SINGLE_DIGIT = /^\\d$/;\n\nclass TokenParser {\n constructor(parent, startPos, str, options) {\n this.str = (str || '').toString();\n this.options = options || {};\n this.parent = parent;\n\n this.tree = this.currentNode = this.createNode();\n this.pos = startPos || 0;\n\n this.currentNode.type = 'TREE';\n\n this.state = STATE_NORMAL;\n }\n\n async getAttributes() {\n await this.processString();\n\n const attributes = [];\n let branch = attributes;\n\n let walk = async node => {\n let curBranch = branch;\n let elm;\n let partial;\n\n if (!node.isClosed && node.type === 'SEQUENCE' && node.value === '*') {\n node.isClosed = true;\n node.type = 'ATOM';\n }\n\n // If the node was never closed, throw it\n if (!node.isClosed) {\n let error = new Error(`Unexpected end of input at position ${this.pos + this.str.length - 1} [E9]`);\n error.code = 'ParserError9';\n error.parserContext = { input: this.str, pos: this.pos + this.str.length - 1 };\n throw error;\n }\n\n let type = (node.type || '').toString().toUpperCase();\n\n switch (type) {\n case 'LITERAL':\n case 'STRING':\n case 'SEQUENCE':\n elm = {\n type: node.type.toUpperCase(),\n value: node.value\n };\n branch.push(elm);\n break;\n\n case 'ATOM':\n if (node.value.toUpperCase() === 'NIL') {\n branch.push(null);\n break;\n }\n elm = {\n type: node.type.toUpperCase(),\n value: node.value\n };\n branch.push(elm);\n break;\n\n case 'SECTION':\n branch = branch[branch.length - 1].section = [];\n break;\n\n case 'LIST':\n elm = [];\n branch.push(elm);\n branch = elm;\n break;\n\n case 'PARTIAL':\n partial = node.value.split('.').map(Number);\n branch[branch.length - 1].partial = partial;\n break;\n }\n\n for (let childNode of node.childNodes) {\n await walk(childNode);\n }\n\n branch = curBranch;\n };\n\n await walk(this.tree);\n\n return attributes;\n }\n\n createNode(parentNode, startPos) {\n let node = {\n childNodes: [],\n type: false,\n value: '',\n isClosed: true\n };\n\n if (parentNode) {\n node.parentNode = parentNode;\n }\n\n if (typeof startPos === 'number') {\n node.startPos = startPos;\n }\n\n if (parentNode) {\n parentNode.childNodes.push(node);\n }\n\n return node;\n }\n\n async processString() {\n let chr, i, len;\n\n const checkSP = () => {\n // jump to the next non whitespace pos\n while (this.str.charAt(i + 1) === ' ') {\n i++;\n }\n };\n\n for (i = 0, len = this.str.length; i < len; i++) {\n chr = this.str.charAt(i);\n\n switch (this.state) {\n case STATE_NORMAL:\n switch (chr) {\n // DQUOTE starts a new string\n case '\"':\n this.currentNode = this.createNode(this.currentNode, this.pos + i);\n this.currentNode.type = 'string';\n this.state = STATE_STRING;\n this.currentNode.isClosed = false;\n break;\n\n // ( starts a new list\n case '(':\n this.currentNode = this.createNode(this.currentNode, this.pos + i);\n this.currentNode.type = 'LIST';\n this.currentNode.isClosed = false;\n break;\n\n // ) closes a list\n case ')':\n if (this.currentNode.type !== 'LIST') {\n let error = new Error(`Unexpected list terminator ) at position ${this.pos + i} [E10]`);\n error.code = 'ParserError10';\n error.parserContext = { input: this.str, pos: this.pos + i, chr };\n throw error;\n }\n\n this.currentNode.isClosed = true;\n this.currentNode.endPos = this.pos + i;\n this.currentNode = this.currentNode.parentNode;\n\n checkSP();\n break;\n\n // ] closes section group\n case ']':\n if (this.currentNode.type !== 'SECTION') {\n let error = new Error(`Unexpected section terminator ] at position ${this.pos + i} [E11]`);\n error.code = 'ParserError11';\n error.parserContext = { input: this.str, pos: this.pos + i, chr };\n throw error;\n }\n this.currentNode.isClosed = true;\n this.currentNode.endPos = this.pos + i;\n this.currentNode = this.currentNode.parentNode;\n\n checkSP();\n break;\n\n // < starts a new partial\n case '<':\n if (this.str.charAt(i - 1) !== ']') {\n this.currentNode = this.createNode(this.currentNode, this.pos + i);\n this.currentNode.type = 'ATOM';\n this.currentNode.value = chr;\n this.state = STATE_ATOM;\n } else {\n this.currentNode = this.createNode(this.currentNode, this.pos + i);\n this.currentNode.type = 'PARTIAL';\n this.state = STATE_PARTIAL;\n this.currentNode.isClosed = false;\n }\n break;\n\n // binary literal8\n case '~': {\n let nextChr = this.str.charAt(i + 1);\n if (nextChr !== '{') {\n if (imapFormalSyntax['ATOM-CHAR']().indexOf(nextChr) >= 0) {\n // treat as ATOM\n this.currentNode = this.createNode(this.currentNode, this.pos + i);\n this.currentNode.type = 'ATOM';\n this.currentNode.value = chr;\n this.state = STATE_ATOM;\n break;\n }\n\n let error = new Error(`Unexpected literal8 marker at position ${this.pos + i} [E12]`);\n error.code = 'ParserError12';\n error.parserContext = { input: this.str, pos: this.pos + i, chr };\n throw error;\n }\n this.expectedLiteralType = 'literal8';\n break;\n }\n\n // { starts a new literal\n case '{':\n this.currentNode = this.createNode(this.currentNode, this.pos + i);\n this.currentNode.type = 'LITERAL';\n this.currentNode.literalType = this.expectedLiteralType || 'literal';\n this.expectedLiteralType = false;\n this.state = STATE_LITERAL;\n this.currentNode.isClosed = false;\n break;\n\n // * starts a new sequence\n case '*':\n this.currentNode = this.createNode(this.currentNode, this.pos + i);\n this.currentNode.type = 'SEQUENCE';\n this.currentNode.value = chr;\n this.currentNode.isClosed = false;\n this.state = STATE_SEQUENCE;\n break;\n\n // normally a space should never occur\n case ' ':\n // just ignore\n break;\n\n // [ starts section\n case '[':\n // If it is the *first* element after response command, then process as a response argument list\n if (['OK', 'NO', 'BAD', 'BYE', 'PREAUTH'].includes(this.parent.command.toUpperCase()) && this.currentNode === this.tree) {\n this.currentNode.endPos = this.pos + i;\n\n this.currentNode = this.createNode(this.currentNode, this.pos + i);\n this.currentNode.type = 'ATOM';\n\n this.currentNode = this.createNode(this.currentNode, this.pos + i);\n this.currentNode.type = 'SECTION';\n this.currentNode.isClosed = false;\n this.state = STATE_NORMAL;\n\n // RFC2221 defines a response code REFERRAL whose payload is an\n // RFC2192/RFC5092 imapurl that we will try to parse as an ATOM but\n // fail quite badly at parsing. Since the imapurl is such a unique\n // (and crazy) term, we just specialize that case here.\n if (this.str.substr(i + 1, 9).toUpperCase() === 'REFERRAL ') {\n // create the REFERRAL atom\n this.currentNode = this.createNode(this.currentNode, this.pos + i + 1);\n this.currentNode.type = 'ATOM';\n this.currentNode.endPos = this.pos + i + 8;\n this.currentNode.value = 'REFERRAL';\n this.currentNode = this.currentNode.parentNode;\n\n // eat all the way through the ] to be the IMAPURL token.\n this.currentNode = this.createNode(this.currentNode, this.pos + i + 10);\n // just call this an ATOM, even though IMAPURL might be more correct\n this.currentNode.type = 'ATOM';\n // jump i to the ']'\n i = this.str.indexOf(']', i + 10);\n this.currentNode.endPos = this.pos + i - 1;\n this.currentNode.value = this.str.substring(this.currentNode.startPos - this.pos, this.currentNode.endPos - this.pos + 1);\n this.currentNode = this.currentNode.parentNode;\n\n // close out the SECTION\n this.currentNode.isClosed = true;\n this.currentNode = this.currentNode.parentNode;\n\n checkSP();\n }\n\n break;\n }\n\n /* falls through */\n default:\n // Any ATOM supported char starts a new Atom sequence, otherwise throw an error\n // Allow \\ as the first char for atom to support system flags\n // Allow % to support LIST '' %\n // Allow 8bit characters (presumably unicode)\n if (imapFormalSyntax['ATOM-CHAR']().indexOf(chr) < 0 && chr !== '\\\\' && chr !== '%' && chr.charCodeAt(0) < 0x80) {\n let error = new Error(`Unexpected char at position ${this.pos + i} [E13: ${JSON.stringify(chr)}]`);\n error.code = 'ParserError13';\n error.parserContext = { input: this.str, pos: this.pos + i, chr };\n throw error;\n }\n\n this.currentNode = this.createNode(this.currentNode, this.pos + i);\n this.currentNode.type = 'ATOM';\n this.currentNode.value = chr;\n this.state = STATE_ATOM;\n break;\n }\n break;\n\n case STATE_ATOM:\n // space finishes an atom\n if (chr === ' ') {\n this.currentNode.endPos = this.pos + i - 1;\n this.currentNode = this.currentNode.parentNode;\n this.state = STATE_NORMAL;\n break;\n }\n\n //\n if (\n this.currentNode.parentNode &&\n ((chr === ')' && this.currentNode.parentNode.type === 'LIST') || (chr === ']' && this.currentNode.parentNode.type === 'SECTION'))\n ) {\n this.currentNode.endPos = this.pos + i - 1;\n this.currentNode = this.currentNode.parentNode;\n\n this.currentNode.isClosed = true;\n this.currentNode.endPos = this.pos + i;\n this.currentNode = this.currentNode.parentNode;\n this.state = STATE_NORMAL;\n checkSP();\n\n break;\n }\n\n if ((chr === ',' || chr === ':') && RE_DIGITS.test(this.currentNode.value)) {\n this.currentNode.type = 'SEQUENCE';\n this.currentNode.isClosed = true;\n this.state = STATE_SEQUENCE;\n }\n\n // [ starts a section group for this element\n if (chr === '[') {\n // allowed only for selected elements\n if (['BODY', 'BODY.PEEK', 'BINARY', 'BINARY.PEEK'].indexOf(this.currentNode.value.toUpperCase()) < 0) {\n if (/[./]/.test(this.currentNode.value)) {\n // could be a path\n this.currentNode.value += chr;\n break;\n } else {\n let error = new Error(`Unexpected section start char [ at position ${this.pos + i} [E14]`);\n error.code = 'ParserError14';\n error.parserContext = { input: this.str, pos: this.pos + i, chr };\n throw error;\n }\n }\n this.currentNode.endPos = this.pos + i;\n this.currentNode = this.createNode(this.currentNode.parentNode, this.pos + i);\n this.currentNode.type = 'SECTION';\n this.currentNode.isClosed = false;\n this.state = STATE_NORMAL;\n break;\n }\n\n if (chr === '<') {\n let error = new Error(`Unexpected start of partial at position ${this.pos + i} [E15]`);\n error.code = 'ParserError15';\n error.parserContext = { input: this.str, pos: this.pos + i, chr };\n throw error;\n }\n\n // if the char is not ATOM compatible, throw. Allow \\* as an exception\n if (\n imapFormalSyntax['ATOM-CHAR']().indexOf(chr) < 0 &&\n chr.charCodeAt(0) < 0x80 && // allow 8bit (presumably unicode) bytes\n chr !== ']' &&\n !(chr === '*' && this.currentNode.value === '\\\\') &&\n (!this.parent || !this.parent.command || !['NO', 'BAD', 'OK'].includes(this.parent.command))\n ) {\n let error = new Error(`Unexpected char at position ${this.pos + i} [E16: ${JSON.stringify(chr)}]`);\n error.code = 'ParserError16';\n error.parserContext = { input: this.str, pos: this.pos + i, chr };\n throw error;\n } else if (this.currentNode.value === '\\\\*') {\n let error = new Error(`Unexpected char at position ${this.pos + i} [E17: ${JSON.stringify(chr)}]`);\n error.code = 'ParserError17';\n error.parserContext = { input: this.str, pos: this.pos + i, chr };\n throw error;\n }\n\n this.currentNode.value += chr;\n break;\n\n case STATE_STRING:\n // DQUOTE ends the string sequence\n if (chr === '\"') {\n this.currentNode.endPos = this.pos + i;\n this.currentNode.isClosed = true;\n this.currentNode = this.currentNode.parentNode;\n this.state = STATE_NORMAL;\n\n checkSP();\n break;\n }\n\n // \\ Escapes the following char\n if (chr === '\\\\') {\n i++;\n if (i >= len) {\n let error = new Error(`Unexpected end of input at position ${this.pos + i} [E18]`);\n error.code = 'ParserError18';\n error.parserContext = { input: this.str, pos: this.pos + i };\n throw error;\n }\n chr = this.str.charAt(i);\n }\n\n this.currentNode.value += chr;\n break;\n\n case STATE_PARTIAL:\n if (chr === '>') {\n if (this.currentNode.value.at(-1) === '.') {\n let error = new Error(`Unexpected end of partial at position ${this.pos + i} [E19]`);\n error.code = 'ParserError19';\n error.parserContext = { input: this.str, pos: this.pos + i, chr };\n throw error;\n }\n this.currentNode.endPos = this.pos + i;\n this.currentNode.isClosed = true;\n this.currentNode = this.currentNode.parentNode;\n this.state = STATE_NORMAL;\n checkSP();\n break;\n }\n\n if (chr === '.' && (!this.currentNode.value.length || this.currentNode.value.match(/\\./))) {\n let error = new Error(`Unexpected partial separator . at position ${this.pos + i} [E20]`);\n error.code = 'ParserError20';\n error.parserContext = { input: this.str, pos: this.pos + i, chr };\n throw error;\n }\n\n if (imapFormalSyntax.DIGIT().indexOf(chr) < 0 && chr !== '.') {\n let error = new Error(`Unexpected char at position ${this.pos + i} [E21: ${JSON.stringify(chr)}]`);\n error.code = 'ParserError21';\n error.parserContext = { input: this.str, pos: this.pos + i, chr };\n throw error;\n }\n\n if (this.currentNode.value.match(/^0$|\\.0$/) && chr !== '.') {\n let error = new Error(`Invalid partial at position ${this.pos + i} [E22: ${JSON.stringify(chr)}]`);\n error.code = 'ParserError22';\n error.parserContext = { input: this.str, pos: this.pos + i, chr };\n throw error;\n }\n\n this.currentNode.value += chr;\n break;\n\n case STATE_LITERAL:\n if (this.currentNode.started) {\n // only relevant if literals are not already parsed out from input\n\n // Disabled NULL byte check\n // See https://github.com/emailjs/emailjs-imap-handler/commit/f11b2822bedabe492236e8263afc630134a3c41c\n /*\n if (chr === '\\u0000') {\n throw new Error('Unexpected \\\\x00 at position ' + (this.pos + i));\n }\n */\n\n this.currentNode.chBuffer[this.currentNode.chPos++] = chr.charCodeAt(0);\n\n if (this.currentNode.chPos >= this.currentNode.literalLength) {\n this.currentNode.endPos = this.pos + i;\n this.currentNode.isClosed = true;\n this.currentNode.value = this.currentNode.chBuffer.toString('binary');\n this.currentNode.chBuffer = Buffer.alloc(0);\n this.currentNode = this.currentNode.parentNode;\n this.state = STATE_NORMAL;\n checkSP();\n }\n break;\n }\n\n if (chr === '+' && this.options.literalPlus) {\n this.currentNode.literalPlus = true;\n break;\n }\n\n if (chr === '}') {\n if (!('literalLength' in this.currentNode)) {\n let error = new Error(`Unexpected literal prefix end char } at position ${this.pos + i} [E23]`);\n error.code = 'ParserError23';\n error.parserContext = { input: this.str, pos: this.pos + i, chr };\n throw error;\n }\n if (this.str.charAt(i + 1) === '\\n') {\n i++;\n } else if (this.str.charAt(i + 1) === '\\r' && this.str.charAt(i + 2) === '\\n') {\n i += 2;\n } else {\n let error = new Error(`Unexpected char at position ${this.pos + i} [E24: ${JSON.stringify(chr)}]`);\n error.code = 'ParserError24';\n error.parserContext = { input: this.str, pos: this.pos + i, chr };\n throw error;\n }\n\n this.currentNode.literalLength = Number(this.currentNode.literalLength);\n\n if (!this.currentNode.literalLength) {\n // special case where literal content length is 0\n // close the node right away, do not wait for additional input\n this.currentNode.endPos = this.pos + i;\n this.currentNode.isClosed = true;\n this.currentNode = this.currentNode.parentNode;\n this.state = STATE_NORMAL;\n checkSP();\n } else if (this.options.literals) {\n // use the next precached literal values\n this.currentNode.value = this.options.literals.shift();\n\n // only APPEND arguments are kept as Buffers\n /*\n if ((this.parent.command || '').toString().toUpperCase() !== 'APPEND') {\n this.currentNode.value = this.currentNode.value.toString('binary');\n }\n */\n\n this.currentNode.endPos = this.pos + i + this.currentNode.value.length;\n\n this.currentNode.started = false;\n this.currentNode.isClosed = true;\n this.currentNode = this.currentNode.parentNode;\n this.state = STATE_NORMAL;\n checkSP();\n } else {\n this.currentNode.started = true;\n // Allocate expected size buffer. Max size check is already performed\n // Maybe should use allocUnsafe instead?\n this.currentNode.chBuffer = Buffer.alloc(this.currentNode.literalLength);\n this.currentNode.chPos = 0;\n }\n break;\n }\n if (imapFormalSyntax.DIGIT().indexOf(chr) < 0) {\n let error = new Error(`Unexpected char at position ${this.pos + i} [E25: ${JSON.stringify(chr)}]`);\n error.code = 'ParserError25';\n error.parserContext = { input: this.str, pos: this.pos + i, chr };\n throw error;\n }\n if (this.currentNode.literalLength === '0') {\n let error = new Error(`Invalid literal at position ${this.pos + i} [E26]`);\n error.code = 'ParserError26';\n error.parserContext = { input: this.str, pos: this.pos + i, chr };\n throw error;\n }\n this.currentNode.literalLength = (this.currentNode.literalLength || '') + chr;\n break;\n\n case STATE_SEQUENCE:\n // space finishes the sequence set\n if (chr === ' ') {\n if (!RE_SINGLE_DIGIT.test(this.currentNode.value.at(-1)) && this.currentNode.value.at(-1) !== '*') {\n let error = new Error(`Unexpected whitespace at position ${this.pos + i} [E27]`);\n error.code = 'ParserError27';\n error.parserContext = { input: this.str, pos: this.pos + i, chr };\n throw error;\n }\n\n if (this.currentNode.value !== '*' && this.currentNode.value.at(-1) === '*' && this.currentNode.value.at(-2) !== ':') {\n let error = new Error(`Unexpected whitespace at position ${this.pos + i} [E28]`);\n error.code = 'ParserError28';\n error.parserContext = { input: this.str, pos: this.pos + i, chr };\n throw error;\n }\n\n this.currentNode.isClosed = true;\n this.currentNode.endPos = this.pos + i - 1;\n this.currentNode = this.currentNode.parentNode;\n this.state = STATE_NORMAL;\n break;\n } else if (this.currentNode.parentNode && chr === ']' && this.currentNode.parentNode.type === 'SECTION') {\n this.currentNode.endPos = this.pos + i - 1;\n this.currentNode = this.currentNode.parentNode;\n\n this.currentNode.isClosed = true;\n this.currentNode.endPos = this.pos + i;\n this.currentNode = this.currentNode.parentNode;\n this.state = STATE_NORMAL;\n\n checkSP();\n break;\n }\n\n if (chr === ':') {\n if (!RE_SINGLE_DIGIT.test(this.currentNode.value.at(-1)) && this.currentNode.value.at(-1) !== '*') {\n let error = new Error(`Unexpected range separator : at position ${this.pos + i} [E29]`);\n error.code = 'ParserError29';\n error.parserContext = { input: this.str, pos: this.pos + i, chr };\n throw error;\n }\n } else if (chr === '*') {\n if ([',', ':'].indexOf(this.currentNode.value.at(-1)) < 0) {\n let error = new Error(`Unexpected range wildcard at position ${this.pos + i} [E30]`);\n error.code = 'ParserError30';\n error.parserContext = { input: this.str, pos: this.pos + i, chr };\n throw error;\n }\n } else if (chr === ',') {\n if (!RE_SINGLE_DIGIT.test(this.currentNode.value.at(-1)) && this.currentNode.value.at(-1) !== '*') {\n let error = new Error(`Unexpected sequence separator , at position ${this.pos + i} [E31]`);\n error.code = 'ParserError31';\n error.parserContext = { input: this.str, pos: this.pos + i, chr };\n throw error;\n }\n if (this.currentNode.value.at(-1) === '*' && this.currentNode.value.at(-2) !== ':') {\n let error = new Error(`Unexpected sequence separator , at position ${this.pos + i} [E32]`);\n error.code = 'ParserError32';\n error.parserContext = { input: this.str, pos: this.pos + i, chr };\n throw error;\n }\n } else if (!RE_SINGLE_DIGIT.test(chr)) {\n let error = new Error(`Unexpected char at position ${this.pos + i} [E33: ${JSON.stringify(chr)}]`);\n error.code = 'ParserError33';\n error.parserContext = { input: this.str, pos: this.pos + i, chr };\n throw error;\n }\n\n if (RE_SINGLE_DIGIT.test(chr) && this.currentNode.value.at(-1) === '*') {\n let error = new Error(`Unexpected number at position ${this.pos + i} [E34: ${JSON.stringify(chr)}]`);\n error.code = 'ParserError34';\n error.parserContext = { input: this.str, pos: this.pos + i, chr };\n throw error;\n }\n\n this.currentNode.value += chr;\n break;\n\n case STATE_TEXT:\n this.currentNode.value += chr;\n break;\n }\n }\n }\n}\n\nmodule.exports.TokenParser = TokenParser;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFjdGlvbi1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9pbWFwZmxvdy9saWIvaGFuZGxlci90b2tlbi1wYXJzZXIuanMiLCJtYXBwaW5ncyI6IkFBQUE7O0FBRWE7O0FBRWIseUJBQXlCLG1CQUFPLENBQUMsd0dBQXNCOztBQUV2RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsNkVBQTZFLGdDQUFnQztBQUM3RztBQUNBLHdDQUF3QztBQUN4QztBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsMkNBQTJDLFNBQVM7QUFDcEQ7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGtHQUFrRyxjQUFjO0FBQ2hIO0FBQ0Esd0RBQXdEO0FBQ3hEO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EscUdBQXFHLGNBQWM7QUFDbkg7QUFDQSx3REFBd0Q7QUFDeEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOEJBQThCO0FBQzlCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSw4Q0FBOEM7QUFDOUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxnR0FBZ0csY0FBYztBQUM5RztBQUNBLHdEQUF3RDtBQUN4RDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLDZCQUE2QjtBQUM3QiwrQkFBK0I7QUFDL0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFGQUFxRixjQUFjLFFBQVEsb0JBQW9CO0FBQy9IO0FBQ0Esd0RBQXdEO0FBQ3hEO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOEJBQThCO0FBQzlCLHFHQUFxRyxjQUFjO0FBQ25IO0FBQ0Esd0RBQXdEO0FBQ3hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EseUZBQXlGLGNBQWM7QUFDdkc7QUFDQSxnREFBZ0Q7QUFDaEQ7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkVBQTZFLGNBQWMsUUFBUSxvQkFBb0I7QUFDdkg7QUFDQSxnREFBZ0Q7QUFDaEQ7QUFDQSxzQkFBc0I7QUFDdEIsNkVBQTZFLGNBQWMsUUFBUSxvQkFBb0I7QUFDdkg7QUFDQSxnREFBZ0Q7QUFDaEQ7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlGQUF5RixjQUFjO0FBQ3ZHO0FBQ0Esb0RBQW9EO0FBQ3BEO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsMkZBQTJGLGNBQWM7QUFDekc7QUFDQSxvREFBb0Q7QUFDcEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsNEZBQTRGLGNBQWM7QUFDMUc7QUFDQSxnREFBZ0Q7QUFDaEQ7QUFDQTs7QUFFQTtBQUNBLDZFQUE2RSxjQUFjLFFBQVEsb0JBQW9CO0FBQ3ZIO0FBQ0EsZ0RBQWdEO0FBQ2hEO0FBQ0E7O0FBRUE7QUFDQSw2RUFBNkUsY0FBYyxRQUFRLG9CQUFvQjtBQUN2SDtBQUNBLGdEQUFnRDtBQUNoRDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsa0NBQWtDO0FBQ2xDO0FBQ0Esd0ZBQXdGLGNBQWMsY0FBYztBQUNwSDtBQUNBLG9EQUFvRDtBQUNwRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBCQUEwQjtBQUMxQjtBQUNBLDBCQUEwQjtBQUMxQixpRkFBaUYsY0FBYyxRQUFRLG9CQUFvQjtBQUMzSDtBQUNBLG9EQUFvRDtBQUNwRDtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQkFBMEI7QUFDMUI7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBCQUEwQjtBQUMxQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2RUFBNkUsY0FBYyxRQUFRLG9CQUFvQjtBQUN2SDtBQUNBLGdEQUFnRDtBQUNoRDtBQUNBO0FBQ0E7QUFDQSw2RUFBNkUsY0FBYztBQUMzRjtBQUNBLGdEQUFnRDtBQUNoRDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVGQUF1RixjQUFjO0FBQ3JHO0FBQ0Esb0RBQW9EO0FBQ3BEO0FBQ0E7O0FBRUE7QUFDQSx1RkFBdUYsY0FBYztBQUNyRztBQUNBLG9EQUFvRDtBQUNwRDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0I7QUFDdEI7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLDhGQUE4RixjQUFjO0FBQzVHO0FBQ0Esb0RBQW9EO0FBQ3BEO0FBQ0E7QUFDQSxzQkFBc0I7QUFDdEI7QUFDQSwyRkFBMkYsY0FBYztBQUN6RztBQUNBLG9EQUFvRDtBQUNwRDtBQUNBO0FBQ0Esc0JBQXNCO0FBQ3RCO0FBQ0EsaUdBQWlHLGNBQWM7QUFDL0c7QUFDQSxvREFBb0Q7QUFDcEQ7QUFDQTtBQUNBO0FBQ0EsaUdBQWlHLGNBQWM7QUFDL0c7QUFDQSxvREFBb0Q7QUFDcEQ7QUFDQTtBQUNBLHNCQUFzQjtBQUN0Qiw2RUFBNkUsY0FBYyxRQUFRLG9CQUFvQjtBQUN2SDtBQUNBLGdEQUFnRDtBQUNoRDtBQUNBOztBQUVBO0FBQ0EsK0VBQStFLGNBQWMsUUFBUSxvQkFBb0I7QUFDekg7QUFDQSxnREFBZ0Q7QUFDaEQ7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLDBCQUEwQiIsInNvdXJjZXMiOlsiL2hvbWUvYWxtYS9uZXh0Z2VuL05lYWgtbWFpbC9ub2RlX21vZHVsZXMvaW1hcGZsb3cvbGliL2hhbmRsZXIvdG9rZW4tcGFyc2VyLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludCBuZXctY2FwOiAwICovXG5cbid1c2Ugc3RyaWN0JztcblxuY29uc3QgaW1hcEZvcm1hbFN5bnRheCA9IHJlcXVpcmUoJy4vaW1hcC1mb3JtYWwtc3ludGF4Jyk7XG5cbmNvbnN0IFNUQVRFX0FUT00gPSAweDAwMTtcbmNvbnN0IFNUQVRFX0xJVEVSQUwgPSAweDAwMjtcbmNvbnN0IFNUQVRFX05PUk1BTCA9IDB4MDAzO1xuY29uc3QgU1RBVEVfUEFSVElBTCA9IDB4MDA0O1xuY29uc3QgU1RBVEVfU0VRVUVOQ0UgPSAweDAwNTtcbmNvbnN0IFNUQVRFX1NUUklORyA9IDB4MDA2O1xuY29uc3QgU1RBVEVfVEVYVCA9IDB4MDA3O1xuXG5jb25zdCBSRV9ESUdJVFMgPSAvXlxcZCskLztcbmNvbnN0IFJFX1NJTkdMRV9ESUdJVCA9IC9eXFxkJC87XG5cbmNsYXNzIFRva2VuUGFyc2VyIHtcbiAgICBjb25zdHJ1Y3RvcihwYXJlbnQsIHN0YXJ0UG9zLCBzdHIsIG9wdGlvbnMpIHtcbiAgICAgICAgdGhpcy5zdHIgPSAoc3RyIHx8ICcnKS50b1N0cmluZygpO1xuICAgICAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICAgICAgICB0aGlzLnBhcmVudCA9IHBhcmVudDtcblxuICAgICAgICB0aGlzLnRyZWUgPSB0aGlzLmN1cnJlbnROb2RlID0gdGhpcy5jcmVhdGVOb2RlKCk7XG4gICAgICAgIHRoaXMucG9zID0gc3RhcnRQb3MgfHwgMDtcblxuICAgICAgICB0aGlzLmN1cnJlbnROb2RlLnR5cGUgPSAnVFJFRSc7XG5cbiAgICAgICAgdGhpcy5zdGF0ZSA9IFNUQVRFX05PUk1BTDtcbiAgICB9XG5cbiAgICBhc3luYyBnZXRBdHRyaWJ1dGVzKCkge1xuICAgICAgICBhd2FpdCB0aGlzLnByb2Nlc3NTdHJpbmcoKTtcblxuICAgICAgICBjb25zdCBhdHRyaWJ1dGVzID0gW107XG4gICAgICAgIGxldCBicmFuY2ggPSBhdHRyaWJ1dGVzO1xuXG4gICAgICAgIGxldCB3YWxrID0gYXN5bmMgbm9kZSA9PiB7XG4gICAgICAgICAgICBsZXQgY3VyQnJhbmNoID0gYnJhbmNoO1xuICAgICAgICAgICAgbGV0IGVsbTtcbiAgICAgICAgICAgIGxldCBwYXJ0aWFsO1xuXG4gICAgICAgICAgICBpZiAoIW5vZGUuaXNDbG9zZWQgJiYgbm9kZS50eXBlID09PSAnU0VRVUVOQ0UnICYmIG5vZGUudmFsdWUgPT09ICcqJykge1xuICAgICAgICAgICAgICAgIG5vZGUuaXNDbG9zZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIG5vZGUudHlwZSA9ICdBVE9NJztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gSWYgdGhlIG5vZGUgd2FzIG5ldmVyIGNsb3NlZCwgdGhyb3cgaXRcbiAgICAgICAgICAgIGlmICghbm9kZS5pc0Nsb3NlZCkge1xuICAgICAgICAgICAgICAgIGxldCBlcnJvciA9IG5ldyBFcnJvcihgVW5leHBlY3RlZCBlbmQgb2YgaW5wdXQgYXQgcG9zaXRpb24gJHt0aGlzLnBvcyArIHRoaXMuc3RyLmxlbmd0aCAtIDF9IFtFOV1gKTtcbiAgICAgICAgICAgICAgICBlcnJvci5jb2RlID0gJ1BhcnNlckVycm9yOSc7XG4gICAgICAgICAgICAgICAgZXJyb3IucGFyc2VyQ29udGV4dCA9IHsgaW5wdXQ6IHRoaXMuc3RyLCBwb3M6IHRoaXMucG9zICsgdGhpcy5zdHIubGVuZ3RoIC0gMSB9O1xuICAgICAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsZXQgdHlwZSA9IChub2RlLnR5cGUgfHwgJycpLnRvU3RyaW5nKCkudG9VcHBlckNhc2UoKTtcblxuICAgICAgICAgICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAnTElURVJBTCc6XG4gICAgICAgICAgICAgICAgY2FzZSAnU1RSSU5HJzpcbiAgICAgICAgICAgICAgICBjYXNlICdTRVFVRU5DRSc6XG4gICAgICAgICAgICAgICAgICAgIGVsbSA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IG5vZGUudHlwZS50b1VwcGVyQ2FzZSgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IG5vZGUudmFsdWVcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgYnJhbmNoLnB1c2goZWxtKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgICBjYXNlICdBVE9NJzpcbiAgICAgICAgICAgICAgICAgICAgaWYgKG5vZGUudmFsdWUudG9VcHBlckNhc2UoKSA9PT0gJ05JTCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyYW5jaC5wdXNoKG51bGwpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxtID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogbm9kZS50eXBlLnRvVXBwZXJDYXNlKCksXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogbm9kZS52YWx1ZVxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICBicmFuY2gucHVzaChlbG0pO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgIGNhc2UgJ1NFQ1RJT04nOlxuICAgICAgICAgICAgICAgICAgICBicmFuY2ggPSBicmFuY2hbYnJhbmNoLmxlbmd0aCAtIDFdLnNlY3Rpb24gPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgICBjYXNlICdMSVNUJzpcbiAgICAgICAgICAgICAgICAgICAgZWxtID0gW107XG4gICAgICAgICAgICAgICAgICAgIGJyYW5jaC5wdXNoKGVsbSk7XG4gICAgICAgICAgICAgICAgICAgIGJyYW5jaCA9IGVsbTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgICBjYXNlICdQQVJUSUFMJzpcbiAgICAgICAgICAgICAgICAgICAgcGFydGlhbCA9IG5vZGUudmFsdWUuc3BsaXQoJy4nKS5tYXAoTnVtYmVyKTtcbiAgICAgICAgICAgICAgICAgICAgYnJhbmNoW2JyYW5jaC5sZW5ndGggLSAxXS5wYXJ0aWFsID0gcGFydGlhbDtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZvciAobGV0IGNoaWxkTm9kZSBvZiBub2RlLmNoaWxkTm9kZXMpIHtcbiAgICAgICAgICAgICAgICBhd2FpdCB3YWxrKGNoaWxkTm9kZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGJyYW5jaCA9IGN1ckJyYW5jaDtcbiAgICAgICAgfTtcblxuICAgICAgICBhd2FpdCB3YWxrKHRoaXMudHJlZSk7XG5cbiAgICAgICAgcmV0dXJuIGF0dHJpYnV0ZXM7XG4gICAgfVxuXG4gICAgY3JlYXRlTm9kZShwYXJlbnROb2RlLCBzdGFydFBvcykge1xuICAgICAgICBsZXQgbm9kZSA9IHtcbiAgICAgICAgICAgIGNoaWxkTm9kZXM6IFtdLFxuICAgICAgICAgICAgdHlwZTogZmFsc2UsXG4gICAgICAgICAgICB2YWx1ZTogJycsXG4gICAgICAgICAgICBpc0Nsb3NlZDogdHJ1ZVxuICAgICAgICB9O1xuXG4gICAgICAgIGlmIChwYXJlbnROb2RlKSB7XG4gICAgICAgICAgICBub2RlLnBhcmVudE5vZGUgPSBwYXJlbnROb2RlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHR5cGVvZiBzdGFydFBvcyA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgIG5vZGUuc3RhcnRQb3MgPSBzdGFydFBvcztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwYXJlbnROb2RlKSB7XG4gICAgICAgICAgICBwYXJlbnROb2RlLmNoaWxkTm9kZXMucHVzaChub2RlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBub2RlO1xuICAgIH1cblxuICAgIGFzeW5jIHByb2Nlc3NTdHJpbmcoKSB7XG4gICAgICAgIGxldCBjaHIsIGksIGxlbjtcblxuICAgICAgICBjb25zdCBjaGVja1NQID0gKCkgPT4ge1xuICAgICAgICAgICAgLy8ganVtcCB0byB0aGUgbmV4dCBub24gd2hpdGVzcGFjZSBwb3NcbiAgICAgICAgICAgIHdoaWxlICh0aGlzLnN0ci5jaGFyQXQoaSArIDEpID09PSAnICcpIHtcbiAgICAgICAgICAgICAgICBpKys7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgZm9yIChpID0gMCwgbGVuID0gdGhpcy5zdHIubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICAgIGNociA9IHRoaXMuc3RyLmNoYXJBdChpKTtcblxuICAgICAgICAgICAgc3dpdGNoICh0aGlzLnN0YXRlKSB7XG4gICAgICAgICAgICAgICAgY2FzZSBTVEFURV9OT1JNQUw6XG4gICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoY2hyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBEUVVPVEUgc3RhcnRzIGEgbmV3IHN0cmluZ1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnXCInOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudE5vZGUgPSB0aGlzLmNyZWF0ZU5vZGUodGhpcy5jdXJyZW50Tm9kZSwgdGhpcy5wb3MgKyBpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnROb2RlLnR5cGUgPSAnc3RyaW5nJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnN0YXRlID0gU1RBVEVfU1RSSU5HO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudE5vZGUuaXNDbG9zZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gKCBzdGFydHMgYSBuZXcgbGlzdFxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnKCc6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50Tm9kZSA9IHRoaXMuY3JlYXRlTm9kZSh0aGlzLmN1cnJlbnROb2RlLCB0aGlzLnBvcyArIGkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudE5vZGUudHlwZSA9ICdMSVNUJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnROb2RlLmlzQ2xvc2VkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICkgY2xvc2VzIGEgbGlzdFxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnKSc6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuY3VycmVudE5vZGUudHlwZSAhPT0gJ0xJU1QnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBlcnJvciA9IG5ldyBFcnJvcihgVW5leHBlY3RlZCBsaXN0IHRlcm1pbmF0b3IgKSBhdCBwb3NpdGlvbiAke3RoaXMucG9zICsgaX0gW0UxMF1gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IuY29kZSA9ICdQYXJzZXJFcnJvcjEwJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IucGFyc2VyQ29udGV4dCA9IHsgaW5wdXQ6IHRoaXMuc3RyLCBwb3M6IHRoaXMucG9zICsgaSwgY2hyIH07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudE5vZGUuaXNDbG9zZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudE5vZGUuZW5kUG9zID0gdGhpcy5wb3MgKyBpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudE5vZGUgPSB0aGlzLmN1cnJlbnROb2RlLnBhcmVudE5vZGU7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja1NQKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIF0gY2xvc2VzIHNlY3Rpb24gZ3JvdXBcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ10nOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmN1cnJlbnROb2RlLnR5cGUgIT09ICdTRUNUSU9OJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZXJyb3IgPSBuZXcgRXJyb3IoYFVuZXhwZWN0ZWQgc2VjdGlvbiB0ZXJtaW5hdG9yIF0gYXQgcG9zaXRpb24gJHt0aGlzLnBvcyArIGl9IFtFMTFdYCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yLmNvZGUgPSAnUGFyc2VyRXJyb3IxMSc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yLnBhcnNlckNvbnRleHQgPSB7IGlucHV0OiB0aGlzLnN0ciwgcG9zOiB0aGlzLnBvcyArIGksIGNociB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50Tm9kZS5pc0Nsb3NlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50Tm9kZS5lbmRQb3MgPSB0aGlzLnBvcyArIGk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50Tm9kZSA9IHRoaXMuY3VycmVudE5vZGUucGFyZW50Tm9kZTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrU1AoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gPCBzdGFydHMgYSBuZXcgcGFydGlhbFxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnPCc6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuc3RyLmNoYXJBdChpIC0gMSkgIT09ICddJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnROb2RlID0gdGhpcy5jcmVhdGVOb2RlKHRoaXMuY3VycmVudE5vZGUsIHRoaXMucG9zICsgaSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudE5vZGUudHlwZSA9ICdBVE9NJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50Tm9kZS52YWx1ZSA9IGNocjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IFNUQVRFX0FUT007XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50Tm9kZSA9IHRoaXMuY3JlYXRlTm9kZSh0aGlzLmN1cnJlbnROb2RlLCB0aGlzLnBvcyArIGkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnROb2RlLnR5cGUgPSAnUEFSVElBTCc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBTVEFURV9QQVJUSUFMO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnROb2RlLmlzQ2xvc2VkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBiaW5hcnkgbGl0ZXJhbDhcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ34nOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG5leHRDaHIgPSB0aGlzLnN0ci5jaGFyQXQoaSArIDEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXh0Q2hyICE9PSAneycpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGltYXBGb3JtYWxTeW50YXhbJ0FUT00tQ0hBUiddKCkuaW5kZXhPZihuZXh0Q2hyKSA+PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cmVhdCBhcyBBVE9NXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnROb2RlID0gdGhpcy5jcmVhdGVOb2RlKHRoaXMuY3VycmVudE5vZGUsIHRoaXMucG9zICsgaSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnROb2RlLnR5cGUgPSAnQVRPTSc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnROb2RlLnZhbHVlID0gY2hyO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IFNUQVRFX0FUT007XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBlcnJvciA9IG5ldyBFcnJvcihgVW5leHBlY3RlZCBsaXRlcmFsOCBtYXJrZXIgYXQgcG9zaXRpb24gJHt0aGlzLnBvcyArIGl9IFtFMTJdYCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yLmNvZGUgPSAnUGFyc2VyRXJyb3IxMic7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yLnBhcnNlckNvbnRleHQgPSB7IGlucHV0OiB0aGlzLnN0ciwgcG9zOiB0aGlzLnBvcyArIGksIGNociB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5leHBlY3RlZExpdGVyYWxUeXBlID0gJ2xpdGVyYWw4JztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8geyBzdGFydHMgYSBuZXcgbGl0ZXJhbFxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAneyc6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50Tm9kZSA9IHRoaXMuY3JlYXRlTm9kZSh0aGlzLmN1cnJlbnROb2RlLCB0aGlzLnBvcyArIGkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudE5vZGUudHlwZSA9ICdMSVRFUkFMJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnROb2RlLmxpdGVyYWxUeXBlID0gdGhpcy5leHBlY3RlZExpdGVyYWxUeXBlIHx8ICdsaXRlcmFsJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmV4cGVjdGVkTGl0ZXJhbFR5cGUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnN0YXRlID0gU1RBVEVfTElURVJBTDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnROb2RlLmlzQ2xvc2VkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICogc3RhcnRzIGEgbmV3IHNlcXVlbmNlXG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICcqJzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnROb2RlID0gdGhpcy5jcmVhdGVOb2RlKHRoaXMuY3VycmVudE5vZGUsIHRoaXMucG9zICsgaSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50Tm9kZS50eXBlID0gJ1NFUVVFTkNFJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnROb2RlLnZhbHVlID0gY2hyO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudE5vZGUuaXNDbG9zZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnN0YXRlID0gU1RBVEVfU0VRVUVOQ0U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vcm1hbGx5IGEgc3BhY2Ugc2hvdWxkIG5ldmVyIG9jY3VyXG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICcgJzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBqdXN0IGlnbm9yZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBbIHN0YXJ0cyBzZWN0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdbJzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiBpdCBpcyB0aGUgKmZpcnN0KiBlbGVtZW50IGFmdGVyIHJlc3BvbnNlIGNvbW1hbmQsIHRoZW4gcHJvY2VzcyBhcyBhIHJlc3BvbnNlIGFyZ3VtZW50IGxpc3RcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoWydPSycsICdOTycsICdCQUQnLCAnQllFJywgJ1BSRUFVVEgnXS5pbmNsdWRlcyh0aGlzLnBhcmVudC5jb21tYW5kLnRvVXBwZXJDYXNlKCkpICYmIHRoaXMuY3VycmVudE5vZGUgPT09IHRoaXMudHJlZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnROb2RlLmVuZFBvcyA9IHRoaXMucG9zICsgaTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnROb2RlID0gdGhpcy5jcmVhdGVOb2RlKHRoaXMuY3VycmVudE5vZGUsIHRoaXMucG9zICsgaSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudE5vZGUudHlwZSA9ICdBVE9NJztcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnROb2RlID0gdGhpcy5jcmVhdGVOb2RlKHRoaXMuY3VycmVudE5vZGUsIHRoaXMucG9zICsgaSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudE5vZGUudHlwZSA9ICdTRUNUSU9OJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50Tm9kZS5pc0Nsb3NlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnN0YXRlID0gU1RBVEVfTk9STUFMO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJGQzIyMjEgZGVmaW5lcyBhIHJlc3BvbnNlIGNvZGUgUkVGRVJSQUwgd2hvc2UgcGF5bG9hZCBpcyBhblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSRkMyMTkyL1JGQzUwOTIgaW1hcHVybCB0aGF0IHdlIHdpbGwgdHJ5IHRvIHBhcnNlIGFzIGFuIEFUT00gYnV0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZhaWwgcXVpdGUgYmFkbHkgYXQgcGFyc2luZy4gIFNpbmNlIHRoZSBpbWFwdXJsIGlzIHN1Y2ggYSB1bmlxdWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gKGFuZCBjcmF6eSkgdGVybSwgd2UganVzdCBzcGVjaWFsaXplIHRoYXQgY2FzZSBoZXJlLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5zdHIuc3Vic3RyKGkgKyAxLCA5KS50b1VwcGVyQ2FzZSgpID09PSAnUkVGRVJSQUwgJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY3JlYXRlIHRoZSBSRUZFUlJBTCBhdG9tXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnROb2RlID0gdGhpcy5jcmVhdGVOb2RlKHRoaXMuY3VycmVudE5vZGUsIHRoaXMucG9zICsgaSArIDEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50Tm9kZS50eXBlID0gJ0FUT00nO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50Tm9kZS5lbmRQb3MgPSB0aGlzLnBvcyArIGkgKyA4O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50Tm9kZS52YWx1ZSA9ICdSRUZFUlJBTCc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnROb2RlID0gdGhpcy5jdXJyZW50Tm9kZS5wYXJlbnROb2RlO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBlYXQgYWxsIHRoZSB3YXkgdGhyb3VnaCB0aGUgXSB0byBiZSB0aGUgIElNQVBVUkwgdG9rZW4uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnROb2RlID0gdGhpcy5jcmVhdGVOb2RlKHRoaXMuY3VycmVudE5vZGUsIHRoaXMucG9zICsgaSArIDEwKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGp1c3QgY2FsbCB0aGlzIGFuIEFUT00sIGV2ZW4gdGhvdWdoIElNQVBVUkwgbWlnaHQgYmUgbW9yZSBjb3JyZWN0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnROb2RlLnR5cGUgPSAnQVRPTSc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBqdW1wIGkgdG8gdGhlICddJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSA9IHRoaXMuc3RyLmluZGV4T2YoJ10nLCBpICsgMTApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50Tm9kZS5lbmRQb3MgPSB0aGlzLnBvcyArIGkgLSAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50Tm9kZS52YWx1ZSA9IHRoaXMuc3RyLnN1YnN0cmluZyh0aGlzLmN1cnJlbnROb2RlLnN0YXJ0UG9zIC0gdGhpcy5wb3MsIHRoaXMuY3VycmVudE5vZGUuZW5kUG9zIC0gdGhpcy5wb3MgKyAxKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudE5vZGUgPSB0aGlzLmN1cnJlbnROb2RlLnBhcmVudE5vZGU7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNsb3NlIG91dCB0aGUgU0VDVElPTlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50Tm9kZS5pc0Nsb3NlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnROb2RlID0gdGhpcy5jdXJyZW50Tm9kZS5wYXJlbnROb2RlO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja1NQKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQW55IEFUT00gc3VwcG9ydGVkIGNoYXIgc3RhcnRzIGEgbmV3IEF0b20gc2VxdWVuY2UsIG90aGVyd2lzZSB0aHJvdyBhbiBlcnJvclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFsbG93IFxcIGFzIHRoZSBmaXJzdCBjaGFyIGZvciBhdG9tIHRvIHN1cHBvcnQgc3lzdGVtIGZsYWdzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQWxsb3cgJSB0byBzdXBwb3J0IExJU1QgJycgJVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFsbG93IDhiaXQgY2hhcmFjdGVycyAocHJlc3VtYWJseSB1bmljb2RlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbWFwRm9ybWFsU3ludGF4WydBVE9NLUNIQVInXSgpLmluZGV4T2YoY2hyKSA8IDAgJiYgY2hyICE9PSAnXFxcXCcgJiYgY2hyICE9PSAnJScgJiYgY2hyLmNoYXJDb2RlQXQoMCkgPCAweDgwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBlcnJvciA9IG5ldyBFcnJvcihgVW5leHBlY3RlZCBjaGFyIGF0IHBvc2l0aW9uICR7dGhpcy5wb3MgKyBpfSBbRTEzOiAke0pTT04uc3RyaW5naWZ5KGNocil9XWApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvci5jb2RlID0gJ1BhcnNlckVycm9yMTMnO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvci5wYXJzZXJDb250ZXh0ID0geyBpbnB1dDogdGhpcy5zdHIsIHBvczogdGhpcy5wb3MgKyBpLCBjaHIgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50Tm9kZSA9IHRoaXMuY3JlYXRlTm9kZSh0aGlzLmN1cnJlbnROb2RlLCB0aGlzLnBvcyArIGkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudE5vZGUudHlwZSA9ICdBVE9NJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnROb2RlLnZhbHVlID0gY2hyO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBTVEFURV9BVE9NO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgY2FzZSBTVEFURV9BVE9NOlxuICAgICAgICAgICAgICAgICAgICAvLyBzcGFjZSBmaW5pc2hlcyBhbiBhdG9tXG4gICAgICAgICAgICAgICAgICAgIGlmIChjaHIgPT09ICcgJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50Tm9kZS5lbmRQb3MgPSB0aGlzLnBvcyArIGkgLSAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50Tm9kZSA9IHRoaXMuY3VycmVudE5vZGUucGFyZW50Tm9kZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBTVEFURV9OT1JNQUw7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudE5vZGUucGFyZW50Tm9kZSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgKChjaHIgPT09ICcpJyAmJiB0aGlzLmN1cnJlbnROb2RlLnBhcmVudE5vZGUudHlwZSA9PT0gJ0xJU1QnKSB8fCAoY2hyID09PSAnXScgJiYgdGhpcy5jdXJyZW50Tm9kZS5wYXJlbnROb2RlLnR5cGUgPT09ICdTRUNUSU9OJykpXG4gICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50Tm9kZS5lbmRQb3MgPSB0aGlzLnBvcyArIGkgLSAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50Tm9kZSA9IHRoaXMuY3VycmVudE5vZGUucGFyZW50Tm9kZTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50Tm9kZS5pc0Nsb3NlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnROb2RlLmVuZFBvcyA9IHRoaXMucG9zICsgaTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudE5vZGUgPSB0aGlzLmN1cnJlbnROb2RlLnBhcmVudE5vZGU7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnN0YXRlID0gU1RBVEVfTk9STUFMO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tTUCgpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGlmICgoY2hyID09PSAnLCcgfHwgY2hyID09PSAnOicpICYmIFJFX0RJR0lUUy50ZXN0KHRoaXMuY3VycmVudE5vZGUudmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnROb2RlLnR5cGUgPSAnU0VRVUVOQ0UnO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50Tm9kZS5pc0Nsb3NlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnN0YXRlID0gU1RBVEVfU0VRVUVOQ0U7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAvLyBbIHN0YXJ0cyBhIHNlY3Rpb24gZ3JvdXAgZm9yIHRoaXMgZWxlbWVudFxuICAgICAgICAgICAgICAgICAgICBpZiAoY2hyID09PSAnWycpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFsbG93ZWQgb25seSBmb3Igc2VsZWN0ZWQgZWxlbWVudHNcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChbJ0JPRFknLCAnQk9EWS5QRUVLJywgJ0JJTkFSWScsICdCSU5BUlkuUEVFSyddLmluZGV4T2YodGhpcy5jdXJyZW50Tm9kZS52YWx1ZS50b1VwcGVyQ2FzZSgpKSA8IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoL1suL10vLnRlc3QodGhpcy5jdXJyZW50Tm9kZS52YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY291bGQgYmUgYSBwYXRoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudE5vZGUudmFsdWUgKz0gY2hyO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZXJyb3IgPSBuZXcgRXJyb3IoYFVuZXhwZWN0ZWQgc2VjdGlvbiBzdGFydCBjaGFyIFsgYXQgcG9zaXRpb24gJHt0aGlzLnBvcyArIGl9IFtFMTRdYCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yLmNvZGUgPSAnUGFyc2VyRXJyb3IxNCc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yLnBhcnNlckNvbnRleHQgPSB7IGlucHV0OiB0aGlzLnN0ciwgcG9zOiB0aGlzLnBvcyArIGksIGNociB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnROb2RlLmVuZFBvcyA9IHRoaXMucG9zICsgaTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudE5vZGUgPSB0aGlzLmNyZWF0ZU5vZGUodGhpcy5jdXJyZW50Tm9kZS5wYXJlbnROb2RlLCB0aGlzLnBvcyArIGkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50Tm9kZS50eXBlID0gJ1NFQ1RJT04nO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50Tm9kZS5pc0Nsb3NlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IFNUQVRFX05PUk1BTDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGNociA9PT0gJzwnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgZXJyb3IgPSBuZXcgRXJyb3IoYFVuZXhwZWN0ZWQgc3RhcnQgb2YgcGFydGlhbCBhdCBwb3NpdGlvbiAke3RoaXMucG9zICsgaX0gW0UxNV1gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yLmNvZGUgPSAnUGFyc2VyRXJyb3IxNSc7XG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJvci5wYXJzZXJDb250ZXh0ID0geyBpbnB1dDogdGhpcy5zdHIsIHBvczogdGhpcy5wb3MgKyBpLCBjaHIgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlIGNoYXIgaXMgbm90IEFUT00gY29tcGF0aWJsZSwgdGhyb3cuIEFsbG93IFxcKiBhcyBhbiBleGNlcHRpb25cbiAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgaW1hcEZvcm1hbFN5bnRheFsnQVRPTS1DSEFSJ10oKS5pbmRleE9mKGNocikgPCAwICYmXG4gICAgICAgICAgICAgICAgICAgICAgICBjaHIuY2hhckNvZGVBdCgwKSA8IDB4ODAgJiYgLy8gYWxsb3cgOGJpdCAocHJlc3VtYWJseSB1bmljb2RlKSBieXRlc1xuICAgICAgICAgICAgICAgICAgICAgICAgY2hyICE9PSAnXScgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICEoY2hyID09PSAnKicgJiYgdGhpcy5jdXJyZW50Tm9kZS52YWx1ZSA9PT0gJ1xcXFwnKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgKCF0aGlzLnBhcmVudCB8fCAhdGhpcy5wYXJlbnQuY29tbWFuZCB8fCAhWydOTycsICdCQUQnLCAnT0snXS5pbmNsdWRlcyh0aGlzLnBhcmVudC5jb21tYW5kKSlcbiAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgZXJyb3IgPSBuZXcgRXJyb3IoYFVuZXhwZWN0ZWQgY2hhciBhdCBwb3NpdGlvbiAke3RoaXMucG9zICsgaX0gW0UxNjogJHtKU09OLnN0cmluZ2lmeShjaHIpfV1gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yLmNvZGUgPSAnUGFyc2VyRXJyb3IxNic7XG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJvci5wYXJzZXJDb250ZXh0ID0geyBpbnB1dDogdGhpcy5zdHIsIHBvczogdGhpcy5wb3MgKyBpLCBjaHIgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuY3VycmVudE5vZGUudmFsdWUgPT09ICdcXFxcKicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBlcnJvciA9IG5ldyBFcnJvcihgVW5leHBlY3RlZCBjaGFyIGF0IHBvc2l0aW9uICR7dGhpcy5wb3MgKyBpfSBbRTE3OiAke0pTT04uc3RyaW5naWZ5KGNocil9XWApO1xuICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IuY29kZSA9ICdQYXJzZXJFcnJvcjE3JztcbiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yLnBhcnNlckNvbnRleHQgPSB7IGlucHV0OiB0aGlzLnN0ciwgcG9zOiB0aGlzLnBvcyArIGksIGNociB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnROb2RlLnZhbHVlICs9IGNocjtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgICBjYXNlIFNUQVRFX1NUUklORzpcbiAgICAgICAgICAgICAgICAgICAgLy8gRFFVT1RFIGVuZHMgdGhlIHN0cmluZyBzZXF1ZW5jZVxuICAgICAgICAgICAgICAgICAgICBpZiAoY2hyID09PSAnXCInKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnROb2RlLmVuZFBvcyA9IHRoaXMucG9zICsgaTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudE5vZGUuaXNDbG9zZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50Tm9kZSA9IHRoaXMuY3VycmVudE5vZGUucGFyZW50Tm9kZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBTVEFURV9OT1JNQUw7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrU1AoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gXFwgRXNjYXBlcyB0aGUgZm9sbG93aW5nIGNoYXJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNociA9PT0gJ1xcXFwnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpKys7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaSA+PSBsZW4pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZXJyb3IgPSBuZXcgRXJyb3IoYFVuZXhwZWN0ZWQgZW5kIG9mIGlucHV0IGF0IHBvc2l0aW9uICR7dGhpcy5wb3MgKyBpfSBbRTE4XWApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yLmNvZGUgPSAnUGFyc2VyRXJyb3IxOCc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IucGFyc2VyQ29udGV4dCA9IHsgaW5wdXQ6IHRoaXMuc3RyLCBwb3M6IHRoaXMucG9zICsgaSB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgY2hyID0gdGhpcy5zdHIuY2hhckF0KGkpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50Tm9kZS52YWx1ZSArPSBjaHI7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgY2FzZSBTVEFURV9QQVJUSUFMOlxuICAgICAgICAgICAgICAgICAgICBpZiAoY2hyID09PSAnPicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmN1cnJlbnROb2RlLnZhbHVlLmF0KC0xKSA9PT0gJy4nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGVycm9yID0gbmV3IEVycm9yKGBVbmV4cGVjdGVkIGVuZCBvZiBwYXJ0aWFsIGF0IHBvc2l0aW9uICR7dGhpcy5wb3MgKyBpfSBbRTE5XWApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yLmNvZGUgPSAnUGFyc2VyRXJyb3IxOSc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IucGFyc2VyQ29udGV4dCA9IHsgaW5wdXQ6IHRoaXMuc3RyLCBwb3M6IHRoaXMucG9zICsgaSwgY2hyIH07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnROb2RlLmVuZFBvcyA9IHRoaXMucG9zICsgaTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudE5vZGUuaXNDbG9zZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50Tm9kZSA9IHRoaXMuY3VycmVudE5vZGUucGFyZW50Tm9kZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBTVEFURV9OT1JNQUw7XG4gICAgICAgICAgICAgICAgICAgICAgICBjaGVja1NQKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGlmIChjaHIgPT09ICcuJyAmJiAoIXRoaXMuY3VycmVudE5vZGUudmFsdWUubGVuZ3RoIHx8IHRoaXMuY3VycmVudE5vZGUudmFsdWUubWF0Y2goL1xcLi8pKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGVycm9yID0gbmV3IEVycm9yKGBVbmV4cGVjdGVkIHBhcnRpYWwgc2VwYXJhdG9yIC4gYXQgcG9zaXRpb24gJHt0aGlzLnBvcyArIGl9IFtFMjBdYCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJvci5jb2RlID0gJ1BhcnNlckVycm9yMjAnO1xuICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IucGFyc2VyQ29udGV4dCA9IHsgaW5wdXQ6IHRoaXMuc3RyLCBwb3M6IHRoaXMucG9zICsgaSwgY2hyIH07XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGlmIChpbWFwRm9ybWFsU3ludGF4LkRJR0lUKCkuaW5kZXhPZihjaHIpIDwgMCAmJiBjaHIgIT09ICcuJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGVycm9yID0gbmV3IEVycm9yKGBVbmV4cGVjdGVkIGNoYXIgYXQgcG9zaXRpb24gJHt0aGlzLnBvcyArIGl9IFtFMjE6ICR7SlNPTi5zdHJpbmdpZnkoY2hyKX1dYCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJvci5jb2RlID0gJ1BhcnNlckVycm9yMjEnO1xuICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IucGFyc2VyQ29udGV4dCA9IHsgaW5wdXQ6IHRoaXMuc3RyLCBwb3M6IHRoaXMucG9zICsgaSwgY2hyIH07XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmN1cnJlbnROb2RlLnZhbHVlLm1hdGNoKC9eMCR8XFwuMCQvKSAmJiBjaHIgIT09ICcuJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGVycm9yID0gbmV3IEVycm9yKGBJbnZhbGlkIHBhcnRpYWwgYXQgcG9zaXRpb24gJHt0aGlzLnBvcyArIGl9IFtFMjI6ICR7SlNPTi5zdHJpbmdpZnkoY2hyKX1dYCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJvci5jb2RlID0gJ1BhcnNlckVycm9yMjInO1xuICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IucGFyc2VyQ29udGV4dCA9IHsgaW5wdXQ6IHRoaXMuc3RyLCBwb3M6IHRoaXMucG9zICsgaSwgY2hyIH07XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudE5vZGUudmFsdWUgKz0gY2hyO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgIGNhc2UgU1RBVEVfTElURVJBTDpcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuY3VycmVudE5vZGUuc3RhcnRlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gb25seSByZWxldmFudCBpZiBsaXRlcmFscyBhcmUgbm90IGFscmVhZHkgcGFyc2VkIG91dCBmcm9tIGlucHV0XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIERpc2FibGVkIE5VTEwgYnl0ZSBjaGVja1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9lbWFpbGpzL2VtYWlsanMtaW1hcC1oYW5kbGVyL2NvbW1pdC9mMTFiMjgyMmJlZGFiZTQ5MjIzNmU4MjYzYWZjNjMwMTM0YTNjNDFjXG4gICAgICAgICAgICAgICAgICAgICAgICAvKlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNociA9PT0gJ1xcdTAwMDAnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmV4cGVjdGVkIFxcXFx4MDAgYXQgcG9zaXRpb24gJyArICh0aGlzLnBvcyArIGkpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICovXG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudE5vZGUuY2hCdWZmZXJbdGhpcy5jdXJyZW50Tm9kZS5jaFBvcysrXSA9IGNoci5jaGFyQ29kZUF0KDApO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5jdXJyZW50Tm9kZS5jaFBvcyA+PSB0aGlzLmN1cnJlbnROb2RlLmxpdGVyYWxMZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnROb2RlLmVuZFBvcyA9IHRoaXMucG9zICsgaTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnROb2RlLmlzQ2xvc2VkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnROb2RlLnZhbHVlID0gdGhpcy5jdXJyZW50Tm9kZS5jaEJ1ZmZlci50b1N0cmluZygnYmluYXJ5Jyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50Tm9kZS5jaEJ1ZmZlciA9IEJ1ZmZlci5hbGxvYygwKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnROb2RlID0gdGhpcy5jdXJyZW50Tm9kZS5wYXJlbnROb2RlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBTVEFURV9OT1JNQUw7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tTUCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZiAoY2hyID09PSAnKycgJiYgdGhpcy5vcHRpb25zLmxpdGVyYWxQbHVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnROb2RlLmxpdGVyYWxQbHVzID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGNociA9PT0gJ30nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoISgnbGl0ZXJhbExlbmd0aCcgaW4gdGhpcy5jdXJyZW50Tm9kZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZXJyb3IgPSBuZXcgRXJyb3IoYFVuZXhwZWN0ZWQgbGl0ZXJhbCBwcmVmaXggZW5kIGNoYXIgfSBhdCBwb3NpdGlvbiAke3RoaXMucG9zICsgaX0gW0UyM11gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvci5jb2RlID0gJ1BhcnNlckVycm9yMjMnO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yLnBhcnNlckNvbnRleHQgPSB7IGlucHV0OiB0aGlzLnN0ciwgcG9zOiB0aGlzLnBvcyArIGksIGNociB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuc3RyLmNoYXJBdChpICsgMSkgPT09ICdcXG4nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLnN0ci5jaGFyQXQoaSArIDEpID09PSAnXFxyJyAmJiB0aGlzLnN0ci5jaGFyQXQoaSArIDIpID09PSAnXFxuJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkgKz0gMjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGVycm9yID0gbmV3IEVycm9yKGBVbmV4cGVjdGVkIGNoYXIgYXQgcG9zaXRpb24gJHt0aGlzLnBvcyArIGl9IFtFMjQ6ICR7SlNPTi5zdHJpbmdpZnkoY2hyKX1dYCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IuY29kZSA9ICdQYXJzZXJFcnJvcjI0JztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvci5wYXJzZXJDb250ZXh0ID0geyBpbnB1dDogdGhpcy5zdHIsIHBvczogdGhpcy5wb3MgKyBpLCBjaHIgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50Tm9kZS5saXRlcmFsTGVuZ3RoID0gTnVtYmVyKHRoaXMuY3VycmVudE5vZGUubGl0ZXJhbExlbmd0aCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5jdXJyZW50Tm9kZS5saXRlcmFsTGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3BlY2lhbCBjYXNlIHdoZXJlIGxpdGVyYWwgY29udGVudCBsZW5ndGggaXMgMFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNsb3NlIHRoZSBub2RlIHJpZ2h0IGF3YXksIGRvIG5vdCB3YWl0IGZvciBhZGRpdGlvbmFsIGlucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50Tm9kZS5lbmRQb3MgPSB0aGlzLnBvcyArIGk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50Tm9kZS5pc0Nsb3NlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50Tm9kZSA9IHRoaXMuY3VycmVudE5vZGUucGFyZW50Tm9kZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnN0YXRlID0gU1RBVEVfTk9STUFMO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrU1AoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5vcHRpb25zLmxpdGVyYWxzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdXNlIHRoZSBuZXh0IHByZWNhY2hlZCBsaXRlcmFsIHZhbHVlc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudE5vZGUudmFsdWUgPSB0aGlzLm9wdGlvbnMubGl0ZXJhbHMuc2hpZnQoKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9ubHkgQVBQRU5EIGFyZ3VtZW50cyBhcmUga2VwdCBhcyBCdWZmZXJzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLypcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHRoaXMucGFyZW50LmNvbW1hbmQgfHwgJycpLnRvU3RyaW5nKCkudG9VcHBlckNhc2UoKSAhPT0gJ0FQUEVORCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50Tm9kZS52YWx1ZSA9IHRoaXMuY3VycmVudE5vZGUudmFsdWUudG9TdHJpbmcoJ2JpbmFyeScpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50Tm9kZS5lbmRQb3MgPSB0aGlzLnBvcyArIGkgKyB0aGlzLmN1cnJlbnROb2RlLnZhbHVlLmxlbmd0aDtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudE5vZGUuc3RhcnRlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudE5vZGUuaXNDbG9zZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudE5vZGUgPSB0aGlzLmN1cnJlbnROb2RlLnBhcmVudE5vZGU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IFNUQVRFX05PUk1BTDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja1NQKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudE5vZGUuc3RhcnRlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQWxsb2NhdGUgZXhwZWN0ZWQgc2l6ZSBidWZmZXIuIE1heCBzaXplIGNoZWNrIGlzIGFscmVhZHkgcGVyZm9ybWVkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTWF5YmUgc2hvdWxkIHVzZSBhbGxvY1Vuc2FmZSBpbnN0ZWFkP1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudE5vZGUuY2hCdWZmZXIgPSBCdWZmZXIuYWxsb2ModGhpcy5jdXJyZW50Tm9kZS5saXRlcmFsTGVuZ3RoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnROb2RlLmNoUG9zID0gMDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChpbWFwRm9ybWFsU3ludGF4LkRJR0lUKCkuaW5kZXhPZihjaHIpIDwgMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGVycm9yID0gbmV3IEVycm9yKGBVbmV4cGVjdGVkIGNoYXIgYXQgcG9zaXRpb24gJHt0aGlzLnBvcyArIGl9IFtFMjU6ICR7SlNPTi5zdHJpbmdpZnkoY2hyKX1dYCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJvci5jb2RlID0gJ1BhcnNlckVycm9yMjUnO1xuICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IucGFyc2VyQ29udGV4dCA9IHsgaW5wdXQ6IHRoaXMuc3RyLCBwb3M6IHRoaXMucG9zICsgaSwgY2hyIH07XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5jdXJyZW50Tm9kZS5saXRlcmFsTGVuZ3RoID09PSAnMCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBlcnJvciA9IG5ldyBFcnJvcihgSW52YWxpZCBsaXRlcmFsIGF0IHBvc2l0aW9uICR7dGhpcy5wb3MgKyBpfSBbRTI2XWApO1xuICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IuY29kZSA9ICdQYXJzZXJFcnJvcjI2JztcbiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yLnBhcnNlckNvbnRleHQgPSB7IGlucHV0OiB0aGlzLnN0ciwgcG9zOiB0aGlzLnBvcyArIGksIGNociB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50Tm9kZS5saXRlcmFsTGVuZ3RoID0gKHRoaXMuY3VycmVudE5vZGUubGl0ZXJhbExlbmd0aCB8fCAnJykgKyBjaHI7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgY2FzZSBTVEFURV9TRVFVRU5DRTpcbiAgICAgICAgICAgICAgICAgICAgLy8gc3BhY2UgZmluaXNoZXMgdGhlIHNlcXVlbmNlIHNldFxuICAgICAgICAgICAgICAgICAgICBpZiAoY2hyID09PSAnICcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghUkVfU0lOR0xFX0RJR0lULnRlc3QodGhpcy5jdXJyZW50Tm9kZS52YWx1ZS5hdCgtMSkpICYmIHRoaXMuY3VycmVudE5vZGUudmFsdWUuYXQoLTEpICE9PSAnKicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZXJyb3IgPSBuZXcgRXJyb3IoYFVuZXhwZWN0ZWQgd2hpdGVzcGFjZSBhdCBwb3NpdGlvbiAke3RoaXMucG9zICsgaX0gW0UyN11gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvci5jb2RlID0gJ1BhcnNlckVycm9yMjcnO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yLnBhcnNlckNvbnRleHQgPSB7IGlucHV0OiB0aGlzLnN0ciwgcG9zOiB0aGlzLnBvcyArIGksIGNociB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5jdXJyZW50Tm9kZS52YWx1ZSAhPT0gJyonICYmIHRoaXMuY3VycmVudE5vZGUudmFsdWUuYXQoLTEpID09PSAnKicgJiYgdGhpcy5jdXJyZW50Tm9kZS52YWx1ZS5hdCgtMikgIT09ICc6Jykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBlcnJvciA9IG5ldyBFcnJvcihgVW5leHBlY3RlZCB3aGl0ZXNwYWNlIGF0IHBvc2l0aW9uICR7dGhpcy5wb3MgKyBpfSBbRTI4XWApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yLmNvZGUgPSAnUGFyc2VyRXJyb3IyOCc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IucGFyc2VyQ29udGV4dCA9IHsgaW5wdXQ6IHRoaXMuc3RyLCBwb3M6IHRoaXMucG9zICsgaSwgY2hyIH07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudE5vZGUuaXNDbG9zZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50Tm9kZS5lbmRQb3MgPSB0aGlzLnBvcyArIGkgLSAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50Tm9kZSA9IHRoaXMuY3VycmVudE5vZGUucGFyZW50Tm9kZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBTVEFURV9OT1JNQUw7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmN1cnJlbnROb2RlLnBhcmVudE5vZGUgJiYgY2hyID09PSAnXScgJiYgdGhpcy5jdXJyZW50Tm9kZS5wYXJlbnROb2RlLnR5cGUgPT09ICdTRUNUSU9OJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50Tm9kZS5lbmRQb3MgPSB0aGlzLnBvcyArIGkgLSAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50Tm9kZSA9IHRoaXMuY3VycmVudE5vZGUucGFyZW50Tm9kZTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50Tm9kZS5pc0Nsb3NlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnROb2RlLmVuZFBvcyA9IHRoaXMucG9zICsgaTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudE5vZGUgPSB0aGlzLmN1cnJlbnROb2RlLnBhcmVudE5vZGU7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnN0YXRlID0gU1RBVEVfTk9STUFMO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBjaGVja1NQKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGlmIChjaHIgPT09ICc6Jykge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFSRV9TSU5HTEVfRElHSVQudGVzdCh0aGlzLmN1cnJlbnROb2RlLnZhbHVlLmF0KC0xKSkgJiYgdGhpcy5jdXJyZW50Tm9kZS52YWx1ZS5hdCgtMSkgIT09ICcqJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBlcnJvciA9IG5ldyBFcnJvcihgVW5leHBlY3RlZCByYW5nZSBzZXBhcmF0b3IgOiBhdCBwb3NpdGlvbiAke3RoaXMucG9zICsgaX0gW0UyOV1gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvci5jb2RlID0gJ1BhcnNlckVycm9yMjknO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yLnBhcnNlckNvbnRleHQgPSB7IGlucHV0OiB0aGlzLnN0ciwgcG9zOiB0aGlzLnBvcyArIGksIGNociB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNociA9PT0gJyonKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoWycsJywgJzonXS5pbmRleE9mKHRoaXMuY3VycmVudE5vZGUudmFsdWUuYXQoLTEpKSA8IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZXJyb3IgPSBuZXcgRXJyb3IoYFVuZXhwZWN0ZWQgcmFuZ2Ugd2lsZGNhcmQgYXQgcG9zaXRpb24gJHt0aGlzLnBvcyArIGl9IFtFMzBdYCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IuY29kZSA9ICdQYXJzZXJFcnJvcjMwJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvci5wYXJzZXJDb250ZXh0ID0geyBpbnB1dDogdGhpcy5zdHIsIHBvczogdGhpcy5wb3MgKyBpLCBjaHIgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaHIgPT09ICcsJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFSRV9TSU5HTEVfRElHSVQudGVzdCh0aGlzLmN1cnJlbnROb2RlLnZhbHVlLmF0KC0xKSkgJiYgdGhpcy5jdXJyZW50Tm9kZS52YWx1ZS5hdCgtMSkgIT09ICcqJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBlcnJvciA9IG5ldyBFcnJvcihgVW5leHBlY3RlZCBzZXF1ZW5jZSBzZXBhcmF0b3IgLCBhdCBwb3NpdGlvbiAke3RoaXMucG9zICsgaX0gW0UzMV1gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvci5jb2RlID0gJ1BhcnNlckVycm9yMzEnO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yLnBhcnNlckNvbnRleHQgPSB7IGlucHV0OiB0aGlzLnN0ciwgcG9zOiB0aGlzLnBvcyArIGksIGNociB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuY3VycmVudE5vZGUudmFsdWUuYXQoLTEpID09PSAnKicgJiYgdGhpcy5jdXJyZW50Tm9kZS52YWx1ZS5hdCgtMikgIT09ICc6Jykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBlcnJvciA9IG5ldyBFcnJvcihgVW5leHBlY3RlZCBzZXF1ZW5jZSBzZXBhcmF0b3IgLCBhdCBwb3NpdGlvbiAke3RoaXMucG9zICsgaX0gW0UzMl1gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvci5jb2RlID0gJ1BhcnNlckVycm9yMzInO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yLnBhcnNlckNvbnRleHQgPSB7IGlucHV0OiB0aGlzLnN0ciwgcG9zOiB0aGlzLnBvcyArIGksIGNociB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFSRV9TSU5HTEVfRElHSVQudGVzdChjaHIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgZXJyb3IgPSBuZXcgRXJyb3IoYFVuZXhwZWN0ZWQgY2hhciBhdCBwb3NpdGlvbiAke3RoaXMucG9zICsgaX0gW0UzMzogJHtKU09OLnN0cmluZ2lmeShjaHIpfV1gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yLmNvZGUgPSAnUGFyc2VyRXJyb3IzMyc7XG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJvci5wYXJzZXJDb250ZXh0ID0geyBpbnB1dDogdGhpcy5zdHIsIHBvczogdGhpcy5wb3MgKyBpLCBjaHIgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKFJFX1NJTkdMRV9ESUdJVC50ZXN0KGNocikgJiYgdGhpcy5jdXJyZW50Tm9kZS52YWx1ZS5hdCgtMSkgPT09ICcqJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGVycm9yID0gbmV3IEVycm9yKGBVbmV4cGVjdGVkIG51bWJlciBhdCBwb3NpdGlvbiAke3RoaXMucG9zICsgaX0gW0UzNDogJHtKU09OLnN0cmluZ2lmeShjaHIpfV1gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yLmNvZGUgPSAnUGFyc2VyRXJyb3IzNCc7XG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJvci5wYXJzZXJDb250ZXh0ID0geyBpbnB1dDogdGhpcy5zdHIsIHBvczogdGhpcy5wb3MgKyBpLCBjaHIgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50Tm9kZS52YWx1ZSArPSBjaHI7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgY2FzZSBTVEFURV9URVhUOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnROb2RlLnZhbHVlICs9IGNocjtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG5cbm1vZHVsZS5leHBvcnRzLlRva2VuUGFyc2VyID0gVG9rZW5QYXJzZXI7XG4iXSwibmFtZXMiOltdLCJpZ25vcmVMaXN0IjpbMF0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(action-browser)/./node_modules/imapflow/lib/handler/token-parser.js\n");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "(action-browser)/./node_modules/imapflow/lib/imap-commands.js":
|
|
/*!****************************************************!*\
|
|
!*** ./node_modules/imapflow/lib/imap-commands.js ***!
|
|
\****************************************************/
|
|
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
|
|
|
|
eval("/* eslint global-require:0 */\n\n\n\nmodule.exports = new Map([\n ['ID', __webpack_require__(/*! ./commands/id.js */ \"(action-browser)/./node_modules/imapflow/lib/commands/id.js\")],\n ['CAPABILITY', __webpack_require__(/*! ./commands/capability.js */ \"(action-browser)/./node_modules/imapflow/lib/commands/capability.js\")],\n ['NAMESPACE', __webpack_require__(/*! ./commands/namespace.js */ \"(action-browser)/./node_modules/imapflow/lib/commands/namespace.js\")],\n ['LOGIN', __webpack_require__(/*! ./commands/login.js */ \"(action-browser)/./node_modules/imapflow/lib/commands/login.js\")],\n ['LOGOUT', __webpack_require__(/*! ./commands/logout.js */ \"(action-browser)/./node_modules/imapflow/lib/commands/logout.js\")],\n ['STARTTLS', __webpack_require__(/*! ./commands/starttls.js */ \"(action-browser)/./node_modules/imapflow/lib/commands/starttls.js\")],\n ['LIST', __webpack_require__(/*! ./commands/list.js */ \"(action-browser)/./node_modules/imapflow/lib/commands/list.js\")],\n ['ENABLE', __webpack_require__(/*! ./commands/enable.js */ \"(action-browser)/./node_modules/imapflow/lib/commands/enable.js\")],\n ['SELECT', __webpack_require__(/*! ./commands/select.js */ \"(action-browser)/./node_modules/imapflow/lib/commands/select.js\")],\n ['FETCH', __webpack_require__(/*! ./commands/fetch.js */ \"(action-browser)/./node_modules/imapflow/lib/commands/fetch.js\")],\n ['CREATE', __webpack_require__(/*! ./commands/create.js */ \"(action-browser)/./node_modules/imapflow/lib/commands/create.js\")],\n ['DELETE', __webpack_require__(/*! ./commands/delete.js */ \"(action-browser)/./node_modules/imapflow/lib/commands/delete.js\")],\n ['RENAME', __webpack_require__(/*! ./commands/rename.js */ \"(action-browser)/./node_modules/imapflow/lib/commands/rename.js\")],\n ['CLOSE', __webpack_require__(/*! ./commands/close.js */ \"(action-browser)/./node_modules/imapflow/lib/commands/close.js\")],\n ['SUBSCRIBE', __webpack_require__(/*! ./commands/subscribe.js */ \"(action-browser)/./node_modules/imapflow/lib/commands/subscribe.js\")],\n ['UNSUBSCRIBE', __webpack_require__(/*! ./commands/unsubscribe.js */ \"(action-browser)/./node_modules/imapflow/lib/commands/unsubscribe.js\")],\n ['STORE', __webpack_require__(/*! ./commands/store.js */ \"(action-browser)/./node_modules/imapflow/lib/commands/store.js\")],\n ['SEARCH', __webpack_require__(/*! ./commands/search.js */ \"(action-browser)/./node_modules/imapflow/lib/commands/search.js\")],\n ['NOOP', __webpack_require__(/*! ./commands/noop.js */ \"(action-browser)/./node_modules/imapflow/lib/commands/noop.js\")],\n ['EXPUNGE', __webpack_require__(/*! ./commands/expunge.js */ \"(action-browser)/./node_modules/imapflow/lib/commands/expunge.js\")],\n ['APPEND', __webpack_require__(/*! ./commands/append.js */ \"(action-browser)/./node_modules/imapflow/lib/commands/append.js\")],\n ['STATUS', __webpack_require__(/*! ./commands/status.js */ \"(action-browser)/./node_modules/imapflow/lib/commands/status.js\")],\n ['COPY', __webpack_require__(/*! ./commands/copy.js */ \"(action-browser)/./node_modules/imapflow/lib/commands/copy.js\")],\n ['MOVE', __webpack_require__(/*! ./commands/move.js */ \"(action-browser)/./node_modules/imapflow/lib/commands/move.js\")],\n ['COMPRESS', __webpack_require__(/*! ./commands/compress.js */ \"(action-browser)/./node_modules/imapflow/lib/commands/compress.js\")],\n ['QUOTA', __webpack_require__(/*! ./commands/quota.js */ \"(action-browser)/./node_modules/imapflow/lib/commands/quota.js\")],\n ['IDLE', __webpack_require__(/*! ./commands/idle.js */ \"(action-browser)/./node_modules/imapflow/lib/commands/idle.js\")],\n ['AUTHENTICATE', __webpack_require__(/*! ./commands/authenticate.js */ \"(action-browser)/./node_modules/imapflow/lib/commands/authenticate.js\")]\n]);\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFjdGlvbi1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9pbWFwZmxvdy9saWIvaW1hcC1jb21tYW5kcy5qcyIsIm1hcHBpbmdzIjoiQUFBQTs7QUFFYTs7QUFFYjtBQUNBLFdBQVcsbUJBQU8sQ0FBQyxxRkFBa0I7QUFDckMsbUJBQW1CLG1CQUFPLENBQUMscUdBQTBCO0FBQ3JELGtCQUFrQixtQkFBTyxDQUFDLG1HQUF5QjtBQUNuRCxjQUFjLG1CQUFPLENBQUMsMkZBQXFCO0FBQzNDLGVBQWUsbUJBQU8sQ0FBQyw2RkFBc0I7QUFDN0MsaUJBQWlCLG1CQUFPLENBQUMsaUdBQXdCO0FBQ2pELGFBQWEsbUJBQU8sQ0FBQyx5RkFBb0I7QUFDekMsZUFBZSxtQkFBTyxDQUFDLDZGQUFzQjtBQUM3QyxlQUFlLG1CQUFPLENBQUMsNkZBQXNCO0FBQzdDLGNBQWMsbUJBQU8sQ0FBQywyRkFBcUI7QUFDM0MsZUFBZSxtQkFBTyxDQUFDLDZGQUFzQjtBQUM3QyxlQUFlLG1CQUFPLENBQUMsNkZBQXNCO0FBQzdDLGVBQWUsbUJBQU8sQ0FBQyw2RkFBc0I7QUFDN0MsY0FBYyxtQkFBTyxDQUFDLDJGQUFxQjtBQUMzQyxrQkFBa0IsbUJBQU8sQ0FBQyxtR0FBeUI7QUFDbkQsb0JBQW9CLG1CQUFPLENBQUMsdUdBQTJCO0FBQ3ZELGNBQWMsbUJBQU8sQ0FBQywyRkFBcUI7QUFDM0MsZUFBZSxtQkFBTyxDQUFDLDZGQUFzQjtBQUM3QyxhQUFhLG1CQUFPLENBQUMseUZBQW9CO0FBQ3pDLGdCQUFnQixtQkFBTyxDQUFDLCtGQUF1QjtBQUMvQyxlQUFlLG1CQUFPLENBQUMsNkZBQXNCO0FBQzdDLGVBQWUsbUJBQU8sQ0FBQyw2RkFBc0I7QUFDN0MsYUFBYSxtQkFBTyxDQUFDLHlGQUFvQjtBQUN6QyxhQUFhLG1CQUFPLENBQUMseUZBQW9CO0FBQ3pDLGlCQUFpQixtQkFBTyxDQUFDLGlHQUF3QjtBQUNqRCxjQUFjLG1CQUFPLENBQUMsMkZBQXFCO0FBQzNDLGFBQWEsbUJBQU8sQ0FBQyx5RkFBb0I7QUFDekMscUJBQXFCLG1CQUFPLENBQUMseUdBQTRCO0FBQ3pEIiwic291cmNlcyI6WyIvaG9tZS9hbG1hL25leHRnZW4vTmVhaC1tYWlsL25vZGVfbW9kdWxlcy9pbWFwZmxvdy9saWIvaW1hcC1jb21tYW5kcy5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQgZ2xvYmFsLXJlcXVpcmU6MCAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gbmV3IE1hcChbXG4gICAgWydJRCcsIHJlcXVpcmUoJy4vY29tbWFuZHMvaWQuanMnKV0sXG4gICAgWydDQVBBQklMSVRZJywgcmVxdWlyZSgnLi9jb21tYW5kcy9jYXBhYmlsaXR5LmpzJyldLFxuICAgIFsnTkFNRVNQQUNFJywgcmVxdWlyZSgnLi9jb21tYW5kcy9uYW1lc3BhY2UuanMnKV0sXG4gICAgWydMT0dJTicsIHJlcXVpcmUoJy4vY29tbWFuZHMvbG9naW4uanMnKV0sXG4gICAgWydMT0dPVVQnLCByZXF1aXJlKCcuL2NvbW1hbmRzL2xvZ291dC5qcycpXSxcbiAgICBbJ1NUQVJUVExTJywgcmVxdWlyZSgnLi9jb21tYW5kcy9zdGFydHRscy5qcycpXSxcbiAgICBbJ0xJU1QnLCByZXF1aXJlKCcuL2NvbW1hbmRzL2xpc3QuanMnKV0sXG4gICAgWydFTkFCTEUnLCByZXF1aXJlKCcuL2NvbW1hbmRzL2VuYWJsZS5qcycpXSxcbiAgICBbJ1NFTEVDVCcsIHJlcXVpcmUoJy4vY29tbWFuZHMvc2VsZWN0LmpzJyldLFxuICAgIFsnRkVUQ0gnLCByZXF1aXJlKCcuL2NvbW1hbmRzL2ZldGNoLmpzJyldLFxuICAgIFsnQ1JFQVRFJywgcmVxdWlyZSgnLi9jb21tYW5kcy9jcmVhdGUuanMnKV0sXG4gICAgWydERUxFVEUnLCByZXF1aXJlKCcuL2NvbW1hbmRzL2RlbGV0ZS5qcycpXSxcbiAgICBbJ1JFTkFNRScsIHJlcXVpcmUoJy4vY29tbWFuZHMvcmVuYW1lLmpzJyldLFxuICAgIFsnQ0xPU0UnLCByZXF1aXJlKCcuL2NvbW1hbmRzL2Nsb3NlLmpzJyldLFxuICAgIFsnU1VCU0NSSUJFJywgcmVxdWlyZSgnLi9jb21tYW5kcy9zdWJzY3JpYmUuanMnKV0sXG4gICAgWydVTlNVQlNDUklCRScsIHJlcXVpcmUoJy4vY29tbWFuZHMvdW5zdWJzY3JpYmUuanMnKV0sXG4gICAgWydTVE9SRScsIHJlcXVpcmUoJy4vY29tbWFuZHMvc3RvcmUuanMnKV0sXG4gICAgWydTRUFSQ0gnLCByZXF1aXJlKCcuL2NvbW1hbmRzL3NlYXJjaC5qcycpXSxcbiAgICBbJ05PT1AnLCByZXF1aXJlKCcuL2NvbW1hbmRzL25vb3AuanMnKV0sXG4gICAgWydFWFBVTkdFJywgcmVxdWlyZSgnLi9jb21tYW5kcy9leHB1bmdlLmpzJyldLFxuICAgIFsnQVBQRU5EJywgcmVxdWlyZSgnLi9jb21tYW5kcy9hcHBlbmQuanMnKV0sXG4gICAgWydTVEFUVVMnLCByZXF1aXJlKCcuL2NvbW1hbmRzL3N0YXR1cy5qcycpXSxcbiAgICBbJ0NPUFknLCByZXF1aXJlKCcuL2NvbW1hbmRzL2NvcHkuanMnKV0sXG4gICAgWydNT1ZFJywgcmVxdWlyZSgnLi9jb21tYW5kcy9tb3ZlLmpzJyldLFxuICAgIFsnQ09NUFJFU1MnLCByZXF1aXJlKCcuL2NvbW1hbmRzL2NvbXByZXNzLmpzJyldLFxuICAgIFsnUVVPVEEnLCByZXF1aXJlKCcuL2NvbW1hbmRzL3F1b3RhLmpzJyldLFxuICAgIFsnSURMRScsIHJlcXVpcmUoJy4vY29tbWFuZHMvaWRsZS5qcycpXSxcbiAgICBbJ0FVVEhFTlRJQ0FURScsIHJlcXVpcmUoJy4vY29tbWFuZHMvYXV0aGVudGljYXRlLmpzJyldXG5dKTtcbiJdLCJuYW1lcyI6W10sImlnbm9yZUxpc3QiOlswXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(action-browser)/./node_modules/imapflow/lib/imap-commands.js\n");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "(action-browser)/./node_modules/imapflow/lib/imap-flow.js":
|
|
/*!************************************************!*\
|
|
!*** ./node_modules/imapflow/lib/imap-flow.js ***!
|
|
\************************************************/
|
|
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
|
|
|
|
eval("\n\n/**\n * @module imapflow\n */\n\n// TODO:\n// * Use buffers for compiled commands\n// * OAuth2 authentication\n\nconst tls = __webpack_require__(/*! tls */ \"tls\");\nconst net = __webpack_require__(/*! net */ \"net\");\nconst crypto = __webpack_require__(/*! crypto */ \"crypto\");\nconst { EventEmitter } = __webpack_require__(/*! events */ \"events\");\nconst logger = __webpack_require__(/*! ./logger */ \"(action-browser)/./node_modules/imapflow/lib/logger.js\");\nconst libmime = __webpack_require__(/*! libmime */ \"(action-browser)/./node_modules/libmime/lib/libmime.js\");\nconst zlib = __webpack_require__(/*! zlib */ \"zlib\");\nconst { Headers } = __webpack_require__(/*! mailsplit */ \"(action-browser)/./node_modules/imapflow/node_modules/mailsplit/index.js\");\nconst { LimitedPassthrough } = __webpack_require__(/*! ./limited-passthrough */ \"(action-browser)/./node_modules/imapflow/lib/limited-passthrough.js\");\n\nconst { ImapStream } = __webpack_require__(/*! ./handler/imap-stream */ \"(action-browser)/./node_modules/imapflow/lib/handler/imap-stream.js\");\nconst { parser, compiler } = __webpack_require__(/*! ./handler/imap-handler */ \"(action-browser)/./node_modules/imapflow/lib/handler/imap-handler.js\");\nconst packageInfo = __webpack_require__(/*! ../package.json */ \"(action-browser)/./node_modules/imapflow/package.json\");\n\nconst libqp = __webpack_require__(/*! libqp */ \"(action-browser)/./node_modules/libqp/lib/libqp.js\");\nconst libbase64 = __webpack_require__(/*! libbase64 */ \"(action-browser)/./node_modules/libbase64/lib/libbase64.js\");\nconst FlowedDecoder = __webpack_require__(/*! mailsplit/lib/flowed-decoder */ \"(action-browser)/./node_modules/imapflow/node_modules/mailsplit/lib/flowed-decoder.js\");\nconst { PassThrough } = __webpack_require__(/*! stream */ \"stream\");\n\nconst { proxyConnection } = __webpack_require__(/*! ./proxy-connection */ \"(action-browser)/./node_modules/imapflow/lib/proxy-connection.js\");\n\nconst {\n comparePaths,\n updateCapabilities,\n getFolderTree,\n formatMessageResponse,\n getDecoder,\n packMessageRange,\n normalizePath,\n expandRange,\n AuthenticationFailure,\n getColorFlags\n} = __webpack_require__(/*! ./tools */ \"(action-browser)/./node_modules/imapflow/lib/tools.js\");\n\nconst imapCommands = __webpack_require__(/*! ./imap-commands.js */ \"(action-browser)/./node_modules/imapflow/lib/imap-commands.js\");\n\nconst CONNECT_TIMEOUT = 90 * 1000;\nconst GREETING_TIMEOUT = 16 * 1000;\nconst UPGRADE_TIMEOUT = 10 * 1000;\n\nconst SOCKET_TIMEOUT = 5 * 60 * 1000;\n\nconst states = {\n NOT_AUTHENTICATED: 0x01,\n AUTHENTICATED: 0x02,\n SELECTED: 0x03,\n LOGOUT: 0x04\n};\n\n/**\n * @typedef {Object} MailboxObject\n * @global\n * @property {String} path mailbox path\n * @property {String} delimiter mailbox path delimiter, usually \".\" or \"/\"\n * @property {Set<string>} flags list of flags for this mailbox\n * @property {String} [specialUse] one of special-use flags (if applicable): \"\\All\", \"\\Archive\", \"\\Drafts\", \"\\Flagged\", \"\\Junk\", \"\\Sent\", \"\\Trash\". Additionally INBOX has non-standard \"\\Inbox\" flag set\n * @property {Boolean} listed `true` if mailbox was found from the output of LIST command\n * @property {Boolean} subscribed `true` if mailbox was found from the output of LSUB command\n * @property {Set<string>} permanentFlags A Set of flags available to use in this mailbox. If it is not set or includes special flag \"\\\\\\*\" then any flag can be used.\n * @property {String} [mailboxId] unique mailbox ID if server has `OBJECTID` extension enabled\n * @property {BigInt} [highestModseq] latest known modseq value if server has CONDSTORE or XYMHIGHESTMODSEQ enabled\n * @property {String} [noModseq] if true then the server doesn't support the persistent storage of mod-sequences for the mailbox\n * @property {BigInt} uidValidity Mailbox `UIDVALIDITY` value\n * @property {Number} uidNext Next predicted UID\n * @property {Number} exists Messages in this folder\n */\n\n/**\n * @typedef {Object} MailboxLockObject\n * @global\n * @property {String} path mailbox path\n * @property {Function} release Release current lock\n * @example\n * let lock = await client.getMailboxLock('INBOX');\n * try {\n * // do something in the mailbox\n * } finally {\n * // use finally{} to make sure lock is released even if exception occurs\n * lock.release();\n * }\n */\n\n/**\n * Client and server identification object, where key is one of RFC2971 defined [data fields](https://tools.ietf.org/html/rfc2971#section-3.3) (but not limited to).\n * @typedef {Object} IdInfoObject\n * @global\n * @property {String} [name] Name of the program\n * @property {String} [version] Version number of the program\n * @property {String} [os] Name of the operating system\n * @property {String} [vendor] Vendor of the client/server\n * @property {String} ['support-url'] URL to contact for support\n * @property {Date} [date] Date program was released\n */\n\n/**\n * IMAP client class for accessing IMAP mailboxes\n *\n * @class\n * @extends EventEmitter\n */\nclass ImapFlow extends EventEmitter {\n /**\n * Current module version as a static class property\n * @property {String} version Module version\n * @static\n */\n static version = packageInfo.version;\n\n /**\n * IMAP connection options\n *\n * @property {String} host\n * Hostname of the IMAP server.\n *\n * @property {Number} port\n * Port number for the IMAP server.\n *\n * @property {Boolean} [secure=false]\n * If `true`, establishes the connection directly over TLS (commonly on port 993).\n * If `false`, a plain (unencrypted) connection is used first and, if possible, the connection is upgraded to STARTTLS.\n *\n * @property {Boolean} [doSTARTTLS=undefined]\n * Determines whether to upgrade the connection to TLS via STARTTLS:\n * - **true**: Start unencrypted and upgrade to TLS using STARTTLS before authentication.\n * The connection fails if the server does not support STARTTLS or the upgrade fails.\n * Note that `secure=true` combined with `doSTARTTLS=true` is invalid.\n * - **false**: Never use STARTTLS, even if the server advertises support.\n * This is useful if the server has a broken TLS setup.\n * Combined with `secure=false`, this results in a fully unencrypted connection.\n * Make sure you warn users about the security risks.\n * - **undefined** (default): If `secure=false` (default), attempt to upgrade to TLS via STARTTLS before authentication if the server supports it. If not supported, continue unencrypted. This may expose the connection to a downgrade attack.\n *\n * @property {String} [servername]\n * Server name for SNI or when using an IP address as `host`.\n *\n * @property {Boolean} [disableCompression=false]\n * If `true`, the client does not attempt to use the COMPRESS=DEFLATE extension.\n *\n * @property {Object} auth\n * Authentication options. Authentication occurs automatically during {@link connect}.\n *\n * @property {String} auth.user\n * Username for authentication.\n *\n * @property {String} [auth.pass]\n * Password for regular authentication.\n *\n * @property {String} [auth.accessToken]\n * OAuth2 access token, if using OAuth2 authentication.\n *\n * @property {String} [auth.loginMethod]\n * Optional login method for password-based authentication (e.g., \"LOGIN\", \"AUTH=LOGIN\", or \"AUTH=PLAIN\").\n * If not set, ImapFlow chooses based on available mechanisms.\n *\n * @property {IdInfoObject} [clientInfo]\n * Client identification info sent to the server (via the ID command).\n *\n * @property {Boolean} [disableAutoIdle=false]\n * If `true`, do not start IDLE automatically. Useful when only specific operations are needed.\n *\n * @property {Object} [tls]\n * Additional TLS options. For details, see [Node.js TLS connect](https://nodejs.org/api/tls.html#tls_tls_connect_options_callback).\n *\n * @property {Boolean} [tls.rejectUnauthorized=true]\n * If `false`, allows self-signed or expired certificates.\n *\n * @property {String} [tls.minVersion='TLSv1.2']\n * Minimum accepted TLS version (e.g., `'TLSv1.2'`).\n *\n * @property {Number} [tls.minDHSize=1024]\n * Minimum size (in bits) of the DH parameter for TLS connections.\n *\n * @property {Object|Boolean} [logger]\n * Custom logger instance with `debug(obj)`, `info(obj)`, `warn(obj)`, and `error(obj)` methods.\n * If `false`, logging is disabled. If not provided, ImapFlow logs to console in [pino format](https://getpino.io/).\n *\n * @property {Boolean} [logRaw=false]\n * If `true`, logs all raw data (read and written) in base64 encoding. You can pipe such logs to [eerawlog](https://github.com/postalsys/eerawlog) command for readable output.\n *\n * @property {Boolean} [emitLogs=false]\n * If `true`, emits `'log'` events with the same data passed to the logger.\n *\n * @property {Boolean} [verifyOnly=false]\n * If `true`, disconnects after successful authentication without performing other actions.\n *\n * @property {String} [proxy]\n * Proxy URL. Supports HTTP CONNECT (`http://`, `https://`) and SOCKS (`socks://`, `socks4://`, `socks5://`).\n *\n * @property {Boolean} [qresync=false]\n * If `true`, enables QRESYNC support so that EXPUNGE notifications include `uid` instead of `seq`.\n *\n * @property {Number} [maxIdleTime]\n * If set, breaks and restarts IDLE every `maxIdleTime` milliseconds.\n *\n * @property {String} [missingIdleCommand=\"NOOP\"]\n * Command to use if the server does not support IDLE.\n *\n * @property {Boolean} [disableBinary=false]\n * If `true`, ignores the BINARY extension for FETCH and APPEND operations.\n *\n * @property {Boolean} [disableAutoEnable=false]\n * If `true`, do not automatically enable supported IMAP extensions.\n *\n * @property {Number} [connectionTimeout=90000]\n * Maximum time (in milliseconds) to wait for the connection to establish. Defaults to 90 seconds.\n *\n * @property {Number} [greetingTimeout=16000]\n * Maximum time (in milliseconds) to wait for the server greeting after a connection is established. Defaults to 16 seconds.\n *\n * @property {Number} [socketTimeout=300000]\n * Maximum period of inactivity (in milliseconds) before terminating the connection. Defaults to 5 minutes.\n */\n\n constructor(options) {\n super({ captureRejections: true });\n\n this.options = options || {};\n\n /**\n * Instance ID for logs\n * @type {String}\n */\n this.id = this.options.id || this.getRandomId();\n\n this.clientInfo = Object.assign(\n {\n name: packageInfo.name,\n version: packageInfo.version,\n vendor: 'Postal Systems',\n 'support-url': 'https://github.com/postalsys/imapflow/issues'\n },\n this.options.clientInfo || {}\n );\n\n /**\n * Server identification info. Available after successful `connect()`.\n * If server does not provide identification info then this value is `null`.\n * @example\n * await client.connect();\n * console.log(client.serverInfo.vendor);\n * @type {IdInfoObject|null}\n */\n this.serverInfo = null; //updated by ID\n\n this.log = this.getLogger();\n\n /**\n * Is the connection currently encrypted or not\n * @type {Boolean}\n */\n this.secureConnection = !!this.options.secure;\n\n this.port = Number(this.options.port) || (this.secureConnection ? 993 : 110);\n this.host = this.options.host || 'localhost';\n this.servername = this.options.servername ? this.options.servername : !net.isIP(this.host) ? this.host : false;\n\n if (typeof this.options.secure === 'undefined' && this.port === 993) {\n // if secure option is not set but port is 465, then default to secure\n this.secureConnection = true;\n }\n\n this.logRaw = this.options.logRaw;\n this.streamer = new ImapStream({\n logger: this.log,\n cid: this.id,\n logRaw: this.logRaw,\n secureConnection: this.secureConnection\n });\n\n this.reading = false;\n this.socket = false;\n this.writeSocket = false;\n\n this.states = states;\n this.state = this.states.NOT_AUTHENTICATED;\n\n this.lockCounter = 0;\n this.currentLock = false;\n\n this.tagCounter = 0;\n this.requestTagMap = new Map();\n this.requestQueue = [];\n this.currentRequest = false;\n\n this.writeBytesCounter = 0;\n\n this.commandParts = [];\n\n /**\n * Active IMAP capabilities. Value is either `true` for togglabe capabilities (eg. `UIDPLUS`)\n * or a number for capabilities with a value (eg. `APPENDLIMIT`)\n * @type {Map<string, boolean|number>}\n */\n this.capabilities = new Map();\n this.authCapabilities = new Map();\n\n this.rawCapabilities = null;\n\n this.expectCapabilityUpdate = false; // force CAPABILITY after LOGIN\n\n /**\n * Enabled capabilities. Usually `CONDSTORE` and `UTF8=ACCEPT` if server supports these.\n * @type {Set<string>}\n */\n this.enabled = new Set();\n\n /**\n * Is the connection currently usable or not\n * @type {Boolean}\n */\n this.usable = false;\n\n /**\n * Currently authenticated user or `false` if mailbox is not open\n * or `true` if connection was authenticated by PREAUTH\n * @type {String|Boolean}\n */\n this.authenticated = false;\n\n /**\n * Currently selected mailbox or `false` if mailbox is not open\n * @type {MailboxObject|Boolean}\n */\n this.mailbox = false;\n this.currentSelectCommand = false;\n\n /**\n * Is current mailbox idling (`true`) or not (`false`)\n * @type {Boolean}\n */\n this.idling = false;\n\n this.emitLogs = !!this.options.emitLogs;\n // ordering number for emitted logs\n this.lo = 0;\n\n this.untaggedHandlers = {};\n this.sectionHandlers = {};\n\n this.commands = imapCommands;\n\n this.folders = new Map();\n\n this.currentLock = false;\n this.locks = [];\n\n this.idRequested = false;\n\n this.maxIdleTime = this.options.maxIdleTime || false;\n this.missingIdleCommand = (this.options.missingIdleCommand || '').toString().toUpperCase().trim() || 'NOOP';\n\n this.disableBinary = !!this.options.disableBinary;\n\n this.streamer.on('error', err => {\n if (['Z_BUF_ERROR', 'ECONNRESET', 'EPIPE', 'ETIMEDOUT', 'EHOSTUNREACH'].includes(err.code)) {\n // just close the connection, usually nothing but noise\n return setImmediate(() => this.close());\n }\n\n this.log.error({ err, cid: this.id });\n setImmediate(() => this.close());\n this.emitError(err);\n });\n\n // Has the `connect` method already been called\n this._connectCalled = false;\n }\n\n emitError(err) {\n this.emit('error', err);\n }\n\n getRandomId() {\n let rid = BigInt('0x' + crypto.randomBytes(13).toString('hex')).toString(36);\n if (rid.length < 20) {\n rid = '0'.repeat(20 - rid.length) + rid;\n } else if (rid.length > 20) {\n rid = rid.substr(0, 20);\n }\n return rid;\n }\n\n write(chunk) {\n if (this.socket.destroyed) {\n // do not write after connection end or logout\n const error = new Error('Socket is already closed');\n error.code = 'NoConnection';\n throw error;\n }\n\n if (this.state === this.states.LOGOUT) {\n // should not happen\n const error = new Error('Can not send data after logged out');\n error.code = 'StateLogout';\n throw error;\n }\n\n if (this.writeSocket.destroyed) {\n this.socket.emit('error', 'Write socket destroyed');\n return;\n }\n\n let addLineBreak = !this.commandParts.length;\n if (typeof chunk === 'string') {\n if (addLineBreak) {\n chunk += '\\r\\n';\n }\n chunk = Buffer.from(chunk, 'binary');\n } else if (Buffer.isBuffer(chunk)) {\n if (addLineBreak) {\n chunk = Buffer.concat([chunk, Buffer.from('\\r\\n')]);\n }\n } else {\n return false;\n }\n\n if (this.logRaw) {\n this.log.trace({\n src: 'c',\n msg: 'write to socket',\n data: chunk.toString('base64'),\n compress: !!this._deflate,\n secure: !!this.secureConnection,\n cid: this.id\n });\n }\n\n this.writeBytesCounter += chunk.length;\n\n this.writeSocket.write(chunk);\n }\n\n stats(reset) {\n let result = {\n sent: this.writeBytesCounter || 0,\n received: (this.streamer && this.streamer.readBytesCounter) || 0\n };\n\n if (reset) {\n this.writeBytesCounter = 0;\n if (this.streamer) {\n this.streamer.readBytesCounter = 0;\n }\n }\n\n return result;\n }\n\n async send(data) {\n if (this.state === this.states.LOGOUT) {\n // already logged out\n if (data.tag) {\n let request = this.requestTagMap.get(data.tag);\n if (request) {\n this.requestTagMap.delete(request.tag);\n const error = new Error('Connection not available');\n error.code = 'NoConnection';\n request.reject(error);\n }\n }\n return;\n }\n\n let compiled = await compiler(data, {\n asArray: true,\n literalMinus: this.capabilities.has('LITERAL-') || this.capabilities.has('LITERAL+')\n });\n this.commandParts = compiled;\n\n let logCompiled = await compiler(data, {\n isLogging: true\n });\n\n let options = data.options || {};\n\n this.log.debug({ src: 's', msg: logCompiled.toString(), cid: this.id, comment: options.comment });\n\n this.write(this.commandParts.shift());\n\n if (typeof options.onSend === 'function') {\n options.onSend();\n }\n }\n\n async trySend() {\n if (this.currentRequest || !this.requestQueue.length) {\n return;\n }\n this.currentRequest = this.requestQueue.shift();\n\n await this.send({\n tag: this.currentRequest.tag,\n command: this.currentRequest.command,\n attributes: this.currentRequest.attributes,\n options: this.currentRequest.options\n });\n }\n\n async exec(command, attributes, options) {\n if (this.socket.destroyed) {\n let error = new Error('Connection closed');\n error.code = 'EConnectionClosed';\n throw error;\n }\n\n let tag = (++this.tagCounter).toString(16).toUpperCase();\n\n options = options || {};\n\n return new Promise((resolve, reject) => {\n this.requestTagMap.set(tag, { command, attributes, options, resolve, reject });\n this.requestQueue.push({ tag, command, attributes, options });\n this.trySend().catch(err => {\n this.requestTagMap.delete(tag);\n reject(err);\n });\n });\n }\n\n getUntaggedHandler(command, attributes) {\n if (/^[0-9]+$/.test(command)) {\n let type = attributes && attributes.length && typeof attributes[0].value === 'string' ? attributes[0].value.toUpperCase() : false;\n if (type) {\n // EXISTS, EXPUNGE, RECENT, FETCH etc\n command = type;\n }\n }\n\n command = command.toUpperCase().trim();\n if (this.currentRequest && this.currentRequest.options && this.currentRequest.options.untagged && this.currentRequest.options.untagged[command]) {\n return this.currentRequest.options.untagged[command];\n }\n\n if (this.untaggedHandlers[command]) {\n return this.untaggedHandlers[command];\n }\n }\n\n getSectionHandler(key) {\n if (this.sectionHandlers[key]) {\n return this.sectionHandlers[key];\n }\n }\n\n async reader() {\n let data;\n while ((data = this.streamer.read()) !== null) {\n let parsed;\n\n try {\n parsed = await parser(data.payload, { literals: data.literals });\n if (parsed.tag && !['*', '+'].includes(parsed.tag) && parsed.command) {\n let payload = { response: parsed.command };\n\n if (\n parsed.attributes &&\n parsed.attributes[0] &&\n parsed.attributes[0].section &&\n parsed.attributes[0].section[0] &&\n parsed.attributes[0].section[0].type === 'ATOM'\n ) {\n payload.code = parsed.attributes[0].section[0].value;\n }\n this.emit('response', payload);\n }\n } catch (err) {\n // can not make sense of this\n this.log.error({ src: 's', msg: data.payload.toString(), err, cid: this.id });\n data.next();\n continue;\n }\n\n let logCompiled = await compiler(parsed, {\n isLogging: true\n });\n\n if (/^\\d+$/.test(parsed.command) && parsed.attributes && parsed.attributes[0] && parsed.attributes[0].value === 'FETCH') {\n // too many FETCH responses, might want to filter these out\n this.log.trace({ src: 's', msg: logCompiled.toString(), cid: this.id, nullBytesRemoved: parsed.nullBytesRemoved });\n } else {\n this.log.debug({ src: 's', msg: logCompiled.toString(), cid: this.id, nullBytesRemoved: parsed.nullBytesRemoved });\n }\n\n if (parsed.tag === '+' && this.currentRequest && this.currentRequest.options && typeof this.currentRequest.options.onPlusTag === 'function') {\n await this.currentRequest.options.onPlusTag(parsed);\n data.next();\n continue;\n }\n\n if (parsed.tag === '+' && this.commandParts.length) {\n let content = this.commandParts.shift();\n this.write(content);\n this.log.debug({ src: 'c', msg: `(* ${content.length}B continuation *)`, cid: this.id });\n data.next();\n continue;\n }\n\n let section = parsed.attributes && parsed.attributes.length && parsed.attributes[0] && !parsed.attributes[0].value && parsed.attributes[0].section;\n if (section && section.length && section[0].type === 'ATOM' && typeof section[0].value === 'string') {\n let sectionHandler = this.getSectionHandler(section[0].value.toUpperCase().trim());\n if (sectionHandler) {\n await sectionHandler(section.slice(1));\n }\n }\n\n if (parsed.tag === '*' && parsed.command) {\n let untaggedHandler = this.getUntaggedHandler(parsed.command, parsed.attributes);\n if (untaggedHandler) {\n try {\n await untaggedHandler(parsed);\n } catch (err) {\n this.log.warn({ err, cid: this.id });\n data.next();\n continue;\n }\n }\n }\n\n if (this.requestTagMap.has(parsed.tag)) {\n let request = this.requestTagMap.get(parsed.tag);\n this.requestTagMap.delete(parsed.tag);\n\n if (this.currentRequest && this.currentRequest.tag === parsed.tag) {\n // send next pending command\n this.currentRequest = false;\n await this.trySend();\n }\n\n switch (parsed.command.toUpperCase()) {\n case 'OK':\n case 'BYE':\n await new Promise(resolve => request.resolve({ response: parsed, next: resolve }));\n break;\n\n case 'NO':\n case 'BAD': {\n let txt =\n parsed.attributes &&\n parsed.attributes\n .filter(val => val.type === 'TEXT')\n .map(val => val.value.trim())\n .join(' ');\n\n let err = new Error('Command failed');\n err.response = parsed;\n err.responseStatus = parsed.command.toUpperCase();\n\n try {\n err.executedCommand =\n parsed.tag +\n (\n await compiler(request, {\n isLogging: true\n })\n ).toString();\n } catch (err) {\n // ignore\n }\n\n if (txt) {\n err.responseText = txt;\n\n if (err.responseStatus === 'NO' && txt.includes('Some of the requested messages no longer exist')) {\n // Treat as successful response\n this.log.warn({ msg: 'Partial FETCH response', cid: this.id, err });\n await new Promise(resolve => request.resolve({ response: parsed, next: resolve }));\n break;\n }\n\n let throttleDelay = false;\n\n // MS365 throttling\n // tag BAD Request is throttled. Suggested Backoff Time: 92415 milliseconds\n if (/Request is throttled/i.test(txt) && /Backoff Time/i.test(txt)) {\n let throttlingMatch = txt.match(/Backoff Time[:=\\s]+(\\d+)/i);\n if (throttlingMatch && throttlingMatch[1] && !isNaN(throttlingMatch[1])) {\n throttleDelay = Number(throttlingMatch[1]);\n }\n }\n\n // Wait and return a throttling error\n if (throttleDelay) {\n err.code = 'ETHROTTLE';\n err.throttleReset = throttleDelay;\n\n let delayResponse = throttleDelay;\n if (delayResponse > 5 * 60 * 1000) {\n // max delay cap\n delayResponse = 5 * 60 * 1000;\n }\n\n this.log.warn({ msg: 'Throttling detected', cid: this.id, throttleDelay, delayResponse, err });\n await new Promise(r => setTimeout(r, delayResponse));\n }\n }\n\n request.reject(err);\n break;\n }\n\n default: {\n let err = new Error('Invalid server response');\n err.code = 'InvalidResponse';\n err.response = parsed;\n request.reject(err);\n break;\n }\n }\n }\n\n data.next();\n }\n }\n\n setEventHandlers() {\n this.socketReadable = () => {\n if (!this.reading) {\n this.reading = true;\n this.reader()\n .catch(err => this.log.error({ err, cid: this.id }))\n .finally(() => {\n this.reading = false;\n });\n }\n };\n\n this.streamer.on('readable', this.socketReadable);\n }\n\n setSocketHandlers() {\n this._socketError =\n this._socketError ||\n (err => {\n this.log.error({ err, cid: this.id });\n setImmediate(() => this.close());\n this.emitError(err);\n });\n this._socketClose =\n this._socketClose ||\n (() => {\n this.close();\n });\n this._socketEnd =\n this._socketEnd ||\n (() => {\n this.close();\n });\n\n this._socketTimeout =\n this._socketTimeout ||\n (() => {\n if (this.idling) {\n this.run('NOOP')\n .then(() => this.idle())\n .catch(this._socketError);\n } else {\n this.log.debug({ msg: 'Socket timeout', cid: this.id });\n this.close();\n }\n });\n\n this.socket.on('error', this._socketError);\n this.socket.on('close', this._socketClose);\n this.socket.on('end', this._socketEnd);\n this.socket.on('tlsClientError', this._socketError);\n this.socket.on('timeout', this._socketTimeout);\n\n this.writeSocket.on('error', this._socketError);\n }\n\n clearSocketHandlers() {\n if (this._socketError) {\n this.socket.removeListener('error', this._socketError);\n this.socket.removeListener('tlsClientError', this._socketError);\n }\n if (this._socketClose) {\n this.socket.removeListener('close', this._socketClose);\n }\n if (this._socketEnd) {\n this.socket.removeListener('end', this._socketEnd);\n }\n }\n\n async startSession() {\n await this.run('CAPABILITY');\n\n if (this.capabilities.has('ID')) {\n this.idRequested = await this.run('ID', this.clientInfo);\n }\n\n await this.upgradeToSTARTTLS();\n\n await this.authenticate();\n\n if (!this.idRequested && this.capabilities.has('ID')) {\n // re-request ID after LOGIN\n this.idRequested = await this.run('ID', this.clientInfo);\n }\n\n // Make sure we have namespace set. This should also throw if Exchange actually failed authentication\n let nsResponse = await this.run('NAMESPACE');\n if (nsResponse && nsResponse.error && nsResponse.status === 'BAD' && /User is authenticated but not connected/i.test(nsResponse.text)) {\n // Not a NAMESPACE failure but authentication failure, so report as\n this.authenticated = false;\n let err = new AuthenticationFailure('Authentication failed');\n err.response = nsResponse.text;\n throw err;\n }\n\n if (this.options.verifyOnly) {\n // List all folders and logout\n if (this.options.includeMailboxes) {\n this._mailboxList = await this.list();\n }\n return await this.logout();\n }\n\n // try to use compression (if supported)\n if (!this.options.disableCompression) {\n await this.compress();\n }\n\n if (!this.options.disableAutoEnable) {\n // enable extensions if possible\n await this.run('ENABLE', ['CONDSTORE', 'UTF8=ACCEPT'].concat(this.options.qresync ? 'QRESYNC' : []));\n }\n\n this.usable = true;\n }\n\n async compress() {\n if (!(await this.run('COMPRESS'))) {\n return; // was not able to negotiate compression\n }\n\n // create deflate/inflate streams\n this._deflate = zlib.createDeflateRaw({\n windowBits: 15\n });\n this._inflate = zlib.createInflateRaw();\n\n // route incoming socket via inflate stream\n this.socket.unpipe(this.streamer);\n this.streamer.compress = true;\n this.socket.pipe(this._inflate).pipe(this.streamer);\n this._inflate.on('error', err => {\n this.streamer.emit('error', err);\n });\n\n // route outgoing socket via deflate stream\n this.writeSocket = new PassThrough();\n\n this.writeSocket.destroySoon = () => {\n try {\n if (this.socket) {\n this.socket.destroy();\n }\n this.writeSocket.end();\n } catch (err) {\n this.log.error({ err, info: 'Failed to destroy PassThrough socket', cid: this.id });\n throw err;\n }\n };\n\n Object.defineProperty(this.writeSocket, 'destroyed', {\n get: () => this.socket.destroyed\n });\n\n // we need to force flush deflated data to socket so we can't\n // use normal pipes for this.writeSocket -> this._deflate -> this.socket\n let reading = false;\n let readNext = () => {\n reading = true;\n\n let chunk;\n while ((chunk = this.writeSocket.read()) !== null) {\n if (this._deflate && this._deflate.write(chunk) === false) {\n return this._deflate.once('drain', readNext);\n }\n }\n\n // flush data to socket\n if (this._deflate) {\n this._deflate.flush();\n }\n\n reading = false;\n };\n\n this.writeSocket.on('readable', () => {\n if (!reading) {\n readNext();\n }\n });\n this.writeSocket.on('error', err => {\n this.socket.emit('error', err);\n });\n\n this._deflate.pipe(this.socket);\n this._deflate.on('error', err => {\n this.socket.emit('error', err);\n });\n }\n\n _failSTARTTLS() {\n if (this.options.doSTARTTLS === true) {\n // STARTTLS configured as requirement\n let err = new Error('Server does not support STARTTLS');\n err.tlsFailed = true;\n throw err;\n } else {\n // Opportunistic STARTTLS. But it's not possible right now.\n // Attention: Could be a downgrade attack.\n return false;\n }\n }\n\n /**\n * Tries to upgrade the connection to TLS using STARTTLS.\n * @throws if STARTTLS is required, but not possible.\n * @returns {boolean} true, if the connection is now protected by TLS, either direct TLS or STARTTLS.\n */\n async upgradeToSTARTTLS() {\n if (this.options.doSTARTTLS === true && this.options.secure === true) {\n throw new Error('Misconfiguration: Cannot set both secure=true for TLS and doSTARTTLS=true for STARTTLS.');\n }\n\n if (this.secureConnection) {\n // Already using direct TLS. No need for STARTTLS.\n return true;\n }\n\n if (this.options.doSTARTTLS === false) {\n // STARTTLS explictly disabled by config\n return false;\n }\n\n if (!this.capabilities.has('STARTTLS')) {\n return this._failSTARTTLS();\n }\n\n this.expectCapabilityUpdate = true;\n let canUpgrade = await this.run('STARTTLS');\n if (!canUpgrade) {\n return this._failSTARTTLS();\n }\n\n this.socket.unpipe(this.streamer);\n let upgraded = await new Promise((resolve, reject) => {\n let socketPlain = this.socket;\n let opts = Object.assign(\n {\n socket: this.socket,\n servername: this.servername,\n port: this.port\n },\n this.options.tls || {}\n );\n this.clearSocketHandlers();\n\n socketPlain.once('error', err => {\n clearTimeout(this.connectTimeout);\n clearTimeout(this.upgradeTimeout);\n if (!this.upgrading) {\n // don't care anymore\n return;\n }\n setImmediate(() => this.close());\n this.upgrading = false;\n err.tlsFailed = true;\n reject(err);\n });\n\n this.upgradeTimeout = setTimeout(() => {\n if (!this.upgrading) {\n return;\n }\n setImmediate(() => this.close());\n let err = new Error('Failed to upgrade connection in required time');\n err.tlsFailed = true;\n err.code = 'UPGRADE_TIMEOUT';\n reject(err);\n }, UPGRADE_TIMEOUT);\n\n this.upgrading = true;\n this.socket = tls.connect(opts, () => {\n clearTimeout(this.upgradeTimeout);\n if (this.isClosed) {\n // not sure if this is possible?\n return this.close();\n }\n\n this.secureConnection = true;\n this.upgrading = false;\n this.streamer.secureConnection = true;\n this.socket.pipe(this.streamer);\n this.tls = typeof this.socket.getCipher === 'function' ? this.socket.getCipher() : false;\n if (this.tls) {\n this.tls.authorized = this.socket.authorized;\n this.log.info({\n src: 'tls',\n msg: 'Established TLS session',\n cid: this.id,\n authorized: this.tls.authorized,\n algo: this.tls.standardName || this.tls.name,\n version: this.tls.version\n });\n }\n\n return resolve(true);\n });\n\n this.writeSocket = this.socket;\n\n this.setSocketHandlers();\n });\n\n if (upgraded && this.expectCapabilityUpdate) {\n await this.run('CAPABILITY');\n }\n\n return upgraded;\n }\n\n async setAuthenticationState() {\n this.state = this.states.AUTHENTICATED;\n this.authenticated = true;\n if (this.expectCapabilityUpdate) {\n // update capabilities\n await this.run('CAPABILITY');\n }\n }\n\n async authenticate() {\n if (this.state === this.states.LOGOUT) {\n throw new AuthenticationFailure('Already logged out');\n }\n\n if (this.state !== this.states.NOT_AUTHENTICATED) {\n // nothing to do here, usually happens with PREAUTH greeting\n return true;\n }\n\n if (!this.options.auth) {\n throw new AuthenticationFailure('Please configure the login');\n }\n\n this.expectCapabilityUpdate = true;\n\n let loginMethod = (this.options.auth.loginMethod || '').toString().trim().toUpperCase();\n if (!loginMethod && /\\\\|\\//.test(this.options.auth.user)) {\n // Special override for MS Exchange when authenticating as some other user or non-email account\n loginMethod = 'LOGIN';\n }\n\n if (this.options.auth.accessToken) {\n this.authenticated = await this.run('AUTHENTICATE', this.options.auth.user, { accessToken: this.options.auth.accessToken });\n } else if (this.options.auth.pass) {\n if ((this.capabilities.has('AUTH=LOGIN') || this.capabilities.has('AUTH=PLAIN')) && loginMethod !== 'LOGIN') {\n this.authenticated = await this.run('AUTHENTICATE', this.options.auth.user, { password: this.options.auth.pass, loginMethod });\n } else {\n if (this.capabilities.has('LOGINDISABLED')) {\n throw new AuthenticationFailure('Login is disabled');\n }\n this.authenticated = await this.run('LOGIN', this.options.auth.user, this.options.auth.pass);\n }\n } else {\n throw new AuthenticationFailure('No password configured');\n }\n\n if (this.authenticated) {\n this.log.info({\n src: 'auth',\n msg: 'User authenticated',\n cid: this.id,\n user: this.options.auth.user\n });\n await this.setAuthenticationState();\n return true;\n }\n\n throw new AuthenticationFailure('No matching authentication method');\n }\n\n async initialOK(message) {\n this.greeting = (message.attributes || [])\n .filter(entry => entry.type === 'TEXT')\n .map(entry => entry.value)\n .filter(entry => entry)\n .join('');\n\n clearTimeout(this.greetingTimeout);\n this.untaggedHandlers.OK = null;\n this.untaggedHandlers.PREAUTH = null;\n\n if (this.isClosed) {\n return;\n }\n\n // get out of current parsing \"thread\", so do not await for startSession\n this.startSession()\n .then(() => {\n if (typeof this.initialResolve === 'function') {\n let resolve = this.initialResolve;\n this.initialResolve = false;\n this.initialReject = false;\n return resolve();\n }\n })\n .catch(err => {\n this.log.error({ err, cid: this.id });\n\n if (typeof this.initialReject === 'function') {\n clearTimeout(this.greetingTimeout);\n let reject = this.initialReject;\n this.initialResolve = false;\n this.initialReject = false;\n return reject(err);\n }\n\n setImmediate(() => this.close());\n });\n }\n\n async initialPREAUTH() {\n clearTimeout(this.greetingTimeout);\n this.untaggedHandlers.OK = null;\n this.untaggedHandlers.PREAUTH = null;\n\n if (this.isClosed) {\n return;\n }\n\n this.state = this.states.AUTHENTICATED;\n\n // get out of current parsing \"thread\", so do not await for startSession\n this.startSession()\n .then(() => {\n if (typeof this.initialResolve === 'function') {\n let resolve = this.initialResolve;\n this.initialResolve = false;\n this.initialReject = false;\n return resolve();\n }\n })\n .catch(err => {\n this.log.error({ err, cid: this.id });\n\n if (typeof this.initialReject === 'function') {\n clearTimeout(this.greetingTimeout);\n let reject = this.initialReject;\n this.initialResolve = false;\n this.initialReject = false;\n return reject(err);\n }\n\n setImmediate(() => this.close());\n });\n }\n\n async serverBye() {\n this.untaggedHandlers.BYE = null;\n this.state = this.states.LOGOUT;\n }\n\n async sectionCapability(section) {\n this.rawCapabilities = section;\n this.capabilities = updateCapabilities(section);\n\n if (this.capabilities) {\n for (let [capa] of this.capabilities) {\n if (/^AUTH=/i.test(capa) && !this.authCapabilities.has(capa.toUpperCase())) {\n this.authCapabilities.set(capa.toUpperCase(), false);\n }\n }\n }\n\n if (this.expectCapabilityUpdate) {\n this.expectCapabilityUpdate = false;\n }\n }\n\n async untaggedCapability(untagged) {\n this.rawCapabilities = untagged.attributes;\n this.capabilities = updateCapabilities(untagged.attributes);\n\n if (this.capabilities) {\n for (let [capa] of this.capabilities) {\n if (/^AUTH=/i.test(capa) && !this.authCapabilities.has(capa.toUpperCase())) {\n this.authCapabilities.set(capa.toUpperCase(), false);\n }\n }\n }\n\n if (this.expectCapabilityUpdate) {\n this.expectCapabilityUpdate = false;\n }\n }\n\n async untaggedExists(untagged) {\n if (!this.mailbox) {\n // mailbox closed, ignore\n return;\n }\n\n if (!untagged || !untagged.command || isNaN(untagged.command)) {\n return;\n }\n\n let count = Number(untagged.command);\n if (count === this.mailbox.exists) {\n // nothing changed?\n return;\n }\n\n // keep exists up to date\n let prevCount = this.mailbox.exists;\n this.mailbox.exists = count;\n this.emit('exists', {\n path: this.mailbox.path,\n count,\n prevCount\n });\n }\n\n async untaggedExpunge(untagged) {\n if (!this.mailbox) {\n // mailbox closed, ignore\n return;\n }\n\n if (!untagged || !untagged.command || isNaN(untagged.command)) {\n return;\n }\n\n let seq = Number(untagged.command);\n if (seq && seq <= this.mailbox.exists) {\n this.mailbox.exists--;\n let payload = {\n path: this.mailbox.path,\n seq,\n vanished: false\n };\n\n if (typeof this.options.expungeHandler === 'function') {\n try {\n await this.options.expungeHandler(payload);\n } catch (err) {\n this.log.error({ msg: 'Failed to notify expunge event', payload, error: err, cid: this.id });\n }\n } else {\n this.emit('expunge', payload);\n }\n }\n }\n\n async untaggedVanished(untagged, mailbox) {\n mailbox = mailbox || this.mailbox;\n if (!mailbox) {\n // mailbox closed, ignore\n return;\n }\n\n let tags = [];\n let uids = false;\n\n if (untagged.attributes.length > 1 && Array.isArray(untagged.attributes[0])) {\n tags = untagged.attributes[0].map(entry => (typeof entry.value === 'string' ? entry.value.toUpperCase() : false)).filter(value => value);\n untagged.attributes.shift();\n }\n\n if (untagged.attributes[0] && typeof untagged.attributes[0].value === 'string') {\n uids = untagged.attributes[0].value;\n }\n\n let uidList = expandRange(uids);\n\n for (let uid of uidList) {\n let payload = {\n path: mailbox.path,\n uid,\n vanished: true,\n earlier: tags.includes('EARLIER')\n };\n\n if (typeof this.options.expungeHandler === 'function') {\n try {\n await this.options.expungeHandler(payload);\n } catch (err) {\n this.log.error({ msg: 'Failed to notify expunge event', payload, error: err, cid: this.id });\n }\n } else {\n this.emit('expunge', payload);\n }\n }\n }\n\n async untaggedFetch(untagged, mailbox) {\n mailbox = mailbox || this.mailbox;\n if (!mailbox) {\n // mailbox closed, ignore\n return;\n }\n\n let message = await formatMessageResponse(untagged, mailbox);\n if (message.flags) {\n let updateEvent = {\n path: mailbox.path,\n seq: message.seq\n };\n\n if (message.uid) {\n updateEvent.uid = message.uid;\n }\n\n if (message.modseq) {\n updateEvent.modseq = message.modseq;\n }\n\n updateEvent.flags = message.flags;\n\n if (message.flagColor) {\n updateEvent.flagColor = message.flagColor;\n }\n\n this.emit('flags', updateEvent);\n }\n }\n\n async ensureSelectedMailbox(path) {\n if (!path) {\n return false;\n }\n\n if ((!this.mailbox && path) || (this.mailbox && path && !comparePaths(this, this.mailbox.path, path))) {\n return await this.mailboxOpen(path);\n }\n\n return true;\n }\n\n async resolveRange(range, options) {\n if (typeof range === 'number' || typeof range === 'bigint') {\n range = range.toString();\n }\n\n // special case, some servers allow this, some do not, so replace it with the last known EXISTS value\n if (range === '*') {\n if (!this.mailbox.exists) {\n return false;\n }\n range = this.mailbox.exists.toString();\n options.uid = false; // sequence query\n }\n\n if (range && typeof range === 'object' && !Array.isArray(range)) {\n if (range.all && Object.keys(range).length === 1) {\n range = '1:*';\n } else if (range.uid && Object.keys(range).length === 1) {\n range = range.uid;\n options.uid = true;\n } else {\n // resolve range by searching\n options.uid = true; // force UIDs instead of sequence numbers\n range = await this.run('SEARCH', range, options);\n if (range && range.length) {\n range = packMessageRange(range);\n }\n }\n }\n\n if (Array.isArray(range)) {\n range = range.join(',');\n }\n\n if (!range) {\n return false;\n }\n\n return range;\n }\n\n autoidle() {\n clearTimeout(this.idleStartTimer);\n if (this.options.disableAutoIdle || this.state !== this.states.SELECTED) {\n return;\n }\n this.idleStartTimer = setTimeout(() => {\n this.idle().catch(err => this.log.warn({ err, cid: this.id }));\n }, 15 * 1000);\n }\n\n // PUBLIC API METHODS\n\n /**\n * Initiates a connection against IMAP server. Throws if anything goes wrong. This is something you have to call before you can run any IMAP commands\n *\n * @returns {Promise<void>}\n * @throws Will throw an error if connection or authentication fails\n * @example\n * let client = new ImapFlow({...});\n * await client.connect();\n */\n async connect() {\n if (this._connectCalled) {\n // Prevent re-using ImapFlow instances by allowing to call connect just once.\n throw new Error('Can not re-use ImapFlow instance');\n }\n this._connectCalled = true;\n\n let connector = this.secureConnection ? tls : net;\n\n let opts = Object.assign(\n {\n host: this.host,\n servername: this.servername,\n port: this.port\n },\n this.options.tls || {}\n );\n\n this.untaggedHandlers.OK = (...args) => this.initialOK(...args);\n this.untaggedHandlers.BYE = (...args) => this.serverBye(...args);\n this.untaggedHandlers.PREAUTH = (...args) => this.initialPREAUTH(...args);\n\n this.untaggedHandlers.CAPABILITY = (...args) => this.untaggedCapability(...args);\n this.sectionHandlers.CAPABILITY = (...args) => this.sectionCapability(...args);\n\n this.untaggedHandlers.EXISTS = (...args) => this.untaggedExists(...args);\n this.untaggedHandlers.EXPUNGE = (...args) => this.untaggedExpunge(...args);\n\n // these methods take an optional second argument, so make sure that some random IMAP tag is not used as the second argument\n this.untaggedHandlers.FETCH = untagged => this.untaggedFetch(untagged);\n this.untaggedHandlers.VANISHED = untagged => this.untaggedVanished(untagged);\n\n let socket = false;\n if (this.options.proxy) {\n try {\n socket = await proxyConnection(this.log, this.options.proxy, this.host, this.port);\n if (!socket) {\n throw new Error('Failed to setup proxy connection');\n }\n } catch (err) {\n let error = new Error('Failed to setup proxy connection');\n error.code = err.code || 'ProxyError';\n error._err = err;\n this.log.error({ error, cid: this.id });\n throw error;\n }\n }\n\n await new Promise((resolve, reject) => {\n this.connectTimeout = setTimeout(() => {\n let err = new Error('Failed to establish connection in required time');\n err.code = 'CONNECT_TIMEOUT';\n err.details = {\n connectionTimeout: this.options.connectionTimeout || CONNECT_TIMEOUT\n };\n this.log.error({ err, cid: this.id });\n setImmediate(() => this.close());\n reject(err);\n }, this.options.connectionTimeout || CONNECT_TIMEOUT);\n\n let onConnect = () => {\n clearTimeout(this.connectTimeout);\n this.socket.setKeepAlive(true, 5 * 1000);\n this.socket.setTimeout(this.options.socketTimeout || SOCKET_TIMEOUT);\n\n this.greetingTimeout = setTimeout(() => {\n let err = new Error(`Failed to receive greeting from server in required time${!this.secureConnection ? '. Maybe should use TLS?' : ''}`);\n err.code = 'GREETING_TIMEOUT';\n err.details = {\n greetingTimeout: this.options.greetingTimeout || GREETING_TIMEOUT\n };\n this.log.error({ err, cid: this.id });\n setImmediate(() => this.close());\n reject(err);\n }, this.options.greetingTimeout || GREETING_TIMEOUT);\n\n this.tls = typeof this.socket.getCipher === 'function' ? this.socket.getCipher() : false;\n\n let logInfo = {\n src: 'connection',\n msg: `Established ${this.tls ? 'secure ' : ''}TCP connection`,\n cid: this.id,\n secure: !!this.tls,\n host: this.host,\n servername: this.servername,\n port: this.socket.remotePort,\n address: this.socket.remoteAddress,\n localAddress: this.socket.localAddress,\n localPort: this.socket.localPort\n };\n\n if (this.tls) {\n logInfo.authorized = this.tls.authorized = this.socket.authorized;\n logInfo.algo = this.tls.standardName || this.tls.name;\n logInfo.version = this.tls.version;\n }\n\n this.log.info(logInfo);\n\n this.setSocketHandlers();\n this.socket.pipe(this.streamer);\n\n // executed by initial \"* OK\"\n this.initialResolve = resolve;\n this.initialReject = reject;\n };\n\n if (socket) {\n // socket is already established via proxy\n if (this.secureConnection) {\n // TLS socket requires a handshake\n opts.socket = socket;\n this.socket = connector.connect(opts, onConnect);\n } else {\n // cleartext socket is already usable\n this.socket = socket;\n setImmediate(onConnect);\n }\n } else {\n this.socket = connector.connect(opts, onConnect);\n }\n\n this.writeSocket = this.socket;\n\n this.socket.on('error', err => {\n clearTimeout(this.connectTimeout);\n clearTimeout(this.greetingTimeout);\n setImmediate(() => this.close());\n this.log.error({ err, cid: this.id });\n reject(err);\n });\n\n this.setEventHandlers();\n });\n }\n\n /**\n * Graceful connection close by sending logout command to server. TCP connection is closed once command is finished.\n *\n * @return {Promise<void>}\n * @example\n * let client = new ImapFlow({...});\n * await client.connect();\n * ...\n * await client.logout();\n */\n async logout() {\n return await this.run('LOGOUT');\n }\n\n /**\n * Closes TCP connection without notifying the server.\n *\n * @example\n * let client = new ImapFlow({...});\n * await client.connect();\n * ...\n * client.close();\n */\n close() {\n // clear pending timers\n clearTimeout(this.idleStartTimer);\n clearTimeout(this.upgradeTimeout);\n clearTimeout(this.connectTimeout);\n\n this.usable = false;\n this.idling = false;\n\n if (typeof this.initialReject === 'function' && !this.options.verifyOnly) {\n clearTimeout(this.greetingTimeout);\n let reject = this.initialReject;\n this.initialResolve = false;\n this.initialReject = false;\n let err = new Error('Unexpected close');\n err.code = `ClosedAfterConnect${this.secureConnection ? 'TLS' : 'Text'}`;\n // still has to go through the logic below\n setImmediate(() => reject(err));\n }\n\n if (typeof this.preCheck === 'function') {\n this.preCheck().catch(err => this.log.warn({ err, cid: this.id }));\n }\n\n // reject command that is currently processed\n if (this.currentRequest && this.requestTagMap.has(this.currentRequest.tag)) {\n let request = this.requestTagMap.get(this.currentRequest.tag);\n if (request) {\n this.requestTagMap.delete(request.tag);\n const error = new Error('Connection not available');\n error.code = 'NoConnection';\n request.reject(error);\n }\n this.currentRequest = false;\n }\n\n // reject all other pending commands\n while (this.requestQueue.length) {\n let req = this.requestQueue.shift();\n if (req && this.requestTagMap.has(req.tag)) {\n let request = this.requestTagMap.get(req.tag);\n if (request) {\n this.requestTagMap.delete(request.tag);\n const error = new Error('Connection not available');\n error.code = 'NoConnection';\n request.reject(error);\n }\n }\n }\n\n this.state = this.states.LOGOUT;\n if (this.isClosed) {\n return;\n }\n this.isClosed = true;\n\n if (this.writeSocket && !this.writeSocket.destroyed) {\n try {\n this.writeSocket.destroy();\n } catch (err) {\n this.log.error({ err, cid: this.id });\n }\n }\n\n if (this.socket && !this.socket.destroyed && this.writeSocket !== this.socket) {\n try {\n this.socket.destroy();\n } catch (err) {\n this.log.error({ err, cid: this.id });\n }\n }\n\n this.log.trace({ msg: 'Connection closed', cid: this.id });\n this.emit('close');\n }\n\n /**\n * @typedef {Object} QuotaResponse\n * @global\n * @property {String} path=INBOX mailbox path this quota applies to\n * @property {Object} [storage] Storage quota if provided by server\n * @property {Number} [storage.used] used storage in bytes\n * @property {Number} [storage.limit] total storage available\n * @property {Object} [messages] Message count quota if provided by server\n * @property {Number} [messages.used] stored messages\n * @property {Number} [messages.limit] maximum messages allowed\n */\n\n /**\n * Returns current quota\n *\n * @param {String} [path] Optional mailbox path if you want to check quota for specific folder\n * @returns {Promise<QuotaResponse|Boolean>} Quota information or `false` if QUTOA extension is not supported or requested path does not exist\n *\n * @example\n * let quota = await client.getQuota();\n * console.log(quota.storage.used, quota.storage.available)\n */\n async getQuota(path) {\n path = path || 'INBOX';\n return await this.run('QUOTA', path);\n }\n\n /**\n * @typedef {Object} ListResponse\n * @global\n * @property {String} path mailbox path (unicode string)\n * @property {String} pathAsListed mailbox path as listed in the LIST/LSUB response\n * @property {String} name mailbox name (last part of path after delimiter)\n * @property {String} delimiter mailbox path delimiter, usually \".\" or \"/\"\n * @property {String[]} parent An array of parent folder names. All names are in unicode\n * @property {String} parentPath Same as `parent`, but as a complete string path (unicode string)\n * @property {Set<string>} flags a set of flags for this mailbox\n * @property {String} specialUse one of special-use flags (if applicable): \"\\All\", \"\\Archive\", \"\\Drafts\", \"\\Flagged\", \"\\Junk\", \"\\Sent\", \"\\Trash\". Additionally INBOX has non-standard \"\\Inbox\" flag set\n * @property {Boolean} listed `true` if mailbox was found from the output of LIST command\n * @property {Boolean} subscribed `true` if mailbox was found from the output of LSUB command\n * @property {StatusObject} [status] If `statusQuery` was used, then this value includes the status response\n */\n\n /**\n * @typedef {Object} ListOptions\n * @global\n * @property {Object} [statusQuery] request status items for every listed entry\n * @property {Boolean} [statusQuery.messages] if `true` request count of messages\n * @property {Boolean} [statusQuery.recent] if `true` request count of messages with \\\\Recent tag\n * @property {Boolean} [statusQuery.uidNext] if `true` request predicted next UID\n * @property {Boolean} [statusQuery.uidValidity] if `true` request mailbox `UIDVALIDITY` value\n * @property {Boolean} [statusQuery.unseen] if `true` request count of unseen messages\n * @property {Boolean} [statusQuery.highestModseq] if `true` request last known modseq value\n * @property {Object} [specialUseHints] set specific paths as special use folders, this would override special use flags provided from the server\n * @property {String} [specialUseHints.sent] Path to \"Sent Mail\" folder\n * @property {String} [specialUseHints.trash] Path to \"Trash\" folder\n * @property {String} [specialUseHints.junk] Path to \"Junk Mail\" folder\n * @property {String} [specialUseHints.drafts] Path to \"Drafts\" folder\n */\n\n /**\n * Lists available mailboxes as an Array\n *\n * @param {ListOptions} [options] defines additional listing options\n * @returns {Promise<ListResponse[]>} An array of ListResponse objects\n *\n * @example\n * let list = await client.list();\n * list.forEach(mailbox=>console.log(mailbox.path));\n */\n async list(options) {\n options = options || {};\n let folders = await this.run('LIST', '', '*', options);\n this.folders = new Map(folders.map(folder => [folder.path, folder]));\n return folders;\n }\n\n /**\n * @typedef {Object} ListTreeResponse\n * @global\n * @property {Boolean} root If `true` then this is root node without any additional properties besides *folders*\n * @property {String} path mailbox path\n * @property {String} name mailbox name (last part of path after delimiter)\n * @property {String} delimiter mailbox path delimiter, usually \".\" or \"/\"\n * @property {String[]} flags list of flags for this mailbox\n * @property {String} specialUse one of special-use flags (if applicable): \"\\All\", \"\\Archive\", \"\\Drafts\", \"\\Flagged\", \"\\Junk\", \"\\Sent\", \"\\Trash\". Additionally INBOX has non-standard \"\\Inbox\" flag set\n * @property {Boolean} listed `true` if mailbox was found from the output of LIST command\n * @property {Boolean} subscribed `true` if mailbox was found from the output of LSUB command\n * @property {Boolean} disabled If `true` then this mailbox can not be selected in the UI\n * @property {ListTreeResponse[]} folders An array of subfolders\n */\n\n /**\n * Lists available mailboxes as a tree structured object\n *\n * @param {ListOptions} [options] defines additional listing options\n * @returns {Promise<ListTreeResponse>} Tree structured object\n *\n * @example\n * let tree = await client.listTree();\n * tree.folders.forEach(mailbox=>console.log(mailbox.path));\n */\n async listTree(options) {\n options = options || {};\n let folders = await this.run('LIST', '', '*', options);\n this.folders = new Map(folders.map(folder => [folder.path, folder]));\n return getFolderTree(folders);\n }\n\n /**\n * Performs a no-op call against server\n * @returns {Promise<void>}\n */\n async noop() {\n await this.run('NOOP');\n }\n\n /**\n * @typedef {Object} MailboxCreateResponse\n * @global\n * @property {String} path full mailbox path\n * @property {String} [mailboxId] unique mailbox ID if server supports `OBJECTID` extension (currently Yahoo and some others)\n * @property {Boolean} created If `true` then mailbox was created otherwise it already existed\n */\n\n /**\n * Creates a new mailbox folder and sets up subscription for the created mailbox. Throws on error.\n *\n * @param {string|array} path Full mailbox path. Unicode is allowed. If value is an array then it is joined using current delimiter symbols. Namespace prefix is added automatically if required.\n * @returns {Promise<MailboxCreateResponse>} Mailbox info\n * @throws Will throw an error if mailbox can not be created\n *\n * @example\n * let info = await client.mailboxCreate(['parent', 'child']);\n * console.log(info.path);\n * // \"INBOX.parent.child\" // assumes \"INBOX.\" as namespace prefix and \".\" as delimiter\n */\n async mailboxCreate(path) {\n return await this.run('CREATE', path);\n }\n\n /**\n * @typedef {Object} MailboxRenameResponse\n * @global\n * @property {String} path full mailbox path that was renamed\n * @property {String} newPath new full mailbox path\n */\n\n /**\n * Renames a mailbox. Throws on error.\n *\n * @param {string|array} path Path for the mailbox to rename. Unicode is allowed. If value is an array then it is joined using current delimiter symbols. Namespace prefix is added automatically if required.\n * @param {string|array} newPath New path for the mailbox\n * @returns {Promise<MailboxRenameResponse>} Mailbox info\n * @throws Will throw an error if mailbox does not exist or can not be renamed\n *\n * @example\n * let info = await client.mailboxRename('parent.child', 'Important stuff ❗️');\n * console.log(info.newPath);\n * // \"INBOX.Important stuff ❗️\" // assumes \"INBOX.\" as namespace prefix\n */\n async mailboxRename(path, newPath) {\n return await this.run('RENAME', path, newPath);\n }\n\n /**\n * @typedef {Object} MailboxDeleteResponse\n * @global\n * @property {String} path full mailbox path that was deleted\n */\n\n /**\n * Deletes a mailbox. Throws on error.\n *\n * @param {string|array} path Path for the mailbox to delete. Unicode is allowed. If value is an array then it is joined using current delimiter symbols. Namespace prefix is added automatically if required.\n * @returns {Promise<MailboxDeleteResponse>} Mailbox info\n * @throws Will throw an error if mailbox does not exist or can not be deleted\n *\n * @example\n * let info = await client.mailboxDelete('Important stuff ❗️');\n * console.log(info.path);\n * // \"INBOX.Important stuff ❗️\" // assumes \"INBOX.\" as namespace prefix\n */\n async mailboxDelete(path) {\n return await this.run('DELETE', path);\n }\n\n /**\n * Subscribes to a mailbox\n *\n * @param {string|array} path Path for the mailbox to subscribe to. Unicode is allowed. If value is an array then it is joined using current delimiter symbols. Namespace prefix is added automatically if required.\n * @returns {Promise<Boolean>} `true` if subscription operation succeeded, `false` otherwise\n *\n * @example\n * await client.mailboxSubscribe('Important stuff ❗️');\n */\n async mailboxSubscribe(path) {\n return await this.run('SUBSCRIBE', path);\n }\n\n /**\n * Unsubscribes from a mailbox\n *\n * @param {string|array} path **Path for the mailbox** to unsubscribe from. Unicode is allowed. If value is an array then it is joined using current delimiter symbols. Namespace prefix is added automatically if required.\n * @returns {Promise<Boolean>} `true` if unsubscription operation succeeded, `false` otherwise\n *\n * @example\n * await client.mailboxUnsubscribe('Important stuff ❗️');\n */\n async mailboxUnsubscribe(path) {\n return await this.run('UNSUBSCRIBE', path);\n }\n\n /**\n * Opens a mailbox to access messages. You can perform message operations only against an opened mailbox.\n * Using {@link module:imapflow~ImapFlow#getMailboxLock|getMailboxLock()} instead of `mailboxOpen()` is preferred. Both do the same thing\n * but next `getMailboxLock()` call is not executed until previous one is released.\n *\n * @param {string|array} path **Path for the mailbox** to open\n * @param {Object} [options] optional options\n * @param {Boolean} [options.readOnly=false] If `true` then opens mailbox in read-only mode. You can still try to perform write operations but these would probably fail.\n * @returns {Promise<MailboxObject>} Mailbox info\n * @throws Will throw an error if mailbox does not exist or can not be opened\n *\n * @example\n * let mailbox = await client.mailboxOpen('Important stuff ❗️');\n * console.log(mailbox.exists);\n * // 125\n */\n async mailboxOpen(path, options) {\n return await this.run('SELECT', path, options);\n }\n\n /**\n * Closes a previously opened mailbox\n *\n * @returns {Promise<Boolean>} Did the operation succeed or not\n *\n * @example\n * let mailbox = await client.mailboxOpen('INBOX');\n * await client.mailboxClose();\n */\n async mailboxClose() {\n return await this.run('CLOSE');\n }\n\n /**\n * @typedef {Object} StatusObject\n * @global\n * @property {String} path full mailbox path that was checked\n * @property {Number} [messages] Count of messages\n * @property {Number} [recent] Count of messages with \\\\Recent tag\n * @property {Number} [uidNext] Predicted next UID\n * @property {BigInt} [uidValidity] Mailbox `UIDVALIDITY` value\n * @property {Number} [unseen] Count of unseen messages\n * @property {BigInt} [highestModseq] Last known modseq value (if CONDSTORE extension is enabled)\n */\n\n /**\n * Requests the status of the indicated mailbox. Only requested status values will be returned.\n *\n * @param {String} path mailbox path to check for (unicode string)\n * @param {Object} query defines requested status items\n * @param {Boolean} query.messages if `true` request count of messages\n * @param {Boolean} query.recent if `true` request count of messages with \\\\Recent tag\n * @param {Boolean} query.uidNext if `true` request predicted next UID\n * @param {Boolean} query.uidValidity if `true` request mailbox `UIDVALIDITY` value\n * @param {Boolean} query.unseen if `true` request count of unseen messages\n * @param {Boolean} query.highestModseq if `true` request last known modseq value\n * @returns {Promise<StatusObject>} status of the indicated mailbox\n *\n * @example\n * let status = await client.status('INBOX', {unseen: true});\n * console.log(status.unseen);\n * // 123\n */\n async status(path, query) {\n return await this.run('STATUS', path, query);\n }\n\n /**\n * Starts listening for new or deleted messages from the currently opened mailbox. Only required if {@link ImapFlow#disableAutoIdle} is set to `true`\n * otherwise IDLE is started by default on connection inactivity. NB! If `idle()` is called manually then it does not\n * return until IDLE is finished which means you would have to call some other command out of scope.\n *\n * @returns {Promise<Boolean>} Did the operation succeed or not\n *\n * @example\n * let mailbox = await client.mailboxOpen('INBOX');\n *\n * await client.idle();\n */\n async idle() {\n if (!this.idling) {\n return await this.run('IDLE', this.maxIdleTime);\n }\n }\n\n /**\n * Sequence range string. Separate different values with commas, number ranges with colons and use \\\\* as the placeholder for the newest message in mailbox\n * @typedef {String} SequenceString\n * @global\n * @example\n * \"1:*\" // for all messages\n * \"1,2,3\" // for messages 1, 2 and 3\n * \"1,2,4:6\" // for messages 1,2,4,5,6\n * \"*\" // for the newest message\n */\n\n /**\n * IMAP search query options. By default all conditions must match. In case of `or` query term at least one condition must match.\n * @typedef {Object} SearchObject\n * @global\n * @property {SequenceString} [seq] message ordering sequence range\n * @property {Boolean} [answered] Messages with (value is `true`) or without (value is `false`) \\\\Answered flag\n * @property {Boolean} [deleted] Messages with (value is `true`) or without (value is `false`) \\\\Deleted flag\n * @property {Boolean} [draft] Messages with (value is `true`) or without (value is `false`) \\\\Draft flag\n * @property {Boolean} [flagged] Messages with (value is `true`) or without (value is `false`) \\\\Flagged flag\n * @property {Boolean} [seen] Messages with (value is `true`) or without (value is `false`) \\\\Seen flag\n * @property {Boolean} [all] If `true` matches all messages\n * @property {Boolean} [new] If `true` matches messages that have the \\\\Recent flag set but not the \\\\Seen flag\n * @property {Boolean} [old] If `true` matches messages that do not have the \\\\Recent flag set\n * @property {Boolean} [recent] If `true` matches messages that have the \\\\Recent flag set\n * @property {String} [from] Matches From: address field\n * @property {String} [to] Matches To: address field\n * @property {String} [cc] Matches Cc: address field\n * @property {String} [bcc] Matches Bcc: address field\n * @property {String} [body] Matches message body\n * @property {String} [subject] Matches message subject\n * @property {Number} [larger] Matches messages larger than value\n * @property {Number} [smaller] Matches messages smaller than value\n * @property {SequenceString} [uid] UID sequence range\n * @property {BigInt} [modseq] Matches messages with modseq higher than value\n * @property {String} [emailId] unique email ID. Only used if server supports `OBJECTID` or `X-GM-EXT-1` extensions\n * @property {String} [threadId] unique thread ID. Only used if server supports `OBJECTID` or `X-GM-EXT-1` extensions\n * @property {Date|string} [before] Matches messages received before date\n * @property {Date|string} [on] Matches messages received on date (ignores time)\n * @property {Date|string} [since] Matches messages received after date\n * @property {Date|string} [sentBefore] Matches messages sent before date\n * @property {Date|string} [sentOn] Matches messages sent on date (ignores time)\n * @property {Date|string} [sentSince] Matches messages sent after date\n * @property {String} [keyword] Matches messages that have the custom flag set\n * @property {String} [unKeyword] Matches messages that do not have the custom flag set\n * @property {Object.<string, Boolean|String>} [header] Matches messages with header key set if value is `true` (**NB!** not supported by all servers) or messages where header partially matches a string value\n * @property {SearchObject[]} [or] An array of 2 or more {@link SearchObject} objects. At least on of these must match\n */\n\n /**\n * Sets flags for a message or message range\n *\n * @param {SequenceString | Number[] | SearchObject} range Range to filter the messages\n * @param {string[]} Array of flags to set. Only flags that are permitted to set are used, other flags are ignored\n * @param {Object} [options]\n * @param {Boolean} [options.uid] If `true` then uses UID {@link SequenceString} instead of sequence numbers\n * @param {BigInt} [options.unchangedSince] If set then only messages with a lower or equal `modseq` value are updated. Ignored if server does not support `CONDSTORE` extension.\n * @param {Boolean} [options.useLabels=false] If true then update Gmail labels instead of message flags\n * @returns {Promise<Boolean>} Did the operation succeed or not\n *\n * @example\n * let mailbox = await client.mailboxOpen('INBOX');\n * // mark all unseen messages as seen (and remove other flags)\n * await client.messageFlagsSet({seen: false}, ['\\Seen]);\n */\n async messageFlagsSet(range, flags, options) {\n options = options || {};\n\n range = await this.resolveRange(range, options);\n if (!range) {\n return false;\n }\n\n let queryOpts = Object.assign(\n {\n operation: 'set'\n },\n options\n );\n\n return await this.run('STORE', range, flags, queryOpts);\n }\n\n /**\n * Adds flags for a message or message range\n *\n * @param {SequenceString | Number[] | SearchObject} range Range to filter the messages\n * @param {string[]} Array of flags to set. Only flags that are permitted to set are used, other flags are ignored\n * @param {Object} [options]\n * @param {Boolean} [options.uid] If `true` then uses UID {@link SequenceString} instead of sequence numbers\n * @param {BigInt} [options.unchangedSince] If set then only messages with a lower or equal `modseq` value are updated. Ignored if server does not support `CONDSTORE` extension.\n * @param {Boolean} [options.useLabels=false] If true then update Gmail labels instead of message flags\n * @returns {Promise<Boolean>} Did the operation succeed or not\n *\n * @example\n * let mailbox = await client.mailboxOpen('INBOX');\n * // mark all unseen messages as seen (and keep other flags as is)\n * await client.messageFlagsAdd({seen: false}, ['\\Seen]);\n */\n async messageFlagsAdd(range, flags, options) {\n options = options || {};\n\n range = await this.resolveRange(range, options);\n if (!range) {\n return false;\n }\n\n let queryOpts = Object.assign(\n {\n operation: 'add'\n },\n options\n );\n\n return await this.run('STORE', range, flags, queryOpts);\n }\n\n /**\n * Remove specific flags from a message or message range\n *\n * @param {SequenceString | Number[] | SearchObject} range Range to filter the messages\n * @param {string[]} Array of flags to remove. Only flags that are permitted to set are used, other flags are ignored\n * @param {Object} [options]\n * @param {Boolean} [options.uid] If `true` then uses UID {@link SequenceString} instead of sequence numbers\n * @param {BigInt} [options.unchangedSince] If set then only messages with a lower or equal `modseq` value are updated. Ignored if server does not support `CONDSTORE` extension.\n * @param {Boolean} [options.useLabels=false] If true then update Gmail labels instead of message flags\n * @returns {Promise<Boolean>} Did the operation succeed or not\n *\n * @example\n * let mailbox = await client.mailboxOpen('INBOX');\n * // mark all seen messages as unseen by removing \\\\Seen flag\n * await client.messageFlagsRemove({seen: true}, ['\\Seen]);\n */\n async messageFlagsRemove(range, flags, options) {\n options = options || {};\n\n range = await this.resolveRange(range, options);\n if (!range) {\n return false;\n }\n\n let queryOpts = Object.assign(\n {\n operation: 'remove'\n },\n options\n );\n\n return await this.run('STORE', range, flags, queryOpts);\n }\n\n /**\n * Sets a colored flag for an email. Only supported by mail clients like Apple Mail\n *\n * @param {SequenceString | Number[] | SearchObject} range Range to filter the messages\n * @param {string} The color to set. One of 'red', 'orange', 'yellow', 'green', 'blue', 'purple', and 'grey'\n * @param {Object} [options]\n * @param {Boolean} [options.uid] If `true` then uses UID {@link SequenceString} instead of sequence numbers\n * @param {BigInt} [options.unchangedSince] If set then only messages with a lower or equal `modseq` value are updated. Ignored if server does not support `CONDSTORE` extension.\n * @returns {Promise<Boolean>} Did the operation succeed or not\n *\n * @example\n * let mailbox = await client.mailboxOpen('INBOX');\n * // add a purple flag for all emails\n * await client.setFlagColor('1:*', 'Purple');\n */\n async setFlagColor(range, color, options) {\n options = options || {};\n\n range = await this.resolveRange(range, options);\n if (!range) {\n return false;\n }\n\n let flagChanges = getColorFlags(color);\n if (!flagChanges) {\n return false;\n }\n\n let addResults;\n let removeResults;\n\n if (flagChanges.add && flagChanges.add.length) {\n let queryOpts = Object.assign(\n {\n operation: 'add'\n },\n options,\n {\n useLabels: false, // override if set\n // prevent triggering a premature Flags change notification\n silent: flagChanges.remove && flagChanges.remove.length\n }\n );\n\n addResults = await this.run('STORE', range, flagChanges.add, queryOpts);\n }\n\n if (flagChanges.remove && flagChanges.remove.length) {\n let queryOpts = Object.assign(\n {\n operation: 'remove'\n },\n options,\n { useLabels: false } // override if set\n );\n\n removeResults = await this.run('STORE', range, flagChanges.remove, queryOpts);\n }\n\n return addResults || removeResults || false;\n }\n\n /**\n * Delete messages from the currently opened mailbox. Method does not indicate info about deleted messages,\n * instead you should be using {@link ImapFlow#expunge} event for this\n *\n * @param {SequenceString | Number[] | SearchObject} range Range to filter the messages\n * @param {Object} [options]\n * @param {Boolean} [options.uid] If `true` then uses UID {@link SequenceString} instead of sequence numbers\n * @returns {Promise<Boolean>} Did the operation succeed or not\n *\n * @example\n * let mailbox = await client.mailboxOpen('INBOX');\n * // delete all seen messages\n * await client.messageDelete({seen: true});\n */\n async messageDelete(range, options) {\n options = options || {};\n range = await this.resolveRange(range, options);\n if (!range) {\n return false;\n }\n return await this.run('EXPUNGE', range, options);\n }\n\n /**\n * @typedef {Object} AppendResponseObject\n * @global\n * @property {String} destination full mailbox path where the message was uploaded to\n * @property {BigInt} [uidValidity] mailbox `UIDVALIDITY` if server has `UIDPLUS` extension enabled\n * @property {Number} [uid] UID of the uploaded message if server has `UIDPLUS` extension enabled\n * @property {Number} [seq] sequence number of the uploaded message if path is currently selected mailbox\n */\n\n /**\n * Appends a new message to a mailbox\n *\n * @param {String} path Mailbox path to upload the message to (unicode string)\n * @param {string|Buffer} content RFC822 formatted email message\n * @param {string[]} [flags] an array of flags to be set for the uploaded message\n * @param {Date|string} [idate=now] internal date to be set for the message\n * @returns {Promise<AppendResponseObject>} info about uploaded message\n *\n * @example\n * await client.append('INBOX', rawMessageBuffer, ['\\\\Seen'], new Date(2000, 1, 1));\n */\n async append(path, content, flags, idate) {\n let response = await this.run('APPEND', path, content, flags, idate);\n\n if (!response) {\n return false;\n }\n\n return response;\n }\n\n /**\n * @typedef {Object} CopyResponseObject\n * @global\n * @property {String} path path of source mailbox\n * @property {String} destination path of destination mailbox\n * @property {BigInt} [uidValidity] destination mailbox `UIDVALIDITY` if server has `UIDPLUS` extension enabled\n * @property {Map<number, number>} [uidMap] Map of UID values (if server has `UIDPLUS` extension enabled) where key is UID in source mailbox and value is the UID for the same message in destination mailbox\n */\n\n /**\n * Copies messages from current mailbox to destination mailbox\n *\n * @param {SequenceString | Number[] | SearchObject} range Range of messages to copy\n * @param {String} destination Mailbox path to copy the messages to\n * @param {Object} [options]\n * @param {Boolean} [options.uid] If `true` then uses UID {@link SequenceString} instead of sequence numbers\n * @returns {Promise<CopyResponseObject>} info about copies messages\n *\n * @example\n * await client.mailboxOpen('INBOX');\n * // copy all messages to a mailbox called \"Backup\" (must exist)\n * let result = await client.messageCopy('1:*', 'Backup');\n * console.log('Copied %s messages', result.uidMap.size);\n */\n async messageCopy(range, destination, options) {\n options = options || {};\n range = await this.resolveRange(range, options);\n if (!range) {\n return false;\n }\n return await this.run('COPY', range, destination, options);\n }\n\n /**\n * Moves messages from current mailbox to destination mailbox\n *\n * @param {SequenceString | Number[] | SearchObject} range Range of messages to move\n * @param {String} destination Mailbox path to move the messages to\n * @param {Object} [options]\n * @param {Boolean} [options.uid] If `true` then uses UID {@link SequenceString} instead of sequence numbers\n * @returns {Promise<CopyResponseObject>} info about moved messages\n *\n * @example\n * await client.mailboxOpen('INBOX');\n * // move all messages to a mailbox called \"Trash\" (must exist)\n * let result = await client.messageMove('1:*', 'Trash');\n * console.log('Moved %s messages', result.uidMap.size);\n */\n async messageMove(range, destination, options) {\n options = options || {};\n range = await this.resolveRange(range, options);\n if (!range) {\n return false;\n }\n return await this.run('MOVE', range, destination, options);\n }\n\n /**\n * Search messages from the currently opened mailbox\n *\n * @param {SearchObject} query Query to filter the messages\n * @param {Object} [options]\n * @param {Boolean} [options.uid] If `true` then returns UID numbers instead of sequence numbers\n * @returns {Promise<Number[]>} An array of sequence or UID numbers\n *\n * @example\n * let mailbox = await client.mailboxOpen('INBOX');\n * // find all unseen messages\n * let list = await client.search({seen: false});\n * // use OR modifier (array of 2 or more search queries)\n * let list = await client.search({\n * seen: false,\n * or: [\n * {flagged: true},\n * {from: 'andris'},\n * {subject: 'test'}\n * ]});\n */\n async search(query, options) {\n if (!this.mailbox) {\n // no mailbox selected, nothing to do\n return;\n }\n\n let response = await this.run('SEARCH', query, options);\n\n if (!response) {\n return false;\n }\n\n return response;\n }\n\n /**\n * @typedef {Object} FetchQueryObject\n * @global\n * @property {Boolean} [uid] if `true` then include UID in the response\n * @property {Boolean} [flags] if `true` then include flags Set in the response. Also adds `flagColor` to the response if the message is flagged.\n * @property {Boolean} [bodyStructure] if `true` then include parsed BODYSTRUCTURE object in the response\n * @property {Boolean} [envelope] if `true` then include parsed ENVELOPE object in the response\n * @property {Boolean} [internalDate] if `true` then include internal date value in the response\n * @property {Boolean} [size] if `true` then include message size in the response\n * @property {boolean | Object} [source] if `true` then include full message in the response\n * @property {Number} [source.start] include full message in the response starting from *start* byte\n * @property {Number} [source.maxLength] include full message in the response, up to *maxLength* bytes\n * @property {String} [threadId] if `true` then include thread ID in the response (only if server supports either `OBJECTID` or `X-GM-EXT-1` extensions)\n * @property {Boolean} [labels] if `true` then include GMail labels in the response (only if server supports `X-GM-EXT-1` extension)\n * @property {boolean | string[]} [headers] if `true` then includes full headers of the message in the response. If the value is an array of header keys then includes only headers listed in the array\n * @property {string[]} [bodyParts] An array of BODYPART identifiers to include in the response\n */\n\n /**\n * Parsed email address entry\n *\n * @typedef {Object} MessageAddressObject\n * @global\n * @property {String} [name] name of the address object (unicode)\n * @property {String} [address] email address\n */\n\n /**\n * Parsed IMAP ENVELOPE object\n *\n * @typedef {Object} MessageEnvelopeObject\n * @global\n * @property {Date} [date] header date\n * @property {String} [subject] message subject (unicode)\n * @property {String} [messageId] Message ID of the message\n * @property {String} [inReplyTo] Message ID from In-Reply-To header\n * @property {MessageAddressObject[]} [from] Array of addresses from the From: header\n * @property {MessageAddressObject[]} [sender] Array of addresses from the Sender: header\n * @property {MessageAddressObject[]} [replyTo] Array of addresses from the Reply-To: header\n * @property {MessageAddressObject[]} [to] Array of addresses from the To: header\n * @property {MessageAddressObject[]} [cc] Array of addresses from the Cc: header\n * @property {MessageAddressObject[]} [bcc] Array of addresses from the Bcc: header\n */\n\n /**\n * Parsed IMAP BODYSTRUCTURE object\n *\n * @typedef {Object} MessageStructureObject\n * @global\n * @property {String} part Body part number. This value can be used to later fetch the contents of this part of the message\n * @property {String} type Content-Type of this node\n * @property {Object} [parameters] Additional parameters for Content-Type, eg \"charset\"\n * @property {String} [id] Content-ID\n * @property {String} [encoding] Transfer encoding\n * @property {Number} [size] Expected size of the node\n * @property {MessageEnvelopeObject} [envelope] message envelope of embedded RFC822 message\n * @property {String} [disposition] Content disposition\n * @property {Object} [dispositionParameters] Additional parameters for Content-Disposition\n * @property {MessageStructureObject[]} childNodes An array of child nodes if this is a multipart node. Not present for normal nodes\n */\n\n /**\n * Fetched message data\n *\n * @typedef {Object} FetchMessageObject\n * @global\n * @property {Number} seq message sequence number. Always included in the response\n * @property {Number} uid message UID number. Always included in the response\n * @property {Buffer} [source] message source for the requested byte range\n * @property {BigInt} [modseq] message Modseq number. Always included if the server supports CONDSTORE extension\n * @property {String} [emailId] unique email ID. Always included if server supports `OBJECTID` or `X-GM-EXT-1` extensions\n * @property {String} [threadid] unique thread ID. Only present if server supports `OBJECTID` or `X-GM-EXT-1` extension\n * @property {Set<string>} [labels] a Set of labels. Only present if server supports `X-GM-EXT-1` extension\n * @property {Number} [size] message size\n * @property {Set<string>} [flags] a set of message flags\n * @property {String} [flagColor] flag color like \"red\", or \"yellow\". This value is derived from the `flags` Set and it uses the same color rules as Apple Mail\n * @property {MessageEnvelopeObject} [envelope] message envelope\n * @property {MessageStructureObject} [bodyStructure] message body structure\n * @property {Date} [internalDate] message internal date\n * @property {Map<string, Buffer>} [bodyParts] a Map of message body parts where key is requested part identifier and value is a Buffer\n * @property {Buffer} [headers] Requested header lines as Buffer\n */\n\n /**\n * Fetch messages from the currently opened mailbox\n *\n * @param {SequenceString | Number[] | SearchObject} range Range of messages to fetch\n * @param {FetchQueryObject} query Fetch query\n * @param {Object} [options]\n * @param {Boolean} [options.uid] If `true` then uses UID numbers instead of sequence numbers for `range`\n * @param {BigInt} [options.changedSince] If set then only messages with a higher modseq value are returned. Ignored if server does not support `CONDSTORE` extension.\n * @param {Boolean} [options.binary=false] If `true` then requests a binary response if the server supports this\n * @yields {Promise<FetchMessageObject>} Message data object\n *\n * @example\n * let mailbox = await client.mailboxOpen('INBOX');\n * // fetch UID for all messages in a mailbox\n * for await (let msg of client.fetch('1:*', {uid: true})){\n * console.log(msg.uid);\n * // NB! You can not run any IMAP commands in this loop\n * // otherwise you will end up in a deadloop\n * }\n */\n async *fetch(range, query, options) {\n options = options || {};\n\n if (!this.mailbox) {\n // no mailbox selected, nothing to do\n return;\n }\n\n range = await this.resolveRange(range, options);\n if (!range) {\n return false;\n }\n\n let finished = false;\n let push = false;\n let rowQueue = [];\n\n let getNext = () =>\n new Promise((resolve, reject) => {\n let check = () => {\n if (rowQueue.length) {\n let entry = rowQueue.shift();\n if (entry.err) {\n return reject(entry.err);\n } else {\n return resolve(entry.value);\n }\n }\n\n if (finished) {\n return resolve(null);\n }\n\n // wait until data is pushed to queue and try again\n push = () => {\n push = false;\n check();\n };\n };\n check();\n });\n\n this.run('FETCH', range, query, {\n uid: !!options.uid,\n binary: options.binary,\n changedSince: options.changedSince,\n onUntaggedFetch: (untagged, next) => {\n rowQueue.push({\n value: {\n response: untagged,\n next\n }\n });\n if (typeof push === 'function') {\n push();\n }\n }\n })\n .then(() => {\n finished = true;\n if (typeof push === 'function') {\n push();\n }\n })\n .catch(err => {\n rowQueue.push({ err });\n if (typeof push === 'function') {\n push();\n }\n });\n\n let res;\n while ((res = await getNext())) {\n if (this.isClosed || this.socket.destroyed) {\n let error = new Error('Connection closed');\n error.code = 'EConnectionClosed';\n throw error;\n }\n\n if (res !== null) {\n yield res.response;\n res.next();\n }\n }\n\n if (!finished) {\n // FETCH never finished!\n let error = new Error('FETCH did not finish');\n error.code = 'ENotFinished';\n throw error;\n }\n }\n\n /**\n * Fetch messages from the currently opened mailbox.\n *\n * This method will fetch all messages before resolving the promise, unlike .fetch(), which\n * is an async generator. Do not use large ranges like 1:*, as this might exhaust all available\n * memory if the mailbox contains a large number of emails.\n * @param {SequenceString | Number[] | SearchObject} range Range of messages to fetch\n * @param {FetchQueryObject} query Fetch query\n * @param {Object} [options]\n * @param {Boolean} [options.uid] If `true` then uses UID numbers instead of sequence numbers for `range`\n * @param {BigInt} [options.changedSince] If set then only messages with a higher modseq value are returned. Ignored if server does not support `CONDSTORE` extension.\n * @param {Boolean} [options.binary=false] If `true` then requests a binary response if the server supports this\n * @returns {Promise<FetchMessageObject[]>} Array of Message data object\n *\n * @example\n * let mailbox = await client.mailboxOpen('INBOX');\n * // fetch UID for all messages in a mailbox\n * const messages = await client.fetchAll('1:*', {uid: true});\n * for (let msg of messages){\n * console.log(msg.uid);\n * }\n */\n async fetchAll(range, query, options) {\n const results = [];\n const generator = this.fetch(range, query, options);\n for await (const message of generator) {\n results.push(message);\n }\n return results;\n }\n\n /**\n * Fetch a single message from the currently opened mailbox\n *\n * @param {SequenceString} seq Single UID or sequence number of the message to fetch for\n * @param {FetchQueryObject} query Fetch query\n * @param {Object} [options]\n * @param {Boolean} [options.uid] If `true` then uses UID number instead of sequence number for `seq`\n * @param {Boolean} [options.binary=false] If `true` then requests a binary response if the server supports this\n * @returns {Promise<FetchMessageObject>} Message data object\n *\n * @example\n * let mailbox = await client.mailboxOpen('INBOX');\n * // fetch UID for the last email in the selected mailbox\n * let lastMsg = await client.fetchOne('*', {uid: true})\n * console.log(lastMsg.uid);\n */\n async fetchOne(seq, query, options) {\n if (!this.mailbox) {\n // no mailbox selected, nothing to do\n return;\n }\n\n if (seq === '*') {\n if (!this.mailbox.exists) {\n return false;\n }\n seq = this.mailbox.exists.toString();\n options = Object.assign({}, options || {}, { uid: false }); // force into a sequence query\n }\n\n let response = await this.run('FETCH', (seq || '').toString(), query, options);\n\n if (!response || !response.list || !response.list.length) {\n return false;\n }\n\n return response.list[0];\n }\n\n /**\n * @typedef {Object} DownloadObject\n * @global\n * @property {Object} meta content metadata\n * @property {number} meta.expectedSize The fetch response size\n * @property {String} meta.contentType Content-Type of the streamed file. If part was not set then this value is \"message/rfc822\"\n * @property {String} [meta.charset] Charset of the body part. Text parts are automatically converted to UTF-8, attachments are kept as is\n * @property {String} [meta.disposition] Content-Disposition of the streamed file\n * @property {String} [meta.filename] Filename of the streamed body part\n * @property {ReadableStream} content Streamed content\n */\n\n /**\n * Download either full rfc822 formatted message or a specific bodystructure part as a Stream.\n * Bodystructure parts are decoded so the resulting stream is a binary file. Text content\n * is automatically converted to UTF-8 charset.\n *\n * @param {SequenceString} range UID or sequence number for the message to fetch\n * @param {String} [part] If not set then downloads entire rfc822 formatted message, otherwise downloads specific bodystructure part\n * @param {Object} [options]\n * @param {Boolean} [options.uid] If `true` then uses UID number instead of sequence number for `range`\n * @param {number} [options.maxBytes] If set then limits download size to specified bytes\n * @param {number} [options.chunkSize=65536] How large content parts to ask from the server\n * @returns {Promise<DownloadObject>} Download data object\n *\n * @example\n * let mailbox = await client.mailboxOpen('INBOX');\n * // download body part nr '1.2' from latest message\n * let {meta, content} = await client.download('*', '1.2');\n * content.pipe(fs.createWriteStream(meta.filename));\n */\n async download(range, part, options) {\n if (!this.mailbox) {\n // no mailbox selected, nothing to do\n return {};\n }\n\n options = Object.assign(\n {\n chunkSize: 64 * 1024,\n maxBytes: Infinity\n },\n options || {}\n );\n\n let hasMore = true;\n let processed = 0;\n\n let chunkSize = Number(options.chunkSize) || 64 * 1024;\n let maxBytes = Number(options.maxBytes) || Infinity;\n\n let uid = false;\n\n if (part === '1') {\n // First part has special conditions for single node emails as\n // the mime parts for root node are not 1 and 1.MIME but TEXT and HEADERS\n let response = await this.fetchOne(range, { uid: true, bodyStructure: true }, options);\n\n if (!response) {\n return { response: false, chunk: false };\n }\n\n if (!uid && response.uid) {\n uid = response.uid;\n // force UID from now on even if first range was a sequence number\n range = uid;\n options.uid = true;\n }\n\n if (!response.bodyStructure.childNodes) {\n // single text message\n part = 'TEXT';\n }\n }\n\n let getNextPart = async query => {\n query = query || {};\n\n let mimeKey;\n\n if (!part) {\n query.source = {\n start: processed,\n maxLength: chunkSize\n };\n } else {\n part = part.toString().toLowerCase().trim();\n\n if (!query.bodyParts) {\n query.bodyParts = [];\n }\n\n if (query.size) {\n if (/^[\\d.]+$/.test(part)) {\n // fetch meta as well\n mimeKey = part + '.mime';\n query.bodyParts.push(mimeKey);\n } else if (part === 'text') {\n mimeKey = 'header';\n query.bodyParts.push(mimeKey);\n }\n }\n\n query.bodyParts.push({\n key: part,\n start: processed,\n maxLength: chunkSize\n });\n }\n\n let response = await this.fetchOne(range, query, options);\n\n if (!response) {\n return { response: false, chunk: false };\n }\n\n if (!uid && response.uid) {\n uid = response.uid;\n // force UID from now on even if first range was a sequence number\n range = uid;\n options.uid = true;\n }\n\n let chunk = !part ? response.source : response.bodyParts && response.bodyParts.get(part);\n if (!chunk) {\n return {};\n }\n\n processed += chunk.length;\n hasMore = chunk.length >= chunkSize;\n\n let result = { chunk };\n if (query.size) {\n result.response = response;\n }\n\n if (query.bodyParts) {\n if (mimeKey === 'header') {\n result.mime = response.headers;\n } else {\n result.mime = response.bodyParts.get(mimeKey);\n }\n }\n\n return result;\n };\n\n let { response, chunk, mime } = await getNextPart({\n size: true,\n uid: true\n });\n\n if (!response || !chunk) {\n // ???\n return {};\n }\n\n let meta = {\n expectedSize: response.size\n };\n\n if (!part) {\n meta.contentType = 'message/rfc822';\n } else if (mime) {\n let headers = new Headers(mime);\n let contentType = libmime.parseHeaderValue(headers.getFirst('Content-Type'));\n let transferEncoding = libmime.parseHeaderValue(headers.getFirst('Content-Transfer-Encoding'));\n let disposition = libmime.parseHeaderValue(headers.getFirst('Content-Disposition'));\n\n if (contentType.value.toLowerCase().trim()) {\n meta.contentType = contentType.value.toLowerCase().trim();\n }\n\n if (contentType.params.charset) {\n meta.charset = contentType.params.charset.toLowerCase().trim();\n }\n\n if (transferEncoding.value) {\n meta.encoding = transferEncoding.value\n .replace(/\\(.*\\)/g, '')\n .toLowerCase()\n .trim();\n }\n\n if (disposition.value) {\n meta.disposition = disposition.value.toLowerCase().trim() || false;\n try {\n meta.disposition = libmime.decodeWords(meta.disposition);\n } catch (err) {\n // failed to parse disposition, keep as is (most probably an unknown charset is used)\n }\n }\n\n if (contentType.params.format && contentType.params.format.toLowerCase().trim() === 'flowed') {\n meta.flowed = true;\n if (contentType.params.delsp && contentType.params.delsp.toLowerCase().trim() === 'yes') {\n meta.delSp = true;\n }\n }\n\n let filename = disposition.params.filename || contentType.params.name || false;\n if (filename) {\n try {\n filename = libmime.decodeWords(filename);\n } catch (err) {\n // failed to parse filename, keep as is (most probably an unknown charset is used)\n }\n meta.filename = filename;\n }\n }\n\n let stream;\n let output;\n\n switch (meta.encoding) {\n case 'base64':\n output = stream = new libbase64.Decoder();\n break;\n case 'quoted-printable':\n output = stream = new libqp.Decoder();\n break;\n default:\n output = stream = new PassThrough();\n }\n\n let isTextNode = ['text/html', 'text/plain', 'text/x-amp-html'].includes(meta.contentType) || (part === '1' && !meta.contentType);\n if ((!meta.disposition || meta.disposition === 'inline') && isTextNode) {\n // flowed text\n if (meta.flowed) {\n let flowDecoder = new FlowedDecoder({\n delSp: meta.delSp\n });\n output.on('error', err => {\n flowDecoder.emit('error', err);\n });\n output = output.pipe(flowDecoder);\n }\n\n // not utf-8 text\n if (meta.charset && !['ascii', 'usascii', 'utf8'].includes(meta.charset.toLowerCase().replace(/[^a-z0-9]+/g, ''))) {\n try {\n let decoder = getDecoder(meta.charset);\n output.on('error', err => {\n decoder.emit('error', err);\n });\n output = output.pipe(decoder);\n // force to utf-8 for output\n meta.charset = 'utf-8';\n } catch (E) {\n // do not decode charset\n }\n }\n }\n\n let limiter = new LimitedPassthrough({ maxBytes });\n output.on('error', err => {\n limiter.emit('error', err);\n });\n output = output.pipe(limiter);\n\n let writeChunk = chunk => {\n if (limiter.limited) {\n return true;\n }\n return stream.write(chunk);\n };\n\n let fetchAllParts = async () => {\n while (hasMore && !limiter.limited) {\n let { chunk } = await getNextPart();\n if (!chunk) {\n break;\n }\n\n if (writeChunk(chunk) === false) {\n await new Promise(resolve => stream.once('drain', resolve));\n }\n }\n };\n\n setImmediate(() => {\n writeChunk(chunk);\n fetchAllParts()\n .catch(err => stream.emit('error', err))\n .finally(() => stream.end());\n });\n\n return {\n meta,\n content: output\n };\n }\n\n /**\n * Fetch multiple attachments as Buffer values\n *\n * @param {SequenceString} range UID or sequence number for the message to fetch\n * @param {String} parts A list of bodystructure parts\n * @param {Object} [options]\n * @param {Boolean} [options.uid] If `true` then uses UID number instead of sequence number for `range`\n * @returns {Promise<Object>} Download data object\n *\n * @example\n * let mailbox = await client.mailboxOpen('INBOX');\n * // download body parts '2', and '3' from all messages in the selected mailbox\n * let response = await client.downloadMany('*', ['2', '3']);\n * process.stdout.write(response[2].content)\n * process.stdout.write(response[3].content)\n */\n async downloadMany(range, parts, options) {\n if (!this.mailbox) {\n // no mailbox selected, nothing to do\n return {};\n }\n\n options = Object.assign(\n {\n chunkSize: 64 * 1024,\n maxBytes: Infinity\n },\n options || {}\n );\n\n let query = { bodyParts: [] };\n\n for (let part of parts) {\n query.bodyParts.push(part + '.mime');\n query.bodyParts.push(part);\n }\n\n let response = await this.fetchOne(range, query, options);\n\n if (!response || !response.bodyParts) {\n return { response: false };\n }\n\n let data = {};\n\n for (let [part, content] of response.bodyParts) {\n let keyParts = part.split('.mime');\n if (keyParts.length === 1) {\n // content\n let key = keyParts[0];\n if (!data[key]) {\n data[key] = { content };\n } else {\n data[key].content = content;\n }\n } else if (keyParts.length === 2) {\n // header\n let key = keyParts[0];\n if (!data[key]) {\n data[key] = {};\n }\n if (!data[key].meta) {\n data[key].meta = {};\n }\n\n let headers = new Headers(content);\n let contentType = libmime.parseHeaderValue(headers.getFirst('Content-Type'));\n let transferEncoding = libmime.parseHeaderValue(headers.getFirst('Content-Transfer-Encoding'));\n let disposition = libmime.parseHeaderValue(headers.getFirst('Content-Disposition'));\n\n if (contentType.value.toLowerCase().trim()) {\n data[key].meta.contentType = contentType.value.toLowerCase().trim();\n }\n\n if (contentType.params.charset) {\n data[key].meta.charset = contentType.params.charset.toLowerCase().trim();\n }\n\n if (transferEncoding.value) {\n data[key].meta.encoding = transferEncoding.value\n .replace(/\\(.*\\)/g, '')\n .toLowerCase()\n .trim();\n }\n\n if (disposition.value) {\n data[key].meta.disposition = disposition.value.toLowerCase().trim() || false;\n try {\n data[key].meta.disposition = libmime.decodeWords(data[key].meta.disposition);\n } catch (err) {\n // failed to parse disposition, keep as is (most probably an unknown charset is used)\n }\n }\n\n if (contentType.params.format && contentType.params.format.toLowerCase().trim() === 'flowed') {\n data[key].meta.flowed = true;\n if (contentType.params.delsp && contentType.params.delsp.toLowerCase().trim() === 'yes') {\n data[key].meta.delSp = true;\n }\n }\n\n let filename = disposition.params.filename || contentType.params.name || false;\n if (filename) {\n try {\n filename = libmime.decodeWords(filename);\n } catch (err) {\n // failed to parse filename, keep as is (most probably an unknown charset is used)\n }\n data[key].meta.filename = filename;\n }\n }\n }\n\n for (let part of Object.keys(data)) {\n let meta = data[part].meta;\n\n switch (meta.encoding) {\n case 'base64':\n data[part].content = data[part].content ? libbase64.decode(data[part].content.toString()) : null;\n break;\n case 'quoted-printable':\n data[part].content = data[part].content ? libqp.decode(data[part].content.toString()) : null;\n break;\n default:\n // keep as is, already a buffer\n }\n }\n\n return data;\n }\n\n async run(command, ...args) {\n command = command.toUpperCase();\n if (!this.commands.has(command)) {\n return false;\n }\n\n if (this.socket.destroyed) {\n const error = new Error('Connection not available');\n error.code = 'NoConnection';\n throw error;\n }\n\n clearTimeout(this.idleStartTimer);\n\n if (typeof this.preCheck === 'function') {\n await this.preCheck();\n }\n\n let handler = this.commands.get(command);\n\n let result = await handler(this, ...args);\n\n if (command !== 'IDLE') {\n // do not autostart IDLE, if IDLE itself was stopped\n this.autoidle();\n }\n\n return result;\n }\n\n async processLocks(force) {\n if (!force && this.processingLock) {\n this.log.trace({\n msg: 'Mailbox locking queued',\n path: this.mailbox && this.mailbox.path,\n pending: this.locks.length,\n idling: this.idling,\n activeLock: this.currentLock\n ? {\n lockId: this.currentLock.lockId,\n ...(this.currentLock.options?.description && { description: this.currentLock.options?.description })\n }\n : null\n });\n return;\n }\n\n if (!this.locks.length) {\n this.processingLock = false;\n this.log.trace({\n msg: 'Mailbox locking queue processed',\n idling: this.idling\n });\n return;\n }\n\n this.processingLock = true;\n\n const release = () => {\n if (this.currentLock) {\n this.log.trace({\n msg: 'Mailbox lock released',\n lockId: this.currentLock.lockId,\n path: this.mailbox && this.mailbox.path,\n pending: this.locks.length,\n idling: this.idling\n });\n this.currentLock = false;\n }\n this.processLocks(true).catch(err => this.log.error({ err, cid: this.id }));\n };\n\n const lock = this.locks.shift();\n const { resolve, reject, path, options, lockId } = lock;\n\n if (!this.usable || this.socket.destroyed) {\n this.log.trace({ msg: 'Failed to acquire mailbox lock', path, lockId, idling: this.idling });\n // reject all\n let error = new Error('Connection not available');\n error.code = 'NoConnection';\n reject(error);\n return await this.processLocks(true);\n }\n\n if (this.mailbox && this.mailbox.path === path && !!this.mailbox.readOnly === !!options.readOnly) {\n // nothing to do here, already selected\n this.log.trace({\n msg: 'Mailbox lock acquired [existing]',\n path,\n lockId,\n idling: this.idling,\n ...(options.description && { description: options.description })\n });\n this.currentLock = lock;\n return resolve({ path, release });\n } else {\n try {\n // Try to open. Throws if mailbox does not exists or can't open\n await this.mailboxOpen(path, options);\n this.log.trace({\n msg: 'Mailbox lock acquired [selected]',\n path,\n lockId,\n idling: this.idling,\n ...(options.description && { description: options.description })\n });\n this.currentLock = lock;\n return resolve({ path, release });\n } catch (err) {\n if (err.responseStatus === 'NO') {\n try {\n let folders = await this.run('LIST', '', path, { listOnly: true });\n if (!folders || !folders.length) {\n err.mailboxMissing = true;\n }\n } catch (E) {\n this.log.trace({ msg: 'Failed to verify failed mailbox', path, err: E });\n }\n }\n\n this.log.trace({\n msg: 'Failed to acquire mailbox lock',\n path,\n lockId,\n idling: this.idling,\n ...(options.description && { description: options.description }),\n err\n });\n reject(err);\n await this.processLocks(true);\n }\n }\n }\n\n /**\n * Opens a mailbox if not already open and returns a lock. Next call to `getMailboxLock()` is queued\n * until previous lock is released. This is suggested over {@link module:imapflow~ImapFlow#mailboxOpen|mailboxOpen()} as\n * `getMailboxLock()` gives you a weak transaction while `mailboxOpen()` has no guarantees whatsoever that another\n * mailbox is opened while you try to call multiple fetch or store commands.\n *\n * @param {string|array} path **Path for the mailbox** to open\n * @param {Object} [options] optional options\n * @param {Boolean} [options.readOnly=false] If `true` then opens mailbox in read-only mode. You can still try to perform write operations but these would probably fail.\n * @returns {Promise<MailboxLockObject>} Mailbox lock\n * @throws Will throw an error if mailbox does not exist or can not be opened\n *\n * @example\n * let lock = await client.getMailboxLock('INBOX');\n * try {\n * // do something in the mailbox\n * } finally {\n * // use finally{} to make sure lock is released even if exception occurs\n * lock.release();\n * }\n */\n async getMailboxLock(path, options) {\n options = options || {};\n\n path = normalizePath(this, path);\n\n let lockId = ++this.lockCounter;\n this.log.trace({\n msg: 'Requesting lock',\n path,\n lockId,\n ...(options.description && { description: options.description }),\n activeLock: this.currentLock\n ? {\n lockId: this.currentLock.lockId,\n ...(this.currentLock.options?.description && { description: this.currentLock.options?.description })\n }\n : null\n });\n\n return await new Promise((resolve, reject) => {\n this.locks.push({ resolve, reject, path, options, lockId });\n this.processLocks().catch(err => reject(err));\n });\n }\n\n getLogger() {\n let mainLogger =\n this.options.logger && typeof this.options.logger === 'object'\n ? this.options.logger\n : logger.child({\n component: 'imap-connection',\n cid: this.id\n });\n\n let synteticLogger = {};\n let levels = ['trace', 'debug', 'info', 'warn', 'error', 'fatal'];\n for (let level of levels) {\n synteticLogger[level] = (...args) => {\n // using {logger:false} disables logging\n if (this.options.logger !== false) {\n if (logger)\n if (typeof mainLogger[level] !== 'function') {\n // we are checking to make sure the level is supported.\n // if it isn't supported but the level is error or fatal, log to console anyway.\n if (level === 'fatal' || level === 'error') {\n console.log(JSON.stringify(...args));\n }\n } else {\n mainLogger[level](...args);\n }\n }\n\n if (this.emitLogs && args && args[0] && typeof args[0] === 'object') {\n let logEntry = Object.assign({ level, t: Date.now(), cid: this.id, lo: ++this.lo }, args[0]);\n if (logEntry.err && typeof logEntry.err === 'object') {\n let err = logEntry.err;\n logEntry.err = {\n stack: err.stack\n };\n // enumerable error fields\n Object.keys(err).forEach(key => {\n logEntry.err[key] = err[key];\n });\n }\n this.emit('log', logEntry);\n }\n };\n }\n\n return synteticLogger;\n }\n\n unbind() {\n this.socket.unpipe(this.streamer);\n if (this._inflate) {\n this._inflate.unpipe(this.streamer);\n }\n\n this.socket.removeListener('error', this._socketError);\n this.socket.removeListener('close', this._socketClose);\n this.socket.removeListener('end', this._socketEnd);\n this.socket.removeListener('tlsClientError', this._socketError);\n this.socket.removeListener('timeout', this._socketTimeout);\n\n return {\n readSocket: this._inflate || this.socket,\n writeSocket: this.writeSocket || this.socket\n };\n }\n}\n\n/**\n * Connection close event. **NB!** ImapFlow does not handle reconnects automatically.\n * So whenever a 'close' event occurs you must create a new connection yourself.\n *\n * @event module:imapflow~ImapFlow#close\n */\n\n/**\n * Error event. In most cases getting an error event also means that connection is closed\n * and pending operations should return with a failure.\n *\n * @event module:imapflow~ImapFlow#error\n * @type {Error}\n * @example\n * client.on('error', err=>{\n * console.log(`Error occurred: ${err.message}`);\n * });\n */\n\n/**\n * Message count in currently opened mailbox changed\n *\n * @event module:imapflow~ImapFlow#exists\n * @type {Object}\n * @property {String} path mailbox path this event applies to\n * @property {Number} count updated count of messages\n * @property {Number} prevCount message count before this update\n * @example\n * client.on('exists', data=>{\n * console.log(`Message count in \"${data.path}\" is ${data.count}`);\n * });\n */\n\n/**\n * Deleted message sequence number in currently opened mailbox. One event is fired for every deleted email.\n *\n * @event module:imapflow~ImapFlow#expunge\n * @type {Object}\n * @property {String} path mailbox path this event applies to\n * @property {Number} seq sequence number of deleted message\n * @example\n * client.on('expunge', data=>{\n * console.log(`Message #${data.seq} was deleted from \"${data.path}\"`);\n * });\n */\n\n/**\n * Flags were updated for a message. Not all servers fire this event.\n *\n * @event module:imapflow~ImapFlow#flags\n * @type {Object}\n * @property {String} path mailbox path this event applies to\n * @property {Number} seq sequence number of updated message\n * @property {Number} [uid] UID number of updated message (if server provided this value)\n * @property {BigInt} [modseq] Updated modseq number for the mailbox (if server provided this value)\n * @property {Set<string>} flags A set of all flags for the updated message\n * @example\n * client.on('flags', data=>{\n * console.log(`Flag set for #${data.seq} is now \"${Array.from(data.flags).join(', ')}\"`);\n * });\n */\n\n/**\n * Mailbox was opened\n *\n * @event module:imapflow~ImapFlow#mailboxOpen\n * @type {MailboxObject}\n * @example\n * client.on('mailboxOpen', mailbox => {\n * console.log(`Mailbox ${mailbox.path} was opened`);\n * });\n */\n\n/**\n * Mailbox was closed\n *\n * @event module:imapflow~ImapFlow#mailboxClose\n * @type {MailboxObject}\n * @example\n * client.on('mailboxClose', mailbox => {\n * console.log(`Mailbox ${mailbox.path} was closed`);\n * });\n */\n\n/**\n * Log event if `emitLogs=true`\n *\n * @event module:imapflow~ImapFlow#log\n * @type {Object}\n * @example\n * client.on('log', entry => {\n * console.log(`${log.cid} ${log.msg}`);\n * });\n */\n\nmodule.exports.ImapFlow = ImapFlow;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFjdGlvbi1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9pbWFwZmxvdy9saWIvaW1hcC1mbG93LmpzIiwibWFwcGluZ3MiOiJBQUFhOztBQUViO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEsWUFBWSxtQkFBTyxDQUFDLGdCQUFLO0FBQ3pCLFlBQVksbUJBQU8sQ0FBQyxnQkFBSztBQUN6QixlQUFlLG1CQUFPLENBQUMsc0JBQVE7QUFDL0IsUUFBUSxlQUFlLEVBQUUsbUJBQU8sQ0FBQyxzQkFBUTtBQUN6QyxlQUFlLG1CQUFPLENBQUMsd0VBQVU7QUFDakMsZ0JBQWdCLG1CQUFPLENBQUMsdUVBQVM7QUFDakMsYUFBYSxtQkFBTyxDQUFDLGtCQUFNO0FBQzNCLFFBQVEsVUFBVSxFQUFFLG1CQUFPLENBQUMsMkZBQVc7QUFDdkMsUUFBUSxxQkFBcUIsRUFBRSxtQkFBTyxDQUFDLGtHQUF1Qjs7QUFFOUQsUUFBUSxhQUFhLEVBQUUsbUJBQU8sQ0FBQyxrR0FBdUI7QUFDdEQsUUFBUSxtQkFBbUIsRUFBRSxtQkFBTyxDQUFDLG9HQUF3QjtBQUM3RCxvQkFBb0IsbUJBQU8sQ0FBQyw4RUFBaUI7O0FBRTdDLGNBQWMsbUJBQU8sQ0FBQyxpRUFBTztBQUM3QixrQkFBa0IsbUJBQU8sQ0FBQyw2RUFBVztBQUNyQyxzQkFBc0IsbUJBQU8sQ0FBQywySEFBOEI7QUFDNUQsUUFBUSxjQUFjLEVBQUUsbUJBQU8sQ0FBQyxzQkFBUTs7QUFFeEMsUUFBUSxrQkFBa0IsRUFBRSxtQkFBTyxDQUFDLDRGQUFvQjs7QUFFeEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUUsRUFBRSxtQkFBTyxDQUFDLHNFQUFTOztBQUVyQixxQkFBcUIsbUJBQU8sQ0FBQyx5RkFBb0I7O0FBRWpEO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxhQUFhLFFBQVE7QUFDckI7QUFDQSxjQUFjLFFBQVE7QUFDdEIsY0FBYyxRQUFRO0FBQ3RCLGNBQWMsYUFBYTtBQUMzQixjQUFjLFFBQVE7QUFDdEIsY0FBYyxTQUFTO0FBQ3ZCLGNBQWMsU0FBUztBQUN2QixjQUFjLGFBQWE7QUFDM0IsY0FBYyxRQUFRO0FBQ3RCLGNBQWMsUUFBUTtBQUN0QixjQUFjLFFBQVE7QUFDdEIsY0FBYyxRQUFRO0FBQ3RCLGNBQWMsUUFBUTtBQUN0QixjQUFjLFFBQVE7QUFDdEI7O0FBRUE7QUFDQSxhQUFhLFFBQVE7QUFDckI7QUFDQSxjQUFjLFFBQVE7QUFDdEIsY0FBYyxVQUFVO0FBQ3hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMLHNCQUFzQjtBQUN0QjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGFBQWEsUUFBUTtBQUNyQjtBQUNBLGNBQWMsUUFBUTtBQUN0QixjQUFjLFFBQVE7QUFDdEIsY0FBYyxRQUFRO0FBQ3RCLGNBQWMsUUFBUTtBQUN0QixjQUFjLFFBQVE7QUFDdEIsY0FBYyxNQUFNO0FBQ3BCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQixRQUFRO0FBQzFCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0IsUUFBUTtBQUMxQjtBQUNBO0FBQ0Esa0JBQWtCLFFBQVE7QUFDMUI7QUFDQTtBQUNBLGtCQUFrQixTQUFTO0FBQzNCO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQixTQUFTO0FBQzNCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLFFBQVE7QUFDMUI7QUFDQTtBQUNBLGtCQUFrQixTQUFTO0FBQzNCO0FBQ0E7QUFDQSxrQkFBa0IsUUFBUTtBQUMxQiwrRUFBK0UsY0FBYztBQUM3RjtBQUNBLGtCQUFrQixRQUFRO0FBQzFCO0FBQ0E7QUFDQSxrQkFBa0IsUUFBUTtBQUMxQjtBQUNBO0FBQ0Esa0JBQWtCLFFBQVE7QUFDMUI7QUFDQTtBQUNBLGtCQUFrQixRQUFRO0FBQzFCO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQixjQUFjO0FBQ2hDO0FBQ0E7QUFDQSxrQkFBa0IsU0FBUztBQUMzQjtBQUNBO0FBQ0Esa0JBQWtCLFFBQVE7QUFDMUI7QUFDQTtBQUNBLGtCQUFrQixTQUFTO0FBQzNCO0FBQ0E7QUFDQSxrQkFBa0IsUUFBUTtBQUMxQjtBQUNBO0FBQ0Esa0JBQWtCLFFBQVE7QUFDMUI7QUFDQTtBQUNBLGtCQUFrQixnQkFBZ0I7QUFDbEM7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLFNBQVM7QUFDM0I7QUFDQTtBQUNBLGtCQUFrQixTQUFTO0FBQzNCO0FBQ0E7QUFDQSxrQkFBa0IsU0FBUztBQUMzQjtBQUNBO0FBQ0Esa0JBQWtCLFFBQVE7QUFDMUI7QUFDQTtBQUNBLGtCQUFrQixTQUFTO0FBQzNCO0FBQ0E7QUFDQSxrQkFBa0IsUUFBUTtBQUMxQjtBQUNBO0FBQ0Esa0JBQWtCLFFBQVE7QUFDMUI7QUFDQTtBQUNBLGtCQUFrQixTQUFTO0FBQzNCO0FBQ0E7QUFDQSxrQkFBa0IsU0FBUztBQUMzQjtBQUNBO0FBQ0Esa0JBQWtCLFFBQVE7QUFDMUI7QUFDQTtBQUNBLGtCQUFrQixRQUFRO0FBQzFCO0FBQ0E7QUFDQSxrQkFBa0IsUUFBUTtBQUMxQjtBQUNBOztBQUVBO0FBQ0EsZ0JBQWdCLHlCQUF5Qjs7QUFFekM7O0FBRUE7QUFDQTtBQUNBLGtCQUFrQjtBQUNsQjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQjtBQUNsQjtBQUNBLGdDQUFnQzs7QUFFaEM7O0FBRUE7QUFDQTtBQUNBLGtCQUFrQjtBQUNsQjtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQSw2Q0FBNkM7O0FBRTdDO0FBQ0E7QUFDQSxrQkFBa0I7QUFDbEI7QUFDQTs7QUFFQTtBQUNBO0FBQ0Esa0JBQWtCO0FBQ2xCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCO0FBQ2xCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGtCQUFrQjtBQUNsQjtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLDZCQUE2QixtQkFBbUI7QUFDaEQ7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUOztBQUVBO0FBQ0E7QUFDQSxTQUFTOztBQUVUOztBQUVBLHlCQUF5QiwrRUFBK0U7O0FBRXhHOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQSwwQ0FBMEMsK0NBQStDO0FBQ3pGLHFDQUFxQyxtQ0FBbUM7QUFDeEU7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiLFNBQVM7QUFDVDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxzREFBc0QseUJBQXlCO0FBQy9FO0FBQ0Esb0NBQW9DOztBQUVwQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0EsaUNBQWlDLDJEQUEyRDtBQUM1RjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGFBQWE7O0FBRWI7QUFDQTtBQUNBLGlDQUFpQyxnR0FBZ0c7QUFDakksY0FBYztBQUNkLGlDQUFpQyxnR0FBZ0c7QUFDakk7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxpQ0FBaUMscUJBQXFCLGVBQWUsa0NBQWtDO0FBQ3ZHO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCO0FBQ3RCLHdDQUF3QyxtQkFBbUI7QUFDM0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSx1RUFBdUUsaUNBQWlDO0FBQ3hHOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFDQUFxQztBQUNyQztBQUNBLDBCQUEwQjtBQUMxQjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGdEQUFnRCxrREFBa0Q7QUFDbEcsK0VBQStFLGlDQUFpQztBQUNoSDtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxnREFBZ0QsNkVBQTZFO0FBQzdIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbURBQW1ELG1CQUFtQjtBQUN0RTtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlDQUFpQyxtQkFBbUI7QUFDcEQ7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7O0FBRWI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0I7QUFDbEIscUNBQXFDLHFDQUFxQztBQUMxRTtBQUNBO0FBQ0EsYUFBYTs7QUFFYjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxvQkFBb0I7QUFDcEI7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2QsaUNBQWlDLGlFQUFpRTtBQUNsRztBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCLFNBQVM7QUFDMUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTs7QUFFYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhOztBQUViO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7O0FBRUE7QUFDQSxhQUFhOztBQUViOztBQUVBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsMEZBQTBGLDRDQUE0QztBQUN0SSxVQUFVO0FBQ1Y7QUFDQSw4RkFBOEYsK0NBQStDO0FBQzdJLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBLGlDQUFpQyxtQkFBbUI7O0FBRXBEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsYUFBYTtBQUNiOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQSxpQ0FBaUMsbUJBQW1COztBQUVwRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGFBQWE7QUFDYjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0I7QUFDbEIscUNBQXFDLDBFQUEwRTtBQUMvRztBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCO0FBQ2xCLHFDQUFxQywwRUFBMEU7QUFDL0c7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUNBQWlDO0FBQ2pDOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0Esb0NBQW9DO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscURBQXFELG1CQUFtQjtBQUN4RSxTQUFTO0FBQ1Q7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQSxrQ0FBa0MsSUFBSTtBQUN0QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQSxpQ0FBaUMscUJBQXFCO0FBQ3REO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlDQUFpQyxtQkFBbUI7QUFDcEQ7QUFDQTtBQUNBLGFBQWE7O0FBRWI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxrR0FBa0csd0RBQXdEO0FBQzFKO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUNBQXFDLG1CQUFtQjtBQUN4RDtBQUNBO0FBQ0EsaUJBQWlCOztBQUVqQjs7QUFFQTtBQUNBO0FBQ0Esd0NBQXdDLDBCQUEwQjtBQUNsRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUNBQWlDLG1CQUFtQjtBQUNwRDtBQUNBLGFBQWE7O0FBRWI7QUFDQSxTQUFTO0FBQ1Q7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCO0FBQ2hCO0FBQ0Esa0NBQWtDLElBQUk7QUFDdEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQ0FBa0MsSUFBSTtBQUN0QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0Q0FBNEMsdUNBQXVDO0FBQ25GO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLHlEQUF5RCxtQkFBbUI7QUFDNUU7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZCxpQ0FBaUMsbUJBQW1CO0FBQ3BEO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkLGlDQUFpQyxtQkFBbUI7QUFDcEQ7QUFDQTs7QUFFQSx5QkFBeUIsd0NBQXdDO0FBQ2pFO0FBQ0E7O0FBRUE7QUFDQSxpQkFBaUIsUUFBUTtBQUN6QjtBQUNBLGtCQUFrQixRQUFRO0FBQzFCLGtCQUFrQixRQUFRO0FBQzFCLGtCQUFrQixRQUFRO0FBQzFCLGtCQUFrQixRQUFRO0FBQzFCLGtCQUFrQixRQUFRO0FBQzFCLGtCQUFrQixRQUFRO0FBQzFCLGtCQUFrQixRQUFRO0FBQzFCOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsUUFBUTtBQUN2QixpQkFBaUIsZ0NBQWdDO0FBQ2pEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGlCQUFpQixRQUFRO0FBQ3pCO0FBQ0Esa0JBQWtCLFFBQVE7QUFDMUIsa0JBQWtCLFFBQVE7QUFDMUIsa0JBQWtCLFFBQVE7QUFDMUIsa0JBQWtCLFFBQVE7QUFDMUIsa0JBQWtCLFVBQVU7QUFDNUIsa0JBQWtCLFFBQVE7QUFDMUIsa0JBQWtCLGFBQWE7QUFDL0Isa0JBQWtCLFFBQVE7QUFDMUIsa0JBQWtCLFNBQVM7QUFDM0Isa0JBQWtCLFNBQVM7QUFDM0Isa0JBQWtCLGNBQWM7QUFDaEM7O0FBRUE7QUFDQSxpQkFBaUIsUUFBUTtBQUN6QjtBQUNBLGtCQUFrQixRQUFRO0FBQzFCLGtCQUFrQixTQUFTO0FBQzNCLGtCQUFrQixTQUFTO0FBQzNCLGtCQUFrQixTQUFTO0FBQzNCLGtCQUFrQixTQUFTO0FBQzNCLGtCQUFrQixTQUFTO0FBQzNCLGtCQUFrQixTQUFTO0FBQzNCLGtCQUFrQixRQUFRO0FBQzFCLGtCQUFrQixRQUFRO0FBQzFCLGtCQUFrQixRQUFRO0FBQzFCLGtCQUFrQixRQUFRO0FBQzFCLGtCQUFrQixRQUFRO0FBQzFCOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsYUFBYTtBQUM1QixpQkFBaUIseUJBQXlCO0FBQzFDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxpQkFBaUIsUUFBUTtBQUN6QjtBQUNBLGtCQUFrQixTQUFTO0FBQzNCLGtCQUFrQixRQUFRO0FBQzFCLGtCQUFrQixRQUFRO0FBQzFCLGtCQUFrQixRQUFRO0FBQzFCLGtCQUFrQixVQUFVO0FBQzVCLGtCQUFrQixRQUFRO0FBQzFCLGtCQUFrQixTQUFTO0FBQzNCLGtCQUFrQixTQUFTO0FBQzNCLGtCQUFrQixTQUFTO0FBQzNCLGtCQUFrQixvQkFBb0I7QUFDdEM7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsZUFBZSxhQUFhO0FBQzVCLGlCQUFpQiwyQkFBMkI7QUFDNUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsaUJBQWlCLFFBQVE7QUFDekI7QUFDQSxrQkFBa0IsUUFBUTtBQUMxQixrQkFBa0IsUUFBUTtBQUMxQixrQkFBa0IsU0FBUztBQUMzQjs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLGNBQWM7QUFDN0IsaUJBQWlCLGdDQUFnQztBQUNqRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGlCQUFpQixRQUFRO0FBQ3pCO0FBQ0Esa0JBQWtCLFFBQVE7QUFDMUIsa0JBQWtCLFFBQVE7QUFDMUI7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsZUFBZSxjQUFjO0FBQzdCLGVBQWUsY0FBYztBQUM3QixpQkFBaUIsZ0NBQWdDO0FBQ2pEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsaUJBQWlCLFFBQVE7QUFDekI7QUFDQSxrQkFBa0IsUUFBUTtBQUMxQjs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLGNBQWM7QUFDN0IsaUJBQWlCLGdDQUFnQztBQUNqRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLGNBQWM7QUFDN0IsaUJBQWlCLGtCQUFrQjtBQUNuQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLGNBQWM7QUFDN0IsaUJBQWlCLGtCQUFrQjtBQUNuQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsY0FBYyxnRUFBZ0U7QUFDOUU7QUFDQTtBQUNBLGVBQWUsY0FBYztBQUM3QixlQUFlLFFBQVE7QUFDdkIsZUFBZSxTQUFTO0FBQ3hCLGlCQUFpQix3QkFBd0I7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCLGtCQUFrQjtBQUNuQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsaUJBQWlCLFFBQVE7QUFDekI7QUFDQSxrQkFBa0IsUUFBUTtBQUMxQixrQkFBa0IsUUFBUTtBQUMxQixrQkFBa0IsUUFBUTtBQUMxQixrQkFBa0IsUUFBUTtBQUMxQixrQkFBa0IsUUFBUTtBQUMxQixrQkFBa0IsUUFBUTtBQUMxQixrQkFBa0IsUUFBUTtBQUMxQjs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLFFBQVE7QUFDdkIsZUFBZSxRQUFRO0FBQ3ZCLGVBQWUsU0FBUztBQUN4QixlQUFlLFNBQVM7QUFDeEIsZUFBZSxTQUFTO0FBQ3hCLGVBQWUsU0FBUztBQUN4QixlQUFlLFNBQVM7QUFDeEIsZUFBZSxTQUFTO0FBQ3hCLGlCQUFpQix1QkFBdUI7QUFDeEM7QUFDQTtBQUNBLGtEQUFrRCxhQUFhO0FBQy9EO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLHlHQUF5RyxnQ0FBZ0M7QUFDekk7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCLGtCQUFrQjtBQUNuQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxpQkFBaUIsUUFBUTtBQUN6QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsaUJBQWlCLFFBQVE7QUFDekI7QUFDQSxrQkFBa0IsZ0JBQWdCO0FBQ2xDLGtCQUFrQixTQUFTO0FBQzNCLGtCQUFrQixTQUFTO0FBQzNCLGtCQUFrQixTQUFTO0FBQzNCLGtCQUFrQixTQUFTO0FBQzNCLGtCQUFrQixTQUFTO0FBQzNCLGtCQUFrQixTQUFTO0FBQzNCLGtCQUFrQixTQUFTO0FBQzNCLGtCQUFrQixTQUFTO0FBQzNCLGtCQUFrQixTQUFTO0FBQzNCLGtCQUFrQixRQUFRO0FBQzFCLGtCQUFrQixRQUFRO0FBQzFCLGtCQUFrQixRQUFRO0FBQzFCLGtCQUFrQixRQUFRO0FBQzFCLGtCQUFrQixRQUFRO0FBQzFCLGtCQUFrQixRQUFRO0FBQzFCLGtCQUFrQixRQUFRO0FBQzFCLGtCQUFrQixRQUFRO0FBQzFCLGtCQUFrQixnQkFBZ0I7QUFDbEMsa0JBQWtCLFFBQVE7QUFDMUIsa0JBQWtCLFFBQVE7QUFDMUIsa0JBQWtCLFFBQVE7QUFDMUIsa0JBQWtCLGFBQWE7QUFDL0Isa0JBQWtCLGFBQWE7QUFDL0Isa0JBQWtCLGFBQWE7QUFDL0Isa0JBQWtCLGFBQWE7QUFDL0Isa0JBQWtCLGFBQWE7QUFDL0Isa0JBQWtCLGFBQWE7QUFDL0Isa0JBQWtCLFFBQVE7QUFDMUIsa0JBQWtCLFFBQVE7QUFDMUIsa0JBQWtCLGlDQUFpQztBQUNuRCxrQkFBa0IsZ0JBQWdCLDRCQUE0QixvQkFBb0I7QUFDbEY7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsZUFBZSwwQ0FBMEM7QUFDekQsZUFBZSxVQUFVO0FBQ3pCLGVBQWUsUUFBUTtBQUN2QixlQUFlLFNBQVMsdUNBQXVDLHNCQUFzQjtBQUNyRixlQUFlLFFBQVE7QUFDdkIsZUFBZSxTQUFTO0FBQ3hCLGlCQUFpQixrQkFBa0I7QUFDbkM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQ0FBcUMsWUFBWTtBQUNqRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLDBDQUEwQztBQUN6RCxlQUFlLFVBQVU7QUFDekIsZUFBZSxRQUFRO0FBQ3ZCLGVBQWUsU0FBUyx1Q0FBdUMsc0JBQXNCO0FBQ3JGLGVBQWUsUUFBUTtBQUN2QixlQUFlLFNBQVM7QUFDeEIsaUJBQWlCLGtCQUFrQjtBQUNuQztBQUNBO0FBQ0E7QUFDQTtBQUNBLHFDQUFxQyxZQUFZO0FBQ2pEO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsMENBQTBDO0FBQ3pELGVBQWUsVUFBVTtBQUN6QixlQUFlLFFBQVE7QUFDdkIsZUFBZSxTQUFTLHVDQUF1QyxzQkFBc0I7QUFDckYsZUFBZSxRQUFRO0FBQ3ZCLGVBQWUsU0FBUztBQUN4QixpQkFBaUIsa0JBQWtCO0FBQ25DO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0NBQXdDLFdBQVc7QUFDbkQ7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsZUFBZSwwQ0FBMEM7QUFDekQsZUFBZSxRQUFRO0FBQ3ZCLGVBQWUsUUFBUTtBQUN2QixlQUFlLFNBQVMsdUNBQXVDLHNCQUFzQjtBQUNyRixlQUFlLFFBQVE7QUFDdkIsaUJBQWlCLGtCQUFrQjtBQUNuQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBLGtCQUFrQixtQkFBbUI7QUFDckM7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxvQ0FBb0Msd0JBQXdCO0FBQzVEO0FBQ0EsZUFBZSwwQ0FBMEM7QUFDekQsZUFBZSxRQUFRO0FBQ3ZCLGVBQWUsU0FBUyx1Q0FBdUMsc0JBQXNCO0FBQ3JGLGlCQUFpQixrQkFBa0I7QUFDbkM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQ0FBbUMsV0FBVztBQUM5QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxpQkFBaUIsUUFBUTtBQUN6QjtBQUNBLGtCQUFrQixRQUFRO0FBQzFCLGtCQUFrQixRQUFRO0FBQzFCLGtCQUFrQixRQUFRO0FBQzFCLGtCQUFrQixRQUFRO0FBQzFCOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsUUFBUTtBQUN2QixlQUFlLGVBQWU7QUFDOUIsZUFBZSxVQUFVO0FBQ3pCLGVBQWUsYUFBYTtBQUM1QixpQkFBaUIsK0JBQStCO0FBQ2hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLGlCQUFpQixRQUFRO0FBQ3pCO0FBQ0Esa0JBQWtCLFFBQVE7QUFDMUIsa0JBQWtCLFFBQVE7QUFDMUIsa0JBQWtCLFFBQVE7QUFDMUIsa0JBQWtCLHFCQUFxQjtBQUN2Qzs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLDBDQUEwQztBQUN6RCxlQUFlLFFBQVE7QUFDdkIsZUFBZSxRQUFRO0FBQ3ZCLGVBQWUsU0FBUyx1Q0FBdUMsc0JBQXNCO0FBQ3JGLGlCQUFpQiw2QkFBNkI7QUFDOUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsMENBQTBDO0FBQ3pELGVBQWUsUUFBUTtBQUN2QixlQUFlLFFBQVE7QUFDdkIsZUFBZSxTQUFTLHVDQUF1QyxzQkFBc0I7QUFDckYsaUJBQWlCLDZCQUE2QjtBQUM5QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsZUFBZSxjQUFjO0FBQzdCLGVBQWUsUUFBUTtBQUN2QixlQUFlLFNBQVM7QUFDeEIsaUJBQWlCLG1CQUFtQjtBQUNwQztBQUNBO0FBQ0E7QUFDQTtBQUNBLHVDQUF1QyxZQUFZO0FBQ25EO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWSxjQUFjO0FBQzFCLFlBQVksZUFBZTtBQUMzQixZQUFZO0FBQ1osV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLGlCQUFpQixRQUFRO0FBQ3pCO0FBQ0Esa0JBQWtCLFNBQVM7QUFDM0Isa0JBQWtCLFNBQVM7QUFDM0Isa0JBQWtCLFNBQVM7QUFDM0Isa0JBQWtCLFNBQVM7QUFDM0Isa0JBQWtCLFNBQVM7QUFDM0Isa0JBQWtCLFNBQVM7QUFDM0Isa0JBQWtCLGtCQUFrQjtBQUNwQyxrQkFBa0IsUUFBUTtBQUMxQixrQkFBa0IsUUFBUTtBQUMxQixrQkFBa0IsUUFBUTtBQUMxQixrQkFBa0IsU0FBUztBQUMzQixrQkFBa0Isb0JBQW9CO0FBQ3RDLGtCQUFrQixVQUFVO0FBQzVCOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQixRQUFRO0FBQ3pCO0FBQ0Esa0JBQWtCLFFBQVE7QUFDMUIsa0JBQWtCLFFBQVE7QUFDMUI7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCLFFBQVE7QUFDekI7QUFDQSxrQkFBa0IsTUFBTTtBQUN4QixrQkFBa0IsUUFBUTtBQUMxQixrQkFBa0IsUUFBUTtBQUMxQixrQkFBa0IsUUFBUTtBQUMxQixrQkFBa0Isd0JBQXdCO0FBQzFDLGtCQUFrQix3QkFBd0I7QUFDMUMsa0JBQWtCLHdCQUF3QjtBQUMxQyxrQkFBa0Isd0JBQXdCO0FBQzFDLGtCQUFrQix3QkFBd0I7QUFDMUMsa0JBQWtCLHdCQUF3QjtBQUMxQzs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUIsUUFBUTtBQUN6QjtBQUNBLGtCQUFrQixRQUFRO0FBQzFCLGtCQUFrQixRQUFRO0FBQzFCLGtCQUFrQixRQUFRO0FBQzFCLGtCQUFrQixRQUFRO0FBQzFCLGtCQUFrQixRQUFRO0FBQzFCLGtCQUFrQixRQUFRO0FBQzFCLGtCQUFrQix1QkFBdUI7QUFDekMsa0JBQWtCLFFBQVE7QUFDMUIsa0JBQWtCLFFBQVE7QUFDMUIsa0JBQWtCLDBCQUEwQjtBQUM1Qzs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUIsUUFBUTtBQUN6QjtBQUNBLGtCQUFrQixRQUFRO0FBQzFCLGtCQUFrQixRQUFRO0FBQzFCLGtCQUFrQixRQUFRO0FBQzFCLGtCQUFrQixRQUFRO0FBQzFCLGtCQUFrQixRQUFRO0FBQzFCLGtCQUFrQixRQUFRO0FBQzFCLGtCQUFrQixhQUFhO0FBQy9CLGtCQUFrQixRQUFRO0FBQzFCLGtCQUFrQixhQUFhO0FBQy9CLGtCQUFrQixRQUFRO0FBQzFCLGtCQUFrQix1QkFBdUI7QUFDekMsa0JBQWtCLHdCQUF3QjtBQUMxQyxrQkFBa0IsTUFBTTtBQUN4QixrQkFBa0IscUJBQXFCO0FBQ3ZDLGtCQUFrQixRQUFRO0FBQzFCOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsMENBQTBDO0FBQ3pELGVBQWUsa0JBQWtCO0FBQ2pDLGVBQWUsUUFBUTtBQUN2QixlQUFlLFNBQVM7QUFDeEIsZUFBZSxRQUFRO0FBQ3ZCLGVBQWUsU0FBUztBQUN4QixnQkFBZ0IsNkJBQTZCO0FBQzdDO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0RBQWtELFVBQVU7QUFDNUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMEJBQTBCO0FBQzFCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhOztBQUViO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQSxnQ0FBZ0MsS0FBSztBQUNyQztBQUNBO0FBQ0E7QUFDQSxhQUFhOztBQUViO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSwwQ0FBMEM7QUFDekQsZUFBZSxrQkFBa0I7QUFDakMsZUFBZSxRQUFRO0FBQ3ZCLGVBQWUsU0FBUztBQUN4QixlQUFlLFFBQVE7QUFDdkIsZUFBZSxTQUFTO0FBQ3hCLGlCQUFpQiwrQkFBK0I7QUFDaEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzREFBc0QsVUFBVTtBQUNoRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsZUFBZSxnQkFBZ0I7QUFDL0IsZUFBZSxrQkFBa0I7QUFDakMsZUFBZSxRQUFRO0FBQ3ZCLGVBQWUsU0FBUztBQUN4QixlQUFlLFNBQVM7QUFDeEIsaUJBQWlCLDZCQUE2QjtBQUM5QztBQUNBO0FBQ0E7QUFDQTtBQUNBLGlEQUFpRCxVQUFVO0FBQzNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQ0FBc0MsZUFBZSxJQUFJLFlBQVksR0FBRztBQUN4RTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLGlCQUFpQixRQUFRO0FBQ3pCO0FBQ0Esa0JBQWtCLFFBQVE7QUFDMUIsa0JBQWtCLFFBQVE7QUFDMUIsa0JBQWtCLFFBQVE7QUFDMUIsa0JBQWtCLFFBQVE7QUFDMUIsa0JBQWtCLFFBQVE7QUFDMUIsa0JBQWtCLFFBQVE7QUFDMUIsa0JBQWtCLGdCQUFnQjtBQUNsQzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxnQkFBZ0I7QUFDL0IsZUFBZSxRQUFRO0FBQ3ZCLGVBQWUsUUFBUTtBQUN2QixlQUFlLFNBQVM7QUFDeEIsZUFBZSxRQUFRO0FBQ3ZCLGVBQWUsUUFBUTtBQUN2QixpQkFBaUIseUJBQXlCO0FBQzFDO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWSxlQUFlO0FBQzNCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLHdEQUF3RCxnQ0FBZ0M7O0FBRXhGO0FBQ0EseUJBQXlCO0FBQ3pCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQjtBQUN0QjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjs7QUFFQTs7QUFFQTtBQUNBLHlCQUF5QjtBQUN6Qjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSwyQkFBMkI7QUFDM0I7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSxjQUFjLHdCQUF3QjtBQUN0QztBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQjtBQUNBO0FBQ0E7QUFDQSxrQkFBa0I7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsK0NBQStDLFVBQVU7QUFDekQ7QUFDQTtBQUNBLFNBQVM7QUFDVDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLHNCQUFzQixRQUFRO0FBQzlCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsZUFBZSxnQkFBZ0I7QUFDL0IsZUFBZSxRQUFRO0FBQ3ZCLGVBQWUsUUFBUTtBQUN2QixlQUFlLFNBQVM7QUFDeEIsaUJBQWlCLGlCQUFpQjtBQUNsQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBOztBQUVBLHNCQUFzQjs7QUFFdEI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQSxxQkFBcUI7QUFDckI7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0NBQWtDO0FBQ2xDLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0I7QUFDdEI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQjtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUVBQXlFLG9EQUFvRDtBQUM3SDtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBLGtFQUFrRSxtQkFBbUI7QUFDckY7O0FBRUE7QUFDQSxnQkFBZ0IseUNBQXlDOztBQUV6RDtBQUNBLDZCQUE2QiwwRUFBMEU7QUFDdkc7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkNBQTZDLGtDQUFrQztBQUMvRSxhQUFhO0FBQ2I7QUFDQSw2QkFBNkIsZUFBZTtBQUM1QyxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlEQUFpRCxrQ0FBa0M7QUFDbkYsaUJBQWlCO0FBQ2pCO0FBQ0EsaUNBQWlDLGVBQWU7QUFDaEQsY0FBYztBQUNkO0FBQ0E7QUFDQSx5RUFBeUUsZ0JBQWdCO0FBQ3pGO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQjtBQUN0Qix5Q0FBeUMsc0RBQXNEO0FBQy9GO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlEQUFpRCxrQ0FBa0M7QUFDbkY7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsZ0VBQWdFLDBEQUEwRDtBQUMxSDtBQUNBO0FBQ0E7QUFDQSxlQUFlLGNBQWM7QUFDN0IsZUFBZSxRQUFRO0FBQ3ZCLGVBQWUsU0FBUztBQUN4QixpQkFBaUIsNEJBQTRCO0FBQzdDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCwwQkFBMEI7QUFDMUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUNBQXlDLGtDQUFrQztBQUMzRTtBQUNBO0FBQ0E7QUFDQSxxRUFBcUUsb0RBQW9EO0FBQ3pIO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0EsOEJBQThCLHdDQUF3QztBQUN0RTtBQUNBLFNBQVM7QUFDVDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQjs7QUFFbkI7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQkFBMEIsY0FBYztBQUN4QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMEJBQTBCO0FBQzFCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLG1EQUFtRCxtREFBbUQ7QUFDdEc7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlCQUF5QjtBQUN6QjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0Esc0NBQXNDLFlBQVk7QUFDbEQsSUFBSTtBQUNKOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWLGNBQWMsUUFBUTtBQUN0QixjQUFjLFFBQVE7QUFDdEIsY0FBYyxRQUFRO0FBQ3RCO0FBQ0E7QUFDQSx3Q0FBd0MsVUFBVSxPQUFPLFdBQVc7QUFDcEUsSUFBSTtBQUNKOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWLGNBQWMsUUFBUTtBQUN0QixjQUFjLFFBQVE7QUFDdEI7QUFDQTtBQUNBLCtCQUErQixVQUFVLG9CQUFvQixVQUFVO0FBQ3ZFLElBQUk7QUFDSjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVixjQUFjLFFBQVE7QUFDdEIsY0FBYyxRQUFRO0FBQ3RCLGNBQWMsUUFBUTtBQUN0QixjQUFjLFFBQVE7QUFDdEIsY0FBYyxhQUFhO0FBQzNCO0FBQ0E7QUFDQSxvQ0FBb0MsVUFBVSxVQUFVLGtDQUFrQztBQUMxRixJQUFJO0FBQ0o7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBLDhCQUE4QixjQUFjO0FBQzVDLElBQUk7QUFDSjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0EsOEJBQThCLGNBQWM7QUFDNUMsSUFBSTtBQUNKOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQSxzQkFBc0IsU0FBUyxFQUFFLFFBQVE7QUFDekMsSUFBSTtBQUNKOztBQUVBLHVCQUF1QiIsInNvdXJjZXMiOlsiL2hvbWUvYWxtYS9uZXh0Z2VuL05lYWgtbWFpbC9ub2RlX21vZHVsZXMvaW1hcGZsb3cvbGliL2ltYXAtZmxvdy5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbi8qKlxuICogQG1vZHVsZSBpbWFwZmxvd1xuICovXG5cbi8vIFRPRE86XG4vLyAqIFVzZSBidWZmZXJzIGZvciBjb21waWxlZCBjb21tYW5kc1xuLy8gKiBPQXV0aDIgYXV0aGVudGljYXRpb25cblxuY29uc3QgdGxzID0gcmVxdWlyZSgndGxzJyk7XG5jb25zdCBuZXQgPSByZXF1aXJlKCduZXQnKTtcbmNvbnN0IGNyeXB0byA9IHJlcXVpcmUoJ2NyeXB0bycpO1xuY29uc3QgeyBFdmVudEVtaXR0ZXIgfSA9IHJlcXVpcmUoJ2V2ZW50cycpO1xuY29uc3QgbG9nZ2VyID0gcmVxdWlyZSgnLi9sb2dnZXInKTtcbmNvbnN0IGxpYm1pbWUgPSByZXF1aXJlKCdsaWJtaW1lJyk7XG5jb25zdCB6bGliID0gcmVxdWlyZSgnemxpYicpO1xuY29uc3QgeyBIZWFkZXJzIH0gPSByZXF1aXJlKCdtYWlsc3BsaXQnKTtcbmNvbnN0IHsgTGltaXRlZFBhc3N0aHJvdWdoIH0gPSByZXF1aXJlKCcuL2xpbWl0ZWQtcGFzc3Rocm91Z2gnKTtcblxuY29uc3QgeyBJbWFwU3RyZWFtIH0gPSByZXF1aXJlKCcuL2hhbmRsZXIvaW1hcC1zdHJlYW0nKTtcbmNvbnN0IHsgcGFyc2VyLCBjb21waWxlciB9ID0gcmVxdWlyZSgnLi9oYW5kbGVyL2ltYXAtaGFuZGxlcicpO1xuY29uc3QgcGFja2FnZUluZm8gPSByZXF1aXJlKCcuLi9wYWNrYWdlLmpzb24nKTtcblxuY29uc3QgbGlicXAgPSByZXF1aXJlKCdsaWJxcCcpO1xuY29uc3QgbGliYmFzZTY0ID0gcmVxdWlyZSgnbGliYmFzZTY0Jyk7XG5jb25zdCBGbG93ZWREZWNvZGVyID0gcmVxdWlyZSgnbWFpbHNwbGl0L2xpYi9mbG93ZWQtZGVjb2RlcicpO1xuY29uc3QgeyBQYXNzVGhyb3VnaCB9ID0gcmVxdWlyZSgnc3RyZWFtJyk7XG5cbmNvbnN0IHsgcHJveHlDb25uZWN0aW9uIH0gPSByZXF1aXJlKCcuL3Byb3h5LWNvbm5lY3Rpb24nKTtcblxuY29uc3Qge1xuICAgIGNvbXBhcmVQYXRocyxcbiAgICB1cGRhdGVDYXBhYmlsaXRpZXMsXG4gICAgZ2V0Rm9sZGVyVHJlZSxcbiAgICBmb3JtYXRNZXNzYWdlUmVzcG9uc2UsXG4gICAgZ2V0RGVjb2RlcixcbiAgICBwYWNrTWVzc2FnZVJhbmdlLFxuICAgIG5vcm1hbGl6ZVBhdGgsXG4gICAgZXhwYW5kUmFuZ2UsXG4gICAgQXV0aGVudGljYXRpb25GYWlsdXJlLFxuICAgIGdldENvbG9yRmxhZ3Ncbn0gPSByZXF1aXJlKCcuL3Rvb2xzJyk7XG5cbmNvbnN0IGltYXBDb21tYW5kcyA9IHJlcXVpcmUoJy4vaW1hcC1jb21tYW5kcy5qcycpO1xuXG5jb25zdCBDT05ORUNUX1RJTUVPVVQgPSA5MCAqIDEwMDA7XG5jb25zdCBHUkVFVElOR19USU1FT1VUID0gMTYgKiAxMDAwO1xuY29uc3QgVVBHUkFERV9USU1FT1VUID0gMTAgKiAxMDAwO1xuXG5jb25zdCBTT0NLRVRfVElNRU9VVCA9IDUgKiA2MCAqIDEwMDA7XG5cbmNvbnN0IHN0YXRlcyA9IHtcbiAgICBOT1RfQVVUSEVOVElDQVRFRDogMHgwMSxcbiAgICBBVVRIRU5USUNBVEVEOiAweDAyLFxuICAgIFNFTEVDVEVEOiAweDAzLFxuICAgIExPR09VVDogMHgwNFxufTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBNYWlsYm94T2JqZWN0XG4gKiBAZ2xvYmFsXG4gKiBAcHJvcGVydHkge1N0cmluZ30gcGF0aCBtYWlsYm94IHBhdGhcbiAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBkZWxpbWl0ZXIgbWFpbGJveCBwYXRoIGRlbGltaXRlciwgdXN1YWxseSBcIi5cIiBvciBcIi9cIlxuICogQHByb3BlcnR5IHtTZXQ8c3RyaW5nPn0gZmxhZ3MgbGlzdCBvZiBmbGFncyBmb3IgdGhpcyBtYWlsYm94XG4gKiBAcHJvcGVydHkge1N0cmluZ30gW3NwZWNpYWxVc2VdIG9uZSBvZiBzcGVjaWFsLXVzZSBmbGFncyAoaWYgYXBwbGljYWJsZSk6IFwiXFxBbGxcIiwgXCJcXEFyY2hpdmVcIiwgXCJcXERyYWZ0c1wiLCBcIlxcRmxhZ2dlZFwiLCBcIlxcSnVua1wiLCBcIlxcU2VudFwiLCBcIlxcVHJhc2hcIi4gQWRkaXRpb25hbGx5IElOQk9YIGhhcyBub24tc3RhbmRhcmQgXCJcXEluYm94XCIgZmxhZyBzZXRcbiAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gbGlzdGVkIGB0cnVlYCBpZiBtYWlsYm94IHdhcyBmb3VuZCBmcm9tIHRoZSBvdXRwdXQgb2YgTElTVCBjb21tYW5kXG4gKiBAcHJvcGVydHkge0Jvb2xlYW59IHN1YnNjcmliZWQgYHRydWVgIGlmIG1haWxib3ggd2FzIGZvdW5kIGZyb20gdGhlIG91dHB1dCBvZiBMU1VCIGNvbW1hbmRcbiAqIEBwcm9wZXJ0eSB7U2V0PHN0cmluZz59IHBlcm1hbmVudEZsYWdzIEEgU2V0IG9mIGZsYWdzIGF2YWlsYWJsZSB0byB1c2UgaW4gdGhpcyBtYWlsYm94LiBJZiBpdCBpcyBub3Qgc2V0IG9yIGluY2x1ZGVzIHNwZWNpYWwgZmxhZyBcIlxcXFxcXCpcIiB0aGVuIGFueSBmbGFnIGNhbiBiZSB1c2VkLlxuICogQHByb3BlcnR5IHtTdHJpbmd9IFttYWlsYm94SWRdIHVuaXF1ZSBtYWlsYm94IElEIGlmIHNlcnZlciBoYXMgYE9CSkVDVElEYCBleHRlbnNpb24gZW5hYmxlZFxuICogQHByb3BlcnR5IHtCaWdJbnR9IFtoaWdoZXN0TW9kc2VxXSBsYXRlc3Qga25vd24gbW9kc2VxIHZhbHVlIGlmIHNlcnZlciBoYXMgQ09ORFNUT1JFIG9yIFhZTUhJR0hFU1RNT0RTRVEgZW5hYmxlZFxuICogQHByb3BlcnR5IHtTdHJpbmd9IFtub01vZHNlcV0gaWYgdHJ1ZSB0aGVuIHRoZSBzZXJ2ZXIgZG9lc24ndCBzdXBwb3J0IHRoZSBwZXJzaXN0ZW50IHN0b3JhZ2Ugb2YgbW9kLXNlcXVlbmNlcyBmb3IgdGhlIG1haWxib3hcbiAqIEBwcm9wZXJ0eSB7QmlnSW50fSB1aWRWYWxpZGl0eSBNYWlsYm94IGBVSURWQUxJRElUWWAgdmFsdWVcbiAqIEBwcm9wZXJ0eSB7TnVtYmVyfSB1aWROZXh0IE5leHQgcHJlZGljdGVkIFVJRFxuICogQHByb3BlcnR5IHtOdW1iZXJ9IGV4aXN0cyBNZXNzYWdlcyBpbiB0aGlzIGZvbGRlclxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gTWFpbGJveExvY2tPYmplY3RcbiAqIEBnbG9iYWxcbiAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBwYXRoIG1haWxib3ggcGF0aFxuICogQHByb3BlcnR5IHtGdW5jdGlvbn0gcmVsZWFzZSBSZWxlYXNlIGN1cnJlbnQgbG9ja1xuICogQGV4YW1wbGVcbiAqIGxldCBsb2NrID0gYXdhaXQgY2xpZW50LmdldE1haWxib3hMb2NrKCdJTkJPWCcpO1xuICogdHJ5IHtcbiAqICAgLy8gZG8gc29tZXRoaW5nIGluIHRoZSBtYWlsYm94XG4gKiB9IGZpbmFsbHkge1xuICogICAvLyB1c2UgZmluYWxseXt9IHRvIG1ha2Ugc3VyZSBsb2NrIGlzIHJlbGVhc2VkIGV2ZW4gaWYgZXhjZXB0aW9uIG9jY3Vyc1xuICogICBsb2NrLnJlbGVhc2UoKTtcbiAqIH1cbiAqL1xuXG4vKipcbiAqIENsaWVudCBhbmQgc2VydmVyIGlkZW50aWZpY2F0aW9uIG9iamVjdCwgd2hlcmUga2V5IGlzIG9uZSBvZiBSRkMyOTcxIGRlZmluZWQgW2RhdGEgZmllbGRzXShodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjMjk3MSNzZWN0aW9uLTMuMykgKGJ1dCBub3QgbGltaXRlZCB0bykuXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBJZEluZm9PYmplY3RcbiAqIEBnbG9iYWxcbiAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBbbmFtZV0gTmFtZSBvZiB0aGUgcHJvZ3JhbVxuICogQHByb3BlcnR5IHtTdHJpbmd9IFt2ZXJzaW9uXSBWZXJzaW9uIG51bWJlciBvZiB0aGUgcHJvZ3JhbVxuICogQHByb3BlcnR5IHtTdHJpbmd9IFtvc10gTmFtZSBvZiB0aGUgb3BlcmF0aW5nIHN5c3RlbVxuICogQHByb3BlcnR5IHtTdHJpbmd9IFt2ZW5kb3JdIFZlbmRvciBvZiB0aGUgY2xpZW50L3NlcnZlclxuICogQHByb3BlcnR5IHtTdHJpbmd9IFsnc3VwcG9ydC11cmwnXSBVUkwgdG8gY29udGFjdCBmb3Igc3VwcG9ydFxuICogQHByb3BlcnR5IHtEYXRlfSBbZGF0ZV0gRGF0ZSBwcm9ncmFtIHdhcyByZWxlYXNlZFxuICovXG5cbi8qKlxuICogSU1BUCBjbGllbnQgY2xhc3MgZm9yIGFjY2Vzc2luZyBJTUFQIG1haWxib3hlc1xuICpcbiAqIEBjbGFzc1xuICogQGV4dGVuZHMgRXZlbnRFbWl0dGVyXG4gKi9cbmNsYXNzIEltYXBGbG93IGV4dGVuZHMgRXZlbnRFbWl0dGVyIHtcbiAgICAvKipcbiAgICAgKiBDdXJyZW50IG1vZHVsZSB2ZXJzaW9uIGFzIGEgc3RhdGljIGNsYXNzIHByb3BlcnR5XG4gICAgICogQHByb3BlcnR5IHtTdHJpbmd9IHZlcnNpb24gTW9kdWxlIHZlcnNpb25cbiAgICAgKiBAc3RhdGljXG4gICAgICovXG4gICAgc3RhdGljIHZlcnNpb24gPSBwYWNrYWdlSW5mby52ZXJzaW9uO1xuXG4gICAgLyoqXG4gICAgICogSU1BUCBjb25uZWN0aW9uIG9wdGlvbnNcbiAgICAgKlxuICAgICAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBob3N0XG4gICAgICogICAgIEhvc3RuYW1lIG9mIHRoZSBJTUFQIHNlcnZlci5cbiAgICAgKlxuICAgICAqIEBwcm9wZXJ0eSB7TnVtYmVyfSBwb3J0XG4gICAgICogICAgIFBvcnQgbnVtYmVyIGZvciB0aGUgSU1BUCBzZXJ2ZXIuXG4gICAgICpcbiAgICAgKiBAcHJvcGVydHkge0Jvb2xlYW59IFtzZWN1cmU9ZmFsc2VdXG4gICAgICogICAgIElmIGB0cnVlYCwgZXN0YWJsaXNoZXMgdGhlIGNvbm5lY3Rpb24gZGlyZWN0bHkgb3ZlciBUTFMgKGNvbW1vbmx5IG9uIHBvcnQgOTkzKS5cbiAgICAgKiAgICAgSWYgYGZhbHNlYCwgYSBwbGFpbiAodW5lbmNyeXB0ZWQpIGNvbm5lY3Rpb24gaXMgdXNlZCBmaXJzdCBhbmQsIGlmIHBvc3NpYmxlLCB0aGUgY29ubmVjdGlvbiBpcyB1cGdyYWRlZCB0byBTVEFSVFRMUy5cbiAgICAgKlxuICAgICAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gW2RvU1RBUlRUTFM9dW5kZWZpbmVkXVxuICAgICAqICAgICBEZXRlcm1pbmVzIHdoZXRoZXIgdG8gdXBncmFkZSB0aGUgY29ubmVjdGlvbiB0byBUTFMgdmlhIFNUQVJUVExTOlxuICAgICAqICAgICAgIC0gKip0cnVlKio6IFN0YXJ0IHVuZW5jcnlwdGVkIGFuZCB1cGdyYWRlIHRvIFRMUyB1c2luZyBTVEFSVFRMUyBiZWZvcmUgYXV0aGVudGljYXRpb24uXG4gICAgICogICAgICAgICBUaGUgY29ubmVjdGlvbiBmYWlscyBpZiB0aGUgc2VydmVyIGRvZXMgbm90IHN1cHBvcnQgU1RBUlRUTFMgb3IgdGhlIHVwZ3JhZGUgZmFpbHMuXG4gICAgICogICAgICAgICBOb3RlIHRoYXQgYHNlY3VyZT10cnVlYCBjb21iaW5lZCB3aXRoIGBkb1NUQVJUVExTPXRydWVgIGlzIGludmFsaWQuXG4gICAgICogICAgICAgLSAqKmZhbHNlKio6IE5ldmVyIHVzZSBTVEFSVFRMUywgZXZlbiBpZiB0aGUgc2VydmVyIGFkdmVydGlzZXMgc3VwcG9ydC5cbiAgICAgKiAgICAgICAgIFRoaXMgaXMgdXNlZnVsIGlmIHRoZSBzZXJ2ZXIgaGFzIGEgYnJva2VuIFRMUyBzZXR1cC5cbiAgICAgKiAgICAgICAgIENvbWJpbmVkIHdpdGggYHNlY3VyZT1mYWxzZWAsIHRoaXMgcmVzdWx0cyBpbiBhIGZ1bGx5IHVuZW5jcnlwdGVkIGNvbm5lY3Rpb24uXG4gICAgICogICAgICAgICBNYWtlIHN1cmUgeW91IHdhcm4gdXNlcnMgYWJvdXQgdGhlIHNlY3VyaXR5IHJpc2tzLlxuICAgICAqICAgICAgIC0gKip1bmRlZmluZWQqKiAoZGVmYXVsdCk6IElmIGBzZWN1cmU9ZmFsc2VgIChkZWZhdWx0KSwgYXR0ZW1wdCB0byB1cGdyYWRlIHRvIFRMUyB2aWEgU1RBUlRUTFMgYmVmb3JlIGF1dGhlbnRpY2F0aW9uIGlmIHRoZSBzZXJ2ZXIgc3VwcG9ydHMgaXQuIElmIG5vdCBzdXBwb3J0ZWQsIGNvbnRpbnVlIHVuZW5jcnlwdGVkLiBUaGlzIG1heSBleHBvc2UgdGhlIGNvbm5lY3Rpb24gdG8gYSBkb3duZ3JhZGUgYXR0YWNrLlxuICAgICAqXG4gICAgICogQHByb3BlcnR5IHtTdHJpbmd9IFtzZXJ2ZXJuYW1lXVxuICAgICAqICAgICBTZXJ2ZXIgbmFtZSBmb3IgU05JIG9yIHdoZW4gdXNpbmcgYW4gSVAgYWRkcmVzcyBhcyBgaG9zdGAuXG4gICAgICpcbiAgICAgKiBAcHJvcGVydHkge0Jvb2xlYW59IFtkaXNhYmxlQ29tcHJlc3Npb249ZmFsc2VdXG4gICAgICogICAgIElmIGB0cnVlYCwgdGhlIGNsaWVudCBkb2VzIG5vdCBhdHRlbXB0IHRvIHVzZSB0aGUgQ09NUFJFU1M9REVGTEFURSBleHRlbnNpb24uXG4gICAgICpcbiAgICAgKiBAcHJvcGVydHkge09iamVjdH0gYXV0aFxuICAgICAqICAgICBBdXRoZW50aWNhdGlvbiBvcHRpb25zLiBBdXRoZW50aWNhdGlvbiBvY2N1cnMgYXV0b21hdGljYWxseSBkdXJpbmcge0BsaW5rIGNvbm5lY3R9LlxuICAgICAqXG4gICAgICogQHByb3BlcnR5IHtTdHJpbmd9IGF1dGgudXNlclxuICAgICAqICAgICBVc2VybmFtZSBmb3IgYXV0aGVudGljYXRpb24uXG4gICAgICpcbiAgICAgKiBAcHJvcGVydHkge1N0cmluZ30gW2F1dGgucGFzc11cbiAgICAgKiAgICAgUGFzc3dvcmQgZm9yIHJlZ3VsYXIgYXV0aGVudGljYXRpb24uXG4gICAgICpcbiAgICAgKiBAcHJvcGVydHkge1N0cmluZ30gW2F1dGguYWNjZXNzVG9rZW5dXG4gICAgICogICAgIE9BdXRoMiBhY2Nlc3MgdG9rZW4sIGlmIHVzaW5nIE9BdXRoMiBhdXRoZW50aWNhdGlvbi5cbiAgICAgKlxuICAgICAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBbYXV0aC5sb2dpbk1ldGhvZF1cbiAgICAgKiAgICAgT3B0aW9uYWwgbG9naW4gbWV0aG9kIGZvciBwYXNzd29yZC1iYXNlZCBhdXRoZW50aWNhdGlvbiAoZS5nLiwgXCJMT0dJTlwiLCBcIkFVVEg9TE9HSU5cIiwgb3IgXCJBVVRIPVBMQUlOXCIpLlxuICAgICAqICAgICBJZiBub3Qgc2V0LCBJbWFwRmxvdyBjaG9vc2VzIGJhc2VkIG9uIGF2YWlsYWJsZSBtZWNoYW5pc21zLlxuICAgICAqXG4gICAgICogQHByb3BlcnR5IHtJZEluZm9PYmplY3R9IFtjbGllbnRJbmZvXVxuICAgICAqICAgICBDbGllbnQgaWRlbnRpZmljYXRpb24gaW5mbyBzZW50IHRvIHRoZSBzZXJ2ZXIgKHZpYSB0aGUgSUQgY29tbWFuZCkuXG4gICAgICpcbiAgICAgKiBAcHJvcGVydHkge0Jvb2xlYW59IFtkaXNhYmxlQXV0b0lkbGU9ZmFsc2VdXG4gICAgICogICAgIElmIGB0cnVlYCwgZG8gbm90IHN0YXJ0IElETEUgYXV0b21hdGljYWxseS4gVXNlZnVsIHdoZW4gb25seSBzcGVjaWZpYyBvcGVyYXRpb25zIGFyZSBuZWVkZWQuXG4gICAgICpcbiAgICAgKiBAcHJvcGVydHkge09iamVjdH0gW3Rsc11cbiAgICAgKiAgICAgQWRkaXRpb25hbCBUTFMgb3B0aW9ucy4gRm9yIGRldGFpbHMsIHNlZSBbTm9kZS5qcyBUTFMgY29ubmVjdF0oaHR0cHM6Ly9ub2RlanMub3JnL2FwaS90bHMuaHRtbCN0bHNfdGxzX2Nvbm5lY3Rfb3B0aW9uc19jYWxsYmFjaykuXG4gICAgICpcbiAgICAgKiBAcHJvcGVydHkge0Jvb2xlYW59IFt0bHMucmVqZWN0VW5hdXRob3JpemVkPXRydWVdXG4gICAgICogICAgIElmIGBmYWxzZWAsIGFsbG93cyBzZWxmLXNpZ25lZCBvciBleHBpcmVkIGNlcnRpZmljYXRlcy5cbiAgICAgKlxuICAgICAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBbdGxzLm1pblZlcnNpb249J1RMU3YxLjInXVxuICAgICAqICAgICBNaW5pbXVtIGFjY2VwdGVkIFRMUyB2ZXJzaW9uIChlLmcuLCBgJ1RMU3YxLjInYCkuXG4gICAgICpcbiAgICAgKiBAcHJvcGVydHkge051bWJlcn0gW3Rscy5taW5ESFNpemU9MTAyNF1cbiAgICAgKiAgICAgTWluaW11bSBzaXplIChpbiBiaXRzKSBvZiB0aGUgREggcGFyYW1ldGVyIGZvciBUTFMgY29ubmVjdGlvbnMuXG4gICAgICpcbiAgICAgKiBAcHJvcGVydHkge09iamVjdHxCb29sZWFufSBbbG9nZ2VyXVxuICAgICAqICAgICBDdXN0b20gbG9nZ2VyIGluc3RhbmNlIHdpdGggYGRlYnVnKG9iailgLCBgaW5mbyhvYmopYCwgYHdhcm4ob2JqKWAsIGFuZCBgZXJyb3Iob2JqKWAgbWV0aG9kcy5cbiAgICAgKiAgICAgSWYgYGZhbHNlYCwgbG9nZ2luZyBpcyBkaXNhYmxlZC4gSWYgbm90IHByb3ZpZGVkLCBJbWFwRmxvdyBsb2dzIHRvIGNvbnNvbGUgaW4gW3Bpbm8gZm9ybWF0XShodHRwczovL2dldHBpbm8uaW8vKS5cbiAgICAgKlxuICAgICAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gW2xvZ1Jhdz1mYWxzZV1cbiAgICAgKiAgICAgSWYgYHRydWVgLCBsb2dzIGFsbCByYXcgZGF0YSAocmVhZCBhbmQgd3JpdHRlbikgaW4gYmFzZTY0IGVuY29kaW5nLiBZb3UgY2FuIHBpcGUgc3VjaCBsb2dzIHRvIFtlZXJhd2xvZ10oaHR0cHM6Ly9naXRodWIuY29tL3Bvc3RhbHN5cy9lZXJhd2xvZykgY29tbWFuZCBmb3IgcmVhZGFibGUgb3V0cHV0LlxuICAgICAqXG4gICAgICogQHByb3BlcnR5IHtCb29sZWFufSBbZW1pdExvZ3M9ZmFsc2VdXG4gICAgICogICAgIElmIGB0cnVlYCwgZW1pdHMgYCdsb2cnYCBldmVudHMgd2l0aCB0aGUgc2FtZSBkYXRhIHBhc3NlZCB0byB0aGUgbG9nZ2VyLlxuICAgICAqXG4gICAgICogQHByb3BlcnR5IHtCb29sZWFufSBbdmVyaWZ5T25seT1mYWxzZV1cbiAgICAgKiAgICAgSWYgYHRydWVgLCBkaXNjb25uZWN0cyBhZnRlciBzdWNjZXNzZnVsIGF1dGhlbnRpY2F0aW9uIHdpdGhvdXQgcGVyZm9ybWluZyBvdGhlciBhY3Rpb25zLlxuICAgICAqXG4gICAgICogQHByb3BlcnR5IHtTdHJpbmd9IFtwcm94eV1cbiAgICAgKiAgICAgUHJveHkgVVJMLiBTdXBwb3J0cyBIVFRQIENPTk5FQ1QgKGBodHRwOi8vYCwgYGh0dHBzOi8vYCkgYW5kIFNPQ0tTIChgc29ja3M6Ly9gLCBgc29ja3M0Oi8vYCwgYHNvY2tzNTovL2ApLlxuICAgICAqXG4gICAgICogQHByb3BlcnR5IHtCb29sZWFufSBbcXJlc3luYz1mYWxzZV1cbiAgICAgKiAgICAgSWYgYHRydWVgLCBlbmFibGVzIFFSRVNZTkMgc3VwcG9ydCBzbyB0aGF0IEVYUFVOR0Ugbm90aWZpY2F0aW9ucyBpbmNsdWRlIGB1aWRgIGluc3RlYWQgb2YgYHNlcWAuXG4gICAgICpcbiAgICAgKiBAcHJvcGVydHkge051bWJlcn0gW21heElkbGVUaW1lXVxuICAgICAqICAgICBJZiBzZXQsIGJyZWFrcyBhbmQgcmVzdGFydHMgSURMRSBldmVyeSBgbWF4SWRsZVRpbWVgIG1pbGxpc2Vjb25kcy5cbiAgICAgKlxuICAgICAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBbbWlzc2luZ0lkbGVDb21tYW5kPVwiTk9PUFwiXVxuICAgICAqICAgICBDb21tYW5kIHRvIHVzZSBpZiB0aGUgc2VydmVyIGRvZXMgbm90IHN1cHBvcnQgSURMRS5cbiAgICAgKlxuICAgICAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gW2Rpc2FibGVCaW5hcnk9ZmFsc2VdXG4gICAgICogICAgIElmIGB0cnVlYCwgaWdub3JlcyB0aGUgQklOQVJZIGV4dGVuc2lvbiBmb3IgRkVUQ0ggYW5kIEFQUEVORCBvcGVyYXRpb25zLlxuICAgICAqXG4gICAgICogQHByb3BlcnR5IHtCb29sZWFufSBbZGlzYWJsZUF1dG9FbmFibGU9ZmFsc2VdXG4gICAgICogICAgIElmIGB0cnVlYCwgZG8gbm90IGF1dG9tYXRpY2FsbHkgZW5hYmxlIHN1cHBvcnRlZCBJTUFQIGV4dGVuc2lvbnMuXG4gICAgICpcbiAgICAgKiBAcHJvcGVydHkge051bWJlcn0gW2Nvbm5lY3Rpb25UaW1lb3V0PTkwMDAwXVxuICAgICAqICAgICBNYXhpbXVtIHRpbWUgKGluIG1pbGxpc2Vjb25kcykgdG8gd2FpdCBmb3IgdGhlIGNvbm5lY3Rpb24gdG8gZXN0YWJsaXNoLiBEZWZhdWx0cyB0byA5MCBzZWNvbmRzLlxuICAgICAqXG4gICAgICogQHByb3BlcnR5IHtOdW1iZXJ9IFtncmVldGluZ1RpbWVvdXQ9MTYwMDBdXG4gICAgICogICAgIE1heGltdW0gdGltZSAoaW4gbWlsbGlzZWNvbmRzKSB0byB3YWl0IGZvciB0aGUgc2VydmVyIGdyZWV0aW5nIGFmdGVyIGEgY29ubmVjdGlvbiBpcyBlc3RhYmxpc2hlZC4gRGVmYXVsdHMgdG8gMTYgc2Vjb25kcy5cbiAgICAgKlxuICAgICAqIEBwcm9wZXJ0eSB7TnVtYmVyfSBbc29ja2V0VGltZW91dD0zMDAwMDBdXG4gICAgICogICAgIE1heGltdW0gcGVyaW9kIG9mIGluYWN0aXZpdHkgKGluIG1pbGxpc2Vjb25kcykgYmVmb3JlIHRlcm1pbmF0aW5nIHRoZSBjb25uZWN0aW9uLiBEZWZhdWx0cyB0byA1IG1pbnV0ZXMuXG4gICAgICovXG5cbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zKSB7XG4gICAgICAgIHN1cGVyKHsgY2FwdHVyZVJlamVjdGlvbnM6IHRydWUgfSk7XG5cbiAgICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcblxuICAgICAgICAvKipcbiAgICAgICAgICogSW5zdGFuY2UgSUQgZm9yIGxvZ3NcbiAgICAgICAgICogQHR5cGUge1N0cmluZ31cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuaWQgPSB0aGlzLm9wdGlvbnMuaWQgfHwgdGhpcy5nZXRSYW5kb21JZCgpO1xuXG4gICAgICAgIHRoaXMuY2xpZW50SW5mbyA9IE9iamVjdC5hc3NpZ24oXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgbmFtZTogcGFja2FnZUluZm8ubmFtZSxcbiAgICAgICAgICAgICAgICB2ZXJzaW9uOiBwYWNrYWdlSW5mby52ZXJzaW9uLFxuICAgICAgICAgICAgICAgIHZlbmRvcjogJ1Bvc3RhbCBTeXN0ZW1zJyxcbiAgICAgICAgICAgICAgICAnc3VwcG9ydC11cmwnOiAnaHR0cHM6Ly9naXRodWIuY29tL3Bvc3RhbHN5cy9pbWFwZmxvdy9pc3N1ZXMnXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdGhpcy5vcHRpb25zLmNsaWVudEluZm8gfHwge31cbiAgICAgICAgKTtcblxuICAgICAgICAvKipcbiAgICAgICAgICogU2VydmVyIGlkZW50aWZpY2F0aW9uIGluZm8uIEF2YWlsYWJsZSBhZnRlciBzdWNjZXNzZnVsIGBjb25uZWN0KClgLlxuICAgICAgICAgKiBJZiBzZXJ2ZXIgZG9lcyBub3QgcHJvdmlkZSBpZGVudGlmaWNhdGlvbiBpbmZvIHRoZW4gdGhpcyB2YWx1ZSBpcyBgbnVsbGAuXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqIGF3YWl0IGNsaWVudC5jb25uZWN0KCk7XG4gICAgICAgICAqIGNvbnNvbGUubG9nKGNsaWVudC5zZXJ2ZXJJbmZvLnZlbmRvcik7XG4gICAgICAgICAqIEB0eXBlIHtJZEluZm9PYmplY3R8bnVsbH1cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuc2VydmVySW5mbyA9IG51bGw7IC8vdXBkYXRlZCBieSBJRFxuXG4gICAgICAgIHRoaXMubG9nID0gdGhpcy5nZXRMb2dnZXIoKTtcblxuICAgICAgICAvKipcbiAgICAgICAgICogSXMgdGhlIGNvbm5lY3Rpb24gY3VycmVudGx5IGVuY3J5cHRlZCBvciBub3RcbiAgICAgICAgICogQHR5cGUge0Jvb2xlYW59XG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnNlY3VyZUNvbm5lY3Rpb24gPSAhIXRoaXMub3B0aW9ucy5zZWN1cmU7XG5cbiAgICAgICAgdGhpcy5wb3J0ID0gTnVtYmVyKHRoaXMub3B0aW9ucy5wb3J0KSB8fCAodGhpcy5zZWN1cmVDb25uZWN0aW9uID8gOTkzIDogMTEwKTtcbiAgICAgICAgdGhpcy5ob3N0ID0gdGhpcy5vcHRpb25zLmhvc3QgfHwgJ2xvY2FsaG9zdCc7XG4gICAgICAgIHRoaXMuc2VydmVybmFtZSA9IHRoaXMub3B0aW9ucy5zZXJ2ZXJuYW1lID8gdGhpcy5vcHRpb25zLnNlcnZlcm5hbWUgOiAhbmV0LmlzSVAodGhpcy5ob3N0KSA/IHRoaXMuaG9zdCA6IGZhbHNlO1xuXG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5vcHRpb25zLnNlY3VyZSA9PT0gJ3VuZGVmaW5lZCcgJiYgdGhpcy5wb3J0ID09PSA5OTMpIHtcbiAgICAgICAgICAgIC8vIGlmIHNlY3VyZSBvcHRpb24gaXMgbm90IHNldCBidXQgcG9ydCBpcyA0NjUsIHRoZW4gZGVmYXVsdCB0byBzZWN1cmVcbiAgICAgICAgICAgIHRoaXMuc2VjdXJlQ29ubmVjdGlvbiA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmxvZ1JhdyA9IHRoaXMub3B0aW9ucy5sb2dSYXc7XG4gICAgICAgIHRoaXMuc3RyZWFtZXIgPSBuZXcgSW1hcFN0cmVhbSh7XG4gICAgICAgICAgICBsb2dnZXI6IHRoaXMubG9nLFxuICAgICAgICAgICAgY2lkOiB0aGlzLmlkLFxuICAgICAgICAgICAgbG9nUmF3OiB0aGlzLmxvZ1JhdyxcbiAgICAgICAgICAgIHNlY3VyZUNvbm5lY3Rpb246IHRoaXMuc2VjdXJlQ29ubmVjdGlvblxuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLnJlYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5zb2NrZXQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy53cml0ZVNvY2tldCA9IGZhbHNlO1xuXG4gICAgICAgIHRoaXMuc3RhdGVzID0gc3RhdGVzO1xuICAgICAgICB0aGlzLnN0YXRlID0gdGhpcy5zdGF0ZXMuTk9UX0FVVEhFTlRJQ0FURUQ7XG5cbiAgICAgICAgdGhpcy5sb2NrQ291bnRlciA9IDA7XG4gICAgICAgIHRoaXMuY3VycmVudExvY2sgPSBmYWxzZTtcblxuICAgICAgICB0aGlzLnRhZ0NvdW50ZXIgPSAwO1xuICAgICAgICB0aGlzLnJlcXVlc3RUYWdNYXAgPSBuZXcgTWFwKCk7XG4gICAgICAgIHRoaXMucmVxdWVzdFF1ZXVlID0gW107XG4gICAgICAgIHRoaXMuY3VycmVudFJlcXVlc3QgPSBmYWxzZTtcblxuICAgICAgICB0aGlzLndyaXRlQnl0ZXNDb3VudGVyID0gMDtcblxuICAgICAgICB0aGlzLmNvbW1hbmRQYXJ0cyA9IFtdO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBY3RpdmUgSU1BUCBjYXBhYmlsaXRpZXMuIFZhbHVlIGlzIGVpdGhlciBgdHJ1ZWAgZm9yIHRvZ2dsYWJlIGNhcGFiaWxpdGllcyAoZWcuIGBVSURQTFVTYClcbiAgICAgICAgICogb3IgYSBudW1iZXIgZm9yIGNhcGFiaWxpdGllcyB3aXRoIGEgdmFsdWUgKGVnLiBgQVBQRU5ETElNSVRgKVxuICAgICAgICAgKiBAdHlwZSB7TWFwPHN0cmluZywgYm9vbGVhbnxudW1iZXI+fVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5jYXBhYmlsaXRpZXMgPSBuZXcgTWFwKCk7XG4gICAgICAgIHRoaXMuYXV0aENhcGFiaWxpdGllcyA9IG5ldyBNYXAoKTtcblxuICAgICAgICB0aGlzLnJhd0NhcGFiaWxpdGllcyA9IG51bGw7XG5cbiAgICAgICAgdGhpcy5leHBlY3RDYXBhYmlsaXR5VXBkYXRlID0gZmFsc2U7IC8vIGZvcmNlIENBUEFCSUxJVFkgYWZ0ZXIgTE9HSU5cblxuICAgICAgICAvKipcbiAgICAgICAgICogRW5hYmxlZCBjYXBhYmlsaXRpZXMuIFVzdWFsbHkgYENPTkRTVE9SRWAgYW5kIGBVVEY4PUFDQ0VQVGAgaWYgc2VydmVyIHN1cHBvcnRzIHRoZXNlLlxuICAgICAgICAgKiBAdHlwZSB7U2V0PHN0cmluZz59XG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmVuYWJsZWQgPSBuZXcgU2V0KCk7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIElzIHRoZSBjb25uZWN0aW9uIGN1cnJlbnRseSB1c2FibGUgb3Igbm90XG4gICAgICAgICAqIEB0eXBlIHtCb29sZWFufVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy51c2FibGUgPSBmYWxzZTtcblxuICAgICAgICAvKipcbiAgICAgICAgICogQ3VycmVudGx5IGF1dGhlbnRpY2F0ZWQgdXNlciBvciBgZmFsc2VgIGlmIG1haWxib3ggaXMgbm90IG9wZW5cbiAgICAgICAgICogb3IgYHRydWVgIGlmIGNvbm5lY3Rpb24gd2FzIGF1dGhlbnRpY2F0ZWQgYnkgUFJFQVVUSFxuICAgICAgICAgKiBAdHlwZSB7U3RyaW5nfEJvb2xlYW59XG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmF1dGhlbnRpY2F0ZWQgPSBmYWxzZTtcblxuICAgICAgICAvKipcbiAgICAgICAgICogQ3VycmVudGx5IHNlbGVjdGVkIG1haWxib3ggb3IgYGZhbHNlYCBpZiBtYWlsYm94IGlzIG5vdCBvcGVuXG4gICAgICAgICAqIEB0eXBlIHtNYWlsYm94T2JqZWN0fEJvb2xlYW59XG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLm1haWxib3ggPSBmYWxzZTtcbiAgICAgICAgdGhpcy5jdXJyZW50U2VsZWN0Q29tbWFuZCA9IGZhbHNlO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBJcyBjdXJyZW50IG1haWxib3ggaWRsaW5nIChgdHJ1ZWApIG9yIG5vdCAoYGZhbHNlYClcbiAgICAgICAgICogQHR5cGUge0Jvb2xlYW59XG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmlkbGluZyA9IGZhbHNlO1xuXG4gICAgICAgIHRoaXMuZW1pdExvZ3MgPSAhIXRoaXMub3B0aW9ucy5lbWl0TG9ncztcbiAgICAgICAgLy8gb3JkZXJpbmcgbnVtYmVyIGZvciBlbWl0dGVkIGxvZ3NcbiAgICAgICAgdGhpcy5sbyA9IDA7XG5cbiAgICAgICAgdGhpcy51bnRhZ2dlZEhhbmRsZXJzID0ge307XG4gICAgICAgIHRoaXMuc2VjdGlvbkhhbmRsZXJzID0ge307XG5cbiAgICAgICAgdGhpcy5jb21tYW5kcyA9IGltYXBDb21tYW5kcztcblxuICAgICAgICB0aGlzLmZvbGRlcnMgPSBuZXcgTWFwKCk7XG5cbiAgICAgICAgdGhpcy5jdXJyZW50TG9jayA9IGZhbHNlO1xuICAgICAgICB0aGlzLmxvY2tzID0gW107XG5cbiAgICAgICAgdGhpcy5pZFJlcXVlc3RlZCA9IGZhbHNlO1xuXG4gICAgICAgIHRoaXMubWF4SWRsZVRpbWUgPSB0aGlzLm9wdGlvbnMubWF4SWRsZVRpbWUgfHwgZmFsc2U7XG4gICAgICAgIHRoaXMubWlzc2luZ0lkbGVDb21tYW5kID0gKHRoaXMub3B0aW9ucy5taXNzaW5nSWRsZUNvbW1hbmQgfHwgJycpLnRvU3RyaW5nKCkudG9VcHBlckNhc2UoKS50cmltKCkgfHwgJ05PT1AnO1xuXG4gICAgICAgIHRoaXMuZGlzYWJsZUJpbmFyeSA9ICEhdGhpcy5vcHRpb25zLmRpc2FibGVCaW5hcnk7XG5cbiAgICAgICAgdGhpcy5zdHJlYW1lci5vbignZXJyb3InLCBlcnIgPT4ge1xuICAgICAgICAgICAgaWYgKFsnWl9CVUZfRVJST1InLCAnRUNPTk5SRVNFVCcsICdFUElQRScsICdFVElNRURPVVQnLCAnRUhPU1RVTlJFQUNIJ10uaW5jbHVkZXMoZXJyLmNvZGUpKSB7XG4gICAgICAgICAgICAgICAgLy8ganVzdCBjbG9zZSB0aGUgY29ubmVjdGlvbiwgdXN1YWxseSBub3RoaW5nIGJ1dCBub2lzZVxuICAgICAgICAgICAgICAgIHJldHVybiBzZXRJbW1lZGlhdGUoKCkgPT4gdGhpcy5jbG9zZSgpKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5sb2cuZXJyb3IoeyBlcnIsIGNpZDogdGhpcy5pZCB9KTtcbiAgICAgICAgICAgIHNldEltbWVkaWF0ZSgoKSA9PiB0aGlzLmNsb3NlKCkpO1xuICAgICAgICAgICAgdGhpcy5lbWl0RXJyb3IoZXJyKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gSGFzIHRoZSBgY29ubmVjdGAgbWV0aG9kIGFscmVhZHkgYmVlbiBjYWxsZWRcbiAgICAgICAgdGhpcy5fY29ubmVjdENhbGxlZCA9IGZhbHNlO1xuICAgIH1cblxuICAgIGVtaXRFcnJvcihlcnIpIHtcbiAgICAgICAgdGhpcy5lbWl0KCdlcnJvcicsIGVycik7XG4gICAgfVxuXG4gICAgZ2V0UmFuZG9tSWQoKSB7XG4gICAgICAgIGxldCByaWQgPSBCaWdJbnQoJzB4JyArIGNyeXB0by5yYW5kb21CeXRlcygxMykudG9TdHJpbmcoJ2hleCcpKS50b1N0cmluZygzNik7XG4gICAgICAgIGlmIChyaWQubGVuZ3RoIDwgMjApIHtcbiAgICAgICAgICAgIHJpZCA9ICcwJy5yZXBlYXQoMjAgLSByaWQubGVuZ3RoKSArIHJpZDtcbiAgICAgICAgfSBlbHNlIGlmIChyaWQubGVuZ3RoID4gMjApIHtcbiAgICAgICAgICAgIHJpZCA9IHJpZC5zdWJzdHIoMCwgMjApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByaWQ7XG4gICAgfVxuXG4gICAgd3JpdGUoY2h1bmspIHtcbiAgICAgICAgaWYgKHRoaXMuc29ja2V0LmRlc3Ryb3llZCkge1xuICAgICAgICAgICAgLy8gZG8gbm90IHdyaXRlIGFmdGVyIGNvbm5lY3Rpb24gZW5kIG9yIGxvZ291dFxuICAgICAgICAgICAgY29uc3QgZXJyb3IgPSBuZXcgRXJyb3IoJ1NvY2tldCBpcyBhbHJlYWR5IGNsb3NlZCcpO1xuICAgICAgICAgICAgZXJyb3IuY29kZSA9ICdOb0Nvbm5lY3Rpb24nO1xuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5zdGF0ZSA9PT0gdGhpcy5zdGF0ZXMuTE9HT1VUKSB7XG4gICAgICAgICAgICAvLyBzaG91bGQgbm90IGhhcHBlblxuICAgICAgICAgICAgY29uc3QgZXJyb3IgPSBuZXcgRXJyb3IoJ0NhbiBub3Qgc2VuZCBkYXRhIGFmdGVyIGxvZ2dlZCBvdXQnKTtcbiAgICAgICAgICAgIGVycm9yLmNvZGUgPSAnU3RhdGVMb2dvdXQnO1xuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy53cml0ZVNvY2tldC5kZXN0cm95ZWQpIHtcbiAgICAgICAgICAgIHRoaXMuc29ja2V0LmVtaXQoJ2Vycm9yJywgJ1dyaXRlIHNvY2tldCBkZXN0cm95ZWQnKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBhZGRMaW5lQnJlYWsgPSAhdGhpcy5jb21tYW5kUGFydHMubGVuZ3RoO1xuICAgICAgICBpZiAodHlwZW9mIGNodW5rID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgaWYgKGFkZExpbmVCcmVhaykge1xuICAgICAgICAgICAgICAgIGNodW5rICs9ICdcXHJcXG4nO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2h1bmsgPSBCdWZmZXIuZnJvbShjaHVuaywgJ2JpbmFyeScpO1xuICAgICAgICB9IGVsc2UgaWYgKEJ1ZmZlci5pc0J1ZmZlcihjaHVuaykpIHtcbiAgICAgICAgICAgIGlmIChhZGRMaW5lQnJlYWspIHtcbiAgICAgICAgICAgICAgICBjaHVuayA9IEJ1ZmZlci5jb25jYXQoW2NodW5rLCBCdWZmZXIuZnJvbSgnXFxyXFxuJyldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmxvZ1Jhdykge1xuICAgICAgICAgICAgdGhpcy5sb2cudHJhY2Uoe1xuICAgICAgICAgICAgICAgIHNyYzogJ2MnLFxuICAgICAgICAgICAgICAgIG1zZzogJ3dyaXRlIHRvIHNvY2tldCcsXG4gICAgICAgICAgICAgICAgZGF0YTogY2h1bmsudG9TdHJpbmcoJ2Jhc2U2NCcpLFxuICAgICAgICAgICAgICAgIGNvbXByZXNzOiAhIXRoaXMuX2RlZmxhdGUsXG4gICAgICAgICAgICAgICAgc2VjdXJlOiAhIXRoaXMuc2VjdXJlQ29ubmVjdGlvbixcbiAgICAgICAgICAgICAgICBjaWQ6IHRoaXMuaWRcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy53cml0ZUJ5dGVzQ291bnRlciArPSBjaHVuay5sZW5ndGg7XG5cbiAgICAgICAgdGhpcy53cml0ZVNvY2tldC53cml0ZShjaHVuayk7XG4gICAgfVxuXG4gICAgc3RhdHMocmVzZXQpIHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IHtcbiAgICAgICAgICAgIHNlbnQ6IHRoaXMud3JpdGVCeXRlc0NvdW50ZXIgfHwgMCxcbiAgICAgICAgICAgIHJlY2VpdmVkOiAodGhpcy5zdHJlYW1lciAmJiB0aGlzLnN0cmVhbWVyLnJlYWRCeXRlc0NvdW50ZXIpIHx8IDBcbiAgICAgICAgfTtcblxuICAgICAgICBpZiAocmVzZXQpIHtcbiAgICAgICAgICAgIHRoaXMud3JpdGVCeXRlc0NvdW50ZXIgPSAwO1xuICAgICAgICAgICAgaWYgKHRoaXMuc3RyZWFtZXIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnN0cmVhbWVyLnJlYWRCeXRlc0NvdW50ZXIgPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICBhc3luYyBzZW5kKGRhdGEpIHtcbiAgICAgICAgaWYgKHRoaXMuc3RhdGUgPT09IHRoaXMuc3RhdGVzLkxPR09VVCkge1xuICAgICAgICAgICAgLy8gYWxyZWFkeSBsb2dnZWQgb3V0XG4gICAgICAgICAgICBpZiAoZGF0YS50YWcpIHtcbiAgICAgICAgICAgICAgICBsZXQgcmVxdWVzdCA9IHRoaXMucmVxdWVzdFRhZ01hcC5nZXQoZGF0YS50YWcpO1xuICAgICAgICAgICAgICAgIGlmIChyZXF1ZXN0KSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVxdWVzdFRhZ01hcC5kZWxldGUocmVxdWVzdC50YWcpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBlcnJvciA9IG5ldyBFcnJvcignQ29ubmVjdGlvbiBub3QgYXZhaWxhYmxlJyk7XG4gICAgICAgICAgICAgICAgICAgIGVycm9yLmNvZGUgPSAnTm9Db25uZWN0aW9uJztcbiAgICAgICAgICAgICAgICAgICAgcmVxdWVzdC5yZWplY3QoZXJyb3IpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBjb21waWxlZCA9IGF3YWl0IGNvbXBpbGVyKGRhdGEsIHtcbiAgICAgICAgICAgIGFzQXJyYXk6IHRydWUsXG4gICAgICAgICAgICBsaXRlcmFsTWludXM6IHRoaXMuY2FwYWJpbGl0aWVzLmhhcygnTElURVJBTC0nKSB8fCB0aGlzLmNhcGFiaWxpdGllcy5oYXMoJ0xJVEVSQUwrJylcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuY29tbWFuZFBhcnRzID0gY29tcGlsZWQ7XG5cbiAgICAgICAgbGV0IGxvZ0NvbXBpbGVkID0gYXdhaXQgY29tcGlsZXIoZGF0YSwge1xuICAgICAgICAgICAgaXNMb2dnaW5nOiB0cnVlXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGxldCBvcHRpb25zID0gZGF0YS5vcHRpb25zIHx8IHt9O1xuXG4gICAgICAgIHRoaXMubG9nLmRlYnVnKHsgc3JjOiAncycsIG1zZzogbG9nQ29tcGlsZWQudG9TdHJpbmcoKSwgY2lkOiB0aGlzLmlkLCBjb21tZW50OiBvcHRpb25zLmNvbW1lbnQgfSk7XG5cbiAgICAgICAgdGhpcy53cml0ZSh0aGlzLmNvbW1hbmRQYXJ0cy5zaGlmdCgpKTtcblxuICAgICAgICBpZiAodHlwZW9mIG9wdGlvbnMub25TZW5kID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBvcHRpb25zLm9uU2VuZCgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYXN5bmMgdHJ5U2VuZCgpIHtcbiAgICAgICAgaWYgKHRoaXMuY3VycmVudFJlcXVlc3QgfHwgIXRoaXMucmVxdWVzdFF1ZXVlLmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY3VycmVudFJlcXVlc3QgPSB0aGlzLnJlcXVlc3RRdWV1ZS5zaGlmdCgpO1xuXG4gICAgICAgIGF3YWl0IHRoaXMuc2VuZCh7XG4gICAgICAgICAgICB0YWc6IHRoaXMuY3VycmVudFJlcXVlc3QudGFnLFxuICAgICAgICAgICAgY29tbWFuZDogdGhpcy5jdXJyZW50UmVxdWVzdC5jb21tYW5kLFxuICAgICAgICAgICAgYXR0cmlidXRlczogdGhpcy5jdXJyZW50UmVxdWVzdC5hdHRyaWJ1dGVzLFxuICAgICAgICAgICAgb3B0aW9uczogdGhpcy5jdXJyZW50UmVxdWVzdC5vcHRpb25zXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGFzeW5jIGV4ZWMoY29tbWFuZCwgYXR0cmlidXRlcywgb3B0aW9ucykge1xuICAgICAgICBpZiAodGhpcy5zb2NrZXQuZGVzdHJveWVkKSB7XG4gICAgICAgICAgICBsZXQgZXJyb3IgPSBuZXcgRXJyb3IoJ0Nvbm5lY3Rpb24gY2xvc2VkJyk7XG4gICAgICAgICAgICBlcnJvci5jb2RlID0gJ0VDb25uZWN0aW9uQ2xvc2VkJztcbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHRhZyA9ICgrK3RoaXMudGFnQ291bnRlcikudG9TdHJpbmcoMTYpLnRvVXBwZXJDYXNlKCk7XG5cbiAgICAgICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIHRoaXMucmVxdWVzdFRhZ01hcC5zZXQodGFnLCB7IGNvbW1hbmQsIGF0dHJpYnV0ZXMsIG9wdGlvbnMsIHJlc29sdmUsIHJlamVjdCB9KTtcbiAgICAgICAgICAgIHRoaXMucmVxdWVzdFF1ZXVlLnB1c2goeyB0YWcsIGNvbW1hbmQsIGF0dHJpYnV0ZXMsIG9wdGlvbnMgfSk7XG4gICAgICAgICAgICB0aGlzLnRyeVNlbmQoKS5jYXRjaChlcnIgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMucmVxdWVzdFRhZ01hcC5kZWxldGUodGFnKTtcbiAgICAgICAgICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBnZXRVbnRhZ2dlZEhhbmRsZXIoY29tbWFuZCwgYXR0cmlidXRlcykge1xuICAgICAgICBpZiAoL15bMC05XSskLy50ZXN0KGNvbW1hbmQpKSB7XG4gICAgICAgICAgICBsZXQgdHlwZSA9IGF0dHJpYnV0ZXMgJiYgYXR0cmlidXRlcy5sZW5ndGggJiYgdHlwZW9mIGF0dHJpYnV0ZXNbMF0udmFsdWUgPT09ICdzdHJpbmcnID8gYXR0cmlidXRlc1swXS52YWx1ZS50b1VwcGVyQ2FzZSgpIDogZmFsc2U7XG4gICAgICAgICAgICBpZiAodHlwZSkge1xuICAgICAgICAgICAgICAgIC8vIEVYSVNUUywgRVhQVU5HRSwgUkVDRU5ULCBGRVRDSCBldGNcbiAgICAgICAgICAgICAgICBjb21tYW5kID0gdHlwZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbW1hbmQgPSBjb21tYW5kLnRvVXBwZXJDYXNlKCkudHJpbSgpO1xuICAgICAgICBpZiAodGhpcy5jdXJyZW50UmVxdWVzdCAmJiB0aGlzLmN1cnJlbnRSZXF1ZXN0Lm9wdGlvbnMgJiYgdGhpcy5jdXJyZW50UmVxdWVzdC5vcHRpb25zLnVudGFnZ2VkICYmIHRoaXMuY3VycmVudFJlcXVlc3Qub3B0aW9ucy51bnRhZ2dlZFtjb21tYW5kXSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY3VycmVudFJlcXVlc3Qub3B0aW9ucy51bnRhZ2dlZFtjb21tYW5kXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLnVudGFnZ2VkSGFuZGxlcnNbY29tbWFuZF0pIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnVudGFnZ2VkSGFuZGxlcnNbY29tbWFuZF07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBnZXRTZWN0aW9uSGFuZGxlcihrZXkpIHtcbiAgICAgICAgaWYgKHRoaXMuc2VjdGlvbkhhbmRsZXJzW2tleV0pIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnNlY3Rpb25IYW5kbGVyc1trZXldO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYXN5bmMgcmVhZGVyKCkge1xuICAgICAgICBsZXQgZGF0YTtcbiAgICAgICAgd2hpbGUgKChkYXRhID0gdGhpcy5zdHJlYW1lci5yZWFkKCkpICE9PSBudWxsKSB7XG4gICAgICAgICAgICBsZXQgcGFyc2VkO1xuXG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHBhcnNlZCA9IGF3YWl0IHBhcnNlcihkYXRhLnBheWxvYWQsIHsgbGl0ZXJhbHM6IGRhdGEubGl0ZXJhbHMgfSk7XG4gICAgICAgICAgICAgICAgaWYgKHBhcnNlZC50YWcgJiYgIVsnKicsICcrJ10uaW5jbHVkZXMocGFyc2VkLnRhZykgJiYgcGFyc2VkLmNvbW1hbmQpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHBheWxvYWQgPSB7IHJlc3BvbnNlOiBwYXJzZWQuY29tbWFuZCB9O1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlZC5hdHRyaWJ1dGVzICYmXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJzZWQuYXR0cmlidXRlc1swXSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VkLmF0dHJpYnV0ZXNbMF0uc2VjdGlvbiAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VkLmF0dHJpYnV0ZXNbMF0uc2VjdGlvblswXSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VkLmF0dHJpYnV0ZXNbMF0uc2VjdGlvblswXS50eXBlID09PSAnQVRPTSdcbiAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXlsb2FkLmNvZGUgPSBwYXJzZWQuYXR0cmlidXRlc1swXS5zZWN0aW9uWzBdLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZW1pdCgncmVzcG9uc2UnLCBwYXlsb2FkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICAvLyBjYW4gbm90IG1ha2Ugc2Vuc2Ugb2YgdGhpc1xuICAgICAgICAgICAgICAgIHRoaXMubG9nLmVycm9yKHsgc3JjOiAncycsIG1zZzogZGF0YS5wYXlsb2FkLnRvU3RyaW5nKCksIGVyciwgY2lkOiB0aGlzLmlkIH0pO1xuICAgICAgICAgICAgICAgIGRhdGEubmV4dCgpO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsZXQgbG9nQ29tcGlsZWQgPSBhd2FpdCBjb21waWxlcihwYXJzZWQsIHtcbiAgICAgICAgICAgICAgICBpc0xvZ2dpbmc6IHRydWVcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBpZiAoL15cXGQrJC8udGVzdChwYXJzZWQuY29tbWFuZCkgJiYgcGFyc2VkLmF0dHJpYnV0ZXMgJiYgcGFyc2VkLmF0dHJpYnV0ZXNbMF0gJiYgcGFyc2VkLmF0dHJpYnV0ZXNbMF0udmFsdWUgPT09ICdGRVRDSCcpIHtcbiAgICAgICAgICAgICAgICAvLyB0b28gbWFueSBGRVRDSCByZXNwb25zZXMsIG1pZ2h0IHdhbnQgdG8gZmlsdGVyIHRoZXNlIG91dFxuICAgICAgICAgICAgICAgIHRoaXMubG9nLnRyYWNlKHsgc3JjOiAncycsIG1zZzogbG9nQ29tcGlsZWQudG9TdHJpbmcoKSwgY2lkOiB0aGlzLmlkLCBudWxsQnl0ZXNSZW1vdmVkOiBwYXJzZWQubnVsbEJ5dGVzUmVtb3ZlZCB9KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2cuZGVidWcoeyBzcmM6ICdzJywgbXNnOiBsb2dDb21waWxlZC50b1N0cmluZygpLCBjaWQ6IHRoaXMuaWQsIG51bGxCeXRlc1JlbW92ZWQ6IHBhcnNlZC5udWxsQnl0ZXNSZW1vdmVkIH0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAocGFyc2VkLnRhZyA9PT0gJysnICYmIHRoaXMuY3VycmVudFJlcXVlc3QgJiYgdGhpcy5jdXJyZW50UmVxdWVzdC5vcHRpb25zICYmIHR5cGVvZiB0aGlzLmN1cnJlbnRSZXF1ZXN0Lm9wdGlvbnMub25QbHVzVGFnID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5jdXJyZW50UmVxdWVzdC5vcHRpb25zLm9uUGx1c1RhZyhwYXJzZWQpO1xuICAgICAgICAgICAgICAgIGRhdGEubmV4dCgpO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAocGFyc2VkLnRhZyA9PT0gJysnICYmIHRoaXMuY29tbWFuZFBhcnRzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIGxldCBjb250ZW50ID0gdGhpcy5jb21tYW5kUGFydHMuc2hpZnQoKTtcbiAgICAgICAgICAgICAgICB0aGlzLndyaXRlKGNvbnRlbnQpO1xuICAgICAgICAgICAgICAgIHRoaXMubG9nLmRlYnVnKHsgc3JjOiAnYycsIG1zZzogYCgqICR7Y29udGVudC5sZW5ndGh9QiBjb250aW51YXRpb24gKilgLCBjaWQ6IHRoaXMuaWQgfSk7XG4gICAgICAgICAgICAgICAgZGF0YS5uZXh0KCk7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxldCBzZWN0aW9uID0gcGFyc2VkLmF0dHJpYnV0ZXMgJiYgcGFyc2VkLmF0dHJpYnV0ZXMubGVuZ3RoICYmIHBhcnNlZC5hdHRyaWJ1dGVzWzBdICYmICFwYXJzZWQuYXR0cmlidXRlc1swXS52YWx1ZSAmJiBwYXJzZWQuYXR0cmlidXRlc1swXS5zZWN0aW9uO1xuICAgICAgICAgICAgaWYgKHNlY3Rpb24gJiYgc2VjdGlvbi5sZW5ndGggJiYgc2VjdGlvblswXS50eXBlID09PSAnQVRPTScgJiYgdHlwZW9mIHNlY3Rpb25bMF0udmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgbGV0IHNlY3Rpb25IYW5kbGVyID0gdGhpcy5nZXRTZWN0aW9uSGFuZGxlcihzZWN0aW9uWzBdLnZhbHVlLnRvVXBwZXJDYXNlKCkudHJpbSgpKTtcbiAgICAgICAgICAgICAgICBpZiAoc2VjdGlvbkhhbmRsZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgc2VjdGlvbkhhbmRsZXIoc2VjdGlvbi5zbGljZSgxKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAocGFyc2VkLnRhZyA9PT0gJyonICYmIHBhcnNlZC5jb21tYW5kKSB7XG4gICAgICAgICAgICAgICAgbGV0IHVudGFnZ2VkSGFuZGxlciA9IHRoaXMuZ2V0VW50YWdnZWRIYW5kbGVyKHBhcnNlZC5jb21tYW5kLCBwYXJzZWQuYXR0cmlidXRlcyk7XG4gICAgICAgICAgICAgICAgaWYgKHVudGFnZ2VkSGFuZGxlcikge1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgdW50YWdnZWRIYW5kbGVyKHBhcnNlZCk7XG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2cud2Fybih7IGVyciwgY2lkOiB0aGlzLmlkIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5uZXh0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHRoaXMucmVxdWVzdFRhZ01hcC5oYXMocGFyc2VkLnRhZykpIHtcbiAgICAgICAgICAgICAgICBsZXQgcmVxdWVzdCA9IHRoaXMucmVxdWVzdFRhZ01hcC5nZXQocGFyc2VkLnRhZyk7XG4gICAgICAgICAgICAgICAgdGhpcy5yZXF1ZXN0VGFnTWFwLmRlbGV0ZShwYXJzZWQudGFnKTtcblxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmN1cnJlbnRSZXF1ZXN0ICYmIHRoaXMuY3VycmVudFJlcXVlc3QudGFnID09PSBwYXJzZWQudGFnKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIHNlbmQgbmV4dCBwZW5kaW5nIGNvbW1hbmRcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50UmVxdWVzdCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnRyeVNlbmQoKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBzd2l0Y2ggKHBhcnNlZC5jb21tYW5kLnRvVXBwZXJDYXNlKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnT0snOlxuICAgICAgICAgICAgICAgICAgICBjYXNlICdCWUUnOlxuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgbmV3IFByb21pc2UocmVzb2x2ZSA9PiByZXF1ZXN0LnJlc29sdmUoeyByZXNwb25zZTogcGFyc2VkLCBuZXh0OiByZXNvbHZlIH0pKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ05PJzpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnQkFEJzoge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHR4dCA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VkLmF0dHJpYnV0ZXMgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZWQuYXR0cmlidXRlc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKHZhbCA9PiB2YWwudHlwZSA9PT0gJ1RFWFQnKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubWFwKHZhbCA9PiB2YWwudmFsdWUudHJpbSgpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuam9pbignICcpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgZXJyID0gbmV3IEVycm9yKCdDb21tYW5kIGZhaWxlZCcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZXJyLnJlc3BvbnNlID0gcGFyc2VkO1xuICAgICAgICAgICAgICAgICAgICAgICAgZXJyLnJlc3BvbnNlU3RhdHVzID0gcGFyc2VkLmNvbW1hbmQudG9VcHBlckNhc2UoKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIuZXhlY3V0ZWRDb21tYW5kID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VkLnRhZyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGNvbXBpbGVyKHJlcXVlc3QsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0xvZ2dpbmc6IHRydWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkudG9TdHJpbmcoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHh0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyLnJlc3BvbnNlVGV4dCA9IHR4dDtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcnIucmVzcG9uc2VTdGF0dXMgPT09ICdOTycgJiYgdHh0LmluY2x1ZGVzKCdTb21lIG9mIHRoZSByZXF1ZXN0ZWQgbWVzc2FnZXMgbm8gbG9uZ2VyIGV4aXN0JykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVHJlYXQgYXMgc3VjY2Vzc2Z1bCByZXNwb25zZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZy53YXJuKHsgbXNnOiAnUGFydGlhbCBGRVRDSCByZXNwb25zZScsIGNpZDogdGhpcy5pZCwgZXJyIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHJlcXVlc3QucmVzb2x2ZSh7IHJlc3BvbnNlOiBwYXJzZWQsIG5leHQ6IHJlc29sdmUgfSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgdGhyb3R0bGVEZWxheSA9IGZhbHNlO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTVMzNjUgdGhyb3R0bGluZ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRhZyBCQUQgUmVxdWVzdCBpcyB0aHJvdHRsZWQuIFN1Z2dlc3RlZCBCYWNrb2ZmIFRpbWU6IDkyNDE1IG1pbGxpc2Vjb25kc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgvUmVxdWVzdCBpcyB0aHJvdHRsZWQvaS50ZXN0KHR4dCkgJiYgL0JhY2tvZmYgVGltZS9pLnRlc3QodHh0KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgdGhyb3R0bGluZ01hdGNoID0gdHh0Lm1hdGNoKC9CYWNrb2ZmIFRpbWVbOj1cXHNdKyhcXGQrKS9pKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRocm90dGxpbmdNYXRjaCAmJiB0aHJvdHRsaW5nTWF0Y2hbMV0gJiYgIWlzTmFOKHRocm90dGxpbmdNYXRjaFsxXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm90dGxlRGVsYXkgPSBOdW1iZXIodGhyb3R0bGluZ01hdGNoWzFdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdhaXQgYW5kIHJldHVybiBhIHRocm90dGxpbmcgZXJyb3JcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhyb3R0bGVEZWxheSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIuY29kZSA9ICdFVEhST1RUTEUnO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIudGhyb3R0bGVSZXNldCA9IHRocm90dGxlRGVsYXk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGRlbGF5UmVzcG9uc2UgPSB0aHJvdHRsZURlbGF5O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVsYXlSZXNwb25zZSA+IDUgKiA2MCAqIDEwMDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1heCBkZWxheSBjYXBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGF5UmVzcG9uc2UgPSA1ICogNjAgKiAxMDAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2cud2Fybih7IG1zZzogJ1Rocm90dGxpbmcgZGV0ZWN0ZWQnLCBjaWQ6IHRoaXMuaWQsIHRocm90dGxlRGVsYXksIGRlbGF5UmVzcG9uc2UsIGVyciB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgbmV3IFByb21pc2UociA9PiBzZXRUaW1lb3V0KHIsIGRlbGF5UmVzcG9uc2UpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QucmVqZWN0KGVycik7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBlcnIgPSBuZXcgRXJyb3IoJ0ludmFsaWQgc2VydmVyIHJlc3BvbnNlJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBlcnIuY29kZSA9ICdJbnZhbGlkUmVzcG9uc2UnO1xuICAgICAgICAgICAgICAgICAgICAgICAgZXJyLnJlc3BvbnNlID0gcGFyc2VkO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdC5yZWplY3QoZXJyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBkYXRhLm5leHQoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHNldEV2ZW50SGFuZGxlcnMoKSB7XG4gICAgICAgIHRoaXMuc29ja2V0UmVhZGFibGUgPSAoKSA9PiB7XG4gICAgICAgICAgICBpZiAoIXRoaXMucmVhZGluZykge1xuICAgICAgICAgICAgICAgIHRoaXMucmVhZGluZyA9IHRydWU7XG4gICAgICAgICAgICAgICAgdGhpcy5yZWFkZXIoKVxuICAgICAgICAgICAgICAgICAgICAuY2F0Y2goZXJyID0+IHRoaXMubG9nLmVycm9yKHsgZXJyLCBjaWQ6IHRoaXMuaWQgfSkpXG4gICAgICAgICAgICAgICAgICAgIC5maW5hbGx5KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVhZGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICB0aGlzLnN0cmVhbWVyLm9uKCdyZWFkYWJsZScsIHRoaXMuc29ja2V0UmVhZGFibGUpO1xuICAgIH1cblxuICAgIHNldFNvY2tldEhhbmRsZXJzKCkge1xuICAgICAgICB0aGlzLl9zb2NrZXRFcnJvciA9XG4gICAgICAgICAgICB0aGlzLl9zb2NrZXRFcnJvciB8fFxuICAgICAgICAgICAgKGVyciA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2cuZXJyb3IoeyBlcnIsIGNpZDogdGhpcy5pZCB9KTtcbiAgICAgICAgICAgICAgICBzZXRJbW1lZGlhdGUoKCkgPT4gdGhpcy5jbG9zZSgpKTtcbiAgICAgICAgICAgICAgICB0aGlzLmVtaXRFcnJvcihlcnIpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuX3NvY2tldENsb3NlID1cbiAgICAgICAgICAgIHRoaXMuX3NvY2tldENsb3NlIHx8XG4gICAgICAgICAgICAoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuY2xvc2UoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB0aGlzLl9zb2NrZXRFbmQgPVxuICAgICAgICAgICAgdGhpcy5fc29ja2V0RW5kIHx8XG4gICAgICAgICAgICAoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuY2xvc2UoKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuX3NvY2tldFRpbWVvdXQgPVxuICAgICAgICAgICAgdGhpcy5fc29ja2V0VGltZW91dCB8fFxuICAgICAgICAgICAgKCgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5pZGxpbmcpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ydW4oJ05PT1AnKVxuICAgICAgICAgICAgICAgICAgICAgICAgLnRoZW4oKCkgPT4gdGhpcy5pZGxlKCkpXG4gICAgICAgICAgICAgICAgICAgICAgICAuY2F0Y2godGhpcy5fc29ja2V0RXJyb3IpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubG9nLmRlYnVnKHsgbXNnOiAnU29ja2V0IHRpbWVvdXQnLCBjaWQ6IHRoaXMuaWQgfSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2xvc2UoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLnNvY2tldC5vbignZXJyb3InLCB0aGlzLl9zb2NrZXRFcnJvcik7XG4gICAgICAgIHRoaXMuc29ja2V0Lm9uKCdjbG9zZScsIHRoaXMuX3NvY2tldENsb3NlKTtcbiAgICAgICAgdGhpcy5zb2NrZXQub24oJ2VuZCcsIHRoaXMuX3NvY2tldEVuZCk7XG4gICAgICAgIHRoaXMuc29ja2V0Lm9uKCd0bHNDbGllbnRFcnJvcicsIHRoaXMuX3NvY2tldEVycm9yKTtcbiAgICAgICAgdGhpcy5zb2NrZXQub24oJ3RpbWVvdXQnLCB0aGlzLl9zb2NrZXRUaW1lb3V0KTtcblxuICAgICAgICB0aGlzLndyaXRlU29ja2V0Lm9uKCdlcnJvcicsIHRoaXMuX3NvY2tldEVycm9yKTtcbiAgICB9XG5cbiAgICBjbGVhclNvY2tldEhhbmRsZXJzKCkge1xuICAgICAgICBpZiAodGhpcy5fc29ja2V0RXJyb3IpIHtcbiAgICAgICAgICAgIHRoaXMuc29ja2V0LnJlbW92ZUxpc3RlbmVyKCdlcnJvcicsIHRoaXMuX3NvY2tldEVycm9yKTtcbiAgICAgICAgICAgIHRoaXMuc29ja2V0LnJlbW92ZUxpc3RlbmVyKCd0bHNDbGllbnRFcnJvcicsIHRoaXMuX3NvY2tldEVycm9yKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5fc29ja2V0Q2xvc2UpIHtcbiAgICAgICAgICAgIHRoaXMuc29ja2V0LnJlbW92ZUxpc3RlbmVyKCdjbG9zZScsIHRoaXMuX3NvY2tldENsb3NlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5fc29ja2V0RW5kKSB7XG4gICAgICAgICAgICB0aGlzLnNvY2tldC5yZW1vdmVMaXN0ZW5lcignZW5kJywgdGhpcy5fc29ja2V0RW5kKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGFzeW5jIHN0YXJ0U2Vzc2lvbigpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5ydW4oJ0NBUEFCSUxJVFknKTtcblxuICAgICAgICBpZiAodGhpcy5jYXBhYmlsaXRpZXMuaGFzKCdJRCcpKSB7XG4gICAgICAgICAgICB0aGlzLmlkUmVxdWVzdGVkID0gYXdhaXQgdGhpcy5ydW4oJ0lEJywgdGhpcy5jbGllbnRJbmZvKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGF3YWl0IHRoaXMudXBncmFkZVRvU1RBUlRUTFMoKTtcblxuICAgICAgICBhd2FpdCB0aGlzLmF1dGhlbnRpY2F0ZSgpO1xuXG4gICAgICAgIGlmICghdGhpcy5pZFJlcXVlc3RlZCAmJiB0aGlzLmNhcGFiaWxpdGllcy5oYXMoJ0lEJykpIHtcbiAgICAgICAgICAgIC8vIHJlLXJlcXVlc3QgSUQgYWZ0ZXIgTE9HSU5cbiAgICAgICAgICAgIHRoaXMuaWRSZXF1ZXN0ZWQgPSBhd2FpdCB0aGlzLnJ1bignSUQnLCB0aGlzLmNsaWVudEluZm8pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gTWFrZSBzdXJlIHdlIGhhdmUgbmFtZXNwYWNlIHNldC4gVGhpcyBzaG91bGQgYWxzbyB0aHJvdyBpZiBFeGNoYW5nZSBhY3R1YWxseSBmYWlsZWQgYXV0aGVudGljYXRpb25cbiAgICAgICAgbGV0IG5zUmVzcG9uc2UgPSBhd2FpdCB0aGlzLnJ1bignTkFNRVNQQUNFJyk7XG4gICAgICAgIGlmIChuc1Jlc3BvbnNlICYmIG5zUmVzcG9uc2UuZXJyb3IgJiYgbnNSZXNwb25zZS5zdGF0dXMgPT09ICdCQUQnICYmIC9Vc2VyIGlzIGF1dGhlbnRpY2F0ZWQgYnV0IG5vdCBjb25uZWN0ZWQvaS50ZXN0KG5zUmVzcG9uc2UudGV4dCkpIHtcbiAgICAgICAgICAgIC8vIE5vdCBhIE5BTUVTUEFDRSBmYWlsdXJlIGJ1dCBhdXRoZW50aWNhdGlvbiBmYWlsdXJlLCBzbyByZXBvcnQgYXNcbiAgICAgICAgICAgIHRoaXMuYXV0aGVudGljYXRlZCA9IGZhbHNlO1xuICAgICAgICAgICAgbGV0IGVyciA9IG5ldyBBdXRoZW50aWNhdGlvbkZhaWx1cmUoJ0F1dGhlbnRpY2F0aW9uIGZhaWxlZCcpO1xuICAgICAgICAgICAgZXJyLnJlc3BvbnNlID0gbnNSZXNwb25zZS50ZXh0O1xuICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy52ZXJpZnlPbmx5KSB7XG4gICAgICAgICAgICAvLyBMaXN0IGFsbCBmb2xkZXJzIGFuZCBsb2dvdXRcbiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuaW5jbHVkZU1haWxib3hlcykge1xuICAgICAgICAgICAgICAgIHRoaXMuX21haWxib3hMaXN0ID0gYXdhaXQgdGhpcy5saXN0KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5sb2dvdXQoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHRyeSB0byB1c2UgY29tcHJlc3Npb24gKGlmIHN1cHBvcnRlZClcbiAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMuZGlzYWJsZUNvbXByZXNzaW9uKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmNvbXByZXNzKCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy5kaXNhYmxlQXV0b0VuYWJsZSkge1xuICAgICAgICAgICAgLy8gZW5hYmxlIGV4dGVuc2lvbnMgaWYgcG9zc2libGVcbiAgICAgICAgICAgIGF3YWl0IHRoaXMucnVuKCdFTkFCTEUnLCBbJ0NPTkRTVE9SRScsICdVVEY4PUFDQ0VQVCddLmNvbmNhdCh0aGlzLm9wdGlvbnMucXJlc3luYyA/ICdRUkVTWU5DJyA6IFtdKSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnVzYWJsZSA9IHRydWU7XG4gICAgfVxuXG4gICAgYXN5bmMgY29tcHJlc3MoKSB7XG4gICAgICAgIGlmICghKGF3YWl0IHRoaXMucnVuKCdDT01QUkVTUycpKSkge1xuICAgICAgICAgICAgcmV0dXJuOyAvLyB3YXMgbm90IGFibGUgdG8gbmVnb3RpYXRlIGNvbXByZXNzaW9uXG4gICAgICAgIH1cblxuICAgICAgICAvLyBjcmVhdGUgZGVmbGF0ZS9pbmZsYXRlIHN0cmVhbXNcbiAgICAgICAgdGhpcy5fZGVmbGF0ZSA9IHpsaWIuY3JlYXRlRGVmbGF0ZVJhdyh7XG4gICAgICAgICAgICB3aW5kb3dCaXRzOiAxNVxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5faW5mbGF0ZSA9IHpsaWIuY3JlYXRlSW5mbGF0ZVJhdygpO1xuXG4gICAgICAgIC8vIHJvdXRlIGluY29taW5nIHNvY2tldCB2aWEgaW5mbGF0ZSBzdHJlYW1cbiAgICAgICAgdGhpcy5zb2NrZXQudW5waXBlKHRoaXMuc3RyZWFtZXIpO1xuICAgICAgICB0aGlzLnN0cmVhbWVyLmNvbXByZXNzID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5zb2NrZXQucGlwZSh0aGlzLl9pbmZsYXRlKS5waXBlKHRoaXMuc3RyZWFtZXIpO1xuICAgICAgICB0aGlzLl9pbmZsYXRlLm9uKCdlcnJvcicsIGVyciA9PiB7XG4gICAgICAgICAgICB0aGlzLnN0cmVhbWVyLmVtaXQoJ2Vycm9yJywgZXJyKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gcm91dGUgb3V0Z29pbmcgc29ja2V0IHZpYSBkZWZsYXRlIHN0cmVhbVxuICAgICAgICB0aGlzLndyaXRlU29ja2V0ID0gbmV3IFBhc3NUaHJvdWdoKCk7XG5cbiAgICAgICAgdGhpcy53cml0ZVNvY2tldC5kZXN0cm95U29vbiA9ICgpID0+IHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuc29ja2V0KSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc29ja2V0LmRlc3Ryb3koKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy53cml0ZVNvY2tldC5lbmQoKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgIHRoaXMubG9nLmVycm9yKHsgZXJyLCBpbmZvOiAnRmFpbGVkIHRvIGRlc3Ryb3kgUGFzc1Rocm91Z2ggc29ja2V0JywgY2lkOiB0aGlzLmlkIH0pO1xuICAgICAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcy53cml0ZVNvY2tldCwgJ2Rlc3Ryb3llZCcsIHtcbiAgICAgICAgICAgIGdldDogKCkgPT4gdGhpcy5zb2NrZXQuZGVzdHJveWVkXG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIHdlIG5lZWQgdG8gZm9yY2UgZmx1c2ggZGVmbGF0ZWQgZGF0YSB0byBzb2NrZXQgc28gd2UgY2FuJ3RcbiAgICAgICAgLy8gdXNlIG5vcm1hbCBwaXBlcyBmb3IgdGhpcy53cml0ZVNvY2tldCAtPiB0aGlzLl9kZWZsYXRlIC0+IHRoaXMuc29ja2V0XG4gICAgICAgIGxldCByZWFkaW5nID0gZmFsc2U7XG4gICAgICAgIGxldCByZWFkTmV4dCA9ICgpID0+IHtcbiAgICAgICAgICAgIHJlYWRpbmcgPSB0cnVlO1xuXG4gICAgICAgICAgICBsZXQgY2h1bms7XG4gICAgICAgICAgICB3aGlsZSAoKGNodW5rID0gdGhpcy53cml0ZVNvY2tldC5yZWFkKCkpICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX2RlZmxhdGUgJiYgdGhpcy5fZGVmbGF0ZS53cml0ZShjaHVuaykgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9kZWZsYXRlLm9uY2UoJ2RyYWluJywgcmVhZE5leHQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gZmx1c2ggZGF0YSB0byBzb2NrZXRcbiAgICAgICAgICAgIGlmICh0aGlzLl9kZWZsYXRlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fZGVmbGF0ZS5mbHVzaCgpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZWFkaW5nID0gZmFsc2U7XG4gICAgICAgIH07XG5cbiAgICAgICAgdGhpcy53cml0ZVNvY2tldC5vbigncmVhZGFibGUnLCAoKSA9PiB7XG4gICAgICAgICAgICBpZiAoIXJlYWRpbmcpIHtcbiAgICAgICAgICAgICAgICByZWFkTmV4dCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy53cml0ZVNvY2tldC5vbignZXJyb3InLCBlcnIgPT4ge1xuICAgICAgICAgICAgdGhpcy5zb2NrZXQuZW1pdCgnZXJyb3InLCBlcnIpO1xuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLl9kZWZsYXRlLnBpcGUodGhpcy5zb2NrZXQpO1xuICAgICAgICB0aGlzLl9kZWZsYXRlLm9uKCdlcnJvcicsIGVyciA9PiB7XG4gICAgICAgICAgICB0aGlzLnNvY2tldC5lbWl0KCdlcnJvcicsIGVycik7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIF9mYWlsU1RBUlRUTFMoKSB7XG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMuZG9TVEFSVFRMUyA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgLy8gU1RBUlRUTFMgY29uZmlndXJlZCBhcyByZXF1aXJlbWVudFxuICAgICAgICAgICAgbGV0IGVyciA9IG5ldyBFcnJvcignU2VydmVyIGRvZXMgbm90IHN1cHBvcnQgU1RBUlRUTFMnKTtcbiAgICAgICAgICAgIGVyci50bHNGYWlsZWQgPSB0cnVlO1xuICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gT3Bwb3J0dW5pc3RpYyBTVEFSVFRMUy4gQnV0IGl0J3Mgbm90IHBvc3NpYmxlIHJpZ2h0IG5vdy5cbiAgICAgICAgICAgIC8vIEF0dGVudGlvbjogQ291bGQgYmUgYSBkb3duZ3JhZGUgYXR0YWNrLlxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVHJpZXMgdG8gdXBncmFkZSB0aGUgY29ubmVjdGlvbiB0byBUTFMgdXNpbmcgU1RBUlRUTFMuXG4gICAgICogQHRocm93cyBpZiBTVEFSVFRMUyBpcyByZXF1aXJlZCwgYnV0IG5vdCBwb3NzaWJsZS5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gdHJ1ZSwgaWYgdGhlIGNvbm5lY3Rpb24gaXMgbm93IHByb3RlY3RlZCBieSBUTFMsIGVpdGhlciBkaXJlY3QgVExTIG9yIFNUQVJUVExTLlxuICAgICAqL1xuICAgIGFzeW5jIHVwZ3JhZGVUb1NUQVJUVExTKCkge1xuICAgICAgICBpZiAodGhpcy5vcHRpb25zLmRvU1RBUlRUTFMgPT09IHRydWUgJiYgdGhpcy5vcHRpb25zLnNlY3VyZSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdNaXNjb25maWd1cmF0aW9uOiBDYW5ub3Qgc2V0IGJvdGggc2VjdXJlPXRydWUgZm9yIFRMUyBhbmQgZG9TVEFSVFRMUz10cnVlIGZvciBTVEFSVFRMUy4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLnNlY3VyZUNvbm5lY3Rpb24pIHtcbiAgICAgICAgICAgIC8vIEFscmVhZHkgdXNpbmcgZGlyZWN0IFRMUy4gTm8gbmVlZCBmb3IgU1RBUlRUTFMuXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMuZG9TVEFSVFRMUyA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIC8vIFNUQVJUVExTIGV4cGxpY3RseSBkaXNhYmxlZCBieSBjb25maWdcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhpcy5jYXBhYmlsaXRpZXMuaGFzKCdTVEFSVFRMUycpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fZmFpbFNUQVJUVExTKCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmV4cGVjdENhcGFiaWxpdHlVcGRhdGUgPSB0cnVlO1xuICAgICAgICBsZXQgY2FuVXBncmFkZSA9IGF3YWl0IHRoaXMucnVuKCdTVEFSVFRMUycpO1xuICAgICAgICBpZiAoIWNhblVwZ3JhZGUpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9mYWlsU1RBUlRUTFMoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuc29ja2V0LnVucGlwZSh0aGlzLnN0cmVhbWVyKTtcbiAgICAgICAgbGV0IHVwZ3JhZGVkID0gYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgbGV0IHNvY2tldFBsYWluID0gdGhpcy5zb2NrZXQ7XG4gICAgICAgICAgICBsZXQgb3B0cyA9IE9iamVjdC5hc3NpZ24oXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBzb2NrZXQ6IHRoaXMuc29ja2V0LFxuICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJuYW1lOiB0aGlzLnNlcnZlcm5hbWUsXG4gICAgICAgICAgICAgICAgICAgIHBvcnQ6IHRoaXMucG9ydFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnRscyB8fCB7fVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHRoaXMuY2xlYXJTb2NrZXRIYW5kbGVycygpO1xuXG4gICAgICAgICAgICBzb2NrZXRQbGFpbi5vbmNlKCdlcnJvcicsIGVyciA9PiB7XG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuY29ubmVjdFRpbWVvdXQpO1xuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aGlzLnVwZ3JhZGVUaW1lb3V0KTtcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMudXBncmFkaW5nKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGRvbid0IGNhcmUgYW55bW9yZVxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHNldEltbWVkaWF0ZSgoKSA9PiB0aGlzLmNsb3NlKCkpO1xuICAgICAgICAgICAgICAgIHRoaXMudXBncmFkaW5nID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgZXJyLnRsc0ZhaWxlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgcmVqZWN0KGVycik7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgdGhpcy51cGdyYWRlVGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghdGhpcy51cGdyYWRpbmcpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBzZXRJbW1lZGlhdGUoKCkgPT4gdGhpcy5jbG9zZSgpKTtcbiAgICAgICAgICAgICAgICBsZXQgZXJyID0gbmV3IEVycm9yKCdGYWlsZWQgdG8gdXBncmFkZSBjb25uZWN0aW9uIGluIHJlcXVpcmVkIHRpbWUnKTtcbiAgICAgICAgICAgICAgICBlcnIudGxzRmFpbGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBlcnIuY29kZSA9ICdVUEdSQURFX1RJTUVPVVQnO1xuICAgICAgICAgICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgICAgICAgfSwgVVBHUkFERV9USU1FT1VUKTtcblxuICAgICAgICAgICAgdGhpcy51cGdyYWRpbmcgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5zb2NrZXQgPSB0bHMuY29ubmVjdChvcHRzLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMudXBncmFkZVRpbWVvdXQpO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzQ2xvc2VkKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIG5vdCBzdXJlIGlmIHRoaXMgaXMgcG9zc2libGU/XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmNsb3NlKCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdGhpcy5zZWN1cmVDb25uZWN0aW9uID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB0aGlzLnVwZ3JhZGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHRoaXMuc3RyZWFtZXIuc2VjdXJlQ29ubmVjdGlvbiA9IHRydWU7XG4gICAgICAgICAgICAgICAgdGhpcy5zb2NrZXQucGlwZSh0aGlzLnN0cmVhbWVyKTtcbiAgICAgICAgICAgICAgICB0aGlzLnRscyA9IHR5cGVvZiB0aGlzLnNvY2tldC5nZXRDaXBoZXIgPT09ICdmdW5jdGlvbicgPyB0aGlzLnNvY2tldC5nZXRDaXBoZXIoKSA6IGZhbHNlO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnRscykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnRscy5hdXRob3JpemVkID0gdGhpcy5zb2NrZXQuYXV0aG9yaXplZDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2cuaW5mbyh7XG4gICAgICAgICAgICAgICAgICAgICAgICBzcmM6ICd0bHMnLFxuICAgICAgICAgICAgICAgICAgICAgICAgbXNnOiAnRXN0YWJsaXNoZWQgVExTIHNlc3Npb24nLFxuICAgICAgICAgICAgICAgICAgICAgICAgY2lkOiB0aGlzLmlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgYXV0aG9yaXplZDogdGhpcy50bHMuYXV0aG9yaXplZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGFsZ286IHRoaXMudGxzLnN0YW5kYXJkTmFtZSB8fCB0aGlzLnRscy5uYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgdmVyc2lvbjogdGhpcy50bHMudmVyc2lvblxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzb2x2ZSh0cnVlKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICB0aGlzLndyaXRlU29ja2V0ID0gdGhpcy5zb2NrZXQ7XG5cbiAgICAgICAgICAgIHRoaXMuc2V0U29ja2V0SGFuZGxlcnMoKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKHVwZ3JhZGVkICYmIHRoaXMuZXhwZWN0Q2FwYWJpbGl0eVVwZGF0ZSkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5ydW4oJ0NBUEFCSUxJVFknKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB1cGdyYWRlZDtcbiAgICB9XG5cbiAgICBhc3luYyBzZXRBdXRoZW50aWNhdGlvblN0YXRlKCkge1xuICAgICAgICB0aGlzLnN0YXRlID0gdGhpcy5zdGF0ZXMuQVVUSEVOVElDQVRFRDtcbiAgICAgICAgdGhpcy5hdXRoZW50aWNhdGVkID0gdHJ1ZTtcbiAgICAgICAgaWYgKHRoaXMuZXhwZWN0Q2FwYWJpbGl0eVVwZGF0ZSkge1xuICAgICAgICAgICAgLy8gdXBkYXRlIGNhcGFiaWxpdGllc1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5ydW4oJ0NBUEFCSUxJVFknKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGFzeW5jIGF1dGhlbnRpY2F0ZSgpIHtcbiAgICAgICAgaWYgKHRoaXMuc3RhdGUgPT09IHRoaXMuc3RhdGVzLkxPR09VVCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEF1dGhlbnRpY2F0aW9uRmFpbHVyZSgnQWxyZWFkeSBsb2dnZWQgb3V0Jyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5zdGF0ZSAhPT0gdGhpcy5zdGF0ZXMuTk9UX0FVVEhFTlRJQ0FURUQpIHtcbiAgICAgICAgICAgIC8vIG5vdGhpbmcgdG8gZG8gaGVyZSwgdXN1YWxseSBoYXBwZW5zIHdpdGggUFJFQVVUSCBncmVldGluZ1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy5hdXRoKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQXV0aGVudGljYXRpb25GYWlsdXJlKCdQbGVhc2UgY29uZmlndXJlIHRoZSBsb2dpbicpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5leHBlY3RDYXBhYmlsaXR5VXBkYXRlID0gdHJ1ZTtcblxuICAgICAgICBsZXQgbG9naW5NZXRob2QgPSAodGhpcy5vcHRpb25zLmF1dGgubG9naW5NZXRob2QgfHwgJycpLnRvU3RyaW5nKCkudHJpbSgpLnRvVXBwZXJDYXNlKCk7XG4gICAgICAgIGlmICghbG9naW5NZXRob2QgJiYgL1xcXFx8XFwvLy50ZXN0KHRoaXMub3B0aW9ucy5hdXRoLnVzZXIpKSB7XG4gICAgICAgICAgICAvLyBTcGVjaWFsIG92ZXJyaWRlIGZvciBNUyBFeGNoYW5nZSB3aGVuIGF1dGhlbnRpY2F0aW5nIGFzIHNvbWUgb3RoZXIgdXNlciBvciBub24tZW1haWwgYWNjb3VudFxuICAgICAgICAgICAgbG9naW5NZXRob2QgPSAnTE9HSU4nO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5hdXRoLmFjY2Vzc1Rva2VuKSB7XG4gICAgICAgICAgICB0aGlzLmF1dGhlbnRpY2F0ZWQgPSBhd2FpdCB0aGlzLnJ1bignQVVUSEVOVElDQVRFJywgdGhpcy5vcHRpb25zLmF1dGgudXNlciwgeyBhY2Nlc3NUb2tlbjogdGhpcy5vcHRpb25zLmF1dGguYWNjZXNzVG9rZW4gfSk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5vcHRpb25zLmF1dGgucGFzcykge1xuICAgICAgICAgICAgaWYgKCh0aGlzLmNhcGFiaWxpdGllcy5oYXMoJ0FVVEg9TE9HSU4nKSB8fCB0aGlzLmNhcGFiaWxpdGllcy5oYXMoJ0FVVEg9UExBSU4nKSkgJiYgbG9naW5NZXRob2QgIT09ICdMT0dJTicpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmF1dGhlbnRpY2F0ZWQgPSBhd2FpdCB0aGlzLnJ1bignQVVUSEVOVElDQVRFJywgdGhpcy5vcHRpb25zLmF1dGgudXNlciwgeyBwYXNzd29yZDogdGhpcy5vcHRpb25zLmF1dGgucGFzcywgbG9naW5NZXRob2QgfSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmNhcGFiaWxpdGllcy5oYXMoJ0xPR0lORElTQUJMRUQnKSkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXV0aGVudGljYXRpb25GYWlsdXJlKCdMb2dpbiBpcyBkaXNhYmxlZCcpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLmF1dGhlbnRpY2F0ZWQgPSBhd2FpdCB0aGlzLnJ1bignTE9HSU4nLCB0aGlzLm9wdGlvbnMuYXV0aC51c2VyLCB0aGlzLm9wdGlvbnMuYXV0aC5wYXNzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBBdXRoZW50aWNhdGlvbkZhaWx1cmUoJ05vIHBhc3N3b3JkIGNvbmZpZ3VyZWQnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmF1dGhlbnRpY2F0ZWQpIHtcbiAgICAgICAgICAgIHRoaXMubG9nLmluZm8oe1xuICAgICAgICAgICAgICAgIHNyYzogJ2F1dGgnLFxuICAgICAgICAgICAgICAgIG1zZzogJ1VzZXIgYXV0aGVudGljYXRlZCcsXG4gICAgICAgICAgICAgICAgY2lkOiB0aGlzLmlkLFxuICAgICAgICAgICAgICAgIHVzZXI6IHRoaXMub3B0aW9ucy5hdXRoLnVzZXJcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5zZXRBdXRoZW50aWNhdGlvblN0YXRlKCk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRocm93IG5ldyBBdXRoZW50aWNhdGlvbkZhaWx1cmUoJ05vIG1hdGNoaW5nIGF1dGhlbnRpY2F0aW9uIG1ldGhvZCcpO1xuICAgIH1cblxuICAgIGFzeW5jIGluaXRpYWxPSyhtZXNzYWdlKSB7XG4gICAgICAgIHRoaXMuZ3JlZXRpbmcgPSAobWVzc2FnZS5hdHRyaWJ1dGVzIHx8IFtdKVxuICAgICAgICAgICAgLmZpbHRlcihlbnRyeSA9PiBlbnRyeS50eXBlID09PSAnVEVYVCcpXG4gICAgICAgICAgICAubWFwKGVudHJ5ID0+IGVudHJ5LnZhbHVlKVxuICAgICAgICAgICAgLmZpbHRlcihlbnRyeSA9PiBlbnRyeSlcbiAgICAgICAgICAgIC5qb2luKCcnKTtcblxuICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5ncmVldGluZ1RpbWVvdXQpO1xuICAgICAgICB0aGlzLnVudGFnZ2VkSGFuZGxlcnMuT0sgPSBudWxsO1xuICAgICAgICB0aGlzLnVudGFnZ2VkSGFuZGxlcnMuUFJFQVVUSCA9IG51bGw7XG5cbiAgICAgICAgaWYgKHRoaXMuaXNDbG9zZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGdldCBvdXQgb2YgY3VycmVudCBwYXJzaW5nIFwidGhyZWFkXCIsIHNvIGRvIG5vdCBhd2FpdCBmb3Igc3RhcnRTZXNzaW9uXG4gICAgICAgIHRoaXMuc3RhcnRTZXNzaW9uKClcbiAgICAgICAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHRoaXMuaW5pdGlhbFJlc29sdmUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJlc29sdmUgPSB0aGlzLmluaXRpYWxSZXNvbHZlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmluaXRpYWxSZXNvbHZlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW5pdGlhbFJlamVjdCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzb2x2ZSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAuY2F0Y2goZXJyID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmxvZy5lcnJvcih7IGVyciwgY2lkOiB0aGlzLmlkIH0pO1xuXG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmluaXRpYWxSZWplY3QgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuZ3JlZXRpbmdUaW1lb3V0KTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJlamVjdCA9IHRoaXMuaW5pdGlhbFJlamVjdDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbml0aWFsUmVzb2x2ZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmluaXRpYWxSZWplY3QgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlamVjdChlcnIpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHNldEltbWVkaWF0ZSgoKSA9PiB0aGlzLmNsb3NlKCkpO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgYXN5bmMgaW5pdGlhbFBSRUFVVEgoKSB7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aGlzLmdyZWV0aW5nVGltZW91dCk7XG4gICAgICAgIHRoaXMudW50YWdnZWRIYW5kbGVycy5PSyA9IG51bGw7XG4gICAgICAgIHRoaXMudW50YWdnZWRIYW5kbGVycy5QUkVBVVRIID0gbnVsbDtcblxuICAgICAgICBpZiAodGhpcy5pc0Nsb3NlZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5zdGF0ZSA9IHRoaXMuc3RhdGVzLkFVVEhFTlRJQ0FURUQ7XG5cbiAgICAgICAgLy8gZ2V0IG91dCBvZiBjdXJyZW50IHBhcnNpbmcgXCJ0aHJlYWRcIiwgc28gZG8gbm90IGF3YWl0IGZvciBzdGFydFNlc3Npb25cbiAgICAgICAgdGhpcy5zdGFydFNlc3Npb24oKVxuICAgICAgICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdGhpcy5pbml0aWFsUmVzb2x2ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICBsZXQgcmVzb2x2ZSA9IHRoaXMuaW5pdGlhbFJlc29sdmU7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW5pdGlhbFJlc29sdmUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbml0aWFsUmVqZWN0ID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXNvbHZlKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5jYXRjaChlcnIgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMubG9nLmVycm9yKHsgZXJyLCBjaWQ6IHRoaXMuaWQgfSk7XG5cbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHRoaXMuaW5pdGlhbFJlamVjdCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5ncmVldGluZ1RpbWVvdXQpO1xuICAgICAgICAgICAgICAgICAgICBsZXQgcmVqZWN0ID0gdGhpcy5pbml0aWFsUmVqZWN0O1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmluaXRpYWxSZXNvbHZlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW5pdGlhbFJlamVjdCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVqZWN0KGVycik7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgc2V0SW1tZWRpYXRlKCgpID0+IHRoaXMuY2xvc2UoKSk7XG4gICAgICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBhc3luYyBzZXJ2ZXJCeWUoKSB7XG4gICAgICAgIHRoaXMudW50YWdnZWRIYW5kbGVycy5CWUUgPSBudWxsO1xuICAgICAgICB0aGlzLnN0YXRlID0gdGhpcy5zdGF0ZXMuTE9HT1VUO1xuICAgIH1cblxuICAgIGFzeW5jIHNlY3Rpb25DYXBhYmlsaXR5KHNlY3Rpb24pIHtcbiAgICAgICAgdGhpcy5yYXdDYXBhYmlsaXRpZXMgPSBzZWN0aW9uO1xuICAgICAgICB0aGlzLmNhcGFiaWxpdGllcyA9IHVwZGF0ZUNhcGFiaWxpdGllcyhzZWN0aW9uKTtcblxuICAgICAgICBpZiAodGhpcy5jYXBhYmlsaXRpZXMpIHtcbiAgICAgICAgICAgIGZvciAobGV0IFtjYXBhXSBvZiB0aGlzLmNhcGFiaWxpdGllcykge1xuICAgICAgICAgICAgICAgIGlmICgvXkFVVEg9L2kudGVzdChjYXBhKSAmJiAhdGhpcy5hdXRoQ2FwYWJpbGl0aWVzLmhhcyhjYXBhLnRvVXBwZXJDYXNlKCkpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYXV0aENhcGFiaWxpdGllcy5zZXQoY2FwYS50b1VwcGVyQ2FzZSgpLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuZXhwZWN0Q2FwYWJpbGl0eVVwZGF0ZSkge1xuICAgICAgICAgICAgdGhpcy5leHBlY3RDYXBhYmlsaXR5VXBkYXRlID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhc3luYyB1bnRhZ2dlZENhcGFiaWxpdHkodW50YWdnZWQpIHtcbiAgICAgICAgdGhpcy5yYXdDYXBhYmlsaXRpZXMgPSB1bnRhZ2dlZC5hdHRyaWJ1dGVzO1xuICAgICAgICB0aGlzLmNhcGFiaWxpdGllcyA9IHVwZGF0ZUNhcGFiaWxpdGllcyh1bnRhZ2dlZC5hdHRyaWJ1dGVzKTtcblxuICAgICAgICBpZiAodGhpcy5jYXBhYmlsaXRpZXMpIHtcbiAgICAgICAgICAgIGZvciAobGV0IFtjYXBhXSBvZiB0aGlzLmNhcGFiaWxpdGllcykge1xuICAgICAgICAgICAgICAgIGlmICgvXkFVVEg9L2kudGVzdChjYXBhKSAmJiAhdGhpcy5hdXRoQ2FwYWJpbGl0aWVzLmhhcyhjYXBhLnRvVXBwZXJDYXNlKCkpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYXV0aENhcGFiaWxpdGllcy5zZXQoY2FwYS50b1VwcGVyQ2FzZSgpLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuZXhwZWN0Q2FwYWJpbGl0eVVwZGF0ZSkge1xuICAgICAgICAgICAgdGhpcy5leHBlY3RDYXBhYmlsaXR5VXBkYXRlID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhc3luYyB1bnRhZ2dlZEV4aXN0cyh1bnRhZ2dlZCkge1xuICAgICAgICBpZiAoIXRoaXMubWFpbGJveCkge1xuICAgICAgICAgICAgLy8gbWFpbGJveCBjbG9zZWQsIGlnbm9yZVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF1bnRhZ2dlZCB8fCAhdW50YWdnZWQuY29tbWFuZCB8fCBpc05hTih1bnRhZ2dlZC5jb21tYW5kKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGNvdW50ID0gTnVtYmVyKHVudGFnZ2VkLmNvbW1hbmQpO1xuICAgICAgICBpZiAoY291bnQgPT09IHRoaXMubWFpbGJveC5leGlzdHMpIHtcbiAgICAgICAgICAgIC8vIG5vdGhpbmcgY2hhbmdlZD9cbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGtlZXAgZXhpc3RzIHVwIHRvIGRhdGVcbiAgICAgICAgbGV0IHByZXZDb3VudCA9IHRoaXMubWFpbGJveC5leGlzdHM7XG4gICAgICAgIHRoaXMubWFpbGJveC5leGlzdHMgPSBjb3VudDtcbiAgICAgICAgdGhpcy5lbWl0KCdleGlzdHMnLCB7XG4gICAgICAgICAgICBwYXRoOiB0aGlzLm1haWxib3gucGF0aCxcbiAgICAgICAgICAgIGNvdW50LFxuICAgICAgICAgICAgcHJldkNvdW50XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGFzeW5jIHVudGFnZ2VkRXhwdW5nZSh1bnRhZ2dlZCkge1xuICAgICAgICBpZiAoIXRoaXMubWFpbGJveCkge1xuICAgICAgICAgICAgLy8gbWFpbGJveCBjbG9zZWQsIGlnbm9yZVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF1bnRhZ2dlZCB8fCAhdW50YWdnZWQuY29tbWFuZCB8fCBpc05hTih1bnRhZ2dlZC5jb21tYW5kKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHNlcSA9IE51bWJlcih1bnRhZ2dlZC5jb21tYW5kKTtcbiAgICAgICAgaWYgKHNlcSAmJiBzZXEgPD0gdGhpcy5tYWlsYm94LmV4aXN0cykge1xuICAgICAgICAgICAgdGhpcy5tYWlsYm94LmV4aXN0cy0tO1xuICAgICAgICAgICAgbGV0IHBheWxvYWQgPSB7XG4gICAgICAgICAgICAgICAgcGF0aDogdGhpcy5tYWlsYm94LnBhdGgsXG4gICAgICAgICAgICAgICAgc2VxLFxuICAgICAgICAgICAgICAgIHZhbmlzaGVkOiBmYWxzZVxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgaWYgKHR5cGVvZiB0aGlzLm9wdGlvbnMuZXhwdW5nZUhhbmRsZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLm9wdGlvbnMuZXhwdW5nZUhhbmRsZXIocGF5bG9hZCk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubG9nLmVycm9yKHsgbXNnOiAnRmFpbGVkIHRvIG5vdGlmeSBleHB1bmdlIGV2ZW50JywgcGF5bG9hZCwgZXJyb3I6IGVyciwgY2lkOiB0aGlzLmlkIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5lbWl0KCdleHB1bmdlJywgcGF5bG9hZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhc3luYyB1bnRhZ2dlZFZhbmlzaGVkKHVudGFnZ2VkLCBtYWlsYm94KSB7XG4gICAgICAgIG1haWxib3ggPSBtYWlsYm94IHx8IHRoaXMubWFpbGJveDtcbiAgICAgICAgaWYgKCFtYWlsYm94KSB7XG4gICAgICAgICAgICAvLyBtYWlsYm94IGNsb3NlZCwgaWdub3JlXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgdGFncyA9IFtdO1xuICAgICAgICBsZXQgdWlkcyA9IGZhbHNlO1xuXG4gICAgICAgIGlmICh1bnRhZ2dlZC5hdHRyaWJ1dGVzLmxlbmd0aCA+IDEgJiYgQXJyYXkuaXNBcnJheSh1bnRhZ2dlZC5hdHRyaWJ1dGVzWzBdKSkge1xuICAgICAgICAgICAgdGFncyA9IHVudGFnZ2VkLmF0dHJpYnV0ZXNbMF0ubWFwKGVudHJ5ID0+ICh0eXBlb2YgZW50cnkudmFsdWUgPT09ICdzdHJpbmcnID8gZW50cnkudmFsdWUudG9VcHBlckNhc2UoKSA6IGZhbHNlKSkuZmlsdGVyKHZhbHVlID0+IHZhbHVlKTtcbiAgICAgICAgICAgIHVudGFnZ2VkLmF0dHJpYnV0ZXMuc2hpZnQoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh1bnRhZ2dlZC5hdHRyaWJ1dGVzWzBdICYmIHR5cGVvZiB1bnRhZ2dlZC5hdHRyaWJ1dGVzWzBdLnZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgdWlkcyA9IHVudGFnZ2VkLmF0dHJpYnV0ZXNbMF0udmFsdWU7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgdWlkTGlzdCA9IGV4cGFuZFJhbmdlKHVpZHMpO1xuXG4gICAgICAgIGZvciAobGV0IHVpZCBvZiB1aWRMaXN0KSB7XG4gICAgICAgICAgICBsZXQgcGF5bG9hZCA9IHtcbiAgICAgICAgICAgICAgICBwYXRoOiBtYWlsYm94LnBhdGgsXG4gICAgICAgICAgICAgICAgdWlkLFxuICAgICAgICAgICAgICAgIHZhbmlzaGVkOiB0cnVlLFxuICAgICAgICAgICAgICAgIGVhcmxpZXI6IHRhZ3MuaW5jbHVkZXMoJ0VBUkxJRVInKVxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgaWYgKHR5cGVvZiB0aGlzLm9wdGlvbnMuZXhwdW5nZUhhbmRsZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLm9wdGlvbnMuZXhwdW5nZUhhbmRsZXIocGF5bG9hZCk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubG9nLmVycm9yKHsgbXNnOiAnRmFpbGVkIHRvIG5vdGlmeSBleHB1bmdlIGV2ZW50JywgcGF5bG9hZCwgZXJyb3I6IGVyciwgY2lkOiB0aGlzLmlkIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5lbWl0KCdleHB1bmdlJywgcGF5bG9hZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhc3luYyB1bnRhZ2dlZEZldGNoKHVudGFnZ2VkLCBtYWlsYm94KSB7XG4gICAgICAgIG1haWxib3ggPSBtYWlsYm94IHx8IHRoaXMubWFpbGJveDtcbiAgICAgICAgaWYgKCFtYWlsYm94KSB7XG4gICAgICAgICAgICAvLyBtYWlsYm94IGNsb3NlZCwgaWdub3JlXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbWVzc2FnZSA9IGF3YWl0IGZvcm1hdE1lc3NhZ2VSZXNwb25zZSh1bnRhZ2dlZCwgbWFpbGJveCk7XG4gICAgICAgIGlmIChtZXNzYWdlLmZsYWdzKSB7XG4gICAgICAgICAgICBsZXQgdXBkYXRlRXZlbnQgPSB7XG4gICAgICAgICAgICAgICAgcGF0aDogbWFpbGJveC5wYXRoLFxuICAgICAgICAgICAgICAgIHNlcTogbWVzc2FnZS5zZXFcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIGlmIChtZXNzYWdlLnVpZCkge1xuICAgICAgICAgICAgICAgIHVwZGF0ZUV2ZW50LnVpZCA9IG1lc3NhZ2UudWlkO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAobWVzc2FnZS5tb2RzZXEpIHtcbiAgICAgICAgICAgICAgICB1cGRhdGVFdmVudC5tb2RzZXEgPSBtZXNzYWdlLm1vZHNlcTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdXBkYXRlRXZlbnQuZmxhZ3MgPSBtZXNzYWdlLmZsYWdzO1xuXG4gICAgICAgICAgICBpZiAobWVzc2FnZS5mbGFnQ29sb3IpIHtcbiAgICAgICAgICAgICAgICB1cGRhdGVFdmVudC5mbGFnQ29sb3IgPSBtZXNzYWdlLmZsYWdDb2xvcjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5lbWl0KCdmbGFncycsIHVwZGF0ZUV2ZW50KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGFzeW5jIGVuc3VyZVNlbGVjdGVkTWFpbGJveChwYXRoKSB7XG4gICAgICAgIGlmICghcGF0aCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCghdGhpcy5tYWlsYm94ICYmIHBhdGgpIHx8ICh0aGlzLm1haWxib3ggJiYgcGF0aCAmJiAhY29tcGFyZVBhdGhzKHRoaXMsIHRoaXMubWFpbGJveC5wYXRoLCBwYXRoKSkpIHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLm1haWxib3hPcGVuKHBhdGgpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgYXN5bmMgcmVzb2x2ZVJhbmdlKHJhbmdlLCBvcHRpb25zKSB7XG4gICAgICAgIGlmICh0eXBlb2YgcmFuZ2UgPT09ICdudW1iZXInIHx8IHR5cGVvZiByYW5nZSA9PT0gJ2JpZ2ludCcpIHtcbiAgICAgICAgICAgIHJhbmdlID0gcmFuZ2UudG9TdHJpbmcoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHNwZWNpYWwgY2FzZSwgc29tZSBzZXJ2ZXJzIGFsbG93IHRoaXMsIHNvbWUgZG8gbm90LCBzbyByZXBsYWNlIGl0IHdpdGggdGhlIGxhc3Qga25vd24gRVhJU1RTIHZhbHVlXG4gICAgICAgIGlmIChyYW5nZSA9PT0gJyonKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMubWFpbGJveC5leGlzdHMpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByYW5nZSA9IHRoaXMubWFpbGJveC5leGlzdHMudG9TdHJpbmcoKTtcbiAgICAgICAgICAgIG9wdGlvbnMudWlkID0gZmFsc2U7IC8vIHNlcXVlbmNlIHF1ZXJ5XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocmFuZ2UgJiYgdHlwZW9mIHJhbmdlID09PSAnb2JqZWN0JyAmJiAhQXJyYXkuaXNBcnJheShyYW5nZSkpIHtcbiAgICAgICAgICAgIGlmIChyYW5nZS5hbGwgJiYgT2JqZWN0LmtleXMocmFuZ2UpLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgICAgIHJhbmdlID0gJzE6Kic7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHJhbmdlLnVpZCAmJiBPYmplY3Qua2V5cyhyYW5nZSkubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICAgICAgcmFuZ2UgPSByYW5nZS51aWQ7XG4gICAgICAgICAgICAgICAgb3B0aW9ucy51aWQgPSB0cnVlO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyByZXNvbHZlIHJhbmdlIGJ5IHNlYXJjaGluZ1xuICAgICAgICAgICAgICAgIG9wdGlvbnMudWlkID0gdHJ1ZTsgLy8gZm9yY2UgVUlEcyBpbnN0ZWFkIG9mIHNlcXVlbmNlIG51bWJlcnNcbiAgICAgICAgICAgICAgICByYW5nZSA9IGF3YWl0IHRoaXMucnVuKCdTRUFSQ0gnLCByYW5nZSwgb3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgaWYgKHJhbmdlICYmIHJhbmdlLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICByYW5nZSA9IHBhY2tNZXNzYWdlUmFuZ2UocmFuZ2UpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHJhbmdlKSkge1xuICAgICAgICAgICAgcmFuZ2UgPSByYW5nZS5qb2luKCcsJyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXJhbmdlKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmFuZ2U7XG4gICAgfVxuXG4gICAgYXV0b2lkbGUoKSB7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aGlzLmlkbGVTdGFydFRpbWVyKTtcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5kaXNhYmxlQXV0b0lkbGUgfHwgdGhpcy5zdGF0ZSAhPT0gdGhpcy5zdGF0ZXMuU0VMRUNURUQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmlkbGVTdGFydFRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmlkbGUoKS5jYXRjaChlcnIgPT4gdGhpcy5sb2cud2Fybih7IGVyciwgY2lkOiB0aGlzLmlkIH0pKTtcbiAgICAgICAgfSwgMTUgKiAxMDAwKTtcbiAgICB9XG5cbiAgICAvLyBQVUJMSUMgQVBJIE1FVEhPRFNcblxuICAgIC8qKlxuICAgICAqIEluaXRpYXRlcyBhIGNvbm5lY3Rpb24gYWdhaW5zdCBJTUFQIHNlcnZlci4gVGhyb3dzIGlmIGFueXRoaW5nIGdvZXMgd3JvbmcuIFRoaXMgaXMgc29tZXRoaW5nIHlvdSBoYXZlIHRvIGNhbGwgYmVmb3JlIHlvdSBjYW4gcnVuIGFueSBJTUFQIGNvbW1hbmRzXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICAgKiBAdGhyb3dzIFdpbGwgdGhyb3cgYW4gZXJyb3IgaWYgY29ubmVjdGlvbiBvciBhdXRoZW50aWNhdGlvbiBmYWlsc1xuICAgICAqIEBleGFtcGxlXG4gICAgICogbGV0IGNsaWVudCA9IG5ldyBJbWFwRmxvdyh7Li4ufSk7XG4gICAgICogYXdhaXQgY2xpZW50LmNvbm5lY3QoKTtcbiAgICAgKi9cbiAgICBhc3luYyBjb25uZWN0KCkge1xuICAgICAgICBpZiAodGhpcy5fY29ubmVjdENhbGxlZCkge1xuICAgICAgICAgICAgLy8gUHJldmVudCByZS11c2luZyBJbWFwRmxvdyBpbnN0YW5jZXMgYnkgYWxsb3dpbmcgdG8gY2FsbCBjb25uZWN0IGp1c3Qgb25jZS5cbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ2FuIG5vdCByZS11c2UgSW1hcEZsb3cgaW5zdGFuY2UnKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9jb25uZWN0Q2FsbGVkID0gdHJ1ZTtcblxuICAgICAgICBsZXQgY29ubmVjdG9yID0gdGhpcy5zZWN1cmVDb25uZWN0aW9uID8gdGxzIDogbmV0O1xuXG4gICAgICAgIGxldCBvcHRzID0gT2JqZWN0LmFzc2lnbihcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBob3N0OiB0aGlzLmhvc3QsXG4gICAgICAgICAgICAgICAgc2VydmVybmFtZTogdGhpcy5zZXJ2ZXJuYW1lLFxuICAgICAgICAgICAgICAgIHBvcnQ6IHRoaXMucG9ydFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHRoaXMub3B0aW9ucy50bHMgfHwge31cbiAgICAgICAgKTtcblxuICAgICAgICB0aGlzLnVudGFnZ2VkSGFuZGxlcnMuT0sgPSAoLi4uYXJncykgPT4gdGhpcy5pbml0aWFsT0soLi4uYXJncyk7XG4gICAgICAgIHRoaXMudW50YWdnZWRIYW5kbGVycy5CWUUgPSAoLi4uYXJncykgPT4gdGhpcy5zZXJ2ZXJCeWUoLi4uYXJncyk7XG4gICAgICAgIHRoaXMudW50YWdnZWRIYW5kbGVycy5QUkVBVVRIID0gKC4uLmFyZ3MpID0+IHRoaXMuaW5pdGlhbFBSRUFVVEgoLi4uYXJncyk7XG5cbiAgICAgICAgdGhpcy51bnRhZ2dlZEhhbmRsZXJzLkNBUEFCSUxJVFkgPSAoLi4uYXJncykgPT4gdGhpcy51bnRhZ2dlZENhcGFiaWxpdHkoLi4uYXJncyk7XG4gICAgICAgIHRoaXMuc2VjdGlvbkhhbmRsZXJzLkNBUEFCSUxJVFkgPSAoLi4uYXJncykgPT4gdGhpcy5zZWN0aW9uQ2FwYWJpbGl0eSguLi5hcmdzKTtcblxuICAgICAgICB0aGlzLnVudGFnZ2VkSGFuZGxlcnMuRVhJU1RTID0gKC4uLmFyZ3MpID0+IHRoaXMudW50YWdnZWRFeGlzdHMoLi4uYXJncyk7XG4gICAgICAgIHRoaXMudW50YWdnZWRIYW5kbGVycy5FWFBVTkdFID0gKC4uLmFyZ3MpID0+IHRoaXMudW50YWdnZWRFeHB1bmdlKC4uLmFyZ3MpO1xuXG4gICAgICAgIC8vIHRoZXNlIG1ldGhvZHMgdGFrZSBhbiBvcHRpb25hbCBzZWNvbmQgYXJndW1lbnQsIHNvIG1ha2Ugc3VyZSB0aGF0IHNvbWUgcmFuZG9tIElNQVAgdGFnIGlzIG5vdCB1c2VkIGFzIHRoZSBzZWNvbmQgYXJndW1lbnRcbiAgICAgICAgdGhpcy51bnRhZ2dlZEhhbmRsZXJzLkZFVENIID0gdW50YWdnZWQgPT4gdGhpcy51bnRhZ2dlZEZldGNoKHVudGFnZ2VkKTtcbiAgICAgICAgdGhpcy51bnRhZ2dlZEhhbmRsZXJzLlZBTklTSEVEID0gdW50YWdnZWQgPT4gdGhpcy51bnRhZ2dlZFZhbmlzaGVkKHVudGFnZ2VkKTtcblxuICAgICAgICBsZXQgc29ja2V0ID0gZmFsc2U7XG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMucHJveHkpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgc29ja2V0ID0gYXdhaXQgcHJveHlDb25uZWN0aW9uKHRoaXMubG9nLCB0aGlzLm9wdGlvbnMucHJveHksIHRoaXMuaG9zdCwgdGhpcy5wb3J0KTtcbiAgICAgICAgICAgICAgICBpZiAoIXNvY2tldCkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZhaWxlZCB0byBzZXR1cCBwcm94eSBjb25uZWN0aW9uJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgbGV0IGVycm9yID0gbmV3IEVycm9yKCdGYWlsZWQgdG8gc2V0dXAgcHJveHkgY29ubmVjdGlvbicpO1xuICAgICAgICAgICAgICAgIGVycm9yLmNvZGUgPSBlcnIuY29kZSB8fCAnUHJveHlFcnJvcic7XG4gICAgICAgICAgICAgICAgZXJyb3IuX2VyciA9IGVycjtcbiAgICAgICAgICAgICAgICB0aGlzLmxvZy5lcnJvcih7IGVycm9yLCBjaWQ6IHRoaXMuaWQgfSk7XG4gICAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICB0aGlzLmNvbm5lY3RUaW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgbGV0IGVyciA9IG5ldyBFcnJvcignRmFpbGVkIHRvIGVzdGFibGlzaCBjb25uZWN0aW9uIGluIHJlcXVpcmVkIHRpbWUnKTtcbiAgICAgICAgICAgICAgICBlcnIuY29kZSA9ICdDT05ORUNUX1RJTUVPVVQnO1xuICAgICAgICAgICAgICAgIGVyci5kZXRhaWxzID0ge1xuICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uVGltZW91dDogdGhpcy5vcHRpb25zLmNvbm5lY3Rpb25UaW1lb3V0IHx8IENPTk5FQ1RfVElNRU9VVFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgdGhpcy5sb2cuZXJyb3IoeyBlcnIsIGNpZDogdGhpcy5pZCB9KTtcbiAgICAgICAgICAgICAgICBzZXRJbW1lZGlhdGUoKCkgPT4gdGhpcy5jbG9zZSgpKTtcbiAgICAgICAgICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgICAgICAgIH0sIHRoaXMub3B0aW9ucy5jb25uZWN0aW9uVGltZW91dCB8fCBDT05ORUNUX1RJTUVPVVQpO1xuXG4gICAgICAgICAgICBsZXQgb25Db25uZWN0ID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aGlzLmNvbm5lY3RUaW1lb3V0KTtcbiAgICAgICAgICAgICAgICB0aGlzLnNvY2tldC5zZXRLZWVwQWxpdmUodHJ1ZSwgNSAqIDEwMDApO1xuICAgICAgICAgICAgICAgIHRoaXMuc29ja2V0LnNldFRpbWVvdXQodGhpcy5vcHRpb25zLnNvY2tldFRpbWVvdXQgfHwgU09DS0VUX1RJTUVPVVQpO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5ncmVldGluZ1RpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGVyciA9IG5ldyBFcnJvcihgRmFpbGVkIHRvIHJlY2VpdmUgZ3JlZXRpbmcgZnJvbSBzZXJ2ZXIgaW4gcmVxdWlyZWQgdGltZSR7IXRoaXMuc2VjdXJlQ29ubmVjdGlvbiA/ICcuIE1heWJlIHNob3VsZCB1c2UgVExTPycgOiAnJ31gKTtcbiAgICAgICAgICAgICAgICAgICAgZXJyLmNvZGUgPSAnR1JFRVRJTkdfVElNRU9VVCc7XG4gICAgICAgICAgICAgICAgICAgIGVyci5kZXRhaWxzID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgZ3JlZXRpbmdUaW1lb3V0OiB0aGlzLm9wdGlvbnMuZ3JlZXRpbmdUaW1lb3V0IHx8IEdSRUVUSU5HX1RJTUVPVVRcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2cuZXJyb3IoeyBlcnIsIGNpZDogdGhpcy5pZCB9KTtcbiAgICAgICAgICAgICAgICAgICAgc2V0SW1tZWRpYXRlKCgpID0+IHRoaXMuY2xvc2UoKSk7XG4gICAgICAgICAgICAgICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgICAgICAgICAgIH0sIHRoaXMub3B0aW9ucy5ncmVldGluZ1RpbWVvdXQgfHwgR1JFRVRJTkdfVElNRU9VVCk7XG5cbiAgICAgICAgICAgICAgICB0aGlzLnRscyA9IHR5cGVvZiB0aGlzLnNvY2tldC5nZXRDaXBoZXIgPT09ICdmdW5jdGlvbicgPyB0aGlzLnNvY2tldC5nZXRDaXBoZXIoKSA6IGZhbHNlO1xuXG4gICAgICAgICAgICAgICAgbGV0IGxvZ0luZm8gPSB7XG4gICAgICAgICAgICAgICAgICAgIHNyYzogJ2Nvbm5lY3Rpb24nLFxuICAgICAgICAgICAgICAgICAgICBtc2c6IGBFc3RhYmxpc2hlZCAke3RoaXMudGxzID8gJ3NlY3VyZSAnIDogJyd9VENQIGNvbm5lY3Rpb25gLFxuICAgICAgICAgICAgICAgICAgICBjaWQ6IHRoaXMuaWQsXG4gICAgICAgICAgICAgICAgICAgIHNlY3VyZTogISF0aGlzLnRscyxcbiAgICAgICAgICAgICAgICAgICAgaG9zdDogdGhpcy5ob3N0LFxuICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJuYW1lOiB0aGlzLnNlcnZlcm5hbWUsXG4gICAgICAgICAgICAgICAgICAgIHBvcnQ6IHRoaXMuc29ja2V0LnJlbW90ZVBvcnQsXG4gICAgICAgICAgICAgICAgICAgIGFkZHJlc3M6IHRoaXMuc29ja2V0LnJlbW90ZUFkZHJlc3MsXG4gICAgICAgICAgICAgICAgICAgIGxvY2FsQWRkcmVzczogdGhpcy5zb2NrZXQubG9jYWxBZGRyZXNzLFxuICAgICAgICAgICAgICAgICAgICBsb2NhbFBvcnQ6IHRoaXMuc29ja2V0LmxvY2FsUG9ydFxuICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICBpZiAodGhpcy50bHMpIHtcbiAgICAgICAgICAgICAgICAgICAgbG9nSW5mby5hdXRob3JpemVkID0gdGhpcy50bHMuYXV0aG9yaXplZCA9IHRoaXMuc29ja2V0LmF1dGhvcml6ZWQ7XG4gICAgICAgICAgICAgICAgICAgIGxvZ0luZm8uYWxnbyA9IHRoaXMudGxzLnN0YW5kYXJkTmFtZSB8fCB0aGlzLnRscy5uYW1lO1xuICAgICAgICAgICAgICAgICAgICBsb2dJbmZvLnZlcnNpb24gPSB0aGlzLnRscy52ZXJzaW9uO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHRoaXMubG9nLmluZm8obG9nSW5mbyk7XG5cbiAgICAgICAgICAgICAgICB0aGlzLnNldFNvY2tldEhhbmRsZXJzKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5zb2NrZXQucGlwZSh0aGlzLnN0cmVhbWVyKTtcblxuICAgICAgICAgICAgICAgIC8vIGV4ZWN1dGVkIGJ5IGluaXRpYWwgXCIqIE9LXCJcbiAgICAgICAgICAgICAgICB0aGlzLmluaXRpYWxSZXNvbHZlID0gcmVzb2x2ZTtcbiAgICAgICAgICAgICAgICB0aGlzLmluaXRpYWxSZWplY3QgPSByZWplY3Q7XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBpZiAoc29ja2V0KSB7XG4gICAgICAgICAgICAgICAgLy8gc29ja2V0IGlzIGFscmVhZHkgZXN0YWJsaXNoZWQgdmlhIHByb3h5XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuc2VjdXJlQ29ubmVjdGlvbikge1xuICAgICAgICAgICAgICAgICAgICAvLyBUTFMgc29ja2V0IHJlcXVpcmVzIGEgaGFuZHNoYWtlXG4gICAgICAgICAgICAgICAgICAgIG9wdHMuc29ja2V0ID0gc29ja2V0O1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNvY2tldCA9IGNvbm5lY3Rvci5jb25uZWN0KG9wdHMsIG9uQ29ubmVjdCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gY2xlYXJ0ZXh0IHNvY2tldCBpcyBhbHJlYWR5IHVzYWJsZVxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNvY2tldCA9IHNvY2tldDtcbiAgICAgICAgICAgICAgICAgICAgc2V0SW1tZWRpYXRlKG9uQ29ubmVjdCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNvY2tldCA9IGNvbm5lY3Rvci5jb25uZWN0KG9wdHMsIG9uQ29ubmVjdCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMud3JpdGVTb2NrZXQgPSB0aGlzLnNvY2tldDtcblxuICAgICAgICAgICAgdGhpcy5zb2NrZXQub24oJ2Vycm9yJywgZXJyID0+IHtcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5jb25uZWN0VGltZW91dCk7XG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuZ3JlZXRpbmdUaW1lb3V0KTtcbiAgICAgICAgICAgICAgICBzZXRJbW1lZGlhdGUoKCkgPT4gdGhpcy5jbG9zZSgpKTtcbiAgICAgICAgICAgICAgICB0aGlzLmxvZy5lcnJvcih7IGVyciwgY2lkOiB0aGlzLmlkIH0pO1xuICAgICAgICAgICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHRoaXMuc2V0RXZlbnRIYW5kbGVycygpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHcmFjZWZ1bCBjb25uZWN0aW9uIGNsb3NlIGJ5IHNlbmRpbmcgbG9nb3V0IGNvbW1hbmQgdG8gc2VydmVyLiBUQ1AgY29ubmVjdGlvbiBpcyBjbG9zZWQgb25jZSBjb21tYW5kIGlzIGZpbmlzaGVkLlxuICAgICAqXG4gICAgICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn1cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGxldCBjbGllbnQgPSBuZXcgSW1hcEZsb3coey4uLn0pO1xuICAgICAqIGF3YWl0IGNsaWVudC5jb25uZWN0KCk7XG4gICAgICogLi4uXG4gICAgICogYXdhaXQgY2xpZW50LmxvZ291dCgpO1xuICAgICAqL1xuICAgIGFzeW5jIGxvZ291dCgpIHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMucnVuKCdMT0dPVVQnKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDbG9zZXMgVENQIGNvbm5lY3Rpb24gd2l0aG91dCBub3RpZnlpbmcgdGhlIHNlcnZlci5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogbGV0IGNsaWVudCA9IG5ldyBJbWFwRmxvdyh7Li4ufSk7XG4gICAgICogYXdhaXQgY2xpZW50LmNvbm5lY3QoKTtcbiAgICAgKiAuLi5cbiAgICAgKiBjbGllbnQuY2xvc2UoKTtcbiAgICAgKi9cbiAgICBjbG9zZSgpIHtcbiAgICAgICAgLy8gY2xlYXIgcGVuZGluZyB0aW1lcnNcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuaWRsZVN0YXJ0VGltZXIpO1xuICAgICAgICBjbGVhclRpbWVvdXQodGhpcy51cGdyYWRlVGltZW91dCk7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aGlzLmNvbm5lY3RUaW1lb3V0KTtcblxuICAgICAgICB0aGlzLnVzYWJsZSA9IGZhbHNlO1xuICAgICAgICB0aGlzLmlkbGluZyA9IGZhbHNlO1xuXG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5pbml0aWFsUmVqZWN0ID09PSAnZnVuY3Rpb24nICYmICF0aGlzLm9wdGlvbnMudmVyaWZ5T25seSkge1xuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuZ3JlZXRpbmdUaW1lb3V0KTtcbiAgICAgICAgICAgIGxldCByZWplY3QgPSB0aGlzLmluaXRpYWxSZWplY3Q7XG4gICAgICAgICAgICB0aGlzLmluaXRpYWxSZXNvbHZlID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLmluaXRpYWxSZWplY3QgPSBmYWxzZTtcbiAgICAgICAgICAgIGxldCBlcnIgPSBuZXcgRXJyb3IoJ1VuZXhwZWN0ZWQgY2xvc2UnKTtcbiAgICAgICAgICAgIGVyci5jb2RlID0gYENsb3NlZEFmdGVyQ29ubmVjdCR7dGhpcy5zZWN1cmVDb25uZWN0aW9uID8gJ1RMUycgOiAnVGV4dCd9YDtcbiAgICAgICAgICAgIC8vIHN0aWxsIGhhcyB0byBnbyB0aHJvdWdoIHRoZSBsb2dpYyBiZWxvd1xuICAgICAgICAgICAgc2V0SW1tZWRpYXRlKCgpID0+IHJlamVjdChlcnIpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5wcmVDaGVjayA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgdGhpcy5wcmVDaGVjaygpLmNhdGNoKGVyciA9PiB0aGlzLmxvZy53YXJuKHsgZXJyLCBjaWQ6IHRoaXMuaWQgfSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gcmVqZWN0IGNvbW1hbmQgdGhhdCBpcyBjdXJyZW50bHkgcHJvY2Vzc2VkXG4gICAgICAgIGlmICh0aGlzLmN1cnJlbnRSZXF1ZXN0ICYmIHRoaXMucmVxdWVzdFRhZ01hcC5oYXModGhpcy5jdXJyZW50UmVxdWVzdC50YWcpKSB7XG4gICAgICAgICAgICBsZXQgcmVxdWVzdCA9IHRoaXMucmVxdWVzdFRhZ01hcC5nZXQodGhpcy5jdXJyZW50UmVxdWVzdC50YWcpO1xuICAgICAgICAgICAgaWYgKHJlcXVlc3QpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJlcXVlc3RUYWdNYXAuZGVsZXRlKHJlcXVlc3QudGFnKTtcbiAgICAgICAgICAgICAgICBjb25zdCBlcnJvciA9IG5ldyBFcnJvcignQ29ubmVjdGlvbiBub3QgYXZhaWxhYmxlJyk7XG4gICAgICAgICAgICAgICAgZXJyb3IuY29kZSA9ICdOb0Nvbm5lY3Rpb24nO1xuICAgICAgICAgICAgICAgIHJlcXVlc3QucmVqZWN0KGVycm9yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuY3VycmVudFJlcXVlc3QgPSBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHJlamVjdCBhbGwgb3RoZXIgcGVuZGluZyBjb21tYW5kc1xuICAgICAgICB3aGlsZSAodGhpcy5yZXF1ZXN0UXVldWUubGVuZ3RoKSB7XG4gICAgICAgICAgICBsZXQgcmVxID0gdGhpcy5yZXF1ZXN0UXVldWUuc2hpZnQoKTtcbiAgICAgICAgICAgIGlmIChyZXEgJiYgdGhpcy5yZXF1ZXN0VGFnTWFwLmhhcyhyZXEudGFnKSkge1xuICAgICAgICAgICAgICAgIGxldCByZXF1ZXN0ID0gdGhpcy5yZXF1ZXN0VGFnTWFwLmdldChyZXEudGFnKTtcbiAgICAgICAgICAgICAgICBpZiAocmVxdWVzdCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlcXVlc3RUYWdNYXAuZGVsZXRlKHJlcXVlc3QudGFnKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZXJyb3IgPSBuZXcgRXJyb3IoJ0Nvbm5lY3Rpb24gbm90IGF2YWlsYWJsZScpO1xuICAgICAgICAgICAgICAgICAgICBlcnJvci5jb2RlID0gJ05vQ29ubmVjdGlvbic7XG4gICAgICAgICAgICAgICAgICAgIHJlcXVlc3QucmVqZWN0KGVycm9yKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnN0YXRlID0gdGhpcy5zdGF0ZXMuTE9HT1VUO1xuICAgICAgICBpZiAodGhpcy5pc0Nsb3NlZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuaXNDbG9zZWQgPSB0cnVlO1xuXG4gICAgICAgIGlmICh0aGlzLndyaXRlU29ja2V0ICYmICF0aGlzLndyaXRlU29ja2V0LmRlc3Ryb3llZCkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICB0aGlzLndyaXRlU29ja2V0LmRlc3Ryb3koKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgIHRoaXMubG9nLmVycm9yKHsgZXJyLCBjaWQ6IHRoaXMuaWQgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5zb2NrZXQgJiYgIXRoaXMuc29ja2V0LmRlc3Ryb3llZCAmJiB0aGlzLndyaXRlU29ja2V0ICE9PSB0aGlzLnNvY2tldCkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICB0aGlzLnNvY2tldC5kZXN0cm95KCk7XG4gICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxvZy5lcnJvcih7IGVyciwgY2lkOiB0aGlzLmlkIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5sb2cudHJhY2UoeyBtc2c6ICdDb25uZWN0aW9uIGNsb3NlZCcsIGNpZDogdGhpcy5pZCB9KTtcbiAgICAgICAgdGhpcy5lbWl0KCdjbG9zZScpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEB0eXBlZGVmIHtPYmplY3R9IFF1b3RhUmVzcG9uc2VcbiAgICAgKiBAZ2xvYmFsXG4gICAgICogQHByb3BlcnR5IHtTdHJpbmd9IHBhdGg9SU5CT1ggbWFpbGJveCBwYXRoIHRoaXMgcXVvdGEgYXBwbGllcyB0b1xuICAgICAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBbc3RvcmFnZV0gU3RvcmFnZSBxdW90YSBpZiBwcm92aWRlZCBieSBzZXJ2ZXJcbiAgICAgKiBAcHJvcGVydHkge051bWJlcn0gW3N0b3JhZ2UudXNlZF0gdXNlZCBzdG9yYWdlIGluIGJ5dGVzXG4gICAgICogQHByb3BlcnR5IHtOdW1iZXJ9IFtzdG9yYWdlLmxpbWl0XSB0b3RhbCBzdG9yYWdlIGF2YWlsYWJsZVxuICAgICAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBbbWVzc2FnZXNdIE1lc3NhZ2UgY291bnQgcXVvdGEgaWYgcHJvdmlkZWQgYnkgc2VydmVyXG4gICAgICogQHByb3BlcnR5IHtOdW1iZXJ9IFttZXNzYWdlcy51c2VkXSBzdG9yZWQgbWVzc2FnZXNcbiAgICAgKiBAcHJvcGVydHkge051bWJlcn0gW21lc3NhZ2VzLmxpbWl0XSBtYXhpbXVtIG1lc3NhZ2VzIGFsbG93ZWRcbiAgICAgKi9cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgY3VycmVudCBxdW90YVxuICAgICAqXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IFtwYXRoXSBPcHRpb25hbCBtYWlsYm94IHBhdGggaWYgeW91IHdhbnQgdG8gY2hlY2sgcXVvdGEgZm9yIHNwZWNpZmljIGZvbGRlclxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlPFF1b3RhUmVzcG9uc2V8Qm9vbGVhbj59IFF1b3RhIGluZm9ybWF0aW9uIG9yIGBmYWxzZWAgaWYgUVVUT0EgZXh0ZW5zaW9uIGlzIG5vdCBzdXBwb3J0ZWQgb3IgcmVxdWVzdGVkIHBhdGggZG9lcyBub3QgZXhpc3RcbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogbGV0IHF1b3RhID0gYXdhaXQgY2xpZW50LmdldFF1b3RhKCk7XG4gICAgICogY29uc29sZS5sb2cocXVvdGEuc3RvcmFnZS51c2VkLCBxdW90YS5zdG9yYWdlLmF2YWlsYWJsZSlcbiAgICAgKi9cbiAgICBhc3luYyBnZXRRdW90YShwYXRoKSB7XG4gICAgICAgIHBhdGggPSBwYXRoIHx8ICdJTkJPWCc7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLnJ1bignUVVPVEEnLCBwYXRoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAdHlwZWRlZiB7T2JqZWN0fSBMaXN0UmVzcG9uc2VcbiAgICAgKiBAZ2xvYmFsXG4gICAgICogQHByb3BlcnR5IHtTdHJpbmd9IHBhdGggbWFpbGJveCBwYXRoICh1bmljb2RlIHN0cmluZylcbiAgICAgKiBAcHJvcGVydHkge1N0cmluZ30gcGF0aEFzTGlzdGVkIG1haWxib3ggcGF0aCBhcyBsaXN0ZWQgaW4gdGhlIExJU1QvTFNVQiByZXNwb25zZVxuICAgICAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBuYW1lIG1haWxib3ggbmFtZSAobGFzdCBwYXJ0IG9mIHBhdGggYWZ0ZXIgZGVsaW1pdGVyKVxuICAgICAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBkZWxpbWl0ZXIgbWFpbGJveCBwYXRoIGRlbGltaXRlciwgdXN1YWxseSBcIi5cIiBvciBcIi9cIlxuICAgICAqIEBwcm9wZXJ0eSB7U3RyaW5nW119IHBhcmVudCBBbiBhcnJheSBvZiBwYXJlbnQgZm9sZGVyIG5hbWVzLiBBbGwgbmFtZXMgYXJlIGluIHVuaWNvZGVcbiAgICAgKiBAcHJvcGVydHkge1N0cmluZ30gcGFyZW50UGF0aCBTYW1lIGFzIGBwYXJlbnRgLCBidXQgYXMgYSBjb21wbGV0ZSBzdHJpbmcgcGF0aCAodW5pY29kZSBzdHJpbmcpXG4gICAgICogQHByb3BlcnR5IHtTZXQ8c3RyaW5nPn0gZmxhZ3MgYSBzZXQgb2YgZmxhZ3MgZm9yIHRoaXMgbWFpbGJveFxuICAgICAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBzcGVjaWFsVXNlIG9uZSBvZiBzcGVjaWFsLXVzZSBmbGFncyAoaWYgYXBwbGljYWJsZSk6IFwiXFxBbGxcIiwgXCJcXEFyY2hpdmVcIiwgXCJcXERyYWZ0c1wiLCBcIlxcRmxhZ2dlZFwiLCBcIlxcSnVua1wiLCBcIlxcU2VudFwiLCBcIlxcVHJhc2hcIi4gQWRkaXRpb25hbGx5IElOQk9YIGhhcyBub24tc3RhbmRhcmQgXCJcXEluYm94XCIgZmxhZyBzZXRcbiAgICAgKiBAcHJvcGVydHkge0Jvb2xlYW59IGxpc3RlZCBgdHJ1ZWAgaWYgbWFpbGJveCB3YXMgZm91bmQgZnJvbSB0aGUgb3V0cHV0IG9mIExJU1QgY29tbWFuZFxuICAgICAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gc3Vic2NyaWJlZCBgdHJ1ZWAgaWYgbWFpbGJveCB3YXMgZm91bmQgZnJvbSB0aGUgb3V0cHV0IG9mIExTVUIgY29tbWFuZFxuICAgICAqIEBwcm9wZXJ0eSB7U3RhdHVzT2JqZWN0fSBbc3RhdHVzXSBJZiBgc3RhdHVzUXVlcnlgIHdhcyB1c2VkLCB0aGVuIHRoaXMgdmFsdWUgaW5jbHVkZXMgdGhlIHN0YXR1cyByZXNwb25zZVxuICAgICAqL1xuXG4gICAgLyoqXG4gICAgICogQHR5cGVkZWYge09iamVjdH0gTGlzdE9wdGlvbnNcbiAgICAgKiBAZ2xvYmFsXG4gICAgICogQHByb3BlcnR5IHtPYmplY3R9IFtzdGF0dXNRdWVyeV0gcmVxdWVzdCBzdGF0dXMgaXRlbXMgZm9yIGV2ZXJ5IGxpc3RlZCBlbnRyeVxuICAgICAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gW3N0YXR1c1F1ZXJ5Lm1lc3NhZ2VzXSBpZiBgdHJ1ZWAgcmVxdWVzdCBjb3VudCBvZiBtZXNzYWdlc1xuICAgICAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gW3N0YXR1c1F1ZXJ5LnJlY2VudF0gaWYgYHRydWVgIHJlcXVlc3QgY291bnQgb2YgbWVzc2FnZXMgd2l0aCBcXFxcUmVjZW50IHRhZ1xuICAgICAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gW3N0YXR1c1F1ZXJ5LnVpZE5leHRdIGlmIGB0cnVlYCByZXF1ZXN0IHByZWRpY3RlZCBuZXh0IFVJRFxuICAgICAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gW3N0YXR1c1F1ZXJ5LnVpZFZhbGlkaXR5XSBpZiBgdHJ1ZWAgcmVxdWVzdCBtYWlsYm94IGBVSURWQUxJRElUWWAgdmFsdWVcbiAgICAgKiBAcHJvcGVydHkge0Jvb2xlYW59IFtzdGF0dXNRdWVyeS51bnNlZW5dIGlmIGB0cnVlYCByZXF1ZXN0IGNvdW50IG9mIHVuc2VlbiBtZXNzYWdlc1xuICAgICAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gW3N0YXR1c1F1ZXJ5LmhpZ2hlc3RNb2RzZXFdIGlmIGB0cnVlYCByZXF1ZXN0IGxhc3Qga25vd24gbW9kc2VxIHZhbHVlXG4gICAgICogQHByb3BlcnR5IHtPYmplY3R9IFtzcGVjaWFsVXNlSGludHNdIHNldCBzcGVjaWZpYyBwYXRocyBhcyBzcGVjaWFsIHVzZSBmb2xkZXJzLCB0aGlzIHdvdWxkIG92ZXJyaWRlIHNwZWNpYWwgdXNlIGZsYWdzIHByb3ZpZGVkIGZyb20gdGhlIHNlcnZlclxuICAgICAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBbc3BlY2lhbFVzZUhpbnRzLnNlbnRdIFBhdGggdG8gXCJTZW50IE1haWxcIiBmb2xkZXJcbiAgICAgKiBAcHJvcGVydHkge1N0cmluZ30gW3NwZWNpYWxVc2VIaW50cy50cmFzaF0gUGF0aCB0byBcIlRyYXNoXCIgZm9sZGVyXG4gICAgICogQHByb3BlcnR5IHtTdHJpbmd9IFtzcGVjaWFsVXNlSGludHMuanVua10gUGF0aCB0byBcIkp1bmsgTWFpbFwiIGZvbGRlclxuICAgICAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBbc3BlY2lhbFVzZUhpbnRzLmRyYWZ0c10gUGF0aCB0byBcIkRyYWZ0c1wiIGZvbGRlclxuICAgICAqL1xuXG4gICAgLyoqXG4gICAgICogTGlzdHMgYXZhaWxhYmxlIG1haWxib3hlcyBhcyBhbiBBcnJheVxuICAgICAqXG4gICAgICogQHBhcmFtIHtMaXN0T3B0aW9uc30gW29wdGlvbnNdIGRlZmluZXMgYWRkaXRpb25hbCBsaXN0aW5nIG9wdGlvbnNcbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTxMaXN0UmVzcG9uc2VbXT59IEFuIGFycmF5IG9mIExpc3RSZXNwb25zZSBvYmplY3RzXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGxldCBsaXN0ID0gYXdhaXQgY2xpZW50Lmxpc3QoKTtcbiAgICAgKiBsaXN0LmZvckVhY2gobWFpbGJveD0+Y29uc29sZS5sb2cobWFpbGJveC5wYXRoKSk7XG4gICAgICovXG4gICAgYXN5bmMgbGlzdChvcHRpb25zKSB7XG4gICAgICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICAgICAgICBsZXQgZm9sZGVycyA9IGF3YWl0IHRoaXMucnVuKCdMSVNUJywgJycsICcqJywgb3B0aW9ucyk7XG4gICAgICAgIHRoaXMuZm9sZGVycyA9IG5ldyBNYXAoZm9sZGVycy5tYXAoZm9sZGVyID0+IFtmb2xkZXIucGF0aCwgZm9sZGVyXSkpO1xuICAgICAgICByZXR1cm4gZm9sZGVycztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAdHlwZWRlZiB7T2JqZWN0fSBMaXN0VHJlZVJlc3BvbnNlXG4gICAgICogQGdsb2JhbFxuICAgICAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gcm9vdCBJZiBgdHJ1ZWAgdGhlbiB0aGlzIGlzIHJvb3Qgbm9kZSB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHByb3BlcnRpZXMgYmVzaWRlcyAqZm9sZGVycypcbiAgICAgKiBAcHJvcGVydHkge1N0cmluZ30gcGF0aCBtYWlsYm94IHBhdGhcbiAgICAgKiBAcHJvcGVydHkge1N0cmluZ30gbmFtZSBtYWlsYm94IG5hbWUgKGxhc3QgcGFydCBvZiBwYXRoIGFmdGVyIGRlbGltaXRlcilcbiAgICAgKiBAcHJvcGVydHkge1N0cmluZ30gZGVsaW1pdGVyIG1haWxib3ggcGF0aCBkZWxpbWl0ZXIsIHVzdWFsbHkgXCIuXCIgb3IgXCIvXCJcbiAgICAgKiBAcHJvcGVydHkge1N0cmluZ1tdfSBmbGFncyBsaXN0IG9mIGZsYWdzIGZvciB0aGlzIG1haWxib3hcbiAgICAgKiBAcHJvcGVydHkge1N0cmluZ30gc3BlY2lhbFVzZSBvbmUgb2Ygc3BlY2lhbC11c2UgZmxhZ3MgKGlmIGFwcGxpY2FibGUpOiBcIlxcQWxsXCIsIFwiXFxBcmNoaXZlXCIsIFwiXFxEcmFmdHNcIiwgXCJcXEZsYWdnZWRcIiwgXCJcXEp1bmtcIiwgXCJcXFNlbnRcIiwgXCJcXFRyYXNoXCIuIEFkZGl0aW9uYWxseSBJTkJPWCBoYXMgbm9uLXN0YW5kYXJkIFwiXFxJbmJveFwiIGZsYWcgc2V0XG4gICAgICogQHByb3BlcnR5IHtCb29sZWFufSBsaXN0ZWQgYHRydWVgIGlmIG1haWxib3ggd2FzIGZvdW5kIGZyb20gdGhlIG91dHB1dCBvZiBMSVNUIGNvbW1hbmRcbiAgICAgKiBAcHJvcGVydHkge0Jvb2xlYW59IHN1YnNjcmliZWQgYHRydWVgIGlmIG1haWxib3ggd2FzIGZvdW5kIGZyb20gdGhlIG91dHB1dCBvZiBMU1VCIGNvbW1hbmRcbiAgICAgKiBAcHJvcGVydHkge0Jvb2xlYW59IGRpc2FibGVkIElmIGB0cnVlYCB0aGVuIHRoaXMgbWFpbGJveCBjYW4gbm90IGJlIHNlbGVjdGVkIGluIHRoZSBVSVxuICAgICAqIEBwcm9wZXJ0eSB7TGlzdFRyZWVSZXNwb25zZVtdfSBmb2xkZXJzIEFuIGFycmF5IG9mIHN1YmZvbGRlcnNcbiAgICAgKi9cblxuICAgIC8qKlxuICAgICAqIExpc3RzIGF2YWlsYWJsZSBtYWlsYm94ZXMgYXMgYSB0cmVlIHN0cnVjdHVyZWQgb2JqZWN0XG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0xpc3RPcHRpb25zfSBbb3B0aW9uc10gZGVmaW5lcyBhZGRpdGlvbmFsIGxpc3Rpbmcgb3B0aW9uc1xuICAgICAqIEByZXR1cm5zIHtQcm9taXNlPExpc3RUcmVlUmVzcG9uc2U+fSBUcmVlIHN0cnVjdHVyZWQgb2JqZWN0XG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGxldCB0cmVlID0gYXdhaXQgY2xpZW50Lmxpc3RUcmVlKCk7XG4gICAgICogdHJlZS5mb2xkZXJzLmZvckVhY2gobWFpbGJveD0+Y29uc29sZS5sb2cobWFpbGJveC5wYXRoKSk7XG4gICAgICovXG4gICAgYXN5bmMgbGlzdFRyZWUob3B0aW9ucykge1xuICAgICAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgICAgICAgbGV0IGZvbGRlcnMgPSBhd2FpdCB0aGlzLnJ1bignTElTVCcsICcnLCAnKicsIG9wdGlvbnMpO1xuICAgICAgICB0aGlzLmZvbGRlcnMgPSBuZXcgTWFwKGZvbGRlcnMubWFwKGZvbGRlciA9PiBbZm9sZGVyLnBhdGgsIGZvbGRlcl0pKTtcbiAgICAgICAgcmV0dXJuIGdldEZvbGRlclRyZWUoZm9sZGVycyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGVyZm9ybXMgYSBuby1vcCBjYWxsIGFnYWluc3Qgc2VydmVyXG4gICAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAgICovXG4gICAgYXN5bmMgbm9vcCgpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5ydW4oJ05PT1AnKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAdHlwZWRlZiB7T2JqZWN0fSBNYWlsYm94Q3JlYXRlUmVzcG9uc2VcbiAgICAgKiBAZ2xvYmFsXG4gICAgICogQHByb3BlcnR5IHtTdHJpbmd9IHBhdGggZnVsbCBtYWlsYm94IHBhdGhcbiAgICAgKiBAcHJvcGVydHkge1N0cmluZ30gW21haWxib3hJZF0gdW5pcXVlIG1haWxib3ggSUQgaWYgc2VydmVyIHN1cHBvcnRzIGBPQkpFQ1RJRGAgZXh0ZW5zaW9uIChjdXJyZW50bHkgWWFob28gYW5kIHNvbWUgb3RoZXJzKVxuICAgICAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gY3JlYXRlZCBJZiBgdHJ1ZWAgdGhlbiBtYWlsYm94IHdhcyBjcmVhdGVkIG90aGVyd2lzZSBpdCBhbHJlYWR5IGV4aXN0ZWRcbiAgICAgKi9cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgbWFpbGJveCBmb2xkZXIgYW5kIHNldHMgdXAgc3Vic2NyaXB0aW9uIGZvciB0aGUgY3JlYXRlZCBtYWlsYm94LiBUaHJvd3Mgb24gZXJyb3IuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ3xhcnJheX0gcGF0aCBGdWxsIG1haWxib3ggcGF0aC4gVW5pY29kZSBpcyBhbGxvd2VkLiBJZiB2YWx1ZSBpcyBhbiBhcnJheSB0aGVuIGl0IGlzIGpvaW5lZCB1c2luZyBjdXJyZW50IGRlbGltaXRlciBzeW1ib2xzLiBOYW1lc3BhY2UgcHJlZml4IGlzIGFkZGVkIGF1dG9tYXRpY2FsbHkgaWYgcmVxdWlyZWQuXG4gICAgICogQHJldHVybnMge1Byb21pc2U8TWFpbGJveENyZWF0ZVJlc3BvbnNlPn0gTWFpbGJveCBpbmZvXG4gICAgICogQHRocm93cyBXaWxsIHRocm93IGFuIGVycm9yIGlmIG1haWxib3ggY2FuIG5vdCBiZSBjcmVhdGVkXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGxldCBpbmZvID0gYXdhaXQgY2xpZW50Lm1haWxib3hDcmVhdGUoWydwYXJlbnQnLCAnY2hpbGQnXSk7XG4gICAgICogY29uc29sZS5sb2coaW5mby5wYXRoKTtcbiAgICAgKiAvLyBcIklOQk9YLnBhcmVudC5jaGlsZFwiIC8vIGFzc3VtZXMgXCJJTkJPWC5cIiBhcyBuYW1lc3BhY2UgcHJlZml4IGFuZCBcIi5cIiBhcyBkZWxpbWl0ZXJcbiAgICAgKi9cbiAgICBhc3luYyBtYWlsYm94Q3JlYXRlKHBhdGgpIHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMucnVuKCdDUkVBVEUnLCBwYXRoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAdHlwZWRlZiB7T2JqZWN0fSBNYWlsYm94UmVuYW1lUmVzcG9uc2VcbiAgICAgKiBAZ2xvYmFsXG4gICAgICogQHByb3BlcnR5IHtTdHJpbmd9IHBhdGggZnVsbCBtYWlsYm94IHBhdGggdGhhdCB3YXMgcmVuYW1lZFxuICAgICAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBuZXdQYXRoIG5ldyBmdWxsIG1haWxib3ggcGF0aFxuICAgICAqL1xuXG4gICAgLyoqXG4gICAgICogUmVuYW1lcyBhIG1haWxib3guIFRocm93cyBvbiBlcnJvci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfGFycmF5fSBwYXRoICBQYXRoIGZvciB0aGUgbWFpbGJveCB0byByZW5hbWUuIFVuaWNvZGUgaXMgYWxsb3dlZC4gSWYgdmFsdWUgaXMgYW4gYXJyYXkgdGhlbiBpdCBpcyBqb2luZWQgdXNpbmcgY3VycmVudCBkZWxpbWl0ZXIgc3ltYm9scy4gTmFtZXNwYWNlIHByZWZpeCBpcyBhZGRlZCBhdXRvbWF0aWNhbGx5IGlmIHJlcXVpcmVkLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfGFycmF5fSBuZXdQYXRoIE5ldyBwYXRoIGZvciB0aGUgbWFpbGJveFxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlPE1haWxib3hSZW5hbWVSZXNwb25zZT59IE1haWxib3ggaW5mb1xuICAgICAqIEB0aHJvd3MgV2lsbCB0aHJvdyBhbiBlcnJvciBpZiBtYWlsYm94IGRvZXMgbm90IGV4aXN0IG9yIGNhbiBub3QgYmUgcmVuYW1lZFxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBsZXQgaW5mbyA9IGF3YWl0IGNsaWVudC5tYWlsYm94UmVuYW1lKCdwYXJlbnQuY2hpbGQnLCAnSW1wb3J0YW50IHN0dWZmIOKdl++4jycpO1xuICAgICAqIGNvbnNvbGUubG9nKGluZm8ubmV3UGF0aCk7XG4gICAgICogLy8gXCJJTkJPWC5JbXBvcnRhbnQgc3R1ZmYg4p2X77iPXCIgLy8gYXNzdW1lcyBcIklOQk9YLlwiIGFzIG5hbWVzcGFjZSBwcmVmaXhcbiAgICAgKi9cbiAgICBhc3luYyBtYWlsYm94UmVuYW1lKHBhdGgsIG5ld1BhdGgpIHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMucnVuKCdSRU5BTUUnLCBwYXRoLCBuZXdQYXRoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAdHlwZWRlZiB7T2JqZWN0fSBNYWlsYm94RGVsZXRlUmVzcG9uc2VcbiAgICAgKiBAZ2xvYmFsXG4gICAgICogQHByb3BlcnR5IHtTdHJpbmd9IHBhdGggZnVsbCBtYWlsYm94IHBhdGggdGhhdCB3YXMgZGVsZXRlZFxuICAgICAqL1xuXG4gICAgLyoqXG4gICAgICogRGVsZXRlcyBhIG1haWxib3guIFRocm93cyBvbiBlcnJvci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfGFycmF5fSBwYXRoIFBhdGggZm9yIHRoZSBtYWlsYm94IHRvIGRlbGV0ZS4gVW5pY29kZSBpcyBhbGxvd2VkLiBJZiB2YWx1ZSBpcyBhbiBhcnJheSB0aGVuIGl0IGlzIGpvaW5lZCB1c2luZyBjdXJyZW50IGRlbGltaXRlciBzeW1ib2xzLiBOYW1lc3BhY2UgcHJlZml4IGlzIGFkZGVkIGF1dG9tYXRpY2FsbHkgaWYgcmVxdWlyZWQuXG4gICAgICogQHJldHVybnMge1Byb21pc2U8TWFpbGJveERlbGV0ZVJlc3BvbnNlPn0gTWFpbGJveCBpbmZvXG4gICAgICogQHRocm93cyBXaWxsIHRocm93IGFuIGVycm9yIGlmIG1haWxib3ggZG9lcyBub3QgZXhpc3Qgb3IgY2FuIG5vdCBiZSBkZWxldGVkXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGxldCBpbmZvID0gYXdhaXQgY2xpZW50Lm1haWxib3hEZWxldGUoJ0ltcG9ydGFudCBzdHVmZiDinZfvuI8nKTtcbiAgICAgKiBjb25zb2xlLmxvZyhpbmZvLnBhdGgpO1xuICAgICAqIC8vIFwiSU5CT1guSW1wb3J0YW50IHN0dWZmIOKdl++4j1wiIC8vIGFzc3VtZXMgXCJJTkJPWC5cIiBhcyBuYW1lc3BhY2UgcHJlZml4XG4gICAgICovXG4gICAgYXN5bmMgbWFpbGJveERlbGV0ZShwYXRoKSB7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLnJ1bignREVMRVRFJywgcGF0aCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU3Vic2NyaWJlcyB0byBhIG1haWxib3hcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfGFycmF5fSBwYXRoIFBhdGggZm9yIHRoZSBtYWlsYm94IHRvIHN1YnNjcmliZSB0by4gVW5pY29kZSBpcyBhbGxvd2VkLiBJZiB2YWx1ZSBpcyBhbiBhcnJheSB0aGVuIGl0IGlzIGpvaW5lZCB1c2luZyBjdXJyZW50IGRlbGltaXRlciBzeW1ib2xzLiBOYW1lc3BhY2UgcHJlZml4IGlzIGFkZGVkIGF1dG9tYXRpY2FsbHkgaWYgcmVxdWlyZWQuXG4gICAgICogQHJldHVybnMge1Byb21pc2U8Qm9vbGVhbj59IGB0cnVlYCBpZiBzdWJzY3JpcHRpb24gb3BlcmF0aW9uIHN1Y2NlZWRlZCwgYGZhbHNlYCBvdGhlcndpc2VcbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYXdhaXQgY2xpZW50Lm1haWxib3hTdWJzY3JpYmUoJ0ltcG9ydGFudCBzdHVmZiDinZfvuI8nKTtcbiAgICAgKi9cbiAgICBhc3luYyBtYWlsYm94U3Vic2NyaWJlKHBhdGgpIHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMucnVuKCdTVUJTQ1JJQkUnLCBwYXRoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVbnN1YnNjcmliZXMgZnJvbSBhIG1haWxib3hcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfGFycmF5fSBwYXRoICoqUGF0aCBmb3IgdGhlIG1haWxib3gqKiB0byB1bnN1YnNjcmliZSBmcm9tLiBVbmljb2RlIGlzIGFsbG93ZWQuIElmIHZhbHVlIGlzIGFuIGFycmF5IHRoZW4gaXQgaXMgam9pbmVkIHVzaW5nIGN1cnJlbnQgZGVsaW1pdGVyIHN5bWJvbHMuIE5hbWVzcGFjZSBwcmVmaXggaXMgYWRkZWQgYXV0b21hdGljYWxseSBpZiByZXF1aXJlZC5cbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTxCb29sZWFuPn0gYHRydWVgIGlmIHVuc3Vic2NyaXB0aW9uIG9wZXJhdGlvbiBzdWNjZWVkZWQsIGBmYWxzZWAgb3RoZXJ3aXNlXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGF3YWl0IGNsaWVudC5tYWlsYm94VW5zdWJzY3JpYmUoJ0ltcG9ydGFudCBzdHVmZiDinZfvuI8nKTtcbiAgICAgKi9cbiAgICBhc3luYyBtYWlsYm94VW5zdWJzY3JpYmUocGF0aCkge1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5ydW4oJ1VOU1VCU0NSSUJFJywgcGF0aCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogT3BlbnMgYSBtYWlsYm94IHRvIGFjY2VzcyBtZXNzYWdlcy4gWW91IGNhbiBwZXJmb3JtIG1lc3NhZ2Ugb3BlcmF0aW9ucyBvbmx5IGFnYWluc3QgYW4gb3BlbmVkIG1haWxib3guXG4gICAgICogVXNpbmcge0BsaW5rIG1vZHVsZTppbWFwZmxvd35JbWFwRmxvdyNnZXRNYWlsYm94TG9ja3xnZXRNYWlsYm94TG9jaygpfSBpbnN0ZWFkIG9mIGBtYWlsYm94T3BlbigpYCBpcyBwcmVmZXJyZWQuIEJvdGggZG8gdGhlIHNhbWUgdGhpbmdcbiAgICAgKiBidXQgbmV4dCBgZ2V0TWFpbGJveExvY2soKWAgY2FsbCBpcyBub3QgZXhlY3V0ZWQgdW50aWwgcHJldmlvdXMgb25lIGlzIHJlbGVhc2VkLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd8YXJyYXl9IHBhdGggKipQYXRoIGZvciB0aGUgbWFpbGJveCoqIHRvIG9wZW5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdIG9wdGlvbmFsIG9wdGlvbnNcbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLnJlYWRPbmx5PWZhbHNlXSBJZiBgdHJ1ZWAgdGhlbiBvcGVucyBtYWlsYm94IGluIHJlYWQtb25seSBtb2RlLiBZb3UgY2FuIHN0aWxsIHRyeSB0byBwZXJmb3JtIHdyaXRlIG9wZXJhdGlvbnMgYnV0IHRoZXNlIHdvdWxkIHByb2JhYmx5IGZhaWwuXG4gICAgICogQHJldHVybnMge1Byb21pc2U8TWFpbGJveE9iamVjdD59IE1haWxib3ggaW5mb1xuICAgICAqIEB0aHJvd3MgV2lsbCB0aHJvdyBhbiBlcnJvciBpZiBtYWlsYm94IGRvZXMgbm90IGV4aXN0IG9yIGNhbiBub3QgYmUgb3BlbmVkXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGxldCBtYWlsYm94ID0gYXdhaXQgY2xpZW50Lm1haWxib3hPcGVuKCdJbXBvcnRhbnQgc3R1ZmYg4p2X77iPJyk7XG4gICAgICogY29uc29sZS5sb2cobWFpbGJveC5leGlzdHMpO1xuICAgICAqIC8vIDEyNVxuICAgICAqL1xuICAgIGFzeW5jIG1haWxib3hPcGVuKHBhdGgsIG9wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMucnVuKCdTRUxFQ1QnLCBwYXRoLCBvcHRpb25zKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDbG9zZXMgYSBwcmV2aW91c2x5IG9wZW5lZCBtYWlsYm94XG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTxCb29sZWFuPn0gRGlkIHRoZSBvcGVyYXRpb24gc3VjY2VlZCBvciBub3RcbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogbGV0IG1haWxib3ggPSBhd2FpdCBjbGllbnQubWFpbGJveE9wZW4oJ0lOQk9YJyk7XG4gICAgICogYXdhaXQgY2xpZW50Lm1haWxib3hDbG9zZSgpO1xuICAgICAqL1xuICAgIGFzeW5jIG1haWxib3hDbG9zZSgpIHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMucnVuKCdDTE9TRScpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEB0eXBlZGVmIHtPYmplY3R9IFN0YXR1c09iamVjdFxuICAgICAqIEBnbG9iYWxcbiAgICAgKiBAcHJvcGVydHkge1N0cmluZ30gcGF0aCBmdWxsIG1haWxib3ggcGF0aCB0aGF0IHdhcyBjaGVja2VkXG4gICAgICogQHByb3BlcnR5IHtOdW1iZXJ9IFttZXNzYWdlc10gQ291bnQgb2YgbWVzc2FnZXNcbiAgICAgKiBAcHJvcGVydHkge051bWJlcn0gW3JlY2VudF0gQ291bnQgb2YgbWVzc2FnZXMgd2l0aCBcXFxcUmVjZW50IHRhZ1xuICAgICAqIEBwcm9wZXJ0eSB7TnVtYmVyfSBbdWlkTmV4dF0gUHJlZGljdGVkIG5leHQgVUlEXG4gICAgICogQHByb3BlcnR5IHtCaWdJbnR9IFt1aWRWYWxpZGl0eV0gTWFpbGJveCBgVUlEVkFMSURJVFlgIHZhbHVlXG4gICAgICogQHByb3BlcnR5IHtOdW1iZXJ9IFt1bnNlZW5dIENvdW50IG9mIHVuc2VlbiBtZXNzYWdlc1xuICAgICAqIEBwcm9wZXJ0eSB7QmlnSW50fSBbaGlnaGVzdE1vZHNlcV0gTGFzdCBrbm93biBtb2RzZXEgdmFsdWUgKGlmIENPTkRTVE9SRSBleHRlbnNpb24gaXMgZW5hYmxlZClcbiAgICAgKi9cblxuICAgIC8qKlxuICAgICAqIFJlcXVlc3RzIHRoZSBzdGF0dXMgb2YgdGhlIGluZGljYXRlZCBtYWlsYm94LiBPbmx5IHJlcXVlc3RlZCBzdGF0dXMgdmFsdWVzIHdpbGwgYmUgcmV0dXJuZWQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gcGF0aCBtYWlsYm94IHBhdGggdG8gY2hlY2sgZm9yICh1bmljb2RlIHN0cmluZylcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gcXVlcnkgZGVmaW5lcyByZXF1ZXN0ZWQgc3RhdHVzIGl0ZW1zXG4gICAgICogQHBhcmFtIHtCb29sZWFufSBxdWVyeS5tZXNzYWdlcyBpZiBgdHJ1ZWAgcmVxdWVzdCBjb3VudCBvZiBtZXNzYWdlc1xuICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gcXVlcnkucmVjZW50IGlmIGB0cnVlYCByZXF1ZXN0IGNvdW50IG9mIG1lc3NhZ2VzIHdpdGggXFxcXFJlY2VudCB0YWdcbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IHF1ZXJ5LnVpZE5leHQgaWYgYHRydWVgIHJlcXVlc3QgcHJlZGljdGVkIG5leHQgVUlEXG4gICAgICogQHBhcmFtIHtCb29sZWFufSBxdWVyeS51aWRWYWxpZGl0eSBpZiBgdHJ1ZWAgcmVxdWVzdCBtYWlsYm94IGBVSURWQUxJRElUWWAgdmFsdWVcbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IHF1ZXJ5LnVuc2VlbiBpZiBgdHJ1ZWAgcmVxdWVzdCBjb3VudCBvZiB1bnNlZW4gbWVzc2FnZXNcbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IHF1ZXJ5LmhpZ2hlc3RNb2RzZXEgaWYgYHRydWVgIHJlcXVlc3QgbGFzdCBrbm93biBtb2RzZXEgdmFsdWVcbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTxTdGF0dXNPYmplY3Q+fSBzdGF0dXMgb2YgdGhlIGluZGljYXRlZCBtYWlsYm94XG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGxldCBzdGF0dXMgPSBhd2FpdCBjbGllbnQuc3RhdHVzKCdJTkJPWCcsIHt1bnNlZW46IHRydWV9KTtcbiAgICAgKiBjb25zb2xlLmxvZyhzdGF0dXMudW5zZWVuKTtcbiAgICAgKiAvLyAxMjNcbiAgICAgKi9cbiAgICBhc3luYyBzdGF0dXMocGF0aCwgcXVlcnkpIHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMucnVuKCdTVEFUVVMnLCBwYXRoLCBxdWVyeSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU3RhcnRzIGxpc3RlbmluZyBmb3IgbmV3IG9yIGRlbGV0ZWQgbWVzc2FnZXMgZnJvbSB0aGUgY3VycmVudGx5IG9wZW5lZCBtYWlsYm94LiBPbmx5IHJlcXVpcmVkIGlmIHtAbGluayBJbWFwRmxvdyNkaXNhYmxlQXV0b0lkbGV9IGlzIHNldCB0byBgdHJ1ZWBcbiAgICAgKiBvdGhlcndpc2UgSURMRSBpcyBzdGFydGVkIGJ5IGRlZmF1bHQgb24gY29ubmVjdGlvbiBpbmFjdGl2aXR5LiBOQiEgSWYgYGlkbGUoKWAgaXMgY2FsbGVkIG1hbnVhbGx5IHRoZW4gaXQgZG9lcyBub3RcbiAgICAgKiByZXR1cm4gdW50aWwgSURMRSBpcyBmaW5pc2hlZCB3aGljaCBtZWFucyB5b3Ugd291bGQgaGF2ZSB0byBjYWxsIHNvbWUgb3RoZXIgY29tbWFuZCBvdXQgb2Ygc2NvcGUuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTxCb29sZWFuPn0gRGlkIHRoZSBvcGVyYXRpb24gc3VjY2VlZCBvciBub3RcbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogbGV0IG1haWxib3ggPSBhd2FpdCBjbGllbnQubWFpbGJveE9wZW4oJ0lOQk9YJyk7XG4gICAgICpcbiAgICAgKiBhd2FpdCBjbGllbnQuaWRsZSgpO1xuICAgICAqL1xuICAgIGFzeW5jIGlkbGUoKSB7XG4gICAgICAgIGlmICghdGhpcy5pZGxpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLnJ1bignSURMRScsIHRoaXMubWF4SWRsZVRpbWUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2VxdWVuY2UgcmFuZ2Ugc3RyaW5nLiBTZXBhcmF0ZSBkaWZmZXJlbnQgdmFsdWVzIHdpdGggY29tbWFzLCBudW1iZXIgcmFuZ2VzIHdpdGggY29sb25zIGFuZCB1c2UgXFxcXCogYXMgdGhlIHBsYWNlaG9sZGVyIGZvciB0aGUgbmV3ZXN0IG1lc3NhZ2UgaW4gbWFpbGJveFxuICAgICAqIEB0eXBlZGVmIHtTdHJpbmd9IFNlcXVlbmNlU3RyaW5nXG4gICAgICogQGdsb2JhbFxuICAgICAqIEBleGFtcGxlXG4gICAgICogXCIxOipcIiAvLyBmb3IgYWxsIG1lc3NhZ2VzXG4gICAgICogXCIxLDIsM1wiIC8vIGZvciBtZXNzYWdlcyAxLCAyIGFuZCAzXG4gICAgICogXCIxLDIsNDo2XCIgLy8gZm9yIG1lc3NhZ2VzIDEsMiw0LDUsNlxuICAgICAqIFwiKlwiIC8vIGZvciB0aGUgbmV3ZXN0IG1lc3NhZ2VcbiAgICAgKi9cblxuICAgIC8qKlxuICAgICAqIElNQVAgc2VhcmNoIHF1ZXJ5IG9wdGlvbnMuIEJ5IGRlZmF1bHQgYWxsIGNvbmRpdGlvbnMgbXVzdCBtYXRjaC4gSW4gY2FzZSBvZiBgb3JgIHF1ZXJ5IHRlcm0gYXQgbGVhc3Qgb25lIGNvbmRpdGlvbiBtdXN0IG1hdGNoLlxuICAgICAqIEB0eXBlZGVmIHtPYmplY3R9IFNlYXJjaE9iamVjdFxuICAgICAqIEBnbG9iYWxcbiAgICAgKiBAcHJvcGVydHkge1NlcXVlbmNlU3RyaW5nfSBbc2VxXSBtZXNzYWdlIG9yZGVyaW5nIHNlcXVlbmNlIHJhbmdlXG4gICAgICogQHByb3BlcnR5IHtCb29sZWFufSBbYW5zd2VyZWRdIE1lc3NhZ2VzIHdpdGggKHZhbHVlIGlzIGB0cnVlYCkgb3Igd2l0aG91dCAodmFsdWUgaXMgYGZhbHNlYCkgXFxcXEFuc3dlcmVkIGZsYWdcbiAgICAgKiBAcHJvcGVydHkge0Jvb2xlYW59IFtkZWxldGVkXSBNZXNzYWdlcyB3aXRoICh2YWx1ZSBpcyBgdHJ1ZWApIG9yIHdpdGhvdXQgKHZhbHVlIGlzIGBmYWxzZWApIFxcXFxEZWxldGVkIGZsYWdcbiAgICAgKiBAcHJvcGVydHkge0Jvb2xlYW59IFtkcmFmdF0gTWVzc2FnZXMgd2l0aCAodmFsdWUgaXMgYHRydWVgKSBvciB3aXRob3V0ICh2YWx1ZSBpcyBgZmFsc2VgKSBcXFxcRHJhZnQgZmxhZ1xuICAgICAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gW2ZsYWdnZWRdIE1lc3NhZ2VzIHdpdGggKHZhbHVlIGlzIGB0cnVlYCkgb3Igd2l0aG91dCAodmFsdWUgaXMgYGZhbHNlYCkgXFxcXEZsYWdnZWQgZmxhZ1xuICAgICAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gW3NlZW5dIE1lc3NhZ2VzIHdpdGggKHZhbHVlIGlzIGB0cnVlYCkgb3Igd2l0aG91dCAodmFsdWUgaXMgYGZhbHNlYCkgXFxcXFNlZW4gZmxhZ1xuICAgICAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gW2FsbF0gSWYgYHRydWVgIG1hdGNoZXMgYWxsIG1lc3NhZ2VzXG4gICAgICogQHByb3BlcnR5IHtCb29sZWFufSBbbmV3XSBJZiBgdHJ1ZWAgbWF0Y2hlcyBtZXNzYWdlcyB0aGF0IGhhdmUgdGhlIFxcXFxSZWNlbnQgZmxhZyBzZXQgYnV0IG5vdCB0aGUgXFxcXFNlZW4gZmxhZ1xuICAgICAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gW29sZF0gSWYgYHRydWVgIG1hdGNoZXMgbWVzc2FnZXMgdGhhdCBkbyBub3QgaGF2ZSB0aGUgXFxcXFJlY2VudCBmbGFnIHNldFxuICAgICAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gW3JlY2VudF0gSWYgYHRydWVgIG1hdGNoZXMgbWVzc2FnZXMgdGhhdCBoYXZlIHRoZSBcXFxcUmVjZW50IGZsYWcgc2V0XG4gICAgICogQHByb3BlcnR5IHtTdHJpbmd9IFtmcm9tXSBNYXRjaGVzIEZyb206IGFkZHJlc3MgZmllbGRcbiAgICAgKiBAcHJvcGVydHkge1N0cmluZ30gW3RvXSBNYXRjaGVzIFRvOiBhZGRyZXNzIGZpZWxkXG4gICAgICogQHByb3BlcnR5IHtTdHJpbmd9IFtjY10gTWF0Y2hlcyBDYzogYWRkcmVzcyBmaWVsZFxuICAgICAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBbYmNjXSBNYXRjaGVzIEJjYzogYWRkcmVzcyBmaWVsZFxuICAgICAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBbYm9keV0gTWF0Y2hlcyBtZXNzYWdlIGJvZHlcbiAgICAgKiBAcHJvcGVydHkge1N0cmluZ30gW3N1YmplY3RdIE1hdGNoZXMgbWVzc2FnZSBzdWJqZWN0XG4gICAgICogQHByb3BlcnR5IHtOdW1iZXJ9IFtsYXJnZXJdIE1hdGNoZXMgbWVzc2FnZXMgbGFyZ2VyIHRoYW4gdmFsdWVcbiAgICAgKiBAcHJvcGVydHkge051bWJlcn0gW3NtYWxsZXJdIE1hdGNoZXMgbWVzc2FnZXMgc21hbGxlciB0aGFuIHZhbHVlXG4gICAgICogQHByb3BlcnR5IHtTZXF1ZW5jZVN0cmluZ30gW3VpZF0gVUlEIHNlcXVlbmNlIHJhbmdlXG4gICAgICogQHByb3BlcnR5IHtCaWdJbnR9IFttb2RzZXFdIE1hdGNoZXMgbWVzc2FnZXMgd2l0aCBtb2RzZXEgaGlnaGVyIHRoYW4gdmFsdWVcbiAgICAgKiBAcHJvcGVydHkge1N0cmluZ30gW2VtYWlsSWRdIHVuaXF1ZSBlbWFpbCBJRC4gT25seSB1c2VkIGlmIHNlcnZlciBzdXBwb3J0cyBgT0JKRUNUSURgIG9yIGBYLUdNLUVYVC0xYCBleHRlbnNpb25zXG4gICAgICogQHByb3BlcnR5IHtTdHJpbmd9IFt0aHJlYWRJZF0gdW5pcXVlIHRocmVhZCBJRC4gT25seSB1c2VkIGlmIHNlcnZlciBzdXBwb3J0cyBgT0JKRUNUSURgIG9yIGBYLUdNLUVYVC0xYCBleHRlbnNpb25zXG4gICAgICogQHByb3BlcnR5IHtEYXRlfHN0cmluZ30gW2JlZm9yZV0gTWF0Y2hlcyBtZXNzYWdlcyByZWNlaXZlZCBiZWZvcmUgZGF0ZVxuICAgICAqIEBwcm9wZXJ0eSB7RGF0ZXxzdHJpbmd9IFtvbl0gTWF0Y2hlcyBtZXNzYWdlcyByZWNlaXZlZCBvbiBkYXRlIChpZ25vcmVzIHRpbWUpXG4gICAgICogQHByb3BlcnR5IHtEYXRlfHN0cmluZ30gW3NpbmNlXSBNYXRjaGVzIG1lc3NhZ2VzIHJlY2VpdmVkIGFmdGVyIGRhdGVcbiAgICAgKiBAcHJvcGVydHkge0RhdGV8c3RyaW5nfSBbc2VudEJlZm9yZV0gTWF0Y2hlcyBtZXNzYWdlcyBzZW50IGJlZm9yZSBkYXRlXG4gICAgICogQHByb3BlcnR5IHtEYXRlfHN0cmluZ30gW3NlbnRPbl0gTWF0Y2hlcyBtZXNzYWdlcyBzZW50IG9uIGRhdGUgKGlnbm9yZXMgdGltZSlcbiAgICAgKiBAcHJvcGVydHkge0RhdGV8c3RyaW5nfSBbc2VudFNpbmNlXSBNYXRjaGVzIG1lc3NhZ2VzIHNlbnQgYWZ0ZXIgZGF0ZVxuICAgICAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBba2V5d29yZF0gTWF0Y2hlcyBtZXNzYWdlcyB0aGF0IGhhdmUgdGhlIGN1c3RvbSBmbGFnIHNldFxuICAgICAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBbdW5LZXl3b3JkXSBNYXRjaGVzIG1lc3NhZ2VzIHRoYXQgZG8gbm90IGhhdmUgdGhlIGN1c3RvbSBmbGFnIHNldFxuICAgICAqIEBwcm9wZXJ0eSB7T2JqZWN0LjxzdHJpbmcsIEJvb2xlYW58U3RyaW5nPn0gW2hlYWRlcl0gTWF0Y2hlcyBtZXNzYWdlcyB3aXRoIGhlYWRlciBrZXkgc2V0IGlmIHZhbHVlIGlzIGB0cnVlYCAoKipOQiEqKiBub3Qgc3VwcG9ydGVkIGJ5IGFsbCBzZXJ2ZXJzKSBvciBtZXNzYWdlcyB3aGVyZSBoZWFkZXIgcGFydGlhbGx5IG1hdGNoZXMgYSBzdHJpbmcgdmFsdWVcbiAgICAgKiBAcHJvcGVydHkge1NlYXJjaE9iamVjdFtdfSBbb3JdIEFuIGFycmF5IG9mIDIgb3IgbW9yZSB7QGxpbmsgU2VhcmNoT2JqZWN0fSBvYmplY3RzLiBBdCBsZWFzdCBvbiBvZiB0aGVzZSBtdXN0IG1hdGNoXG4gICAgICovXG5cbiAgICAvKipcbiAgICAgKiBTZXRzIGZsYWdzIGZvciBhIG1lc3NhZ2Ugb3IgbWVzc2FnZSByYW5nZVxuICAgICAqXG4gICAgICogQHBhcmFtIHtTZXF1ZW5jZVN0cmluZyB8IE51bWJlcltdIHwgU2VhcmNoT2JqZWN0fSByYW5nZSBSYW5nZSB0byBmaWx0ZXIgdGhlIG1lc3NhZ2VzXG4gICAgICogQHBhcmFtIHtzdHJpbmdbXX0gQXJyYXkgb2YgZmxhZ3MgdG8gc2V0LiBPbmx5IGZsYWdzIHRoYXQgYXJlIHBlcm1pdHRlZCB0byBzZXQgYXJlIHVzZWQsIG90aGVyIGZsYWdzIGFyZSBpZ25vcmVkXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXVxuICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMudWlkXSBJZiBgdHJ1ZWAgdGhlbiB1c2VzIFVJRCB7QGxpbmsgU2VxdWVuY2VTdHJpbmd9IGluc3RlYWQgb2Ygc2VxdWVuY2UgbnVtYmVyc1xuICAgICAqIEBwYXJhbSB7QmlnSW50fSBbb3B0aW9ucy51bmNoYW5nZWRTaW5jZV0gSWYgc2V0IHRoZW4gb25seSBtZXNzYWdlcyB3aXRoIGEgbG93ZXIgb3IgZXF1YWwgYG1vZHNlcWAgdmFsdWUgYXJlIHVwZGF0ZWQuIElnbm9yZWQgaWYgc2VydmVyIGRvZXMgbm90IHN1cHBvcnQgYENPTkRTVE9SRWAgZXh0ZW5zaW9uLlxuICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMudXNlTGFiZWxzPWZhbHNlXSBJZiB0cnVlIHRoZW4gdXBkYXRlIEdtYWlsIGxhYmVscyBpbnN0ZWFkIG9mIG1lc3NhZ2UgZmxhZ3NcbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTxCb29sZWFuPn0gRGlkIHRoZSBvcGVyYXRpb24gc3VjY2VlZCBvciBub3RcbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogbGV0IG1haWxib3ggPSBhd2FpdCBjbGllbnQubWFpbGJveE9wZW4oJ0lOQk9YJyk7XG4gICAgICogLy8gbWFyayBhbGwgdW5zZWVuIG1lc3NhZ2VzIGFzIHNlZW4gKGFuZCByZW1vdmUgb3RoZXIgZmxhZ3MpXG4gICAgICogYXdhaXQgY2xpZW50Lm1lc3NhZ2VGbGFnc1NldCh7c2VlbjogZmFsc2V9LCBbJ1xcU2Vlbl0pO1xuICAgICAqL1xuICAgIGFzeW5jIG1lc3NhZ2VGbGFnc1NldChyYW5nZSwgZmxhZ3MsIG9wdGlvbnMpIHtcbiAgICAgICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cbiAgICAgICAgcmFuZ2UgPSBhd2FpdCB0aGlzLnJlc29sdmVSYW5nZShyYW5nZSwgb3B0aW9ucyk7XG4gICAgICAgIGlmICghcmFuZ2UpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBxdWVyeU9wdHMgPSBPYmplY3QuYXNzaWduKFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIG9wZXJhdGlvbjogJ3NldCdcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBvcHRpb25zXG4gICAgICAgICk7XG5cbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMucnVuKCdTVE9SRScsIHJhbmdlLCBmbGFncywgcXVlcnlPcHRzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBZGRzIGZsYWdzIGZvciBhIG1lc3NhZ2Ugb3IgbWVzc2FnZSByYW5nZVxuICAgICAqXG4gICAgICogQHBhcmFtIHtTZXF1ZW5jZVN0cmluZyB8IE51bWJlcltdIHwgU2VhcmNoT2JqZWN0fSByYW5nZSBSYW5nZSB0byBmaWx0ZXIgdGhlIG1lc3NhZ2VzXG4gICAgICogQHBhcmFtIHtzdHJpbmdbXX0gQXJyYXkgb2YgZmxhZ3MgdG8gc2V0LiBPbmx5IGZsYWdzIHRoYXQgYXJlIHBlcm1pdHRlZCB0byBzZXQgYXJlIHVzZWQsIG90aGVyIGZsYWdzIGFyZSBpZ25vcmVkXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXVxuICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMudWlkXSBJZiBgdHJ1ZWAgdGhlbiB1c2VzIFVJRCB7QGxpbmsgU2VxdWVuY2VTdHJpbmd9IGluc3RlYWQgb2Ygc2VxdWVuY2UgbnVtYmVyc1xuICAgICAqIEBwYXJhbSB7QmlnSW50fSBbb3B0aW9ucy51bmNoYW5nZWRTaW5jZV0gSWYgc2V0IHRoZW4gb25seSBtZXNzYWdlcyB3aXRoIGEgbG93ZXIgb3IgZXF1YWwgYG1vZHNlcWAgdmFsdWUgYXJlIHVwZGF0ZWQuIElnbm9yZWQgaWYgc2VydmVyIGRvZXMgbm90IHN1cHBvcnQgYENPTkRTVE9SRWAgZXh0ZW5zaW9uLlxuICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMudXNlTGFiZWxzPWZhbHNlXSBJZiB0cnVlIHRoZW4gdXBkYXRlIEdtYWlsIGxhYmVscyBpbnN0ZWFkIG9mIG1lc3NhZ2UgZmxhZ3NcbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTxCb29sZWFuPn0gRGlkIHRoZSBvcGVyYXRpb24gc3VjY2VlZCBvciBub3RcbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogbGV0IG1haWxib3ggPSBhd2FpdCBjbGllbnQubWFpbGJveE9wZW4oJ0lOQk9YJyk7XG4gICAgICogLy8gbWFyayBhbGwgdW5zZWVuIG1lc3NhZ2VzIGFzIHNlZW4gKGFuZCBrZWVwIG90aGVyIGZsYWdzIGFzIGlzKVxuICAgICAqIGF3YWl0IGNsaWVudC5tZXNzYWdlRmxhZ3NBZGQoe3NlZW46IGZhbHNlfSwgWydcXFNlZW5dKTtcbiAgICAgKi9cbiAgICBhc3luYyBtZXNzYWdlRmxhZ3NBZGQocmFuZ2UsIGZsYWdzLCBvcHRpb25zKSB7XG4gICAgICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuXG4gICAgICAgIHJhbmdlID0gYXdhaXQgdGhpcy5yZXNvbHZlUmFuZ2UocmFuZ2UsIG9wdGlvbnMpO1xuICAgICAgICBpZiAoIXJhbmdlKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgcXVlcnlPcHRzID0gT2JqZWN0LmFzc2lnbihcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBvcGVyYXRpb246ICdhZGQnXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgb3B0aW9uc1xuICAgICAgICApO1xuXG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLnJ1bignU1RPUkUnLCByYW5nZSwgZmxhZ3MsIHF1ZXJ5T3B0cyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlIHNwZWNpZmljIGZsYWdzIGZyb20gYSBtZXNzYWdlIG9yIG1lc3NhZ2UgcmFuZ2VcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7U2VxdWVuY2VTdHJpbmcgfCBOdW1iZXJbXSB8IFNlYXJjaE9iamVjdH0gcmFuZ2UgUmFuZ2UgdG8gZmlsdGVyIHRoZSBtZXNzYWdlc1xuICAgICAqIEBwYXJhbSB7c3RyaW5nW119IEFycmF5IG9mIGZsYWdzIHRvIHJlbW92ZS4gT25seSBmbGFncyB0aGF0IGFyZSBwZXJtaXR0ZWQgdG8gc2V0IGFyZSB1c2VkLCBvdGhlciBmbGFncyBhcmUgaWdub3JlZFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc11cbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLnVpZF0gSWYgYHRydWVgIHRoZW4gdXNlcyBVSUQge0BsaW5rIFNlcXVlbmNlU3RyaW5nfSBpbnN0ZWFkIG9mIHNlcXVlbmNlIG51bWJlcnNcbiAgICAgKiBAcGFyYW0ge0JpZ0ludH0gW29wdGlvbnMudW5jaGFuZ2VkU2luY2VdIElmIHNldCB0aGVuIG9ubHkgbWVzc2FnZXMgd2l0aCBhIGxvd2VyIG9yIGVxdWFsIGBtb2RzZXFgIHZhbHVlIGFyZSB1cGRhdGVkLiBJZ25vcmVkIGlmIHNlcnZlciBkb2VzIG5vdCBzdXBwb3J0IGBDT05EU1RPUkVgIGV4dGVuc2lvbi5cbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLnVzZUxhYmVscz1mYWxzZV0gSWYgdHJ1ZSB0aGVuIHVwZGF0ZSBHbWFpbCBsYWJlbHMgaW5zdGVhZCBvZiBtZXNzYWdlIGZsYWdzXG4gICAgICogQHJldHVybnMge1Byb21pc2U8Qm9vbGVhbj59IERpZCB0aGUgb3BlcmF0aW9uIHN1Y2NlZWQgb3Igbm90XG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGxldCBtYWlsYm94ID0gYXdhaXQgY2xpZW50Lm1haWxib3hPcGVuKCdJTkJPWCcpO1xuICAgICAqIC8vIG1hcmsgYWxsIHNlZW4gbWVzc2FnZXMgYXMgdW5zZWVuIGJ5IHJlbW92aW5nIFxcXFxTZWVuIGZsYWdcbiAgICAgKiBhd2FpdCBjbGllbnQubWVzc2FnZUZsYWdzUmVtb3ZlKHtzZWVuOiB0cnVlfSwgWydcXFNlZW5dKTtcbiAgICAgKi9cbiAgICBhc3luYyBtZXNzYWdlRmxhZ3NSZW1vdmUocmFuZ2UsIGZsYWdzLCBvcHRpb25zKSB7XG4gICAgICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuXG4gICAgICAgIHJhbmdlID0gYXdhaXQgdGhpcy5yZXNvbHZlUmFuZ2UocmFuZ2UsIG9wdGlvbnMpO1xuICAgICAgICBpZiAoIXJhbmdlKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgcXVlcnlPcHRzID0gT2JqZWN0LmFzc2lnbihcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBvcGVyYXRpb246ICdyZW1vdmUnXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgb3B0aW9uc1xuICAgICAgICApO1xuXG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLnJ1bignU1RPUkUnLCByYW5nZSwgZmxhZ3MsIHF1ZXJ5T3B0cyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyBhIGNvbG9yZWQgZmxhZyBmb3IgYW4gZW1haWwuIE9ubHkgc3VwcG9ydGVkIGJ5IG1haWwgY2xpZW50cyBsaWtlIEFwcGxlIE1haWxcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7U2VxdWVuY2VTdHJpbmcgfCBOdW1iZXJbXSB8IFNlYXJjaE9iamVjdH0gcmFuZ2UgUmFuZ2UgdG8gZmlsdGVyIHRoZSBtZXNzYWdlc1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBUaGUgY29sb3IgdG8gc2V0LiBPbmUgb2YgJ3JlZCcsICdvcmFuZ2UnLCAneWVsbG93JywgJ2dyZWVuJywgJ2JsdWUnLCAncHVycGxlJywgYW5kICdncmV5J1xuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc11cbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLnVpZF0gSWYgYHRydWVgIHRoZW4gdXNlcyBVSUQge0BsaW5rIFNlcXVlbmNlU3RyaW5nfSBpbnN0ZWFkIG9mIHNlcXVlbmNlIG51bWJlcnNcbiAgICAgKiBAcGFyYW0ge0JpZ0ludH0gW29wdGlvbnMudW5jaGFuZ2VkU2luY2VdIElmIHNldCB0aGVuIG9ubHkgbWVzc2FnZXMgd2l0aCBhIGxvd2VyIG9yIGVxdWFsIGBtb2RzZXFgIHZhbHVlIGFyZSB1cGRhdGVkLiBJZ25vcmVkIGlmIHNlcnZlciBkb2VzIG5vdCBzdXBwb3J0IGBDT05EU1RPUkVgIGV4dGVuc2lvbi5cbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTxCb29sZWFuPn0gRGlkIHRoZSBvcGVyYXRpb24gc3VjY2VlZCBvciBub3RcbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogbGV0IG1haWxib3ggPSBhd2FpdCBjbGllbnQubWFpbGJveE9wZW4oJ0lOQk9YJyk7XG4gICAgICogLy8gYWRkIGEgcHVycGxlIGZsYWcgZm9yIGFsbCBlbWFpbHNcbiAgICAgKiBhd2FpdCBjbGllbnQuc2V0RmxhZ0NvbG9yKCcxOionLCAnUHVycGxlJyk7XG4gICAgICovXG4gICAgYXN5bmMgc2V0RmxhZ0NvbG9yKHJhbmdlLCBjb2xvciwgb3B0aW9ucykge1xuICAgICAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcblxuICAgICAgICByYW5nZSA9IGF3YWl0IHRoaXMucmVzb2x2ZVJhbmdlKHJhbmdlLCBvcHRpb25zKTtcbiAgICAgICAgaWYgKCFyYW5nZSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGZsYWdDaGFuZ2VzID0gZ2V0Q29sb3JGbGFncyhjb2xvcik7XG4gICAgICAgIGlmICghZmxhZ0NoYW5nZXMpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBhZGRSZXN1bHRzO1xuICAgICAgICBsZXQgcmVtb3ZlUmVzdWx0cztcblxuICAgICAgICBpZiAoZmxhZ0NoYW5nZXMuYWRkICYmIGZsYWdDaGFuZ2VzLmFkZC5sZW5ndGgpIHtcbiAgICAgICAgICAgIGxldCBxdWVyeU9wdHMgPSBPYmplY3QuYXNzaWduKFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uOiAnYWRkJ1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgb3B0aW9ucyxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHVzZUxhYmVsczogZmFsc2UsIC8vIG92ZXJyaWRlIGlmIHNldFxuICAgICAgICAgICAgICAgICAgICAvLyBwcmV2ZW50IHRyaWdnZXJpbmcgYSBwcmVtYXR1cmUgRmxhZ3MgY2hhbmdlIG5vdGlmaWNhdGlvblxuICAgICAgICAgICAgICAgICAgICBzaWxlbnQ6IGZsYWdDaGFuZ2VzLnJlbW92ZSAmJiBmbGFnQ2hhbmdlcy5yZW1vdmUubGVuZ3RoXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgYWRkUmVzdWx0cyA9IGF3YWl0IHRoaXMucnVuKCdTVE9SRScsIHJhbmdlLCBmbGFnQ2hhbmdlcy5hZGQsIHF1ZXJ5T3B0cyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZmxhZ0NoYW5nZXMucmVtb3ZlICYmIGZsYWdDaGFuZ2VzLnJlbW92ZS5sZW5ndGgpIHtcbiAgICAgICAgICAgIGxldCBxdWVyeU9wdHMgPSBPYmplY3QuYXNzaWduKFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uOiAncmVtb3ZlJ1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgb3B0aW9ucyxcbiAgICAgICAgICAgICAgICB7IHVzZUxhYmVsczogZmFsc2UgfSAvLyBvdmVycmlkZSBpZiBzZXRcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIHJlbW92ZVJlc3VsdHMgPSBhd2FpdCB0aGlzLnJ1bignU1RPUkUnLCByYW5nZSwgZmxhZ0NoYW5nZXMucmVtb3ZlLCBxdWVyeU9wdHMpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGFkZFJlc3VsdHMgfHwgcmVtb3ZlUmVzdWx0cyB8fCBmYWxzZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZWxldGUgbWVzc2FnZXMgZnJvbSB0aGUgY3VycmVudGx5IG9wZW5lZCBtYWlsYm94LiBNZXRob2QgZG9lcyBub3QgaW5kaWNhdGUgaW5mbyBhYm91dCBkZWxldGVkIG1lc3NhZ2VzLFxuICAgICAqIGluc3RlYWQgeW91IHNob3VsZCBiZSB1c2luZyB7QGxpbmsgSW1hcEZsb3cjZXhwdW5nZX0gZXZlbnQgZm9yIHRoaXNcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7U2VxdWVuY2VTdHJpbmcgfCBOdW1iZXJbXSB8IFNlYXJjaE9iamVjdH0gcmFuZ2UgUmFuZ2UgdG8gZmlsdGVyIHRoZSBtZXNzYWdlc1xuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc11cbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLnVpZF0gSWYgYHRydWVgIHRoZW4gdXNlcyBVSUQge0BsaW5rIFNlcXVlbmNlU3RyaW5nfSBpbnN0ZWFkIG9mIHNlcXVlbmNlIG51bWJlcnNcbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTxCb29sZWFuPn0gRGlkIHRoZSBvcGVyYXRpb24gc3VjY2VlZCBvciBub3RcbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogbGV0IG1haWxib3ggPSBhd2FpdCBjbGllbnQubWFpbGJveE9wZW4oJ0lOQk9YJyk7XG4gICAgICogLy8gZGVsZXRlIGFsbCBzZWVuIG1lc3NhZ2VzXG4gICAgICogYXdhaXQgY2xpZW50Lm1lc3NhZ2VEZWxldGUoe3NlZW46IHRydWV9KTtcbiAgICAgKi9cbiAgICBhc3luYyBtZXNzYWdlRGVsZXRlKHJhbmdlLCBvcHRpb25zKSB7XG4gICAgICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICAgICAgICByYW5nZSA9IGF3YWl0IHRoaXMucmVzb2x2ZVJhbmdlKHJhbmdlLCBvcHRpb25zKTtcbiAgICAgICAgaWYgKCFyYW5nZSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLnJ1bignRVhQVU5HRScsIHJhbmdlLCBvcHRpb25zKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAdHlwZWRlZiB7T2JqZWN0fSBBcHBlbmRSZXNwb25zZU9iamVjdFxuICAgICAqIEBnbG9iYWxcbiAgICAgKiBAcHJvcGVydHkge1N0cmluZ30gZGVzdGluYXRpb24gZnVsbCBtYWlsYm94IHBhdGggd2hlcmUgdGhlIG1lc3NhZ2Ugd2FzIHVwbG9hZGVkIHRvXG4gICAgICogQHByb3BlcnR5IHtCaWdJbnR9IFt1aWRWYWxpZGl0eV0gbWFpbGJveCBgVUlEVkFMSURJVFlgIGlmIHNlcnZlciBoYXMgYFVJRFBMVVNgIGV4dGVuc2lvbiBlbmFibGVkXG4gICAgICogQHByb3BlcnR5IHtOdW1iZXJ9IFt1aWRdIFVJRCBvZiB0aGUgdXBsb2FkZWQgbWVzc2FnZSBpZiBzZXJ2ZXIgaGFzIGBVSURQTFVTYCBleHRlbnNpb24gZW5hYmxlZFxuICAgICAqIEBwcm9wZXJ0eSB7TnVtYmVyfSBbc2VxXSBzZXF1ZW5jZSBudW1iZXIgb2YgdGhlIHVwbG9hZGVkIG1lc3NhZ2UgaWYgcGF0aCBpcyBjdXJyZW50bHkgc2VsZWN0ZWQgbWFpbGJveFxuICAgICAqL1xuXG4gICAgLyoqXG4gICAgICogQXBwZW5kcyBhIG5ldyBtZXNzYWdlIHRvIGEgbWFpbGJveFxuICAgICAqXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IHBhdGggTWFpbGJveCBwYXRoIHRvIHVwbG9hZCB0aGUgbWVzc2FnZSB0byAodW5pY29kZSBzdHJpbmcpXG4gICAgICogQHBhcmFtIHtzdHJpbmd8QnVmZmVyfSBjb250ZW50IFJGQzgyMiBmb3JtYXR0ZWQgZW1haWwgbWVzc2FnZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nW119IFtmbGFnc10gYW4gYXJyYXkgb2YgZmxhZ3MgdG8gYmUgc2V0IGZvciB0aGUgdXBsb2FkZWQgbWVzc2FnZVxuICAgICAqIEBwYXJhbSB7RGF0ZXxzdHJpbmd9IFtpZGF0ZT1ub3ddIGludGVybmFsIGRhdGUgdG8gYmUgc2V0IGZvciB0aGUgbWVzc2FnZVxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlPEFwcGVuZFJlc3BvbnNlT2JqZWN0Pn0gaW5mbyBhYm91dCB1cGxvYWRlZCBtZXNzYWdlXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGF3YWl0IGNsaWVudC5hcHBlbmQoJ0lOQk9YJywgcmF3TWVzc2FnZUJ1ZmZlciwgWydcXFxcU2VlbiddLCBuZXcgRGF0ZSgyMDAwLCAxLCAxKSk7XG4gICAgICovXG4gICAgYXN5bmMgYXBwZW5kKHBhdGgsIGNvbnRlbnQsIGZsYWdzLCBpZGF0ZSkge1xuICAgICAgICBsZXQgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLnJ1bignQVBQRU5EJywgcGF0aCwgY29udGVudCwgZmxhZ3MsIGlkYXRlKTtcblxuICAgICAgICBpZiAoIXJlc3BvbnNlKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVzcG9uc2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHR5cGVkZWYge09iamVjdH0gQ29weVJlc3BvbnNlT2JqZWN0XG4gICAgICogQGdsb2JhbFxuICAgICAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBwYXRoIHBhdGggb2Ygc291cmNlIG1haWxib3hcbiAgICAgKiBAcHJvcGVydHkge1N0cmluZ30gZGVzdGluYXRpb24gcGF0aCBvZiBkZXN0aW5hdGlvbiBtYWlsYm94XG4gICAgICogQHByb3BlcnR5IHtCaWdJbnR9IFt1aWRWYWxpZGl0eV0gZGVzdGluYXRpb24gbWFpbGJveCBgVUlEVkFMSURJVFlgIGlmIHNlcnZlciBoYXMgYFVJRFBMVVNgIGV4dGVuc2lvbiBlbmFibGVkXG4gICAgICogQHByb3BlcnR5IHtNYXA8bnVtYmVyLCBudW1iZXI+fSBbdWlkTWFwXSBNYXAgb2YgVUlEIHZhbHVlcyAoaWYgc2VydmVyIGhhcyBgVUlEUExVU2AgZXh0ZW5zaW9uIGVuYWJsZWQpIHdoZXJlIGtleSBpcyBVSUQgaW4gc291cmNlIG1haWxib3ggYW5kIHZhbHVlIGlzIHRoZSBVSUQgZm9yIHRoZSBzYW1lIG1lc3NhZ2UgaW4gZGVzdGluYXRpb24gbWFpbGJveFxuICAgICAqL1xuXG4gICAgLyoqXG4gICAgICogQ29waWVzIG1lc3NhZ2VzIGZyb20gY3VycmVudCBtYWlsYm94IHRvIGRlc3RpbmF0aW9uIG1haWxib3hcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7U2VxdWVuY2VTdHJpbmcgfCBOdW1iZXJbXSB8IFNlYXJjaE9iamVjdH0gcmFuZ2UgUmFuZ2Ugb2YgbWVzc2FnZXMgdG8gY29weVxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBkZXN0aW5hdGlvbiBNYWlsYm94IHBhdGggdG8gY29weSB0aGUgbWVzc2FnZXMgdG9cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdXG4gICAgICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy51aWRdIElmIGB0cnVlYCB0aGVuIHVzZXMgVUlEIHtAbGluayBTZXF1ZW5jZVN0cmluZ30gaW5zdGVhZCBvZiBzZXF1ZW5jZSBudW1iZXJzXG4gICAgICogQHJldHVybnMge1Byb21pc2U8Q29weVJlc3BvbnNlT2JqZWN0Pn0gaW5mbyBhYm91dCBjb3BpZXMgbWVzc2FnZXNcbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYXdhaXQgY2xpZW50Lm1haWxib3hPcGVuKCdJTkJPWCcpO1xuICAgICAqIC8vIGNvcHkgYWxsIG1lc3NhZ2VzIHRvIGEgbWFpbGJveCBjYWxsZWQgXCJCYWNrdXBcIiAobXVzdCBleGlzdClcbiAgICAgKiBsZXQgcmVzdWx0ID0gYXdhaXQgY2xpZW50Lm1lc3NhZ2VDb3B5KCcxOionLCAnQmFja3VwJyk7XG4gICAgICogY29uc29sZS5sb2coJ0NvcGllZCAlcyBtZXNzYWdlcycsIHJlc3VsdC51aWRNYXAuc2l6ZSk7XG4gICAgICovXG4gICAgYXN5bmMgbWVzc2FnZUNvcHkocmFuZ2UsIGRlc3RpbmF0aW9uLCBvcHRpb25zKSB7XG4gICAgICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICAgICAgICByYW5nZSA9IGF3YWl0IHRoaXMucmVzb2x2ZVJhbmdlKHJhbmdlLCBvcHRpb25zKTtcbiAgICAgICAgaWYgKCFyYW5nZSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLnJ1bignQ09QWScsIHJhbmdlLCBkZXN0aW5hdGlvbiwgb3B0aW9ucyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTW92ZXMgbWVzc2FnZXMgZnJvbSBjdXJyZW50IG1haWxib3ggdG8gZGVzdGluYXRpb24gbWFpbGJveFxuICAgICAqXG4gICAgICogQHBhcmFtIHtTZXF1ZW5jZVN0cmluZyB8IE51bWJlcltdIHwgU2VhcmNoT2JqZWN0fSByYW5nZSBSYW5nZSBvZiBtZXNzYWdlcyB0byBtb3ZlXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IGRlc3RpbmF0aW9uIE1haWxib3ggcGF0aCB0byBtb3ZlIHRoZSBtZXNzYWdlcyB0b1xuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc11cbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLnVpZF0gSWYgYHRydWVgIHRoZW4gdXNlcyBVSUQge0BsaW5rIFNlcXVlbmNlU3RyaW5nfSBpbnN0ZWFkIG9mIHNlcXVlbmNlIG51bWJlcnNcbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTxDb3B5UmVzcG9uc2VPYmplY3Q+fSBpbmZvIGFib3V0IG1vdmVkIG1lc3NhZ2VzXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGF3YWl0IGNsaWVudC5tYWlsYm94T3BlbignSU5CT1gnKTtcbiAgICAgKiAvLyBtb3ZlIGFsbCBtZXNzYWdlcyB0byBhIG1haWxib3ggY2FsbGVkIFwiVHJhc2hcIiAobXVzdCBleGlzdClcbiAgICAgKiBsZXQgcmVzdWx0ID0gYXdhaXQgY2xpZW50Lm1lc3NhZ2VNb3ZlKCcxOionLCAnVHJhc2gnKTtcbiAgICAgKiBjb25zb2xlLmxvZygnTW92ZWQgJXMgbWVzc2FnZXMnLCByZXN1bHQudWlkTWFwLnNpemUpO1xuICAgICAqL1xuICAgIGFzeW5jIG1lc3NhZ2VNb3ZlKHJhbmdlLCBkZXN0aW5hdGlvbiwgb3B0aW9ucykge1xuICAgICAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgICAgICAgcmFuZ2UgPSBhd2FpdCB0aGlzLnJlc29sdmVSYW5nZShyYW5nZSwgb3B0aW9ucyk7XG4gICAgICAgIGlmICghcmFuZ2UpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5ydW4oJ01PVkUnLCByYW5nZSwgZGVzdGluYXRpb24sIG9wdGlvbnMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNlYXJjaCBtZXNzYWdlcyBmcm9tIHRoZSBjdXJyZW50bHkgb3BlbmVkIG1haWxib3hcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7U2VhcmNoT2JqZWN0fSBxdWVyeSBRdWVyeSB0byBmaWx0ZXIgdGhlIG1lc3NhZ2VzXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXVxuICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMudWlkXSBJZiBgdHJ1ZWAgdGhlbiByZXR1cm5zIFVJRCBudW1iZXJzIGluc3RlYWQgb2Ygc2VxdWVuY2UgbnVtYmVyc1xuICAgICAqIEByZXR1cm5zIHtQcm9taXNlPE51bWJlcltdPn0gQW4gYXJyYXkgb2Ygc2VxdWVuY2Ugb3IgVUlEIG51bWJlcnNcbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogbGV0IG1haWxib3ggPSBhd2FpdCBjbGllbnQubWFpbGJveE9wZW4oJ0lOQk9YJyk7XG4gICAgICogLy8gZmluZCBhbGwgdW5zZWVuIG1lc3NhZ2VzXG4gICAgICogbGV0IGxpc3QgPSBhd2FpdCBjbGllbnQuc2VhcmNoKHtzZWVuOiBmYWxzZX0pO1xuICAgICAqIC8vIHVzZSBPUiBtb2RpZmllciAoYXJyYXkgb2YgMiBvciBtb3JlIHNlYXJjaCBxdWVyaWVzKVxuICAgICAqIGxldCBsaXN0ID0gYXdhaXQgY2xpZW50LnNlYXJjaCh7XG4gICAgICogICBzZWVuOiBmYWxzZSxcbiAgICAgKiAgIG9yOiBbXG4gICAgICogICAgIHtmbGFnZ2VkOiB0cnVlfSxcbiAgICAgKiAgICAge2Zyb206ICdhbmRyaXMnfSxcbiAgICAgKiAgICAge3N1YmplY3Q6ICd0ZXN0J31cbiAgICAgKiAgIF19KTtcbiAgICAgKi9cbiAgICBhc3luYyBzZWFyY2gocXVlcnksIG9wdGlvbnMpIHtcbiAgICAgICAgaWYgKCF0aGlzLm1haWxib3gpIHtcbiAgICAgICAgICAgIC8vIG5vIG1haWxib3ggc2VsZWN0ZWQsIG5vdGhpbmcgdG8gZG9cbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCByZXNwb25zZSA9IGF3YWl0IHRoaXMucnVuKCdTRUFSQ0gnLCBxdWVyeSwgb3B0aW9ucyk7XG5cbiAgICAgICAgaWYgKCFyZXNwb25zZSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlc3BvbnNlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEB0eXBlZGVmIHtPYmplY3R9IEZldGNoUXVlcnlPYmplY3RcbiAgICAgKiBAZ2xvYmFsXG4gICAgICogQHByb3BlcnR5IHtCb29sZWFufSBbdWlkXSBpZiBgdHJ1ZWAgdGhlbiBpbmNsdWRlIFVJRCBpbiB0aGUgcmVzcG9uc2VcbiAgICAgKiBAcHJvcGVydHkge0Jvb2xlYW59IFtmbGFnc10gaWYgYHRydWVgIHRoZW4gaW5jbHVkZSBmbGFncyBTZXQgaW4gdGhlIHJlc3BvbnNlLiBBbHNvIGFkZHMgYGZsYWdDb2xvcmAgdG8gdGhlIHJlc3BvbnNlIGlmIHRoZSBtZXNzYWdlIGlzIGZsYWdnZWQuXG4gICAgICogQHByb3BlcnR5IHtCb29sZWFufSBbYm9keVN0cnVjdHVyZV0gaWYgYHRydWVgIHRoZW4gaW5jbHVkZSBwYXJzZWQgQk9EWVNUUlVDVFVSRSBvYmplY3QgaW4gdGhlIHJlc3BvbnNlXG4gICAgICogQHByb3BlcnR5IHtCb29sZWFufSBbZW52ZWxvcGVdIGlmIGB0cnVlYCB0aGVuIGluY2x1ZGUgcGFyc2VkIEVOVkVMT1BFIG9iamVjdCBpbiB0aGUgcmVzcG9uc2VcbiAgICAgKiBAcHJvcGVydHkge0Jvb2xlYW59IFtpbnRlcm5hbERhdGVdIGlmIGB0cnVlYCB0aGVuIGluY2x1ZGUgaW50ZXJuYWwgZGF0ZSB2YWx1ZSBpbiB0aGUgcmVzcG9uc2VcbiAgICAgKiBAcHJvcGVydHkge0Jvb2xlYW59IFtzaXplXSBpZiBgdHJ1ZWAgdGhlbiBpbmNsdWRlIG1lc3NhZ2Ugc2l6ZSBpbiB0aGUgcmVzcG9uc2VcbiAgICAgKiBAcHJvcGVydHkge2Jvb2xlYW4gfCBPYmplY3R9IFtzb3VyY2VdIGlmIGB0cnVlYCB0aGVuIGluY2x1ZGUgZnVsbCBtZXNzYWdlIGluIHRoZSByZXNwb25zZVxuICAgICAqIEBwcm9wZXJ0eSB7TnVtYmVyfSBbc291cmNlLnN0YXJ0XSBpbmNsdWRlIGZ1bGwgbWVzc2FnZSBpbiB0aGUgcmVzcG9uc2Ugc3RhcnRpbmcgZnJvbSAqc3RhcnQqIGJ5dGVcbiAgICAgKiBAcHJvcGVydHkge051bWJlcn0gW3NvdXJjZS5tYXhMZW5ndGhdIGluY2x1ZGUgZnVsbCBtZXNzYWdlIGluIHRoZSByZXNwb25zZSwgdXAgdG8gKm1heExlbmd0aCogYnl0ZXNcbiAgICAgKiBAcHJvcGVydHkge1N0cmluZ30gW3RocmVhZElkXSBpZiBgdHJ1ZWAgdGhlbiBpbmNsdWRlIHRocmVhZCBJRCBpbiB0aGUgcmVzcG9uc2UgKG9ubHkgaWYgc2VydmVyIHN1cHBvcnRzIGVpdGhlciBgT0JKRUNUSURgIG9yIGBYLUdNLUVYVC0xYCBleHRlbnNpb25zKVxuICAgICAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gW2xhYmVsc10gaWYgYHRydWVgIHRoZW4gaW5jbHVkZSBHTWFpbCBsYWJlbHMgaW4gdGhlIHJlc3BvbnNlIChvbmx5IGlmIHNlcnZlciBzdXBwb3J0cyBgWC1HTS1FWFQtMWAgZXh0ZW5zaW9uKVxuICAgICAqIEBwcm9wZXJ0eSB7Ym9vbGVhbiB8IHN0cmluZ1tdfSBbaGVhZGVyc10gaWYgYHRydWVgIHRoZW4gaW5jbHVkZXMgZnVsbCBoZWFkZXJzIG9mIHRoZSBtZXNzYWdlIGluIHRoZSByZXNwb25zZS4gSWYgdGhlIHZhbHVlIGlzIGFuIGFycmF5IG9mIGhlYWRlciBrZXlzIHRoZW4gaW5jbHVkZXMgb25seSBoZWFkZXJzIGxpc3RlZCBpbiB0aGUgYXJyYXlcbiAgICAgKiBAcHJvcGVydHkge3N0cmluZ1tdfSBbYm9keVBhcnRzXSBBbiBhcnJheSBvZiBCT0RZUEFSVCBpZGVudGlmaWVycyB0byBpbmNsdWRlIGluIHRoZSByZXNwb25zZVxuICAgICAqL1xuXG4gICAgLyoqXG4gICAgICogUGFyc2VkIGVtYWlsIGFkZHJlc3MgZW50cnlcbiAgICAgKlxuICAgICAqIEB0eXBlZGVmIHtPYmplY3R9IE1lc3NhZ2VBZGRyZXNzT2JqZWN0XG4gICAgICogQGdsb2JhbFxuICAgICAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBbbmFtZV0gbmFtZSBvZiB0aGUgYWRkcmVzcyBvYmplY3QgKHVuaWNvZGUpXG4gICAgICogQHByb3BlcnR5IHtTdHJpbmd9IFthZGRyZXNzXSBlbWFpbCBhZGRyZXNzXG4gICAgICovXG5cbiAgICAvKipcbiAgICAgKiBQYXJzZWQgSU1BUCBFTlZFTE9QRSBvYmplY3RcbiAgICAgKlxuICAgICAqIEB0eXBlZGVmIHtPYmplY3R9IE1lc3NhZ2VFbnZlbG9wZU9iamVjdFxuICAgICAqIEBnbG9iYWxcbiAgICAgKiBAcHJvcGVydHkge0RhdGV9IFtkYXRlXSBoZWFkZXIgZGF0ZVxuICAgICAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBbc3ViamVjdF0gbWVzc2FnZSBzdWJqZWN0ICh1bmljb2RlKVxuICAgICAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBbbWVzc2FnZUlkXSBNZXNzYWdlIElEIG9mIHRoZSBtZXNzYWdlXG4gICAgICogQHByb3BlcnR5IHtTdHJpbmd9IFtpblJlcGx5VG9dIE1lc3NhZ2UgSUQgZnJvbSBJbi1SZXBseS1UbyBoZWFkZXJcbiAgICAgKiBAcHJvcGVydHkge01lc3NhZ2VBZGRyZXNzT2JqZWN0W119IFtmcm9tXSBBcnJheSBvZiBhZGRyZXNzZXMgZnJvbSB0aGUgRnJvbTogaGVhZGVyXG4gICAgICogQHByb3BlcnR5IHtNZXNzYWdlQWRkcmVzc09iamVjdFtdfSBbc2VuZGVyXSBBcnJheSBvZiBhZGRyZXNzZXMgZnJvbSB0aGUgU2VuZGVyOiBoZWFkZXJcbiAgICAgKiBAcHJvcGVydHkge01lc3NhZ2VBZGRyZXNzT2JqZWN0W119IFtyZXBseVRvXSBBcnJheSBvZiBhZGRyZXNzZXMgZnJvbSB0aGUgUmVwbHktVG86IGhlYWRlclxuICAgICAqIEBwcm9wZXJ0eSB7TWVzc2FnZUFkZHJlc3NPYmplY3RbXX0gW3RvXSBBcnJheSBvZiBhZGRyZXNzZXMgZnJvbSB0aGUgVG86IGhlYWRlclxuICAgICAqIEBwcm9wZXJ0eSB7TWVzc2FnZUFkZHJlc3NPYmplY3RbXX0gW2NjXSBBcnJheSBvZiBhZGRyZXNzZXMgZnJvbSB0aGUgQ2M6IGhlYWRlclxuICAgICAqIEBwcm9wZXJ0eSB7TWVzc2FnZUFkZHJlc3NPYmplY3RbXX0gW2JjY10gQXJyYXkgb2YgYWRkcmVzc2VzIGZyb20gdGhlIEJjYzogaGVhZGVyXG4gICAgICovXG5cbiAgICAvKipcbiAgICAgKiBQYXJzZWQgSU1BUCBCT0RZU1RSVUNUVVJFIG9iamVjdFxuICAgICAqXG4gICAgICogQHR5cGVkZWYge09iamVjdH0gTWVzc2FnZVN0cnVjdHVyZU9iamVjdFxuICAgICAqIEBnbG9iYWxcbiAgICAgKiBAcHJvcGVydHkge1N0cmluZ30gcGFydCBCb2R5IHBhcnQgbnVtYmVyLiBUaGlzIHZhbHVlIGNhbiBiZSB1c2VkIHRvIGxhdGVyIGZldGNoIHRoZSBjb250ZW50cyBvZiB0aGlzIHBhcnQgb2YgdGhlIG1lc3NhZ2VcbiAgICAgKiBAcHJvcGVydHkge1N0cmluZ30gdHlwZSBDb250ZW50LVR5cGUgb2YgdGhpcyBub2RlXG4gICAgICogQHByb3BlcnR5IHtPYmplY3R9IFtwYXJhbWV0ZXJzXSBBZGRpdGlvbmFsIHBhcmFtZXRlcnMgZm9yIENvbnRlbnQtVHlwZSwgZWcgXCJjaGFyc2V0XCJcbiAgICAgKiBAcHJvcGVydHkge1N0cmluZ30gW2lkXSBDb250ZW50LUlEXG4gICAgICogQHByb3BlcnR5IHtTdHJpbmd9IFtlbmNvZGluZ10gVHJhbnNmZXIgZW5jb2RpbmdcbiAgICAgKiBAcHJvcGVydHkge051bWJlcn0gW3NpemVdIEV4cGVjdGVkIHNpemUgb2YgdGhlIG5vZGVcbiAgICAgKiBAcHJvcGVydHkge01lc3NhZ2VFbnZlbG9wZU9iamVjdH0gW2VudmVsb3BlXSBtZXNzYWdlIGVudmVsb3BlIG9mIGVtYmVkZGVkIFJGQzgyMiBtZXNzYWdlXG4gICAgICogQHByb3BlcnR5IHtTdHJpbmd9IFtkaXNwb3NpdGlvbl0gQ29udGVudCBkaXNwb3NpdGlvblxuICAgICAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBbZGlzcG9zaXRpb25QYXJhbWV0ZXJzXSBBZGRpdGlvbmFsIHBhcmFtZXRlcnMgZm9yIENvbnRlbnQtRGlzcG9zaXRpb25cbiAgICAgKiBAcHJvcGVydHkge01lc3NhZ2VTdHJ1Y3R1cmVPYmplY3RbXX0gY2hpbGROb2RlcyBBbiBhcnJheSBvZiBjaGlsZCBub2RlcyBpZiB0aGlzIGlzIGEgbXVsdGlwYXJ0IG5vZGUuIE5vdCBwcmVzZW50IGZvciBub3JtYWwgbm9kZXNcbiAgICAgKi9cblxuICAgIC8qKlxuICAgICAqIEZldGNoZWQgbWVzc2FnZSBkYXRhXG4gICAgICpcbiAgICAgKiBAdHlwZWRlZiB7T2JqZWN0fSBGZXRjaE1lc3NhZ2VPYmplY3RcbiAgICAgKiBAZ2xvYmFsXG4gICAgICogQHByb3BlcnR5IHtOdW1iZXJ9IHNlcSBtZXNzYWdlIHNlcXVlbmNlIG51bWJlci4gQWx3YXlzIGluY2x1ZGVkIGluIHRoZSByZXNwb25zZVxuICAgICAqIEBwcm9wZXJ0eSB7TnVtYmVyfSB1aWQgbWVzc2FnZSBVSUQgbnVtYmVyLiBBbHdheXMgaW5jbHVkZWQgaW4gdGhlIHJlc3BvbnNlXG4gICAgICogQHByb3BlcnR5IHtCdWZmZXJ9IFtzb3VyY2VdIG1lc3NhZ2Ugc291cmNlIGZvciB0aGUgcmVxdWVzdGVkIGJ5dGUgcmFuZ2VcbiAgICAgKiBAcHJvcGVydHkge0JpZ0ludH0gW21vZHNlcV0gbWVzc2FnZSBNb2RzZXEgbnVtYmVyLiBBbHdheXMgaW5jbHVkZWQgaWYgdGhlIHNlcnZlciBzdXBwb3J0cyBDT05EU1RPUkUgZXh0ZW5zaW9uXG4gICAgICogQHByb3BlcnR5IHtTdHJpbmd9IFtlbWFpbElkXSB1bmlxdWUgZW1haWwgSUQuIEFsd2F5cyBpbmNsdWRlZCBpZiBzZXJ2ZXIgc3VwcG9ydHMgYE9CSkVDVElEYCBvciBgWC1HTS1FWFQtMWAgZXh0ZW5zaW9uc1xuICAgICAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBbdGhyZWFkaWRdIHVuaXF1ZSB0aHJlYWQgSUQuIE9ubHkgcHJlc2VudCBpZiBzZXJ2ZXIgc3VwcG9ydHMgYE9CSkVDVElEYCBvciBgWC1HTS1FWFQtMWAgZXh0ZW5zaW9uXG4gICAgICogQHByb3BlcnR5IHtTZXQ8c3RyaW5nPn0gW2xhYmVsc10gYSBTZXQgb2YgbGFiZWxzLiBPbmx5IHByZXNlbnQgaWYgc2VydmVyIHN1cHBvcnRzIGBYLUdNLUVYVC0xYCBleHRlbnNpb25cbiAgICAgKiBAcHJvcGVydHkge051bWJlcn0gW3NpemVdIG1lc3NhZ2Ugc2l6ZVxuICAgICAqIEBwcm9wZXJ0eSB7U2V0PHN0cmluZz59IFtmbGFnc10gYSBzZXQgb2YgbWVzc2FnZSBmbGFnc1xuICAgICAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBbZmxhZ0NvbG9yXSBmbGFnIGNvbG9yIGxpa2UgXCJyZWRcIiwgb3IgXCJ5ZWxsb3dcIi4gVGhpcyB2YWx1ZSBpcyBkZXJpdmVkIGZyb20gdGhlIGBmbGFnc2AgU2V0IGFuZCBpdCB1c2VzIHRoZSBzYW1lIGNvbG9yIHJ1bGVzIGFzIEFwcGxlIE1haWxcbiAgICAgKiBAcHJvcGVydHkge01lc3NhZ2VFbnZlbG9wZU9iamVjdH0gW2VudmVsb3BlXSBtZXNzYWdlIGVudmVsb3BlXG4gICAgICogQHByb3BlcnR5IHtNZXNzYWdlU3RydWN0dXJlT2JqZWN0fSBbYm9keVN0cnVjdHVyZV0gbWVzc2FnZSBib2R5IHN0cnVjdHVyZVxuICAgICAqIEBwcm9wZXJ0eSB7RGF0ZX0gW2ludGVybmFsRGF0ZV0gbWVzc2FnZSBpbnRlcm5hbCBkYXRlXG4gICAgICogQHByb3BlcnR5IHtNYXA8c3RyaW5nLCBCdWZmZXI+fSBbYm9keVBhcnRzXSBhIE1hcCBvZiBtZXNzYWdlIGJvZHkgcGFydHMgd2hlcmUga2V5IGlzIHJlcXVlc3RlZCBwYXJ0IGlkZW50aWZpZXIgYW5kIHZhbHVlIGlzIGEgQnVmZmVyXG4gICAgICogQHByb3BlcnR5IHtCdWZmZXJ9IFtoZWFkZXJzXSBSZXF1ZXN0ZWQgaGVhZGVyIGxpbmVzIGFzIEJ1ZmZlclxuICAgICAqL1xuXG4gICAgLyoqXG4gICAgICogRmV0Y2ggbWVzc2FnZXMgZnJvbSB0aGUgY3VycmVudGx5IG9wZW5lZCBtYWlsYm94XG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1NlcXVlbmNlU3RyaW5nIHwgTnVtYmVyW10gfCBTZWFyY2hPYmplY3R9IHJhbmdlIFJhbmdlIG9mIG1lc3NhZ2VzIHRvIGZldGNoXG4gICAgICogQHBhcmFtIHtGZXRjaFF1ZXJ5T2JqZWN0fSBxdWVyeSBGZXRjaCBxdWVyeVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc11cbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLnVpZF0gSWYgYHRydWVgIHRoZW4gdXNlcyBVSUQgbnVtYmVycyBpbnN0ZWFkIG9mIHNlcXVlbmNlIG51bWJlcnMgZm9yIGByYW5nZWBcbiAgICAgKiBAcGFyYW0ge0JpZ0ludH0gW29wdGlvbnMuY2hhbmdlZFNpbmNlXSBJZiBzZXQgdGhlbiBvbmx5IG1lc3NhZ2VzIHdpdGggYSBoaWdoZXIgbW9kc2VxIHZhbHVlIGFyZSByZXR1cm5lZC4gSWdub3JlZCBpZiBzZXJ2ZXIgZG9lcyBub3Qgc3VwcG9ydCBgQ09ORFNUT1JFYCBleHRlbnNpb24uXG4gICAgICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5iaW5hcnk9ZmFsc2VdIElmIGB0cnVlYCB0aGVuIHJlcXVlc3RzIGEgYmluYXJ5IHJlc3BvbnNlIGlmIHRoZSBzZXJ2ZXIgc3VwcG9ydHMgdGhpc1xuICAgICAqIEB5aWVsZHMge1Byb21pc2U8RmV0Y2hNZXNzYWdlT2JqZWN0Pn0gTWVzc2FnZSBkYXRhIG9iamVjdFxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBsZXQgbWFpbGJveCA9IGF3YWl0IGNsaWVudC5tYWlsYm94T3BlbignSU5CT1gnKTtcbiAgICAgKiAvLyBmZXRjaCBVSUQgZm9yIGFsbCBtZXNzYWdlcyBpbiBhIG1haWxib3hcbiAgICAgKiBmb3IgYXdhaXQgKGxldCBtc2cgb2YgY2xpZW50LmZldGNoKCcxOionLCB7dWlkOiB0cnVlfSkpe1xuICAgICAqICAgICBjb25zb2xlLmxvZyhtc2cudWlkKTtcbiAgICAgKiAgICAgLy8gTkIhIFlvdSBjYW4gbm90IHJ1biBhbnkgSU1BUCBjb21tYW5kcyBpbiB0aGlzIGxvb3BcbiAgICAgKiAgICAgLy8gb3RoZXJ3aXNlIHlvdSB3aWxsIGVuZCB1cCBpbiBhIGRlYWRsb29wXG4gICAgICogfVxuICAgICAqL1xuICAgIGFzeW5jICpmZXRjaChyYW5nZSwgcXVlcnksIG9wdGlvbnMpIHtcbiAgICAgICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cbiAgICAgICAgaWYgKCF0aGlzLm1haWxib3gpIHtcbiAgICAgICAgICAgIC8vIG5vIG1haWxib3ggc2VsZWN0ZWQsIG5vdGhpbmcgdG8gZG9cbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHJhbmdlID0gYXdhaXQgdGhpcy5yZXNvbHZlUmFuZ2UocmFuZ2UsIG9wdGlvbnMpO1xuICAgICAgICBpZiAoIXJhbmdlKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgZmluaXNoZWQgPSBmYWxzZTtcbiAgICAgICAgbGV0IHB1c2ggPSBmYWxzZTtcbiAgICAgICAgbGV0IHJvd1F1ZXVlID0gW107XG5cbiAgICAgICAgbGV0IGdldE5leHQgPSAoKSA9PlxuICAgICAgICAgICAgbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgICAgIGxldCBjaGVjayA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJvd1F1ZXVlLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGVudHJ5ID0gcm93UXVldWUuc2hpZnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbnRyeS5lcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVqZWN0KGVudHJ5LmVycik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXNvbHZlKGVudHJ5LnZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGlmIChmaW5pc2hlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc29sdmUobnVsbCk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAvLyB3YWl0IHVudGlsIGRhdGEgaXMgcHVzaGVkIHRvIHF1ZXVlIGFuZCB0cnkgYWdhaW5cbiAgICAgICAgICAgICAgICAgICAgcHVzaCA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHB1c2ggPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrKCk7XG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBjaGVjaygpO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5ydW4oJ0ZFVENIJywgcmFuZ2UsIHF1ZXJ5LCB7XG4gICAgICAgICAgICB1aWQ6ICEhb3B0aW9ucy51aWQsXG4gICAgICAgICAgICBiaW5hcnk6IG9wdGlvbnMuYmluYXJ5LFxuICAgICAgICAgICAgY2hhbmdlZFNpbmNlOiBvcHRpb25zLmNoYW5nZWRTaW5jZSxcbiAgICAgICAgICAgIG9uVW50YWdnZWRGZXRjaDogKHVudGFnZ2VkLCBuZXh0KSA9PiB7XG4gICAgICAgICAgICAgICAgcm93UXVldWUucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZTogdW50YWdnZWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBuZXh0XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHB1c2ggPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgcHVzaCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgICAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICBmaW5pc2hlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBwdXNoID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgIHB1c2goKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLmNhdGNoKGVyciA9PiB7XG4gICAgICAgICAgICAgICAgcm93UXVldWUucHVzaCh7IGVyciB9KTtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHB1c2ggPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgcHVzaCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgIGxldCByZXM7XG4gICAgICAgIHdoaWxlICgocmVzID0gYXdhaXQgZ2V0TmV4dCgpKSkge1xuICAgICAgICAgICAgaWYgKHRoaXMuaXNDbG9zZWQgfHwgdGhpcy5zb2NrZXQuZGVzdHJveWVkKSB7XG4gICAgICAgICAgICAgICAgbGV0IGVycm9yID0gbmV3IEVycm9yKCdDb25uZWN0aW9uIGNsb3NlZCcpO1xuICAgICAgICAgICAgICAgIGVycm9yLmNvZGUgPSAnRUNvbm5lY3Rpb25DbG9zZWQnO1xuICAgICAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAocmVzICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgeWllbGQgcmVzLnJlc3BvbnNlO1xuICAgICAgICAgICAgICAgIHJlcy5uZXh0KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWZpbmlzaGVkKSB7XG4gICAgICAgICAgICAvLyBGRVRDSCBuZXZlciBmaW5pc2hlZCFcbiAgICAgICAgICAgIGxldCBlcnJvciA9IG5ldyBFcnJvcignRkVUQ0ggZGlkIG5vdCBmaW5pc2gnKTtcbiAgICAgICAgICAgIGVycm9yLmNvZGUgPSAnRU5vdEZpbmlzaGVkJztcbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRmV0Y2ggbWVzc2FnZXMgZnJvbSB0aGUgY3VycmVudGx5IG9wZW5lZCBtYWlsYm94LlxuICAgICAqXG4gICAgICogVGhpcyBtZXRob2Qgd2lsbCBmZXRjaCBhbGwgbWVzc2FnZXMgYmVmb3JlIHJlc29sdmluZyB0aGUgcHJvbWlzZSwgdW5saWtlIC5mZXRjaCgpLCB3aGljaFxuICAgICAqIGlzIGFuIGFzeW5jIGdlbmVyYXRvci4gRG8gbm90IHVzZSBsYXJnZSByYW5nZXMgbGlrZSAxOiosIGFzIHRoaXMgbWlnaHQgZXhoYXVzdCBhbGwgYXZhaWxhYmxlXG4gICAgICogbWVtb3J5IGlmIHRoZSBtYWlsYm94IGNvbnRhaW5zIGEgbGFyZ2UgbnVtYmVyIG9mIGVtYWlscy5cbiAgICAgKiBAcGFyYW0ge1NlcXVlbmNlU3RyaW5nIHwgTnVtYmVyW10gfCBTZWFyY2hPYmplY3R9IHJhbmdlIFJhbmdlIG9mIG1lc3NhZ2VzIHRvIGZldGNoXG4gICAgICogQHBhcmFtIHtGZXRjaFF1ZXJ5T2JqZWN0fSBxdWVyeSBGZXRjaCBxdWVyeVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc11cbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLnVpZF0gSWYgYHRydWVgIHRoZW4gdXNlcyBVSUQgbnVtYmVycyBpbnN0ZWFkIG9mIHNlcXVlbmNlIG51bWJlcnMgZm9yIGByYW5nZWBcbiAgICAgKiBAcGFyYW0ge0JpZ0ludH0gW29wdGlvbnMuY2hhbmdlZFNpbmNlXSBJZiBzZXQgdGhlbiBvbmx5IG1lc3NhZ2VzIHdpdGggYSBoaWdoZXIgbW9kc2VxIHZhbHVlIGFyZSByZXR1cm5lZC4gSWdub3JlZCBpZiBzZXJ2ZXIgZG9lcyBub3Qgc3VwcG9ydCBgQ09ORFNUT1JFYCBleHRlbnNpb24uXG4gICAgICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5iaW5hcnk9ZmFsc2VdIElmIGB0cnVlYCB0aGVuIHJlcXVlc3RzIGEgYmluYXJ5IHJlc3BvbnNlIGlmIHRoZSBzZXJ2ZXIgc3VwcG9ydHMgdGhpc1xuICAgICAqIEByZXR1cm5zIHtQcm9taXNlPEZldGNoTWVzc2FnZU9iamVjdFtdPn0gQXJyYXkgb2YgTWVzc2FnZSBkYXRhIG9iamVjdFxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBsZXQgbWFpbGJveCA9IGF3YWl0IGNsaWVudC5tYWlsYm94T3BlbignSU5CT1gnKTtcbiAgICAgKiAvLyBmZXRjaCBVSUQgZm9yIGFsbCBtZXNzYWdlcyBpbiBhIG1haWxib3hcbiAgICAgKiBjb25zdCBtZXNzYWdlcyA9IGF3YWl0IGNsaWVudC5mZXRjaEFsbCgnMToqJywge3VpZDogdHJ1ZX0pO1xuICAgICAqIGZvciAobGV0IG1zZyBvZiBtZXNzYWdlcyl7XG4gICAgICogICAgIGNvbnNvbGUubG9nKG1zZy51aWQpO1xuICAgICAqIH1cbiAgICAgKi9cbiAgICBhc3luYyBmZXRjaEFsbChyYW5nZSwgcXVlcnksIG9wdGlvbnMpIHtcbiAgICAgICAgY29uc3QgcmVzdWx0cyA9IFtdO1xuICAgICAgICBjb25zdCBnZW5lcmF0b3IgPSB0aGlzLmZldGNoKHJhbmdlLCBxdWVyeSwgb3B0aW9ucyk7XG4gICAgICAgIGZvciBhd2FpdCAoY29uc3QgbWVzc2FnZSBvZiBnZW5lcmF0b3IpIHtcbiAgICAgICAgICAgIHJlc3VsdHMucHVzaChtZXNzYWdlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0cztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGZXRjaCBhIHNpbmdsZSBtZXNzYWdlIGZyb20gdGhlIGN1cnJlbnRseSBvcGVuZWQgbWFpbGJveFxuICAgICAqXG4gICAgICogQHBhcmFtIHtTZXF1ZW5jZVN0cmluZ30gc2VxIFNpbmdsZSBVSUQgb3Igc2VxdWVuY2UgbnVtYmVyIG9mIHRoZSBtZXNzYWdlIHRvIGZldGNoIGZvclxuICAgICAqIEBwYXJhbSB7RmV0Y2hRdWVyeU9iamVjdH0gcXVlcnkgRmV0Y2ggcXVlcnlcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdXG4gICAgICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy51aWRdIElmIGB0cnVlYCB0aGVuIHVzZXMgVUlEIG51bWJlciBpbnN0ZWFkIG9mIHNlcXVlbmNlIG51bWJlciBmb3IgYHNlcWBcbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLmJpbmFyeT1mYWxzZV0gSWYgYHRydWVgIHRoZW4gcmVxdWVzdHMgYSBiaW5hcnkgcmVzcG9uc2UgaWYgdGhlIHNlcnZlciBzdXBwb3J0cyB0aGlzXG4gICAgICogQHJldHVybnMge1Byb21pc2U8RmV0Y2hNZXNzYWdlT2JqZWN0Pn0gTWVzc2FnZSBkYXRhIG9iamVjdFxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBsZXQgbWFpbGJveCA9IGF3YWl0IGNsaWVudC5tYWlsYm94T3BlbignSU5CT1gnKTtcbiAgICAgKiAvLyBmZXRjaCBVSUQgZm9yIHRoZSBsYXN0IGVtYWlsIGluIHRoZSBzZWxlY3RlZCBtYWlsYm94XG4gICAgICogbGV0IGxhc3RNc2cgPSBhd2FpdCBjbGllbnQuZmV0Y2hPbmUoJyonLCB7dWlkOiB0cnVlfSlcbiAgICAgKiBjb25zb2xlLmxvZyhsYXN0TXNnLnVpZCk7XG4gICAgICovXG4gICAgYXN5bmMgZmV0Y2hPbmUoc2VxLCBxdWVyeSwgb3B0aW9ucykge1xuICAgICAgICBpZiAoIXRoaXMubWFpbGJveCkge1xuICAgICAgICAgICAgLy8gbm8gbWFpbGJveCBzZWxlY3RlZCwgbm90aGluZyB0byBkb1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHNlcSA9PT0gJyonKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMubWFpbGJveC5leGlzdHMpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzZXEgPSB0aGlzLm1haWxib3guZXhpc3RzLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICBvcHRpb25zID0gT2JqZWN0LmFzc2lnbih7fSwgb3B0aW9ucyB8fCB7fSwgeyB1aWQ6IGZhbHNlIH0pOyAvLyBmb3JjZSBpbnRvIGEgc2VxdWVuY2UgcXVlcnlcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCByZXNwb25zZSA9IGF3YWl0IHRoaXMucnVuKCdGRVRDSCcsIChzZXEgfHwgJycpLnRvU3RyaW5nKCksIHF1ZXJ5LCBvcHRpb25zKTtcblxuICAgICAgICBpZiAoIXJlc3BvbnNlIHx8ICFyZXNwb25zZS5saXN0IHx8ICFyZXNwb25zZS5saXN0Lmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlc3BvbnNlLmxpc3RbMF07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHR5cGVkZWYge09iamVjdH0gRG93bmxvYWRPYmplY3RcbiAgICAgKiBAZ2xvYmFsXG4gICAgICogQHByb3BlcnR5IHtPYmplY3R9IG1ldGEgY29udGVudCBtZXRhZGF0YVxuICAgICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBtZXRhLmV4cGVjdGVkU2l6ZSBUaGUgZmV0Y2ggcmVzcG9uc2Ugc2l6ZVxuICAgICAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBtZXRhLmNvbnRlbnRUeXBlIENvbnRlbnQtVHlwZSBvZiB0aGUgc3RyZWFtZWQgZmlsZS4gSWYgcGFydCB3YXMgbm90IHNldCB0aGVuIHRoaXMgdmFsdWUgaXMgXCJtZXNzYWdlL3JmYzgyMlwiXG4gICAgICogQHByb3BlcnR5IHtTdHJpbmd9IFttZXRhLmNoYXJzZXRdIENoYXJzZXQgb2YgdGhlIGJvZHkgcGFydC4gVGV4dCBwYXJ0cyBhcmUgYXV0b21hdGljYWxseSBjb252ZXJ0ZWQgdG8gVVRGLTgsIGF0dGFjaG1lbnRzIGFyZSBrZXB0IGFzIGlzXG4gICAgICogQHByb3BlcnR5IHtTdHJpbmd9IFttZXRhLmRpc3Bvc2l0aW9uXSBDb250ZW50LURpc3Bvc2l0aW9uIG9mIHRoZSBzdHJlYW1lZCBmaWxlXG4gICAgICogQHByb3BlcnR5IHtTdHJpbmd9IFttZXRhLmZpbGVuYW1lXSBGaWxlbmFtZSBvZiB0aGUgc3RyZWFtZWQgYm9keSBwYXJ0XG4gICAgICogQHByb3BlcnR5IHtSZWFkYWJsZVN0cmVhbX0gY29udGVudCBTdHJlYW1lZCBjb250ZW50XG4gICAgICovXG5cbiAgICAvKipcbiAgICAgKiBEb3dubG9hZCBlaXRoZXIgZnVsbCByZmM4MjIgZm9ybWF0dGVkIG1lc3NhZ2Ugb3IgYSBzcGVjaWZpYyBib2R5c3RydWN0dXJlIHBhcnQgYXMgYSBTdHJlYW0uXG4gICAgICogQm9keXN0cnVjdHVyZSBwYXJ0cyBhcmUgZGVjb2RlZCBzbyB0aGUgcmVzdWx0aW5nIHN0cmVhbSBpcyBhIGJpbmFyeSBmaWxlLiBUZXh0IGNvbnRlbnRcbiAgICAgKiBpcyBhdXRvbWF0aWNhbGx5IGNvbnZlcnRlZCB0byBVVEYtOCBjaGFyc2V0LlxuICAgICAqXG4gICAgICogQHBhcmFtIHtTZXF1ZW5jZVN0cmluZ30gcmFuZ2UgVUlEIG9yIHNlcXVlbmNlIG51bWJlciBmb3IgdGhlIG1lc3NhZ2UgdG8gZmV0Y2hcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gW3BhcnRdIElmIG5vdCBzZXQgdGhlbiBkb3dubG9hZHMgZW50aXJlIHJmYzgyMiBmb3JtYXR0ZWQgbWVzc2FnZSwgb3RoZXJ3aXNlIGRvd25sb2FkcyBzcGVjaWZpYyBib2R5c3RydWN0dXJlIHBhcnRcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdXG4gICAgICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy51aWRdIElmIGB0cnVlYCB0aGVuIHVzZXMgVUlEIG51bWJlciBpbnN0ZWFkIG9mIHNlcXVlbmNlIG51bWJlciBmb3IgYHJhbmdlYFxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0aW9ucy5tYXhCeXRlc10gSWYgc2V0IHRoZW4gbGltaXRzIGRvd25sb2FkIHNpemUgdG8gc3BlY2lmaWVkIGJ5dGVzXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtvcHRpb25zLmNodW5rU2l6ZT02NTUzNl0gSG93IGxhcmdlIGNvbnRlbnQgcGFydHMgdG8gYXNrIGZyb20gdGhlIHNlcnZlclxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlPERvd25sb2FkT2JqZWN0Pn0gRG93bmxvYWQgZGF0YSBvYmplY3RcbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogbGV0IG1haWxib3ggPSBhd2FpdCBjbGllbnQubWFpbGJveE9wZW4oJ0lOQk9YJyk7XG4gICAgICogLy8gZG93bmxvYWQgYm9keSBwYXJ0IG5yICcxLjInIGZyb20gbGF0ZXN0IG1lc3NhZ2VcbiAgICAgKiBsZXQge21ldGEsIGNvbnRlbnR9ID0gYXdhaXQgY2xpZW50LmRvd25sb2FkKCcqJywgJzEuMicpO1xuICAgICAqIGNvbnRlbnQucGlwZShmcy5jcmVhdGVXcml0ZVN0cmVhbShtZXRhLmZpbGVuYW1lKSk7XG4gICAgICovXG4gICAgYXN5bmMgZG93bmxvYWQocmFuZ2UsIHBhcnQsIG9wdGlvbnMpIHtcbiAgICAgICAgaWYgKCF0aGlzLm1haWxib3gpIHtcbiAgICAgICAgICAgIC8vIG5vIG1haWxib3ggc2VsZWN0ZWQsIG5vdGhpbmcgdG8gZG9cbiAgICAgICAgICAgIHJldHVybiB7fTtcbiAgICAgICAgfVxuXG4gICAgICAgIG9wdGlvbnMgPSBPYmplY3QuYXNzaWduKFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGNodW5rU2l6ZTogNjQgKiAxMDI0LFxuICAgICAgICAgICAgICAgIG1heEJ5dGVzOiBJbmZpbml0eVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG9wdGlvbnMgfHwge31cbiAgICAgICAgKTtcblxuICAgICAgICBsZXQgaGFzTW9yZSA9IHRydWU7XG4gICAgICAgIGxldCBwcm9jZXNzZWQgPSAwO1xuXG4gICAgICAgIGxldCBjaHVua1NpemUgPSBOdW1iZXIob3B0aW9ucy5jaHVua1NpemUpIHx8IDY0ICogMTAyNDtcbiAgICAgICAgbGV0IG1heEJ5dGVzID0gTnVtYmVyKG9wdGlvbnMubWF4Qnl0ZXMpIHx8IEluZmluaXR5O1xuXG4gICAgICAgIGxldCB1aWQgPSBmYWxzZTtcblxuICAgICAgICBpZiAocGFydCA9PT0gJzEnKSB7XG4gICAgICAgICAgICAvLyBGaXJzdCBwYXJ0IGhhcyBzcGVjaWFsIGNvbmRpdGlvbnMgZm9yIHNpbmdsZSBub2RlIGVtYWlscyBhc1xuICAgICAgICAgICAgLy8gdGhlIG1pbWUgcGFydHMgZm9yIHJvb3Qgbm9kZSBhcmUgbm90IDEgYW5kIDEuTUlNRSBidXQgVEVYVCBhbmQgSEVBREVSU1xuICAgICAgICAgICAgbGV0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5mZXRjaE9uZShyYW5nZSwgeyB1aWQ6IHRydWUsIGJvZHlTdHJ1Y3R1cmU6IHRydWUgfSwgb3B0aW9ucyk7XG5cbiAgICAgICAgICAgIGlmICghcmVzcG9uc2UpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4geyByZXNwb25zZTogZmFsc2UsIGNodW5rOiBmYWxzZSB9O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoIXVpZCAmJiByZXNwb25zZS51aWQpIHtcbiAgICAgICAgICAgICAgICB1aWQgPSByZXNwb25zZS51aWQ7XG4gICAgICAgICAgICAgICAgLy8gZm9yY2UgVUlEIGZyb20gbm93IG9uIGV2ZW4gaWYgZmlyc3QgcmFuZ2Ugd2FzIGEgc2VxdWVuY2UgbnVtYmVyXG4gICAgICAgICAgICAgICAgcmFuZ2UgPSB1aWQ7XG4gICAgICAgICAgICAgICAgb3B0aW9ucy51aWQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoIXJlc3BvbnNlLmJvZHlTdHJ1Y3R1cmUuY2hpbGROb2Rlcykge1xuICAgICAgICAgICAgICAgIC8vIHNpbmdsZSB0ZXh0IG1lc3NhZ2VcbiAgICAgICAgICAgICAgICBwYXJ0ID0gJ1RFWFQnO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGdldE5leHRQYXJ0ID0gYXN5bmMgcXVlcnkgPT4ge1xuICAgICAgICAgICAgcXVlcnkgPSBxdWVyeSB8fCB7fTtcblxuICAgICAgICAgICAgbGV0IG1pbWVLZXk7XG5cbiAgICAgICAgICAgIGlmICghcGFydCkge1xuICAgICAgICAgICAgICAgIHF1ZXJ5LnNvdXJjZSA9IHtcbiAgICAgICAgICAgICAgICAgICAgc3RhcnQ6IHByb2Nlc3NlZCxcbiAgICAgICAgICAgICAgICAgICAgbWF4TGVuZ3RoOiBjaHVua1NpemVcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBwYXJ0ID0gcGFydC50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkudHJpbSgpO1xuXG4gICAgICAgICAgICAgICAgaWYgKCFxdWVyeS5ib2R5UGFydHMpIHtcbiAgICAgICAgICAgICAgICAgICAgcXVlcnkuYm9keVBhcnRzID0gW107XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKHF1ZXJ5LnNpemUpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKC9eW1xcZC5dKyQvLnRlc3QocGFydCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZldGNoIG1ldGEgYXMgd2VsbFxuICAgICAgICAgICAgICAgICAgICAgICAgbWltZUtleSA9IHBhcnQgKyAnLm1pbWUnO1xuICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnkuYm9keVBhcnRzLnB1c2gobWltZUtleSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocGFydCA9PT0gJ3RleHQnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtaW1lS2V5ID0gJ2hlYWRlcic7XG4gICAgICAgICAgICAgICAgICAgICAgICBxdWVyeS5ib2R5UGFydHMucHVzaChtaW1lS2V5KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHF1ZXJ5LmJvZHlQYXJ0cy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAga2V5OiBwYXJ0LFxuICAgICAgICAgICAgICAgICAgICBzdGFydDogcHJvY2Vzc2VkLFxuICAgICAgICAgICAgICAgICAgICBtYXhMZW5ndGg6IGNodW5rU2l6ZVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsZXQgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmZldGNoT25lKHJhbmdlLCBxdWVyeSwgb3B0aW9ucyk7XG5cbiAgICAgICAgICAgIGlmICghcmVzcG9uc2UpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4geyByZXNwb25zZTogZmFsc2UsIGNodW5rOiBmYWxzZSB9O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoIXVpZCAmJiByZXNwb25zZS51aWQpIHtcbiAgICAgICAgICAgICAgICB1aWQgPSByZXNwb25zZS51aWQ7XG4gICAgICAgICAgICAgICAgLy8gZm9yY2UgVUlEIGZyb20gbm93IG9uIGV2ZW4gaWYgZmlyc3QgcmFuZ2Ugd2FzIGEgc2VxdWVuY2UgbnVtYmVyXG4gICAgICAgICAgICAgICAgcmFuZ2UgPSB1aWQ7XG4gICAgICAgICAgICAgICAgb3B0aW9ucy51aWQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsZXQgY2h1bmsgPSAhcGFydCA/IHJlc3BvbnNlLnNvdXJjZSA6IHJlc3BvbnNlLmJvZHlQYXJ0cyAmJiByZXNwb25zZS5ib2R5UGFydHMuZ2V0KHBhcnQpO1xuICAgICAgICAgICAgaWYgKCFjaHVuaykge1xuICAgICAgICAgICAgICAgIHJldHVybiB7fTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcHJvY2Vzc2VkICs9IGNodW5rLmxlbmd0aDtcbiAgICAgICAgICAgIGhhc01vcmUgPSBjaHVuay5sZW5ndGggPj0gY2h1bmtTaXplO1xuXG4gICAgICAgICAgICBsZXQgcmVzdWx0ID0geyBjaHVuayB9O1xuICAgICAgICAgICAgaWYgKHF1ZXJ5LnNpemUpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQucmVzcG9uc2UgPSByZXNwb25zZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHF1ZXJ5LmJvZHlQYXJ0cykge1xuICAgICAgICAgICAgICAgIGlmIChtaW1lS2V5ID09PSAnaGVhZGVyJykge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQubWltZSA9IHJlc3BvbnNlLmhlYWRlcnM7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0Lm1pbWUgPSByZXNwb25zZS5ib2R5UGFydHMuZ2V0KG1pbWVLZXkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfTtcblxuICAgICAgICBsZXQgeyByZXNwb25zZSwgY2h1bmssIG1pbWUgfSA9IGF3YWl0IGdldE5leHRQYXJ0KHtcbiAgICAgICAgICAgIHNpemU6IHRydWUsXG4gICAgICAgICAgICB1aWQ6IHRydWVcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKCFyZXNwb25zZSB8fCAhY2h1bmspIHtcbiAgICAgICAgICAgIC8vID8/P1xuICAgICAgICAgICAgcmV0dXJuIHt9O1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IG1ldGEgPSB7XG4gICAgICAgICAgICBleHBlY3RlZFNpemU6IHJlc3BvbnNlLnNpemVcbiAgICAgICAgfTtcblxuICAgICAgICBpZiAoIXBhcnQpIHtcbiAgICAgICAgICAgIG1ldGEuY29udGVudFR5cGUgPSAnbWVzc2FnZS9yZmM4MjInO1xuICAgICAgICB9IGVsc2UgaWYgKG1pbWUpIHtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzID0gbmV3IEhlYWRlcnMobWltZSk7XG4gICAgICAgICAgICBsZXQgY29udGVudFR5cGUgPSBsaWJtaW1lLnBhcnNlSGVhZGVyVmFsdWUoaGVhZGVycy5nZXRGaXJzdCgnQ29udGVudC1UeXBlJykpO1xuICAgICAgICAgICAgbGV0IHRyYW5zZmVyRW5jb2RpbmcgPSBsaWJtaW1lLnBhcnNlSGVhZGVyVmFsdWUoaGVhZGVycy5nZXRGaXJzdCgnQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZycpKTtcbiAgICAgICAgICAgIGxldCBkaXNwb3NpdGlvbiA9IGxpYm1pbWUucGFyc2VIZWFkZXJWYWx1ZShoZWFkZXJzLmdldEZpcnN0KCdDb250ZW50LURpc3Bvc2l0aW9uJykpO1xuXG4gICAgICAgICAgICBpZiAoY29udGVudFR5cGUudmFsdWUudG9Mb3dlckNhc2UoKS50cmltKCkpIHtcbiAgICAgICAgICAgICAgICBtZXRhLmNvbnRlbnRUeXBlID0gY29udGVudFR5cGUudmFsdWUudG9Mb3dlckNhc2UoKS50cmltKCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChjb250ZW50VHlwZS5wYXJhbXMuY2hhcnNldCkge1xuICAgICAgICAgICAgICAgIG1ldGEuY2hhcnNldCA9IGNvbnRlbnRUeXBlLnBhcmFtcy5jaGFyc2V0LnRvTG93ZXJDYXNlKCkudHJpbSgpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodHJhbnNmZXJFbmNvZGluZy52YWx1ZSkge1xuICAgICAgICAgICAgICAgIG1ldGEuZW5jb2RpbmcgPSB0cmFuc2ZlckVuY29kaW5nLnZhbHVlXG4gICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKC9cXCguKlxcKS9nLCAnJylcbiAgICAgICAgICAgICAgICAgICAgLnRvTG93ZXJDYXNlKClcbiAgICAgICAgICAgICAgICAgICAgLnRyaW0oKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGRpc3Bvc2l0aW9uLnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgbWV0YS5kaXNwb3NpdGlvbiA9IGRpc3Bvc2l0aW9uLnZhbHVlLnRvTG93ZXJDYXNlKCkudHJpbSgpIHx8IGZhbHNlO1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIG1ldGEuZGlzcG9zaXRpb24gPSBsaWJtaW1lLmRlY29kZVdvcmRzKG1ldGEuZGlzcG9zaXRpb24pO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgICAgICAvLyBmYWlsZWQgdG8gcGFyc2UgZGlzcG9zaXRpb24sIGtlZXAgYXMgaXMgKG1vc3QgcHJvYmFibHkgYW4gdW5rbm93biBjaGFyc2V0IGlzIHVzZWQpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoY29udGVudFR5cGUucGFyYW1zLmZvcm1hdCAmJiBjb250ZW50VHlwZS5wYXJhbXMuZm9ybWF0LnRvTG93ZXJDYXNlKCkudHJpbSgpID09PSAnZmxvd2VkJykge1xuICAgICAgICAgICAgICAgIG1ldGEuZmxvd2VkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBpZiAoY29udGVudFR5cGUucGFyYW1zLmRlbHNwICYmIGNvbnRlbnRUeXBlLnBhcmFtcy5kZWxzcC50b0xvd2VyQ2FzZSgpLnRyaW0oKSA9PT0gJ3llcycpIHtcbiAgICAgICAgICAgICAgICAgICAgbWV0YS5kZWxTcCA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsZXQgZmlsZW5hbWUgPSBkaXNwb3NpdGlvbi5wYXJhbXMuZmlsZW5hbWUgfHwgY29udGVudFR5cGUucGFyYW1zLm5hbWUgfHwgZmFsc2U7XG4gICAgICAgICAgICBpZiAoZmlsZW5hbWUpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZSA9IGxpYm1pbWUuZGVjb2RlV29yZHMoZmlsZW5hbWUpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgICAgICAvLyBmYWlsZWQgdG8gcGFyc2UgZmlsZW5hbWUsIGtlZXAgYXMgaXMgKG1vc3QgcHJvYmFibHkgYW4gdW5rbm93biBjaGFyc2V0IGlzIHVzZWQpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIG1ldGEuZmlsZW5hbWUgPSBmaWxlbmFtZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBzdHJlYW07XG4gICAgICAgIGxldCBvdXRwdXQ7XG5cbiAgICAgICAgc3dpdGNoIChtZXRhLmVuY29kaW5nKSB7XG4gICAgICAgICAgICBjYXNlICdiYXNlNjQnOlxuICAgICAgICAgICAgICAgIG91dHB1dCA9IHN0cmVhbSA9IG5ldyBsaWJiYXNlNjQuRGVjb2RlcigpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAncXVvdGVkLXByaW50YWJsZSc6XG4gICAgICAgICAgICAgICAgb3V0cHV0ID0gc3RyZWFtID0gbmV3IGxpYnFwLkRlY29kZXIoKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgb3V0cHV0ID0gc3RyZWFtID0gbmV3IFBhc3NUaHJvdWdoKCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgaXNUZXh0Tm9kZSA9IFsndGV4dC9odG1sJywgJ3RleHQvcGxhaW4nLCAndGV4dC94LWFtcC1odG1sJ10uaW5jbHVkZXMobWV0YS5jb250ZW50VHlwZSkgfHwgKHBhcnQgPT09ICcxJyAmJiAhbWV0YS5jb250ZW50VHlwZSk7XG4gICAgICAgIGlmICgoIW1ldGEuZGlzcG9zaXRpb24gfHwgbWV0YS5kaXNwb3NpdGlvbiA9PT0gJ2lubGluZScpICYmIGlzVGV4dE5vZGUpIHtcbiAgICAgICAgICAgIC8vIGZsb3dlZCB0ZXh0XG4gICAgICAgICAgICBpZiAobWV0YS5mbG93ZWQpIHtcbiAgICAgICAgICAgICAgICBsZXQgZmxvd0RlY29kZXIgPSBuZXcgRmxvd2VkRGVjb2Rlcih7XG4gICAgICAgICAgICAgICAgICAgIGRlbFNwOiBtZXRhLmRlbFNwXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgb3V0cHV0Lm9uKCdlcnJvcicsIGVyciA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGZsb3dEZWNvZGVyLmVtaXQoJ2Vycm9yJywgZXJyKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBvdXRwdXQgPSBvdXRwdXQucGlwZShmbG93RGVjb2Rlcik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIG5vdCB1dGYtOCB0ZXh0XG4gICAgICAgICAgICBpZiAobWV0YS5jaGFyc2V0ICYmICFbJ2FzY2lpJywgJ3VzYXNjaWknLCAndXRmOCddLmluY2x1ZGVzKG1ldGEuY2hhcnNldC50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoL1teYS16MC05XSsvZywgJycpKSkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBkZWNvZGVyID0gZ2V0RGVjb2RlcihtZXRhLmNoYXJzZXQpO1xuICAgICAgICAgICAgICAgICAgICBvdXRwdXQub24oJ2Vycm9yJywgZXJyID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZXIuZW1pdCgnZXJyb3InLCBlcnIpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgb3V0cHV0ID0gb3V0cHV0LnBpcGUoZGVjb2Rlcik7XG4gICAgICAgICAgICAgICAgICAgIC8vIGZvcmNlIHRvIHV0Zi04IGZvciBvdXRwdXRcbiAgICAgICAgICAgICAgICAgICAgbWV0YS5jaGFyc2V0ID0gJ3V0Zi04JztcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChFKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGRvIG5vdCBkZWNvZGUgY2hhcnNldFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsaW1pdGVyID0gbmV3IExpbWl0ZWRQYXNzdGhyb3VnaCh7IG1heEJ5dGVzIH0pO1xuICAgICAgICBvdXRwdXQub24oJ2Vycm9yJywgZXJyID0+IHtcbiAgICAgICAgICAgIGxpbWl0ZXIuZW1pdCgnZXJyb3InLCBlcnIpO1xuICAgICAgICB9KTtcbiAgICAgICAgb3V0cHV0ID0gb3V0cHV0LnBpcGUobGltaXRlcik7XG5cbiAgICAgICAgbGV0IHdyaXRlQ2h1bmsgPSBjaHVuayA9PiB7XG4gICAgICAgICAgICBpZiAobGltaXRlci5saW1pdGVkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gc3RyZWFtLndyaXRlKGNodW5rKTtcbiAgICAgICAgfTtcblxuICAgICAgICBsZXQgZmV0Y2hBbGxQYXJ0cyA9IGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIHdoaWxlIChoYXNNb3JlICYmICFsaW1pdGVyLmxpbWl0ZWQpIHtcbiAgICAgICAgICAgICAgICBsZXQgeyBjaHVuayB9ID0gYXdhaXQgZ2V0TmV4dFBhcnQoKTtcbiAgICAgICAgICAgICAgICBpZiAoIWNodW5rKSB7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmICh3cml0ZUNodW5rKGNodW5rKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgbmV3IFByb21pc2UocmVzb2x2ZSA9PiBzdHJlYW0ub25jZSgnZHJhaW4nLCByZXNvbHZlKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIHNldEltbWVkaWF0ZSgoKSA9PiB7XG4gICAgICAgICAgICB3cml0ZUNodW5rKGNodW5rKTtcbiAgICAgICAgICAgIGZldGNoQWxsUGFydHMoKVxuICAgICAgICAgICAgICAgIC5jYXRjaChlcnIgPT4gc3RyZWFtLmVtaXQoJ2Vycm9yJywgZXJyKSlcbiAgICAgICAgICAgICAgICAuZmluYWxseSgoKSA9PiBzdHJlYW0uZW5kKCkpO1xuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbWV0YSxcbiAgICAgICAgICAgIGNvbnRlbnQ6IG91dHB1dFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZldGNoIG11bHRpcGxlIGF0dGFjaG1lbnRzIGFzIEJ1ZmZlciB2YWx1ZXNcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7U2VxdWVuY2VTdHJpbmd9IHJhbmdlIFVJRCBvciBzZXF1ZW5jZSBudW1iZXIgZm9yIHRoZSBtZXNzYWdlIHRvIGZldGNoXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IHBhcnRzIEEgbGlzdCBvZiBib2R5c3RydWN0dXJlIHBhcnRzXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXVxuICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMudWlkXSBJZiBgdHJ1ZWAgdGhlbiB1c2VzIFVJRCBudW1iZXIgaW5zdGVhZCBvZiBzZXF1ZW5jZSBudW1iZXIgZm9yIGByYW5nZWBcbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTxPYmplY3Q+fSBEb3dubG9hZCBkYXRhIG9iamVjdFxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBsZXQgbWFpbGJveCA9IGF3YWl0IGNsaWVudC5tYWlsYm94T3BlbignSU5CT1gnKTtcbiAgICAgKiAvLyBkb3dubG9hZCBib2R5IHBhcnRzICcyJywgYW5kICczJyBmcm9tIGFsbCBtZXNzYWdlcyBpbiB0aGUgc2VsZWN0ZWQgbWFpbGJveFxuICAgICAqIGxldCByZXNwb25zZSA9IGF3YWl0IGNsaWVudC5kb3dubG9hZE1hbnkoJyonLCBbJzInLCAnMyddKTtcbiAgICAgKiBwcm9jZXNzLnN0ZG91dC53cml0ZShyZXNwb25zZVsyXS5jb250ZW50KVxuICAgICAqIHByb2Nlc3Muc3Rkb3V0LndyaXRlKHJlc3BvbnNlWzNdLmNvbnRlbnQpXG4gICAgICovXG4gICAgYXN5bmMgZG93bmxvYWRNYW55KHJhbmdlLCBwYXJ0cywgb3B0aW9ucykge1xuICAgICAgICBpZiAoIXRoaXMubWFpbGJveCkge1xuICAgICAgICAgICAgLy8gbm8gbWFpbGJveCBzZWxlY3RlZCwgbm90aGluZyB0byBkb1xuICAgICAgICAgICAgcmV0dXJuIHt9O1xuICAgICAgICB9XG5cbiAgICAgICAgb3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgY2h1bmtTaXplOiA2NCAqIDEwMjQsXG4gICAgICAgICAgICAgICAgbWF4Qnl0ZXM6IEluZmluaXR5XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgb3B0aW9ucyB8fCB7fVxuICAgICAgICApO1xuXG4gICAgICAgIGxldCBxdWVyeSA9IHsgYm9keVBhcnRzOiBbXSB9O1xuXG4gICAgICAgIGZvciAobGV0IHBhcnQgb2YgcGFydHMpIHtcbiAgICAgICAgICAgIHF1ZXJ5LmJvZHlQYXJ0cy5wdXNoKHBhcnQgKyAnLm1pbWUnKTtcbiAgICAgICAgICAgIHF1ZXJ5LmJvZHlQYXJ0cy5wdXNoKHBhcnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5mZXRjaE9uZShyYW5nZSwgcXVlcnksIG9wdGlvbnMpO1xuXG4gICAgICAgIGlmICghcmVzcG9uc2UgfHwgIXJlc3BvbnNlLmJvZHlQYXJ0cykge1xuICAgICAgICAgICAgcmV0dXJuIHsgcmVzcG9uc2U6IGZhbHNlIH07XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgZGF0YSA9IHt9O1xuXG4gICAgICAgIGZvciAobGV0IFtwYXJ0LCBjb250ZW50XSBvZiByZXNwb25zZS5ib2R5UGFydHMpIHtcbiAgICAgICAgICAgIGxldCBrZXlQYXJ0cyA9IHBhcnQuc3BsaXQoJy5taW1lJyk7XG4gICAgICAgICAgICBpZiAoa2V5UGFydHMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICAgICAgLy8gY29udGVudFxuICAgICAgICAgICAgICAgIGxldCBrZXkgPSBrZXlQYXJ0c1swXTtcbiAgICAgICAgICAgICAgICBpZiAoIWRhdGFba2V5XSkge1xuICAgICAgICAgICAgICAgICAgICBkYXRhW2tleV0gPSB7IGNvbnRlbnQgfTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBkYXRhW2tleV0uY29udGVudCA9IGNvbnRlbnQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmIChrZXlQYXJ0cy5sZW5ndGggPT09IDIpIHtcbiAgICAgICAgICAgICAgICAvLyBoZWFkZXJcbiAgICAgICAgICAgICAgICBsZXQga2V5ID0ga2V5UGFydHNbMF07XG4gICAgICAgICAgICAgICAgaWYgKCFkYXRhW2tleV0pIHtcbiAgICAgICAgICAgICAgICAgICAgZGF0YVtrZXldID0ge307XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghZGF0YVtrZXldLm1ldGEpIHtcbiAgICAgICAgICAgICAgICAgICAgZGF0YVtrZXldLm1ldGEgPSB7fTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBsZXQgaGVhZGVycyA9IG5ldyBIZWFkZXJzKGNvbnRlbnQpO1xuICAgICAgICAgICAgICAgIGxldCBjb250ZW50VHlwZSA9IGxpYm1pbWUucGFyc2VIZWFkZXJWYWx1ZShoZWFkZXJzLmdldEZpcnN0KCdDb250ZW50LVR5cGUnKSk7XG4gICAgICAgICAgICAgICAgbGV0IHRyYW5zZmVyRW5jb2RpbmcgPSBsaWJtaW1lLnBhcnNlSGVhZGVyVmFsdWUoaGVhZGVycy5nZXRGaXJzdCgnQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZycpKTtcbiAgICAgICAgICAgICAgICBsZXQgZGlzcG9zaXRpb24gPSBsaWJtaW1lLnBhcnNlSGVhZGVyVmFsdWUoaGVhZGVycy5nZXRGaXJzdCgnQ29udGVudC1EaXNwb3NpdGlvbicpKTtcblxuICAgICAgICAgICAgICAgIGlmIChjb250ZW50VHlwZS52YWx1ZS50b0xvd2VyQ2FzZSgpLnRyaW0oKSkge1xuICAgICAgICAgICAgICAgICAgICBkYXRhW2tleV0ubWV0YS5jb250ZW50VHlwZSA9IGNvbnRlbnRUeXBlLnZhbHVlLnRvTG93ZXJDYXNlKCkudHJpbSgpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChjb250ZW50VHlwZS5wYXJhbXMuY2hhcnNldCkge1xuICAgICAgICAgICAgICAgICAgICBkYXRhW2tleV0ubWV0YS5jaGFyc2V0ID0gY29udGVudFR5cGUucGFyYW1zLmNoYXJzZXQudG9Mb3dlckNhc2UoKS50cmltKCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKHRyYW5zZmVyRW5jb2RpbmcudmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgZGF0YVtrZXldLm1ldGEuZW5jb2RpbmcgPSB0cmFuc2ZlckVuY29kaW5nLnZhbHVlXG4gICAgICAgICAgICAgICAgICAgICAgICAucmVwbGFjZSgvXFwoLipcXCkvZywgJycpXG4gICAgICAgICAgICAgICAgICAgICAgICAudG9Mb3dlckNhc2UoKVxuICAgICAgICAgICAgICAgICAgICAgICAgLnRyaW0oKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoZGlzcG9zaXRpb24udmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgZGF0YVtrZXldLm1ldGEuZGlzcG9zaXRpb24gPSBkaXNwb3NpdGlvbi52YWx1ZS50b0xvd2VyQ2FzZSgpLnRyaW0oKSB8fCBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFba2V5XS5tZXRhLmRpc3Bvc2l0aW9uID0gbGlibWltZS5kZWNvZGVXb3JkcyhkYXRhW2tleV0ubWV0YS5kaXNwb3NpdGlvbik7XG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmFpbGVkIHRvIHBhcnNlIGRpc3Bvc2l0aW9uLCBrZWVwIGFzIGlzIChtb3N0IHByb2JhYmx5IGFuIHVua25vd24gY2hhcnNldCBpcyB1c2VkKVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKGNvbnRlbnRUeXBlLnBhcmFtcy5mb3JtYXQgJiYgY29udGVudFR5cGUucGFyYW1zLmZvcm1hdC50b0xvd2VyQ2FzZSgpLnRyaW0oKSA9PT0gJ2Zsb3dlZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgZGF0YVtrZXldLm1ldGEuZmxvd2VkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRlbnRUeXBlLnBhcmFtcy5kZWxzcCAmJiBjb250ZW50VHlwZS5wYXJhbXMuZGVsc3AudG9Mb3dlckNhc2UoKS50cmltKCkgPT09ICd5ZXMnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhW2tleV0ubWV0YS5kZWxTcCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBsZXQgZmlsZW5hbWUgPSBkaXNwb3NpdGlvbi5wYXJhbXMuZmlsZW5hbWUgfHwgY29udGVudFR5cGUucGFyYW1zLm5hbWUgfHwgZmFsc2U7XG4gICAgICAgICAgICAgICAgaWYgKGZpbGVuYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZSA9IGxpYm1pbWUuZGVjb2RlV29yZHMoZmlsZW5hbWUpO1xuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZhaWxlZCB0byBwYXJzZSBmaWxlbmFtZSwga2VlcCBhcyBpcyAobW9zdCBwcm9iYWJseSBhbiB1bmtub3duIGNoYXJzZXQgaXMgdXNlZClcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBkYXRhW2tleV0ubWV0YS5maWxlbmFtZSA9IGZpbGVuYW1lO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAobGV0IHBhcnQgb2YgT2JqZWN0LmtleXMoZGF0YSkpIHtcbiAgICAgICAgICAgIGxldCBtZXRhID0gZGF0YVtwYXJ0XS5tZXRhO1xuXG4gICAgICAgICAgICBzd2l0Y2ggKG1ldGEuZW5jb2RpbmcpIHtcbiAgICAgICAgICAgICAgICBjYXNlICdiYXNlNjQnOlxuICAgICAgICAgICAgICAgICAgICBkYXRhW3BhcnRdLmNvbnRlbnQgPSBkYXRhW3BhcnRdLmNvbnRlbnQgPyBsaWJiYXNlNjQuZGVjb2RlKGRhdGFbcGFydF0uY29udGVudC50b1N0cmluZygpKSA6IG51bGw7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ3F1b3RlZC1wcmludGFibGUnOlxuICAgICAgICAgICAgICAgICAgICBkYXRhW3BhcnRdLmNvbnRlbnQgPSBkYXRhW3BhcnRdLmNvbnRlbnQgPyBsaWJxcC5kZWNvZGUoZGF0YVtwYXJ0XS5jb250ZW50LnRvU3RyaW5nKCkpIDogbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAvLyBrZWVwIGFzIGlzLCBhbHJlYWR5IGEgYnVmZmVyXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZGF0YTtcbiAgICB9XG5cbiAgICBhc3luYyBydW4oY29tbWFuZCwgLi4uYXJncykge1xuICAgICAgICBjb21tYW5kID0gY29tbWFuZC50b1VwcGVyQ2FzZSgpO1xuICAgICAgICBpZiAoIXRoaXMuY29tbWFuZHMuaGFzKGNvbW1hbmQpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5zb2NrZXQuZGVzdHJveWVkKSB7XG4gICAgICAgICAgICBjb25zdCBlcnJvciA9IG5ldyBFcnJvcignQ29ubmVjdGlvbiBub3QgYXZhaWxhYmxlJyk7XG4gICAgICAgICAgICBlcnJvci5jb2RlID0gJ05vQ29ubmVjdGlvbic7XG4gICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNsZWFyVGltZW91dCh0aGlzLmlkbGVTdGFydFRpbWVyKTtcblxuICAgICAgICBpZiAodHlwZW9mIHRoaXMucHJlQ2hlY2sgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMucHJlQ2hlY2soKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBoYW5kbGVyID0gdGhpcy5jb21tYW5kcy5nZXQoY29tbWFuZCk7XG5cbiAgICAgICAgbGV0IHJlc3VsdCA9IGF3YWl0IGhhbmRsZXIodGhpcywgLi4uYXJncyk7XG5cbiAgICAgICAgaWYgKGNvbW1hbmQgIT09ICdJRExFJykge1xuICAgICAgICAgICAgLy8gZG8gbm90IGF1dG9zdGFydCBJRExFLCBpZiBJRExFIGl0c2VsZiB3YXMgc3RvcHBlZFxuICAgICAgICAgICAgdGhpcy5hdXRvaWRsZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICBhc3luYyBwcm9jZXNzTG9ja3MoZm9yY2UpIHtcbiAgICAgICAgaWYgKCFmb3JjZSAmJiB0aGlzLnByb2Nlc3NpbmdMb2NrKSB7XG4gICAgICAgICAgICB0aGlzLmxvZy50cmFjZSh7XG4gICAgICAgICAgICAgICAgbXNnOiAnTWFpbGJveCBsb2NraW5nIHF1ZXVlZCcsXG4gICAgICAgICAgICAgICAgcGF0aDogdGhpcy5tYWlsYm94ICYmIHRoaXMubWFpbGJveC5wYXRoLFxuICAgICAgICAgICAgICAgIHBlbmRpbmc6IHRoaXMubG9ja3MubGVuZ3RoLFxuICAgICAgICAgICAgICAgIGlkbGluZzogdGhpcy5pZGxpbmcsXG4gICAgICAgICAgICAgICAgYWN0aXZlTG9jazogdGhpcy5jdXJyZW50TG9ja1xuICAgICAgICAgICAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgbG9ja0lkOiB0aGlzLmN1cnJlbnRMb2NrLmxvY2tJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uKHRoaXMuY3VycmVudExvY2sub3B0aW9ucz8uZGVzY3JpcHRpb24gJiYgeyBkZXNjcmlwdGlvbjogdGhpcy5jdXJyZW50TG9jay5vcHRpb25zPy5kZXNjcmlwdGlvbiB9KVxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgOiBudWxsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhpcy5sb2Nrcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMucHJvY2Vzc2luZ0xvY2sgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMubG9nLnRyYWNlKHtcbiAgICAgICAgICAgICAgICBtc2c6ICdNYWlsYm94IGxvY2tpbmcgcXVldWUgcHJvY2Vzc2VkJyxcbiAgICAgICAgICAgICAgICBpZGxpbmc6IHRoaXMuaWRsaW5nXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucHJvY2Vzc2luZ0xvY2sgPSB0cnVlO1xuXG4gICAgICAgIGNvbnN0IHJlbGVhc2UgPSAoKSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5jdXJyZW50TG9jaykge1xuICAgICAgICAgICAgICAgIHRoaXMubG9nLnRyYWNlKHtcbiAgICAgICAgICAgICAgICAgICAgbXNnOiAnTWFpbGJveCBsb2NrIHJlbGVhc2VkJyxcbiAgICAgICAgICAgICAgICAgICAgbG9ja0lkOiB0aGlzLmN1cnJlbnRMb2NrLmxvY2tJZCxcbiAgICAgICAgICAgICAgICAgICAgcGF0aDogdGhpcy5tYWlsYm94ICYmIHRoaXMubWFpbGJveC5wYXRoLFxuICAgICAgICAgICAgICAgICAgICBwZW5kaW5nOiB0aGlzLmxvY2tzLmxlbmd0aCxcbiAgICAgICAgICAgICAgICAgICAgaWRsaW5nOiB0aGlzLmlkbGluZ1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudExvY2sgPSBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMucHJvY2Vzc0xvY2tzKHRydWUpLmNhdGNoKGVyciA9PiB0aGlzLmxvZy5lcnJvcih7IGVyciwgY2lkOiB0aGlzLmlkIH0pKTtcbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCBsb2NrID0gdGhpcy5sb2Nrcy5zaGlmdCgpO1xuICAgICAgICBjb25zdCB7IHJlc29sdmUsIHJlamVjdCwgcGF0aCwgb3B0aW9ucywgbG9ja0lkIH0gPSBsb2NrO1xuXG4gICAgICAgIGlmICghdGhpcy51c2FibGUgfHwgdGhpcy5zb2NrZXQuZGVzdHJveWVkKSB7XG4gICAgICAgICAgICB0aGlzLmxvZy50cmFjZSh7IG1zZzogJ0ZhaWxlZCB0byBhY3F1aXJlIG1haWxib3ggbG9jaycsIHBhdGgsIGxvY2tJZCwgaWRsaW5nOiB0aGlzLmlkbGluZyB9KTtcbiAgICAgICAgICAgIC8vIHJlamVjdCBhbGxcbiAgICAgICAgICAgIGxldCBlcnJvciA9IG5ldyBFcnJvcignQ29ubmVjdGlvbiBub3QgYXZhaWxhYmxlJyk7XG4gICAgICAgICAgICBlcnJvci5jb2RlID0gJ05vQ29ubmVjdGlvbic7XG4gICAgICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMucHJvY2Vzc0xvY2tzKHRydWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMubWFpbGJveCAmJiB0aGlzLm1haWxib3gucGF0aCA9PT0gcGF0aCAmJiAhIXRoaXMubWFpbGJveC5yZWFkT25seSA9PT0gISFvcHRpb25zLnJlYWRPbmx5KSB7XG4gICAgICAgICAgICAvLyBub3RoaW5nIHRvIGRvIGhlcmUsIGFscmVhZHkgc2VsZWN0ZWRcbiAgICAgICAgICAgIHRoaXMubG9nLnRyYWNlKHtcbiAgICAgICAgICAgICAgICBtc2c6ICdNYWlsYm94IGxvY2sgYWNxdWlyZWQgW2V4aXN0aW5nXScsXG4gICAgICAgICAgICAgICAgcGF0aCxcbiAgICAgICAgICAgICAgICBsb2NrSWQsXG4gICAgICAgICAgICAgICAgaWRsaW5nOiB0aGlzLmlkbGluZyxcbiAgICAgICAgICAgICAgICAuLi4ob3B0aW9ucy5kZXNjcmlwdGlvbiAmJiB7IGRlc2NyaXB0aW9uOiBvcHRpb25zLmRlc2NyaXB0aW9uIH0pXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudExvY2sgPSBsb2NrO1xuICAgICAgICAgICAgcmV0dXJuIHJlc29sdmUoeyBwYXRoLCByZWxlYXNlIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAvLyBUcnkgdG8gb3Blbi4gVGhyb3dzIGlmIG1haWxib3ggZG9lcyBub3QgZXhpc3RzIG9yIGNhbid0IG9wZW5cbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLm1haWxib3hPcGVuKHBhdGgsIG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgIHRoaXMubG9nLnRyYWNlKHtcbiAgICAgICAgICAgICAgICAgICAgbXNnOiAnTWFpbGJveCBsb2NrIGFjcXVpcmVkIFtzZWxlY3RlZF0nLFxuICAgICAgICAgICAgICAgICAgICBwYXRoLFxuICAgICAgICAgICAgICAgICAgICBsb2NrSWQsXG4gICAgICAgICAgICAgICAgICAgIGlkbGluZzogdGhpcy5pZGxpbmcsXG4gICAgICAgICAgICAgICAgICAgIC4uLihvcHRpb25zLmRlc2NyaXB0aW9uICYmIHsgZGVzY3JpcHRpb246IG9wdGlvbnMuZGVzY3JpcHRpb24gfSlcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRMb2NrID0gbG9jaztcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzb2x2ZSh7IHBhdGgsIHJlbGVhc2UgfSk7XG4gICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICBpZiAoZXJyLnJlc3BvbnNlU3RhdHVzID09PSAnTk8nKSB7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgZm9sZGVycyA9IGF3YWl0IHRoaXMucnVuKCdMSVNUJywgJycsIHBhdGgsIHsgbGlzdE9ubHk6IHRydWUgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWZvbGRlcnMgfHwgIWZvbGRlcnMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyLm1haWxib3hNaXNzaW5nID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoRSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2cudHJhY2UoeyBtc2c6ICdGYWlsZWQgdG8gdmVyaWZ5IGZhaWxlZCBtYWlsYm94JywgcGF0aCwgZXJyOiBFIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdGhpcy5sb2cudHJhY2Uoe1xuICAgICAgICAgICAgICAgICAgICBtc2c6ICdGYWlsZWQgdG8gYWNxdWlyZSBtYWlsYm94IGxvY2snLFxuICAgICAgICAgICAgICAgICAgICBwYXRoLFxuICAgICAgICAgICAgICAgICAgICBsb2NrSWQsXG4gICAgICAgICAgICAgICAgICAgIGlkbGluZzogdGhpcy5pZGxpbmcsXG4gICAgICAgICAgICAgICAgICAgIC4uLihvcHRpb25zLmRlc2NyaXB0aW9uICYmIHsgZGVzY3JpcHRpb246IG9wdGlvbnMuZGVzY3JpcHRpb24gfSksXG4gICAgICAgICAgICAgICAgICAgIGVyclxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMucHJvY2Vzc0xvY2tzKHRydWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogT3BlbnMgYSBtYWlsYm94IGlmIG5vdCBhbHJlYWR5IG9wZW4gYW5kIHJldHVybnMgYSBsb2NrLiBOZXh0IGNhbGwgdG8gYGdldE1haWxib3hMb2NrKClgIGlzIHF1ZXVlZFxuICAgICAqIHVudGlsIHByZXZpb3VzIGxvY2sgaXMgcmVsZWFzZWQuIFRoaXMgaXMgc3VnZ2VzdGVkIG92ZXIge0BsaW5rIG1vZHVsZTppbWFwZmxvd35JbWFwRmxvdyNtYWlsYm94T3BlbnxtYWlsYm94T3BlbigpfSBhc1xuICAgICAqIGBnZXRNYWlsYm94TG9jaygpYCBnaXZlcyB5b3UgYSB3ZWFrIHRyYW5zYWN0aW9uIHdoaWxlIGBtYWlsYm94T3BlbigpYCBoYXMgbm8gZ3VhcmFudGVlcyB3aGF0c29ldmVyIHRoYXQgYW5vdGhlclxuICAgICAqIG1haWxib3ggaXMgb3BlbmVkIHdoaWxlIHlvdSB0cnkgdG8gY2FsbCBtdWx0aXBsZSBmZXRjaCBvciBzdG9yZSBjb21tYW5kcy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfGFycmF5fSBwYXRoICoqUGF0aCBmb3IgdGhlIG1haWxib3gqKiB0byBvcGVuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXSBvcHRpb25hbCBvcHRpb25zXG4gICAgICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5yZWFkT25seT1mYWxzZV0gSWYgYHRydWVgIHRoZW4gb3BlbnMgbWFpbGJveCBpbiByZWFkLW9ubHkgbW9kZS4gWW91IGNhbiBzdGlsbCB0cnkgdG8gcGVyZm9ybSB3cml0ZSBvcGVyYXRpb25zIGJ1dCB0aGVzZSB3b3VsZCBwcm9iYWJseSBmYWlsLlxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlPE1haWxib3hMb2NrT2JqZWN0Pn0gTWFpbGJveCBsb2NrXG4gICAgICogQHRocm93cyBXaWxsIHRocm93IGFuIGVycm9yIGlmIG1haWxib3ggZG9lcyBub3QgZXhpc3Qgb3IgY2FuIG5vdCBiZSBvcGVuZWRcbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogbGV0IGxvY2sgPSBhd2FpdCBjbGllbnQuZ2V0TWFpbGJveExvY2soJ0lOQk9YJyk7XG4gICAgICogdHJ5IHtcbiAgICAgKiAgIC8vIGRvIHNvbWV0aGluZyBpbiB0aGUgbWFpbGJveFxuICAgICAqIH0gZmluYWxseSB7XG4gICAgICogICAvLyB1c2UgZmluYWxseXt9IHRvIG1ha2Ugc3VyZSBsb2NrIGlzIHJlbGVhc2VkIGV2ZW4gaWYgZXhjZXB0aW9uIG9jY3Vyc1xuICAgICAqICAgbG9jay5yZWxlYXNlKCk7XG4gICAgICogfVxuICAgICAqL1xuICAgIGFzeW5jIGdldE1haWxib3hMb2NrKHBhdGgsIG9wdGlvbnMpIHtcbiAgICAgICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cbiAgICAgICAgcGF0aCA9IG5vcm1hbGl6ZVBhdGgodGhpcywgcGF0aCk7XG5cbiAgICAgICAgbGV0IGxvY2tJZCA9ICsrdGhpcy5sb2NrQ291bnRlcjtcbiAgICAgICAgdGhpcy5sb2cudHJhY2Uoe1xuICAgICAgICAgICAgbXNnOiAnUmVxdWVzdGluZyBsb2NrJyxcbiAgICAgICAgICAgIHBhdGgsXG4gICAgICAgICAgICBsb2NrSWQsXG4gICAgICAgICAgICAuLi4ob3B0aW9ucy5kZXNjcmlwdGlvbiAmJiB7IGRlc2NyaXB0aW9uOiBvcHRpb25zLmRlc2NyaXB0aW9uIH0pLFxuICAgICAgICAgICAgYWN0aXZlTG9jazogdGhpcy5jdXJyZW50TG9ja1xuICAgICAgICAgICAgICAgID8ge1xuICAgICAgICAgICAgICAgICAgICAgIGxvY2tJZDogdGhpcy5jdXJyZW50TG9jay5sb2NrSWQsXG4gICAgICAgICAgICAgICAgICAgICAgLi4uKHRoaXMuY3VycmVudExvY2sub3B0aW9ucz8uZGVzY3JpcHRpb24gJiYgeyBkZXNjcmlwdGlvbjogdGhpcy5jdXJyZW50TG9jay5vcHRpb25zPy5kZXNjcmlwdGlvbiB9KVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIDogbnVsbFxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5sb2Nrcy5wdXNoKHsgcmVzb2x2ZSwgcmVqZWN0LCBwYXRoLCBvcHRpb25zLCBsb2NrSWQgfSk7XG4gICAgICAgICAgICB0aGlzLnByb2Nlc3NMb2NrcygpLmNhdGNoKGVyciA9PiByZWplY3QoZXJyKSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGdldExvZ2dlcigpIHtcbiAgICAgICAgbGV0IG1haW5Mb2dnZXIgPVxuICAgICAgICAgICAgdGhpcy5vcHRpb25zLmxvZ2dlciAmJiB0eXBlb2YgdGhpcy5vcHRpb25zLmxvZ2dlciA9PT0gJ29iamVjdCdcbiAgICAgICAgICAgICAgICA/IHRoaXMub3B0aW9ucy5sb2dnZXJcbiAgICAgICAgICAgICAgICA6IGxvZ2dlci5jaGlsZCh7XG4gICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50OiAnaW1hcC1jb25uZWN0aW9uJyxcbiAgICAgICAgICAgICAgICAgICAgICBjaWQ6IHRoaXMuaWRcbiAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgIGxldCBzeW50ZXRpY0xvZ2dlciA9IHt9O1xuICAgICAgICBsZXQgbGV2ZWxzID0gWyd0cmFjZScsICdkZWJ1ZycsICdpbmZvJywgJ3dhcm4nLCAnZXJyb3InLCAnZmF0YWwnXTtcbiAgICAgICAgZm9yIChsZXQgbGV2ZWwgb2YgbGV2ZWxzKSB7XG4gICAgICAgICAgICBzeW50ZXRpY0xvZ2dlcltsZXZlbF0gPSAoLi4uYXJncykgPT4ge1xuICAgICAgICAgICAgICAgIC8vIHVzaW5nIHtsb2dnZXI6ZmFsc2V9IGRpc2FibGVzIGxvZ2dpbmdcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmxvZ2dlciAhPT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGxvZ2dlcilcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgbWFpbkxvZ2dlcltsZXZlbF0gIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSBhcmUgY2hlY2tpbmcgdG8gbWFrZSBzdXJlIHRoZSBsZXZlbCBpcyBzdXBwb3J0ZWQuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgaXQgaXNuJ3Qgc3VwcG9ydGVkIGJ1dCB0aGUgbGV2ZWwgaXMgZXJyb3Igb3IgZmF0YWwsIGxvZyB0byBjb25zb2xlIGFueXdheS5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobGV2ZWwgPT09ICdmYXRhbCcgfHwgbGV2ZWwgPT09ICdlcnJvcicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coSlNPTi5zdHJpbmdpZnkoLi4uYXJncykpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFpbkxvZ2dlcltsZXZlbF0oLi4uYXJncyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuZW1pdExvZ3MgJiYgYXJncyAmJiBhcmdzWzBdICYmIHR5cGVvZiBhcmdzWzBdID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgICAgICAgICBsZXQgbG9nRW50cnkgPSBPYmplY3QuYXNzaWduKHsgbGV2ZWwsIHQ6IERhdGUubm93KCksIGNpZDogdGhpcy5pZCwgbG86ICsrdGhpcy5sbyB9LCBhcmdzWzBdKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGxvZ0VudHJ5LmVyciAmJiB0eXBlb2YgbG9nRW50cnkuZXJyID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGVyciA9IGxvZ0VudHJ5LmVycjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvZ0VudHJ5LmVyciA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFjazogZXJyLnN0YWNrXG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZW51bWVyYWJsZSBlcnJvciBmaWVsZHNcbiAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdC5rZXlzKGVycikuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ0VudHJ5LmVycltrZXldID0gZXJyW2tleV07XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmVtaXQoJ2xvZycsIGxvZ0VudHJ5KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHN5bnRldGljTG9nZ2VyO1xuICAgIH1cblxuICAgIHVuYmluZCgpIHtcbiAgICAgICAgdGhpcy5zb2NrZXQudW5waXBlKHRoaXMuc3RyZWFtZXIpO1xuICAgICAgICBpZiAodGhpcy5faW5mbGF0ZSkge1xuICAgICAgICAgICAgdGhpcy5faW5mbGF0ZS51bnBpcGUodGhpcy5zdHJlYW1lcik7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnNvY2tldC5yZW1vdmVMaXN0ZW5lcignZXJyb3InLCB0aGlzLl9zb2NrZXRFcnJvcik7XG4gICAgICAgIHRoaXMuc29ja2V0LnJlbW92ZUxpc3RlbmVyKCdjbG9zZScsIHRoaXMuX3NvY2tldENsb3NlKTtcbiAgICAgICAgdGhpcy5zb2NrZXQucmVtb3ZlTGlzdGVuZXIoJ2VuZCcsIHRoaXMuX3NvY2tldEVuZCk7XG4gICAgICAgIHRoaXMuc29ja2V0LnJlbW92ZUxpc3RlbmVyKCd0bHNDbGllbnRFcnJvcicsIHRoaXMuX3NvY2tldEVycm9yKTtcbiAgICAgICAgdGhpcy5zb2NrZXQucmVtb3ZlTGlzdGVuZXIoJ3RpbWVvdXQnLCB0aGlzLl9zb2NrZXRUaW1lb3V0KTtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgcmVhZFNvY2tldDogdGhpcy5faW5mbGF0ZSB8fCB0aGlzLnNvY2tldCxcbiAgICAgICAgICAgIHdyaXRlU29ja2V0OiB0aGlzLndyaXRlU29ja2V0IHx8IHRoaXMuc29ja2V0XG4gICAgICAgIH07XG4gICAgfVxufVxuXG4vKipcbiAqIENvbm5lY3Rpb24gY2xvc2UgZXZlbnQuICoqTkIhKiogSW1hcEZsb3cgZG9lcyBub3QgaGFuZGxlIHJlY29ubmVjdHMgYXV0b21hdGljYWxseS5cbiAqIFNvIHdoZW5ldmVyIGEgJ2Nsb3NlJyBldmVudCBvY2N1cnMgeW91IG11c3QgY3JlYXRlIGEgbmV3IGNvbm5lY3Rpb24geW91cnNlbGYuXG4gKlxuICogQGV2ZW50IG1vZHVsZTppbWFwZmxvd35JbWFwRmxvdyNjbG9zZVxuICovXG5cbi8qKlxuICogRXJyb3IgZXZlbnQuIEluIG1vc3QgY2FzZXMgZ2V0dGluZyBhbiBlcnJvciBldmVudCBhbHNvIG1lYW5zIHRoYXQgY29ubmVjdGlvbiBpcyBjbG9zZWRcbiAqIGFuZCBwZW5kaW5nIG9wZXJhdGlvbnMgc2hvdWxkIHJldHVybiB3aXRoIGEgZmFpbHVyZS5cbiAqXG4gKiBAZXZlbnQgbW9kdWxlOmltYXBmbG93fkltYXBGbG93I2Vycm9yXG4gKiBAdHlwZSB7RXJyb3J9XG4gKiBAZXhhbXBsZVxuICogY2xpZW50Lm9uKCdlcnJvcicsIGVycj0+e1xuICogICAgIGNvbnNvbGUubG9nKGBFcnJvciBvY2N1cnJlZDogJHtlcnIubWVzc2FnZX1gKTtcbiAqIH0pO1xuICovXG5cbi8qKlxuICogTWVzc2FnZSBjb3VudCBpbiBjdXJyZW50bHkgb3BlbmVkIG1haWxib3ggY2hhbmdlZFxuICpcbiAqIEBldmVudCBtb2R1bGU6aW1hcGZsb3d+SW1hcEZsb3cjZXhpc3RzXG4gKiBAdHlwZSB7T2JqZWN0fVxuICogQHByb3BlcnR5IHtTdHJpbmd9IHBhdGggbWFpbGJveCBwYXRoIHRoaXMgZXZlbnQgYXBwbGllcyB0b1xuICogQHByb3BlcnR5IHtOdW1iZXJ9IGNvdW50IHVwZGF0ZWQgY291bnQgb2YgbWVzc2FnZXNcbiAqIEBwcm9wZXJ0eSB7TnVtYmVyfSBwcmV2Q291bnQgbWVzc2FnZSBjb3VudCBiZWZvcmUgdGhpcyB1cGRhdGVcbiAqIEBleGFtcGxlXG4gKiBjbGllbnQub24oJ2V4aXN0cycsIGRhdGE9PntcbiAqICAgICBjb25zb2xlLmxvZyhgTWVzc2FnZSBjb3VudCBpbiBcIiR7ZGF0YS5wYXRofVwiIGlzICR7ZGF0YS5jb3VudH1gKTtcbiAqIH0pO1xuICovXG5cbi8qKlxuICogRGVsZXRlZCBtZXNzYWdlIHNlcXVlbmNlIG51bWJlciBpbiBjdXJyZW50bHkgb3BlbmVkIG1haWxib3guIE9uZSBldmVudCBpcyBmaXJlZCBmb3IgZXZlcnkgZGVsZXRlZCBlbWFpbC5cbiAqXG4gKiBAZXZlbnQgbW9kdWxlOmltYXBmbG93fkltYXBGbG93I2V4cHVuZ2VcbiAqIEB0eXBlIHtPYmplY3R9XG4gKiBAcHJvcGVydHkge1N0cmluZ30gcGF0aCBtYWlsYm94IHBhdGggdGhpcyBldmVudCBhcHBsaWVzIHRvXG4gKiBAcHJvcGVydHkge051bWJlcn0gc2VxIHNlcXVlbmNlIG51bWJlciBvZiBkZWxldGVkIG1lc3NhZ2VcbiAqIEBleGFtcGxlXG4gKiBjbGllbnQub24oJ2V4cHVuZ2UnLCBkYXRhPT57XG4gKiAgICAgY29uc29sZS5sb2coYE1lc3NhZ2UgIyR7ZGF0YS5zZXF9IHdhcyBkZWxldGVkIGZyb20gXCIke2RhdGEucGF0aH1cImApO1xuICogfSk7XG4gKi9cblxuLyoqXG4gKiBGbGFncyB3ZXJlIHVwZGF0ZWQgZm9yIGEgbWVzc2FnZS4gTm90IGFsbCBzZXJ2ZXJzIGZpcmUgdGhpcyBldmVudC5cbiAqXG4gKiBAZXZlbnQgbW9kdWxlOmltYXBmbG93fkltYXBGbG93I2ZsYWdzXG4gKiBAdHlwZSB7T2JqZWN0fVxuICogQHByb3BlcnR5IHtTdHJpbmd9IHBhdGggbWFpbGJveCBwYXRoIHRoaXMgZXZlbnQgYXBwbGllcyB0b1xuICogQHByb3BlcnR5IHtOdW1iZXJ9IHNlcSBzZXF1ZW5jZSBudW1iZXIgb2YgdXBkYXRlZCBtZXNzYWdlXG4gKiBAcHJvcGVydHkge051bWJlcn0gW3VpZF0gVUlEIG51bWJlciBvZiB1cGRhdGVkIG1lc3NhZ2UgKGlmIHNlcnZlciBwcm92aWRlZCB0aGlzIHZhbHVlKVxuICogQHByb3BlcnR5IHtCaWdJbnR9IFttb2RzZXFdIFVwZGF0ZWQgbW9kc2VxIG51bWJlciBmb3IgdGhlIG1haWxib3ggKGlmIHNlcnZlciBwcm92aWRlZCB0aGlzIHZhbHVlKVxuICogQHByb3BlcnR5IHtTZXQ8c3RyaW5nPn0gZmxhZ3MgQSBzZXQgb2YgYWxsIGZsYWdzIGZvciB0aGUgdXBkYXRlZCBtZXNzYWdlXG4gKiBAZXhhbXBsZVxuICogY2xpZW50Lm9uKCdmbGFncycsIGRhdGE9PntcbiAqICAgICBjb25zb2xlLmxvZyhgRmxhZyBzZXQgZm9yICMke2RhdGEuc2VxfSBpcyBub3cgXCIke0FycmF5LmZyb20oZGF0YS5mbGFncykuam9pbignLCAnKX1cImApO1xuICogfSk7XG4gKi9cblxuLyoqXG4gKiBNYWlsYm94IHdhcyBvcGVuZWRcbiAqXG4gKiBAZXZlbnQgbW9kdWxlOmltYXBmbG93fkltYXBGbG93I21haWxib3hPcGVuXG4gKiBAdHlwZSB7TWFpbGJveE9iamVjdH1cbiAqIEBleGFtcGxlXG4gKiBjbGllbnQub24oJ21haWxib3hPcGVuJywgbWFpbGJveCA9PiB7XG4gKiAgICAgY29uc29sZS5sb2coYE1haWxib3ggJHttYWlsYm94LnBhdGh9IHdhcyBvcGVuZWRgKTtcbiAqIH0pO1xuICovXG5cbi8qKlxuICogTWFpbGJveCB3YXMgY2xvc2VkXG4gKlxuICogQGV2ZW50IG1vZHVsZTppbWFwZmxvd35JbWFwRmxvdyNtYWlsYm94Q2xvc2VcbiAqIEB0eXBlIHtNYWlsYm94T2JqZWN0fVxuICogQGV4YW1wbGVcbiAqIGNsaWVudC5vbignbWFpbGJveENsb3NlJywgbWFpbGJveCA9PiB7XG4gKiAgICAgY29uc29sZS5sb2coYE1haWxib3ggJHttYWlsYm94LnBhdGh9IHdhcyBjbG9zZWRgKTtcbiAqIH0pO1xuICovXG5cbi8qKlxuICogTG9nIGV2ZW50IGlmIGBlbWl0TG9ncz10cnVlYFxuICpcbiAqIEBldmVudCBtb2R1bGU6aW1hcGZsb3d+SW1hcEZsb3cjbG9nXG4gKiBAdHlwZSB7T2JqZWN0fVxuICogQGV4YW1wbGVcbiAqIGNsaWVudC5vbignbG9nJywgZW50cnkgPT4ge1xuICogICAgIGNvbnNvbGUubG9nKGAke2xvZy5jaWR9ICR7bG9nLm1zZ31gKTtcbiAqIH0pO1xuICovXG5cbm1vZHVsZS5leHBvcnRzLkltYXBGbG93ID0gSW1hcEZsb3c7XG4iXSwibmFtZXMiOltdLCJpZ25vcmVMaXN0IjpbMF0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(action-browser)/./node_modules/imapflow/lib/imap-flow.js\n");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "(action-browser)/./node_modules/imapflow/lib/jp-decoder.js":
|
|
/*!*************************************************!*\
|
|
!*** ./node_modules/imapflow/lib/jp-decoder.js ***!
|
|
\*************************************************/
|
|
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
|
|
|
|
eval("\n\nconst { Transform } = __webpack_require__(/*! stream */ \"stream\");\nconst encodingJapanese = __webpack_require__(/*! encoding-japanese */ \"(action-browser)/./node_modules/encoding-japanese/src/index.js\");\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\nmodule.exports.JPDecoder = JPDecoder;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFjdGlvbi1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9pbWFwZmxvdy9saWIvanAtZGVjb2Rlci5qcyIsIm1hcHBpbmdzIjoiQUFBYTs7QUFFYixRQUFRLFlBQVksRUFBRSxtQkFBTyxDQUFDLHNCQUFRO0FBQ3RDLHlCQUF5QixtQkFBTyxDQUFDLHlGQUFtQjs7QUFFcEQ7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEsd0JBQXdCIiwic291cmNlcyI6WyIvaG9tZS9hbG1hL25leHRnZW4vTmVhaC1tYWlsL25vZGVfbW9kdWxlcy9pbWFwZmxvdy9saWIvanAtZGVjb2Rlci5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbmNvbnN0IHsgVHJhbnNmb3JtIH0gPSByZXF1aXJlKCdzdHJlYW0nKTtcbmNvbnN0IGVuY29kaW5nSmFwYW5lc2UgPSByZXF1aXJlKCdlbmNvZGluZy1qYXBhbmVzZScpO1xuXG5jbGFzcyBKUERlY29kZXIgZXh0ZW5kcyBUcmFuc2Zvcm0ge1xuICAgIGNvbnN0cnVjdG9yKGNoYXJzZXQpIHtcbiAgICAgICAgc3VwZXIoKTtcblxuICAgICAgICB0aGlzLmNoYXJzZXQgPSBjaGFyc2V0O1xuICAgICAgICB0aGlzLmNodW5rcyA9IFtdO1xuICAgICAgICB0aGlzLmNodW5rbGVuID0gMDtcbiAgICB9XG5cbiAgICBfdHJhbnNmb3JtKGNodW5rLCBlbmNvZGluZywgZG9uZSkge1xuICAgICAgICBpZiAodHlwZW9mIGNodW5rID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgY2h1bmsgPSBCdWZmZXIuZnJvbShjaHVuaywgZW5jb2RpbmcpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jaHVua3MucHVzaChjaHVuayk7XG4gICAgICAgIHRoaXMuY2h1bmtsZW4gKz0gY2h1bmsubGVuZ3RoO1xuICAgICAgICBkb25lKCk7XG4gICAgfVxuXG4gICAgX2ZsdXNoKGRvbmUpIHtcbiAgICAgICAgbGV0IGlucHV0ID0gQnVmZmVyLmNvbmNhdCh0aGlzLmNodW5rcywgdGhpcy5jaHVua2xlbik7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBsZXQgb3V0cHV0ID0gZW5jb2RpbmdKYXBhbmVzZS5jb252ZXJ0KGlucHV0LCB7XG4gICAgICAgICAgICAgICAgdG86ICdVTklDT0RFJywgLy8gdG9fZW5jb2RpbmdcbiAgICAgICAgICAgICAgICBmcm9tOiB0aGlzLmNoYXJzZXQsIC8vIGZyb21fZW5jb2RpbmdcbiAgICAgICAgICAgICAgICB0eXBlOiAnc3RyaW5nJ1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAodHlwZW9mIG91dHB1dCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICBvdXRwdXQgPSBCdWZmZXIuZnJvbShvdXRwdXQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5wdXNoKG91dHB1dCk7XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgLy8ga2VlcCBhcyBpcyBvbiBlcnJvcnNcbiAgICAgICAgICAgIHRoaXMucHVzaChpbnB1dCk7XG4gICAgICAgIH1cblxuICAgICAgICBkb25lKCk7XG4gICAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cy5KUERlY29kZXIgPSBKUERlY29kZXI7XG4iXSwibmFtZXMiOltdLCJpZ25vcmVMaXN0IjpbMF0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(action-browser)/./node_modules/imapflow/lib/jp-decoder.js\n");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "(action-browser)/./node_modules/imapflow/lib/limited-passthrough.js":
|
|
/*!**********************************************************!*\
|
|
!*** ./node_modules/imapflow/lib/limited-passthrough.js ***!
|
|
\**********************************************************/
|
|
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
|
|
|
|
eval("\n\nconst { Transform } = __webpack_require__(/*! stream */ \"stream\");\n\nclass LimitedPassthrough extends Transform {\n constructor(options) {\n super();\n this.options = options || {};\n this.maxBytes = this.options.maxBytes || Infinity;\n this.processed = 0;\n this.limited = false;\n }\n\n _transform(chunk, encoding, done) {\n if (this.limited) {\n return done();\n }\n\n if (this.processed + chunk.length > this.maxBytes) {\n if (this.maxBytes - this.processed < 1) {\n return done();\n }\n\n chunk = chunk.slice(0, this.maxBytes - this.processed);\n }\n\n this.processed += chunk.length;\n if (this.processed >= this.maxBytes) {\n this.limited = true;\n }\n\n this.push(chunk);\n done();\n }\n}\n\nmodule.exports.LimitedPassthrough = LimitedPassthrough;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFjdGlvbi1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9pbWFwZmxvdy9saWIvbGltaXRlZC1wYXNzdGhyb3VnaC5qcyIsIm1hcHBpbmdzIjoiQUFBYTs7QUFFYixRQUFRLFlBQVksRUFBRSxtQkFBTyxDQUFDLHNCQUFROztBQUV0QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsaUNBQWlDIiwic291cmNlcyI6WyIvaG9tZS9hbG1hL25leHRnZW4vTmVhaC1tYWlsL25vZGVfbW9kdWxlcy9pbWFwZmxvdy9saWIvbGltaXRlZC1wYXNzdGhyb3VnaC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbmNvbnN0IHsgVHJhbnNmb3JtIH0gPSByZXF1aXJlKCdzdHJlYW0nKTtcblxuY2xhc3MgTGltaXRlZFBhc3N0aHJvdWdoIGV4dGVuZHMgVHJhbnNmb3JtIHtcbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gICAgICAgIHRoaXMubWF4Qnl0ZXMgPSB0aGlzLm9wdGlvbnMubWF4Qnl0ZXMgfHwgSW5maW5pdHk7XG4gICAgICAgIHRoaXMucHJvY2Vzc2VkID0gMDtcbiAgICAgICAgdGhpcy5saW1pdGVkID0gZmFsc2U7XG4gICAgfVxuXG4gICAgX3RyYW5zZm9ybShjaHVuaywgZW5jb2RpbmcsIGRvbmUpIHtcbiAgICAgICAgaWYgKHRoaXMubGltaXRlZCkge1xuICAgICAgICAgICAgcmV0dXJuIGRvbmUoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLnByb2Nlc3NlZCArIGNodW5rLmxlbmd0aCA+IHRoaXMubWF4Qnl0ZXMpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLm1heEJ5dGVzIC0gdGhpcy5wcm9jZXNzZWQgPCAxKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGRvbmUoKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY2h1bmsgPSBjaHVuay5zbGljZSgwLCB0aGlzLm1heEJ5dGVzIC0gdGhpcy5wcm9jZXNzZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5wcm9jZXNzZWQgKz0gY2h1bmsubGVuZ3RoO1xuICAgICAgICBpZiAodGhpcy5wcm9jZXNzZWQgPj0gdGhpcy5tYXhCeXRlcykge1xuICAgICAgICAgICAgdGhpcy5saW1pdGVkID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucHVzaChjaHVuayk7XG4gICAgICAgIGRvbmUoKTtcbiAgICB9XG59XG5cbm1vZHVsZS5leHBvcnRzLkxpbWl0ZWRQYXNzdGhyb3VnaCA9IExpbWl0ZWRQYXNzdGhyb3VnaDtcbiJdLCJuYW1lcyI6W10sImlnbm9yZUxpc3QiOlswXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(action-browser)/./node_modules/imapflow/lib/limited-passthrough.js\n");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "(action-browser)/./node_modules/imapflow/lib/logger.js":
|
|
/*!*********************************************!*\
|
|
!*** ./node_modules/imapflow/lib/logger.js ***!
|
|
\*********************************************/
|
|
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
|
|
|
|
eval("\n\nconst logger = __webpack_require__(/*! pino */ \"(action-browser)/./node_modules/pino/pino.js\")();\nlogger.level = 'trace';\nmodule.exports = logger;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFjdGlvbi1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9pbWFwZmxvdy9saWIvbG9nZ2VyLmpzIiwibWFwcGluZ3MiOiJBQUFhOztBQUViLGVBQWUsbUJBQU8sQ0FBQywwREFBTTtBQUM3QjtBQUNBIiwic291cmNlcyI6WyIvaG9tZS9hbG1hL25leHRnZW4vTmVhaC1tYWlsL25vZGVfbW9kdWxlcy9pbWFwZmxvdy9saWIvbG9nZ2VyLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcblxuY29uc3QgbG9nZ2VyID0gcmVxdWlyZSgncGlubycpKCk7XG5sb2dnZXIubGV2ZWwgPSAndHJhY2UnO1xubW9kdWxlLmV4cG9ydHMgPSBsb2dnZXI7XG4iXSwibmFtZXMiOltdLCJpZ25vcmVMaXN0IjpbMF0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(action-browser)/./node_modules/imapflow/lib/logger.js\n");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "(action-browser)/./node_modules/imapflow/lib/proxy-connection.js":
|
|
/*!*******************************************************!*\
|
|
!*** ./node_modules/imapflow/lib/proxy-connection.js ***!
|
|
\*******************************************************/
|
|
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
|
|
|
|
eval("\n\nconst httpProxyClient = __webpack_require__(/*! nodemailer/lib/smtp-connection/http-proxy-client */ \"(action-browser)/./node_modules/imapflow/node_modules/nodemailer/lib/smtp-connection/http-proxy-client.js\");\nconst { SocksClient } = __webpack_require__(/*! socks */ \"(action-browser)/./node_modules/socks/build/index.js\");\nconst util = __webpack_require__(/*! util */ \"util\");\nconst httpProxyClientAsync = util.promisify(httpProxyClient);\nconst dns = (__webpack_require__(/*! dns */ \"dns\").promises);\nconst net = __webpack_require__(/*! net */ \"net\");\n\nconst proxyConnection = async (logger, connectionUrl, host, port) => {\n let proxyUrl = new URL(connectionUrl);\n\n let protocol = proxyUrl.protocol.replace(/:$/, '').toLowerCase();\n\n if (!net.isIP(host)) {\n let resolveResult = await dns.resolve(host);\n if (resolveResult && resolveResult.length) {\n host = resolveResult[0];\n }\n }\n\n switch (protocol) {\n // Connect using a HTTP CONNECT method\n case 'http':\n case 'https': {\n try {\n let socket = await httpProxyClientAsync(proxyUrl.href, port, host);\n if (socket) {\n if (proxyUrl.password) {\n proxyUrl.password = '(hidden)';\n }\n logger.info({\n msg: 'Established a socket via HTTP proxy',\n proxyUrl: proxyUrl.href,\n port,\n host\n });\n }\n return socket;\n } catch (err) {\n if (proxyUrl.password) {\n proxyUrl.password = '(hidden)';\n }\n logger.error({\n msg: 'Failed to establish a socket via HTTP proxy',\n proxyUrl: proxyUrl.href,\n port,\n host,\n err\n });\n throw err;\n }\n }\n\n // SOCKS proxy\n case 'socks':\n case 'socks5':\n case 'socks4':\n case 'socks4a': {\n let proxyType = Number(protocol.replace(/\\D/g, '')) || 5;\n\n let targetHost = proxyUrl.hostname;\n if (!net.isIP(targetHost)) {\n let resolveResult = await dns.resolve(targetHost);\n if (resolveResult && resolveResult.length) {\n targetHost = resolveResult[0];\n }\n }\n\n let connectionOpts = {\n proxy: {\n host: targetHost,\n port: Number(proxyUrl.port) || 1080,\n type: proxyType\n },\n destination: {\n host,\n port\n },\n command: 'connect',\n set_tcp_nodelay: true\n };\n\n if (proxyUrl.username || proxyUrl.password) {\n connectionOpts.proxy.userId = proxyUrl.username;\n connectionOpts.proxy.password = proxyUrl.password;\n }\n\n try {\n const info = await SocksClient.createConnection(connectionOpts);\n if (info && info.socket) {\n if (proxyUrl.password) {\n proxyUrl.password = '(hidden)';\n }\n logger.info({\n msg: 'Established a socket via SOCKS proxy',\n proxyUrl: proxyUrl.href,\n port,\n host\n });\n }\n return info.socket;\n } catch (err) {\n if (proxyUrl.password) {\n proxyUrl.password = '(hidden)';\n }\n logger.error({\n msg: 'Failed to establish a socket via SOCKS proxy',\n proxyUrl: proxyUrl.href,\n port,\n host,\n err\n });\n throw err;\n }\n }\n }\n};\n\nmodule.exports = { proxyConnection };\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFjdGlvbi1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9pbWFwZmxvdy9saWIvcHJveHktY29ubmVjdGlvbi5qcyIsIm1hcHBpbmdzIjoiQUFBYTs7QUFFYix3QkFBd0IsbUJBQU8sQ0FBQyxtS0FBa0Q7QUFDbEYsUUFBUSxjQUFjLEVBQUUsbUJBQU8sQ0FBQyxtRUFBTztBQUN2QyxhQUFhLG1CQUFPLENBQUMsa0JBQU07QUFDM0I7QUFDQSxZQUFZLGdEQUF1QjtBQUNuQyxZQUFZLG1CQUFPLENBQUMsZ0JBQUs7O0FBRXpCO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQjtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsbUJBQW1CIiwic291cmNlcyI6WyIvaG9tZS9hbG1hL25leHRnZW4vTmVhaC1tYWlsL25vZGVfbW9kdWxlcy9pbWFwZmxvdy9saWIvcHJveHktY29ubmVjdGlvbi5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbmNvbnN0IGh0dHBQcm94eUNsaWVudCA9IHJlcXVpcmUoJ25vZGVtYWlsZXIvbGliL3NtdHAtY29ubmVjdGlvbi9odHRwLXByb3h5LWNsaWVudCcpO1xuY29uc3QgeyBTb2Nrc0NsaWVudCB9ID0gcmVxdWlyZSgnc29ja3MnKTtcbmNvbnN0IHV0aWwgPSByZXF1aXJlKCd1dGlsJyk7XG5jb25zdCBodHRwUHJveHlDbGllbnRBc3luYyA9IHV0aWwucHJvbWlzaWZ5KGh0dHBQcm94eUNsaWVudCk7XG5jb25zdCBkbnMgPSByZXF1aXJlKCdkbnMnKS5wcm9taXNlcztcbmNvbnN0IG5ldCA9IHJlcXVpcmUoJ25ldCcpO1xuXG5jb25zdCBwcm94eUNvbm5lY3Rpb24gPSBhc3luYyAobG9nZ2VyLCBjb25uZWN0aW9uVXJsLCBob3N0LCBwb3J0KSA9PiB7XG4gICAgbGV0IHByb3h5VXJsID0gbmV3IFVSTChjb25uZWN0aW9uVXJsKTtcblxuICAgIGxldCBwcm90b2NvbCA9IHByb3h5VXJsLnByb3RvY29sLnJlcGxhY2UoLzokLywgJycpLnRvTG93ZXJDYXNlKCk7XG5cbiAgICBpZiAoIW5ldC5pc0lQKGhvc3QpKSB7XG4gICAgICAgIGxldCByZXNvbHZlUmVzdWx0ID0gYXdhaXQgZG5zLnJlc29sdmUoaG9zdCk7XG4gICAgICAgIGlmIChyZXNvbHZlUmVzdWx0ICYmIHJlc29sdmVSZXN1bHQubGVuZ3RoKSB7XG4gICAgICAgICAgICBob3N0ID0gcmVzb2x2ZVJlc3VsdFswXTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHN3aXRjaCAocHJvdG9jb2wpIHtcbiAgICAgICAgLy8gQ29ubmVjdCB1c2luZyBhIEhUVFAgQ09OTkVDVCBtZXRob2RcbiAgICAgICAgY2FzZSAnaHR0cCc6XG4gICAgICAgIGNhc2UgJ2h0dHBzJzoge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBsZXQgc29ja2V0ID0gYXdhaXQgaHR0cFByb3h5Q2xpZW50QXN5bmMocHJveHlVcmwuaHJlZiwgcG9ydCwgaG9zdCk7XG4gICAgICAgICAgICAgICAgaWYgKHNvY2tldCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAocHJveHlVcmwucGFzc3dvcmQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb3h5VXJsLnBhc3N3b3JkID0gJyhoaWRkZW4pJztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbyh7XG4gICAgICAgICAgICAgICAgICAgICAgICBtc2c6ICdFc3RhYmxpc2hlZCBhIHNvY2tldCB2aWEgSFRUUCBwcm94eScsXG4gICAgICAgICAgICAgICAgICAgICAgICBwcm94eVVybDogcHJveHlVcmwuaHJlZixcbiAgICAgICAgICAgICAgICAgICAgICAgIHBvcnQsXG4gICAgICAgICAgICAgICAgICAgICAgICBob3N0XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gc29ja2V0O1xuICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgaWYgKHByb3h5VXJsLnBhc3N3b3JkKSB7XG4gICAgICAgICAgICAgICAgICAgIHByb3h5VXJsLnBhc3N3b3JkID0gJyhoaWRkZW4pJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKHtcbiAgICAgICAgICAgICAgICAgICAgbXNnOiAnRmFpbGVkIHRvIGVzdGFibGlzaCBhIHNvY2tldCB2aWEgSFRUUCBwcm94eScsXG4gICAgICAgICAgICAgICAgICAgIHByb3h5VXJsOiBwcm94eVVybC5ocmVmLFxuICAgICAgICAgICAgICAgICAgICBwb3J0LFxuICAgICAgICAgICAgICAgICAgICBob3N0LFxuICAgICAgICAgICAgICAgICAgICBlcnJcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTT0NLUyBwcm94eVxuICAgICAgICBjYXNlICdzb2Nrcyc6XG4gICAgICAgIGNhc2UgJ3NvY2tzNSc6XG4gICAgICAgIGNhc2UgJ3NvY2tzNCc6XG4gICAgICAgIGNhc2UgJ3NvY2tzNGEnOiB7XG4gICAgICAgICAgICBsZXQgcHJveHlUeXBlID0gTnVtYmVyKHByb3RvY29sLnJlcGxhY2UoL1xcRC9nLCAnJykpIHx8IDU7XG5cbiAgICAgICAgICAgIGxldCB0YXJnZXRIb3N0ID0gcHJveHlVcmwuaG9zdG5hbWU7XG4gICAgICAgICAgICBpZiAoIW5ldC5pc0lQKHRhcmdldEhvc3QpKSB7XG4gICAgICAgICAgICAgICAgbGV0IHJlc29sdmVSZXN1bHQgPSBhd2FpdCBkbnMucmVzb2x2ZSh0YXJnZXRIb3N0KTtcbiAgICAgICAgICAgICAgICBpZiAocmVzb2x2ZVJlc3VsdCAmJiByZXNvbHZlUmVzdWx0Lmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICB0YXJnZXRIb3N0ID0gcmVzb2x2ZVJlc3VsdFswXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxldCBjb25uZWN0aW9uT3B0cyA9IHtcbiAgICAgICAgICAgICAgICBwcm94eToge1xuICAgICAgICAgICAgICAgICAgICBob3N0OiB0YXJnZXRIb3N0LFxuICAgICAgICAgICAgICAgICAgICBwb3J0OiBOdW1iZXIocHJveHlVcmwucG9ydCkgfHwgMTA4MCxcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogcHJveHlUeXBlXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBkZXN0aW5hdGlvbjoge1xuICAgICAgICAgICAgICAgICAgICBob3N0LFxuICAgICAgICAgICAgICAgICAgICBwb3J0XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBjb21tYW5kOiAnY29ubmVjdCcsXG4gICAgICAgICAgICAgICAgc2V0X3RjcF9ub2RlbGF5OiB0cnVlXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBpZiAocHJveHlVcmwudXNlcm5hbWUgfHwgcHJveHlVcmwucGFzc3dvcmQpIHtcbiAgICAgICAgICAgICAgICBjb25uZWN0aW9uT3B0cy5wcm94eS51c2VySWQgPSBwcm94eVVybC51c2VybmFtZTtcbiAgICAgICAgICAgICAgICBjb25uZWN0aW9uT3B0cy5wcm94eS5wYXNzd29yZCA9IHByb3h5VXJsLnBhc3N3b3JkO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGluZm8gPSBhd2FpdCBTb2Nrc0NsaWVudC5jcmVhdGVDb25uZWN0aW9uKGNvbm5lY3Rpb25PcHRzKTtcbiAgICAgICAgICAgICAgICBpZiAoaW5mbyAmJiBpbmZvLnNvY2tldCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAocHJveHlVcmwucGFzc3dvcmQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb3h5VXJsLnBhc3N3b3JkID0gJyhoaWRkZW4pJztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbyh7XG4gICAgICAgICAgICAgICAgICAgICAgICBtc2c6ICdFc3RhYmxpc2hlZCBhIHNvY2tldCB2aWEgU09DS1MgcHJveHknLFxuICAgICAgICAgICAgICAgICAgICAgICAgcHJveHlVcmw6IHByb3h5VXJsLmhyZWYsXG4gICAgICAgICAgICAgICAgICAgICAgICBwb3J0LFxuICAgICAgICAgICAgICAgICAgICAgICAgaG9zdFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGluZm8uc29ja2V0O1xuICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgaWYgKHByb3h5VXJsLnBhc3N3b3JkKSB7XG4gICAgICAgICAgICAgICAgICAgIHByb3h5VXJsLnBhc3N3b3JkID0gJyhoaWRkZW4pJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKHtcbiAgICAgICAgICAgICAgICAgICAgbXNnOiAnRmFpbGVkIHRvIGVzdGFibGlzaCBhIHNvY2tldCB2aWEgU09DS1MgcHJveHknLFxuICAgICAgICAgICAgICAgICAgICBwcm94eVVybDogcHJveHlVcmwuaHJlZixcbiAgICAgICAgICAgICAgICAgICAgcG9ydCxcbiAgICAgICAgICAgICAgICAgICAgaG9zdCxcbiAgICAgICAgICAgICAgICAgICAgZXJyXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufTtcblxubW9kdWxlLmV4cG9ydHMgPSB7IHByb3h5Q29ubmVjdGlvbiB9O1xuIl0sIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6WzBdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(action-browser)/./node_modules/imapflow/lib/proxy-connection.js\n");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "(action-browser)/./node_modules/imapflow/lib/search-compiler.js":
|
|
/*!******************************************************!*\
|
|
!*** ./node_modules/imapflow/lib/search-compiler.js ***!
|
|
\******************************************************/
|
|
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
|
|
|
|
eval("\n\nconst { formatDate, formatFlag, canUseFlag } = __webpack_require__(/*! ./tools.js */ \"(action-browser)/./node_modules/imapflow/lib/tools.js\");\n\nlet setBoolOpt = (attributes, term, value) => {\n if (!value) {\n if (/^un/i.test(term)) {\n term = term.slice(2);\n } else {\n term = 'UN' + term;\n }\n }\n\n attributes.push({ type: 'ATOM', value: term.toUpperCase() });\n};\n\nlet setOpt = (attributes, term, value, type) => {\n type = type || 'ATOM';\n\n if (value === false || value === null) {\n attributes.push({ type, value: 'NOT' });\n }\n\n attributes.push({ type, value: term.toUpperCase() });\n\n if (Array.isArray(value)) {\n value.forEach(entry => attributes.push({ type, value: (entry || '').toString() }));\n } else {\n attributes.push({ type, value: value.toString() });\n }\n};\n\nlet processDateField = (attributes, term, value) => {\n let date = formatDate(value);\n if (!date) {\n return;\n }\n\n setOpt(attributes, term, date);\n};\n\nlet isUnicodeString = str => {\n if (!str || typeof str !== 'string') {\n return false;\n }\n\n return Buffer.byteLength(str) !== str.length;\n};\n\nmodule.exports.searchCompiler = (connection, query) => {\n const attributes = [];\n\n let hasUnicode = false;\n const mailbox = connection.mailbox;\n\n const walk = params => {\n Object.keys(params || {}).forEach(term => {\n switch (term.toUpperCase()) {\n case 'SEQ': // custom key for sequence range\n {\n let value = params[term];\n if (typeof value === 'number') {\n value = value.toString();\n }\n if (typeof value === 'string' && /^\\S+$/.test(value)) {\n attributes.push({ type: 'SEQUENCE', value });\n }\n }\n break;\n\n case 'ANSWERED':\n case 'DELETED':\n case 'DRAFT':\n case 'FLAGGED':\n case 'SEEN':\n case 'UNANSWERED':\n case 'UNDELETED':\n case 'UNDRAFT':\n case 'UNFLAGGED':\n case 'UNSEEN':\n // toggles UN-prefix for falsy values\n setBoolOpt(attributes, term, !!params[term]);\n break;\n\n case 'ALL':\n case 'NEW':\n case 'OLD':\n case 'RECENT':\n if (params[term]) {\n setBoolOpt(attributes, term, true);\n }\n break;\n\n case 'LARGER':\n case 'SMALLER':\n case 'MODSEQ':\n if (params[term]) {\n setOpt(attributes, term, params[term]);\n }\n break;\n\n case 'BCC':\n case 'BODY':\n case 'CC':\n case 'FROM':\n case 'SUBJECT':\n case 'TEXT':\n case 'TO':\n if (isUnicodeString(params[term])) {\n hasUnicode = true;\n }\n if (params[term]) {\n setOpt(attributes, term, params[term]);\n }\n break;\n\n case 'UID':\n if (params[term]) {\n setOpt(attributes, term, params[term], 'SEQUENCE');\n }\n break;\n\n case 'EMAILID':\n if (connection.capabilities.has('OBJECTID')) {\n setOpt(attributes, 'EMAILID', params[term]);\n } else if (connection.capabilities.has('X-GM-EXT-1')) {\n setOpt(attributes, 'X-GM-MSGID', params[term]);\n }\n break;\n\n case 'THREADID':\n if (connection.capabilities.has('OBJECTID')) {\n setOpt(attributes, 'THREADID', params[term]);\n } else if (connection.capabilities.has('X-GM-EXT-1')) {\n setOpt(attributes, 'X-GM-THRID', params[term]);\n }\n break;\n\n case 'GMRAW':\n case 'GMAILRAW': // alias for GMRAW\n if (connection.capabilities.has('X-GM-EXT-1')) {\n if (isUnicodeString(params[term])) {\n hasUnicode = true;\n }\n setOpt(attributes, 'X-GM-RAW', params[term]);\n } else {\n let error = new Error('Server does not support X-GM-EXT-1 extension required for X-GM-RAW');\n error.code = 'MissingServerExtension';\n throw error;\n }\n break;\n\n case 'BEFORE':\n case 'ON':\n case 'SINCE':\n case 'SENTBEFORE':\n case 'SENTON':\n case 'SENTSINCE':\n processDateField(attributes, term, params[term]);\n break;\n\n case 'KEYWORD':\n case 'UNKEYWORD':\n {\n let flag = formatFlag(params[term]);\n if (canUseFlag(mailbox, flag) || mailbox.flags.has(flag)) {\n setOpt(attributes, term, flag);\n }\n }\n break;\n\n case 'HEADER':\n if (params[term] && typeof params[term] === 'object') {\n Object.keys(params[term]).forEach(header => {\n let value = params[term][header];\n if (value === true) {\n value = '';\n }\n\n if (typeof value !== 'string') {\n return;\n }\n\n if (isUnicodeString(value)) {\n hasUnicode = true;\n }\n\n setOpt(attributes, term, [header.toUpperCase().trim(), value]);\n });\n }\n break;\n\n case 'OR':\n {\n if (!params[term] || !Array.isArray(params[term]) || !params[term].length) {\n break;\n }\n\n if (params[term].length === 1) {\n if (typeof params[term][0] === 'object' && params[term][0]) {\n walk(params[term][0]);\n }\n break;\n }\n\n // OR values has to be grouped by 2\n // OR conditional1 conditional2\n let genOrTree = list => {\n let group = false;\n let groups = [];\n\n list.forEach((entry, i) => {\n if (i % 2 === 0) {\n group = [entry];\n } else {\n group.push(entry);\n groups.push(group);\n group = false;\n }\n });\n\n if (group && group.length) {\n while (group.length === 1 && Array.isArray(group[0])) {\n group = group[0];\n }\n\n groups.push(group);\n }\n\n while (groups.length > 2) {\n groups = genOrTree(groups);\n }\n\n while (groups.length === 1 && Array.isArray(groups[0])) {\n groups = groups[0];\n }\n\n return groups;\n };\n\n let walkOrTree = entry => {\n if (Array.isArray(entry)) {\n if (entry.length > 1) {\n attributes.push({ type: 'ATOM', value: 'OR' });\n }\n entry.forEach(walkOrTree);\n return;\n }\n if (entry && typeof entry === 'object') {\n walk(entry);\n }\n };\n walkOrTree(genOrTree(params[term]));\n }\n break;\n }\n });\n };\n\n walk(query);\n\n if (hasUnicode && !connection.enabled.has('UTF8=ACCEPT')) {\n // Prepend search query with `CHARSET UTF-8`\n attributes.unshift({ type: 'ATOM', value: 'UTF-8' });\n attributes.unshift({ type: 'ATOM', value: 'CHARSET' });\n }\n\n return attributes;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFjdGlvbi1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9pbWFwZmxvdy9saWIvc2VhcmNoLWNvbXBpbGVyLmpzIiwibWFwcGluZ3MiOiJBQUFhOztBQUViLFFBQVEscUNBQXFDLEVBQUUsbUJBQU8sQ0FBQyx5RUFBWTs7QUFFbkU7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBOztBQUVBLHNCQUFzQix5Q0FBeUM7QUFDL0Q7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLDBCQUEwQixvQkFBb0I7QUFDOUM7O0FBRUEsc0JBQXNCLGlDQUFpQzs7QUFFdkQ7QUFDQSxpREFBaUQsdUNBQXVDO0FBQ3hGLE1BQU07QUFDTiwwQkFBMEIsK0JBQStCO0FBQ3pEO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUEsNkJBQTZCO0FBQzdCOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxnQ0FBZ0M7QUFDaEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhDQUE4Qyx5QkFBeUI7QUFDdkU7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQjtBQUN0QjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCO0FBQ3RCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQjtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSx5QkFBeUI7QUFDekI7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGtDQUFrQztBQUNsQztBQUNBO0FBQ0E7QUFDQTtBQUNBLDZCQUE2Qjs7QUFFN0I7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0Esc0RBQXNELDJCQUEyQjtBQUNqRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLDZCQUE2Qiw4QkFBOEI7QUFDM0QsNkJBQTZCLGdDQUFnQztBQUM3RDs7QUFFQTtBQUNBIiwic291cmNlcyI6WyIvaG9tZS9hbG1hL25leHRnZW4vTmVhaC1tYWlsL25vZGVfbW9kdWxlcy9pbWFwZmxvdy9saWIvc2VhcmNoLWNvbXBpbGVyLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcblxuY29uc3QgeyBmb3JtYXREYXRlLCBmb3JtYXRGbGFnLCBjYW5Vc2VGbGFnIH0gPSByZXF1aXJlKCcuL3Rvb2xzLmpzJyk7XG5cbmxldCBzZXRCb29sT3B0ID0gKGF0dHJpYnV0ZXMsIHRlcm0sIHZhbHVlKSA9PiB7XG4gICAgaWYgKCF2YWx1ZSkge1xuICAgICAgICBpZiAoL151bi9pLnRlc3QodGVybSkpIHtcbiAgICAgICAgICAgIHRlcm0gPSB0ZXJtLnNsaWNlKDIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGVybSA9ICdVTicgKyB0ZXJtO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYXR0cmlidXRlcy5wdXNoKHsgdHlwZTogJ0FUT00nLCB2YWx1ZTogdGVybS50b1VwcGVyQ2FzZSgpIH0pO1xufTtcblxubGV0IHNldE9wdCA9IChhdHRyaWJ1dGVzLCB0ZXJtLCB2YWx1ZSwgdHlwZSkgPT4ge1xuICAgIHR5cGUgPSB0eXBlIHx8ICdBVE9NJztcblxuICAgIGlmICh2YWx1ZSA9PT0gZmFsc2UgfHwgdmFsdWUgPT09IG51bGwpIHtcbiAgICAgICAgYXR0cmlidXRlcy5wdXNoKHsgdHlwZSwgdmFsdWU6ICdOT1QnIH0pO1xuICAgIH1cblxuICAgIGF0dHJpYnV0ZXMucHVzaCh7IHR5cGUsIHZhbHVlOiB0ZXJtLnRvVXBwZXJDYXNlKCkgfSk7XG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgdmFsdWUuZm9yRWFjaChlbnRyeSA9PiBhdHRyaWJ1dGVzLnB1c2goeyB0eXBlLCB2YWx1ZTogKGVudHJ5IHx8ICcnKS50b1N0cmluZygpIH0pKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBhdHRyaWJ1dGVzLnB1c2goeyB0eXBlLCB2YWx1ZTogdmFsdWUudG9TdHJpbmcoKSB9KTtcbiAgICB9XG59O1xuXG5sZXQgcHJvY2Vzc0RhdGVGaWVsZCA9IChhdHRyaWJ1dGVzLCB0ZXJtLCB2YWx1ZSkgPT4ge1xuICAgIGxldCBkYXRlID0gZm9ybWF0RGF0ZSh2YWx1ZSk7XG4gICAgaWYgKCFkYXRlKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBzZXRPcHQoYXR0cmlidXRlcywgdGVybSwgZGF0ZSk7XG59O1xuXG5sZXQgaXNVbmljb2RlU3RyaW5nID0gc3RyID0+IHtcbiAgICBpZiAoIXN0ciB8fCB0eXBlb2Ygc3RyICE9PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIEJ1ZmZlci5ieXRlTGVuZ3RoKHN0cikgIT09IHN0ci5sZW5ndGg7XG59O1xuXG5tb2R1bGUuZXhwb3J0cy5zZWFyY2hDb21waWxlciA9IChjb25uZWN0aW9uLCBxdWVyeSkgPT4ge1xuICAgIGNvbnN0IGF0dHJpYnV0ZXMgPSBbXTtcblxuICAgIGxldCBoYXNVbmljb2RlID0gZmFsc2U7XG4gICAgY29uc3QgbWFpbGJveCA9IGNvbm5lY3Rpb24ubWFpbGJveDtcblxuICAgIGNvbnN0IHdhbGsgPSBwYXJhbXMgPT4ge1xuICAgICAgICBPYmplY3Qua2V5cyhwYXJhbXMgfHwge30pLmZvckVhY2godGVybSA9PiB7XG4gICAgICAgICAgICBzd2l0Y2ggKHRlcm0udG9VcHBlckNhc2UoKSkge1xuICAgICAgICAgICAgICAgIGNhc2UgJ1NFUSc6IC8vIGN1c3RvbSBrZXkgZm9yIHNlcXVlbmNlIHJhbmdlXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB2YWx1ZSA9IHBhcmFtc1t0ZXJtXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS50b1N0cmluZygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgJiYgL15cXFMrJC8udGVzdCh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzLnB1c2goeyB0eXBlOiAnU0VRVUVOQ0UnLCB2YWx1ZSB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgIGNhc2UgJ0FOU1dFUkVEJzpcbiAgICAgICAgICAgICAgICBjYXNlICdERUxFVEVEJzpcbiAgICAgICAgICAgICAgICBjYXNlICdEUkFGVCc6XG4gICAgICAgICAgICAgICAgY2FzZSAnRkxBR0dFRCc6XG4gICAgICAgICAgICAgICAgY2FzZSAnU0VFTic6XG4gICAgICAgICAgICAgICAgY2FzZSAnVU5BTlNXRVJFRCc6XG4gICAgICAgICAgICAgICAgY2FzZSAnVU5ERUxFVEVEJzpcbiAgICAgICAgICAgICAgICBjYXNlICdVTkRSQUZUJzpcbiAgICAgICAgICAgICAgICBjYXNlICdVTkZMQUdHRUQnOlxuICAgICAgICAgICAgICAgIGNhc2UgJ1VOU0VFTic6XG4gICAgICAgICAgICAgICAgICAgIC8vIHRvZ2dsZXMgVU4tcHJlZml4IGZvciBmYWxzeSB2YWx1ZXNcbiAgICAgICAgICAgICAgICAgICAgc2V0Qm9vbE9wdChhdHRyaWJ1dGVzLCB0ZXJtLCAhIXBhcmFtc1t0ZXJtXSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgY2FzZSAnQUxMJzpcbiAgICAgICAgICAgICAgICBjYXNlICdORVcnOlxuICAgICAgICAgICAgICAgIGNhc2UgJ09MRCc6XG4gICAgICAgICAgICAgICAgY2FzZSAnUkVDRU5UJzpcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmFtc1t0ZXJtXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2V0Qm9vbE9wdChhdHRyaWJ1dGVzLCB0ZXJtLCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgIGNhc2UgJ0xBUkdFUic6XG4gICAgICAgICAgICAgICAgY2FzZSAnU01BTExFUic6XG4gICAgICAgICAgICAgICAgY2FzZSAnTU9EU0VRJzpcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmFtc1t0ZXJtXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2V0T3B0KGF0dHJpYnV0ZXMsIHRlcm0sIHBhcmFtc1t0ZXJtXSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgICBjYXNlICdCQ0MnOlxuICAgICAgICAgICAgICAgIGNhc2UgJ0JPRFknOlxuICAgICAgICAgICAgICAgIGNhc2UgJ0NDJzpcbiAgICAgICAgICAgICAgICBjYXNlICdGUk9NJzpcbiAgICAgICAgICAgICAgICBjYXNlICdTVUJKRUNUJzpcbiAgICAgICAgICAgICAgICBjYXNlICdURVhUJzpcbiAgICAgICAgICAgICAgICBjYXNlICdUTyc6XG4gICAgICAgICAgICAgICAgICAgIGlmIChpc1VuaWNvZGVTdHJpbmcocGFyYW1zW3Rlcm1dKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaGFzVW5pY29kZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmFtc1t0ZXJtXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2V0T3B0KGF0dHJpYnV0ZXMsIHRlcm0sIHBhcmFtc1t0ZXJtXSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgICBjYXNlICdVSUQnOlxuICAgICAgICAgICAgICAgICAgICBpZiAocGFyYW1zW3Rlcm1dKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRPcHQoYXR0cmlidXRlcywgdGVybSwgcGFyYW1zW3Rlcm1dLCAnU0VRVUVOQ0UnKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgIGNhc2UgJ0VNQUlMSUQnOlxuICAgICAgICAgICAgICAgICAgICBpZiAoY29ubmVjdGlvbi5jYXBhYmlsaXRpZXMuaGFzKCdPQkpFQ1RJRCcpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRPcHQoYXR0cmlidXRlcywgJ0VNQUlMSUQnLCBwYXJhbXNbdGVybV0pO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNvbm5lY3Rpb24uY2FwYWJpbGl0aWVzLmhhcygnWC1HTS1FWFQtMScpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRPcHQoYXR0cmlidXRlcywgJ1gtR00tTVNHSUQnLCBwYXJhbXNbdGVybV0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgY2FzZSAnVEhSRUFESUQnOlxuICAgICAgICAgICAgICAgICAgICBpZiAoY29ubmVjdGlvbi5jYXBhYmlsaXRpZXMuaGFzKCdPQkpFQ1RJRCcpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRPcHQoYXR0cmlidXRlcywgJ1RIUkVBRElEJywgcGFyYW1zW3Rlcm1dKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjb25uZWN0aW9uLmNhcGFiaWxpdGllcy5oYXMoJ1gtR00tRVhULTEnKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2V0T3B0KGF0dHJpYnV0ZXMsICdYLUdNLVRIUklEJywgcGFyYW1zW3Rlcm1dKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgIGNhc2UgJ0dNUkFXJzpcbiAgICAgICAgICAgICAgICBjYXNlICdHTUFJTFJBVyc6IC8vIGFsaWFzIGZvciBHTVJBV1xuICAgICAgICAgICAgICAgICAgICBpZiAoY29ubmVjdGlvbi5jYXBhYmlsaXRpZXMuaGFzKCdYLUdNLUVYVC0xJykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc1VuaWNvZGVTdHJpbmcocGFyYW1zW3Rlcm1dKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc1VuaWNvZGUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgc2V0T3B0KGF0dHJpYnV0ZXMsICdYLUdNLVJBVycsIHBhcmFtc1t0ZXJtXSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgZXJyb3IgPSBuZXcgRXJyb3IoJ1NlcnZlciBkb2VzIG5vdCBzdXBwb3J0IFgtR00tRVhULTEgZXh0ZW5zaW9uIHJlcXVpcmVkIGZvciBYLUdNLVJBVycpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IuY29kZSA9ICdNaXNzaW5nU2VydmVyRXh0ZW5zaW9uJztcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgY2FzZSAnQkVGT1JFJzpcbiAgICAgICAgICAgICAgICBjYXNlICdPTic6XG4gICAgICAgICAgICAgICAgY2FzZSAnU0lOQ0UnOlxuICAgICAgICAgICAgICAgIGNhc2UgJ1NFTlRCRUZPUkUnOlxuICAgICAgICAgICAgICAgIGNhc2UgJ1NFTlRPTic6XG4gICAgICAgICAgICAgICAgY2FzZSAnU0VOVFNJTkNFJzpcbiAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc0RhdGVGaWVsZChhdHRyaWJ1dGVzLCB0ZXJtLCBwYXJhbXNbdGVybV0pO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgIGNhc2UgJ0tFWVdPUkQnOlxuICAgICAgICAgICAgICAgIGNhc2UgJ1VOS0VZV09SRCc6XG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBmbGFnID0gZm9ybWF0RmxhZyhwYXJhbXNbdGVybV0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNhblVzZUZsYWcobWFpbGJveCwgZmxhZykgfHwgbWFpbGJveC5mbGFncy5oYXMoZmxhZykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRPcHQoYXR0cmlidXRlcywgdGVybSwgZmxhZyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgICBjYXNlICdIRUFERVInOlxuICAgICAgICAgICAgICAgICAgICBpZiAocGFyYW1zW3Rlcm1dICYmIHR5cGVvZiBwYXJhbXNbdGVybV0gPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBPYmplY3Qua2V5cyhwYXJhbXNbdGVybV0pLmZvckVhY2goaGVhZGVyID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgdmFsdWUgPSBwYXJhbXNbdGVybV1baGVhZGVyXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSAnJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzVW5pY29kZVN0cmluZyh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzVW5pY29kZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0T3B0KGF0dHJpYnV0ZXMsIHRlcm0sIFtoZWFkZXIudG9VcHBlckNhc2UoKS50cmltKCksIHZhbHVlXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgIGNhc2UgJ09SJzpcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwYXJhbXNbdGVybV0gfHwgIUFycmF5LmlzQXJyYXkocGFyYW1zW3Rlcm1dKSB8fCAhcGFyYW1zW3Rlcm1dLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyYW1zW3Rlcm1dLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgcGFyYW1zW3Rlcm1dWzBdID09PSAnb2JqZWN0JyAmJiBwYXJhbXNbdGVybV1bMF0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FsayhwYXJhbXNbdGVybV1bMF0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gT1IgdmFsdWVzIGhhcyB0byBiZSBncm91cGVkIGJ5IDJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIE9SIGNvbmRpdGlvbmFsMSBjb25kaXRpb25hbDJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBnZW5PclRyZWUgPSBsaXN0ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZ3JvdXAgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZ3JvdXBzID0gW107XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0LmZvckVhY2goKGVudHJ5LCBpKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpICUgMiA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXAgPSBbZW50cnldO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXAucHVzaChlbnRyeSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncm91cHMucHVzaChncm91cCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncm91cCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZ3JvdXAgJiYgZ3JvdXAubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChncm91cC5sZW5ndGggPT09IDEgJiYgQXJyYXkuaXNBcnJheShncm91cFswXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwID0gZ3JvdXBbMF07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncm91cHMucHVzaChncm91cCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGdyb3Vwcy5sZW5ndGggPiAyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwcyA9IGdlbk9yVHJlZShncm91cHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChncm91cHMubGVuZ3RoID09PSAxICYmIEFycmF5LmlzQXJyYXkoZ3JvdXBzWzBdKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncm91cHMgPSBncm91cHNbMF07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdyb3VwcztcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB3YWxrT3JUcmVlID0gZW50cnkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGVudHJ5KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZW50cnkubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlcy5wdXNoKHsgdHlwZTogJ0FUT00nLCB2YWx1ZTogJ09SJyB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeS5mb3JFYWNoKHdhbGtPclRyZWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbnRyeSAmJiB0eXBlb2YgZW50cnkgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhbGsoZW50cnkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICB3YWxrT3JUcmVlKGdlbk9yVHJlZShwYXJhbXNbdGVybV0pKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfTtcblxuICAgIHdhbGsocXVlcnkpO1xuXG4gICAgaWYgKGhhc1VuaWNvZGUgJiYgIWNvbm5lY3Rpb24uZW5hYmxlZC5oYXMoJ1VURjg9QUNDRVBUJykpIHtcbiAgICAgICAgLy8gUHJlcGVuZCBzZWFyY2ggcXVlcnkgd2l0aCBgQ0hBUlNFVCBVVEYtOGBcbiAgICAgICAgYXR0cmlidXRlcy51bnNoaWZ0KHsgdHlwZTogJ0FUT00nLCB2YWx1ZTogJ1VURi04JyB9KTtcbiAgICAgICAgYXR0cmlidXRlcy51bnNoaWZ0KHsgdHlwZTogJ0FUT00nLCB2YWx1ZTogJ0NIQVJTRVQnIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBhdHRyaWJ1dGVzO1xufTtcbiJdLCJuYW1lcyI6W10sImlnbm9yZUxpc3QiOlswXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(action-browser)/./node_modules/imapflow/lib/search-compiler.js\n");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "(action-browser)/./node_modules/imapflow/lib/special-use.js":
|
|
/*!**************************************************!*\
|
|
!*** ./node_modules/imapflow/lib/special-use.js ***!
|
|
\**************************************************/
|
|
/***/ ((module) => {
|
|
|
|
eval("\n\nmodule.exports = {\n flags: ['\\\\All', '\\\\Archive', '\\\\Drafts', '\\\\Flagged', '\\\\Junk', '\\\\Sent', '\\\\Trash'],\n names: {\n '\\\\Sent': [\n 'aika',\n 'bidaliak',\n 'bidalita',\n 'dihantar',\n 'e rometsweng',\n 'e tindami',\n 'elküldött',\n 'elküldöttek',\n 'elementos enviados',\n 'éléments envoyés',\n 'enviadas',\n 'enviadas',\n 'enviados',\n 'enviats',\n 'envoyés',\n 'ethunyelweyo',\n 'expediate',\n 'ezipuru',\n 'gesendete',\n 'gesendete elemente',\n 'gestuur',\n 'gönderilmiş öğeler',\n 'göndərilənlər',\n 'iberilen',\n 'inviati',\n 'išsiųstieji',\n 'kuthunyelwe',\n 'lasa',\n 'lähetetyt',\n 'messages envoyés',\n 'naipadala',\n 'nalefa',\n 'napadala',\n 'nosūtītās ziņas',\n 'odeslané',\n 'odeslaná pošta',\n 'padala',\n 'poslane',\n 'poslano',\n 'poslano',\n 'poslané',\n 'poslato',\n 'saadetud',\n 'saadetud kirjad',\n 'saadetud üksused',\n 'sendt',\n 'sendt',\n 'sent',\n 'sent items',\n 'sent messages',\n 'sända poster',\n 'sänt',\n 'terkirim',\n 'ti fi ranṣẹ',\n 'të dërguara',\n 'verzonden',\n 'vilivyotumwa',\n 'wysłane',\n 'đã gửi',\n 'σταλθέντα',\n 'жиберилген',\n 'жіберілгендер',\n 'изпратени',\n 'илгээсэн',\n 'ирсол шуд',\n 'испратено',\n 'надіслані',\n 'отправленные',\n 'пасланыя',\n 'юборилган',\n 'ուղարկված',\n 'נשלחו',\n 'פריטים שנשלחו',\n 'المرسلة',\n 'بھیجے گئے',\n 'سوزمژہ',\n 'لېګل شوی',\n 'موارد ارسال شده',\n 'पाठविले',\n 'पाठविलेले',\n 'प्रेषित',\n 'भेजा गया',\n 'প্রেরিত',\n 'প্রেরিত',\n 'প্ৰেৰিত',\n 'ਭੇਜੇ',\n 'મોકલેલા',\n 'ପଠାଗଲା',\n 'அனுப்பியவை',\n 'పంపించబడింది',\n 'ಕಳುಹಿಸಲಾದ',\n 'അയച്ചു',\n 'යැවු පණිවුඩ',\n 'ส่งแล้ว',\n 'გაგზავნილი',\n 'የተላኩ',\n 'បានផ្ញើ',\n '寄件備份',\n '寄件備份',\n '已发信息',\n '送信済みメール',\n '발신 메시지',\n '보낸 편지함'\n ],\n '\\\\Trash': [\n 'articole șterse',\n 'bin',\n 'borttagna objekt',\n 'deleted',\n 'deleted items',\n 'deleted messages',\n 'elementi eliminati',\n 'elementos borrados',\n 'elementos eliminados',\n 'gelöschte objekte',\n 'gelöschte elemente',\n 'item dipadam',\n 'itens apagados',\n 'itens excluídos',\n 'kustutatud üksused',\n 'mục đã xóa',\n 'odstraněné položky',\n 'odstraněná pošta',\n 'pesan terhapus',\n 'poistetut',\n 'praht',\n 'prügikast',\n 'silinmiş öğeler',\n 'slettede beskeder',\n 'slettede elementer',\n 'trash',\n 'törölt elemek',\n 'törölt',\n 'usunięte wiadomości',\n 'verwijderde items',\n 'vymazané správy',\n 'éléments supprimés',\n 'видалені',\n 'жойылғандар',\n 'удаленные',\n 'פריטים שנמחקו',\n 'العناصر المحذوفة',\n 'موارد حذف شده',\n 'รายการที่ลบ',\n '已删除邮件',\n '已刪除項目',\n '已刪除項目'\n ],\n '\\\\Junk': [\n 'bulk mail',\n 'correo no deseado',\n 'courrier indésirable',\n 'istenmeyen',\n 'istenmeyen e-posta',\n 'junk',\n 'junk e-mail',\n 'junk email',\n 'junk-e-mail',\n 'levélszemét',\n 'nevyžiadaná pošta',\n 'nevyžádaná pošta',\n 'no deseado',\n 'posta indesiderata',\n 'pourriel',\n 'roskaposti',\n 'rämpspost',\n 'skräppost',\n 'spam',\n 'spam',\n 'spamowanie',\n 'søppelpost',\n 'thư rác',\n 'wiadomości-śmieci',\n 'спам',\n 'דואר זבל',\n 'الرسائل العشوائية',\n 'هرزنامه',\n 'สแปม',\n '垃圾郵件',\n '垃圾邮件',\n '垃圾電郵'\n ],\n '\\\\Drafts': [\n 'ba brouillon',\n 'borrador',\n 'borrador',\n 'borradores',\n 'bozze',\n 'brouillons',\n 'bản thảo',\n 'ciorne',\n 'concepten',\n 'draf',\n 'draft',\n 'drafts',\n 'drög',\n 'entwürfe',\n 'esborranys',\n 'garalamalar',\n 'ihe edeturu',\n 'iidrafti',\n 'izinhlaka',\n 'juodraščiai',\n 'kladd',\n 'kladder',\n 'koncepty',\n 'koncepty',\n 'konsep',\n 'konsepte',\n 'kopie robocze',\n 'layihələr',\n 'luonnokset',\n 'melnraksti',\n 'meralo',\n 'mesazhe të padërguara',\n 'mga draft',\n 'mustandid',\n 'nacrti',\n 'nacrti',\n 'osnutki',\n 'piszkozatok',\n 'rascunhos',\n 'rasimu',\n 'skice',\n 'taslaklar',\n 'tsararrun saƙonni',\n 'utkast',\n 'vakiraoka',\n 'vázlatok',\n 'zirriborroak',\n 'àwọn àkọpamọ́',\n 'πρόχειρα',\n 'жобалар',\n 'нацрти',\n 'нооргууд',\n 'сиёҳнавис',\n 'хомаки хатлар',\n 'чарнавікі',\n 'чернетки',\n 'чернови',\n 'черновики',\n 'черновиктер',\n 'սևագրեր',\n 'טיוטות',\n 'مسودات',\n 'مسودات',\n 'موسودې',\n 'پیش نویسها',\n 'ڈرافٹ/',\n 'ड्राफ़्ट',\n 'प्रारूप',\n 'খসড়া',\n 'খসড়া',\n 'ড্ৰাফ্ট',\n 'ਡ੍ਰਾਫਟ',\n 'ડ્રાફ્ટસ',\n 'ଡ୍ରାଫ୍ଟ',\n 'வரைவுகள்',\n 'చిత్తు ప్రతులు',\n 'ಕರಡುಗಳು',\n 'കരടുകള്',\n 'කෙටුම් පත්',\n 'ฉบับร่าง',\n 'მონახაზები',\n 'ረቂቆች',\n 'សារព្រាង',\n '下書き',\n '草稿',\n '草稿',\n '草稿',\n '임시 보관함'\n ],\n\n '\\\\Archive': ['archive']\n },\n\n specialUse(hasSpecialUseExtension, folder) {\n let result;\n\n if (hasSpecialUseExtension) {\n result = {\n flag: module.exports.flags.find(flag => folder.flags.has(flag)),\n source: 'extension'\n };\n }\n\n if (!result || !result.flag) {\n let name = folder.name\n .toLowerCase()\n .replace(/\\u200e/g, '')\n .trim();\n\n result = {\n flag: Object.keys(module.exports.names).find(flag => module.exports.names[flag].includes(name)),\n source: 'name'\n };\n }\n\n return result && result.flag ? result : { flag: null };\n }\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFjdGlvbi1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9pbWFwZmxvdy9saWIvc3BlY2lhbC11c2UuanMiLCJtYXBwaW5ncyI6IkFBQWE7O0FBRWI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsa0RBQWtEO0FBQ2xEO0FBQ0EiLCJzb3VyY2VzIjpbIi9ob21lL2FsbWEvbmV4dGdlbi9OZWFoLW1haWwvbm9kZV9tb2R1bGVzL2ltYXBmbG93L2xpYi9zcGVjaWFsLXVzZS5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICAgIGZsYWdzOiBbJ1xcXFxBbGwnLCAnXFxcXEFyY2hpdmUnLCAnXFxcXERyYWZ0cycsICdcXFxcRmxhZ2dlZCcsICdcXFxcSnVuaycsICdcXFxcU2VudCcsICdcXFxcVHJhc2gnXSxcbiAgICBuYW1lczoge1xuICAgICAgICAnXFxcXFNlbnQnOiBbXG4gICAgICAgICAgICAnYWlrYScsXG4gICAgICAgICAgICAnYmlkYWxpYWsnLFxuICAgICAgICAgICAgJ2JpZGFsaXRhJyxcbiAgICAgICAgICAgICdkaWhhbnRhcicsXG4gICAgICAgICAgICAnZSByb21ldHN3ZW5nJyxcbiAgICAgICAgICAgICdlIHRpbmRhbWknLFxuICAgICAgICAgICAgJ2Vsa8O8bGTDtnR0JyxcbiAgICAgICAgICAgICdlbGvDvGxkw7Z0dGVrJyxcbiAgICAgICAgICAgICdlbGVtZW50b3MgZW52aWFkb3MnLFxuICAgICAgICAgICAgJ8OpbMOpbWVudHMgZW52b3nDqXMnLFxuICAgICAgICAgICAgJ2VudmlhZGFzJyxcbiAgICAgICAgICAgICdlbnZpYWRhcycsXG4gICAgICAgICAgICAnZW52aWFkb3MnLFxuICAgICAgICAgICAgJ2VudmlhdHMnLFxuICAgICAgICAgICAgJ2Vudm95w6lzJyxcbiAgICAgICAgICAgICdldGh1bnllbHdleW8nLFxuICAgICAgICAgICAgJ2V4cGVkaWF0ZScsXG4gICAgICAgICAgICAnZXppcHVydScsXG4gICAgICAgICAgICAnZ2VzZW5kZXRlJyxcbiAgICAgICAgICAgICdnZXNlbmRldGUgZWxlbWVudGUnLFxuICAgICAgICAgICAgJ2dlc3R1dXInLFxuICAgICAgICAgICAgJ2fDtm5kZXJpbG1pxZ8gw7bEn2VsZXInLFxuICAgICAgICAgICAgJ2fDtm5kyZlyaWzJmW5syZlyJyxcbiAgICAgICAgICAgICdpYmVyaWxlbicsXG4gICAgICAgICAgICAnaW52aWF0aScsXG4gICAgICAgICAgICAnacWhc2nFs3N0aWVqaScsXG4gICAgICAgICAgICAna3V0aHVueWVsd2UnLFxuICAgICAgICAgICAgJ2xhc2EnLFxuICAgICAgICAgICAgJ2zDpGhldGV0eXQnLFxuICAgICAgICAgICAgJ21lc3NhZ2VzIGVudm95w6lzJyxcbiAgICAgICAgICAgICduYWlwYWRhbGEnLFxuICAgICAgICAgICAgJ25hbGVmYScsXG4gICAgICAgICAgICAnbmFwYWRhbGEnLFxuICAgICAgICAgICAgJ25vc8WrdMSrdMSBcyB6acWGYXMnLFxuICAgICAgICAgICAgJ29kZXNsYW7DqScsXG4gICAgICAgICAgICAnb2Rlc2xhbsOhIHBvxaF0YScsXG4gICAgICAgICAgICAncGFkYWxhJyxcbiAgICAgICAgICAgICdwb3NsYW5lJyxcbiAgICAgICAgICAgICdwb3NsYW5vJyxcbiAgICAgICAgICAgICdwb3NsYW5vJyxcbiAgICAgICAgICAgICdwb3NsYW7DqScsXG4gICAgICAgICAgICAncG9zbGF0bycsXG4gICAgICAgICAgICAnc2FhZGV0dWQnLFxuICAgICAgICAgICAgJ3NhYWRldHVkIGtpcmphZCcsXG4gICAgICAgICAgICAnc2FhZGV0dWQgw7xrc3VzZWQnLFxuICAgICAgICAgICAgJ3NlbmR0JyxcbiAgICAgICAgICAgICdzZW5kdCcsXG4gICAgICAgICAgICAnc2VudCcsXG4gICAgICAgICAgICAnc2VudCBpdGVtcycsXG4gICAgICAgICAgICAnc2VudCBtZXNzYWdlcycsXG4gICAgICAgICAgICAnc8OkbmRhIHBvc3RlcicsXG4gICAgICAgICAgICAnc8OkbnQnLFxuICAgICAgICAgICAgJ3RlcmtpcmltJyxcbiAgICAgICAgICAgICd0aSBmaSByYW7huaPhurknLFxuICAgICAgICAgICAgJ3TDqyBkw6tyZ3VhcmEnLFxuICAgICAgICAgICAgJ3ZlcnpvbmRlbicsXG4gICAgICAgICAgICAndmlsaXZ5b3R1bXdhJyxcbiAgICAgICAgICAgICd3eXPFgmFuZScsXG4gICAgICAgICAgICAnxJHDoyBn4butaScsXG4gICAgICAgICAgICAnz4PPhM6xzrvOuM6tzr3PhM6xJyxcbiAgICAgICAgICAgICfQttC40LHQtdGA0LjQu9Cz0LXQvScsXG4gICAgICAgICAgICAn0LbRltCx0LXRgNGW0LvQs9C10L3QtNC10YAnLFxuICAgICAgICAgICAgJ9C40LfQv9GA0LDRgtC10L3QuCcsXG4gICAgICAgICAgICAn0LjQu9Cz0Y3RjdGB0Y3QvScsXG4gICAgICAgICAgICAn0LjRgNGB0L7QuyDRiNGD0LQnLFxuICAgICAgICAgICAgJ9C40YHQv9GA0LDRgtC10L3QvicsXG4gICAgICAgICAgICAn0L3QsNC00ZbRgdC70LDQvdGWJyxcbiAgICAgICAgICAgICfQvtGC0L/RgNCw0LLQu9C10L3QvdGL0LUnLFxuICAgICAgICAgICAgJ9C/0LDRgdC70LDQvdGL0Y8nLFxuICAgICAgICAgICAgJ9GO0LHQvtGA0LjQu9Cz0LDQvScsXG4gICAgICAgICAgICAn1bjWgtWy1aHWgNWv1b7VodWuJyxcbiAgICAgICAgICAgICfXoNep15zXl9eVJyxcbiAgICAgICAgICAgICfXpNeo15nXmNeZ150g16nXoNep15zXl9eVJyxcbiAgICAgICAgICAgICfYp9mE2YXYsdiz2YTYqScsXG4gICAgICAgICAgICAn2KjavtuM2KzbkiDar9im25InLFxuICAgICAgICAgICAgJ9iz2YjYstmF2pjbgScsXG4gICAgICAgICAgICAn2YTbkNqr2YQg2LTZiNuMJyxcbiAgICAgICAgICAgICfZhdmI2KfYsdivINin2LHYs9in2YQg2LTYr9mHJyxcbiAgICAgICAgICAgICfgpKrgpL7gpKDgpLXgpL/gpLLgpYcnLFxuICAgICAgICAgICAgJ+CkquCkvuCkoOCkteCkv+CksuClh+CksuClhycsXG4gICAgICAgICAgICAn4KSq4KWN4KSw4KWH4KS34KS/4KSkJyxcbiAgICAgICAgICAgICfgpK3gpYfgpJzgpL4g4KSX4KSv4KS+JyxcbiAgICAgICAgICAgICfgpqrgp43gprDgp4fgprDgpr/gpqQnLFxuICAgICAgICAgICAgJ+CmquCnjeCmsOCnh+CmsOCmv+CmpCcsXG4gICAgICAgICAgICAn4Kaq4KeN4Kew4KeH4Kew4Ka/4KakJyxcbiAgICAgICAgICAgICfgqK3gqYfgqJzgqYcnLFxuICAgICAgICAgICAgJ+CqruCri+CqleCqsuCrh+CqsuCqvicsXG4gICAgICAgICAgICAn4Kyq4Kyg4Ky+4KyX4Kyy4Ky+JyxcbiAgICAgICAgICAgICfgroXgrqngr4Hgrqrgr43grqrgrr/grq/grrXgr4gnLFxuICAgICAgICAgICAgJ+CwquCwguCwquCwv+CwguCwmuCwrOCwoeCwv+CwguCwpuCwvycsXG4gICAgICAgICAgICAn4LKV4LKz4LOB4LK54LK/4LK44LKy4LK+4LKmJyxcbiAgICAgICAgICAgICfgtIXgtK/gtJrgtY3gtJrgtYEnLFxuICAgICAgICAgICAgJ+C2uuC3kOC3gOC3lCDgtrTgtqvgt5Lgt4Dgt5TgtqknLFxuICAgICAgICAgICAgJ+C4quC5iOC4h+C5geC4peC5ieC4pycsXG4gICAgICAgICAgICAn4YOS4YOQ4YOS4YOW4YOQ4YOV4YOc4YOY4YOa4YOYJyxcbiAgICAgICAgICAgICfhi6jhibDhiIvhiqknLFxuICAgICAgICAgICAgJ+GelOGetuGek+KAi+GeleGfkuGeieGevicsXG4gICAgICAgICAgICAn5a+E5Lu25YKZ5Lu9JyxcbiAgICAgICAgICAgICflr4Tku7blgpnku70nLFxuICAgICAgICAgICAgJ+W3suWPkeS/oeaBrycsXG4gICAgICAgICAgICAn6YCB5L+h5riI44G/776S772w776ZJyxcbiAgICAgICAgICAgICfrsJzsi6Ag66mU7Iuc7KeAJyxcbiAgICAgICAgICAgICfrs7Trgrgg7Y647KeA7ZWoJ1xuICAgICAgICBdLFxuICAgICAgICAnXFxcXFRyYXNoJzogW1xuICAgICAgICAgICAgJ2FydGljb2xlIMiZdGVyc2UnLFxuICAgICAgICAgICAgJ2JpbicsXG4gICAgICAgICAgICAnYm9ydHRhZ25hIG9iamVrdCcsXG4gICAgICAgICAgICAnZGVsZXRlZCcsXG4gICAgICAgICAgICAnZGVsZXRlZCBpdGVtcycsXG4gICAgICAgICAgICAnZGVsZXRlZCBtZXNzYWdlcycsXG4gICAgICAgICAgICAnZWxlbWVudGkgZWxpbWluYXRpJyxcbiAgICAgICAgICAgICdlbGVtZW50b3MgYm9ycmFkb3MnLFxuICAgICAgICAgICAgJ2VsZW1lbnRvcyBlbGltaW5hZG9zJyxcbiAgICAgICAgICAgICdnZWzDtnNjaHRlIG9iamVrdGUnLFxuICAgICAgICAgICAgJ2dlbMO2c2NodGUgZWxlbWVudGUnLFxuICAgICAgICAgICAgJ2l0ZW0gZGlwYWRhbScsXG4gICAgICAgICAgICAnaXRlbnMgYXBhZ2Fkb3MnLFxuICAgICAgICAgICAgJ2l0ZW5zIGV4Y2x1w61kb3MnLFxuICAgICAgICAgICAgJ2t1c3R1dGF0dWQgw7xrc3VzZWQnLFxuICAgICAgICAgICAgJ23hu6VjIMSRw6MgeMOzYScsXG4gICAgICAgICAgICAnb2RzdHJhbsSbbsOpIHBvbG/Fvmt5JyxcbiAgICAgICAgICAgICdvZHN0cmFuxJtuw6EgcG/FoXRhJyxcbiAgICAgICAgICAgICdwZXNhbiB0ZXJoYXB1cycsXG4gICAgICAgICAgICAncG9pc3RldHV0JyxcbiAgICAgICAgICAgICdwcmFodCcsXG4gICAgICAgICAgICAncHLDvGdpa2FzdCcsXG4gICAgICAgICAgICAnc2lsaW5tacWfIMO2xJ9lbGVyJyxcbiAgICAgICAgICAgICdzbGV0dGVkZSBiZXNrZWRlcicsXG4gICAgICAgICAgICAnc2xldHRlZGUgZWxlbWVudGVyJyxcbiAgICAgICAgICAgICd0cmFzaCcsXG4gICAgICAgICAgICAndMO2csO2bHQgZWxlbWVrJyxcbiAgICAgICAgICAgICd0w7Zyw7ZsdCcsXG4gICAgICAgICAgICAndXN1bmnEmXRlIHdpYWRvbW/Fm2NpJyxcbiAgICAgICAgICAgICd2ZXJ3aWpkZXJkZSBpdGVtcycsXG4gICAgICAgICAgICAndnltYXphbsOpIHNwcsOhdnknLFxuICAgICAgICAgICAgJ8OpbMOpbWVudHMgc3VwcHJpbcOpcycsXG4gICAgICAgICAgICAn0LLQuNC00LDQu9C10L3RlicsXG4gICAgICAgICAgICAn0LbQvtC50YvQu9KT0LDQvdC00LDRgCcsXG4gICAgICAgICAgICAn0YPQtNCw0LvQtdC90L3Ri9C1JyxcbiAgICAgICAgICAgICfXpNeo15nXmNeZ150g16nXoNee15fXp9eVJyxcbiAgICAgICAgICAgICfYp9mE2LnZhtin2LXYsSDYp9mE2YXYrdiw2YjZgdipJyxcbiAgICAgICAgICAgICfZhdmI2KfYsdivINit2LDZgSDYtNiv2YcnLFxuICAgICAgICAgICAgJ+C4o+C4suC4ouC4geC4suC4o+C4l+C4teC5iOC4peC4micsXG4gICAgICAgICAgICAn5bey5Yig6Zmk6YKu5Lu2JyxcbiAgICAgICAgICAgICflt7LliKrpmaTpoIXnm64nLFxuICAgICAgICAgICAgJ+W3suWIqumZpOmgheebridcbiAgICAgICAgXSxcbiAgICAgICAgJ1xcXFxKdW5rJzogW1xuICAgICAgICAgICAgJ2J1bGsgbWFpbCcsXG4gICAgICAgICAgICAnY29ycmVvIG5vIGRlc2VhZG8nLFxuICAgICAgICAgICAgJ2NvdXJyaWVyIGluZMOpc2lyYWJsZScsXG4gICAgICAgICAgICAnaXN0ZW5tZXllbicsXG4gICAgICAgICAgICAnaXN0ZW5tZXllbiBlLXBvc3RhJyxcbiAgICAgICAgICAgICdqdW5rJyxcbiAgICAgICAgICAgICdqdW5rIGUtbWFpbCcsXG4gICAgICAgICAgICAnanVuayBlbWFpbCcsXG4gICAgICAgICAgICAnanVuay1lLW1haWwnLFxuICAgICAgICAgICAgJ2xldsOpbHN6ZW3DqXQnLFxuICAgICAgICAgICAgJ25ldnnFvmlhZGFuw6EgcG/FoXRhJyxcbiAgICAgICAgICAgICduZXZ5xb7DoWRhbsOhIHBvxaF0YScsXG4gICAgICAgICAgICAnbm8gZGVzZWFkbycsXG4gICAgICAgICAgICAncG9zdGEgaW5kZXNpZGVyYXRhJyxcbiAgICAgICAgICAgICdwb3VycmllbCcsXG4gICAgICAgICAgICAncm9za2Fwb3N0aScsXG4gICAgICAgICAgICAncsOkbXBzcG9zdCcsXG4gICAgICAgICAgICAnc2tyw6RwcG9zdCcsXG4gICAgICAgICAgICAnc3BhbScsXG4gICAgICAgICAgICAnc3BhbScsXG4gICAgICAgICAgICAnc3BhbW93YW5pZScsXG4gICAgICAgICAgICAnc8O4cHBlbHBvc3QnLFxuICAgICAgICAgICAgJ3RoxrAgcsOhYycsXG4gICAgICAgICAgICAnd2lhZG9tb8WbY2ktxZttaWVjaScsXG4gICAgICAgICAgICAn0YHQv9Cw0LwnLFxuICAgICAgICAgICAgJ9eT15XXkNeoINeW15HXnCcsXG4gICAgICAgICAgICAn2KfZhNix2LPYp9im2YQg2KfZhNi52LTZiNin2KbZitipJyxcbiAgICAgICAgICAgICfZh9ix2LLZhtin2YXZhycsXG4gICAgICAgICAgICAn4Liq4LmB4Lib4LihJyxcbiAgICAgICAgICAgICflnoPlnL7pg7Xku7YnLFxuICAgICAgICAgICAgJ+Weg+WcvumCruS7ticsXG4gICAgICAgICAgICAn5Z6D5Zy+6Zu76YO1J1xuICAgICAgICBdLFxuICAgICAgICAnXFxcXERyYWZ0cyc6IFtcbiAgICAgICAgICAgICdiYSBicm91aWxsb24nLFxuICAgICAgICAgICAgJ2JvcnJhZG9yJyxcbiAgICAgICAgICAgICdib3JyYWRvcicsXG4gICAgICAgICAgICAnYm9ycmFkb3JlcycsXG4gICAgICAgICAgICAnYm96emUnLFxuICAgICAgICAgICAgJ2Jyb3VpbGxvbnMnLFxuICAgICAgICAgICAgJ2LhuqNuIHRo4bqjbycsXG4gICAgICAgICAgICAnY2lvcm5lJyxcbiAgICAgICAgICAgICdjb25jZXB0ZW4nLFxuICAgICAgICAgICAgJ2RyYWYnLFxuICAgICAgICAgICAgJ2RyYWZ0JyxcbiAgICAgICAgICAgICdkcmFmdHMnLFxuICAgICAgICAgICAgJ2Ryw7ZnJyxcbiAgICAgICAgICAgICdlbnR3w7xyZmUnLFxuICAgICAgICAgICAgJ2VzYm9ycmFueXMnLFxuICAgICAgICAgICAgJ2dhcmFsYW1hbGFyJyxcbiAgICAgICAgICAgICdpaGUgZWRldHVydScsXG4gICAgICAgICAgICAnaWlkcmFmdGknLFxuICAgICAgICAgICAgJ2l6aW5obGFrYScsXG4gICAgICAgICAgICAnanVvZHJhxaHEjWlhaScsXG4gICAgICAgICAgICAna2xhZGQnLFxuICAgICAgICAgICAgJ2tsYWRkZXInLFxuICAgICAgICAgICAgJ2tvbmNlcHR5JyxcbiAgICAgICAgICAgICdrb25jZXB0eScsXG4gICAgICAgICAgICAna29uc2VwJyxcbiAgICAgICAgICAgICdrb25zZXB0ZScsXG4gICAgICAgICAgICAna29waWUgcm9ib2N6ZScsXG4gICAgICAgICAgICAnbGF5aWjJmWzJmXInLFxuICAgICAgICAgICAgJ2x1b25ub2tzZXQnLFxuICAgICAgICAgICAgJ21lbG5yYWtzdGknLFxuICAgICAgICAgICAgJ21lcmFsbycsXG4gICAgICAgICAgICAnbWVzYXpoZSB0w6sgcGFkw6tyZ3VhcmEnLFxuICAgICAgICAgICAgJ21nYSBkcmFmdCcsXG4gICAgICAgICAgICAnbXVzdGFuZGlkJyxcbiAgICAgICAgICAgICduYWNydGknLFxuICAgICAgICAgICAgJ25hY3J0aScsXG4gICAgICAgICAgICAnb3NudXRraScsXG4gICAgICAgICAgICAncGlzemtvemF0b2snLFxuICAgICAgICAgICAgJ3Jhc2N1bmhvcycsXG4gICAgICAgICAgICAncmFzaW11JyxcbiAgICAgICAgICAgICdza2ljZScsXG4gICAgICAgICAgICAndGFzbGFrbGFyJyxcbiAgICAgICAgICAgICd0c2FyYXJydW4gc2HGmW9ubmknLFxuICAgICAgICAgICAgJ3V0a2FzdCcsXG4gICAgICAgICAgICAndmFraXJhb2thJyxcbiAgICAgICAgICAgICd2w6F6bGF0b2snLFxuICAgICAgICAgICAgJ3ppcnJpYm9ycm9haycsXG4gICAgICAgICAgICAnw6B34buNbiDDoGvhu41wYW3hu43MgScsXG4gICAgICAgICAgICAnz4DPgc+Mz4fOtc65z4HOsScsXG4gICAgICAgICAgICAn0LbQvtCx0LDQu9Cw0YAnLFxuICAgICAgICAgICAgJ9C90LDRhtGA0YLQuCcsXG4gICAgICAgICAgICAn0L3QvtC+0YDQs9GD0YPQtCcsXG4gICAgICAgICAgICAn0YHQuNGR0rPQvdCw0LLQuNGBJyxcbiAgICAgICAgICAgICfRhdC+0LzQsNC60Lgg0YXQsNGC0LvQsNGAJyxcbiAgICAgICAgICAgICfRh9Cw0YDQvdCw0LLRltC60ZYnLFxuICAgICAgICAgICAgJ9GH0LXRgNC90LXRgtC60LgnLFxuICAgICAgICAgICAgJ9GH0LXRgNC90L7QstC4JyxcbiAgICAgICAgICAgICfRh9C10YDQvdC+0LLQuNC60LgnLFxuICAgICAgICAgICAgJ9GH0LXRgNC90L7QstC40LrRgtC10YAnLFxuICAgICAgICAgICAgJ9W91ofVodWj1oDVpdaAJyxcbiAgICAgICAgICAgICfXmNeZ15XXmNeV16onLFxuICAgICAgICAgICAgJ9mF2LPZiNiv2KfYqicsXG4gICAgICAgICAgICAn2YXYs9mI2K/Yp9iqJyxcbiAgICAgICAgICAgICfZhdmI2LPZiNiv25AnLFxuICAgICAgICAgICAgJ9m+24zYtCDZhtmI24zYs9mH2KcnLFxuICAgICAgICAgICAgJ9qI2LHYp9mB2bkvJyxcbiAgICAgICAgICAgICfgpKHgpY3gpLDgpL7gpZ7gpY3gpJ8nLFxuICAgICAgICAgICAgJ+CkquCljeCksOCkvuCksOClguCkqicsXG4gICAgICAgICAgICAn4KaW4Ka44Kec4Ka+JyxcbiAgICAgICAgICAgICfgppbgprjgp5zgpr4nLFxuICAgICAgICAgICAgJ+CmoeCnjeCnsOCmvuCmq+CnjeCmnycsXG4gICAgICAgICAgICAn4Kih4KmN4Kiw4Ki+4Kir4KifJyxcbiAgICAgICAgICAgICfgqqHgq43gqrDgqr7gqqvgq43gqp/gqrgnLFxuICAgICAgICAgICAgJ+CsoeCtjeCssOCsvuCsq+CtjeCsnycsXG4gICAgICAgICAgICAn4K614K6w4K+I4K614K+B4K6V4K6z4K+NJyxcbiAgICAgICAgICAgICfgsJrgsL/gsKTgsY3gsKTgsYEg4LCq4LGN4LCw4LCk4LGB4LCy4LGBJyxcbiAgICAgICAgICAgICfgspXgsrDgsqHgs4HgspfgsrPgs4EnLFxuICAgICAgICAgICAgJ+C0leC0sOC0n+C1geC0leC0s+C1jeKAjScsXG4gICAgICAgICAgICAn4Laa4LeZ4Lan4LeU4La44LeKIOC2tOC2reC3iicsXG4gICAgICAgICAgICAn4LiJ4Lia4Lix4Lia4Lij4LmI4Liy4LiHJyxcbiAgICAgICAgICAgICfhg5vhg53hg5zhg5Dhg67hg5Dhg5bhg5Thg5Hhg5gnLFxuICAgICAgICAgICAgJ+GIqOGJguGJhuGJvScsXG4gICAgICAgICAgICAn4Z6f4Z624Z6a4Z6W4Z+S4Z6a4Z624Z6EJyxcbiAgICAgICAgICAgICfkuIvmm7jjgY0nLFxuICAgICAgICAgICAgJ+iNieeovycsXG4gICAgICAgICAgICAn6I2J56i/JyxcbiAgICAgICAgICAgICfojYnnqL8nLFxuICAgICAgICAgICAgJ+yehOyLnCDrs7TqtIDtlagnXG4gICAgICAgIF0sXG5cbiAgICAgICAgJ1xcXFxBcmNoaXZlJzogWydhcmNoaXZlJ11cbiAgICB9LFxuXG4gICAgc3BlY2lhbFVzZShoYXNTcGVjaWFsVXNlRXh0ZW5zaW9uLCBmb2xkZXIpIHtcbiAgICAgICAgbGV0IHJlc3VsdDtcblxuICAgICAgICBpZiAoaGFzU3BlY2lhbFVzZUV4dGVuc2lvbikge1xuICAgICAgICAgICAgcmVzdWx0ID0ge1xuICAgICAgICAgICAgICAgIGZsYWc6IG1vZHVsZS5leHBvcnRzLmZsYWdzLmZpbmQoZmxhZyA9PiBmb2xkZXIuZmxhZ3MuaGFzKGZsYWcpKSxcbiAgICAgICAgICAgICAgICBzb3VyY2U6ICdleHRlbnNpb24nXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFyZXN1bHQgfHwgIXJlc3VsdC5mbGFnKSB7XG4gICAgICAgICAgICBsZXQgbmFtZSA9IGZvbGRlci5uYW1lXG4gICAgICAgICAgICAgICAgLnRvTG93ZXJDYXNlKClcbiAgICAgICAgICAgICAgICAucmVwbGFjZSgvXFx1MjAwZS9nLCAnJylcbiAgICAgICAgICAgICAgICAudHJpbSgpO1xuXG4gICAgICAgICAgICByZXN1bHQgPSB7XG4gICAgICAgICAgICAgICAgZmxhZzogT2JqZWN0LmtleXMobW9kdWxlLmV4cG9ydHMubmFtZXMpLmZpbmQoZmxhZyA9PiBtb2R1bGUuZXhwb3J0cy5uYW1lc1tmbGFnXS5pbmNsdWRlcyhuYW1lKSksXG4gICAgICAgICAgICAgICAgc291cmNlOiAnbmFtZSdcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVzdWx0ICYmIHJlc3VsdC5mbGFnID8gcmVzdWx0IDogeyBmbGFnOiBudWxsIH07XG4gICAgfVxufTtcbiJdLCJuYW1lcyI6W10sImlnbm9yZUxpc3QiOlswXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(action-browser)/./node_modules/imapflow/lib/special-use.js\n");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "(action-browser)/./node_modules/imapflow/lib/tools.js":
|
|
/*!********************************************!*\
|
|
!*** ./node_modules/imapflow/lib/tools.js ***!
|
|
\********************************************/
|
|
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
|
|
|
|
eval("/* eslint no-control-regex:0 */\n\n\n\nconst libmime = __webpack_require__(/*! libmime */ \"(action-browser)/./node_modules/libmime/lib/libmime.js\");\nconst { resolveCharset } = __webpack_require__(/*! ./charsets */ \"(action-browser)/./node_modules/imapflow/lib/charsets.js\");\nconst { compiler } = __webpack_require__(/*! ./handler/imap-handler */ \"(action-browser)/./node_modules/imapflow/lib/handler/imap-handler.js\");\nconst { createHash } = __webpack_require__(/*! crypto */ \"crypto\");\nconst { JPDecoder } = __webpack_require__(/*! ./jp-decoder */ \"(action-browser)/./node_modules/imapflow/lib/jp-decoder.js\");\nconst iconv = __webpack_require__(/*! iconv-lite */ \"(action-browser)/./node_modules/iconv-lite/lib/index.js\");\n\nconst FLAG_COLORS = ['red', 'orange', 'yellow', 'green', 'blue', 'purple', 'grey'];\n\nclass AuthenticationFailure extends Error {\n authenticationFailed = true;\n}\n\nconst tools = {\n encodePath(connection, path) {\n path = (path || '').toString();\n if (!connection.enabled.has('UTF8=ACCEPT') && /[&\\x00-\\x08\\x0b-\\x0c\\x0e-\\x1f\\u0080-\\uffff]/.test(path)) {\n try {\n path = iconv.encode(path, 'utf-7-imap').toString();\n } catch (err) {\n // ignore, keep name as is\n }\n }\n return path;\n },\n\n decodePath(connection, path) {\n path = (path || '').toString();\n if (!connection.enabled.has('UTF8=ACCEPT') && /[&]/.test(path)) {\n try {\n path = iconv.decode(Buffer.from(path), 'utf-7-imap').toString();\n } catch (err) {\n // ignore, keep name as is\n }\n }\n return path;\n },\n\n normalizePath(connection, path, skipNamespace) {\n if (Array.isArray(path)) {\n path = path.join((connection.namespace && connection.namespace.delimiter) || '');\n }\n\n if (path.toUpperCase() === 'INBOX') {\n // inbox is not case sensitive\n return 'INBOX';\n }\n\n // ensure namespace prefix if needed\n if (!skipNamespace && connection.namespace && connection.namespace.prefix && path.indexOf(connection.namespace.prefix) !== 0) {\n path = connection.namespace.prefix + path;\n }\n\n return path;\n },\n\n comparePaths(connection, a, b) {\n if (!a || !b) {\n return false;\n }\n return tools.normalizePath(connection, a) === tools.normalizePath(connection, b);\n },\n\n updateCapabilities(list) {\n let map = new Map();\n\n if (list && Array.isArray(list)) {\n list.forEach(val => {\n if (typeof val.value !== 'string') {\n return false;\n }\n let capability = val.value.toUpperCase().trim();\n\n if (capability === 'IMAP4REV1') {\n map.set('IMAP4rev1', true);\n return;\n }\n\n if (capability.indexOf('APPENDLIMIT=') === 0) {\n let splitPos = capability.indexOf('=');\n let appendLimit = Number(capability.substr(splitPos + 1)) || 0;\n map.set('APPENDLIMIT', appendLimit);\n return;\n }\n\n map.set(capability, true);\n });\n }\n\n return map;\n },\n\n AuthenticationFailure,\n\n getStatusCode(response) {\n return response &&\n response.attributes &&\n response.attributes[0] &&\n response.attributes[0].section &&\n response.attributes[0].section[0] &&\n typeof response.attributes[0].section[0].value === 'string'\n ? response.attributes[0].section[0].value.toUpperCase().trim()\n : false;\n },\n\n async getErrorText(response) {\n if (!response) {\n return false;\n }\n\n return (await compiler(response)).toString();\n },\n\n getFolderTree(folders) {\n let tree = {\n root: true,\n folders: []\n };\n\n let getTreeNode = parents => {\n let node = tree;\n if (!parents || !parents.length) {\n return node;\n }\n\n for (let parent of parents) {\n let cur = node.folders && node.folders.find(folder => folder.name === parent);\n if (cur) {\n node = cur;\n } else {\n // not yet set\n cur = {\n name: parent,\n folders: []\n };\n }\n }\n\n return node;\n };\n\n for (let folder of folders) {\n let parent = getTreeNode(folder.parent);\n // see if entry already exists\n let existing = parent.folders && parent.folders.find(existing => existing.name === folder.name);\n if (existing) {\n // update values\n existing.name = folder.name;\n existing.flags = folder.flags;\n existing.path = folder.path;\n existing.subscribed = !!folder.subscribed;\n existing.listed = !!folder.listed;\n existing.status = !!folder.status;\n\n if (folder.specialUse) {\n existing.specialUse = folder.specialUse;\n }\n\n if (folder.flags.has('\\\\Noselect')) {\n existing.disabled = true;\n }\n if (folder.flags.has('\\\\HasChildren') && !existing.folders) {\n existing.folders = [];\n }\n } else {\n // create new\n let data = {\n name: folder.name,\n flags: folder.flags,\n path: folder.path,\n subscribed: !!folder.subscribed,\n listed: !!folder.listed,\n status: !!folder.status\n };\n\n if (folder.delimiter) {\n data.delimiter = folder.delimiter;\n }\n\n if (folder.specialUse) {\n data.specialUse = folder.specialUse;\n }\n\n if (folder.flags.has('\\\\Noselect')) {\n data.disabled = true;\n }\n\n if (folder.flags.has('\\\\HasChildren')) {\n data.folders = [];\n }\n\n if (!parent.folders) {\n parent.folders = [];\n }\n parent.folders.push(data);\n }\n }\n\n return tree;\n },\n\n getFlagColor(flags) {\n if (!flags.has('\\\\Flagged')) {\n return null;\n }\n\n const bit0 = flags.has('$MailFlagBit0') ? 1 : 0;\n const bit1 = flags.has('$MailFlagBit1') ? 2 : 0;\n const bit2 = flags.has('$MailFlagBit2') ? 4 : 0;\n\n const color = bit0 | bit1 | bit2; // eslint-disable-line no-bitwise\n\n return FLAG_COLORS[color] || 'red'; // default to red for the unused \\b111\n },\n\n getColorFlags(color) {\n const colorCode = color ? FLAG_COLORS.indexOf((color || '').toString().toLowerCase().trim()) : null;\n if (colorCode < 0 && colorCode !== null) {\n return null;\n }\n\n const bits = [];\n bits[0] = colorCode & 1; // eslint-disable-line no-bitwise\n bits[1] = colorCode & 2; // eslint-disable-line no-bitwise\n bits[2] = colorCode & 4; // eslint-disable-line no-bitwise\n\n let result = { add: colorCode ? ['\\\\Flagged'] : [], remove: colorCode ? [] : ['\\\\Flagged'] };\n\n for (let i = 0; i < bits.length; i++) {\n if (bits[i]) {\n result.add.push(`$MailFlagBit${i}`);\n } else {\n result.remove.push(`$MailFlagBit${i}`);\n }\n }\n return result;\n },\n\n async formatMessageResponse(untagged, mailbox) {\n let map = {};\n\n map.seq = Number(untagged.command);\n\n let key;\n let attributes = (untagged.attributes && untagged.attributes[1]) || [];\n for (let i = 0, len = attributes.length; i < len; i++) {\n let attribute = attributes[i];\n if (i % 2 === 0) {\n key = (\n await compiler({\n attributes: [attribute]\n })\n )\n .toString()\n .toLowerCase()\n .replace(/<\\d+(\\.\\d+)?>$/, '');\n continue;\n }\n if (typeof key !== 'string') {\n // should not happen\n continue;\n }\n\n let getString = attribute => {\n if (!attribute) {\n return false;\n }\n if (typeof attribute.value === 'string') {\n return attribute.value;\n }\n if (Buffer.isBuffer(attribute.value)) {\n return attribute.value.toString();\n }\n };\n\n let getBuffer = attribute => {\n if (!attribute) {\n return false;\n }\n if (Buffer.isBuffer(attribute.value)) {\n return attribute.value;\n }\n };\n\n let getArray = attribute => {\n if (Array.isArray(attribute)) {\n return attribute.map(entry => (entry && typeof entry.value === 'string' ? entry.value : false)).filter(entry => entry);\n }\n };\n\n switch (key) {\n case 'body[]':\n case 'binary[]':\n map.source = getBuffer(attribute);\n break;\n\n case 'uid':\n map.uid = Number(getString(attribute));\n if (map.uid && (!mailbox.uidNext || mailbox.uidNext <= map.uid)) {\n // current uidNext seems to be outdated, bump it\n mailbox.uidNext = map.uid + 1;\n }\n break;\n\n case 'modseq':\n map.modseq = BigInt(getArray(attribute)[0]);\n if (map.modseq && (!mailbox.highestModseq || mailbox.highestModseq < map.modseq)) {\n // current highestModseq seems to be outdated, bump it\n mailbox.highestModseq = map.modseq;\n }\n break;\n\n case 'emailid':\n map.emailId = getArray(attribute)[0];\n break;\n\n case 'x-gm-msgid':\n map.emailId = getString(attribute);\n break;\n\n case 'threadid':\n map.threadId = getArray(attribute)[0];\n break;\n\n case 'x-gm-thrid':\n map.threadId = getString(attribute);\n break;\n\n case 'x-gm-labels':\n map.labels = new Set(getArray(attribute));\n break;\n\n case 'rfc822.size':\n map.size = Number(getString(attribute)) || 0;\n break;\n\n case 'flags':\n map.flags = new Set(getArray(attribute));\n break;\n\n case 'envelope':\n map.envelope = tools.parseEnvelope(attribute);\n break;\n\n case 'bodystructure':\n map.bodyStructure = tools.parseBodystructure(attribute);\n break;\n\n case 'internaldate': {\n let value = getString(attribute);\n let date = new Date(value);\n if (date.toString() === 'Invalid Date') {\n map.internalDate = value;\n } else {\n map.internalDate = date;\n }\n break;\n }\n\n default: {\n let match = key.match(/(body|binary)\\[/i);\n if (match) {\n let partKey = key.replace(/^(body|binary)\\[|]$/gi, '');\n partKey = partKey.replace(/\\.fields.*$/g, '');\n\n let value = getBuffer(attribute);\n if (partKey === 'header') {\n map.headers = value;\n break;\n }\n\n if (!map.bodyParts) {\n map.bodyParts = new Map();\n }\n map.bodyParts.set(partKey, value);\n break;\n }\n break;\n }\n }\n }\n\n if (map.emailId || map.uid) {\n // define account unique ID for this email\n\n // normalize path to use ascii, so we would always get the same ID\n let path = mailbox.path;\n if (/[0x80-0xff]/.test(path)) {\n try {\n path = iconv.encode(path, 'utf-7-imap').toString();\n } catch (err) {\n // ignore\n }\n }\n\n map.id =\n map.emailId ||\n createHash('md5')\n .update([path, mailbox.uidValidity?.toString() || '', map.uid.toString()].join(':'))\n .digest('hex');\n }\n\n if (map.flags) {\n let flagColor = tools.getFlagColor(map.flags);\n if (flagColor) {\n map.flagColor = flagColor;\n }\n }\n\n return map;\n },\n\n processName(name) {\n name = (name || '').toString();\n if (name.length > 2 && name.at(0) === '\"' && name.at(-1) === '\"') {\n name = name.replace(/^\"|\"$/g, '');\n }\n return name;\n },\n\n parseEnvelope(entry) {\n let getStrValue = obj => {\n if (!obj) {\n return false;\n }\n if (typeof obj.value === 'string') {\n return obj.value;\n }\n if (Buffer.isBuffer(obj.value)) {\n return obj.value.toString();\n }\n return obj.value;\n };\n\n let processAddresses = function (list) {\n return []\n .concat(list || [])\n .map(addr => {\n let address = (getStrValue(addr[2]) || '') + '@' + (getStrValue(addr[3]) || '');\n if (address === '@') {\n address = '';\n }\n return {\n name: tools.processName(libmime.decodeWords(getStrValue(addr[0]))),\n address\n };\n })\n .filter(addr => addr.name || addr.address);\n },\n envelope = {};\n\n if (entry[0] && entry[0].value) {\n let date = new Date(getStrValue(entry[0]));\n if (date.toString() === 'Invalid Date') {\n envelope.date = getStrValue(entry[0]);\n } else {\n envelope.date = date;\n }\n }\n\n if (entry[1] && entry[1].value) {\n envelope.subject = libmime.decodeWords(getStrValue(entry[1]));\n }\n\n if (entry[2] && entry[2].length) {\n envelope.from = processAddresses(entry[2]);\n }\n\n if (entry[3] && entry[3].length) {\n envelope.sender = processAddresses(entry[3]);\n }\n\n if (entry[4] && entry[4].length) {\n envelope.replyTo = processAddresses(entry[4]);\n }\n\n if (entry[5] && entry[5].length) {\n envelope.to = processAddresses(entry[5]);\n }\n\n if (entry[6] && entry[6].length) {\n envelope.cc = processAddresses(entry[6]);\n }\n\n if (entry[7] && entry[7].length) {\n envelope.bcc = processAddresses(entry[7]);\n }\n\n if (entry[8] && entry[8].value) {\n envelope.inReplyTo = (getStrValue(entry[8]) || '').toString().trim();\n }\n\n if (entry[9] && entry[9].value) {\n envelope.messageId = (getStrValue(entry[9]) || '').toString().trim();\n }\n\n return envelope;\n },\n\n getStructuredParams(arr) {\n let key;\n\n let params = {};\n\n [].concat(arr || []).forEach((val, j) => {\n if (j % 2) {\n params[key] = libmime.decodeWords(((val && val.value) || '').toString());\n } else {\n key = ((val && val.value) || '').toString().toLowerCase();\n }\n });\n\n if (params.filename && !params['filename*'] && /^[a-z\\-_0-9]+'[a-z]*'[^'\\x00-\\x08\\x0b\\x0c\\x0e-\\x1f\\u0080-\\uFFFF]+/.test(params.filename)) {\n // seems like encoded value\n let [encoding, , encodedValue] = params.filename.split(\"'\");\n if (resolveCharset(encoding)) {\n params['filename*'] = `${encoding}''${encodedValue}`;\n }\n }\n\n // preprocess values\n Object.keys(params).forEach(key => {\n let actualKey;\n let nr;\n let value;\n\n let match = key.match(/\\*((\\d+)\\*?)?$/);\n\n if (!match) {\n // nothing to do here, does not seem like a continuation param\n return;\n }\n\n actualKey = key.substr(0, match.index).toLowerCase();\n nr = Number(match[2]) || 0;\n\n if (!params[actualKey] || typeof params[actualKey] !== 'object') {\n params[actualKey] = {\n charset: false,\n values: []\n };\n }\n\n value = params[key];\n\n if (nr === 0 && match[0].charAt(match[0].length - 1) === '*' && (match = value.match(/^([^']*)'[^']*'(.*)$/))) {\n params[actualKey].charset = match[1] || 'utf-8';\n value = match[2];\n }\n\n params[actualKey].values.push({ nr, value });\n\n // remove the old reference\n delete params[key];\n });\n\n // concatenate split rfc2231 strings and convert encoded strings to mime encoded words\n Object.keys(params).forEach(key => {\n let value;\n if (params[key] && Array.isArray(params[key].values)) {\n value = params[key].values\n .sort((a, b) => a.nr - b.nr)\n .map(val => (val && val.value) || '')\n .join('');\n\n if (params[key].charset) {\n // convert \"%AB\" to \"=?charset?Q?=AB?=\" and then to unicode\n params[key] = libmime.decodeWords(\n '=?' +\n params[key].charset +\n '?Q?' +\n value\n // fix invalidly encoded chars\n .replace(/[=?_\\s]/g, s => {\n let c = s.charCodeAt(0).toString(16);\n if (s === ' ') {\n return '_';\n } else {\n return '%' + (c.length < 2 ? '0' : '') + c;\n }\n })\n // change from urlencoding to percent encoding\n .replace(/%/g, '=') +\n '?='\n );\n } else {\n params[key] = libmime.decodeWords(value);\n }\n }\n });\n\n return params;\n },\n\n parseBodystructure(entry) {\n let walk = (node, path) => {\n path = path || [];\n\n let curNode = {},\n i = 0,\n part = 0;\n\n if (path.length) {\n curNode.part = path.join('.');\n }\n\n // multipart\n if (Array.isArray(node[0])) {\n curNode.childNodes = [];\n while (Array.isArray(node[i])) {\n curNode.childNodes.push(walk(node[i], path.concat(++part)));\n i++;\n }\n\n // multipart type\n curNode.type = 'multipart/' + ((node[i++] || {}).value || '').toString().toLowerCase();\n\n // extension data (not available for BODY requests)\n\n // body parameter parenthesized list\n if (i < node.length - 1) {\n if (node[i]) {\n curNode.parameters = tools.getStructuredParams(node[i]);\n }\n i++;\n }\n } else {\n // content type\n curNode.type = [((node[i++] || {}).value || '').toString().toLowerCase(), ((node[i++] || {}).value || '').toString().toLowerCase()].join('/');\n\n // body parameter parenthesized list\n if (node[i]) {\n curNode.parameters = tools.getStructuredParams(node[i]);\n }\n i++;\n\n // id\n if (node[i]) {\n curNode.id = ((node[i] || {}).value || '').toString();\n }\n i++;\n\n // description\n if (node[i]) {\n curNode.description = ((node[i] || {}).value || '').toString();\n }\n i++;\n\n // encoding\n if (node[i]) {\n curNode.encoding = ((node[i] || {}).value || '').toString().toLowerCase();\n }\n i++;\n\n // size\n if (node[i]) {\n curNode.size = Number((node[i] || {}).value || 0) || 0;\n }\n i++;\n\n if (curNode.type === 'message/rfc822') {\n // message/rfc adds additional envelope, bodystructure and line count values\n\n // envelope\n if (node[i]) {\n curNode.envelope = tools.parseEnvelope([].concat(node[i] || []));\n }\n i++;\n\n if (node[i]) {\n curNode.childNodes = [\n // rfc822 bodyparts share the same path, difference is between MIME and HEADER\n // path.MIME returns message/rfc822 header\n // path.HEADER returns inlined message header\n walk(node[i], path)\n ];\n }\n i++;\n\n // line count\n if (node[i]) {\n curNode.lineCount = Number((node[i] || {}).value || 0) || 0;\n }\n i++;\n }\n\n if (/^text\\//.test(curNode.type)) {\n // text/* adds additional line count value\n\n // NB! some less known servers do not include the line count value\n // length should be 12+\n if (node.length === 11 && Array.isArray(node[i + 1]) && !Array.isArray(node[i + 2])) {\n // invalid structure, disposition params are shifted\n } else {\n // correct structure, line count number is provided\n if (node[i]) {\n // line count\n curNode.lineCount = Number((node[i] || {}).value || 0) || 0;\n }\n i++;\n }\n }\n\n // extension data (not available for BODY requests)\n\n // md5\n if (i < node.length - 1) {\n if (node[i]) {\n curNode.md5 = ((node[i] || {}).value || '').toString().toLowerCase();\n }\n i++;\n }\n }\n\n // the following are shared extension values (for both multipart and non-multipart parts)\n // not available for BODY requests\n\n // body disposition\n if (i < node.length - 1) {\n if (Array.isArray(node[i]) && node[i].length) {\n curNode.disposition = ((node[i][0] || {}).value || '').toString().toLowerCase();\n if (Array.isArray(node[i][1])) {\n curNode.dispositionParameters = tools.getStructuredParams(node[i][1]);\n }\n }\n i++;\n }\n\n // body language\n if (i < node.length - 1) {\n if (node[i]) {\n curNode.language = [].concat(node[i] || []).map(val => ((val && val.value) || '').toString().toLowerCase());\n }\n i++;\n }\n\n // body location\n // NB! defined as a \"string list\" in RFC3501 but replaced in errata document with \"string\"\n // Errata: http://www.rfc-editor.org/errata_search.php?rfc=3501\n if (i < node.length - 1) {\n if (node[i]) {\n curNode.location = ((node[i] || {}).value || '').toString();\n }\n i++;\n }\n\n return curNode;\n };\n\n return walk(entry);\n },\n\n formatDate(value) {\n if (typeof value === 'string') {\n value = new Date(value);\n }\n\n if (Object.prototype.toString(value) !== '[object Object]' || value.toString() === 'Invalid Date') {\n return;\n }\n\n value = value.toISOString().substr(0, 10);\n value = value.split('-');\n value.reverse();\n\n let months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];\n value[1] = months[Number(value[1]) - 1];\n\n return value.join('-');\n },\n\n formatDateTime(value) {\n if (!value) {\n return;\n }\n\n if (typeof value === 'string') {\n value = new Date(value);\n }\n\n if (Object.prototype.toString(value) !== '[object Object]' || value.toString() === 'Invalid Date') {\n return;\n }\n\n let dateStr = tools.formatDate(value).replace(/^0/, ' '); //starts with date-day-fixed with leading 0 replaced by SP\n let timeStr = value.toISOString().substr(11, 8);\n\n return `${dateStr} ${timeStr} +0000`;\n },\n\n formatFlag(flag) {\n switch (flag.toLowerCase()) {\n case '\\\\recent':\n // can not set or remove\n return false;\n case '\\\\seen':\n case '\\\\answered':\n case '\\\\flagged':\n case '\\\\deleted':\n case '\\\\draft':\n // can not set or remove\n return flag.toLowerCase().replace(/^\\\\./, c => c.toUpperCase());\n }\n return flag;\n },\n\n canUseFlag(mailbox, flag) {\n return !mailbox || !mailbox.permanentFlags || mailbox.permanentFlags.has('\\\\*') || mailbox.permanentFlags.has(flag);\n },\n\n expandRange(range) {\n return range.split(',').flatMap(entry => {\n entry = entry.trim();\n let colon = entry.indexOf(':');\n if (colon < 0) {\n return Number(entry) || 0;\n }\n let first = Number(entry.substr(0, colon)) || 0;\n let second = Number(entry.substr(colon + 1)) || 0;\n if (first === second) {\n return first;\n }\n let list = [];\n if (first < second) {\n for (let i = first; i <= second; i++) {\n list.push(i);\n }\n } else {\n for (let i = first; i >= second; i--) {\n list.push(i);\n }\n }\n return list;\n });\n },\n\n getDecoder(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 packMessageRange(list) {\n if (typeof uidList === 'string')\n if (!Array.isArray(list)) {\n list = [].concat(list || []);\n }\n\n if (!list.length) {\n return '';\n }\n\n list.sort((a, b) => a - b);\n\n let last = list[list.length - 1];\n let result = [[last]];\n for (let i = list.length - 2; i >= 0; i--) {\n if (list[i] === list[i + 1] - 1) {\n result[0].unshift(list[i]);\n continue;\n }\n result.unshift([list[i]]);\n }\n\n result = result.map(item => {\n if (item.length === 1) {\n return item[0];\n }\n return item.shift() + ':' + item.pop();\n });\n\n return result.join(',');\n }\n};\n\nmodule.exports = tools;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFjdGlvbi1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9pbWFwZmxvdy9saWIvdG9vbHMuanMiLCJtYXBwaW5ncyI6IkFBQUE7O0FBRWE7O0FBRWIsZ0JBQWdCLG1CQUFPLENBQUMsdUVBQVM7QUFDakMsUUFBUSxpQkFBaUIsRUFBRSxtQkFBTyxDQUFDLDRFQUFZO0FBQy9DLFFBQVEsV0FBVyxFQUFFLG1CQUFPLENBQUMsb0dBQXdCO0FBQ3JELFFBQVEsYUFBYSxFQUFFLG1CQUFPLENBQUMsc0JBQVE7QUFDdkMsUUFBUSxZQUFZLEVBQUUsbUJBQU8sQ0FBQyxnRkFBYztBQUM1QyxjQUFjLG1CQUFPLENBQUMsMkVBQVk7O0FBRWxDOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxhQUFhO0FBQ2I7O0FBRUE7QUFDQSxLQUFLOztBQUVMOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEsMENBQTBDOztBQUUxQyw0Q0FBNEM7QUFDNUMsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsaUNBQWlDO0FBQ2pDLGlDQUFpQztBQUNqQyxpQ0FBaUM7O0FBRWpDLHVCQUF1Qjs7QUFFdkIsd0JBQXdCLGlCQUFpQjtBQUN6QztBQUNBLCtDQUErQyxFQUFFO0FBQ2pELGNBQWM7QUFDZCxrREFBa0QsRUFBRTtBQUNwRDtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLGlEQUFpRCxTQUFTO0FBQzFEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0I7QUFDbEI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCO0FBQ0EsYUFBYTtBQUNiOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5Q0FBeUMsU0FBUyxJQUFJLGFBQWE7QUFDbkU7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLDRDQUE0QyxXQUFXOztBQUV2RDtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNDQUFzQztBQUN0QztBQUNBO0FBQ0EsaUNBQWlDO0FBQ2pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTs7QUFFQSw0QkFBNEI7QUFDNUI7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSwrREFBK0Q7O0FBRS9EOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0EsaURBQWlELDBEQUEwRDs7QUFFM0c7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsZ0RBQWdEO0FBQ2hEO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLHlEQUF5RDtBQUN6RDtBQUNBOztBQUVBO0FBQ0E7QUFDQSxzREFBc0Q7QUFDdEQ7QUFDQTs7QUFFQTtBQUNBO0FBQ0Esd0RBQXdEO0FBQ3hEO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsaUVBQWlFO0FBQ2pFO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBLHFFQUFxRTtBQUNyRTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxxREFBcUQ7QUFDckQ7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSw0REFBNEQ7QUFDNUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzREFBc0Q7QUFDdEQ7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSxrRUFBa0U7QUFDbEU7O0FBRUEsa0JBQWtCLFNBQVMsRUFBRSxTQUFTO0FBQ3RDLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9DQUFvQyxhQUFhO0FBQ2pEO0FBQ0E7QUFDQSxjQUFjO0FBQ2Qsb0NBQW9DLGFBQWE7QUFDakQ7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQSxzQ0FBc0MsUUFBUTtBQUM5QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBOztBQUVBIiwic291cmNlcyI6WyIvaG9tZS9hbG1hL25leHRnZW4vTmVhaC1tYWlsL25vZGVfbW9kdWxlcy9pbWFwZmxvdy9saWIvdG9vbHMuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50IG5vLWNvbnRyb2wtcmVnZXg6MCAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbmNvbnN0IGxpYm1pbWUgPSByZXF1aXJlKCdsaWJtaW1lJyk7XG5jb25zdCB7IHJlc29sdmVDaGFyc2V0IH0gPSByZXF1aXJlKCcuL2NoYXJzZXRzJyk7XG5jb25zdCB7IGNvbXBpbGVyIH0gPSByZXF1aXJlKCcuL2hhbmRsZXIvaW1hcC1oYW5kbGVyJyk7XG5jb25zdCB7IGNyZWF0ZUhhc2ggfSA9IHJlcXVpcmUoJ2NyeXB0bycpO1xuY29uc3QgeyBKUERlY29kZXIgfSA9IHJlcXVpcmUoJy4vanAtZGVjb2RlcicpO1xuY29uc3QgaWNvbnYgPSByZXF1aXJlKCdpY29udi1saXRlJyk7XG5cbmNvbnN0IEZMQUdfQ09MT1JTID0gWydyZWQnLCAnb3JhbmdlJywgJ3llbGxvdycsICdncmVlbicsICdibHVlJywgJ3B1cnBsZScsICdncmV5J107XG5cbmNsYXNzIEF1dGhlbnRpY2F0aW9uRmFpbHVyZSBleHRlbmRzIEVycm9yIHtcbiAgICBhdXRoZW50aWNhdGlvbkZhaWxlZCA9IHRydWU7XG59XG5cbmNvbnN0IHRvb2xzID0ge1xuICAgIGVuY29kZVBhdGgoY29ubmVjdGlvbiwgcGF0aCkge1xuICAgICAgICBwYXRoID0gKHBhdGggfHwgJycpLnRvU3RyaW5nKCk7XG4gICAgICAgIGlmICghY29ubmVjdGlvbi5lbmFibGVkLmhhcygnVVRGOD1BQ0NFUFQnKSAmJiAvWyZcXHgwMC1cXHgwOFxceDBiLVxceDBjXFx4MGUtXFx4MWZcXHUwMDgwLVxcdWZmZmZdLy50ZXN0KHBhdGgpKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHBhdGggPSBpY29udi5lbmNvZGUocGF0aCwgJ3V0Zi03LWltYXAnKS50b1N0cmluZygpO1xuICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgLy8gaWdub3JlLCBrZWVwIG5hbWUgYXMgaXNcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcGF0aDtcbiAgICB9LFxuXG4gICAgZGVjb2RlUGF0aChjb25uZWN0aW9uLCBwYXRoKSB7XG4gICAgICAgIHBhdGggPSAocGF0aCB8fCAnJykudG9TdHJpbmcoKTtcbiAgICAgICAgaWYgKCFjb25uZWN0aW9uLmVuYWJsZWQuaGFzKCdVVEY4PUFDQ0VQVCcpICYmIC9bJl0vLnRlc3QocGF0aCkpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgcGF0aCA9IGljb252LmRlY29kZShCdWZmZXIuZnJvbShwYXRoKSwgJ3V0Zi03LWltYXAnKS50b1N0cmluZygpO1xuICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgLy8gaWdub3JlLCBrZWVwIG5hbWUgYXMgaXNcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcGF0aDtcbiAgICB9LFxuXG4gICAgbm9ybWFsaXplUGF0aChjb25uZWN0aW9uLCBwYXRoLCBza2lwTmFtZXNwYWNlKSB7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHBhdGgpKSB7XG4gICAgICAgICAgICBwYXRoID0gcGF0aC5qb2luKChjb25uZWN0aW9uLm5hbWVzcGFjZSAmJiBjb25uZWN0aW9uLm5hbWVzcGFjZS5kZWxpbWl0ZXIpIHx8ICcnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwYXRoLnRvVXBwZXJDYXNlKCkgPT09ICdJTkJPWCcpIHtcbiAgICAgICAgICAgIC8vIGluYm94IGlzIG5vdCBjYXNlIHNlbnNpdGl2ZVxuICAgICAgICAgICAgcmV0dXJuICdJTkJPWCc7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBlbnN1cmUgbmFtZXNwYWNlIHByZWZpeCBpZiBuZWVkZWRcbiAgICAgICAgaWYgKCFza2lwTmFtZXNwYWNlICYmIGNvbm5lY3Rpb24ubmFtZXNwYWNlICYmIGNvbm5lY3Rpb24ubmFtZXNwYWNlLnByZWZpeCAmJiBwYXRoLmluZGV4T2YoY29ubmVjdGlvbi5uYW1lc3BhY2UucHJlZml4KSAhPT0gMCkge1xuICAgICAgICAgICAgcGF0aCA9IGNvbm5lY3Rpb24ubmFtZXNwYWNlLnByZWZpeCArIHBhdGg7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcGF0aDtcbiAgICB9LFxuXG4gICAgY29tcGFyZVBhdGhzKGNvbm5lY3Rpb24sIGEsIGIpIHtcbiAgICAgICAgaWYgKCFhIHx8ICFiKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRvb2xzLm5vcm1hbGl6ZVBhdGgoY29ubmVjdGlvbiwgYSkgPT09IHRvb2xzLm5vcm1hbGl6ZVBhdGgoY29ubmVjdGlvbiwgYik7XG4gICAgfSxcblxuICAgIHVwZGF0ZUNhcGFiaWxpdGllcyhsaXN0KSB7XG4gICAgICAgIGxldCBtYXAgPSBuZXcgTWFwKCk7XG5cbiAgICAgICAgaWYgKGxpc3QgJiYgQXJyYXkuaXNBcnJheShsaXN0KSkge1xuICAgICAgICAgICAgbGlzdC5mb3JFYWNoKHZhbCA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWwudmFsdWUgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbGV0IGNhcGFiaWxpdHkgPSB2YWwudmFsdWUudG9VcHBlckNhc2UoKS50cmltKCk7XG5cbiAgICAgICAgICAgICAgICBpZiAoY2FwYWJpbGl0eSA9PT0gJ0lNQVA0UkVWMScpIHtcbiAgICAgICAgICAgICAgICAgICAgbWFwLnNldCgnSU1BUDRyZXYxJywgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoY2FwYWJpbGl0eS5pbmRleE9mKCdBUFBFTkRMSU1JVD0nKSA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgc3BsaXRQb3MgPSBjYXBhYmlsaXR5LmluZGV4T2YoJz0nKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGFwcGVuZExpbWl0ID0gTnVtYmVyKGNhcGFiaWxpdHkuc3Vic3RyKHNwbGl0UG9zICsgMSkpIHx8IDA7XG4gICAgICAgICAgICAgICAgICAgIG1hcC5zZXQoJ0FQUEVORExJTUlUJywgYXBwZW5kTGltaXQpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgbWFwLnNldChjYXBhYmlsaXR5LCB0cnVlKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG1hcDtcbiAgICB9LFxuXG4gICAgQXV0aGVudGljYXRpb25GYWlsdXJlLFxuXG4gICAgZ2V0U3RhdHVzQ29kZShyZXNwb25zZSkge1xuICAgICAgICByZXR1cm4gcmVzcG9uc2UgJiZcbiAgICAgICAgICAgIHJlc3BvbnNlLmF0dHJpYnV0ZXMgJiZcbiAgICAgICAgICAgIHJlc3BvbnNlLmF0dHJpYnV0ZXNbMF0gJiZcbiAgICAgICAgICAgIHJlc3BvbnNlLmF0dHJpYnV0ZXNbMF0uc2VjdGlvbiAmJlxuICAgICAgICAgICAgcmVzcG9uc2UuYXR0cmlidXRlc1swXS5zZWN0aW9uWzBdICYmXG4gICAgICAgICAgICB0eXBlb2YgcmVzcG9uc2UuYXR0cmlidXRlc1swXS5zZWN0aW9uWzBdLnZhbHVlID09PSAnc3RyaW5nJ1xuICAgICAgICAgICAgPyByZXNwb25zZS5hdHRyaWJ1dGVzWzBdLnNlY3Rpb25bMF0udmFsdWUudG9VcHBlckNhc2UoKS50cmltKClcbiAgICAgICAgICAgIDogZmFsc2U7XG4gICAgfSxcblxuICAgIGFzeW5jIGdldEVycm9yVGV4dChyZXNwb25zZSkge1xuICAgICAgICBpZiAoIXJlc3BvbnNlKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gKGF3YWl0IGNvbXBpbGVyKHJlc3BvbnNlKSkudG9TdHJpbmcoKTtcbiAgICB9LFxuXG4gICAgZ2V0Rm9sZGVyVHJlZShmb2xkZXJzKSB7XG4gICAgICAgIGxldCB0cmVlID0ge1xuICAgICAgICAgICAgcm9vdDogdHJ1ZSxcbiAgICAgICAgICAgIGZvbGRlcnM6IFtdXG4gICAgICAgIH07XG5cbiAgICAgICAgbGV0IGdldFRyZWVOb2RlID0gcGFyZW50cyA9PiB7XG4gICAgICAgICAgICBsZXQgbm9kZSA9IHRyZWU7XG4gICAgICAgICAgICBpZiAoIXBhcmVudHMgfHwgIXBhcmVudHMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZvciAobGV0IHBhcmVudCBvZiBwYXJlbnRzKSB7XG4gICAgICAgICAgICAgICAgbGV0IGN1ciA9IG5vZGUuZm9sZGVycyAmJiBub2RlLmZvbGRlcnMuZmluZChmb2xkZXIgPT4gZm9sZGVyLm5hbWUgPT09IHBhcmVudCk7XG4gICAgICAgICAgICAgICAgaWYgKGN1cikge1xuICAgICAgICAgICAgICAgICAgICBub2RlID0gY3VyO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIG5vdCB5ZXQgc2V0XG4gICAgICAgICAgICAgICAgICAgIGN1ciA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IHBhcmVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvbGRlcnM6IFtdXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gbm9kZTtcbiAgICAgICAgfTtcblxuICAgICAgICBmb3IgKGxldCBmb2xkZXIgb2YgZm9sZGVycykge1xuICAgICAgICAgICAgbGV0IHBhcmVudCA9IGdldFRyZWVOb2RlKGZvbGRlci5wYXJlbnQpO1xuICAgICAgICAgICAgLy8gc2VlIGlmIGVudHJ5IGFscmVhZHkgZXhpc3RzXG4gICAgICAgICAgICBsZXQgZXhpc3RpbmcgPSBwYXJlbnQuZm9sZGVycyAmJiBwYXJlbnQuZm9sZGVycy5maW5kKGV4aXN0aW5nID0+IGV4aXN0aW5nLm5hbWUgPT09IGZvbGRlci5uYW1lKTtcbiAgICAgICAgICAgIGlmIChleGlzdGluZykge1xuICAgICAgICAgICAgICAgIC8vIHVwZGF0ZSB2YWx1ZXNcbiAgICAgICAgICAgICAgICBleGlzdGluZy5uYW1lID0gZm9sZGVyLm5hbWU7XG4gICAgICAgICAgICAgICAgZXhpc3RpbmcuZmxhZ3MgPSBmb2xkZXIuZmxhZ3M7XG4gICAgICAgICAgICAgICAgZXhpc3RpbmcucGF0aCA9IGZvbGRlci5wYXRoO1xuICAgICAgICAgICAgICAgIGV4aXN0aW5nLnN1YnNjcmliZWQgPSAhIWZvbGRlci5zdWJzY3JpYmVkO1xuICAgICAgICAgICAgICAgIGV4aXN0aW5nLmxpc3RlZCA9ICEhZm9sZGVyLmxpc3RlZDtcbiAgICAgICAgICAgICAgICBleGlzdGluZy5zdGF0dXMgPSAhIWZvbGRlci5zdGF0dXM7XG5cbiAgICAgICAgICAgICAgICBpZiAoZm9sZGVyLnNwZWNpYWxVc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgZXhpc3Rpbmcuc3BlY2lhbFVzZSA9IGZvbGRlci5zcGVjaWFsVXNlO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChmb2xkZXIuZmxhZ3MuaGFzKCdcXFxcTm9zZWxlY3QnKSkge1xuICAgICAgICAgICAgICAgICAgICBleGlzdGluZy5kaXNhYmxlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChmb2xkZXIuZmxhZ3MuaGFzKCdcXFxcSGFzQ2hpbGRyZW4nKSAmJiAhZXhpc3RpbmcuZm9sZGVycykge1xuICAgICAgICAgICAgICAgICAgICBleGlzdGluZy5mb2xkZXJzID0gW107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBjcmVhdGUgbmV3XG4gICAgICAgICAgICAgICAgbGV0IGRhdGEgPSB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IGZvbGRlci5uYW1lLFxuICAgICAgICAgICAgICAgICAgICBmbGFnczogZm9sZGVyLmZsYWdzLFxuICAgICAgICAgICAgICAgICAgICBwYXRoOiBmb2xkZXIucGF0aCxcbiAgICAgICAgICAgICAgICAgICAgc3Vic2NyaWJlZDogISFmb2xkZXIuc3Vic2NyaWJlZCxcbiAgICAgICAgICAgICAgICAgICAgbGlzdGVkOiAhIWZvbGRlci5saXN0ZWQsXG4gICAgICAgICAgICAgICAgICAgIHN0YXR1czogISFmb2xkZXIuc3RhdHVzXG4gICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgIGlmIChmb2xkZXIuZGVsaW1pdGVyKSB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGEuZGVsaW1pdGVyID0gZm9sZGVyLmRlbGltaXRlcjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoZm9sZGVyLnNwZWNpYWxVc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgZGF0YS5zcGVjaWFsVXNlID0gZm9sZGVyLnNwZWNpYWxVc2U7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKGZvbGRlci5mbGFncy5oYXMoJ1xcXFxOb3NlbGVjdCcpKSB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGEuZGlzYWJsZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChmb2xkZXIuZmxhZ3MuaGFzKCdcXFxcSGFzQ2hpbGRyZW4nKSkge1xuICAgICAgICAgICAgICAgICAgICBkYXRhLmZvbGRlcnMgPSBbXTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoIXBhcmVudC5mb2xkZXJzKSB7XG4gICAgICAgICAgICAgICAgICAgIHBhcmVudC5mb2xkZXJzID0gW107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHBhcmVudC5mb2xkZXJzLnB1c2goZGF0YSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdHJlZTtcbiAgICB9LFxuXG4gICAgZ2V0RmxhZ0NvbG9yKGZsYWdzKSB7XG4gICAgICAgIGlmICghZmxhZ3MuaGFzKCdcXFxcRmxhZ2dlZCcpKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGJpdDAgPSBmbGFncy5oYXMoJyRNYWlsRmxhZ0JpdDAnKSA/IDEgOiAwO1xuICAgICAgICBjb25zdCBiaXQxID0gZmxhZ3MuaGFzKCckTWFpbEZsYWdCaXQxJykgPyAyIDogMDtcbiAgICAgICAgY29uc3QgYml0MiA9IGZsYWdzLmhhcygnJE1haWxGbGFnQml0MicpID8gNCA6IDA7XG5cbiAgICAgICAgY29uc3QgY29sb3IgPSBiaXQwIHwgYml0MSB8IGJpdDI7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tYml0d2lzZVxuXG4gICAgICAgIHJldHVybiBGTEFHX0NPTE9SU1tjb2xvcl0gfHwgJ3JlZCc7IC8vIGRlZmF1bHQgdG8gcmVkIGZvciB0aGUgdW51c2VkIFxcYjExMVxuICAgIH0sXG5cbiAgICBnZXRDb2xvckZsYWdzKGNvbG9yKSB7XG4gICAgICAgIGNvbnN0IGNvbG9yQ29kZSA9IGNvbG9yID8gRkxBR19DT0xPUlMuaW5kZXhPZigoY29sb3IgfHwgJycpLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKS50cmltKCkpIDogbnVsbDtcbiAgICAgICAgaWYgKGNvbG9yQ29kZSA8IDAgJiYgY29sb3JDb2RlICE9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGJpdHMgPSBbXTtcbiAgICAgICAgYml0c1swXSA9IGNvbG9yQ29kZSAmIDE7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tYml0d2lzZVxuICAgICAgICBiaXRzWzFdID0gY29sb3JDb2RlICYgMjsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1iaXR3aXNlXG4gICAgICAgIGJpdHNbMl0gPSBjb2xvckNvZGUgJiA0OyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWJpdHdpc2VcblxuICAgICAgICBsZXQgcmVzdWx0ID0geyBhZGQ6IGNvbG9yQ29kZSA/IFsnXFxcXEZsYWdnZWQnXSA6IFtdLCByZW1vdmU6IGNvbG9yQ29kZSA/IFtdIDogWydcXFxcRmxhZ2dlZCddIH07XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBiaXRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoYml0c1tpXSkge1xuICAgICAgICAgICAgICAgIHJlc3VsdC5hZGQucHVzaChgJE1haWxGbGFnQml0JHtpfWApO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXN1bHQucmVtb3ZlLnB1c2goYCRNYWlsRmxhZ0JpdCR7aX1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0sXG5cbiAgICBhc3luYyBmb3JtYXRNZXNzYWdlUmVzcG9uc2UodW50YWdnZWQsIG1haWxib3gpIHtcbiAgICAgICAgbGV0IG1hcCA9IHt9O1xuXG4gICAgICAgIG1hcC5zZXEgPSBOdW1iZXIodW50YWdnZWQuY29tbWFuZCk7XG5cbiAgICAgICAgbGV0IGtleTtcbiAgICAgICAgbGV0IGF0dHJpYnV0ZXMgPSAodW50YWdnZWQuYXR0cmlidXRlcyAmJiB1bnRhZ2dlZC5hdHRyaWJ1dGVzWzFdKSB8fCBbXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IGF0dHJpYnV0ZXMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBhdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzW2ldO1xuICAgICAgICAgICAgaWYgKGkgJSAyID09PSAwKSB7XG4gICAgICAgICAgICAgICAga2V5ID0gKFxuICAgICAgICAgICAgICAgICAgICBhd2FpdCBjb21waWxlcih7XG4gICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzOiBbYXR0cmlidXRlXVxuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgLnRvU3RyaW5nKClcbiAgICAgICAgICAgICAgICAgICAgLnRvTG93ZXJDYXNlKClcbiAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoLzxcXGQrKFxcLlxcZCspPz4kLywgJycpO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHR5cGVvZiBrZXkgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgLy8gc2hvdWxkIG5vdCBoYXBwZW5cbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbGV0IGdldFN0cmluZyA9IGF0dHJpYnV0ZSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCFhdHRyaWJ1dGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGF0dHJpYnV0ZS52YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGF0dHJpYnV0ZS52YWx1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKEJ1ZmZlci5pc0J1ZmZlcihhdHRyaWJ1dGUudmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBhdHRyaWJ1dGUudmFsdWUudG9TdHJpbmcoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBsZXQgZ2V0QnVmZmVyID0gYXR0cmlidXRlID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIWF0dHJpYnV0ZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChCdWZmZXIuaXNCdWZmZXIoYXR0cmlidXRlLnZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXR0cmlidXRlLnZhbHVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIGxldCBnZXRBcnJheSA9IGF0dHJpYnV0ZSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoYXR0cmlidXRlKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXR0cmlidXRlLm1hcChlbnRyeSA9PiAoZW50cnkgJiYgdHlwZW9mIGVudHJ5LnZhbHVlID09PSAnc3RyaW5nJyA/IGVudHJ5LnZhbHVlIDogZmFsc2UpKS5maWx0ZXIoZW50cnkgPT4gZW50cnkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIHN3aXRjaCAoa2V5KSB7XG4gICAgICAgICAgICAgICAgY2FzZSAnYm9keVtdJzpcbiAgICAgICAgICAgICAgICBjYXNlICdiaW5hcnlbXSc6XG4gICAgICAgICAgICAgICAgICAgIG1hcC5zb3VyY2UgPSBnZXRCdWZmZXIoYXR0cmlidXRlKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgICBjYXNlICd1aWQnOlxuICAgICAgICAgICAgICAgICAgICBtYXAudWlkID0gTnVtYmVyKGdldFN0cmluZyhhdHRyaWJ1dGUpKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG1hcC51aWQgJiYgKCFtYWlsYm94LnVpZE5leHQgfHwgbWFpbGJveC51aWROZXh0IDw9IG1hcC51aWQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjdXJyZW50IHVpZE5leHQgc2VlbXMgdG8gYmUgb3V0ZGF0ZWQsIGJ1bXAgaXRcbiAgICAgICAgICAgICAgICAgICAgICAgIG1haWxib3gudWlkTmV4dCA9IG1hcC51aWQgKyAxO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgY2FzZSAnbW9kc2VxJzpcbiAgICAgICAgICAgICAgICAgICAgbWFwLm1vZHNlcSA9IEJpZ0ludChnZXRBcnJheShhdHRyaWJ1dGUpWzBdKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG1hcC5tb2RzZXEgJiYgKCFtYWlsYm94LmhpZ2hlc3RNb2RzZXEgfHwgbWFpbGJveC5oaWdoZXN0TW9kc2VxIDwgbWFwLm1vZHNlcSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGN1cnJlbnQgaGlnaGVzdE1vZHNlcSBzZWVtcyB0byBiZSBvdXRkYXRlZCwgYnVtcCBpdFxuICAgICAgICAgICAgICAgICAgICAgICAgbWFpbGJveC5oaWdoZXN0TW9kc2VxID0gbWFwLm1vZHNlcTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgIGNhc2UgJ2VtYWlsaWQnOlxuICAgICAgICAgICAgICAgICAgICBtYXAuZW1haWxJZCA9IGdldEFycmF5KGF0dHJpYnV0ZSlbMF07XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgY2FzZSAneC1nbS1tc2dpZCc6XG4gICAgICAgICAgICAgICAgICAgIG1hcC5lbWFpbElkID0gZ2V0U3RyaW5nKGF0dHJpYnV0ZSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgY2FzZSAndGhyZWFkaWQnOlxuICAgICAgICAgICAgICAgICAgICBtYXAudGhyZWFkSWQgPSBnZXRBcnJheShhdHRyaWJ1dGUpWzBdO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgIGNhc2UgJ3gtZ20tdGhyaWQnOlxuICAgICAgICAgICAgICAgICAgICBtYXAudGhyZWFkSWQgPSBnZXRTdHJpbmcoYXR0cmlidXRlKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgICBjYXNlICd4LWdtLWxhYmVscyc6XG4gICAgICAgICAgICAgICAgICAgIG1hcC5sYWJlbHMgPSBuZXcgU2V0KGdldEFycmF5KGF0dHJpYnV0ZSkpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgIGNhc2UgJ3JmYzgyMi5zaXplJzpcbiAgICAgICAgICAgICAgICAgICAgbWFwLnNpemUgPSBOdW1iZXIoZ2V0U3RyaW5nKGF0dHJpYnV0ZSkpIHx8IDA7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgY2FzZSAnZmxhZ3MnOlxuICAgICAgICAgICAgICAgICAgICBtYXAuZmxhZ3MgPSBuZXcgU2V0KGdldEFycmF5KGF0dHJpYnV0ZSkpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgIGNhc2UgJ2VudmVsb3BlJzpcbiAgICAgICAgICAgICAgICAgICAgbWFwLmVudmVsb3BlID0gdG9vbHMucGFyc2VFbnZlbG9wZShhdHRyaWJ1dGUpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgIGNhc2UgJ2JvZHlzdHJ1Y3R1cmUnOlxuICAgICAgICAgICAgICAgICAgICBtYXAuYm9keVN0cnVjdHVyZSA9IHRvb2xzLnBhcnNlQm9keXN0cnVjdHVyZShhdHRyaWJ1dGUpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgIGNhc2UgJ2ludGVybmFsZGF0ZSc6IHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHZhbHVlID0gZ2V0U3RyaW5nKGF0dHJpYnV0ZSk7XG4gICAgICAgICAgICAgICAgICAgIGxldCBkYXRlID0gbmV3IERhdGUodmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZGF0ZS50b1N0cmluZygpID09PSAnSW52YWxpZCBEYXRlJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgbWFwLmludGVybmFsRGF0ZSA9IHZhbHVlO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgbWFwLmludGVybmFsRGF0ZSA9IGRhdGU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgICAgICAgICAgICBsZXQgbWF0Y2ggPSBrZXkubWF0Y2goLyhib2R5fGJpbmFyeSlcXFsvaSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChtYXRjaCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHBhcnRLZXkgPSBrZXkucmVwbGFjZSgvXihib2R5fGJpbmFyeSlcXFt8XSQvZ2ksICcnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcnRLZXkgPSBwYXJ0S2V5LnJlcGxhY2UoL1xcLmZpZWxkcy4qJC9nLCAnJyk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB2YWx1ZSA9IGdldEJ1ZmZlcihhdHRyaWJ1dGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhcnRLZXkgPT09ICdoZWFkZXInKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwLmhlYWRlcnMgPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFtYXAuYm9keVBhcnRzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwLmJvZHlQYXJ0cyA9IG5ldyBNYXAoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIG1hcC5ib2R5UGFydHMuc2V0KHBhcnRLZXksIHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChtYXAuZW1haWxJZCB8fCBtYXAudWlkKSB7XG4gICAgICAgICAgICAvLyBkZWZpbmUgYWNjb3VudCB1bmlxdWUgSUQgZm9yIHRoaXMgZW1haWxcblxuICAgICAgICAgICAgLy8gbm9ybWFsaXplIHBhdGggdG8gdXNlIGFzY2lpLCBzbyB3ZSB3b3VsZCBhbHdheXMgZ2V0IHRoZSBzYW1lIElEXG4gICAgICAgICAgICBsZXQgcGF0aCA9IG1haWxib3gucGF0aDtcbiAgICAgICAgICAgIGlmICgvWzB4ODAtMHhmZl0vLnRlc3QocGF0aCkpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBwYXRoID0gaWNvbnYuZW5jb2RlKHBhdGgsICd1dGYtNy1pbWFwJykudG9TdHJpbmcoKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBtYXAuaWQgPVxuICAgICAgICAgICAgICAgIG1hcC5lbWFpbElkIHx8XG4gICAgICAgICAgICAgICAgY3JlYXRlSGFzaCgnbWQ1JylcbiAgICAgICAgICAgICAgICAgICAgLnVwZGF0ZShbcGF0aCwgbWFpbGJveC51aWRWYWxpZGl0eT8udG9TdHJpbmcoKSB8fCAnJywgbWFwLnVpZC50b1N0cmluZygpXS5qb2luKCc6JykpXG4gICAgICAgICAgICAgICAgICAgIC5kaWdlc3QoJ2hleCcpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG1hcC5mbGFncykge1xuICAgICAgICAgICAgbGV0IGZsYWdDb2xvciA9IHRvb2xzLmdldEZsYWdDb2xvcihtYXAuZmxhZ3MpO1xuICAgICAgICAgICAgaWYgKGZsYWdDb2xvcikge1xuICAgICAgICAgICAgICAgIG1hcC5mbGFnQ29sb3IgPSBmbGFnQ29sb3I7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbWFwO1xuICAgIH0sXG5cbiAgICBwcm9jZXNzTmFtZShuYW1lKSB7XG4gICAgICAgIG5hbWUgPSAobmFtZSB8fCAnJykudG9TdHJpbmcoKTtcbiAgICAgICAgaWYgKG5hbWUubGVuZ3RoID4gMiAmJiBuYW1lLmF0KDApID09PSAnXCInICYmIG5hbWUuYXQoLTEpID09PSAnXCInKSB7XG4gICAgICAgICAgICBuYW1lID0gbmFtZS5yZXBsYWNlKC9eXCJ8XCIkL2csICcnKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmFtZTtcbiAgICB9LFxuXG4gICAgcGFyc2VFbnZlbG9wZShlbnRyeSkge1xuICAgICAgICBsZXQgZ2V0U3RyVmFsdWUgPSBvYmogPT4ge1xuICAgICAgICAgICAgaWYgKCFvYmopIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodHlwZW9mIG9iai52YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gb2JqLnZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKEJ1ZmZlci5pc0J1ZmZlcihvYmoudmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG9iai52YWx1ZS50b1N0cmluZygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG9iai52YWx1ZTtcbiAgICAgICAgfTtcblxuICAgICAgICBsZXQgcHJvY2Vzc0FkZHJlc3NlcyA9IGZ1bmN0aW9uIChsaXN0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFtdXG4gICAgICAgICAgICAgICAgICAgIC5jb25jYXQobGlzdCB8fCBbXSlcbiAgICAgICAgICAgICAgICAgICAgLm1hcChhZGRyID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBhZGRyZXNzID0gKGdldFN0clZhbHVlKGFkZHJbMl0pIHx8ICcnKSArICdAJyArIChnZXRTdHJWYWx1ZShhZGRyWzNdKSB8fCAnJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWRkcmVzcyA9PT0gJ0AnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcyA9ICcnO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiB0b29scy5wcm9jZXNzTmFtZShsaWJtaW1lLmRlY29kZVdvcmRzKGdldFN0clZhbHVlKGFkZHJbMF0pKSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzc1xuICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgLmZpbHRlcihhZGRyID0+IGFkZHIubmFtZSB8fCBhZGRyLmFkZHJlc3MpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGVudmVsb3BlID0ge307XG5cbiAgICAgICAgaWYgKGVudHJ5WzBdICYmIGVudHJ5WzBdLnZhbHVlKSB7XG4gICAgICAgICAgICBsZXQgZGF0ZSA9IG5ldyBEYXRlKGdldFN0clZhbHVlKGVudHJ5WzBdKSk7XG4gICAgICAgICAgICBpZiAoZGF0ZS50b1N0cmluZygpID09PSAnSW52YWxpZCBEYXRlJykge1xuICAgICAgICAgICAgICAgIGVudmVsb3BlLmRhdGUgPSBnZXRTdHJWYWx1ZShlbnRyeVswXSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGVudmVsb3BlLmRhdGUgPSBkYXRlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGVudHJ5WzFdICYmIGVudHJ5WzFdLnZhbHVlKSB7XG4gICAgICAgICAgICBlbnZlbG9wZS5zdWJqZWN0ID0gbGlibWltZS5kZWNvZGVXb3JkcyhnZXRTdHJWYWx1ZShlbnRyeVsxXSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGVudHJ5WzJdICYmIGVudHJ5WzJdLmxlbmd0aCkge1xuICAgICAgICAgICAgZW52ZWxvcGUuZnJvbSA9IHByb2Nlc3NBZGRyZXNzZXMoZW50cnlbMl0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGVudHJ5WzNdICYmIGVudHJ5WzNdLmxlbmd0aCkge1xuICAgICAgICAgICAgZW52ZWxvcGUuc2VuZGVyID0gcHJvY2Vzc0FkZHJlc3NlcyhlbnRyeVszXSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZW50cnlbNF0gJiYgZW50cnlbNF0ubGVuZ3RoKSB7XG4gICAgICAgICAgICBlbnZlbG9wZS5yZXBseVRvID0gcHJvY2Vzc0FkZHJlc3NlcyhlbnRyeVs0XSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZW50cnlbNV0gJiYgZW50cnlbNV0ubGVuZ3RoKSB7XG4gICAgICAgICAgICBlbnZlbG9wZS50byA9IHByb2Nlc3NBZGRyZXNzZXMoZW50cnlbNV0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGVudHJ5WzZdICYmIGVudHJ5WzZdLmxlbmd0aCkge1xuICAgICAgICAgICAgZW52ZWxvcGUuY2MgPSBwcm9jZXNzQWRkcmVzc2VzKGVudHJ5WzZdKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChlbnRyeVs3XSAmJiBlbnRyeVs3XS5sZW5ndGgpIHtcbiAgICAgICAgICAgIGVudmVsb3BlLmJjYyA9IHByb2Nlc3NBZGRyZXNzZXMoZW50cnlbN10pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGVudHJ5WzhdICYmIGVudHJ5WzhdLnZhbHVlKSB7XG4gICAgICAgICAgICBlbnZlbG9wZS5pblJlcGx5VG8gPSAoZ2V0U3RyVmFsdWUoZW50cnlbOF0pIHx8ICcnKS50b1N0cmluZygpLnRyaW0oKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChlbnRyeVs5XSAmJiBlbnRyeVs5XS52YWx1ZSkge1xuICAgICAgICAgICAgZW52ZWxvcGUubWVzc2FnZUlkID0gKGdldFN0clZhbHVlKGVudHJ5WzldKSB8fCAnJykudG9TdHJpbmcoKS50cmltKCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZW52ZWxvcGU7XG4gICAgfSxcblxuICAgIGdldFN0cnVjdHVyZWRQYXJhbXMoYXJyKSB7XG4gICAgICAgIGxldCBrZXk7XG5cbiAgICAgICAgbGV0IHBhcmFtcyA9IHt9O1xuXG4gICAgICAgIFtdLmNvbmNhdChhcnIgfHwgW10pLmZvckVhY2goKHZhbCwgaikgPT4ge1xuICAgICAgICAgICAgaWYgKGogJSAyKSB7XG4gICAgICAgICAgICAgICAgcGFyYW1zW2tleV0gPSBsaWJtaW1lLmRlY29kZVdvcmRzKCgodmFsICYmIHZhbC52YWx1ZSkgfHwgJycpLnRvU3RyaW5nKCkpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBrZXkgPSAoKHZhbCAmJiB2YWwudmFsdWUpIHx8ICcnKS50b1N0cmluZygpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmIChwYXJhbXMuZmlsZW5hbWUgJiYgIXBhcmFtc1snZmlsZW5hbWUqJ10gJiYgL15bYS16XFwtXzAtOV0rJ1thLXpdKidbXidcXHgwMC1cXHgwOFxceDBiXFx4MGNcXHgwZS1cXHgxZlxcdTAwODAtXFx1RkZGRl0rLy50ZXN0KHBhcmFtcy5maWxlbmFtZSkpIHtcbiAgICAgICAgICAgIC8vIHNlZW1zIGxpa2UgZW5jb2RlZCB2YWx1ZVxuICAgICAgICAgICAgbGV0IFtlbmNvZGluZywgLCBlbmNvZGVkVmFsdWVdID0gcGFyYW1zLmZpbGVuYW1lLnNwbGl0KFwiJ1wiKTtcbiAgICAgICAgICAgIGlmIChyZXNvbHZlQ2hhcnNldChlbmNvZGluZykpIHtcbiAgICAgICAgICAgICAgICBwYXJhbXNbJ2ZpbGVuYW1lKiddID0gYCR7ZW5jb2Rpbmd9Jycke2VuY29kZWRWYWx1ZX1gO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gcHJlcHJvY2VzcyB2YWx1ZXNcbiAgICAgICAgT2JqZWN0LmtleXMocGFyYW1zKS5mb3JFYWNoKGtleSA9PiB7XG4gICAgICAgICAgICBsZXQgYWN0dWFsS2V5O1xuICAgICAgICAgICAgbGV0IG5yO1xuICAgICAgICAgICAgbGV0IHZhbHVlO1xuXG4gICAgICAgICAgICBsZXQgbWF0Y2ggPSBrZXkubWF0Y2goL1xcKigoXFxkKylcXCo/KT8kLyk7XG5cbiAgICAgICAgICAgIGlmICghbWF0Y2gpIHtcbiAgICAgICAgICAgICAgICAvLyBub3RoaW5nIHRvIGRvIGhlcmUsIGRvZXMgbm90IHNlZW0gbGlrZSBhIGNvbnRpbnVhdGlvbiBwYXJhbVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgYWN0dWFsS2V5ID0ga2V5LnN1YnN0cigwLCBtYXRjaC5pbmRleCkudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgIG5yID0gTnVtYmVyKG1hdGNoWzJdKSB8fCAwO1xuXG4gICAgICAgICAgICBpZiAoIXBhcmFtc1thY3R1YWxLZXldIHx8IHR5cGVvZiBwYXJhbXNbYWN0dWFsS2V5XSAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgICAgICBwYXJhbXNbYWN0dWFsS2V5XSA9IHtcbiAgICAgICAgICAgICAgICAgICAgY2hhcnNldDogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlczogW11cbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YWx1ZSA9IHBhcmFtc1trZXldO1xuXG4gICAgICAgICAgICBpZiAobnIgPT09IDAgJiYgbWF0Y2hbMF0uY2hhckF0KG1hdGNoWzBdLmxlbmd0aCAtIDEpID09PSAnKicgJiYgKG1hdGNoID0gdmFsdWUubWF0Y2goL14oW14nXSopJ1teJ10qJyguKikkLykpKSB7XG4gICAgICAgICAgICAgICAgcGFyYW1zW2FjdHVhbEtleV0uY2hhcnNldCA9IG1hdGNoWzFdIHx8ICd1dGYtOCc7XG4gICAgICAgICAgICAgICAgdmFsdWUgPSBtYXRjaFsyXTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcGFyYW1zW2FjdHVhbEtleV0udmFsdWVzLnB1c2goeyBuciwgdmFsdWUgfSk7XG5cbiAgICAgICAgICAgIC8vIHJlbW92ZSB0aGUgb2xkIHJlZmVyZW5jZVxuICAgICAgICAgICAgZGVsZXRlIHBhcmFtc1trZXldO1xuICAgICAgICB9KTtcblxuICAgICAgICAvLyBjb25jYXRlbmF0ZSBzcGxpdCByZmMyMjMxIHN0cmluZ3MgYW5kIGNvbnZlcnQgZW5jb2RlZCBzdHJpbmdzIHRvIG1pbWUgZW5jb2RlZCB3b3Jkc1xuICAgICAgICBPYmplY3Qua2V5cyhwYXJhbXMpLmZvckVhY2goa2V5ID0+IHtcbiAgICAgICAgICAgIGxldCB2YWx1ZTtcbiAgICAgICAgICAgIGlmIChwYXJhbXNba2V5XSAmJiBBcnJheS5pc0FycmF5KHBhcmFtc1trZXldLnZhbHVlcykpIHtcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IHBhcmFtc1trZXldLnZhbHVlc1xuICAgICAgICAgICAgICAgICAgICAuc29ydCgoYSwgYikgPT4gYS5uciAtIGIubnIpXG4gICAgICAgICAgICAgICAgICAgIC5tYXAodmFsID0+ICh2YWwgJiYgdmFsLnZhbHVlKSB8fCAnJylcbiAgICAgICAgICAgICAgICAgICAgLmpvaW4oJycpO1xuXG4gICAgICAgICAgICAgICAgaWYgKHBhcmFtc1trZXldLmNoYXJzZXQpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gY29udmVydCBcIiVBQlwiIHRvIFwiPT9jaGFyc2V0P1E/PUFCPz1cIiBhbmQgdGhlbiB0byB1bmljb2RlXG4gICAgICAgICAgICAgICAgICAgIHBhcmFtc1trZXldID0gbGlibWltZS5kZWNvZGVXb3JkcyhcbiAgICAgICAgICAgICAgICAgICAgICAgICc9PycgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtc1trZXldLmNoYXJzZXQgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICc/UT8nICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmaXggaW52YWxpZGx5IGVuY29kZWQgY2hhcnNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoL1s9P19cXHNdL2csIHMgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGMgPSBzLmNoYXJDb2RlQXQoMCkudG9TdHJpbmcoMTYpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHMgPT09ICcgJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnXyc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnJScgKyAoYy5sZW5ndGggPCAyID8gJzAnIDogJycpICsgYztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2hhbmdlIGZyb20gdXJsZW5jb2RpbmcgdG8gcGVyY2VudCBlbmNvZGluZ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucmVwbGFjZSgvJS9nLCAnPScpICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPz0nXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcGFyYW1zW2tleV0gPSBsaWJtaW1lLmRlY29kZVdvcmRzKHZhbHVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBwYXJhbXM7XG4gICAgfSxcblxuICAgIHBhcnNlQm9keXN0cnVjdHVyZShlbnRyeSkge1xuICAgICAgICBsZXQgd2FsayA9IChub2RlLCBwYXRoKSA9PiB7XG4gICAgICAgICAgICBwYXRoID0gcGF0aCB8fCBbXTtcblxuICAgICAgICAgICAgbGV0IGN1ck5vZGUgPSB7fSxcbiAgICAgICAgICAgICAgICBpID0gMCxcbiAgICAgICAgICAgICAgICBwYXJ0ID0gMDtcblxuICAgICAgICAgICAgaWYgKHBhdGgubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgY3VyTm9kZS5wYXJ0ID0gcGF0aC5qb2luKCcuJyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIG11bHRpcGFydFxuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkobm9kZVswXSkpIHtcbiAgICAgICAgICAgICAgICBjdXJOb2RlLmNoaWxkTm9kZXMgPSBbXTtcbiAgICAgICAgICAgICAgICB3aGlsZSAoQXJyYXkuaXNBcnJheShub2RlW2ldKSkge1xuICAgICAgICAgICAgICAgICAgICBjdXJOb2RlLmNoaWxkTm9kZXMucHVzaCh3YWxrKG5vZGVbaV0sIHBhdGguY29uY2F0KCsrcGFydCkpKTtcbiAgICAgICAgICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIG11bHRpcGFydCB0eXBlXG4gICAgICAgICAgICAgICAgY3VyTm9kZS50eXBlID0gJ211bHRpcGFydC8nICsgKChub2RlW2krK10gfHwge30pLnZhbHVlIHx8ICcnKS50b1N0cmluZygpLnRvTG93ZXJDYXNlKCk7XG5cbiAgICAgICAgICAgICAgICAvLyBleHRlbnNpb24gZGF0YSAobm90IGF2YWlsYWJsZSBmb3IgQk9EWSByZXF1ZXN0cylcblxuICAgICAgICAgICAgICAgIC8vIGJvZHkgcGFyYW1ldGVyIHBhcmVudGhlc2l6ZWQgbGlzdFxuICAgICAgICAgICAgICAgIGlmIChpIDwgbm9kZS5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChub2RlW2ldKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJOb2RlLnBhcmFtZXRlcnMgPSB0b29scy5nZXRTdHJ1Y3R1cmVkUGFyYW1zKG5vZGVbaV0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGkrKztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIGNvbnRlbnQgdHlwZVxuICAgICAgICAgICAgICAgIGN1ck5vZGUudHlwZSA9IFsoKG5vZGVbaSsrXSB8fCB7fSkudmFsdWUgfHwgJycpLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSwgKChub2RlW2krK10gfHwge30pLnZhbHVlIHx8ICcnKS50b1N0cmluZygpLnRvTG93ZXJDYXNlKCldLmpvaW4oJy8nKTtcblxuICAgICAgICAgICAgICAgIC8vIGJvZHkgcGFyYW1ldGVyIHBhcmVudGhlc2l6ZWQgbGlzdFxuICAgICAgICAgICAgICAgIGlmIChub2RlW2ldKSB7XG4gICAgICAgICAgICAgICAgICAgIGN1ck5vZGUucGFyYW1ldGVycyA9IHRvb2xzLmdldFN0cnVjdHVyZWRQYXJhbXMobm9kZVtpXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGkrKztcblxuICAgICAgICAgICAgICAgIC8vIGlkXG4gICAgICAgICAgICAgICAgaWYgKG5vZGVbaV0pIHtcbiAgICAgICAgICAgICAgICAgICAgY3VyTm9kZS5pZCA9ICgobm9kZVtpXSB8fCB7fSkudmFsdWUgfHwgJycpLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGkrKztcblxuICAgICAgICAgICAgICAgIC8vIGRlc2NyaXB0aW9uXG4gICAgICAgICAgICAgICAgaWYgKG5vZGVbaV0pIHtcbiAgICAgICAgICAgICAgICAgICAgY3VyTm9kZS5kZXNjcmlwdGlvbiA9ICgobm9kZVtpXSB8fCB7fSkudmFsdWUgfHwgJycpLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGkrKztcblxuICAgICAgICAgICAgICAgIC8vIGVuY29kaW5nXG4gICAgICAgICAgICAgICAgaWYgKG5vZGVbaV0pIHtcbiAgICAgICAgICAgICAgICAgICAgY3VyTm9kZS5lbmNvZGluZyA9ICgobm9kZVtpXSB8fCB7fSkudmFsdWUgfHwgJycpLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaSsrO1xuXG4gICAgICAgICAgICAgICAgLy8gc2l6ZVxuICAgICAgICAgICAgICAgIGlmIChub2RlW2ldKSB7XG4gICAgICAgICAgICAgICAgICAgIGN1ck5vZGUuc2l6ZSA9IE51bWJlcigobm9kZVtpXSB8fCB7fSkudmFsdWUgfHwgMCkgfHwgMDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaSsrO1xuXG4gICAgICAgICAgICAgICAgaWYgKGN1ck5vZGUudHlwZSA9PT0gJ21lc3NhZ2UvcmZjODIyJykge1xuICAgICAgICAgICAgICAgICAgICAvLyBtZXNzYWdlL3JmYyBhZGRzIGFkZGl0aW9uYWwgZW52ZWxvcGUsIGJvZHlzdHJ1Y3R1cmUgYW5kIGxpbmUgY291bnQgdmFsdWVzXG5cbiAgICAgICAgICAgICAgICAgICAgLy8gZW52ZWxvcGVcbiAgICAgICAgICAgICAgICAgICAgaWYgKG5vZGVbaV0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGN1ck5vZGUuZW52ZWxvcGUgPSB0b29scy5wYXJzZUVudmVsb3BlKFtdLmNvbmNhdChub2RlW2ldIHx8IFtdKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaSsrO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChub2RlW2ldKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJOb2RlLmNoaWxkTm9kZXMgPSBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmZjODIyIGJvZHlwYXJ0cyBzaGFyZSB0aGUgc2FtZSBwYXRoLCBkaWZmZXJlbmNlIGlzIGJldHdlZW4gTUlNRSBhbmQgSEVBREVSXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcGF0aC5NSU1FIHJldHVybnMgbWVzc2FnZS9yZmM4MjIgaGVhZGVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcGF0aC5IRUFERVIgcmV0dXJucyBpbmxpbmVkIG1lc3NhZ2UgaGVhZGVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2Fsayhub2RlW2ldLCBwYXRoKVxuICAgICAgICAgICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpKys7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gbGluZSBjb3VudFxuICAgICAgICAgICAgICAgICAgICBpZiAobm9kZVtpXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY3VyTm9kZS5saW5lQ291bnQgPSBOdW1iZXIoKG5vZGVbaV0gfHwge30pLnZhbHVlIHx8IDApIHx8IDA7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmICgvXnRleHRcXC8vLnRlc3QoY3VyTm9kZS50eXBlKSkge1xuICAgICAgICAgICAgICAgICAgICAvLyB0ZXh0LyogYWRkcyBhZGRpdGlvbmFsIGxpbmUgY291bnQgdmFsdWVcblxuICAgICAgICAgICAgICAgICAgICAvLyBOQiEgc29tZSBsZXNzIGtub3duIHNlcnZlcnMgZG8gbm90IGluY2x1ZGUgdGhlIGxpbmUgY291bnQgdmFsdWVcbiAgICAgICAgICAgICAgICAgICAgLy8gbGVuZ3RoIHNob3VsZCBiZSAxMitcbiAgICAgICAgICAgICAgICAgICAgaWYgKG5vZGUubGVuZ3RoID09PSAxMSAmJiBBcnJheS5pc0FycmF5KG5vZGVbaSArIDFdKSAmJiAhQXJyYXkuaXNBcnJheShub2RlW2kgKyAyXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGludmFsaWQgc3RydWN0dXJlLCBkaXNwb3NpdGlvbiBwYXJhbXMgYXJlIHNoaWZ0ZWRcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvcnJlY3Qgc3RydWN0dXJlLCBsaW5lIGNvdW50IG51bWJlciBpcyBwcm92aWRlZFxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5vZGVbaV0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsaW5lIGNvdW50XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VyTm9kZS5saW5lQ291bnQgPSBOdW1iZXIoKG5vZGVbaV0gfHwge30pLnZhbHVlIHx8IDApIHx8IDA7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpKys7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBleHRlbnNpb24gZGF0YSAobm90IGF2YWlsYWJsZSBmb3IgQk9EWSByZXF1ZXN0cylcblxuICAgICAgICAgICAgICAgIC8vIG1kNVxuICAgICAgICAgICAgICAgIGlmIChpIDwgbm9kZS5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChub2RlW2ldKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJOb2RlLm1kNSA9ICgobm9kZVtpXSB8fCB7fSkudmFsdWUgfHwgJycpLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpKys7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyB0aGUgZm9sbG93aW5nIGFyZSBzaGFyZWQgZXh0ZW5zaW9uIHZhbHVlcyAoZm9yIGJvdGggbXVsdGlwYXJ0IGFuZCBub24tbXVsdGlwYXJ0IHBhcnRzKVxuICAgICAgICAgICAgLy8gbm90IGF2YWlsYWJsZSBmb3IgQk9EWSByZXF1ZXN0c1xuXG4gICAgICAgICAgICAvLyBib2R5IGRpc3Bvc2l0aW9uXG4gICAgICAgICAgICBpZiAoaSA8IG5vZGUubGVuZ3RoIC0gMSkge1xuICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KG5vZGVbaV0pICYmIG5vZGVbaV0ubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIGN1ck5vZGUuZGlzcG9zaXRpb24gPSAoKG5vZGVbaV1bMF0gfHwge30pLnZhbHVlIHx8ICcnKS50b1N0cmluZygpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KG5vZGVbaV1bMV0pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJOb2RlLmRpc3Bvc2l0aW9uUGFyYW1ldGVycyA9IHRvb2xzLmdldFN0cnVjdHVyZWRQYXJhbXMobm9kZVtpXVsxXSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBib2R5IGxhbmd1YWdlXG4gICAgICAgICAgICBpZiAoaSA8IG5vZGUubGVuZ3RoIC0gMSkge1xuICAgICAgICAgICAgICAgIGlmIChub2RlW2ldKSB7XG4gICAgICAgICAgICAgICAgICAgIGN1ck5vZGUubGFuZ3VhZ2UgPSBbXS5jb25jYXQobm9kZVtpXSB8fCBbXSkubWFwKHZhbCA9PiAoKHZhbCAmJiB2YWwudmFsdWUpIHx8ICcnKS50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpKys7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIGJvZHkgbG9jYXRpb25cbiAgICAgICAgICAgIC8vIE5CISBkZWZpbmVkIGFzIGEgXCJzdHJpbmcgbGlzdFwiIGluIFJGQzM1MDEgYnV0IHJlcGxhY2VkIGluIGVycmF0YSBkb2N1bWVudCB3aXRoIFwic3RyaW5nXCJcbiAgICAgICAgICAgIC8vIEVycmF0YTogaHR0cDovL3d3dy5yZmMtZWRpdG9yLm9yZy9lcnJhdGFfc2VhcmNoLnBocD9yZmM9MzUwMVxuICAgICAgICAgICAgaWYgKGkgPCBub2RlLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICAgICAgICBpZiAobm9kZVtpXSkge1xuICAgICAgICAgICAgICAgICAgICBjdXJOb2RlLmxvY2F0aW9uID0gKChub2RlW2ldIHx8IHt9KS52YWx1ZSB8fCAnJykudG9TdHJpbmcoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gY3VyTm9kZTtcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gd2FsayhlbnRyeSk7XG4gICAgfSxcblxuICAgIGZvcm1hdERhdGUodmFsdWUpIHtcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHZhbHVlID0gbmV3IERhdGUodmFsdWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcodmFsdWUpICE9PSAnW29iamVjdCBPYmplY3RdJyB8fCB2YWx1ZS50b1N0cmluZygpID09PSAnSW52YWxpZCBEYXRlJykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFsdWUgPSB2YWx1ZS50b0lTT1N0cmluZygpLnN1YnN0cigwLCAxMCk7XG4gICAgICAgIHZhbHVlID0gdmFsdWUuc3BsaXQoJy0nKTtcbiAgICAgICAgdmFsdWUucmV2ZXJzZSgpO1xuXG4gICAgICAgIGxldCBtb250aHMgPSBbJ0phbicsICdGZWInLCAnTWFyJywgJ0FwcicsICdNYXknLCAnSnVuJywgJ0p1bCcsICdBdWcnLCAnU2VwJywgJ09jdCcsICdOb3YnLCAnRGVjJ107XG4gICAgICAgIHZhbHVlWzFdID0gbW9udGhzW051bWJlcih2YWx1ZVsxXSkgLSAxXTtcblxuICAgICAgICByZXR1cm4gdmFsdWUuam9pbignLScpO1xuICAgIH0sXG5cbiAgICBmb3JtYXREYXRlVGltZSh2YWx1ZSkge1xuICAgICAgICBpZiAoIXZhbHVlKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgdmFsdWUgPSBuZXcgRGF0ZSh2YWx1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZyh2YWx1ZSkgIT09ICdbb2JqZWN0IE9iamVjdF0nIHx8IHZhbHVlLnRvU3RyaW5nKCkgPT09ICdJbnZhbGlkIERhdGUnKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgZGF0ZVN0ciA9IHRvb2xzLmZvcm1hdERhdGUodmFsdWUpLnJlcGxhY2UoL14wLywgJyAnKTsgLy9zdGFydHMgd2l0aCBkYXRlLWRheS1maXhlZCB3aXRoIGxlYWRpbmcgMCByZXBsYWNlZCBieSBTUFxuICAgICAgICBsZXQgdGltZVN0ciA9IHZhbHVlLnRvSVNPU3RyaW5nKCkuc3Vic3RyKDExLCA4KTtcblxuICAgICAgICByZXR1cm4gYCR7ZGF0ZVN0cn0gJHt0aW1lU3RyfSArMDAwMGA7XG4gICAgfSxcblxuICAgIGZvcm1hdEZsYWcoZmxhZykge1xuICAgICAgICBzd2l0Y2ggKGZsYWcudG9Mb3dlckNhc2UoKSkge1xuICAgICAgICAgICAgY2FzZSAnXFxcXHJlY2VudCc6XG4gICAgICAgICAgICAgICAgLy8gY2FuIG5vdCBzZXQgb3IgcmVtb3ZlXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgY2FzZSAnXFxcXHNlZW4nOlxuICAgICAgICAgICAgY2FzZSAnXFxcXGFuc3dlcmVkJzpcbiAgICAgICAgICAgIGNhc2UgJ1xcXFxmbGFnZ2VkJzpcbiAgICAgICAgICAgIGNhc2UgJ1xcXFxkZWxldGVkJzpcbiAgICAgICAgICAgIGNhc2UgJ1xcXFxkcmFmdCc6XG4gICAgICAgICAgICAgICAgLy8gY2FuIG5vdCBzZXQgb3IgcmVtb3ZlXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZsYWcudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9eXFxcXC4vLCBjID0+IGMudG9VcHBlckNhc2UoKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZsYWc7XG4gICAgfSxcblxuICAgIGNhblVzZUZsYWcobWFpbGJveCwgZmxhZykge1xuICAgICAgICByZXR1cm4gIW1haWxib3ggfHwgIW1haWxib3gucGVybWFuZW50RmxhZ3MgfHwgbWFpbGJveC5wZXJtYW5lbnRGbGFncy5oYXMoJ1xcXFwqJykgfHwgbWFpbGJveC5wZXJtYW5lbnRGbGFncy5oYXMoZmxhZyk7XG4gICAgfSxcblxuICAgIGV4cGFuZFJhbmdlKHJhbmdlKSB7XG4gICAgICAgIHJldHVybiByYW5nZS5zcGxpdCgnLCcpLmZsYXRNYXAoZW50cnkgPT4ge1xuICAgICAgICAgICAgZW50cnkgPSBlbnRyeS50cmltKCk7XG4gICAgICAgICAgICBsZXQgY29sb24gPSBlbnRyeS5pbmRleE9mKCc6Jyk7XG4gICAgICAgICAgICBpZiAoY29sb24gPCAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIE51bWJlcihlbnRyeSkgfHwgMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCBmaXJzdCA9IE51bWJlcihlbnRyeS5zdWJzdHIoMCwgY29sb24pKSB8fCAwO1xuICAgICAgICAgICAgbGV0IHNlY29uZCA9IE51bWJlcihlbnRyeS5zdWJzdHIoY29sb24gKyAxKSkgfHwgMDtcbiAgICAgICAgICAgIGlmIChmaXJzdCA9PT0gc2Vjb25kKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZpcnN0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IGxpc3QgPSBbXTtcbiAgICAgICAgICAgIGlmIChmaXJzdCA8IHNlY29uZCkge1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSBmaXJzdDsgaSA8PSBzZWNvbmQ7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBsaXN0LnB1c2goaSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gZmlyc3Q7IGkgPj0gc2Vjb25kOyBpLS0pIHtcbiAgICAgICAgICAgICAgICAgICAgbGlzdC5wdXNoKGkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBsaXN0O1xuICAgICAgICB9KTtcbiAgICB9LFxuXG4gICAgZ2V0RGVjb2RlcihjaGFyc2V0KSB7XG4gICAgICAgIGNoYXJzZXQgPSAoY2hhcnNldCB8fCAnYXNjaWknKS50b1N0cmluZygpLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBpZiAoL15qaXN8Xmlzby0/MjAyMi0/anB8XkVVQ0pQL2kudGVzdChjaGFyc2V0KSkge1xuICAgICAgICAgICAgLy8gc3BlY2lhbCBjYXNlIG5vdCBzdXBwb3J0ZWQgYnkgaWNvbnYtbGl0ZVxuICAgICAgICAgICAgcmV0dXJuIG5ldyBKUERlY29kZXIoY2hhcnNldCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gaWNvbnYuZGVjb2RlU3RyZWFtKGNoYXJzZXQpO1xuICAgIH0sXG5cbiAgICBwYWNrTWVzc2FnZVJhbmdlKGxpc3QpIHtcbiAgICAgICAgaWYgKHR5cGVvZiB1aWRMaXN0ID09PSAnc3RyaW5nJylcbiAgICAgICAgICAgIGlmICghQXJyYXkuaXNBcnJheShsaXN0KSkge1xuICAgICAgICAgICAgICAgIGxpc3QgPSBbXS5jb25jYXQobGlzdCB8fCBbXSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFsaXN0Lmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuICcnO1xuICAgICAgICB9XG5cbiAgICAgICAgbGlzdC5zb3J0KChhLCBiKSA9PiBhIC0gYik7XG5cbiAgICAgICAgbGV0IGxhc3QgPSBsaXN0W2xpc3QubGVuZ3RoIC0gMV07XG4gICAgICAgIGxldCByZXN1bHQgPSBbW2xhc3RdXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IGxpc3QubGVuZ3RoIC0gMjsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgICAgIGlmIChsaXN0W2ldID09PSBsaXN0W2kgKyAxXSAtIDEpIHtcbiAgICAgICAgICAgICAgICByZXN1bHRbMF0udW5zaGlmdChsaXN0W2ldKTtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlc3VsdC51bnNoaWZ0KFtsaXN0W2ldXSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXN1bHQgPSByZXN1bHQubWFwKGl0ZW0gPT4ge1xuICAgICAgICAgICAgaWYgKGl0ZW0ubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW1bMF07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gaXRlbS5zaGlmdCgpICsgJzonICsgaXRlbS5wb3AoKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdC5qb2luKCcsJyk7XG4gICAgfVxufTtcblxubW9kdWxlLmV4cG9ydHMgPSB0b29scztcbiJdLCJuYW1lcyI6W10sImlnbm9yZUxpc3QiOlswXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(action-browser)/./node_modules/imapflow/lib/tools.js\n");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "(action-browser)/./node_modules/imapflow/node_modules/mailsplit/index.js":
|
|
/*!***************************************************************!*\
|
|
!*** ./node_modules/imapflow/node_modules/mailsplit/index.js ***!
|
|
\***************************************************************/
|
|
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
|
|
|
|
eval("\n\nconst MessageSplitter = __webpack_require__(/*! ./lib/message-splitter */ \"(action-browser)/./node_modules/imapflow/node_modules/mailsplit/lib/message-splitter.js\");\nconst MessageJoiner = __webpack_require__(/*! ./lib/message-joiner */ \"(action-browser)/./node_modules/imapflow/node_modules/mailsplit/lib/message-joiner.js\");\nconst NodeRewriter = __webpack_require__(/*! ./lib/node-rewriter */ \"(action-browser)/./node_modules/imapflow/node_modules/mailsplit/lib/node-rewriter.js\");\nconst NodeStreamer = __webpack_require__(/*! ./lib/node-streamer */ \"(action-browser)/./node_modules/imapflow/node_modules/mailsplit/lib/node-streamer.js\");\nconst Headers = __webpack_require__(/*! ./lib/headers */ \"(action-browser)/./node_modules/imapflow/node_modules/mailsplit/lib/headers.js\");\n\nmodule.exports = {\n Splitter: MessageSplitter,\n Joiner: MessageJoiner,\n Rewriter: NodeRewriter,\n Streamer: NodeStreamer,\n Headers\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFjdGlvbi1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9pbWFwZmxvdy9ub2RlX21vZHVsZXMvbWFpbHNwbGl0L2luZGV4LmpzIiwibWFwcGluZ3MiOiJBQUFhOztBQUViLHdCQUF3QixtQkFBTyxDQUFDLHVIQUF3QjtBQUN4RCxzQkFBc0IsbUJBQU8sQ0FBQyxtSEFBc0I7QUFDcEQscUJBQXFCLG1CQUFPLENBQUMsaUhBQXFCO0FBQ2xELHFCQUFxQixtQkFBTyxDQUFDLGlIQUFxQjtBQUNsRCxnQkFBZ0IsbUJBQU8sQ0FBQyxxR0FBZTs7QUFFdkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIi9ob21lL2FsbWEvbmV4dGdlbi9OZWFoLW1haWwvbm9kZV9tb2R1bGVzL2ltYXBmbG93L25vZGVfbW9kdWxlcy9tYWlsc3BsaXQvaW5kZXguanMiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCBNZXNzYWdlU3BsaXR0ZXIgPSByZXF1aXJlKCcuL2xpYi9tZXNzYWdlLXNwbGl0dGVyJyk7XG5jb25zdCBNZXNzYWdlSm9pbmVyID0gcmVxdWlyZSgnLi9saWIvbWVzc2FnZS1qb2luZXInKTtcbmNvbnN0IE5vZGVSZXdyaXRlciA9IHJlcXVpcmUoJy4vbGliL25vZGUtcmV3cml0ZXInKTtcbmNvbnN0IE5vZGVTdHJlYW1lciA9IHJlcXVpcmUoJy4vbGliL25vZGUtc3RyZWFtZXInKTtcbmNvbnN0IEhlYWRlcnMgPSByZXF1aXJlKCcuL2xpYi9oZWFkZXJzJyk7XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICAgIFNwbGl0dGVyOiBNZXNzYWdlU3BsaXR0ZXIsXG4gICAgSm9pbmVyOiBNZXNzYWdlSm9pbmVyLFxuICAgIFJld3JpdGVyOiBOb2RlUmV3cml0ZXIsXG4gICAgU3RyZWFtZXI6IE5vZGVTdHJlYW1lcixcbiAgICBIZWFkZXJzXG59O1xuIl0sIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6WzBdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(action-browser)/./node_modules/imapflow/node_modules/mailsplit/index.js\n");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "(action-browser)/./node_modules/imapflow/node_modules/mailsplit/lib/flowed-decoder.js":
|
|
/*!****************************************************************************!*\
|
|
!*** ./node_modules/imapflow/node_modules/mailsplit/lib/flowed-decoder.js ***!
|
|
\****************************************************************************/
|
|
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
|
|
|
|
eval("\n\n// Helper class to rewrite nodes with specific mime type\n\nconst Transform = (__webpack_require__(/*! stream */ \"stream\").Transform);\nconst libmime = __webpack_require__(/*! libmime */ \"(action-browser)/./node_modules/libmime/lib/libmime.js\");\n\n/**\n * Really bad \"stream\" transform to parse format=flowed content\n *\n * @constructor\n * @param {String} delSp True if delsp option was used\n */\nclass FlowedDecoder extends Transform {\n constructor(config) {\n super();\n this.config = config || {};\n\n this.chunks = [];\n this.chunklen = 0;\n\n this.libmime = new libmime.Libmime({ Iconv: config.Iconv });\n }\n\n _transform(chunk, encoding, callback) {\n if (!chunk || !chunk.length) {\n return callback();\n }\n\n if (!encoding !== 'buffer') {\n chunk = Buffer.from(chunk, encoding);\n }\n\n this.chunks.push(chunk);\n this.chunklen += chunk.length;\n\n callback();\n }\n\n _flush(callback) {\n if (this.chunklen) {\n let currentBody = Buffer.concat(this.chunks, this.chunklen);\n\n if (this.config.encoding === 'base64') {\n currentBody = Buffer.from(currentBody.toString('binary'), 'base64');\n }\n\n let content = this.libmime.decodeFlowed(currentBody.toString('binary'), this.config.delSp);\n this.push(Buffer.from(content, 'binary'));\n }\n return callback();\n }\n}\n\nmodule.exports = FlowedDecoder;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFjdGlvbi1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9pbWFwZmxvdy9ub2RlX21vZHVsZXMvbWFpbHNwbGl0L2xpYi9mbG93ZWQtZGVjb2Rlci5qcyIsIm1hcHBpbmdzIjoiQUFBYTs7QUFFYjs7QUFFQSxrQkFBa0IsdURBQTJCO0FBQzdDLGdCQUFnQixtQkFBTyxDQUFDLHVFQUFTOztBQUVqQztBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsUUFBUTtBQUNuQjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUEsNkNBQTZDLHFCQUFxQjtBQUNsRTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBIiwic291cmNlcyI6WyIvaG9tZS9hbG1hL25leHRnZW4vTmVhaC1tYWlsL25vZGVfbW9kdWxlcy9pbWFwZmxvdy9ub2RlX21vZHVsZXMvbWFpbHNwbGl0L2xpYi9mbG93ZWQtZGVjb2Rlci5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbi8vIEhlbHBlciBjbGFzcyB0byByZXdyaXRlIG5vZGVzIHdpdGggc3BlY2lmaWMgbWltZSB0eXBlXG5cbmNvbnN0IFRyYW5zZm9ybSA9IHJlcXVpcmUoJ3N0cmVhbScpLlRyYW5zZm9ybTtcbmNvbnN0IGxpYm1pbWUgPSByZXF1aXJlKCdsaWJtaW1lJyk7XG5cbi8qKlxuICogUmVhbGx5IGJhZCBcInN0cmVhbVwiIHRyYW5zZm9ybSB0byBwYXJzZSBmb3JtYXQ9Zmxvd2VkIGNvbnRlbnRcbiAqXG4gKiBAY29uc3RydWN0b3JcbiAqIEBwYXJhbSB7U3RyaW5nfSBkZWxTcCBUcnVlIGlmIGRlbHNwIG9wdGlvbiB3YXMgdXNlZFxuICovXG5jbGFzcyBGbG93ZWREZWNvZGVyIGV4dGVuZHMgVHJhbnNmb3JtIHtcbiAgICBjb25zdHJ1Y3Rvcihjb25maWcpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5jb25maWcgPSBjb25maWcgfHwge307XG5cbiAgICAgICAgdGhpcy5jaHVua3MgPSBbXTtcbiAgICAgICAgdGhpcy5jaHVua2xlbiA9IDA7XG5cbiAgICAgICAgdGhpcy5saWJtaW1lID0gbmV3IGxpYm1pbWUuTGlibWltZSh7IEljb252OiBjb25maWcuSWNvbnYgfSk7XG4gICAgfVxuXG4gICAgX3RyYW5zZm9ybShjaHVuaywgZW5jb2RpbmcsIGNhbGxiYWNrKSB7XG4gICAgICAgIGlmICghY2h1bmsgfHwgIWNodW5rLmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWVuY29kaW5nICE9PSAnYnVmZmVyJykge1xuICAgICAgICAgICAgY2h1bmsgPSBCdWZmZXIuZnJvbShjaHVuaywgZW5jb2RpbmcpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jaHVua3MucHVzaChjaHVuayk7XG4gICAgICAgIHRoaXMuY2h1bmtsZW4gKz0gY2h1bmsubGVuZ3RoO1xuXG4gICAgICAgIGNhbGxiYWNrKCk7XG4gICAgfVxuXG4gICAgX2ZsdXNoKGNhbGxiYWNrKSB7XG4gICAgICAgIGlmICh0aGlzLmNodW5rbGVuKSB7XG4gICAgICAgICAgICBsZXQgY3VycmVudEJvZHkgPSBCdWZmZXIuY29uY2F0KHRoaXMuY2h1bmtzLCB0aGlzLmNodW5rbGVuKTtcblxuICAgICAgICAgICAgaWYgKHRoaXMuY29uZmlnLmVuY29kaW5nID09PSAnYmFzZTY0Jykge1xuICAgICAgICAgICAgICAgIGN1cnJlbnRCb2R5ID0gQnVmZmVyLmZyb20oY3VycmVudEJvZHkudG9TdHJpbmcoJ2JpbmFyeScpLCAnYmFzZTY0Jyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxldCBjb250ZW50ID0gdGhpcy5saWJtaW1lLmRlY29kZUZsb3dlZChjdXJyZW50Qm9keS50b1N0cmluZygnYmluYXJ5JyksIHRoaXMuY29uZmlnLmRlbFNwKTtcbiAgICAgICAgICAgIHRoaXMucHVzaChCdWZmZXIuZnJvbShjb250ZW50LCAnYmluYXJ5JykpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjYWxsYmFjaygpO1xuICAgIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBGbG93ZWREZWNvZGVyO1xuIl0sIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6WzBdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(action-browser)/./node_modules/imapflow/node_modules/mailsplit/lib/flowed-decoder.js\n");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "(action-browser)/./node_modules/imapflow/node_modules/mailsplit/lib/headers.js":
|
|
/*!*********************************************************************!*\
|
|
!*** ./node_modules/imapflow/node_modules/mailsplit/lib/headers.js ***!
|
|
\*********************************************************************/
|
|
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
|
|
|
|
eval("\n\nconst libmime = __webpack_require__(/*! libmime */ \"(action-browser)/./node_modules/libmime/lib/libmime.js\");\n\n/**\n * Class Headers to parse and handle message headers. Headers instance allows to\n * check existing, delete or add new headers\n */\nclass Headers {\n constructor(headers, config) {\n config = config || {};\n\n if (Array.isArray(headers)) {\n // already using parsed headers\n this.changed = true;\n this.headers = false;\n this.parsed = true;\n this.lines = headers;\n } else {\n // using original string/buffer headers\n this.changed = false;\n this.headers = headers;\n this.parsed = false;\n this.lines = false;\n }\n this.mbox = false;\n this.http = false;\n\n this.libmime = new libmime.Libmime({ Iconv: config.Iconv });\n }\n\n hasHeader(key) {\n if (!this.parsed) {\n this._parseHeaders();\n }\n key = this._normalizeHeader(key);\n return typeof this.lines.find(line => line.key === key) === 'object';\n }\n\n get(key) {\n if (!this.parsed) {\n this._parseHeaders();\n }\n key = this._normalizeHeader(key);\n let lines = this.lines.filter(line => line.key === key).map(line => line.line);\n\n return lines;\n }\n\n getDecoded(key) {\n return this.get(key)\n .map(line => this.libmime.decodeHeader(line))\n .filter(line => line && line.value);\n }\n\n getFirst(key) {\n if (!this.parsed) {\n this._parseHeaders();\n }\n key = this._normalizeHeader(key);\n let header = this.lines.find(line => line.key === key);\n if (!header) {\n return '';\n }\n return ((this.libmime.decodeHeader(header.line) || {}).value || '').toString().trim();\n }\n\n getList() {\n if (!this.parsed) {\n this._parseHeaders();\n }\n return this.lines;\n }\n\n add(key, value, index) {\n if (typeof value === 'undefined') {\n return;\n }\n\n if (typeof value === 'number') {\n value = value.toString();\n }\n\n if (typeof value === 'string') {\n value = Buffer.from(value);\n }\n\n value = value.toString('binary');\n this.addFormatted(key, this.libmime.foldLines(key + ': ' + value.replace(/\\r?\\n/g, ''), 76, false), index);\n }\n\n addFormatted(key, line, index) {\n if (!this.parsed) {\n this._parseHeaders();\n }\n index = index || 0;\n this.changed = true;\n\n if (!line) {\n return;\n }\n\n if (typeof line !== 'string') {\n line = line.toString('binary');\n }\n\n let header = {\n key: this._normalizeHeader(key),\n line\n };\n\n if (index < 1) {\n this.lines.unshift(header);\n } else if (index >= this.lines.length) {\n this.lines.push(header);\n } else {\n this.lines.splice(index, 0, header);\n }\n }\n\n remove(key) {\n if (!this.parsed) {\n this._parseHeaders();\n }\n key = this._normalizeHeader(key);\n for (let i = this.lines.length - 1; i >= 0; i--) {\n if (this.lines[i].key === key) {\n this.changed = true;\n this.lines.splice(i, 1);\n }\n }\n }\n\n update(key, value, relativeIndex) {\n if (!this.parsed) {\n this._parseHeaders();\n }\n let keyName = key;\n let index = 0;\n key = this._normalizeHeader(key);\n let relativeIndexCount = 0;\n let relativeMatchFound = false;\n for (let i = this.lines.length - 1; i >= 0; i--) {\n if (this.lines[i].key === key) {\n if (relativeIndex && relativeIndex !== relativeIndexCount) {\n relativeIndexCount++;\n continue;\n }\n index = i;\n this.changed = true;\n this.lines.splice(i, 1);\n if (relativeIndex) {\n relativeMatchFound = true;\n break;\n }\n }\n }\n\n if (relativeIndex && !relativeMatchFound) {\n return;\n }\n\n this.add(keyName, value, index);\n }\n\n build(lineEnd) {\n if (!this.changed && !lineEnd) {\n return typeof this.headers === 'string' ? Buffer.from(this.headers, 'binary') : this.headers;\n }\n\n if (!this.parsed) {\n this._parseHeaders();\n }\n\n lineEnd = lineEnd || '\\r\\n';\n\n let headers = this.lines.map(line => line.line.replace(/\\r?\\n/g, lineEnd)).join(lineEnd) + `${lineEnd}${lineEnd}`;\n\n if (this.mbox) {\n headers = this.mbox + lineEnd + headers;\n }\n\n if (this.http) {\n headers = this.http + lineEnd + headers;\n }\n\n return Buffer.from(headers, 'binary');\n }\n\n _normalizeHeader(key) {\n return (key || '').toLowerCase().trim();\n }\n\n _parseHeaders() {\n if (!this.headers) {\n this.lines = [];\n this.parsed = true;\n return;\n }\n\n let lines = this.headers\n .toString('binary')\n .replace(/[\\r\\n]+$/, '')\n .split(/\\r?\\n/);\n\n for (let i = lines.length - 1; i >= 0; i--) {\n let chr = lines[i].charAt(0);\n if (i && (chr === ' ' || chr === '\\t')) {\n lines[i - 1] += '\\r\\n' + lines[i];\n lines.splice(i, 1);\n } else {\n let line = lines[i];\n if (!i && /^From /i.test(line)) {\n // mbox file\n this.mbox = line;\n lines.splice(i, 1);\n continue;\n } else if (!i && /^POST /i.test(line)) {\n // HTTP POST request\n this.http = line;\n lines.splice(i, 1);\n continue;\n }\n let key = this._normalizeHeader(line.substr(0, line.indexOf(':')));\n lines[i] = {\n key,\n line\n };\n }\n }\n\n this.lines = lines;\n this.parsed = true;\n }\n}\n\n// expose to the world\nmodule.exports = Headers;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFjdGlvbi1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9pbWFwZmxvdy9ub2RlX21vZHVsZXMvbWFpbHNwbGl0L2xpYi9oZWFkZXJzLmpzIiwibWFwcGluZ3MiOiJBQUFhOztBQUViLGdCQUFnQixtQkFBTyxDQUFDLHVFQUFTOztBQUVqQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSw2Q0FBNkMscUJBQXFCO0FBQ2xFOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkRBQTZEO0FBQzdEOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNENBQTRDLFFBQVE7QUFDcEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRDQUE0QyxRQUFRO0FBQ3BEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBLHNHQUFzRyxRQUFRLEVBQUUsUUFBUTs7QUFFeEg7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsdUNBQXVDLFFBQVE7QUFDL0M7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBIiwic291cmNlcyI6WyIvaG9tZS9hbG1hL25leHRnZW4vTmVhaC1tYWlsL25vZGVfbW9kdWxlcy9pbWFwZmxvdy9ub2RlX21vZHVsZXMvbWFpbHNwbGl0L2xpYi9oZWFkZXJzLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcblxuY29uc3QgbGlibWltZSA9IHJlcXVpcmUoJ2xpYm1pbWUnKTtcblxuLyoqXG4gKiBDbGFzcyBIZWFkZXJzIHRvIHBhcnNlIGFuZCBoYW5kbGUgbWVzc2FnZSBoZWFkZXJzLiBIZWFkZXJzIGluc3RhbmNlIGFsbG93cyB0b1xuICogY2hlY2sgZXhpc3RpbmcsIGRlbGV0ZSBvciBhZGQgbmV3IGhlYWRlcnNcbiAqL1xuY2xhc3MgSGVhZGVycyB7XG4gICAgY29uc3RydWN0b3IoaGVhZGVycywgY29uZmlnKSB7XG4gICAgICAgIGNvbmZpZyA9IGNvbmZpZyB8fCB7fTtcblxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShoZWFkZXJzKSkge1xuICAgICAgICAgICAgLy8gYWxyZWFkeSB1c2luZyBwYXJzZWQgaGVhZGVyc1xuICAgICAgICAgICAgdGhpcy5jaGFuZ2VkID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMuaGVhZGVycyA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5wYXJzZWQgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5saW5lcyA9IGhlYWRlcnM7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyB1c2luZyBvcmlnaW5hbCBzdHJpbmcvYnVmZmVyIGhlYWRlcnNcbiAgICAgICAgICAgIHRoaXMuY2hhbmdlZCA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5oZWFkZXJzID0gaGVhZGVycztcbiAgICAgICAgICAgIHRoaXMucGFyc2VkID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLmxpbmVzID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5tYm94ID0gZmFsc2U7XG4gICAgICAgIHRoaXMuaHR0cCA9IGZhbHNlO1xuXG4gICAgICAgIHRoaXMubGlibWltZSA9IG5ldyBsaWJtaW1lLkxpYm1pbWUoeyBJY29udjogY29uZmlnLkljb252IH0pO1xuICAgIH1cblxuICAgIGhhc0hlYWRlcihrZXkpIHtcbiAgICAgICAgaWYgKCF0aGlzLnBhcnNlZCkge1xuICAgICAgICAgICAgdGhpcy5fcGFyc2VIZWFkZXJzKCk7XG4gICAgICAgIH1cbiAgICAgICAga2V5ID0gdGhpcy5fbm9ybWFsaXplSGVhZGVyKGtleSk7XG4gICAgICAgIHJldHVybiB0eXBlb2YgdGhpcy5saW5lcy5maW5kKGxpbmUgPT4gbGluZS5rZXkgPT09IGtleSkgPT09ICdvYmplY3QnO1xuICAgIH1cblxuICAgIGdldChrZXkpIHtcbiAgICAgICAgaWYgKCF0aGlzLnBhcnNlZCkge1xuICAgICAgICAgICAgdGhpcy5fcGFyc2VIZWFkZXJzKCk7XG4gICAgICAgIH1cbiAgICAgICAga2V5ID0gdGhpcy5fbm9ybWFsaXplSGVhZGVyKGtleSk7XG4gICAgICAgIGxldCBsaW5lcyA9IHRoaXMubGluZXMuZmlsdGVyKGxpbmUgPT4gbGluZS5rZXkgPT09IGtleSkubWFwKGxpbmUgPT4gbGluZS5saW5lKTtcblxuICAgICAgICByZXR1cm4gbGluZXM7XG4gICAgfVxuXG4gICAgZ2V0RGVjb2RlZChrZXkpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0KGtleSlcbiAgICAgICAgICAgIC5tYXAobGluZSA9PiB0aGlzLmxpYm1pbWUuZGVjb2RlSGVhZGVyKGxpbmUpKVxuICAgICAgICAgICAgLmZpbHRlcihsaW5lID0+IGxpbmUgJiYgbGluZS52YWx1ZSk7XG4gICAgfVxuXG4gICAgZ2V0Rmlyc3Qoa2V5KSB7XG4gICAgICAgIGlmICghdGhpcy5wYXJzZWQpIHtcbiAgICAgICAgICAgIHRoaXMuX3BhcnNlSGVhZGVycygpO1xuICAgICAgICB9XG4gICAgICAgIGtleSA9IHRoaXMuX25vcm1hbGl6ZUhlYWRlcihrZXkpO1xuICAgICAgICBsZXQgaGVhZGVyID0gdGhpcy5saW5lcy5maW5kKGxpbmUgPT4gbGluZS5rZXkgPT09IGtleSk7XG4gICAgICAgIGlmICghaGVhZGVyKSB7XG4gICAgICAgICAgICByZXR1cm4gJyc7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICgodGhpcy5saWJtaW1lLmRlY29kZUhlYWRlcihoZWFkZXIubGluZSkgfHwge30pLnZhbHVlIHx8ICcnKS50b1N0cmluZygpLnRyaW0oKTtcbiAgICB9XG5cbiAgICBnZXRMaXN0KCkge1xuICAgICAgICBpZiAoIXRoaXMucGFyc2VkKSB7XG4gICAgICAgICAgICB0aGlzLl9wYXJzZUhlYWRlcnMoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5saW5lcztcbiAgICB9XG5cbiAgICBhZGQoa2V5LCB2YWx1ZSwgaW5kZXgpIHtcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnRvU3RyaW5nKCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgdmFsdWUgPSBCdWZmZXIuZnJvbSh2YWx1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICB2YWx1ZSA9IHZhbHVlLnRvU3RyaW5nKCdiaW5hcnknKTtcbiAgICAgICAgdGhpcy5hZGRGb3JtYXR0ZWQoa2V5LCB0aGlzLmxpYm1pbWUuZm9sZExpbmVzKGtleSArICc6ICcgKyB2YWx1ZS5yZXBsYWNlKC9cXHI/XFxuL2csICcnKSwgNzYsIGZhbHNlKSwgaW5kZXgpO1xuICAgIH1cblxuICAgIGFkZEZvcm1hdHRlZChrZXksIGxpbmUsIGluZGV4KSB7XG4gICAgICAgIGlmICghdGhpcy5wYXJzZWQpIHtcbiAgICAgICAgICAgIHRoaXMuX3BhcnNlSGVhZGVycygpO1xuICAgICAgICB9XG4gICAgICAgIGluZGV4ID0gaW5kZXggfHwgMDtcbiAgICAgICAgdGhpcy5jaGFuZ2VkID0gdHJ1ZTtcblxuICAgICAgICBpZiAoIWxpbmUpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0eXBlb2YgbGluZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGxpbmUgPSBsaW5lLnRvU3RyaW5nKCdiaW5hcnknKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBoZWFkZXIgPSB7XG4gICAgICAgICAgICBrZXk6IHRoaXMuX25vcm1hbGl6ZUhlYWRlcihrZXkpLFxuICAgICAgICAgICAgbGluZVxuICAgICAgICB9O1xuXG4gICAgICAgIGlmIChpbmRleCA8IDEpIHtcbiAgICAgICAgICAgIHRoaXMubGluZXMudW5zaGlmdChoZWFkZXIpO1xuICAgICAgICB9IGVsc2UgaWYgKGluZGV4ID49IHRoaXMubGluZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLmxpbmVzLnB1c2goaGVhZGVyKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMubGluZXMuc3BsaWNlKGluZGV4LCAwLCBoZWFkZXIpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmVtb3ZlKGtleSkge1xuICAgICAgICBpZiAoIXRoaXMucGFyc2VkKSB7XG4gICAgICAgICAgICB0aGlzLl9wYXJzZUhlYWRlcnMoKTtcbiAgICAgICAgfVxuICAgICAgICBrZXkgPSB0aGlzLl9ub3JtYWxpemVIZWFkZXIoa2V5KTtcbiAgICAgICAgZm9yIChsZXQgaSA9IHRoaXMubGluZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmxpbmVzW2ldLmtleSA9PT0ga2V5KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jaGFuZ2VkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB0aGlzLmxpbmVzLnNwbGljZShpLCAxKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHVwZGF0ZShrZXksIHZhbHVlLCByZWxhdGl2ZUluZGV4KSB7XG4gICAgICAgIGlmICghdGhpcy5wYXJzZWQpIHtcbiAgICAgICAgICAgIHRoaXMuX3BhcnNlSGVhZGVycygpO1xuICAgICAgICB9XG4gICAgICAgIGxldCBrZXlOYW1lID0ga2V5O1xuICAgICAgICBsZXQgaW5kZXggPSAwO1xuICAgICAgICBrZXkgPSB0aGlzLl9ub3JtYWxpemVIZWFkZXIoa2V5KTtcbiAgICAgICAgbGV0IHJlbGF0aXZlSW5kZXhDb3VudCA9IDA7XG4gICAgICAgIGxldCByZWxhdGl2ZU1hdGNoRm91bmQgPSBmYWxzZTtcbiAgICAgICAgZm9yIChsZXQgaSA9IHRoaXMubGluZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmxpbmVzW2ldLmtleSA9PT0ga2V5KSB7XG4gICAgICAgICAgICAgICAgaWYgKHJlbGF0aXZlSW5kZXggJiYgcmVsYXRpdmVJbmRleCAhPT0gcmVsYXRpdmVJbmRleENvdW50KSB7XG4gICAgICAgICAgICAgICAgICAgIHJlbGF0aXZlSW5kZXhDb3VudCsrO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaW5kZXggPSBpO1xuICAgICAgICAgICAgICAgIHRoaXMuY2hhbmdlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgdGhpcy5saW5lcy5zcGxpY2UoaSwgMSk7XG4gICAgICAgICAgICAgICAgaWYgKHJlbGF0aXZlSW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVsYXRpdmVNYXRjaEZvdW5kID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHJlbGF0aXZlSW5kZXggJiYgIXJlbGF0aXZlTWF0Y2hGb3VuZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5hZGQoa2V5TmFtZSwgdmFsdWUsIGluZGV4KTtcbiAgICB9XG5cbiAgICBidWlsZChsaW5lRW5kKSB7XG4gICAgICAgIGlmICghdGhpcy5jaGFuZ2VkICYmICFsaW5lRW5kKSB7XG4gICAgICAgICAgICByZXR1cm4gdHlwZW9mIHRoaXMuaGVhZGVycyA9PT0gJ3N0cmluZycgPyBCdWZmZXIuZnJvbSh0aGlzLmhlYWRlcnMsICdiaW5hcnknKSA6IHRoaXMuaGVhZGVycztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhpcy5wYXJzZWQpIHtcbiAgICAgICAgICAgIHRoaXMuX3BhcnNlSGVhZGVycygpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGluZUVuZCA9IGxpbmVFbmQgfHwgJ1xcclxcbic7XG5cbiAgICAgICAgbGV0IGhlYWRlcnMgPSB0aGlzLmxpbmVzLm1hcChsaW5lID0+IGxpbmUubGluZS5yZXBsYWNlKC9cXHI/XFxuL2csIGxpbmVFbmQpKS5qb2luKGxpbmVFbmQpICsgYCR7bGluZUVuZH0ke2xpbmVFbmR9YDtcblxuICAgICAgICBpZiAodGhpcy5tYm94KSB7XG4gICAgICAgICAgICBoZWFkZXJzID0gdGhpcy5tYm94ICsgbGluZUVuZCArIGhlYWRlcnM7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5odHRwKSB7XG4gICAgICAgICAgICBoZWFkZXJzID0gdGhpcy5odHRwICsgbGluZUVuZCArIGhlYWRlcnM7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gQnVmZmVyLmZyb20oaGVhZGVycywgJ2JpbmFyeScpO1xuICAgIH1cblxuICAgIF9ub3JtYWxpemVIZWFkZXIoa2V5KSB7XG4gICAgICAgIHJldHVybiAoa2V5IHx8ICcnKS50b0xvd2VyQ2FzZSgpLnRyaW0oKTtcbiAgICB9XG5cbiAgICBfcGFyc2VIZWFkZXJzKCkge1xuICAgICAgICBpZiAoIXRoaXMuaGVhZGVycykge1xuICAgICAgICAgICAgdGhpcy5saW5lcyA9IFtdO1xuICAgICAgICAgICAgdGhpcy5wYXJzZWQgPSB0cnVlO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxpbmVzID0gdGhpcy5oZWFkZXJzXG4gICAgICAgICAgICAudG9TdHJpbmcoJ2JpbmFyeScpXG4gICAgICAgICAgICAucmVwbGFjZSgvW1xcclxcbl0rJC8sICcnKVxuICAgICAgICAgICAgLnNwbGl0KC9cXHI/XFxuLyk7XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IGxpbmVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgICBsZXQgY2hyID0gbGluZXNbaV0uY2hhckF0KDApO1xuICAgICAgICAgICAgaWYgKGkgJiYgKGNociA9PT0gJyAnIHx8IGNociA9PT0gJ1xcdCcpKSB7XG4gICAgICAgICAgICAgICAgbGluZXNbaSAtIDFdICs9ICdcXHJcXG4nICsgbGluZXNbaV07XG4gICAgICAgICAgICAgICAgbGluZXMuc3BsaWNlKGksIDEpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBsZXQgbGluZSA9IGxpbmVzW2ldO1xuICAgICAgICAgICAgICAgIGlmICghaSAmJiAvXkZyb20gL2kudGVzdChsaW5lKSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBtYm94IGZpbGVcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tYm94ID0gbGluZTtcbiAgICAgICAgICAgICAgICAgICAgbGluZXMuc3BsaWNlKGksIDEpO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFpICYmIC9eUE9TVCAvaS50ZXN0KGxpbmUpKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEhUVFAgUE9TVCByZXF1ZXN0XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaHR0cCA9IGxpbmU7XG4gICAgICAgICAgICAgICAgICAgIGxpbmVzLnNwbGljZShpLCAxKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGxldCBrZXkgPSB0aGlzLl9ub3JtYWxpemVIZWFkZXIobGluZS5zdWJzdHIoMCwgbGluZS5pbmRleE9mKCc6JykpKTtcbiAgICAgICAgICAgICAgICBsaW5lc1tpXSA9IHtcbiAgICAgICAgICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgICAgICAgICBsaW5lXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMubGluZXMgPSBsaW5lcztcbiAgICAgICAgdGhpcy5wYXJzZWQgPSB0cnVlO1xuICAgIH1cbn1cblxuLy8gZXhwb3NlIHRvIHRoZSB3b3JsZFxubW9kdWxlLmV4cG9ydHMgPSBIZWFkZXJzO1xuIl0sIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6WzBdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(action-browser)/./node_modules/imapflow/node_modules/mailsplit/lib/headers.js\n");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "(action-browser)/./node_modules/imapflow/node_modules/mailsplit/lib/message-joiner.js":
|
|
/*!****************************************************************************!*\
|
|
!*** ./node_modules/imapflow/node_modules/mailsplit/lib/message-joiner.js ***!
|
|
\****************************************************************************/
|
|
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
|
|
|
|
eval("\n\nconst Transform = (__webpack_require__(/*! stream */ \"stream\").Transform);\n\nclass MessageJoiner extends Transform {\n constructor() {\n let options = {\n readableObjectMode: false,\n writableObjectMode: true\n };\n super(options);\n }\n\n _transform(obj, encoding, callback) {\n if (Buffer.isBuffer(obj)) {\n this.push(obj);\n } else if (obj.type === 'node') {\n this.push(obj.getHeaders());\n } else if (obj.value) {\n this.push(obj.value);\n }\n return callback();\n }\n\n _flush(callback) {\n return callback();\n }\n}\n\nmodule.exports = MessageJoiner;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFjdGlvbi1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9pbWFwZmxvdy9ub2RlX21vZHVsZXMvbWFpbHNwbGl0L2xpYi9tZXNzYWdlLWpvaW5lci5qcyIsIm1hcHBpbmdzIjoiQUFBYTs7QUFFYixrQkFBa0IsdURBQTJCOztBQUU3QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSIsInNvdXJjZXMiOlsiL2hvbWUvYWxtYS9uZXh0Z2VuL05lYWgtbWFpbC9ub2RlX21vZHVsZXMvaW1hcGZsb3cvbm9kZV9tb2R1bGVzL21haWxzcGxpdC9saWIvbWVzc2FnZS1qb2luZXIuanMiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCBUcmFuc2Zvcm0gPSByZXF1aXJlKCdzdHJlYW0nKS5UcmFuc2Zvcm07XG5cbmNsYXNzIE1lc3NhZ2VKb2luZXIgZXh0ZW5kcyBUcmFuc2Zvcm0ge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBsZXQgb3B0aW9ucyA9IHtcbiAgICAgICAgICAgIHJlYWRhYmxlT2JqZWN0TW9kZTogZmFsc2UsXG4gICAgICAgICAgICB3cml0YWJsZU9iamVjdE1vZGU6IHRydWVcbiAgICAgICAgfTtcbiAgICAgICAgc3VwZXIob3B0aW9ucyk7XG4gICAgfVxuXG4gICAgX3RyYW5zZm9ybShvYmosIGVuY29kaW5nLCBjYWxsYmFjaykge1xuICAgICAgICBpZiAoQnVmZmVyLmlzQnVmZmVyKG9iaikpIHtcbiAgICAgICAgICAgIHRoaXMucHVzaChvYmopO1xuICAgICAgICB9IGVsc2UgaWYgKG9iai50eXBlID09PSAnbm9kZScpIHtcbiAgICAgICAgICAgIHRoaXMucHVzaChvYmouZ2V0SGVhZGVycygpKTtcbiAgICAgICAgfSBlbHNlIGlmIChvYmoudmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMucHVzaChvYmoudmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjYWxsYmFjaygpO1xuICAgIH1cblxuICAgIF9mbHVzaChjYWxsYmFjaykge1xuICAgICAgICByZXR1cm4gY2FsbGJhY2soKTtcbiAgICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gTWVzc2FnZUpvaW5lcjtcbiJdLCJuYW1lcyI6W10sImlnbm9yZUxpc3QiOlswXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(action-browser)/./node_modules/imapflow/node_modules/mailsplit/lib/message-joiner.js\n");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "(action-browser)/./node_modules/imapflow/node_modules/mailsplit/lib/message-splitter.js":
|
|
/*!******************************************************************************!*\
|
|
!*** ./node_modules/imapflow/node_modules/mailsplit/lib/message-splitter.js ***!
|
|
\******************************************************************************/
|
|
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
|
|
|
|
eval("\n\nconst Transform = (__webpack_require__(/*! stream */ \"stream\").Transform);\nconst MimeNode = __webpack_require__(/*! ./mime-node */ \"(action-browser)/./node_modules/imapflow/node_modules/mailsplit/lib/mime-node.js\");\n\nconst MAX_HEAD_SIZE = 1 * 1024 * 1024;\nconst MAX_CHILD_NODES = 1000;\n\nconst HEAD = 0x01;\nconst BODY = 0x02;\n\nclass MessageSplitter extends Transform {\n constructor(config) {\n let options = {\n readableObjectMode: true,\n writableObjectMode: false\n };\n super(options);\n\n this.config = config || {};\n this.maxHeadSize = this.config.maxHeadSize || MAX_HEAD_SIZE;\n this.maxChildNodes = this.config.maxChildNodes || MAX_CHILD_NODES;\n this.tree = [];\n this.nodeCounter = 0;\n this.newNode();\n this.tree.push(this.node);\n this.line = false;\n this.hasFailed = false;\n }\n\n _transform(chunk, encoding, callback) {\n // process line by line\n // find next line ending\n let pos = 0;\n let i = 0;\n let group = {\n type: 'none'\n };\n let groupstart = this.line ? -this.line.length : 0;\n let groupend = 0;\n\n let checkTrailingLinebreak = data => {\n if (data.type === 'body' && data.node.parentNode && data.value && data.value.length) {\n if (data.value[data.value.length - 1] === 0x0a) {\n groupstart--;\n groupend--;\n pos--;\n if (data.value.length > 1 && data.value[data.value.length - 2] === 0x0d) {\n groupstart--;\n groupend--;\n pos--;\n if (groupstart < 0 && !this.line) {\n // store only <CR> as <LF> should be on the positive side\n this.line = Buffer.allocUnsafe(1);\n this.line[0] = 0x0d;\n }\n data.value = data.value.slice(0, data.value.length - 2);\n } else {\n data.value = data.value.slice(0, data.value.length - 1);\n }\n } else if (data.value[data.value.length - 1] === 0x0d) {\n groupstart--;\n groupend--;\n pos--;\n data.value = data.value.slice(0, data.value.length - 1);\n }\n }\n };\n\n let iterateData = () => {\n for (let len = chunk.length; i < len; i++) {\n // find next <LF>\n if (chunk[i] === 0x0a) {\n // line end\n\n let start = Math.max(pos, 0);\n pos = ++i;\n\n return this.processLine(chunk.slice(start, i), false, (err, data, flush) => {\n if (err) {\n this.hasFailed = true;\n return setImmediate(() => callback(err));\n }\n\n if (!data) {\n return setImmediate(iterateData);\n }\n\n if (flush) {\n if (group && group.type !== 'none') {\n if (group.type === 'body' && groupend >= groupstart && group.node.parentNode) {\n // do not include the last line ending for body\n if (chunk[groupend - 1] === 0x0a) {\n groupend--;\n if (groupend >= groupstart && chunk[groupend - 1] === 0x0d) {\n groupend--;\n }\n }\n }\n if (groupstart !== groupend) {\n group.value = chunk.slice(groupstart, groupend);\n if (groupend < i) {\n data.value = chunk.slice(groupend, i);\n }\n }\n this.push(group);\n group = {\n type: 'none'\n };\n groupstart = groupend = i;\n }\n this.push(data);\n groupend = i;\n return setImmediate(iterateData);\n }\n\n if (data.type === group.type) {\n // shift slice end position forward\n groupend = i;\n } else {\n if (group.type === 'body' && groupend >= groupstart && group.node.parentNode) {\n // do not include the last line ending for body\n if (chunk[groupend - 1] === 0x0a) {\n groupend--;\n if (groupend >= groupstart && chunk[groupend - 1] === 0x0d) {\n groupend--;\n }\n }\n }\n\n if (group.type !== 'none' && group.type !== 'node') {\n // we have a previous data/body chunk to output\n if (groupstart !== groupend) {\n group.value = chunk.slice(groupstart, groupend);\n if (group.value && group.value.length) {\n this.push(group);\n group = {\n type: 'none'\n };\n }\n }\n }\n\n if (data.type === 'node') {\n this.push(data);\n groupstart = i;\n groupend = i;\n } else if (groupstart < 0) {\n groupstart = i;\n groupend = i;\n checkTrailingLinebreak(data);\n if (data.value && data.value.length) {\n this.push(data);\n }\n } else {\n // start new body/data chunk\n group = data;\n groupstart = groupend;\n groupend = i;\n }\n }\n return setImmediate(iterateData);\n });\n }\n }\n\n // skip last linebreak for body\n if (pos >= groupstart + 1 && group.type === 'body' && group.node.parentNode) {\n // do not include the last line ending for body\n if (chunk[pos - 1] === 0x0a) {\n pos--;\n if (pos >= groupstart && chunk[pos - 1] === 0x0d) {\n pos--;\n }\n }\n }\n\n if (group.type !== 'none' && group.type !== 'node' && pos > groupstart) {\n // we have a leftover data/body chunk to push out\n group.value = chunk.slice(groupstart, pos);\n\n if (group.value && group.value.length) {\n this.push(group);\n group = {\n type: 'none'\n };\n }\n }\n\n if (pos < chunk.length) {\n if (this.line) {\n this.line = Buffer.concat([this.line, chunk.slice(pos)]);\n } else {\n this.line = chunk.slice(pos);\n }\n }\n callback();\n };\n\n setImmediate(iterateData);\n }\n\n _flush(callback) {\n if (this.hasFailed) {\n return callback();\n }\n this.processLine(false, true, (err, data) => {\n if (err) {\n return setImmediate(() => callback(err));\n }\n if (data && (data.type === 'node' || (data.value && data.value.length))) {\n this.push(data);\n }\n callback();\n });\n }\n\n compareBoundary(line, startpos, boundary) {\n // --{boundary}\\r\\n or --{boundary}--\\r\\n\n if (line.length < boundary.length + 3 + startpos || line.length > boundary.length + 6 + startpos) {\n return false;\n }\n for (let i = 0; i < boundary.length; i++) {\n if (line[i + 2 + startpos] !== boundary[i]) {\n return false;\n }\n }\n\n let pos = 0;\n for (let i = boundary.length + 2 + startpos; i < line.length; i++) {\n let c = line[i];\n if (pos === 0 && (c === 0x0d || c === 0x0a)) {\n // 1: next node\n return 1;\n }\n if (pos === 0 && c !== 0x2d) {\n // expecting \"-\"\n return false;\n }\n if (pos === 1 && c !== 0x2d) {\n // expecting \"-\"\n return false;\n }\n if (pos === 2 && c !== 0x0d && c !== 0x0a) {\n // expecting line terminator, either <CR> or <LF>\n return false;\n }\n if (pos === 3 && c !== 0x0a) {\n // expecting line terminator <LF>\n return false;\n }\n pos++;\n }\n\n // 2: multipart end\n return 2;\n }\n\n checkBoundary(line) {\n let startpos = 0;\n if (line.length >= 1 && (line[0] === 0x0d || line[0] === 0x0a)) {\n startpos++;\n if (line.length >= 2 && (line[0] === 0x0d || line[1] === 0x0a)) {\n startpos++;\n }\n }\n if (line.length < 4 || line[startpos] !== 0x2d || line[startpos + 1] !== 0x2d) {\n // defnitely not a boundary\n return false;\n }\n\n let boundary;\n if (this.node._boundary && (boundary = this.compareBoundary(line, startpos, this.node._boundary))) {\n // 1: next child\n // 2: multipart end\n return boundary;\n }\n\n if (this.node._parentBoundary && (boundary = this.compareBoundary(line, startpos, this.node._parentBoundary))) {\n // 3: next sibling\n // 4: parent end\n return boundary + 2;\n }\n\n return false;\n }\n\n processLine(line, final, next) {\n let flush = false;\n\n if (this.line && line) {\n line = Buffer.concat([this.line, line]);\n this.line = false;\n } else if (this.line && !line) {\n line = this.line;\n this.line = false;\n }\n\n if (!line) {\n line = Buffer.alloc(0);\n }\n\n if (this.nodeCounter > this.maxChildNodes) {\n let err = new Error('Max allowed child nodes exceeded');\n err.code = 'EMAXLEN';\n return next(err);\n }\n\n // we check boundary outside the HEAD/BODY scope as it may appear anywhere\n let boundary = this.checkBoundary(line);\n if (boundary) {\n // reached boundary, switch context\n switch (boundary) {\n case 1:\n // next child\n this.newNode(this.node);\n flush = true;\n break;\n case 2:\n // reached end of children, keep current node\n break;\n case 3: {\n // next sibling\n let parentNode = this.node.parentNode;\n if (parentNode && parentNode.contentType === 'message/rfc822') {\n // special case where immediate parent is an inline message block\n // move up another step\n parentNode = parentNode.parentNode;\n }\n this.newNode(parentNode);\n flush = true;\n break;\n }\n case 4:\n // special case when boundary close a node with only header.\n if (this.node && this.node._headerlen && !this.node.headers) {\n this.node.parseHeaders();\n this.push(this.node);\n }\n // move up\n if (this.tree.length) {\n this.node = this.tree.pop();\n }\n this.state = BODY;\n break;\n }\n\n return next(\n null,\n {\n node: this.node,\n type: 'data',\n value: line\n },\n flush\n );\n }\n\n switch (this.state) {\n case HEAD: {\n this.node.addHeaderChunk(line);\n if (this.node._headerlen > this.maxHeadSize) {\n let err = new Error('Max header size for a MIME node exceeded');\n err.code = 'EMAXLEN';\n return next(err);\n }\n if (final || (line.length === 1 && line[0] === 0x0a) || (line.length === 2 && line[0] === 0x0d && line[1] === 0x0a)) {\n let currentNode = this.node;\n\n currentNode.parseHeaders();\n\n // if the content is attached message then just continue\n if (\n currentNode.contentType === 'message/rfc822' &&\n !this.config.ignoreEmbedded &&\n (!currentNode.encoding || ['7bit', '8bit', 'binary'].includes(currentNode.encoding)) &&\n (this.config.defaultInlineEmbedded ? currentNode.disposition !== 'attachment' : currentNode.disposition === 'inline')\n ) {\n currentNode.messageNode = true;\n this.newNode(currentNode);\n if (currentNode.parentNode) {\n this.node._parentBoundary = currentNode.parentNode._boundary;\n }\n } else {\n if (currentNode.contentType === 'message/rfc822') {\n currentNode.messageNode = false;\n }\n this.state = BODY;\n if (currentNode.multipart && currentNode._boundary) {\n this.tree.push(currentNode);\n }\n }\n\n return next(null, currentNode, flush);\n }\n\n return next();\n }\n case BODY: {\n return next(\n null,\n {\n node: this.node,\n type: this.node.multipart ? 'data' : 'body',\n value: line\n },\n flush\n );\n }\n }\n\n next(null, false);\n }\n\n newNode(parent) {\n this.node = new MimeNode(parent || false, this.config);\n this.state = HEAD;\n this.nodeCounter++;\n }\n}\n\nmodule.exports = MessageSplitter;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFjdGlvbi1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9pbWFwZmxvdy9ub2RlX21vZHVsZXMvbWFpbHNwbGl0L2xpYi9tZXNzYWdlLXNwbGl0dGVyLmpzIiwibWFwcGluZ3MiOiJBQUFhOztBQUViLGtCQUFrQix1REFBMkI7QUFDN0MsaUJBQWlCLG1CQUFPLENBQUMscUdBQWE7O0FBRXRDO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQjtBQUN0QjtBQUNBO0FBQ0Esa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EseUNBQXlDLFNBQVM7QUFDbEQ7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLDBCQUEwQjtBQUMxQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOEJBQThCO0FBQzlCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhCQUE4QjtBQUM5QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0I7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDs7QUFFQTtBQUNBLGNBQWMsU0FBUyxXQUFXLFNBQVM7QUFDM0M7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLHFCQUFxQjtBQUM3QztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLHFEQUFxRCxpQkFBaUI7QUFDdEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0I7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSIsInNvdXJjZXMiOlsiL2hvbWUvYWxtYS9uZXh0Z2VuL05lYWgtbWFpbC9ub2RlX21vZHVsZXMvaW1hcGZsb3cvbm9kZV9tb2R1bGVzL21haWxzcGxpdC9saWIvbWVzc2FnZS1zcGxpdHRlci5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbmNvbnN0IFRyYW5zZm9ybSA9IHJlcXVpcmUoJ3N0cmVhbScpLlRyYW5zZm9ybTtcbmNvbnN0IE1pbWVOb2RlID0gcmVxdWlyZSgnLi9taW1lLW5vZGUnKTtcblxuY29uc3QgTUFYX0hFQURfU0laRSA9IDEgKiAxMDI0ICogMTAyNDtcbmNvbnN0IE1BWF9DSElMRF9OT0RFUyA9IDEwMDA7XG5cbmNvbnN0IEhFQUQgPSAweDAxO1xuY29uc3QgQk9EWSA9IDB4MDI7XG5cbmNsYXNzIE1lc3NhZ2VTcGxpdHRlciBleHRlbmRzIFRyYW5zZm9ybSB7XG4gICAgY29uc3RydWN0b3IoY29uZmlnKSB7XG4gICAgICAgIGxldCBvcHRpb25zID0ge1xuICAgICAgICAgICAgcmVhZGFibGVPYmplY3RNb2RlOiB0cnVlLFxuICAgICAgICAgICAgd3JpdGFibGVPYmplY3RNb2RlOiBmYWxzZVxuICAgICAgICB9O1xuICAgICAgICBzdXBlcihvcHRpb25zKTtcblxuICAgICAgICB0aGlzLmNvbmZpZyA9IGNvbmZpZyB8fCB7fTtcbiAgICAgICAgdGhpcy5tYXhIZWFkU2l6ZSA9IHRoaXMuY29uZmlnLm1heEhlYWRTaXplIHx8IE1BWF9IRUFEX1NJWkU7XG4gICAgICAgIHRoaXMubWF4Q2hpbGROb2RlcyA9IHRoaXMuY29uZmlnLm1heENoaWxkTm9kZXMgfHwgTUFYX0NISUxEX05PREVTO1xuICAgICAgICB0aGlzLnRyZWUgPSBbXTtcbiAgICAgICAgdGhpcy5ub2RlQ291bnRlciA9IDA7XG4gICAgICAgIHRoaXMubmV3Tm9kZSgpO1xuICAgICAgICB0aGlzLnRyZWUucHVzaCh0aGlzLm5vZGUpO1xuICAgICAgICB0aGlzLmxpbmUgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5oYXNGYWlsZWQgPSBmYWxzZTtcbiAgICB9XG5cbiAgICBfdHJhbnNmb3JtKGNodW5rLCBlbmNvZGluZywgY2FsbGJhY2spIHtcbiAgICAgICAgLy8gcHJvY2VzcyBsaW5lIGJ5IGxpbmVcbiAgICAgICAgLy8gZmluZCBuZXh0IGxpbmUgZW5kaW5nXG4gICAgICAgIGxldCBwb3MgPSAwO1xuICAgICAgICBsZXQgaSA9IDA7XG4gICAgICAgIGxldCBncm91cCA9IHtcbiAgICAgICAgICAgIHR5cGU6ICdub25lJ1xuICAgICAgICB9O1xuICAgICAgICBsZXQgZ3JvdXBzdGFydCA9IHRoaXMubGluZSA/IC10aGlzLmxpbmUubGVuZ3RoIDogMDtcbiAgICAgICAgbGV0IGdyb3VwZW5kID0gMDtcblxuICAgICAgICBsZXQgY2hlY2tUcmFpbGluZ0xpbmVicmVhayA9IGRhdGEgPT4ge1xuICAgICAgICAgICAgaWYgKGRhdGEudHlwZSA9PT0gJ2JvZHknICYmIGRhdGEubm9kZS5wYXJlbnROb2RlICYmIGRhdGEudmFsdWUgJiYgZGF0YS52YWx1ZS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBpZiAoZGF0YS52YWx1ZVtkYXRhLnZhbHVlLmxlbmd0aCAtIDFdID09PSAweDBhKSB7XG4gICAgICAgICAgICAgICAgICAgIGdyb3Vwc3RhcnQtLTtcbiAgICAgICAgICAgICAgICAgICAgZ3JvdXBlbmQtLTtcbiAgICAgICAgICAgICAgICAgICAgcG9zLS07XG4gICAgICAgICAgICAgICAgICAgIGlmIChkYXRhLnZhbHVlLmxlbmd0aCA+IDEgJiYgZGF0YS52YWx1ZVtkYXRhLnZhbHVlLmxlbmd0aCAtIDJdID09PSAweDBkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBncm91cHN0YXJ0LS07XG4gICAgICAgICAgICAgICAgICAgICAgICBncm91cGVuZC0tO1xuICAgICAgICAgICAgICAgICAgICAgICAgcG9zLS07XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZ3JvdXBzdGFydCA8IDAgJiYgIXRoaXMubGluZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0b3JlIG9ubHkgPENSPiBhcyA8TEY+IHNob3VsZCBiZSBvbiB0aGUgcG9zaXRpdmUgc2lkZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubGluZSA9IEJ1ZmZlci5hbGxvY1Vuc2FmZSgxKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxpbmVbMF0gPSAweDBkO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS52YWx1ZSA9IGRhdGEudmFsdWUuc2xpY2UoMCwgZGF0YS52YWx1ZS5sZW5ndGggLSAyKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEudmFsdWUgPSBkYXRhLnZhbHVlLnNsaWNlKDAsIGRhdGEudmFsdWUubGVuZ3RoIC0gMSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGRhdGEudmFsdWVbZGF0YS52YWx1ZS5sZW5ndGggLSAxXSA9PT0gMHgwZCkge1xuICAgICAgICAgICAgICAgICAgICBncm91cHN0YXJ0LS07XG4gICAgICAgICAgICAgICAgICAgIGdyb3VwZW5kLS07XG4gICAgICAgICAgICAgICAgICAgIHBvcy0tO1xuICAgICAgICAgICAgICAgICAgICBkYXRhLnZhbHVlID0gZGF0YS52YWx1ZS5zbGljZSgwLCBkYXRhLnZhbHVlLmxlbmd0aCAtIDEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICBsZXQgaXRlcmF0ZURhdGEgPSAoKSA9PiB7XG4gICAgICAgICAgICBmb3IgKGxldCBsZW4gPSBjaHVuay5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgICAgIC8vIGZpbmQgbmV4dCA8TEY+XG4gICAgICAgICAgICAgICAgaWYgKGNodW5rW2ldID09PSAweDBhKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGxpbmUgZW5kXG5cbiAgICAgICAgICAgICAgICAgICAgbGV0IHN0YXJ0ID0gTWF0aC5tYXgocG9zLCAwKTtcbiAgICAgICAgICAgICAgICAgICAgcG9zID0gKytpO1xuXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnByb2Nlc3NMaW5lKGNodW5rLnNsaWNlKHN0YXJ0LCBpKSwgZmFsc2UsIChlcnIsIGRhdGEsIGZsdXNoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5oYXNGYWlsZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzZXRJbW1lZGlhdGUoKCkgPT4gY2FsbGJhY2soZXJyKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZGF0YSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzZXRJbW1lZGlhdGUoaXRlcmF0ZURhdGEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmx1c2gpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZ3JvdXAgJiYgZ3JvdXAudHlwZSAhPT0gJ25vbmUnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChncm91cC50eXBlID09PSAnYm9keScgJiYgZ3JvdXBlbmQgPj0gZ3JvdXBzdGFydCAmJiBncm91cC5ub2RlLnBhcmVudE5vZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRvIG5vdCBpbmNsdWRlIHRoZSBsYXN0IGxpbmUgZW5kaW5nIGZvciBib2R5XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2h1bmtbZ3JvdXBlbmQgLSAxXSA9PT0gMHgwYSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwZW5kLS07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGdyb3VwZW5kID49IGdyb3Vwc3RhcnQgJiYgY2h1bmtbZ3JvdXBlbmQgLSAxXSA9PT0gMHgwZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncm91cGVuZC0tO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZ3JvdXBzdGFydCAhPT0gZ3JvdXBlbmQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwLnZhbHVlID0gY2h1bmsuc2xpY2UoZ3JvdXBzdGFydCwgZ3JvdXBlbmQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGdyb3VwZW5kIDwgaSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEudmFsdWUgPSBjaHVuay5zbGljZShncm91cGVuZCwgaSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wdXNoKGdyb3VwKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXAgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnbm9uZSdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBzdGFydCA9IGdyb3VwZW5kID0gaTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wdXNoKGRhdGEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwZW5kID0gaTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2V0SW1tZWRpYXRlKGl0ZXJhdGVEYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGEudHlwZSA9PT0gZ3JvdXAudHlwZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNoaWZ0IHNsaWNlIGVuZCBwb3NpdGlvbiBmb3J3YXJkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBlbmQgPSBpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZ3JvdXAudHlwZSA9PT0gJ2JvZHknICYmIGdyb3VwZW5kID49IGdyb3Vwc3RhcnQgJiYgZ3JvdXAubm9kZS5wYXJlbnROb2RlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRvIG5vdCBpbmNsdWRlIHRoZSBsYXN0IGxpbmUgZW5kaW5nIGZvciBib2R5XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaHVua1tncm91cGVuZCAtIDFdID09PSAweDBhKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncm91cGVuZC0tO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGdyb3VwZW5kID49IGdyb3Vwc3RhcnQgJiYgY2h1bmtbZ3JvdXBlbmQgLSAxXSA9PT0gMHgwZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwZW5kLS07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZ3JvdXAudHlwZSAhPT0gJ25vbmUnICYmIGdyb3VwLnR5cGUgIT09ICdub2RlJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSBoYXZlIGEgcHJldmlvdXMgZGF0YS9ib2R5IGNodW5rIHRvIG91dHB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZ3JvdXBzdGFydCAhPT0gZ3JvdXBlbmQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwLnZhbHVlID0gY2h1bmsuc2xpY2UoZ3JvdXBzdGFydCwgZ3JvdXBlbmQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGdyb3VwLnZhbHVlICYmIGdyb3VwLnZhbHVlLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHVzaChncm91cCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXAgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdub25lJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YS50eXBlID09PSAnbm9kZScpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wdXNoKGRhdGEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncm91cHN0YXJ0ID0gaTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBlbmQgPSBpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZ3JvdXBzdGFydCA8IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBzdGFydCA9IGk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwZW5kID0gaTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tUcmFpbGluZ0xpbmVicmVhayhkYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGEudmFsdWUgJiYgZGF0YS52YWx1ZS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHVzaChkYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0YXJ0IG5ldyBib2R5L2RhdGEgY2h1bmtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXAgPSBkYXRhO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncm91cHN0YXJ0ID0gZ3JvdXBlbmQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwZW5kID0gaTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2V0SW1tZWRpYXRlKGl0ZXJhdGVEYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBza2lwIGxhc3QgbGluZWJyZWFrIGZvciBib2R5XG4gICAgICAgICAgICBpZiAocG9zID49IGdyb3Vwc3RhcnQgKyAxICYmIGdyb3VwLnR5cGUgPT09ICdib2R5JyAmJiBncm91cC5ub2RlLnBhcmVudE5vZGUpIHtcbiAgICAgICAgICAgICAgICAvLyBkbyBub3QgaW5jbHVkZSB0aGUgbGFzdCBsaW5lIGVuZGluZyBmb3IgYm9keVxuICAgICAgICAgICAgICAgIGlmIChjaHVua1twb3MgLSAxXSA9PT0gMHgwYSkge1xuICAgICAgICAgICAgICAgICAgICBwb3MtLTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBvcyA+PSBncm91cHN0YXJ0ICYmIGNodW5rW3BvcyAtIDFdID09PSAweDBkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwb3MtLTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGdyb3VwLnR5cGUgIT09ICdub25lJyAmJiBncm91cC50eXBlICE9PSAnbm9kZScgJiYgcG9zID4gZ3JvdXBzdGFydCkge1xuICAgICAgICAgICAgICAgIC8vIHdlIGhhdmUgYSBsZWZ0b3ZlciBkYXRhL2JvZHkgY2h1bmsgdG8gcHVzaCBvdXRcbiAgICAgICAgICAgICAgICBncm91cC52YWx1ZSA9IGNodW5rLnNsaWNlKGdyb3Vwc3RhcnQsIHBvcyk7XG5cbiAgICAgICAgICAgICAgICBpZiAoZ3JvdXAudmFsdWUgJiYgZ3JvdXAudmFsdWUubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucHVzaChncm91cCk7XG4gICAgICAgICAgICAgICAgICAgIGdyb3VwID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ25vbmUnXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAocG9zIDwgY2h1bmsubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMubGluZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmxpbmUgPSBCdWZmZXIuY29uY2F0KFt0aGlzLmxpbmUsIGNodW5rLnNsaWNlKHBvcyldKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmxpbmUgPSBjaHVuay5zbGljZShwb3MpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICAgIH07XG5cbiAgICAgICAgc2V0SW1tZWRpYXRlKGl0ZXJhdGVEYXRhKTtcbiAgICB9XG5cbiAgICBfZmx1c2goY2FsbGJhY2spIHtcbiAgICAgICAgaWYgKHRoaXMuaGFzRmFpbGVkKSB7XG4gICAgICAgICAgICByZXR1cm4gY2FsbGJhY2soKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnByb2Nlc3NMaW5lKGZhbHNlLCB0cnVlLCAoZXJyLCBkYXRhKSA9PiB7XG4gICAgICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHNldEltbWVkaWF0ZSgoKSA9PiBjYWxsYmFjayhlcnIpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChkYXRhICYmIChkYXRhLnR5cGUgPT09ICdub2RlJyB8fCAoZGF0YS52YWx1ZSAmJiBkYXRhLnZhbHVlLmxlbmd0aCkpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5wdXNoKGRhdGEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgY29tcGFyZUJvdW5kYXJ5KGxpbmUsIHN0YXJ0cG9zLCBib3VuZGFyeSkge1xuICAgICAgICAvLyAtLXtib3VuZGFyeX1cXHJcXG4gb3IgLS17Ym91bmRhcnl9LS1cXHJcXG5cbiAgICAgICAgaWYgKGxpbmUubGVuZ3RoIDwgYm91bmRhcnkubGVuZ3RoICsgMyArIHN0YXJ0cG9zIHx8IGxpbmUubGVuZ3RoID4gYm91bmRhcnkubGVuZ3RoICsgNiArIHN0YXJ0cG9zKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBib3VuZGFyeS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKGxpbmVbaSArIDIgKyBzdGFydHBvc10gIT09IGJvdW5kYXJ5W2ldKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHBvcyA9IDA7XG4gICAgICAgIGZvciAobGV0IGkgPSBib3VuZGFyeS5sZW5ndGggKyAyICsgc3RhcnRwb3M7IGkgPCBsaW5lLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgYyA9IGxpbmVbaV07XG4gICAgICAgICAgICBpZiAocG9zID09PSAwICYmIChjID09PSAweDBkIHx8IGMgPT09IDB4MGEpKSB7XG4gICAgICAgICAgICAgICAgLy8gMTogbmV4dCBub2RlXG4gICAgICAgICAgICAgICAgcmV0dXJuIDE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocG9zID09PSAwICYmIGMgIT09IDB4MmQpIHtcbiAgICAgICAgICAgICAgICAvLyBleHBlY3RpbmcgXCItXCJcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocG9zID09PSAxICYmIGMgIT09IDB4MmQpIHtcbiAgICAgICAgICAgICAgICAvLyBleHBlY3RpbmcgXCItXCJcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocG9zID09PSAyICYmIGMgIT09IDB4MGQgJiYgYyAhPT0gMHgwYSkge1xuICAgICAgICAgICAgICAgIC8vIGV4cGVjdGluZyBsaW5lIHRlcm1pbmF0b3IsIGVpdGhlciA8Q1I+IG9yIDxMRj5cbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocG9zID09PSAzICYmIGMgIT09IDB4MGEpIHtcbiAgICAgICAgICAgICAgICAvLyBleHBlY3RpbmcgbGluZSB0ZXJtaW5hdG9yIDxMRj5cbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwb3MrKztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIDI6IG11bHRpcGFydCBlbmRcbiAgICAgICAgcmV0dXJuIDI7XG4gICAgfVxuXG4gICAgY2hlY2tCb3VuZGFyeShsaW5lKSB7XG4gICAgICAgIGxldCBzdGFydHBvcyA9IDA7XG4gICAgICAgIGlmIChsaW5lLmxlbmd0aCA+PSAxICYmIChsaW5lWzBdID09PSAweDBkIHx8IGxpbmVbMF0gPT09IDB4MGEpKSB7XG4gICAgICAgICAgICBzdGFydHBvcysrO1xuICAgICAgICAgICAgaWYgKGxpbmUubGVuZ3RoID49IDIgJiYgKGxpbmVbMF0gPT09IDB4MGQgfHwgbGluZVsxXSA9PT0gMHgwYSkpIHtcbiAgICAgICAgICAgICAgICBzdGFydHBvcysrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChsaW5lLmxlbmd0aCA8IDQgfHwgbGluZVtzdGFydHBvc10gIT09IDB4MmQgfHwgbGluZVtzdGFydHBvcyArIDFdICE9PSAweDJkKSB7XG4gICAgICAgICAgICAvLyBkZWZuaXRlbHkgbm90IGEgYm91bmRhcnlcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBib3VuZGFyeTtcbiAgICAgICAgaWYgKHRoaXMubm9kZS5fYm91bmRhcnkgJiYgKGJvdW5kYXJ5ID0gdGhpcy5jb21wYXJlQm91bmRhcnkobGluZSwgc3RhcnRwb3MsIHRoaXMubm9kZS5fYm91bmRhcnkpKSkge1xuICAgICAgICAgICAgLy8gMTogbmV4dCBjaGlsZFxuICAgICAgICAgICAgLy8gMjogbXVsdGlwYXJ0IGVuZFxuICAgICAgICAgICAgcmV0dXJuIGJvdW5kYXJ5O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMubm9kZS5fcGFyZW50Qm91bmRhcnkgJiYgKGJvdW5kYXJ5ID0gdGhpcy5jb21wYXJlQm91bmRhcnkobGluZSwgc3RhcnRwb3MsIHRoaXMubm9kZS5fcGFyZW50Qm91bmRhcnkpKSkge1xuICAgICAgICAgICAgLy8gMzogbmV4dCBzaWJsaW5nXG4gICAgICAgICAgICAvLyA0OiBwYXJlbnQgZW5kXG4gICAgICAgICAgICByZXR1cm4gYm91bmRhcnkgKyAyO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHByb2Nlc3NMaW5lKGxpbmUsIGZpbmFsLCBuZXh0KSB7XG4gICAgICAgIGxldCBmbHVzaCA9IGZhbHNlO1xuXG4gICAgICAgIGlmICh0aGlzLmxpbmUgJiYgbGluZSkge1xuICAgICAgICAgICAgbGluZSA9IEJ1ZmZlci5jb25jYXQoW3RoaXMubGluZSwgbGluZV0pO1xuICAgICAgICAgICAgdGhpcy5saW5lID0gZmFsc2U7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5saW5lICYmICFsaW5lKSB7XG4gICAgICAgICAgICBsaW5lID0gdGhpcy5saW5lO1xuICAgICAgICAgICAgdGhpcy5saW5lID0gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWxpbmUpIHtcbiAgICAgICAgICAgIGxpbmUgPSBCdWZmZXIuYWxsb2MoMCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5ub2RlQ291bnRlciA+IHRoaXMubWF4Q2hpbGROb2Rlcykge1xuICAgICAgICAgICAgbGV0IGVyciA9IG5ldyBFcnJvcignTWF4IGFsbG93ZWQgY2hpbGQgbm9kZXMgZXhjZWVkZWQnKTtcbiAgICAgICAgICAgIGVyci5jb2RlID0gJ0VNQVhMRU4nO1xuICAgICAgICAgICAgcmV0dXJuIG5leHQoZXJyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHdlIGNoZWNrIGJvdW5kYXJ5IG91dHNpZGUgdGhlIEhFQUQvQk9EWSBzY29wZSBhcyBpdCBtYXkgYXBwZWFyIGFueXdoZXJlXG4gICAgICAgIGxldCBib3VuZGFyeSA9IHRoaXMuY2hlY2tCb3VuZGFyeShsaW5lKTtcbiAgICAgICAgaWYgKGJvdW5kYXJ5KSB7XG4gICAgICAgICAgICAvLyByZWFjaGVkIGJvdW5kYXJ5LCBzd2l0Y2ggY29udGV4dFxuICAgICAgICAgICAgc3dpdGNoIChib3VuZGFyeSkge1xuICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgLy8gbmV4dCBjaGlsZFxuICAgICAgICAgICAgICAgICAgICB0aGlzLm5ld05vZGUodGhpcy5ub2RlKTtcbiAgICAgICAgICAgICAgICAgICAgZmx1c2ggPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgIC8vIHJlYWNoZWQgZW5kIG9mIGNoaWxkcmVuLCBrZWVwIGN1cnJlbnQgbm9kZVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDM6IHtcbiAgICAgICAgICAgICAgICAgICAgLy8gbmV4dCBzaWJsaW5nXG4gICAgICAgICAgICAgICAgICAgIGxldCBwYXJlbnROb2RlID0gdGhpcy5ub2RlLnBhcmVudE5vZGU7XG4gICAgICAgICAgICAgICAgICAgIGlmIChwYXJlbnROb2RlICYmIHBhcmVudE5vZGUuY29udGVudFR5cGUgPT09ICdtZXNzYWdlL3JmYzgyMicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNwZWNpYWwgY2FzZSB3aGVyZSBpbW1lZGlhdGUgcGFyZW50IGlzIGFuIGlubGluZSBtZXNzYWdlIGJsb2NrXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBtb3ZlIHVwIGFub3RoZXIgc3RlcFxuICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50Tm9kZSA9IHBhcmVudE5vZGUucGFyZW50Tm9kZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0aGlzLm5ld05vZGUocGFyZW50Tm9kZSk7XG4gICAgICAgICAgICAgICAgICAgIGZsdXNoID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICAgICAgLy8gc3BlY2lhbCBjYXNlIHdoZW4gYm91bmRhcnkgY2xvc2UgYSBub2RlIHdpdGggb25seSBoZWFkZXIuXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLm5vZGUgJiYgdGhpcy5ub2RlLl9oZWFkZXJsZW4gJiYgIXRoaXMubm9kZS5oZWFkZXJzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5vZGUucGFyc2VIZWFkZXJzKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnB1c2godGhpcy5ub2RlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAvLyBtb3ZlIHVwXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnRyZWUubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5vZGUgPSB0aGlzLnRyZWUucG9wKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IEJPRFk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gbmV4dChcbiAgICAgICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgbm9kZTogdGhpcy5ub2RlLFxuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnZGF0YScsXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiBsaW5lXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBmbHVzaFxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHN3aXRjaCAodGhpcy5zdGF0ZSkge1xuICAgICAgICAgICAgY2FzZSBIRUFEOiB7XG4gICAgICAgICAgICAgICAgdGhpcy5ub2RlLmFkZEhlYWRlckNodW5rKGxpbmUpO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLm5vZGUuX2hlYWRlcmxlbiA+IHRoaXMubWF4SGVhZFNpemUpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGVyciA9IG5ldyBFcnJvcignTWF4IGhlYWRlciBzaXplIGZvciBhIE1JTUUgbm9kZSBleGNlZWRlZCcpO1xuICAgICAgICAgICAgICAgICAgICBlcnIuY29kZSA9ICdFTUFYTEVOJztcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5leHQoZXJyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGZpbmFsIHx8IChsaW5lLmxlbmd0aCA9PT0gMSAmJiBsaW5lWzBdID09PSAweDBhKSB8fCAobGluZS5sZW5ndGggPT09IDIgJiYgbGluZVswXSA9PT0gMHgwZCAmJiBsaW5lWzFdID09PSAweDBhKSkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgY3VycmVudE5vZGUgPSB0aGlzLm5vZGU7XG5cbiAgICAgICAgICAgICAgICAgICAgY3VycmVudE5vZGUucGFyc2VIZWFkZXJzKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlIGNvbnRlbnQgaXMgYXR0YWNoZWQgbWVzc2FnZSB0aGVuIGp1c3QgY29udGludWVcbiAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudE5vZGUuY29udGVudFR5cGUgPT09ICdtZXNzYWdlL3JmYzgyMicgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICF0aGlzLmNvbmZpZy5pZ25vcmVFbWJlZGRlZCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgKCFjdXJyZW50Tm9kZS5lbmNvZGluZyB8fCBbJzdiaXQnLCAnOGJpdCcsICdiaW5hcnknXS5pbmNsdWRlcyhjdXJyZW50Tm9kZS5lbmNvZGluZykpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAodGhpcy5jb25maWcuZGVmYXVsdElubGluZUVtYmVkZGVkID8gY3VycmVudE5vZGUuZGlzcG9zaXRpb24gIT09ICdhdHRhY2htZW50JyA6IGN1cnJlbnROb2RlLmRpc3Bvc2l0aW9uID09PSAnaW5saW5lJylcbiAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50Tm9kZS5tZXNzYWdlTm9kZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5ld05vZGUoY3VycmVudE5vZGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnROb2RlLnBhcmVudE5vZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5vZGUuX3BhcmVudEJvdW5kYXJ5ID0gY3VycmVudE5vZGUucGFyZW50Tm9kZS5fYm91bmRhcnk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3VycmVudE5vZGUuY29udGVudFR5cGUgPT09ICdtZXNzYWdlL3JmYzgyMicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50Tm9kZS5tZXNzYWdlTm9kZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IEJPRFk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3VycmVudE5vZGUubXVsdGlwYXJ0ICYmIGN1cnJlbnROb2RlLl9ib3VuZGFyeSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudHJlZS5wdXNoKGN1cnJlbnROb2RlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXh0KG51bGwsIGN1cnJlbnROb2RlLCBmbHVzaCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIG5leHQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgQk9EWToge1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXh0KFxuICAgICAgICAgICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBub2RlOiB0aGlzLm5vZGUsXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiB0aGlzLm5vZGUubXVsdGlwYXJ0ID8gJ2RhdGEnIDogJ2JvZHknLFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGxpbmVcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgZmx1c2hcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgbmV4dChudWxsLCBmYWxzZSk7XG4gICAgfVxuXG4gICAgbmV3Tm9kZShwYXJlbnQpIHtcbiAgICAgICAgdGhpcy5ub2RlID0gbmV3IE1pbWVOb2RlKHBhcmVudCB8fCBmYWxzZSwgdGhpcy5jb25maWcpO1xuICAgICAgICB0aGlzLnN0YXRlID0gSEVBRDtcbiAgICAgICAgdGhpcy5ub2RlQ291bnRlcisrO1xuICAgIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBNZXNzYWdlU3BsaXR0ZXI7XG4iXSwibmFtZXMiOltdLCJpZ25vcmVMaXN0IjpbMF0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(action-browser)/./node_modules/imapflow/node_modules/mailsplit/lib/message-splitter.js\n");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "(action-browser)/./node_modules/imapflow/node_modules/mailsplit/lib/mime-node.js":
|
|
/*!***********************************************************************!*\
|
|
!*** ./node_modules/imapflow/node_modules/mailsplit/lib/mime-node.js ***!
|
|
\***********************************************************************/
|
|
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
|
|
|
|
eval("\n\nconst Headers = __webpack_require__(/*! ./headers */ \"(action-browser)/./node_modules/imapflow/node_modules/mailsplit/lib/headers.js\");\nconst libmime = __webpack_require__(/*! libmime */ \"(action-browser)/./node_modules/libmime/lib/libmime.js\");\nconst libqp = __webpack_require__(/*! libqp */ \"(action-browser)/./node_modules/libqp/lib/libqp.js\");\nconst libbase64 = __webpack_require__(/*! libbase64 */ \"(action-browser)/./node_modules/libbase64/lib/libbase64.js\");\nconst PassThrough = (__webpack_require__(/*! stream */ \"stream\").PassThrough);\nconst pathlib = __webpack_require__(/*! path */ \"path\");\n\nclass MimeNode {\n constructor(parentNode, config) {\n this.type = 'node';\n this.root = !parentNode;\n this.parentNode = parentNode;\n\n this._parentBoundary = this.parentNode && this.parentNode._boundary;\n this._headersLines = [];\n this._headerlen = 0;\n\n this._parsedContentType = false;\n this._boundary = false;\n\n this.multipart = false;\n this.encoding = false;\n this.headers = false;\n this.contentType = false;\n this.flowed = false;\n this.delSp = false;\n\n this.config = config || {};\n this.libmime = new libmime.Libmime({ Iconv: this.config.Iconv });\n\n this.parentPartNumber = (parentNode && this.partNr) || [];\n this.partNr = false; // resolved later\n this.childPartNumbers = 0;\n }\n\n getPartNr(provided) {\n if (provided) {\n return []\n .concat(this.partNr || [])\n .filter(nr => !isNaN(nr))\n .concat(provided);\n }\n let childPartNr = ++this.childPartNumbers;\n return []\n .concat(this.partNr || [])\n .filter(nr => !isNaN(nr))\n .concat(childPartNr);\n }\n\n addHeaderChunk(line) {\n if (!line) {\n return;\n }\n this._headersLines.push(line);\n this._headerlen += line.length;\n }\n\n parseHeaders() {\n if (this.headers) {\n return;\n }\n this.headers = new Headers(Buffer.concat(this._headersLines, this._headerlen), this.config);\n\n this._parsedContentDisposition = this.libmime.parseHeaderValue(this.headers.getFirst('Content-Disposition'));\n\n // if content-type is missing default to plaintext\n let contentHeader;\n if (this.headers.get('Content-Type').length) {\n contentHeader = this.headers.getFirst('Content-Type');\n } else {\n if (this._parsedContentDisposition.params.filename) {\n let extension = pathlib.parse(this._parsedContentDisposition.params.filename).ext.replace(/^\\./, '');\n if (extension) {\n contentHeader = libmime.detectMimeType(extension);\n }\n }\n if (!contentHeader) {\n if (/^attachment$/i.test(this._parsedContentDisposition.value)) {\n contentHeader = 'application/octet-stream';\n } else {\n contentHeader = 'text/plain';\n }\n }\n }\n\n this._parsedContentType = this.libmime.parseHeaderValue(contentHeader);\n\n this.encoding = this.headers\n .getFirst('Content-Transfer-Encoding')\n .replace(/\\(.*\\)/g, '')\n .toLowerCase()\n .trim();\n this.contentType = (this._parsedContentType.value || '').toLowerCase().trim() || false;\n this.charset = this._parsedContentType.params.charset || false;\n this.disposition = (this._parsedContentDisposition.value || '').toLowerCase().trim() || false;\n\n // fix invalidly encoded disposition values\n if (this.disposition) {\n try {\n this.disposition = this.libmime.decodeWords(this.disposition);\n } catch (E) {\n // failed to parse disposition, keep as is (most probably an unknown charset is used)\n }\n }\n\n this.filename = this._parsedContentDisposition.params.filename || this._parsedContentType.params.name || false;\n\n if (this._parsedContentType.params.format && this._parsedContentType.params.format.toLowerCase().trim() === 'flowed') {\n this.flowed = true;\n if (this._parsedContentType.params.delsp && this._parsedContentType.params.delsp.toLowerCase().trim() === 'yes') {\n this.delSp = true;\n }\n }\n\n if (this.filename) {\n try {\n this.filename = this.libmime.decodeWords(this.filename);\n } catch (E) {\n // failed to parse filename, keep as is (most probably an unknown charset is used)\n }\n }\n\n this.multipart =\n (this.contentType &&\n this.contentType.substr(0, this.contentType.indexOf('/')) === 'multipart' &&\n this.contentType.substr(this.contentType.indexOf('/') + 1)) ||\n false;\n this._boundary = (this._parsedContentType.params.boundary && Buffer.from(this._parsedContentType.params.boundary)) || false;\n\n this.rfc822 = this.contentType === 'message/rfc822';\n\n if (!this.parentNode || this.parentNode.rfc822) {\n this.partNr = this.parentNode ? this.parentNode.getPartNr('TEXT') : ['TEXT'];\n } else {\n this.partNr = this.parentNode ? this.parentNode.getPartNr() : [];\n }\n }\n\n getHeaders() {\n if (!this.headers) {\n this.parseHeaders();\n }\n return this.headers.build();\n }\n\n setContentType(contentType) {\n if (!this.headers) {\n this.parseHeaders();\n }\n\n contentType = (contentType || '').toLowerCase().trim();\n if (contentType) {\n this._parsedContentType.value = contentType;\n }\n\n if (!this.flowed && this._parsedContentType.params.format) {\n delete this._parsedContentType.params.format;\n }\n\n if (!this.delSp && this._parsedContentType.params.delsp) {\n delete this._parsedContentType.params.delsp;\n }\n\n this.headers.update('Content-Type', this.libmime.buildHeaderValue(this._parsedContentType));\n }\n\n setCharset(charset) {\n if (!this.headers) {\n this.parseHeaders();\n }\n\n charset = (charset || '').toLowerCase().trim();\n\n if (charset === 'ascii') {\n charset = '';\n }\n\n if (!charset) {\n if (!this._parsedContentType.value) {\n // nothing to set or update\n return;\n }\n delete this._parsedContentType.params.charset;\n } else {\n this._parsedContentType.params.charset = charset;\n }\n\n if (!this._parsedContentType.value) {\n this._parsedContentType.value = 'text/plain';\n }\n\n this.headers.update('Content-Type', this.libmime.buildHeaderValue(this._parsedContentType));\n }\n\n setFilename(filename) {\n if (!this.headers) {\n this.parseHeaders();\n }\n\n this.filename = (filename || '').toLowerCase().trim();\n\n if (this._parsedContentType.params.name) {\n delete this._parsedContentType.params.name;\n this.headers.update('Content-Type', this.libmime.buildHeaderValue(this._parsedContentType));\n }\n\n if (!this.filename) {\n if (!this._parsedContentDisposition.value) {\n // nothing to set or update\n return;\n }\n delete this._parsedContentDisposition.params.filename;\n } else {\n this._parsedContentDisposition.params.filename = this.filename;\n }\n\n if (!this._parsedContentDisposition.value) {\n this._parsedContentDisposition.value = 'attachment';\n }\n\n this.headers.update('Content-Disposition', this.libmime.buildHeaderValue(this._parsedContentDisposition));\n }\n\n getDecoder() {\n if (!this.headers) {\n this.parseHeaders();\n }\n\n switch (this.encoding) {\n case 'base64':\n return new libbase64.Decoder();\n case 'quoted-printable':\n return new libqp.Decoder();\n default:\n return new PassThrough();\n }\n }\n\n getEncoder(encoding) {\n if (!this.headers) {\n this.parseHeaders();\n }\n\n encoding = (encoding || '').toString().toLowerCase().trim();\n\n if (encoding && encoding !== this.encoding) {\n this.headers.update('Content-Transfer-Encoding', encoding);\n } else {\n encoding = this.encoding;\n }\n\n switch (encoding) {\n case 'base64':\n return new libbase64.Encoder();\n case 'quoted-printable':\n return new libqp.Encoder();\n default:\n return new PassThrough();\n }\n }\n}\n\nmodule.exports = MimeNode;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFjdGlvbi1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9pbWFwZmxvdy9ub2RlX21vZHVsZXMvbWFpbHNwbGl0L2xpYi9taW1lLW5vZGUuanMiLCJtYXBwaW5ncyI6IkFBQWE7O0FBRWIsZ0JBQWdCLG1CQUFPLENBQUMsaUdBQVc7QUFDbkMsZ0JBQWdCLG1CQUFPLENBQUMsdUVBQVM7QUFDakMsY0FBYyxtQkFBTyxDQUFDLGlFQUFPO0FBQzdCLGtCQUFrQixtQkFBTyxDQUFDLDZFQUFXO0FBQ3JDLG9CQUFvQix5REFBNkI7QUFDakQsZ0JBQWdCLG1CQUFPLENBQUMsa0JBQU07O0FBRTlCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsNkNBQTZDLDBCQUEwQjs7QUFFdkU7QUFDQSw2QkFBNkI7QUFDN0I7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSIsInNvdXJjZXMiOlsiL2hvbWUvYWxtYS9uZXh0Z2VuL05lYWgtbWFpbC9ub2RlX21vZHVsZXMvaW1hcGZsb3cvbm9kZV9tb2R1bGVzL21haWxzcGxpdC9saWIvbWltZS1ub2RlLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcblxuY29uc3QgSGVhZGVycyA9IHJlcXVpcmUoJy4vaGVhZGVycycpO1xuY29uc3QgbGlibWltZSA9IHJlcXVpcmUoJ2xpYm1pbWUnKTtcbmNvbnN0IGxpYnFwID0gcmVxdWlyZSgnbGlicXAnKTtcbmNvbnN0IGxpYmJhc2U2NCA9IHJlcXVpcmUoJ2xpYmJhc2U2NCcpO1xuY29uc3QgUGFzc1Rocm91Z2ggPSByZXF1aXJlKCdzdHJlYW0nKS5QYXNzVGhyb3VnaDtcbmNvbnN0IHBhdGhsaWIgPSByZXF1aXJlKCdwYXRoJyk7XG5cbmNsYXNzIE1pbWVOb2RlIHtcbiAgICBjb25zdHJ1Y3RvcihwYXJlbnROb2RlLCBjb25maWcpIHtcbiAgICAgICAgdGhpcy50eXBlID0gJ25vZGUnO1xuICAgICAgICB0aGlzLnJvb3QgPSAhcGFyZW50Tm9kZTtcbiAgICAgICAgdGhpcy5wYXJlbnROb2RlID0gcGFyZW50Tm9kZTtcblxuICAgICAgICB0aGlzLl9wYXJlbnRCb3VuZGFyeSA9IHRoaXMucGFyZW50Tm9kZSAmJiB0aGlzLnBhcmVudE5vZGUuX2JvdW5kYXJ5O1xuICAgICAgICB0aGlzLl9oZWFkZXJzTGluZXMgPSBbXTtcbiAgICAgICAgdGhpcy5faGVhZGVybGVuID0gMDtcblxuICAgICAgICB0aGlzLl9wYXJzZWRDb250ZW50VHlwZSA9IGZhbHNlO1xuICAgICAgICB0aGlzLl9ib3VuZGFyeSA9IGZhbHNlO1xuXG4gICAgICAgIHRoaXMubXVsdGlwYXJ0ID0gZmFsc2U7XG4gICAgICAgIHRoaXMuZW5jb2RpbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5oZWFkZXJzID0gZmFsc2U7XG4gICAgICAgIHRoaXMuY29udGVudFR5cGUgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5mbG93ZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5kZWxTcCA9IGZhbHNlO1xuXG4gICAgICAgIHRoaXMuY29uZmlnID0gY29uZmlnIHx8IHt9O1xuICAgICAgICB0aGlzLmxpYm1pbWUgPSBuZXcgbGlibWltZS5MaWJtaW1lKHsgSWNvbnY6IHRoaXMuY29uZmlnLkljb252IH0pO1xuXG4gICAgICAgIHRoaXMucGFyZW50UGFydE51bWJlciA9IChwYXJlbnROb2RlICYmIHRoaXMucGFydE5yKSB8fCBbXTtcbiAgICAgICAgdGhpcy5wYXJ0TnIgPSBmYWxzZTsgLy8gcmVzb2x2ZWQgbGF0ZXJcbiAgICAgICAgdGhpcy5jaGlsZFBhcnROdW1iZXJzID0gMDtcbiAgICB9XG5cbiAgICBnZXRQYXJ0TnIocHJvdmlkZWQpIHtcbiAgICAgICAgaWYgKHByb3ZpZGVkKSB7XG4gICAgICAgICAgICByZXR1cm4gW11cbiAgICAgICAgICAgICAgICAuY29uY2F0KHRoaXMucGFydE5yIHx8IFtdKVxuICAgICAgICAgICAgICAgIC5maWx0ZXIobnIgPT4gIWlzTmFOKG5yKSlcbiAgICAgICAgICAgICAgICAuY29uY2F0KHByb3ZpZGVkKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgY2hpbGRQYXJ0TnIgPSArK3RoaXMuY2hpbGRQYXJ0TnVtYmVycztcbiAgICAgICAgcmV0dXJuIFtdXG4gICAgICAgICAgICAuY29uY2F0KHRoaXMucGFydE5yIHx8IFtdKVxuICAgICAgICAgICAgLmZpbHRlcihuciA9PiAhaXNOYU4obnIpKVxuICAgICAgICAgICAgLmNvbmNhdChjaGlsZFBhcnROcik7XG4gICAgfVxuXG4gICAgYWRkSGVhZGVyQ2h1bmsobGluZSkge1xuICAgICAgICBpZiAoIWxpbmUpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9oZWFkZXJzTGluZXMucHVzaChsaW5lKTtcbiAgICAgICAgdGhpcy5faGVhZGVybGVuICs9IGxpbmUubGVuZ3RoO1xuICAgIH1cblxuICAgIHBhcnNlSGVhZGVycygpIHtcbiAgICAgICAgaWYgKHRoaXMuaGVhZGVycykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuaGVhZGVycyA9IG5ldyBIZWFkZXJzKEJ1ZmZlci5jb25jYXQodGhpcy5faGVhZGVyc0xpbmVzLCB0aGlzLl9oZWFkZXJsZW4pLCB0aGlzLmNvbmZpZyk7XG5cbiAgICAgICAgdGhpcy5fcGFyc2VkQ29udGVudERpc3Bvc2l0aW9uID0gdGhpcy5saWJtaW1lLnBhcnNlSGVhZGVyVmFsdWUodGhpcy5oZWFkZXJzLmdldEZpcnN0KCdDb250ZW50LURpc3Bvc2l0aW9uJykpO1xuXG4gICAgICAgIC8vIGlmIGNvbnRlbnQtdHlwZSBpcyBtaXNzaW5nIGRlZmF1bHQgdG8gcGxhaW50ZXh0XG4gICAgICAgIGxldCBjb250ZW50SGVhZGVyO1xuICAgICAgICBpZiAodGhpcy5oZWFkZXJzLmdldCgnQ29udGVudC1UeXBlJykubGVuZ3RoKSB7XG4gICAgICAgICAgICBjb250ZW50SGVhZGVyID0gdGhpcy5oZWFkZXJzLmdldEZpcnN0KCdDb250ZW50LVR5cGUnKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9wYXJzZWRDb250ZW50RGlzcG9zaXRpb24ucGFyYW1zLmZpbGVuYW1lKSB7XG4gICAgICAgICAgICAgICAgbGV0IGV4dGVuc2lvbiA9IHBhdGhsaWIucGFyc2UodGhpcy5fcGFyc2VkQ29udGVudERpc3Bvc2l0aW9uLnBhcmFtcy5maWxlbmFtZSkuZXh0LnJlcGxhY2UoL15cXC4vLCAnJyk7XG4gICAgICAgICAgICAgICAgaWYgKGV4dGVuc2lvbikge1xuICAgICAgICAgICAgICAgICAgICBjb250ZW50SGVhZGVyID0gbGlibWltZS5kZXRlY3RNaW1lVHlwZShleHRlbnNpb24pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghY29udGVudEhlYWRlcikge1xuICAgICAgICAgICAgICAgIGlmICgvXmF0dGFjaG1lbnQkL2kudGVzdCh0aGlzLl9wYXJzZWRDb250ZW50RGlzcG9zaXRpb24udmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRlbnRIZWFkZXIgPSAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJztcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb250ZW50SGVhZGVyID0gJ3RleHQvcGxhaW4nO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX3BhcnNlZENvbnRlbnRUeXBlID0gdGhpcy5saWJtaW1lLnBhcnNlSGVhZGVyVmFsdWUoY29udGVudEhlYWRlcik7XG5cbiAgICAgICAgdGhpcy5lbmNvZGluZyA9IHRoaXMuaGVhZGVyc1xuICAgICAgICAgICAgLmdldEZpcnN0KCdDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nJylcbiAgICAgICAgICAgIC5yZXBsYWNlKC9cXCguKlxcKS9nLCAnJylcbiAgICAgICAgICAgIC50b0xvd2VyQ2FzZSgpXG4gICAgICAgICAgICAudHJpbSgpO1xuICAgICAgICB0aGlzLmNvbnRlbnRUeXBlID0gKHRoaXMuX3BhcnNlZENvbnRlbnRUeXBlLnZhbHVlIHx8ICcnKS50b0xvd2VyQ2FzZSgpLnRyaW0oKSB8fCBmYWxzZTtcbiAgICAgICAgdGhpcy5jaGFyc2V0ID0gdGhpcy5fcGFyc2VkQ29udGVudFR5cGUucGFyYW1zLmNoYXJzZXQgfHwgZmFsc2U7XG4gICAgICAgIHRoaXMuZGlzcG9zaXRpb24gPSAodGhpcy5fcGFyc2VkQ29udGVudERpc3Bvc2l0aW9uLnZhbHVlIHx8ICcnKS50b0xvd2VyQ2FzZSgpLnRyaW0oKSB8fCBmYWxzZTtcblxuICAgICAgICAvLyBmaXggaW52YWxpZGx5IGVuY29kZWQgZGlzcG9zaXRpb24gdmFsdWVzXG4gICAgICAgIGlmICh0aGlzLmRpc3Bvc2l0aW9uKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHRoaXMuZGlzcG9zaXRpb24gPSB0aGlzLmxpYm1pbWUuZGVjb2RlV29yZHModGhpcy5kaXNwb3NpdGlvbik7XG4gICAgICAgICAgICB9IGNhdGNoIChFKSB7XG4gICAgICAgICAgICAgICAgLy8gZmFpbGVkIHRvIHBhcnNlIGRpc3Bvc2l0aW9uLCBrZWVwIGFzIGlzIChtb3N0IHByb2JhYmx5IGFuIHVua25vd24gY2hhcnNldCBpcyB1c2VkKVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5maWxlbmFtZSA9IHRoaXMuX3BhcnNlZENvbnRlbnREaXNwb3NpdGlvbi5wYXJhbXMuZmlsZW5hbWUgfHwgdGhpcy5fcGFyc2VkQ29udGVudFR5cGUucGFyYW1zLm5hbWUgfHwgZmFsc2U7XG5cbiAgICAgICAgaWYgKHRoaXMuX3BhcnNlZENvbnRlbnRUeXBlLnBhcmFtcy5mb3JtYXQgJiYgdGhpcy5fcGFyc2VkQ29udGVudFR5cGUucGFyYW1zLmZvcm1hdC50b0xvd2VyQ2FzZSgpLnRyaW0oKSA9PT0gJ2Zsb3dlZCcpIHtcbiAgICAgICAgICAgIHRoaXMuZmxvd2VkID0gdHJ1ZTtcbiAgICAgICAgICAgIGlmICh0aGlzLl9wYXJzZWRDb250ZW50VHlwZS5wYXJhbXMuZGVsc3AgJiYgdGhpcy5fcGFyc2VkQ29udGVudFR5cGUucGFyYW1zLmRlbHNwLnRvTG93ZXJDYXNlKCkudHJpbSgpID09PSAneWVzJykge1xuICAgICAgICAgICAgICAgIHRoaXMuZGVsU3AgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuZmlsZW5hbWUpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgdGhpcy5maWxlbmFtZSA9IHRoaXMubGlibWltZS5kZWNvZGVXb3Jkcyh0aGlzLmZpbGVuYW1lKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKEUpIHtcbiAgICAgICAgICAgICAgICAvLyBmYWlsZWQgdG8gcGFyc2UgZmlsZW5hbWUsIGtlZXAgYXMgaXMgKG1vc3QgcHJvYmFibHkgYW4gdW5rbm93biBjaGFyc2V0IGlzIHVzZWQpXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLm11bHRpcGFydCA9XG4gICAgICAgICAgICAodGhpcy5jb250ZW50VHlwZSAmJlxuICAgICAgICAgICAgICAgIHRoaXMuY29udGVudFR5cGUuc3Vic3RyKDAsIHRoaXMuY29udGVudFR5cGUuaW5kZXhPZignLycpKSA9PT0gJ211bHRpcGFydCcgJiZcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRlbnRUeXBlLnN1YnN0cih0aGlzLmNvbnRlbnRUeXBlLmluZGV4T2YoJy8nKSArIDEpKSB8fFxuICAgICAgICAgICAgZmFsc2U7XG4gICAgICAgIHRoaXMuX2JvdW5kYXJ5ID0gKHRoaXMuX3BhcnNlZENvbnRlbnRUeXBlLnBhcmFtcy5ib3VuZGFyeSAmJiBCdWZmZXIuZnJvbSh0aGlzLl9wYXJzZWRDb250ZW50VHlwZS5wYXJhbXMuYm91bmRhcnkpKSB8fCBmYWxzZTtcblxuICAgICAgICB0aGlzLnJmYzgyMiA9IHRoaXMuY29udGVudFR5cGUgPT09ICdtZXNzYWdlL3JmYzgyMic7XG5cbiAgICAgICAgaWYgKCF0aGlzLnBhcmVudE5vZGUgfHwgdGhpcy5wYXJlbnROb2RlLnJmYzgyMikge1xuICAgICAgICAgICAgdGhpcy5wYXJ0TnIgPSB0aGlzLnBhcmVudE5vZGUgPyB0aGlzLnBhcmVudE5vZGUuZ2V0UGFydE5yKCdURVhUJykgOiBbJ1RFWFQnXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMucGFydE5yID0gdGhpcy5wYXJlbnROb2RlID8gdGhpcy5wYXJlbnROb2RlLmdldFBhcnROcigpIDogW107XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBnZXRIZWFkZXJzKCkge1xuICAgICAgICBpZiAoIXRoaXMuaGVhZGVycykge1xuICAgICAgICAgICAgdGhpcy5wYXJzZUhlYWRlcnMoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5oZWFkZXJzLmJ1aWxkKCk7XG4gICAgfVxuXG4gICAgc2V0Q29udGVudFR5cGUoY29udGVudFR5cGUpIHtcbiAgICAgICAgaWYgKCF0aGlzLmhlYWRlcnMpIHtcbiAgICAgICAgICAgIHRoaXMucGFyc2VIZWFkZXJzKCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb250ZW50VHlwZSA9IChjb250ZW50VHlwZSB8fCAnJykudG9Mb3dlckNhc2UoKS50cmltKCk7XG4gICAgICAgIGlmIChjb250ZW50VHlwZSkge1xuICAgICAgICAgICAgdGhpcy5fcGFyc2VkQ29udGVudFR5cGUudmFsdWUgPSBjb250ZW50VHlwZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhpcy5mbG93ZWQgJiYgdGhpcy5fcGFyc2VkQ29udGVudFR5cGUucGFyYW1zLmZvcm1hdCkge1xuICAgICAgICAgICAgZGVsZXRlIHRoaXMuX3BhcnNlZENvbnRlbnRUeXBlLnBhcmFtcy5mb3JtYXQ7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMuZGVsU3AgJiYgdGhpcy5fcGFyc2VkQ29udGVudFR5cGUucGFyYW1zLmRlbHNwKSB7XG4gICAgICAgICAgICBkZWxldGUgdGhpcy5fcGFyc2VkQ29udGVudFR5cGUucGFyYW1zLmRlbHNwO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5oZWFkZXJzLnVwZGF0ZSgnQ29udGVudC1UeXBlJywgdGhpcy5saWJtaW1lLmJ1aWxkSGVhZGVyVmFsdWUodGhpcy5fcGFyc2VkQ29udGVudFR5cGUpKTtcbiAgICB9XG5cbiAgICBzZXRDaGFyc2V0KGNoYXJzZXQpIHtcbiAgICAgICAgaWYgKCF0aGlzLmhlYWRlcnMpIHtcbiAgICAgICAgICAgIHRoaXMucGFyc2VIZWFkZXJzKCk7XG4gICAgICAgIH1cblxuICAgICAgICBjaGFyc2V0ID0gKGNoYXJzZXQgfHwgJycpLnRvTG93ZXJDYXNlKCkudHJpbSgpO1xuXG4gICAgICAgIGlmIChjaGFyc2V0ID09PSAnYXNjaWknKSB7XG4gICAgICAgICAgICBjaGFyc2V0ID0gJyc7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWNoYXJzZXQpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5fcGFyc2VkQ29udGVudFR5cGUudmFsdWUpIHtcbiAgICAgICAgICAgICAgICAvLyBub3RoaW5nIHRvIHNldCBvciB1cGRhdGVcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkZWxldGUgdGhpcy5fcGFyc2VkQ29udGVudFR5cGUucGFyYW1zLmNoYXJzZXQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9wYXJzZWRDb250ZW50VHlwZS5wYXJhbXMuY2hhcnNldCA9IGNoYXJzZXQ7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMuX3BhcnNlZENvbnRlbnRUeXBlLnZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLl9wYXJzZWRDb250ZW50VHlwZS52YWx1ZSA9ICd0ZXh0L3BsYWluJztcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuaGVhZGVycy51cGRhdGUoJ0NvbnRlbnQtVHlwZScsIHRoaXMubGlibWltZS5idWlsZEhlYWRlclZhbHVlKHRoaXMuX3BhcnNlZENvbnRlbnRUeXBlKSk7XG4gICAgfVxuXG4gICAgc2V0RmlsZW5hbWUoZmlsZW5hbWUpIHtcbiAgICAgICAgaWYgKCF0aGlzLmhlYWRlcnMpIHtcbiAgICAgICAgICAgIHRoaXMucGFyc2VIZWFkZXJzKCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmZpbGVuYW1lID0gKGZpbGVuYW1lIHx8ICcnKS50b0xvd2VyQ2FzZSgpLnRyaW0oKTtcblxuICAgICAgICBpZiAodGhpcy5fcGFyc2VkQ29udGVudFR5cGUucGFyYW1zLm5hbWUpIHtcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLl9wYXJzZWRDb250ZW50VHlwZS5wYXJhbXMubmFtZTtcbiAgICAgICAgICAgIHRoaXMuaGVhZGVycy51cGRhdGUoJ0NvbnRlbnQtVHlwZScsIHRoaXMubGlibWltZS5idWlsZEhlYWRlclZhbHVlKHRoaXMuX3BhcnNlZENvbnRlbnRUeXBlKSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMuZmlsZW5hbWUpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5fcGFyc2VkQ29udGVudERpc3Bvc2l0aW9uLnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgLy8gbm90aGluZyB0byBzZXQgb3IgdXBkYXRlXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZGVsZXRlIHRoaXMuX3BhcnNlZENvbnRlbnREaXNwb3NpdGlvbi5wYXJhbXMuZmlsZW5hbWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9wYXJzZWRDb250ZW50RGlzcG9zaXRpb24ucGFyYW1zLmZpbGVuYW1lID0gdGhpcy5maWxlbmFtZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhpcy5fcGFyc2VkQ29udGVudERpc3Bvc2l0aW9uLnZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLl9wYXJzZWRDb250ZW50RGlzcG9zaXRpb24udmFsdWUgPSAnYXR0YWNobWVudCc7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmhlYWRlcnMudXBkYXRlKCdDb250ZW50LURpc3Bvc2l0aW9uJywgdGhpcy5saWJtaW1lLmJ1aWxkSGVhZGVyVmFsdWUodGhpcy5fcGFyc2VkQ29udGVudERpc3Bvc2l0aW9uKSk7XG4gICAgfVxuXG4gICAgZ2V0RGVjb2RlcigpIHtcbiAgICAgICAgaWYgKCF0aGlzLmhlYWRlcnMpIHtcbiAgICAgICAgICAgIHRoaXMucGFyc2VIZWFkZXJzKCk7XG4gICAgICAgIH1cblxuICAgICAgICBzd2l0Y2ggKHRoaXMuZW5jb2RpbmcpIHtcbiAgICAgICAgICAgIGNhc2UgJ2Jhc2U2NCc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBsaWJiYXNlNjQuRGVjb2RlcigpO1xuICAgICAgICAgICAgY2FzZSAncXVvdGVkLXByaW50YWJsZSc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBsaWJxcC5EZWNvZGVyKCk7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUGFzc1Rocm91Z2goKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGdldEVuY29kZXIoZW5jb2RpbmcpIHtcbiAgICAgICAgaWYgKCF0aGlzLmhlYWRlcnMpIHtcbiAgICAgICAgICAgIHRoaXMucGFyc2VIZWFkZXJzKCk7XG4gICAgICAgIH1cblxuICAgICAgICBlbmNvZGluZyA9IChlbmNvZGluZyB8fCAnJykudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpLnRyaW0oKTtcblxuICAgICAgICBpZiAoZW5jb2RpbmcgJiYgZW5jb2RpbmcgIT09IHRoaXMuZW5jb2RpbmcpIHtcbiAgICAgICAgICAgIHRoaXMuaGVhZGVycy51cGRhdGUoJ0NvbnRlbnQtVHJhbnNmZXItRW5jb2RpbmcnLCBlbmNvZGluZyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBlbmNvZGluZyA9IHRoaXMuZW5jb2Rpbmc7XG4gICAgICAgIH1cblxuICAgICAgICBzd2l0Y2ggKGVuY29kaW5nKSB7XG4gICAgICAgICAgICBjYXNlICdiYXNlNjQnOlxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgbGliYmFzZTY0LkVuY29kZXIoKTtcbiAgICAgICAgICAgIGNhc2UgJ3F1b3RlZC1wcmludGFibGUnOlxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgbGlicXAuRW5jb2RlcigpO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFBhc3NUaHJvdWdoKCk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gTWltZU5vZGU7XG4iXSwibmFtZXMiOltdLCJpZ25vcmVMaXN0IjpbMF0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(action-browser)/./node_modules/imapflow/node_modules/mailsplit/lib/mime-node.js\n");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "(action-browser)/./node_modules/imapflow/node_modules/mailsplit/lib/node-rewriter.js":
|
|
/*!***************************************************************************!*\
|
|
!*** ./node_modules/imapflow/node_modules/mailsplit/lib/node-rewriter.js ***!
|
|
\***************************************************************************/
|
|
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
|
|
|
|
eval("\n\n// Helper class to rewrite nodes with specific mime type\n\nconst Transform = (__webpack_require__(/*! stream */ \"stream\").Transform);\nconst FlowedDecoder = __webpack_require__(/*! ./flowed-decoder */ \"(action-browser)/./node_modules/imapflow/node_modules/mailsplit/lib/flowed-decoder.js\");\n\n/**\n * NodeRewriter Transform stream. Updates content for all nodes with specified mime type\n *\n * @constructor\n * @param {String} mimeType Define the Mime-Type to look for\n * @param {Function} rewriteAction Function to run with the node content\n */\nclass NodeRewriter extends Transform {\n constructor(filterFunc, rewriteAction) {\n let options = {\n readableObjectMode: true,\n writableObjectMode: true\n };\n super(options);\n\n this.filterFunc = filterFunc;\n this.rewriteAction = rewriteAction;\n\n this.decoder = false;\n this.encoder = false;\n this.continue = false;\n }\n\n _transform(data, encoding, callback) {\n this.processIncoming(data, callback);\n }\n\n _flush(callback) {\n if (this.decoder) {\n // emit an empty node just in case there is pending data to end\n return this.processIncoming(\n {\n type: 'none'\n },\n callback\n );\n }\n return callback();\n }\n\n processIncoming(data, callback) {\n if (this.decoder && data.type === 'body') {\n // data to parse\n if (!this.decoder.write(data.value)) {\n return this.decoder.once('drain', callback);\n } else {\n return callback();\n }\n } else if (this.decoder && data.type !== 'body') {\n // stop decoding.\n // we can not process the current data chunk as we need to wait until\n // the parsed data is completely processed, so we store a reference to the\n // continue callback\n this.continue = () => {\n this.continue = false;\n this.decoder = false;\n this.encoder = false;\n this.processIncoming(data, callback);\n };\n return this.decoder.end();\n } else if (data.type === 'node' && this.filterFunc(data)) {\n // found matching node, create new handler\n this.emit('node', this.createDecodePair(data));\n } else if (this.readable && data.type !== 'none') {\n // we don't care about this data, just pass it over to the joiner\n this.push(data);\n }\n callback();\n }\n\n createDecodePair(node) {\n this.decoder = node.getDecoder();\n\n if (['base64', 'quoted-printable'].includes(node.encoding)) {\n this.encoder = node.getEncoder();\n } else {\n this.encoder = node.getEncoder('quoted-printable');\n }\n\n let lastByte = false;\n\n let decoder = this.decoder;\n let encoder = this.encoder;\n let firstChunk = true;\n decoder.$reading = false;\n\n let readFromEncoder = () => {\n decoder.$reading = true;\n\n let data = encoder.read();\n if (data === null) {\n decoder.$reading = false;\n return;\n }\n\n if (firstChunk) {\n firstChunk = false;\n if (this.readable) {\n this.push(node);\n if (node.type === 'body') {\n lastByte = node.value && node.value.length && node.value[node.value.length - 1];\n }\n }\n }\n\n let writeMore = true;\n if (this.readable) {\n writeMore = this.push({\n node,\n type: 'body',\n value: data\n });\n lastByte = data && data.length && data[data.length - 1];\n }\n\n if (writeMore) {\n return setImmediate(readFromEncoder);\n } else {\n encoder.pause();\n // no idea how to catch drain? use timeout for now as poor man's substitute\n // this.once('drain', () => encoder.resume());\n setTimeout(() => {\n encoder.resume();\n setImmediate(readFromEncoder);\n }, 100);\n }\n };\n\n encoder.on('readable', () => {\n if (!decoder.$reading) {\n return readFromEncoder();\n }\n });\n\n encoder.on('end', () => {\n if (firstChunk) {\n firstChunk = false;\n if (this.readable) {\n this.push(node);\n if (node.type === 'body') {\n lastByte = node.value && node.value.length && node.value[node.value.length - 1];\n }\n }\n }\n\n if (lastByte !== 0x0a) {\n // make sure there is a terminating line break\n this.push({\n node,\n type: 'body',\n value: Buffer.from([0x0a])\n });\n }\n\n if (this.continue) {\n return this.continue();\n }\n });\n\n if (/^text\\//.test(node.contentType) && node.flowed) {\n // text/plain; format=flowed is a special case\n let flowDecoder = decoder;\n decoder = new FlowedDecoder({\n delSp: node.delSp,\n encoding: node.encoding\n });\n flowDecoder.on('error', err => {\n decoder.emit('error', err);\n });\n flowDecoder.pipe(decoder);\n\n // we don't know what kind of data we are going to get, does it comply with the\n // requirements of format=flowed, so we just cancel it\n node.flowed = false;\n node.delSp = false;\n node.setContentType();\n }\n\n return {\n node,\n decoder,\n encoder\n };\n }\n}\n\nmodule.exports = NodeRewriter;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFjdGlvbi1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9pbWFwZmxvdy9ub2RlX21vZHVsZXMvbWFpbHNwbGl0L2xpYi9ub2RlLXJld3JpdGVyLmpzIiwibWFwcGluZ3MiOiJBQUFhOztBQUViOztBQUVBLGtCQUFrQix1REFBMkI7QUFDN0Msc0JBQXNCLG1CQUFPLENBQUMsK0dBQWtCOztBQUVoRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsUUFBUTtBQUNuQixXQUFXLFVBQVU7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBLDJCQUEyQjtBQUMzQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0EsYUFBYTtBQUNiOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSIsInNvdXJjZXMiOlsiL2hvbWUvYWxtYS9uZXh0Z2VuL05lYWgtbWFpbC9ub2RlX21vZHVsZXMvaW1hcGZsb3cvbm9kZV9tb2R1bGVzL21haWxzcGxpdC9saWIvbm9kZS1yZXdyaXRlci5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbi8vIEhlbHBlciBjbGFzcyB0byByZXdyaXRlIG5vZGVzIHdpdGggc3BlY2lmaWMgbWltZSB0eXBlXG5cbmNvbnN0IFRyYW5zZm9ybSA9IHJlcXVpcmUoJ3N0cmVhbScpLlRyYW5zZm9ybTtcbmNvbnN0IEZsb3dlZERlY29kZXIgPSByZXF1aXJlKCcuL2Zsb3dlZC1kZWNvZGVyJyk7XG5cbi8qKlxuICogTm9kZVJld3JpdGVyIFRyYW5zZm9ybSBzdHJlYW0uIFVwZGF0ZXMgY29udGVudCBmb3IgYWxsIG5vZGVzIHdpdGggc3BlY2lmaWVkIG1pbWUgdHlwZVxuICpcbiAqIEBjb25zdHJ1Y3RvclxuICogQHBhcmFtIHtTdHJpbmd9IG1pbWVUeXBlIERlZmluZSB0aGUgTWltZS1UeXBlIHRvIGxvb2sgZm9yXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSByZXdyaXRlQWN0aW9uIEZ1bmN0aW9uIHRvIHJ1biB3aXRoIHRoZSBub2RlIGNvbnRlbnRcbiAqL1xuY2xhc3MgTm9kZVJld3JpdGVyIGV4dGVuZHMgVHJhbnNmb3JtIHtcbiAgICBjb25zdHJ1Y3RvcihmaWx0ZXJGdW5jLCByZXdyaXRlQWN0aW9uKSB7XG4gICAgICAgIGxldCBvcHRpb25zID0ge1xuICAgICAgICAgICAgcmVhZGFibGVPYmplY3RNb2RlOiB0cnVlLFxuICAgICAgICAgICAgd3JpdGFibGVPYmplY3RNb2RlOiB0cnVlXG4gICAgICAgIH07XG4gICAgICAgIHN1cGVyKG9wdGlvbnMpO1xuXG4gICAgICAgIHRoaXMuZmlsdGVyRnVuYyA9IGZpbHRlckZ1bmM7XG4gICAgICAgIHRoaXMucmV3cml0ZUFjdGlvbiA9IHJld3JpdGVBY3Rpb247XG5cbiAgICAgICAgdGhpcy5kZWNvZGVyID0gZmFsc2U7XG4gICAgICAgIHRoaXMuZW5jb2RlciA9IGZhbHNlO1xuICAgICAgICB0aGlzLmNvbnRpbnVlID0gZmFsc2U7XG4gICAgfVxuXG4gICAgX3RyYW5zZm9ybShkYXRhLCBlbmNvZGluZywgY2FsbGJhY2spIHtcbiAgICAgICAgdGhpcy5wcm9jZXNzSW5jb21pbmcoZGF0YSwgY2FsbGJhY2spO1xuICAgIH1cblxuICAgIF9mbHVzaChjYWxsYmFjaykge1xuICAgICAgICBpZiAodGhpcy5kZWNvZGVyKSB7XG4gICAgICAgICAgICAvLyBlbWl0IGFuIGVtcHR5IG5vZGUganVzdCBpbiBjYXNlIHRoZXJlIGlzIHBlbmRpbmcgZGF0YSB0byBlbmRcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnByb2Nlc3NJbmNvbWluZyhcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICdub25lJ1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgY2FsbGJhY2tcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNhbGxiYWNrKCk7XG4gICAgfVxuXG4gICAgcHJvY2Vzc0luY29taW5nKGRhdGEsIGNhbGxiYWNrKSB7XG4gICAgICAgIGlmICh0aGlzLmRlY29kZXIgJiYgZGF0YS50eXBlID09PSAnYm9keScpIHtcbiAgICAgICAgICAgIC8vIGRhdGEgdG8gcGFyc2VcbiAgICAgICAgICAgIGlmICghdGhpcy5kZWNvZGVyLndyaXRlKGRhdGEudmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGVjb2Rlci5vbmNlKCdkcmFpbicsIGNhbGxiYWNrKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5kZWNvZGVyICYmIGRhdGEudHlwZSAhPT0gJ2JvZHknKSB7XG4gICAgICAgICAgICAvLyBzdG9wIGRlY29kaW5nLlxuICAgICAgICAgICAgLy8gd2UgY2FuIG5vdCBwcm9jZXNzIHRoZSBjdXJyZW50IGRhdGEgY2h1bmsgYXMgd2UgbmVlZCB0byB3YWl0IHVudGlsXG4gICAgICAgICAgICAvLyB0aGUgcGFyc2VkIGRhdGEgaXMgY29tcGxldGVseSBwcm9jZXNzZWQsIHNvIHdlIHN0b3JlIGEgcmVmZXJlbmNlIHRvIHRoZVxuICAgICAgICAgICAgLy8gY29udGludWUgY2FsbGJhY2tcbiAgICAgICAgICAgIHRoaXMuY29udGludWUgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5jb250aW51ZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHRoaXMuZGVjb2RlciA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHRoaXMuZW5jb2RlciA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHRoaXMucHJvY2Vzc0luY29taW5nKGRhdGEsIGNhbGxiYWNrKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5kZWNvZGVyLmVuZCgpO1xuICAgICAgICB9IGVsc2UgaWYgKGRhdGEudHlwZSA9PT0gJ25vZGUnICYmIHRoaXMuZmlsdGVyRnVuYyhkYXRhKSkge1xuICAgICAgICAgICAgLy8gZm91bmQgbWF0Y2hpbmcgbm9kZSwgY3JlYXRlIG5ldyBoYW5kbGVyXG4gICAgICAgICAgICB0aGlzLmVtaXQoJ25vZGUnLCB0aGlzLmNyZWF0ZURlY29kZVBhaXIoZGF0YSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMucmVhZGFibGUgJiYgZGF0YS50eXBlICE9PSAnbm9uZScpIHtcbiAgICAgICAgICAgIC8vIHdlIGRvbid0IGNhcmUgYWJvdXQgdGhpcyBkYXRhLCBqdXN0IHBhc3MgaXQgb3ZlciB0byB0aGUgam9pbmVyXG4gICAgICAgICAgICB0aGlzLnB1c2goZGF0YSk7XG4gICAgICAgIH1cbiAgICAgICAgY2FsbGJhY2soKTtcbiAgICB9XG5cbiAgICBjcmVhdGVEZWNvZGVQYWlyKG5vZGUpIHtcbiAgICAgICAgdGhpcy5kZWNvZGVyID0gbm9kZS5nZXREZWNvZGVyKCk7XG5cbiAgICAgICAgaWYgKFsnYmFzZTY0JywgJ3F1b3RlZC1wcmludGFibGUnXS5pbmNsdWRlcyhub2RlLmVuY29kaW5nKSkge1xuICAgICAgICAgICAgdGhpcy5lbmNvZGVyID0gbm9kZS5nZXRFbmNvZGVyKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmVuY29kZXIgPSBub2RlLmdldEVuY29kZXIoJ3F1b3RlZC1wcmludGFibGUnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsYXN0Qnl0ZSA9IGZhbHNlO1xuXG4gICAgICAgIGxldCBkZWNvZGVyID0gdGhpcy5kZWNvZGVyO1xuICAgICAgICBsZXQgZW5jb2RlciA9IHRoaXMuZW5jb2RlcjtcbiAgICAgICAgbGV0IGZpcnN0Q2h1bmsgPSB0cnVlO1xuICAgICAgICBkZWNvZGVyLiRyZWFkaW5nID0gZmFsc2U7XG5cbiAgICAgICAgbGV0IHJlYWRGcm9tRW5jb2RlciA9ICgpID0+IHtcbiAgICAgICAgICAgIGRlY29kZXIuJHJlYWRpbmcgPSB0cnVlO1xuXG4gICAgICAgICAgICBsZXQgZGF0YSA9IGVuY29kZXIucmVhZCgpO1xuICAgICAgICAgICAgaWYgKGRhdGEgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBkZWNvZGVyLiRyZWFkaW5nID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoZmlyc3RDaHVuaykge1xuICAgICAgICAgICAgICAgIGZpcnN0Q2h1bmsgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5yZWFkYWJsZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnB1c2gobm9kZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChub2RlLnR5cGUgPT09ICdib2R5Jykge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGFzdEJ5dGUgPSBub2RlLnZhbHVlICYmIG5vZGUudmFsdWUubGVuZ3RoICYmIG5vZGUudmFsdWVbbm9kZS52YWx1ZS5sZW5ndGggLSAxXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbGV0IHdyaXRlTW9yZSA9IHRydWU7XG4gICAgICAgICAgICBpZiAodGhpcy5yZWFkYWJsZSkge1xuICAgICAgICAgICAgICAgIHdyaXRlTW9yZSA9IHRoaXMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgIG5vZGUsXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICdib2R5JyxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGRhdGFcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBsYXN0Qnl0ZSA9IGRhdGEgJiYgZGF0YS5sZW5ndGggJiYgZGF0YVtkYXRhLmxlbmd0aCAtIDFdO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAod3JpdGVNb3JlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHNldEltbWVkaWF0ZShyZWFkRnJvbUVuY29kZXIpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBlbmNvZGVyLnBhdXNlKCk7XG4gICAgICAgICAgICAgICAgLy8gbm8gaWRlYSBob3cgdG8gY2F0Y2ggZHJhaW4/IHVzZSB0aW1lb3V0IGZvciBub3cgYXMgcG9vciBtYW4ncyBzdWJzdGl0dXRlXG4gICAgICAgICAgICAgICAgLy8gdGhpcy5vbmNlKCdkcmFpbicsICgpID0+IGVuY29kZXIucmVzdW1lKCkpO1xuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBlbmNvZGVyLnJlc3VtZSgpO1xuICAgICAgICAgICAgICAgICAgICBzZXRJbW1lZGlhdGUocmVhZEZyb21FbmNvZGVyKTtcbiAgICAgICAgICAgICAgICB9LCAxMDApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIGVuY29kZXIub24oJ3JlYWRhYmxlJywgKCkgPT4ge1xuICAgICAgICAgICAgaWYgKCFkZWNvZGVyLiRyZWFkaW5nKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlYWRGcm9tRW5jb2RlcigpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBlbmNvZGVyLm9uKCdlbmQnLCAoKSA9PiB7XG4gICAgICAgICAgICBpZiAoZmlyc3RDaHVuaykge1xuICAgICAgICAgICAgICAgIGZpcnN0Q2h1bmsgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5yZWFkYWJsZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnB1c2gobm9kZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChub2RlLnR5cGUgPT09ICdib2R5Jykge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGFzdEJ5dGUgPSBub2RlLnZhbHVlICYmIG5vZGUudmFsdWUubGVuZ3RoICYmIG5vZGUudmFsdWVbbm9kZS52YWx1ZS5sZW5ndGggLSAxXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGxhc3RCeXRlICE9PSAweDBhKSB7XG4gICAgICAgICAgICAgICAgLy8gbWFrZSBzdXJlIHRoZXJlIGlzIGEgdGVybWluYXRpbmcgbGluZSBicmVha1xuICAgICAgICAgICAgICAgIHRoaXMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgIG5vZGUsXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICdib2R5JyxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IEJ1ZmZlci5mcm9tKFsweDBhXSlcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHRoaXMuY29udGludWUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5jb250aW51ZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBpZiAoL150ZXh0XFwvLy50ZXN0KG5vZGUuY29udGVudFR5cGUpICYmIG5vZGUuZmxvd2VkKSB7XG4gICAgICAgICAgICAvLyB0ZXh0L3BsYWluOyBmb3JtYXQ9Zmxvd2VkIGlzIGEgc3BlY2lhbCBjYXNlXG4gICAgICAgICAgICBsZXQgZmxvd0RlY29kZXIgPSBkZWNvZGVyO1xuICAgICAgICAgICAgZGVjb2RlciA9IG5ldyBGbG93ZWREZWNvZGVyKHtcbiAgICAgICAgICAgICAgICBkZWxTcDogbm9kZS5kZWxTcCxcbiAgICAgICAgICAgICAgICBlbmNvZGluZzogbm9kZS5lbmNvZGluZ1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBmbG93RGVjb2Rlci5vbignZXJyb3InLCBlcnIgPT4ge1xuICAgICAgICAgICAgICAgIGRlY29kZXIuZW1pdCgnZXJyb3InLCBlcnIpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBmbG93RGVjb2Rlci5waXBlKGRlY29kZXIpO1xuXG4gICAgICAgICAgICAvLyB3ZSBkb24ndCBrbm93IHdoYXQga2luZCBvZiBkYXRhIHdlIGFyZSBnb2luZyB0byBnZXQsIGRvZXMgaXQgY29tcGx5IHdpdGggdGhlXG4gICAgICAgICAgICAvLyByZXF1aXJlbWVudHMgb2YgZm9ybWF0PWZsb3dlZCwgc28gd2UganVzdCBjYW5jZWwgaXRcbiAgICAgICAgICAgIG5vZGUuZmxvd2VkID0gZmFsc2U7XG4gICAgICAgICAgICBub2RlLmRlbFNwID0gZmFsc2U7XG4gICAgICAgICAgICBub2RlLnNldENvbnRlbnRUeXBlKCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbm9kZSxcbiAgICAgICAgICAgIGRlY29kZXIsXG4gICAgICAgICAgICBlbmNvZGVyXG4gICAgICAgIH07XG4gICAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IE5vZGVSZXdyaXRlcjtcbiJdLCJuYW1lcyI6W10sImlnbm9yZUxpc3QiOlswXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(action-browser)/./node_modules/imapflow/node_modules/mailsplit/lib/node-rewriter.js\n");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "(action-browser)/./node_modules/imapflow/node_modules/mailsplit/lib/node-streamer.js":
|
|
/*!***************************************************************************!*\
|
|
!*** ./node_modules/imapflow/node_modules/mailsplit/lib/node-streamer.js ***!
|
|
\***************************************************************************/
|
|
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
|
|
|
|
eval("\n\n// Helper class to rewrite nodes with specific mime type\n\nconst Transform = (__webpack_require__(/*! stream */ \"stream\").Transform);\nconst FlowedDecoder = __webpack_require__(/*! ./flowed-decoder */ \"(action-browser)/./node_modules/imapflow/node_modules/mailsplit/lib/flowed-decoder.js\");\n\n/**\n * NodeRewriter Transform stream. Updates content for all nodes with specified mime type\n *\n * @constructor\n * @param {String} mimeType Define the Mime-Type to look for\n * @param {Function} streamAction Function to run with the node content\n */\nclass NodeStreamer extends Transform {\n constructor(filterFunc, streamAction) {\n let options = {\n readableObjectMode: true,\n writableObjectMode: true\n };\n super(options);\n\n this.filterFunc = filterFunc;\n this.streamAction = streamAction;\n\n this.decoder = false;\n this.canContinue = false;\n this.continue = false;\n }\n\n _transform(data, encoding, callback) {\n this.processIncoming(data, callback);\n }\n\n _flush(callback) {\n if (this.decoder) {\n // emit an empty node just in case there is pending data to end\n return this.processIncoming(\n {\n type: 'none'\n },\n callback\n );\n }\n return callback();\n }\n\n processIncoming(data, callback) {\n if (this.decoder && data.type === 'body') {\n // data to parse\n this.push(data);\n if (!this.decoder.write(data.value)) {\n return this.decoder.once('drain', callback);\n } else {\n return callback();\n }\n } else if (this.decoder && data.type !== 'body') {\n // stop decoding.\n // we can not process the current data chunk as we need to wait until\n // the parsed data is completely processed, so we store a reference to the\n // continue callback\n\n let doContinue = () => {\n this.continue = false;\n this.decoder = false;\n this.canContinue = false;\n this.processIncoming(data, callback);\n };\n\n if (this.canContinue) {\n setImmediate(doContinue);\n } else {\n this.continue = () => doContinue();\n }\n\n return this.decoder.end();\n } else if (data.type === 'node' && this.filterFunc(data)) {\n this.push(data);\n // found matching node, create new handler\n this.emit('node', this.createDecoder(data));\n } else if (this.readable && data.type !== 'none') {\n // we don't care about this data, just pass it over to the joiner\n this.push(data);\n }\n callback();\n }\n\n createDecoder(node) {\n this.decoder = node.getDecoder();\n\n let decoder = this.decoder;\n decoder.$reading = false;\n\n if (/^text\\//.test(node.contentType) && node.flowed) {\n let flowDecoder = decoder;\n decoder = new FlowedDecoder({\n delSp: node.delSp\n });\n flowDecoder.on('error', err => {\n decoder.emit('error', err);\n });\n flowDecoder.pipe(decoder);\n }\n\n return {\n node,\n decoder,\n done: () => {\n if (typeof this.continue === 'function') {\n // called once input stream is processed\n this.continue();\n } else {\n // called before input stream is processed\n this.canContinue = true;\n }\n }\n };\n }\n}\n\nmodule.exports = NodeStreamer;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFjdGlvbi1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9pbWFwZmxvdy9ub2RlX21vZHVsZXMvbWFpbHNwbGl0L2xpYi9ub2RlLXN0cmVhbWVyLmpzIiwibWFwcGluZ3MiOiJBQUFhOztBQUViOztBQUVBLGtCQUFrQix1REFBMkI7QUFDN0Msc0JBQXNCLG1CQUFPLENBQUMsK0dBQWtCOztBQUVoRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsUUFBUTtBQUNuQixXQUFXLFVBQVU7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBOztBQUVBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0I7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEiLCJzb3VyY2VzIjpbIi9ob21lL2FsbWEvbmV4dGdlbi9OZWFoLW1haWwvbm9kZV9tb2R1bGVzL2ltYXBmbG93L25vZGVfbW9kdWxlcy9tYWlsc3BsaXQvbGliL25vZGUtc3RyZWFtZXIuanMiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG4vLyBIZWxwZXIgY2xhc3MgdG8gcmV3cml0ZSBub2RlcyB3aXRoIHNwZWNpZmljIG1pbWUgdHlwZVxuXG5jb25zdCBUcmFuc2Zvcm0gPSByZXF1aXJlKCdzdHJlYW0nKS5UcmFuc2Zvcm07XG5jb25zdCBGbG93ZWREZWNvZGVyID0gcmVxdWlyZSgnLi9mbG93ZWQtZGVjb2RlcicpO1xuXG4vKipcbiAqIE5vZGVSZXdyaXRlciBUcmFuc2Zvcm0gc3RyZWFtLiBVcGRhdGVzIGNvbnRlbnQgZm9yIGFsbCBub2RlcyB3aXRoIHNwZWNpZmllZCBtaW1lIHR5cGVcbiAqXG4gKiBAY29uc3RydWN0b3JcbiAqIEBwYXJhbSB7U3RyaW5nfSBtaW1lVHlwZSBEZWZpbmUgdGhlIE1pbWUtVHlwZSB0byBsb29rIGZvclxuICogQHBhcmFtIHtGdW5jdGlvbn0gc3RyZWFtQWN0aW9uIEZ1bmN0aW9uIHRvIHJ1biB3aXRoIHRoZSBub2RlIGNvbnRlbnRcbiAqL1xuY2xhc3MgTm9kZVN0cmVhbWVyIGV4dGVuZHMgVHJhbnNmb3JtIHtcbiAgICBjb25zdHJ1Y3RvcihmaWx0ZXJGdW5jLCBzdHJlYW1BY3Rpb24pIHtcbiAgICAgICAgbGV0IG9wdGlvbnMgPSB7XG4gICAgICAgICAgICByZWFkYWJsZU9iamVjdE1vZGU6IHRydWUsXG4gICAgICAgICAgICB3cml0YWJsZU9iamVjdE1vZGU6IHRydWVcbiAgICAgICAgfTtcbiAgICAgICAgc3VwZXIob3B0aW9ucyk7XG5cbiAgICAgICAgdGhpcy5maWx0ZXJGdW5jID0gZmlsdGVyRnVuYztcbiAgICAgICAgdGhpcy5zdHJlYW1BY3Rpb24gPSBzdHJlYW1BY3Rpb247XG5cbiAgICAgICAgdGhpcy5kZWNvZGVyID0gZmFsc2U7XG4gICAgICAgIHRoaXMuY2FuQ29udGludWUgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5jb250aW51ZSA9IGZhbHNlO1xuICAgIH1cblxuICAgIF90cmFuc2Zvcm0oZGF0YSwgZW5jb2RpbmcsIGNhbGxiYWNrKSB7XG4gICAgICAgIHRoaXMucHJvY2Vzc0luY29taW5nKGRhdGEsIGNhbGxiYWNrKTtcbiAgICB9XG5cbiAgICBfZmx1c2goY2FsbGJhY2spIHtcbiAgICAgICAgaWYgKHRoaXMuZGVjb2Rlcikge1xuICAgICAgICAgICAgLy8gZW1pdCBhbiBlbXB0eSBub2RlIGp1c3QgaW4gY2FzZSB0aGVyZSBpcyBwZW5kaW5nIGRhdGEgdG8gZW5kXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5wcm9jZXNzSW5jb21pbmcoXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnbm9uZSdcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGNhbGxiYWNrXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjYWxsYmFjaygpO1xuICAgIH1cblxuICAgIHByb2Nlc3NJbmNvbWluZyhkYXRhLCBjYWxsYmFjaykge1xuICAgICAgICBpZiAodGhpcy5kZWNvZGVyICYmIGRhdGEudHlwZSA9PT0gJ2JvZHknKSB7XG4gICAgICAgICAgICAvLyBkYXRhIHRvIHBhcnNlXG4gICAgICAgICAgICB0aGlzLnB1c2goZGF0YSk7XG4gICAgICAgICAgICBpZiAoIXRoaXMuZGVjb2Rlci53cml0ZShkYXRhLnZhbHVlKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmRlY29kZXIub25jZSgnZHJhaW4nLCBjYWxsYmFjayk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBjYWxsYmFjaygpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuZGVjb2RlciAmJiBkYXRhLnR5cGUgIT09ICdib2R5Jykge1xuICAgICAgICAgICAgLy8gc3RvcCBkZWNvZGluZy5cbiAgICAgICAgICAgIC8vIHdlIGNhbiBub3QgcHJvY2VzcyB0aGUgY3VycmVudCBkYXRhIGNodW5rIGFzIHdlIG5lZWQgdG8gd2FpdCB1bnRpbFxuICAgICAgICAgICAgLy8gdGhlIHBhcnNlZCBkYXRhIGlzIGNvbXBsZXRlbHkgcHJvY2Vzc2VkLCBzbyB3ZSBzdG9yZSBhIHJlZmVyZW5jZSB0byB0aGVcbiAgICAgICAgICAgIC8vIGNvbnRpbnVlIGNhbGxiYWNrXG5cbiAgICAgICAgICAgIGxldCBkb0NvbnRpbnVlID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuY29udGludWUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB0aGlzLmRlY29kZXIgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB0aGlzLmNhbkNvbnRpbnVlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgdGhpcy5wcm9jZXNzSW5jb21pbmcoZGF0YSwgY2FsbGJhY2spO1xuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgaWYgKHRoaXMuY2FuQ29udGludWUpIHtcbiAgICAgICAgICAgICAgICBzZXRJbW1lZGlhdGUoZG9Db250aW51ZSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuY29udGludWUgPSAoKSA9PiBkb0NvbnRpbnVlKCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiB0aGlzLmRlY29kZXIuZW5kKCk7XG4gICAgICAgIH0gZWxzZSBpZiAoZGF0YS50eXBlID09PSAnbm9kZScgJiYgdGhpcy5maWx0ZXJGdW5jKGRhdGEpKSB7XG4gICAgICAgICAgICB0aGlzLnB1c2goZGF0YSk7XG4gICAgICAgICAgICAvLyBmb3VuZCBtYXRjaGluZyBub2RlLCBjcmVhdGUgbmV3IGhhbmRsZXJcbiAgICAgICAgICAgIHRoaXMuZW1pdCgnbm9kZScsIHRoaXMuY3JlYXRlRGVjb2RlcihkYXRhKSk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5yZWFkYWJsZSAmJiBkYXRhLnR5cGUgIT09ICdub25lJykge1xuICAgICAgICAgICAgLy8gd2UgZG9uJ3QgY2FyZSBhYm91dCB0aGlzIGRhdGEsIGp1c3QgcGFzcyBpdCBvdmVyIHRvIHRoZSBqb2luZXJcbiAgICAgICAgICAgIHRoaXMucHVzaChkYXRhKTtcbiAgICAgICAgfVxuICAgICAgICBjYWxsYmFjaygpO1xuICAgIH1cblxuICAgIGNyZWF0ZURlY29kZXIobm9kZSkge1xuICAgICAgICB0aGlzLmRlY29kZXIgPSBub2RlLmdldERlY29kZXIoKTtcblxuICAgICAgICBsZXQgZGVjb2RlciA9IHRoaXMuZGVjb2RlcjtcbiAgICAgICAgZGVjb2Rlci4kcmVhZGluZyA9IGZhbHNlO1xuXG4gICAgICAgIGlmICgvXnRleHRcXC8vLnRlc3Qobm9kZS5jb250ZW50VHlwZSkgJiYgbm9kZS5mbG93ZWQpIHtcbiAgICAgICAgICAgIGxldCBmbG93RGVjb2RlciA9IGRlY29kZXI7XG4gICAgICAgICAgICBkZWNvZGVyID0gbmV3IEZsb3dlZERlY29kZXIoe1xuICAgICAgICAgICAgICAgIGRlbFNwOiBub2RlLmRlbFNwXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGZsb3dEZWNvZGVyLm9uKCdlcnJvcicsIGVyciA9PiB7XG4gICAgICAgICAgICAgICAgZGVjb2Rlci5lbWl0KCdlcnJvcicsIGVycik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGZsb3dEZWNvZGVyLnBpcGUoZGVjb2Rlcik7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbm9kZSxcbiAgICAgICAgICAgIGRlY29kZXIsXG4gICAgICAgICAgICBkb25lOiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmNvbnRpbnVlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGNhbGxlZCBvbmNlIGlucHV0IHN0cmVhbSBpcyBwcm9jZXNzZWRcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb250aW51ZSgpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGNhbGxlZCBiZWZvcmUgaW5wdXQgc3RyZWFtIGlzIHByb2Nlc3NlZFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNhbkNvbnRpbnVlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IE5vZGVTdHJlYW1lcjtcbiJdLCJuYW1lcyI6W10sImlnbm9yZUxpc3QiOlswXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(action-browser)/./node_modules/imapflow/node_modules/mailsplit/lib/node-streamer.js\n");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "(action-browser)/./node_modules/imapflow/node_modules/nodemailer/lib/smtp-connection/http-proxy-client.js":
|
|
/*!************************************************************************************************!*\
|
|
!*** ./node_modules/imapflow/node_modules/nodemailer/lib/smtp-connection/http-proxy-client.js ***!
|
|
\************************************************************************************************/
|
|
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
|
|
|
|
eval("\n\n/**\n * Minimal HTTP/S proxy client\n */\n\nconst net = __webpack_require__(/*! net */ \"net\");\nconst tls = __webpack_require__(/*! tls */ \"tls\");\nconst urllib = __webpack_require__(/*! url */ \"url\");\n\n/**\n * Establishes proxied connection to destinationPort\n *\n * httpProxyClient(\"http://localhost:3128/\", 80, \"google.com\", function(err, socket){\n * socket.write(\"GET / HTTP/1.0\\r\\n\\r\\n\");\n * });\n *\n * @param {String} proxyUrl proxy configuration, etg \"http://proxy.host:3128/\"\n * @param {Number} destinationPort Port to open in destination host\n * @param {String} destinationHost Destination hostname\n * @param {Function} callback Callback to run with the rocket object once connection is established\n */\nfunction httpProxyClient(proxyUrl, destinationPort, destinationHost, callback) {\n let proxy = urllib.parse(proxyUrl);\n\n // create a socket connection to the proxy server\n let options;\n let connect;\n let socket;\n\n options = {\n host: proxy.hostname,\n port: Number(proxy.port) ? Number(proxy.port) : proxy.protocol === 'https:' ? 443 : 80\n };\n\n if (proxy.protocol === 'https:') {\n // we can use untrusted proxies as long as we verify actual SMTP certificates\n options.rejectUnauthorized = false;\n connect = tls.connect.bind(tls);\n } else {\n connect = net.connect.bind(net);\n }\n\n // Error harness for initial connection. Once connection is established, the responsibility\n // to handle errors is passed to whoever uses this socket\n let finished = false;\n let tempSocketErr = err => {\n if (finished) {\n return;\n }\n finished = true;\n try {\n socket.destroy();\n } catch (E) {\n // ignore\n }\n callback(err);\n };\n\n let timeoutErr = () => {\n let err = new Error('Proxy socket timed out');\n err.code = 'ETIMEDOUT';\n tempSocketErr(err);\n };\n\n socket = connect(options, () => {\n if (finished) {\n return;\n }\n\n let reqHeaders = {\n Host: destinationHost + ':' + destinationPort,\n Connection: 'close'\n };\n if (proxy.auth) {\n reqHeaders['Proxy-Authorization'] = 'Basic ' + Buffer.from(proxy.auth).toString('base64');\n }\n\n socket.write(\n // HTTP method\n 'CONNECT ' +\n destinationHost +\n ':' +\n destinationPort +\n ' HTTP/1.1\\r\\n' +\n // HTTP request headers\n Object.keys(reqHeaders)\n .map(key => key + ': ' + reqHeaders[key])\n .join('\\r\\n') +\n // End request\n '\\r\\n\\r\\n'\n );\n\n let headers = '';\n let onSocketData = chunk => {\n let match;\n let remainder;\n\n if (finished) {\n return;\n }\n\n headers += chunk.toString('binary');\n if ((match = headers.match(/\\r\\n\\r\\n/))) {\n socket.removeListener('data', onSocketData);\n\n remainder = headers.substr(match.index + match[0].length);\n headers = headers.substr(0, match.index);\n if (remainder) {\n socket.unshift(Buffer.from(remainder, 'binary'));\n }\n\n // proxy connection is now established\n finished = true;\n\n // check response code\n match = headers.match(/^HTTP\\/\\d+\\.\\d+ (\\d+)/i);\n if (!match || (match[1] || '').charAt(0) !== '2') {\n try {\n socket.destroy();\n } catch (E) {\n // ignore\n }\n return callback(new Error('Invalid response from proxy' + ((match && ': ' + match[1]) || '')));\n }\n\n socket.removeListener('error', tempSocketErr);\n socket.removeListener('timeout', timeoutErr);\n socket.setTimeout(0);\n\n return callback(null, socket);\n }\n };\n socket.on('data', onSocketData);\n });\n\n socket.setTimeout(httpProxyClient.timeout || 30 * 1000);\n socket.on('timeout', timeoutErr);\n\n socket.once('error', tempSocketErr);\n}\n\nmodule.exports = httpProxyClient;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFjdGlvbi1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9pbWFwZmxvdy9ub2RlX21vZHVsZXMvbm9kZW1haWxlci9saWIvc210cC1jb25uZWN0aW9uL2h0dHAtcHJveHktY2xpZW50LmpzIiwibWFwcGluZ3MiOiJBQUFhOztBQUViO0FBQ0E7QUFDQTs7QUFFQSxZQUFZLG1CQUFPLENBQUMsZ0JBQUs7QUFDekIsWUFBWSxtQkFBTyxDQUFDLGdCQUFLO0FBQ3pCLGVBQWUsbUJBQU8sQ0FBQyxnQkFBSzs7QUFFNUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBLFdBQVcsUUFBUTtBQUNuQixXQUFXLFFBQVE7QUFDbkIsV0FBVyxRQUFRO0FBQ25CLFdBQVcsVUFBVTtBQUNyQjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQjtBQUN0QjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSIsInNvdXJjZXMiOlsiL2hvbWUvYWxtYS9uZXh0Z2VuL05lYWgtbWFpbC9ub2RlX21vZHVsZXMvaW1hcGZsb3cvbm9kZV9tb2R1bGVzL25vZGVtYWlsZXIvbGliL3NtdHAtY29ubmVjdGlvbi9odHRwLXByb3h5LWNsaWVudC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbi8qKlxuICogTWluaW1hbCBIVFRQL1MgcHJveHkgY2xpZW50XG4gKi9cblxuY29uc3QgbmV0ID0gcmVxdWlyZSgnbmV0Jyk7XG5jb25zdCB0bHMgPSByZXF1aXJlKCd0bHMnKTtcbmNvbnN0IHVybGxpYiA9IHJlcXVpcmUoJ3VybCcpO1xuXG4vKipcbiAqIEVzdGFibGlzaGVzIHByb3hpZWQgY29ubmVjdGlvbiB0byBkZXN0aW5hdGlvblBvcnRcbiAqXG4gKiBodHRwUHJveHlDbGllbnQoXCJodHRwOi8vbG9jYWxob3N0OjMxMjgvXCIsIDgwLCBcImdvb2dsZS5jb21cIiwgZnVuY3Rpb24oZXJyLCBzb2NrZXQpe1xuICogICAgIHNvY2tldC53cml0ZShcIkdFVCAvIEhUVFAvMS4wXFxyXFxuXFxyXFxuXCIpO1xuICogfSk7XG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHByb3h5VXJsIHByb3h5IGNvbmZpZ3VyYXRpb24sIGV0ZyBcImh0dHA6Ly9wcm94eS5ob3N0OjMxMjgvXCJcbiAqIEBwYXJhbSB7TnVtYmVyfSBkZXN0aW5hdGlvblBvcnQgUG9ydCB0byBvcGVuIGluIGRlc3RpbmF0aW9uIGhvc3RcbiAqIEBwYXJhbSB7U3RyaW5nfSBkZXN0aW5hdGlvbkhvc3QgRGVzdGluYXRpb24gaG9zdG5hbWVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIENhbGxiYWNrIHRvIHJ1biB3aXRoIHRoZSByb2NrZXQgb2JqZWN0IG9uY2UgY29ubmVjdGlvbiBpcyBlc3RhYmxpc2hlZFxuICovXG5mdW5jdGlvbiBodHRwUHJveHlDbGllbnQocHJveHlVcmwsIGRlc3RpbmF0aW9uUG9ydCwgZGVzdGluYXRpb25Ib3N0LCBjYWxsYmFjaykge1xuICAgIGxldCBwcm94eSA9IHVybGxpYi5wYXJzZShwcm94eVVybCk7XG5cbiAgICAvLyBjcmVhdGUgYSBzb2NrZXQgY29ubmVjdGlvbiB0byB0aGUgcHJveHkgc2VydmVyXG4gICAgbGV0IG9wdGlvbnM7XG4gICAgbGV0IGNvbm5lY3Q7XG4gICAgbGV0IHNvY2tldDtcblxuICAgIG9wdGlvbnMgPSB7XG4gICAgICAgIGhvc3Q6IHByb3h5Lmhvc3RuYW1lLFxuICAgICAgICBwb3J0OiBOdW1iZXIocHJveHkucG9ydCkgPyBOdW1iZXIocHJveHkucG9ydCkgOiBwcm94eS5wcm90b2NvbCA9PT0gJ2h0dHBzOicgPyA0NDMgOiA4MFxuICAgIH07XG5cbiAgICBpZiAocHJveHkucHJvdG9jb2wgPT09ICdodHRwczonKSB7XG4gICAgICAgIC8vIHdlIGNhbiB1c2UgdW50cnVzdGVkIHByb3hpZXMgYXMgbG9uZyBhcyB3ZSB2ZXJpZnkgYWN0dWFsIFNNVFAgY2VydGlmaWNhdGVzXG4gICAgICAgIG9wdGlvbnMucmVqZWN0VW5hdXRob3JpemVkID0gZmFsc2U7XG4gICAgICAgIGNvbm5lY3QgPSB0bHMuY29ubmVjdC5iaW5kKHRscyk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgY29ubmVjdCA9IG5ldC5jb25uZWN0LmJpbmQobmV0KTtcbiAgICB9XG5cbiAgICAvLyBFcnJvciBoYXJuZXNzIGZvciBpbml0aWFsIGNvbm5lY3Rpb24uIE9uY2UgY29ubmVjdGlvbiBpcyBlc3RhYmxpc2hlZCwgdGhlIHJlc3BvbnNpYmlsaXR5XG4gICAgLy8gdG8gaGFuZGxlIGVycm9ycyBpcyBwYXNzZWQgdG8gd2hvZXZlciB1c2VzIHRoaXMgc29ja2V0XG4gICAgbGV0IGZpbmlzaGVkID0gZmFsc2U7XG4gICAgbGV0IHRlbXBTb2NrZXRFcnIgPSBlcnIgPT4ge1xuICAgICAgICBpZiAoZmluaXNoZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBmaW5pc2hlZCA9IHRydWU7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBzb2NrZXQuZGVzdHJveSgpO1xuICAgICAgICB9IGNhdGNoIChFKSB7XG4gICAgICAgICAgICAvLyBpZ25vcmVcbiAgICAgICAgfVxuICAgICAgICBjYWxsYmFjayhlcnIpO1xuICAgIH07XG5cbiAgICBsZXQgdGltZW91dEVyciA9ICgpID0+IHtcbiAgICAgICAgbGV0IGVyciA9IG5ldyBFcnJvcignUHJveHkgc29ja2V0IHRpbWVkIG91dCcpO1xuICAgICAgICBlcnIuY29kZSA9ICdFVElNRURPVVQnO1xuICAgICAgICB0ZW1wU29ja2V0RXJyKGVycik7XG4gICAgfTtcblxuICAgIHNvY2tldCA9IGNvbm5lY3Qob3B0aW9ucywgKCkgPT4ge1xuICAgICAgICBpZiAoZmluaXNoZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCByZXFIZWFkZXJzID0ge1xuICAgICAgICAgICAgSG9zdDogZGVzdGluYXRpb25Ib3N0ICsgJzonICsgZGVzdGluYXRpb25Qb3J0LFxuICAgICAgICAgICAgQ29ubmVjdGlvbjogJ2Nsb3NlJ1xuICAgICAgICB9O1xuICAgICAgICBpZiAocHJveHkuYXV0aCkge1xuICAgICAgICAgICAgcmVxSGVhZGVyc1snUHJveHktQXV0aG9yaXphdGlvbiddID0gJ0Jhc2ljICcgKyBCdWZmZXIuZnJvbShwcm94eS5hdXRoKS50b1N0cmluZygnYmFzZTY0Jyk7XG4gICAgICAgIH1cblxuICAgICAgICBzb2NrZXQud3JpdGUoXG4gICAgICAgICAgICAvLyBIVFRQIG1ldGhvZFxuICAgICAgICAgICAgJ0NPTk5FQ1QgJyArXG4gICAgICAgICAgICAgICAgZGVzdGluYXRpb25Ib3N0ICtcbiAgICAgICAgICAgICAgICAnOicgK1xuICAgICAgICAgICAgICAgIGRlc3RpbmF0aW9uUG9ydCArXG4gICAgICAgICAgICAgICAgJyBIVFRQLzEuMVxcclxcbicgK1xuICAgICAgICAgICAgICAgIC8vIEhUVFAgcmVxdWVzdCBoZWFkZXJzXG4gICAgICAgICAgICAgICAgT2JqZWN0LmtleXMocmVxSGVhZGVycylcbiAgICAgICAgICAgICAgICAgICAgLm1hcChrZXkgPT4ga2V5ICsgJzogJyArIHJlcUhlYWRlcnNba2V5XSlcbiAgICAgICAgICAgICAgICAgICAgLmpvaW4oJ1xcclxcbicpICtcbiAgICAgICAgICAgICAgICAvLyBFbmQgcmVxdWVzdFxuICAgICAgICAgICAgICAgICdcXHJcXG5cXHJcXG4nXG4gICAgICAgICk7XG5cbiAgICAgICAgbGV0IGhlYWRlcnMgPSAnJztcbiAgICAgICAgbGV0IG9uU29ja2V0RGF0YSA9IGNodW5rID0+IHtcbiAgICAgICAgICAgIGxldCBtYXRjaDtcbiAgICAgICAgICAgIGxldCByZW1haW5kZXI7XG5cbiAgICAgICAgICAgIGlmIChmaW5pc2hlZCkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaGVhZGVycyArPSBjaHVuay50b1N0cmluZygnYmluYXJ5Jyk7XG4gICAgICAgICAgICBpZiAoKG1hdGNoID0gaGVhZGVycy5tYXRjaCgvXFxyXFxuXFxyXFxuLykpKSB7XG4gICAgICAgICAgICAgICAgc29ja2V0LnJlbW92ZUxpc3RlbmVyKCdkYXRhJywgb25Tb2NrZXREYXRhKTtcblxuICAgICAgICAgICAgICAgIHJlbWFpbmRlciA9IGhlYWRlcnMuc3Vic3RyKG1hdGNoLmluZGV4ICsgbWF0Y2hbMF0ubGVuZ3RoKTtcbiAgICAgICAgICAgICAgICBoZWFkZXJzID0gaGVhZGVycy5zdWJzdHIoMCwgbWF0Y2guaW5kZXgpO1xuICAgICAgICAgICAgICAgIGlmIChyZW1haW5kZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgc29ja2V0LnVuc2hpZnQoQnVmZmVyLmZyb20ocmVtYWluZGVyLCAnYmluYXJ5JykpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIHByb3h5IGNvbm5lY3Rpb24gaXMgbm93IGVzdGFibGlzaGVkXG4gICAgICAgICAgICAgICAgZmluaXNoZWQgPSB0cnVlO1xuXG4gICAgICAgICAgICAgICAgLy8gY2hlY2sgcmVzcG9uc2UgY29kZVxuICAgICAgICAgICAgICAgIG1hdGNoID0gaGVhZGVycy5tYXRjaCgvXkhUVFBcXC9cXGQrXFwuXFxkKyAoXFxkKykvaSk7XG4gICAgICAgICAgICAgICAgaWYgKCFtYXRjaCB8fCAobWF0Y2hbMV0gfHwgJycpLmNoYXJBdCgwKSAhPT0gJzInKSB7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzb2NrZXQuZGVzdHJveSgpO1xuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChFKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmVcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2FsbGJhY2sobmV3IEVycm9yKCdJbnZhbGlkIHJlc3BvbnNlIGZyb20gcHJveHknICsgKChtYXRjaCAmJiAnOiAnICsgbWF0Y2hbMV0pIHx8ICcnKSkpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHNvY2tldC5yZW1vdmVMaXN0ZW5lcignZXJyb3InLCB0ZW1wU29ja2V0RXJyKTtcbiAgICAgICAgICAgICAgICBzb2NrZXQucmVtb3ZlTGlzdGVuZXIoJ3RpbWVvdXQnLCB0aW1lb3V0RXJyKTtcbiAgICAgICAgICAgICAgICBzb2NrZXQuc2V0VGltZW91dCgwKTtcblxuICAgICAgICAgICAgICAgIHJldHVybiBjYWxsYmFjayhudWxsLCBzb2NrZXQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBzb2NrZXQub24oJ2RhdGEnLCBvblNvY2tldERhdGEpO1xuICAgIH0pO1xuXG4gICAgc29ja2V0LnNldFRpbWVvdXQoaHR0cFByb3h5Q2xpZW50LnRpbWVvdXQgfHwgMzAgKiAxMDAwKTtcbiAgICBzb2NrZXQub24oJ3RpbWVvdXQnLCB0aW1lb3V0RXJyKTtcblxuICAgIHNvY2tldC5vbmNlKCdlcnJvcicsIHRlbXBTb2NrZXRFcnIpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGh0dHBQcm94eUNsaWVudDtcbiJdLCJuYW1lcyI6W10sImlnbm9yZUxpc3QiOlswXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(action-browser)/./node_modules/imapflow/node_modules/nodemailer/lib/smtp-connection/http-proxy-client.js\n");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "(action-browser)/./node_modules/imapflow/package.json":
|
|
/*!********************************************!*\
|
|
!*** ./node_modules/imapflow/package.json ***!
|
|
\********************************************/
|
|
/***/ ((module) => {
|
|
|
|
module.exports = /*#__PURE__*/JSON.parse('{"name":"imapflow","version":"1.0.184","description":"IMAP Client for Node","main":"./lib/imap-flow.js","scripts":{"test":"grunt","prepare":"npm run build","docs":"rm -rf docs && mkdir -p docs && jsdoc lib/imap-flow.js -c jsdoc.json -R README.md --destination docs/ && cp assets/favicon.ico docs","dst":"node types.js","build":"npm run docs && npm run dst","st":"npm run docs && st -d docs -i index.html","update":"rm -rf node_modules package-lock.json && ncu -u && npm install"},"repository":{"type":"git","url":"git+https://github.com/postalsys/imapflow.git"},"keywords":["imap","email","mail"],"author":"Postal Systems OÜ","license":"MIT","bugs":{"url":"https://github.com/postalsys/imapflow/issues"},"homepage":"https://imapflow.com/","devDependencies":{"@babel/eslint-parser":"7.26.8","@babel/eslint-plugin":"7.25.9","@babel/plugin-syntax-class-properties":"7.12.13","@babel/preset-env":"7.26.9","@types/node":"22.13.10","eslint":"8.57.0","eslint-config-nodemailer":"1.2.0","eslint-config-prettier":"9.1.0","grunt":"1.6.1","grunt-cli":"1.5.0","grunt-contrib-nodeunit":"5.0.0","grunt-eslint":"24.3.0","imapflow-jsdoc-template":"3.4.0-imapflow.2","jsdoc":"3.6.11","st":"3.0.1","tsd-jsdoc":"2.5.0"},"dependencies":{"encoding-japanese":"2.2.0","iconv-lite":"0.6.3","libbase64":"1.3.0","libmime":"5.3.6","libqp":"2.1.1","mailsplit":"5.4.3","nodemailer":"6.10.0","pino":"9.6.0","socks":"2.8.4"}}');
|
|
|
|
/***/ }),
|
|
|
|
/***/ "(rsc)/./node_modules/imapflow/lib/charsets.js":
|
|
/*!***********************************************!*\
|
|
!*** ./node_modules/imapflow/lib/charsets.js ***!
|
|
\***********************************************/
|
|
/***/ ((module) => {
|
|
|
|
eval("\n\nconst CHARACTER_SETS = [\n 'US-ASCII',\n 'ISO-8859-1',\n 'ISO-8859-2',\n 'ISO-8859-3',\n 'ISO-8859-4',\n 'ISO-8859-5',\n 'ISO-8859-6',\n 'ISO-8859-7',\n 'ISO-8859-8',\n 'ISO-8859-9',\n 'ISO-8859-10',\n 'ISO_6937-2-add',\n 'JIS_X0201',\n 'JIS_Encoding',\n 'Shift_JIS',\n 'EUC-JP',\n 'Extended_UNIX_Code_Fixed_Width_for_Japanese',\n 'BS_4730',\n 'SEN_850200_C',\n 'IT',\n 'ES',\n 'DIN_66003',\n 'NS_4551-1',\n 'NF_Z_62-010',\n 'ISO-10646-UTF-1',\n 'ISO_646.basic:1983',\n 'INVARIANT',\n 'ISO_646.irv:1983',\n 'NATS-SEFI',\n 'NATS-SEFI-ADD',\n 'NATS-DANO',\n 'NATS-DANO-ADD',\n 'SEN_850200_B',\n 'KS_C_5601-1987',\n 'ISO-2022-KR',\n 'EUC-KR',\n 'ISO-2022-JP',\n 'ISO-2022-JP-2',\n 'JIS_C6220-1969-jp',\n 'JIS_C6220-1969-ro',\n 'PT',\n 'greek7-old',\n 'latin-greek',\n 'NF_Z_62-010_(1973)',\n 'Latin-greek-1',\n 'ISO_5427',\n 'JIS_C6226-1978',\n 'BS_viewdata',\n 'INIS',\n 'INIS-8',\n 'INIS-cyrillic',\n 'ISO_5427:1981',\n 'ISO_5428:1980',\n 'GB_1988-80',\n 'GB_2312-80',\n 'NS_4551-2',\n 'videotex-suppl',\n 'PT2',\n 'ES2',\n 'MSZ_7795.3',\n 'JIS_C6226-1983',\n 'greek7',\n 'ASMO_449',\n 'iso-ir-90',\n 'JIS_C6229-1984-a',\n 'JIS_C6229-1984-b',\n 'JIS_C6229-1984-b-add',\n 'JIS_C6229-1984-hand',\n 'JIS_C6229-1984-hand-add',\n 'JIS_C6229-1984-kana',\n 'ISO_2033-1983',\n 'ANSI_X3.110-1983',\n 'T.61-7bit',\n 'T.61-8bit',\n 'ECMA-cyrillic',\n 'CSA_Z243.4-1985-1',\n 'CSA_Z243.4-1985-2',\n 'CSA_Z243.4-1985-gr',\n 'ISO-8859-6-E',\n 'ISO-8859-6-I',\n 'T.101-G2',\n 'ISO-8859-8-E',\n 'ISO-8859-8-I',\n 'CSN_369103',\n 'JUS_I.B1.002',\n 'IEC_P27-1',\n 'JUS_I.B1.003-serb',\n 'JUS_I.B1.003-mac',\n 'greek-ccitt',\n 'NC_NC00-10:81',\n 'ISO_6937-2-25',\n 'GOST_19768-74',\n 'ISO_8859-supp',\n 'ISO_10367-box',\n 'latin-lap',\n 'JIS_X0212-1990',\n 'DS_2089',\n 'us-dk',\n 'dk-us',\n 'KSC5636',\n 'UNICODE-1-1-UTF-7',\n 'ISO-2022-CN',\n 'ISO-2022-CN-EXT',\n 'UTF-8',\n 'ISO-8859-13',\n 'ISO-8859-14',\n 'ISO-8859-15',\n 'ISO-8859-16',\n 'GBK',\n 'GB18030',\n 'OSD_EBCDIC_DF04_15',\n 'OSD_EBCDIC_DF03_IRV',\n 'OSD_EBCDIC_DF04_1',\n 'ISO-11548-1',\n 'KZ-1048',\n 'ISO-10646-UCS-2',\n 'ISO-10646-UCS-4',\n 'ISO-10646-UCS-Basic',\n 'ISO-10646-Unicode-Latin1',\n 'ISO-10646-J-1',\n 'ISO-Unicode-IBM-1261',\n 'ISO-Unicode-IBM-1268',\n 'ISO-Unicode-IBM-1276',\n 'ISO-Unicode-IBM-1264',\n 'ISO-Unicode-IBM-1265',\n 'UNICODE-1-1',\n 'SCSU',\n 'UTF-7',\n 'UTF-16BE',\n 'UTF-16LE',\n 'UTF-16',\n 'CESU-8',\n 'UTF-32',\n 'UTF-32BE',\n 'UTF-32LE',\n 'BOCU-1',\n 'ISO-8859-1-Windows-3.0-Latin-1',\n 'ISO-8859-1-Windows-3.1-Latin-1',\n 'ISO-8859-2-Windows-Latin-2',\n 'ISO-8859-9-Windows-Latin-5',\n 'hp-roman8',\n 'Adobe-Standard-Encoding',\n 'Ventura-US',\n 'Ventura-International',\n 'DEC-MCS',\n 'IBM850',\n 'PC8-Danish-Norwegian',\n 'IBM862',\n 'PC8-Turkish',\n 'IBM-Symbols',\n 'IBM-Thai',\n 'HP-Legal',\n 'HP-Pi-font',\n 'HP-Math8',\n 'Adobe-Symbol-Encoding',\n 'HP-DeskTop',\n 'Ventura-Math',\n 'Microsoft-Publishing',\n 'Windows-31J',\n 'GB2312',\n 'Big5',\n 'macintosh',\n 'IBM037',\n 'IBM038',\n 'IBM273',\n 'IBM274',\n 'IBM275',\n 'IBM277',\n 'IBM278',\n 'IBM280',\n 'IBM281',\n 'IBM284',\n 'IBM285',\n 'IBM290',\n 'IBM297',\n 'IBM420',\n 'IBM423',\n 'IBM424',\n 'IBM437',\n 'IBM500',\n 'IBM851',\n 'IBM852',\n 'IBM855',\n 'IBM857',\n 'IBM860',\n 'IBM861',\n 'IBM863',\n 'IBM864',\n 'IBM865',\n 'IBM868',\n 'IBM869',\n 'IBM870',\n 'IBM871',\n 'IBM880',\n 'IBM891',\n 'IBM903',\n 'IBM904',\n 'IBM905',\n 'IBM918',\n 'IBM1026',\n 'EBCDIC-AT-DE',\n 'EBCDIC-AT-DE-A',\n 'EBCDIC-CA-FR',\n 'EBCDIC-DK-NO',\n 'EBCDIC-DK-NO-A',\n 'EBCDIC-FI-SE',\n 'EBCDIC-FI-SE-A',\n 'EBCDIC-FR',\n 'EBCDIC-IT',\n 'EBCDIC-PT',\n 'EBCDIC-ES',\n 'EBCDIC-ES-A',\n 'EBCDIC-ES-S',\n 'EBCDIC-UK',\n 'EBCDIC-US',\n 'UNKNOWN-8BIT',\n 'MNEMONIC',\n 'MNEM',\n 'VISCII',\n 'VIQR',\n 'KOI8-R',\n 'HZ-GB-2312',\n 'IBM866',\n 'IBM775',\n 'KOI8-U',\n 'IBM00858',\n 'IBM00924',\n 'IBM01140',\n 'IBM01141',\n 'IBM01142',\n 'IBM01143',\n 'IBM01144',\n 'IBM01145',\n 'IBM01146',\n 'IBM01147',\n 'IBM01148',\n 'IBM01149',\n 'Big5-HKSCS',\n 'IBM1047',\n 'PTCP154',\n 'Amiga-1251',\n 'KOI7-switched',\n 'BRF',\n 'TSCII',\n 'CP51932',\n 'windows-874',\n 'windows-1250',\n 'windows-1251',\n 'windows-1252',\n 'windows-1253',\n 'windows-1254',\n 'windows-1255',\n 'windows-1256',\n 'windows-1257',\n 'windows-1258',\n 'TIS-620',\n 'CP50220'\n];\n\nconst CHARSET_MAP = new Map();\n\nCHARACTER_SETS.forEach(entry => {\n let key = entry.replace(/[_-\\s]/g, '').toLowerCase();\n let modifiedKey = key\n .replace(/^windows/, 'win')\n .replace(/^usascii/, 'ascii')\n .replace(/^iso8859/, 'latin');\n CHARSET_MAP.set(key, entry);\n if (!CHARSET_MAP.has(modifiedKey)) {\n CHARSET_MAP.set(modifiedKey, entry);\n }\n});\n\nmodule.exports.resolveCharset = charset => {\n let key = charset.replace(/[_-\\s]/g, '').toLowerCase();\n if (CHARSET_MAP.has(key)) {\n return CHARSET_MAP.get(key);\n }\n return null;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHJzYykvLi9ub2RlX21vZHVsZXMvaW1hcGZsb3cvbGliL2NoYXJzZXRzLmpzIiwibWFwcGluZ3MiOiJBQUFhOztBQUViO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRCw2QkFBNkI7QUFDN0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyIvaG9tZS9hbG1hL25leHRnZW4vTmVhaC1tYWlsL25vZGVfbW9kdWxlcy9pbWFwZmxvdy9saWIvY2hhcnNldHMuanMiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCBDSEFSQUNURVJfU0VUUyA9IFtcbiAgICAnVVMtQVNDSUknLFxuICAgICdJU08tODg1OS0xJyxcbiAgICAnSVNPLTg4NTktMicsXG4gICAgJ0lTTy04ODU5LTMnLFxuICAgICdJU08tODg1OS00JyxcbiAgICAnSVNPLTg4NTktNScsXG4gICAgJ0lTTy04ODU5LTYnLFxuICAgICdJU08tODg1OS03JyxcbiAgICAnSVNPLTg4NTktOCcsXG4gICAgJ0lTTy04ODU5LTknLFxuICAgICdJU08tODg1OS0xMCcsXG4gICAgJ0lTT182OTM3LTItYWRkJyxcbiAgICAnSklTX1gwMjAxJyxcbiAgICAnSklTX0VuY29kaW5nJyxcbiAgICAnU2hpZnRfSklTJyxcbiAgICAnRVVDLUpQJyxcbiAgICAnRXh0ZW5kZWRfVU5JWF9Db2RlX0ZpeGVkX1dpZHRoX2Zvcl9KYXBhbmVzZScsXG4gICAgJ0JTXzQ3MzAnLFxuICAgICdTRU5fODUwMjAwX0MnLFxuICAgICdJVCcsXG4gICAgJ0VTJyxcbiAgICAnRElOXzY2MDAzJyxcbiAgICAnTlNfNDU1MS0xJyxcbiAgICAnTkZfWl82Mi0wMTAnLFxuICAgICdJU08tMTA2NDYtVVRGLTEnLFxuICAgICdJU09fNjQ2LmJhc2ljOjE5ODMnLFxuICAgICdJTlZBUklBTlQnLFxuICAgICdJU09fNjQ2LmlydjoxOTgzJyxcbiAgICAnTkFUUy1TRUZJJyxcbiAgICAnTkFUUy1TRUZJLUFERCcsXG4gICAgJ05BVFMtREFOTycsXG4gICAgJ05BVFMtREFOTy1BREQnLFxuICAgICdTRU5fODUwMjAwX0InLFxuICAgICdLU19DXzU2MDEtMTk4NycsXG4gICAgJ0lTTy0yMDIyLUtSJyxcbiAgICAnRVVDLUtSJyxcbiAgICAnSVNPLTIwMjItSlAnLFxuICAgICdJU08tMjAyMi1KUC0yJyxcbiAgICAnSklTX0M2MjIwLTE5NjktanAnLFxuICAgICdKSVNfQzYyMjAtMTk2OS1ybycsXG4gICAgJ1BUJyxcbiAgICAnZ3JlZWs3LW9sZCcsXG4gICAgJ2xhdGluLWdyZWVrJyxcbiAgICAnTkZfWl82Mi0wMTBfKDE5NzMpJyxcbiAgICAnTGF0aW4tZ3JlZWstMScsXG4gICAgJ0lTT181NDI3JyxcbiAgICAnSklTX0M2MjI2LTE5NzgnLFxuICAgICdCU192aWV3ZGF0YScsXG4gICAgJ0lOSVMnLFxuICAgICdJTklTLTgnLFxuICAgICdJTklTLWN5cmlsbGljJyxcbiAgICAnSVNPXzU0Mjc6MTk4MScsXG4gICAgJ0lTT181NDI4OjE5ODAnLFxuICAgICdHQl8xOTg4LTgwJyxcbiAgICAnR0JfMjMxMi04MCcsXG4gICAgJ05TXzQ1NTEtMicsXG4gICAgJ3ZpZGVvdGV4LXN1cHBsJyxcbiAgICAnUFQyJyxcbiAgICAnRVMyJyxcbiAgICAnTVNaXzc3OTUuMycsXG4gICAgJ0pJU19DNjIyNi0xOTgzJyxcbiAgICAnZ3JlZWs3JyxcbiAgICAnQVNNT180NDknLFxuICAgICdpc28taXItOTAnLFxuICAgICdKSVNfQzYyMjktMTk4NC1hJyxcbiAgICAnSklTX0M2MjI5LTE5ODQtYicsXG4gICAgJ0pJU19DNjIyOS0xOTg0LWItYWRkJyxcbiAgICAnSklTX0M2MjI5LTE5ODQtaGFuZCcsXG4gICAgJ0pJU19DNjIyOS0xOTg0LWhhbmQtYWRkJyxcbiAgICAnSklTX0M2MjI5LTE5ODQta2FuYScsXG4gICAgJ0lTT18yMDMzLTE5ODMnLFxuICAgICdBTlNJX1gzLjExMC0xOTgzJyxcbiAgICAnVC42MS03Yml0JyxcbiAgICAnVC42MS04Yml0JyxcbiAgICAnRUNNQS1jeXJpbGxpYycsXG4gICAgJ0NTQV9aMjQzLjQtMTk4NS0xJyxcbiAgICAnQ1NBX1oyNDMuNC0xOTg1LTInLFxuICAgICdDU0FfWjI0My40LTE5ODUtZ3InLFxuICAgICdJU08tODg1OS02LUUnLFxuICAgICdJU08tODg1OS02LUknLFxuICAgICdULjEwMS1HMicsXG4gICAgJ0lTTy04ODU5LTgtRScsXG4gICAgJ0lTTy04ODU5LTgtSScsXG4gICAgJ0NTTl8zNjkxMDMnLFxuICAgICdKVVNfSS5CMS4wMDInLFxuICAgICdJRUNfUDI3LTEnLFxuICAgICdKVVNfSS5CMS4wMDMtc2VyYicsXG4gICAgJ0pVU19JLkIxLjAwMy1tYWMnLFxuICAgICdncmVlay1jY2l0dCcsXG4gICAgJ05DX05DMDAtMTA6ODEnLFxuICAgICdJU09fNjkzNy0yLTI1JyxcbiAgICAnR09TVF8xOTc2OC03NCcsXG4gICAgJ0lTT184ODU5LXN1cHAnLFxuICAgICdJU09fMTAzNjctYm94JyxcbiAgICAnbGF0aW4tbGFwJyxcbiAgICAnSklTX1gwMjEyLTE5OTAnLFxuICAgICdEU18yMDg5JyxcbiAgICAndXMtZGsnLFxuICAgICdkay11cycsXG4gICAgJ0tTQzU2MzYnLFxuICAgICdVTklDT0RFLTEtMS1VVEYtNycsXG4gICAgJ0lTTy0yMDIyLUNOJyxcbiAgICAnSVNPLTIwMjItQ04tRVhUJyxcbiAgICAnVVRGLTgnLFxuICAgICdJU08tODg1OS0xMycsXG4gICAgJ0lTTy04ODU5LTE0JyxcbiAgICAnSVNPLTg4NTktMTUnLFxuICAgICdJU08tODg1OS0xNicsXG4gICAgJ0dCSycsXG4gICAgJ0dCMTgwMzAnLFxuICAgICdPU0RfRUJDRElDX0RGMDRfMTUnLFxuICAgICdPU0RfRUJDRElDX0RGMDNfSVJWJyxcbiAgICAnT1NEX0VCQ0RJQ19ERjA0XzEnLFxuICAgICdJU08tMTE1NDgtMScsXG4gICAgJ0taLTEwNDgnLFxuICAgICdJU08tMTA2NDYtVUNTLTInLFxuICAgICdJU08tMTA2NDYtVUNTLTQnLFxuICAgICdJU08tMTA2NDYtVUNTLUJhc2ljJyxcbiAgICAnSVNPLTEwNjQ2LVVuaWNvZGUtTGF0aW4xJyxcbiAgICAnSVNPLTEwNjQ2LUotMScsXG4gICAgJ0lTTy1Vbmljb2RlLUlCTS0xMjYxJyxcbiAgICAnSVNPLVVuaWNvZGUtSUJNLTEyNjgnLFxuICAgICdJU08tVW5pY29kZS1JQk0tMTI3NicsXG4gICAgJ0lTTy1Vbmljb2RlLUlCTS0xMjY0JyxcbiAgICAnSVNPLVVuaWNvZGUtSUJNLTEyNjUnLFxuICAgICdVTklDT0RFLTEtMScsXG4gICAgJ1NDU1UnLFxuICAgICdVVEYtNycsXG4gICAgJ1VURi0xNkJFJyxcbiAgICAnVVRGLTE2TEUnLFxuICAgICdVVEYtMTYnLFxuICAgICdDRVNVLTgnLFxuICAgICdVVEYtMzInLFxuICAgICdVVEYtMzJCRScsXG4gICAgJ1VURi0zMkxFJyxcbiAgICAnQk9DVS0xJyxcbiAgICAnSVNPLTg4NTktMS1XaW5kb3dzLTMuMC1MYXRpbi0xJyxcbiAgICAnSVNPLTg4NTktMS1XaW5kb3dzLTMuMS1MYXRpbi0xJyxcbiAgICAnSVNPLTg4NTktMi1XaW5kb3dzLUxhdGluLTInLFxuICAgICdJU08tODg1OS05LVdpbmRvd3MtTGF0aW4tNScsXG4gICAgJ2hwLXJvbWFuOCcsXG4gICAgJ0Fkb2JlLVN0YW5kYXJkLUVuY29kaW5nJyxcbiAgICAnVmVudHVyYS1VUycsXG4gICAgJ1ZlbnR1cmEtSW50ZXJuYXRpb25hbCcsXG4gICAgJ0RFQy1NQ1MnLFxuICAgICdJQk04NTAnLFxuICAgICdQQzgtRGFuaXNoLU5vcndlZ2lhbicsXG4gICAgJ0lCTTg2MicsXG4gICAgJ1BDOC1UdXJraXNoJyxcbiAgICAnSUJNLVN5bWJvbHMnLFxuICAgICdJQk0tVGhhaScsXG4gICAgJ0hQLUxlZ2FsJyxcbiAgICAnSFAtUGktZm9udCcsXG4gICAgJ0hQLU1hdGg4JyxcbiAgICAnQWRvYmUtU3ltYm9sLUVuY29kaW5nJyxcbiAgICAnSFAtRGVza1RvcCcsXG4gICAgJ1ZlbnR1cmEtTWF0aCcsXG4gICAgJ01pY3Jvc29mdC1QdWJsaXNoaW5nJyxcbiAgICAnV2luZG93cy0zMUonLFxuICAgICdHQjIzMTInLFxuICAgICdCaWc1JyxcbiAgICAnbWFjaW50b3NoJyxcbiAgICAnSUJNMDM3JyxcbiAgICAnSUJNMDM4JyxcbiAgICAnSUJNMjczJyxcbiAgICAnSUJNMjc0JyxcbiAgICAnSUJNMjc1JyxcbiAgICAnSUJNMjc3JyxcbiAgICAnSUJNMjc4JyxcbiAgICAnSUJNMjgwJyxcbiAgICAnSUJNMjgxJyxcbiAgICAnSUJNMjg0JyxcbiAgICAnSUJNMjg1JyxcbiAgICAnSUJNMjkwJyxcbiAgICAnSUJNMjk3JyxcbiAgICAnSUJNNDIwJyxcbiAgICAnSUJNNDIzJyxcbiAgICAnSUJNNDI0JyxcbiAgICAnSUJNNDM3JyxcbiAgICAnSUJNNTAwJyxcbiAgICAnSUJNODUxJyxcbiAgICAnSUJNODUyJyxcbiAgICAnSUJNODU1JyxcbiAgICAnSUJNODU3JyxcbiAgICAnSUJNODYwJyxcbiAgICAnSUJNODYxJyxcbiAgICAnSUJNODYzJyxcbiAgICAnSUJNODY0JyxcbiAgICAnSUJNODY1JyxcbiAgICAnSUJNODY4JyxcbiAgICAnSUJNODY5JyxcbiAgICAnSUJNODcwJyxcbiAgICAnSUJNODcxJyxcbiAgICAnSUJNODgwJyxcbiAgICAnSUJNODkxJyxcbiAgICAnSUJNOTAzJyxcbiAgICAnSUJNOTA0JyxcbiAgICAnSUJNOTA1JyxcbiAgICAnSUJNOTE4JyxcbiAgICAnSUJNMTAyNicsXG4gICAgJ0VCQ0RJQy1BVC1ERScsXG4gICAgJ0VCQ0RJQy1BVC1ERS1BJyxcbiAgICAnRUJDRElDLUNBLUZSJyxcbiAgICAnRUJDRElDLURLLU5PJyxcbiAgICAnRUJDRElDLURLLU5PLUEnLFxuICAgICdFQkNESUMtRkktU0UnLFxuICAgICdFQkNESUMtRkktU0UtQScsXG4gICAgJ0VCQ0RJQy1GUicsXG4gICAgJ0VCQ0RJQy1JVCcsXG4gICAgJ0VCQ0RJQy1QVCcsXG4gICAgJ0VCQ0RJQy1FUycsXG4gICAgJ0VCQ0RJQy1FUy1BJyxcbiAgICAnRUJDRElDLUVTLVMnLFxuICAgICdFQkNESUMtVUsnLFxuICAgICdFQkNESUMtVVMnLFxuICAgICdVTktOT1dOLThCSVQnLFxuICAgICdNTkVNT05JQycsXG4gICAgJ01ORU0nLFxuICAgICdWSVNDSUknLFxuICAgICdWSVFSJyxcbiAgICAnS09JOC1SJyxcbiAgICAnSFotR0ItMjMxMicsXG4gICAgJ0lCTTg2NicsXG4gICAgJ0lCTTc3NScsXG4gICAgJ0tPSTgtVScsXG4gICAgJ0lCTTAwODU4JyxcbiAgICAnSUJNMDA5MjQnLFxuICAgICdJQk0wMTE0MCcsXG4gICAgJ0lCTTAxMTQxJyxcbiAgICAnSUJNMDExNDInLFxuICAgICdJQk0wMTE0MycsXG4gICAgJ0lCTTAxMTQ0JyxcbiAgICAnSUJNMDExNDUnLFxuICAgICdJQk0wMTE0NicsXG4gICAgJ0lCTTAxMTQ3JyxcbiAgICAnSUJNMDExNDgnLFxuICAgICdJQk0wMTE0OScsXG4gICAgJ0JpZzUtSEtTQ1MnLFxuICAgICdJQk0xMDQ3JyxcbiAgICAnUFRDUDE1NCcsXG4gICAgJ0FtaWdhLTEyNTEnLFxuICAgICdLT0k3LXN3aXRjaGVkJyxcbiAgICAnQlJGJyxcbiAgICAnVFNDSUknLFxuICAgICdDUDUxOTMyJyxcbiAgICAnd2luZG93cy04NzQnLFxuICAgICd3aW5kb3dzLTEyNTAnLFxuICAgICd3aW5kb3dzLTEyNTEnLFxuICAgICd3aW5kb3dzLTEyNTInLFxuICAgICd3aW5kb3dzLTEyNTMnLFxuICAgICd3aW5kb3dzLTEyNTQnLFxuICAgICd3aW5kb3dzLTEyNTUnLFxuICAgICd3aW5kb3dzLTEyNTYnLFxuICAgICd3aW5kb3dzLTEyNTcnLFxuICAgICd3aW5kb3dzLTEyNTgnLFxuICAgICdUSVMtNjIwJyxcbiAgICAnQ1A1MDIyMCdcbl07XG5cbmNvbnN0IENIQVJTRVRfTUFQID0gbmV3IE1hcCgpO1xuXG5DSEFSQUNURVJfU0VUUy5mb3JFYWNoKGVudHJ5ID0+IHtcbiAgICBsZXQga2V5ID0gZW50cnkucmVwbGFjZSgvW18tXFxzXS9nLCAnJykudG9Mb3dlckNhc2UoKTtcbiAgICBsZXQgbW9kaWZpZWRLZXkgPSBrZXlcbiAgICAgICAgLnJlcGxhY2UoL153aW5kb3dzLywgJ3dpbicpXG4gICAgICAgIC5yZXBsYWNlKC9edXNhc2NpaS8sICdhc2NpaScpXG4gICAgICAgIC5yZXBsYWNlKC9eaXNvODg1OS8sICdsYXRpbicpO1xuICAgIENIQVJTRVRfTUFQLnNldChrZXksIGVudHJ5KTtcbiAgICBpZiAoIUNIQVJTRVRfTUFQLmhhcyhtb2RpZmllZEtleSkpIHtcbiAgICAgICAgQ0hBUlNFVF9NQVAuc2V0KG1vZGlmaWVkS2V5LCBlbnRyeSk7XG4gICAgfVxufSk7XG5cbm1vZHVsZS5leHBvcnRzLnJlc29sdmVDaGFyc2V0ID0gY2hhcnNldCA9PiB7XG4gICAgbGV0IGtleSA9IGNoYXJzZXQucmVwbGFjZSgvW18tXFxzXS9nLCAnJykudG9Mb3dlckNhc2UoKTtcbiAgICBpZiAoQ0hBUlNFVF9NQVAuaGFzKGtleSkpIHtcbiAgICAgICAgcmV0dXJuIENIQVJTRVRfTUFQLmdldChrZXkpO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbn07XG4iXSwibmFtZXMiOltdLCJpZ25vcmVMaXN0IjpbMF0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(rsc)/./node_modules/imapflow/lib/charsets.js\n");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "(rsc)/./node_modules/imapflow/lib/commands/append.js":
|
|
/*!******************************************************!*\
|
|
!*** ./node_modules/imapflow/lib/commands/append.js ***!
|
|
\******************************************************/
|
|
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
|
|
|
|
eval("\n\nconst { getStatusCode, formatFlag, canUseFlag, formatDateTime, normalizePath, encodePath, comparePaths, getErrorText } = __webpack_require__(/*! ../tools.js */ \"(rsc)/./node_modules/imapflow/lib/tools.js\");\n\n// Appends a message to a mailbox\nmodule.exports = async (connection, destination, content, flags, idate) => {\n if (![connection.states.AUTHENTICATED, connection.states.SELECTED].includes(connection.state) || !destination) {\n // nothing to do here\n return;\n }\n\n if (connection.capabilities.has('APPENDLIMIT')) {\n let appendLimit = connection.capabilities.get('APPENDLIMIT');\n if (typeof appendLimit === 'number' && appendLimit < content.length) {\n let err = new Error('Message content too big for APPENDLIMIT=' + appendLimit);\n err.serverResponseCode = 'APPENDLIMIT';\n throw err;\n }\n }\n\n destination = normalizePath(connection, destination);\n\n let expectExists = comparePaths(connection, connection.mailbox.path, destination);\n\n flags = (Array.isArray(flags) ? flags : [].concat(flags || []))\n .map(flag => flag && formatFlag(flag.toString()))\n .filter(flag => flag && canUseFlag(connection.mailbox, flag));\n\n let attributes = [{ type: 'ATOM', value: encodePath(connection, destination) }];\n\n idate = idate ? formatDateTime(idate) : false;\n\n if (flags.length || idate) {\n attributes.push(flags.map(flag => ({ type: 'ATOM', value: flag })));\n }\n\n if (idate) {\n attributes.push({ type: 'STRING', value: idate }); // force quotes as required by date-time\n }\n\n let isLiteral8 = false;\n if (connection.capabilities.has('BINARY') && !connection.disableBinary) {\n if (typeof content === 'string') {\n content = Buffer.from(content);\n }\n // Value is literal8 if it contains NULL bytes. The server must support the BINARY extension\n // and if it does not then send the value as a regular literal and hope for the best\n isLiteral8 = content.indexOf(Buffer.from([0])) >= 0;\n }\n\n attributes.push({ type: 'LITERAL', value: content, isLiteral8 });\n\n let map = { destination };\n if (connection.mailbox && connection.mailbox.path) {\n map.path = connection.mailbox.path;\n }\n\n let response;\n try {\n response = await connection.exec('APPEND', attributes, {\n untagged: expectExists\n ? {\n EXISTS: async untagged => {\n map.seq = Number(untagged.command);\n\n if (expectExists) {\n let prevCount = connection.mailbox.exists;\n if (map.seq !== prevCount) {\n connection.mailbox.exists = map.seq;\n connection.emit('exists', {\n path: connection.mailbox.path,\n count: map.seq,\n prevCount\n });\n }\n }\n }\n }\n : false\n });\n\n let section = response.response.attributes && response.response.attributes[0] && response.response.attributes[0].section;\n if (section && section.length) {\n let responseCode = section[0] && typeof section[0].value === 'string' ? section[0].value : '';\n switch (responseCode.toUpperCase()) {\n case 'APPENDUID':\n {\n let uidValidity = section[1] && typeof section[1].value === 'string' && !isNaN(section[1].value) ? BigInt(section[1].value) : false;\n let uid = section[2] && typeof section[2].value === 'string' && !isNaN(section[2].value) ? Number(section[2].value) : false;\n if (uidValidity) {\n map.uidValidity = uidValidity;\n }\n if (uid) {\n map.uid = uid;\n }\n }\n break;\n }\n }\n\n response.next();\n\n if (expectExists && !map.seq) {\n // try to use NOOP to get the new sequence number\n try {\n response = await connection.exec('NOOP', false, {\n untagged: {\n EXISTS: async untagged => {\n map.seq = Number(untagged.command);\n\n if (expectExists) {\n let prevCount = connection.mailbox.exists;\n if (map.seq !== prevCount) {\n connection.mailbox.exists = map.seq;\n connection.emit('exists', {\n path: connection.mailbox.path,\n count: map.seq,\n prevCount\n });\n }\n }\n }\n },\n comment: 'Sequence not found from APPEND output'\n });\n response.next();\n } catch (err) {\n connection.log.warn({ err, cid: connection.id });\n }\n }\n\n if (map.seq && !map.uid) {\n let list = await connection.search({ seq: map.seq }, { uid: true });\n if (list && list.length) {\n map.uid = list[0];\n }\n }\n\n return map;\n } catch (err) {\n let errorCode = getStatusCode(err.response);\n if (errorCode) {\n err.serverResponseCode = errorCode;\n }\n err.response = await getErrorText(err.response);\n\n connection.log.warn({ err, cid: connection.id });\n throw err;\n }\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHJzYykvLi9ub2RlX21vZHVsZXMvaW1hcGZsb3cvbGliL2NvbW1hbmRzL2FwcGVuZC5qcyIsIm1hcHBpbmdzIjoiQUFBYTs7QUFFYixRQUFRLCtHQUErRyxFQUFFLG1CQUFPLENBQUMsK0RBQWE7O0FBRTlJO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSx3QkFBd0IsMERBQTBEOztBQUVsRjs7QUFFQTtBQUNBLDZDQUE2QywyQkFBMkI7QUFDeEU7O0FBRUE7QUFDQSwwQkFBMEIsOEJBQThCLEdBQUc7QUFDM0Q7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLHNCQUFzQiw2Q0FBNkM7O0FBRW5FLGdCQUFnQjtBQUNoQjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1DQUFtQztBQUNuQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFDQUFxQztBQUNyQztBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7QUFDQSxpQkFBaUI7QUFDakI7QUFDQSxjQUFjO0FBQ2Qsc0NBQXNDLHlCQUF5QjtBQUMvRDtBQUNBOztBQUVBO0FBQ0EsaURBQWlELGNBQWMsSUFBSSxXQUFXO0FBQzlFO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsOEJBQThCLHlCQUF5QjtBQUN2RDtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIi9ob21lL2FsbWEvbmV4dGdlbi9OZWFoLW1haWwvbm9kZV9tb2R1bGVzL2ltYXBmbG93L2xpYi9jb21tYW5kcy9hcHBlbmQuanMiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCB7IGdldFN0YXR1c0NvZGUsIGZvcm1hdEZsYWcsIGNhblVzZUZsYWcsIGZvcm1hdERhdGVUaW1lLCBub3JtYWxpemVQYXRoLCBlbmNvZGVQYXRoLCBjb21wYXJlUGF0aHMsIGdldEVycm9yVGV4dCB9ID0gcmVxdWlyZSgnLi4vdG9vbHMuanMnKTtcblxuLy8gQXBwZW5kcyBhIG1lc3NhZ2UgdG8gYSBtYWlsYm94XG5tb2R1bGUuZXhwb3J0cyA9IGFzeW5jIChjb25uZWN0aW9uLCBkZXN0aW5hdGlvbiwgY29udGVudCwgZmxhZ3MsIGlkYXRlKSA9PiB7XG4gICAgaWYgKCFbY29ubmVjdGlvbi5zdGF0ZXMuQVVUSEVOVElDQVRFRCwgY29ubmVjdGlvbi5zdGF0ZXMuU0VMRUNURURdLmluY2x1ZGVzKGNvbm5lY3Rpb24uc3RhdGUpIHx8ICFkZXN0aW5hdGlvbikge1xuICAgICAgICAvLyBub3RoaW5nIHRvIGRvIGhlcmVcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChjb25uZWN0aW9uLmNhcGFiaWxpdGllcy5oYXMoJ0FQUEVORExJTUlUJykpIHtcbiAgICAgICAgbGV0IGFwcGVuZExpbWl0ID0gY29ubmVjdGlvbi5jYXBhYmlsaXRpZXMuZ2V0KCdBUFBFTkRMSU1JVCcpO1xuICAgICAgICBpZiAodHlwZW9mIGFwcGVuZExpbWl0ID09PSAnbnVtYmVyJyAmJiBhcHBlbmRMaW1pdCA8IGNvbnRlbnQubGVuZ3RoKSB7XG4gICAgICAgICAgICBsZXQgZXJyID0gbmV3IEVycm9yKCdNZXNzYWdlIGNvbnRlbnQgdG9vIGJpZyBmb3IgQVBQRU5ETElNSVQ9JyArIGFwcGVuZExpbWl0KTtcbiAgICAgICAgICAgIGVyci5zZXJ2ZXJSZXNwb25zZUNvZGUgPSAnQVBQRU5ETElNSVQnO1xuICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZGVzdGluYXRpb24gPSBub3JtYWxpemVQYXRoKGNvbm5lY3Rpb24sIGRlc3RpbmF0aW9uKTtcblxuICAgIGxldCBleHBlY3RFeGlzdHMgPSBjb21wYXJlUGF0aHMoY29ubmVjdGlvbiwgY29ubmVjdGlvbi5tYWlsYm94LnBhdGgsIGRlc3RpbmF0aW9uKTtcblxuICAgIGZsYWdzID0gKEFycmF5LmlzQXJyYXkoZmxhZ3MpID8gZmxhZ3MgOiBbXS5jb25jYXQoZmxhZ3MgfHwgW10pKVxuICAgICAgICAubWFwKGZsYWcgPT4gZmxhZyAmJiBmb3JtYXRGbGFnKGZsYWcudG9TdHJpbmcoKSkpXG4gICAgICAgIC5maWx0ZXIoZmxhZyA9PiBmbGFnICYmIGNhblVzZUZsYWcoY29ubmVjdGlvbi5tYWlsYm94LCBmbGFnKSk7XG5cbiAgICBsZXQgYXR0cmlidXRlcyA9IFt7IHR5cGU6ICdBVE9NJywgdmFsdWU6IGVuY29kZVBhdGgoY29ubmVjdGlvbiwgZGVzdGluYXRpb24pIH1dO1xuXG4gICAgaWRhdGUgPSBpZGF0ZSA/IGZvcm1hdERhdGVUaW1lKGlkYXRlKSA6IGZhbHNlO1xuXG4gICAgaWYgKGZsYWdzLmxlbmd0aCB8fCBpZGF0ZSkge1xuICAgICAgICBhdHRyaWJ1dGVzLnB1c2goZmxhZ3MubWFwKGZsYWcgPT4gKHsgdHlwZTogJ0FUT00nLCB2YWx1ZTogZmxhZyB9KSkpO1xuICAgIH1cblxuICAgIGlmIChpZGF0ZSkge1xuICAgICAgICBhdHRyaWJ1dGVzLnB1c2goeyB0eXBlOiAnU1RSSU5HJywgdmFsdWU6IGlkYXRlIH0pOyAvLyBmb3JjZSBxdW90ZXMgYXMgcmVxdWlyZWQgYnkgZGF0ZS10aW1lXG4gICAgfVxuXG4gICAgbGV0IGlzTGl0ZXJhbDggPSBmYWxzZTtcbiAgICBpZiAoY29ubmVjdGlvbi5jYXBhYmlsaXRpZXMuaGFzKCdCSU5BUlknKSAmJiAhY29ubmVjdGlvbi5kaXNhYmxlQmluYXJ5KSB7XG4gICAgICAgIGlmICh0eXBlb2YgY29udGVudCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGNvbnRlbnQgPSBCdWZmZXIuZnJvbShjb250ZW50KTtcbiAgICAgICAgfVxuICAgICAgICAvLyBWYWx1ZSBpcyBsaXRlcmFsOCBpZiBpdCBjb250YWlucyBOVUxMIGJ5dGVzLiBUaGUgc2VydmVyIG11c3Qgc3VwcG9ydCB0aGUgQklOQVJZIGV4dGVuc2lvblxuICAgICAgICAvLyBhbmQgaWYgaXQgZG9lcyBub3QgdGhlbiBzZW5kIHRoZSB2YWx1ZSBhcyBhIHJlZ3VsYXIgbGl0ZXJhbCBhbmQgaG9wZSBmb3IgdGhlIGJlc3RcbiAgICAgICAgaXNMaXRlcmFsOCA9IGNvbnRlbnQuaW5kZXhPZihCdWZmZXIuZnJvbShbMF0pKSA+PSAwO1xuICAgIH1cblxuICAgIGF0dHJpYnV0ZXMucHVzaCh7IHR5cGU6ICdMSVRFUkFMJywgdmFsdWU6IGNvbnRlbnQsIGlzTGl0ZXJhbDggfSk7XG5cbiAgICBsZXQgbWFwID0geyBkZXN0aW5hdGlvbiB9O1xuICAgIGlmIChjb25uZWN0aW9uLm1haWxib3ggJiYgY29ubmVjdGlvbi5tYWlsYm94LnBhdGgpIHtcbiAgICAgICAgbWFwLnBhdGggPSBjb25uZWN0aW9uLm1haWxib3gucGF0aDtcbiAgICB9XG5cbiAgICBsZXQgcmVzcG9uc2U7XG4gICAgdHJ5IHtcbiAgICAgICAgcmVzcG9uc2UgPSBhd2FpdCBjb25uZWN0aW9uLmV4ZWMoJ0FQUEVORCcsIGF0dHJpYnV0ZXMsIHtcbiAgICAgICAgICAgIHVudGFnZ2VkOiBleHBlY3RFeGlzdHNcbiAgICAgICAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgICAgICAgICBFWElTVFM6IGFzeW5jIHVudGFnZ2VkID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwLnNlcSA9IE51bWJlcih1bnRhZ2dlZC5jb21tYW5kKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXhwZWN0RXhpc3RzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcHJldkNvdW50ID0gY29ubmVjdGlvbi5tYWlsYm94LmV4aXN0cztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtYXAuc2VxICE9PSBwcmV2Q291bnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uLm1haWxib3guZXhpc3RzID0gbWFwLnNlcTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uLmVtaXQoJ2V4aXN0cycsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aDogY29ubmVjdGlvbi5tYWlsYm94LnBhdGgsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OiBtYXAuc2VxLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2Q291bnRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA6IGZhbHNlXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGxldCBzZWN0aW9uID0gcmVzcG9uc2UucmVzcG9uc2UuYXR0cmlidXRlcyAmJiByZXNwb25zZS5yZXNwb25zZS5hdHRyaWJ1dGVzWzBdICYmIHJlc3BvbnNlLnJlc3BvbnNlLmF0dHJpYnV0ZXNbMF0uc2VjdGlvbjtcbiAgICAgICAgaWYgKHNlY3Rpb24gJiYgc2VjdGlvbi5sZW5ndGgpIHtcbiAgICAgICAgICAgIGxldCByZXNwb25zZUNvZGUgPSBzZWN0aW9uWzBdICYmIHR5cGVvZiBzZWN0aW9uWzBdLnZhbHVlID09PSAnc3RyaW5nJyA/IHNlY3Rpb25bMF0udmFsdWUgOiAnJztcbiAgICAgICAgICAgIHN3aXRjaCAocmVzcG9uc2VDb2RlLnRvVXBwZXJDYXNlKCkpIHtcbiAgICAgICAgICAgICAgICBjYXNlICdBUFBFTkRVSUQnOlxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgdWlkVmFsaWRpdHkgPSBzZWN0aW9uWzFdICYmIHR5cGVvZiBzZWN0aW9uWzFdLnZhbHVlID09PSAnc3RyaW5nJyAmJiAhaXNOYU4oc2VjdGlvblsxXS52YWx1ZSkgPyBCaWdJbnQoc2VjdGlvblsxXS52YWx1ZSkgOiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB1aWQgPSBzZWN0aW9uWzJdICYmIHR5cGVvZiBzZWN0aW9uWzJdLnZhbHVlID09PSAnc3RyaW5nJyAmJiAhaXNOYU4oc2VjdGlvblsyXS52YWx1ZSkgPyBOdW1iZXIoc2VjdGlvblsyXS52YWx1ZSkgOiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1aWRWYWxpZGl0eSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcC51aWRWYWxpZGl0eSA9IHVpZFZhbGlkaXR5O1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHVpZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcC51aWQgPSB1aWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXNwb25zZS5uZXh0KCk7XG5cbiAgICAgICAgaWYgKGV4cGVjdEV4aXN0cyAmJiAhbWFwLnNlcSkge1xuICAgICAgICAgICAgLy8gdHJ5IHRvIHVzZSBOT09QIHRvIGdldCB0aGUgbmV3IHNlcXVlbmNlIG51bWJlclxuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICByZXNwb25zZSA9IGF3YWl0IGNvbm5lY3Rpb24uZXhlYygnTk9PUCcsIGZhbHNlLCB7XG4gICAgICAgICAgICAgICAgICAgIHVudGFnZ2VkOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBFWElTVFM6IGFzeW5jIHVudGFnZ2VkID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXAuc2VxID0gTnVtYmVyKHVudGFnZ2VkLmNvbW1hbmQpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGV4cGVjdEV4aXN0cykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcHJldkNvdW50ID0gY29ubmVjdGlvbi5tYWlsYm94LmV4aXN0cztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1hcC5zZXEgIT09IHByZXZDb3VudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbi5tYWlsYm94LmV4aXN0cyA9IG1hcC5zZXE7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uLmVtaXQoJ2V4aXN0cycsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRoOiBjb25uZWN0aW9uLm1haWxib3gucGF0aCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDogbWFwLnNlcSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2Q291bnRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBjb21tZW50OiAnU2VxdWVuY2Ugbm90IGZvdW5kIGZyb20gQVBQRU5EIG91dHB1dCdcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICByZXNwb25zZS5uZXh0KCk7XG4gICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICBjb25uZWN0aW9uLmxvZy53YXJuKHsgZXJyLCBjaWQ6IGNvbm5lY3Rpb24uaWQgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobWFwLnNlcSAmJiAhbWFwLnVpZCkge1xuICAgICAgICAgICAgbGV0IGxpc3QgPSBhd2FpdCBjb25uZWN0aW9uLnNlYXJjaCh7IHNlcTogbWFwLnNlcSB9LCB7IHVpZDogdHJ1ZSB9KTtcbiAgICAgICAgICAgIGlmIChsaXN0ICYmIGxpc3QubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgbWFwLnVpZCA9IGxpc3RbMF07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbWFwO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBsZXQgZXJyb3JDb2RlID0gZ2V0U3RhdHVzQ29kZShlcnIucmVzcG9uc2UpO1xuICAgICAgICBpZiAoZXJyb3JDb2RlKSB7XG4gICAgICAgICAgICBlcnIuc2VydmVyUmVzcG9uc2VDb2RlID0gZXJyb3JDb2RlO1xuICAgICAgICB9XG4gICAgICAgIGVyci5yZXNwb25zZSA9IGF3YWl0IGdldEVycm9yVGV4dChlcnIucmVzcG9uc2UpO1xuXG4gICAgICAgIGNvbm5lY3Rpb24ubG9nLndhcm4oeyBlcnIsIGNpZDogY29ubmVjdGlvbi5pZCB9KTtcbiAgICAgICAgdGhyb3cgZXJyO1xuICAgIH1cbn07XG4iXSwibmFtZXMiOltdLCJpZ25vcmVMaXN0IjpbMF0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(rsc)/./node_modules/imapflow/lib/commands/append.js\n");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "(rsc)/./node_modules/imapflow/lib/commands/authenticate.js":
|
|
/*!************************************************************!*\
|
|
!*** ./node_modules/imapflow/lib/commands/authenticate.js ***!
|
|
\************************************************************/
|
|
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
|
|
|
|
eval("\n\nconst { getStatusCode, getErrorText } = __webpack_require__(/*! ../tools.js */ \"(rsc)/./node_modules/imapflow/lib/tools.js\");\n\nasync function authOauth(connection, username, accessToken) {\n let oauthbearer;\n let command;\n let breaker;\n\n if (connection.capabilities.has('AUTH=OAUTHBEARER')) {\n oauthbearer = [`n,a=${username},`, `host=${connection.servername}`, `port=993`, `auth=Bearer ${accessToken}`, '', ''].join('\\x01');\n command = 'OAUTHBEARER';\n breaker = 'AQ==';\n } else if (connection.capabilities.has('AUTH=XOAUTH') || connection.capabilities.has('AUTH=XOAUTH2')) {\n oauthbearer = [`user=${username}`, `auth=Bearer ${accessToken}`, '', ''].join('\\x01');\n command = 'XOAUTH2';\n breaker = '';\n }\n\n let errorResponse = false;\n try {\n let response = await connection.exec(\n 'AUTHENTICATE',\n [\n { type: 'ATOM', value: command },\n { type: 'ATOM', value: Buffer.from(oauthbearer).toString('base64'), sensitive: true }\n ],\n {\n onPlusTag: async resp => {\n if (resp.attributes && resp.attributes[0] && resp.attributes[0].type === 'TEXT') {\n try {\n errorResponse = JSON.parse(Buffer.from(resp.attributes[0].value, 'base64').toString());\n } catch (err) {\n connection.log.debug({ errorResponse: resp.attributes[0].value, err });\n }\n }\n\n connection.log.debug({ src: 'c', msg: breaker, comment: `Error response for ${command}` });\n connection.write(breaker);\n }\n }\n );\n response.next();\n\n connection.authCapabilities.set(`AUTH=${command}`, true);\n\n return username;\n } catch (err) {\n let errorCode = getStatusCode(err.response);\n if (errorCode) {\n err.serverResponseCode = errorCode;\n }\n err.authenticationFailed = true;\n err.response = await getErrorText(err.response);\n if (errorResponse) {\n err.oauthError = errorResponse;\n }\n throw err;\n }\n}\n\nasync function authLogin(connection, username, password) {\n let errorResponse = false;\n try {\n let response = await connection.exec('AUTHENTICATE', [{ type: 'ATOM', value: 'LOGIN' }], {\n onPlusTag: async resp => {\n if (resp.attributes && resp.attributes[0] && resp.attributes[0].type === 'TEXT') {\n let question = Buffer.from(resp.attributes[0].value, 'base64').toString();\n switch (\n question.toLowerCase().replace(/[:\\x00]*$/, '') // eslint-disable-line no-control-regex\n ) {\n case 'username':\n case 'user name': {\n let encodedUsername = Buffer.from(username).toString('base64');\n connection.log.debug({ src: 'c', msg: encodedUsername, comment: `Encoded username for AUTH=LOGIN` });\n connection.write(encodedUsername);\n break;\n }\n\n case 'password':\n connection.log.debug({ src: 'c', msg: '(* value hidden *)', comment: `Encoded password for AUTH=LOGIN` });\n connection.write(Buffer.from(password).toString('base64'));\n break;\n\n default: {\n let error = new Error(`Unknown LOGIN question \"${question}\"`);\n throw error;\n }\n }\n }\n }\n });\n\n response.next();\n\n connection.authCapabilities.set(`AUTH=LOGIN`, true);\n\n return username;\n } catch (err) {\n let errorCode = getStatusCode(err.response);\n if (errorCode) {\n err.serverResponseCode = errorCode;\n }\n err.authenticationFailed = true;\n err.response = await getErrorText(err.response);\n if (errorResponse) {\n err.oauthError = errorResponse;\n }\n throw err;\n }\n}\n\nasync function authPlain(connection, username, password) {\n let errorResponse = false;\n try {\n let response = await connection.exec('AUTHENTICATE', [{ type: 'ATOM', value: 'PLAIN' }], {\n onPlusTag: async () => {\n let encodedResponse = Buffer.from(['', username, password].join('\\x00')).toString('base64');\n let loggedResponse = Buffer.from(['', username, '(* value hidden *)'].join('\\x00')).toString('base64');\n connection.log.debug({ src: 'c', msg: loggedResponse, comment: `Encoded response for AUTH=PLAIN` });\n connection.write(encodedResponse);\n }\n });\n\n response.next();\n\n connection.authCapabilities.set(`AUTH=PLAIN`, true);\n\n return username;\n } catch (err) {\n let errorCode = getStatusCode(err.response);\n if (errorCode) {\n err.serverResponseCode = errorCode;\n }\n err.authenticationFailed = true;\n err.response = await getErrorText(err.response);\n if (errorResponse) {\n err.oauthError = errorResponse;\n }\n throw err;\n }\n}\n\n// Authenticates user using LOGIN\nmodule.exports = async (connection, username, { accessToken, password, loginMethod }) => {\n if (connection.state !== connection.states.NOT_AUTHENTICATED) {\n // nothing to do here\n return;\n }\n\n if (accessToken) {\n // AUTH=OAUTHBEARER and AUTH=XOAUTH in the context of OAuth2 or very similar so we can handle these together\n if (connection.capabilities.has('AUTH=OAUTHBEARER') || connection.capabilities.has('AUTH=XOAUTH') || connection.capabilities.has('AUTH=XOAUTH2')) {\n return await authOauth(connection, username, accessToken);\n }\n }\n\n if (password) {\n if ((!loginMethod && connection.capabilities.has('AUTH=PLAIN')) || loginMethod === 'AUTH=PLAIN') {\n return await authPlain(connection, username, password);\n }\n\n if ((!loginMethod && connection.capabilities.has('AUTH=LOGIN')) || loginMethod === 'AUTH=LOGIN') {\n return await authLogin(connection, username, password);\n }\n }\n\n throw new Error('Unsupported authentication mechanism');\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHJzYykvLi9ub2RlX21vZHVsZXMvaW1hcGZsb3cvbGliL2NvbW1hbmRzL2F1dGhlbnRpY2F0ZS5qcyIsIm1hcHBpbmdzIjoiQUFBYTs7QUFFYixRQUFRLDhCQUE4QixFQUFFLG1CQUFPLENBQUMsK0RBQWE7O0FBRTdEO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsOEJBQThCLFNBQVMsWUFBWSxzQkFBc0IsOEJBQThCLFlBQVk7QUFDbkg7QUFDQTtBQUNBLE1BQU07QUFDTiwrQkFBK0IsU0FBUyxrQkFBa0IsWUFBWTtBQUN0RTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQiw4QkFBOEI7QUFDaEQsa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBCQUEwQjtBQUMxQixtREFBbUQsOENBQThDO0FBQ2pHO0FBQ0E7O0FBRUEsMkNBQTJDLHVEQUF1RCxRQUFRLEdBQUc7QUFDN0c7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxnREFBZ0QsUUFBUTs7QUFFeEQ7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGdFQUFnRSw4QkFBOEI7QUFDOUY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbURBQW1ELDRFQUE0RTtBQUMvSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxtREFBbUQsaUZBQWlGO0FBQ3BJO0FBQ0E7O0FBRUE7QUFDQSw2RUFBNkUsU0FBUztBQUN0RjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDs7QUFFQTs7QUFFQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsZ0VBQWdFLDhCQUE4QjtBQUM5RjtBQUNBO0FBQ0E7QUFDQSx1Q0FBdUMsMkVBQTJFO0FBQ2xIO0FBQ0E7QUFDQSxTQUFTOztBQUVUOztBQUVBOztBQUVBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGdEQUFnRCxvQ0FBb0M7QUFDcEY7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EiLCJzb3VyY2VzIjpbIi9ob21lL2FsbWEvbmV4dGdlbi9OZWFoLW1haWwvbm9kZV9tb2R1bGVzL2ltYXBmbG93L2xpYi9jb21tYW5kcy9hdXRoZW50aWNhdGUuanMiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCB7IGdldFN0YXR1c0NvZGUsIGdldEVycm9yVGV4dCB9ID0gcmVxdWlyZSgnLi4vdG9vbHMuanMnKTtcblxuYXN5bmMgZnVuY3Rpb24gYXV0aE9hdXRoKGNvbm5lY3Rpb24sIHVzZXJuYW1lLCBhY2Nlc3NUb2tlbikge1xuICAgIGxldCBvYXV0aGJlYXJlcjtcbiAgICBsZXQgY29tbWFuZDtcbiAgICBsZXQgYnJlYWtlcjtcblxuICAgIGlmIChjb25uZWN0aW9uLmNhcGFiaWxpdGllcy5oYXMoJ0FVVEg9T0FVVEhCRUFSRVInKSkge1xuICAgICAgICBvYXV0aGJlYXJlciA9IFtgbixhPSR7dXNlcm5hbWV9LGAsIGBob3N0PSR7Y29ubmVjdGlvbi5zZXJ2ZXJuYW1lfWAsIGBwb3J0PTk5M2AsIGBhdXRoPUJlYXJlciAke2FjY2Vzc1Rva2VufWAsICcnLCAnJ10uam9pbignXFx4MDEnKTtcbiAgICAgICAgY29tbWFuZCA9ICdPQVVUSEJFQVJFUic7XG4gICAgICAgIGJyZWFrZXIgPSAnQVE9PSc7XG4gICAgfSBlbHNlIGlmIChjb25uZWN0aW9uLmNhcGFiaWxpdGllcy5oYXMoJ0FVVEg9WE9BVVRIJykgfHwgY29ubmVjdGlvbi5jYXBhYmlsaXRpZXMuaGFzKCdBVVRIPVhPQVVUSDInKSkge1xuICAgICAgICBvYXV0aGJlYXJlciA9IFtgdXNlcj0ke3VzZXJuYW1lfWAsIGBhdXRoPUJlYXJlciAke2FjY2Vzc1Rva2VufWAsICcnLCAnJ10uam9pbignXFx4MDEnKTtcbiAgICAgICAgY29tbWFuZCA9ICdYT0FVVEgyJztcbiAgICAgICAgYnJlYWtlciA9ICcnO1xuICAgIH1cblxuICAgIGxldCBlcnJvclJlc3BvbnNlID0gZmFsc2U7XG4gICAgdHJ5IHtcbiAgICAgICAgbGV0IHJlc3BvbnNlID0gYXdhaXQgY29ubmVjdGlvbi5leGVjKFxuICAgICAgICAgICAgJ0FVVEhFTlRJQ0FURScsXG4gICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgeyB0eXBlOiAnQVRPTScsIHZhbHVlOiBjb21tYW5kIH0sXG4gICAgICAgICAgICAgICAgeyB0eXBlOiAnQVRPTScsIHZhbHVlOiBCdWZmZXIuZnJvbShvYXV0aGJlYXJlcikudG9TdHJpbmcoJ2Jhc2U2NCcpLCBzZW5zaXRpdmU6IHRydWUgfVxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBvblBsdXNUYWc6IGFzeW5jIHJlc3AgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVzcC5hdHRyaWJ1dGVzICYmIHJlc3AuYXR0cmlidXRlc1swXSAmJiByZXNwLmF0dHJpYnV0ZXNbMF0udHlwZSA9PT0gJ1RFWFQnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yUmVzcG9uc2UgPSBKU09OLnBhcnNlKEJ1ZmZlci5mcm9tKHJlc3AuYXR0cmlidXRlc1swXS52YWx1ZSwgJ2Jhc2U2NCcpLnRvU3RyaW5nKCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbi5sb2cuZGVidWcoeyBlcnJvclJlc3BvbnNlOiByZXNwLmF0dHJpYnV0ZXNbMF0udmFsdWUsIGVyciB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24ubG9nLmRlYnVnKHsgc3JjOiAnYycsIG1zZzogYnJlYWtlciwgY29tbWVudDogYEVycm9yIHJlc3BvbnNlIGZvciAke2NvbW1hbmR9YCB9KTtcbiAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbi53cml0ZShicmVha2VyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgICAgIHJlc3BvbnNlLm5leHQoKTtcblxuICAgICAgICBjb25uZWN0aW9uLmF1dGhDYXBhYmlsaXRpZXMuc2V0KGBBVVRIPSR7Y29tbWFuZH1gLCB0cnVlKTtcblxuICAgICAgICByZXR1cm4gdXNlcm5hbWU7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGxldCBlcnJvckNvZGUgPSBnZXRTdGF0dXNDb2RlKGVyci5yZXNwb25zZSk7XG4gICAgICAgIGlmIChlcnJvckNvZGUpIHtcbiAgICAgICAgICAgIGVyci5zZXJ2ZXJSZXNwb25zZUNvZGUgPSBlcnJvckNvZGU7XG4gICAgICAgIH1cbiAgICAgICAgZXJyLmF1dGhlbnRpY2F0aW9uRmFpbGVkID0gdHJ1ZTtcbiAgICAgICAgZXJyLnJlc3BvbnNlID0gYXdhaXQgZ2V0RXJyb3JUZXh0KGVyci5yZXNwb25zZSk7XG4gICAgICAgIGlmIChlcnJvclJlc3BvbnNlKSB7XG4gICAgICAgICAgICBlcnIub2F1dGhFcnJvciA9IGVycm9yUmVzcG9uc2U7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgZXJyO1xuICAgIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gYXV0aExvZ2luKGNvbm5lY3Rpb24sIHVzZXJuYW1lLCBwYXNzd29yZCkge1xuICAgIGxldCBlcnJvclJlc3BvbnNlID0gZmFsc2U7XG4gICAgdHJ5IHtcbiAgICAgICAgbGV0IHJlc3BvbnNlID0gYXdhaXQgY29ubmVjdGlvbi5leGVjKCdBVVRIRU5USUNBVEUnLCBbeyB0eXBlOiAnQVRPTScsIHZhbHVlOiAnTE9HSU4nIH1dLCB7XG4gICAgICAgICAgICBvblBsdXNUYWc6IGFzeW5jIHJlc3AgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChyZXNwLmF0dHJpYnV0ZXMgJiYgcmVzcC5hdHRyaWJ1dGVzWzBdICYmIHJlc3AuYXR0cmlidXRlc1swXS50eXBlID09PSAnVEVYVCcpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHF1ZXN0aW9uID0gQnVmZmVyLmZyb20ocmVzcC5hdHRyaWJ1dGVzWzBdLnZhbHVlLCAnYmFzZTY0JykudG9TdHJpbmcoKTtcbiAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChcbiAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXN0aW9uLnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvWzpcXHgwMF0qJC8sICcnKSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWNvbnRyb2wtcmVnZXhcbiAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICd1c2VybmFtZSc6XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICd1c2VyIG5hbWUnOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGVuY29kZWRVc2VybmFtZSA9IEJ1ZmZlci5mcm9tKHVzZXJuYW1lKS50b1N0cmluZygnYmFzZTY0Jyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbi5sb2cuZGVidWcoeyBzcmM6ICdjJywgbXNnOiBlbmNvZGVkVXNlcm5hbWUsIGNvbW1lbnQ6IGBFbmNvZGVkIHVzZXJuYW1lIGZvciBBVVRIPUxPR0lOYCB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uLndyaXRlKGVuY29kZWRVc2VybmFtZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3Bhc3N3b3JkJzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uLmxvZy5kZWJ1Zyh7IHNyYzogJ2MnLCBtc2c6ICcoKiB2YWx1ZSBoaWRkZW4gKiknLCBjb21tZW50OiBgRW5jb2RlZCBwYXNzd29yZCBmb3IgQVVUSD1MT0dJTmAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbi53cml0ZShCdWZmZXIuZnJvbShwYXNzd29yZCkudG9TdHJpbmcoJ2Jhc2U2NCcpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBlcnJvciA9IG5ldyBFcnJvcihgVW5rbm93biBMT0dJTiBxdWVzdGlvbiBcIiR7cXVlc3Rpb259XCJgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmVzcG9uc2UubmV4dCgpO1xuXG4gICAgICAgIGNvbm5lY3Rpb24uYXV0aENhcGFiaWxpdGllcy5zZXQoYEFVVEg9TE9HSU5gLCB0cnVlKTtcblxuICAgICAgICByZXR1cm4gdXNlcm5hbWU7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGxldCBlcnJvckNvZGUgPSBnZXRTdGF0dXNDb2RlKGVyci5yZXNwb25zZSk7XG4gICAgICAgIGlmIChlcnJvckNvZGUpIHtcbiAgICAgICAgICAgIGVyci5zZXJ2ZXJSZXNwb25zZUNvZGUgPSBlcnJvckNvZGU7XG4gICAgICAgIH1cbiAgICAgICAgZXJyLmF1dGhlbnRpY2F0aW9uRmFpbGVkID0gdHJ1ZTtcbiAgICAgICAgZXJyLnJlc3BvbnNlID0gYXdhaXQgZ2V0RXJyb3JUZXh0KGVyci5yZXNwb25zZSk7XG4gICAgICAgIGlmIChlcnJvclJlc3BvbnNlKSB7XG4gICAgICAgICAgICBlcnIub2F1dGhFcnJvciA9IGVycm9yUmVzcG9uc2U7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgZXJyO1xuICAgIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gYXV0aFBsYWluKGNvbm5lY3Rpb24sIHVzZXJuYW1lLCBwYXNzd29yZCkge1xuICAgIGxldCBlcnJvclJlc3BvbnNlID0gZmFsc2U7XG4gICAgdHJ5IHtcbiAgICAgICAgbGV0IHJlc3BvbnNlID0gYXdhaXQgY29ubmVjdGlvbi5leGVjKCdBVVRIRU5USUNBVEUnLCBbeyB0eXBlOiAnQVRPTScsIHZhbHVlOiAnUExBSU4nIH1dLCB7XG4gICAgICAgICAgICBvblBsdXNUYWc6IGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICBsZXQgZW5jb2RlZFJlc3BvbnNlID0gQnVmZmVyLmZyb20oWycnLCB1c2VybmFtZSwgcGFzc3dvcmRdLmpvaW4oJ1xceDAwJykpLnRvU3RyaW5nKCdiYXNlNjQnKTtcbiAgICAgICAgICAgICAgICBsZXQgbG9nZ2VkUmVzcG9uc2UgPSBCdWZmZXIuZnJvbShbJycsIHVzZXJuYW1lLCAnKCogdmFsdWUgaGlkZGVuICopJ10uam9pbignXFx4MDAnKSkudG9TdHJpbmcoJ2Jhc2U2NCcpO1xuICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24ubG9nLmRlYnVnKHsgc3JjOiAnYycsIG1zZzogbG9nZ2VkUmVzcG9uc2UsIGNvbW1lbnQ6IGBFbmNvZGVkIHJlc3BvbnNlIGZvciBBVVRIPVBMQUlOYCB9KTtcbiAgICAgICAgICAgICAgICBjb25uZWN0aW9uLndyaXRlKGVuY29kZWRSZXNwb25zZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJlc3BvbnNlLm5leHQoKTtcblxuICAgICAgICBjb25uZWN0aW9uLmF1dGhDYXBhYmlsaXRpZXMuc2V0KGBBVVRIPVBMQUlOYCwgdHJ1ZSk7XG5cbiAgICAgICAgcmV0dXJuIHVzZXJuYW1lO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBsZXQgZXJyb3JDb2RlID0gZ2V0U3RhdHVzQ29kZShlcnIucmVzcG9uc2UpO1xuICAgICAgICBpZiAoZXJyb3JDb2RlKSB7XG4gICAgICAgICAgICBlcnIuc2VydmVyUmVzcG9uc2VDb2RlID0gZXJyb3JDb2RlO1xuICAgICAgICB9XG4gICAgICAgIGVyci5hdXRoZW50aWNhdGlvbkZhaWxlZCA9IHRydWU7XG4gICAgICAgIGVyci5yZXNwb25zZSA9IGF3YWl0IGdldEVycm9yVGV4dChlcnIucmVzcG9uc2UpO1xuICAgICAgICBpZiAoZXJyb3JSZXNwb25zZSkge1xuICAgICAgICAgICAgZXJyLm9hdXRoRXJyb3IgPSBlcnJvclJlc3BvbnNlO1xuICAgICAgICB9XG4gICAgICAgIHRocm93IGVycjtcbiAgICB9XG59XG5cbi8vIEF1dGhlbnRpY2F0ZXMgdXNlciB1c2luZyBMT0dJTlxubW9kdWxlLmV4cG9ydHMgPSBhc3luYyAoY29ubmVjdGlvbiwgdXNlcm5hbWUsIHsgYWNjZXNzVG9rZW4sIHBhc3N3b3JkLCBsb2dpbk1ldGhvZCB9KSA9PiB7XG4gICAgaWYgKGNvbm5lY3Rpb24uc3RhdGUgIT09IGNvbm5lY3Rpb24uc3RhdGVzLk5PVF9BVVRIRU5USUNBVEVEKSB7XG4gICAgICAgIC8vIG5vdGhpbmcgdG8gZG8gaGVyZVxuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGFjY2Vzc1Rva2VuKSB7XG4gICAgICAgIC8vIEFVVEg9T0FVVEhCRUFSRVIgYW5kIEFVVEg9WE9BVVRIIGluIHRoZSBjb250ZXh0IG9mIE9BdXRoMiBvciB2ZXJ5IHNpbWlsYXIgc28gd2UgY2FuIGhhbmRsZSB0aGVzZSB0b2dldGhlclxuICAgICAgICBpZiAoY29ubmVjdGlvbi5jYXBhYmlsaXRpZXMuaGFzKCdBVVRIPU9BVVRIQkVBUkVSJykgfHwgY29ubmVjdGlvbi5jYXBhYmlsaXRpZXMuaGFzKCdBVVRIPVhPQVVUSCcpIHx8IGNvbm5lY3Rpb24uY2FwYWJpbGl0aWVzLmhhcygnQVVUSD1YT0FVVEgyJykpIHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCBhdXRoT2F1dGgoY29ubmVjdGlvbiwgdXNlcm5hbWUsIGFjY2Vzc1Rva2VuKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGlmIChwYXNzd29yZCkge1xuICAgICAgICBpZiAoKCFsb2dpbk1ldGhvZCAmJiBjb25uZWN0aW9uLmNhcGFiaWxpdGllcy5oYXMoJ0FVVEg9UExBSU4nKSkgfHwgbG9naW5NZXRob2QgPT09ICdBVVRIPVBMQUlOJykge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IGF1dGhQbGFpbihjb25uZWN0aW9uLCB1c2VybmFtZSwgcGFzc3dvcmQpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCghbG9naW5NZXRob2QgJiYgY29ubmVjdGlvbi5jYXBhYmlsaXRpZXMuaGFzKCdBVVRIPUxPR0lOJykpIHx8IGxvZ2luTWV0aG9kID09PSAnQVVUSD1MT0dJTicpIHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCBhdXRoTG9naW4oY29ubmVjdGlvbiwgdXNlcm5hbWUsIHBhc3N3b3JkKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHRocm93IG5ldyBFcnJvcignVW5zdXBwb3J0ZWQgYXV0aGVudGljYXRpb24gbWVjaGFuaXNtJyk7XG59O1xuIl0sIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6WzBdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(rsc)/./node_modules/imapflow/lib/commands/authenticate.js\n");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "(rsc)/./node_modules/imapflow/lib/commands/capability.js":
|
|
/*!**********************************************************!*\
|
|
!*** ./node_modules/imapflow/lib/commands/capability.js ***!
|
|
\**********************************************************/
|
|
/***/ ((module) => {
|
|
|
|
eval("\n\n// Refresh capabilities from server\nmodule.exports = async connection => {\n if (connection.capabilities.size && !connection.expectCapabilityUpdate) {\n return connection.capabilities;\n }\n\n let response;\n try {\n // untagged capability response is processed by global handler\n response = await connection.exec('CAPABILITY');\n\n response.next();\n return connection.capabilities;\n } catch (err) {\n connection.log.warn({ err, cid: connection.id });\n return false;\n }\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHJzYykvLi9ub2RlX21vZHVsZXMvaW1hcGZsb3cvbGliL2NvbW1hbmRzL2NhcGFiaWxpdHkuanMiLCJtYXBwaW5ncyI6IkFBQWE7O0FBRWI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsTUFBTTtBQUNOLDhCQUE4Qix5QkFBeUI7QUFDdkQ7QUFDQTtBQUNBIiwic291cmNlcyI6WyIvaG9tZS9hbG1hL25leHRnZW4vTmVhaC1tYWlsL25vZGVfbW9kdWxlcy9pbWFwZmxvdy9saWIvY29tbWFuZHMvY2FwYWJpbGl0eS5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbi8vIFJlZnJlc2ggY2FwYWJpbGl0aWVzIGZyb20gc2VydmVyXG5tb2R1bGUuZXhwb3J0cyA9IGFzeW5jIGNvbm5lY3Rpb24gPT4ge1xuICAgIGlmIChjb25uZWN0aW9uLmNhcGFiaWxpdGllcy5zaXplICYmICFjb25uZWN0aW9uLmV4cGVjdENhcGFiaWxpdHlVcGRhdGUpIHtcbiAgICAgICAgcmV0dXJuIGNvbm5lY3Rpb24uY2FwYWJpbGl0aWVzO1xuICAgIH1cblxuICAgIGxldCByZXNwb25zZTtcbiAgICB0cnkge1xuICAgICAgICAvLyB1bnRhZ2dlZCBjYXBhYmlsaXR5IHJlc3BvbnNlIGlzIHByb2Nlc3NlZCBieSBnbG9iYWwgaGFuZGxlclxuICAgICAgICByZXNwb25zZSA9IGF3YWl0IGNvbm5lY3Rpb24uZXhlYygnQ0FQQUJJTElUWScpO1xuXG4gICAgICAgIHJlc3BvbnNlLm5leHQoKTtcbiAgICAgICAgcmV0dXJuIGNvbm5lY3Rpb24uY2FwYWJpbGl0aWVzO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBjb25uZWN0aW9uLmxvZy53YXJuKHsgZXJyLCBjaWQ6IGNvbm5lY3Rpb24uaWQgfSk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG59O1xuIl0sIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6WzBdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(rsc)/./node_modules/imapflow/lib/commands/capability.js\n");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "(rsc)/./node_modules/imapflow/lib/commands/close.js":
|
|
/*!*****************************************************!*\
|
|
!*** ./node_modules/imapflow/lib/commands/close.js ***!
|
|
\*****************************************************/
|
|
/***/ ((module) => {
|
|
|
|
eval("\n\n// Closes a mailbox\nmodule.exports = async connection => {\n if (connection.state !== connection.states.SELECTED) {\n // nothing to do here\n return;\n }\n\n let response;\n try {\n response = await connection.exec('CLOSE');\n response.next();\n\n let currentMailbox = connection.mailbox;\n connection.mailbox = false;\n connection.currentSelectCommand = false;\n connection.state = connection.states.AUTHENTICATED;\n\n if (currentMailbox) {\n connection.emit('mailboxClose', currentMailbox);\n }\n return true;\n } catch (err) {\n connection.log.warn({ err, cid: connection.id });\n return false;\n }\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHJzYykvLi9ub2RlX21vZHVsZXMvaW1hcGZsb3cvbGliL2NvbW1hbmRzL2Nsb3NlLmpzIiwibWFwcGluZ3MiOiJBQUFhOztBQUViO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTiw4QkFBOEIseUJBQXlCO0FBQ3ZEO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsiL2hvbWUvYWxtYS9uZXh0Z2VuL05lYWgtbWFpbC9ub2RlX21vZHVsZXMvaW1hcGZsb3cvbGliL2NvbW1hbmRzL2Nsb3NlLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcblxuLy8gQ2xvc2VzIGEgbWFpbGJveFxubW9kdWxlLmV4cG9ydHMgPSBhc3luYyBjb25uZWN0aW9uID0+IHtcbiAgICBpZiAoY29ubmVjdGlvbi5zdGF0ZSAhPT0gY29ubmVjdGlvbi5zdGF0ZXMuU0VMRUNURUQpIHtcbiAgICAgICAgLy8gbm90aGluZyB0byBkbyBoZXJlXG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsZXQgcmVzcG9uc2U7XG4gICAgdHJ5IHtcbiAgICAgICAgcmVzcG9uc2UgPSBhd2FpdCBjb25uZWN0aW9uLmV4ZWMoJ0NMT1NFJyk7XG4gICAgICAgIHJlc3BvbnNlLm5leHQoKTtcblxuICAgICAgICBsZXQgY3VycmVudE1haWxib3ggPSBjb25uZWN0aW9uLm1haWxib3g7XG4gICAgICAgIGNvbm5lY3Rpb24ubWFpbGJveCA9IGZhbHNlO1xuICAgICAgICBjb25uZWN0aW9uLmN1cnJlbnRTZWxlY3RDb21tYW5kID0gZmFsc2U7XG4gICAgICAgIGNvbm5lY3Rpb24uc3RhdGUgPSBjb25uZWN0aW9uLnN0YXRlcy5BVVRIRU5USUNBVEVEO1xuXG4gICAgICAgIGlmIChjdXJyZW50TWFpbGJveCkge1xuICAgICAgICAgICAgY29ubmVjdGlvbi5lbWl0KCdtYWlsYm94Q2xvc2UnLCBjdXJyZW50TWFpbGJveCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGNvbm5lY3Rpb24ubG9nLndhcm4oeyBlcnIsIGNpZDogY29ubmVjdGlvbi5pZCB9KTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbn07XG4iXSwibmFtZXMiOltdLCJpZ25vcmVMaXN0IjpbMF0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(rsc)/./node_modules/imapflow/lib/commands/close.js\n");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "(rsc)/./node_modules/imapflow/lib/commands/compress.js":
|
|
/*!********************************************************!*\
|
|
!*** ./node_modules/imapflow/lib/commands/compress.js ***!
|
|
\********************************************************/
|
|
/***/ ((module) => {
|
|
|
|
eval("\n\n// Requests compression from server\nmodule.exports = async connection => {\n if (!connection.capabilities.has('COMPRESS=DEFLATE') || connection._inflate) {\n // nothing to do here\n return false;\n }\n\n let response;\n try {\n response = await connection.exec('COMPRESS', [{ type: 'ATOM', value: 'DEFLATE' }]);\n response.next();\n return true;\n } catch (err) {\n connection.log.warn({ err, cid: connection.id });\n return false;\n }\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHJzYykvLi9ub2RlX21vZHVsZXMvaW1hcGZsb3cvbGliL2NvbW1hbmRzL2NvbXByZXNzLmpzIiwibWFwcGluZ3MiOiJBQUFhOztBQUViO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0Esd0RBQXdELGdDQUFnQztBQUN4RjtBQUNBO0FBQ0EsTUFBTTtBQUNOLDhCQUE4Qix5QkFBeUI7QUFDdkQ7QUFDQTtBQUNBIiwic291cmNlcyI6WyIvaG9tZS9hbG1hL25leHRnZW4vTmVhaC1tYWlsL25vZGVfbW9kdWxlcy9pbWFwZmxvdy9saWIvY29tbWFuZHMvY29tcHJlc3MuanMiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG4vLyBSZXF1ZXN0cyBjb21wcmVzc2lvbiBmcm9tIHNlcnZlclxubW9kdWxlLmV4cG9ydHMgPSBhc3luYyBjb25uZWN0aW9uID0+IHtcbiAgICBpZiAoIWNvbm5lY3Rpb24uY2FwYWJpbGl0aWVzLmhhcygnQ09NUFJFU1M9REVGTEFURScpIHx8IGNvbm5lY3Rpb24uX2luZmxhdGUpIHtcbiAgICAgICAgLy8gbm90aGluZyB0byBkbyBoZXJlXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBsZXQgcmVzcG9uc2U7XG4gICAgdHJ5IHtcbiAgICAgICAgcmVzcG9uc2UgPSBhd2FpdCBjb25uZWN0aW9uLmV4ZWMoJ0NPTVBSRVNTJywgW3sgdHlwZTogJ0FUT00nLCB2YWx1ZTogJ0RFRkxBVEUnIH1dKTtcbiAgICAgICAgcmVzcG9uc2UubmV4dCgpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgY29ubmVjdGlvbi5sb2cud2Fybih7IGVyciwgY2lkOiBjb25uZWN0aW9uLmlkIH0pO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxufTtcbiJdLCJuYW1lcyI6W10sImlnbm9yZUxpc3QiOlswXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(rsc)/./node_modules/imapflow/lib/commands/compress.js\n");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "(rsc)/./node_modules/imapflow/lib/commands/copy.js":
|
|
/*!****************************************************!*\
|
|
!*** ./node_modules/imapflow/lib/commands/copy.js ***!
|
|
\****************************************************/
|
|
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
|
|
|
|
eval("\n\nconst { getStatusCode, normalizePath, encodePath, expandRange, getErrorText } = __webpack_require__(/*! ../tools.js */ \"(rsc)/./node_modules/imapflow/lib/tools.js\");\n\n// Copies messages from current mailbox to some other mailbox\nmodule.exports = async (connection, range, destination, options) => {\n if (connection.state !== connection.states.SELECTED || !range || !destination) {\n // nothing to do here\n return;\n }\n\n options = options || {};\n destination = normalizePath(connection, destination);\n\n let attributes = [\n { type: 'SEQUENCE', value: range },\n { type: 'ATOM', value: encodePath(connection, destination) }\n ];\n\n let response;\n try {\n response = await connection.exec(options.uid ? 'UID COPY' : 'COPY', attributes);\n response.next();\n\n let map = { path: connection.mailbox.path, destination };\n let section = response.response.attributes && response.response.attributes[0] && response.response.attributes[0].section;\n let responseCode = section && section.length && section[0] && typeof section[0].value === 'string' ? section[0].value : '';\n switch (responseCode) {\n case 'COPYUID':\n {\n let uidValidity = section[1] && typeof section[1].value === 'string' && !isNaN(section[1].value) ? BigInt(section[1].value) : false;\n if (uidValidity) {\n map.uidValidity = uidValidity;\n }\n\n let sourceUids = section[2] && typeof section[2].value === 'string' ? expandRange(section[2].value) : false;\n let destinationUids = section[3] && typeof section[3].value === 'string' ? expandRange(section[3].value) : false;\n if (sourceUids && destinationUids && sourceUids.length === destinationUids.length) {\n map.uidMap = new Map(sourceUids.map((uid, i) => [uid, destinationUids[i]]));\n }\n }\n break;\n }\n\n return map;\n } catch (err) {\n let errorCode = getStatusCode(err.response);\n if (errorCode) {\n err.serverResponseCode = errorCode;\n }\n err.response = await getErrorText(err.response);\n\n connection.log.warn({ err, cid: connection.id });\n return false;\n }\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHJzYykvLi9ub2RlX21vZHVsZXMvaW1hcGZsb3cvbGliL2NvbW1hbmRzL2NvcHkuanMiLCJtYXBwaW5ncyI6IkFBQWE7O0FBRWIsUUFBUSxzRUFBc0UsRUFBRSxtQkFBTyxDQUFDLCtEQUFhOztBQUVyRztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLFVBQVUsZ0NBQWdDO0FBQzFDLFVBQVU7QUFDVjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxvQkFBb0I7QUFDcEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSw4QkFBOEIseUJBQXlCO0FBQ3ZEO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsiL2hvbWUvYWxtYS9uZXh0Z2VuL05lYWgtbWFpbC9ub2RlX21vZHVsZXMvaW1hcGZsb3cvbGliL2NvbW1hbmRzL2NvcHkuanMiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCB7IGdldFN0YXR1c0NvZGUsIG5vcm1hbGl6ZVBhdGgsIGVuY29kZVBhdGgsIGV4cGFuZFJhbmdlLCBnZXRFcnJvclRleHQgfSA9IHJlcXVpcmUoJy4uL3Rvb2xzLmpzJyk7XG5cbi8vIENvcGllcyBtZXNzYWdlcyBmcm9tIGN1cnJlbnQgbWFpbGJveCB0byBzb21lIG90aGVyIG1haWxib3hcbm1vZHVsZS5leHBvcnRzID0gYXN5bmMgKGNvbm5lY3Rpb24sIHJhbmdlLCBkZXN0aW5hdGlvbiwgb3B0aW9ucykgPT4ge1xuICAgIGlmIChjb25uZWN0aW9uLnN0YXRlICE9PSBjb25uZWN0aW9uLnN0YXRlcy5TRUxFQ1RFRCB8fCAhcmFuZ2UgfHwgIWRlc3RpbmF0aW9uKSB7XG4gICAgICAgIC8vIG5vdGhpbmcgdG8gZG8gaGVyZVxuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gICAgZGVzdGluYXRpb24gPSBub3JtYWxpemVQYXRoKGNvbm5lY3Rpb24sIGRlc3RpbmF0aW9uKTtcblxuICAgIGxldCBhdHRyaWJ1dGVzID0gW1xuICAgICAgICB7IHR5cGU6ICdTRVFVRU5DRScsIHZhbHVlOiByYW5nZSB9LFxuICAgICAgICB7IHR5cGU6ICdBVE9NJywgdmFsdWU6IGVuY29kZVBhdGgoY29ubmVjdGlvbiwgZGVzdGluYXRpb24pIH1cbiAgICBdO1xuXG4gICAgbGV0IHJlc3BvbnNlO1xuICAgIHRyeSB7XG4gICAgICAgIHJlc3BvbnNlID0gYXdhaXQgY29ubmVjdGlvbi5leGVjKG9wdGlvbnMudWlkID8gJ1VJRCBDT1BZJyA6ICdDT1BZJywgYXR0cmlidXRlcyk7XG4gICAgICAgIHJlc3BvbnNlLm5leHQoKTtcblxuICAgICAgICBsZXQgbWFwID0geyBwYXRoOiBjb25uZWN0aW9uLm1haWxib3gucGF0aCwgZGVzdGluYXRpb24gfTtcbiAgICAgICAgbGV0IHNlY3Rpb24gPSByZXNwb25zZS5yZXNwb25zZS5hdHRyaWJ1dGVzICYmIHJlc3BvbnNlLnJlc3BvbnNlLmF0dHJpYnV0ZXNbMF0gJiYgcmVzcG9uc2UucmVzcG9uc2UuYXR0cmlidXRlc1swXS5zZWN0aW9uO1xuICAgICAgICBsZXQgcmVzcG9uc2VDb2RlID0gc2VjdGlvbiAmJiBzZWN0aW9uLmxlbmd0aCAmJiBzZWN0aW9uWzBdICYmIHR5cGVvZiBzZWN0aW9uWzBdLnZhbHVlID09PSAnc3RyaW5nJyA/IHNlY3Rpb25bMF0udmFsdWUgOiAnJztcbiAgICAgICAgc3dpdGNoIChyZXNwb25zZUNvZGUpIHtcbiAgICAgICAgICAgIGNhc2UgJ0NPUFlVSUQnOlxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHVpZFZhbGlkaXR5ID0gc2VjdGlvblsxXSAmJiB0eXBlb2Ygc2VjdGlvblsxXS52YWx1ZSA9PT0gJ3N0cmluZycgJiYgIWlzTmFOKHNlY3Rpb25bMV0udmFsdWUpID8gQmlnSW50KHNlY3Rpb25bMV0udmFsdWUpIDogZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIGlmICh1aWRWYWxpZGl0eSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbWFwLnVpZFZhbGlkaXR5ID0gdWlkVmFsaWRpdHk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBsZXQgc291cmNlVWlkcyA9IHNlY3Rpb25bMl0gJiYgdHlwZW9mIHNlY3Rpb25bMl0udmFsdWUgPT09ICdzdHJpbmcnID8gZXhwYW5kUmFuZ2Uoc2VjdGlvblsyXS52YWx1ZSkgOiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGRlc3RpbmF0aW9uVWlkcyA9IHNlY3Rpb25bM10gJiYgdHlwZW9mIHNlY3Rpb25bM10udmFsdWUgPT09ICdzdHJpbmcnID8gZXhwYW5kUmFuZ2Uoc2VjdGlvblszXS52YWx1ZSkgOiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNvdXJjZVVpZHMgJiYgZGVzdGluYXRpb25VaWRzICYmIHNvdXJjZVVpZHMubGVuZ3RoID09PSBkZXN0aW5hdGlvblVpZHMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtYXAudWlkTWFwID0gbmV3IE1hcChzb3VyY2VVaWRzLm1hcCgodWlkLCBpKSA9PiBbdWlkLCBkZXN0aW5hdGlvblVpZHNbaV1dKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbWFwO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBsZXQgZXJyb3JDb2RlID0gZ2V0U3RhdHVzQ29kZShlcnIucmVzcG9uc2UpO1xuICAgICAgICBpZiAoZXJyb3JDb2RlKSB7XG4gICAgICAgICAgICBlcnIuc2VydmVyUmVzcG9uc2VDb2RlID0gZXJyb3JDb2RlO1xuICAgICAgICB9XG4gICAgICAgIGVyci5yZXNwb25zZSA9IGF3YWl0IGdldEVycm9yVGV4dChlcnIucmVzcG9uc2UpO1xuXG4gICAgICAgIGNvbm5lY3Rpb24ubG9nLndhcm4oeyBlcnIsIGNpZDogY29ubmVjdGlvbi5pZCB9KTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbn07XG4iXSwibmFtZXMiOltdLCJpZ25vcmVMaXN0IjpbMF0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(rsc)/./node_modules/imapflow/lib/commands/copy.js\n");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "(rsc)/./node_modules/imapflow/lib/commands/create.js":
|
|
/*!******************************************************!*\
|
|
!*** ./node_modules/imapflow/lib/commands/create.js ***!
|
|
\******************************************************/
|
|
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
|
|
|
|
eval("\n\nconst { encodePath, normalizePath, getStatusCode, getErrorText } = __webpack_require__(/*! ../tools.js */ \"(rsc)/./node_modules/imapflow/lib/tools.js\");\n\n// Creates a new mailbox\nmodule.exports = async (connection, path) => {\n if (![connection.states.AUTHENTICATED, connection.states.SELECTED].includes(connection.state)) {\n // nothing to do here\n return;\n }\n\n path = normalizePath(connection, path);\n\n let response;\n try {\n let map = {\n path\n };\n response = await connection.exec('CREATE', [{ type: 'ATOM', value: encodePath(connection, path) }]);\n\n let section =\n response.response.attributes &&\n response.response.attributes[0] &&\n response.response.attributes[0].section &&\n response.response.attributes[0].section.length\n ? response.response.attributes[0].section\n : false;\n\n if (section) {\n let key;\n section.forEach((attribute, i) => {\n if (i % 2 === 0) {\n key = attribute && typeof attribute.value === 'string' ? attribute.value : false;\n return;\n }\n\n if (!key) {\n return;\n }\n\n let value;\n switch (key.toLowerCase()) {\n case 'mailboxid':\n key = 'mailboxId';\n value = Array.isArray(attribute) && attribute[0] && typeof attribute[0].value === 'string' ? attribute[0].value : false;\n break;\n }\n\n if (key && value) {\n map[key] = value;\n }\n });\n }\n\n map.created = true;\n response.next();\n\n //make sure we are subscribed to the new folder as well\n await connection.run('SUBSCRIBE', path);\n\n return map;\n } catch (err) {\n let errorCode = getStatusCode(err.response);\n if (errorCode) {\n err.serverResponseCode = errorCode;\n }\n err.response = await getErrorText(err.response);\n\n switch (errorCode) {\n case 'ALREADYEXISTS':\n // no need to do anything, mailbox already exists\n return {\n path,\n created: false\n };\n }\n\n if (errorCode) {\n err.serverResponseCode = errorCode;\n }\n\n connection.log.warn({ err, cid: connection.id });\n throw err;\n }\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHJzYykvLi9ub2RlX21vZHVsZXMvaW1hcGZsb3cvbGliL2NvbW1hbmRzL2NyZWF0ZS5qcyIsIm1hcHBpbmdzIjoiQUFBYTs7QUFFYixRQUFRLHlEQUF5RCxFQUFFLG1CQUFPLENBQUMsK0RBQWE7O0FBRXhGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0RBQXNELG1EQUFtRDs7QUFFekc7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSw4QkFBOEIseUJBQXlCO0FBQ3ZEO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsiL2hvbWUvYWxtYS9uZXh0Z2VuL05lYWgtbWFpbC9ub2RlX21vZHVsZXMvaW1hcGZsb3cvbGliL2NvbW1hbmRzL2NyZWF0ZS5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbmNvbnN0IHsgZW5jb2RlUGF0aCwgbm9ybWFsaXplUGF0aCwgZ2V0U3RhdHVzQ29kZSwgZ2V0RXJyb3JUZXh0IH0gPSByZXF1aXJlKCcuLi90b29scy5qcycpO1xuXG4vLyBDcmVhdGVzIGEgbmV3IG1haWxib3hcbm1vZHVsZS5leHBvcnRzID0gYXN5bmMgKGNvbm5lY3Rpb24sIHBhdGgpID0+IHtcbiAgICBpZiAoIVtjb25uZWN0aW9uLnN0YXRlcy5BVVRIRU5USUNBVEVELCBjb25uZWN0aW9uLnN0YXRlcy5TRUxFQ1RFRF0uaW5jbHVkZXMoY29ubmVjdGlvbi5zdGF0ZSkpIHtcbiAgICAgICAgLy8gbm90aGluZyB0byBkbyBoZXJlXG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBwYXRoID0gbm9ybWFsaXplUGF0aChjb25uZWN0aW9uLCBwYXRoKTtcblxuICAgIGxldCByZXNwb25zZTtcbiAgICB0cnkge1xuICAgICAgICBsZXQgbWFwID0ge1xuICAgICAgICAgICAgcGF0aFxuICAgICAgICB9O1xuICAgICAgICByZXNwb25zZSA9IGF3YWl0IGNvbm5lY3Rpb24uZXhlYygnQ1JFQVRFJywgW3sgdHlwZTogJ0FUT00nLCB2YWx1ZTogZW5jb2RlUGF0aChjb25uZWN0aW9uLCBwYXRoKSB9XSk7XG5cbiAgICAgICAgbGV0IHNlY3Rpb24gPVxuICAgICAgICAgICAgcmVzcG9uc2UucmVzcG9uc2UuYXR0cmlidXRlcyAmJlxuICAgICAgICAgICAgcmVzcG9uc2UucmVzcG9uc2UuYXR0cmlidXRlc1swXSAmJlxuICAgICAgICAgICAgcmVzcG9uc2UucmVzcG9uc2UuYXR0cmlidXRlc1swXS5zZWN0aW9uICYmXG4gICAgICAgICAgICByZXNwb25zZS5yZXNwb25zZS5hdHRyaWJ1dGVzWzBdLnNlY3Rpb24ubGVuZ3RoXG4gICAgICAgICAgICAgICAgPyByZXNwb25zZS5yZXNwb25zZS5hdHRyaWJ1dGVzWzBdLnNlY3Rpb25cbiAgICAgICAgICAgICAgICA6IGZhbHNlO1xuXG4gICAgICAgIGlmIChzZWN0aW9uKSB7XG4gICAgICAgICAgICBsZXQga2V5O1xuICAgICAgICAgICAgc2VjdGlvbi5mb3JFYWNoKChhdHRyaWJ1dGUsIGkpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoaSAlIDIgPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAga2V5ID0gYXR0cmlidXRlICYmIHR5cGVvZiBhdHRyaWJ1dGUudmFsdWUgPT09ICdzdHJpbmcnID8gYXR0cmlidXRlLnZhbHVlIDogZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoIWtleSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgbGV0IHZhbHVlO1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoa2V5LnRvTG93ZXJDYXNlKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnbWFpbGJveGlkJzpcbiAgICAgICAgICAgICAgICAgICAgICAgIGtleSA9ICdtYWlsYm94SWQnO1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBBcnJheS5pc0FycmF5KGF0dHJpYnV0ZSkgJiYgYXR0cmlidXRlWzBdICYmIHR5cGVvZiBhdHRyaWJ1dGVbMF0udmFsdWUgPT09ICdzdHJpbmcnID8gYXR0cmlidXRlWzBdLnZhbHVlIDogZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoa2V5ICYmIHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgIG1hcFtrZXldID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBtYXAuY3JlYXRlZCA9IHRydWU7XG4gICAgICAgIHJlc3BvbnNlLm5leHQoKTtcblxuICAgICAgICAvL21ha2Ugc3VyZSB3ZSBhcmUgc3Vic2NyaWJlZCB0byB0aGUgbmV3IGZvbGRlciBhcyB3ZWxsXG4gICAgICAgIGF3YWl0IGNvbm5lY3Rpb24ucnVuKCdTVUJTQ1JJQkUnLCBwYXRoKTtcblxuICAgICAgICByZXR1cm4gbWFwO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBsZXQgZXJyb3JDb2RlID0gZ2V0U3RhdHVzQ29kZShlcnIucmVzcG9uc2UpO1xuICAgICAgICBpZiAoZXJyb3JDb2RlKSB7XG4gICAgICAgICAgICBlcnIuc2VydmVyUmVzcG9uc2VDb2RlID0gZXJyb3JDb2RlO1xuICAgICAgICB9XG4gICAgICAgIGVyci5yZXNwb25zZSA9IGF3YWl0IGdldEVycm9yVGV4dChlcnIucmVzcG9uc2UpO1xuXG4gICAgICAgIHN3aXRjaCAoZXJyb3JDb2RlKSB7XG4gICAgICAgICAgICBjYXNlICdBTFJFQURZRVhJU1RTJzpcbiAgICAgICAgICAgICAgICAvLyBubyBuZWVkIHRvIGRvIGFueXRoaW5nLCBtYWlsYm94IGFscmVhZHkgZXhpc3RzXG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgcGF0aCxcbiAgICAgICAgICAgICAgICAgICAgY3JlYXRlZDogZmFsc2VcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGVycm9yQ29kZSkge1xuICAgICAgICAgICAgZXJyLnNlcnZlclJlc3BvbnNlQ29kZSA9IGVycm9yQ29kZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbm5lY3Rpb24ubG9nLndhcm4oeyBlcnIsIGNpZDogY29ubmVjdGlvbi5pZCB9KTtcbiAgICAgICAgdGhyb3cgZXJyO1xuICAgIH1cbn07XG4iXSwibmFtZXMiOltdLCJpZ25vcmVMaXN0IjpbMF0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(rsc)/./node_modules/imapflow/lib/commands/create.js\n");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "(rsc)/./node_modules/imapflow/lib/commands/delete.js":
|
|
/*!******************************************************!*\
|
|
!*** ./node_modules/imapflow/lib/commands/delete.js ***!
|
|
\******************************************************/
|
|
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
|
|
|
|
eval("\n\nconst { encodePath, normalizePath, getStatusCode, getErrorText } = __webpack_require__(/*! ../tools.js */ \"(rsc)/./node_modules/imapflow/lib/tools.js\");\n\n// Deletes an existing mailbox\nmodule.exports = async (connection, path) => {\n if (![connection.states.AUTHENTICATED, connection.states.SELECTED].includes(connection.state)) {\n // nothing to do here\n return;\n }\n\n path = normalizePath(connection, path);\n\n if (connection.states.SELECTED && connection.mailbox.path === path) {\n await connection.run('CLOSE');\n }\n\n let response;\n try {\n let map = {\n path\n };\n response = await connection.exec('DELETE', [{ type: 'ATOM', value: encodePath(connection, path) }]);\n response.next();\n return map;\n } catch (err) {\n let errorCode = getStatusCode(err.response);\n if (errorCode) {\n err.serverResponseCode = errorCode;\n }\n err.response = await getErrorText(err.response);\n\n connection.log.warn({ err, cid: connection.id });\n throw err;\n }\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHJzYykvLi9ub2RlX21vZHVsZXMvaW1hcGZsb3cvbGliL2NvbW1hbmRzL2RlbGV0ZS5qcyIsIm1hcHBpbmdzIjoiQUFBYTs7QUFFYixRQUFRLHlEQUF5RCxFQUFFLG1CQUFPLENBQUMsK0RBQWE7O0FBRXhGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNEQUFzRCxtREFBbUQ7QUFDekc7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLDhCQUE4Qix5QkFBeUI7QUFDdkQ7QUFDQTtBQUNBIiwic291cmNlcyI6WyIvaG9tZS9hbG1hL25leHRnZW4vTmVhaC1tYWlsL25vZGVfbW9kdWxlcy9pbWFwZmxvdy9saWIvY29tbWFuZHMvZGVsZXRlLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcblxuY29uc3QgeyBlbmNvZGVQYXRoLCBub3JtYWxpemVQYXRoLCBnZXRTdGF0dXNDb2RlLCBnZXRFcnJvclRleHQgfSA9IHJlcXVpcmUoJy4uL3Rvb2xzLmpzJyk7XG5cbi8vIERlbGV0ZXMgYW4gZXhpc3RpbmcgbWFpbGJveFxubW9kdWxlLmV4cG9ydHMgPSBhc3luYyAoY29ubmVjdGlvbiwgcGF0aCkgPT4ge1xuICAgIGlmICghW2Nvbm5lY3Rpb24uc3RhdGVzLkFVVEhFTlRJQ0FURUQsIGNvbm5lY3Rpb24uc3RhdGVzLlNFTEVDVEVEXS5pbmNsdWRlcyhjb25uZWN0aW9uLnN0YXRlKSkge1xuICAgICAgICAvLyBub3RoaW5nIHRvIGRvIGhlcmVcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHBhdGggPSBub3JtYWxpemVQYXRoKGNvbm5lY3Rpb24sIHBhdGgpO1xuXG4gICAgaWYgKGNvbm5lY3Rpb24uc3RhdGVzLlNFTEVDVEVEICYmIGNvbm5lY3Rpb24ubWFpbGJveC5wYXRoID09PSBwYXRoKSB7XG4gICAgICAgIGF3YWl0IGNvbm5lY3Rpb24ucnVuKCdDTE9TRScpO1xuICAgIH1cblxuICAgIGxldCByZXNwb25zZTtcbiAgICB0cnkge1xuICAgICAgICBsZXQgbWFwID0ge1xuICAgICAgICAgICAgcGF0aFxuICAgICAgICB9O1xuICAgICAgICByZXNwb25zZSA9IGF3YWl0IGNvbm5lY3Rpb24uZXhlYygnREVMRVRFJywgW3sgdHlwZTogJ0FUT00nLCB2YWx1ZTogZW5jb2RlUGF0aChjb25uZWN0aW9uLCBwYXRoKSB9XSk7XG4gICAgICAgIHJlc3BvbnNlLm5leHQoKTtcbiAgICAgICAgcmV0dXJuIG1hcDtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgbGV0IGVycm9yQ29kZSA9IGdldFN0YXR1c0NvZGUoZXJyLnJlc3BvbnNlKTtcbiAgICAgICAgaWYgKGVycm9yQ29kZSkge1xuICAgICAgICAgICAgZXJyLnNlcnZlclJlc3BvbnNlQ29kZSA9IGVycm9yQ29kZTtcbiAgICAgICAgfVxuICAgICAgICBlcnIucmVzcG9uc2UgPSBhd2FpdCBnZXRFcnJvclRleHQoZXJyLnJlc3BvbnNlKTtcblxuICAgICAgICBjb25uZWN0aW9uLmxvZy53YXJuKHsgZXJyLCBjaWQ6IGNvbm5lY3Rpb24uaWQgfSk7XG4gICAgICAgIHRocm93IGVycjtcbiAgICB9XG59O1xuIl0sIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6WzBdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(rsc)/./node_modules/imapflow/lib/commands/delete.js\n");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "(rsc)/./node_modules/imapflow/lib/commands/enable.js":
|
|
/*!******************************************************!*\
|
|
!*** ./node_modules/imapflow/lib/commands/enable.js ***!
|
|
\******************************************************/
|
|
/***/ ((module) => {
|
|
|
|
eval("\n\n// Enables extensions\nmodule.exports = async (connection, extensionList) => {\n if (!connection.capabilities.has('ENABLE') || connection.state !== connection.states.AUTHENTICATED) {\n // nothing to do here\n return;\n }\n\n extensionList = extensionList.filter(extension => connection.capabilities.has(extension.toUpperCase()));\n if (!extensionList.length) {\n return;\n }\n\n let response;\n try {\n let enabled = new Set();\n response = await connection.exec(\n 'ENABLE',\n extensionList.map(extension => ({ type: 'ATOM', value: extension.toUpperCase() })),\n {\n untagged: {\n ENABLED: async untagged => {\n if (!untagged.attributes || !untagged.attributes.length) {\n return;\n }\n untagged.attributes.forEach(attr => {\n if (attr.value && typeof attr.value === 'string') {\n enabled.add(attr.value.toUpperCase().trim());\n }\n });\n }\n }\n }\n );\n connection.enabled = enabled;\n response.next();\n return enabled;\n } catch (err) {\n connection.log.warn({ err, cid: connection.id });\n return false;\n }\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHJzYykvLi9ub2RlX21vZHVsZXMvaW1hcGZsb3cvbGliL2NvbW1hbmRzL2VuYWJsZS5qcyIsIm1hcHBpbmdzIjoiQUFBYTs7QUFFYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhDQUE4Qyw4Q0FBOEM7QUFDNUY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5QkFBeUI7QUFDekI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ04sOEJBQThCLHlCQUF5QjtBQUN2RDtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIi9ob21lL2FsbWEvbmV4dGdlbi9OZWFoLW1haWwvbm9kZV9tb2R1bGVzL2ltYXBmbG93L2xpYi9jb21tYW5kcy9lbmFibGUuanMiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG4vLyBFbmFibGVzIGV4dGVuc2lvbnNcbm1vZHVsZS5leHBvcnRzID0gYXN5bmMgKGNvbm5lY3Rpb24sIGV4dGVuc2lvbkxpc3QpID0+IHtcbiAgICBpZiAoIWNvbm5lY3Rpb24uY2FwYWJpbGl0aWVzLmhhcygnRU5BQkxFJykgfHwgY29ubmVjdGlvbi5zdGF0ZSAhPT0gY29ubmVjdGlvbi5zdGF0ZXMuQVVUSEVOVElDQVRFRCkge1xuICAgICAgICAvLyBub3RoaW5nIHRvIGRvIGhlcmVcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGV4dGVuc2lvbkxpc3QgPSBleHRlbnNpb25MaXN0LmZpbHRlcihleHRlbnNpb24gPT4gY29ubmVjdGlvbi5jYXBhYmlsaXRpZXMuaGFzKGV4dGVuc2lvbi50b1VwcGVyQ2FzZSgpKSk7XG4gICAgaWYgKCFleHRlbnNpb25MaXN0Lmxlbmd0aCkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbGV0IHJlc3BvbnNlO1xuICAgIHRyeSB7XG4gICAgICAgIGxldCBlbmFibGVkID0gbmV3IFNldCgpO1xuICAgICAgICByZXNwb25zZSA9IGF3YWl0IGNvbm5lY3Rpb24uZXhlYyhcbiAgICAgICAgICAgICdFTkFCTEUnLFxuICAgICAgICAgICAgZXh0ZW5zaW9uTGlzdC5tYXAoZXh0ZW5zaW9uID0+ICh7IHR5cGU6ICdBVE9NJywgdmFsdWU6IGV4dGVuc2lvbi50b1VwcGVyQ2FzZSgpIH0pKSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB1bnRhZ2dlZDoge1xuICAgICAgICAgICAgICAgICAgICBFTkFCTEVEOiBhc3luYyB1bnRhZ2dlZCA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXVudGFnZ2VkLmF0dHJpYnV0ZXMgfHwgIXVudGFnZ2VkLmF0dHJpYnV0ZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgdW50YWdnZWQuYXR0cmlidXRlcy5mb3JFYWNoKGF0dHIgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhdHRyLnZhbHVlICYmIHR5cGVvZiBhdHRyLnZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmFibGVkLmFkZChhdHRyLnZhbHVlLnRvVXBwZXJDYXNlKCkudHJpbSgpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICAgICAgY29ubmVjdGlvbi5lbmFibGVkID0gZW5hYmxlZDtcbiAgICAgICAgcmVzcG9uc2UubmV4dCgpO1xuICAgICAgICByZXR1cm4gZW5hYmxlZDtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgY29ubmVjdGlvbi5sb2cud2Fybih7IGVyciwgY2lkOiBjb25uZWN0aW9uLmlkIH0pO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxufTtcbiJdLCJuYW1lcyI6W10sImlnbm9yZUxpc3QiOlswXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(rsc)/./node_modules/imapflow/lib/commands/enable.js\n");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "(rsc)/./node_modules/imapflow/lib/commands/expunge.js":
|
|
/*!*******************************************************!*\
|
|
!*** ./node_modules/imapflow/lib/commands/expunge.js ***!
|
|
\*******************************************************/
|
|
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
|
|
|
|
eval("\n\nconst { getStatusCode, getErrorText } = __webpack_require__(/*! ../tools.js */ \"(rsc)/./node_modules/imapflow/lib/tools.js\");\n\n// Deletes specified messages\nmodule.exports = async (connection, range, options) => {\n if (connection.state !== connection.states.SELECTED || !range) {\n // nothing to do here\n return;\n }\n\n options = options || {};\n\n await connection.messageFlagsAdd(range, ['\\\\Deleted'], options);\n\n let byUid = options.uid && connection.capabilities.has('UIDPLUS');\n let command = byUid ? 'UID EXPUNGE' : 'EXPUNGE';\n let attributes = byUid ? [{ type: 'SEQUENCE', value: range }] : false;\n\n let response;\n try {\n response = await connection.exec(command, attributes);\n\n // A OK [HIGHESTMODSEQ 9122] Expunge completed (0.010 + 0.000 + 0.012 secs).\n let section = response.response.attributes && response.response.attributes[0] && response.response.attributes[0].section;\n let responseCode = section && section.length && section[0] && typeof section[0].value === 'string' ? section[0].value : '';\n if (responseCode.toUpperCase() === 'HIGHESTMODSEQ') {\n let highestModseq = section[1] && typeof section[1].value === 'string' && !isNaN(section[1].value) ? BigInt(section[1].value) : false;\n if (highestModseq && (!connection.mailbox.highestModseq || highestModseq > connection.mailbox.highestModseq)) {\n connection.mailbox.highestModseq = highestModseq;\n }\n }\n\n response.next();\n return true;\n } catch (err) {\n let errorCode = getStatusCode(err.response);\n if (errorCode) {\n err.serverResponseCode = errorCode;\n }\n err.response = await getErrorText(err.response);\n\n connection.log.warn({ err, cid: connection.id });\n return false;\n }\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHJzYykvLi9ub2RlX21vZHVsZXMvaW1hcGZsb3cvbGliL2NvbW1hbmRzL2V4cHVuZ2UuanMiLCJtYXBwaW5ncyI6IkFBQWE7O0FBRWIsUUFBUSw4QkFBOEIsRUFBRSxtQkFBTyxDQUFDLCtEQUFhOztBQUU3RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLGdDQUFnQyxnQ0FBZ0M7O0FBRWhFO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLDhCQUE4Qix5QkFBeUI7QUFDdkQ7QUFDQTtBQUNBIiwic291cmNlcyI6WyIvaG9tZS9hbG1hL25leHRnZW4vTmVhaC1tYWlsL25vZGVfbW9kdWxlcy9pbWFwZmxvdy9saWIvY29tbWFuZHMvZXhwdW5nZS5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbmNvbnN0IHsgZ2V0U3RhdHVzQ29kZSwgZ2V0RXJyb3JUZXh0IH0gPSByZXF1aXJlKCcuLi90b29scy5qcycpO1xuXG4vLyBEZWxldGVzIHNwZWNpZmllZCBtZXNzYWdlc1xubW9kdWxlLmV4cG9ydHMgPSBhc3luYyAoY29ubmVjdGlvbiwgcmFuZ2UsIG9wdGlvbnMpID0+IHtcbiAgICBpZiAoY29ubmVjdGlvbi5zdGF0ZSAhPT0gY29ubmVjdGlvbi5zdGF0ZXMuU0VMRUNURUQgfHwgIXJhbmdlKSB7XG4gICAgICAgIC8vIG5vdGhpbmcgdG8gZG8gaGVyZVxuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cbiAgICBhd2FpdCBjb25uZWN0aW9uLm1lc3NhZ2VGbGFnc0FkZChyYW5nZSwgWydcXFxcRGVsZXRlZCddLCBvcHRpb25zKTtcblxuICAgIGxldCBieVVpZCA9IG9wdGlvbnMudWlkICYmIGNvbm5lY3Rpb24uY2FwYWJpbGl0aWVzLmhhcygnVUlEUExVUycpO1xuICAgIGxldCBjb21tYW5kID0gYnlVaWQgPyAnVUlEIEVYUFVOR0UnIDogJ0VYUFVOR0UnO1xuICAgIGxldCBhdHRyaWJ1dGVzID0gYnlVaWQgPyBbeyB0eXBlOiAnU0VRVUVOQ0UnLCB2YWx1ZTogcmFuZ2UgfV0gOiBmYWxzZTtcblxuICAgIGxldCByZXNwb25zZTtcbiAgICB0cnkge1xuICAgICAgICByZXNwb25zZSA9IGF3YWl0IGNvbm5lY3Rpb24uZXhlYyhjb21tYW5kLCBhdHRyaWJ1dGVzKTtcblxuICAgICAgICAvLyBBIE9LIFtISUdIRVNUTU9EU0VRIDkxMjJdIEV4cHVuZ2UgY29tcGxldGVkICgwLjAxMCArIDAuMDAwICsgMC4wMTIgc2VjcykuXG4gICAgICAgIGxldCBzZWN0aW9uID0gcmVzcG9uc2UucmVzcG9uc2UuYXR0cmlidXRlcyAmJiByZXNwb25zZS5yZXNwb25zZS5hdHRyaWJ1dGVzWzBdICYmIHJlc3BvbnNlLnJlc3BvbnNlLmF0dHJpYnV0ZXNbMF0uc2VjdGlvbjtcbiAgICAgICAgbGV0IHJlc3BvbnNlQ29kZSA9IHNlY3Rpb24gJiYgc2VjdGlvbi5sZW5ndGggJiYgc2VjdGlvblswXSAmJiB0eXBlb2Ygc2VjdGlvblswXS52YWx1ZSA9PT0gJ3N0cmluZycgPyBzZWN0aW9uWzBdLnZhbHVlIDogJyc7XG4gICAgICAgIGlmIChyZXNwb25zZUNvZGUudG9VcHBlckNhc2UoKSA9PT0gJ0hJR0hFU1RNT0RTRVEnKSB7XG4gICAgICAgICAgICBsZXQgaGlnaGVzdE1vZHNlcSA9IHNlY3Rpb25bMV0gJiYgdHlwZW9mIHNlY3Rpb25bMV0udmFsdWUgPT09ICdzdHJpbmcnICYmICFpc05hTihzZWN0aW9uWzFdLnZhbHVlKSA/IEJpZ0ludChzZWN0aW9uWzFdLnZhbHVlKSA6IGZhbHNlO1xuICAgICAgICAgICAgaWYgKGhpZ2hlc3RNb2RzZXEgJiYgKCFjb25uZWN0aW9uLm1haWxib3guaGlnaGVzdE1vZHNlcSB8fCBoaWdoZXN0TW9kc2VxID4gY29ubmVjdGlvbi5tYWlsYm94LmhpZ2hlc3RNb2RzZXEpKSB7XG4gICAgICAgICAgICAgICAgY29ubmVjdGlvbi5tYWlsYm94LmhpZ2hlc3RNb2RzZXEgPSBoaWdoZXN0TW9kc2VxO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmVzcG9uc2UubmV4dCgpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgbGV0IGVycm9yQ29kZSA9IGdldFN0YXR1c0NvZGUoZXJyLnJlc3BvbnNlKTtcbiAgICAgICAgaWYgKGVycm9yQ29kZSkge1xuICAgICAgICAgICAgZXJyLnNlcnZlclJlc3BvbnNlQ29kZSA9IGVycm9yQ29kZTtcbiAgICAgICAgfVxuICAgICAgICBlcnIucmVzcG9uc2UgPSBhd2FpdCBnZXRFcnJvclRleHQoZXJyLnJlc3BvbnNlKTtcblxuICAgICAgICBjb25uZWN0aW9uLmxvZy53YXJuKHsgZXJyLCBjaWQ6IGNvbm5lY3Rpb24uaWQgfSk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG59O1xuIl0sIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6WzBdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(rsc)/./node_modules/imapflow/lib/commands/expunge.js\n");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "(rsc)/./node_modules/imapflow/lib/commands/fetch.js":
|
|
/*!*****************************************************!*\
|
|
!*** ./node_modules/imapflow/lib/commands/fetch.js ***!
|
|
\*****************************************************/
|
|
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
|
|
|
|
eval("\n\nconst { formatMessageResponse } = __webpack_require__(/*! ../tools */ \"(rsc)/./node_modules/imapflow/lib/tools.js\");\n\n// Fetches emails from server\nmodule.exports = async (connection, range, query, options) => {\n if (connection.state !== connection.states.SELECTED || !range) {\n // nothing to do here\n return;\n }\n\n options = options || {};\n\n let mailbox = connection.mailbox;\n\n const commandKey = connection.capabilities.has('BINARY') && options.binary && !connection.disableBinary ? 'BINARY' : 'BODY';\n\n let retryCount = 0;\n while (retryCount < 4) {\n let messages = {\n count: 0,\n list: []\n };\n\n let response;\n try {\n let attributes = [{ type: 'SEQUENCE', value: (range || '*').toString() }];\n\n let queryStructure = [];\n\n let setBodyPeek = (attributes, partial) => {\n let bodyPeek = {\n type: 'ATOM',\n value: `${commandKey}.PEEK`,\n section: [],\n partial\n };\n\n if (Array.isArray(attributes)) {\n attributes.forEach(attribute => {\n bodyPeek.section.push(attribute);\n });\n } else if (attributes) {\n bodyPeek.section.push(attributes);\n }\n\n queryStructure.push(bodyPeek);\n };\n\n ['all', 'fast', 'full', 'uid', 'flags', 'bodyStructure', 'envelope', 'internalDate'].forEach(key => {\n if (query[key]) {\n queryStructure.push({ type: 'ATOM', value: key.toUpperCase() });\n }\n });\n\n if (query.size) {\n queryStructure.push({ type: 'ATOM', value: 'RFC822.SIZE' });\n }\n\n if (query.source) {\n let partial;\n if (typeof query.source === 'object' && (query.source.start || query.source.maxLength)) {\n partial = [Number(query.source.start) || 0];\n if (query.source.maxLength && !isNaN(query.source.maxLength)) {\n partial.push(Number(query.source.maxLength));\n }\n }\n queryStructure.push({ type: 'ATOM', value: `${commandKey}.PEEK`, section: [], partial });\n }\n\n // if possible, always request for unique email id\n if (connection.capabilities.has('OBJECTID')) {\n queryStructure.push({ type: 'ATOM', value: 'EMAILID' });\n } else if (connection.capabilities.has('X-GM-EXT-1')) {\n queryStructure.push({ type: 'ATOM', value: 'X-GM-MSGID' });\n }\n\n if (query.threadId) {\n if (connection.capabilities.has('OBJECTID')) {\n queryStructure.push({ type: 'ATOM', value: 'THREADID' });\n } else if (connection.capabilities.has('X-GM-EXT-1')) {\n queryStructure.push({ type: 'ATOM', value: 'X-GM-THRID' });\n }\n }\n\n if (query.labels) {\n if (connection.capabilities.has('X-GM-EXT-1')) {\n queryStructure.push({ type: 'ATOM', value: 'X-GM-LABELS' });\n }\n }\n\n // always ask for modseq if possible\n if (connection.enabled.has('CONDSTORE') && !mailbox.noModseq) {\n queryStructure.push({ type: 'ATOM', value: 'MODSEQ' });\n }\n\n // always make sure to include UID in the request as well even though server might auto-add it itself\n if (!query.uid) {\n queryStructure.push({ type: 'ATOM', value: 'UID' });\n }\n\n if (query.headers) {\n if (Array.isArray(query.headers)) {\n setBodyPeek([{ type: 'ATOM', value: 'HEADER.FIELDS' }, query.headers.map(header => ({ type: 'ATOM', value: header }))]);\n } else {\n setBodyPeek({ type: 'ATOM', value: 'HEADER' });\n }\n }\n\n if (query.bodyParts && query.bodyParts.length) {\n query.bodyParts.forEach(part => {\n if (!part) {\n return;\n }\n let key;\n let partial;\n if (typeof part === 'object') {\n if (!part.key || typeof part.key !== 'string') {\n return;\n }\n key = part.key.toUpperCase();\n if (part.start || part.maxLength) {\n partial = [Number(part.start) || 0];\n if (part.maxLength && !isNaN(part.maxLength)) {\n partial.push(Number(part.maxLength));\n }\n }\n } else if (typeof part === 'string') {\n key = part.toUpperCase();\n } else {\n return;\n }\n\n setBodyPeek({ type: 'ATOM', value: key }, partial);\n });\n }\n\n if (queryStructure.length === 1) {\n queryStructure = queryStructure.pop();\n }\n\n attributes.push(queryStructure);\n\n if (options.changedSince && connection.enabled.has('CONDSTORE') && !mailbox.noModseq) {\n let changedSinceArgs = [\n {\n type: 'ATOM',\n value: 'CHANGEDSINCE'\n },\n {\n type: 'ATOM',\n value: options.changedSince.toString()\n }\n ];\n\n if (options.uid && connection.enabled.has('QRESYNC')) {\n changedSinceArgs.push({\n type: 'ATOM',\n value: 'VANISHED'\n });\n }\n\n attributes.push(changedSinceArgs);\n }\n\n response = await connection.exec(options.uid ? 'UID FETCH' : 'FETCH', attributes, {\n untagged: {\n FETCH: async untagged => {\n messages.count++;\n let formatted = await formatMessageResponse(untagged, mailbox);\n if (typeof options.onUntaggedFetch === 'function') {\n await new Promise((resolve, reject) => {\n options.onUntaggedFetch(formatted, err => {\n if (err) {\n reject(err);\n } else {\n resolve();\n }\n });\n });\n } else {\n messages.list.push(formatted);\n }\n }\n }\n });\n\n response.next();\n return messages;\n } catch (err) {\n if (err.code === 'ETHROTTLE') {\n // retrying\n connection.log.warn({\n msg: 'Retrying throttled request',\n cid: connection.id,\n code: err.code,\n response: err.responseText,\n throttleReset: err.throttleReset,\n retryCount\n });\n retryCount++;\n continue;\n }\n\n connection.log.warn({ err, cid: connection.id });\n throw err;\n }\n }\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHJzYykvLi9ub2RlX21vZHVsZXMvaW1hcGZsb3cvbGliL2NvbW1hbmRzL2ZldGNoLmpzIiwibWFwcGluZ3MiOiJBQUFhOztBQUViLFFBQVEsd0JBQXdCLEVBQUUsbUJBQU8sQ0FBQyw0REFBVTs7QUFFcEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsZ0NBQWdDLG9EQUFvRDs7QUFFcEY7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsOEJBQThCLFdBQVc7QUFDekM7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQixrQkFBa0I7QUFDbEI7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSwwQ0FBMEMsd0NBQXdDO0FBQ2xGO0FBQ0EsYUFBYTs7QUFFYjtBQUNBLHNDQUFzQyxvQ0FBb0M7QUFDMUU7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNDQUFzQyx3QkFBd0IsV0FBVyw4QkFBOEI7QUFDdkc7O0FBRUE7QUFDQTtBQUNBLHNDQUFzQyxnQ0FBZ0M7QUFDdEUsY0FBYztBQUNkLHNDQUFzQyxtQ0FBbUM7QUFDekU7O0FBRUE7QUFDQTtBQUNBLDBDQUEwQyxpQ0FBaUM7QUFDM0Usa0JBQWtCO0FBQ2xCLDBDQUEwQyxtQ0FBbUM7QUFDN0U7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsMENBQTBDLG9DQUFvQztBQUM5RTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxzQ0FBc0MsK0JBQStCO0FBQ3JFOztBQUVBO0FBQ0E7QUFDQSxzQ0FBc0MsNEJBQTRCO0FBQ2xFOztBQUVBO0FBQ0E7QUFDQSxtQ0FBbUMsc0NBQXNDLGlDQUFpQyw2QkFBNkI7QUFDdkksa0JBQWtCO0FBQ2xCLGtDQUFrQywrQkFBK0I7QUFDakU7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0I7QUFDdEI7QUFDQSxzQkFBc0I7QUFDdEI7QUFDQTs7QUFFQSxrQ0FBa0MsMEJBQTBCO0FBQzVELGlCQUFpQjtBQUNqQjs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQ0FBc0M7QUFDdEM7QUFDQTtBQUNBLGlDQUFpQztBQUNqQyw2QkFBNkI7QUFDN0IsMEJBQTBCO0FBQzFCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTs7QUFFYjtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7O0FBRUEsa0NBQWtDLHlCQUF5QjtBQUMzRDtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsiL2hvbWUvYWxtYS9uZXh0Z2VuL05lYWgtbWFpbC9ub2RlX21vZHVsZXMvaW1hcGZsb3cvbGliL2NvbW1hbmRzL2ZldGNoLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcblxuY29uc3QgeyBmb3JtYXRNZXNzYWdlUmVzcG9uc2UgfSA9IHJlcXVpcmUoJy4uL3Rvb2xzJyk7XG5cbi8vIEZldGNoZXMgZW1haWxzIGZyb20gc2VydmVyXG5tb2R1bGUuZXhwb3J0cyA9IGFzeW5jIChjb25uZWN0aW9uLCByYW5nZSwgcXVlcnksIG9wdGlvbnMpID0+IHtcbiAgICBpZiAoY29ubmVjdGlvbi5zdGF0ZSAhPT0gY29ubmVjdGlvbi5zdGF0ZXMuU0VMRUNURUQgfHwgIXJhbmdlKSB7XG4gICAgICAgIC8vIG5vdGhpbmcgdG8gZG8gaGVyZVxuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cbiAgICBsZXQgbWFpbGJveCA9IGNvbm5lY3Rpb24ubWFpbGJveDtcblxuICAgIGNvbnN0IGNvbW1hbmRLZXkgPSBjb25uZWN0aW9uLmNhcGFiaWxpdGllcy5oYXMoJ0JJTkFSWScpICYmIG9wdGlvbnMuYmluYXJ5ICYmICFjb25uZWN0aW9uLmRpc2FibGVCaW5hcnkgPyAnQklOQVJZJyA6ICdCT0RZJztcblxuICAgIGxldCByZXRyeUNvdW50ID0gMDtcbiAgICB3aGlsZSAocmV0cnlDb3VudCA8IDQpIHtcbiAgICAgICAgbGV0IG1lc3NhZ2VzID0ge1xuICAgICAgICAgICAgY291bnQ6IDAsXG4gICAgICAgICAgICBsaXN0OiBbXVxuICAgICAgICB9O1xuXG4gICAgICAgIGxldCByZXNwb25zZTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGxldCBhdHRyaWJ1dGVzID0gW3sgdHlwZTogJ1NFUVVFTkNFJywgdmFsdWU6IChyYW5nZSB8fCAnKicpLnRvU3RyaW5nKCkgfV07XG5cbiAgICAgICAgICAgIGxldCBxdWVyeVN0cnVjdHVyZSA9IFtdO1xuXG4gICAgICAgICAgICBsZXQgc2V0Qm9keVBlZWsgPSAoYXR0cmlidXRlcywgcGFydGlhbCkgPT4ge1xuICAgICAgICAgICAgICAgIGxldCBib2R5UGVlayA9IHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ0FUT00nLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogYCR7Y29tbWFuZEtleX0uUEVFS2AsXG4gICAgICAgICAgICAgICAgICAgIHNlY3Rpb246IFtdLFxuICAgICAgICAgICAgICAgICAgICBwYXJ0aWFsXG4gICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGF0dHJpYnV0ZXMpKSB7XG4gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXMuZm9yRWFjaChhdHRyaWJ1dGUgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgYm9keVBlZWsuc2VjdGlvbi5wdXNoKGF0dHJpYnV0ZSk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYXR0cmlidXRlcykge1xuICAgICAgICAgICAgICAgICAgICBib2R5UGVlay5zZWN0aW9uLnB1c2goYXR0cmlidXRlcyk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcXVlcnlTdHJ1Y3R1cmUucHVzaChib2R5UGVlayk7XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBbJ2FsbCcsICdmYXN0JywgJ2Z1bGwnLCAndWlkJywgJ2ZsYWdzJywgJ2JvZHlTdHJ1Y3R1cmUnLCAnZW52ZWxvcGUnLCAnaW50ZXJuYWxEYXRlJ10uZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChxdWVyeVtrZXldKSB7XG4gICAgICAgICAgICAgICAgICAgIHF1ZXJ5U3RydWN0dXJlLnB1c2goeyB0eXBlOiAnQVRPTScsIHZhbHVlOiBrZXkudG9VcHBlckNhc2UoKSB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgaWYgKHF1ZXJ5LnNpemUpIHtcbiAgICAgICAgICAgICAgICBxdWVyeVN0cnVjdHVyZS5wdXNoKHsgdHlwZTogJ0FUT00nLCB2YWx1ZTogJ1JGQzgyMi5TSVpFJyB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHF1ZXJ5LnNvdXJjZSkge1xuICAgICAgICAgICAgICAgIGxldCBwYXJ0aWFsO1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgcXVlcnkuc291cmNlID09PSAnb2JqZWN0JyAmJiAocXVlcnkuc291cmNlLnN0YXJ0IHx8IHF1ZXJ5LnNvdXJjZS5tYXhMZW5ndGgpKSB7XG4gICAgICAgICAgICAgICAgICAgIHBhcnRpYWwgPSBbTnVtYmVyKHF1ZXJ5LnNvdXJjZS5zdGFydCkgfHwgMF07XG4gICAgICAgICAgICAgICAgICAgIGlmIChxdWVyeS5zb3VyY2UubWF4TGVuZ3RoICYmICFpc05hTihxdWVyeS5zb3VyY2UubWF4TGVuZ3RoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcGFydGlhbC5wdXNoKE51bWJlcihxdWVyeS5zb3VyY2UubWF4TGVuZ3RoKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcXVlcnlTdHJ1Y3R1cmUucHVzaCh7IHR5cGU6ICdBVE9NJywgdmFsdWU6IGAke2NvbW1hbmRLZXl9LlBFRUtgLCBzZWN0aW9uOiBbXSwgcGFydGlhbCB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gaWYgcG9zc2libGUsIGFsd2F5cyByZXF1ZXN0IGZvciB1bmlxdWUgZW1haWwgaWRcbiAgICAgICAgICAgIGlmIChjb25uZWN0aW9uLmNhcGFiaWxpdGllcy5oYXMoJ09CSkVDVElEJykpIHtcbiAgICAgICAgICAgICAgICBxdWVyeVN0cnVjdHVyZS5wdXNoKHsgdHlwZTogJ0FUT00nLCB2YWx1ZTogJ0VNQUlMSUQnIH0pO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChjb25uZWN0aW9uLmNhcGFiaWxpdGllcy5oYXMoJ1gtR00tRVhULTEnKSkge1xuICAgICAgICAgICAgICAgIHF1ZXJ5U3RydWN0dXJlLnB1c2goeyB0eXBlOiAnQVRPTScsIHZhbHVlOiAnWC1HTS1NU0dJRCcgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChxdWVyeS50aHJlYWRJZCkge1xuICAgICAgICAgICAgICAgIGlmIChjb25uZWN0aW9uLmNhcGFiaWxpdGllcy5oYXMoJ09CSkVDVElEJykpIHtcbiAgICAgICAgICAgICAgICAgICAgcXVlcnlTdHJ1Y3R1cmUucHVzaCh7IHR5cGU6ICdBVE9NJywgdmFsdWU6ICdUSFJFQURJRCcgfSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjb25uZWN0aW9uLmNhcGFiaWxpdGllcy5oYXMoJ1gtR00tRVhULTEnKSkge1xuICAgICAgICAgICAgICAgICAgICBxdWVyeVN0cnVjdHVyZS5wdXNoKHsgdHlwZTogJ0FUT00nLCB2YWx1ZTogJ1gtR00tVEhSSUQnIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHF1ZXJ5LmxhYmVscykge1xuICAgICAgICAgICAgICAgIGlmIChjb25uZWN0aW9uLmNhcGFiaWxpdGllcy5oYXMoJ1gtR00tRVhULTEnKSkge1xuICAgICAgICAgICAgICAgICAgICBxdWVyeVN0cnVjdHVyZS5wdXNoKHsgdHlwZTogJ0FUT00nLCB2YWx1ZTogJ1gtR00tTEFCRUxTJyB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIGFsd2F5cyBhc2sgZm9yIG1vZHNlcSBpZiBwb3NzaWJsZVxuICAgICAgICAgICAgaWYgKGNvbm5lY3Rpb24uZW5hYmxlZC5oYXMoJ0NPTkRTVE9SRScpICYmICFtYWlsYm94Lm5vTW9kc2VxKSB7XG4gICAgICAgICAgICAgICAgcXVlcnlTdHJ1Y3R1cmUucHVzaCh7IHR5cGU6ICdBVE9NJywgdmFsdWU6ICdNT0RTRVEnIH0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBhbHdheXMgbWFrZSBzdXJlIHRvIGluY2x1ZGUgVUlEIGluIHRoZSByZXF1ZXN0IGFzIHdlbGwgZXZlbiB0aG91Z2ggc2VydmVyIG1pZ2h0IGF1dG8tYWRkIGl0IGl0c2VsZlxuICAgICAgICAgICAgaWYgKCFxdWVyeS51aWQpIHtcbiAgICAgICAgICAgICAgICBxdWVyeVN0cnVjdHVyZS5wdXNoKHsgdHlwZTogJ0FUT00nLCB2YWx1ZTogJ1VJRCcgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChxdWVyeS5oZWFkZXJzKSB7XG4gICAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkocXVlcnkuaGVhZGVycykpIHtcbiAgICAgICAgICAgICAgICAgICAgc2V0Qm9keVBlZWsoW3sgdHlwZTogJ0FUT00nLCB2YWx1ZTogJ0hFQURFUi5GSUVMRFMnIH0sIHF1ZXJ5LmhlYWRlcnMubWFwKGhlYWRlciA9PiAoeyB0eXBlOiAnQVRPTScsIHZhbHVlOiBoZWFkZXIgfSkpXSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgc2V0Qm9keVBlZWsoeyB0eXBlOiAnQVRPTScsIHZhbHVlOiAnSEVBREVSJyB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChxdWVyeS5ib2R5UGFydHMgJiYgcXVlcnkuYm9keVBhcnRzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHF1ZXJ5LmJvZHlQYXJ0cy5mb3JFYWNoKHBhcnQgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXBhcnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBsZXQga2V5O1xuICAgICAgICAgICAgICAgICAgICBsZXQgcGFydGlhbDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBwYXJ0ID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwYXJ0LmtleSB8fCB0eXBlb2YgcGFydC5rZXkgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAga2V5ID0gcGFydC5rZXkudG9VcHBlckNhc2UoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXJ0LnN0YXJ0IHx8IHBhcnQubWF4TGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFydGlhbCA9IFtOdW1iZXIocGFydC5zdGFydCkgfHwgMF07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhcnQubWF4TGVuZ3RoICYmICFpc05hTihwYXJ0Lm1heExlbmd0aCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFydGlhbC5wdXNoKE51bWJlcihwYXJ0Lm1heExlbmd0aCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgcGFydCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGtleSA9IHBhcnQudG9VcHBlckNhc2UoKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHNldEJvZHlQZWVrKHsgdHlwZTogJ0FUT00nLCB2YWx1ZToga2V5IH0sIHBhcnRpYWwpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAocXVlcnlTdHJ1Y3R1cmUubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICAgICAgcXVlcnlTdHJ1Y3R1cmUgPSBxdWVyeVN0cnVjdHVyZS5wb3AoKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgYXR0cmlidXRlcy5wdXNoKHF1ZXJ5U3RydWN0dXJlKTtcblxuICAgICAgICAgICAgaWYgKG9wdGlvbnMuY2hhbmdlZFNpbmNlICYmIGNvbm5lY3Rpb24uZW5hYmxlZC5oYXMoJ0NPTkRTVE9SRScpICYmICFtYWlsYm94Lm5vTW9kc2VxKSB7XG4gICAgICAgICAgICAgICAgbGV0IGNoYW5nZWRTaW5jZUFyZ3MgPSBbXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdBVE9NJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiAnQ0hBTkdFRFNJTkNFJ1xuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnQVRPTScsXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogb3B0aW9ucy5jaGFuZ2VkU2luY2UudG9TdHJpbmcoKVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgXTtcblxuICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLnVpZCAmJiBjb25uZWN0aW9uLmVuYWJsZWQuaGFzKCdRUkVTWU5DJykpIHtcbiAgICAgICAgICAgICAgICAgICAgY2hhbmdlZFNpbmNlQXJncy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdBVE9NJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiAnVkFOSVNIRUQnXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXMucHVzaChjaGFuZ2VkU2luY2VBcmdzKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmVzcG9uc2UgPSBhd2FpdCBjb25uZWN0aW9uLmV4ZWMob3B0aW9ucy51aWQgPyAnVUlEIEZFVENIJyA6ICdGRVRDSCcsIGF0dHJpYnV0ZXMsIHtcbiAgICAgICAgICAgICAgICB1bnRhZ2dlZDoge1xuICAgICAgICAgICAgICAgICAgICBGRVRDSDogYXN5bmMgdW50YWdnZWQgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZXMuY291bnQrKztcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBmb3JtYXR0ZWQgPSBhd2FpdCBmb3JtYXRNZXNzYWdlUmVzcG9uc2UodW50YWdnZWQsIG1haWxib3gpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBvcHRpb25zLm9uVW50YWdnZWRGZXRjaCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5vblVudGFnZ2VkRmV0Y2goZm9ybWF0dGVkLCBlcnIgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlcy5saXN0LnB1c2goZm9ybWF0dGVkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICByZXNwb25zZS5uZXh0KCk7XG4gICAgICAgICAgICByZXR1cm4gbWVzc2FnZXM7XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgaWYgKGVyci5jb2RlID09PSAnRVRIUk9UVExFJykge1xuICAgICAgICAgICAgICAgIC8vIHJldHJ5aW5nXG4gICAgICAgICAgICAgICAgY29ubmVjdGlvbi5sb2cud2Fybih7XG4gICAgICAgICAgICAgICAgICAgIG1zZzogJ1JldHJ5aW5nIHRocm90dGxlZCByZXF1ZXN0JyxcbiAgICAgICAgICAgICAgICAgICAgY2lkOiBjb25uZWN0aW9uLmlkLFxuICAgICAgICAgICAgICAgICAgICBjb2RlOiBlcnIuY29kZSxcbiAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2U6IGVyci5yZXNwb25zZVRleHQsXG4gICAgICAgICAgICAgICAgICAgIHRocm90dGxlUmVzZXQ6IGVyci50aHJvdHRsZVJlc2V0LFxuICAgICAgICAgICAgICAgICAgICByZXRyeUNvdW50XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgcmV0cnlDb3VudCsrO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25uZWN0aW9uLmxvZy53YXJuKHsgZXJyLCBjaWQ6IGNvbm5lY3Rpb24uaWQgfSk7XG4gICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgIH1cbiAgICB9XG59O1xuIl0sIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6WzBdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(rsc)/./node_modules/imapflow/lib/commands/fetch.js\n");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "(rsc)/./node_modules/imapflow/lib/commands/id.js":
|
|
/*!**************************************************!*\
|
|
!*** ./node_modules/imapflow/lib/commands/id.js ***!
|
|
\**************************************************/
|
|
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
|
|
|
|
eval("\n\nconst { formatDateTime } = __webpack_require__(/*! ../tools.js */ \"(rsc)/./node_modules/imapflow/lib/tools.js\");\n\n// Sends ID info to server and updates server info data based on response\nmodule.exports = async (connection, clientInfo) => {\n if (!connection.capabilities.has('ID')) {\n // nothing to do here\n return;\n }\n\n let response;\n try {\n let map = {};\n\n // convert object into an array of value tuples\n let formattedClientInfo = !clientInfo\n ? null\n : Object.keys(clientInfo)\n .map(key => [key, formatValue(key, clientInfo[key])])\n .filter(entry => entry[1])\n .flatMap(entry => entry);\n\n if (formattedClientInfo && !formattedClientInfo.length) {\n // value array has no elements\n formattedClientInfo = null;\n }\n\n response = await connection.exec('ID', [formattedClientInfo], {\n untagged: {\n ID: async untagged => {\n let params = untagged.attributes && untagged.attributes[0];\n let key;\n (Array.isArray(params) ? params : [].concat(params || [])).forEach((val, i) => {\n if (i % 2 === 0) {\n key = val.value;\n } else if (typeof key === 'string' && typeof val.value === 'string') {\n map[key.toLowerCase().trim()] = val.value;\n }\n });\n }\n }\n });\n connection.serverInfo = map;\n response.next();\n return map;\n } catch (err) {\n connection.log.warn({ err, cid: connection.id });\n return false;\n }\n};\n\nfunction formatValue(key, value) {\n switch (key.toLowerCase()) {\n case 'date':\n // Date has to be in imap date-time format\n return formatDateTime(value);\n default:\n // Other values are strings without newlines\n return (value || '').toString().replace(/\\s+/g, ' ');\n }\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHJzYykvLi9ub2RlX21vZHVsZXMvaW1hcGZsb3cvbGliL2NvbW1hbmRzL2lkLmpzIiwibWFwcGluZ3MiOiJBQUFhOztBQUViLFFBQVEsaUJBQWlCLEVBQUUsbUJBQU8sQ0FBQywrREFBYTs7QUFFaEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMEJBQTBCO0FBQzFCO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ04sOEJBQThCLHlCQUF5QjtBQUN2RDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIi9ob21lL2FsbWEvbmV4dGdlbi9OZWFoLW1haWwvbm9kZV9tb2R1bGVzL2ltYXBmbG93L2xpYi9jb21tYW5kcy9pZC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbmNvbnN0IHsgZm9ybWF0RGF0ZVRpbWUgfSA9IHJlcXVpcmUoJy4uL3Rvb2xzLmpzJyk7XG5cbi8vIFNlbmRzIElEIGluZm8gdG8gc2VydmVyIGFuZCB1cGRhdGVzIHNlcnZlciBpbmZvIGRhdGEgYmFzZWQgb24gcmVzcG9uc2Vcbm1vZHVsZS5leHBvcnRzID0gYXN5bmMgKGNvbm5lY3Rpb24sIGNsaWVudEluZm8pID0+IHtcbiAgICBpZiAoIWNvbm5lY3Rpb24uY2FwYWJpbGl0aWVzLmhhcygnSUQnKSkge1xuICAgICAgICAvLyBub3RoaW5nIHRvIGRvIGhlcmVcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGxldCByZXNwb25zZTtcbiAgICB0cnkge1xuICAgICAgICBsZXQgbWFwID0ge307XG5cbiAgICAgICAgLy8gY29udmVydCBvYmplY3QgaW50byBhbiBhcnJheSBvZiB2YWx1ZSB0dXBsZXNcbiAgICAgICAgbGV0IGZvcm1hdHRlZENsaWVudEluZm8gPSAhY2xpZW50SW5mb1xuICAgICAgICAgICAgPyBudWxsXG4gICAgICAgICAgICA6IE9iamVjdC5rZXlzKGNsaWVudEluZm8pXG4gICAgICAgICAgICAgICAgICAubWFwKGtleSA9PiBba2V5LCBmb3JtYXRWYWx1ZShrZXksIGNsaWVudEluZm9ba2V5XSldKVxuICAgICAgICAgICAgICAgICAgLmZpbHRlcihlbnRyeSA9PiBlbnRyeVsxXSlcbiAgICAgICAgICAgICAgICAgIC5mbGF0TWFwKGVudHJ5ID0+IGVudHJ5KTtcblxuICAgICAgICBpZiAoZm9ybWF0dGVkQ2xpZW50SW5mbyAmJiAhZm9ybWF0dGVkQ2xpZW50SW5mby5sZW5ndGgpIHtcbiAgICAgICAgICAgIC8vIHZhbHVlIGFycmF5IGhhcyBubyBlbGVtZW50c1xuICAgICAgICAgICAgZm9ybWF0dGVkQ2xpZW50SW5mbyA9IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICByZXNwb25zZSA9IGF3YWl0IGNvbm5lY3Rpb24uZXhlYygnSUQnLCBbZm9ybWF0dGVkQ2xpZW50SW5mb10sIHtcbiAgICAgICAgICAgIHVudGFnZ2VkOiB7XG4gICAgICAgICAgICAgICAgSUQ6IGFzeW5jIHVudGFnZ2VkID0+IHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHBhcmFtcyA9IHVudGFnZ2VkLmF0dHJpYnV0ZXMgJiYgdW50YWdnZWQuYXR0cmlidXRlc1swXTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGtleTtcbiAgICAgICAgICAgICAgICAgICAgKEFycmF5LmlzQXJyYXkocGFyYW1zKSA/IHBhcmFtcyA6IFtdLmNvbmNhdChwYXJhbXMgfHwgW10pKS5mb3JFYWNoKCh2YWwsIGkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpICUgMiA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleSA9IHZhbC52YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGtleSA9PT0gJ3N0cmluZycgJiYgdHlwZW9mIHZhbC52YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXBba2V5LnRvTG93ZXJDYXNlKCkudHJpbSgpXSA9IHZhbC52YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgY29ubmVjdGlvbi5zZXJ2ZXJJbmZvID0gbWFwO1xuICAgICAgICByZXNwb25zZS5uZXh0KCk7XG4gICAgICAgIHJldHVybiBtYXA7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGNvbm5lY3Rpb24ubG9nLndhcm4oeyBlcnIsIGNpZDogY29ubmVjdGlvbi5pZCB9KTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbn07XG5cbmZ1bmN0aW9uIGZvcm1hdFZhbHVlKGtleSwgdmFsdWUpIHtcbiAgICBzd2l0Y2ggKGtleS50b0xvd2VyQ2FzZSgpKSB7XG4gICAgICAgIGNhc2UgJ2RhdGUnOlxuICAgICAgICAgICAgLy8gRGF0ZSBoYXMgdG8gYmUgaW4gaW1hcCBkYXRlLXRpbWUgZm9ybWF0XG4gICAgICAgICAgICByZXR1cm4gZm9ybWF0RGF0ZVRpbWUodmFsdWUpO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgLy8gT3RoZXIgdmFsdWVzIGFyZSBzdHJpbmdzIHdpdGhvdXQgbmV3bGluZXNcbiAgICAgICAgICAgIHJldHVybiAodmFsdWUgfHwgJycpLnRvU3RyaW5nKCkucmVwbGFjZSgvXFxzKy9nLCAnICcpO1xuICAgIH1cbn1cbiJdLCJuYW1lcyI6W10sImlnbm9yZUxpc3QiOlswXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(rsc)/./node_modules/imapflow/lib/commands/id.js\n");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "(rsc)/./node_modules/imapflow/lib/commands/idle.js":
|
|
/*!****************************************************!*\
|
|
!*** ./node_modules/imapflow/lib/commands/idle.js ***!
|
|
\****************************************************/
|
|
/***/ ((module) => {
|
|
|
|
eval("\n\nconst NOOP_INTERVAL = 2 * 60 * 1000;\n\nasync function runIdle(connection) {\n let response;\n\n let preCheckWaitQueue = [];\n try {\n connection.idling = true;\n\n //let idleSent = false;\n let doneRequested = false;\n let doneSent = false;\n let canEnd = false;\n\n let preCheck = async () => {\n doneRequested = true;\n if (canEnd && !doneSent) {\n connection.log.debug({\n src: 'c',\n msg: `DONE`,\n comment: `breaking IDLE`,\n lockId: connection.currentLock?.lockId,\n path: connection.mailbox && connection.mailbox.path\n });\n connection.write('DONE');\n doneSent = true;\n\n connection.idling = false;\n connection.preCheck = false; // unset itself\n\n while (preCheckWaitQueue.length) {\n let { resolve } = preCheckWaitQueue.shift();\n resolve();\n }\n }\n };\n\n let connectionPreCheck = () => {\n let handler = new Promise((resolve, reject) => {\n preCheckWaitQueue.push({ resolve, reject });\n });\n\n connection.log.trace({\n msg: 'Requesting IDLE break',\n lockId: connection.currentLock?.lockId,\n path: connection.mailbox && connection.mailbox.path,\n queued: preCheckWaitQueue.length,\n doneRequested,\n canEnd,\n doneSent\n });\n\n preCheck().catch(err => connection.log.warn({ err, cid: connection.id }));\n\n return handler;\n };\n\n connection.preCheck = connectionPreCheck;\n\n response = await connection.exec('IDLE', false, {\n onPlusTag: async () => {\n connection.log.debug({ msg: `Initiated IDLE, waiting for server input`, lockId: connection.currentLock?.lockId, doneRequested });\n canEnd = true;\n if (doneRequested) {\n try {\n await preCheck();\n } catch (err) {\n connection.log.warn({ err, cid: connection.id });\n }\n }\n },\n onSend: () => {\n //idleSent = true;\n }\n });\n\n // unset before response.next() if preCheck function is not already cleared (usually is)\n if (typeof connection.preCheck === 'function' && connection.preCheck === connectionPreCheck) {\n connection.log.trace({\n msg: 'Clearing pre-check function',\n lockId: connection.currentLock?.lockId,\n path: connection.mailbox && connection.mailbox.path,\n queued: preCheckWaitQueue.length,\n doneRequested,\n canEnd,\n doneSent\n });\n connection.preCheck = false;\n while (preCheckWaitQueue.length) {\n let { resolve } = preCheckWaitQueue.shift();\n resolve();\n }\n }\n\n response.next();\n return;\n } catch (err) {\n connection.preCheck = false;\n connection.idling = false;\n\n connection.log.warn({ err, cid: connection.id });\n while (preCheckWaitQueue.length) {\n let { reject } = preCheckWaitQueue.shift();\n reject(err);\n }\n return false;\n }\n}\n\n// Listens for changes in mailbox\nmodule.exports = async (connection, maxIdleTime) => {\n if (connection.state !== connection.states.SELECTED) {\n // nothing to do here\n return;\n }\n\n if (connection.capabilities.has('IDLE')) {\n let idleTimer;\n let stillIdling = false;\n let runIdleLoop = async () => {\n if (maxIdleTime) {\n idleTimer = setTimeout(() => {\n if (connection.idling) {\n if (typeof connection.preCheck === 'function') {\n stillIdling = true;\n // request IDLE break if IDLE has been running for allowed time\n connection.log.trace({ msg: 'Max allowed IDLE time reached', cid: connection.id });\n connection.preCheck().catch(err => connection.log.warn({ err, cid: connection.id }));\n }\n }\n }, maxIdleTime);\n }\n let resp = await runIdle(connection);\n clearTimeout(idleTimer);\n if (stillIdling) {\n stillIdling = false;\n return runIdleLoop();\n }\n return resp;\n };\n return runIdleLoop();\n }\n\n let idleTimer;\n return new Promise(resolve => {\n if (!connection.currentSelectCommand) {\n return resolve();\n }\n\n // no IDLE support, fallback to NOOP'ing\n connection.preCheck = async () => {\n connection.preCheck = false; // unset itself\n clearTimeout(idleTimer);\n connection.log.debug({ src: 'c', msg: `breaking NOOP loop` });\n connection.idling = false;\n resolve();\n };\n\n let selectCommand = connection.currentSelectCommand;\n\n let idleCheck = async () => {\n let response;\n switch (connection.missingIdleCommand) {\n case 'SELECT':\n // FIXME: somehow a loop occurs after some time of idling with SELECT\n connection.log.debug({ src: 'c', msg: `Running SELECT to detect changes in folder` });\n response = await connection.exec(selectCommand.command, selectCommand.arguments);\n break;\n\n case 'STATUS':\n {\n let statusArgs = [selectCommand.arguments[0], []]; // path\n for (let key of ['MESSAGES', 'UIDNEXT', 'UIDVALIDITY', 'UNSEEN']) {\n statusArgs[1].push({ type: 'ATOM', value: key.toUpperCase() });\n }\n connection.log.debug({ src: 'c', msg: `Running STATUS to detect changes in folder` });\n response = await connection.exec('STATUS', statusArgs);\n }\n break;\n\n case 'NOOP':\n default:\n response = await connection.exec('NOOP', false, { comment: 'IDLE not supported' });\n break;\n }\n response.next();\n };\n\n let noopInterval = maxIdleTime ? Math.min(NOOP_INTERVAL, maxIdleTime) : NOOP_INTERVAL;\n\n let runLoop = () => {\n idleCheck()\n .then(() => {\n clearTimeout(idleTimer);\n idleTimer = setTimeout(runLoop, noopInterval);\n })\n .catch(err => {\n clearTimeout(idleTimer);\n connection.preCheck = false;\n connection.log.warn({ err, cid: connection.id });\n resolve();\n });\n };\n\n connection.log.debug({ src: 'c', msg: `initiated NOOP loop` });\n connection.idling = true;\n runLoop();\n });\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHJzYykvLi9ub2RlX21vZHVsZXMvaW1hcGZsb3cvbGliL2NvbW1hbmRzL2lkbGUuanMiLCJtYXBwaW5ncyI6IkFBQWE7O0FBRWI7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7O0FBRUE7QUFDQSw2Q0FBNkM7O0FBRTdDO0FBQ0EsMEJBQTBCLFVBQVU7QUFDcEM7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLHlDQUF5QyxpQkFBaUI7QUFDMUQsYUFBYTs7QUFFYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTs7QUFFYiwwREFBMEQseUJBQXlCOztBQUVuRjtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQSx1Q0FBdUMsd0dBQXdHO0FBQy9JO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCO0FBQ3RCLDhDQUE4Qyx5QkFBeUI7QUFDdkU7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQSxzQkFBc0IsVUFBVTtBQUNoQztBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBOztBQUVBLDhCQUE4Qix5QkFBeUI7QUFDdkQ7QUFDQSxrQkFBa0IsU0FBUztBQUMzQjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1EQUFtRCwwREFBMEQ7QUFDN0cscUZBQXFGLHlCQUF5QjtBQUM5RztBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EseUNBQXlDO0FBQ3pDO0FBQ0EsbUNBQW1DLHFDQUFxQztBQUN4RTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJDQUEyQyw2REFBNkQ7QUFDeEc7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsMkVBQTJFO0FBQzNFO0FBQ0EsaURBQWlELHdDQUF3QztBQUN6RjtBQUNBLCtDQUErQyw2REFBNkQ7QUFDNUc7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxzRUFBc0UsK0JBQStCO0FBQ3JHO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0EsMENBQTBDLHlCQUF5QjtBQUNuRTtBQUNBLGlCQUFpQjtBQUNqQjs7QUFFQSwrQkFBK0Isc0NBQXNDO0FBQ3JFO0FBQ0E7QUFDQSxLQUFLO0FBQ0wiLCJzb3VyY2VzIjpbIi9ob21lL2FsbWEvbmV4dGdlbi9OZWFoLW1haWwvbm9kZV9tb2R1bGVzL2ltYXBmbG93L2xpYi9jb21tYW5kcy9pZGxlLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcblxuY29uc3QgTk9PUF9JTlRFUlZBTCA9IDIgKiA2MCAqIDEwMDA7XG5cbmFzeW5jIGZ1bmN0aW9uIHJ1bklkbGUoY29ubmVjdGlvbikge1xuICAgIGxldCByZXNwb25zZTtcblxuICAgIGxldCBwcmVDaGVja1dhaXRRdWV1ZSA9IFtdO1xuICAgIHRyeSB7XG4gICAgICAgIGNvbm5lY3Rpb24uaWRsaW5nID0gdHJ1ZTtcblxuICAgICAgICAvL2xldCBpZGxlU2VudCA9IGZhbHNlO1xuICAgICAgICBsZXQgZG9uZVJlcXVlc3RlZCA9IGZhbHNlO1xuICAgICAgICBsZXQgZG9uZVNlbnQgPSBmYWxzZTtcbiAgICAgICAgbGV0IGNhbkVuZCA9IGZhbHNlO1xuXG4gICAgICAgIGxldCBwcmVDaGVjayA9IGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIGRvbmVSZXF1ZXN0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgaWYgKGNhbkVuZCAmJiAhZG9uZVNlbnQpIHtcbiAgICAgICAgICAgICAgICBjb25uZWN0aW9uLmxvZy5kZWJ1Zyh7XG4gICAgICAgICAgICAgICAgICAgIHNyYzogJ2MnLFxuICAgICAgICAgICAgICAgICAgICBtc2c6IGBET05FYCxcbiAgICAgICAgICAgICAgICAgICAgY29tbWVudDogYGJyZWFraW5nIElETEVgLFxuICAgICAgICAgICAgICAgICAgICBsb2NrSWQ6IGNvbm5lY3Rpb24uY3VycmVudExvY2s/LmxvY2tJZCxcbiAgICAgICAgICAgICAgICAgICAgcGF0aDogY29ubmVjdGlvbi5tYWlsYm94ICYmIGNvbm5lY3Rpb24ubWFpbGJveC5wYXRoXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgY29ubmVjdGlvbi53cml0ZSgnRE9ORScpO1xuICAgICAgICAgICAgICAgIGRvbmVTZW50ID0gdHJ1ZTtcblxuICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24uaWRsaW5nID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgY29ubmVjdGlvbi5wcmVDaGVjayA9IGZhbHNlOyAvLyB1bnNldCBpdHNlbGZcblxuICAgICAgICAgICAgICAgIHdoaWxlIChwcmVDaGVja1dhaXRRdWV1ZS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHsgcmVzb2x2ZSB9ID0gcHJlQ2hlY2tXYWl0UXVldWUuc2hpZnQoKTtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICBsZXQgY29ubmVjdGlvblByZUNoZWNrID0gKCkgPT4ge1xuICAgICAgICAgICAgbGV0IGhhbmRsZXIgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICAgICAgcHJlQ2hlY2tXYWl0UXVldWUucHVzaCh7IHJlc29sdmUsIHJlamVjdCB9KTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBjb25uZWN0aW9uLmxvZy50cmFjZSh7XG4gICAgICAgICAgICAgICAgbXNnOiAnUmVxdWVzdGluZyBJRExFIGJyZWFrJyxcbiAgICAgICAgICAgICAgICBsb2NrSWQ6IGNvbm5lY3Rpb24uY3VycmVudExvY2s/LmxvY2tJZCxcbiAgICAgICAgICAgICAgICBwYXRoOiBjb25uZWN0aW9uLm1haWxib3ggJiYgY29ubmVjdGlvbi5tYWlsYm94LnBhdGgsXG4gICAgICAgICAgICAgICAgcXVldWVkOiBwcmVDaGVja1dhaXRRdWV1ZS5sZW5ndGgsXG4gICAgICAgICAgICAgICAgZG9uZVJlcXVlc3RlZCxcbiAgICAgICAgICAgICAgICBjYW5FbmQsXG4gICAgICAgICAgICAgICAgZG9uZVNlbnRcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBwcmVDaGVjaygpLmNhdGNoKGVyciA9PiBjb25uZWN0aW9uLmxvZy53YXJuKHsgZXJyLCBjaWQ6IGNvbm5lY3Rpb24uaWQgfSkpO1xuXG4gICAgICAgICAgICByZXR1cm4gaGFuZGxlcjtcbiAgICAgICAgfTtcblxuICAgICAgICBjb25uZWN0aW9uLnByZUNoZWNrID0gY29ubmVjdGlvblByZUNoZWNrO1xuXG4gICAgICAgIHJlc3BvbnNlID0gYXdhaXQgY29ubmVjdGlvbi5leGVjKCdJRExFJywgZmFsc2UsIHtcbiAgICAgICAgICAgIG9uUGx1c1RhZzogYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24ubG9nLmRlYnVnKHsgbXNnOiBgSW5pdGlhdGVkIElETEUsIHdhaXRpbmcgZm9yIHNlcnZlciBpbnB1dGAsIGxvY2tJZDogY29ubmVjdGlvbi5jdXJyZW50TG9jaz8ubG9ja0lkLCBkb25lUmVxdWVzdGVkIH0pO1xuICAgICAgICAgICAgICAgIGNhbkVuZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgaWYgKGRvbmVSZXF1ZXN0ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHByZUNoZWNrKCk7XG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbi5sb2cud2Fybih7IGVyciwgY2lkOiBjb25uZWN0aW9uLmlkIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG9uU2VuZDogKCkgPT4ge1xuICAgICAgICAgICAgICAgIC8vaWRsZVNlbnQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICAvLyB1bnNldCBiZWZvcmUgcmVzcG9uc2UubmV4dCgpIGlmIHByZUNoZWNrIGZ1bmN0aW9uIGlzIG5vdCBhbHJlYWR5IGNsZWFyZWQgKHVzdWFsbHkgaXMpXG4gICAgICAgIGlmICh0eXBlb2YgY29ubmVjdGlvbi5wcmVDaGVjayA9PT0gJ2Z1bmN0aW9uJyAmJiBjb25uZWN0aW9uLnByZUNoZWNrID09PSBjb25uZWN0aW9uUHJlQ2hlY2spIHtcbiAgICAgICAgICAgIGNvbm5lY3Rpb24ubG9nLnRyYWNlKHtcbiAgICAgICAgICAgICAgICBtc2c6ICdDbGVhcmluZyBwcmUtY2hlY2sgZnVuY3Rpb24nLFxuICAgICAgICAgICAgICAgIGxvY2tJZDogY29ubmVjdGlvbi5jdXJyZW50TG9jaz8ubG9ja0lkLFxuICAgICAgICAgICAgICAgIHBhdGg6IGNvbm5lY3Rpb24ubWFpbGJveCAmJiBjb25uZWN0aW9uLm1haWxib3gucGF0aCxcbiAgICAgICAgICAgICAgICBxdWV1ZWQ6IHByZUNoZWNrV2FpdFF1ZXVlLmxlbmd0aCxcbiAgICAgICAgICAgICAgICBkb25lUmVxdWVzdGVkLFxuICAgICAgICAgICAgICAgIGNhbkVuZCxcbiAgICAgICAgICAgICAgICBkb25lU2VudFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjb25uZWN0aW9uLnByZUNoZWNrID0gZmFsc2U7XG4gICAgICAgICAgICB3aGlsZSAocHJlQ2hlY2tXYWl0UXVldWUubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgbGV0IHsgcmVzb2x2ZSB9ID0gcHJlQ2hlY2tXYWl0UXVldWUuc2hpZnQoKTtcbiAgICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXNwb25zZS5uZXh0KCk7XG4gICAgICAgIHJldHVybjtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgY29ubmVjdGlvbi5wcmVDaGVjayA9IGZhbHNlO1xuICAgICAgICBjb25uZWN0aW9uLmlkbGluZyA9IGZhbHNlO1xuXG4gICAgICAgIGNvbm5lY3Rpb24ubG9nLndhcm4oeyBlcnIsIGNpZDogY29ubmVjdGlvbi5pZCB9KTtcbiAgICAgICAgd2hpbGUgKHByZUNoZWNrV2FpdFF1ZXVlLmxlbmd0aCkge1xuICAgICAgICAgICAgbGV0IHsgcmVqZWN0IH0gPSBwcmVDaGVja1dhaXRRdWV1ZS5zaGlmdCgpO1xuICAgICAgICAgICAgcmVqZWN0KGVycik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbn1cblxuLy8gTGlzdGVucyBmb3IgY2hhbmdlcyBpbiBtYWlsYm94XG5tb2R1bGUuZXhwb3J0cyA9IGFzeW5jIChjb25uZWN0aW9uLCBtYXhJZGxlVGltZSkgPT4ge1xuICAgIGlmIChjb25uZWN0aW9uLnN0YXRlICE9PSBjb25uZWN0aW9uLnN0YXRlcy5TRUxFQ1RFRCkge1xuICAgICAgICAvLyBub3RoaW5nIHRvIGRvIGhlcmVcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChjb25uZWN0aW9uLmNhcGFiaWxpdGllcy5oYXMoJ0lETEUnKSkge1xuICAgICAgICBsZXQgaWRsZVRpbWVyO1xuICAgICAgICBsZXQgc3RpbGxJZGxpbmcgPSBmYWxzZTtcbiAgICAgICAgbGV0IHJ1bklkbGVMb29wID0gYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgaWYgKG1heElkbGVUaW1lKSB7XG4gICAgICAgICAgICAgICAgaWRsZVRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjb25uZWN0aW9uLmlkbGluZykge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBjb25uZWN0aW9uLnByZUNoZWNrID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RpbGxJZGxpbmcgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlcXVlc3QgSURMRSBicmVhayBpZiBJRExFIGhhcyBiZWVuIHJ1bm5pbmcgZm9yIGFsbG93ZWQgdGltZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24ubG9nLnRyYWNlKHsgbXNnOiAnTWF4IGFsbG93ZWQgSURMRSB0aW1lIHJlYWNoZWQnLCBjaWQ6IGNvbm5lY3Rpb24uaWQgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbi5wcmVDaGVjaygpLmNhdGNoKGVyciA9PiBjb25uZWN0aW9uLmxvZy53YXJuKHsgZXJyLCBjaWQ6IGNvbm5lY3Rpb24uaWQgfSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSwgbWF4SWRsZVRpbWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IHJlc3AgPSBhd2FpdCBydW5JZGxlKGNvbm5lY3Rpb24pO1xuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KGlkbGVUaW1lcik7XG4gICAgICAgICAgICBpZiAoc3RpbGxJZGxpbmcpIHtcbiAgICAgICAgICAgICAgICBzdGlsbElkbGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHJldHVybiBydW5JZGxlTG9vcCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlc3A7XG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBydW5JZGxlTG9vcCgpO1xuICAgIH1cblxuICAgIGxldCBpZGxlVGltZXI7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xuICAgICAgICBpZiAoIWNvbm5lY3Rpb24uY3VycmVudFNlbGVjdENvbW1hbmQpIHtcbiAgICAgICAgICAgIHJldHVybiByZXNvbHZlKCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBubyBJRExFIHN1cHBvcnQsIGZhbGxiYWNrIHRvIE5PT1AnaW5nXG4gICAgICAgIGNvbm5lY3Rpb24ucHJlQ2hlY2sgPSBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBjb25uZWN0aW9uLnByZUNoZWNrID0gZmFsc2U7IC8vIHVuc2V0IGl0c2VsZlxuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KGlkbGVUaW1lcik7XG4gICAgICAgICAgICBjb25uZWN0aW9uLmxvZy5kZWJ1Zyh7IHNyYzogJ2MnLCBtc2c6IGBicmVha2luZyBOT09QIGxvb3BgIH0pO1xuICAgICAgICAgICAgY29ubmVjdGlvbi5pZGxpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgfTtcblxuICAgICAgICBsZXQgc2VsZWN0Q29tbWFuZCA9IGNvbm5lY3Rpb24uY3VycmVudFNlbGVjdENvbW1hbmQ7XG5cbiAgICAgICAgbGV0IGlkbGVDaGVjayA9IGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIGxldCByZXNwb25zZTtcbiAgICAgICAgICAgIHN3aXRjaCAoY29ubmVjdGlvbi5taXNzaW5nSWRsZUNvbW1hbmQpIHtcbiAgICAgICAgICAgICAgICBjYXNlICdTRUxFQ1QnOlxuICAgICAgICAgICAgICAgICAgICAvLyBGSVhNRTogc29tZWhvdyBhIGxvb3Agb2NjdXJzIGFmdGVyIHNvbWUgdGltZSBvZiBpZGxpbmcgd2l0aCBTRUxFQ1RcbiAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbi5sb2cuZGVidWcoeyBzcmM6ICdjJywgbXNnOiBgUnVubmluZyBTRUxFQ1QgdG8gZGV0ZWN0IGNoYW5nZXMgaW4gZm9sZGVyYCB9KTtcbiAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UgPSBhd2FpdCBjb25uZWN0aW9uLmV4ZWMoc2VsZWN0Q29tbWFuZC5jb21tYW5kLCBzZWxlY3RDb21tYW5kLmFyZ3VtZW50cyk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgY2FzZSAnU1RBVFVTJzpcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHN0YXR1c0FyZ3MgPSBbc2VsZWN0Q29tbWFuZC5hcmd1bWVudHNbMF0sIFtdXTsgLy8gcGF0aFxuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQga2V5IG9mIFsnTUVTU0FHRVMnLCAnVUlETkVYVCcsICdVSURWQUxJRElUWScsICdVTlNFRU4nXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1c0FyZ3NbMV0ucHVzaCh7IHR5cGU6ICdBVE9NJywgdmFsdWU6IGtleS50b1VwcGVyQ2FzZSgpIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbi5sb2cuZGVidWcoeyBzcmM6ICdjJywgbXNnOiBgUnVubmluZyBTVEFUVVMgdG8gZGV0ZWN0IGNoYW5nZXMgaW4gZm9sZGVyYCB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlID0gYXdhaXQgY29ubmVjdGlvbi5leGVjKCdTVEFUVVMnLCBzdGF0dXNBcmdzKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgIGNhc2UgJ05PT1AnOlxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlID0gYXdhaXQgY29ubmVjdGlvbi5leGVjKCdOT09QJywgZmFsc2UsIHsgY29tbWVudDogJ0lETEUgbm90IHN1cHBvcnRlZCcgfSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVzcG9uc2UubmV4dCgpO1xuICAgICAgICB9O1xuXG4gICAgICAgIGxldCBub29wSW50ZXJ2YWwgPSBtYXhJZGxlVGltZSA/IE1hdGgubWluKE5PT1BfSU5URVJWQUwsIG1heElkbGVUaW1lKSA6IE5PT1BfSU5URVJWQUw7XG5cbiAgICAgICAgbGV0IHJ1bkxvb3AgPSAoKSA9PiB7XG4gICAgICAgICAgICBpZGxlQ2hlY2soKVxuICAgICAgICAgICAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KGlkbGVUaW1lcik7XG4gICAgICAgICAgICAgICAgICAgIGlkbGVUaW1lciA9IHNldFRpbWVvdXQocnVuTG9vcCwgbm9vcEludGVydmFsKTtcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC5jYXRjaChlcnIgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQoaWRsZVRpbWVyKTtcbiAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbi5wcmVDaGVjayA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uLmxvZy53YXJuKHsgZXJyLCBjaWQ6IGNvbm5lY3Rpb24uaWQgfSk7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgfTtcblxuICAgICAgICBjb25uZWN0aW9uLmxvZy5kZWJ1Zyh7IHNyYzogJ2MnLCBtc2c6IGBpbml0aWF0ZWQgTk9PUCBsb29wYCB9KTtcbiAgICAgICAgY29ubmVjdGlvbi5pZGxpbmcgPSB0cnVlO1xuICAgICAgICBydW5Mb29wKCk7XG4gICAgfSk7XG59O1xuIl0sIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6WzBdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(rsc)/./node_modules/imapflow/lib/commands/idle.js\n");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "(rsc)/./node_modules/imapflow/lib/commands/list.js":
|
|
/*!****************************************************!*\
|
|
!*** ./node_modules/imapflow/lib/commands/list.js ***!
|
|
\****************************************************/
|
|
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
|
|
|
|
eval("\n\nconst { decodePath, encodePath, normalizePath } = __webpack_require__(/*! ../tools.js */ \"(rsc)/./node_modules/imapflow/lib/tools.js\");\nconst { specialUse } = __webpack_require__(/*! ../special-use */ \"(rsc)/./node_modules/imapflow/lib/special-use.js\");\n\n// Lists mailboxes from server\nmodule.exports = async (connection, reference, mailbox, options) => {\n options = options || {};\n\n const FLAG_SORT_ORDER = ['\\\\Inbox', '\\\\Flagged', '\\\\Sent', '\\\\Drafts', '\\\\All', '\\\\Archive', '\\\\Junk', '\\\\Trash'];\n const SOURCE_SORT_ORDER = ['user', 'extension', 'name'];\n\n let listCommand = connection.capabilities.has('XLIST') && !connection.capabilities.has('SPECIAL-USE') ? 'XLIST' : 'LIST';\n\n let response;\n try {\n let entries = [];\n\n let statusMap = new Map();\n let returnArgs = [];\n let statusQueryAttributes = [];\n\n if (options.statusQuery) {\n Object.keys(options.statusQuery || {}).forEach(key => {\n if (!options.statusQuery[key]) {\n return;\n }\n\n switch (key.toUpperCase()) {\n case 'MESSAGES':\n case 'RECENT':\n case 'UIDNEXT':\n case 'UIDVALIDITY':\n case 'UNSEEN':\n statusQueryAttributes.push({ type: 'ATOM', value: key.toUpperCase() });\n break;\n\n case 'HIGHESTMODSEQ':\n if (connection.capabilities.has('CONDSTORE')) {\n statusQueryAttributes.push({ type: 'ATOM', value: key.toUpperCase() });\n }\n break;\n }\n });\n }\n\n if (listCommand === 'LIST' && connection.capabilities.has('LIST-STATUS') && statusQueryAttributes.length) {\n returnArgs.push({ type: 'ATOM', value: 'STATUS' }, statusQueryAttributes);\n if (connection.capabilities.has('SPECIAL-USE')) {\n returnArgs.push({ type: 'ATOM', value: 'SPECIAL-USE' });\n }\n }\n\n let specialUseMatches = {};\n let addSpecialUseMatch = (entry, type, source) => {\n if (!specialUseMatches[type]) {\n specialUseMatches[type] = [];\n }\n specialUseMatches[type].push({ entry, source });\n };\n\n let specialUseHints = {};\n if (options.specialUseHints && typeof options.specialUseHints === 'object') {\n for (let type of Object.keys(options.specialUseHints)) {\n if (\n ['sent', 'junk', 'trash', 'drafts', 'archive'].includes(type) &&\n options.specialUseHints[type] &&\n typeof options.specialUseHints[type] === 'string'\n ) {\n specialUseHints[normalizePath(connection, options.specialUseHints[type])] = `\\\\${type.replace(/^./, c => c.toUpperCase())}`;\n }\n }\n }\n\n let runList = async (reference, mailbox) => {\n const cmdArgs = [encodePath(connection, reference), encodePath(connection, mailbox)];\n\n if (returnArgs.length) {\n cmdArgs.push({ type: 'ATOM', value: 'RETURN' }, returnArgs);\n }\n\n response = await connection.exec(listCommand, cmdArgs, {\n untagged: {\n [listCommand]: async untagged => {\n if (!untagged.attributes || !untagged.attributes.length) {\n return;\n }\n\n let entry = {\n path: normalizePath(connection, decodePath(connection, (untagged.attributes[2] && untagged.attributes[2].value) || '')),\n pathAsListed: (untagged.attributes[2] && untagged.attributes[2].value) || '',\n flags: new Set(untagged.attributes[0].map(entry => entry.value)),\n delimiter: untagged.attributes[1] && untagged.attributes[1].value,\n listed: true\n };\n\n if (specialUseHints[entry.path]) {\n addSpecialUseMatch(entry, specialUseHints[entry.path], 'user');\n }\n\n if (listCommand === 'XLIST' && entry.flags.has('\\\\Inbox')) {\n // XLIST specific flag, ignore\n entry.flags.delete('\\\\Inbox');\n if (entry.path !== 'INBOX') {\n // XLIST may use localised inbox name\n addSpecialUseMatch(entry, '\\\\Inbox', 'extension');\n }\n }\n\n if (entry.path.toUpperCase() === 'INBOX') {\n addSpecialUseMatch(entry, '\\\\Inbox', 'name');\n }\n\n if (entry.delimiter && entry.path.charAt(0) === entry.delimiter) {\n entry.path = entry.path.slice(1);\n }\n\n entry.parentPath = entry.delimiter && entry.path ? entry.path.substr(0, entry.path.lastIndexOf(entry.delimiter)) : '';\n entry.parent = entry.delimiter ? entry.path.split(entry.delimiter) : [entry.path];\n entry.name = entry.parent.pop();\n\n let { flag: specialUseFlag, source: flagSource } = specialUse(\n connection.capabilities.has('XLIST') || connection.capabilities.has('SPECIAL-USE'),\n entry\n );\n\n if (specialUseFlag) {\n addSpecialUseMatch(entry, specialUseFlag, flagSource);\n }\n\n entries.push(entry);\n },\n\n STATUS: async untagged => {\n let statusPath = normalizePath(connection, decodePath(connection, (untagged.attributes[0] && untagged.attributes[0].value) || ''));\n let statusList = untagged.attributes && Array.isArray(untagged.attributes[1]) ? untagged.attributes[1] : false;\n if (!statusList || !statusPath) {\n return;\n }\n\n let key;\n\n let map = { path: statusPath };\n\n statusList.forEach((entry, i) => {\n if (i % 2 === 0) {\n key = entry && typeof entry.value === 'string' ? entry.value : false;\n return;\n }\n if (!key || !entry || typeof entry.value !== 'string') {\n return;\n }\n let value = false;\n switch (key.toUpperCase()) {\n case 'MESSAGES':\n key = 'messages';\n value = !isNaN(entry.value) ? Number(entry.value) : false;\n break;\n\n case 'RECENT':\n key = 'recent';\n value = !isNaN(entry.value) ? Number(entry.value) : false;\n break;\n\n case 'UIDNEXT':\n key = 'uidNext';\n value = !isNaN(entry.value) ? Number(entry.value) : false;\n break;\n\n case 'UIDVALIDITY':\n key = 'uidValidity';\n value = !isNaN(entry.value) ? BigInt(entry.value) : false;\n break;\n\n case 'UNSEEN':\n key = 'unseen';\n value = !isNaN(entry.value) ? Number(entry.value) : false;\n break;\n\n case 'HIGHESTMODSEQ':\n key = 'highestModseq';\n value = !isNaN(entry.value) ? BigInt(entry.value) : false;\n break;\n }\n if (value === false) {\n return;\n }\n\n map[key] = value;\n });\n\n statusMap.set(statusPath, map);\n }\n }\n });\n response.next();\n };\n\n let normalizedReference = normalizePath(connection, reference || '');\n await runList(normalizedReference, normalizePath(connection, mailbox || '', true));\n\n if (options.listOnly) {\n return entries;\n }\n\n if (normalizedReference && !specialUseMatches['\\\\Inbox']) {\n // INBOX was most probably not included in the listing if namespace was used\n await runList('', 'INBOX');\n }\n\n if (options.statusQuery) {\n for (let entry of entries) {\n if (!entry.flags.has('\\\\Noselect') && !entry.flags.has('\\\\NonExistent')) {\n if (statusMap.has(entry.path)) {\n entry.status = statusMap.get(entry.path);\n } else if (!statusMap.size) {\n // run STATUS command\n try {\n entry.status = await connection.run('STATUS', entry.path, options.statusQuery);\n } catch (err) {\n entry.status = { error: err };\n }\n }\n }\n }\n }\n\n response = await connection.exec(\n 'LSUB',\n [encodePath(connection, normalizePath(connection, reference || '')), encodePath(connection, normalizePath(connection, mailbox || '', true))],\n {\n untagged: {\n LSUB: async untagged => {\n if (!untagged.attributes || !untagged.attributes.length) {\n return;\n }\n\n let entry = {\n path: normalizePath(connection, decodePath(connection, (untagged.attributes[2] && untagged.attributes[2].value) || '')),\n pathAsListed: (untagged.attributes[2] && untagged.attributes[2].value) || '',\n flags: new Set(untagged.attributes[0].map(entry => entry.value)),\n delimiter: untagged.attributes[1] && untagged.attributes[1].value,\n subscribed: true\n };\n\n if (entry.path.toUpperCase() === 'INBOX') {\n addSpecialUseMatch(entry, '\\\\Inbox', 'name');\n }\n\n if (entry.delimiter && entry.path.charAt(0) === entry.delimiter) {\n entry.path = entry.path.slice(1);\n }\n\n entry.parentPath = entry.delimiter && entry.path ? entry.path.substr(0, entry.path.lastIndexOf(entry.delimiter)) : '';\n entry.parent = entry.delimiter ? entry.path.split(entry.delimiter) : [entry.path];\n entry.name = entry.parent.pop();\n\n let existing = entries.find(existing => existing.path === entry.path);\n if (existing) {\n existing.subscribed = true;\n entry.flags.forEach(flag => existing.flags.add(flag));\n } else {\n // ignore non-listed folders\n /*\n let specialUseFlag = specialUse(connection.capabilities.has('XLIST') || connection.capabilities.has('SPECIAL-USE'), entry);\n if (specialUseFlag && !flagsSeen.has(specialUseFlag)) {\n entry.specialUse = specialUseFlag;\n }\n entries.push(entry);\n */\n }\n }\n }\n }\n );\n response.next();\n\n for (let type of Object.keys(specialUseMatches)) {\n let sortedEntries = specialUseMatches[type].sort((a, b) => {\n let aSource = SOURCE_SORT_ORDER.indexOf(a.source);\n let bSource = SOURCE_SORT_ORDER.indexOf(b.source);\n if (aSource === bSource) {\n return a.entry.path.localeCompare(b.entry.path);\n }\n return aSource - bSource;\n });\n\n if (!sortedEntries[0].entry.specialUse) {\n sortedEntries[0].entry.specialUse = type;\n sortedEntries[0].entry.specialUseSource = sortedEntries[0].source;\n }\n }\n\n let inboxEntry = entries.find(entry => entry.specialUse === '\\\\Inbox');\n if (inboxEntry && !inboxEntry.subscribed) {\n // override server settings and make INBOX always as subscribed\n inboxEntry.subscribed = true;\n }\n\n return entries.sort((a, b) => {\n if (a.specialUse && !b.specialUse) {\n return -1;\n }\n if (!a.specialUse && b.specialUse) {\n return 1;\n }\n if (a.specialUse && b.specialUse) {\n return FLAG_SORT_ORDER.indexOf(a.specialUse) - FLAG_SORT_ORDER.indexOf(b.specialUse);\n }\n\n let aList = [].concat(a.parent).concat(a.name);\n let bList = [].concat(b.parent).concat(b.name);\n\n for (let i = 0; i < aList.length; i++) {\n let aPart = aList[i];\n let bPart = bList[i];\n if (aPart !== bPart) {\n return aPart.localeCompare(bPart || '');\n }\n }\n\n return a.path.localeCompare(b.path);\n });\n } catch (err) {\n connection.log.warn({ msg: 'Failed to list folders', err, cid: connection.id });\n throw err;\n }\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHJzYykvLi9ub2RlX21vZHVsZXMvaW1hcGZsb3cvbGliL2NvbW1hbmRzL2xpc3QuanMiLCJtYXBwaW5ncyI6IkFBQWE7O0FBRWIsUUFBUSx3Q0FBd0MsRUFBRSxtQkFBTyxDQUFDLCtEQUFhO0FBQ3ZFLFFBQVEsYUFBYSxFQUFFLG1CQUFPLENBQUMsd0VBQWdCOztBQUUvQztBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsaURBQWlEO0FBQ2pEO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxREFBcUQsd0NBQXdDO0FBQzdGOztBQUVBO0FBQ0E7QUFDQSx5REFBeUQsd0NBQXdDO0FBQ2pHO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjs7QUFFQTtBQUNBLDhCQUE4QiwrQkFBK0I7QUFDN0Q7QUFDQSxrQ0FBa0Msb0NBQW9DO0FBQ3RFO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJDQUEyQyxlQUFlO0FBQzFEOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxR0FBcUcseUNBQXlDO0FBQzlJO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0EsK0JBQStCLCtCQUErQjtBQUM5RDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEsOEJBQThCLDJDQUEyQztBQUN6RTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EscUJBQXFCOztBQUVyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUEsb0NBQW9DOztBQUVwQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSx5QkFBeUI7O0FBRXpCO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0I7QUFDdEI7QUFDQTtBQUNBO0FBQ0EsMEJBQTBCO0FBQzFCLDZDQUE2QztBQUM3QztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBCQUEwQjtBQUMxQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhOztBQUViO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBLDRCQUE0QixrQkFBa0I7QUFDOUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsU0FBUztBQUNULE1BQU07QUFDTiw4QkFBOEIsd0RBQXdEO0FBQ3RGO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsiL2hvbWUvYWxtYS9uZXh0Z2VuL05lYWgtbWFpbC9ub2RlX21vZHVsZXMvaW1hcGZsb3cvbGliL2NvbW1hbmRzL2xpc3QuanMiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCB7IGRlY29kZVBhdGgsIGVuY29kZVBhdGgsIG5vcm1hbGl6ZVBhdGggfSA9IHJlcXVpcmUoJy4uL3Rvb2xzLmpzJyk7XG5jb25zdCB7IHNwZWNpYWxVc2UgfSA9IHJlcXVpcmUoJy4uL3NwZWNpYWwtdXNlJyk7XG5cbi8vIExpc3RzIG1haWxib3hlcyBmcm9tIHNlcnZlclxubW9kdWxlLmV4cG9ydHMgPSBhc3luYyAoY29ubmVjdGlvbiwgcmVmZXJlbmNlLCBtYWlsYm94LCBvcHRpb25zKSA9PiB7XG4gICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cbiAgICBjb25zdCBGTEFHX1NPUlRfT1JERVIgPSBbJ1xcXFxJbmJveCcsICdcXFxcRmxhZ2dlZCcsICdcXFxcU2VudCcsICdcXFxcRHJhZnRzJywgJ1xcXFxBbGwnLCAnXFxcXEFyY2hpdmUnLCAnXFxcXEp1bmsnLCAnXFxcXFRyYXNoJ107XG4gICAgY29uc3QgU09VUkNFX1NPUlRfT1JERVIgPSBbJ3VzZXInLCAnZXh0ZW5zaW9uJywgJ25hbWUnXTtcblxuICAgIGxldCBsaXN0Q29tbWFuZCA9IGNvbm5lY3Rpb24uY2FwYWJpbGl0aWVzLmhhcygnWExJU1QnKSAmJiAhY29ubmVjdGlvbi5jYXBhYmlsaXRpZXMuaGFzKCdTUEVDSUFMLVVTRScpID8gJ1hMSVNUJyA6ICdMSVNUJztcblxuICAgIGxldCByZXNwb25zZTtcbiAgICB0cnkge1xuICAgICAgICBsZXQgZW50cmllcyA9IFtdO1xuXG4gICAgICAgIGxldCBzdGF0dXNNYXAgPSBuZXcgTWFwKCk7XG4gICAgICAgIGxldCByZXR1cm5BcmdzID0gW107XG4gICAgICAgIGxldCBzdGF0dXNRdWVyeUF0dHJpYnV0ZXMgPSBbXTtcblxuICAgICAgICBpZiAob3B0aW9ucy5zdGF0dXNRdWVyeSkge1xuICAgICAgICAgICAgT2JqZWN0LmtleXMob3B0aW9ucy5zdGF0dXNRdWVyeSB8fCB7fSkuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghb3B0aW9ucy5zdGF0dXNRdWVyeVtrZXldKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBzd2l0Y2ggKGtleS50b1VwcGVyQ2FzZSgpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ01FU1NBR0VTJzpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnUkVDRU5UJzpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnVUlETkVYVCc6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ1VJRFZBTElESVRZJzpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnVU5TRUVOJzpcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1c1F1ZXJ5QXR0cmlidXRlcy5wdXNoKHsgdHlwZTogJ0FUT00nLCB2YWx1ZToga2V5LnRvVXBwZXJDYXNlKCkgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgICAgICBjYXNlICdISUdIRVNUTU9EU0VRJzpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb25uZWN0aW9uLmNhcGFiaWxpdGllcy5oYXMoJ0NPTkRTVE9SRScpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzUXVlcnlBdHRyaWJ1dGVzLnB1c2goeyB0eXBlOiAnQVRPTScsIHZhbHVlOiBrZXkudG9VcHBlckNhc2UoKSB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGxpc3RDb21tYW5kID09PSAnTElTVCcgJiYgY29ubmVjdGlvbi5jYXBhYmlsaXRpZXMuaGFzKCdMSVNULVNUQVRVUycpICYmIHN0YXR1c1F1ZXJ5QXR0cmlidXRlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybkFyZ3MucHVzaCh7IHR5cGU6ICdBVE9NJywgdmFsdWU6ICdTVEFUVVMnIH0sIHN0YXR1c1F1ZXJ5QXR0cmlidXRlcyk7XG4gICAgICAgICAgICBpZiAoY29ubmVjdGlvbi5jYXBhYmlsaXRpZXMuaGFzKCdTUEVDSUFMLVVTRScpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuQXJncy5wdXNoKHsgdHlwZTogJ0FUT00nLCB2YWx1ZTogJ1NQRUNJQUwtVVNFJyB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBzcGVjaWFsVXNlTWF0Y2hlcyA9IHt9O1xuICAgICAgICBsZXQgYWRkU3BlY2lhbFVzZU1hdGNoID0gKGVudHJ5LCB0eXBlLCBzb3VyY2UpID0+IHtcbiAgICAgICAgICAgIGlmICghc3BlY2lhbFVzZU1hdGNoZXNbdHlwZV0pIHtcbiAgICAgICAgICAgICAgICBzcGVjaWFsVXNlTWF0Y2hlc1t0eXBlXSA9IFtdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc3BlY2lhbFVzZU1hdGNoZXNbdHlwZV0ucHVzaCh7IGVudHJ5LCBzb3VyY2UgfSk7XG4gICAgICAgIH07XG5cbiAgICAgICAgbGV0IHNwZWNpYWxVc2VIaW50cyA9IHt9O1xuICAgICAgICBpZiAob3B0aW9ucy5zcGVjaWFsVXNlSGludHMgJiYgdHlwZW9mIG9wdGlvbnMuc3BlY2lhbFVzZUhpbnRzID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgZm9yIChsZXQgdHlwZSBvZiBPYmplY3Qua2V5cyhvcHRpb25zLnNwZWNpYWxVc2VIaW50cykpIHtcbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgIFsnc2VudCcsICdqdW5rJywgJ3RyYXNoJywgJ2RyYWZ0cycsICdhcmNoaXZlJ10uaW5jbHVkZXModHlwZSkgJiZcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5zcGVjaWFsVXNlSGludHNbdHlwZV0gJiZcbiAgICAgICAgICAgICAgICAgICAgdHlwZW9mIG9wdGlvbnMuc3BlY2lhbFVzZUhpbnRzW3R5cGVdID09PSAnc3RyaW5nJ1xuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICBzcGVjaWFsVXNlSGludHNbbm9ybWFsaXplUGF0aChjb25uZWN0aW9uLCBvcHRpb25zLnNwZWNpYWxVc2VIaW50c1t0eXBlXSldID0gYFxcXFwke3R5cGUucmVwbGFjZSgvXi4vLCBjID0+IGMudG9VcHBlckNhc2UoKSl9YDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgcnVuTGlzdCA9IGFzeW5jIChyZWZlcmVuY2UsIG1haWxib3gpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGNtZEFyZ3MgPSBbZW5jb2RlUGF0aChjb25uZWN0aW9uLCByZWZlcmVuY2UpLCBlbmNvZGVQYXRoKGNvbm5lY3Rpb24sIG1haWxib3gpXTtcblxuICAgICAgICAgICAgaWYgKHJldHVybkFyZ3MubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgY21kQXJncy5wdXNoKHsgdHlwZTogJ0FUT00nLCB2YWx1ZTogJ1JFVFVSTicgfSwgcmV0dXJuQXJncyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJlc3BvbnNlID0gYXdhaXQgY29ubmVjdGlvbi5leGVjKGxpc3RDb21tYW5kLCBjbWRBcmdzLCB7XG4gICAgICAgICAgICAgICAgdW50YWdnZWQ6IHtcbiAgICAgICAgICAgICAgICAgICAgW2xpc3RDb21tYW5kXTogYXN5bmMgdW50YWdnZWQgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF1bnRhZ2dlZC5hdHRyaWJ1dGVzIHx8ICF1bnRhZ2dlZC5hdHRyaWJ1dGVzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGVudHJ5ID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGg6IG5vcm1hbGl6ZVBhdGgoY29ubmVjdGlvbiwgZGVjb2RlUGF0aChjb25uZWN0aW9uLCAodW50YWdnZWQuYXR0cmlidXRlc1syXSAmJiB1bnRhZ2dlZC5hdHRyaWJ1dGVzWzJdLnZhbHVlKSB8fCAnJykpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGhBc0xpc3RlZDogKHVudGFnZ2VkLmF0dHJpYnV0ZXNbMl0gJiYgdW50YWdnZWQuYXR0cmlidXRlc1syXS52YWx1ZSkgfHwgJycsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3M6IG5ldyBTZXQodW50YWdnZWQuYXR0cmlidXRlc1swXS5tYXAoZW50cnkgPT4gZW50cnkudmFsdWUpKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxpbWl0ZXI6IHVudGFnZ2VkLmF0dHJpYnV0ZXNbMV0gJiYgdW50YWdnZWQuYXR0cmlidXRlc1sxXS52YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0ZWQ6IHRydWVcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzcGVjaWFsVXNlSGludHNbZW50cnkucGF0aF0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRTcGVjaWFsVXNlTWF0Y2goZW50cnksIHNwZWNpYWxVc2VIaW50c1tlbnRyeS5wYXRoXSwgJ3VzZXInKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxpc3RDb21tYW5kID09PSAnWExJU1QnICYmIGVudHJ5LmZsYWdzLmhhcygnXFxcXEluYm94JykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBYTElTVCBzcGVjaWZpYyBmbGFnLCBpZ25vcmVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeS5mbGFncy5kZWxldGUoJ1xcXFxJbmJveCcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbnRyeS5wYXRoICE9PSAnSU5CT1gnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFhMSVNUIG1heSB1c2UgbG9jYWxpc2VkIGluYm94IG5hbWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkU3BlY2lhbFVzZU1hdGNoKGVudHJ5LCAnXFxcXEluYm94JywgJ2V4dGVuc2lvbicpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVudHJ5LnBhdGgudG9VcHBlckNhc2UoKSA9PT0gJ0lOQk9YJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZFNwZWNpYWxVc2VNYXRjaChlbnRyeSwgJ1xcXFxJbmJveCcsICduYW1lJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbnRyeS5kZWxpbWl0ZXIgJiYgZW50cnkucGF0aC5jaGFyQXQoMCkgPT09IGVudHJ5LmRlbGltaXRlcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5LnBhdGggPSBlbnRyeS5wYXRoLnNsaWNlKDEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBlbnRyeS5wYXJlbnRQYXRoID0gZW50cnkuZGVsaW1pdGVyICYmIGVudHJ5LnBhdGggPyBlbnRyeS5wYXRoLnN1YnN0cigwLCBlbnRyeS5wYXRoLmxhc3RJbmRleE9mKGVudHJ5LmRlbGltaXRlcikpIDogJyc7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbnRyeS5wYXJlbnQgPSBlbnRyeS5kZWxpbWl0ZXIgPyBlbnRyeS5wYXRoLnNwbGl0KGVudHJ5LmRlbGltaXRlcikgOiBbZW50cnkucGF0aF07XG4gICAgICAgICAgICAgICAgICAgICAgICBlbnRyeS5uYW1lID0gZW50cnkucGFyZW50LnBvcCgpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgeyBmbGFnOiBzcGVjaWFsVXNlRmxhZywgc291cmNlOiBmbGFnU291cmNlIH0gPSBzcGVjaWFsVXNlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24uY2FwYWJpbGl0aWVzLmhhcygnWExJU1QnKSB8fCBjb25uZWN0aW9uLmNhcGFiaWxpdGllcy5oYXMoJ1NQRUNJQUwtVVNFJyksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cnlcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzcGVjaWFsVXNlRmxhZykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZFNwZWNpYWxVc2VNYXRjaChlbnRyeSwgc3BlY2lhbFVzZUZsYWcsIGZsYWdTb3VyY2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBlbnRyaWVzLnB1c2goZW50cnkpO1xuICAgICAgICAgICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICAgICAgICAgIFNUQVRVUzogYXN5bmMgdW50YWdnZWQgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHN0YXR1c1BhdGggPSBub3JtYWxpemVQYXRoKGNvbm5lY3Rpb24sIGRlY29kZVBhdGgoY29ubmVjdGlvbiwgKHVudGFnZ2VkLmF0dHJpYnV0ZXNbMF0gJiYgdW50YWdnZWQuYXR0cmlidXRlc1swXS52YWx1ZSkgfHwgJycpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzdGF0dXNMaXN0ID0gdW50YWdnZWQuYXR0cmlidXRlcyAmJiBBcnJheS5pc0FycmF5KHVudGFnZ2VkLmF0dHJpYnV0ZXNbMV0pID8gdW50YWdnZWQuYXR0cmlidXRlc1sxXSA6IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzdGF0dXNMaXN0IHx8ICFzdGF0dXNQYXRoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQga2V5O1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgbWFwID0geyBwYXRoOiBzdGF0dXNQYXRoIH07XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1c0xpc3QuZm9yRWFjaCgoZW50cnksIGkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaSAlIDIgPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5ID0gZW50cnkgJiYgdHlwZW9mIGVudHJ5LnZhbHVlID09PSAnc3RyaW5nJyA/IGVudHJ5LnZhbHVlIDogZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFrZXkgfHwgIWVudHJ5IHx8IHR5cGVvZiBlbnRyeS52YWx1ZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgdmFsdWUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGtleS50b1VwcGVyQ2FzZSgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ01FU1NBR0VTJzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleSA9ICdtZXNzYWdlcyc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9ICFpc05hTihlbnRyeS52YWx1ZSkgPyBOdW1iZXIoZW50cnkudmFsdWUpIDogZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdSRUNFTlQnOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5ID0gJ3JlY2VudCc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9ICFpc05hTihlbnRyeS52YWx1ZSkgPyBOdW1iZXIoZW50cnkudmFsdWUpIDogZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdVSURORVhUJzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleSA9ICd1aWROZXh0JztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gIWlzTmFOKGVudHJ5LnZhbHVlKSA/IE51bWJlcihlbnRyeS52YWx1ZSkgOiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ1VJRFZBTElESVRZJzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleSA9ICd1aWRWYWxpZGl0eSc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9ICFpc05hTihlbnRyeS52YWx1ZSkgPyBCaWdJbnQoZW50cnkudmFsdWUpIDogZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdVTlNFRU4nOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5ID0gJ3Vuc2Vlbic7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9ICFpc05hTihlbnRyeS52YWx1ZSkgPyBOdW1iZXIoZW50cnkudmFsdWUpIDogZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdISUdIRVNUTU9EU0VRJzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleSA9ICdoaWdoZXN0TW9kc2VxJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gIWlzTmFOKGVudHJ5LnZhbHVlKSA/IEJpZ0ludChlbnRyeS52YWx1ZSkgOiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXBba2V5XSA9IHZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1c01hcC5zZXQoc3RhdHVzUGF0aCwgbWFwKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmVzcG9uc2UubmV4dCgpO1xuICAgICAgICB9O1xuXG4gICAgICAgIGxldCBub3JtYWxpemVkUmVmZXJlbmNlID0gbm9ybWFsaXplUGF0aChjb25uZWN0aW9uLCByZWZlcmVuY2UgfHwgJycpO1xuICAgICAgICBhd2FpdCBydW5MaXN0KG5vcm1hbGl6ZWRSZWZlcmVuY2UsIG5vcm1hbGl6ZVBhdGgoY29ubmVjdGlvbiwgbWFpbGJveCB8fCAnJywgdHJ1ZSkpO1xuXG4gICAgICAgIGlmIChvcHRpb25zLmxpc3RPbmx5KSB7XG4gICAgICAgICAgICByZXR1cm4gZW50cmllcztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChub3JtYWxpemVkUmVmZXJlbmNlICYmICFzcGVjaWFsVXNlTWF0Y2hlc1snXFxcXEluYm94J10pIHtcbiAgICAgICAgICAgIC8vIElOQk9YIHdhcyBtb3N0IHByb2JhYmx5IG5vdCBpbmNsdWRlZCBpbiB0aGUgbGlzdGluZyBpZiBuYW1lc3BhY2Ugd2FzIHVzZWRcbiAgICAgICAgICAgIGF3YWl0IHJ1bkxpc3QoJycsICdJTkJPWCcpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG9wdGlvbnMuc3RhdHVzUXVlcnkpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGVudHJ5IG9mIGVudHJpZXMpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWVudHJ5LmZsYWdzLmhhcygnXFxcXE5vc2VsZWN0JykgJiYgIWVudHJ5LmZsYWdzLmhhcygnXFxcXE5vbkV4aXN0ZW50JykpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1c01hcC5oYXMoZW50cnkucGF0aCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5LnN0YXR1cyA9IHN0YXR1c01hcC5nZXQoZW50cnkucGF0aCk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIXN0YXR1c01hcC5zaXplKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBydW4gU1RBVFVTIGNvbW1hbmRcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cnkuc3RhdHVzID0gYXdhaXQgY29ubmVjdGlvbi5ydW4oJ1NUQVRVUycsIGVudHJ5LnBhdGgsIG9wdGlvbnMuc3RhdHVzUXVlcnkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cnkuc3RhdHVzID0geyBlcnJvcjogZXJyIH07XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXNwb25zZSA9IGF3YWl0IGNvbm5lY3Rpb24uZXhlYyhcbiAgICAgICAgICAgICdMU1VCJyxcbiAgICAgICAgICAgIFtlbmNvZGVQYXRoKGNvbm5lY3Rpb24sIG5vcm1hbGl6ZVBhdGgoY29ubmVjdGlvbiwgcmVmZXJlbmNlIHx8ICcnKSksIGVuY29kZVBhdGgoY29ubmVjdGlvbiwgbm9ybWFsaXplUGF0aChjb25uZWN0aW9uLCBtYWlsYm94IHx8ICcnLCB0cnVlKSldLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHVudGFnZ2VkOiB7XG4gICAgICAgICAgICAgICAgICAgIExTVUI6IGFzeW5jIHVudGFnZ2VkID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdW50YWdnZWQuYXR0cmlidXRlcyB8fCAhdW50YWdnZWQuYXR0cmlidXRlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBlbnRyeSA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRoOiBub3JtYWxpemVQYXRoKGNvbm5lY3Rpb24sIGRlY29kZVBhdGgoY29ubmVjdGlvbiwgKHVudGFnZ2VkLmF0dHJpYnV0ZXNbMl0gJiYgdW50YWdnZWQuYXR0cmlidXRlc1syXS52YWx1ZSkgfHwgJycpKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRoQXNMaXN0ZWQ6ICh1bnRhZ2dlZC5hdHRyaWJ1dGVzWzJdICYmIHVudGFnZ2VkLmF0dHJpYnV0ZXNbMl0udmFsdWUpIHx8ICcnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzOiBuZXcgU2V0KHVudGFnZ2VkLmF0dHJpYnV0ZXNbMF0ubWFwKGVudHJ5ID0+IGVudHJ5LnZhbHVlKSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsaW1pdGVyOiB1bnRhZ2dlZC5hdHRyaWJ1dGVzWzFdICYmIHVudGFnZ2VkLmF0dHJpYnV0ZXNbMV0udmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Vic2NyaWJlZDogdHJ1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVudHJ5LnBhdGgudG9VcHBlckNhc2UoKSA9PT0gJ0lOQk9YJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZFNwZWNpYWxVc2VNYXRjaChlbnRyeSwgJ1xcXFxJbmJveCcsICduYW1lJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbnRyeS5kZWxpbWl0ZXIgJiYgZW50cnkucGF0aC5jaGFyQXQoMCkgPT09IGVudHJ5LmRlbGltaXRlcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5LnBhdGggPSBlbnRyeS5wYXRoLnNsaWNlKDEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBlbnRyeS5wYXJlbnRQYXRoID0gZW50cnkuZGVsaW1pdGVyICYmIGVudHJ5LnBhdGggPyBlbnRyeS5wYXRoLnN1YnN0cigwLCBlbnRyeS5wYXRoLmxhc3RJbmRleE9mKGVudHJ5LmRlbGltaXRlcikpIDogJyc7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbnRyeS5wYXJlbnQgPSBlbnRyeS5kZWxpbWl0ZXIgPyBlbnRyeS5wYXRoLnNwbGl0KGVudHJ5LmRlbGltaXRlcikgOiBbZW50cnkucGF0aF07XG4gICAgICAgICAgICAgICAgICAgICAgICBlbnRyeS5uYW1lID0gZW50cnkucGFyZW50LnBvcCgpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgZXhpc3RpbmcgPSBlbnRyaWVzLmZpbmQoZXhpc3RpbmcgPT4gZXhpc3RpbmcucGF0aCA9PT0gZW50cnkucGF0aCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXhpc3RpbmcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGlzdGluZy5zdWJzY3JpYmVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeS5mbGFncy5mb3JFYWNoKGZsYWcgPT4gZXhpc3RpbmcuZmxhZ3MuYWRkKGZsYWcpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlIG5vbi1saXN0ZWQgZm9sZGVyc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHNwZWNpYWxVc2VGbGFnID0gc3BlY2lhbFVzZShjb25uZWN0aW9uLmNhcGFiaWxpdGllcy5oYXMoJ1hMSVNUJykgfHwgY29ubmVjdGlvbi5jYXBhYmlsaXRpZXMuaGFzKCdTUEVDSUFMLVVTRScpLCBlbnRyeSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNwZWNpYWxVc2VGbGFnICYmICFmbGFnc1NlZW4uaGFzKHNwZWNpYWxVc2VGbGFnKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeS5zcGVjaWFsVXNlID0gc3BlY2lhbFVzZUZsYWc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJpZXMucHVzaChlbnRyeSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICAgICAgcmVzcG9uc2UubmV4dCgpO1xuXG4gICAgICAgIGZvciAobGV0IHR5cGUgb2YgT2JqZWN0LmtleXMoc3BlY2lhbFVzZU1hdGNoZXMpKSB7XG4gICAgICAgICAgICBsZXQgc29ydGVkRW50cmllcyA9IHNwZWNpYWxVc2VNYXRjaGVzW3R5cGVdLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgICAgICAgICAgICBsZXQgYVNvdXJjZSA9IFNPVVJDRV9TT1JUX09SREVSLmluZGV4T2YoYS5zb3VyY2UpO1xuICAgICAgICAgICAgICAgIGxldCBiU291cmNlID0gU09VUkNFX1NPUlRfT1JERVIuaW5kZXhPZihiLnNvdXJjZSk7XG4gICAgICAgICAgICAgICAgaWYgKGFTb3VyY2UgPT09IGJTb3VyY2UpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGEuZW50cnkucGF0aC5sb2NhbGVDb21wYXJlKGIuZW50cnkucGF0aCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBhU291cmNlIC0gYlNvdXJjZTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBpZiAoIXNvcnRlZEVudHJpZXNbMF0uZW50cnkuc3BlY2lhbFVzZSkge1xuICAgICAgICAgICAgICAgIHNvcnRlZEVudHJpZXNbMF0uZW50cnkuc3BlY2lhbFVzZSA9IHR5cGU7XG4gICAgICAgICAgICAgICAgc29ydGVkRW50cmllc1swXS5lbnRyeS5zcGVjaWFsVXNlU291cmNlID0gc29ydGVkRW50cmllc1swXS5zb3VyY2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgaW5ib3hFbnRyeSA9IGVudHJpZXMuZmluZChlbnRyeSA9PiBlbnRyeS5zcGVjaWFsVXNlID09PSAnXFxcXEluYm94Jyk7XG4gICAgICAgIGlmIChpbmJveEVudHJ5ICYmICFpbmJveEVudHJ5LnN1YnNjcmliZWQpIHtcbiAgICAgICAgICAgIC8vIG92ZXJyaWRlIHNlcnZlciBzZXR0aW5ncyBhbmQgbWFrZSBJTkJPWCBhbHdheXMgYXMgc3Vic2NyaWJlZFxuICAgICAgICAgICAgaW5ib3hFbnRyeS5zdWJzY3JpYmVkID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBlbnRyaWVzLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgICAgICAgIGlmIChhLnNwZWNpYWxVc2UgJiYgIWIuc3BlY2lhbFVzZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiAtMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghYS5zcGVjaWFsVXNlICYmIGIuc3BlY2lhbFVzZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiAxO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGEuc3BlY2lhbFVzZSAmJiBiLnNwZWNpYWxVc2UpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gRkxBR19TT1JUX09SREVSLmluZGV4T2YoYS5zcGVjaWFsVXNlKSAtIEZMQUdfU09SVF9PUkRFUi5pbmRleE9mKGIuc3BlY2lhbFVzZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxldCBhTGlzdCA9IFtdLmNvbmNhdChhLnBhcmVudCkuY29uY2F0KGEubmFtZSk7XG4gICAgICAgICAgICBsZXQgYkxpc3QgPSBbXS5jb25jYXQoYi5wYXJlbnQpLmNvbmNhdChiLm5hbWUpO1xuXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFMaXN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IGFQYXJ0ID0gYUxpc3RbaV07XG4gICAgICAgICAgICAgICAgbGV0IGJQYXJ0ID0gYkxpc3RbaV07XG4gICAgICAgICAgICAgICAgaWYgKGFQYXJ0ICE9PSBiUGFydCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYVBhcnQubG9jYWxlQ29tcGFyZShiUGFydCB8fCAnJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gYS5wYXRoLmxvY2FsZUNvbXBhcmUoYi5wYXRoKTtcbiAgICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGNvbm5lY3Rpb24ubG9nLndhcm4oeyBtc2c6ICdGYWlsZWQgdG8gbGlzdCBmb2xkZXJzJywgZXJyLCBjaWQ6IGNvbm5lY3Rpb24uaWQgfSk7XG4gICAgICAgIHRocm93IGVycjtcbiAgICB9XG59O1xuIl0sIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6WzBdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(rsc)/./node_modules/imapflow/lib/commands/list.js\n");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "(rsc)/./node_modules/imapflow/lib/commands/login.js":
|
|
/*!*****************************************************!*\
|
|
!*** ./node_modules/imapflow/lib/commands/login.js ***!
|
|
\*****************************************************/
|
|
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
|
|
|
|
eval("\n\nconst { getStatusCode, getErrorText } = __webpack_require__(/*! ../tools.js */ \"(rsc)/./node_modules/imapflow/lib/tools.js\");\n\n// Authenticates user using LOGIN\nmodule.exports = async (connection, username, password) => {\n if (connection.state !== connection.states.NOT_AUTHENTICATED) {\n // nothing to do here\n return;\n }\n\n try {\n let response = await connection.exec('LOGIN', [\n { type: 'STRING', value: username },\n { type: 'STRING', value: password, sensitive: true }\n ]);\n response.next();\n\n connection.authCapabilities.set('LOGIN', true);\n\n return username;\n } catch (err) {\n let errorCode = getStatusCode(err.response);\n if (errorCode) {\n err.serverResponseCode = errorCode;\n }\n err.authenticationFailed = true;\n err.response = await getErrorText(err.response);\n throw err;\n }\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHJzYykvLi9ub2RlX21vZHVsZXMvaW1hcGZsb3cvbGliL2NvbW1hbmRzL2xvZ2luLmpzIiwibWFwcGluZ3MiOiJBQUFhOztBQUViLFFBQVEsOEJBQThCLEVBQUUsbUJBQU8sQ0FBQywrREFBYTs7QUFFN0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxjQUFjLGlDQUFpQztBQUMvQyxjQUFjO0FBQ2Q7QUFDQTs7QUFFQTs7QUFFQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIi9ob21lL2FsbWEvbmV4dGdlbi9OZWFoLW1haWwvbm9kZV9tb2R1bGVzL2ltYXBmbG93L2xpYi9jb21tYW5kcy9sb2dpbi5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbmNvbnN0IHsgZ2V0U3RhdHVzQ29kZSwgZ2V0RXJyb3JUZXh0IH0gPSByZXF1aXJlKCcuLi90b29scy5qcycpO1xuXG4vLyBBdXRoZW50aWNhdGVzIHVzZXIgdXNpbmcgTE9HSU5cbm1vZHVsZS5leHBvcnRzID0gYXN5bmMgKGNvbm5lY3Rpb24sIHVzZXJuYW1lLCBwYXNzd29yZCkgPT4ge1xuICAgIGlmIChjb25uZWN0aW9uLnN0YXRlICE9PSBjb25uZWN0aW9uLnN0YXRlcy5OT1RfQVVUSEVOVElDQVRFRCkge1xuICAgICAgICAvLyBub3RoaW5nIHRvIGRvIGhlcmVcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICAgIGxldCByZXNwb25zZSA9IGF3YWl0IGNvbm5lY3Rpb24uZXhlYygnTE9HSU4nLCBbXG4gICAgICAgICAgICB7IHR5cGU6ICdTVFJJTkcnLCB2YWx1ZTogdXNlcm5hbWUgfSxcbiAgICAgICAgICAgIHsgdHlwZTogJ1NUUklORycsIHZhbHVlOiBwYXNzd29yZCwgc2Vuc2l0aXZlOiB0cnVlIH1cbiAgICAgICAgXSk7XG4gICAgICAgIHJlc3BvbnNlLm5leHQoKTtcblxuICAgICAgICBjb25uZWN0aW9uLmF1dGhDYXBhYmlsaXRpZXMuc2V0KCdMT0dJTicsIHRydWUpO1xuXG4gICAgICAgIHJldHVybiB1c2VybmFtZTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgbGV0IGVycm9yQ29kZSA9IGdldFN0YXR1c0NvZGUoZXJyLnJlc3BvbnNlKTtcbiAgICAgICAgaWYgKGVycm9yQ29kZSkge1xuICAgICAgICAgICAgZXJyLnNlcnZlclJlc3BvbnNlQ29kZSA9IGVycm9yQ29kZTtcbiAgICAgICAgfVxuICAgICAgICBlcnIuYXV0aGVudGljYXRpb25GYWlsZWQgPSB0cnVlO1xuICAgICAgICBlcnIucmVzcG9uc2UgPSBhd2FpdCBnZXRFcnJvclRleHQoZXJyLnJlc3BvbnNlKTtcbiAgICAgICAgdGhyb3cgZXJyO1xuICAgIH1cbn07XG4iXSwibmFtZXMiOltdLCJpZ25vcmVMaXN0IjpbMF0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(rsc)/./node_modules/imapflow/lib/commands/login.js\n");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "(rsc)/./node_modules/imapflow/lib/commands/logout.js":
|
|
/*!******************************************************!*\
|
|
!*** ./node_modules/imapflow/lib/commands/logout.js ***!
|
|
\******************************************************/
|
|
/***/ ((module) => {
|
|
|
|
eval("\n\n// Logs out user and closes connection\nmodule.exports = async connection => {\n if (connection.state === connection.states.LOGOUT) {\n // nothing to do here\n return false;\n }\n\n if (connection.state === connection.states.NOT_AUTHENTICATED) {\n connection.state = connection.states.LOGOUT;\n connection.close();\n return false;\n }\n\n let response;\n try {\n response = await connection.exec('LOGOUT');\n return true;\n } catch (err) {\n if (err.code === 'NoConnection') {\n return true;\n }\n connection.log.warn({ err, cid: connection.id });\n return false;\n } finally {\n // close even if command failed\n connection.state = connection.states.LOGOUT;\n if (response && typeof response.next === 'function') {\n response.next();\n }\n connection.close();\n }\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHJzYykvLi9ub2RlX21vZHVsZXMvaW1hcGZsb3cvbGliL2NvbW1hbmRzL2xvZ291dC5qcyIsIm1hcHBpbmdzIjoiQUFBYTs7QUFFYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQSw4QkFBOEIseUJBQXlCO0FBQ3ZEO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIi9ob21lL2FsbWEvbmV4dGdlbi9OZWFoLW1haWwvbm9kZV9tb2R1bGVzL2ltYXBmbG93L2xpYi9jb21tYW5kcy9sb2dvdXQuanMiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG4vLyBMb2dzIG91dCB1c2VyIGFuZCBjbG9zZXMgY29ubmVjdGlvblxubW9kdWxlLmV4cG9ydHMgPSBhc3luYyBjb25uZWN0aW9uID0+IHtcbiAgICBpZiAoY29ubmVjdGlvbi5zdGF0ZSA9PT0gY29ubmVjdGlvbi5zdGF0ZXMuTE9HT1VUKSB7XG4gICAgICAgIC8vIG5vdGhpbmcgdG8gZG8gaGVyZVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKGNvbm5lY3Rpb24uc3RhdGUgPT09IGNvbm5lY3Rpb24uc3RhdGVzLk5PVF9BVVRIRU5USUNBVEVEKSB7XG4gICAgICAgIGNvbm5lY3Rpb24uc3RhdGUgPSBjb25uZWN0aW9uLnN0YXRlcy5MT0dPVVQ7XG4gICAgICAgIGNvbm5lY3Rpb24uY2xvc2UoKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGxldCByZXNwb25zZTtcbiAgICB0cnkge1xuICAgICAgICByZXNwb25zZSA9IGF3YWl0IGNvbm5lY3Rpb24uZXhlYygnTE9HT1VUJyk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBpZiAoZXJyLmNvZGUgPT09ICdOb0Nvbm5lY3Rpb24nKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBjb25uZWN0aW9uLmxvZy53YXJuKHsgZXJyLCBjaWQ6IGNvbm5lY3Rpb24uaWQgfSk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgICAvLyBjbG9zZSBldmVuIGlmIGNvbW1hbmQgZmFpbGVkXG4gICAgICAgIGNvbm5lY3Rpb24uc3RhdGUgPSBjb25uZWN0aW9uLnN0YXRlcy5MT0dPVVQ7XG4gICAgICAgIGlmIChyZXNwb25zZSAmJiB0eXBlb2YgcmVzcG9uc2UubmV4dCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgcmVzcG9uc2UubmV4dCgpO1xuICAgICAgICB9XG4gICAgICAgIGNvbm5lY3Rpb24uY2xvc2UoKTtcbiAgICB9XG59O1xuIl0sIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6WzBdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(rsc)/./node_modules/imapflow/lib/commands/logout.js\n");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "(rsc)/./node_modules/imapflow/lib/commands/move.js":
|
|
/*!****************************************************!*\
|
|
!*** ./node_modules/imapflow/lib/commands/move.js ***!
|
|
\****************************************************/
|
|
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
|
|
|
|
eval("\n\nconst { getStatusCode, normalizePath, encodePath, expandRange, getErrorText } = __webpack_require__(/*! ../tools.js */ \"(rsc)/./node_modules/imapflow/lib/tools.js\");\n\n// Moves messages from current mailbox to some other mailbox\nmodule.exports = async (connection, range, destination, options) => {\n if (connection.state !== connection.states.SELECTED || !range || !destination) {\n // nothing to do here\n return;\n }\n\n options = options || {};\n destination = normalizePath(connection, destination);\n\n let attributes = [\n { type: 'SEQUENCE', value: range },\n { type: 'ATOM', value: encodePath(connection, destination) }\n ];\n\n let map = { path: connection.mailbox.path, destination };\n\n if (!connection.capabilities.has('MOVE')) {\n let result = await connection.messageCopy(range, destination, options);\n await connection.messageDelete(range, Object.assign({ silent: true }, options));\n return result;\n }\n\n let checkMoveInfo = response => {\n let section = response.attributes && response.attributes[0] && response.attributes[0].section;\n let responseCode = section && section.length && section[0] && typeof section[0].value === 'string' ? section[0].value : '';\n switch (responseCode) {\n case 'COPYUID':\n {\n let uidValidity = section[1] && typeof section[1].value === 'string' && !isNaN(section[1].value) ? BigInt(section[1].value) : false;\n if (uidValidity) {\n map.uidValidity = uidValidity;\n }\n\n let sourceUids = section[2] && typeof section[2].value === 'string' ? expandRange(section[2].value) : false;\n let destinationUids = section[3] && typeof section[3].value === 'string' ? expandRange(section[3].value) : false;\n if (sourceUids && destinationUids && sourceUids.length === destinationUids.length) {\n map.uidMap = new Map(sourceUids.map((uid, i) => [uid, destinationUids[i]]));\n }\n }\n break;\n }\n };\n\n let response;\n try {\n response = await connection.exec(options.uid ? 'UID MOVE' : 'MOVE', attributes, {\n untagged: {\n OK: async untagged => {\n checkMoveInfo(untagged);\n }\n }\n });\n response.next();\n\n checkMoveInfo(response.response);\n return map;\n } catch (err) {\n let errorCode = getStatusCode(err.response);\n if (errorCode) {\n err.serverResponseCode = errorCode;\n }\n err.response = await getErrorText(err.response);\n\n connection.log.warn({ err, cid: connection.id });\n return false;\n }\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHJzYykvLi9ub2RlX21vZHVsZXMvaW1hcGZsb3cvbGliL2NvbW1hbmRzL21vdmUuanMiLCJtYXBwaW5ncyI6IkFBQWE7O0FBRWIsUUFBUSxzRUFBc0UsRUFBRSxtQkFBTyxDQUFDLCtEQUFhOztBQUVyRztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLFVBQVUsZ0NBQWdDO0FBQzFDLFVBQVU7QUFDVjs7QUFFQSxnQkFBZ0I7O0FBRWhCO0FBQ0E7QUFDQSw4REFBOEQsY0FBYztBQUM1RTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUOztBQUVBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSw4QkFBOEIseUJBQXlCO0FBQ3ZEO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsiL2hvbWUvYWxtYS9uZXh0Z2VuL05lYWgtbWFpbC9ub2RlX21vZHVsZXMvaW1hcGZsb3cvbGliL2NvbW1hbmRzL21vdmUuanMiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCB7IGdldFN0YXR1c0NvZGUsIG5vcm1hbGl6ZVBhdGgsIGVuY29kZVBhdGgsIGV4cGFuZFJhbmdlLCBnZXRFcnJvclRleHQgfSA9IHJlcXVpcmUoJy4uL3Rvb2xzLmpzJyk7XG5cbi8vIE1vdmVzIG1lc3NhZ2VzIGZyb20gY3VycmVudCBtYWlsYm94IHRvIHNvbWUgb3RoZXIgbWFpbGJveFxubW9kdWxlLmV4cG9ydHMgPSBhc3luYyAoY29ubmVjdGlvbiwgcmFuZ2UsIGRlc3RpbmF0aW9uLCBvcHRpb25zKSA9PiB7XG4gICAgaWYgKGNvbm5lY3Rpb24uc3RhdGUgIT09IGNvbm5lY3Rpb24uc3RhdGVzLlNFTEVDVEVEIHx8ICFyYW5nZSB8fCAhZGVzdGluYXRpb24pIHtcbiAgICAgICAgLy8gbm90aGluZyB0byBkbyBoZXJlXG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgICBkZXN0aW5hdGlvbiA9IG5vcm1hbGl6ZVBhdGgoY29ubmVjdGlvbiwgZGVzdGluYXRpb24pO1xuXG4gICAgbGV0IGF0dHJpYnV0ZXMgPSBbXG4gICAgICAgIHsgdHlwZTogJ1NFUVVFTkNFJywgdmFsdWU6IHJhbmdlIH0sXG4gICAgICAgIHsgdHlwZTogJ0FUT00nLCB2YWx1ZTogZW5jb2RlUGF0aChjb25uZWN0aW9uLCBkZXN0aW5hdGlvbikgfVxuICAgIF07XG5cbiAgICBsZXQgbWFwID0geyBwYXRoOiBjb25uZWN0aW9uLm1haWxib3gucGF0aCwgZGVzdGluYXRpb24gfTtcblxuICAgIGlmICghY29ubmVjdGlvbi5jYXBhYmlsaXRpZXMuaGFzKCdNT1ZFJykpIHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IGF3YWl0IGNvbm5lY3Rpb24ubWVzc2FnZUNvcHkocmFuZ2UsIGRlc3RpbmF0aW9uLCBvcHRpb25zKTtcbiAgICAgICAgYXdhaXQgY29ubmVjdGlvbi5tZXNzYWdlRGVsZXRlKHJhbmdlLCBPYmplY3QuYXNzaWduKHsgc2lsZW50OiB0cnVlIH0sIG9wdGlvbnMpKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICBsZXQgY2hlY2tNb3ZlSW5mbyA9IHJlc3BvbnNlID0+IHtcbiAgICAgICAgbGV0IHNlY3Rpb24gPSByZXNwb25zZS5hdHRyaWJ1dGVzICYmIHJlc3BvbnNlLmF0dHJpYnV0ZXNbMF0gJiYgcmVzcG9uc2UuYXR0cmlidXRlc1swXS5zZWN0aW9uO1xuICAgICAgICBsZXQgcmVzcG9uc2VDb2RlID0gc2VjdGlvbiAmJiBzZWN0aW9uLmxlbmd0aCAmJiBzZWN0aW9uWzBdICYmIHR5cGVvZiBzZWN0aW9uWzBdLnZhbHVlID09PSAnc3RyaW5nJyA/IHNlY3Rpb25bMF0udmFsdWUgOiAnJztcbiAgICAgICAgc3dpdGNoIChyZXNwb25zZUNvZGUpIHtcbiAgICAgICAgICAgIGNhc2UgJ0NPUFlVSUQnOlxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHVpZFZhbGlkaXR5ID0gc2VjdGlvblsxXSAmJiB0eXBlb2Ygc2VjdGlvblsxXS52YWx1ZSA9PT0gJ3N0cmluZycgJiYgIWlzTmFOKHNlY3Rpb25bMV0udmFsdWUpID8gQmlnSW50KHNlY3Rpb25bMV0udmFsdWUpIDogZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIGlmICh1aWRWYWxpZGl0eSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbWFwLnVpZFZhbGlkaXR5ID0gdWlkVmFsaWRpdHk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBsZXQgc291cmNlVWlkcyA9IHNlY3Rpb25bMl0gJiYgdHlwZW9mIHNlY3Rpb25bMl0udmFsdWUgPT09ICdzdHJpbmcnID8gZXhwYW5kUmFuZ2Uoc2VjdGlvblsyXS52YWx1ZSkgOiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGRlc3RpbmF0aW9uVWlkcyA9IHNlY3Rpb25bM10gJiYgdHlwZW9mIHNlY3Rpb25bM10udmFsdWUgPT09ICdzdHJpbmcnID8gZXhwYW5kUmFuZ2Uoc2VjdGlvblszXS52YWx1ZSkgOiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNvdXJjZVVpZHMgJiYgZGVzdGluYXRpb25VaWRzICYmIHNvdXJjZVVpZHMubGVuZ3RoID09PSBkZXN0aW5hdGlvblVpZHMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtYXAudWlkTWFwID0gbmV3IE1hcChzb3VyY2VVaWRzLm1hcCgodWlkLCBpKSA9PiBbdWlkLCBkZXN0aW5hdGlvblVpZHNbaV1dKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgbGV0IHJlc3BvbnNlO1xuICAgIHRyeSB7XG4gICAgICAgIHJlc3BvbnNlID0gYXdhaXQgY29ubmVjdGlvbi5leGVjKG9wdGlvbnMudWlkID8gJ1VJRCBNT1ZFJyA6ICdNT1ZFJywgYXR0cmlidXRlcywge1xuICAgICAgICAgICAgdW50YWdnZWQ6IHtcbiAgICAgICAgICAgICAgICBPSzogYXN5bmMgdW50YWdnZWQgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjaGVja01vdmVJbmZvKHVudGFnZ2VkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICByZXNwb25zZS5uZXh0KCk7XG5cbiAgICAgICAgY2hlY2tNb3ZlSW5mbyhyZXNwb25zZS5yZXNwb25zZSk7XG4gICAgICAgIHJldHVybiBtYXA7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGxldCBlcnJvckNvZGUgPSBnZXRTdGF0dXNDb2RlKGVyci5yZXNwb25zZSk7XG4gICAgICAgIGlmIChlcnJvckNvZGUpIHtcbiAgICAgICAgICAgIGVyci5zZXJ2ZXJSZXNwb25zZUNvZGUgPSBlcnJvckNvZGU7XG4gICAgICAgIH1cbiAgICAgICAgZXJyLnJlc3BvbnNlID0gYXdhaXQgZ2V0RXJyb3JUZXh0KGVyci5yZXNwb25zZSk7XG5cbiAgICAgICAgY29ubmVjdGlvbi5sb2cud2Fybih7IGVyciwgY2lkOiBjb25uZWN0aW9uLmlkIH0pO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxufTtcbiJdLCJuYW1lcyI6W10sImlnbm9yZUxpc3QiOlswXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(rsc)/./node_modules/imapflow/lib/commands/move.js\n");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "(rsc)/./node_modules/imapflow/lib/commands/namespace.js":
|
|
/*!*********************************************************!*\
|
|
!*** ./node_modules/imapflow/lib/commands/namespace.js ***!
|
|
\*********************************************************/
|
|
/***/ ((module) => {
|
|
|
|
eval("\n\n// Requests NAMESPACE info from server\nmodule.exports = async connection => {\n if (![connection.states.AUTHENTICATED, connection.states.SELECTED].includes(connection.state)) {\n // nothing to do here\n return;\n }\n\n if (!connection.capabilities.has('NAMESPACE')) {\n // try to derive from listing\n let { prefix, delimiter } = await getListPrefix(connection);\n if (delimiter && prefix && prefix.charAt(prefix.length - 1) !== delimiter) {\n prefix += delimiter;\n }\n let map = {\n personal: [{ prefix: prefix || '', delimiter }],\n other: false,\n shared: false\n };\n connection.namespaces = map;\n connection.namespace = connection.namespaces.personal[0];\n return connection.namespace;\n }\n\n let response;\n try {\n let map = {};\n response = await connection.exec('NAMESPACE', false, {\n untagged: {\n NAMESPACE: async untagged => {\n if (!untagged.attributes || !untagged.attributes.length) {\n return;\n }\n map.personal = getNamsepaceInfo(untagged.attributes[0]);\n map.other = getNamsepaceInfo(untagged.attributes[1]);\n map.shared = getNamsepaceInfo(untagged.attributes[2]);\n }\n }\n });\n connection.namespaces = map;\n\n // make sure that we have the first personal namespace always set\n if (!connection.namespaces.personal[0]) {\n connection.namespaces.personal[0] = { prefix: '', delimiter: '.' };\n }\n connection.namespaces.personal[0].prefix = connection.namespaces.personal[0].prefix || '';\n response.next();\n\n connection.namespace = connection.namespaces.personal[0];\n\n return connection.namespace;\n } catch (err) {\n connection.log.warn({ err, cid: connection.id });\n return {\n error: true,\n status: err.responseStatus,\n text: err.responseText\n };\n }\n};\n\nasync function getListPrefix(connection) {\n let response;\n try {\n let map = {};\n response = await connection.exec('LIST', ['', ''], {\n untagged: {\n LIST: async untagged => {\n if (!untagged.attributes || !untagged.attributes.length) {\n return;\n }\n\n map.flags = new Set(untagged.attributes[0].map(entry => entry.value));\n map.delimiter = untagged.attributes[1] && untagged.attributes[1].value;\n map.prefix = (untagged.attributes[2] && untagged.attributes[2].value) || '';\n if (map.delimiter && map.prefix.charAt(0) === map.delimiter) {\n map.prefix = map.prefix.slice(1);\n }\n }\n }\n });\n response.next();\n return map;\n } catch (err) {\n connection.log.warn({ err, cid: connection.id });\n return {};\n }\n}\n\nfunction getNamsepaceInfo(attribute) {\n if (!attribute || !attribute.length) {\n return false;\n }\n\n return attribute\n .filter(entry => entry.length >= 2 && typeof entry[0].value === 'string' && typeof entry[1].value === 'string')\n .map(entry => {\n let prefix = entry[0].value;\n let delimiter = entry[1].value;\n\n if (delimiter && prefix && prefix.charAt(prefix.length - 1) !== delimiter) {\n prefix += delimiter;\n }\n return { prefix, delimiter };\n });\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHJzYykvLi9ub2RlX21vZHVsZXMvaW1hcGZsb3cvbGliL2NvbW1hbmRzL25hbWVzcGFjZS5qcyIsIm1hcHBpbmdzIjoiQUFBYTs7QUFFYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGNBQWMsb0JBQW9CO0FBQ2xDO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUJBQXlCLGlDQUFpQztBQUMxRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUOztBQUVBO0FBQ0E7QUFDQSxrREFBa0Q7QUFDbEQ7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0EsTUFBTTtBQUNOLDhCQUE4Qix5QkFBeUI7QUFDdkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsTUFBTTtBQUNOLDhCQUE4Qix5QkFBeUI7QUFDdkQ7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCLFNBQVM7QUFDVCIsInNvdXJjZXMiOlsiL2hvbWUvYWxtYS9uZXh0Z2VuL05lYWgtbWFpbC9ub2RlX21vZHVsZXMvaW1hcGZsb3cvbGliL2NvbW1hbmRzL25hbWVzcGFjZS5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbi8vIFJlcXVlc3RzIE5BTUVTUEFDRSBpbmZvIGZyb20gc2VydmVyXG5tb2R1bGUuZXhwb3J0cyA9IGFzeW5jIGNvbm5lY3Rpb24gPT4ge1xuICAgIGlmICghW2Nvbm5lY3Rpb24uc3RhdGVzLkFVVEhFTlRJQ0FURUQsIGNvbm5lY3Rpb24uc3RhdGVzLlNFTEVDVEVEXS5pbmNsdWRlcyhjb25uZWN0aW9uLnN0YXRlKSkge1xuICAgICAgICAvLyBub3RoaW5nIHRvIGRvIGhlcmVcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICghY29ubmVjdGlvbi5jYXBhYmlsaXRpZXMuaGFzKCdOQU1FU1BBQ0UnKSkge1xuICAgICAgICAvLyB0cnkgdG8gZGVyaXZlIGZyb20gbGlzdGluZ1xuICAgICAgICBsZXQgeyBwcmVmaXgsIGRlbGltaXRlciB9ID0gYXdhaXQgZ2V0TGlzdFByZWZpeChjb25uZWN0aW9uKTtcbiAgICAgICAgaWYgKGRlbGltaXRlciAmJiBwcmVmaXggJiYgcHJlZml4LmNoYXJBdChwcmVmaXgubGVuZ3RoIC0gMSkgIT09IGRlbGltaXRlcikge1xuICAgICAgICAgICAgcHJlZml4ICs9IGRlbGltaXRlcjtcbiAgICAgICAgfVxuICAgICAgICBsZXQgbWFwID0ge1xuICAgICAgICAgICAgcGVyc29uYWw6IFt7IHByZWZpeDogcHJlZml4IHx8ICcnLCBkZWxpbWl0ZXIgfV0sXG4gICAgICAgICAgICBvdGhlcjogZmFsc2UsXG4gICAgICAgICAgICBzaGFyZWQ6IGZhbHNlXG4gICAgICAgIH07XG4gICAgICAgIGNvbm5lY3Rpb24ubmFtZXNwYWNlcyA9IG1hcDtcbiAgICAgICAgY29ubmVjdGlvbi5uYW1lc3BhY2UgPSBjb25uZWN0aW9uLm5hbWVzcGFjZXMucGVyc29uYWxbMF07XG4gICAgICAgIHJldHVybiBjb25uZWN0aW9uLm5hbWVzcGFjZTtcbiAgICB9XG5cbiAgICBsZXQgcmVzcG9uc2U7XG4gICAgdHJ5IHtcbiAgICAgICAgbGV0IG1hcCA9IHt9O1xuICAgICAgICByZXNwb25zZSA9IGF3YWl0IGNvbm5lY3Rpb24uZXhlYygnTkFNRVNQQUNFJywgZmFsc2UsIHtcbiAgICAgICAgICAgIHVudGFnZ2VkOiB7XG4gICAgICAgICAgICAgICAgTkFNRVNQQUNFOiBhc3luYyB1bnRhZ2dlZCA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghdW50YWdnZWQuYXR0cmlidXRlcyB8fCAhdW50YWdnZWQuYXR0cmlidXRlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBtYXAucGVyc29uYWwgPSBnZXROYW1zZXBhY2VJbmZvKHVudGFnZ2VkLmF0dHJpYnV0ZXNbMF0pO1xuICAgICAgICAgICAgICAgICAgICBtYXAub3RoZXIgPSBnZXROYW1zZXBhY2VJbmZvKHVudGFnZ2VkLmF0dHJpYnV0ZXNbMV0pO1xuICAgICAgICAgICAgICAgICAgICBtYXAuc2hhcmVkID0gZ2V0TmFtc2VwYWNlSW5mbyh1bnRhZ2dlZC5hdHRyaWJ1dGVzWzJdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBjb25uZWN0aW9uLm5hbWVzcGFjZXMgPSBtYXA7XG5cbiAgICAgICAgLy8gbWFrZSBzdXJlIHRoYXQgd2UgaGF2ZSB0aGUgZmlyc3QgcGVyc29uYWwgbmFtZXNwYWNlIGFsd2F5cyBzZXRcbiAgICAgICAgaWYgKCFjb25uZWN0aW9uLm5hbWVzcGFjZXMucGVyc29uYWxbMF0pIHtcbiAgICAgICAgICAgIGNvbm5lY3Rpb24ubmFtZXNwYWNlcy5wZXJzb25hbFswXSA9IHsgcHJlZml4OiAnJywgZGVsaW1pdGVyOiAnLicgfTtcbiAgICAgICAgfVxuICAgICAgICBjb25uZWN0aW9uLm5hbWVzcGFjZXMucGVyc29uYWxbMF0ucHJlZml4ID0gY29ubmVjdGlvbi5uYW1lc3BhY2VzLnBlcnNvbmFsWzBdLnByZWZpeCB8fCAnJztcbiAgICAgICAgcmVzcG9uc2UubmV4dCgpO1xuXG4gICAgICAgIGNvbm5lY3Rpb24ubmFtZXNwYWNlID0gY29ubmVjdGlvbi5uYW1lc3BhY2VzLnBlcnNvbmFsWzBdO1xuXG4gICAgICAgIHJldHVybiBjb25uZWN0aW9uLm5hbWVzcGFjZTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgY29ubmVjdGlvbi5sb2cud2Fybih7IGVyciwgY2lkOiBjb25uZWN0aW9uLmlkIH0pO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZXJyb3I6IHRydWUsXG4gICAgICAgICAgICBzdGF0dXM6IGVyci5yZXNwb25zZVN0YXR1cyxcbiAgICAgICAgICAgIHRleHQ6IGVyci5yZXNwb25zZVRleHRcbiAgICAgICAgfTtcbiAgICB9XG59O1xuXG5hc3luYyBmdW5jdGlvbiBnZXRMaXN0UHJlZml4KGNvbm5lY3Rpb24pIHtcbiAgICBsZXQgcmVzcG9uc2U7XG4gICAgdHJ5IHtcbiAgICAgICAgbGV0IG1hcCA9IHt9O1xuICAgICAgICByZXNwb25zZSA9IGF3YWl0IGNvbm5lY3Rpb24uZXhlYygnTElTVCcsIFsnJywgJyddLCB7XG4gICAgICAgICAgICB1bnRhZ2dlZDoge1xuICAgICAgICAgICAgICAgIExJU1Q6IGFzeW5jIHVudGFnZ2VkID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCF1bnRhZ2dlZC5hdHRyaWJ1dGVzIHx8ICF1bnRhZ2dlZC5hdHRyaWJ1dGVzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgbWFwLmZsYWdzID0gbmV3IFNldCh1bnRhZ2dlZC5hdHRyaWJ1dGVzWzBdLm1hcChlbnRyeSA9PiBlbnRyeS52YWx1ZSkpO1xuICAgICAgICAgICAgICAgICAgICBtYXAuZGVsaW1pdGVyID0gdW50YWdnZWQuYXR0cmlidXRlc1sxXSAmJiB1bnRhZ2dlZC5hdHRyaWJ1dGVzWzFdLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICBtYXAucHJlZml4ID0gKHVudGFnZ2VkLmF0dHJpYnV0ZXNbMl0gJiYgdW50YWdnZWQuYXR0cmlidXRlc1syXS52YWx1ZSkgfHwgJyc7XG4gICAgICAgICAgICAgICAgICAgIGlmIChtYXAuZGVsaW1pdGVyICYmIG1hcC5wcmVmaXguY2hhckF0KDApID09PSBtYXAuZGVsaW1pdGVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtYXAucHJlZml4ID0gbWFwLnByZWZpeC5zbGljZSgxKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJlc3BvbnNlLm5leHQoKTtcbiAgICAgICAgcmV0dXJuIG1hcDtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgY29ubmVjdGlvbi5sb2cud2Fybih7IGVyciwgY2lkOiBjb25uZWN0aW9uLmlkIH0pO1xuICAgICAgICByZXR1cm4ge307XG4gICAgfVxufVxuXG5mdW5jdGlvbiBnZXROYW1zZXBhY2VJbmZvKGF0dHJpYnV0ZSkge1xuICAgIGlmICghYXR0cmlidXRlIHx8ICFhdHRyaWJ1dGUubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICByZXR1cm4gYXR0cmlidXRlXG4gICAgICAgIC5maWx0ZXIoZW50cnkgPT4gZW50cnkubGVuZ3RoID49IDIgJiYgdHlwZW9mIGVudHJ5WzBdLnZhbHVlID09PSAnc3RyaW5nJyAmJiB0eXBlb2YgZW50cnlbMV0udmFsdWUgPT09ICdzdHJpbmcnKVxuICAgICAgICAubWFwKGVudHJ5ID0+IHtcbiAgICAgICAgICAgIGxldCBwcmVmaXggPSBlbnRyeVswXS52YWx1ZTtcbiAgICAgICAgICAgIGxldCBkZWxpbWl0ZXIgPSBlbnRyeVsxXS52YWx1ZTtcblxuICAgICAgICAgICAgaWYgKGRlbGltaXRlciAmJiBwcmVmaXggJiYgcHJlZml4LmNoYXJBdChwcmVmaXgubGVuZ3RoIC0gMSkgIT09IGRlbGltaXRlcikge1xuICAgICAgICAgICAgICAgIHByZWZpeCArPSBkZWxpbWl0ZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4geyBwcmVmaXgsIGRlbGltaXRlciB9O1xuICAgICAgICB9KTtcbn1cbiJdLCJuYW1lcyI6W10sImlnbm9yZUxpc3QiOlswXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(rsc)/./node_modules/imapflow/lib/commands/namespace.js\n");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "(rsc)/./node_modules/imapflow/lib/commands/noop.js":
|
|
/*!****************************************************!*\
|
|
!*** ./node_modules/imapflow/lib/commands/noop.js ***!
|
|
\****************************************************/
|
|
/***/ ((module) => {
|
|
|
|
eval("\n\n// Sends a NO-OP command\nmodule.exports = async connection => {\n try {\n let response = await connection.exec('NOOP', false, { comment: 'Requested by command' });\n response.next();\n return true;\n } catch (err) {\n connection.log.warn({ err, cid: connection.id });\n return false;\n }\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHJzYykvLi9ub2RlX21vZHVsZXMvaW1hcGZsb3cvbGliL2NvbW1hbmRzL25vb3AuanMiLCJtYXBwaW5ncyI6IkFBQWE7O0FBRWI7QUFDQTtBQUNBO0FBQ0EsOERBQThELGlDQUFpQztBQUMvRjtBQUNBO0FBQ0EsTUFBTTtBQUNOLDhCQUE4Qix5QkFBeUI7QUFDdkQ7QUFDQTtBQUNBIiwic291cmNlcyI6WyIvaG9tZS9hbG1hL25leHRnZW4vTmVhaC1tYWlsL25vZGVfbW9kdWxlcy9pbWFwZmxvdy9saWIvY29tbWFuZHMvbm9vcC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbi8vIFNlbmRzIGEgTk8tT1AgY29tbWFuZFxubW9kdWxlLmV4cG9ydHMgPSBhc3luYyBjb25uZWN0aW9uID0+IHtcbiAgICB0cnkge1xuICAgICAgICBsZXQgcmVzcG9uc2UgPSBhd2FpdCBjb25uZWN0aW9uLmV4ZWMoJ05PT1AnLCBmYWxzZSwgeyBjb21tZW50OiAnUmVxdWVzdGVkIGJ5IGNvbW1hbmQnIH0pO1xuICAgICAgICByZXNwb25zZS5uZXh0KCk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBjb25uZWN0aW9uLmxvZy53YXJuKHsgZXJyLCBjaWQ6IGNvbm5lY3Rpb24uaWQgfSk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG59O1xuIl0sIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6WzBdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(rsc)/./node_modules/imapflow/lib/commands/noop.js\n");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "(rsc)/./node_modules/imapflow/lib/commands/quota.js":
|
|
/*!*****************************************************!*\
|
|
!*** ./node_modules/imapflow/lib/commands/quota.js ***!
|
|
\*****************************************************/
|
|
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
|
|
|
|
eval("\n\nconst { encodePath, getStatusCode, normalizePath, getErrorText } = __webpack_require__(/*! ../tools.js */ \"(rsc)/./node_modules/imapflow/lib/tools.js\");\n\n// Requests quota information for a mailbox\nmodule.exports = async (connection, path) => {\n if (![connection.states.AUTHENTICATED, connection.states.SELECTED].includes(connection.state) || !path) {\n // nothing to do here\n return;\n }\n\n if (!connection.capabilities.has('QUOTA')) {\n return false;\n }\n\n path = normalizePath(connection, path);\n\n let map = { path };\n\n let processQuotaResponse = untagged => {\n let attributes = untagged.attributes && untagged.attributes[1];\n if (!attributes || !attributes.length) {\n return false;\n }\n\n let key = false;\n attributes.forEach((attribute, i) => {\n if (i % 3 === 0) {\n key = attribute && typeof attribute.value === 'string' ? attribute.value.toLowerCase() : false;\n return;\n }\n if (!key) {\n return;\n }\n\n let value = attribute && typeof attribute.value === 'string' && !isNaN(attribute.value) ? Number(attribute.value) : false;\n if (value === false) {\n return;\n }\n\n if (i % 3 === 1) {\n // usage\n if (!map[key]) {\n map[key] = {};\n }\n map[key].usage = value * (key === 'storage' ? 1024 : 1);\n }\n\n if (i % 3 === 2) {\n // limit\n if (!map[key]) {\n map[key] = {};\n }\n map[key].limit = value * (key === 'storage' ? 1024 : 1);\n\n if (map[key].limit) {\n map[key].status = Math.round(((map[key].usage || 0) / map[key].limit) * 100) + '%';\n }\n }\n });\n };\n\n let quotaFound = false;\n let response;\n try {\n response = await connection.exec('GETQUOTAROOT', [{ type: 'ATOM', value: encodePath(connection, path) }], {\n untagged: {\n QUOTAROOT: async untagged => {\n let quotaRoot =\n untagged.attributes && untagged.attributes[1] && typeof untagged.attributes[1].value === 'string'\n ? untagged.attributes[1].value\n : false;\n if (quotaRoot) {\n map.quotaRoot = quotaRoot;\n }\n },\n QUOTA: async untagged => {\n quotaFound = true;\n processQuotaResponse(untagged);\n }\n }\n });\n\n response.next();\n\n if (map.quotaRoot && !quotaFound) {\n response = await connection.exec('GETQUOTA', [{ type: 'ATOM', value: map.quotaRoot }], {\n untagged: {\n QUOTA: async untagged => {\n processQuotaResponse(untagged);\n }\n }\n });\n }\n\n return map;\n } catch (err) {\n let errorCode = getStatusCode(err.response);\n if (errorCode) {\n err.serverResponseCode = errorCode;\n }\n err.response = await getErrorText(err.response);\n\n connection.log.warn({ err, cid: connection.id });\n return false;\n }\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHJzYykvLi9ub2RlX21vZHVsZXMvaW1hcGZsb3cvbGliL2NvbW1hbmRzL3F1b3RhLmpzIiwibWFwcGluZ3MiOiJBQUFhOztBQUViLFFBQVEseURBQXlELEVBQUUsbUJBQU8sQ0FBQywrREFBYTs7QUFFeEY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQSxnQkFBZ0I7O0FBRWhCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDs7QUFFQTtBQUNBO0FBQ0E7QUFDQSw0REFBNEQsbURBQW1EO0FBQy9HO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDs7QUFFQTtBQUNBLDREQUE0RCxvQ0FBb0M7QUFDaEc7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjs7QUFFQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLDhCQUE4Qix5QkFBeUI7QUFDdkQ7QUFDQTtBQUNBIiwic291cmNlcyI6WyIvaG9tZS9hbG1hL25leHRnZW4vTmVhaC1tYWlsL25vZGVfbW9kdWxlcy9pbWFwZmxvdy9saWIvY29tbWFuZHMvcXVvdGEuanMiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCB7IGVuY29kZVBhdGgsIGdldFN0YXR1c0NvZGUsIG5vcm1hbGl6ZVBhdGgsIGdldEVycm9yVGV4dCB9ID0gcmVxdWlyZSgnLi4vdG9vbHMuanMnKTtcblxuLy8gUmVxdWVzdHMgcXVvdGEgaW5mb3JtYXRpb24gZm9yIGEgbWFpbGJveFxubW9kdWxlLmV4cG9ydHMgPSBhc3luYyAoY29ubmVjdGlvbiwgcGF0aCkgPT4ge1xuICAgIGlmICghW2Nvbm5lY3Rpb24uc3RhdGVzLkFVVEhFTlRJQ0FURUQsIGNvbm5lY3Rpb24uc3RhdGVzLlNFTEVDVEVEXS5pbmNsdWRlcyhjb25uZWN0aW9uLnN0YXRlKSB8fCAhcGF0aCkge1xuICAgICAgICAvLyBub3RoaW5nIHRvIGRvIGhlcmVcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICghY29ubmVjdGlvbi5jYXBhYmlsaXRpZXMuaGFzKCdRVU9UQScpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBwYXRoID0gbm9ybWFsaXplUGF0aChjb25uZWN0aW9uLCBwYXRoKTtcblxuICAgIGxldCBtYXAgPSB7IHBhdGggfTtcblxuICAgIGxldCBwcm9jZXNzUXVvdGFSZXNwb25zZSA9IHVudGFnZ2VkID0+IHtcbiAgICAgICAgbGV0IGF0dHJpYnV0ZXMgPSB1bnRhZ2dlZC5hdHRyaWJ1dGVzICYmIHVudGFnZ2VkLmF0dHJpYnV0ZXNbMV07XG4gICAgICAgIGlmICghYXR0cmlidXRlcyB8fCAhYXR0cmlidXRlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBrZXkgPSBmYWxzZTtcbiAgICAgICAgYXR0cmlidXRlcy5mb3JFYWNoKChhdHRyaWJ1dGUsIGkpID0+IHtcbiAgICAgICAgICAgIGlmIChpICUgMyA9PT0gMCkge1xuICAgICAgICAgICAgICAgIGtleSA9IGF0dHJpYnV0ZSAmJiB0eXBlb2YgYXR0cmlidXRlLnZhbHVlID09PSAnc3RyaW5nJyA/IGF0dHJpYnV0ZS52YWx1ZS50b0xvd2VyQ2FzZSgpIDogZmFsc2U7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFrZXkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxldCB2YWx1ZSA9IGF0dHJpYnV0ZSAmJiB0eXBlb2YgYXR0cmlidXRlLnZhbHVlID09PSAnc3RyaW5nJyAmJiAhaXNOYU4oYXR0cmlidXRlLnZhbHVlKSA/IE51bWJlcihhdHRyaWJ1dGUudmFsdWUpIDogZmFsc2U7XG4gICAgICAgICAgICBpZiAodmFsdWUgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoaSAlIDMgPT09IDEpIHtcbiAgICAgICAgICAgICAgICAvLyB1c2FnZVxuICAgICAgICAgICAgICAgIGlmICghbWFwW2tleV0pIHtcbiAgICAgICAgICAgICAgICAgICAgbWFwW2tleV0gPSB7fTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbWFwW2tleV0udXNhZ2UgPSB2YWx1ZSAqIChrZXkgPT09ICdzdG9yYWdlJyA/IDEwMjQgOiAxKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGkgJSAzID09PSAyKSB7XG4gICAgICAgICAgICAgICAgLy8gbGltaXRcbiAgICAgICAgICAgICAgICBpZiAoIW1hcFtrZXldKSB7XG4gICAgICAgICAgICAgICAgICAgIG1hcFtrZXldID0ge307XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIG1hcFtrZXldLmxpbWl0ID0gdmFsdWUgKiAoa2V5ID09PSAnc3RvcmFnZScgPyAxMDI0IDogMSk7XG5cbiAgICAgICAgICAgICAgICBpZiAobWFwW2tleV0ubGltaXQpIHtcbiAgICAgICAgICAgICAgICAgICAgbWFwW2tleV0uc3RhdHVzID0gTWF0aC5yb3VuZCgoKG1hcFtrZXldLnVzYWdlIHx8IDApIC8gbWFwW2tleV0ubGltaXQpICogMTAwKSArICclJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH07XG5cbiAgICBsZXQgcXVvdGFGb3VuZCA9IGZhbHNlO1xuICAgIGxldCByZXNwb25zZTtcbiAgICB0cnkge1xuICAgICAgICByZXNwb25zZSA9IGF3YWl0IGNvbm5lY3Rpb24uZXhlYygnR0VUUVVPVEFST09UJywgW3sgdHlwZTogJ0FUT00nLCB2YWx1ZTogZW5jb2RlUGF0aChjb25uZWN0aW9uLCBwYXRoKSB9XSwge1xuICAgICAgICAgICAgdW50YWdnZWQ6IHtcbiAgICAgICAgICAgICAgICBRVU9UQVJPT1Q6IGFzeW5jIHVudGFnZ2VkID0+IHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHF1b3RhUm9vdCA9XG4gICAgICAgICAgICAgICAgICAgICAgICB1bnRhZ2dlZC5hdHRyaWJ1dGVzICYmIHVudGFnZ2VkLmF0dHJpYnV0ZXNbMV0gJiYgdHlwZW9mIHVudGFnZ2VkLmF0dHJpYnV0ZXNbMV0udmFsdWUgPT09ICdzdHJpbmcnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyB1bnRhZ2dlZC5hdHRyaWJ1dGVzWzFdLnZhbHVlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHF1b3RhUm9vdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbWFwLnF1b3RhUm9vdCA9IHF1b3RhUm9vdDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgUVVPVEE6IGFzeW5jIHVudGFnZ2VkID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcXVvdGFGb3VuZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIHByb2Nlc3NRdW90YVJlc3BvbnNlKHVudGFnZ2VkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJlc3BvbnNlLm5leHQoKTtcblxuICAgICAgICBpZiAobWFwLnF1b3RhUm9vdCAmJiAhcXVvdGFGb3VuZCkge1xuICAgICAgICAgICAgcmVzcG9uc2UgPSBhd2FpdCBjb25uZWN0aW9uLmV4ZWMoJ0dFVFFVT1RBJywgW3sgdHlwZTogJ0FUT00nLCB2YWx1ZTogbWFwLnF1b3RhUm9vdCB9XSwge1xuICAgICAgICAgICAgICAgIHVudGFnZ2VkOiB7XG4gICAgICAgICAgICAgICAgICAgIFFVT1RBOiBhc3luYyB1bnRhZ2dlZCA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzUXVvdGFSZXNwb25zZSh1bnRhZ2dlZCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBtYXA7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGxldCBlcnJvckNvZGUgPSBnZXRTdGF0dXNDb2RlKGVyci5yZXNwb25zZSk7XG4gICAgICAgIGlmIChlcnJvckNvZGUpIHtcbiAgICAgICAgICAgIGVyci5zZXJ2ZXJSZXNwb25zZUNvZGUgPSBlcnJvckNvZGU7XG4gICAgICAgIH1cbiAgICAgICAgZXJyLnJlc3BvbnNlID0gYXdhaXQgZ2V0RXJyb3JUZXh0KGVyci5yZXNwb25zZSk7XG5cbiAgICAgICAgY29ubmVjdGlvbi5sb2cud2Fybih7IGVyciwgY2lkOiBjb25uZWN0aW9uLmlkIH0pO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxufTtcbiJdLCJuYW1lcyI6W10sImlnbm9yZUxpc3QiOlswXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(rsc)/./node_modules/imapflow/lib/commands/quota.js\n");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "(rsc)/./node_modules/imapflow/lib/commands/rename.js":
|
|
/*!******************************************************!*\
|
|
!*** ./node_modules/imapflow/lib/commands/rename.js ***!
|
|
\******************************************************/
|
|
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
|
|
|
|
eval("\n\nconst { encodePath, normalizePath, getStatusCode, getErrorText } = __webpack_require__(/*! ../tools.js */ \"(rsc)/./node_modules/imapflow/lib/tools.js\");\n\n// Renames existing mailbox\nmodule.exports = async (connection, path, newPath) => {\n if (![connection.states.AUTHENTICATED, connection.states.SELECTED].includes(connection.state)) {\n // nothing to do here\n return;\n }\n\n path = normalizePath(connection, path);\n newPath = normalizePath(connection, newPath);\n\n if (connection.states.SELECTED && connection.mailbox.path === path) {\n await connection.run('CLOSE');\n }\n\n let response;\n try {\n let map = {\n path,\n newPath\n };\n response = await connection.exec('RENAME', [\n { type: 'ATOM', value: encodePath(connection, path) },\n { type: 'ATOM', value: encodePath(connection, newPath) }\n ]);\n response.next();\n return map;\n } catch (err) {\n let errorCode = getStatusCode(err.response);\n if (errorCode) {\n err.serverResponseCode = errorCode;\n }\n err.response = await getErrorText(err.response);\n\n connection.log.warn({ err, cid: connection.id });\n throw err;\n }\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHJzYykvLi9ub2RlX21vZHVsZXMvaW1hcGZsb3cvbGliL2NvbW1hbmRzL3JlbmFtZS5qcyIsIm1hcHBpbmdzIjoiQUFBYTs7QUFFYixRQUFRLHlEQUF5RCxFQUFFLG1CQUFPLENBQUMsK0RBQWE7O0FBRXhGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsbURBQW1EO0FBQ2pFLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSw4QkFBOEIseUJBQXlCO0FBQ3ZEO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsiL2hvbWUvYWxtYS9uZXh0Z2VuL05lYWgtbWFpbC9ub2RlX21vZHVsZXMvaW1hcGZsb3cvbGliL2NvbW1hbmRzL3JlbmFtZS5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbmNvbnN0IHsgZW5jb2RlUGF0aCwgbm9ybWFsaXplUGF0aCwgZ2V0U3RhdHVzQ29kZSwgZ2V0RXJyb3JUZXh0IH0gPSByZXF1aXJlKCcuLi90b29scy5qcycpO1xuXG4vLyBSZW5hbWVzIGV4aXN0aW5nIG1haWxib3hcbm1vZHVsZS5leHBvcnRzID0gYXN5bmMgKGNvbm5lY3Rpb24sIHBhdGgsIG5ld1BhdGgpID0+IHtcbiAgICBpZiAoIVtjb25uZWN0aW9uLnN0YXRlcy5BVVRIRU5USUNBVEVELCBjb25uZWN0aW9uLnN0YXRlcy5TRUxFQ1RFRF0uaW5jbHVkZXMoY29ubmVjdGlvbi5zdGF0ZSkpIHtcbiAgICAgICAgLy8gbm90aGluZyB0byBkbyBoZXJlXG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBwYXRoID0gbm9ybWFsaXplUGF0aChjb25uZWN0aW9uLCBwYXRoKTtcbiAgICBuZXdQYXRoID0gbm9ybWFsaXplUGF0aChjb25uZWN0aW9uLCBuZXdQYXRoKTtcblxuICAgIGlmIChjb25uZWN0aW9uLnN0YXRlcy5TRUxFQ1RFRCAmJiBjb25uZWN0aW9uLm1haWxib3gucGF0aCA9PT0gcGF0aCkge1xuICAgICAgICBhd2FpdCBjb25uZWN0aW9uLnJ1bignQ0xPU0UnKTtcbiAgICB9XG5cbiAgICBsZXQgcmVzcG9uc2U7XG4gICAgdHJ5IHtcbiAgICAgICAgbGV0IG1hcCA9IHtcbiAgICAgICAgICAgIHBhdGgsXG4gICAgICAgICAgICBuZXdQYXRoXG4gICAgICAgIH07XG4gICAgICAgIHJlc3BvbnNlID0gYXdhaXQgY29ubmVjdGlvbi5leGVjKCdSRU5BTUUnLCBbXG4gICAgICAgICAgICB7IHR5cGU6ICdBVE9NJywgdmFsdWU6IGVuY29kZVBhdGgoY29ubmVjdGlvbiwgcGF0aCkgfSxcbiAgICAgICAgICAgIHsgdHlwZTogJ0FUT00nLCB2YWx1ZTogZW5jb2RlUGF0aChjb25uZWN0aW9uLCBuZXdQYXRoKSB9XG4gICAgICAgIF0pO1xuICAgICAgICByZXNwb25zZS5uZXh0KCk7XG4gICAgICAgIHJldHVybiBtYXA7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGxldCBlcnJvckNvZGUgPSBnZXRTdGF0dXNDb2RlKGVyci5yZXNwb25zZSk7XG4gICAgICAgIGlmIChlcnJvckNvZGUpIHtcbiAgICAgICAgICAgIGVyci5zZXJ2ZXJSZXNwb25zZUNvZGUgPSBlcnJvckNvZGU7XG4gICAgICAgIH1cbiAgICAgICAgZXJyLnJlc3BvbnNlID0gYXdhaXQgZ2V0RXJyb3JUZXh0KGVyci5yZXNwb25zZSk7XG5cbiAgICAgICAgY29ubmVjdGlvbi5sb2cud2Fybih7IGVyciwgY2lkOiBjb25uZWN0aW9uLmlkIH0pO1xuICAgICAgICB0aHJvdyBlcnI7XG4gICAgfVxufTtcbiJdLCJuYW1lcyI6W10sImlnbm9yZUxpc3QiOlswXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(rsc)/./node_modules/imapflow/lib/commands/rename.js\n");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "(rsc)/./node_modules/imapflow/lib/commands/search.js":
|
|
/*!******************************************************!*\
|
|
!*** ./node_modules/imapflow/lib/commands/search.js ***!
|
|
\******************************************************/
|
|
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
|
|
|
|
eval("\n\nconst { getStatusCode, getErrorText } = __webpack_require__(/*! ../tools.js */ \"(rsc)/./node_modules/imapflow/lib/tools.js\");\nconst { searchCompiler } = __webpack_require__(/*! ../search-compiler.js */ \"(rsc)/./node_modules/imapflow/lib/search-compiler.js\");\n\n// Updates flags for a message\nmodule.exports = async (connection, query, options) => {\n if (connection.state !== connection.states.SELECTED) {\n // nothing to do here\n return false;\n }\n\n options = options || {};\n\n let attributes;\n\n if (!query || query === true || (typeof query === 'object' && (!Object.keys(query).length || (Object.keys(query).length === 1 && query.all)))) {\n // search for all messages\n attributes = [{ type: 'ATOM', value: 'ALL' }];\n } else if (query && typeof query === 'object') {\n // normal query\n attributes = searchCompiler(connection, query);\n } else {\n return false;\n }\n\n let results = new Set();\n let response;\n try {\n response = await connection.exec(options.uid ? 'UID SEARCH' : 'SEARCH', attributes, {\n untagged: {\n SEARCH: async untagged => {\n if (untagged && untagged.attributes && untagged.attributes.length) {\n untagged.attributes.forEach(attribute => {\n if (attribute && attribute.value && typeof attribute.value === 'string' && !isNaN(attribute.value)) {\n results.add(Number(attribute.value));\n }\n });\n }\n }\n }\n });\n response.next();\n return Array.from(results).sort((a, b) => a - b);\n } catch (err) {\n let errorCode = getStatusCode(err.response);\n if (errorCode) {\n err.serverResponseCode = errorCode;\n }\n err.response = await getErrorText(err.response);\n\n connection.log.warn({ err, cid: connection.id });\n return false;\n }\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHJzYykvLi9ub2RlX21vZHVsZXMvaW1hcGZsb3cvbGliL2NvbW1hbmRzL3NlYXJjaC5qcyIsIm1hcHBpbmdzIjoiQUFBYTs7QUFFYixRQUFRLDhCQUE4QixFQUFFLG1CQUFPLENBQUMsK0RBQWE7QUFDN0QsUUFBUSxpQkFBaUIsRUFBRSxtQkFBTyxDQUFDLG1GQUF1Qjs7QUFFMUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7QUFDQSx3QkFBd0IsNEJBQTRCO0FBQ3BELE1BQU07QUFDTjtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlCQUF5QjtBQUN6QjtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLDhCQUE4Qix5QkFBeUI7QUFDdkQ7QUFDQTtBQUNBIiwic291cmNlcyI6WyIvaG9tZS9hbG1hL25leHRnZW4vTmVhaC1tYWlsL25vZGVfbW9kdWxlcy9pbWFwZmxvdy9saWIvY29tbWFuZHMvc2VhcmNoLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcblxuY29uc3QgeyBnZXRTdGF0dXNDb2RlLCBnZXRFcnJvclRleHQgfSA9IHJlcXVpcmUoJy4uL3Rvb2xzLmpzJyk7XG5jb25zdCB7IHNlYXJjaENvbXBpbGVyIH0gPSByZXF1aXJlKCcuLi9zZWFyY2gtY29tcGlsZXIuanMnKTtcblxuLy8gVXBkYXRlcyBmbGFncyBmb3IgYSBtZXNzYWdlXG5tb2R1bGUuZXhwb3J0cyA9IGFzeW5jIChjb25uZWN0aW9uLCBxdWVyeSwgb3B0aW9ucykgPT4ge1xuICAgIGlmIChjb25uZWN0aW9uLnN0YXRlICE9PSBjb25uZWN0aW9uLnN0YXRlcy5TRUxFQ1RFRCkge1xuICAgICAgICAvLyBub3RoaW5nIHRvIGRvIGhlcmVcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuXG4gICAgbGV0IGF0dHJpYnV0ZXM7XG5cbiAgICBpZiAoIXF1ZXJ5IHx8IHF1ZXJ5ID09PSB0cnVlIHx8ICh0eXBlb2YgcXVlcnkgPT09ICdvYmplY3QnICYmICghT2JqZWN0LmtleXMocXVlcnkpLmxlbmd0aCB8fCAoT2JqZWN0LmtleXMocXVlcnkpLmxlbmd0aCA9PT0gMSAmJiBxdWVyeS5hbGwpKSkpIHtcbiAgICAgICAgLy8gc2VhcmNoIGZvciBhbGwgbWVzc2FnZXNcbiAgICAgICAgYXR0cmlidXRlcyA9IFt7IHR5cGU6ICdBVE9NJywgdmFsdWU6ICdBTEwnIH1dO1xuICAgIH0gZWxzZSBpZiAocXVlcnkgJiYgdHlwZW9mIHF1ZXJ5ID09PSAnb2JqZWN0Jykge1xuICAgICAgICAvLyBub3JtYWwgcXVlcnlcbiAgICAgICAgYXR0cmlidXRlcyA9IHNlYXJjaENvbXBpbGVyKGNvbm5lY3Rpb24sIHF1ZXJ5KTtcbiAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgbGV0IHJlc3VsdHMgPSBuZXcgU2V0KCk7XG4gICAgbGV0IHJlc3BvbnNlO1xuICAgIHRyeSB7XG4gICAgICAgIHJlc3BvbnNlID0gYXdhaXQgY29ubmVjdGlvbi5leGVjKG9wdGlvbnMudWlkID8gJ1VJRCBTRUFSQ0gnIDogJ1NFQVJDSCcsIGF0dHJpYnV0ZXMsIHtcbiAgICAgICAgICAgIHVudGFnZ2VkOiB7XG4gICAgICAgICAgICAgICAgU0VBUkNIOiBhc3luYyB1bnRhZ2dlZCA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh1bnRhZ2dlZCAmJiB1bnRhZ2dlZC5hdHRyaWJ1dGVzICYmIHVudGFnZ2VkLmF0dHJpYnV0ZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB1bnRhZ2dlZC5hdHRyaWJ1dGVzLmZvckVhY2goYXR0cmlidXRlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXR0cmlidXRlICYmIGF0dHJpYnV0ZS52YWx1ZSAmJiB0eXBlb2YgYXR0cmlidXRlLnZhbHVlID09PSAnc3RyaW5nJyAmJiAhaXNOYU4oYXR0cmlidXRlLnZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzLmFkZChOdW1iZXIoYXR0cmlidXRlLnZhbHVlKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICByZXNwb25zZS5uZXh0KCk7XG4gICAgICAgIHJldHVybiBBcnJheS5mcm9tKHJlc3VsdHMpLnNvcnQoKGEsIGIpID0+IGEgLSBiKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgbGV0IGVycm9yQ29kZSA9IGdldFN0YXR1c0NvZGUoZXJyLnJlc3BvbnNlKTtcbiAgICAgICAgaWYgKGVycm9yQ29kZSkge1xuICAgICAgICAgICAgZXJyLnNlcnZlclJlc3BvbnNlQ29kZSA9IGVycm9yQ29kZTtcbiAgICAgICAgfVxuICAgICAgICBlcnIucmVzcG9uc2UgPSBhd2FpdCBnZXRFcnJvclRleHQoZXJyLnJlc3BvbnNlKTtcblxuICAgICAgICBjb25uZWN0aW9uLmxvZy53YXJuKHsgZXJyLCBjaWQ6IGNvbm5lY3Rpb24uaWQgfSk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG59O1xuIl0sIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6WzBdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(rsc)/./node_modules/imapflow/lib/commands/search.js\n");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "(rsc)/./node_modules/imapflow/lib/commands/select.js":
|
|
/*!******************************************************!*\
|
|
!*** ./node_modules/imapflow/lib/commands/select.js ***!
|
|
\******************************************************/
|
|
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
|
|
|
|
eval("\n\nconst { encodePath, normalizePath, getStatusCode, getErrorText } = __webpack_require__(/*! ../tools.js */ \"(rsc)/./node_modules/imapflow/lib/tools.js\");\n\n// Selects a mailbox\nmodule.exports = async (connection, path, options) => {\n if (![connection.states.AUTHENTICATED, connection.states.SELECTED].includes(connection.state)) {\n // nothing to do here\n return;\n }\n options = options || {};\n\n path = normalizePath(connection, path);\n\n if (!connection.folders.has(path)) {\n let folders = await connection.run('LIST', '', path);\n if (!folders) {\n throw new Error('Failed to fetch folders');\n }\n folders.forEach(folder => {\n connection.folders.set(folder.path, folder);\n });\n }\n\n let folderListData = connection.folders.has(path) ? connection.folders.get(path) : false;\n\n let response;\n try {\n let map = { path };\n if (folderListData) {\n ['delimiter', 'specialUse', 'subscribed', 'listed'].forEach(key => {\n if (folderListData[key]) {\n map[key] = folderListData[key];\n }\n });\n }\n\n let extraArgs = [];\n if (connection.enabled.has('QRESYNC') && options.changedSince && options.uidValidity) {\n extraArgs.push([\n { type: 'ATOM', value: 'QRESYNC' },\n [\n { type: 'ATOM', value: options.uidValidity?.toString() },\n { type: 'ATOM', value: options.changedSince.toString() }\n ]\n ]);\n map.qresync = true;\n }\n\n let encodedPath = encodePath(connection, path);\n\n let selectCommand = {\n command: !options.readOnly ? 'SELECT' : 'EXAMINE',\n arguments: [{ type: encodedPath.indexOf('&') >= 0 ? 'STRING' : 'ATOM', value: encodedPath }].concat(extraArgs || [])\n };\n\n response = await connection.exec(selectCommand.command, selectCommand.arguments, {\n untagged: {\n OK: async untagged => {\n if (!untagged.attributes || !untagged.attributes.length) {\n return;\n }\n let section = !untagged.attributes[0].value && untagged.attributes[0].section;\n if (section && section.length > 1 && section[0].type === 'ATOM' && typeof section[0].value === 'string') {\n let key = section[0].value.toLowerCase();\n let value;\n\n if (typeof section[1].value === 'string') {\n value = section[1].value;\n } else if (Array.isArray(section[1])) {\n value = section[1].map(entry => (typeof entry.value === 'string' ? entry.value : false)).filter(entry => entry);\n }\n\n switch (key) {\n case 'highestmodseq':\n key = 'highestModseq';\n if (/^[0-9]+$/.test(value)) {\n value = BigInt(value);\n }\n break;\n\n case 'mailboxid':\n key = 'mailboxId';\n if (Array.isArray(value) && value.length) {\n value = value[0];\n }\n break;\n\n case 'permanentflags':\n key = 'permanentFlags';\n value = new Set(value);\n break;\n\n case 'uidnext':\n key = 'uidNext';\n value = Number(value);\n break;\n\n case 'uidvalidity':\n key = 'uidValidity';\n if (/^[0-9]+$/.test(value)) {\n value = BigInt(value);\n }\n break;\n }\n\n map[key] = value;\n }\n\n if (section && section.length === 1 && section[0].type === 'ATOM' && typeof section[0].value === 'string') {\n let key = section[0].value.toLowerCase();\n switch (key) {\n case 'nomodseq':\n key = 'noModseq';\n map[key] = true;\n break;\n }\n }\n },\n FLAGS: async untagged => {\n if (!untagged.attributes || (!untagged.attributes.length && Array.isArray(untagged.attributes[0]))) {\n return;\n }\n let flags = untagged.attributes[0].map(flag => (typeof flag.value === 'string' ? flag.value : false)).filter(flag => flag);\n map.flags = new Set(flags);\n },\n EXISTS: async untagged => {\n let num = Number(untagged.command);\n if (isNaN(num)) {\n return false;\n }\n\n map.exists = num;\n },\n VANISHED: async untagged => {\n await connection.untaggedVanished(\n untagged,\n // mailbox is not yet open, so use a dummy mailbox object\n { path, uidNext: false, uidValidity: false }\n );\n },\n // we should only get an untagged FETCH for a SELECT/EXAMINE if QRESYNC was asked for\n FETCH: async untagged => {\n await connection.untaggedFetch(\n untagged,\n // mailbox is not yet open, so use a dummy mailbox object\n { path, uidNext: false, uidValidity: false }\n );\n }\n }\n });\n\n let section = !response.response.attributes[0].value && response.response.attributes[0].section;\n if (section && section.length && section[0].type === 'ATOM' && typeof section[0].value === 'string') {\n switch (section[0].value.toUpperCase()) {\n case 'READ-ONLY':\n map.readOnly = true;\n break;\n case 'READ-WRITE':\n default:\n map.readOnly = false;\n break;\n }\n }\n\n if (\n map.qresync &&\n // UIDVALIDITY must be the same\n (options.uidValidity !== map.uidValidity ||\n // HIGHESTMODSEQ response must be present\n !map.highestModseq ||\n // NOMODSEQ is not allowed\n map.noModseq)\n ) {\n // QRESYNC does not apply here, so unset it\n map.qresync = false;\n }\n\n let currentMailbox = connection.mailbox;\n connection.mailbox = false;\n\n if (currentMailbox && currentMailbox.path !== path) {\n connection.emit('mailboxClose', currentMailbox);\n }\n\n connection.mailbox = map;\n connection.currentSelectCommand = selectCommand;\n connection.state = connection.states.SELECTED;\n\n if (!currentMailbox || currentMailbox.path !== path) {\n connection.emit('mailboxOpen', connection.mailbox);\n }\n\n response.next();\n return map;\n } catch (err) {\n let errorCode = getStatusCode(err.response);\n if (errorCode) {\n err.serverResponseCode = errorCode;\n }\n err.response = await getErrorText(err.response);\n\n if (connection.state === connection.states.SELECTED) {\n // reset selected state\n\n let currentMailbox = connection.mailbox;\n\n connection.mailbox = false;\n connection.currentSelectCommand = false;\n connection.state = connection.states.AUTHENTICATED;\n\n if (currentMailbox) {\n connection.emit('mailboxClose', currentMailbox);\n }\n }\n\n connection.log.warn({ err, cid: connection.id });\n throw err;\n }\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHJzYykvLi9ub2RlX21vZHVsZXMvaW1hcGZsb3cvbGliL2NvbW1hbmRzL3NlbGVjdC5qcyIsIm1hcHBpbmdzIjoiQUFBYTs7QUFFYixRQUFRLHlEQUF5RCxFQUFFLG1CQUFPLENBQUMsK0RBQWE7O0FBRXhGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUOztBQUVBOztBQUVBO0FBQ0E7QUFDQSxvQkFBb0I7QUFDcEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0IsZ0NBQWdDO0FBQ2xEO0FBQ0Esc0JBQXNCLHNEQUFzRDtBQUM1RSxzQkFBc0I7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLDBCQUEwQiw2RUFBNkU7QUFDdkc7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLDBCQUEwQjtBQUMxQjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBCQUEwQjtBQUMxQjtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMEJBQTBCO0FBQzFCO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSw4QkFBOEIseUJBQXlCO0FBQ3ZEO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsiL2hvbWUvYWxtYS9uZXh0Z2VuL05lYWgtbWFpbC9ub2RlX21vZHVsZXMvaW1hcGZsb3cvbGliL2NvbW1hbmRzL3NlbGVjdC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbmNvbnN0IHsgZW5jb2RlUGF0aCwgbm9ybWFsaXplUGF0aCwgZ2V0U3RhdHVzQ29kZSwgZ2V0RXJyb3JUZXh0IH0gPSByZXF1aXJlKCcuLi90b29scy5qcycpO1xuXG4vLyBTZWxlY3RzIGEgbWFpbGJveFxubW9kdWxlLmV4cG9ydHMgPSBhc3luYyAoY29ubmVjdGlvbiwgcGF0aCwgb3B0aW9ucykgPT4ge1xuICAgIGlmICghW2Nvbm5lY3Rpb24uc3RhdGVzLkFVVEhFTlRJQ0FURUQsIGNvbm5lY3Rpb24uc3RhdGVzLlNFTEVDVEVEXS5pbmNsdWRlcyhjb25uZWN0aW9uLnN0YXRlKSkge1xuICAgICAgICAvLyBub3RoaW5nIHRvIGRvIGhlcmVcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcblxuICAgIHBhdGggPSBub3JtYWxpemVQYXRoKGNvbm5lY3Rpb24sIHBhdGgpO1xuXG4gICAgaWYgKCFjb25uZWN0aW9uLmZvbGRlcnMuaGFzKHBhdGgpKSB7XG4gICAgICAgIGxldCBmb2xkZXJzID0gYXdhaXQgY29ubmVjdGlvbi5ydW4oJ0xJU1QnLCAnJywgcGF0aCk7XG4gICAgICAgIGlmICghZm9sZGVycykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdGYWlsZWQgdG8gZmV0Y2ggZm9sZGVycycpO1xuICAgICAgICB9XG4gICAgICAgIGZvbGRlcnMuZm9yRWFjaChmb2xkZXIgPT4ge1xuICAgICAgICAgICAgY29ubmVjdGlvbi5mb2xkZXJzLnNldChmb2xkZXIucGF0aCwgZm9sZGVyKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgbGV0IGZvbGRlckxpc3REYXRhID0gY29ubmVjdGlvbi5mb2xkZXJzLmhhcyhwYXRoKSA/IGNvbm5lY3Rpb24uZm9sZGVycy5nZXQocGF0aCkgOiBmYWxzZTtcblxuICAgIGxldCByZXNwb25zZTtcbiAgICB0cnkge1xuICAgICAgICBsZXQgbWFwID0geyBwYXRoIH07XG4gICAgICAgIGlmIChmb2xkZXJMaXN0RGF0YSkge1xuICAgICAgICAgICAgWydkZWxpbWl0ZXInLCAnc3BlY2lhbFVzZScsICdzdWJzY3JpYmVkJywgJ2xpc3RlZCddLmZvckVhY2goa2V5ID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoZm9sZGVyTGlzdERhdGFba2V5XSkge1xuICAgICAgICAgICAgICAgICAgICBtYXBba2V5XSA9IGZvbGRlckxpc3REYXRhW2tleV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgZXh0cmFBcmdzID0gW107XG4gICAgICAgIGlmIChjb25uZWN0aW9uLmVuYWJsZWQuaGFzKCdRUkVTWU5DJykgJiYgb3B0aW9ucy5jaGFuZ2VkU2luY2UgJiYgb3B0aW9ucy51aWRWYWxpZGl0eSkge1xuICAgICAgICAgICAgZXh0cmFBcmdzLnB1c2goW1xuICAgICAgICAgICAgICAgIHsgdHlwZTogJ0FUT00nLCB2YWx1ZTogJ1FSRVNZTkMnIH0sXG4gICAgICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgICAgICB7IHR5cGU6ICdBVE9NJywgdmFsdWU6IG9wdGlvbnMudWlkVmFsaWRpdHk/LnRvU3RyaW5nKCkgfSxcbiAgICAgICAgICAgICAgICAgICAgeyB0eXBlOiAnQVRPTScsIHZhbHVlOiBvcHRpb25zLmNoYW5nZWRTaW5jZS50b1N0cmluZygpIH1cbiAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICBdKTtcbiAgICAgICAgICAgIG1hcC5xcmVzeW5jID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBlbmNvZGVkUGF0aCA9IGVuY29kZVBhdGgoY29ubmVjdGlvbiwgcGF0aCk7XG5cbiAgICAgICAgbGV0IHNlbGVjdENvbW1hbmQgPSB7XG4gICAgICAgICAgICBjb21tYW5kOiAhb3B0aW9ucy5yZWFkT25seSA/ICdTRUxFQ1QnIDogJ0VYQU1JTkUnLFxuICAgICAgICAgICAgYXJndW1lbnRzOiBbeyB0eXBlOiBlbmNvZGVkUGF0aC5pbmRleE9mKCcmJykgPj0gMCA/ICdTVFJJTkcnIDogJ0FUT00nLCB2YWx1ZTogZW5jb2RlZFBhdGggfV0uY29uY2F0KGV4dHJhQXJncyB8fCBbXSlcbiAgICAgICAgfTtcblxuICAgICAgICByZXNwb25zZSA9IGF3YWl0IGNvbm5lY3Rpb24uZXhlYyhzZWxlY3RDb21tYW5kLmNvbW1hbmQsIHNlbGVjdENvbW1hbmQuYXJndW1lbnRzLCB7XG4gICAgICAgICAgICB1bnRhZ2dlZDoge1xuICAgICAgICAgICAgICAgIE9LOiBhc3luYyB1bnRhZ2dlZCA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghdW50YWdnZWQuYXR0cmlidXRlcyB8fCAhdW50YWdnZWQuYXR0cmlidXRlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBsZXQgc2VjdGlvbiA9ICF1bnRhZ2dlZC5hdHRyaWJ1dGVzWzBdLnZhbHVlICYmIHVudGFnZ2VkLmF0dHJpYnV0ZXNbMF0uc2VjdGlvbjtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNlY3Rpb24gJiYgc2VjdGlvbi5sZW5ndGggPiAxICYmIHNlY3Rpb25bMF0udHlwZSA9PT0gJ0FUT00nICYmIHR5cGVvZiBzZWN0aW9uWzBdLnZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGtleSA9IHNlY3Rpb25bMF0udmFsdWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB2YWx1ZTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBzZWN0aW9uWzFdLnZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gc2VjdGlvblsxXS52YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShzZWN0aW9uWzFdKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gc2VjdGlvblsxXS5tYXAoZW50cnkgPT4gKHR5cGVvZiBlbnRyeS52YWx1ZSA9PT0gJ3N0cmluZycgPyBlbnRyeS52YWx1ZSA6IGZhbHNlKSkuZmlsdGVyKGVudHJ5ID0+IGVudHJ5KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChrZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdoaWdoZXN0bW9kc2VxJzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5ID0gJ2hpZ2hlc3RNb2RzZXEnO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoL15bMC05XSskLy50ZXN0KHZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBCaWdJbnQodmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnbWFpbGJveGlkJzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5ID0gJ21haWxib3hJZCc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSAmJiB2YWx1ZS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsdWVbMF07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdwZXJtYW5lbnRmbGFncyc6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleSA9ICdwZXJtYW5lbnRGbGFncyc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gbmV3IFNldCh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAndWlkbmV4dCc6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleSA9ICd1aWROZXh0JztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBOdW1iZXIodmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3VpZHZhbGlkaXR5JzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5ID0gJ3VpZFZhbGlkaXR5JztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKC9eWzAtOV0rJC8udGVzdCh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gQmlnSW50KHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgbWFwW2tleV0gPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGlmIChzZWN0aW9uICYmIHNlY3Rpb24ubGVuZ3RoID09PSAxICYmIHNlY3Rpb25bMF0udHlwZSA9PT0gJ0FUT00nICYmIHR5cGVvZiBzZWN0aW9uWzBdLnZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGtleSA9IHNlY3Rpb25bMF0udmFsdWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoa2V5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnbm9tb2RzZXEnOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXkgPSAnbm9Nb2RzZXEnO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXBba2V5XSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBGTEFHUzogYXN5bmMgdW50YWdnZWQgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXVudGFnZ2VkLmF0dHJpYnV0ZXMgfHwgKCF1bnRhZ2dlZC5hdHRyaWJ1dGVzLmxlbmd0aCAmJiBBcnJheS5pc0FycmF5KHVudGFnZ2VkLmF0dHJpYnV0ZXNbMF0pKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGxldCBmbGFncyA9IHVudGFnZ2VkLmF0dHJpYnV0ZXNbMF0ubWFwKGZsYWcgPT4gKHR5cGVvZiBmbGFnLnZhbHVlID09PSAnc3RyaW5nJyA/IGZsYWcudmFsdWUgOiBmYWxzZSkpLmZpbHRlcihmbGFnID0+IGZsYWcpO1xuICAgICAgICAgICAgICAgICAgICBtYXAuZmxhZ3MgPSBuZXcgU2V0KGZsYWdzKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIEVYSVNUUzogYXN5bmMgdW50YWdnZWQgPT4ge1xuICAgICAgICAgICAgICAgICAgICBsZXQgbnVtID0gTnVtYmVyKHVudGFnZ2VkLmNvbW1hbmQpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoaXNOYU4obnVtKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgbWFwLmV4aXN0cyA9IG51bTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIFZBTklTSEVEOiBhc3luYyB1bnRhZ2dlZCA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGNvbm5lY3Rpb24udW50YWdnZWRWYW5pc2hlZChcbiAgICAgICAgICAgICAgICAgICAgICAgIHVudGFnZ2VkLFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWFpbGJveCBpcyBub3QgeWV0IG9wZW4sIHNvIHVzZSBhIGR1bW15IG1haWxib3ggb2JqZWN0XG4gICAgICAgICAgICAgICAgICAgICAgICB7IHBhdGgsIHVpZE5leHQ6IGZhbHNlLCB1aWRWYWxpZGl0eTogZmFsc2UgfVxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgLy8gd2Ugc2hvdWxkIG9ubHkgZ2V0IGFuIHVudGFnZ2VkIEZFVENIIGZvciBhIFNFTEVDVC9FWEFNSU5FIGlmIFFSRVNZTkMgd2FzIGFza2VkIGZvclxuICAgICAgICAgICAgICAgIEZFVENIOiBhc3luYyB1bnRhZ2dlZCA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGNvbm5lY3Rpb24udW50YWdnZWRGZXRjaChcbiAgICAgICAgICAgICAgICAgICAgICAgIHVudGFnZ2VkLFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWFpbGJveCBpcyBub3QgeWV0IG9wZW4sIHNvIHVzZSBhIGR1bW15IG1haWxib3ggb2JqZWN0XG4gICAgICAgICAgICAgICAgICAgICAgICB7IHBhdGgsIHVpZE5leHQ6IGZhbHNlLCB1aWRWYWxpZGl0eTogZmFsc2UgfVxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgbGV0IHNlY3Rpb24gPSAhcmVzcG9uc2UucmVzcG9uc2UuYXR0cmlidXRlc1swXS52YWx1ZSAmJiByZXNwb25zZS5yZXNwb25zZS5hdHRyaWJ1dGVzWzBdLnNlY3Rpb247XG4gICAgICAgIGlmIChzZWN0aW9uICYmIHNlY3Rpb24ubGVuZ3RoICYmIHNlY3Rpb25bMF0udHlwZSA9PT0gJ0FUT00nICYmIHR5cGVvZiBzZWN0aW9uWzBdLnZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgc3dpdGNoIChzZWN0aW9uWzBdLnZhbHVlLnRvVXBwZXJDYXNlKCkpIHtcbiAgICAgICAgICAgICAgICBjYXNlICdSRUFELU9OTFknOlxuICAgICAgICAgICAgICAgICAgICBtYXAucmVhZE9ubHkgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICdSRUFELVdSSVRFJzpcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICBtYXAucmVhZE9ubHkgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoXG4gICAgICAgICAgICBtYXAucXJlc3luYyAmJlxuICAgICAgICAgICAgLy8gVUlEVkFMSURJVFkgbXVzdCBiZSB0aGUgc2FtZVxuICAgICAgICAgICAgKG9wdGlvbnMudWlkVmFsaWRpdHkgIT09IG1hcC51aWRWYWxpZGl0eSB8fFxuICAgICAgICAgICAgICAgIC8vIEhJR0hFU1RNT0RTRVEgcmVzcG9uc2UgbXVzdCBiZSBwcmVzZW50XG4gICAgICAgICAgICAgICAgIW1hcC5oaWdoZXN0TW9kc2VxIHx8XG4gICAgICAgICAgICAgICAgLy8gTk9NT0RTRVEgaXMgbm90IGFsbG93ZWRcbiAgICAgICAgICAgICAgICBtYXAubm9Nb2RzZXEpXG4gICAgICAgICkge1xuICAgICAgICAgICAgLy8gUVJFU1lOQyBkb2VzIG5vdCBhcHBseSBoZXJlLCBzbyB1bnNldCBpdFxuICAgICAgICAgICAgbWFwLnFyZXN5bmMgPSBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBjdXJyZW50TWFpbGJveCA9IGNvbm5lY3Rpb24ubWFpbGJveDtcbiAgICAgICAgY29ubmVjdGlvbi5tYWlsYm94ID0gZmFsc2U7XG5cbiAgICAgICAgaWYgKGN1cnJlbnRNYWlsYm94ICYmIGN1cnJlbnRNYWlsYm94LnBhdGggIT09IHBhdGgpIHtcbiAgICAgICAgICAgIGNvbm5lY3Rpb24uZW1pdCgnbWFpbGJveENsb3NlJywgY3VycmVudE1haWxib3gpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29ubmVjdGlvbi5tYWlsYm94ID0gbWFwO1xuICAgICAgICBjb25uZWN0aW9uLmN1cnJlbnRTZWxlY3RDb21tYW5kID0gc2VsZWN0Q29tbWFuZDtcbiAgICAgICAgY29ubmVjdGlvbi5zdGF0ZSA9IGNvbm5lY3Rpb24uc3RhdGVzLlNFTEVDVEVEO1xuXG4gICAgICAgIGlmICghY3VycmVudE1haWxib3ggfHwgY3VycmVudE1haWxib3gucGF0aCAhPT0gcGF0aCkge1xuICAgICAgICAgICAgY29ubmVjdGlvbi5lbWl0KCdtYWlsYm94T3BlbicsIGNvbm5lY3Rpb24ubWFpbGJveCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXNwb25zZS5uZXh0KCk7XG4gICAgICAgIHJldHVybiBtYXA7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGxldCBlcnJvckNvZGUgPSBnZXRTdGF0dXNDb2RlKGVyci5yZXNwb25zZSk7XG4gICAgICAgIGlmIChlcnJvckNvZGUpIHtcbiAgICAgICAgICAgIGVyci5zZXJ2ZXJSZXNwb25zZUNvZGUgPSBlcnJvckNvZGU7XG4gICAgICAgIH1cbiAgICAgICAgZXJyLnJlc3BvbnNlID0gYXdhaXQgZ2V0RXJyb3JUZXh0KGVyci5yZXNwb25zZSk7XG5cbiAgICAgICAgaWYgKGNvbm5lY3Rpb24uc3RhdGUgPT09IGNvbm5lY3Rpb24uc3RhdGVzLlNFTEVDVEVEKSB7XG4gICAgICAgICAgICAvLyByZXNldCBzZWxlY3RlZCBzdGF0ZVxuXG4gICAgICAgICAgICBsZXQgY3VycmVudE1haWxib3ggPSBjb25uZWN0aW9uLm1haWxib3g7XG5cbiAgICAgICAgICAgIGNvbm5lY3Rpb24ubWFpbGJveCA9IGZhbHNlO1xuICAgICAgICAgICAgY29ubmVjdGlvbi5jdXJyZW50U2VsZWN0Q29tbWFuZCA9IGZhbHNlO1xuICAgICAgICAgICAgY29ubmVjdGlvbi5zdGF0ZSA9IGNvbm5lY3Rpb24uc3RhdGVzLkFVVEhFTlRJQ0FURUQ7XG5cbiAgICAgICAgICAgIGlmIChjdXJyZW50TWFpbGJveCkge1xuICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24uZW1pdCgnbWFpbGJveENsb3NlJywgY3VycmVudE1haWxib3gpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29ubmVjdGlvbi5sb2cud2Fybih7IGVyciwgY2lkOiBjb25uZWN0aW9uLmlkIH0pO1xuICAgICAgICB0aHJvdyBlcnI7XG4gICAgfVxufTtcbiJdLCJuYW1lcyI6W10sImlnbm9yZUxpc3QiOlswXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(rsc)/./node_modules/imapflow/lib/commands/select.js\n");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "(rsc)/./node_modules/imapflow/lib/commands/starttls.js":
|
|
/*!********************************************************!*\
|
|
!*** ./node_modules/imapflow/lib/commands/starttls.js ***!
|
|
\********************************************************/
|
|
/***/ ((module) => {
|
|
|
|
eval("\n\n// Requests STARTTLS info from server\nmodule.exports = async connection => {\n if (!connection.capabilities.has('STARTTLS') || connection.secureConnection) {\n // nothing to do here\n return false;\n }\n\n let response;\n try {\n response = await connection.exec('STARTTLS');\n response.next();\n return true;\n } catch (err) {\n connection.log.warn({ err, cid: connection.id });\n return false;\n }\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHJzYykvLi9ub2RlX21vZHVsZXMvaW1hcGZsb3cvbGliL2NvbW1hbmRzL3N0YXJ0dGxzLmpzIiwibWFwcGluZ3MiOiJBQUFhOztBQUViO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOLDhCQUE4Qix5QkFBeUI7QUFDdkQ7QUFDQTtBQUNBIiwic291cmNlcyI6WyIvaG9tZS9hbG1hL25leHRnZW4vTmVhaC1tYWlsL25vZGVfbW9kdWxlcy9pbWFwZmxvdy9saWIvY29tbWFuZHMvc3RhcnR0bHMuanMiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG4vLyBSZXF1ZXN0cyBTVEFSVFRMUyBpbmZvIGZyb20gc2VydmVyXG5tb2R1bGUuZXhwb3J0cyA9IGFzeW5jIGNvbm5lY3Rpb24gPT4ge1xuICAgIGlmICghY29ubmVjdGlvbi5jYXBhYmlsaXRpZXMuaGFzKCdTVEFSVFRMUycpIHx8IGNvbm5lY3Rpb24uc2VjdXJlQ29ubmVjdGlvbikge1xuICAgICAgICAvLyBub3RoaW5nIHRvIGRvIGhlcmVcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGxldCByZXNwb25zZTtcbiAgICB0cnkge1xuICAgICAgICByZXNwb25zZSA9IGF3YWl0IGNvbm5lY3Rpb24uZXhlYygnU1RBUlRUTFMnKTtcbiAgICAgICAgcmVzcG9uc2UubmV4dCgpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgY29ubmVjdGlvbi5sb2cud2Fybih7IGVyciwgY2lkOiBjb25uZWN0aW9uLmlkIH0pO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxufTtcbiJdLCJuYW1lcyI6W10sImlnbm9yZUxpc3QiOlswXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(rsc)/./node_modules/imapflow/lib/commands/starttls.js\n");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "(rsc)/./node_modules/imapflow/lib/commands/status.js":
|
|
/*!******************************************************!*\
|
|
!*** ./node_modules/imapflow/lib/commands/status.js ***!
|
|
\******************************************************/
|
|
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
|
|
|
|
eval("\n\nconst { encodePath, normalizePath } = __webpack_require__(/*! ../tools.js */ \"(rsc)/./node_modules/imapflow/lib/tools.js\");\n\n// Requests info about a mailbox\nmodule.exports = async (connection, path, query) => {\n if (![connection.states.AUTHENTICATED, connection.states.SELECTED].includes(connection.state) || !path) {\n // nothing to do here\n return false;\n }\n\n path = normalizePath(connection, path);\n let encodedPath = encodePath(connection, path);\n\n let attributes = [{ type: encodedPath.indexOf('&') >= 0 ? 'STRING' : 'ATOM', value: encodedPath }];\n\n let queryAttributes = [];\n Object.keys(query || {}).forEach(key => {\n if (!query[key]) {\n return;\n }\n\n switch (key.toUpperCase()) {\n case 'MESSAGES':\n case 'RECENT':\n case 'UIDNEXT':\n case 'UIDVALIDITY':\n case 'UNSEEN':\n queryAttributes.push({ type: 'ATOM', value: key.toUpperCase() });\n break;\n\n case 'HIGHESTMODSEQ':\n if (connection.capabilities.has('CONDSTORE')) {\n queryAttributes.push({ type: 'ATOM', value: key.toUpperCase() });\n }\n break;\n }\n });\n\n if (!queryAttributes.length) {\n return false;\n }\n\n attributes.push(queryAttributes);\n\n let response;\n try {\n let map = { path };\n response = await connection.exec('STATUS', attributes, {\n untagged: {\n STATUS: async untagged => {\n // If STATUS is for current mailbox then update mailbox values\n let updateCurrent = connection.state === connection.states.SELECTED && path === connection.mailbox.path;\n\n let list = untagged.attributes && Array.isArray(untagged.attributes[1]) ? untagged.attributes[1] : false;\n if (!list) {\n return;\n }\n let key;\n list.forEach((entry, i) => {\n if (i % 2 === 0) {\n key = entry && typeof entry.value === 'string' ? entry.value : false;\n return;\n }\n if (!key || !entry || typeof entry.value !== 'string') {\n return;\n }\n let value = false;\n switch (key.toUpperCase()) {\n case 'MESSAGES':\n key = 'messages';\n value = !isNaN(entry.value) ? Number(entry.value) : false;\n if (updateCurrent) {\n let prevCount = connection.mailbox.exists;\n if (prevCount !== value) {\n // somehow message count in current folder has changed?\n connection.mailbox.exists = value;\n connection.emit('exists', {\n path,\n count: value,\n prevCount\n });\n }\n }\n break;\n\n case 'RECENT':\n key = 'recent';\n value = !isNaN(entry.value) ? Number(entry.value) : false;\n break;\n\n case 'UIDNEXT':\n key = 'uidNext';\n value = !isNaN(entry.value) ? Number(entry.value) : false;\n if (updateCurrent) {\n connection.mailbox.uidNext = value;\n }\n break;\n\n case 'UIDVALIDITY':\n key = 'uidValidity';\n value = !isNaN(entry.value) ? BigInt(entry.value) : false;\n break;\n\n case 'UNSEEN':\n key = 'unseen';\n value = !isNaN(entry.value) ? Number(entry.value) : false;\n break;\n\n case 'HIGHESTMODSEQ':\n key = 'highestModseq';\n value = !isNaN(entry.value) ? BigInt(entry.value) : false;\n if (updateCurrent) {\n connection.mailbox.highestModseq = value;\n }\n break;\n }\n if (value === false) {\n return;\n }\n\n map[key] = value;\n });\n }\n }\n });\n response.next();\n return map;\n } catch (err) {\n if (err.responseStatus === 'NO') {\n let folders = await connection.run('LIST', '', path, { listOnly: true });\n if (folders && !folders.length) {\n let error = new Error(`Mailbox doesn't exist: ${path}`);\n error.code = 'NotFound';\n error.response = err;\n throw error;\n }\n }\n\n connection.log.warn({ err, cid: connection.id });\n return false;\n }\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHJzYykvLi9ub2RlX21vZHVsZXMvaW1hcGZsb3cvbGliL2NvbW1hbmRzL3N0YXR1cy5qcyIsIm1hcHBpbmdzIjoiQUFBYTs7QUFFYixRQUFRLDRCQUE0QixFQUFFLG1CQUFPLENBQUMsK0RBQWE7O0FBRTNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBLHdCQUF3Qiw2RUFBNkU7O0FBRXJHO0FBQ0EsMkJBQTJCO0FBQzNCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1Q0FBdUMsd0NBQXdDO0FBQy9FOztBQUVBO0FBQ0E7QUFDQSwyQ0FBMkMsd0NBQXdDO0FBQ25GO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQSxvQkFBb0I7QUFDcEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5Q0FBeUM7QUFDekM7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxxQkFBcUI7QUFDckI7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0EsbUVBQW1FLGdCQUFnQjtBQUNuRjtBQUNBLGdFQUFnRSxLQUFLO0FBQ3JFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsOEJBQThCLHlCQUF5QjtBQUN2RDtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIi9ob21lL2FsbWEvbmV4dGdlbi9OZWFoLW1haWwvbm9kZV9tb2R1bGVzL2ltYXBmbG93L2xpYi9jb21tYW5kcy9zdGF0dXMuanMiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCB7IGVuY29kZVBhdGgsIG5vcm1hbGl6ZVBhdGggfSA9IHJlcXVpcmUoJy4uL3Rvb2xzLmpzJyk7XG5cbi8vIFJlcXVlc3RzIGluZm8gYWJvdXQgYSBtYWlsYm94XG5tb2R1bGUuZXhwb3J0cyA9IGFzeW5jIChjb25uZWN0aW9uLCBwYXRoLCBxdWVyeSkgPT4ge1xuICAgIGlmICghW2Nvbm5lY3Rpb24uc3RhdGVzLkFVVEhFTlRJQ0FURUQsIGNvbm5lY3Rpb24uc3RhdGVzLlNFTEVDVEVEXS5pbmNsdWRlcyhjb25uZWN0aW9uLnN0YXRlKSB8fCAhcGF0aCkge1xuICAgICAgICAvLyBub3RoaW5nIHRvIGRvIGhlcmVcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHBhdGggPSBub3JtYWxpemVQYXRoKGNvbm5lY3Rpb24sIHBhdGgpO1xuICAgIGxldCBlbmNvZGVkUGF0aCA9IGVuY29kZVBhdGgoY29ubmVjdGlvbiwgcGF0aCk7XG5cbiAgICBsZXQgYXR0cmlidXRlcyA9IFt7IHR5cGU6IGVuY29kZWRQYXRoLmluZGV4T2YoJyYnKSA+PSAwID8gJ1NUUklORycgOiAnQVRPTScsIHZhbHVlOiBlbmNvZGVkUGF0aCB9XTtcblxuICAgIGxldCBxdWVyeUF0dHJpYnV0ZXMgPSBbXTtcbiAgICBPYmplY3Qua2V5cyhxdWVyeSB8fCB7fSkuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICBpZiAoIXF1ZXJ5W2tleV0pIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHN3aXRjaCAoa2V5LnRvVXBwZXJDYXNlKCkpIHtcbiAgICAgICAgICAgIGNhc2UgJ01FU1NBR0VTJzpcbiAgICAgICAgICAgIGNhc2UgJ1JFQ0VOVCc6XG4gICAgICAgICAgICBjYXNlICdVSURORVhUJzpcbiAgICAgICAgICAgIGNhc2UgJ1VJRFZBTElESVRZJzpcbiAgICAgICAgICAgIGNhc2UgJ1VOU0VFTic6XG4gICAgICAgICAgICAgICAgcXVlcnlBdHRyaWJ1dGVzLnB1c2goeyB0eXBlOiAnQVRPTScsIHZhbHVlOiBrZXkudG9VcHBlckNhc2UoKSB9KTtcbiAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgY2FzZSAnSElHSEVTVE1PRFNFUSc6XG4gICAgICAgICAgICAgICAgaWYgKGNvbm5lY3Rpb24uY2FwYWJpbGl0aWVzLmhhcygnQ09ORFNUT1JFJykpIHtcbiAgICAgICAgICAgICAgICAgICAgcXVlcnlBdHRyaWJ1dGVzLnB1c2goeyB0eXBlOiAnQVRPTScsIHZhbHVlOiBrZXkudG9VcHBlckNhc2UoKSB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIGlmICghcXVlcnlBdHRyaWJ1dGVzLmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgYXR0cmlidXRlcy5wdXNoKHF1ZXJ5QXR0cmlidXRlcyk7XG5cbiAgICBsZXQgcmVzcG9uc2U7XG4gICAgdHJ5IHtcbiAgICAgICAgbGV0IG1hcCA9IHsgcGF0aCB9O1xuICAgICAgICByZXNwb25zZSA9IGF3YWl0IGNvbm5lY3Rpb24uZXhlYygnU1RBVFVTJywgYXR0cmlidXRlcywge1xuICAgICAgICAgICAgdW50YWdnZWQ6IHtcbiAgICAgICAgICAgICAgICBTVEFUVVM6IGFzeW5jIHVudGFnZ2VkID0+IHtcbiAgICAgICAgICAgICAgICAgICAgLy8gSWYgU1RBVFVTIGlzIGZvciBjdXJyZW50IG1haWxib3ggdGhlbiB1cGRhdGUgbWFpbGJveCB2YWx1ZXNcbiAgICAgICAgICAgICAgICAgICAgbGV0IHVwZGF0ZUN1cnJlbnQgPSBjb25uZWN0aW9uLnN0YXRlID09PSBjb25uZWN0aW9uLnN0YXRlcy5TRUxFQ1RFRCAmJiBwYXRoID09PSBjb25uZWN0aW9uLm1haWxib3gucGF0aDtcblxuICAgICAgICAgICAgICAgICAgICBsZXQgbGlzdCA9IHVudGFnZ2VkLmF0dHJpYnV0ZXMgJiYgQXJyYXkuaXNBcnJheSh1bnRhZ2dlZC5hdHRyaWJ1dGVzWzFdKSA/IHVudGFnZ2VkLmF0dHJpYnV0ZXNbMV0gOiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFsaXN0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbGV0IGtleTtcbiAgICAgICAgICAgICAgICAgICAgbGlzdC5mb3JFYWNoKChlbnRyeSwgaSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGkgJSAyID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5ID0gZW50cnkgJiYgdHlwZW9mIGVudHJ5LnZhbHVlID09PSAnc3RyaW5nJyA/IGVudHJ5LnZhbHVlIDogZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFrZXkgfHwgIWVudHJ5IHx8IHR5cGVvZiBlbnRyeS52YWx1ZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgdmFsdWUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoa2V5LnRvVXBwZXJDYXNlKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdNRVNTQUdFUyc6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleSA9ICdtZXNzYWdlcyc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gIWlzTmFOKGVudHJ5LnZhbHVlKSA/IE51bWJlcihlbnRyeS52YWx1ZSkgOiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHVwZGF0ZUN1cnJlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBwcmV2Q291bnQgPSBjb25uZWN0aW9uLm1haWxib3guZXhpc3RzO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZXZDb3VudCAhPT0gdmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzb21laG93IG1lc3NhZ2UgY291bnQgaW4gY3VycmVudCBmb2xkZXIgaGFzIGNoYW5nZWQ/XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbi5tYWlsYm94LmV4aXN0cyA9IHZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24uZW1pdCgnZXhpc3RzJywge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRoLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDogdmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXZDb3VudFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnUkVDRU5UJzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5ID0gJ3JlY2VudCc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gIWlzTmFOKGVudHJ5LnZhbHVlKSA/IE51bWJlcihlbnRyeS52YWx1ZSkgOiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdVSURORVhUJzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5ID0gJ3VpZE5leHQnO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9ICFpc05hTihlbnRyeS52YWx1ZSkgPyBOdW1iZXIoZW50cnkudmFsdWUpIDogZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1cGRhdGVDdXJyZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uLm1haWxib3gudWlkTmV4dCA9IHZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnVUlEVkFMSURJVFknOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXkgPSAndWlkVmFsaWRpdHknO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9ICFpc05hTihlbnRyeS52YWx1ZSkgPyBCaWdJbnQoZW50cnkudmFsdWUpIDogZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnVU5TRUVOJzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5ID0gJ3Vuc2Vlbic7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gIWlzTmFOKGVudHJ5LnZhbHVlKSA/IE51bWJlcihlbnRyeS52YWx1ZSkgOiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdISUdIRVNUTU9EU0VRJzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5ID0gJ2hpZ2hlc3RNb2RzZXEnO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9ICFpc05hTihlbnRyeS52YWx1ZSkgPyBCaWdJbnQoZW50cnkudmFsdWUpIDogZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1cGRhdGVDdXJyZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uLm1haWxib3guaGlnaGVzdE1vZHNlcSA9IHZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgbWFwW2tleV0gPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmVzcG9uc2UubmV4dCgpO1xuICAgICAgICByZXR1cm4gbWFwO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBpZiAoZXJyLnJlc3BvbnNlU3RhdHVzID09PSAnTk8nKSB7XG4gICAgICAgICAgICBsZXQgZm9sZGVycyA9IGF3YWl0IGNvbm5lY3Rpb24ucnVuKCdMSVNUJywgJycsIHBhdGgsIHsgbGlzdE9ubHk6IHRydWUgfSk7XG4gICAgICAgICAgICBpZiAoZm9sZGVycyAmJiAhZm9sZGVycy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBsZXQgZXJyb3IgPSBuZXcgRXJyb3IoYE1haWxib3ggZG9lc24ndCBleGlzdDogJHtwYXRofWApO1xuICAgICAgICAgICAgICAgIGVycm9yLmNvZGUgPSAnTm90Rm91bmQnO1xuICAgICAgICAgICAgICAgIGVycm9yLnJlc3BvbnNlID0gZXJyO1xuICAgICAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29ubmVjdGlvbi5sb2cud2Fybih7IGVyciwgY2lkOiBjb25uZWN0aW9uLmlkIH0pO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxufTtcbiJdLCJuYW1lcyI6W10sImlnbm9yZUxpc3QiOlswXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(rsc)/./node_modules/imapflow/lib/commands/status.js\n");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "(rsc)/./node_modules/imapflow/lib/commands/store.js":
|
|
/*!*****************************************************!*\
|
|
!*** ./node_modules/imapflow/lib/commands/store.js ***!
|
|
\*****************************************************/
|
|
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
|
|
|
|
eval("\n\nconst { getStatusCode, formatFlag, canUseFlag, getErrorText } = __webpack_require__(/*! ../tools.js */ \"(rsc)/./node_modules/imapflow/lib/tools.js\");\n\n// Updates flags for a message\nmodule.exports = async (connection, range, flags, options) => {\n if (connection.state !== connection.states.SELECTED || !range || (options.useLabels && !connection.capabilities.has('X-GM-EXT-1'))) {\n // nothing to do here\n return false;\n }\n\n options = options || {};\n let operation;\n\n operation = 'FLAGS';\n\n if (options.useLabels) {\n operation = 'X-GM-LABELS';\n } else if (options.silent) {\n operation = `${operation}.SILENT`;\n }\n\n switch ((options.operation || '').toLowerCase()) {\n case 'set':\n // do nothing, keep operation value as is\n break;\n case 'remove':\n operation = `-${operation}`;\n break;\n case 'add':\n default:\n operation = `+${operation}`;\n break;\n }\n\n flags = (Array.isArray(flags) ? flags : [].concat(flags || []))\n .map(flag => {\n flag = formatFlag(flag);\n\n if (!canUseFlag(connection.mailbox, flag) && operation !== 'remove') {\n // it does not seem that we can set this flag\n return false;\n }\n\n return flag;\n })\n .filter(flag => flag);\n\n if (!flags.length && options.operation !== 'set') {\n // nothing to do here\n return false;\n }\n\n let attributes = [{ type: 'SEQUENCE', value: range }, { type: 'ATOM', value: operation }, flags.map(flag => ({ type: 'ATOM', value: flag }))];\n\n if (options.unchangedSince && connection.enabled.has('CONDSTORE') && !connection.mailbox.noModseq) {\n attributes.push([\n {\n type: 'ATOM',\n value: 'UNCHANGEDSINCE'\n },\n {\n type: 'ATOM',\n value: options.unchangedSince.toString()\n }\n ]);\n }\n\n let response;\n try {\n response = await connection.exec(options.uid ? 'UID STORE' : 'STORE', attributes);\n response.next();\n return true;\n } catch (err) {\n let errorCode = getStatusCode(err.response);\n if (errorCode) {\n err.serverResponseCode = errorCode;\n }\n err.response = await getErrorText(err.response);\n\n connection.log.warn({ err, cid: connection.id });\n return false;\n }\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHJzYykvLi9ub2RlX21vZHVsZXMvaW1hcGZsb3cvbGliL2NvbW1hbmRzL3N0b3JlLmpzIiwibWFwcGluZ3MiOiJBQUFhOztBQUViLFFBQVEsc0RBQXNELEVBQUUsbUJBQU8sQ0FBQywrREFBYTs7QUFFckY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLE1BQU07QUFDTix1QkFBdUIsVUFBVTtBQUNqQzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNEJBQTRCLFVBQVU7QUFDdEM7QUFDQTtBQUNBO0FBQ0EsNEJBQTRCLFVBQVU7QUFDdEM7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxTQUFTO0FBQ1Q7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsd0JBQXdCLGdDQUFnQyxJQUFJLGdDQUFnQyx1QkFBdUIsMkJBQTJCOztBQUU5STtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsOEJBQThCLHlCQUF5QjtBQUN2RDtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIi9ob21lL2FsbWEvbmV4dGdlbi9OZWFoLW1haWwvbm9kZV9tb2R1bGVzL2ltYXBmbG93L2xpYi9jb21tYW5kcy9zdG9yZS5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbmNvbnN0IHsgZ2V0U3RhdHVzQ29kZSwgZm9ybWF0RmxhZywgY2FuVXNlRmxhZywgZ2V0RXJyb3JUZXh0IH0gPSByZXF1aXJlKCcuLi90b29scy5qcycpO1xuXG4vLyBVcGRhdGVzIGZsYWdzIGZvciBhIG1lc3NhZ2Vcbm1vZHVsZS5leHBvcnRzID0gYXN5bmMgKGNvbm5lY3Rpb24sIHJhbmdlLCBmbGFncywgb3B0aW9ucykgPT4ge1xuICAgIGlmIChjb25uZWN0aW9uLnN0YXRlICE9PSBjb25uZWN0aW9uLnN0YXRlcy5TRUxFQ1RFRCB8fCAhcmFuZ2UgfHwgKG9wdGlvbnMudXNlTGFiZWxzICYmICFjb25uZWN0aW9uLmNhcGFiaWxpdGllcy5oYXMoJ1gtR00tRVhULTEnKSkpIHtcbiAgICAgICAgLy8gbm90aGluZyB0byBkbyBoZXJlXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgICBsZXQgb3BlcmF0aW9uO1xuXG4gICAgb3BlcmF0aW9uID0gJ0ZMQUdTJztcblxuICAgIGlmIChvcHRpb25zLnVzZUxhYmVscykge1xuICAgICAgICBvcGVyYXRpb24gPSAnWC1HTS1MQUJFTFMnO1xuICAgIH0gZWxzZSBpZiAob3B0aW9ucy5zaWxlbnQpIHtcbiAgICAgICAgb3BlcmF0aW9uID0gYCR7b3BlcmF0aW9ufS5TSUxFTlRgO1xuICAgIH1cblxuICAgIHN3aXRjaCAoKG9wdGlvbnMub3BlcmF0aW9uIHx8ICcnKS50b0xvd2VyQ2FzZSgpKSB7XG4gICAgICAgIGNhc2UgJ3NldCc6XG4gICAgICAgICAgICAvLyBkbyBub3RoaW5nLCBrZWVwIG9wZXJhdGlvbiB2YWx1ZSBhcyBpc1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ3JlbW92ZSc6XG4gICAgICAgICAgICBvcGVyYXRpb24gPSBgLSR7b3BlcmF0aW9ufWA7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnYWRkJzpcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIG9wZXJhdGlvbiA9IGArJHtvcGVyYXRpb259YDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIGZsYWdzID0gKEFycmF5LmlzQXJyYXkoZmxhZ3MpID8gZmxhZ3MgOiBbXS5jb25jYXQoZmxhZ3MgfHwgW10pKVxuICAgICAgICAubWFwKGZsYWcgPT4ge1xuICAgICAgICAgICAgZmxhZyA9IGZvcm1hdEZsYWcoZmxhZyk7XG5cbiAgICAgICAgICAgIGlmICghY2FuVXNlRmxhZyhjb25uZWN0aW9uLm1haWxib3gsIGZsYWcpICYmIG9wZXJhdGlvbiAhPT0gJ3JlbW92ZScpIHtcbiAgICAgICAgICAgICAgICAvLyBpdCBkb2VzIG5vdCBzZWVtIHRoYXQgd2UgY2FuIHNldCB0aGlzIGZsYWdcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBmbGFnO1xuICAgICAgICB9KVxuICAgICAgICAuZmlsdGVyKGZsYWcgPT4gZmxhZyk7XG5cbiAgICBpZiAoIWZsYWdzLmxlbmd0aCAmJiBvcHRpb25zLm9wZXJhdGlvbiAhPT0gJ3NldCcpIHtcbiAgICAgICAgLy8gbm90aGluZyB0byBkbyBoZXJlXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBsZXQgYXR0cmlidXRlcyA9IFt7IHR5cGU6ICdTRVFVRU5DRScsIHZhbHVlOiByYW5nZSB9LCB7IHR5cGU6ICdBVE9NJywgdmFsdWU6IG9wZXJhdGlvbiB9LCBmbGFncy5tYXAoZmxhZyA9PiAoeyB0eXBlOiAnQVRPTScsIHZhbHVlOiBmbGFnIH0pKV07XG5cbiAgICBpZiAob3B0aW9ucy51bmNoYW5nZWRTaW5jZSAmJiBjb25uZWN0aW9uLmVuYWJsZWQuaGFzKCdDT05EU1RPUkUnKSAmJiAhY29ubmVjdGlvbi5tYWlsYm94Lm5vTW9kc2VxKSB7XG4gICAgICAgIGF0dHJpYnV0ZXMucHVzaChbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdHlwZTogJ0FUT00nLFxuICAgICAgICAgICAgICAgIHZhbHVlOiAnVU5DSEFOR0VEU0lOQ0UnXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHR5cGU6ICdBVE9NJyxcbiAgICAgICAgICAgICAgICB2YWx1ZTogb3B0aW9ucy51bmNoYW5nZWRTaW5jZS50b1N0cmluZygpXG4gICAgICAgICAgICB9XG4gICAgICAgIF0pO1xuICAgIH1cblxuICAgIGxldCByZXNwb25zZTtcbiAgICB0cnkge1xuICAgICAgICByZXNwb25zZSA9IGF3YWl0IGNvbm5lY3Rpb24uZXhlYyhvcHRpb25zLnVpZCA/ICdVSUQgU1RPUkUnIDogJ1NUT1JFJywgYXR0cmlidXRlcyk7XG4gICAgICAgIHJlc3BvbnNlLm5leHQoKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGxldCBlcnJvckNvZGUgPSBnZXRTdGF0dXNDb2RlKGVyci5yZXNwb25zZSk7XG4gICAgICAgIGlmIChlcnJvckNvZGUpIHtcbiAgICAgICAgICAgIGVyci5zZXJ2ZXJSZXNwb25zZUNvZGUgPSBlcnJvckNvZGU7XG4gICAgICAgIH1cbiAgICAgICAgZXJyLnJlc3BvbnNlID0gYXdhaXQgZ2V0RXJyb3JUZXh0KGVyci5yZXNwb25zZSk7XG5cbiAgICAgICAgY29ubmVjdGlvbi5sb2cud2Fybih7IGVyciwgY2lkOiBjb25uZWN0aW9uLmlkIH0pO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxufTtcbiJdLCJuYW1lcyI6W10sImlnbm9yZUxpc3QiOlswXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(rsc)/./node_modules/imapflow/lib/commands/store.js\n");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "(rsc)/./node_modules/imapflow/lib/commands/subscribe.js":
|
|
/*!*********************************************************!*\
|
|
!*** ./node_modules/imapflow/lib/commands/subscribe.js ***!
|
|
\*********************************************************/
|
|
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
|
|
|
|
eval("\n\nconst { encodePath, normalizePath, getStatusCode, getErrorText } = __webpack_require__(/*! ../tools.js */ \"(rsc)/./node_modules/imapflow/lib/tools.js\");\n\n// Subscribes to a mailbox\nmodule.exports = async (connection, path) => {\n if (![connection.states.AUTHENTICATED, connection.states.SELECTED].includes(connection.state)) {\n // nothing to do here\n return;\n }\n\n path = normalizePath(connection, path);\n\n let response;\n try {\n response = await connection.exec('SUBSCRIBE', [{ type: 'ATOM', value: encodePath(connection, path) }]);\n response.next();\n return true;\n } catch (err) {\n let errorCode = getStatusCode(err.response);\n if (errorCode) {\n err.serverResponseCode = errorCode;\n }\n err.response = await getErrorText(err.response);\n\n connection.log.warn({ err, cid: connection.id });\n return false;\n }\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHJzYykvLi9ub2RlX21vZHVsZXMvaW1hcGZsb3cvbGliL2NvbW1hbmRzL3N1YnNjcmliZS5qcyIsIm1hcHBpbmdzIjoiQUFBYTs7QUFFYixRQUFRLHlEQUF5RCxFQUFFLG1CQUFPLENBQUMsK0RBQWE7O0FBRXhGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0EseURBQXlELG1EQUFtRDtBQUM1RztBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsOEJBQThCLHlCQUF5QjtBQUN2RDtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIi9ob21lL2FsbWEvbmV4dGdlbi9OZWFoLW1haWwvbm9kZV9tb2R1bGVzL2ltYXBmbG93L2xpYi9jb21tYW5kcy9zdWJzY3JpYmUuanMiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCB7IGVuY29kZVBhdGgsIG5vcm1hbGl6ZVBhdGgsIGdldFN0YXR1c0NvZGUsIGdldEVycm9yVGV4dCB9ID0gcmVxdWlyZSgnLi4vdG9vbHMuanMnKTtcblxuLy8gU3Vic2NyaWJlcyB0byBhIG1haWxib3hcbm1vZHVsZS5leHBvcnRzID0gYXN5bmMgKGNvbm5lY3Rpb24sIHBhdGgpID0+IHtcbiAgICBpZiAoIVtjb25uZWN0aW9uLnN0YXRlcy5BVVRIRU5USUNBVEVELCBjb25uZWN0aW9uLnN0YXRlcy5TRUxFQ1RFRF0uaW5jbHVkZXMoY29ubmVjdGlvbi5zdGF0ZSkpIHtcbiAgICAgICAgLy8gbm90aGluZyB0byBkbyBoZXJlXG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBwYXRoID0gbm9ybWFsaXplUGF0aChjb25uZWN0aW9uLCBwYXRoKTtcblxuICAgIGxldCByZXNwb25zZTtcbiAgICB0cnkge1xuICAgICAgICByZXNwb25zZSA9IGF3YWl0IGNvbm5lY3Rpb24uZXhlYygnU1VCU0NSSUJFJywgW3sgdHlwZTogJ0FUT00nLCB2YWx1ZTogZW5jb2RlUGF0aChjb25uZWN0aW9uLCBwYXRoKSB9XSk7XG4gICAgICAgIHJlc3BvbnNlLm5leHQoKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGxldCBlcnJvckNvZGUgPSBnZXRTdGF0dXNDb2RlKGVyci5yZXNwb25zZSk7XG4gICAgICAgIGlmIChlcnJvckNvZGUpIHtcbiAgICAgICAgICAgIGVyci5zZXJ2ZXJSZXNwb25zZUNvZGUgPSBlcnJvckNvZGU7XG4gICAgICAgIH1cbiAgICAgICAgZXJyLnJlc3BvbnNlID0gYXdhaXQgZ2V0RXJyb3JUZXh0KGVyci5yZXNwb25zZSk7XG5cbiAgICAgICAgY29ubmVjdGlvbi5sb2cud2Fybih7IGVyciwgY2lkOiBjb25uZWN0aW9uLmlkIH0pO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxufTtcbiJdLCJuYW1lcyI6W10sImlnbm9yZUxpc3QiOlswXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(rsc)/./node_modules/imapflow/lib/commands/subscribe.js\n");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "(rsc)/./node_modules/imapflow/lib/commands/unsubscribe.js":
|
|
/*!***********************************************************!*\
|
|
!*** ./node_modules/imapflow/lib/commands/unsubscribe.js ***!
|
|
\***********************************************************/
|
|
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
|
|
|
|
eval("\n\nconst { encodePath, normalizePath, getStatusCode, getErrorText } = __webpack_require__(/*! ../tools.js */ \"(rsc)/./node_modules/imapflow/lib/tools.js\");\n\n// Unsubscribes from a mailbox\nmodule.exports = async (connection, path) => {\n if (![connection.states.AUTHENTICATED, connection.states.SELECTED].includes(connection.state)) {\n // nothing to do here\n return;\n }\n\n path = normalizePath(connection, path);\n\n let response;\n try {\n response = await connection.exec('UNSUBSCRIBE', [{ type: 'ATOM', value: encodePath(connection, path) }]);\n response.next();\n return true;\n } catch (err) {\n let errorCode = getStatusCode(err.response);\n if (errorCode) {\n err.serverResponseCode = errorCode;\n }\n\n err.response = await getErrorText(err.response);\n\n connection.log.warn({ err, cid: connection.id });\n return false;\n }\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHJzYykvLi9ub2RlX21vZHVsZXMvaW1hcGZsb3cvbGliL2NvbW1hbmRzL3Vuc3Vic2NyaWJlLmpzIiwibWFwcGluZ3MiOiJBQUFhOztBQUViLFFBQVEseURBQXlELEVBQUUsbUJBQU8sQ0FBQywrREFBYTs7QUFFeEY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQSwyREFBMkQsbURBQW1EO0FBQzlHO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUEsOEJBQThCLHlCQUF5QjtBQUN2RDtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIi9ob21lL2FsbWEvbmV4dGdlbi9OZWFoLW1haWwvbm9kZV9tb2R1bGVzL2ltYXBmbG93L2xpYi9jb21tYW5kcy91bnN1YnNjcmliZS5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbmNvbnN0IHsgZW5jb2RlUGF0aCwgbm9ybWFsaXplUGF0aCwgZ2V0U3RhdHVzQ29kZSwgZ2V0RXJyb3JUZXh0IH0gPSByZXF1aXJlKCcuLi90b29scy5qcycpO1xuXG4vLyBVbnN1YnNjcmliZXMgZnJvbSBhIG1haWxib3hcbm1vZHVsZS5leHBvcnRzID0gYXN5bmMgKGNvbm5lY3Rpb24sIHBhdGgpID0+IHtcbiAgICBpZiAoIVtjb25uZWN0aW9uLnN0YXRlcy5BVVRIRU5USUNBVEVELCBjb25uZWN0aW9uLnN0YXRlcy5TRUxFQ1RFRF0uaW5jbHVkZXMoY29ubmVjdGlvbi5zdGF0ZSkpIHtcbiAgICAgICAgLy8gbm90aGluZyB0byBkbyBoZXJlXG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBwYXRoID0gbm9ybWFsaXplUGF0aChjb25uZWN0aW9uLCBwYXRoKTtcblxuICAgIGxldCByZXNwb25zZTtcbiAgICB0cnkge1xuICAgICAgICByZXNwb25zZSA9IGF3YWl0IGNvbm5lY3Rpb24uZXhlYygnVU5TVUJTQ1JJQkUnLCBbeyB0eXBlOiAnQVRPTScsIHZhbHVlOiBlbmNvZGVQYXRoKGNvbm5lY3Rpb24sIHBhdGgpIH1dKTtcbiAgICAgICAgcmVzcG9uc2UubmV4dCgpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgbGV0IGVycm9yQ29kZSA9IGdldFN0YXR1c0NvZGUoZXJyLnJlc3BvbnNlKTtcbiAgICAgICAgaWYgKGVycm9yQ29kZSkge1xuICAgICAgICAgICAgZXJyLnNlcnZlclJlc3BvbnNlQ29kZSA9IGVycm9yQ29kZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGVyci5yZXNwb25zZSA9IGF3YWl0IGdldEVycm9yVGV4dChlcnIucmVzcG9uc2UpO1xuXG4gICAgICAgIGNvbm5lY3Rpb24ubG9nLndhcm4oeyBlcnIsIGNpZDogY29ubmVjdGlvbi5pZCB9KTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbn07XG4iXSwibmFtZXMiOltdLCJpZ25vcmVMaXN0IjpbMF0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(rsc)/./node_modules/imapflow/lib/commands/unsubscribe.js\n");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "(rsc)/./node_modules/imapflow/lib/handler/imap-compiler.js":
|
|
/*!************************************************************!*\
|
|
!*** ./node_modules/imapflow/lib/handler/imap-compiler.js ***!
|
|
\************************************************************/
|
|
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
|
|
|
|
eval("/* eslint no-console: 0, new-cap: 0 */\n\n\n\nconst imapFormalSyntax = __webpack_require__(/*! ./imap-formal-syntax */ \"(rsc)/./node_modules/imapflow/lib/handler/imap-formal-syntax.js\");\n\nconst formatRespEntry = (entry, returnEmpty) => {\n if (typeof entry === 'string') {\n return Buffer.from(entry);\n }\n\n if (typeof entry === 'number') {\n return Buffer.from(entry.toString());\n }\n\n if (Buffer.isBuffer(entry)) {\n return entry;\n }\n\n if (returnEmpty) {\n return null;\n }\n\n return Buffer.alloc(0);\n};\n\n/**\n * Compiles an input object into\n */\nmodule.exports = async (response, options) => {\n let { asArray, isLogging, literalPlus, literalMinus } = options || {};\n const respParts = [];\n\n let resp = [].concat(formatRespEntry(response.tag, true) || []).concat(response.command ? formatRespEntry(' ' + response.command) : []);\n let val;\n let lastType;\n\n let walk = async (node, options) => {\n options = options || {};\n\n let lastRespEntry = resp.length && resp[resp.length - 1];\n let lastRespByte = (lastRespEntry && lastRespEntry.length && lastRespEntry[lastRespEntry.length - 1]) || '';\n if (typeof lastRespByte === 'number') {\n lastRespByte = String.fromCharCode(lastRespByte);\n }\n\n if (lastType === 'LITERAL' || (!['(', '<', '['].includes(lastRespByte) && resp.length)) {\n if (options.subArray) {\n // ignore separator\n } else {\n resp.push(formatRespEntry(' '));\n }\n }\n\n if (node && node.buffer && !Buffer.isBuffer(node)) {\n // mongodb binary\n node = node.buffer;\n }\n\n if (Array.isArray(node)) {\n lastType = 'LIST';\n resp.push(formatRespEntry('('));\n\n // check if we need to skip separator WS between two arrays\n let subArray = node.length > 1 && Array.isArray(node[0]);\n\n for (let child of node) {\n if (subArray && !Array.isArray(child)) {\n subArray = false;\n }\n await walk(child, { subArray });\n }\n\n resp.push(formatRespEntry(')'));\n return;\n }\n\n if (!node && typeof node !== 'string' && typeof node !== 'number' && !Buffer.isBuffer(node)) {\n resp.push(formatRespEntry('NIL'));\n return;\n }\n\n if (typeof node === 'string' || Buffer.isBuffer(node)) {\n if (isLogging && node.length > 100) {\n resp.push(formatRespEntry('\"(* ' + node.length + 'B string *)\"'));\n } else {\n resp.push(formatRespEntry(JSON.stringify(node.toString())));\n }\n return;\n }\n\n if (typeof node === 'number') {\n resp.push(formatRespEntry(Math.round(node) || 0)); // Only integers allowed\n return;\n }\n\n lastType = node.type;\n\n if (isLogging && node.sensitive) {\n resp.push(formatRespEntry('\"(* value hidden *)\"'));\n return;\n }\n\n switch (node.type.toUpperCase()) {\n case 'LITERAL':\n if (isLogging) {\n resp.push(formatRespEntry('\"(* ' + node.value.length + 'B literal *)\"'));\n } else {\n let literalLength = !node.value ? 0 : Math.max(node.value.length, 0);\n\n let canAppend = !asArray || literalPlus || (literalMinus && literalLength <= 4096);\n let usePlus = canAppend && (literalMinus || literalPlus);\n\n resp.push(formatRespEntry(`${node.isLiteral8 ? '~' : ''}{${literalLength}${usePlus ? '+' : ''}}\\r\\n`));\n\n if (canAppend) {\n if (node.value && node.value.length) {\n resp.push(formatRespEntry(node.value));\n }\n } else {\n respParts.push(resp);\n resp = [].concat(formatRespEntry(node.value, true) || []);\n }\n }\n break;\n\n case 'STRING':\n if (isLogging && node.value.length > 100) {\n resp.push(formatRespEntry('\"(* ' + node.value.length + 'B string *)\"'));\n } else {\n resp.push(formatRespEntry(JSON.stringify((node.value || '').toString())));\n }\n break;\n\n case 'TEXT':\n case 'SEQUENCE':\n if (node.value) {\n resp.push(formatRespEntry(node.value));\n }\n break;\n\n case 'NUMBER':\n resp.push(formatRespEntry(node.value || 0));\n break;\n\n case 'ATOM':\n case 'SECTION':\n val = (node.value || '').toString();\n\n if (!node.section || val) {\n if (node.value === '' || imapFormalSyntax.verify(val.charAt(0) === '\\\\' ? val.substr(1) : val, imapFormalSyntax['ATOM-CHAR']()) >= 0) {\n val = JSON.stringify(val);\n }\n\n resp.push(formatRespEntry(val));\n }\n\n if (node.section) {\n resp.push(formatRespEntry('['));\n\n for (let child of node.section) {\n await walk(child);\n }\n\n resp.push(formatRespEntry(']'));\n }\n if (node.partial) {\n resp.push(formatRespEntry(`<${node.partial.join('.')}>`));\n }\n break;\n }\n };\n\n if (response.attributes) {\n let attributes = Array.isArray(response.attributes) ? response.attributes : [].concat(response.attributes);\n for (let child of attributes) {\n await walk(child);\n }\n }\n\n if (resp.length) {\n respParts.push(resp);\n }\n\n for (let i = 0; i < respParts.length; i++) {\n respParts[i] = Buffer.concat(respParts[i]);\n }\n\n return asArray ? respParts : respParts.flatMap(entry => entry);\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHJzYykvLi9ub2RlX21vZHVsZXMvaW1hcGZsb3cvbGliL2hhbmRsZXIvaW1hcC1jb21waWxlci5qcyIsIm1hcHBpbmdzIjoiQUFBQTs7QUFFYTs7QUFFYix5QkFBeUIsbUJBQU8sQ0FBQyw2RkFBc0I7O0FBRXZEO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVLGdEQUFnRDtBQUMxRDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQ0FBb0MsVUFBVTtBQUM5Qzs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsK0RBQStEO0FBQy9EO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0I7QUFDbEI7O0FBRUE7QUFDQTs7QUFFQSxpREFBaUQsNEJBQTRCLEVBQUUsY0FBYyxFQUFFLG9CQUFvQjs7QUFFbkg7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0I7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0I7QUFDbEI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0Esa0RBQWtELHVCQUF1QjtBQUN6RTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLG9CQUFvQixzQkFBc0I7QUFDMUM7QUFDQTs7QUFFQTtBQUNBIiwic291cmNlcyI6WyIvaG9tZS9hbG1hL25leHRnZW4vTmVhaC1tYWlsL25vZGVfbW9kdWxlcy9pbWFwZmxvdy9saWIvaGFuZGxlci9pbWFwLWNvbXBpbGVyLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludCBuby1jb25zb2xlOiAwLCBuZXctY2FwOiAwICovXG5cbid1c2Ugc3RyaWN0JztcblxuY29uc3QgaW1hcEZvcm1hbFN5bnRheCA9IHJlcXVpcmUoJy4vaW1hcC1mb3JtYWwtc3ludGF4Jyk7XG5cbmNvbnN0IGZvcm1hdFJlc3BFbnRyeSA9IChlbnRyeSwgcmV0dXJuRW1wdHkpID0+IHtcbiAgICBpZiAodHlwZW9mIGVudHJ5ID09PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm4gQnVmZmVyLmZyb20oZW50cnkpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgZW50cnkgPT09ICdudW1iZXInKSB7XG4gICAgICAgIHJldHVybiBCdWZmZXIuZnJvbShlbnRyeS50b1N0cmluZygpKTtcbiAgICB9XG5cbiAgICBpZiAoQnVmZmVyLmlzQnVmZmVyKGVudHJ5KSkge1xuICAgICAgICByZXR1cm4gZW50cnk7XG4gICAgfVxuXG4gICAgaWYgKHJldHVybkVtcHR5KSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiBCdWZmZXIuYWxsb2MoMCk7XG59O1xuXG4vKipcbiAqIENvbXBpbGVzIGFuIGlucHV0IG9iamVjdCBpbnRvXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gYXN5bmMgKHJlc3BvbnNlLCBvcHRpb25zKSA9PiB7XG4gICAgbGV0IHsgYXNBcnJheSwgaXNMb2dnaW5nLCBsaXRlcmFsUGx1cywgbGl0ZXJhbE1pbnVzIH0gPSBvcHRpb25zIHx8IHt9O1xuICAgIGNvbnN0IHJlc3BQYXJ0cyA9IFtdO1xuXG4gICAgbGV0IHJlc3AgPSBbXS5jb25jYXQoZm9ybWF0UmVzcEVudHJ5KHJlc3BvbnNlLnRhZywgdHJ1ZSkgfHwgW10pLmNvbmNhdChyZXNwb25zZS5jb21tYW5kID8gZm9ybWF0UmVzcEVudHJ5KCcgJyArIHJlc3BvbnNlLmNvbW1hbmQpIDogW10pO1xuICAgIGxldCB2YWw7XG4gICAgbGV0IGxhc3RUeXBlO1xuXG4gICAgbGV0IHdhbGsgPSBhc3luYyAobm9kZSwgb3B0aW9ucykgPT4ge1xuICAgICAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcblxuICAgICAgICBsZXQgbGFzdFJlc3BFbnRyeSA9IHJlc3AubGVuZ3RoICYmIHJlc3BbcmVzcC5sZW5ndGggLSAxXTtcbiAgICAgICAgbGV0IGxhc3RSZXNwQnl0ZSA9IChsYXN0UmVzcEVudHJ5ICYmIGxhc3RSZXNwRW50cnkubGVuZ3RoICYmIGxhc3RSZXNwRW50cnlbbGFzdFJlc3BFbnRyeS5sZW5ndGggLSAxXSkgfHwgJyc7XG4gICAgICAgIGlmICh0eXBlb2YgbGFzdFJlc3BCeXRlID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgbGFzdFJlc3BCeXRlID0gU3RyaW5nLmZyb21DaGFyQ29kZShsYXN0UmVzcEJ5dGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGxhc3RUeXBlID09PSAnTElURVJBTCcgfHwgKCFbJygnLCAnPCcsICdbJ10uaW5jbHVkZXMobGFzdFJlc3BCeXRlKSAmJiByZXNwLmxlbmd0aCkpIHtcbiAgICAgICAgICAgIGlmIChvcHRpb25zLnN1YkFycmF5KSB7XG4gICAgICAgICAgICAgICAgLy8gaWdub3JlIHNlcGFyYXRvclxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXNwLnB1c2goZm9ybWF0UmVzcEVudHJ5KCcgJykpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG5vZGUgJiYgbm9kZS5idWZmZXIgJiYgIUJ1ZmZlci5pc0J1ZmZlcihub2RlKSkge1xuICAgICAgICAgICAgLy8gbW9uZ29kYiBiaW5hcnlcbiAgICAgICAgICAgIG5vZGUgPSBub2RlLmJ1ZmZlcjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KG5vZGUpKSB7XG4gICAgICAgICAgICBsYXN0VHlwZSA9ICdMSVNUJztcbiAgICAgICAgICAgIHJlc3AucHVzaChmb3JtYXRSZXNwRW50cnkoJygnKSk7XG5cbiAgICAgICAgICAgIC8vIGNoZWNrIGlmIHdlIG5lZWQgdG8gc2tpcCBzZXBhcmF0b3IgV1MgYmV0d2VlbiB0d28gYXJyYXlzXG4gICAgICAgICAgICBsZXQgc3ViQXJyYXkgPSBub2RlLmxlbmd0aCA+IDEgJiYgQXJyYXkuaXNBcnJheShub2RlWzBdKTtcblxuICAgICAgICAgICAgZm9yIChsZXQgY2hpbGQgb2Ygbm9kZSkge1xuICAgICAgICAgICAgICAgIGlmIChzdWJBcnJheSAmJiAhQXJyYXkuaXNBcnJheShjaGlsZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgc3ViQXJyYXkgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYXdhaXQgd2FsayhjaGlsZCwgeyBzdWJBcnJheSB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmVzcC5wdXNoKGZvcm1hdFJlc3BFbnRyeSgnKScpKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghbm9kZSAmJiB0eXBlb2Ygbm9kZSAhPT0gJ3N0cmluZycgJiYgdHlwZW9mIG5vZGUgIT09ICdudW1iZXInICYmICFCdWZmZXIuaXNCdWZmZXIobm9kZSkpIHtcbiAgICAgICAgICAgIHJlc3AucHVzaChmb3JtYXRSZXNwRW50cnkoJ05JTCcpKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0eXBlb2Ygbm9kZSA9PT0gJ3N0cmluZycgfHwgQnVmZmVyLmlzQnVmZmVyKG5vZGUpKSB7XG4gICAgICAgICAgICBpZiAoaXNMb2dnaW5nICYmIG5vZGUubGVuZ3RoID4gMTAwKSB7XG4gICAgICAgICAgICAgICAgcmVzcC5wdXNoKGZvcm1hdFJlc3BFbnRyeSgnXCIoKiAnICsgbm9kZS5sZW5ndGggKyAnQiBzdHJpbmcgKilcIicpKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVzcC5wdXNoKGZvcm1hdFJlc3BFbnRyeShKU09OLnN0cmluZ2lmeShub2RlLnRvU3RyaW5nKCkpKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZW9mIG5vZGUgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICByZXNwLnB1c2goZm9ybWF0UmVzcEVudHJ5KE1hdGgucm91bmQobm9kZSkgfHwgMCkpOyAvLyBPbmx5IGludGVnZXJzIGFsbG93ZWRcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGxhc3RUeXBlID0gbm9kZS50eXBlO1xuXG4gICAgICAgIGlmIChpc0xvZ2dpbmcgJiYgbm9kZS5zZW5zaXRpdmUpIHtcbiAgICAgICAgICAgIHJlc3AucHVzaChmb3JtYXRSZXNwRW50cnkoJ1wiKCogdmFsdWUgaGlkZGVuICopXCInKSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBzd2l0Y2ggKG5vZGUudHlwZS50b1VwcGVyQ2FzZSgpKSB7XG4gICAgICAgICAgICBjYXNlICdMSVRFUkFMJzpcbiAgICAgICAgICAgICAgICBpZiAoaXNMb2dnaW5nKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3AucHVzaChmb3JtYXRSZXNwRW50cnkoJ1wiKCogJyArIG5vZGUudmFsdWUubGVuZ3RoICsgJ0IgbGl0ZXJhbCAqKVwiJykpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBsaXRlcmFsTGVuZ3RoID0gIW5vZGUudmFsdWUgPyAwIDogTWF0aC5tYXgobm9kZS52YWx1ZS5sZW5ndGgsIDApO1xuXG4gICAgICAgICAgICAgICAgICAgIGxldCBjYW5BcHBlbmQgPSAhYXNBcnJheSB8fCBsaXRlcmFsUGx1cyB8fCAobGl0ZXJhbE1pbnVzICYmIGxpdGVyYWxMZW5ndGggPD0gNDA5Nik7XG4gICAgICAgICAgICAgICAgICAgIGxldCB1c2VQbHVzID0gY2FuQXBwZW5kICYmIChsaXRlcmFsTWludXMgfHwgbGl0ZXJhbFBsdXMpO1xuXG4gICAgICAgICAgICAgICAgICAgIHJlc3AucHVzaChmb3JtYXRSZXNwRW50cnkoYCR7bm9kZS5pc0xpdGVyYWw4ID8gJ34nIDogJyd9eyR7bGl0ZXJhbExlbmd0aH0ke3VzZVBsdXMgPyAnKycgOiAnJ319XFxyXFxuYCkpO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChjYW5BcHBlbmQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChub2RlLnZhbHVlICYmIG5vZGUudmFsdWUubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcC5wdXNoKGZvcm1hdFJlc3BFbnRyeShub2RlLnZhbHVlKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNwUGFydHMucHVzaChyZXNwKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3AgPSBbXS5jb25jYXQoZm9ybWF0UmVzcEVudHJ5KG5vZGUudmFsdWUsIHRydWUpIHx8IFtdKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgY2FzZSAnU1RSSU5HJzpcbiAgICAgICAgICAgICAgICBpZiAoaXNMb2dnaW5nICYmIG5vZGUudmFsdWUubGVuZ3RoID4gMTAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3AucHVzaChmb3JtYXRSZXNwRW50cnkoJ1wiKCogJyArIG5vZGUudmFsdWUubGVuZ3RoICsgJ0Igc3RyaW5nICopXCInKSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzcC5wdXNoKGZvcm1hdFJlc3BFbnRyeShKU09OLnN0cmluZ2lmeSgobm9kZS52YWx1ZSB8fCAnJykudG9TdHJpbmcoKSkpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIGNhc2UgJ1RFWFQnOlxuICAgICAgICAgICAgY2FzZSAnU0VRVUVOQ0UnOlxuICAgICAgICAgICAgICAgIGlmIChub2RlLnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3AucHVzaChmb3JtYXRSZXNwRW50cnkobm9kZS52YWx1ZSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgY2FzZSAnTlVNQkVSJzpcbiAgICAgICAgICAgICAgICByZXNwLnB1c2goZm9ybWF0UmVzcEVudHJ5KG5vZGUudmFsdWUgfHwgMCkpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICBjYXNlICdBVE9NJzpcbiAgICAgICAgICAgIGNhc2UgJ1NFQ1RJT04nOlxuICAgICAgICAgICAgICAgIHZhbCA9IChub2RlLnZhbHVlIHx8ICcnKS50b1N0cmluZygpO1xuXG4gICAgICAgICAgICAgICAgaWYgKCFub2RlLnNlY3Rpb24gfHwgdmFsKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChub2RlLnZhbHVlID09PSAnJyB8fCBpbWFwRm9ybWFsU3ludGF4LnZlcmlmeSh2YWwuY2hhckF0KDApID09PSAnXFxcXCcgPyB2YWwuc3Vic3RyKDEpIDogdmFsLCBpbWFwRm9ybWFsU3ludGF4WydBVE9NLUNIQVInXSgpKSA+PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWwgPSBKU09OLnN0cmluZ2lmeSh2YWwpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgcmVzcC5wdXNoKGZvcm1hdFJlc3BFbnRyeSh2YWwpKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAobm9kZS5zZWN0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3AucHVzaChmb3JtYXRSZXNwRW50cnkoJ1snKSk7XG5cbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgY2hpbGQgb2Ygbm9kZS5zZWN0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCB3YWxrKGNoaWxkKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHJlc3AucHVzaChmb3JtYXRSZXNwRW50cnkoJ10nKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChub2RlLnBhcnRpYWwpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzcC5wdXNoKGZvcm1hdFJlc3BFbnRyeShgPCR7bm9kZS5wYXJ0aWFsLmpvaW4oJy4nKX0+YCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICBpZiAocmVzcG9uc2UuYXR0cmlidXRlcykge1xuICAgICAgICBsZXQgYXR0cmlidXRlcyA9IEFycmF5LmlzQXJyYXkocmVzcG9uc2UuYXR0cmlidXRlcykgPyByZXNwb25zZS5hdHRyaWJ1dGVzIDogW10uY29uY2F0KHJlc3BvbnNlLmF0dHJpYnV0ZXMpO1xuICAgICAgICBmb3IgKGxldCBjaGlsZCBvZiBhdHRyaWJ1dGVzKSB7XG4gICAgICAgICAgICBhd2FpdCB3YWxrKGNoaWxkKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGlmIChyZXNwLmxlbmd0aCkge1xuICAgICAgICByZXNwUGFydHMucHVzaChyZXNwKTtcbiAgICB9XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJlc3BQYXJ0cy5sZW5ndGg7IGkrKykge1xuICAgICAgICByZXNwUGFydHNbaV0gPSBCdWZmZXIuY29uY2F0KHJlc3BQYXJ0c1tpXSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGFzQXJyYXkgPyByZXNwUGFydHMgOiByZXNwUGFydHMuZmxhdE1hcChlbnRyeSA9PiBlbnRyeSk7XG59O1xuIl0sIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6WzBdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(rsc)/./node_modules/imapflow/lib/handler/imap-compiler.js\n");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "(rsc)/./node_modules/imapflow/lib/handler/imap-formal-syntax.js":
|
|
/*!*****************************************************************!*\
|
|
!*** ./node_modules/imapflow/lib/handler/imap-formal-syntax.js ***!
|
|
\*****************************************************************/
|
|
/***/ ((module) => {
|
|
|
|
eval("/* eslint object-shorthand:0, new-cap: 0, no-useless-concat: 0 */\n\n\n\n// IMAP Formal Syntax\n// http://tools.ietf.org/html/rfc3501#section-9\n\nfunction expandRange(start, end) {\n let chars = [];\n for (let i = start; i <= end; i++) {\n chars.push(i);\n }\n return String.fromCharCode(...chars);\n}\n\nfunction excludeChars(source, exclude) {\n let sourceArr = Array.prototype.slice.call(source);\n for (let i = sourceArr.length - 1; i >= 0; i--) {\n if (exclude.indexOf(sourceArr[i]) >= 0) {\n sourceArr.splice(i, 1);\n }\n }\n return sourceArr.join('');\n}\n\nmodule.exports = {\n CHAR() {\n let value = expandRange(0x01, 0x7f);\n this.CHAR = function () {\n return value;\n };\n return value;\n },\n\n CHAR8() {\n let value = expandRange(0x01, 0xff);\n this.CHAR8 = function () {\n return value;\n };\n return value;\n },\n\n SP() {\n return ' ';\n },\n\n CTL() {\n let value = expandRange(0x00, 0x1f) + '\\x7F';\n this.CTL = function () {\n return value;\n };\n return value;\n },\n\n DQUOTE() {\n return '\"';\n },\n\n ALPHA() {\n let value = expandRange(0x41, 0x5a) + expandRange(0x61, 0x7a);\n this.ALPHA = function () {\n return value;\n };\n return value;\n },\n\n DIGIT() {\n let value = expandRange(0x30, 0x39);\n this.DIGIT = function () {\n return value;\n };\n return value;\n },\n\n 'ATOM-CHAR'() {\n let value = excludeChars(this.CHAR(), this['atom-specials']());\n this['ATOM-CHAR'] = function () {\n return value;\n };\n return value;\n },\n\n 'ASTRING-CHAR'() {\n let value = this['ATOM-CHAR']() + this['resp-specials']();\n this['ASTRING-CHAR'] = function () {\n return value;\n };\n return value;\n },\n\n 'TEXT-CHAR'() {\n let value = excludeChars(this.CHAR(), '\\r\\n');\n this['TEXT-CHAR'] = function () {\n return value;\n };\n return value;\n },\n\n 'atom-specials'() {\n let value = '(' + ')' + '{' + this.SP() + this.CTL() + this['list-wildcards']() + this['quoted-specials']() + this['resp-specials']();\n this['atom-specials'] = function () {\n return value;\n };\n return value;\n },\n\n 'list-wildcards'() {\n return '%' + '*';\n },\n\n 'quoted-specials'() {\n let value = this.DQUOTE() + '\\\\';\n this['quoted-specials'] = function () {\n return value;\n };\n return value;\n },\n\n 'resp-specials'() {\n return ']';\n },\n\n tag() {\n let value = excludeChars(this['ASTRING-CHAR'](), '+');\n this.tag = function () {\n return value;\n };\n return value;\n },\n\n command() {\n let value = this.ALPHA() + this.DIGIT() + '-';\n this.command = function () {\n return value;\n };\n return value;\n },\n\n verify(str, allowedChars) {\n for (let i = 0, len = str.length; i < len; i++) {\n if (allowedChars.indexOf(str.charAt(i)) < 0) {\n return i;\n }\n }\n return -1;\n }\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHJzYykvLi9ub2RlX21vZHVsZXMvaW1hcGZsb3cvbGliL2hhbmRsZXIvaW1hcC1mb3JtYWwtc3ludGF4LmpzIiwibWFwcGluZ3MiOiJBQUFBOztBQUVhOztBQUViO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLHdCQUF3QixVQUFVO0FBQ2xDO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSx1Q0FBdUMsUUFBUTtBQUMvQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQSxrQ0FBa0M7QUFDbEM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0EsMENBQTBDLFNBQVM7QUFDbkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIi9ob21lL2FsbWEvbmV4dGdlbi9OZWFoLW1haWwvbm9kZV9tb2R1bGVzL2ltYXBmbG93L2xpYi9oYW5kbGVyL2ltYXAtZm9ybWFsLXN5bnRheC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQgb2JqZWN0LXNob3J0aGFuZDowLCBuZXctY2FwOiAwLCBuby11c2VsZXNzLWNvbmNhdDogMCAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbi8vIElNQVAgRm9ybWFsIFN5bnRheFxuLy8gaHR0cDovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjMzUwMSNzZWN0aW9uLTlcblxuZnVuY3Rpb24gZXhwYW5kUmFuZ2Uoc3RhcnQsIGVuZCkge1xuICAgIGxldCBjaGFycyA9IFtdO1xuICAgIGZvciAobGV0IGkgPSBzdGFydDsgaSA8PSBlbmQ7IGkrKykge1xuICAgICAgICBjaGFycy5wdXNoKGkpO1xuICAgIH1cbiAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZSguLi5jaGFycyk7XG59XG5cbmZ1bmN0aW9uIGV4Y2x1ZGVDaGFycyhzb3VyY2UsIGV4Y2x1ZGUpIHtcbiAgICBsZXQgc291cmNlQXJyID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoc291cmNlKTtcbiAgICBmb3IgKGxldCBpID0gc291cmNlQXJyLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgIGlmIChleGNsdWRlLmluZGV4T2Yoc291cmNlQXJyW2ldKSA+PSAwKSB7XG4gICAgICAgICAgICBzb3VyY2VBcnIuc3BsaWNlKGksIDEpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBzb3VyY2VBcnIuam9pbignJyk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICAgIENIQVIoKSB7XG4gICAgICAgIGxldCB2YWx1ZSA9IGV4cGFuZFJhbmdlKDB4MDEsIDB4N2YpO1xuICAgICAgICB0aGlzLkNIQVIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9LFxuXG4gICAgQ0hBUjgoKSB7XG4gICAgICAgIGxldCB2YWx1ZSA9IGV4cGFuZFJhbmdlKDB4MDEsIDB4ZmYpO1xuICAgICAgICB0aGlzLkNIQVI4ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfSxcblxuICAgIFNQKCkge1xuICAgICAgICByZXR1cm4gJyAnO1xuICAgIH0sXG5cbiAgICBDVEwoKSB7XG4gICAgICAgIGxldCB2YWx1ZSA9IGV4cGFuZFJhbmdlKDB4MDAsIDB4MWYpICsgJ1xceDdGJztcbiAgICAgICAgdGhpcy5DVEwgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9LFxuXG4gICAgRFFVT1RFKCkge1xuICAgICAgICByZXR1cm4gJ1wiJztcbiAgICB9LFxuXG4gICAgQUxQSEEoKSB7XG4gICAgICAgIGxldCB2YWx1ZSA9IGV4cGFuZFJhbmdlKDB4NDEsIDB4NWEpICsgZXhwYW5kUmFuZ2UoMHg2MSwgMHg3YSk7XG4gICAgICAgIHRoaXMuQUxQSEEgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9LFxuXG4gICAgRElHSVQoKSB7XG4gICAgICAgIGxldCB2YWx1ZSA9IGV4cGFuZFJhbmdlKDB4MzAsIDB4MzkpO1xuICAgICAgICB0aGlzLkRJR0lUID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfSxcblxuICAgICdBVE9NLUNIQVInKCkge1xuICAgICAgICBsZXQgdmFsdWUgPSBleGNsdWRlQ2hhcnModGhpcy5DSEFSKCksIHRoaXNbJ2F0b20tc3BlY2lhbHMnXSgpKTtcbiAgICAgICAgdGhpc1snQVRPTS1DSEFSJ10gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9LFxuXG4gICAgJ0FTVFJJTkctQ0hBUicoKSB7XG4gICAgICAgIGxldCB2YWx1ZSA9IHRoaXNbJ0FUT00tQ0hBUiddKCkgKyB0aGlzWydyZXNwLXNwZWNpYWxzJ10oKTtcbiAgICAgICAgdGhpc1snQVNUUklORy1DSEFSJ10gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9LFxuXG4gICAgJ1RFWFQtQ0hBUicoKSB7XG4gICAgICAgIGxldCB2YWx1ZSA9IGV4Y2x1ZGVDaGFycyh0aGlzLkNIQVIoKSwgJ1xcclxcbicpO1xuICAgICAgICB0aGlzWydURVhULUNIQVInXSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH0sXG5cbiAgICAnYXRvbS1zcGVjaWFscycoKSB7XG4gICAgICAgIGxldCB2YWx1ZSA9ICcoJyArICcpJyArICd7JyArIHRoaXMuU1AoKSArIHRoaXMuQ1RMKCkgKyB0aGlzWydsaXN0LXdpbGRjYXJkcyddKCkgKyB0aGlzWydxdW90ZWQtc3BlY2lhbHMnXSgpICsgdGhpc1sncmVzcC1zcGVjaWFscyddKCk7XG4gICAgICAgIHRoaXNbJ2F0b20tc3BlY2lhbHMnXSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH0sXG5cbiAgICAnbGlzdC13aWxkY2FyZHMnKCkge1xuICAgICAgICByZXR1cm4gJyUnICsgJyonO1xuICAgIH0sXG5cbiAgICAncXVvdGVkLXNwZWNpYWxzJygpIHtcbiAgICAgICAgbGV0IHZhbHVlID0gdGhpcy5EUVVPVEUoKSArICdcXFxcJztcbiAgICAgICAgdGhpc1sncXVvdGVkLXNwZWNpYWxzJ10gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9LFxuXG4gICAgJ3Jlc3Atc3BlY2lhbHMnKCkge1xuICAgICAgICByZXR1cm4gJ10nO1xuICAgIH0sXG5cbiAgICB0YWcoKSB7XG4gICAgICAgIGxldCB2YWx1ZSA9IGV4Y2x1ZGVDaGFycyh0aGlzWydBU1RSSU5HLUNIQVInXSgpLCAnKycpO1xuICAgICAgICB0aGlzLnRhZyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH0sXG5cbiAgICBjb21tYW5kKCkge1xuICAgICAgICBsZXQgdmFsdWUgPSB0aGlzLkFMUEhBKCkgKyB0aGlzLkRJR0lUKCkgKyAnLSc7XG4gICAgICAgIHRoaXMuY29tbWFuZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH0sXG5cbiAgICB2ZXJpZnkoc3RyLCBhbGxvd2VkQ2hhcnMpIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IHN0ci5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgaWYgKGFsbG93ZWRDaGFycy5pbmRleE9mKHN0ci5jaGFyQXQoaSkpIDwgMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiAtMTtcbiAgICB9XG59O1xuIl0sIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6WzBdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(rsc)/./node_modules/imapflow/lib/handler/imap-formal-syntax.js\n");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "(rsc)/./node_modules/imapflow/lib/handler/imap-handler.js":
|
|
/*!***********************************************************!*\
|
|
!*** ./node_modules/imapflow/lib/handler/imap-handler.js ***!
|
|
\***********************************************************/
|
|
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
|
|
|
|
eval("\n\nconst parser = __webpack_require__(/*! ./imap-parser */ \"(rsc)/./node_modules/imapflow/lib/handler/imap-parser.js\");\nconst compiler = __webpack_require__(/*! ./imap-compiler */ \"(rsc)/./node_modules/imapflow/lib/handler/imap-compiler.js\");\n\nmodule.exports = {\n parser,\n compiler\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHJzYykvLi9ub2RlX21vZHVsZXMvaW1hcGZsb3cvbGliL2hhbmRsZXIvaW1hcC1oYW5kbGVyLmpzIiwibWFwcGluZ3MiOiJBQUFhOztBQUViLGVBQWUsbUJBQU8sQ0FBQywrRUFBZTtBQUN0QyxpQkFBaUIsbUJBQU8sQ0FBQyxtRkFBaUI7O0FBRTFDO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyIvaG9tZS9hbG1hL25leHRnZW4vTmVhaC1tYWlsL25vZGVfbW9kdWxlcy9pbWFwZmxvdy9saWIvaGFuZGxlci9pbWFwLWhhbmRsZXIuanMiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCBwYXJzZXIgPSByZXF1aXJlKCcuL2ltYXAtcGFyc2VyJyk7XG5jb25zdCBjb21waWxlciA9IHJlcXVpcmUoJy4vaW1hcC1jb21waWxlcicpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgICBwYXJzZXIsXG4gICAgY29tcGlsZXJcbn07XG4iXSwibmFtZXMiOltdLCJpZ25vcmVMaXN0IjpbMF0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(rsc)/./node_modules/imapflow/lib/handler/imap-handler.js\n");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "(rsc)/./node_modules/imapflow/lib/handler/imap-parser.js":
|
|
/*!**********************************************************!*\
|
|
!*** ./node_modules/imapflow/lib/handler/imap-parser.js ***!
|
|
\**********************************************************/
|
|
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
|
|
|
|
eval("\n\nconst imapFormalSyntax = __webpack_require__(/*! ./imap-formal-syntax */ \"(rsc)/./node_modules/imapflow/lib/handler/imap-formal-syntax.js\");\nconst { ParserInstance } = __webpack_require__(/*! ./parser-instance */ \"(rsc)/./node_modules/imapflow/lib/handler/parser-instance.js\");\n\nmodule.exports = async (command, options) => {\n options = options || {};\n\n let nullBytesRemoved = 0;\n\n // special case with a buggy IMAP server where responses are padded with zero bytes\n if (command[0] === 0) {\n // find the first non null byte and trim\n for (let i = 0; i < command.length; i++) {\n if (command[i] !== 0) {\n // trim to here\n command = command.slice(i);\n nullBytesRemoved = i;\n break;\n }\n }\n }\n\n const parser = new ParserInstance(command, options);\n const response = {};\n\n try {\n response.tag = await parser.getTag();\n\n await parser.getSpace();\n\n response.command = await parser.getCommand();\n\n if (nullBytesRemoved) {\n response.nullBytesRemoved = nullBytesRemoved;\n }\n\n if (['UID', 'AUTHENTICATE'].indexOf((response.command || '').toUpperCase()) >= 0) {\n await parser.getSpace();\n response.command += ' ' + (await parser.getElement(imapFormalSyntax.command()));\n }\n\n if (parser.remainder.trim().length) {\n await parser.getSpace();\n response.attributes = await parser.getAttributes();\n }\n\n if (parser.humanReadable) {\n response.attributes = (response.attributes || []).concat({\n type: 'TEXT',\n value: parser.humanReadable\n });\n }\n } catch (err) {\n if (err.code === 'ParserErrorExchange' && err.parserContext && err.parserContext.value) {\n return err.parserContext.value;\n }\n throw err;\n }\n\n return response;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHJzYykvLi9ub2RlX21vZHVsZXMvaW1hcGZsb3cvbGliL2hhbmRsZXIvaW1hcC1wYXJzZXIuanMiLCJtYXBwaW5ncyI6IkFBQWE7O0FBRWIseUJBQXlCLG1CQUFPLENBQUMsNkZBQXNCO0FBQ3ZELFFBQVEsaUJBQWlCLEVBQUUsbUJBQU8sQ0FBQyx1RkFBbUI7O0FBRXREO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLG9CQUFvQjtBQUM1QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBIiwic291cmNlcyI6WyIvaG9tZS9hbG1hL25leHRnZW4vTmVhaC1tYWlsL25vZGVfbW9kdWxlcy9pbWFwZmxvdy9saWIvaGFuZGxlci9pbWFwLXBhcnNlci5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbmNvbnN0IGltYXBGb3JtYWxTeW50YXggPSByZXF1aXJlKCcuL2ltYXAtZm9ybWFsLXN5bnRheCcpO1xuY29uc3QgeyBQYXJzZXJJbnN0YW5jZSB9ID0gcmVxdWlyZSgnLi9wYXJzZXItaW5zdGFuY2UnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBhc3luYyAoY29tbWFuZCwgb3B0aW9ucykgPT4ge1xuICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuXG4gICAgbGV0IG51bGxCeXRlc1JlbW92ZWQgPSAwO1xuXG4gICAgLy8gc3BlY2lhbCBjYXNlIHdpdGggYSBidWdneSBJTUFQIHNlcnZlciB3aGVyZSByZXNwb25zZXMgYXJlIHBhZGRlZCB3aXRoIHplcm8gYnl0ZXNcbiAgICBpZiAoY29tbWFuZFswXSA9PT0gMCkge1xuICAgICAgICAvLyBmaW5kIHRoZSBmaXJzdCBub24gbnVsbCBieXRlIGFuZCB0cmltXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29tbWFuZC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKGNvbW1hbmRbaV0gIT09IDApIHtcbiAgICAgICAgICAgICAgICAvLyB0cmltIHRvIGhlcmVcbiAgICAgICAgICAgICAgICBjb21tYW5kID0gY29tbWFuZC5zbGljZShpKTtcbiAgICAgICAgICAgICAgICBudWxsQnl0ZXNSZW1vdmVkID0gaTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHBhcnNlciA9IG5ldyBQYXJzZXJJbnN0YW5jZShjb21tYW5kLCBvcHRpb25zKTtcbiAgICBjb25zdCByZXNwb25zZSA9IHt9O1xuXG4gICAgdHJ5IHtcbiAgICAgICAgcmVzcG9uc2UudGFnID0gYXdhaXQgcGFyc2VyLmdldFRhZygpO1xuXG4gICAgICAgIGF3YWl0IHBhcnNlci5nZXRTcGFjZSgpO1xuXG4gICAgICAgIHJlc3BvbnNlLmNvbW1hbmQgPSBhd2FpdCBwYXJzZXIuZ2V0Q29tbWFuZCgpO1xuXG4gICAgICAgIGlmIChudWxsQnl0ZXNSZW1vdmVkKSB7XG4gICAgICAgICAgICByZXNwb25zZS5udWxsQnl0ZXNSZW1vdmVkID0gbnVsbEJ5dGVzUmVtb3ZlZDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChbJ1VJRCcsICdBVVRIRU5USUNBVEUnXS5pbmRleE9mKChyZXNwb25zZS5jb21tYW5kIHx8ICcnKS50b1VwcGVyQ2FzZSgpKSA+PSAwKSB7XG4gICAgICAgICAgICBhd2FpdCBwYXJzZXIuZ2V0U3BhY2UoKTtcbiAgICAgICAgICAgIHJlc3BvbnNlLmNvbW1hbmQgKz0gJyAnICsgKGF3YWl0IHBhcnNlci5nZXRFbGVtZW50KGltYXBGb3JtYWxTeW50YXguY29tbWFuZCgpKSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocGFyc2VyLnJlbWFpbmRlci50cmltKCkubGVuZ3RoKSB7XG4gICAgICAgICAgICBhd2FpdCBwYXJzZXIuZ2V0U3BhY2UoKTtcbiAgICAgICAgICAgIHJlc3BvbnNlLmF0dHJpYnV0ZXMgPSBhd2FpdCBwYXJzZXIuZ2V0QXR0cmlidXRlcygpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHBhcnNlci5odW1hblJlYWRhYmxlKSB7XG4gICAgICAgICAgICByZXNwb25zZS5hdHRyaWJ1dGVzID0gKHJlc3BvbnNlLmF0dHJpYnV0ZXMgfHwgW10pLmNvbmNhdCh7XG4gICAgICAgICAgICAgICAgdHlwZTogJ1RFWFQnLFxuICAgICAgICAgICAgICAgIHZhbHVlOiBwYXJzZXIuaHVtYW5SZWFkYWJsZVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgaWYgKGVyci5jb2RlID09PSAnUGFyc2VyRXJyb3JFeGNoYW5nZScgJiYgZXJyLnBhcnNlckNvbnRleHQgJiYgZXJyLnBhcnNlckNvbnRleHQudmFsdWUpIHtcbiAgICAgICAgICAgIHJldHVybiBlcnIucGFyc2VyQ29udGV4dC52YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBlcnI7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3BvbnNlO1xufTtcbiJdLCJuYW1lcyI6W10sImlnbm9yZUxpc3QiOlswXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(rsc)/./node_modules/imapflow/lib/handler/imap-parser.js\n");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "(rsc)/./node_modules/imapflow/lib/handler/imap-stream.js":
|
|
/*!**********************************************************!*\
|
|
!*** ./node_modules/imapflow/lib/handler/imap-stream.js ***!
|
|
\**********************************************************/
|
|
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
|
|
|
|
eval("\n\nconst Transform = (__webpack_require__(/*! stream */ \"stream\").Transform);\nconst logger = __webpack_require__(/*! ../logger */ \"(rsc)/./node_modules/imapflow/lib/logger.js\");\n\nconst LINE = 0x01;\nconst LITERAL = 0x02;\n\nconst LF = 0x0a;\nconst CR = 0x0d;\nconst NUM_0 = 0x30;\nconst NUM_9 = 0x39;\nconst CURLY_OPEN = 0x7b;\nconst CURLY_CLOSE = 0x7d;\n\nclass ImapStream extends Transform {\n constructor(options) {\n super({\n //writableHighWaterMark: 3,\n readableObjectMode: true,\n writableObjectMode: false\n });\n\n this.options = options || {};\n this.cid = this.options.cid;\n\n this.log =\n this.options.logger && typeof this.options.logger === 'object'\n ? this.options.logger\n : logger.child({\n component: 'imap-connection',\n cid: this.cid\n });\n\n this.readBytesCounter = 0;\n\n this.state = LINE;\n this.literalWaiting = 0;\n this.inputBuffer = []; // lines\n this.lineBuffer = []; // current line\n this.literalBuffer = [];\n this.literals = [];\n\n this.compress = false;\n this.secureConnection = this.options.secureConnection;\n\n this.processingInput = false;\n this.inputQueue = []; // unprocessed input chunks\n }\n\n checkLiteralMarker(line) {\n if (!line || !line.length) {\n return false;\n }\n\n let pos = line.length - 1;\n\n if (line[pos] === LF) {\n pos--;\n } else {\n return false;\n }\n if (pos >= 0 && line[pos] === CR) {\n pos--;\n }\n if (pos < 0) {\n return false;\n }\n\n if (!pos || line[pos] !== CURLY_CLOSE) {\n return false;\n }\n pos--;\n\n let numBytes = [];\n for (; pos > 0; pos--) {\n let c = line[pos];\n if (c >= NUM_0 && c <= NUM_9) {\n numBytes.unshift(c);\n continue;\n }\n if (c === CURLY_OPEN && numBytes.length) {\n this.state = LITERAL;\n this.literalWaiting = Number(Buffer.from(numBytes).toString());\n return true;\n }\n return false;\n }\n return false;\n }\n\n async processInputChunk(chunk, startPos) {\n startPos = startPos || 0;\n if (startPos >= chunk.length) {\n return;\n }\n\n switch (this.state) {\n case LINE: {\n let lineStart = startPos;\n for (let i = startPos, len = chunk.length; i < len; i++) {\n if (chunk[i] === LF) {\n // line end found\n this.lineBuffer.push(chunk.slice(lineStart, i + 1));\n lineStart = i + 1;\n\n let line = Buffer.concat(this.lineBuffer);\n\n this.inputBuffer.push(line);\n this.lineBuffer = [];\n\n // try to detect if this is a literal start\n if (this.checkLiteralMarker(line)) {\n // switch into line mode and start over\n return await this.processInputChunk(chunk, lineStart);\n }\n\n // reached end of command input, emit it\n let payload = this.inputBuffer.length === 1 ? this.inputBuffer[0] : Buffer.concat(this.inputBuffer);\n let literals = this.literals;\n this.inputBuffer = [];\n this.literals = [];\n\n if (payload.length) {\n // remove final line terminator\n let skipBytes = 0;\n if (payload.length >= 1 && payload[payload.length - 1] === LF) {\n skipBytes++;\n if (payload.length >= 2 && payload[payload.length - 2] === CR) {\n skipBytes++;\n }\n }\n\n if (skipBytes) {\n payload = payload.slice(0, payload.length - skipBytes);\n }\n\n if (payload.length) {\n await new Promise(resolve => {\n this.push({ payload, literals, next: resolve });\n });\n }\n }\n }\n }\n if (lineStart < chunk.length) {\n this.lineBuffer.push(chunk.slice(lineStart));\n }\n break;\n }\n\n case LITERAL: {\n // exactly until end of chunk\n if (chunk.length === startPos + this.literalWaiting) {\n if (!startPos) {\n this.literalBuffer.push(chunk);\n } else {\n this.literalBuffer.push(chunk.slice(startPos));\n }\n\n this.literalWaiting -= chunk.length;\n this.literals.push(Buffer.concat(this.literalBuffer));\n this.literalBuffer = [];\n this.state = LINE;\n\n return;\n } else if (chunk.length > startPos + this.literalWaiting) {\n let partial = chunk.slice(startPos, startPos + this.literalWaiting);\n this.literalBuffer.push(partial);\n startPos += partial.length;\n this.literalWaiting -= partial.length;\n this.literals.push(Buffer.concat(this.literalBuffer));\n this.literalBuffer = [];\n this.state = LINE;\n\n return await this.processInputChunk(chunk, startPos);\n } else {\n let partial = chunk.slice(startPos);\n this.literalBuffer.push(partial);\n startPos += partial.length;\n this.literalWaiting -= partial.length;\n return;\n }\n }\n }\n }\n\n async processInput() {\n let data;\n while ((data = this.inputQueue.shift())) {\n await this.processInputChunk(data.chunk);\n // mark chunk as processed\n data.next();\n }\n }\n\n _transform(chunk, encoding, next) {\n if (typeof chunk === 'string') {\n chunk = Buffer.from(chunk, encoding);\n }\n\n if (!chunk || !chunk.length) {\n return next();\n }\n\n this.readBytesCounter += chunk.length;\n\n if (this.options.logRaw) {\n this.log.trace({\n src: 's',\n msg: 'read from socket',\n data: chunk.toString('base64'),\n compress: !!this.compress,\n secure: !!this.secureConnection,\n cid: this.cid\n });\n }\n\n if (chunk && chunk.length) {\n this.inputQueue.push({ chunk, next });\n }\n\n if (!this.processingInput) {\n this.processingInput = true;\n this.processInput()\n .catch(err => this.emit('error', err))\n .finally(() => (this.processingInput = false));\n }\n }\n\n _flush(next) {\n next();\n }\n}\n\nmodule.exports.ImapStream = ImapStream;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHJzYykvLi9ub2RlX21vZHVsZXMvaW1hcGZsb3cvbGliL2hhbmRsZXIvaW1hcC1zdHJlYW0uanMiLCJtYXBwaW5ncyI6IkFBQWE7O0FBRWIsa0JBQWtCLHVEQUEyQjtBQUM3QyxlQUFlLG1CQUFPLENBQUMsOERBQVc7O0FBRWxDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQkFBbUI7O0FBRW5COztBQUVBO0FBQ0E7QUFDQSwrQkFBK0I7QUFDL0IsOEJBQThCO0FBQzlCO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLDhCQUE4QjtBQUM5Qjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxlQUFlLFNBQVM7QUFDeEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLDJEQUEyRCxTQUFTO0FBQ3BFO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGdEQUFnRCxrQ0FBa0M7QUFDbEYsaUNBQWlDO0FBQ2pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCO0FBQ3RCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxrQkFBa0I7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxrQkFBa0I7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7O0FBRUE7QUFDQSxtQ0FBbUMsYUFBYTtBQUNoRDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSx5QkFBeUIiLCJzb3VyY2VzIjpbIi9ob21lL2FsbWEvbmV4dGdlbi9OZWFoLW1haWwvbm9kZV9tb2R1bGVzL2ltYXBmbG93L2xpYi9oYW5kbGVyL2ltYXAtc3RyZWFtLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcblxuY29uc3QgVHJhbnNmb3JtID0gcmVxdWlyZSgnc3RyZWFtJykuVHJhbnNmb3JtO1xuY29uc3QgbG9nZ2VyID0gcmVxdWlyZSgnLi4vbG9nZ2VyJyk7XG5cbmNvbnN0IExJTkUgPSAweDAxO1xuY29uc3QgTElURVJBTCA9IDB4MDI7XG5cbmNvbnN0IExGID0gMHgwYTtcbmNvbnN0IENSID0gMHgwZDtcbmNvbnN0IE5VTV8wID0gMHgzMDtcbmNvbnN0IE5VTV85ID0gMHgzOTtcbmNvbnN0IENVUkxZX09QRU4gPSAweDdiO1xuY29uc3QgQ1VSTFlfQ0xPU0UgPSAweDdkO1xuXG5jbGFzcyBJbWFwU3RyZWFtIGV4dGVuZHMgVHJhbnNmb3JtIHtcbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zKSB7XG4gICAgICAgIHN1cGVyKHtcbiAgICAgICAgICAgIC8vd3JpdGFibGVIaWdoV2F0ZXJNYXJrOiAzLFxuICAgICAgICAgICAgcmVhZGFibGVPYmplY3RNb2RlOiB0cnVlLFxuICAgICAgICAgICAgd3JpdGFibGVPYmplY3RNb2RlOiBmYWxzZVxuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICAgICAgICB0aGlzLmNpZCA9IHRoaXMub3B0aW9ucy5jaWQ7XG5cbiAgICAgICAgdGhpcy5sb2cgPVxuICAgICAgICAgICAgdGhpcy5vcHRpb25zLmxvZ2dlciAmJiB0eXBlb2YgdGhpcy5vcHRpb25zLmxvZ2dlciA9PT0gJ29iamVjdCdcbiAgICAgICAgICAgICAgICA/IHRoaXMub3B0aW9ucy5sb2dnZXJcbiAgICAgICAgICAgICAgICA6IGxvZ2dlci5jaGlsZCh7XG4gICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50OiAnaW1hcC1jb25uZWN0aW9uJyxcbiAgICAgICAgICAgICAgICAgICAgICBjaWQ6IHRoaXMuY2lkXG4gICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLnJlYWRCeXRlc0NvdW50ZXIgPSAwO1xuXG4gICAgICAgIHRoaXMuc3RhdGUgPSBMSU5FO1xuICAgICAgICB0aGlzLmxpdGVyYWxXYWl0aW5nID0gMDtcbiAgICAgICAgdGhpcy5pbnB1dEJ1ZmZlciA9IFtdOyAvLyBsaW5lc1xuICAgICAgICB0aGlzLmxpbmVCdWZmZXIgPSBbXTsgLy8gY3VycmVudCBsaW5lXG4gICAgICAgIHRoaXMubGl0ZXJhbEJ1ZmZlciA9IFtdO1xuICAgICAgICB0aGlzLmxpdGVyYWxzID0gW107XG5cbiAgICAgICAgdGhpcy5jb21wcmVzcyA9IGZhbHNlO1xuICAgICAgICB0aGlzLnNlY3VyZUNvbm5lY3Rpb24gPSB0aGlzLm9wdGlvbnMuc2VjdXJlQ29ubmVjdGlvbjtcblxuICAgICAgICB0aGlzLnByb2Nlc3NpbmdJbnB1dCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmlucHV0UXVldWUgPSBbXTsgLy8gdW5wcm9jZXNzZWQgaW5wdXQgY2h1bmtzXG4gICAgfVxuXG4gICAgY2hlY2tMaXRlcmFsTWFya2VyKGxpbmUpIHtcbiAgICAgICAgaWYgKCFsaW5lIHx8ICFsaW5lLmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHBvcyA9IGxpbmUubGVuZ3RoIC0gMTtcblxuICAgICAgICBpZiAobGluZVtwb3NdID09PSBMRikge1xuICAgICAgICAgICAgcG9zLS07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBvcyA+PSAwICYmIGxpbmVbcG9zXSA9PT0gQ1IpIHtcbiAgICAgICAgICAgIHBvcy0tO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwb3MgPCAwKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXBvcyB8fCBsaW5lW3Bvc10gIT09IENVUkxZX0NMT1NFKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcG9zLS07XG5cbiAgICAgICAgbGV0IG51bUJ5dGVzID0gW107XG4gICAgICAgIGZvciAoOyBwb3MgPiAwOyBwb3MtLSkge1xuICAgICAgICAgICAgbGV0IGMgPSBsaW5lW3Bvc107XG4gICAgICAgICAgICBpZiAoYyA+PSBOVU1fMCAmJiBjIDw9IE5VTV85KSB7XG4gICAgICAgICAgICAgICAgbnVtQnl0ZXMudW5zaGlmdChjKTtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChjID09PSBDVVJMWV9PUEVOICYmIG51bUJ5dGVzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBMSVRFUkFMO1xuICAgICAgICAgICAgICAgIHRoaXMubGl0ZXJhbFdhaXRpbmcgPSBOdW1iZXIoQnVmZmVyLmZyb20obnVtQnl0ZXMpLnRvU3RyaW5nKCkpO1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBhc3luYyBwcm9jZXNzSW5wdXRDaHVuayhjaHVuaywgc3RhcnRQb3MpIHtcbiAgICAgICAgc3RhcnRQb3MgPSBzdGFydFBvcyB8fCAwO1xuICAgICAgICBpZiAoc3RhcnRQb3MgPj0gY2h1bmsubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBzd2l0Y2ggKHRoaXMuc3RhdGUpIHtcbiAgICAgICAgICAgIGNhc2UgTElORToge1xuICAgICAgICAgICAgICAgIGxldCBsaW5lU3RhcnQgPSBzdGFydFBvcztcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gc3RhcnRQb3MsIGxlbiA9IGNodW5rLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjaHVua1tpXSA9PT0gTEYpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxpbmUgZW5kIGZvdW5kXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxpbmVCdWZmZXIucHVzaChjaHVuay5zbGljZShsaW5lU3RhcnQsIGkgKyAxKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBsaW5lU3RhcnQgPSBpICsgMTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGxpbmUgPSBCdWZmZXIuY29uY2F0KHRoaXMubGluZUJ1ZmZlcik7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaW5wdXRCdWZmZXIucHVzaChsaW5lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubGluZUJ1ZmZlciA9IFtdO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0cnkgdG8gZGV0ZWN0IGlmIHRoaXMgaXMgYSBsaXRlcmFsIHN0YXJ0XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5jaGVja0xpdGVyYWxNYXJrZXIobGluZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzd2l0Y2ggaW50byBsaW5lIG1vZGUgYW5kIHN0YXJ0IG92ZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5wcm9jZXNzSW5wdXRDaHVuayhjaHVuaywgbGluZVN0YXJ0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVhY2hlZCBlbmQgb2YgY29tbWFuZCBpbnB1dCwgZW1pdCBpdFxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHBheWxvYWQgPSB0aGlzLmlucHV0QnVmZmVyLmxlbmd0aCA9PT0gMSA/IHRoaXMuaW5wdXRCdWZmZXJbMF0gOiBCdWZmZXIuY29uY2F0KHRoaXMuaW5wdXRCdWZmZXIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGxpdGVyYWxzID0gdGhpcy5saXRlcmFscztcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaW5wdXRCdWZmZXIgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubGl0ZXJhbHMgPSBbXTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBheWxvYWQubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVtb3ZlIGZpbmFsIGxpbmUgdGVybWluYXRvclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBza2lwQnl0ZXMgPSAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXlsb2FkLmxlbmd0aCA+PSAxICYmIHBheWxvYWRbcGF5bG9hZC5sZW5ndGggLSAxXSA9PT0gTEYpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2tpcEJ5dGVzKys7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXlsb2FkLmxlbmd0aCA+PSAyICYmIHBheWxvYWRbcGF5bG9hZC5sZW5ndGggLSAyXSA9PT0gQ1IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNraXBCeXRlcysrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNraXBCeXRlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXlsb2FkID0gcGF5bG9hZC5zbGljZSgwLCBwYXlsb2FkLmxlbmd0aCAtIHNraXBCeXRlcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBheWxvYWQubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wdXNoKHsgcGF5bG9hZCwgbGl0ZXJhbHMsIG5leHQ6IHJlc29sdmUgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAobGluZVN0YXJ0IDwgY2h1bmsubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubGluZUJ1ZmZlci5wdXNoKGNodW5rLnNsaWNlKGxpbmVTdGFydCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY2FzZSBMSVRFUkFMOiB7XG4gICAgICAgICAgICAgICAgLy8gZXhhY3RseSB1bnRpbCBlbmQgb2YgY2h1bmtcbiAgICAgICAgICAgICAgICBpZiAoY2h1bmsubGVuZ3RoID09PSBzdGFydFBvcyArIHRoaXMubGl0ZXJhbFdhaXRpbmcpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFzdGFydFBvcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5saXRlcmFsQnVmZmVyLnB1c2goY2h1bmspO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5saXRlcmFsQnVmZmVyLnB1c2goY2h1bmsuc2xpY2Uoc3RhcnRQb3MpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubGl0ZXJhbFdhaXRpbmcgLT0gY2h1bmsubGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmxpdGVyYWxzLnB1c2goQnVmZmVyLmNvbmNhdCh0aGlzLmxpdGVyYWxCdWZmZXIpKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5saXRlcmFsQnVmZmVyID0gW107XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBMSU5FO1xuXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNodW5rLmxlbmd0aCA+IHN0YXJ0UG9zICsgdGhpcy5saXRlcmFsV2FpdGluZykge1xuICAgICAgICAgICAgICAgICAgICBsZXQgcGFydGlhbCA9IGNodW5rLnNsaWNlKHN0YXJ0UG9zLCBzdGFydFBvcyArIHRoaXMubGl0ZXJhbFdhaXRpbmcpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmxpdGVyYWxCdWZmZXIucHVzaChwYXJ0aWFsKTtcbiAgICAgICAgICAgICAgICAgICAgc3RhcnRQb3MgKz0gcGFydGlhbC5sZW5ndGg7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubGl0ZXJhbFdhaXRpbmcgLT0gcGFydGlhbC5sZW5ndGg7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubGl0ZXJhbHMucHVzaChCdWZmZXIuY29uY2F0KHRoaXMubGl0ZXJhbEJ1ZmZlcikpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmxpdGVyYWxCdWZmZXIgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IExJTkU7XG5cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMucHJvY2Vzc0lucHV0Q2h1bmsoY2h1bmssIHN0YXJ0UG9zKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBsZXQgcGFydGlhbCA9IGNodW5rLnNsaWNlKHN0YXJ0UG9zKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5saXRlcmFsQnVmZmVyLnB1c2gocGFydGlhbCk7XG4gICAgICAgICAgICAgICAgICAgIHN0YXJ0UG9zICs9IHBhcnRpYWwubGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmxpdGVyYWxXYWl0aW5nIC09IHBhcnRpYWwubGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgYXN5bmMgcHJvY2Vzc0lucHV0KCkge1xuICAgICAgICBsZXQgZGF0YTtcbiAgICAgICAgd2hpbGUgKChkYXRhID0gdGhpcy5pbnB1dFF1ZXVlLnNoaWZ0KCkpKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLnByb2Nlc3NJbnB1dENodW5rKGRhdGEuY2h1bmspO1xuICAgICAgICAgICAgLy8gbWFyayBjaHVuayBhcyBwcm9jZXNzZWRcbiAgICAgICAgICAgIGRhdGEubmV4dCgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgX3RyYW5zZm9ybShjaHVuaywgZW5jb2RpbmcsIG5leHQpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBjaHVuayA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGNodW5rID0gQnVmZmVyLmZyb20oY2h1bmssIGVuY29kaW5nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghY2h1bmsgfHwgIWNodW5rLmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIG5leHQoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucmVhZEJ5dGVzQ291bnRlciArPSBjaHVuay5sZW5ndGg7XG5cbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5sb2dSYXcpIHtcbiAgICAgICAgICAgIHRoaXMubG9nLnRyYWNlKHtcbiAgICAgICAgICAgICAgICBzcmM6ICdzJyxcbiAgICAgICAgICAgICAgICBtc2c6ICdyZWFkIGZyb20gc29ja2V0JyxcbiAgICAgICAgICAgICAgICBkYXRhOiBjaHVuay50b1N0cmluZygnYmFzZTY0JyksXG4gICAgICAgICAgICAgICAgY29tcHJlc3M6ICEhdGhpcy5jb21wcmVzcyxcbiAgICAgICAgICAgICAgICBzZWN1cmU6ICEhdGhpcy5zZWN1cmVDb25uZWN0aW9uLFxuICAgICAgICAgICAgICAgIGNpZDogdGhpcy5jaWRcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNodW5rICYmIGNodW5rLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy5pbnB1dFF1ZXVlLnB1c2goeyBjaHVuaywgbmV4dCB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhpcy5wcm9jZXNzaW5nSW5wdXQpIHtcbiAgICAgICAgICAgIHRoaXMucHJvY2Vzc2luZ0lucHV0ID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMucHJvY2Vzc0lucHV0KClcbiAgICAgICAgICAgICAgICAuY2F0Y2goZXJyID0+IHRoaXMuZW1pdCgnZXJyb3InLCBlcnIpKVxuICAgICAgICAgICAgICAgIC5maW5hbGx5KCgpID0+ICh0aGlzLnByb2Nlc3NpbmdJbnB1dCA9IGZhbHNlKSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBfZmx1c2gobmV4dCkge1xuICAgICAgICBuZXh0KCk7XG4gICAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cy5JbWFwU3RyZWFtID0gSW1hcFN0cmVhbTtcbiJdLCJuYW1lcyI6W10sImlnbm9yZUxpc3QiOlswXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(rsc)/./node_modules/imapflow/lib/handler/imap-stream.js\n");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "(rsc)/./node_modules/imapflow/lib/handler/parser-instance.js":
|
|
/*!**************************************************************!*\
|
|
!*** ./node_modules/imapflow/lib/handler/parser-instance.js ***!
|
|
\**************************************************************/
|
|
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
|
|
|
|
eval("/* eslint new-cap: 0 */\n\n\n\nconst imapFormalSyntax = __webpack_require__(/*! ./imap-formal-syntax */ \"(rsc)/./node_modules/imapflow/lib/handler/imap-formal-syntax.js\");\n\nconst { TokenParser } = __webpack_require__(/*! ./token-parser */ \"(rsc)/./node_modules/imapflow/lib/handler/token-parser.js\");\n\nclass ParserInstance {\n constructor(input, options) {\n this.input = (input || '').toString();\n this.options = options || {};\n this.remainder = this.input;\n this.pos = 0;\n }\n\n async getTag() {\n if (!this.tag) {\n this.tag = await this.getElement(imapFormalSyntax.tag() + '*+', true);\n }\n return this.tag;\n }\n\n async getCommand() {\n if (this.tag === '+') {\n // special case\n this.humanReadable = this.remainder.trim();\n this.remainder = '';\n\n return '';\n }\n\n if (!this.command) {\n this.command = await this.getElement(imapFormalSyntax.command());\n }\n\n switch ((this.command || '').toString().toUpperCase()) {\n case 'OK':\n case 'NO':\n case 'BAD':\n case 'PREAUTH':\n case 'BYE':\n {\n let match = this.remainder.match(/^\\s+\\[/);\n if (match) {\n let nesting = 1;\n for (let i = match[0].length; i <= this.remainder.length; i++) {\n let c = this.remainder[i];\n\n if (c === '[') {\n nesting++;\n } else if (c === ']') {\n nesting--;\n }\n if (!nesting) {\n this.humanReadable = this.remainder.substring(i + 1).trim();\n this.remainder = this.remainder.substring(0, i + 1);\n break;\n }\n }\n } else {\n this.humanReadable = this.remainder.trim();\n this.remainder = '';\n }\n }\n break;\n }\n\n return this.command;\n }\n\n async getElement(syntax) {\n let match, element, errPos;\n\n if (this.remainder.match(/^\\s/)) {\n let error = new Error(`Unexpected whitespace at position ${this.pos} [E1]`);\n error.code = 'ParserError1';\n error.parserContext = { input: this.input, pos: this.pos };\n throw error;\n }\n\n if ((match = this.remainder.match(/^\\s*[^\\s]+(?=\\s|$)/))) {\n element = match[0];\n if ((errPos = imapFormalSyntax.verify(element, syntax)) >= 0) {\n if (this.tag === 'Server' && element === 'Unavailable.') {\n // Exchange error\n let error = new Error(`Server returned an error: ${this.input}`);\n error.code = 'ParserErrorExchange';\n error.parserContext = {\n input: this.input,\n element,\n pos: this.pos,\n value: {\n tag: '*',\n command: 'BAD',\n attributes: [{ type: 'TEXT', value: this.input }]\n }\n };\n throw error;\n }\n\n let error = new Error(`Unexpected char at position ${this.pos + errPos} [E2: ${JSON.stringify(element.charAt(errPos))}]`);\n error.code = 'ParserError2';\n error.parserContext = { input: this.input, element, pos: this.pos };\n throw error;\n }\n } else {\n let error = new Error(`Unexpected end of input at position ${this.pos} [E3]`);\n error.code = 'ParserError3';\n error.parserContext = { input: this.input, pos: this.pos };\n throw error;\n }\n\n this.pos += match[0].length;\n this.remainder = this.remainder.substr(match[0].length);\n\n return element;\n }\n\n async getSpace() {\n if (!this.remainder.length) {\n if (this.tag === '+' && this.pos === 1) {\n // special case, empty + response\n return;\n }\n\n let error = new Error(`Unexpected end of input at position ${this.pos} [E4]`);\n error.code = 'ParserError4';\n error.parserContext = { input: this.input, pos: this.pos };\n throw error;\n }\n\n if (imapFormalSyntax.verify(this.remainder.charAt(0), imapFormalSyntax.SP()) >= 0) {\n let error = new Error(`Unexpected char at position ${this.pos} [E5: ${JSON.stringify(this.remainder.charAt(0))}]`);\n error.code = 'ParserError5';\n error.parserContext = { input: this.input, element: this.remainder, pos: this.pos };\n throw error;\n }\n\n this.pos++;\n this.remainder = this.remainder.substr(1);\n }\n\n async getAttributes() {\n if (!this.remainder.length) {\n let error = new Error(`Unexpected end of input at position ${this.pos} [E6]`);\n error.code = 'ParserError6';\n error.parserContext = { input: this.input, pos: this.pos };\n throw error;\n }\n\n if (this.remainder.match(/^\\s/)) {\n let error = new Error(`Unexpected whitespace at position ${this.pos} [E7]`);\n error.code = 'ParserError7';\n error.parserContext = { input: this.input, element: this.remainder, pos: this.pos };\n throw error;\n }\n\n const tokenParser = new TokenParser(this, this.pos, this.remainder, this.options);\n\n return await tokenParser.getAttributes();\n }\n}\n\nmodule.exports.ParserInstance = ParserInstance;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHJzYykvLi9ub2RlX21vZHVsZXMvaW1hcGZsb3cvbGliL2hhbmRsZXIvcGFyc2VyLWluc3RhbmNlLmpzIiwibWFwcGluZ3MiOiJBQUFBOztBQUVhOztBQUViLHlCQUF5QixtQkFBTyxDQUFDLDZGQUFzQjs7QUFFdkQsUUFBUSxjQUFjLEVBQUUsbUJBQU8sQ0FBQyxpRkFBZ0I7O0FBRWhEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0RBQXNELDRCQUE0QjtBQUNsRjs7QUFFQTtBQUNBO0FBQ0EsOEJBQThCO0FBQzlCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0I7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLHVFQUF1RSxVQUFVO0FBQ2pGO0FBQ0Esb0NBQW9DO0FBQ3BDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVFQUF1RSxXQUFXO0FBQ2xGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyQ0FBMkMsaUNBQWlDO0FBQzVFO0FBQ0E7QUFDQTtBQUNBOztBQUVBLHFFQUFxRSxtQkFBbUIsT0FBTyx1Q0FBdUM7QUFDdEk7QUFDQSx3Q0FBd0M7QUFDeEM7QUFDQTtBQUNBLFVBQVU7QUFDVix5RUFBeUUsVUFBVTtBQUNuRjtBQUNBLG9DQUFvQztBQUNwQztBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEseUVBQXlFLFVBQVU7QUFDbkY7QUFDQSxvQ0FBb0M7QUFDcEM7QUFDQTs7QUFFQTtBQUNBLGlFQUFpRSxVQUFVLE9BQU8seUNBQXlDO0FBQzNIO0FBQ0Esb0NBQW9DO0FBQ3BDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSx5RUFBeUUsVUFBVTtBQUNuRjtBQUNBLG9DQUFvQztBQUNwQztBQUNBOztBQUVBO0FBQ0EsdUVBQXVFLFVBQVU7QUFDakY7QUFDQSxvQ0FBb0M7QUFDcEM7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEsNkJBQTZCIiwic291cmNlcyI6WyIvaG9tZS9hbG1hL25leHRnZW4vTmVhaC1tYWlsL25vZGVfbW9kdWxlcy9pbWFwZmxvdy9saWIvaGFuZGxlci9wYXJzZXItaW5zdGFuY2UuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50IG5ldy1jYXA6IDAgKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCBpbWFwRm9ybWFsU3ludGF4ID0gcmVxdWlyZSgnLi9pbWFwLWZvcm1hbC1zeW50YXgnKTtcblxuY29uc3QgeyBUb2tlblBhcnNlciB9ID0gcmVxdWlyZSgnLi90b2tlbi1wYXJzZXInKTtcblxuY2xhc3MgUGFyc2VySW5zdGFuY2Uge1xuICAgIGNvbnN0cnVjdG9yKGlucHV0LCBvcHRpb25zKSB7XG4gICAgICAgIHRoaXMuaW5wdXQgPSAoaW5wdXQgfHwgJycpLnRvU3RyaW5nKCk7XG4gICAgICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gICAgICAgIHRoaXMucmVtYWluZGVyID0gdGhpcy5pbnB1dDtcbiAgICAgICAgdGhpcy5wb3MgPSAwO1xuICAgIH1cblxuICAgIGFzeW5jIGdldFRhZygpIHtcbiAgICAgICAgaWYgKCF0aGlzLnRhZykge1xuICAgICAgICAgICAgdGhpcy50YWcgPSBhd2FpdCB0aGlzLmdldEVsZW1lbnQoaW1hcEZvcm1hbFN5bnRheC50YWcoKSArICcqKycsIHRydWUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLnRhZztcbiAgICB9XG5cbiAgICBhc3luYyBnZXRDb21tYW5kKCkge1xuICAgICAgICBpZiAodGhpcy50YWcgPT09ICcrJykge1xuICAgICAgICAgICAgLy8gc3BlY2lhbCBjYXNlXG4gICAgICAgICAgICB0aGlzLmh1bWFuUmVhZGFibGUgPSB0aGlzLnJlbWFpbmRlci50cmltKCk7XG4gICAgICAgICAgICB0aGlzLnJlbWFpbmRlciA9ICcnO1xuXG4gICAgICAgICAgICByZXR1cm4gJyc7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMuY29tbWFuZCkge1xuICAgICAgICAgICAgdGhpcy5jb21tYW5kID0gYXdhaXQgdGhpcy5nZXRFbGVtZW50KGltYXBGb3JtYWxTeW50YXguY29tbWFuZCgpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHN3aXRjaCAoKHRoaXMuY29tbWFuZCB8fCAnJykudG9TdHJpbmcoKS50b1VwcGVyQ2FzZSgpKSB7XG4gICAgICAgICAgICBjYXNlICdPSyc6XG4gICAgICAgICAgICBjYXNlICdOTyc6XG4gICAgICAgICAgICBjYXNlICdCQUQnOlxuICAgICAgICAgICAgY2FzZSAnUFJFQVVUSCc6XG4gICAgICAgICAgICBjYXNlICdCWUUnOlxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG1hdGNoID0gdGhpcy5yZW1haW5kZXIubWF0Y2goL15cXHMrXFxbLyk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChtYXRjaCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG5lc3RpbmcgPSAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IG1hdGNoWzBdLmxlbmd0aDsgaSA8PSB0aGlzLnJlbWFpbmRlci5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjID0gdGhpcy5yZW1haW5kZXJbaV07XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYyA9PT0gJ1snKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lc3RpbmcrKztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGMgPT09ICddJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXN0aW5nLS07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbmVzdGluZykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmh1bWFuUmVhZGFibGUgPSB0aGlzLnJlbWFpbmRlci5zdWJzdHJpbmcoaSArIDEpLnRyaW0oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW1haW5kZXIgPSB0aGlzLnJlbWFpbmRlci5zdWJzdHJpbmcoMCwgaSArIDEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmh1bWFuUmVhZGFibGUgPSB0aGlzLnJlbWFpbmRlci50cmltKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbWFpbmRlciA9ICcnO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuY29tbWFuZDtcbiAgICB9XG5cbiAgICBhc3luYyBnZXRFbGVtZW50KHN5bnRheCkge1xuICAgICAgICBsZXQgbWF0Y2gsIGVsZW1lbnQsIGVyclBvcztcblxuICAgICAgICBpZiAodGhpcy5yZW1haW5kZXIubWF0Y2goL15cXHMvKSkge1xuICAgICAgICAgICAgbGV0IGVycm9yID0gbmV3IEVycm9yKGBVbmV4cGVjdGVkIHdoaXRlc3BhY2UgYXQgcG9zaXRpb24gJHt0aGlzLnBvc30gW0UxXWApO1xuICAgICAgICAgICAgZXJyb3IuY29kZSA9ICdQYXJzZXJFcnJvcjEnO1xuICAgICAgICAgICAgZXJyb3IucGFyc2VyQ29udGV4dCA9IHsgaW5wdXQ6IHRoaXMuaW5wdXQsIHBvczogdGhpcy5wb3MgfTtcbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKChtYXRjaCA9IHRoaXMucmVtYWluZGVyLm1hdGNoKC9eXFxzKlteXFxzXSsoPz1cXHN8JCkvKSkpIHtcbiAgICAgICAgICAgIGVsZW1lbnQgPSBtYXRjaFswXTtcbiAgICAgICAgICAgIGlmICgoZXJyUG9zID0gaW1hcEZvcm1hbFN5bnRheC52ZXJpZnkoZWxlbWVudCwgc3ludGF4KSkgPj0gMCkge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnRhZyA9PT0gJ1NlcnZlcicgJiYgZWxlbWVudCA9PT0gJ1VuYXZhaWxhYmxlLicpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gRXhjaGFuZ2UgZXJyb3JcbiAgICAgICAgICAgICAgICAgICAgbGV0IGVycm9yID0gbmV3IEVycm9yKGBTZXJ2ZXIgcmV0dXJuZWQgYW4gZXJyb3I6ICR7dGhpcy5pbnB1dH1gKTtcbiAgICAgICAgICAgICAgICAgICAgZXJyb3IuY29kZSA9ICdQYXJzZXJFcnJvckV4Y2hhbmdlJztcbiAgICAgICAgICAgICAgICAgICAgZXJyb3IucGFyc2VyQ29udGV4dCA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0OiB0aGlzLmlucHV0LFxuICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHBvczogdGhpcy5wb3MsXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZToge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhZzogJyonLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQ6ICdCQUQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXM6IFt7IHR5cGU6ICdURVhUJywgdmFsdWU6IHRoaXMuaW5wdXQgfV1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgbGV0IGVycm9yID0gbmV3IEVycm9yKGBVbmV4cGVjdGVkIGNoYXIgYXQgcG9zaXRpb24gJHt0aGlzLnBvcyArIGVyclBvc30gW0UyOiAke0pTT04uc3RyaW5naWZ5KGVsZW1lbnQuY2hhckF0KGVyclBvcykpfV1gKTtcbiAgICAgICAgICAgICAgICBlcnJvci5jb2RlID0gJ1BhcnNlckVycm9yMic7XG4gICAgICAgICAgICAgICAgZXJyb3IucGFyc2VyQ29udGV4dCA9IHsgaW5wdXQ6IHRoaXMuaW5wdXQsIGVsZW1lbnQsIHBvczogdGhpcy5wb3MgfTtcbiAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxldCBlcnJvciA9IG5ldyBFcnJvcihgVW5leHBlY3RlZCBlbmQgb2YgaW5wdXQgYXQgcG9zaXRpb24gJHt0aGlzLnBvc30gW0UzXWApO1xuICAgICAgICAgICAgZXJyb3IuY29kZSA9ICdQYXJzZXJFcnJvcjMnO1xuICAgICAgICAgICAgZXJyb3IucGFyc2VyQ29udGV4dCA9IHsgaW5wdXQ6IHRoaXMuaW5wdXQsIHBvczogdGhpcy5wb3MgfTtcbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5wb3MgKz0gbWF0Y2hbMF0ubGVuZ3RoO1xuICAgICAgICB0aGlzLnJlbWFpbmRlciA9IHRoaXMucmVtYWluZGVyLnN1YnN0cihtYXRjaFswXS5sZW5ndGgpO1xuXG4gICAgICAgIHJldHVybiBlbGVtZW50O1xuICAgIH1cblxuICAgIGFzeW5jIGdldFNwYWNlKCkge1xuICAgICAgICBpZiAoIXRoaXMucmVtYWluZGVyLmxlbmd0aCkge1xuICAgICAgICAgICAgaWYgKHRoaXMudGFnID09PSAnKycgJiYgdGhpcy5wb3MgPT09IDEpIHtcbiAgICAgICAgICAgICAgICAvLyBzcGVjaWFsIGNhc2UsIGVtcHR5ICsgcmVzcG9uc2VcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxldCBlcnJvciA9IG5ldyBFcnJvcihgVW5leHBlY3RlZCBlbmQgb2YgaW5wdXQgYXQgcG9zaXRpb24gJHt0aGlzLnBvc30gW0U0XWApO1xuICAgICAgICAgICAgZXJyb3IuY29kZSA9ICdQYXJzZXJFcnJvcjQnO1xuICAgICAgICAgICAgZXJyb3IucGFyc2VyQ29udGV4dCA9IHsgaW5wdXQ6IHRoaXMuaW5wdXQsIHBvczogdGhpcy5wb3MgfTtcbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGltYXBGb3JtYWxTeW50YXgudmVyaWZ5KHRoaXMucmVtYWluZGVyLmNoYXJBdCgwKSwgaW1hcEZvcm1hbFN5bnRheC5TUCgpKSA+PSAwKSB7XG4gICAgICAgICAgICBsZXQgZXJyb3IgPSBuZXcgRXJyb3IoYFVuZXhwZWN0ZWQgY2hhciBhdCBwb3NpdGlvbiAke3RoaXMucG9zfSBbRTU6ICR7SlNPTi5zdHJpbmdpZnkodGhpcy5yZW1haW5kZXIuY2hhckF0KDApKX1dYCk7XG4gICAgICAgICAgICBlcnJvci5jb2RlID0gJ1BhcnNlckVycm9yNSc7XG4gICAgICAgICAgICBlcnJvci5wYXJzZXJDb250ZXh0ID0geyBpbnB1dDogdGhpcy5pbnB1dCwgZWxlbWVudDogdGhpcy5yZW1haW5kZXIsIHBvczogdGhpcy5wb3MgfTtcbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5wb3MrKztcbiAgICAgICAgdGhpcy5yZW1haW5kZXIgPSB0aGlzLnJlbWFpbmRlci5zdWJzdHIoMSk7XG4gICAgfVxuXG4gICAgYXN5bmMgZ2V0QXR0cmlidXRlcygpIHtcbiAgICAgICAgaWYgKCF0aGlzLnJlbWFpbmRlci5sZW5ndGgpIHtcbiAgICAgICAgICAgIGxldCBlcnJvciA9IG5ldyBFcnJvcihgVW5leHBlY3RlZCBlbmQgb2YgaW5wdXQgYXQgcG9zaXRpb24gJHt0aGlzLnBvc30gW0U2XWApO1xuICAgICAgICAgICAgZXJyb3IuY29kZSA9ICdQYXJzZXJFcnJvcjYnO1xuICAgICAgICAgICAgZXJyb3IucGFyc2VyQ29udGV4dCA9IHsgaW5wdXQ6IHRoaXMuaW5wdXQsIHBvczogdGhpcy5wb3MgfTtcbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMucmVtYWluZGVyLm1hdGNoKC9eXFxzLykpIHtcbiAgICAgICAgICAgIGxldCBlcnJvciA9IG5ldyBFcnJvcihgVW5leHBlY3RlZCB3aGl0ZXNwYWNlIGF0IHBvc2l0aW9uICR7dGhpcy5wb3N9IFtFN11gKTtcbiAgICAgICAgICAgIGVycm9yLmNvZGUgPSAnUGFyc2VyRXJyb3I3JztcbiAgICAgICAgICAgIGVycm9yLnBhcnNlckNvbnRleHQgPSB7IGlucHV0OiB0aGlzLmlucHV0LCBlbGVtZW50OiB0aGlzLnJlbWFpbmRlciwgcG9zOiB0aGlzLnBvcyB9O1xuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB0b2tlblBhcnNlciA9IG5ldyBUb2tlblBhcnNlcih0aGlzLCB0aGlzLnBvcywgdGhpcy5yZW1haW5kZXIsIHRoaXMub3B0aW9ucyk7XG5cbiAgICAgICAgcmV0dXJuIGF3YWl0IHRva2VuUGFyc2VyLmdldEF0dHJpYnV0ZXMoKTtcbiAgICB9XG59XG5cbm1vZHVsZS5leHBvcnRzLlBhcnNlckluc3RhbmNlID0gUGFyc2VySW5zdGFuY2U7XG4iXSwibmFtZXMiOltdLCJpZ25vcmVMaXN0IjpbMF0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(rsc)/./node_modules/imapflow/lib/handler/parser-instance.js\n");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "(rsc)/./node_modules/imapflow/lib/handler/token-parser.js":
|
|
/*!***********************************************************!*\
|
|
!*** ./node_modules/imapflow/lib/handler/token-parser.js ***!
|
|
\***********************************************************/
|
|
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
|
|
|
|
eval("/* eslint new-cap: 0 */\n\n\n\nconst imapFormalSyntax = __webpack_require__(/*! ./imap-formal-syntax */ \"(rsc)/./node_modules/imapflow/lib/handler/imap-formal-syntax.js\");\n\nconst STATE_ATOM = 0x001;\nconst STATE_LITERAL = 0x002;\nconst STATE_NORMAL = 0x003;\nconst STATE_PARTIAL = 0x004;\nconst STATE_SEQUENCE = 0x005;\nconst STATE_STRING = 0x006;\nconst STATE_TEXT = 0x007;\n\nconst RE_DIGITS = /^\\d+$/;\nconst RE_SINGLE_DIGIT = /^\\d$/;\n\nclass TokenParser {\n constructor(parent, startPos, str, options) {\n this.str = (str || '').toString();\n this.options = options || {};\n this.parent = parent;\n\n this.tree = this.currentNode = this.createNode();\n this.pos = startPos || 0;\n\n this.currentNode.type = 'TREE';\n\n this.state = STATE_NORMAL;\n }\n\n async getAttributes() {\n await this.processString();\n\n const attributes = [];\n let branch = attributes;\n\n let walk = async node => {\n let curBranch = branch;\n let elm;\n let partial;\n\n if (!node.isClosed && node.type === 'SEQUENCE' && node.value === '*') {\n node.isClosed = true;\n node.type = 'ATOM';\n }\n\n // If the node was never closed, throw it\n if (!node.isClosed) {\n let error = new Error(`Unexpected end of input at position ${this.pos + this.str.length - 1} [E9]`);\n error.code = 'ParserError9';\n error.parserContext = { input: this.str, pos: this.pos + this.str.length - 1 };\n throw error;\n }\n\n let type = (node.type || '').toString().toUpperCase();\n\n switch (type) {\n case 'LITERAL':\n case 'STRING':\n case 'SEQUENCE':\n elm = {\n type: node.type.toUpperCase(),\n value: node.value\n };\n branch.push(elm);\n break;\n\n case 'ATOM':\n if (node.value.toUpperCase() === 'NIL') {\n branch.push(null);\n break;\n }\n elm = {\n type: node.type.toUpperCase(),\n value: node.value\n };\n branch.push(elm);\n break;\n\n case 'SECTION':\n branch = branch[branch.length - 1].section = [];\n break;\n\n case 'LIST':\n elm = [];\n branch.push(elm);\n branch = elm;\n break;\n\n case 'PARTIAL':\n partial = node.value.split('.').map(Number);\n branch[branch.length - 1].partial = partial;\n break;\n }\n\n for (let childNode of node.childNodes) {\n await walk(childNode);\n }\n\n branch = curBranch;\n };\n\n await walk(this.tree);\n\n return attributes;\n }\n\n createNode(parentNode, startPos) {\n let node = {\n childNodes: [],\n type: false,\n value: '',\n isClosed: true\n };\n\n if (parentNode) {\n node.parentNode = parentNode;\n }\n\n if (typeof startPos === 'number') {\n node.startPos = startPos;\n }\n\n if (parentNode) {\n parentNode.childNodes.push(node);\n }\n\n return node;\n }\n\n async processString() {\n let chr, i, len;\n\n const checkSP = () => {\n // jump to the next non whitespace pos\n while (this.str.charAt(i + 1) === ' ') {\n i++;\n }\n };\n\n for (i = 0, len = this.str.length; i < len; i++) {\n chr = this.str.charAt(i);\n\n switch (this.state) {\n case STATE_NORMAL:\n switch (chr) {\n // DQUOTE starts a new string\n case '\"':\n this.currentNode = this.createNode(this.currentNode, this.pos + i);\n this.currentNode.type = 'string';\n this.state = STATE_STRING;\n this.currentNode.isClosed = false;\n break;\n\n // ( starts a new list\n case '(':\n this.currentNode = this.createNode(this.currentNode, this.pos + i);\n this.currentNode.type = 'LIST';\n this.currentNode.isClosed = false;\n break;\n\n // ) closes a list\n case ')':\n if (this.currentNode.type !== 'LIST') {\n let error = new Error(`Unexpected list terminator ) at position ${this.pos + i} [E10]`);\n error.code = 'ParserError10';\n error.parserContext = { input: this.str, pos: this.pos + i, chr };\n throw error;\n }\n\n this.currentNode.isClosed = true;\n this.currentNode.endPos = this.pos + i;\n this.currentNode = this.currentNode.parentNode;\n\n checkSP();\n break;\n\n // ] closes section group\n case ']':\n if (this.currentNode.type !== 'SECTION') {\n let error = new Error(`Unexpected section terminator ] at position ${this.pos + i} [E11]`);\n error.code = 'ParserError11';\n error.parserContext = { input: this.str, pos: this.pos + i, chr };\n throw error;\n }\n this.currentNode.isClosed = true;\n this.currentNode.endPos = this.pos + i;\n this.currentNode = this.currentNode.parentNode;\n\n checkSP();\n break;\n\n // < starts a new partial\n case '<':\n if (this.str.charAt(i - 1) !== ']') {\n this.currentNode = this.createNode(this.currentNode, this.pos + i);\n this.currentNode.type = 'ATOM';\n this.currentNode.value = chr;\n this.state = STATE_ATOM;\n } else {\n this.currentNode = this.createNode(this.currentNode, this.pos + i);\n this.currentNode.type = 'PARTIAL';\n this.state = STATE_PARTIAL;\n this.currentNode.isClosed = false;\n }\n break;\n\n // binary literal8\n case '~': {\n let nextChr = this.str.charAt(i + 1);\n if (nextChr !== '{') {\n if (imapFormalSyntax['ATOM-CHAR']().indexOf(nextChr) >= 0) {\n // treat as ATOM\n this.currentNode = this.createNode(this.currentNode, this.pos + i);\n this.currentNode.type = 'ATOM';\n this.currentNode.value = chr;\n this.state = STATE_ATOM;\n break;\n }\n\n let error = new Error(`Unexpected literal8 marker at position ${this.pos + i} [E12]`);\n error.code = 'ParserError12';\n error.parserContext = { input: this.str, pos: this.pos + i, chr };\n throw error;\n }\n this.expectedLiteralType = 'literal8';\n break;\n }\n\n // { starts a new literal\n case '{':\n this.currentNode = this.createNode(this.currentNode, this.pos + i);\n this.currentNode.type = 'LITERAL';\n this.currentNode.literalType = this.expectedLiteralType || 'literal';\n this.expectedLiteralType = false;\n this.state = STATE_LITERAL;\n this.currentNode.isClosed = false;\n break;\n\n // * starts a new sequence\n case '*':\n this.currentNode = this.createNode(this.currentNode, this.pos + i);\n this.currentNode.type = 'SEQUENCE';\n this.currentNode.value = chr;\n this.currentNode.isClosed = false;\n this.state = STATE_SEQUENCE;\n break;\n\n // normally a space should never occur\n case ' ':\n // just ignore\n break;\n\n // [ starts section\n case '[':\n // If it is the *first* element after response command, then process as a response argument list\n if (['OK', 'NO', 'BAD', 'BYE', 'PREAUTH'].includes(this.parent.command.toUpperCase()) && this.currentNode === this.tree) {\n this.currentNode.endPos = this.pos + i;\n\n this.currentNode = this.createNode(this.currentNode, this.pos + i);\n this.currentNode.type = 'ATOM';\n\n this.currentNode = this.createNode(this.currentNode, this.pos + i);\n this.currentNode.type = 'SECTION';\n this.currentNode.isClosed = false;\n this.state = STATE_NORMAL;\n\n // RFC2221 defines a response code REFERRAL whose payload is an\n // RFC2192/RFC5092 imapurl that we will try to parse as an ATOM but\n // fail quite badly at parsing. Since the imapurl is such a unique\n // (and crazy) term, we just specialize that case here.\n if (this.str.substr(i + 1, 9).toUpperCase() === 'REFERRAL ') {\n // create the REFERRAL atom\n this.currentNode = this.createNode(this.currentNode, this.pos + i + 1);\n this.currentNode.type = 'ATOM';\n this.currentNode.endPos = this.pos + i + 8;\n this.currentNode.value = 'REFERRAL';\n this.currentNode = this.currentNode.parentNode;\n\n // eat all the way through the ] to be the IMAPURL token.\n this.currentNode = this.createNode(this.currentNode, this.pos + i + 10);\n // just call this an ATOM, even though IMAPURL might be more correct\n this.currentNode.type = 'ATOM';\n // jump i to the ']'\n i = this.str.indexOf(']', i + 10);\n this.currentNode.endPos = this.pos + i - 1;\n this.currentNode.value = this.str.substring(this.currentNode.startPos - this.pos, this.currentNode.endPos - this.pos + 1);\n this.currentNode = this.currentNode.parentNode;\n\n // close out the SECTION\n this.currentNode.isClosed = true;\n this.currentNode = this.currentNode.parentNode;\n\n checkSP();\n }\n\n break;\n }\n\n /* falls through */\n default:\n // Any ATOM supported char starts a new Atom sequence, otherwise throw an error\n // Allow \\ as the first char for atom to support system flags\n // Allow % to support LIST '' %\n // Allow 8bit characters (presumably unicode)\n if (imapFormalSyntax['ATOM-CHAR']().indexOf(chr) < 0 && chr !== '\\\\' && chr !== '%' && chr.charCodeAt(0) < 0x80) {\n let error = new Error(`Unexpected char at position ${this.pos + i} [E13: ${JSON.stringify(chr)}]`);\n error.code = 'ParserError13';\n error.parserContext = { input: this.str, pos: this.pos + i, chr };\n throw error;\n }\n\n this.currentNode = this.createNode(this.currentNode, this.pos + i);\n this.currentNode.type = 'ATOM';\n this.currentNode.value = chr;\n this.state = STATE_ATOM;\n break;\n }\n break;\n\n case STATE_ATOM:\n // space finishes an atom\n if (chr === ' ') {\n this.currentNode.endPos = this.pos + i - 1;\n this.currentNode = this.currentNode.parentNode;\n this.state = STATE_NORMAL;\n break;\n }\n\n //\n if (\n this.currentNode.parentNode &&\n ((chr === ')' && this.currentNode.parentNode.type === 'LIST') || (chr === ']' && this.currentNode.parentNode.type === 'SECTION'))\n ) {\n this.currentNode.endPos = this.pos + i - 1;\n this.currentNode = this.currentNode.parentNode;\n\n this.currentNode.isClosed = true;\n this.currentNode.endPos = this.pos + i;\n this.currentNode = this.currentNode.parentNode;\n this.state = STATE_NORMAL;\n checkSP();\n\n break;\n }\n\n if ((chr === ',' || chr === ':') && RE_DIGITS.test(this.currentNode.value)) {\n this.currentNode.type = 'SEQUENCE';\n this.currentNode.isClosed = true;\n this.state = STATE_SEQUENCE;\n }\n\n // [ starts a section group for this element\n if (chr === '[') {\n // allowed only for selected elements\n if (['BODY', 'BODY.PEEK', 'BINARY', 'BINARY.PEEK'].indexOf(this.currentNode.value.toUpperCase()) < 0) {\n if (/[./]/.test(this.currentNode.value)) {\n // could be a path\n this.currentNode.value += chr;\n break;\n } else {\n let error = new Error(`Unexpected section start char [ at position ${this.pos + i} [E14]`);\n error.code = 'ParserError14';\n error.parserContext = { input: this.str, pos: this.pos + i, chr };\n throw error;\n }\n }\n this.currentNode.endPos = this.pos + i;\n this.currentNode = this.createNode(this.currentNode.parentNode, this.pos + i);\n this.currentNode.type = 'SECTION';\n this.currentNode.isClosed = false;\n this.state = STATE_NORMAL;\n break;\n }\n\n if (chr === '<') {\n let error = new Error(`Unexpected start of partial at position ${this.pos + i} [E15]`);\n error.code = 'ParserError15';\n error.parserContext = { input: this.str, pos: this.pos + i, chr };\n throw error;\n }\n\n // if the char is not ATOM compatible, throw. Allow \\* as an exception\n if (\n imapFormalSyntax['ATOM-CHAR']().indexOf(chr) < 0 &&\n chr.charCodeAt(0) < 0x80 && // allow 8bit (presumably unicode) bytes\n chr !== ']' &&\n !(chr === '*' && this.currentNode.value === '\\\\') &&\n (!this.parent || !this.parent.command || !['NO', 'BAD', 'OK'].includes(this.parent.command))\n ) {\n let error = new Error(`Unexpected char at position ${this.pos + i} [E16: ${JSON.stringify(chr)}]`);\n error.code = 'ParserError16';\n error.parserContext = { input: this.str, pos: this.pos + i, chr };\n throw error;\n } else if (this.currentNode.value === '\\\\*') {\n let error = new Error(`Unexpected char at position ${this.pos + i} [E17: ${JSON.stringify(chr)}]`);\n error.code = 'ParserError17';\n error.parserContext = { input: this.str, pos: this.pos + i, chr };\n throw error;\n }\n\n this.currentNode.value += chr;\n break;\n\n case STATE_STRING:\n // DQUOTE ends the string sequence\n if (chr === '\"') {\n this.currentNode.endPos = this.pos + i;\n this.currentNode.isClosed = true;\n this.currentNode = this.currentNode.parentNode;\n this.state = STATE_NORMAL;\n\n checkSP();\n break;\n }\n\n // \\ Escapes the following char\n if (chr === '\\\\') {\n i++;\n if (i >= len) {\n let error = new Error(`Unexpected end of input at position ${this.pos + i} [E18]`);\n error.code = 'ParserError18';\n error.parserContext = { input: this.str, pos: this.pos + i };\n throw error;\n }\n chr = this.str.charAt(i);\n }\n\n this.currentNode.value += chr;\n break;\n\n case STATE_PARTIAL:\n if (chr === '>') {\n if (this.currentNode.value.at(-1) === '.') {\n let error = new Error(`Unexpected end of partial at position ${this.pos + i} [E19]`);\n error.code = 'ParserError19';\n error.parserContext = { input: this.str, pos: this.pos + i, chr };\n throw error;\n }\n this.currentNode.endPos = this.pos + i;\n this.currentNode.isClosed = true;\n this.currentNode = this.currentNode.parentNode;\n this.state = STATE_NORMAL;\n checkSP();\n break;\n }\n\n if (chr === '.' && (!this.currentNode.value.length || this.currentNode.value.match(/\\./))) {\n let error = new Error(`Unexpected partial separator . at position ${this.pos + i} [E20]`);\n error.code = 'ParserError20';\n error.parserContext = { input: this.str, pos: this.pos + i, chr };\n throw error;\n }\n\n if (imapFormalSyntax.DIGIT().indexOf(chr) < 0 && chr !== '.') {\n let error = new Error(`Unexpected char at position ${this.pos + i} [E21: ${JSON.stringify(chr)}]`);\n error.code = 'ParserError21';\n error.parserContext = { input: this.str, pos: this.pos + i, chr };\n throw error;\n }\n\n if (this.currentNode.value.match(/^0$|\\.0$/) && chr !== '.') {\n let error = new Error(`Invalid partial at position ${this.pos + i} [E22: ${JSON.stringify(chr)}]`);\n error.code = 'ParserError22';\n error.parserContext = { input: this.str, pos: this.pos + i, chr };\n throw error;\n }\n\n this.currentNode.value += chr;\n break;\n\n case STATE_LITERAL:\n if (this.currentNode.started) {\n // only relevant if literals are not already parsed out from input\n\n // Disabled NULL byte check\n // See https://github.com/emailjs/emailjs-imap-handler/commit/f11b2822bedabe492236e8263afc630134a3c41c\n /*\n if (chr === '\\u0000') {\n throw new Error('Unexpected \\\\x00 at position ' + (this.pos + i));\n }\n */\n\n this.currentNode.chBuffer[this.currentNode.chPos++] = chr.charCodeAt(0);\n\n if (this.currentNode.chPos >= this.currentNode.literalLength) {\n this.currentNode.endPos = this.pos + i;\n this.currentNode.isClosed = true;\n this.currentNode.value = this.currentNode.chBuffer.toString('binary');\n this.currentNode.chBuffer = Buffer.alloc(0);\n this.currentNode = this.currentNode.parentNode;\n this.state = STATE_NORMAL;\n checkSP();\n }\n break;\n }\n\n if (chr === '+' && this.options.literalPlus) {\n this.currentNode.literalPlus = true;\n break;\n }\n\n if (chr === '}') {\n if (!('literalLength' in this.currentNode)) {\n let error = new Error(`Unexpected literal prefix end char } at position ${this.pos + i} [E23]`);\n error.code = 'ParserError23';\n error.parserContext = { input: this.str, pos: this.pos + i, chr };\n throw error;\n }\n if (this.str.charAt(i + 1) === '\\n') {\n i++;\n } else if (this.str.charAt(i + 1) === '\\r' && this.str.charAt(i + 2) === '\\n') {\n i += 2;\n } else {\n let error = new Error(`Unexpected char at position ${this.pos + i} [E24: ${JSON.stringify(chr)}]`);\n error.code = 'ParserError24';\n error.parserContext = { input: this.str, pos: this.pos + i, chr };\n throw error;\n }\n\n this.currentNode.literalLength = Number(this.currentNode.literalLength);\n\n if (!this.currentNode.literalLength) {\n // special case where literal content length is 0\n // close the node right away, do not wait for additional input\n this.currentNode.endPos = this.pos + i;\n this.currentNode.isClosed = true;\n this.currentNode = this.currentNode.parentNode;\n this.state = STATE_NORMAL;\n checkSP();\n } else if (this.options.literals) {\n // use the next precached literal values\n this.currentNode.value = this.options.literals.shift();\n\n // only APPEND arguments are kept as Buffers\n /*\n if ((this.parent.command || '').toString().toUpperCase() !== 'APPEND') {\n this.currentNode.value = this.currentNode.value.toString('binary');\n }\n */\n\n this.currentNode.endPos = this.pos + i + this.currentNode.value.length;\n\n this.currentNode.started = false;\n this.currentNode.isClosed = true;\n this.currentNode = this.currentNode.parentNode;\n this.state = STATE_NORMAL;\n checkSP();\n } else {\n this.currentNode.started = true;\n // Allocate expected size buffer. Max size check is already performed\n // Maybe should use allocUnsafe instead?\n this.currentNode.chBuffer = Buffer.alloc(this.currentNode.literalLength);\n this.currentNode.chPos = 0;\n }\n break;\n }\n if (imapFormalSyntax.DIGIT().indexOf(chr) < 0) {\n let error = new Error(`Unexpected char at position ${this.pos + i} [E25: ${JSON.stringify(chr)}]`);\n error.code = 'ParserError25';\n error.parserContext = { input: this.str, pos: this.pos + i, chr };\n throw error;\n }\n if (this.currentNode.literalLength === '0') {\n let error = new Error(`Invalid literal at position ${this.pos + i} [E26]`);\n error.code = 'ParserError26';\n error.parserContext = { input: this.str, pos: this.pos + i, chr };\n throw error;\n }\n this.currentNode.literalLength = (this.currentNode.literalLength || '') + chr;\n break;\n\n case STATE_SEQUENCE:\n // space finishes the sequence set\n if (chr === ' ') {\n if (!RE_SINGLE_DIGIT.test(this.currentNode.value.at(-1)) && this.currentNode.value.at(-1) !== '*') {\n let error = new Error(`Unexpected whitespace at position ${this.pos + i} [E27]`);\n error.code = 'ParserError27';\n error.parserContext = { input: this.str, pos: this.pos + i, chr };\n throw error;\n }\n\n if (this.currentNode.value !== '*' && this.currentNode.value.at(-1) === '*' && this.currentNode.value.at(-2) !== ':') {\n let error = new Error(`Unexpected whitespace at position ${this.pos + i} [E28]`);\n error.code = 'ParserError28';\n error.parserContext = { input: this.str, pos: this.pos + i, chr };\n throw error;\n }\n\n this.currentNode.isClosed = true;\n this.currentNode.endPos = this.pos + i - 1;\n this.currentNode = this.currentNode.parentNode;\n this.state = STATE_NORMAL;\n break;\n } else if (this.currentNode.parentNode && chr === ']' && this.currentNode.parentNode.type === 'SECTION') {\n this.currentNode.endPos = this.pos + i - 1;\n this.currentNode = this.currentNode.parentNode;\n\n this.currentNode.isClosed = true;\n this.currentNode.endPos = this.pos + i;\n this.currentNode = this.currentNode.parentNode;\n this.state = STATE_NORMAL;\n\n checkSP();\n break;\n }\n\n if (chr === ':') {\n if (!RE_SINGLE_DIGIT.test(this.currentNode.value.at(-1)) && this.currentNode.value.at(-1) !== '*') {\n let error = new Error(`Unexpected range separator : at position ${this.pos + i} [E29]`);\n error.code = 'ParserError29';\n error.parserContext = { input: this.str, pos: this.pos + i, chr };\n throw error;\n }\n } else if (chr === '*') {\n if ([',', ':'].indexOf(this.currentNode.value.at(-1)) < 0) {\n let error = new Error(`Unexpected range wildcard at position ${this.pos + i} [E30]`);\n error.code = 'ParserError30';\n error.parserContext = { input: this.str, pos: this.pos + i, chr };\n throw error;\n }\n } else if (chr === ',') {\n if (!RE_SINGLE_DIGIT.test(this.currentNode.value.at(-1)) && this.currentNode.value.at(-1) !== '*') {\n let error = new Error(`Unexpected sequence separator , at position ${this.pos + i} [E31]`);\n error.code = 'ParserError31';\n error.parserContext = { input: this.str, pos: this.pos + i, chr };\n throw error;\n }\n if (this.currentNode.value.at(-1) === '*' && this.currentNode.value.at(-2) !== ':') {\n let error = new Error(`Unexpected sequence separator , at position ${this.pos + i} [E32]`);\n error.code = 'ParserError32';\n error.parserContext = { input: this.str, pos: this.pos + i, chr };\n throw error;\n }\n } else if (!RE_SINGLE_DIGIT.test(chr)) {\n let error = new Error(`Unexpected char at position ${this.pos + i} [E33: ${JSON.stringify(chr)}]`);\n error.code = 'ParserError33';\n error.parserContext = { input: this.str, pos: this.pos + i, chr };\n throw error;\n }\n\n if (RE_SINGLE_DIGIT.test(chr) && this.currentNode.value.at(-1) === '*') {\n let error = new Error(`Unexpected number at position ${this.pos + i} [E34: ${JSON.stringify(chr)}]`);\n error.code = 'ParserError34';\n error.parserContext = { input: this.str, pos: this.pos + i, chr };\n throw error;\n }\n\n this.currentNode.value += chr;\n break;\n\n case STATE_TEXT:\n this.currentNode.value += chr;\n break;\n }\n }\n }\n}\n\nmodule.exports.TokenParser = TokenParser;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHJzYykvLi9ub2RlX21vZHVsZXMvaW1hcGZsb3cvbGliL2hhbmRsZXIvdG9rZW4tcGFyc2VyLmpzIiwibWFwcGluZ3MiOiJBQUFBOztBQUVhOztBQUViLHlCQUF5QixtQkFBTyxDQUFDLDZGQUFzQjs7QUFFdkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLDZFQUE2RSxnQ0FBZ0M7QUFDN0c7QUFDQSx3Q0FBd0M7QUFDeEM7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLDJDQUEyQyxTQUFTO0FBQ3BEOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxrR0FBa0csY0FBYztBQUNoSDtBQUNBLHdEQUF3RDtBQUN4RDtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLHFHQUFxRyxjQUFjO0FBQ25IO0FBQ0Esd0RBQXdEO0FBQ3hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhCQUE4QjtBQUM5QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsOENBQThDO0FBQzlDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsZ0dBQWdHLGNBQWM7QUFDOUc7QUFDQSx3REFBd0Q7QUFDeEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSw2QkFBNkI7QUFDN0IsK0JBQStCO0FBQy9CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxRkFBcUYsY0FBYyxRQUFRLG9CQUFvQjtBQUMvSDtBQUNBLHdEQUF3RDtBQUN4RDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhCQUE4QjtBQUM5QixxR0FBcUcsY0FBYztBQUNuSDtBQUNBLHdEQUF3RDtBQUN4RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLHlGQUF5RixjQUFjO0FBQ3ZHO0FBQ0EsZ0RBQWdEO0FBQ2hEO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZFQUE2RSxjQUFjLFFBQVEsb0JBQW9CO0FBQ3ZIO0FBQ0EsZ0RBQWdEO0FBQ2hEO0FBQ0Esc0JBQXNCO0FBQ3RCLDZFQUE2RSxjQUFjLFFBQVEsb0JBQW9CO0FBQ3ZIO0FBQ0EsZ0RBQWdEO0FBQ2hEO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5RkFBeUYsY0FBYztBQUN2RztBQUNBLG9EQUFvRDtBQUNwRDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLDJGQUEyRixjQUFjO0FBQ3pHO0FBQ0Esb0RBQW9EO0FBQ3BEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLDRGQUE0RixjQUFjO0FBQzFHO0FBQ0EsZ0RBQWdEO0FBQ2hEO0FBQ0E7O0FBRUE7QUFDQSw2RUFBNkUsY0FBYyxRQUFRLG9CQUFvQjtBQUN2SDtBQUNBLGdEQUFnRDtBQUNoRDtBQUNBOztBQUVBO0FBQ0EsNkVBQTZFLGNBQWMsUUFBUSxvQkFBb0I7QUFDdkg7QUFDQSxnREFBZ0Q7QUFDaEQ7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLGtDQUFrQztBQUNsQztBQUNBLHdGQUF3RixjQUFjLGNBQWM7QUFDcEg7QUFDQSxvREFBb0Q7QUFDcEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQkFBMEI7QUFDMUI7QUFDQSwwQkFBMEI7QUFDMUIsaUZBQWlGLGNBQWMsUUFBUSxvQkFBb0I7QUFDM0g7QUFDQSxvREFBb0Q7QUFDcEQ7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMEJBQTBCO0FBQzFCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQkFBMEI7QUFDMUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkVBQTZFLGNBQWMsUUFBUSxvQkFBb0I7QUFDdkg7QUFDQSxnREFBZ0Q7QUFDaEQ7QUFDQTtBQUNBO0FBQ0EsNkVBQTZFLGNBQWM7QUFDM0Y7QUFDQSxnREFBZ0Q7QUFDaEQ7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1RkFBdUYsY0FBYztBQUNyRztBQUNBLG9EQUFvRDtBQUNwRDtBQUNBOztBQUVBO0FBQ0EsdUZBQXVGLGNBQWM7QUFDckc7QUFDQSxvREFBb0Q7QUFDcEQ7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCO0FBQ3RCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSw4RkFBOEYsY0FBYztBQUM1RztBQUNBLG9EQUFvRDtBQUNwRDtBQUNBO0FBQ0Esc0JBQXNCO0FBQ3RCO0FBQ0EsMkZBQTJGLGNBQWM7QUFDekc7QUFDQSxvREFBb0Q7QUFDcEQ7QUFDQTtBQUNBLHNCQUFzQjtBQUN0QjtBQUNBLGlHQUFpRyxjQUFjO0FBQy9HO0FBQ0Esb0RBQW9EO0FBQ3BEO0FBQ0E7QUFDQTtBQUNBLGlHQUFpRyxjQUFjO0FBQy9HO0FBQ0Esb0RBQW9EO0FBQ3BEO0FBQ0E7QUFDQSxzQkFBc0I7QUFDdEIsNkVBQTZFLGNBQWMsUUFBUSxvQkFBb0I7QUFDdkg7QUFDQSxnREFBZ0Q7QUFDaEQ7QUFDQTs7QUFFQTtBQUNBLCtFQUErRSxjQUFjLFFBQVEsb0JBQW9CO0FBQ3pIO0FBQ0EsZ0RBQWdEO0FBQ2hEO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSwwQkFBMEIiLCJzb3VyY2VzIjpbIi9ob21lL2FsbWEvbmV4dGdlbi9OZWFoLW1haWwvbm9kZV9tb2R1bGVzL2ltYXBmbG93L2xpYi9oYW5kbGVyL3Rva2VuLXBhcnNlci5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQgbmV3LWNhcDogMCAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbmNvbnN0IGltYXBGb3JtYWxTeW50YXggPSByZXF1aXJlKCcuL2ltYXAtZm9ybWFsLXN5bnRheCcpO1xuXG5jb25zdCBTVEFURV9BVE9NID0gMHgwMDE7XG5jb25zdCBTVEFURV9MSVRFUkFMID0gMHgwMDI7XG5jb25zdCBTVEFURV9OT1JNQUwgPSAweDAwMztcbmNvbnN0IFNUQVRFX1BBUlRJQUwgPSAweDAwNDtcbmNvbnN0IFNUQVRFX1NFUVVFTkNFID0gMHgwMDU7XG5jb25zdCBTVEFURV9TVFJJTkcgPSAweDAwNjtcbmNvbnN0IFNUQVRFX1RFWFQgPSAweDAwNztcblxuY29uc3QgUkVfRElHSVRTID0gL15cXGQrJC87XG5jb25zdCBSRV9TSU5HTEVfRElHSVQgPSAvXlxcZCQvO1xuXG5jbGFzcyBUb2tlblBhcnNlciB7XG4gICAgY29uc3RydWN0b3IocGFyZW50LCBzdGFydFBvcywgc3RyLCBvcHRpb25zKSB7XG4gICAgICAgIHRoaXMuc3RyID0gKHN0ciB8fCAnJykudG9TdHJpbmcoKTtcbiAgICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgICAgICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7XG5cbiAgICAgICAgdGhpcy50cmVlID0gdGhpcy5jdXJyZW50Tm9kZSA9IHRoaXMuY3JlYXRlTm9kZSgpO1xuICAgICAgICB0aGlzLnBvcyA9IHN0YXJ0UG9zIHx8IDA7XG5cbiAgICAgICAgdGhpcy5jdXJyZW50Tm9kZS50eXBlID0gJ1RSRUUnO1xuXG4gICAgICAgIHRoaXMuc3RhdGUgPSBTVEFURV9OT1JNQUw7XG4gICAgfVxuXG4gICAgYXN5bmMgZ2V0QXR0cmlidXRlcygpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5wcm9jZXNzU3RyaW5nKCk7XG5cbiAgICAgICAgY29uc3QgYXR0cmlidXRlcyA9IFtdO1xuICAgICAgICBsZXQgYnJhbmNoID0gYXR0cmlidXRlcztcblxuICAgICAgICBsZXQgd2FsayA9IGFzeW5jIG5vZGUgPT4ge1xuICAgICAgICAgICAgbGV0IGN1ckJyYW5jaCA9IGJyYW5jaDtcbiAgICAgICAgICAgIGxldCBlbG07XG4gICAgICAgICAgICBsZXQgcGFydGlhbDtcblxuICAgICAgICAgICAgaWYgKCFub2RlLmlzQ2xvc2VkICYmIG5vZGUudHlwZSA9PT0gJ1NFUVVFTkNFJyAmJiBub2RlLnZhbHVlID09PSAnKicpIHtcbiAgICAgICAgICAgICAgICBub2RlLmlzQ2xvc2VkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBub2RlLnR5cGUgPSAnQVRPTSc7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIElmIHRoZSBub2RlIHdhcyBuZXZlciBjbG9zZWQsIHRocm93IGl0XG4gICAgICAgICAgICBpZiAoIW5vZGUuaXNDbG9zZWQpIHtcbiAgICAgICAgICAgICAgICBsZXQgZXJyb3IgPSBuZXcgRXJyb3IoYFVuZXhwZWN0ZWQgZW5kIG9mIGlucHV0IGF0IHBvc2l0aW9uICR7dGhpcy5wb3MgKyB0aGlzLnN0ci5sZW5ndGggLSAxfSBbRTldYCk7XG4gICAgICAgICAgICAgICAgZXJyb3IuY29kZSA9ICdQYXJzZXJFcnJvcjknO1xuICAgICAgICAgICAgICAgIGVycm9yLnBhcnNlckNvbnRleHQgPSB7IGlucHV0OiB0aGlzLnN0ciwgcG9zOiB0aGlzLnBvcyArIHRoaXMuc3RyLmxlbmd0aCAtIDEgfTtcbiAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbGV0IHR5cGUgPSAobm9kZS50eXBlIHx8ICcnKS50b1N0cmluZygpLnRvVXBwZXJDYXNlKCk7XG5cbiAgICAgICAgICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICAgICAgICAgIGNhc2UgJ0xJVEVSQUwnOlxuICAgICAgICAgICAgICAgIGNhc2UgJ1NUUklORyc6XG4gICAgICAgICAgICAgICAgY2FzZSAnU0VRVUVOQ0UnOlxuICAgICAgICAgICAgICAgICAgICBlbG0gPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBub2RlLnR5cGUudG9VcHBlckNhc2UoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBub2RlLnZhbHVlXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIGJyYW5jaC5wdXNoKGVsbSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgY2FzZSAnQVRPTSc6XG4gICAgICAgICAgICAgICAgICAgIGlmIChub2RlLnZhbHVlLnRvVXBwZXJDYXNlKCkgPT09ICdOSUwnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmFuY2gucHVzaChudWxsKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsbSA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IG5vZGUudHlwZS50b1VwcGVyQ2FzZSgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IG5vZGUudmFsdWVcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgYnJhbmNoLnB1c2goZWxtKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgICBjYXNlICdTRUNUSU9OJzpcbiAgICAgICAgICAgICAgICAgICAgYnJhbmNoID0gYnJhbmNoW2JyYW5jaC5sZW5ndGggLSAxXS5zZWN0aW9uID0gW107XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgY2FzZSAnTElTVCc6XG4gICAgICAgICAgICAgICAgICAgIGVsbSA9IFtdO1xuICAgICAgICAgICAgICAgICAgICBicmFuY2gucHVzaChlbG0pO1xuICAgICAgICAgICAgICAgICAgICBicmFuY2ggPSBlbG07XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgY2FzZSAnUEFSVElBTCc6XG4gICAgICAgICAgICAgICAgICAgIHBhcnRpYWwgPSBub2RlLnZhbHVlLnNwbGl0KCcuJykubWFwKE51bWJlcik7XG4gICAgICAgICAgICAgICAgICAgIGJyYW5jaFticmFuY2gubGVuZ3RoIC0gMV0ucGFydGlhbCA9IHBhcnRpYWw7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmb3IgKGxldCBjaGlsZE5vZGUgb2Ygbm9kZS5jaGlsZE5vZGVzKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgd2FsayhjaGlsZE5vZGUpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBicmFuY2ggPSBjdXJCcmFuY2g7XG4gICAgICAgIH07XG5cbiAgICAgICAgYXdhaXQgd2Fsayh0aGlzLnRyZWUpO1xuXG4gICAgICAgIHJldHVybiBhdHRyaWJ1dGVzO1xuICAgIH1cblxuICAgIGNyZWF0ZU5vZGUocGFyZW50Tm9kZSwgc3RhcnRQb3MpIHtcbiAgICAgICAgbGV0IG5vZGUgPSB7XG4gICAgICAgICAgICBjaGlsZE5vZGVzOiBbXSxcbiAgICAgICAgICAgIHR5cGU6IGZhbHNlLFxuICAgICAgICAgICAgdmFsdWU6ICcnLFxuICAgICAgICAgICAgaXNDbG9zZWQ6IHRydWVcbiAgICAgICAgfTtcblxuICAgICAgICBpZiAocGFyZW50Tm9kZSkge1xuICAgICAgICAgICAgbm9kZS5wYXJlbnROb2RlID0gcGFyZW50Tm9kZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0eXBlb2Ygc3RhcnRQb3MgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICBub2RlLnN0YXJ0UG9zID0gc3RhcnRQb3M7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocGFyZW50Tm9kZSkge1xuICAgICAgICAgICAgcGFyZW50Tm9kZS5jaGlsZE5vZGVzLnB1c2gobm9kZSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbm9kZTtcbiAgICB9XG5cbiAgICBhc3luYyBwcm9jZXNzU3RyaW5nKCkge1xuICAgICAgICBsZXQgY2hyLCBpLCBsZW47XG5cbiAgICAgICAgY29uc3QgY2hlY2tTUCA9ICgpID0+IHtcbiAgICAgICAgICAgIC8vIGp1bXAgdG8gdGhlIG5leHQgbm9uIHdoaXRlc3BhY2UgcG9zXG4gICAgICAgICAgICB3aGlsZSAodGhpcy5zdHIuY2hhckF0KGkgKyAxKSA9PT0gJyAnKSB7XG4gICAgICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIGZvciAoaSA9IDAsIGxlbiA9IHRoaXMuc3RyLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgICBjaHIgPSB0aGlzLnN0ci5jaGFyQXQoaSk7XG5cbiAgICAgICAgICAgIHN3aXRjaCAodGhpcy5zdGF0ZSkge1xuICAgICAgICAgICAgICAgIGNhc2UgU1RBVEVfTk9STUFMOlxuICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGNocikge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gRFFVT1RFIHN0YXJ0cyBhIG5ldyBzdHJpbmdcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ1wiJzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnROb2RlID0gdGhpcy5jcmVhdGVOb2RlKHRoaXMuY3VycmVudE5vZGUsIHRoaXMucG9zICsgaSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50Tm9kZS50eXBlID0gJ3N0cmluZyc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IFNUQVRFX1NUUklORztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnROb2RlLmlzQ2xvc2VkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICggc3RhcnRzIGEgbmV3IGxpc3RcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJygnOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudE5vZGUgPSB0aGlzLmNyZWF0ZU5vZGUodGhpcy5jdXJyZW50Tm9kZSwgdGhpcy5wb3MgKyBpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnROb2RlLnR5cGUgPSAnTElTVCc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50Tm9kZS5pc0Nsb3NlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyApIGNsb3NlcyBhIGxpc3RcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJyknOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmN1cnJlbnROb2RlLnR5cGUgIT09ICdMSVNUJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZXJyb3IgPSBuZXcgRXJyb3IoYFVuZXhwZWN0ZWQgbGlzdCB0ZXJtaW5hdG9yICkgYXQgcG9zaXRpb24gJHt0aGlzLnBvcyArIGl9IFtFMTBdYCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yLmNvZGUgPSAnUGFyc2VyRXJyb3IxMCc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yLnBhcnNlckNvbnRleHQgPSB7IGlucHV0OiB0aGlzLnN0ciwgcG9zOiB0aGlzLnBvcyArIGksIGNociB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnROb2RlLmlzQ2xvc2VkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnROb2RlLmVuZFBvcyA9IHRoaXMucG9zICsgaTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnROb2RlID0gdGhpcy5jdXJyZW50Tm9kZS5wYXJlbnROb2RlO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tTUCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBdIGNsb3NlcyBzZWN0aW9uIGdyb3VwXG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICddJzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5jdXJyZW50Tm9kZS50eXBlICE9PSAnU0VDVElPTicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGVycm9yID0gbmV3IEVycm9yKGBVbmV4cGVjdGVkIHNlY3Rpb24gdGVybWluYXRvciBdIGF0IHBvc2l0aW9uICR7dGhpcy5wb3MgKyBpfSBbRTExXWApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvci5jb2RlID0gJ1BhcnNlckVycm9yMTEnO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvci5wYXJzZXJDb250ZXh0ID0geyBpbnB1dDogdGhpcy5zdHIsIHBvczogdGhpcy5wb3MgKyBpLCBjaHIgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudE5vZGUuaXNDbG9zZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudE5vZGUuZW5kUG9zID0gdGhpcy5wb3MgKyBpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudE5vZGUgPSB0aGlzLmN1cnJlbnROb2RlLnBhcmVudE5vZGU7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja1NQKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIDwgc3RhcnRzIGEgbmV3IHBhcnRpYWxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJzwnOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnN0ci5jaGFyQXQoaSAtIDEpICE9PSAnXScpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50Tm9kZSA9IHRoaXMuY3JlYXRlTm9kZSh0aGlzLmN1cnJlbnROb2RlLCB0aGlzLnBvcyArIGkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnROb2RlLnR5cGUgPSAnQVRPTSc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudE5vZGUudmFsdWUgPSBjaHI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBTVEFURV9BVE9NO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudE5vZGUgPSB0aGlzLmNyZWF0ZU5vZGUodGhpcy5jdXJyZW50Tm9kZSwgdGhpcy5wb3MgKyBpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50Tm9kZS50eXBlID0gJ1BBUlRJQUwnO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnN0YXRlID0gU1RBVEVfUEFSVElBTDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50Tm9kZS5pc0Nsb3NlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmluYXJ5IGxpdGVyYWw4XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICd+Jzoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBuZXh0Q2hyID0gdGhpcy5zdHIuY2hhckF0KGkgKyAxKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmV4dENociAhPT0gJ3snKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbWFwRm9ybWFsU3ludGF4WydBVE9NLUNIQVInXSgpLmluZGV4T2YobmV4dENocikgPj0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHJlYXQgYXMgQVRPTVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50Tm9kZSA9IHRoaXMuY3JlYXRlTm9kZSh0aGlzLmN1cnJlbnROb2RlLCB0aGlzLnBvcyArIGkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50Tm9kZS50eXBlID0gJ0FUT00nO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50Tm9kZS52YWx1ZSA9IGNocjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBTVEFURV9BVE9NO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZXJyb3IgPSBuZXcgRXJyb3IoYFVuZXhwZWN0ZWQgbGl0ZXJhbDggbWFya2VyIGF0IHBvc2l0aW9uICR7dGhpcy5wb3MgKyBpfSBbRTEyXWApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvci5jb2RlID0gJ1BhcnNlckVycm9yMTInO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvci5wYXJzZXJDb250ZXh0ID0geyBpbnB1dDogdGhpcy5zdHIsIHBvczogdGhpcy5wb3MgKyBpLCBjaHIgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZXhwZWN0ZWRMaXRlcmFsVHlwZSA9ICdsaXRlcmFsOCc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHsgc3RhcnRzIGEgbmV3IGxpdGVyYWxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3snOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudE5vZGUgPSB0aGlzLmNyZWF0ZU5vZGUodGhpcy5jdXJyZW50Tm9kZSwgdGhpcy5wb3MgKyBpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnROb2RlLnR5cGUgPSAnTElURVJBTCc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50Tm9kZS5saXRlcmFsVHlwZSA9IHRoaXMuZXhwZWN0ZWRMaXRlcmFsVHlwZSB8fCAnbGl0ZXJhbCc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5leHBlY3RlZExpdGVyYWxUeXBlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IFNUQVRFX0xJVEVSQUw7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50Tm9kZS5pc0Nsb3NlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAqIHN0YXJ0cyBhIG5ldyBzZXF1ZW5jZVxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnKic6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50Tm9kZSA9IHRoaXMuY3JlYXRlTm9kZSh0aGlzLmN1cnJlbnROb2RlLCB0aGlzLnBvcyArIGkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudE5vZGUudHlwZSA9ICdTRVFVRU5DRSc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50Tm9kZS52YWx1ZSA9IGNocjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnROb2RlLmlzQ2xvc2VkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IFNUQVRFX1NFUVVFTkNFO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBub3JtYWxseSBhIHNwYWNlIHNob3VsZCBuZXZlciBvY2N1clxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnICc6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8ganVzdCBpZ25vcmVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gWyBzdGFydHMgc2VjdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnWyc6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgaXQgaXMgdGhlICpmaXJzdCogZWxlbWVudCBhZnRlciByZXNwb25zZSBjb21tYW5kLCB0aGVuIHByb2Nlc3MgYXMgYSByZXNwb25zZSBhcmd1bWVudCBsaXN0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFsnT0snLCAnTk8nLCAnQkFEJywgJ0JZRScsICdQUkVBVVRIJ10uaW5jbHVkZXModGhpcy5wYXJlbnQuY29tbWFuZC50b1VwcGVyQ2FzZSgpKSAmJiB0aGlzLmN1cnJlbnROb2RlID09PSB0aGlzLnRyZWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50Tm9kZS5lbmRQb3MgPSB0aGlzLnBvcyArIGk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50Tm9kZSA9IHRoaXMuY3JlYXRlTm9kZSh0aGlzLmN1cnJlbnROb2RlLCB0aGlzLnBvcyArIGkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnROb2RlLnR5cGUgPSAnQVRPTSc7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50Tm9kZSA9IHRoaXMuY3JlYXRlTm9kZSh0aGlzLmN1cnJlbnROb2RlLCB0aGlzLnBvcyArIGkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnROb2RlLnR5cGUgPSAnU0VDVElPTic7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudE5vZGUuaXNDbG9zZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IFNUQVRFX05PUk1BTDtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSRkMyMjIxIGRlZmluZXMgYSByZXNwb25zZSBjb2RlIFJFRkVSUkFMIHdob3NlIHBheWxvYWQgaXMgYW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUkZDMjE5Mi9SRkM1MDkyIGltYXB1cmwgdGhhdCB3ZSB3aWxsIHRyeSB0byBwYXJzZSBhcyBhbiBBVE9NIGJ1dFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmYWlsIHF1aXRlIGJhZGx5IGF0IHBhcnNpbmcuICBTaW5jZSB0aGUgaW1hcHVybCBpcyBzdWNoIGEgdW5pcXVlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIChhbmQgY3JhenkpIHRlcm0sIHdlIGp1c3Qgc3BlY2lhbGl6ZSB0aGF0IGNhc2UgaGVyZS5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuc3RyLnN1YnN0cihpICsgMSwgOSkudG9VcHBlckNhc2UoKSA9PT0gJ1JFRkVSUkFMICcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSB0aGUgUkVGRVJSQUwgYXRvbVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50Tm9kZSA9IHRoaXMuY3JlYXRlTm9kZSh0aGlzLmN1cnJlbnROb2RlLCB0aGlzLnBvcyArIGkgKyAxKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudE5vZGUudHlwZSA9ICdBVE9NJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudE5vZGUuZW5kUG9zID0gdGhpcy5wb3MgKyBpICsgODtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudE5vZGUudmFsdWUgPSAnUkVGRVJSQUwnO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50Tm9kZSA9IHRoaXMuY3VycmVudE5vZGUucGFyZW50Tm9kZTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZWF0IGFsbCB0aGUgd2F5IHRocm91Z2ggdGhlIF0gdG8gYmUgdGhlICBJTUFQVVJMIHRva2VuLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50Tm9kZSA9IHRoaXMuY3JlYXRlTm9kZSh0aGlzLmN1cnJlbnROb2RlLCB0aGlzLnBvcyArIGkgKyAxMCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBqdXN0IGNhbGwgdGhpcyBhbiBBVE9NLCBldmVuIHRob3VnaCBJTUFQVVJMIG1pZ2h0IGJlIG1vcmUgY29ycmVjdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50Tm9kZS50eXBlID0gJ0FUT00nO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8ganVtcCBpIHRvIHRoZSAnXSdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkgPSB0aGlzLnN0ci5pbmRleE9mKCddJywgaSArIDEwKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudE5vZGUuZW5kUG9zID0gdGhpcy5wb3MgKyBpIC0gMTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudE5vZGUudmFsdWUgPSB0aGlzLnN0ci5zdWJzdHJpbmcodGhpcy5jdXJyZW50Tm9kZS5zdGFydFBvcyAtIHRoaXMucG9zLCB0aGlzLmN1cnJlbnROb2RlLmVuZFBvcyAtIHRoaXMucG9zICsgMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnROb2RlID0gdGhpcy5jdXJyZW50Tm9kZS5wYXJlbnROb2RlO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjbG9zZSBvdXQgdGhlIFNFQ1RJT05cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudE5vZGUuaXNDbG9zZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50Tm9kZSA9IHRoaXMuY3VycmVudE5vZGUucGFyZW50Tm9kZTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tTUCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFueSBBVE9NIHN1cHBvcnRlZCBjaGFyIHN0YXJ0cyBhIG5ldyBBdG9tIHNlcXVlbmNlLCBvdGhlcndpc2UgdGhyb3cgYW4gZXJyb3JcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBbGxvdyBcXCBhcyB0aGUgZmlyc3QgY2hhciBmb3IgYXRvbSB0byBzdXBwb3J0IHN5c3RlbSBmbGFnc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFsbG93ICUgdG8gc3VwcG9ydCBMSVNUICcnICVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBbGxvdyA4Yml0IGNoYXJhY3RlcnMgKHByZXN1bWFibHkgdW5pY29kZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW1hcEZvcm1hbFN5bnRheFsnQVRPTS1DSEFSJ10oKS5pbmRleE9mKGNocikgPCAwICYmIGNociAhPT0gJ1xcXFwnICYmIGNociAhPT0gJyUnICYmIGNoci5jaGFyQ29kZUF0KDApIDwgMHg4MCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZXJyb3IgPSBuZXcgRXJyb3IoYFVuZXhwZWN0ZWQgY2hhciBhdCBwb3NpdGlvbiAke3RoaXMucG9zICsgaX0gW0UxMzogJHtKU09OLnN0cmluZ2lmeShjaHIpfV1gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IuY29kZSA9ICdQYXJzZXJFcnJvcjEzJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IucGFyc2VyQ29udGV4dCA9IHsgaW5wdXQ6IHRoaXMuc3RyLCBwb3M6IHRoaXMucG9zICsgaSwgY2hyIH07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudE5vZGUgPSB0aGlzLmNyZWF0ZU5vZGUodGhpcy5jdXJyZW50Tm9kZSwgdGhpcy5wb3MgKyBpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnROb2RlLnR5cGUgPSAnQVRPTSc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50Tm9kZS52YWx1ZSA9IGNocjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnN0YXRlID0gU1RBVEVfQVRPTTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgIGNhc2UgU1RBVEVfQVRPTTpcbiAgICAgICAgICAgICAgICAgICAgLy8gc3BhY2UgZmluaXNoZXMgYW4gYXRvbVxuICAgICAgICAgICAgICAgICAgICBpZiAoY2hyID09PSAnICcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudE5vZGUuZW5kUG9zID0gdGhpcy5wb3MgKyBpIC0gMTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudE5vZGUgPSB0aGlzLmN1cnJlbnROb2RlLnBhcmVudE5vZGU7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnN0YXRlID0gU1RBVEVfTk9STUFMO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnROb2RlLnBhcmVudE5vZGUgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICgoY2hyID09PSAnKScgJiYgdGhpcy5jdXJyZW50Tm9kZS5wYXJlbnROb2RlLnR5cGUgPT09ICdMSVNUJykgfHwgKGNociA9PT0gJ10nICYmIHRoaXMuY3VycmVudE5vZGUucGFyZW50Tm9kZS50eXBlID09PSAnU0VDVElPTicpKVxuICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudE5vZGUuZW5kUG9zID0gdGhpcy5wb3MgKyBpIC0gMTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudE5vZGUgPSB0aGlzLmN1cnJlbnROb2RlLnBhcmVudE5vZGU7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudE5vZGUuaXNDbG9zZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50Tm9kZS5lbmRQb3MgPSB0aGlzLnBvcyArIGk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnROb2RlID0gdGhpcy5jdXJyZW50Tm9kZS5wYXJlbnROb2RlO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IFNUQVRFX05PUk1BTDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrU1AoKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZiAoKGNociA9PT0gJywnIHx8IGNociA9PT0gJzonKSAmJiBSRV9ESUdJVFMudGVzdCh0aGlzLmN1cnJlbnROb2RlLnZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50Tm9kZS50eXBlID0gJ1NFUVVFTkNFJztcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudE5vZGUuaXNDbG9zZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IFNUQVRFX1NFUVVFTkNFO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gWyBzdGFydHMgYSBzZWN0aW9uIGdyb3VwIGZvciB0aGlzIGVsZW1lbnRcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNociA9PT0gJ1snKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBhbGxvd2VkIG9ubHkgZm9yIHNlbGVjdGVkIGVsZW1lbnRzXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoWydCT0RZJywgJ0JPRFkuUEVFSycsICdCSU5BUlknLCAnQklOQVJZLlBFRUsnXS5pbmRleE9mKHRoaXMuY3VycmVudE5vZGUudmFsdWUudG9VcHBlckNhc2UoKSkgPCAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKC9bLi9dLy50ZXN0KHRoaXMuY3VycmVudE5vZGUudmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvdWxkIGJlIGEgcGF0aFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnROb2RlLnZhbHVlICs9IGNocjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGVycm9yID0gbmV3IEVycm9yKGBVbmV4cGVjdGVkIHNlY3Rpb24gc3RhcnQgY2hhciBbIGF0IHBvc2l0aW9uICR7dGhpcy5wb3MgKyBpfSBbRTE0XWApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvci5jb2RlID0gJ1BhcnNlckVycm9yMTQnO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvci5wYXJzZXJDb250ZXh0ID0geyBpbnB1dDogdGhpcy5zdHIsIHBvczogdGhpcy5wb3MgKyBpLCBjaHIgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50Tm9kZS5lbmRQb3MgPSB0aGlzLnBvcyArIGk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnROb2RlID0gdGhpcy5jcmVhdGVOb2RlKHRoaXMuY3VycmVudE5vZGUucGFyZW50Tm9kZSwgdGhpcy5wb3MgKyBpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudE5vZGUudHlwZSA9ICdTRUNUSU9OJztcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudE5vZGUuaXNDbG9zZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBTVEFURV9OT1JNQUw7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGlmIChjaHIgPT09ICc8Jykge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGVycm9yID0gbmV3IEVycm9yKGBVbmV4cGVjdGVkIHN0YXJ0IG9mIHBhcnRpYWwgYXQgcG9zaXRpb24gJHt0aGlzLnBvcyArIGl9IFtFMTVdYCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJvci5jb2RlID0gJ1BhcnNlckVycm9yMTUnO1xuICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IucGFyc2VyQ29udGV4dCA9IHsgaW5wdXQ6IHRoaXMuc3RyLCBwb3M6IHRoaXMucG9zICsgaSwgY2hyIH07XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBjaGFyIGlzIG5vdCBBVE9NIGNvbXBhdGlibGUsIHRocm93LiBBbGxvdyBcXCogYXMgYW4gZXhjZXB0aW9uXG4gICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgIGltYXBGb3JtYWxTeW50YXhbJ0FUT00tQ0hBUiddKCkuaW5kZXhPZihjaHIpIDwgMCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgY2hyLmNoYXJDb2RlQXQoMCkgPCAweDgwICYmIC8vIGFsbG93IDhiaXQgKHByZXN1bWFibHkgdW5pY29kZSkgYnl0ZXNcbiAgICAgICAgICAgICAgICAgICAgICAgIGNociAhPT0gJ10nICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAhKGNociA9PT0gJyonICYmIHRoaXMuY3VycmVudE5vZGUudmFsdWUgPT09ICdcXFxcJykgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICghdGhpcy5wYXJlbnQgfHwgIXRoaXMucGFyZW50LmNvbW1hbmQgfHwgIVsnTk8nLCAnQkFEJywgJ09LJ10uaW5jbHVkZXModGhpcy5wYXJlbnQuY29tbWFuZCkpXG4gICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGVycm9yID0gbmV3IEVycm9yKGBVbmV4cGVjdGVkIGNoYXIgYXQgcG9zaXRpb24gJHt0aGlzLnBvcyArIGl9IFtFMTY6ICR7SlNPTi5zdHJpbmdpZnkoY2hyKX1dYCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJvci5jb2RlID0gJ1BhcnNlckVycm9yMTYnO1xuICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IucGFyc2VyQ29udGV4dCA9IHsgaW5wdXQ6IHRoaXMuc3RyLCBwb3M6IHRoaXMucG9zICsgaSwgY2hyIH07XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmN1cnJlbnROb2RlLnZhbHVlID09PSAnXFxcXConKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgZXJyb3IgPSBuZXcgRXJyb3IoYFVuZXhwZWN0ZWQgY2hhciBhdCBwb3NpdGlvbiAke3RoaXMucG9zICsgaX0gW0UxNzogJHtKU09OLnN0cmluZ2lmeShjaHIpfV1gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yLmNvZGUgPSAnUGFyc2VyRXJyb3IxNyc7XG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJvci5wYXJzZXJDb250ZXh0ID0geyBpbnB1dDogdGhpcy5zdHIsIHBvczogdGhpcy5wb3MgKyBpLCBjaHIgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50Tm9kZS52YWx1ZSArPSBjaHI7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgY2FzZSBTVEFURV9TVFJJTkc6XG4gICAgICAgICAgICAgICAgICAgIC8vIERRVU9URSBlbmRzIHRoZSBzdHJpbmcgc2VxdWVuY2VcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNociA9PT0gJ1wiJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50Tm9kZS5lbmRQb3MgPSB0aGlzLnBvcyArIGk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnROb2RlLmlzQ2xvc2VkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudE5vZGUgPSB0aGlzLmN1cnJlbnROb2RlLnBhcmVudE5vZGU7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnN0YXRlID0gU1RBVEVfTk9STUFMO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBjaGVja1NQKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIC8vIFxcIEVzY2FwZXMgdGhlIGZvbGxvd2luZyBjaGFyXG4gICAgICAgICAgICAgICAgICAgIGlmIChjaHIgPT09ICdcXFxcJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGkgPj0gbGVuKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGVycm9yID0gbmV3IEVycm9yKGBVbmV4cGVjdGVkIGVuZCBvZiBpbnB1dCBhdCBwb3NpdGlvbiAke3RoaXMucG9zICsgaX0gW0UxOF1gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvci5jb2RlID0gJ1BhcnNlckVycm9yMTgnO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yLnBhcnNlckNvbnRleHQgPSB7IGlucHV0OiB0aGlzLnN0ciwgcG9zOiB0aGlzLnBvcyArIGkgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGNociA9IHRoaXMuc3RyLmNoYXJBdChpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudE5vZGUudmFsdWUgKz0gY2hyO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgIGNhc2UgU1RBVEVfUEFSVElBTDpcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNociA9PT0gJz4nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5jdXJyZW50Tm9kZS52YWx1ZS5hdCgtMSkgPT09ICcuJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBlcnJvciA9IG5ldyBFcnJvcihgVW5leHBlY3RlZCBlbmQgb2YgcGFydGlhbCBhdCBwb3NpdGlvbiAke3RoaXMucG9zICsgaX0gW0UxOV1gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvci5jb2RlID0gJ1BhcnNlckVycm9yMTknO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yLnBhcnNlckNvbnRleHQgPSB7IGlucHV0OiB0aGlzLnN0ciwgcG9zOiB0aGlzLnBvcyArIGksIGNociB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50Tm9kZS5lbmRQb3MgPSB0aGlzLnBvcyArIGk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnROb2RlLmlzQ2xvc2VkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudE5vZGUgPSB0aGlzLmN1cnJlbnROb2RlLnBhcmVudE5vZGU7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnN0YXRlID0gU1RBVEVfTk9STUFMO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tTUCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZiAoY2hyID09PSAnLicgJiYgKCF0aGlzLmN1cnJlbnROb2RlLnZhbHVlLmxlbmd0aCB8fCB0aGlzLmN1cnJlbnROb2RlLnZhbHVlLm1hdGNoKC9cXC4vKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBlcnJvciA9IG5ldyBFcnJvcihgVW5leHBlY3RlZCBwYXJ0aWFsIHNlcGFyYXRvciAuIGF0IHBvc2l0aW9uICR7dGhpcy5wb3MgKyBpfSBbRTIwXWApO1xuICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IuY29kZSA9ICdQYXJzZXJFcnJvcjIwJztcbiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yLnBhcnNlckNvbnRleHQgPSB7IGlucHV0OiB0aGlzLnN0ciwgcG9zOiB0aGlzLnBvcyArIGksIGNociB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZiAoaW1hcEZvcm1hbFN5bnRheC5ESUdJVCgpLmluZGV4T2YoY2hyKSA8IDAgJiYgY2hyICE9PSAnLicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBlcnJvciA9IG5ldyBFcnJvcihgVW5leHBlY3RlZCBjaGFyIGF0IHBvc2l0aW9uICR7dGhpcy5wb3MgKyBpfSBbRTIxOiAke0pTT04uc3RyaW5naWZ5KGNocil9XWApO1xuICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IuY29kZSA9ICdQYXJzZXJFcnJvcjIxJztcbiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yLnBhcnNlckNvbnRleHQgPSB7IGlucHV0OiB0aGlzLnN0ciwgcG9zOiB0aGlzLnBvcyArIGksIGNociB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5jdXJyZW50Tm9kZS52YWx1ZS5tYXRjaCgvXjAkfFxcLjAkLykgJiYgY2hyICE9PSAnLicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBlcnJvciA9IG5ldyBFcnJvcihgSW52YWxpZCBwYXJ0aWFsIGF0IHBvc2l0aW9uICR7dGhpcy5wb3MgKyBpfSBbRTIyOiAke0pTT04uc3RyaW5naWZ5KGNocil9XWApO1xuICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IuY29kZSA9ICdQYXJzZXJFcnJvcjIyJztcbiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yLnBhcnNlckNvbnRleHQgPSB7IGlucHV0OiB0aGlzLnN0ciwgcG9zOiB0aGlzLnBvcyArIGksIGNociB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnROb2RlLnZhbHVlICs9IGNocjtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgICBjYXNlIFNUQVRFX0xJVEVSQUw6XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmN1cnJlbnROb2RlLnN0YXJ0ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9ubHkgcmVsZXZhbnQgaWYgbGl0ZXJhbHMgYXJlIG5vdCBhbHJlYWR5IHBhcnNlZCBvdXQgZnJvbSBpbnB1dFxuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBEaXNhYmxlZCBOVUxMIGJ5dGUgY2hlY2tcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vZW1haWxqcy9lbWFpbGpzLWltYXAtaGFuZGxlci9jb21taXQvZjExYjI4MjJiZWRhYmU0OTIyMzZlODI2M2FmYzYzMDEzNGEzYzQxY1xuICAgICAgICAgICAgICAgICAgICAgICAgLypcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaHIgPT09ICdcXHUwMDAwJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVW5leHBlY3RlZCBcXFxceDAwIGF0IHBvc2l0aW9uICcgKyAodGhpcy5wb3MgKyBpKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAqL1xuXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnROb2RlLmNoQnVmZmVyW3RoaXMuY3VycmVudE5vZGUuY2hQb3MrK10gPSBjaHIuY2hhckNvZGVBdCgwKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuY3VycmVudE5vZGUuY2hQb3MgPj0gdGhpcy5jdXJyZW50Tm9kZS5saXRlcmFsTGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50Tm9kZS5lbmRQb3MgPSB0aGlzLnBvcyArIGk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50Tm9kZS5pc0Nsb3NlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50Tm9kZS52YWx1ZSA9IHRoaXMuY3VycmVudE5vZGUuY2hCdWZmZXIudG9TdHJpbmcoJ2JpbmFyeScpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudE5vZGUuY2hCdWZmZXIgPSBCdWZmZXIuYWxsb2MoMCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50Tm9kZSA9IHRoaXMuY3VycmVudE5vZGUucGFyZW50Tm9kZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnN0YXRlID0gU1RBVEVfTk9STUFMO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrU1AoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGNociA9PT0gJysnICYmIHRoaXMub3B0aW9ucy5saXRlcmFsUGx1cykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50Tm9kZS5saXRlcmFsUGx1cyA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGlmIChjaHIgPT09ICd9Jykge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEoJ2xpdGVyYWxMZW5ndGgnIGluIHRoaXMuY3VycmVudE5vZGUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGVycm9yID0gbmV3IEVycm9yKGBVbmV4cGVjdGVkIGxpdGVyYWwgcHJlZml4IGVuZCBjaGFyIH0gYXQgcG9zaXRpb24gJHt0aGlzLnBvcyArIGl9IFtFMjNdYCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IuY29kZSA9ICdQYXJzZXJFcnJvcjIzJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvci5wYXJzZXJDb250ZXh0ID0geyBpbnB1dDogdGhpcy5zdHIsIHBvczogdGhpcy5wb3MgKyBpLCBjaHIgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnN0ci5jaGFyQXQoaSArIDEpID09PSAnXFxuJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkrKztcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5zdHIuY2hhckF0KGkgKyAxKSA9PT0gJ1xccicgJiYgdGhpcy5zdHIuY2hhckF0KGkgKyAyKSA9PT0gJ1xcbicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpICs9IDI7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBlcnJvciA9IG5ldyBFcnJvcihgVW5leHBlY3RlZCBjaGFyIGF0IHBvc2l0aW9uICR7dGhpcy5wb3MgKyBpfSBbRTI0OiAke0pTT04uc3RyaW5naWZ5KGNocil9XWApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yLmNvZGUgPSAnUGFyc2VyRXJyb3IyNCc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IucGFyc2VyQ29udGV4dCA9IHsgaW5wdXQ6IHRoaXMuc3RyLCBwb3M6IHRoaXMucG9zICsgaSwgY2hyIH07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudE5vZGUubGl0ZXJhbExlbmd0aCA9IE51bWJlcih0aGlzLmN1cnJlbnROb2RlLmxpdGVyYWxMZW5ndGgpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuY3VycmVudE5vZGUubGl0ZXJhbExlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNwZWNpYWwgY2FzZSB3aGVyZSBsaXRlcmFsIGNvbnRlbnQgbGVuZ3RoIGlzIDBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjbG9zZSB0aGUgbm9kZSByaWdodCBhd2F5LCBkbyBub3Qgd2FpdCBmb3IgYWRkaXRpb25hbCBpbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudE5vZGUuZW5kUG9zID0gdGhpcy5wb3MgKyBpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudE5vZGUuaXNDbG9zZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudE5vZGUgPSB0aGlzLmN1cnJlbnROb2RlLnBhcmVudE5vZGU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IFNUQVRFX05PUk1BTDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja1NQKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMub3B0aW9ucy5saXRlcmFscykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVzZSB0aGUgbmV4dCBwcmVjYWNoZWQgbGl0ZXJhbCB2YWx1ZXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnROb2RlLnZhbHVlID0gdGhpcy5vcHRpb25zLmxpdGVyYWxzLnNoaWZ0KCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvbmx5IEFQUEVORCBhcmd1bWVudHMgYXJlIGtlcHQgYXMgQnVmZmVyc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCh0aGlzLnBhcmVudC5jb21tYW5kIHx8ICcnKS50b1N0cmluZygpLnRvVXBwZXJDYXNlKCkgIT09ICdBUFBFTkQnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudE5vZGUudmFsdWUgPSB0aGlzLmN1cnJlbnROb2RlLnZhbHVlLnRvU3RyaW5nKCdiaW5hcnknKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudE5vZGUuZW5kUG9zID0gdGhpcy5wb3MgKyBpICsgdGhpcy5jdXJyZW50Tm9kZS52YWx1ZS5sZW5ndGg7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnROb2RlLnN0YXJ0ZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnROb2RlLmlzQ2xvc2VkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnROb2RlID0gdGhpcy5jdXJyZW50Tm9kZS5wYXJlbnROb2RlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBTVEFURV9OT1JNQUw7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tTUCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnROb2RlLnN0YXJ0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFsbG9jYXRlIGV4cGVjdGVkIHNpemUgYnVmZmVyLiBNYXggc2l6ZSBjaGVjayBpcyBhbHJlYWR5IHBlcmZvcm1lZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE1heWJlIHNob3VsZCB1c2UgYWxsb2NVbnNhZmUgaW5zdGVhZD9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnROb2RlLmNoQnVmZmVyID0gQnVmZmVyLmFsbG9jKHRoaXMuY3VycmVudE5vZGUubGl0ZXJhbExlbmd0aCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50Tm9kZS5jaFBvcyA9IDA7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoaW1hcEZvcm1hbFN5bnRheC5ESUdJVCgpLmluZGV4T2YoY2hyKSA8IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBlcnJvciA9IG5ldyBFcnJvcihgVW5leHBlY3RlZCBjaGFyIGF0IHBvc2l0aW9uICR7dGhpcy5wb3MgKyBpfSBbRTI1OiAke0pTT04uc3RyaW5naWZ5KGNocil9XWApO1xuICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IuY29kZSA9ICdQYXJzZXJFcnJvcjI1JztcbiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yLnBhcnNlckNvbnRleHQgPSB7IGlucHV0OiB0aGlzLnN0ciwgcG9zOiB0aGlzLnBvcyArIGksIGNociB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuY3VycmVudE5vZGUubGl0ZXJhbExlbmd0aCA9PT0gJzAnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgZXJyb3IgPSBuZXcgRXJyb3IoYEludmFsaWQgbGl0ZXJhbCBhdCBwb3NpdGlvbiAke3RoaXMucG9zICsgaX0gW0UyNl1gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yLmNvZGUgPSAnUGFyc2VyRXJyb3IyNic7XG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJvci5wYXJzZXJDb250ZXh0ID0geyBpbnB1dDogdGhpcy5zdHIsIHBvczogdGhpcy5wb3MgKyBpLCBjaHIgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudE5vZGUubGl0ZXJhbExlbmd0aCA9ICh0aGlzLmN1cnJlbnROb2RlLmxpdGVyYWxMZW5ndGggfHwgJycpICsgY2hyO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgIGNhc2UgU1RBVEVfU0VRVUVOQ0U6XG4gICAgICAgICAgICAgICAgICAgIC8vIHNwYWNlIGZpbmlzaGVzIHRoZSBzZXF1ZW5jZSBzZXRcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNociA9PT0gJyAnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIVJFX1NJTkdMRV9ESUdJVC50ZXN0KHRoaXMuY3VycmVudE5vZGUudmFsdWUuYXQoLTEpKSAmJiB0aGlzLmN1cnJlbnROb2RlLnZhbHVlLmF0KC0xKSAhPT0gJyonKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGVycm9yID0gbmV3IEVycm9yKGBVbmV4cGVjdGVkIHdoaXRlc3BhY2UgYXQgcG9zaXRpb24gJHt0aGlzLnBvcyArIGl9IFtFMjddYCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IuY29kZSA9ICdQYXJzZXJFcnJvcjI3JztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvci5wYXJzZXJDb250ZXh0ID0geyBpbnB1dDogdGhpcy5zdHIsIHBvczogdGhpcy5wb3MgKyBpLCBjaHIgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuY3VycmVudE5vZGUudmFsdWUgIT09ICcqJyAmJiB0aGlzLmN1cnJlbnROb2RlLnZhbHVlLmF0KC0xKSA9PT0gJyonICYmIHRoaXMuY3VycmVudE5vZGUudmFsdWUuYXQoLTIpICE9PSAnOicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZXJyb3IgPSBuZXcgRXJyb3IoYFVuZXhwZWN0ZWQgd2hpdGVzcGFjZSBhdCBwb3NpdGlvbiAke3RoaXMucG9zICsgaX0gW0UyOF1gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvci5jb2RlID0gJ1BhcnNlckVycm9yMjgnO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yLnBhcnNlckNvbnRleHQgPSB7IGlucHV0OiB0aGlzLnN0ciwgcG9zOiB0aGlzLnBvcyArIGksIGNociB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnROb2RlLmlzQ2xvc2VkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudE5vZGUuZW5kUG9zID0gdGhpcy5wb3MgKyBpIC0gMTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudE5vZGUgPSB0aGlzLmN1cnJlbnROb2RlLnBhcmVudE5vZGU7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnN0YXRlID0gU1RBVEVfTk9STUFMO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5jdXJyZW50Tm9kZS5wYXJlbnROb2RlICYmIGNociA9PT0gJ10nICYmIHRoaXMuY3VycmVudE5vZGUucGFyZW50Tm9kZS50eXBlID09PSAnU0VDVElPTicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudE5vZGUuZW5kUG9zID0gdGhpcy5wb3MgKyBpIC0gMTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudE5vZGUgPSB0aGlzLmN1cnJlbnROb2RlLnBhcmVudE5vZGU7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudE5vZGUuaXNDbG9zZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50Tm9kZS5lbmRQb3MgPSB0aGlzLnBvcyArIGk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnROb2RlID0gdGhpcy5jdXJyZW50Tm9kZS5wYXJlbnROb2RlO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IFNUQVRFX05PUk1BTDtcblxuICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tTUCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZiAoY2hyID09PSAnOicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghUkVfU0lOR0xFX0RJR0lULnRlc3QodGhpcy5jdXJyZW50Tm9kZS52YWx1ZS5hdCgtMSkpICYmIHRoaXMuY3VycmVudE5vZGUudmFsdWUuYXQoLTEpICE9PSAnKicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZXJyb3IgPSBuZXcgRXJyb3IoYFVuZXhwZWN0ZWQgcmFuZ2Ugc2VwYXJhdG9yIDogYXQgcG9zaXRpb24gJHt0aGlzLnBvcyArIGl9IFtFMjldYCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IuY29kZSA9ICdQYXJzZXJFcnJvcjI5JztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvci5wYXJzZXJDb250ZXh0ID0geyBpbnB1dDogdGhpcy5zdHIsIHBvczogdGhpcy5wb3MgKyBpLCBjaHIgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaHIgPT09ICcqJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFsnLCcsICc6J10uaW5kZXhPZih0aGlzLmN1cnJlbnROb2RlLnZhbHVlLmF0KC0xKSkgPCAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGVycm9yID0gbmV3IEVycm9yKGBVbmV4cGVjdGVkIHJhbmdlIHdpbGRjYXJkIGF0IHBvc2l0aW9uICR7dGhpcy5wb3MgKyBpfSBbRTMwXWApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yLmNvZGUgPSAnUGFyc2VyRXJyb3IzMCc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IucGFyc2VyQ29udGV4dCA9IHsgaW5wdXQ6IHRoaXMuc3RyLCBwb3M6IHRoaXMucG9zICsgaSwgY2hyIH07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2hyID09PSAnLCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghUkVfU0lOR0xFX0RJR0lULnRlc3QodGhpcy5jdXJyZW50Tm9kZS52YWx1ZS5hdCgtMSkpICYmIHRoaXMuY3VycmVudE5vZGUudmFsdWUuYXQoLTEpICE9PSAnKicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZXJyb3IgPSBuZXcgRXJyb3IoYFVuZXhwZWN0ZWQgc2VxdWVuY2Ugc2VwYXJhdG9yICwgYXQgcG9zaXRpb24gJHt0aGlzLnBvcyArIGl9IFtFMzFdYCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IuY29kZSA9ICdQYXJzZXJFcnJvcjMxJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvci5wYXJzZXJDb250ZXh0ID0geyBpbnB1dDogdGhpcy5zdHIsIHBvczogdGhpcy5wb3MgKyBpLCBjaHIgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmN1cnJlbnROb2RlLnZhbHVlLmF0KC0xKSA9PT0gJyonICYmIHRoaXMuY3VycmVudE5vZGUudmFsdWUuYXQoLTIpICE9PSAnOicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZXJyb3IgPSBuZXcgRXJyb3IoYFVuZXhwZWN0ZWQgc2VxdWVuY2Ugc2VwYXJhdG9yICwgYXQgcG9zaXRpb24gJHt0aGlzLnBvcyArIGl9IFtFMzJdYCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IuY29kZSA9ICdQYXJzZXJFcnJvcjMyJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvci5wYXJzZXJDb250ZXh0ID0geyBpbnB1dDogdGhpcy5zdHIsIHBvczogdGhpcy5wb3MgKyBpLCBjaHIgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghUkVfU0lOR0xFX0RJR0lULnRlc3QoY2hyKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGVycm9yID0gbmV3IEVycm9yKGBVbmV4cGVjdGVkIGNoYXIgYXQgcG9zaXRpb24gJHt0aGlzLnBvcyArIGl9IFtFMzM6ICR7SlNPTi5zdHJpbmdpZnkoY2hyKX1dYCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJvci5jb2RlID0gJ1BhcnNlckVycm9yMzMnO1xuICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IucGFyc2VyQ29udGV4dCA9IHsgaW5wdXQ6IHRoaXMuc3RyLCBwb3M6IHRoaXMucG9zICsgaSwgY2hyIH07XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGlmIChSRV9TSU5HTEVfRElHSVQudGVzdChjaHIpICYmIHRoaXMuY3VycmVudE5vZGUudmFsdWUuYXQoLTEpID09PSAnKicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBlcnJvciA9IG5ldyBFcnJvcihgVW5leHBlY3RlZCBudW1iZXIgYXQgcG9zaXRpb24gJHt0aGlzLnBvcyArIGl9IFtFMzQ6ICR7SlNPTi5zdHJpbmdpZnkoY2hyKX1dYCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJvci5jb2RlID0gJ1BhcnNlckVycm9yMzQnO1xuICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IucGFyc2VyQ29udGV4dCA9IHsgaW5wdXQ6IHRoaXMuc3RyLCBwb3M6IHRoaXMucG9zICsgaSwgY2hyIH07XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudE5vZGUudmFsdWUgKz0gY2hyO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgIGNhc2UgU1RBVEVfVEVYVDpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50Tm9kZS52YWx1ZSArPSBjaHI7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cy5Ub2tlblBhcnNlciA9IFRva2VuUGFyc2VyO1xuIl0sIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6WzBdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(rsc)/./node_modules/imapflow/lib/handler/token-parser.js\n");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "(rsc)/./node_modules/imapflow/lib/imap-commands.js":
|
|
/*!****************************************************!*\
|
|
!*** ./node_modules/imapflow/lib/imap-commands.js ***!
|
|
\****************************************************/
|
|
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
|
|
|
|
eval("/* eslint global-require:0 */\n\n\n\nmodule.exports = new Map([\n ['ID', __webpack_require__(/*! ./commands/id.js */ \"(rsc)/./node_modules/imapflow/lib/commands/id.js\")],\n ['CAPABILITY', __webpack_require__(/*! ./commands/capability.js */ \"(rsc)/./node_modules/imapflow/lib/commands/capability.js\")],\n ['NAMESPACE', __webpack_require__(/*! ./commands/namespace.js */ \"(rsc)/./node_modules/imapflow/lib/commands/namespace.js\")],\n ['LOGIN', __webpack_require__(/*! ./commands/login.js */ \"(rsc)/./node_modules/imapflow/lib/commands/login.js\")],\n ['LOGOUT', __webpack_require__(/*! ./commands/logout.js */ \"(rsc)/./node_modules/imapflow/lib/commands/logout.js\")],\n ['STARTTLS', __webpack_require__(/*! ./commands/starttls.js */ \"(rsc)/./node_modules/imapflow/lib/commands/starttls.js\")],\n ['LIST', __webpack_require__(/*! ./commands/list.js */ \"(rsc)/./node_modules/imapflow/lib/commands/list.js\")],\n ['ENABLE', __webpack_require__(/*! ./commands/enable.js */ \"(rsc)/./node_modules/imapflow/lib/commands/enable.js\")],\n ['SELECT', __webpack_require__(/*! ./commands/select.js */ \"(rsc)/./node_modules/imapflow/lib/commands/select.js\")],\n ['FETCH', __webpack_require__(/*! ./commands/fetch.js */ \"(rsc)/./node_modules/imapflow/lib/commands/fetch.js\")],\n ['CREATE', __webpack_require__(/*! ./commands/create.js */ \"(rsc)/./node_modules/imapflow/lib/commands/create.js\")],\n ['DELETE', __webpack_require__(/*! ./commands/delete.js */ \"(rsc)/./node_modules/imapflow/lib/commands/delete.js\")],\n ['RENAME', __webpack_require__(/*! ./commands/rename.js */ \"(rsc)/./node_modules/imapflow/lib/commands/rename.js\")],\n ['CLOSE', __webpack_require__(/*! ./commands/close.js */ \"(rsc)/./node_modules/imapflow/lib/commands/close.js\")],\n ['SUBSCRIBE', __webpack_require__(/*! ./commands/subscribe.js */ \"(rsc)/./node_modules/imapflow/lib/commands/subscribe.js\")],\n ['UNSUBSCRIBE', __webpack_require__(/*! ./commands/unsubscribe.js */ \"(rsc)/./node_modules/imapflow/lib/commands/unsubscribe.js\")],\n ['STORE', __webpack_require__(/*! ./commands/store.js */ \"(rsc)/./node_modules/imapflow/lib/commands/store.js\")],\n ['SEARCH', __webpack_require__(/*! ./commands/search.js */ \"(rsc)/./node_modules/imapflow/lib/commands/search.js\")],\n ['NOOP', __webpack_require__(/*! ./commands/noop.js */ \"(rsc)/./node_modules/imapflow/lib/commands/noop.js\")],\n ['EXPUNGE', __webpack_require__(/*! ./commands/expunge.js */ \"(rsc)/./node_modules/imapflow/lib/commands/expunge.js\")],\n ['APPEND', __webpack_require__(/*! ./commands/append.js */ \"(rsc)/./node_modules/imapflow/lib/commands/append.js\")],\n ['STATUS', __webpack_require__(/*! ./commands/status.js */ \"(rsc)/./node_modules/imapflow/lib/commands/status.js\")],\n ['COPY', __webpack_require__(/*! ./commands/copy.js */ \"(rsc)/./node_modules/imapflow/lib/commands/copy.js\")],\n ['MOVE', __webpack_require__(/*! ./commands/move.js */ \"(rsc)/./node_modules/imapflow/lib/commands/move.js\")],\n ['COMPRESS', __webpack_require__(/*! ./commands/compress.js */ \"(rsc)/./node_modules/imapflow/lib/commands/compress.js\")],\n ['QUOTA', __webpack_require__(/*! ./commands/quota.js */ \"(rsc)/./node_modules/imapflow/lib/commands/quota.js\")],\n ['IDLE', __webpack_require__(/*! ./commands/idle.js */ \"(rsc)/./node_modules/imapflow/lib/commands/idle.js\")],\n ['AUTHENTICATE', __webpack_require__(/*! ./commands/authenticate.js */ \"(rsc)/./node_modules/imapflow/lib/commands/authenticate.js\")]\n]);\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHJzYykvLi9ub2RlX21vZHVsZXMvaW1hcGZsb3cvbGliL2ltYXAtY29tbWFuZHMuanMiLCJtYXBwaW5ncyI6IkFBQUE7O0FBRWE7O0FBRWI7QUFDQSxXQUFXLG1CQUFPLENBQUMsMEVBQWtCO0FBQ3JDLG1CQUFtQixtQkFBTyxDQUFDLDBGQUEwQjtBQUNyRCxrQkFBa0IsbUJBQU8sQ0FBQyx3RkFBeUI7QUFDbkQsY0FBYyxtQkFBTyxDQUFDLGdGQUFxQjtBQUMzQyxlQUFlLG1CQUFPLENBQUMsa0ZBQXNCO0FBQzdDLGlCQUFpQixtQkFBTyxDQUFDLHNGQUF3QjtBQUNqRCxhQUFhLG1CQUFPLENBQUMsOEVBQW9CO0FBQ3pDLGVBQWUsbUJBQU8sQ0FBQyxrRkFBc0I7QUFDN0MsZUFBZSxtQkFBTyxDQUFDLGtGQUFzQjtBQUM3QyxjQUFjLG1CQUFPLENBQUMsZ0ZBQXFCO0FBQzNDLGVBQWUsbUJBQU8sQ0FBQyxrRkFBc0I7QUFDN0MsZUFBZSxtQkFBTyxDQUFDLGtGQUFzQjtBQUM3QyxlQUFlLG1CQUFPLENBQUMsa0ZBQXNCO0FBQzdDLGNBQWMsbUJBQU8sQ0FBQyxnRkFBcUI7QUFDM0Msa0JBQWtCLG1CQUFPLENBQUMsd0ZBQXlCO0FBQ25ELG9CQUFvQixtQkFBTyxDQUFDLDRGQUEyQjtBQUN2RCxjQUFjLG1CQUFPLENBQUMsZ0ZBQXFCO0FBQzNDLGVBQWUsbUJBQU8sQ0FBQyxrRkFBc0I7QUFDN0MsYUFBYSxtQkFBTyxDQUFDLDhFQUFvQjtBQUN6QyxnQkFBZ0IsbUJBQU8sQ0FBQyxvRkFBdUI7QUFDL0MsZUFBZSxtQkFBTyxDQUFDLGtGQUFzQjtBQUM3QyxlQUFlLG1CQUFPLENBQUMsa0ZBQXNCO0FBQzdDLGFBQWEsbUJBQU8sQ0FBQyw4RUFBb0I7QUFDekMsYUFBYSxtQkFBTyxDQUFDLDhFQUFvQjtBQUN6QyxpQkFBaUIsbUJBQU8sQ0FBQyxzRkFBd0I7QUFDakQsY0FBYyxtQkFBTyxDQUFDLGdGQUFxQjtBQUMzQyxhQUFhLG1CQUFPLENBQUMsOEVBQW9CO0FBQ3pDLHFCQUFxQixtQkFBTyxDQUFDLDhGQUE0QjtBQUN6RCIsInNvdXJjZXMiOlsiL2hvbWUvYWxtYS9uZXh0Z2VuL05lYWgtbWFpbC9ub2RlX21vZHVsZXMvaW1hcGZsb3cvbGliL2ltYXAtY29tbWFuZHMuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50IGdsb2JhbC1yZXF1aXJlOjAgKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IG5ldyBNYXAoW1xuICAgIFsnSUQnLCByZXF1aXJlKCcuL2NvbW1hbmRzL2lkLmpzJyldLFxuICAgIFsnQ0FQQUJJTElUWScsIHJlcXVpcmUoJy4vY29tbWFuZHMvY2FwYWJpbGl0eS5qcycpXSxcbiAgICBbJ05BTUVTUEFDRScsIHJlcXVpcmUoJy4vY29tbWFuZHMvbmFtZXNwYWNlLmpzJyldLFxuICAgIFsnTE9HSU4nLCByZXF1aXJlKCcuL2NvbW1hbmRzL2xvZ2luLmpzJyldLFxuICAgIFsnTE9HT1VUJywgcmVxdWlyZSgnLi9jb21tYW5kcy9sb2dvdXQuanMnKV0sXG4gICAgWydTVEFSVFRMUycsIHJlcXVpcmUoJy4vY29tbWFuZHMvc3RhcnR0bHMuanMnKV0sXG4gICAgWydMSVNUJywgcmVxdWlyZSgnLi9jb21tYW5kcy9saXN0LmpzJyldLFxuICAgIFsnRU5BQkxFJywgcmVxdWlyZSgnLi9jb21tYW5kcy9lbmFibGUuanMnKV0sXG4gICAgWydTRUxFQ1QnLCByZXF1aXJlKCcuL2NvbW1hbmRzL3NlbGVjdC5qcycpXSxcbiAgICBbJ0ZFVENIJywgcmVxdWlyZSgnLi9jb21tYW5kcy9mZXRjaC5qcycpXSxcbiAgICBbJ0NSRUFURScsIHJlcXVpcmUoJy4vY29tbWFuZHMvY3JlYXRlLmpzJyldLFxuICAgIFsnREVMRVRFJywgcmVxdWlyZSgnLi9jb21tYW5kcy9kZWxldGUuanMnKV0sXG4gICAgWydSRU5BTUUnLCByZXF1aXJlKCcuL2NvbW1hbmRzL3JlbmFtZS5qcycpXSxcbiAgICBbJ0NMT1NFJywgcmVxdWlyZSgnLi9jb21tYW5kcy9jbG9zZS5qcycpXSxcbiAgICBbJ1NVQlNDUklCRScsIHJlcXVpcmUoJy4vY29tbWFuZHMvc3Vic2NyaWJlLmpzJyldLFxuICAgIFsnVU5TVUJTQ1JJQkUnLCByZXF1aXJlKCcuL2NvbW1hbmRzL3Vuc3Vic2NyaWJlLmpzJyldLFxuICAgIFsnU1RPUkUnLCByZXF1aXJlKCcuL2NvbW1hbmRzL3N0b3JlLmpzJyldLFxuICAgIFsnU0VBUkNIJywgcmVxdWlyZSgnLi9jb21tYW5kcy9zZWFyY2guanMnKV0sXG4gICAgWydOT09QJywgcmVxdWlyZSgnLi9jb21tYW5kcy9ub29wLmpzJyldLFxuICAgIFsnRVhQVU5HRScsIHJlcXVpcmUoJy4vY29tbWFuZHMvZXhwdW5nZS5qcycpXSxcbiAgICBbJ0FQUEVORCcsIHJlcXVpcmUoJy4vY29tbWFuZHMvYXBwZW5kLmpzJyldLFxuICAgIFsnU1RBVFVTJywgcmVxdWlyZSgnLi9jb21tYW5kcy9zdGF0dXMuanMnKV0sXG4gICAgWydDT1BZJywgcmVxdWlyZSgnLi9jb21tYW5kcy9jb3B5LmpzJyldLFxuICAgIFsnTU9WRScsIHJlcXVpcmUoJy4vY29tbWFuZHMvbW92ZS5qcycpXSxcbiAgICBbJ0NPTVBSRVNTJywgcmVxdWlyZSgnLi9jb21tYW5kcy9jb21wcmVzcy5qcycpXSxcbiAgICBbJ1FVT1RBJywgcmVxdWlyZSgnLi9jb21tYW5kcy9xdW90YS5qcycpXSxcbiAgICBbJ0lETEUnLCByZXF1aXJlKCcuL2NvbW1hbmRzL2lkbGUuanMnKV0sXG4gICAgWydBVVRIRU5USUNBVEUnLCByZXF1aXJlKCcuL2NvbW1hbmRzL2F1dGhlbnRpY2F0ZS5qcycpXVxuXSk7XG4iXSwibmFtZXMiOltdLCJpZ25vcmVMaXN0IjpbMF0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(rsc)/./node_modules/imapflow/lib/imap-commands.js\n");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "(rsc)/./node_modules/imapflow/lib/imap-flow.js":
|
|
/*!************************************************!*\
|
|
!*** ./node_modules/imapflow/lib/imap-flow.js ***!
|
|
\************************************************/
|
|
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
|
|
|
|
eval("\n\n/**\n * @module imapflow\n */\n\n// TODO:\n// * Use buffers for compiled commands\n// * OAuth2 authentication\n\nconst tls = __webpack_require__(/*! tls */ \"tls\");\nconst net = __webpack_require__(/*! net */ \"net\");\nconst crypto = __webpack_require__(/*! crypto */ \"crypto\");\nconst { EventEmitter } = __webpack_require__(/*! events */ \"events\");\nconst logger = __webpack_require__(/*! ./logger */ \"(rsc)/./node_modules/imapflow/lib/logger.js\");\nconst libmime = __webpack_require__(/*! libmime */ \"(rsc)/./node_modules/libmime/lib/libmime.js\");\nconst zlib = __webpack_require__(/*! zlib */ \"zlib\");\nconst { Headers } = __webpack_require__(/*! mailsplit */ \"(rsc)/./node_modules/imapflow/node_modules/mailsplit/index.js\");\nconst { LimitedPassthrough } = __webpack_require__(/*! ./limited-passthrough */ \"(rsc)/./node_modules/imapflow/lib/limited-passthrough.js\");\n\nconst { ImapStream } = __webpack_require__(/*! ./handler/imap-stream */ \"(rsc)/./node_modules/imapflow/lib/handler/imap-stream.js\");\nconst { parser, compiler } = __webpack_require__(/*! ./handler/imap-handler */ \"(rsc)/./node_modules/imapflow/lib/handler/imap-handler.js\");\nconst packageInfo = __webpack_require__(/*! ../package.json */ \"(rsc)/./node_modules/imapflow/package.json\");\n\nconst libqp = __webpack_require__(/*! libqp */ \"(rsc)/./node_modules/libqp/lib/libqp.js\");\nconst libbase64 = __webpack_require__(/*! libbase64 */ \"(rsc)/./node_modules/libbase64/lib/libbase64.js\");\nconst FlowedDecoder = __webpack_require__(/*! mailsplit/lib/flowed-decoder */ \"(rsc)/./node_modules/imapflow/node_modules/mailsplit/lib/flowed-decoder.js\");\nconst { PassThrough } = __webpack_require__(/*! stream */ \"stream\");\n\nconst { proxyConnection } = __webpack_require__(/*! ./proxy-connection */ \"(rsc)/./node_modules/imapflow/lib/proxy-connection.js\");\n\nconst {\n comparePaths,\n updateCapabilities,\n getFolderTree,\n formatMessageResponse,\n getDecoder,\n packMessageRange,\n normalizePath,\n expandRange,\n AuthenticationFailure,\n getColorFlags\n} = __webpack_require__(/*! ./tools */ \"(rsc)/./node_modules/imapflow/lib/tools.js\");\n\nconst imapCommands = __webpack_require__(/*! ./imap-commands.js */ \"(rsc)/./node_modules/imapflow/lib/imap-commands.js\");\n\nconst CONNECT_TIMEOUT = 90 * 1000;\nconst GREETING_TIMEOUT = 16 * 1000;\nconst UPGRADE_TIMEOUT = 10 * 1000;\n\nconst SOCKET_TIMEOUT = 5 * 60 * 1000;\n\nconst states = {\n NOT_AUTHENTICATED: 0x01,\n AUTHENTICATED: 0x02,\n SELECTED: 0x03,\n LOGOUT: 0x04\n};\n\n/**\n * @typedef {Object} MailboxObject\n * @global\n * @property {String} path mailbox path\n * @property {String} delimiter mailbox path delimiter, usually \".\" or \"/\"\n * @property {Set<string>} flags list of flags for this mailbox\n * @property {String} [specialUse] one of special-use flags (if applicable): \"\\All\", \"\\Archive\", \"\\Drafts\", \"\\Flagged\", \"\\Junk\", \"\\Sent\", \"\\Trash\". Additionally INBOX has non-standard \"\\Inbox\" flag set\n * @property {Boolean} listed `true` if mailbox was found from the output of LIST command\n * @property {Boolean} subscribed `true` if mailbox was found from the output of LSUB command\n * @property {Set<string>} permanentFlags A Set of flags available to use in this mailbox. If it is not set or includes special flag \"\\\\\\*\" then any flag can be used.\n * @property {String} [mailboxId] unique mailbox ID if server has `OBJECTID` extension enabled\n * @property {BigInt} [highestModseq] latest known modseq value if server has CONDSTORE or XYMHIGHESTMODSEQ enabled\n * @property {String} [noModseq] if true then the server doesn't support the persistent storage of mod-sequences for the mailbox\n * @property {BigInt} uidValidity Mailbox `UIDVALIDITY` value\n * @property {Number} uidNext Next predicted UID\n * @property {Number} exists Messages in this folder\n */\n\n/**\n * @typedef {Object} MailboxLockObject\n * @global\n * @property {String} path mailbox path\n * @property {Function} release Release current lock\n * @example\n * let lock = await client.getMailboxLock('INBOX');\n * try {\n * // do something in the mailbox\n * } finally {\n * // use finally{} to make sure lock is released even if exception occurs\n * lock.release();\n * }\n */\n\n/**\n * Client and server identification object, where key is one of RFC2971 defined [data fields](https://tools.ietf.org/html/rfc2971#section-3.3) (but not limited to).\n * @typedef {Object} IdInfoObject\n * @global\n * @property {String} [name] Name of the program\n * @property {String} [version] Version number of the program\n * @property {String} [os] Name of the operating system\n * @property {String} [vendor] Vendor of the client/server\n * @property {String} ['support-url'] URL to contact for support\n * @property {Date} [date] Date program was released\n */\n\n/**\n * IMAP client class for accessing IMAP mailboxes\n *\n * @class\n * @extends EventEmitter\n */\nclass ImapFlow extends EventEmitter {\n /**\n * Current module version as a static class property\n * @property {String} version Module version\n * @static\n */\n static version = packageInfo.version;\n\n /**\n * IMAP connection options\n *\n * @property {String} host\n * Hostname of the IMAP server.\n *\n * @property {Number} port\n * Port number for the IMAP server.\n *\n * @property {Boolean} [secure=false]\n * If `true`, establishes the connection directly over TLS (commonly on port 993).\n * If `false`, a plain (unencrypted) connection is used first and, if possible, the connection is upgraded to STARTTLS.\n *\n * @property {Boolean} [doSTARTTLS=undefined]\n * Determines whether to upgrade the connection to TLS via STARTTLS:\n * - **true**: Start unencrypted and upgrade to TLS using STARTTLS before authentication.\n * The connection fails if the server does not support STARTTLS or the upgrade fails.\n * Note that `secure=true` combined with `doSTARTTLS=true` is invalid.\n * - **false**: Never use STARTTLS, even if the server advertises support.\n * This is useful if the server has a broken TLS setup.\n * Combined with `secure=false`, this results in a fully unencrypted connection.\n * Make sure you warn users about the security risks.\n * - **undefined** (default): If `secure=false` (default), attempt to upgrade to TLS via STARTTLS before authentication if the server supports it. If not supported, continue unencrypted. This may expose the connection to a downgrade attack.\n *\n * @property {String} [servername]\n * Server name for SNI or when using an IP address as `host`.\n *\n * @property {Boolean} [disableCompression=false]\n * If `true`, the client does not attempt to use the COMPRESS=DEFLATE extension.\n *\n * @property {Object} auth\n * Authentication options. Authentication occurs automatically during {@link connect}.\n *\n * @property {String} auth.user\n * Username for authentication.\n *\n * @property {String} [auth.pass]\n * Password for regular authentication.\n *\n * @property {String} [auth.accessToken]\n * OAuth2 access token, if using OAuth2 authentication.\n *\n * @property {String} [auth.loginMethod]\n * Optional login method for password-based authentication (e.g., \"LOGIN\", \"AUTH=LOGIN\", or \"AUTH=PLAIN\").\n * If not set, ImapFlow chooses based on available mechanisms.\n *\n * @property {IdInfoObject} [clientInfo]\n * Client identification info sent to the server (via the ID command).\n *\n * @property {Boolean} [disableAutoIdle=false]\n * If `true`, do not start IDLE automatically. Useful when only specific operations are needed.\n *\n * @property {Object} [tls]\n * Additional TLS options. For details, see [Node.js TLS connect](https://nodejs.org/api/tls.html#tls_tls_connect_options_callback).\n *\n * @property {Boolean} [tls.rejectUnauthorized=true]\n * If `false`, allows self-signed or expired certificates.\n *\n * @property {String} [tls.minVersion='TLSv1.2']\n * Minimum accepted TLS version (e.g., `'TLSv1.2'`).\n *\n * @property {Number} [tls.minDHSize=1024]\n * Minimum size (in bits) of the DH parameter for TLS connections.\n *\n * @property {Object|Boolean} [logger]\n * Custom logger instance with `debug(obj)`, `info(obj)`, `warn(obj)`, and `error(obj)` methods.\n * If `false`, logging is disabled. If not provided, ImapFlow logs to console in [pino format](https://getpino.io/).\n *\n * @property {Boolean} [logRaw=false]\n * If `true`, logs all raw data (read and written) in base64 encoding. You can pipe such logs to [eerawlog](https://github.com/postalsys/eerawlog) command for readable output.\n *\n * @property {Boolean} [emitLogs=false]\n * If `true`, emits `'log'` events with the same data passed to the logger.\n *\n * @property {Boolean} [verifyOnly=false]\n * If `true`, disconnects after successful authentication without performing other actions.\n *\n * @property {String} [proxy]\n * Proxy URL. Supports HTTP CONNECT (`http://`, `https://`) and SOCKS (`socks://`, `socks4://`, `socks5://`).\n *\n * @property {Boolean} [qresync=false]\n * If `true`, enables QRESYNC support so that EXPUNGE notifications include `uid` instead of `seq`.\n *\n * @property {Number} [maxIdleTime]\n * If set, breaks and restarts IDLE every `maxIdleTime` milliseconds.\n *\n * @property {String} [missingIdleCommand=\"NOOP\"]\n * Command to use if the server does not support IDLE.\n *\n * @property {Boolean} [disableBinary=false]\n * If `true`, ignores the BINARY extension for FETCH and APPEND operations.\n *\n * @property {Boolean} [disableAutoEnable=false]\n * If `true`, do not automatically enable supported IMAP extensions.\n *\n * @property {Number} [connectionTimeout=90000]\n * Maximum time (in milliseconds) to wait for the connection to establish. Defaults to 90 seconds.\n *\n * @property {Number} [greetingTimeout=16000]\n * Maximum time (in milliseconds) to wait for the server greeting after a connection is established. Defaults to 16 seconds.\n *\n * @property {Number} [socketTimeout=300000]\n * Maximum period of inactivity (in milliseconds) before terminating the connection. Defaults to 5 minutes.\n */\n\n constructor(options) {\n super({ captureRejections: true });\n\n this.options = options || {};\n\n /**\n * Instance ID for logs\n * @type {String}\n */\n this.id = this.options.id || this.getRandomId();\n\n this.clientInfo = Object.assign(\n {\n name: packageInfo.name,\n version: packageInfo.version,\n vendor: 'Postal Systems',\n 'support-url': 'https://github.com/postalsys/imapflow/issues'\n },\n this.options.clientInfo || {}\n );\n\n /**\n * Server identification info. Available after successful `connect()`.\n * If server does not provide identification info then this value is `null`.\n * @example\n * await client.connect();\n * console.log(client.serverInfo.vendor);\n * @type {IdInfoObject|null}\n */\n this.serverInfo = null; //updated by ID\n\n this.log = this.getLogger();\n\n /**\n * Is the connection currently encrypted or not\n * @type {Boolean}\n */\n this.secureConnection = !!this.options.secure;\n\n this.port = Number(this.options.port) || (this.secureConnection ? 993 : 110);\n this.host = this.options.host || 'localhost';\n this.servername = this.options.servername ? this.options.servername : !net.isIP(this.host) ? this.host : false;\n\n if (typeof this.options.secure === 'undefined' && this.port === 993) {\n // if secure option is not set but port is 465, then default to secure\n this.secureConnection = true;\n }\n\n this.logRaw = this.options.logRaw;\n this.streamer = new ImapStream({\n logger: this.log,\n cid: this.id,\n logRaw: this.logRaw,\n secureConnection: this.secureConnection\n });\n\n this.reading = false;\n this.socket = false;\n this.writeSocket = false;\n\n this.states = states;\n this.state = this.states.NOT_AUTHENTICATED;\n\n this.lockCounter = 0;\n this.currentLock = false;\n\n this.tagCounter = 0;\n this.requestTagMap = new Map();\n this.requestQueue = [];\n this.currentRequest = false;\n\n this.writeBytesCounter = 0;\n\n this.commandParts = [];\n\n /**\n * Active IMAP capabilities. Value is either `true` for togglabe capabilities (eg. `UIDPLUS`)\n * or a number for capabilities with a value (eg. `APPENDLIMIT`)\n * @type {Map<string, boolean|number>}\n */\n this.capabilities = new Map();\n this.authCapabilities = new Map();\n\n this.rawCapabilities = null;\n\n this.expectCapabilityUpdate = false; // force CAPABILITY after LOGIN\n\n /**\n * Enabled capabilities. Usually `CONDSTORE` and `UTF8=ACCEPT` if server supports these.\n * @type {Set<string>}\n */\n this.enabled = new Set();\n\n /**\n * Is the connection currently usable or not\n * @type {Boolean}\n */\n this.usable = false;\n\n /**\n * Currently authenticated user or `false` if mailbox is not open\n * or `true` if connection was authenticated by PREAUTH\n * @type {String|Boolean}\n */\n this.authenticated = false;\n\n /**\n * Currently selected mailbox or `false` if mailbox is not open\n * @type {MailboxObject|Boolean}\n */\n this.mailbox = false;\n this.currentSelectCommand = false;\n\n /**\n * Is current mailbox idling (`true`) or not (`false`)\n * @type {Boolean}\n */\n this.idling = false;\n\n this.emitLogs = !!this.options.emitLogs;\n // ordering number for emitted logs\n this.lo = 0;\n\n this.untaggedHandlers = {};\n this.sectionHandlers = {};\n\n this.commands = imapCommands;\n\n this.folders = new Map();\n\n this.currentLock = false;\n this.locks = [];\n\n this.idRequested = false;\n\n this.maxIdleTime = this.options.maxIdleTime || false;\n this.missingIdleCommand = (this.options.missingIdleCommand || '').toString().toUpperCase().trim() || 'NOOP';\n\n this.disableBinary = !!this.options.disableBinary;\n\n this.streamer.on('error', err => {\n if (['Z_BUF_ERROR', 'ECONNRESET', 'EPIPE', 'ETIMEDOUT', 'EHOSTUNREACH'].includes(err.code)) {\n // just close the connection, usually nothing but noise\n return setImmediate(() => this.close());\n }\n\n this.log.error({ err, cid: this.id });\n setImmediate(() => this.close());\n this.emitError(err);\n });\n\n // Has the `connect` method already been called\n this._connectCalled = false;\n }\n\n emitError(err) {\n this.emit('error', err);\n }\n\n getRandomId() {\n let rid = BigInt('0x' + crypto.randomBytes(13).toString('hex')).toString(36);\n if (rid.length < 20) {\n rid = '0'.repeat(20 - rid.length) + rid;\n } else if (rid.length > 20) {\n rid = rid.substr(0, 20);\n }\n return rid;\n }\n\n write(chunk) {\n if (this.socket.destroyed) {\n // do not write after connection end or logout\n const error = new Error('Socket is already closed');\n error.code = 'NoConnection';\n throw error;\n }\n\n if (this.state === this.states.LOGOUT) {\n // should not happen\n const error = new Error('Can not send data after logged out');\n error.code = 'StateLogout';\n throw error;\n }\n\n if (this.writeSocket.destroyed) {\n this.socket.emit('error', 'Write socket destroyed');\n return;\n }\n\n let addLineBreak = !this.commandParts.length;\n if (typeof chunk === 'string') {\n if (addLineBreak) {\n chunk += '\\r\\n';\n }\n chunk = Buffer.from(chunk, 'binary');\n } else if (Buffer.isBuffer(chunk)) {\n if (addLineBreak) {\n chunk = Buffer.concat([chunk, Buffer.from('\\r\\n')]);\n }\n } else {\n return false;\n }\n\n if (this.logRaw) {\n this.log.trace({\n src: 'c',\n msg: 'write to socket',\n data: chunk.toString('base64'),\n compress: !!this._deflate,\n secure: !!this.secureConnection,\n cid: this.id\n });\n }\n\n this.writeBytesCounter += chunk.length;\n\n this.writeSocket.write(chunk);\n }\n\n stats(reset) {\n let result = {\n sent: this.writeBytesCounter || 0,\n received: (this.streamer && this.streamer.readBytesCounter) || 0\n };\n\n if (reset) {\n this.writeBytesCounter = 0;\n if (this.streamer) {\n this.streamer.readBytesCounter = 0;\n }\n }\n\n return result;\n }\n\n async send(data) {\n if (this.state === this.states.LOGOUT) {\n // already logged out\n if (data.tag) {\n let request = this.requestTagMap.get(data.tag);\n if (request) {\n this.requestTagMap.delete(request.tag);\n const error = new Error('Connection not available');\n error.code = 'NoConnection';\n request.reject(error);\n }\n }\n return;\n }\n\n let compiled = await compiler(data, {\n asArray: true,\n literalMinus: this.capabilities.has('LITERAL-') || this.capabilities.has('LITERAL+')\n });\n this.commandParts = compiled;\n\n let logCompiled = await compiler(data, {\n isLogging: true\n });\n\n let options = data.options || {};\n\n this.log.debug({ src: 's', msg: logCompiled.toString(), cid: this.id, comment: options.comment });\n\n this.write(this.commandParts.shift());\n\n if (typeof options.onSend === 'function') {\n options.onSend();\n }\n }\n\n async trySend() {\n if (this.currentRequest || !this.requestQueue.length) {\n return;\n }\n this.currentRequest = this.requestQueue.shift();\n\n await this.send({\n tag: this.currentRequest.tag,\n command: this.currentRequest.command,\n attributes: this.currentRequest.attributes,\n options: this.currentRequest.options\n });\n }\n\n async exec(command, attributes, options) {\n if (this.socket.destroyed) {\n let error = new Error('Connection closed');\n error.code = 'EConnectionClosed';\n throw error;\n }\n\n let tag = (++this.tagCounter).toString(16).toUpperCase();\n\n options = options || {};\n\n return new Promise((resolve, reject) => {\n this.requestTagMap.set(tag, { command, attributes, options, resolve, reject });\n this.requestQueue.push({ tag, command, attributes, options });\n this.trySend().catch(err => {\n this.requestTagMap.delete(tag);\n reject(err);\n });\n });\n }\n\n getUntaggedHandler(command, attributes) {\n if (/^[0-9]+$/.test(command)) {\n let type = attributes && attributes.length && typeof attributes[0].value === 'string' ? attributes[0].value.toUpperCase() : false;\n if (type) {\n // EXISTS, EXPUNGE, RECENT, FETCH etc\n command = type;\n }\n }\n\n command = command.toUpperCase().trim();\n if (this.currentRequest && this.currentRequest.options && this.currentRequest.options.untagged && this.currentRequest.options.untagged[command]) {\n return this.currentRequest.options.untagged[command];\n }\n\n if (this.untaggedHandlers[command]) {\n return this.untaggedHandlers[command];\n }\n }\n\n getSectionHandler(key) {\n if (this.sectionHandlers[key]) {\n return this.sectionHandlers[key];\n }\n }\n\n async reader() {\n let data;\n while ((data = this.streamer.read()) !== null) {\n let parsed;\n\n try {\n parsed = await parser(data.payload, { literals: data.literals });\n if (parsed.tag && !['*', '+'].includes(parsed.tag) && parsed.command) {\n let payload = { response: parsed.command };\n\n if (\n parsed.attributes &&\n parsed.attributes[0] &&\n parsed.attributes[0].section &&\n parsed.attributes[0].section[0] &&\n parsed.attributes[0].section[0].type === 'ATOM'\n ) {\n payload.code = parsed.attributes[0].section[0].value;\n }\n this.emit('response', payload);\n }\n } catch (err) {\n // can not make sense of this\n this.log.error({ src: 's', msg: data.payload.toString(), err, cid: this.id });\n data.next();\n continue;\n }\n\n let logCompiled = await compiler(parsed, {\n isLogging: true\n });\n\n if (/^\\d+$/.test(parsed.command) && parsed.attributes && parsed.attributes[0] && parsed.attributes[0].value === 'FETCH') {\n // too many FETCH responses, might want to filter these out\n this.log.trace({ src: 's', msg: logCompiled.toString(), cid: this.id, nullBytesRemoved: parsed.nullBytesRemoved });\n } else {\n this.log.debug({ src: 's', msg: logCompiled.toString(), cid: this.id, nullBytesRemoved: parsed.nullBytesRemoved });\n }\n\n if (parsed.tag === '+' && this.currentRequest && this.currentRequest.options && typeof this.currentRequest.options.onPlusTag === 'function') {\n await this.currentRequest.options.onPlusTag(parsed);\n data.next();\n continue;\n }\n\n if (parsed.tag === '+' && this.commandParts.length) {\n let content = this.commandParts.shift();\n this.write(content);\n this.log.debug({ src: 'c', msg: `(* ${content.length}B continuation *)`, cid: this.id });\n data.next();\n continue;\n }\n\n let section = parsed.attributes && parsed.attributes.length && parsed.attributes[0] && !parsed.attributes[0].value && parsed.attributes[0].section;\n if (section && section.length && section[0].type === 'ATOM' && typeof section[0].value === 'string') {\n let sectionHandler = this.getSectionHandler(section[0].value.toUpperCase().trim());\n if (sectionHandler) {\n await sectionHandler(section.slice(1));\n }\n }\n\n if (parsed.tag === '*' && parsed.command) {\n let untaggedHandler = this.getUntaggedHandler(parsed.command, parsed.attributes);\n if (untaggedHandler) {\n try {\n await untaggedHandler(parsed);\n } catch (err) {\n this.log.warn({ err, cid: this.id });\n data.next();\n continue;\n }\n }\n }\n\n if (this.requestTagMap.has(parsed.tag)) {\n let request = this.requestTagMap.get(parsed.tag);\n this.requestTagMap.delete(parsed.tag);\n\n if (this.currentRequest && this.currentRequest.tag === parsed.tag) {\n // send next pending command\n this.currentRequest = false;\n await this.trySend();\n }\n\n switch (parsed.command.toUpperCase()) {\n case 'OK':\n case 'BYE':\n await new Promise(resolve => request.resolve({ response: parsed, next: resolve }));\n break;\n\n case 'NO':\n case 'BAD': {\n let txt =\n parsed.attributes &&\n parsed.attributes\n .filter(val => val.type === 'TEXT')\n .map(val => val.value.trim())\n .join(' ');\n\n let err = new Error('Command failed');\n err.response = parsed;\n err.responseStatus = parsed.command.toUpperCase();\n\n try {\n err.executedCommand =\n parsed.tag +\n (\n await compiler(request, {\n isLogging: true\n })\n ).toString();\n } catch (err) {\n // ignore\n }\n\n if (txt) {\n err.responseText = txt;\n\n if (err.responseStatus === 'NO' && txt.includes('Some of the requested messages no longer exist')) {\n // Treat as successful response\n this.log.warn({ msg: 'Partial FETCH response', cid: this.id, err });\n await new Promise(resolve => request.resolve({ response: parsed, next: resolve }));\n break;\n }\n\n let throttleDelay = false;\n\n // MS365 throttling\n // tag BAD Request is throttled. Suggested Backoff Time: 92415 milliseconds\n if (/Request is throttled/i.test(txt) && /Backoff Time/i.test(txt)) {\n let throttlingMatch = txt.match(/Backoff Time[:=\\s]+(\\d+)/i);\n if (throttlingMatch && throttlingMatch[1] && !isNaN(throttlingMatch[1])) {\n throttleDelay = Number(throttlingMatch[1]);\n }\n }\n\n // Wait and return a throttling error\n if (throttleDelay) {\n err.code = 'ETHROTTLE';\n err.throttleReset = throttleDelay;\n\n let delayResponse = throttleDelay;\n if (delayResponse > 5 * 60 * 1000) {\n // max delay cap\n delayResponse = 5 * 60 * 1000;\n }\n\n this.log.warn({ msg: 'Throttling detected', cid: this.id, throttleDelay, delayResponse, err });\n await new Promise(r => setTimeout(r, delayResponse));\n }\n }\n\n request.reject(err);\n break;\n }\n\n default: {\n let err = new Error('Invalid server response');\n err.code = 'InvalidResponse';\n err.response = parsed;\n request.reject(err);\n break;\n }\n }\n }\n\n data.next();\n }\n }\n\n setEventHandlers() {\n this.socketReadable = () => {\n if (!this.reading) {\n this.reading = true;\n this.reader()\n .catch(err => this.log.error({ err, cid: this.id }))\n .finally(() => {\n this.reading = false;\n });\n }\n };\n\n this.streamer.on('readable', this.socketReadable);\n }\n\n setSocketHandlers() {\n this._socketError =\n this._socketError ||\n (err => {\n this.log.error({ err, cid: this.id });\n setImmediate(() => this.close());\n this.emitError(err);\n });\n this._socketClose =\n this._socketClose ||\n (() => {\n this.close();\n });\n this._socketEnd =\n this._socketEnd ||\n (() => {\n this.close();\n });\n\n this._socketTimeout =\n this._socketTimeout ||\n (() => {\n if (this.idling) {\n this.run('NOOP')\n .then(() => this.idle())\n .catch(this._socketError);\n } else {\n this.log.debug({ msg: 'Socket timeout', cid: this.id });\n this.close();\n }\n });\n\n this.socket.on('error', this._socketError);\n this.socket.on('close', this._socketClose);\n this.socket.on('end', this._socketEnd);\n this.socket.on('tlsClientError', this._socketError);\n this.socket.on('timeout', this._socketTimeout);\n\n this.writeSocket.on('error', this._socketError);\n }\n\n clearSocketHandlers() {\n if (this._socketError) {\n this.socket.removeListener('error', this._socketError);\n this.socket.removeListener('tlsClientError', this._socketError);\n }\n if (this._socketClose) {\n this.socket.removeListener('close', this._socketClose);\n }\n if (this._socketEnd) {\n this.socket.removeListener('end', this._socketEnd);\n }\n }\n\n async startSession() {\n await this.run('CAPABILITY');\n\n if (this.capabilities.has('ID')) {\n this.idRequested = await this.run('ID', this.clientInfo);\n }\n\n await this.upgradeToSTARTTLS();\n\n await this.authenticate();\n\n if (!this.idRequested && this.capabilities.has('ID')) {\n // re-request ID after LOGIN\n this.idRequested = await this.run('ID', this.clientInfo);\n }\n\n // Make sure we have namespace set. This should also throw if Exchange actually failed authentication\n let nsResponse = await this.run('NAMESPACE');\n if (nsResponse && nsResponse.error && nsResponse.status === 'BAD' && /User is authenticated but not connected/i.test(nsResponse.text)) {\n // Not a NAMESPACE failure but authentication failure, so report as\n this.authenticated = false;\n let err = new AuthenticationFailure('Authentication failed');\n err.response = nsResponse.text;\n throw err;\n }\n\n if (this.options.verifyOnly) {\n // List all folders and logout\n if (this.options.includeMailboxes) {\n this._mailboxList = await this.list();\n }\n return await this.logout();\n }\n\n // try to use compression (if supported)\n if (!this.options.disableCompression) {\n await this.compress();\n }\n\n if (!this.options.disableAutoEnable) {\n // enable extensions if possible\n await this.run('ENABLE', ['CONDSTORE', 'UTF8=ACCEPT'].concat(this.options.qresync ? 'QRESYNC' : []));\n }\n\n this.usable = true;\n }\n\n async compress() {\n if (!(await this.run('COMPRESS'))) {\n return; // was not able to negotiate compression\n }\n\n // create deflate/inflate streams\n this._deflate = zlib.createDeflateRaw({\n windowBits: 15\n });\n this._inflate = zlib.createInflateRaw();\n\n // route incoming socket via inflate stream\n this.socket.unpipe(this.streamer);\n this.streamer.compress = true;\n this.socket.pipe(this._inflate).pipe(this.streamer);\n this._inflate.on('error', err => {\n this.streamer.emit('error', err);\n });\n\n // route outgoing socket via deflate stream\n this.writeSocket = new PassThrough();\n\n this.writeSocket.destroySoon = () => {\n try {\n if (this.socket) {\n this.socket.destroy();\n }\n this.writeSocket.end();\n } catch (err) {\n this.log.error({ err, info: 'Failed to destroy PassThrough socket', cid: this.id });\n throw err;\n }\n };\n\n Object.defineProperty(this.writeSocket, 'destroyed', {\n get: () => this.socket.destroyed\n });\n\n // we need to force flush deflated data to socket so we can't\n // use normal pipes for this.writeSocket -> this._deflate -> this.socket\n let reading = false;\n let readNext = () => {\n reading = true;\n\n let chunk;\n while ((chunk = this.writeSocket.read()) !== null) {\n if (this._deflate && this._deflate.write(chunk) === false) {\n return this._deflate.once('drain', readNext);\n }\n }\n\n // flush data to socket\n if (this._deflate) {\n this._deflate.flush();\n }\n\n reading = false;\n };\n\n this.writeSocket.on('readable', () => {\n if (!reading) {\n readNext();\n }\n });\n this.writeSocket.on('error', err => {\n this.socket.emit('error', err);\n });\n\n this._deflate.pipe(this.socket);\n this._deflate.on('error', err => {\n this.socket.emit('error', err);\n });\n }\n\n _failSTARTTLS() {\n if (this.options.doSTARTTLS === true) {\n // STARTTLS configured as requirement\n let err = new Error('Server does not support STARTTLS');\n err.tlsFailed = true;\n throw err;\n } else {\n // Opportunistic STARTTLS. But it's not possible right now.\n // Attention: Could be a downgrade attack.\n return false;\n }\n }\n\n /**\n * Tries to upgrade the connection to TLS using STARTTLS.\n * @throws if STARTTLS is required, but not possible.\n * @returns {boolean} true, if the connection is now protected by TLS, either direct TLS or STARTTLS.\n */\n async upgradeToSTARTTLS() {\n if (this.options.doSTARTTLS === true && this.options.secure === true) {\n throw new Error('Misconfiguration: Cannot set both secure=true for TLS and doSTARTTLS=true for STARTTLS.');\n }\n\n if (this.secureConnection) {\n // Already using direct TLS. No need for STARTTLS.\n return true;\n }\n\n if (this.options.doSTARTTLS === false) {\n // STARTTLS explictly disabled by config\n return false;\n }\n\n if (!this.capabilities.has('STARTTLS')) {\n return this._failSTARTTLS();\n }\n\n this.expectCapabilityUpdate = true;\n let canUpgrade = await this.run('STARTTLS');\n if (!canUpgrade) {\n return this._failSTARTTLS();\n }\n\n this.socket.unpipe(this.streamer);\n let upgraded = await new Promise((resolve, reject) => {\n let socketPlain = this.socket;\n let opts = Object.assign(\n {\n socket: this.socket,\n servername: this.servername,\n port: this.port\n },\n this.options.tls || {}\n );\n this.clearSocketHandlers();\n\n socketPlain.once('error', err => {\n clearTimeout(this.connectTimeout);\n clearTimeout(this.upgradeTimeout);\n if (!this.upgrading) {\n // don't care anymore\n return;\n }\n setImmediate(() => this.close());\n this.upgrading = false;\n err.tlsFailed = true;\n reject(err);\n });\n\n this.upgradeTimeout = setTimeout(() => {\n if (!this.upgrading) {\n return;\n }\n setImmediate(() => this.close());\n let err = new Error('Failed to upgrade connection in required time');\n err.tlsFailed = true;\n err.code = 'UPGRADE_TIMEOUT';\n reject(err);\n }, UPGRADE_TIMEOUT);\n\n this.upgrading = true;\n this.socket = tls.connect(opts, () => {\n clearTimeout(this.upgradeTimeout);\n if (this.isClosed) {\n // not sure if this is possible?\n return this.close();\n }\n\n this.secureConnection = true;\n this.upgrading = false;\n this.streamer.secureConnection = true;\n this.socket.pipe(this.streamer);\n this.tls = typeof this.socket.getCipher === 'function' ? this.socket.getCipher() : false;\n if (this.tls) {\n this.tls.authorized = this.socket.authorized;\n this.log.info({\n src: 'tls',\n msg: 'Established TLS session',\n cid: this.id,\n authorized: this.tls.authorized,\n algo: this.tls.standardName || this.tls.name,\n version: this.tls.version\n });\n }\n\n return resolve(true);\n });\n\n this.writeSocket = this.socket;\n\n this.setSocketHandlers();\n });\n\n if (upgraded && this.expectCapabilityUpdate) {\n await this.run('CAPABILITY');\n }\n\n return upgraded;\n }\n\n async setAuthenticationState() {\n this.state = this.states.AUTHENTICATED;\n this.authenticated = true;\n if (this.expectCapabilityUpdate) {\n // update capabilities\n await this.run('CAPABILITY');\n }\n }\n\n async authenticate() {\n if (this.state === this.states.LOGOUT) {\n throw new AuthenticationFailure('Already logged out');\n }\n\n if (this.state !== this.states.NOT_AUTHENTICATED) {\n // nothing to do here, usually happens with PREAUTH greeting\n return true;\n }\n\n if (!this.options.auth) {\n throw new AuthenticationFailure('Please configure the login');\n }\n\n this.expectCapabilityUpdate = true;\n\n let loginMethod = (this.options.auth.loginMethod || '').toString().trim().toUpperCase();\n if (!loginMethod && /\\\\|\\//.test(this.options.auth.user)) {\n // Special override for MS Exchange when authenticating as some other user or non-email account\n loginMethod = 'LOGIN';\n }\n\n if (this.options.auth.accessToken) {\n this.authenticated = await this.run('AUTHENTICATE', this.options.auth.user, { accessToken: this.options.auth.accessToken });\n } else if (this.options.auth.pass) {\n if ((this.capabilities.has('AUTH=LOGIN') || this.capabilities.has('AUTH=PLAIN')) && loginMethod !== 'LOGIN') {\n this.authenticated = await this.run('AUTHENTICATE', this.options.auth.user, { password: this.options.auth.pass, loginMethod });\n } else {\n if (this.capabilities.has('LOGINDISABLED')) {\n throw new AuthenticationFailure('Login is disabled');\n }\n this.authenticated = await this.run('LOGIN', this.options.auth.user, this.options.auth.pass);\n }\n } else {\n throw new AuthenticationFailure('No password configured');\n }\n\n if (this.authenticated) {\n this.log.info({\n src: 'auth',\n msg: 'User authenticated',\n cid: this.id,\n user: this.options.auth.user\n });\n await this.setAuthenticationState();\n return true;\n }\n\n throw new AuthenticationFailure('No matching authentication method');\n }\n\n async initialOK(message) {\n this.greeting = (message.attributes || [])\n .filter(entry => entry.type === 'TEXT')\n .map(entry => entry.value)\n .filter(entry => entry)\n .join('');\n\n clearTimeout(this.greetingTimeout);\n this.untaggedHandlers.OK = null;\n this.untaggedHandlers.PREAUTH = null;\n\n if (this.isClosed) {\n return;\n }\n\n // get out of current parsing \"thread\", so do not await for startSession\n this.startSession()\n .then(() => {\n if (typeof this.initialResolve === 'function') {\n let resolve = this.initialResolve;\n this.initialResolve = false;\n this.initialReject = false;\n return resolve();\n }\n })\n .catch(err => {\n this.log.error({ err, cid: this.id });\n\n if (typeof this.initialReject === 'function') {\n clearTimeout(this.greetingTimeout);\n let reject = this.initialReject;\n this.initialResolve = false;\n this.initialReject = false;\n return reject(err);\n }\n\n setImmediate(() => this.close());\n });\n }\n\n async initialPREAUTH() {\n clearTimeout(this.greetingTimeout);\n this.untaggedHandlers.OK = null;\n this.untaggedHandlers.PREAUTH = null;\n\n if (this.isClosed) {\n return;\n }\n\n this.state = this.states.AUTHENTICATED;\n\n // get out of current parsing \"thread\", so do not await for startSession\n this.startSession()\n .then(() => {\n if (typeof this.initialResolve === 'function') {\n let resolve = this.initialResolve;\n this.initialResolve = false;\n this.initialReject = false;\n return resolve();\n }\n })\n .catch(err => {\n this.log.error({ err, cid: this.id });\n\n if (typeof this.initialReject === 'function') {\n clearTimeout(this.greetingTimeout);\n let reject = this.initialReject;\n this.initialResolve = false;\n this.initialReject = false;\n return reject(err);\n }\n\n setImmediate(() => this.close());\n });\n }\n\n async serverBye() {\n this.untaggedHandlers.BYE = null;\n this.state = this.states.LOGOUT;\n }\n\n async sectionCapability(section) {\n this.rawCapabilities = section;\n this.capabilities = updateCapabilities(section);\n\n if (this.capabilities) {\n for (let [capa] of this.capabilities) {\n if (/^AUTH=/i.test(capa) && !this.authCapabilities.has(capa.toUpperCase())) {\n this.authCapabilities.set(capa.toUpperCase(), false);\n }\n }\n }\n\n if (this.expectCapabilityUpdate) {\n this.expectCapabilityUpdate = false;\n }\n }\n\n async untaggedCapability(untagged) {\n this.rawCapabilities = untagged.attributes;\n this.capabilities = updateCapabilities(untagged.attributes);\n\n if (this.capabilities) {\n for (let [capa] of this.capabilities) {\n if (/^AUTH=/i.test(capa) && !this.authCapabilities.has(capa.toUpperCase())) {\n this.authCapabilities.set(capa.toUpperCase(), false);\n }\n }\n }\n\n if (this.expectCapabilityUpdate) {\n this.expectCapabilityUpdate = false;\n }\n }\n\n async untaggedExists(untagged) {\n if (!this.mailbox) {\n // mailbox closed, ignore\n return;\n }\n\n if (!untagged || !untagged.command || isNaN(untagged.command)) {\n return;\n }\n\n let count = Number(untagged.command);\n if (count === this.mailbox.exists) {\n // nothing changed?\n return;\n }\n\n // keep exists up to date\n let prevCount = this.mailbox.exists;\n this.mailbox.exists = count;\n this.emit('exists', {\n path: this.mailbox.path,\n count,\n prevCount\n });\n }\n\n async untaggedExpunge(untagged) {\n if (!this.mailbox) {\n // mailbox closed, ignore\n return;\n }\n\n if (!untagged || !untagged.command || isNaN(untagged.command)) {\n return;\n }\n\n let seq = Number(untagged.command);\n if (seq && seq <= this.mailbox.exists) {\n this.mailbox.exists--;\n let payload = {\n path: this.mailbox.path,\n seq,\n vanished: false\n };\n\n if (typeof this.options.expungeHandler === 'function') {\n try {\n await this.options.expungeHandler(payload);\n } catch (err) {\n this.log.error({ msg: 'Failed to notify expunge event', payload, error: err, cid: this.id });\n }\n } else {\n this.emit('expunge', payload);\n }\n }\n }\n\n async untaggedVanished(untagged, mailbox) {\n mailbox = mailbox || this.mailbox;\n if (!mailbox) {\n // mailbox closed, ignore\n return;\n }\n\n let tags = [];\n let uids = false;\n\n if (untagged.attributes.length > 1 && Array.isArray(untagged.attributes[0])) {\n tags = untagged.attributes[0].map(entry => (typeof entry.value === 'string' ? entry.value.toUpperCase() : false)).filter(value => value);\n untagged.attributes.shift();\n }\n\n if (untagged.attributes[0] && typeof untagged.attributes[0].value === 'string') {\n uids = untagged.attributes[0].value;\n }\n\n let uidList = expandRange(uids);\n\n for (let uid of uidList) {\n let payload = {\n path: mailbox.path,\n uid,\n vanished: true,\n earlier: tags.includes('EARLIER')\n };\n\n if (typeof this.options.expungeHandler === 'function') {\n try {\n await this.options.expungeHandler(payload);\n } catch (err) {\n this.log.error({ msg: 'Failed to notify expunge event', payload, error: err, cid: this.id });\n }\n } else {\n this.emit('expunge', payload);\n }\n }\n }\n\n async untaggedFetch(untagged, mailbox) {\n mailbox = mailbox || this.mailbox;\n if (!mailbox) {\n // mailbox closed, ignore\n return;\n }\n\n let message = await formatMessageResponse(untagged, mailbox);\n if (message.flags) {\n let updateEvent = {\n path: mailbox.path,\n seq: message.seq\n };\n\n if (message.uid) {\n updateEvent.uid = message.uid;\n }\n\n if (message.modseq) {\n updateEvent.modseq = message.modseq;\n }\n\n updateEvent.flags = message.flags;\n\n if (message.flagColor) {\n updateEvent.flagColor = message.flagColor;\n }\n\n this.emit('flags', updateEvent);\n }\n }\n\n async ensureSelectedMailbox(path) {\n if (!path) {\n return false;\n }\n\n if ((!this.mailbox && path) || (this.mailbox && path && !comparePaths(this, this.mailbox.path, path))) {\n return await this.mailboxOpen(path);\n }\n\n return true;\n }\n\n async resolveRange(range, options) {\n if (typeof range === 'number' || typeof range === 'bigint') {\n range = range.toString();\n }\n\n // special case, some servers allow this, some do not, so replace it with the last known EXISTS value\n if (range === '*') {\n if (!this.mailbox.exists) {\n return false;\n }\n range = this.mailbox.exists.toString();\n options.uid = false; // sequence query\n }\n\n if (range && typeof range === 'object' && !Array.isArray(range)) {\n if (range.all && Object.keys(range).length === 1) {\n range = '1:*';\n } else if (range.uid && Object.keys(range).length === 1) {\n range = range.uid;\n options.uid = true;\n } else {\n // resolve range by searching\n options.uid = true; // force UIDs instead of sequence numbers\n range = await this.run('SEARCH', range, options);\n if (range && range.length) {\n range = packMessageRange(range);\n }\n }\n }\n\n if (Array.isArray(range)) {\n range = range.join(',');\n }\n\n if (!range) {\n return false;\n }\n\n return range;\n }\n\n autoidle() {\n clearTimeout(this.idleStartTimer);\n if (this.options.disableAutoIdle || this.state !== this.states.SELECTED) {\n return;\n }\n this.idleStartTimer = setTimeout(() => {\n this.idle().catch(err => this.log.warn({ err, cid: this.id }));\n }, 15 * 1000);\n }\n\n // PUBLIC API METHODS\n\n /**\n * Initiates a connection against IMAP server. Throws if anything goes wrong. This is something you have to call before you can run any IMAP commands\n *\n * @returns {Promise<void>}\n * @throws Will throw an error if connection or authentication fails\n * @example\n * let client = new ImapFlow({...});\n * await client.connect();\n */\n async connect() {\n if (this._connectCalled) {\n // Prevent re-using ImapFlow instances by allowing to call connect just once.\n throw new Error('Can not re-use ImapFlow instance');\n }\n this._connectCalled = true;\n\n let connector = this.secureConnection ? tls : net;\n\n let opts = Object.assign(\n {\n host: this.host,\n servername: this.servername,\n port: this.port\n },\n this.options.tls || {}\n );\n\n this.untaggedHandlers.OK = (...args) => this.initialOK(...args);\n this.untaggedHandlers.BYE = (...args) => this.serverBye(...args);\n this.untaggedHandlers.PREAUTH = (...args) => this.initialPREAUTH(...args);\n\n this.untaggedHandlers.CAPABILITY = (...args) => this.untaggedCapability(...args);\n this.sectionHandlers.CAPABILITY = (...args) => this.sectionCapability(...args);\n\n this.untaggedHandlers.EXISTS = (...args) => this.untaggedExists(...args);\n this.untaggedHandlers.EXPUNGE = (...args) => this.untaggedExpunge(...args);\n\n // these methods take an optional second argument, so make sure that some random IMAP tag is not used as the second argument\n this.untaggedHandlers.FETCH = untagged => this.untaggedFetch(untagged);\n this.untaggedHandlers.VANISHED = untagged => this.untaggedVanished(untagged);\n\n let socket = false;\n if (this.options.proxy) {\n try {\n socket = await proxyConnection(this.log, this.options.proxy, this.host, this.port);\n if (!socket) {\n throw new Error('Failed to setup proxy connection');\n }\n } catch (err) {\n let error = new Error('Failed to setup proxy connection');\n error.code = err.code || 'ProxyError';\n error._err = err;\n this.log.error({ error, cid: this.id });\n throw error;\n }\n }\n\n await new Promise((resolve, reject) => {\n this.connectTimeout = setTimeout(() => {\n let err = new Error('Failed to establish connection in required time');\n err.code = 'CONNECT_TIMEOUT';\n err.details = {\n connectionTimeout: this.options.connectionTimeout || CONNECT_TIMEOUT\n };\n this.log.error({ err, cid: this.id });\n setImmediate(() => this.close());\n reject(err);\n }, this.options.connectionTimeout || CONNECT_TIMEOUT);\n\n let onConnect = () => {\n clearTimeout(this.connectTimeout);\n this.socket.setKeepAlive(true, 5 * 1000);\n this.socket.setTimeout(this.options.socketTimeout || SOCKET_TIMEOUT);\n\n this.greetingTimeout = setTimeout(() => {\n let err = new Error(`Failed to receive greeting from server in required time${!this.secureConnection ? '. Maybe should use TLS?' : ''}`);\n err.code = 'GREETING_TIMEOUT';\n err.details = {\n greetingTimeout: this.options.greetingTimeout || GREETING_TIMEOUT\n };\n this.log.error({ err, cid: this.id });\n setImmediate(() => this.close());\n reject(err);\n }, this.options.greetingTimeout || GREETING_TIMEOUT);\n\n this.tls = typeof this.socket.getCipher === 'function' ? this.socket.getCipher() : false;\n\n let logInfo = {\n src: 'connection',\n msg: `Established ${this.tls ? 'secure ' : ''}TCP connection`,\n cid: this.id,\n secure: !!this.tls,\n host: this.host,\n servername: this.servername,\n port: this.socket.remotePort,\n address: this.socket.remoteAddress,\n localAddress: this.socket.localAddress,\n localPort: this.socket.localPort\n };\n\n if (this.tls) {\n logInfo.authorized = this.tls.authorized = this.socket.authorized;\n logInfo.algo = this.tls.standardName || this.tls.name;\n logInfo.version = this.tls.version;\n }\n\n this.log.info(logInfo);\n\n this.setSocketHandlers();\n this.socket.pipe(this.streamer);\n\n // executed by initial \"* OK\"\n this.initialResolve = resolve;\n this.initialReject = reject;\n };\n\n if (socket) {\n // socket is already established via proxy\n if (this.secureConnection) {\n // TLS socket requires a handshake\n opts.socket = socket;\n this.socket = connector.connect(opts, onConnect);\n } else {\n // cleartext socket is already usable\n this.socket = socket;\n setImmediate(onConnect);\n }\n } else {\n this.socket = connector.connect(opts, onConnect);\n }\n\n this.writeSocket = this.socket;\n\n this.socket.on('error', err => {\n clearTimeout(this.connectTimeout);\n clearTimeout(this.greetingTimeout);\n setImmediate(() => this.close());\n this.log.error({ err, cid: this.id });\n reject(err);\n });\n\n this.setEventHandlers();\n });\n }\n\n /**\n * Graceful connection close by sending logout command to server. TCP connection is closed once command is finished.\n *\n * @return {Promise<void>}\n * @example\n * let client = new ImapFlow({...});\n * await client.connect();\n * ...\n * await client.logout();\n */\n async logout() {\n return await this.run('LOGOUT');\n }\n\n /**\n * Closes TCP connection without notifying the server.\n *\n * @example\n * let client = new ImapFlow({...});\n * await client.connect();\n * ...\n * client.close();\n */\n close() {\n // clear pending timers\n clearTimeout(this.idleStartTimer);\n clearTimeout(this.upgradeTimeout);\n clearTimeout(this.connectTimeout);\n\n this.usable = false;\n this.idling = false;\n\n if (typeof this.initialReject === 'function' && !this.options.verifyOnly) {\n clearTimeout(this.greetingTimeout);\n let reject = this.initialReject;\n this.initialResolve = false;\n this.initialReject = false;\n let err = new Error('Unexpected close');\n err.code = `ClosedAfterConnect${this.secureConnection ? 'TLS' : 'Text'}`;\n // still has to go through the logic below\n setImmediate(() => reject(err));\n }\n\n if (typeof this.preCheck === 'function') {\n this.preCheck().catch(err => this.log.warn({ err, cid: this.id }));\n }\n\n // reject command that is currently processed\n if (this.currentRequest && this.requestTagMap.has(this.currentRequest.tag)) {\n let request = this.requestTagMap.get(this.currentRequest.tag);\n if (request) {\n this.requestTagMap.delete(request.tag);\n const error = new Error('Connection not available');\n error.code = 'NoConnection';\n request.reject(error);\n }\n this.currentRequest = false;\n }\n\n // reject all other pending commands\n while (this.requestQueue.length) {\n let req = this.requestQueue.shift();\n if (req && this.requestTagMap.has(req.tag)) {\n let request = this.requestTagMap.get(req.tag);\n if (request) {\n this.requestTagMap.delete(request.tag);\n const error = new Error('Connection not available');\n error.code = 'NoConnection';\n request.reject(error);\n }\n }\n }\n\n this.state = this.states.LOGOUT;\n if (this.isClosed) {\n return;\n }\n this.isClosed = true;\n\n if (this.writeSocket && !this.writeSocket.destroyed) {\n try {\n this.writeSocket.destroy();\n } catch (err) {\n this.log.error({ err, cid: this.id });\n }\n }\n\n if (this.socket && !this.socket.destroyed && this.writeSocket !== this.socket) {\n try {\n this.socket.destroy();\n } catch (err) {\n this.log.error({ err, cid: this.id });\n }\n }\n\n this.log.trace({ msg: 'Connection closed', cid: this.id });\n this.emit('close');\n }\n\n /**\n * @typedef {Object} QuotaResponse\n * @global\n * @property {String} path=INBOX mailbox path this quota applies to\n * @property {Object} [storage] Storage quota if provided by server\n * @property {Number} [storage.used] used storage in bytes\n * @property {Number} [storage.limit] total storage available\n * @property {Object} [messages] Message count quota if provided by server\n * @property {Number} [messages.used] stored messages\n * @property {Number} [messages.limit] maximum messages allowed\n */\n\n /**\n * Returns current quota\n *\n * @param {String} [path] Optional mailbox path if you want to check quota for specific folder\n * @returns {Promise<QuotaResponse|Boolean>} Quota information or `false` if QUTOA extension is not supported or requested path does not exist\n *\n * @example\n * let quota = await client.getQuota();\n * console.log(quota.storage.used, quota.storage.available)\n */\n async getQuota(path) {\n path = path || 'INBOX';\n return await this.run('QUOTA', path);\n }\n\n /**\n * @typedef {Object} ListResponse\n * @global\n * @property {String} path mailbox path (unicode string)\n * @property {String} pathAsListed mailbox path as listed in the LIST/LSUB response\n * @property {String} name mailbox name (last part of path after delimiter)\n * @property {String} delimiter mailbox path delimiter, usually \".\" or \"/\"\n * @property {String[]} parent An array of parent folder names. All names are in unicode\n * @property {String} parentPath Same as `parent`, but as a complete string path (unicode string)\n * @property {Set<string>} flags a set of flags for this mailbox\n * @property {String} specialUse one of special-use flags (if applicable): \"\\All\", \"\\Archive\", \"\\Drafts\", \"\\Flagged\", \"\\Junk\", \"\\Sent\", \"\\Trash\". Additionally INBOX has non-standard \"\\Inbox\" flag set\n * @property {Boolean} listed `true` if mailbox was found from the output of LIST command\n * @property {Boolean} subscribed `true` if mailbox was found from the output of LSUB command\n * @property {StatusObject} [status] If `statusQuery` was used, then this value includes the status response\n */\n\n /**\n * @typedef {Object} ListOptions\n * @global\n * @property {Object} [statusQuery] request status items for every listed entry\n * @property {Boolean} [statusQuery.messages] if `true` request count of messages\n * @property {Boolean} [statusQuery.recent] if `true` request count of messages with \\\\Recent tag\n * @property {Boolean} [statusQuery.uidNext] if `true` request predicted next UID\n * @property {Boolean} [statusQuery.uidValidity] if `true` request mailbox `UIDVALIDITY` value\n * @property {Boolean} [statusQuery.unseen] if `true` request count of unseen messages\n * @property {Boolean} [statusQuery.highestModseq] if `true` request last known modseq value\n * @property {Object} [specialUseHints] set specific paths as special use folders, this would override special use flags provided from the server\n * @property {String} [specialUseHints.sent] Path to \"Sent Mail\" folder\n * @property {String} [specialUseHints.trash] Path to \"Trash\" folder\n * @property {String} [specialUseHints.junk] Path to \"Junk Mail\" folder\n * @property {String} [specialUseHints.drafts] Path to \"Drafts\" folder\n */\n\n /**\n * Lists available mailboxes as an Array\n *\n * @param {ListOptions} [options] defines additional listing options\n * @returns {Promise<ListResponse[]>} An array of ListResponse objects\n *\n * @example\n * let list = await client.list();\n * list.forEach(mailbox=>console.log(mailbox.path));\n */\n async list(options) {\n options = options || {};\n let folders = await this.run('LIST', '', '*', options);\n this.folders = new Map(folders.map(folder => [folder.path, folder]));\n return folders;\n }\n\n /**\n * @typedef {Object} ListTreeResponse\n * @global\n * @property {Boolean} root If `true` then this is root node without any additional properties besides *folders*\n * @property {String} path mailbox path\n * @property {String} name mailbox name (last part of path after delimiter)\n * @property {String} delimiter mailbox path delimiter, usually \".\" or \"/\"\n * @property {String[]} flags list of flags for this mailbox\n * @property {String} specialUse one of special-use flags (if applicable): \"\\All\", \"\\Archive\", \"\\Drafts\", \"\\Flagged\", \"\\Junk\", \"\\Sent\", \"\\Trash\". Additionally INBOX has non-standard \"\\Inbox\" flag set\n * @property {Boolean} listed `true` if mailbox was found from the output of LIST command\n * @property {Boolean} subscribed `true` if mailbox was found from the output of LSUB command\n * @property {Boolean} disabled If `true` then this mailbox can not be selected in the UI\n * @property {ListTreeResponse[]} folders An array of subfolders\n */\n\n /**\n * Lists available mailboxes as a tree structured object\n *\n * @param {ListOptions} [options] defines additional listing options\n * @returns {Promise<ListTreeResponse>} Tree structured object\n *\n * @example\n * let tree = await client.listTree();\n * tree.folders.forEach(mailbox=>console.log(mailbox.path));\n */\n async listTree(options) {\n options = options || {};\n let folders = await this.run('LIST', '', '*', options);\n this.folders = new Map(folders.map(folder => [folder.path, folder]));\n return getFolderTree(folders);\n }\n\n /**\n * Performs a no-op call against server\n * @returns {Promise<void>}\n */\n async noop() {\n await this.run('NOOP');\n }\n\n /**\n * @typedef {Object} MailboxCreateResponse\n * @global\n * @property {String} path full mailbox path\n * @property {String} [mailboxId] unique mailbox ID if server supports `OBJECTID` extension (currently Yahoo and some others)\n * @property {Boolean} created If `true` then mailbox was created otherwise it already existed\n */\n\n /**\n * Creates a new mailbox folder and sets up subscription for the created mailbox. Throws on error.\n *\n * @param {string|array} path Full mailbox path. Unicode is allowed. If value is an array then it is joined using current delimiter symbols. Namespace prefix is added automatically if required.\n * @returns {Promise<MailboxCreateResponse>} Mailbox info\n * @throws Will throw an error if mailbox can not be created\n *\n * @example\n * let info = await client.mailboxCreate(['parent', 'child']);\n * console.log(info.path);\n * // \"INBOX.parent.child\" // assumes \"INBOX.\" as namespace prefix and \".\" as delimiter\n */\n async mailboxCreate(path) {\n return await this.run('CREATE', path);\n }\n\n /**\n * @typedef {Object} MailboxRenameResponse\n * @global\n * @property {String} path full mailbox path that was renamed\n * @property {String} newPath new full mailbox path\n */\n\n /**\n * Renames a mailbox. Throws on error.\n *\n * @param {string|array} path Path for the mailbox to rename. Unicode is allowed. If value is an array then it is joined using current delimiter symbols. Namespace prefix is added automatically if required.\n * @param {string|array} newPath New path for the mailbox\n * @returns {Promise<MailboxRenameResponse>} Mailbox info\n * @throws Will throw an error if mailbox does not exist or can not be renamed\n *\n * @example\n * let info = await client.mailboxRename('parent.child', 'Important stuff ❗️');\n * console.log(info.newPath);\n * // \"INBOX.Important stuff ❗️\" // assumes \"INBOX.\" as namespace prefix\n */\n async mailboxRename(path, newPath) {\n return await this.run('RENAME', path, newPath);\n }\n\n /**\n * @typedef {Object} MailboxDeleteResponse\n * @global\n * @property {String} path full mailbox path that was deleted\n */\n\n /**\n * Deletes a mailbox. Throws on error.\n *\n * @param {string|array} path Path for the mailbox to delete. Unicode is allowed. If value is an array then it is joined using current delimiter symbols. Namespace prefix is added automatically if required.\n * @returns {Promise<MailboxDeleteResponse>} Mailbox info\n * @throws Will throw an error if mailbox does not exist or can not be deleted\n *\n * @example\n * let info = await client.mailboxDelete('Important stuff ❗️');\n * console.log(info.path);\n * // \"INBOX.Important stuff ❗️\" // assumes \"INBOX.\" as namespace prefix\n */\n async mailboxDelete(path) {\n return await this.run('DELETE', path);\n }\n\n /**\n * Subscribes to a mailbox\n *\n * @param {string|array} path Path for the mailbox to subscribe to. Unicode is allowed. If value is an array then it is joined using current delimiter symbols. Namespace prefix is added automatically if required.\n * @returns {Promise<Boolean>} `true` if subscription operation succeeded, `false` otherwise\n *\n * @example\n * await client.mailboxSubscribe('Important stuff ❗️');\n */\n async mailboxSubscribe(path) {\n return await this.run('SUBSCRIBE', path);\n }\n\n /**\n * Unsubscribes from a mailbox\n *\n * @param {string|array} path **Path for the mailbox** to unsubscribe from. Unicode is allowed. If value is an array then it is joined using current delimiter symbols. Namespace prefix is added automatically if required.\n * @returns {Promise<Boolean>} `true` if unsubscription operation succeeded, `false` otherwise\n *\n * @example\n * await client.mailboxUnsubscribe('Important stuff ❗️');\n */\n async mailboxUnsubscribe(path) {\n return await this.run('UNSUBSCRIBE', path);\n }\n\n /**\n * Opens a mailbox to access messages. You can perform message operations only against an opened mailbox.\n * Using {@link module:imapflow~ImapFlow#getMailboxLock|getMailboxLock()} instead of `mailboxOpen()` is preferred. Both do the same thing\n * but next `getMailboxLock()` call is not executed until previous one is released.\n *\n * @param {string|array} path **Path for the mailbox** to open\n * @param {Object} [options] optional options\n * @param {Boolean} [options.readOnly=false] If `true` then opens mailbox in read-only mode. You can still try to perform write operations but these would probably fail.\n * @returns {Promise<MailboxObject>} Mailbox info\n * @throws Will throw an error if mailbox does not exist or can not be opened\n *\n * @example\n * let mailbox = await client.mailboxOpen('Important stuff ❗️');\n * console.log(mailbox.exists);\n * // 125\n */\n async mailboxOpen(path, options) {\n return await this.run('SELECT', path, options);\n }\n\n /**\n * Closes a previously opened mailbox\n *\n * @returns {Promise<Boolean>} Did the operation succeed or not\n *\n * @example\n * let mailbox = await client.mailboxOpen('INBOX');\n * await client.mailboxClose();\n */\n async mailboxClose() {\n return await this.run('CLOSE');\n }\n\n /**\n * @typedef {Object} StatusObject\n * @global\n * @property {String} path full mailbox path that was checked\n * @property {Number} [messages] Count of messages\n * @property {Number} [recent] Count of messages with \\\\Recent tag\n * @property {Number} [uidNext] Predicted next UID\n * @property {BigInt} [uidValidity] Mailbox `UIDVALIDITY` value\n * @property {Number} [unseen] Count of unseen messages\n * @property {BigInt} [highestModseq] Last known modseq value (if CONDSTORE extension is enabled)\n */\n\n /**\n * Requests the status of the indicated mailbox. Only requested status values will be returned.\n *\n * @param {String} path mailbox path to check for (unicode string)\n * @param {Object} query defines requested status items\n * @param {Boolean} query.messages if `true` request count of messages\n * @param {Boolean} query.recent if `true` request count of messages with \\\\Recent tag\n * @param {Boolean} query.uidNext if `true` request predicted next UID\n * @param {Boolean} query.uidValidity if `true` request mailbox `UIDVALIDITY` value\n * @param {Boolean} query.unseen if `true` request count of unseen messages\n * @param {Boolean} query.highestModseq if `true` request last known modseq value\n * @returns {Promise<StatusObject>} status of the indicated mailbox\n *\n * @example\n * let status = await client.status('INBOX', {unseen: true});\n * console.log(status.unseen);\n * // 123\n */\n async status(path, query) {\n return await this.run('STATUS', path, query);\n }\n\n /**\n * Starts listening for new or deleted messages from the currently opened mailbox. Only required if {@link ImapFlow#disableAutoIdle} is set to `true`\n * otherwise IDLE is started by default on connection inactivity. NB! If `idle()` is called manually then it does not\n * return until IDLE is finished which means you would have to call some other command out of scope.\n *\n * @returns {Promise<Boolean>} Did the operation succeed or not\n *\n * @example\n * let mailbox = await client.mailboxOpen('INBOX');\n *\n * await client.idle();\n */\n async idle() {\n if (!this.idling) {\n return await this.run('IDLE', this.maxIdleTime);\n }\n }\n\n /**\n * Sequence range string. Separate different values with commas, number ranges with colons and use \\\\* as the placeholder for the newest message in mailbox\n * @typedef {String} SequenceString\n * @global\n * @example\n * \"1:*\" // for all messages\n * \"1,2,3\" // for messages 1, 2 and 3\n * \"1,2,4:6\" // for messages 1,2,4,5,6\n * \"*\" // for the newest message\n */\n\n /**\n * IMAP search query options. By default all conditions must match. In case of `or` query term at least one condition must match.\n * @typedef {Object} SearchObject\n * @global\n * @property {SequenceString} [seq] message ordering sequence range\n * @property {Boolean} [answered] Messages with (value is `true`) or without (value is `false`) \\\\Answered flag\n * @property {Boolean} [deleted] Messages with (value is `true`) or without (value is `false`) \\\\Deleted flag\n * @property {Boolean} [draft] Messages with (value is `true`) or without (value is `false`) \\\\Draft flag\n * @property {Boolean} [flagged] Messages with (value is `true`) or without (value is `false`) \\\\Flagged flag\n * @property {Boolean} [seen] Messages with (value is `true`) or without (value is `false`) \\\\Seen flag\n * @property {Boolean} [all] If `true` matches all messages\n * @property {Boolean} [new] If `true` matches messages that have the \\\\Recent flag set but not the \\\\Seen flag\n * @property {Boolean} [old] If `true` matches messages that do not have the \\\\Recent flag set\n * @property {Boolean} [recent] If `true` matches messages that have the \\\\Recent flag set\n * @property {String} [from] Matches From: address field\n * @property {String} [to] Matches To: address field\n * @property {String} [cc] Matches Cc: address field\n * @property {String} [bcc] Matches Bcc: address field\n * @property {String} [body] Matches message body\n * @property {String} [subject] Matches message subject\n * @property {Number} [larger] Matches messages larger than value\n * @property {Number} [smaller] Matches messages smaller than value\n * @property {SequenceString} [uid] UID sequence range\n * @property {BigInt} [modseq] Matches messages with modseq higher than value\n * @property {String} [emailId] unique email ID. Only used if server supports `OBJECTID` or `X-GM-EXT-1` extensions\n * @property {String} [threadId] unique thread ID. Only used if server supports `OBJECTID` or `X-GM-EXT-1` extensions\n * @property {Date|string} [before] Matches messages received before date\n * @property {Date|string} [on] Matches messages received on date (ignores time)\n * @property {Date|string} [since] Matches messages received after date\n * @property {Date|string} [sentBefore] Matches messages sent before date\n * @property {Date|string} [sentOn] Matches messages sent on date (ignores time)\n * @property {Date|string} [sentSince] Matches messages sent after date\n * @property {String} [keyword] Matches messages that have the custom flag set\n * @property {String} [unKeyword] Matches messages that do not have the custom flag set\n * @property {Object.<string, Boolean|String>} [header] Matches messages with header key set if value is `true` (**NB!** not supported by all servers) or messages where header partially matches a string value\n * @property {SearchObject[]} [or] An array of 2 or more {@link SearchObject} objects. At least on of these must match\n */\n\n /**\n * Sets flags for a message or message range\n *\n * @param {SequenceString | Number[] | SearchObject} range Range to filter the messages\n * @param {string[]} Array of flags to set. Only flags that are permitted to set are used, other flags are ignored\n * @param {Object} [options]\n * @param {Boolean} [options.uid] If `true` then uses UID {@link SequenceString} instead of sequence numbers\n * @param {BigInt} [options.unchangedSince] If set then only messages with a lower or equal `modseq` value are updated. Ignored if server does not support `CONDSTORE` extension.\n * @param {Boolean} [options.useLabels=false] If true then update Gmail labels instead of message flags\n * @returns {Promise<Boolean>} Did the operation succeed or not\n *\n * @example\n * let mailbox = await client.mailboxOpen('INBOX');\n * // mark all unseen messages as seen (and remove other flags)\n * await client.messageFlagsSet({seen: false}, ['\\Seen]);\n */\n async messageFlagsSet(range, flags, options) {\n options = options || {};\n\n range = await this.resolveRange(range, options);\n if (!range) {\n return false;\n }\n\n let queryOpts = Object.assign(\n {\n operation: 'set'\n },\n options\n );\n\n return await this.run('STORE', range, flags, queryOpts);\n }\n\n /**\n * Adds flags for a message or message range\n *\n * @param {SequenceString | Number[] | SearchObject} range Range to filter the messages\n * @param {string[]} Array of flags to set. Only flags that are permitted to set are used, other flags are ignored\n * @param {Object} [options]\n * @param {Boolean} [options.uid] If `true` then uses UID {@link SequenceString} instead of sequence numbers\n * @param {BigInt} [options.unchangedSince] If set then only messages with a lower or equal `modseq` value are updated. Ignored if server does not support `CONDSTORE` extension.\n * @param {Boolean} [options.useLabels=false] If true then update Gmail labels instead of message flags\n * @returns {Promise<Boolean>} Did the operation succeed or not\n *\n * @example\n * let mailbox = await client.mailboxOpen('INBOX');\n * // mark all unseen messages as seen (and keep other flags as is)\n * await client.messageFlagsAdd({seen: false}, ['\\Seen]);\n */\n async messageFlagsAdd(range, flags, options) {\n options = options || {};\n\n range = await this.resolveRange(range, options);\n if (!range) {\n return false;\n }\n\n let queryOpts = Object.assign(\n {\n operation: 'add'\n },\n options\n );\n\n return await this.run('STORE', range, flags, queryOpts);\n }\n\n /**\n * Remove specific flags from a message or message range\n *\n * @param {SequenceString | Number[] | SearchObject} range Range to filter the messages\n * @param {string[]} Array of flags to remove. Only flags that are permitted to set are used, other flags are ignored\n * @param {Object} [options]\n * @param {Boolean} [options.uid] If `true` then uses UID {@link SequenceString} instead of sequence numbers\n * @param {BigInt} [options.unchangedSince] If set then only messages with a lower or equal `modseq` value are updated. Ignored if server does not support `CONDSTORE` extension.\n * @param {Boolean} [options.useLabels=false] If true then update Gmail labels instead of message flags\n * @returns {Promise<Boolean>} Did the operation succeed or not\n *\n * @example\n * let mailbox = await client.mailboxOpen('INBOX');\n * // mark all seen messages as unseen by removing \\\\Seen flag\n * await client.messageFlagsRemove({seen: true}, ['\\Seen]);\n */\n async messageFlagsRemove(range, flags, options) {\n options = options || {};\n\n range = await this.resolveRange(range, options);\n if (!range) {\n return false;\n }\n\n let queryOpts = Object.assign(\n {\n operation: 'remove'\n },\n options\n );\n\n return await this.run('STORE', range, flags, queryOpts);\n }\n\n /**\n * Sets a colored flag for an email. Only supported by mail clients like Apple Mail\n *\n * @param {SequenceString | Number[] | SearchObject} range Range to filter the messages\n * @param {string} The color to set. One of 'red', 'orange', 'yellow', 'green', 'blue', 'purple', and 'grey'\n * @param {Object} [options]\n * @param {Boolean} [options.uid] If `true` then uses UID {@link SequenceString} instead of sequence numbers\n * @param {BigInt} [options.unchangedSince] If set then only messages with a lower or equal `modseq` value are updated. Ignored if server does not support `CONDSTORE` extension.\n * @returns {Promise<Boolean>} Did the operation succeed or not\n *\n * @example\n * let mailbox = await client.mailboxOpen('INBOX');\n * // add a purple flag for all emails\n * await client.setFlagColor('1:*', 'Purple');\n */\n async setFlagColor(range, color, options) {\n options = options || {};\n\n range = await this.resolveRange(range, options);\n if (!range) {\n return false;\n }\n\n let flagChanges = getColorFlags(color);\n if (!flagChanges) {\n return false;\n }\n\n let addResults;\n let removeResults;\n\n if (flagChanges.add && flagChanges.add.length) {\n let queryOpts = Object.assign(\n {\n operation: 'add'\n },\n options,\n {\n useLabels: false, // override if set\n // prevent triggering a premature Flags change notification\n silent: flagChanges.remove && flagChanges.remove.length\n }\n );\n\n addResults = await this.run('STORE', range, flagChanges.add, queryOpts);\n }\n\n if (flagChanges.remove && flagChanges.remove.length) {\n let queryOpts = Object.assign(\n {\n operation: 'remove'\n },\n options,\n { useLabels: false } // override if set\n );\n\n removeResults = await this.run('STORE', range, flagChanges.remove, queryOpts);\n }\n\n return addResults || removeResults || false;\n }\n\n /**\n * Delete messages from the currently opened mailbox. Method does not indicate info about deleted messages,\n * instead you should be using {@link ImapFlow#expunge} event for this\n *\n * @param {SequenceString | Number[] | SearchObject} range Range to filter the messages\n * @param {Object} [options]\n * @param {Boolean} [options.uid] If `true` then uses UID {@link SequenceString} instead of sequence numbers\n * @returns {Promise<Boolean>} Did the operation succeed or not\n *\n * @example\n * let mailbox = await client.mailboxOpen('INBOX');\n * // delete all seen messages\n * await client.messageDelete({seen: true});\n */\n async messageDelete(range, options) {\n options = options || {};\n range = await this.resolveRange(range, options);\n if (!range) {\n return false;\n }\n return await this.run('EXPUNGE', range, options);\n }\n\n /**\n * @typedef {Object} AppendResponseObject\n * @global\n * @property {String} destination full mailbox path where the message was uploaded to\n * @property {BigInt} [uidValidity] mailbox `UIDVALIDITY` if server has `UIDPLUS` extension enabled\n * @property {Number} [uid] UID of the uploaded message if server has `UIDPLUS` extension enabled\n * @property {Number} [seq] sequence number of the uploaded message if path is currently selected mailbox\n */\n\n /**\n * Appends a new message to a mailbox\n *\n * @param {String} path Mailbox path to upload the message to (unicode string)\n * @param {string|Buffer} content RFC822 formatted email message\n * @param {string[]} [flags] an array of flags to be set for the uploaded message\n * @param {Date|string} [idate=now] internal date to be set for the message\n * @returns {Promise<AppendResponseObject>} info about uploaded message\n *\n * @example\n * await client.append('INBOX', rawMessageBuffer, ['\\\\Seen'], new Date(2000, 1, 1));\n */\n async append(path, content, flags, idate) {\n let response = await this.run('APPEND', path, content, flags, idate);\n\n if (!response) {\n return false;\n }\n\n return response;\n }\n\n /**\n * @typedef {Object} CopyResponseObject\n * @global\n * @property {String} path path of source mailbox\n * @property {String} destination path of destination mailbox\n * @property {BigInt} [uidValidity] destination mailbox `UIDVALIDITY` if server has `UIDPLUS` extension enabled\n * @property {Map<number, number>} [uidMap] Map of UID values (if server has `UIDPLUS` extension enabled) where key is UID in source mailbox and value is the UID for the same message in destination mailbox\n */\n\n /**\n * Copies messages from current mailbox to destination mailbox\n *\n * @param {SequenceString | Number[] | SearchObject} range Range of messages to copy\n * @param {String} destination Mailbox path to copy the messages to\n * @param {Object} [options]\n * @param {Boolean} [options.uid] If `true` then uses UID {@link SequenceString} instead of sequence numbers\n * @returns {Promise<CopyResponseObject>} info about copies messages\n *\n * @example\n * await client.mailboxOpen('INBOX');\n * // copy all messages to a mailbox called \"Backup\" (must exist)\n * let result = await client.messageCopy('1:*', 'Backup');\n * console.log('Copied %s messages', result.uidMap.size);\n */\n async messageCopy(range, destination, options) {\n options = options || {};\n range = await this.resolveRange(range, options);\n if (!range) {\n return false;\n }\n return await this.run('COPY', range, destination, options);\n }\n\n /**\n * Moves messages from current mailbox to destination mailbox\n *\n * @param {SequenceString | Number[] | SearchObject} range Range of messages to move\n * @param {String} destination Mailbox path to move the messages to\n * @param {Object} [options]\n * @param {Boolean} [options.uid] If `true` then uses UID {@link SequenceString} instead of sequence numbers\n * @returns {Promise<CopyResponseObject>} info about moved messages\n *\n * @example\n * await client.mailboxOpen('INBOX');\n * // move all messages to a mailbox called \"Trash\" (must exist)\n * let result = await client.messageMove('1:*', 'Trash');\n * console.log('Moved %s messages', result.uidMap.size);\n */\n async messageMove(range, destination, options) {\n options = options || {};\n range = await this.resolveRange(range, options);\n if (!range) {\n return false;\n }\n return await this.run('MOVE', range, destination, options);\n }\n\n /**\n * Search messages from the currently opened mailbox\n *\n * @param {SearchObject} query Query to filter the messages\n * @param {Object} [options]\n * @param {Boolean} [options.uid] If `true` then returns UID numbers instead of sequence numbers\n * @returns {Promise<Number[]>} An array of sequence or UID numbers\n *\n * @example\n * let mailbox = await client.mailboxOpen('INBOX');\n * // find all unseen messages\n * let list = await client.search({seen: false});\n * // use OR modifier (array of 2 or more search queries)\n * let list = await client.search({\n * seen: false,\n * or: [\n * {flagged: true},\n * {from: 'andris'},\n * {subject: 'test'}\n * ]});\n */\n async search(query, options) {\n if (!this.mailbox) {\n // no mailbox selected, nothing to do\n return;\n }\n\n let response = await this.run('SEARCH', query, options);\n\n if (!response) {\n return false;\n }\n\n return response;\n }\n\n /**\n * @typedef {Object} FetchQueryObject\n * @global\n * @property {Boolean} [uid] if `true` then include UID in the response\n * @property {Boolean} [flags] if `true` then include flags Set in the response. Also adds `flagColor` to the response if the message is flagged.\n * @property {Boolean} [bodyStructure] if `true` then include parsed BODYSTRUCTURE object in the response\n * @property {Boolean} [envelope] if `true` then include parsed ENVELOPE object in the response\n * @property {Boolean} [internalDate] if `true` then include internal date value in the response\n * @property {Boolean} [size] if `true` then include message size in the response\n * @property {boolean | Object} [source] if `true` then include full message in the response\n * @property {Number} [source.start] include full message in the response starting from *start* byte\n * @property {Number} [source.maxLength] include full message in the response, up to *maxLength* bytes\n * @property {String} [threadId] if `true` then include thread ID in the response (only if server supports either `OBJECTID` or `X-GM-EXT-1` extensions)\n * @property {Boolean} [labels] if `true` then include GMail labels in the response (only if server supports `X-GM-EXT-1` extension)\n * @property {boolean | string[]} [headers] if `true` then includes full headers of the message in the response. If the value is an array of header keys then includes only headers listed in the array\n * @property {string[]} [bodyParts] An array of BODYPART identifiers to include in the response\n */\n\n /**\n * Parsed email address entry\n *\n * @typedef {Object} MessageAddressObject\n * @global\n * @property {String} [name] name of the address object (unicode)\n * @property {String} [address] email address\n */\n\n /**\n * Parsed IMAP ENVELOPE object\n *\n * @typedef {Object} MessageEnvelopeObject\n * @global\n * @property {Date} [date] header date\n * @property {String} [subject] message subject (unicode)\n * @property {String} [messageId] Message ID of the message\n * @property {String} [inReplyTo] Message ID from In-Reply-To header\n * @property {MessageAddressObject[]} [from] Array of addresses from the From: header\n * @property {MessageAddressObject[]} [sender] Array of addresses from the Sender: header\n * @property {MessageAddressObject[]} [replyTo] Array of addresses from the Reply-To: header\n * @property {MessageAddressObject[]} [to] Array of addresses from the To: header\n * @property {MessageAddressObject[]} [cc] Array of addresses from the Cc: header\n * @property {MessageAddressObject[]} [bcc] Array of addresses from the Bcc: header\n */\n\n /**\n * Parsed IMAP BODYSTRUCTURE object\n *\n * @typedef {Object} MessageStructureObject\n * @global\n * @property {String} part Body part number. This value can be used to later fetch the contents of this part of the message\n * @property {String} type Content-Type of this node\n * @property {Object} [parameters] Additional parameters for Content-Type, eg \"charset\"\n * @property {String} [id] Content-ID\n * @property {String} [encoding] Transfer encoding\n * @property {Number} [size] Expected size of the node\n * @property {MessageEnvelopeObject} [envelope] message envelope of embedded RFC822 message\n * @property {String} [disposition] Content disposition\n * @property {Object} [dispositionParameters] Additional parameters for Content-Disposition\n * @property {MessageStructureObject[]} childNodes An array of child nodes if this is a multipart node. Not present for normal nodes\n */\n\n /**\n * Fetched message data\n *\n * @typedef {Object} FetchMessageObject\n * @global\n * @property {Number} seq message sequence number. Always included in the response\n * @property {Number} uid message UID number. Always included in the response\n * @property {Buffer} [source] message source for the requested byte range\n * @property {BigInt} [modseq] message Modseq number. Always included if the server supports CONDSTORE extension\n * @property {String} [emailId] unique email ID. Always included if server supports `OBJECTID` or `X-GM-EXT-1` extensions\n * @property {String} [threadid] unique thread ID. Only present if server supports `OBJECTID` or `X-GM-EXT-1` extension\n * @property {Set<string>} [labels] a Set of labels. Only present if server supports `X-GM-EXT-1` extension\n * @property {Number} [size] message size\n * @property {Set<string>} [flags] a set of message flags\n * @property {String} [flagColor] flag color like \"red\", or \"yellow\". This value is derived from the `flags` Set and it uses the same color rules as Apple Mail\n * @property {MessageEnvelopeObject} [envelope] message envelope\n * @property {MessageStructureObject} [bodyStructure] message body structure\n * @property {Date} [internalDate] message internal date\n * @property {Map<string, Buffer>} [bodyParts] a Map of message body parts where key is requested part identifier and value is a Buffer\n * @property {Buffer} [headers] Requested header lines as Buffer\n */\n\n /**\n * Fetch messages from the currently opened mailbox\n *\n * @param {SequenceString | Number[] | SearchObject} range Range of messages to fetch\n * @param {FetchQueryObject} query Fetch query\n * @param {Object} [options]\n * @param {Boolean} [options.uid] If `true` then uses UID numbers instead of sequence numbers for `range`\n * @param {BigInt} [options.changedSince] If set then only messages with a higher modseq value are returned. Ignored if server does not support `CONDSTORE` extension.\n * @param {Boolean} [options.binary=false] If `true` then requests a binary response if the server supports this\n * @yields {Promise<FetchMessageObject>} Message data object\n *\n * @example\n * let mailbox = await client.mailboxOpen('INBOX');\n * // fetch UID for all messages in a mailbox\n * for await (let msg of client.fetch('1:*', {uid: true})){\n * console.log(msg.uid);\n * // NB! You can not run any IMAP commands in this loop\n * // otherwise you will end up in a deadloop\n * }\n */\n async *fetch(range, query, options) {\n options = options || {};\n\n if (!this.mailbox) {\n // no mailbox selected, nothing to do\n return;\n }\n\n range = await this.resolveRange(range, options);\n if (!range) {\n return false;\n }\n\n let finished = false;\n let push = false;\n let rowQueue = [];\n\n let getNext = () =>\n new Promise((resolve, reject) => {\n let check = () => {\n if (rowQueue.length) {\n let entry = rowQueue.shift();\n if (entry.err) {\n return reject(entry.err);\n } else {\n return resolve(entry.value);\n }\n }\n\n if (finished) {\n return resolve(null);\n }\n\n // wait until data is pushed to queue and try again\n push = () => {\n push = false;\n check();\n };\n };\n check();\n });\n\n this.run('FETCH', range, query, {\n uid: !!options.uid,\n binary: options.binary,\n changedSince: options.changedSince,\n onUntaggedFetch: (untagged, next) => {\n rowQueue.push({\n value: {\n response: untagged,\n next\n }\n });\n if (typeof push === 'function') {\n push();\n }\n }\n })\n .then(() => {\n finished = true;\n if (typeof push === 'function') {\n push();\n }\n })\n .catch(err => {\n rowQueue.push({ err });\n if (typeof push === 'function') {\n push();\n }\n });\n\n let res;\n while ((res = await getNext())) {\n if (this.isClosed || this.socket.destroyed) {\n let error = new Error('Connection closed');\n error.code = 'EConnectionClosed';\n throw error;\n }\n\n if (res !== null) {\n yield res.response;\n res.next();\n }\n }\n\n if (!finished) {\n // FETCH never finished!\n let error = new Error('FETCH did not finish');\n error.code = 'ENotFinished';\n throw error;\n }\n }\n\n /**\n * Fetch messages from the currently opened mailbox.\n *\n * This method will fetch all messages before resolving the promise, unlike .fetch(), which\n * is an async generator. Do not use large ranges like 1:*, as this might exhaust all available\n * memory if the mailbox contains a large number of emails.\n * @param {SequenceString | Number[] | SearchObject} range Range of messages to fetch\n * @param {FetchQueryObject} query Fetch query\n * @param {Object} [options]\n * @param {Boolean} [options.uid] If `true` then uses UID numbers instead of sequence numbers for `range`\n * @param {BigInt} [options.changedSince] If set then only messages with a higher modseq value are returned. Ignored if server does not support `CONDSTORE` extension.\n * @param {Boolean} [options.binary=false] If `true` then requests a binary response if the server supports this\n * @returns {Promise<FetchMessageObject[]>} Array of Message data object\n *\n * @example\n * let mailbox = await client.mailboxOpen('INBOX');\n * // fetch UID for all messages in a mailbox\n * const messages = await client.fetchAll('1:*', {uid: true});\n * for (let msg of messages){\n * console.log(msg.uid);\n * }\n */\n async fetchAll(range, query, options) {\n const results = [];\n const generator = this.fetch(range, query, options);\n for await (const message of generator) {\n results.push(message);\n }\n return results;\n }\n\n /**\n * Fetch a single message from the currently opened mailbox\n *\n * @param {SequenceString} seq Single UID or sequence number of the message to fetch for\n * @param {FetchQueryObject} query Fetch query\n * @param {Object} [options]\n * @param {Boolean} [options.uid] If `true` then uses UID number instead of sequence number for `seq`\n * @param {Boolean} [options.binary=false] If `true` then requests a binary response if the server supports this\n * @returns {Promise<FetchMessageObject>} Message data object\n *\n * @example\n * let mailbox = await client.mailboxOpen('INBOX');\n * // fetch UID for the last email in the selected mailbox\n * let lastMsg = await client.fetchOne('*', {uid: true})\n * console.log(lastMsg.uid);\n */\n async fetchOne(seq, query, options) {\n if (!this.mailbox) {\n // no mailbox selected, nothing to do\n return;\n }\n\n if (seq === '*') {\n if (!this.mailbox.exists) {\n return false;\n }\n seq = this.mailbox.exists.toString();\n options = Object.assign({}, options || {}, { uid: false }); // force into a sequence query\n }\n\n let response = await this.run('FETCH', (seq || '').toString(), query, options);\n\n if (!response || !response.list || !response.list.length) {\n return false;\n }\n\n return response.list[0];\n }\n\n /**\n * @typedef {Object} DownloadObject\n * @global\n * @property {Object} meta content metadata\n * @property {number} meta.expectedSize The fetch response size\n * @property {String} meta.contentType Content-Type of the streamed file. If part was not set then this value is \"message/rfc822\"\n * @property {String} [meta.charset] Charset of the body part. Text parts are automatically converted to UTF-8, attachments are kept as is\n * @property {String} [meta.disposition] Content-Disposition of the streamed file\n * @property {String} [meta.filename] Filename of the streamed body part\n * @property {ReadableStream} content Streamed content\n */\n\n /**\n * Download either full rfc822 formatted message or a specific bodystructure part as a Stream.\n * Bodystructure parts are decoded so the resulting stream is a binary file. Text content\n * is automatically converted to UTF-8 charset.\n *\n * @param {SequenceString} range UID or sequence number for the message to fetch\n * @param {String} [part] If not set then downloads entire rfc822 formatted message, otherwise downloads specific bodystructure part\n * @param {Object} [options]\n * @param {Boolean} [options.uid] If `true` then uses UID number instead of sequence number for `range`\n * @param {number} [options.maxBytes] If set then limits download size to specified bytes\n * @param {number} [options.chunkSize=65536] How large content parts to ask from the server\n * @returns {Promise<DownloadObject>} Download data object\n *\n * @example\n * let mailbox = await client.mailboxOpen('INBOX');\n * // download body part nr '1.2' from latest message\n * let {meta, content} = await client.download('*', '1.2');\n * content.pipe(fs.createWriteStream(meta.filename));\n */\n async download(range, part, options) {\n if (!this.mailbox) {\n // no mailbox selected, nothing to do\n return {};\n }\n\n options = Object.assign(\n {\n chunkSize: 64 * 1024,\n maxBytes: Infinity\n },\n options || {}\n );\n\n let hasMore = true;\n let processed = 0;\n\n let chunkSize = Number(options.chunkSize) || 64 * 1024;\n let maxBytes = Number(options.maxBytes) || Infinity;\n\n let uid = false;\n\n if (part === '1') {\n // First part has special conditions for single node emails as\n // the mime parts for root node are not 1 and 1.MIME but TEXT and HEADERS\n let response = await this.fetchOne(range, { uid: true, bodyStructure: true }, options);\n\n if (!response) {\n return { response: false, chunk: false };\n }\n\n if (!uid && response.uid) {\n uid = response.uid;\n // force UID from now on even if first range was a sequence number\n range = uid;\n options.uid = true;\n }\n\n if (!response.bodyStructure.childNodes) {\n // single text message\n part = 'TEXT';\n }\n }\n\n let getNextPart = async query => {\n query = query || {};\n\n let mimeKey;\n\n if (!part) {\n query.source = {\n start: processed,\n maxLength: chunkSize\n };\n } else {\n part = part.toString().toLowerCase().trim();\n\n if (!query.bodyParts) {\n query.bodyParts = [];\n }\n\n if (query.size) {\n if (/^[\\d.]+$/.test(part)) {\n // fetch meta as well\n mimeKey = part + '.mime';\n query.bodyParts.push(mimeKey);\n } else if (part === 'text') {\n mimeKey = 'header';\n query.bodyParts.push(mimeKey);\n }\n }\n\n query.bodyParts.push({\n key: part,\n start: processed,\n maxLength: chunkSize\n });\n }\n\n let response = await this.fetchOne(range, query, options);\n\n if (!response) {\n return { response: false, chunk: false };\n }\n\n if (!uid && response.uid) {\n uid = response.uid;\n // force UID from now on even if first range was a sequence number\n range = uid;\n options.uid = true;\n }\n\n let chunk = !part ? response.source : response.bodyParts && response.bodyParts.get(part);\n if (!chunk) {\n return {};\n }\n\n processed += chunk.length;\n hasMore = chunk.length >= chunkSize;\n\n let result = { chunk };\n if (query.size) {\n result.response = response;\n }\n\n if (query.bodyParts) {\n if (mimeKey === 'header') {\n result.mime = response.headers;\n } else {\n result.mime = response.bodyParts.get(mimeKey);\n }\n }\n\n return result;\n };\n\n let { response, chunk, mime } = await getNextPart({\n size: true,\n uid: true\n });\n\n if (!response || !chunk) {\n // ???\n return {};\n }\n\n let meta = {\n expectedSize: response.size\n };\n\n if (!part) {\n meta.contentType = 'message/rfc822';\n } else if (mime) {\n let headers = new Headers(mime);\n let contentType = libmime.parseHeaderValue(headers.getFirst('Content-Type'));\n let transferEncoding = libmime.parseHeaderValue(headers.getFirst('Content-Transfer-Encoding'));\n let disposition = libmime.parseHeaderValue(headers.getFirst('Content-Disposition'));\n\n if (contentType.value.toLowerCase().trim()) {\n meta.contentType = contentType.value.toLowerCase().trim();\n }\n\n if (contentType.params.charset) {\n meta.charset = contentType.params.charset.toLowerCase().trim();\n }\n\n if (transferEncoding.value) {\n meta.encoding = transferEncoding.value\n .replace(/\\(.*\\)/g, '')\n .toLowerCase()\n .trim();\n }\n\n if (disposition.value) {\n meta.disposition = disposition.value.toLowerCase().trim() || false;\n try {\n meta.disposition = libmime.decodeWords(meta.disposition);\n } catch (err) {\n // failed to parse disposition, keep as is (most probably an unknown charset is used)\n }\n }\n\n if (contentType.params.format && contentType.params.format.toLowerCase().trim() === 'flowed') {\n meta.flowed = true;\n if (contentType.params.delsp && contentType.params.delsp.toLowerCase().trim() === 'yes') {\n meta.delSp = true;\n }\n }\n\n let filename = disposition.params.filename || contentType.params.name || false;\n if (filename) {\n try {\n filename = libmime.decodeWords(filename);\n } catch (err) {\n // failed to parse filename, keep as is (most probably an unknown charset is used)\n }\n meta.filename = filename;\n }\n }\n\n let stream;\n let output;\n\n switch (meta.encoding) {\n case 'base64':\n output = stream = new libbase64.Decoder();\n break;\n case 'quoted-printable':\n output = stream = new libqp.Decoder();\n break;\n default:\n output = stream = new PassThrough();\n }\n\n let isTextNode = ['text/html', 'text/plain', 'text/x-amp-html'].includes(meta.contentType) || (part === '1' && !meta.contentType);\n if ((!meta.disposition || meta.disposition === 'inline') && isTextNode) {\n // flowed text\n if (meta.flowed) {\n let flowDecoder = new FlowedDecoder({\n delSp: meta.delSp\n });\n output.on('error', err => {\n flowDecoder.emit('error', err);\n });\n output = output.pipe(flowDecoder);\n }\n\n // not utf-8 text\n if (meta.charset && !['ascii', 'usascii', 'utf8'].includes(meta.charset.toLowerCase().replace(/[^a-z0-9]+/g, ''))) {\n try {\n let decoder = getDecoder(meta.charset);\n output.on('error', err => {\n decoder.emit('error', err);\n });\n output = output.pipe(decoder);\n // force to utf-8 for output\n meta.charset = 'utf-8';\n } catch (E) {\n // do not decode charset\n }\n }\n }\n\n let limiter = new LimitedPassthrough({ maxBytes });\n output.on('error', err => {\n limiter.emit('error', err);\n });\n output = output.pipe(limiter);\n\n let writeChunk = chunk => {\n if (limiter.limited) {\n return true;\n }\n return stream.write(chunk);\n };\n\n let fetchAllParts = async () => {\n while (hasMore && !limiter.limited) {\n let { chunk } = await getNextPart();\n if (!chunk) {\n break;\n }\n\n if (writeChunk(chunk) === false) {\n await new Promise(resolve => stream.once('drain', resolve));\n }\n }\n };\n\n setImmediate(() => {\n writeChunk(chunk);\n fetchAllParts()\n .catch(err => stream.emit('error', err))\n .finally(() => stream.end());\n });\n\n return {\n meta,\n content: output\n };\n }\n\n /**\n * Fetch multiple attachments as Buffer values\n *\n * @param {SequenceString} range UID or sequence number for the message to fetch\n * @param {String} parts A list of bodystructure parts\n * @param {Object} [options]\n * @param {Boolean} [options.uid] If `true` then uses UID number instead of sequence number for `range`\n * @returns {Promise<Object>} Download data object\n *\n * @example\n * let mailbox = await client.mailboxOpen('INBOX');\n * // download body parts '2', and '3' from all messages in the selected mailbox\n * let response = await client.downloadMany('*', ['2', '3']);\n * process.stdout.write(response[2].content)\n * process.stdout.write(response[3].content)\n */\n async downloadMany(range, parts, options) {\n if (!this.mailbox) {\n // no mailbox selected, nothing to do\n return {};\n }\n\n options = Object.assign(\n {\n chunkSize: 64 * 1024,\n maxBytes: Infinity\n },\n options || {}\n );\n\n let query = { bodyParts: [] };\n\n for (let part of parts) {\n query.bodyParts.push(part + '.mime');\n query.bodyParts.push(part);\n }\n\n let response = await this.fetchOne(range, query, options);\n\n if (!response || !response.bodyParts) {\n return { response: false };\n }\n\n let data = {};\n\n for (let [part, content] of response.bodyParts) {\n let keyParts = part.split('.mime');\n if (keyParts.length === 1) {\n // content\n let key = keyParts[0];\n if (!data[key]) {\n data[key] = { content };\n } else {\n data[key].content = content;\n }\n } else if (keyParts.length === 2) {\n // header\n let key = keyParts[0];\n if (!data[key]) {\n data[key] = {};\n }\n if (!data[key].meta) {\n data[key].meta = {};\n }\n\n let headers = new Headers(content);\n let contentType = libmime.parseHeaderValue(headers.getFirst('Content-Type'));\n let transferEncoding = libmime.parseHeaderValue(headers.getFirst('Content-Transfer-Encoding'));\n let disposition = libmime.parseHeaderValue(headers.getFirst('Content-Disposition'));\n\n if (contentType.value.toLowerCase().trim()) {\n data[key].meta.contentType = contentType.value.toLowerCase().trim();\n }\n\n if (contentType.params.charset) {\n data[key].meta.charset = contentType.params.charset.toLowerCase().trim();\n }\n\n if (transferEncoding.value) {\n data[key].meta.encoding = transferEncoding.value\n .replace(/\\(.*\\)/g, '')\n .toLowerCase()\n .trim();\n }\n\n if (disposition.value) {\n data[key].meta.disposition = disposition.value.toLowerCase().trim() || false;\n try {\n data[key].meta.disposition = libmime.decodeWords(data[key].meta.disposition);\n } catch (err) {\n // failed to parse disposition, keep as is (most probably an unknown charset is used)\n }\n }\n\n if (contentType.params.format && contentType.params.format.toLowerCase().trim() === 'flowed') {\n data[key].meta.flowed = true;\n if (contentType.params.delsp && contentType.params.delsp.toLowerCase().trim() === 'yes') {\n data[key].meta.delSp = true;\n }\n }\n\n let filename = disposition.params.filename || contentType.params.name || false;\n if (filename) {\n try {\n filename = libmime.decodeWords(filename);\n } catch (err) {\n // failed to parse filename, keep as is (most probably an unknown charset is used)\n }\n data[key].meta.filename = filename;\n }\n }\n }\n\n for (let part of Object.keys(data)) {\n let meta = data[part].meta;\n\n switch (meta.encoding) {\n case 'base64':\n data[part].content = data[part].content ? libbase64.decode(data[part].content.toString()) : null;\n break;\n case 'quoted-printable':\n data[part].content = data[part].content ? libqp.decode(data[part].content.toString()) : null;\n break;\n default:\n // keep as is, already a buffer\n }\n }\n\n return data;\n }\n\n async run(command, ...args) {\n command = command.toUpperCase();\n if (!this.commands.has(command)) {\n return false;\n }\n\n if (this.socket.destroyed) {\n const error = new Error('Connection not available');\n error.code = 'NoConnection';\n throw error;\n }\n\n clearTimeout(this.idleStartTimer);\n\n if (typeof this.preCheck === 'function') {\n await this.preCheck();\n }\n\n let handler = this.commands.get(command);\n\n let result = await handler(this, ...args);\n\n if (command !== 'IDLE') {\n // do not autostart IDLE, if IDLE itself was stopped\n this.autoidle();\n }\n\n return result;\n }\n\n async processLocks(force) {\n if (!force && this.processingLock) {\n this.log.trace({\n msg: 'Mailbox locking queued',\n path: this.mailbox && this.mailbox.path,\n pending: this.locks.length,\n idling: this.idling,\n activeLock: this.currentLock\n ? {\n lockId: this.currentLock.lockId,\n ...(this.currentLock.options?.description && { description: this.currentLock.options?.description })\n }\n : null\n });\n return;\n }\n\n if (!this.locks.length) {\n this.processingLock = false;\n this.log.trace({\n msg: 'Mailbox locking queue processed',\n idling: this.idling\n });\n return;\n }\n\n this.processingLock = true;\n\n const release = () => {\n if (this.currentLock) {\n this.log.trace({\n msg: 'Mailbox lock released',\n lockId: this.currentLock.lockId,\n path: this.mailbox && this.mailbox.path,\n pending: this.locks.length,\n idling: this.idling\n });\n this.currentLock = false;\n }\n this.processLocks(true).catch(err => this.log.error({ err, cid: this.id }));\n };\n\n const lock = this.locks.shift();\n const { resolve, reject, path, options, lockId } = lock;\n\n if (!this.usable || this.socket.destroyed) {\n this.log.trace({ msg: 'Failed to acquire mailbox lock', path, lockId, idling: this.idling });\n // reject all\n let error = new Error('Connection not available');\n error.code = 'NoConnection';\n reject(error);\n return await this.processLocks(true);\n }\n\n if (this.mailbox && this.mailbox.path === path && !!this.mailbox.readOnly === !!options.readOnly) {\n // nothing to do here, already selected\n this.log.trace({\n msg: 'Mailbox lock acquired [existing]',\n path,\n lockId,\n idling: this.idling,\n ...(options.description && { description: options.description })\n });\n this.currentLock = lock;\n return resolve({ path, release });\n } else {\n try {\n // Try to open. Throws if mailbox does not exists or can't open\n await this.mailboxOpen(path, options);\n this.log.trace({\n msg: 'Mailbox lock acquired [selected]',\n path,\n lockId,\n idling: this.idling,\n ...(options.description && { description: options.description })\n });\n this.currentLock = lock;\n return resolve({ path, release });\n } catch (err) {\n if (err.responseStatus === 'NO') {\n try {\n let folders = await this.run('LIST', '', path, { listOnly: true });\n if (!folders || !folders.length) {\n err.mailboxMissing = true;\n }\n } catch (E) {\n this.log.trace({ msg: 'Failed to verify failed mailbox', path, err: E });\n }\n }\n\n this.log.trace({\n msg: 'Failed to acquire mailbox lock',\n path,\n lockId,\n idling: this.idling,\n ...(options.description && { description: options.description }),\n err\n });\n reject(err);\n await this.processLocks(true);\n }\n }\n }\n\n /**\n * Opens a mailbox if not already open and returns a lock. Next call to `getMailboxLock()` is queued\n * until previous lock is released. This is suggested over {@link module:imapflow~ImapFlow#mailboxOpen|mailboxOpen()} as\n * `getMailboxLock()` gives you a weak transaction while `mailboxOpen()` has no guarantees whatsoever that another\n * mailbox is opened while you try to call multiple fetch or store commands.\n *\n * @param {string|array} path **Path for the mailbox** to open\n * @param {Object} [options] optional options\n * @param {Boolean} [options.readOnly=false] If `true` then opens mailbox in read-only mode. You can still try to perform write operations but these would probably fail.\n * @returns {Promise<MailboxLockObject>} Mailbox lock\n * @throws Will throw an error if mailbox does not exist or can not be opened\n *\n * @example\n * let lock = await client.getMailboxLock('INBOX');\n * try {\n * // do something in the mailbox\n * } finally {\n * // use finally{} to make sure lock is released even if exception occurs\n * lock.release();\n * }\n */\n async getMailboxLock(path, options) {\n options = options || {};\n\n path = normalizePath(this, path);\n\n let lockId = ++this.lockCounter;\n this.log.trace({\n msg: 'Requesting lock',\n path,\n lockId,\n ...(options.description && { description: options.description }),\n activeLock: this.currentLock\n ? {\n lockId: this.currentLock.lockId,\n ...(this.currentLock.options?.description && { description: this.currentLock.options?.description })\n }\n : null\n });\n\n return await new Promise((resolve, reject) => {\n this.locks.push({ resolve, reject, path, options, lockId });\n this.processLocks().catch(err => reject(err));\n });\n }\n\n getLogger() {\n let mainLogger =\n this.options.logger && typeof this.options.logger === 'object'\n ? this.options.logger\n : logger.child({\n component: 'imap-connection',\n cid: this.id\n });\n\n let synteticLogger = {};\n let levels = ['trace', 'debug', 'info', 'warn', 'error', 'fatal'];\n for (let level of levels) {\n synteticLogger[level] = (...args) => {\n // using {logger:false} disables logging\n if (this.options.logger !== false) {\n if (logger)\n if (typeof mainLogger[level] !== 'function') {\n // we are checking to make sure the level is supported.\n // if it isn't supported but the level is error or fatal, log to console anyway.\n if (level === 'fatal' || level === 'error') {\n console.log(JSON.stringify(...args));\n }\n } else {\n mainLogger[level](...args);\n }\n }\n\n if (this.emitLogs && args && args[0] && typeof args[0] === 'object') {\n let logEntry = Object.assign({ level, t: Date.now(), cid: this.id, lo: ++this.lo }, args[0]);\n if (logEntry.err && typeof logEntry.err === 'object') {\n let err = logEntry.err;\n logEntry.err = {\n stack: err.stack\n };\n // enumerable error fields\n Object.keys(err).forEach(key => {\n logEntry.err[key] = err[key];\n });\n }\n this.emit('log', logEntry);\n }\n };\n }\n\n return synteticLogger;\n }\n\n unbind() {\n this.socket.unpipe(this.streamer);\n if (this._inflate) {\n this._inflate.unpipe(this.streamer);\n }\n\n this.socket.removeListener('error', this._socketError);\n this.socket.removeListener('close', this._socketClose);\n this.socket.removeListener('end', this._socketEnd);\n this.socket.removeListener('tlsClientError', this._socketError);\n this.socket.removeListener('timeout', this._socketTimeout);\n\n return {\n readSocket: this._inflate || this.socket,\n writeSocket: this.writeSocket || this.socket\n };\n }\n}\n\n/**\n * Connection close event. **NB!** ImapFlow does not handle reconnects automatically.\n * So whenever a 'close' event occurs you must create a new connection yourself.\n *\n * @event module:imapflow~ImapFlow#close\n */\n\n/**\n * Error event. In most cases getting an error event also means that connection is closed\n * and pending operations should return with a failure.\n *\n * @event module:imapflow~ImapFlow#error\n * @type {Error}\n * @example\n * client.on('error', err=>{\n * console.log(`Error occurred: ${err.message}`);\n * });\n */\n\n/**\n * Message count in currently opened mailbox changed\n *\n * @event module:imapflow~ImapFlow#exists\n * @type {Object}\n * @property {String} path mailbox path this event applies to\n * @property {Number} count updated count of messages\n * @property {Number} prevCount message count before this update\n * @example\n * client.on('exists', data=>{\n * console.log(`Message count in \"${data.path}\" is ${data.count}`);\n * });\n */\n\n/**\n * Deleted message sequence number in currently opened mailbox. One event is fired for every deleted email.\n *\n * @event module:imapflow~ImapFlow#expunge\n * @type {Object}\n * @property {String} path mailbox path this event applies to\n * @property {Number} seq sequence number of deleted message\n * @example\n * client.on('expunge', data=>{\n * console.log(`Message #${data.seq} was deleted from \"${data.path}\"`);\n * });\n */\n\n/**\n * Flags were updated for a message. Not all servers fire this event.\n *\n * @event module:imapflow~ImapFlow#flags\n * @type {Object}\n * @property {String} path mailbox path this event applies to\n * @property {Number} seq sequence number of updated message\n * @property {Number} [uid] UID number of updated message (if server provided this value)\n * @property {BigInt} [modseq] Updated modseq number for the mailbox (if server provided this value)\n * @property {Set<string>} flags A set of all flags for the updated message\n * @example\n * client.on('flags', data=>{\n * console.log(`Flag set for #${data.seq} is now \"${Array.from(data.flags).join(', ')}\"`);\n * });\n */\n\n/**\n * Mailbox was opened\n *\n * @event module:imapflow~ImapFlow#mailboxOpen\n * @type {MailboxObject}\n * @example\n * client.on('mailboxOpen', mailbox => {\n * console.log(`Mailbox ${mailbox.path} was opened`);\n * });\n */\n\n/**\n * Mailbox was closed\n *\n * @event module:imapflow~ImapFlow#mailboxClose\n * @type {MailboxObject}\n * @example\n * client.on('mailboxClose', mailbox => {\n * console.log(`Mailbox ${mailbox.path} was closed`);\n * });\n */\n\n/**\n * Log event if `emitLogs=true`\n *\n * @event module:imapflow~ImapFlow#log\n * @type {Object}\n * @example\n * client.on('log', entry => {\n * console.log(`${log.cid} ${log.msg}`);\n * });\n */\n\nmodule.exports.ImapFlow = ImapFlow;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHJzYykvLi9ub2RlX21vZHVsZXMvaW1hcGZsb3cvbGliL2ltYXAtZmxvdy5qcyIsIm1hcHBpbmdzIjoiQUFBYTs7QUFFYjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLFlBQVksbUJBQU8sQ0FBQyxnQkFBSztBQUN6QixZQUFZLG1CQUFPLENBQUMsZ0JBQUs7QUFDekIsZUFBZSxtQkFBTyxDQUFDLHNCQUFRO0FBQy9CLFFBQVEsZUFBZSxFQUFFLG1CQUFPLENBQUMsc0JBQVE7QUFDekMsZUFBZSxtQkFBTyxDQUFDLDZEQUFVO0FBQ2pDLGdCQUFnQixtQkFBTyxDQUFDLDREQUFTO0FBQ2pDLGFBQWEsbUJBQU8sQ0FBQyxrQkFBTTtBQUMzQixRQUFRLFVBQVUsRUFBRSxtQkFBTyxDQUFDLGdGQUFXO0FBQ3ZDLFFBQVEscUJBQXFCLEVBQUUsbUJBQU8sQ0FBQyx1RkFBdUI7O0FBRTlELFFBQVEsYUFBYSxFQUFFLG1CQUFPLENBQUMsdUZBQXVCO0FBQ3RELFFBQVEsbUJBQW1CLEVBQUUsbUJBQU8sQ0FBQyx5RkFBd0I7QUFDN0Qsb0JBQW9CLG1CQUFPLENBQUMsbUVBQWlCOztBQUU3QyxjQUFjLG1CQUFPLENBQUMsc0RBQU87QUFDN0Isa0JBQWtCLG1CQUFPLENBQUMsa0VBQVc7QUFDckMsc0JBQXNCLG1CQUFPLENBQUMsZ0hBQThCO0FBQzVELFFBQVEsY0FBYyxFQUFFLG1CQUFPLENBQUMsc0JBQVE7O0FBRXhDLFFBQVEsa0JBQWtCLEVBQUUsbUJBQU8sQ0FBQyxpRkFBb0I7O0FBRXhEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFLEVBQUUsbUJBQU8sQ0FBQywyREFBUzs7QUFFckIscUJBQXFCLG1CQUFPLENBQUMsOEVBQW9COztBQUVqRDtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCO0FBQ0EsY0FBYyxRQUFRO0FBQ3RCLGNBQWMsUUFBUTtBQUN0QixjQUFjLGFBQWE7QUFDM0IsY0FBYyxRQUFRO0FBQ3RCLGNBQWMsU0FBUztBQUN2QixjQUFjLFNBQVM7QUFDdkIsY0FBYyxhQUFhO0FBQzNCLGNBQWMsUUFBUTtBQUN0QixjQUFjLFFBQVE7QUFDdEIsY0FBYyxRQUFRO0FBQ3RCLGNBQWMsUUFBUTtBQUN0QixjQUFjLFFBQVE7QUFDdEIsY0FBYyxRQUFRO0FBQ3RCOztBQUVBO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCO0FBQ0EsY0FBYyxRQUFRO0FBQ3RCLGNBQWMsVUFBVTtBQUN4QjtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTCxzQkFBc0I7QUFDdEI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxhQUFhLFFBQVE7QUFDckI7QUFDQSxjQUFjLFFBQVE7QUFDdEIsY0FBYyxRQUFRO0FBQ3RCLGNBQWMsUUFBUTtBQUN0QixjQUFjLFFBQVE7QUFDdEIsY0FBYyxRQUFRO0FBQ3RCLGNBQWMsTUFBTTtBQUNwQjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0IsUUFBUTtBQUMxQjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLFFBQVE7QUFDMUI7QUFDQTtBQUNBLGtCQUFrQixRQUFRO0FBQzFCO0FBQ0E7QUFDQSxrQkFBa0IsU0FBUztBQUMzQjtBQUNBO0FBQ0E7QUFDQSxrQkFBa0IsU0FBUztBQUMzQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQixRQUFRO0FBQzFCO0FBQ0E7QUFDQSxrQkFBa0IsU0FBUztBQUMzQjtBQUNBO0FBQ0Esa0JBQWtCLFFBQVE7QUFDMUIsK0VBQStFLGNBQWM7QUFDN0Y7QUFDQSxrQkFBa0IsUUFBUTtBQUMxQjtBQUNBO0FBQ0Esa0JBQWtCLFFBQVE7QUFDMUI7QUFDQTtBQUNBLGtCQUFrQixRQUFRO0FBQzFCO0FBQ0E7QUFDQSxrQkFBa0IsUUFBUTtBQUMxQjtBQUNBO0FBQ0E7QUFDQSxrQkFBa0IsY0FBYztBQUNoQztBQUNBO0FBQ0Esa0JBQWtCLFNBQVM7QUFDM0I7QUFDQTtBQUNBLGtCQUFrQixRQUFRO0FBQzFCO0FBQ0E7QUFDQSxrQkFBa0IsU0FBUztBQUMzQjtBQUNBO0FBQ0Esa0JBQWtCLFFBQVE7QUFDMUI7QUFDQTtBQUNBLGtCQUFrQixRQUFRO0FBQzFCO0FBQ0E7QUFDQSxrQkFBa0IsZ0JBQWdCO0FBQ2xDO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQixTQUFTO0FBQzNCO0FBQ0E7QUFDQSxrQkFBa0IsU0FBUztBQUMzQjtBQUNBO0FBQ0Esa0JBQWtCLFNBQVM7QUFDM0I7QUFDQTtBQUNBLGtCQUFrQixRQUFRO0FBQzFCO0FBQ0E7QUFDQSxrQkFBa0IsU0FBUztBQUMzQjtBQUNBO0FBQ0Esa0JBQWtCLFFBQVE7QUFDMUI7QUFDQTtBQUNBLGtCQUFrQixRQUFRO0FBQzFCO0FBQ0E7QUFDQSxrQkFBa0IsU0FBUztBQUMzQjtBQUNBO0FBQ0Esa0JBQWtCLFNBQVM7QUFDM0I7QUFDQTtBQUNBLGtCQUFrQixRQUFRO0FBQzFCO0FBQ0E7QUFDQSxrQkFBa0IsUUFBUTtBQUMxQjtBQUNBO0FBQ0Esa0JBQWtCLFFBQVE7QUFDMUI7QUFDQTs7QUFFQTtBQUNBLGdCQUFnQix5QkFBeUI7O0FBRXpDOztBQUVBO0FBQ0E7QUFDQSxrQkFBa0I7QUFDbEI7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0I7QUFDbEI7QUFDQSxnQ0FBZ0M7O0FBRWhDOztBQUVBO0FBQ0E7QUFDQSxrQkFBa0I7QUFDbEI7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0E7O0FBRUE7O0FBRUEsNkNBQTZDOztBQUU3QztBQUNBO0FBQ0Esa0JBQWtCO0FBQ2xCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGtCQUFrQjtBQUNsQjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQjtBQUNsQjtBQUNBOztBQUVBO0FBQ0E7QUFDQSxrQkFBa0I7QUFDbEI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxrQkFBa0I7QUFDbEI7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSw2QkFBNkIsbUJBQW1CO0FBQ2hEO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDs7QUFFQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDs7QUFFQSx5QkFBeUIsK0VBQStFOztBQUV4Rzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBOztBQUVBO0FBQ0EsMENBQTBDLCtDQUErQztBQUN6RixxQ0FBcUMsbUNBQW1DO0FBQ3hFO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYixTQUFTO0FBQ1Q7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0Esc0RBQXNELHlCQUF5QjtBQUMvRTtBQUNBLG9DQUFvQzs7QUFFcEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBLGlDQUFpQywyREFBMkQ7QUFDNUY7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxhQUFhOztBQUViO0FBQ0E7QUFDQSxpQ0FBaUMsZ0dBQWdHO0FBQ2pJLGNBQWM7QUFDZCxpQ0FBaUMsZ0dBQWdHO0FBQ2pJOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsaUNBQWlDLHFCQUFxQixlQUFlLGtDQUFrQztBQUN2RztBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQjtBQUN0Qix3Q0FBd0MsbUJBQW1CO0FBQzNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsdUVBQXVFLGlDQUFpQztBQUN4Rzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQ0FBcUM7QUFDckM7QUFDQSwwQkFBMEI7QUFDMUI7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxnREFBZ0Qsa0RBQWtEO0FBQ2xHLCtFQUErRSxpQ0FBaUM7QUFDaEg7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsZ0RBQWdELDZFQUE2RTtBQUM3SDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1EQUFtRCxtQkFBbUI7QUFDdEU7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQ0FBaUMsbUJBQW1CO0FBQ3BEO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhOztBQUViO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCO0FBQ2xCLHFDQUFxQyxxQ0FBcUM7QUFDMUU7QUFDQTtBQUNBLGFBQWE7O0FBRWI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0Esb0JBQW9CO0FBQ3BCOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkLGlDQUFpQyxpRUFBaUU7QUFDbEc7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQixTQUFTO0FBQzFCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7O0FBRWI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTs7QUFFYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCOztBQUVBO0FBQ0EsYUFBYTs7QUFFYjs7QUFFQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLDBGQUEwRiw0Q0FBNEM7QUFDdEksVUFBVTtBQUNWO0FBQ0EsOEZBQThGLCtDQUErQztBQUM3SSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQSxpQ0FBaUMsbUJBQW1COztBQUVwRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGFBQWE7QUFDYjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0EsaUNBQWlDLG1CQUFtQjs7QUFFcEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxhQUFhO0FBQ2I7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCO0FBQ2xCLHFDQUFxQywwRUFBMEU7QUFDL0c7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQjtBQUNsQixxQ0FBcUMsMEVBQTBFO0FBQy9HO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlDQUFpQztBQUNqQzs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBLG9DQUFvQztBQUNwQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFEQUFxRCxtQkFBbUI7QUFDeEUsU0FBUztBQUNUOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0Esa0NBQWtDLElBQUk7QUFDdEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0EsaUNBQWlDLHFCQUFxQjtBQUN0RDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQ0FBaUMsbUJBQW1CO0FBQ3BEO0FBQ0E7QUFDQSxhQUFhOztBQUViO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0Esa0dBQWtHLHdEQUF3RDtBQUMxSjtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFDQUFxQyxtQkFBbUI7QUFDeEQ7QUFDQTtBQUNBLGlCQUFpQjs7QUFFakI7O0FBRUE7QUFDQTtBQUNBLHdDQUF3QywwQkFBMEI7QUFDbEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0I7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlDQUFpQyxtQkFBbUI7QUFDcEQ7QUFDQSxhQUFhOztBQUViO0FBQ0EsU0FBUztBQUNUOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQjtBQUNoQjtBQUNBLGtDQUFrQyxJQUFJO0FBQ3RDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0NBQWtDLElBQUk7QUFDdEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNENBQTRDLHVDQUF1QztBQUNuRjtBQUNBO0FBQ0E7O0FBRUE7QUFDQSx5REFBeUQsbUJBQW1CO0FBQzVFOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2QsaUNBQWlDLG1CQUFtQjtBQUNwRDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZCxpQ0FBaUMsbUJBQW1CO0FBQ3BEO0FBQ0E7O0FBRUEseUJBQXlCLHdDQUF3QztBQUNqRTtBQUNBOztBQUVBO0FBQ0EsaUJBQWlCLFFBQVE7QUFDekI7QUFDQSxrQkFBa0IsUUFBUTtBQUMxQixrQkFBa0IsUUFBUTtBQUMxQixrQkFBa0IsUUFBUTtBQUMxQixrQkFBa0IsUUFBUTtBQUMxQixrQkFBa0IsUUFBUTtBQUMxQixrQkFBa0IsUUFBUTtBQUMxQixrQkFBa0IsUUFBUTtBQUMxQjs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLFFBQVE7QUFDdkIsaUJBQWlCLGdDQUFnQztBQUNqRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxpQkFBaUIsUUFBUTtBQUN6QjtBQUNBLGtCQUFrQixRQUFRO0FBQzFCLGtCQUFrQixRQUFRO0FBQzFCLGtCQUFrQixRQUFRO0FBQzFCLGtCQUFrQixRQUFRO0FBQzFCLGtCQUFrQixVQUFVO0FBQzVCLGtCQUFrQixRQUFRO0FBQzFCLGtCQUFrQixhQUFhO0FBQy9CLGtCQUFrQixRQUFRO0FBQzFCLGtCQUFrQixTQUFTO0FBQzNCLGtCQUFrQixTQUFTO0FBQzNCLGtCQUFrQixjQUFjO0FBQ2hDOztBQUVBO0FBQ0EsaUJBQWlCLFFBQVE7QUFDekI7QUFDQSxrQkFBa0IsUUFBUTtBQUMxQixrQkFBa0IsU0FBUztBQUMzQixrQkFBa0IsU0FBUztBQUMzQixrQkFBa0IsU0FBUztBQUMzQixrQkFBa0IsU0FBUztBQUMzQixrQkFBa0IsU0FBUztBQUMzQixrQkFBa0IsU0FBUztBQUMzQixrQkFBa0IsUUFBUTtBQUMxQixrQkFBa0IsUUFBUTtBQUMxQixrQkFBa0IsUUFBUTtBQUMxQixrQkFBa0IsUUFBUTtBQUMxQixrQkFBa0IsUUFBUTtBQUMxQjs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLGFBQWE7QUFDNUIsaUJBQWlCLHlCQUF5QjtBQUMxQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsaUJBQWlCLFFBQVE7QUFDekI7QUFDQSxrQkFBa0IsU0FBUztBQUMzQixrQkFBa0IsUUFBUTtBQUMxQixrQkFBa0IsUUFBUTtBQUMxQixrQkFBa0IsUUFBUTtBQUMxQixrQkFBa0IsVUFBVTtBQUM1QixrQkFBa0IsUUFBUTtBQUMxQixrQkFBa0IsU0FBUztBQUMzQixrQkFBa0IsU0FBUztBQUMzQixrQkFBa0IsU0FBUztBQUMzQixrQkFBa0Isb0JBQW9CO0FBQ3RDOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsYUFBYTtBQUM1QixpQkFBaUIsMkJBQTJCO0FBQzVDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGlCQUFpQixRQUFRO0FBQ3pCO0FBQ0Esa0JBQWtCLFFBQVE7QUFDMUIsa0JBQWtCLFFBQVE7QUFDMUIsa0JBQWtCLFNBQVM7QUFDM0I7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsZUFBZSxjQUFjO0FBQzdCLGlCQUFpQixnQ0FBZ0M7QUFDakQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxpQkFBaUIsUUFBUTtBQUN6QjtBQUNBLGtCQUFrQixRQUFRO0FBQzFCLGtCQUFrQixRQUFRO0FBQzFCOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsY0FBYztBQUM3QixlQUFlLGNBQWM7QUFDN0IsaUJBQWlCLGdDQUFnQztBQUNqRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGlCQUFpQixRQUFRO0FBQ3pCO0FBQ0Esa0JBQWtCLFFBQVE7QUFDMUI7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsZUFBZSxjQUFjO0FBQzdCLGlCQUFpQixnQ0FBZ0M7QUFDakQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsZUFBZSxjQUFjO0FBQzdCLGlCQUFpQixrQkFBa0I7QUFDbkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsZUFBZSxjQUFjO0FBQzdCLGlCQUFpQixrQkFBa0I7QUFDbkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGNBQWMsZ0VBQWdFO0FBQzlFO0FBQ0E7QUFDQSxlQUFlLGNBQWM7QUFDN0IsZUFBZSxRQUFRO0FBQ3ZCLGVBQWUsU0FBUztBQUN4QixpQkFBaUIsd0JBQXdCO0FBQ3pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQixrQkFBa0I7QUFDbkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGlCQUFpQixRQUFRO0FBQ3pCO0FBQ0Esa0JBQWtCLFFBQVE7QUFDMUIsa0JBQWtCLFFBQVE7QUFDMUIsa0JBQWtCLFFBQVE7QUFDMUIsa0JBQWtCLFFBQVE7QUFDMUIsa0JBQWtCLFFBQVE7QUFDMUIsa0JBQWtCLFFBQVE7QUFDMUIsa0JBQWtCLFFBQVE7QUFDMUI7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsZUFBZSxRQUFRO0FBQ3ZCLGVBQWUsUUFBUTtBQUN2QixlQUFlLFNBQVM7QUFDeEIsZUFBZSxTQUFTO0FBQ3hCLGVBQWUsU0FBUztBQUN4QixlQUFlLFNBQVM7QUFDeEIsZUFBZSxTQUFTO0FBQ3hCLGVBQWUsU0FBUztBQUN4QixpQkFBaUIsdUJBQXVCO0FBQ3hDO0FBQ0E7QUFDQSxrREFBa0QsYUFBYTtBQUMvRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSx5R0FBeUcsZ0NBQWdDO0FBQ3pJO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQixrQkFBa0I7QUFDbkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsaUJBQWlCLFFBQVE7QUFDekI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGlCQUFpQixRQUFRO0FBQ3pCO0FBQ0Esa0JBQWtCLGdCQUFnQjtBQUNsQyxrQkFBa0IsU0FBUztBQUMzQixrQkFBa0IsU0FBUztBQUMzQixrQkFBa0IsU0FBUztBQUMzQixrQkFBa0IsU0FBUztBQUMzQixrQkFBa0IsU0FBUztBQUMzQixrQkFBa0IsU0FBUztBQUMzQixrQkFBa0IsU0FBUztBQUMzQixrQkFBa0IsU0FBUztBQUMzQixrQkFBa0IsU0FBUztBQUMzQixrQkFBa0IsUUFBUTtBQUMxQixrQkFBa0IsUUFBUTtBQUMxQixrQkFBa0IsUUFBUTtBQUMxQixrQkFBa0IsUUFBUTtBQUMxQixrQkFBa0IsUUFBUTtBQUMxQixrQkFBa0IsUUFBUTtBQUMxQixrQkFBa0IsUUFBUTtBQUMxQixrQkFBa0IsUUFBUTtBQUMxQixrQkFBa0IsZ0JBQWdCO0FBQ2xDLGtCQUFrQixRQUFRO0FBQzFCLGtCQUFrQixRQUFRO0FBQzFCLGtCQUFrQixRQUFRO0FBQzFCLGtCQUFrQixhQUFhO0FBQy9CLGtCQUFrQixhQUFhO0FBQy9CLGtCQUFrQixhQUFhO0FBQy9CLGtCQUFrQixhQUFhO0FBQy9CLGtCQUFrQixhQUFhO0FBQy9CLGtCQUFrQixhQUFhO0FBQy9CLGtCQUFrQixRQUFRO0FBQzFCLGtCQUFrQixRQUFRO0FBQzFCLGtCQUFrQixpQ0FBaUM7QUFDbkQsa0JBQWtCLGdCQUFnQiw0QkFBNEIsb0JBQW9CO0FBQ2xGOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsMENBQTBDO0FBQ3pELGVBQWUsVUFBVTtBQUN6QixlQUFlLFFBQVE7QUFDdkIsZUFBZSxTQUFTLHVDQUF1QyxzQkFBc0I7QUFDckYsZUFBZSxRQUFRO0FBQ3ZCLGVBQWUsU0FBUztBQUN4QixpQkFBaUIsa0JBQWtCO0FBQ25DO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUNBQXFDLFlBQVk7QUFDakQ7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsZUFBZSwwQ0FBMEM7QUFDekQsZUFBZSxVQUFVO0FBQ3pCLGVBQWUsUUFBUTtBQUN2QixlQUFlLFNBQVMsdUNBQXVDLHNCQUFzQjtBQUNyRixlQUFlLFFBQVE7QUFDdkIsZUFBZSxTQUFTO0FBQ3hCLGlCQUFpQixrQkFBa0I7QUFDbkM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQ0FBcUMsWUFBWTtBQUNqRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLDBDQUEwQztBQUN6RCxlQUFlLFVBQVU7QUFDekIsZUFBZSxRQUFRO0FBQ3ZCLGVBQWUsU0FBUyx1Q0FBdUMsc0JBQXNCO0FBQ3JGLGVBQWUsUUFBUTtBQUN2QixlQUFlLFNBQVM7QUFDeEIsaUJBQWlCLGtCQUFrQjtBQUNuQztBQUNBO0FBQ0E7QUFDQTtBQUNBLHdDQUF3QyxXQUFXO0FBQ25EO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsMENBQTBDO0FBQ3pELGVBQWUsUUFBUTtBQUN2QixlQUFlLFFBQVE7QUFDdkIsZUFBZSxTQUFTLHVDQUF1QyxzQkFBc0I7QUFDckYsZUFBZSxRQUFRO0FBQ3ZCLGlCQUFpQixrQkFBa0I7QUFDbkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQSxrQkFBa0IsbUJBQW1CO0FBQ3JDOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0Esb0NBQW9DLHdCQUF3QjtBQUM1RDtBQUNBLGVBQWUsMENBQTBDO0FBQ3pELGVBQWUsUUFBUTtBQUN2QixlQUFlLFNBQVMsdUNBQXVDLHNCQUFzQjtBQUNyRixpQkFBaUIsa0JBQWtCO0FBQ25DO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUNBQW1DLFdBQVc7QUFDOUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsaUJBQWlCLFFBQVE7QUFDekI7QUFDQSxrQkFBa0IsUUFBUTtBQUMxQixrQkFBa0IsUUFBUTtBQUMxQixrQkFBa0IsUUFBUTtBQUMxQixrQkFBa0IsUUFBUTtBQUMxQjs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLFFBQVE7QUFDdkIsZUFBZSxlQUFlO0FBQzlCLGVBQWUsVUFBVTtBQUN6QixlQUFlLGFBQWE7QUFDNUIsaUJBQWlCLCtCQUErQjtBQUNoRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxpQkFBaUIsUUFBUTtBQUN6QjtBQUNBLGtCQUFrQixRQUFRO0FBQzFCLGtCQUFrQixRQUFRO0FBQzFCLGtCQUFrQixRQUFRO0FBQzFCLGtCQUFrQixxQkFBcUI7QUFDdkM7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsZUFBZSwwQ0FBMEM7QUFDekQsZUFBZSxRQUFRO0FBQ3ZCLGVBQWUsUUFBUTtBQUN2QixlQUFlLFNBQVMsdUNBQXVDLHNCQUFzQjtBQUNyRixpQkFBaUIsNkJBQTZCO0FBQzlDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLDBDQUEwQztBQUN6RCxlQUFlLFFBQVE7QUFDdkIsZUFBZSxRQUFRO0FBQ3ZCLGVBQWUsU0FBUyx1Q0FBdUMsc0JBQXNCO0FBQ3JGLGlCQUFpQiw2QkFBNkI7QUFDOUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsY0FBYztBQUM3QixlQUFlLFFBQVE7QUFDdkIsZUFBZSxTQUFTO0FBQ3hCLGlCQUFpQixtQkFBbUI7QUFDcEM7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1Q0FBdUMsWUFBWTtBQUNuRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVksY0FBYztBQUMxQixZQUFZLGVBQWU7QUFDM0IsWUFBWTtBQUNaLFdBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxpQkFBaUIsUUFBUTtBQUN6QjtBQUNBLGtCQUFrQixTQUFTO0FBQzNCLGtCQUFrQixTQUFTO0FBQzNCLGtCQUFrQixTQUFTO0FBQzNCLGtCQUFrQixTQUFTO0FBQzNCLGtCQUFrQixTQUFTO0FBQzNCLGtCQUFrQixTQUFTO0FBQzNCLGtCQUFrQixrQkFBa0I7QUFDcEMsa0JBQWtCLFFBQVE7QUFDMUIsa0JBQWtCLFFBQVE7QUFDMUIsa0JBQWtCLFFBQVE7QUFDMUIsa0JBQWtCLFNBQVM7QUFDM0Isa0JBQWtCLG9CQUFvQjtBQUN0QyxrQkFBa0IsVUFBVTtBQUM1Qjs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUIsUUFBUTtBQUN6QjtBQUNBLGtCQUFrQixRQUFRO0FBQzFCLGtCQUFrQixRQUFRO0FBQzFCOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQixRQUFRO0FBQ3pCO0FBQ0Esa0JBQWtCLE1BQU07QUFDeEIsa0JBQWtCLFFBQVE7QUFDMUIsa0JBQWtCLFFBQVE7QUFDMUIsa0JBQWtCLFFBQVE7QUFDMUIsa0JBQWtCLHdCQUF3QjtBQUMxQyxrQkFBa0Isd0JBQXdCO0FBQzFDLGtCQUFrQix3QkFBd0I7QUFDMUMsa0JBQWtCLHdCQUF3QjtBQUMxQyxrQkFBa0Isd0JBQXdCO0FBQzFDLGtCQUFrQix3QkFBd0I7QUFDMUM7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCLFFBQVE7QUFDekI7QUFDQSxrQkFBa0IsUUFBUTtBQUMxQixrQkFBa0IsUUFBUTtBQUMxQixrQkFBa0IsUUFBUTtBQUMxQixrQkFBa0IsUUFBUTtBQUMxQixrQkFBa0IsUUFBUTtBQUMxQixrQkFBa0IsUUFBUTtBQUMxQixrQkFBa0IsdUJBQXVCO0FBQ3pDLGtCQUFrQixRQUFRO0FBQzFCLGtCQUFrQixRQUFRO0FBQzFCLGtCQUFrQiwwQkFBMEI7QUFDNUM7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCLFFBQVE7QUFDekI7QUFDQSxrQkFBa0IsUUFBUTtBQUMxQixrQkFBa0IsUUFBUTtBQUMxQixrQkFBa0IsUUFBUTtBQUMxQixrQkFBa0IsUUFBUTtBQUMxQixrQkFBa0IsUUFBUTtBQUMxQixrQkFBa0IsUUFBUTtBQUMxQixrQkFBa0IsYUFBYTtBQUMvQixrQkFBa0IsUUFBUTtBQUMxQixrQkFBa0IsYUFBYTtBQUMvQixrQkFBa0IsUUFBUTtBQUMxQixrQkFBa0IsdUJBQXVCO0FBQ3pDLGtCQUFrQix3QkFBd0I7QUFDMUMsa0JBQWtCLE1BQU07QUFDeEIsa0JBQWtCLHFCQUFxQjtBQUN2QyxrQkFBa0IsUUFBUTtBQUMxQjs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLDBDQUEwQztBQUN6RCxlQUFlLGtCQUFrQjtBQUNqQyxlQUFlLFFBQVE7QUFDdkIsZUFBZSxTQUFTO0FBQ3hCLGVBQWUsUUFBUTtBQUN2QixlQUFlLFNBQVM7QUFDeEIsZ0JBQWdCLDZCQUE2QjtBQUM3QztBQUNBO0FBQ0E7QUFDQTtBQUNBLGtEQUFrRCxVQUFVO0FBQzVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBCQUEwQjtBQUMxQjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTs7QUFFYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0EsZ0NBQWdDLEtBQUs7QUFDckM7QUFDQTtBQUNBO0FBQ0EsYUFBYTs7QUFFYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsMENBQTBDO0FBQ3pELGVBQWUsa0JBQWtCO0FBQ2pDLGVBQWUsUUFBUTtBQUN2QixlQUFlLFNBQVM7QUFDeEIsZUFBZSxRQUFRO0FBQ3ZCLGVBQWUsU0FBUztBQUN4QixpQkFBaUIsK0JBQStCO0FBQ2hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0RBQXNELFVBQVU7QUFDaEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsZ0JBQWdCO0FBQy9CLGVBQWUsa0JBQWtCO0FBQ2pDLGVBQWUsUUFBUTtBQUN2QixlQUFlLFNBQVM7QUFDeEIsZUFBZSxTQUFTO0FBQ3hCLGlCQUFpQiw2QkFBNkI7QUFDOUM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpREFBaUQsVUFBVTtBQUMzRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0NBQXNDLGVBQWUsSUFBSSxZQUFZLEdBQUc7QUFDeEU7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxpQkFBaUIsUUFBUTtBQUN6QjtBQUNBLGtCQUFrQixRQUFRO0FBQzFCLGtCQUFrQixRQUFRO0FBQzFCLGtCQUFrQixRQUFRO0FBQzFCLGtCQUFrQixRQUFRO0FBQzFCLGtCQUFrQixRQUFRO0FBQzFCLGtCQUFrQixRQUFRO0FBQzFCLGtCQUFrQixnQkFBZ0I7QUFDbEM7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsZ0JBQWdCO0FBQy9CLGVBQWUsUUFBUTtBQUN2QixlQUFlLFFBQVE7QUFDdkIsZUFBZSxTQUFTO0FBQ3hCLGVBQWUsUUFBUTtBQUN2QixlQUFlLFFBQVE7QUFDdkIsaUJBQWlCLHlCQUF5QjtBQUMxQztBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVksZUFBZTtBQUMzQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSx3REFBd0QsZ0NBQWdDOztBQUV4RjtBQUNBLHlCQUF5QjtBQUN6Qjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0I7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7O0FBRUE7O0FBRUE7QUFDQSx5QkFBeUI7QUFDekI7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUEsMkJBQTJCO0FBQzNCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0I7QUFDbEI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUEsY0FBYyx3QkFBd0I7QUFDdEM7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0I7QUFDbEI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBOztBQUVBLCtDQUErQyxVQUFVO0FBQ3pEO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxzQkFBc0IsUUFBUTtBQUM5QjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsZ0JBQWdCO0FBQy9CLGVBQWUsUUFBUTtBQUN2QixlQUFlLFFBQVE7QUFDdkIsZUFBZSxTQUFTO0FBQ3hCLGlCQUFpQixpQkFBaUI7QUFDbEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTs7QUFFQSxzQkFBc0I7O0FBRXRCO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0EscUJBQXFCO0FBQ3JCOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtDQUFrQztBQUNsQyxrQkFBa0I7QUFDbEI7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCO0FBQ3RCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0I7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlFQUF5RSxvREFBb0Q7QUFDN0g7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQSxrRUFBa0UsbUJBQW1CO0FBQ3JGOztBQUVBO0FBQ0EsZ0JBQWdCLHlDQUF5Qzs7QUFFekQ7QUFDQSw2QkFBNkIsMEVBQTBFO0FBQ3ZHO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZDQUE2QyxrQ0FBa0M7QUFDL0UsYUFBYTtBQUNiO0FBQ0EsNkJBQTZCLGVBQWU7QUFDNUMsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpREFBaUQsa0NBQWtDO0FBQ25GLGlCQUFpQjtBQUNqQjtBQUNBLGlDQUFpQyxlQUFlO0FBQ2hELGNBQWM7QUFDZDtBQUNBO0FBQ0EseUVBQXlFLGdCQUFnQjtBQUN6RjtBQUNBO0FBQ0E7QUFDQSxzQkFBc0I7QUFDdEIseUNBQXlDLHNEQUFzRDtBQUMvRjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpREFBaUQsa0NBQWtDO0FBQ25GO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGdFQUFnRSwwREFBMEQ7QUFDMUg7QUFDQTtBQUNBO0FBQ0EsZUFBZSxjQUFjO0FBQzdCLGVBQWUsUUFBUTtBQUN2QixlQUFlLFNBQVM7QUFDeEIsaUJBQWlCLDRCQUE0QjtBQUM3QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsMEJBQTBCO0FBQzFCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlDQUF5QyxrQ0FBa0M7QUFDM0U7QUFDQTtBQUNBO0FBQ0EscUVBQXFFLG9EQUFvRDtBQUN6SDtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBLDhCQUE4Qix3Q0FBd0M7QUFDdEU7QUFDQSxTQUFTO0FBQ1Q7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQkFBbUI7O0FBRW5CO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMEJBQTBCLGNBQWM7QUFDeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBCQUEwQjtBQUMxQjtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxtREFBbUQsbURBQW1EO0FBQ3RHO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5QkFBeUI7QUFDekI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBLHNDQUFzQyxZQUFZO0FBQ2xELElBQUk7QUFDSjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVixjQUFjLFFBQVE7QUFDdEIsY0FBYyxRQUFRO0FBQ3RCLGNBQWMsUUFBUTtBQUN0QjtBQUNBO0FBQ0Esd0NBQXdDLFVBQVUsT0FBTyxXQUFXO0FBQ3BFLElBQUk7QUFDSjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVixjQUFjLFFBQVE7QUFDdEIsY0FBYyxRQUFRO0FBQ3RCO0FBQ0E7QUFDQSwrQkFBK0IsVUFBVSxvQkFBb0IsVUFBVTtBQUN2RSxJQUFJO0FBQ0o7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1YsY0FBYyxRQUFRO0FBQ3RCLGNBQWMsUUFBUTtBQUN0QixjQUFjLFFBQVE7QUFDdEIsY0FBYyxRQUFRO0FBQ3RCLGNBQWMsYUFBYTtBQUMzQjtBQUNBO0FBQ0Esb0NBQW9DLFVBQVUsVUFBVSxrQ0FBa0M7QUFDMUYsSUFBSTtBQUNKOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQSw4QkFBOEIsY0FBYztBQUM1QyxJQUFJO0FBQ0o7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBLDhCQUE4QixjQUFjO0FBQzVDLElBQUk7QUFDSjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0Esc0JBQXNCLFNBQVMsRUFBRSxRQUFRO0FBQ3pDLElBQUk7QUFDSjs7QUFFQSx1QkFBdUIiLCJzb3VyY2VzIjpbIi9ob21lL2FsbWEvbmV4dGdlbi9OZWFoLW1haWwvbm9kZV9tb2R1bGVzL2ltYXBmbG93L2xpYi9pbWFwLWZsb3cuanMiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIEBtb2R1bGUgaW1hcGZsb3dcbiAqL1xuXG4vLyBUT0RPOlxuLy8gKiBVc2UgYnVmZmVycyBmb3IgY29tcGlsZWQgY29tbWFuZHNcbi8vICogT0F1dGgyIGF1dGhlbnRpY2F0aW9uXG5cbmNvbnN0IHRscyA9IHJlcXVpcmUoJ3RscycpO1xuY29uc3QgbmV0ID0gcmVxdWlyZSgnbmV0Jyk7XG5jb25zdCBjcnlwdG8gPSByZXF1aXJlKCdjcnlwdG8nKTtcbmNvbnN0IHsgRXZlbnRFbWl0dGVyIH0gPSByZXF1aXJlKCdldmVudHMnKTtcbmNvbnN0IGxvZ2dlciA9IHJlcXVpcmUoJy4vbG9nZ2VyJyk7XG5jb25zdCBsaWJtaW1lID0gcmVxdWlyZSgnbGlibWltZScpO1xuY29uc3QgemxpYiA9IHJlcXVpcmUoJ3psaWInKTtcbmNvbnN0IHsgSGVhZGVycyB9ID0gcmVxdWlyZSgnbWFpbHNwbGl0Jyk7XG5jb25zdCB7IExpbWl0ZWRQYXNzdGhyb3VnaCB9ID0gcmVxdWlyZSgnLi9saW1pdGVkLXBhc3N0aHJvdWdoJyk7XG5cbmNvbnN0IHsgSW1hcFN0cmVhbSB9ID0gcmVxdWlyZSgnLi9oYW5kbGVyL2ltYXAtc3RyZWFtJyk7XG5jb25zdCB7IHBhcnNlciwgY29tcGlsZXIgfSA9IHJlcXVpcmUoJy4vaGFuZGxlci9pbWFwLWhhbmRsZXInKTtcbmNvbnN0IHBhY2thZ2VJbmZvID0gcmVxdWlyZSgnLi4vcGFja2FnZS5qc29uJyk7XG5cbmNvbnN0IGxpYnFwID0gcmVxdWlyZSgnbGlicXAnKTtcbmNvbnN0IGxpYmJhc2U2NCA9IHJlcXVpcmUoJ2xpYmJhc2U2NCcpO1xuY29uc3QgRmxvd2VkRGVjb2RlciA9IHJlcXVpcmUoJ21haWxzcGxpdC9saWIvZmxvd2VkLWRlY29kZXInKTtcbmNvbnN0IHsgUGFzc1Rocm91Z2ggfSA9IHJlcXVpcmUoJ3N0cmVhbScpO1xuXG5jb25zdCB7IHByb3h5Q29ubmVjdGlvbiB9ID0gcmVxdWlyZSgnLi9wcm94eS1jb25uZWN0aW9uJyk7XG5cbmNvbnN0IHtcbiAgICBjb21wYXJlUGF0aHMsXG4gICAgdXBkYXRlQ2FwYWJpbGl0aWVzLFxuICAgIGdldEZvbGRlclRyZWUsXG4gICAgZm9ybWF0TWVzc2FnZVJlc3BvbnNlLFxuICAgIGdldERlY29kZXIsXG4gICAgcGFja01lc3NhZ2VSYW5nZSxcbiAgICBub3JtYWxpemVQYXRoLFxuICAgIGV4cGFuZFJhbmdlLFxuICAgIEF1dGhlbnRpY2F0aW9uRmFpbHVyZSxcbiAgICBnZXRDb2xvckZsYWdzXG59ID0gcmVxdWlyZSgnLi90b29scycpO1xuXG5jb25zdCBpbWFwQ29tbWFuZHMgPSByZXF1aXJlKCcuL2ltYXAtY29tbWFuZHMuanMnKTtcblxuY29uc3QgQ09OTkVDVF9USU1FT1VUID0gOTAgKiAxMDAwO1xuY29uc3QgR1JFRVRJTkdfVElNRU9VVCA9IDE2ICogMTAwMDtcbmNvbnN0IFVQR1JBREVfVElNRU9VVCA9IDEwICogMTAwMDtcblxuY29uc3QgU09DS0VUX1RJTUVPVVQgPSA1ICogNjAgKiAxMDAwO1xuXG5jb25zdCBzdGF0ZXMgPSB7XG4gICAgTk9UX0FVVEhFTlRJQ0FURUQ6IDB4MDEsXG4gICAgQVVUSEVOVElDQVRFRDogMHgwMixcbiAgICBTRUxFQ1RFRDogMHgwMyxcbiAgICBMT0dPVVQ6IDB4MDRcbn07XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gTWFpbGJveE9iamVjdFxuICogQGdsb2JhbFxuICogQHByb3BlcnR5IHtTdHJpbmd9IHBhdGggbWFpbGJveCBwYXRoXG4gKiBAcHJvcGVydHkge1N0cmluZ30gZGVsaW1pdGVyIG1haWxib3ggcGF0aCBkZWxpbWl0ZXIsIHVzdWFsbHkgXCIuXCIgb3IgXCIvXCJcbiAqIEBwcm9wZXJ0eSB7U2V0PHN0cmluZz59IGZsYWdzIGxpc3Qgb2YgZmxhZ3MgZm9yIHRoaXMgbWFpbGJveFxuICogQHByb3BlcnR5IHtTdHJpbmd9IFtzcGVjaWFsVXNlXSBvbmUgb2Ygc3BlY2lhbC11c2UgZmxhZ3MgKGlmIGFwcGxpY2FibGUpOiBcIlxcQWxsXCIsIFwiXFxBcmNoaXZlXCIsIFwiXFxEcmFmdHNcIiwgXCJcXEZsYWdnZWRcIiwgXCJcXEp1bmtcIiwgXCJcXFNlbnRcIiwgXCJcXFRyYXNoXCIuIEFkZGl0aW9uYWxseSBJTkJPWCBoYXMgbm9uLXN0YW5kYXJkIFwiXFxJbmJveFwiIGZsYWcgc2V0XG4gKiBAcHJvcGVydHkge0Jvb2xlYW59IGxpc3RlZCBgdHJ1ZWAgaWYgbWFpbGJveCB3YXMgZm91bmQgZnJvbSB0aGUgb3V0cHV0IG9mIExJU1QgY29tbWFuZFxuICogQHByb3BlcnR5IHtCb29sZWFufSBzdWJzY3JpYmVkIGB0cnVlYCBpZiBtYWlsYm94IHdhcyBmb3VuZCBmcm9tIHRoZSBvdXRwdXQgb2YgTFNVQiBjb21tYW5kXG4gKiBAcHJvcGVydHkge1NldDxzdHJpbmc+fSBwZXJtYW5lbnRGbGFncyBBIFNldCBvZiBmbGFncyBhdmFpbGFibGUgdG8gdXNlIGluIHRoaXMgbWFpbGJveC4gSWYgaXQgaXMgbm90IHNldCBvciBpbmNsdWRlcyBzcGVjaWFsIGZsYWcgXCJcXFxcXFwqXCIgdGhlbiBhbnkgZmxhZyBjYW4gYmUgdXNlZC5cbiAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBbbWFpbGJveElkXSB1bmlxdWUgbWFpbGJveCBJRCBpZiBzZXJ2ZXIgaGFzIGBPQkpFQ1RJRGAgZXh0ZW5zaW9uIGVuYWJsZWRcbiAqIEBwcm9wZXJ0eSB7QmlnSW50fSBbaGlnaGVzdE1vZHNlcV0gbGF0ZXN0IGtub3duIG1vZHNlcSB2YWx1ZSBpZiBzZXJ2ZXIgaGFzIENPTkRTVE9SRSBvciBYWU1ISUdIRVNUTU9EU0VRIGVuYWJsZWRcbiAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBbbm9Nb2RzZXFdIGlmIHRydWUgdGhlbiB0aGUgc2VydmVyIGRvZXNuJ3Qgc3VwcG9ydCB0aGUgcGVyc2lzdGVudCBzdG9yYWdlIG9mIG1vZC1zZXF1ZW5jZXMgZm9yIHRoZSBtYWlsYm94XG4gKiBAcHJvcGVydHkge0JpZ0ludH0gdWlkVmFsaWRpdHkgTWFpbGJveCBgVUlEVkFMSURJVFlgIHZhbHVlXG4gKiBAcHJvcGVydHkge051bWJlcn0gdWlkTmV4dCBOZXh0IHByZWRpY3RlZCBVSURcbiAqIEBwcm9wZXJ0eSB7TnVtYmVyfSBleGlzdHMgTWVzc2FnZXMgaW4gdGhpcyBmb2xkZXJcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IE1haWxib3hMb2NrT2JqZWN0XG4gKiBAZ2xvYmFsXG4gKiBAcHJvcGVydHkge1N0cmluZ30gcGF0aCBtYWlsYm94IHBhdGhcbiAqIEBwcm9wZXJ0eSB7RnVuY3Rpb259IHJlbGVhc2UgUmVsZWFzZSBjdXJyZW50IGxvY2tcbiAqIEBleGFtcGxlXG4gKiBsZXQgbG9jayA9IGF3YWl0IGNsaWVudC5nZXRNYWlsYm94TG9jaygnSU5CT1gnKTtcbiAqIHRyeSB7XG4gKiAgIC8vIGRvIHNvbWV0aGluZyBpbiB0aGUgbWFpbGJveFxuICogfSBmaW5hbGx5IHtcbiAqICAgLy8gdXNlIGZpbmFsbHl7fSB0byBtYWtlIHN1cmUgbG9jayBpcyByZWxlYXNlZCBldmVuIGlmIGV4Y2VwdGlvbiBvY2N1cnNcbiAqICAgbG9jay5yZWxlYXNlKCk7XG4gKiB9XG4gKi9cblxuLyoqXG4gKiBDbGllbnQgYW5kIHNlcnZlciBpZGVudGlmaWNhdGlvbiBvYmplY3QsIHdoZXJlIGtleSBpcyBvbmUgb2YgUkZDMjk3MSBkZWZpbmVkIFtkYXRhIGZpZWxkc10oaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzI5NzEjc2VjdGlvbi0zLjMpIChidXQgbm90IGxpbWl0ZWQgdG8pLlxuICogQHR5cGVkZWYge09iamVjdH0gSWRJbmZvT2JqZWN0XG4gKiBAZ2xvYmFsXG4gKiBAcHJvcGVydHkge1N0cmluZ30gW25hbWVdIE5hbWUgb2YgdGhlIHByb2dyYW1cbiAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBbdmVyc2lvbl0gVmVyc2lvbiBudW1iZXIgb2YgdGhlIHByb2dyYW1cbiAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBbb3NdIE5hbWUgb2YgdGhlIG9wZXJhdGluZyBzeXN0ZW1cbiAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBbdmVuZG9yXSBWZW5kb3Igb2YgdGhlIGNsaWVudC9zZXJ2ZXJcbiAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBbJ3N1cHBvcnQtdXJsJ10gVVJMIHRvIGNvbnRhY3QgZm9yIHN1cHBvcnRcbiAqIEBwcm9wZXJ0eSB7RGF0ZX0gW2RhdGVdIERhdGUgcHJvZ3JhbSB3YXMgcmVsZWFzZWRcbiAqL1xuXG4vKipcbiAqIElNQVAgY2xpZW50IGNsYXNzIGZvciBhY2Nlc3NpbmcgSU1BUCBtYWlsYm94ZXNcbiAqXG4gKiBAY2xhc3NcbiAqIEBleHRlbmRzIEV2ZW50RW1pdHRlclxuICovXG5jbGFzcyBJbWFwRmxvdyBleHRlbmRzIEV2ZW50RW1pdHRlciB7XG4gICAgLyoqXG4gICAgICogQ3VycmVudCBtb2R1bGUgdmVyc2lvbiBhcyBhIHN0YXRpYyBjbGFzcyBwcm9wZXJ0eVxuICAgICAqIEBwcm9wZXJ0eSB7U3RyaW5nfSB2ZXJzaW9uIE1vZHVsZSB2ZXJzaW9uXG4gICAgICogQHN0YXRpY1xuICAgICAqL1xuICAgIHN0YXRpYyB2ZXJzaW9uID0gcGFja2FnZUluZm8udmVyc2lvbjtcblxuICAgIC8qKlxuICAgICAqIElNQVAgY29ubmVjdGlvbiBvcHRpb25zXG4gICAgICpcbiAgICAgKiBAcHJvcGVydHkge1N0cmluZ30gaG9zdFxuICAgICAqICAgICBIb3N0bmFtZSBvZiB0aGUgSU1BUCBzZXJ2ZXIuXG4gICAgICpcbiAgICAgKiBAcHJvcGVydHkge051bWJlcn0gcG9ydFxuICAgICAqICAgICBQb3J0IG51bWJlciBmb3IgdGhlIElNQVAgc2VydmVyLlxuICAgICAqXG4gICAgICogQHByb3BlcnR5IHtCb29sZWFufSBbc2VjdXJlPWZhbHNlXVxuICAgICAqICAgICBJZiBgdHJ1ZWAsIGVzdGFibGlzaGVzIHRoZSBjb25uZWN0aW9uIGRpcmVjdGx5IG92ZXIgVExTIChjb21tb25seSBvbiBwb3J0IDk5MykuXG4gICAgICogICAgIElmIGBmYWxzZWAsIGEgcGxhaW4gKHVuZW5jcnlwdGVkKSBjb25uZWN0aW9uIGlzIHVzZWQgZmlyc3QgYW5kLCBpZiBwb3NzaWJsZSwgdGhlIGNvbm5lY3Rpb24gaXMgdXBncmFkZWQgdG8gU1RBUlRUTFMuXG4gICAgICpcbiAgICAgKiBAcHJvcGVydHkge0Jvb2xlYW59IFtkb1NUQVJUVExTPXVuZGVmaW5lZF1cbiAgICAgKiAgICAgRGV0ZXJtaW5lcyB3aGV0aGVyIHRvIHVwZ3JhZGUgdGhlIGNvbm5lY3Rpb24gdG8gVExTIHZpYSBTVEFSVFRMUzpcbiAgICAgKiAgICAgICAtICoqdHJ1ZSoqOiBTdGFydCB1bmVuY3J5cHRlZCBhbmQgdXBncmFkZSB0byBUTFMgdXNpbmcgU1RBUlRUTFMgYmVmb3JlIGF1dGhlbnRpY2F0aW9uLlxuICAgICAqICAgICAgICAgVGhlIGNvbm5lY3Rpb24gZmFpbHMgaWYgdGhlIHNlcnZlciBkb2VzIG5vdCBzdXBwb3J0IFNUQVJUVExTIG9yIHRoZSB1cGdyYWRlIGZhaWxzLlxuICAgICAqICAgICAgICAgTm90ZSB0aGF0IGBzZWN1cmU9dHJ1ZWAgY29tYmluZWQgd2l0aCBgZG9TVEFSVFRMUz10cnVlYCBpcyBpbnZhbGlkLlxuICAgICAqICAgICAgIC0gKipmYWxzZSoqOiBOZXZlciB1c2UgU1RBUlRUTFMsIGV2ZW4gaWYgdGhlIHNlcnZlciBhZHZlcnRpc2VzIHN1cHBvcnQuXG4gICAgICogICAgICAgICBUaGlzIGlzIHVzZWZ1bCBpZiB0aGUgc2VydmVyIGhhcyBhIGJyb2tlbiBUTFMgc2V0dXAuXG4gICAgICogICAgICAgICBDb21iaW5lZCB3aXRoIGBzZWN1cmU9ZmFsc2VgLCB0aGlzIHJlc3VsdHMgaW4gYSBmdWxseSB1bmVuY3J5cHRlZCBjb25uZWN0aW9uLlxuICAgICAqICAgICAgICAgTWFrZSBzdXJlIHlvdSB3YXJuIHVzZXJzIGFib3V0IHRoZSBzZWN1cml0eSByaXNrcy5cbiAgICAgKiAgICAgICAtICoqdW5kZWZpbmVkKiogKGRlZmF1bHQpOiBJZiBgc2VjdXJlPWZhbHNlYCAoZGVmYXVsdCksIGF0dGVtcHQgdG8gdXBncmFkZSB0byBUTFMgdmlhIFNUQVJUVExTIGJlZm9yZSBhdXRoZW50aWNhdGlvbiBpZiB0aGUgc2VydmVyIHN1cHBvcnRzIGl0LiBJZiBub3Qgc3VwcG9ydGVkLCBjb250aW51ZSB1bmVuY3J5cHRlZC4gVGhpcyBtYXkgZXhwb3NlIHRoZSBjb25uZWN0aW9uIHRvIGEgZG93bmdyYWRlIGF0dGFjay5cbiAgICAgKlxuICAgICAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBbc2VydmVybmFtZV1cbiAgICAgKiAgICAgU2VydmVyIG5hbWUgZm9yIFNOSSBvciB3aGVuIHVzaW5nIGFuIElQIGFkZHJlc3MgYXMgYGhvc3RgLlxuICAgICAqXG4gICAgICogQHByb3BlcnR5IHtCb29sZWFufSBbZGlzYWJsZUNvbXByZXNzaW9uPWZhbHNlXVxuICAgICAqICAgICBJZiBgdHJ1ZWAsIHRoZSBjbGllbnQgZG9lcyBub3QgYXR0ZW1wdCB0byB1c2UgdGhlIENPTVBSRVNTPURFRkxBVEUgZXh0ZW5zaW9uLlxuICAgICAqXG4gICAgICogQHByb3BlcnR5IHtPYmplY3R9IGF1dGhcbiAgICAgKiAgICAgQXV0aGVudGljYXRpb24gb3B0aW9ucy4gQXV0aGVudGljYXRpb24gb2NjdXJzIGF1dG9tYXRpY2FsbHkgZHVyaW5nIHtAbGluayBjb25uZWN0fS5cbiAgICAgKlxuICAgICAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBhdXRoLnVzZXJcbiAgICAgKiAgICAgVXNlcm5hbWUgZm9yIGF1dGhlbnRpY2F0aW9uLlxuICAgICAqXG4gICAgICogQHByb3BlcnR5IHtTdHJpbmd9IFthdXRoLnBhc3NdXG4gICAgICogICAgIFBhc3N3b3JkIGZvciByZWd1bGFyIGF1dGhlbnRpY2F0aW9uLlxuICAgICAqXG4gICAgICogQHByb3BlcnR5IHtTdHJpbmd9IFthdXRoLmFjY2Vzc1Rva2VuXVxuICAgICAqICAgICBPQXV0aDIgYWNjZXNzIHRva2VuLCBpZiB1c2luZyBPQXV0aDIgYXV0aGVudGljYXRpb24uXG4gICAgICpcbiAgICAgKiBAcHJvcGVydHkge1N0cmluZ30gW2F1dGgubG9naW5NZXRob2RdXG4gICAgICogICAgIE9wdGlvbmFsIGxvZ2luIG1ldGhvZCBmb3IgcGFzc3dvcmQtYmFzZWQgYXV0aGVudGljYXRpb24gKGUuZy4sIFwiTE9HSU5cIiwgXCJBVVRIPUxPR0lOXCIsIG9yIFwiQVVUSD1QTEFJTlwiKS5cbiAgICAgKiAgICAgSWYgbm90IHNldCwgSW1hcEZsb3cgY2hvb3NlcyBiYXNlZCBvbiBhdmFpbGFibGUgbWVjaGFuaXNtcy5cbiAgICAgKlxuICAgICAqIEBwcm9wZXJ0eSB7SWRJbmZvT2JqZWN0fSBbY2xpZW50SW5mb11cbiAgICAgKiAgICAgQ2xpZW50IGlkZW50aWZpY2F0aW9uIGluZm8gc2VudCB0byB0aGUgc2VydmVyICh2aWEgdGhlIElEIGNvbW1hbmQpLlxuICAgICAqXG4gICAgICogQHByb3BlcnR5IHtCb29sZWFufSBbZGlzYWJsZUF1dG9JZGxlPWZhbHNlXVxuICAgICAqICAgICBJZiBgdHJ1ZWAsIGRvIG5vdCBzdGFydCBJRExFIGF1dG9tYXRpY2FsbHkuIFVzZWZ1bCB3aGVuIG9ubHkgc3BlY2lmaWMgb3BlcmF0aW9ucyBhcmUgbmVlZGVkLlxuICAgICAqXG4gICAgICogQHByb3BlcnR5IHtPYmplY3R9IFt0bHNdXG4gICAgICogICAgIEFkZGl0aW9uYWwgVExTIG9wdGlvbnMuIEZvciBkZXRhaWxzLCBzZWUgW05vZGUuanMgVExTIGNvbm5lY3RdKGh0dHBzOi8vbm9kZWpzLm9yZy9hcGkvdGxzLmh0bWwjdGxzX3Rsc19jb25uZWN0X29wdGlvbnNfY2FsbGJhY2spLlxuICAgICAqXG4gICAgICogQHByb3BlcnR5IHtCb29sZWFufSBbdGxzLnJlamVjdFVuYXV0aG9yaXplZD10cnVlXVxuICAgICAqICAgICBJZiBgZmFsc2VgLCBhbGxvd3Mgc2VsZi1zaWduZWQgb3IgZXhwaXJlZCBjZXJ0aWZpY2F0ZXMuXG4gICAgICpcbiAgICAgKiBAcHJvcGVydHkge1N0cmluZ30gW3Rscy5taW5WZXJzaW9uPSdUTFN2MS4yJ11cbiAgICAgKiAgICAgTWluaW11bSBhY2NlcHRlZCBUTFMgdmVyc2lvbiAoZS5nLiwgYCdUTFN2MS4yJ2ApLlxuICAgICAqXG4gICAgICogQHByb3BlcnR5IHtOdW1iZXJ9IFt0bHMubWluREhTaXplPTEwMjRdXG4gICAgICogICAgIE1pbmltdW0gc2l6ZSAoaW4gYml0cykgb2YgdGhlIERIIHBhcmFtZXRlciBmb3IgVExTIGNvbm5lY3Rpb25zLlxuICAgICAqXG4gICAgICogQHByb3BlcnR5IHtPYmplY3R8Qm9vbGVhbn0gW2xvZ2dlcl1cbiAgICAgKiAgICAgQ3VzdG9tIGxvZ2dlciBpbnN0YW5jZSB3aXRoIGBkZWJ1ZyhvYmopYCwgYGluZm8ob2JqKWAsIGB3YXJuKG9iailgLCBhbmQgYGVycm9yKG9iailgIG1ldGhvZHMuXG4gICAgICogICAgIElmIGBmYWxzZWAsIGxvZ2dpbmcgaXMgZGlzYWJsZWQuIElmIG5vdCBwcm92aWRlZCwgSW1hcEZsb3cgbG9ncyB0byBjb25zb2xlIGluIFtwaW5vIGZvcm1hdF0oaHR0cHM6Ly9nZXRwaW5vLmlvLykuXG4gICAgICpcbiAgICAgKiBAcHJvcGVydHkge0Jvb2xlYW59IFtsb2dSYXc9ZmFsc2VdXG4gICAgICogICAgIElmIGB0cnVlYCwgbG9ncyBhbGwgcmF3IGRhdGEgKHJlYWQgYW5kIHdyaXR0ZW4pIGluIGJhc2U2NCBlbmNvZGluZy4gWW91IGNhbiBwaXBlIHN1Y2ggbG9ncyB0byBbZWVyYXdsb2ddKGh0dHBzOi8vZ2l0aHViLmNvbS9wb3N0YWxzeXMvZWVyYXdsb2cpIGNvbW1hbmQgZm9yIHJlYWRhYmxlIG91dHB1dC5cbiAgICAgKlxuICAgICAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gW2VtaXRMb2dzPWZhbHNlXVxuICAgICAqICAgICBJZiBgdHJ1ZWAsIGVtaXRzIGAnbG9nJ2AgZXZlbnRzIHdpdGggdGhlIHNhbWUgZGF0YSBwYXNzZWQgdG8gdGhlIGxvZ2dlci5cbiAgICAgKlxuICAgICAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gW3ZlcmlmeU9ubHk9ZmFsc2VdXG4gICAgICogICAgIElmIGB0cnVlYCwgZGlzY29ubmVjdHMgYWZ0ZXIgc3VjY2Vzc2Z1bCBhdXRoZW50aWNhdGlvbiB3aXRob3V0IHBlcmZvcm1pbmcgb3RoZXIgYWN0aW9ucy5cbiAgICAgKlxuICAgICAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBbcHJveHldXG4gICAgICogICAgIFByb3h5IFVSTC4gU3VwcG9ydHMgSFRUUCBDT05ORUNUIChgaHR0cDovL2AsIGBodHRwczovL2ApIGFuZCBTT0NLUyAoYHNvY2tzOi8vYCwgYHNvY2tzNDovL2AsIGBzb2NrczU6Ly9gKS5cbiAgICAgKlxuICAgICAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gW3FyZXN5bmM9ZmFsc2VdXG4gICAgICogICAgIElmIGB0cnVlYCwgZW5hYmxlcyBRUkVTWU5DIHN1cHBvcnQgc28gdGhhdCBFWFBVTkdFIG5vdGlmaWNhdGlvbnMgaW5jbHVkZSBgdWlkYCBpbnN0ZWFkIG9mIGBzZXFgLlxuICAgICAqXG4gICAgICogQHByb3BlcnR5IHtOdW1iZXJ9IFttYXhJZGxlVGltZV1cbiAgICAgKiAgICAgSWYgc2V0LCBicmVha3MgYW5kIHJlc3RhcnRzIElETEUgZXZlcnkgYG1heElkbGVUaW1lYCBtaWxsaXNlY29uZHMuXG4gICAgICpcbiAgICAgKiBAcHJvcGVydHkge1N0cmluZ30gW21pc3NpbmdJZGxlQ29tbWFuZD1cIk5PT1BcIl1cbiAgICAgKiAgICAgQ29tbWFuZCB0byB1c2UgaWYgdGhlIHNlcnZlciBkb2VzIG5vdCBzdXBwb3J0IElETEUuXG4gICAgICpcbiAgICAgKiBAcHJvcGVydHkge0Jvb2xlYW59IFtkaXNhYmxlQmluYXJ5PWZhbHNlXVxuICAgICAqICAgICBJZiBgdHJ1ZWAsIGlnbm9yZXMgdGhlIEJJTkFSWSBleHRlbnNpb24gZm9yIEZFVENIIGFuZCBBUFBFTkQgb3BlcmF0aW9ucy5cbiAgICAgKlxuICAgICAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gW2Rpc2FibGVBdXRvRW5hYmxlPWZhbHNlXVxuICAgICAqICAgICBJZiBgdHJ1ZWAsIGRvIG5vdCBhdXRvbWF0aWNhbGx5IGVuYWJsZSBzdXBwb3J0ZWQgSU1BUCBleHRlbnNpb25zLlxuICAgICAqXG4gICAgICogQHByb3BlcnR5IHtOdW1iZXJ9IFtjb25uZWN0aW9uVGltZW91dD05MDAwMF1cbiAgICAgKiAgICAgTWF4aW11bSB0aW1lIChpbiBtaWxsaXNlY29uZHMpIHRvIHdhaXQgZm9yIHRoZSBjb25uZWN0aW9uIHRvIGVzdGFibGlzaC4gRGVmYXVsdHMgdG8gOTAgc2Vjb25kcy5cbiAgICAgKlxuICAgICAqIEBwcm9wZXJ0eSB7TnVtYmVyfSBbZ3JlZXRpbmdUaW1lb3V0PTE2MDAwXVxuICAgICAqICAgICBNYXhpbXVtIHRpbWUgKGluIG1pbGxpc2Vjb25kcykgdG8gd2FpdCBmb3IgdGhlIHNlcnZlciBncmVldGluZyBhZnRlciBhIGNvbm5lY3Rpb24gaXMgZXN0YWJsaXNoZWQuIERlZmF1bHRzIHRvIDE2IHNlY29uZHMuXG4gICAgICpcbiAgICAgKiBAcHJvcGVydHkge051bWJlcn0gW3NvY2tldFRpbWVvdXQ9MzAwMDAwXVxuICAgICAqICAgICBNYXhpbXVtIHBlcmlvZCBvZiBpbmFjdGl2aXR5IChpbiBtaWxsaXNlY29uZHMpIGJlZm9yZSB0ZXJtaW5hdGluZyB0aGUgY29ubmVjdGlvbi4gRGVmYXVsdHMgdG8gNSBtaW51dGVzLlxuICAgICAqL1xuXG4gICAgY29uc3RydWN0b3Iob3B0aW9ucykge1xuICAgICAgICBzdXBlcih7IGNhcHR1cmVSZWplY3Rpb25zOiB0cnVlIH0pO1xuXG4gICAgICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEluc3RhbmNlIElEIGZvciBsb2dzXG4gICAgICAgICAqIEB0eXBlIHtTdHJpbmd9XG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmlkID0gdGhpcy5vcHRpb25zLmlkIHx8IHRoaXMuZ2V0UmFuZG9tSWQoKTtcblxuICAgICAgICB0aGlzLmNsaWVudEluZm8gPSBPYmplY3QuYXNzaWduKFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIG5hbWU6IHBhY2thZ2VJbmZvLm5hbWUsXG4gICAgICAgICAgICAgICAgdmVyc2lvbjogcGFja2FnZUluZm8udmVyc2lvbixcbiAgICAgICAgICAgICAgICB2ZW5kb3I6ICdQb3N0YWwgU3lzdGVtcycsXG4gICAgICAgICAgICAgICAgJ3N1cHBvcnQtdXJsJzogJ2h0dHBzOi8vZ2l0aHViLmNvbS9wb3N0YWxzeXMvaW1hcGZsb3cvaXNzdWVzJ1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5jbGllbnRJbmZvIHx8IHt9XG4gICAgICAgICk7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFNlcnZlciBpZGVudGlmaWNhdGlvbiBpbmZvLiBBdmFpbGFibGUgYWZ0ZXIgc3VjY2Vzc2Z1bCBgY29ubmVjdCgpYC5cbiAgICAgICAgICogSWYgc2VydmVyIGRvZXMgbm90IHByb3ZpZGUgaWRlbnRpZmljYXRpb24gaW5mbyB0aGVuIHRoaXMgdmFsdWUgaXMgYG51bGxgLlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKiBhd2FpdCBjbGllbnQuY29ubmVjdCgpO1xuICAgICAgICAgKiBjb25zb2xlLmxvZyhjbGllbnQuc2VydmVySW5mby52ZW5kb3IpO1xuICAgICAgICAgKiBAdHlwZSB7SWRJbmZvT2JqZWN0fG51bGx9XG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnNlcnZlckluZm8gPSBudWxsOyAvL3VwZGF0ZWQgYnkgSURcblxuICAgICAgICB0aGlzLmxvZyA9IHRoaXMuZ2V0TG9nZ2VyKCk7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIElzIHRoZSBjb25uZWN0aW9uIGN1cnJlbnRseSBlbmNyeXB0ZWQgb3Igbm90XG4gICAgICAgICAqIEB0eXBlIHtCb29sZWFufVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5zZWN1cmVDb25uZWN0aW9uID0gISF0aGlzLm9wdGlvbnMuc2VjdXJlO1xuXG4gICAgICAgIHRoaXMucG9ydCA9IE51bWJlcih0aGlzLm9wdGlvbnMucG9ydCkgfHwgKHRoaXMuc2VjdXJlQ29ubmVjdGlvbiA/IDk5MyA6IDExMCk7XG4gICAgICAgIHRoaXMuaG9zdCA9IHRoaXMub3B0aW9ucy5ob3N0IHx8ICdsb2NhbGhvc3QnO1xuICAgICAgICB0aGlzLnNlcnZlcm5hbWUgPSB0aGlzLm9wdGlvbnMuc2VydmVybmFtZSA/IHRoaXMub3B0aW9ucy5zZXJ2ZXJuYW1lIDogIW5ldC5pc0lQKHRoaXMuaG9zdCkgPyB0aGlzLmhvc3QgOiBmYWxzZTtcblxuICAgICAgICBpZiAodHlwZW9mIHRoaXMub3B0aW9ucy5zZWN1cmUgPT09ICd1bmRlZmluZWQnICYmIHRoaXMucG9ydCA9PT0gOTkzKSB7XG4gICAgICAgICAgICAvLyBpZiBzZWN1cmUgb3B0aW9uIGlzIG5vdCBzZXQgYnV0IHBvcnQgaXMgNDY1LCB0aGVuIGRlZmF1bHQgdG8gc2VjdXJlXG4gICAgICAgICAgICB0aGlzLnNlY3VyZUNvbm5lY3Rpb24gPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5sb2dSYXcgPSB0aGlzLm9wdGlvbnMubG9nUmF3O1xuICAgICAgICB0aGlzLnN0cmVhbWVyID0gbmV3IEltYXBTdHJlYW0oe1xuICAgICAgICAgICAgbG9nZ2VyOiB0aGlzLmxvZyxcbiAgICAgICAgICAgIGNpZDogdGhpcy5pZCxcbiAgICAgICAgICAgIGxvZ1JhdzogdGhpcy5sb2dSYXcsXG4gICAgICAgICAgICBzZWN1cmVDb25uZWN0aW9uOiB0aGlzLnNlY3VyZUNvbm5lY3Rpb25cbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5yZWFkaW5nID0gZmFsc2U7XG4gICAgICAgIHRoaXMuc29ja2V0ID0gZmFsc2U7XG4gICAgICAgIHRoaXMud3JpdGVTb2NrZXQgPSBmYWxzZTtcblxuICAgICAgICB0aGlzLnN0YXRlcyA9IHN0YXRlcztcbiAgICAgICAgdGhpcy5zdGF0ZSA9IHRoaXMuc3RhdGVzLk5PVF9BVVRIRU5USUNBVEVEO1xuXG4gICAgICAgIHRoaXMubG9ja0NvdW50ZXIgPSAwO1xuICAgICAgICB0aGlzLmN1cnJlbnRMb2NrID0gZmFsc2U7XG5cbiAgICAgICAgdGhpcy50YWdDb3VudGVyID0gMDtcbiAgICAgICAgdGhpcy5yZXF1ZXN0VGFnTWFwID0gbmV3IE1hcCgpO1xuICAgICAgICB0aGlzLnJlcXVlc3RRdWV1ZSA9IFtdO1xuICAgICAgICB0aGlzLmN1cnJlbnRSZXF1ZXN0ID0gZmFsc2U7XG5cbiAgICAgICAgdGhpcy53cml0ZUJ5dGVzQ291bnRlciA9IDA7XG5cbiAgICAgICAgdGhpcy5jb21tYW5kUGFydHMgPSBbXTtcblxuICAgICAgICAvKipcbiAgICAgICAgICogQWN0aXZlIElNQVAgY2FwYWJpbGl0aWVzLiBWYWx1ZSBpcyBlaXRoZXIgYHRydWVgIGZvciB0b2dnbGFiZSBjYXBhYmlsaXRpZXMgKGVnLiBgVUlEUExVU2ApXG4gICAgICAgICAqIG9yIGEgbnVtYmVyIGZvciBjYXBhYmlsaXRpZXMgd2l0aCBhIHZhbHVlIChlZy4gYEFQUEVORExJTUlUYClcbiAgICAgICAgICogQHR5cGUge01hcDxzdHJpbmcsIGJvb2xlYW58bnVtYmVyPn1cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuY2FwYWJpbGl0aWVzID0gbmV3IE1hcCgpO1xuICAgICAgICB0aGlzLmF1dGhDYXBhYmlsaXRpZXMgPSBuZXcgTWFwKCk7XG5cbiAgICAgICAgdGhpcy5yYXdDYXBhYmlsaXRpZXMgPSBudWxsO1xuXG4gICAgICAgIHRoaXMuZXhwZWN0Q2FwYWJpbGl0eVVwZGF0ZSA9IGZhbHNlOyAvLyBmb3JjZSBDQVBBQklMSVRZIGFmdGVyIExPR0lOXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEVuYWJsZWQgY2FwYWJpbGl0aWVzLiBVc3VhbGx5IGBDT05EU1RPUkVgIGFuZCBgVVRGOD1BQ0NFUFRgIGlmIHNlcnZlciBzdXBwb3J0cyB0aGVzZS5cbiAgICAgICAgICogQHR5cGUge1NldDxzdHJpbmc+fVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5lbmFibGVkID0gbmV3IFNldCgpO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBJcyB0aGUgY29ubmVjdGlvbiBjdXJyZW50bHkgdXNhYmxlIG9yIG5vdFxuICAgICAgICAgKiBAdHlwZSB7Qm9vbGVhbn1cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMudXNhYmxlID0gZmFsc2U7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEN1cnJlbnRseSBhdXRoZW50aWNhdGVkIHVzZXIgb3IgYGZhbHNlYCBpZiBtYWlsYm94IGlzIG5vdCBvcGVuXG4gICAgICAgICAqIG9yIGB0cnVlYCBpZiBjb25uZWN0aW9uIHdhcyBhdXRoZW50aWNhdGVkIGJ5IFBSRUFVVEhcbiAgICAgICAgICogQHR5cGUge1N0cmluZ3xCb29sZWFufVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5hdXRoZW50aWNhdGVkID0gZmFsc2U7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEN1cnJlbnRseSBzZWxlY3RlZCBtYWlsYm94IG9yIGBmYWxzZWAgaWYgbWFpbGJveCBpcyBub3Qgb3BlblxuICAgICAgICAgKiBAdHlwZSB7TWFpbGJveE9iamVjdHxCb29sZWFufVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5tYWlsYm94ID0gZmFsc2U7XG4gICAgICAgIHRoaXMuY3VycmVudFNlbGVjdENvbW1hbmQgPSBmYWxzZTtcblxuICAgICAgICAvKipcbiAgICAgICAgICogSXMgY3VycmVudCBtYWlsYm94IGlkbGluZyAoYHRydWVgKSBvciBub3QgKGBmYWxzZWApXG4gICAgICAgICAqIEB0eXBlIHtCb29sZWFufVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5pZGxpbmcgPSBmYWxzZTtcblxuICAgICAgICB0aGlzLmVtaXRMb2dzID0gISF0aGlzLm9wdGlvbnMuZW1pdExvZ3M7XG4gICAgICAgIC8vIG9yZGVyaW5nIG51bWJlciBmb3IgZW1pdHRlZCBsb2dzXG4gICAgICAgIHRoaXMubG8gPSAwO1xuXG4gICAgICAgIHRoaXMudW50YWdnZWRIYW5kbGVycyA9IHt9O1xuICAgICAgICB0aGlzLnNlY3Rpb25IYW5kbGVycyA9IHt9O1xuXG4gICAgICAgIHRoaXMuY29tbWFuZHMgPSBpbWFwQ29tbWFuZHM7XG5cbiAgICAgICAgdGhpcy5mb2xkZXJzID0gbmV3IE1hcCgpO1xuXG4gICAgICAgIHRoaXMuY3VycmVudExvY2sgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5sb2NrcyA9IFtdO1xuXG4gICAgICAgIHRoaXMuaWRSZXF1ZXN0ZWQgPSBmYWxzZTtcblxuICAgICAgICB0aGlzLm1heElkbGVUaW1lID0gdGhpcy5vcHRpb25zLm1heElkbGVUaW1lIHx8IGZhbHNlO1xuICAgICAgICB0aGlzLm1pc3NpbmdJZGxlQ29tbWFuZCA9ICh0aGlzLm9wdGlvbnMubWlzc2luZ0lkbGVDb21tYW5kIHx8ICcnKS50b1N0cmluZygpLnRvVXBwZXJDYXNlKCkudHJpbSgpIHx8ICdOT09QJztcblxuICAgICAgICB0aGlzLmRpc2FibGVCaW5hcnkgPSAhIXRoaXMub3B0aW9ucy5kaXNhYmxlQmluYXJ5O1xuXG4gICAgICAgIHRoaXMuc3RyZWFtZXIub24oJ2Vycm9yJywgZXJyID0+IHtcbiAgICAgICAgICAgIGlmIChbJ1pfQlVGX0VSUk9SJywgJ0VDT05OUkVTRVQnLCAnRVBJUEUnLCAnRVRJTUVET1VUJywgJ0VIT1NUVU5SRUFDSCddLmluY2x1ZGVzKGVyci5jb2RlKSkge1xuICAgICAgICAgICAgICAgIC8vIGp1c3QgY2xvc2UgdGhlIGNvbm5lY3Rpb24sIHVzdWFsbHkgbm90aGluZyBidXQgbm9pc2VcbiAgICAgICAgICAgICAgICByZXR1cm4gc2V0SW1tZWRpYXRlKCgpID0+IHRoaXMuY2xvc2UoKSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMubG9nLmVycm9yKHsgZXJyLCBjaWQ6IHRoaXMuaWQgfSk7XG4gICAgICAgICAgICBzZXRJbW1lZGlhdGUoKCkgPT4gdGhpcy5jbG9zZSgpKTtcbiAgICAgICAgICAgIHRoaXMuZW1pdEVycm9yKGVycik7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIEhhcyB0aGUgYGNvbm5lY3RgIG1ldGhvZCBhbHJlYWR5IGJlZW4gY2FsbGVkXG4gICAgICAgIHRoaXMuX2Nvbm5lY3RDYWxsZWQgPSBmYWxzZTtcbiAgICB9XG5cbiAgICBlbWl0RXJyb3IoZXJyKSB7XG4gICAgICAgIHRoaXMuZW1pdCgnZXJyb3InLCBlcnIpO1xuICAgIH1cblxuICAgIGdldFJhbmRvbUlkKCkge1xuICAgICAgICBsZXQgcmlkID0gQmlnSW50KCcweCcgKyBjcnlwdG8ucmFuZG9tQnl0ZXMoMTMpLnRvU3RyaW5nKCdoZXgnKSkudG9TdHJpbmcoMzYpO1xuICAgICAgICBpZiAocmlkLmxlbmd0aCA8IDIwKSB7XG4gICAgICAgICAgICByaWQgPSAnMCcucmVwZWF0KDIwIC0gcmlkLmxlbmd0aCkgKyByaWQ7XG4gICAgICAgIH0gZWxzZSBpZiAocmlkLmxlbmd0aCA+IDIwKSB7XG4gICAgICAgICAgICByaWQgPSByaWQuc3Vic3RyKDAsIDIwKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmlkO1xuICAgIH1cblxuICAgIHdyaXRlKGNodW5rKSB7XG4gICAgICAgIGlmICh0aGlzLnNvY2tldC5kZXN0cm95ZWQpIHtcbiAgICAgICAgICAgIC8vIGRvIG5vdCB3cml0ZSBhZnRlciBjb25uZWN0aW9uIGVuZCBvciBsb2dvdXRcbiAgICAgICAgICAgIGNvbnN0IGVycm9yID0gbmV3IEVycm9yKCdTb2NrZXQgaXMgYWxyZWFkeSBjbG9zZWQnKTtcbiAgICAgICAgICAgIGVycm9yLmNvZGUgPSAnTm9Db25uZWN0aW9uJztcbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuc3RhdGUgPT09IHRoaXMuc3RhdGVzLkxPR09VVCkge1xuICAgICAgICAgICAgLy8gc2hvdWxkIG5vdCBoYXBwZW5cbiAgICAgICAgICAgIGNvbnN0IGVycm9yID0gbmV3IEVycm9yKCdDYW4gbm90IHNlbmQgZGF0YSBhZnRlciBsb2dnZWQgb3V0Jyk7XG4gICAgICAgICAgICBlcnJvci5jb2RlID0gJ1N0YXRlTG9nb3V0JztcbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMud3JpdGVTb2NrZXQuZGVzdHJveWVkKSB7XG4gICAgICAgICAgICB0aGlzLnNvY2tldC5lbWl0KCdlcnJvcicsICdXcml0ZSBzb2NrZXQgZGVzdHJveWVkJyk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgYWRkTGluZUJyZWFrID0gIXRoaXMuY29tbWFuZFBhcnRzLmxlbmd0aDtcbiAgICAgICAgaWYgKHR5cGVvZiBjaHVuayA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGlmIChhZGRMaW5lQnJlYWspIHtcbiAgICAgICAgICAgICAgICBjaHVuayArPSAnXFxyXFxuJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNodW5rID0gQnVmZmVyLmZyb20oY2h1bmssICdiaW5hcnknKTtcbiAgICAgICAgfSBlbHNlIGlmIChCdWZmZXIuaXNCdWZmZXIoY2h1bmspKSB7XG4gICAgICAgICAgICBpZiAoYWRkTGluZUJyZWFrKSB7XG4gICAgICAgICAgICAgICAgY2h1bmsgPSBCdWZmZXIuY29uY2F0KFtjaHVuaywgQnVmZmVyLmZyb20oJ1xcclxcbicpXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5sb2dSYXcpIHtcbiAgICAgICAgICAgIHRoaXMubG9nLnRyYWNlKHtcbiAgICAgICAgICAgICAgICBzcmM6ICdjJyxcbiAgICAgICAgICAgICAgICBtc2c6ICd3cml0ZSB0byBzb2NrZXQnLFxuICAgICAgICAgICAgICAgIGRhdGE6IGNodW5rLnRvU3RyaW5nKCdiYXNlNjQnKSxcbiAgICAgICAgICAgICAgICBjb21wcmVzczogISF0aGlzLl9kZWZsYXRlLFxuICAgICAgICAgICAgICAgIHNlY3VyZTogISF0aGlzLnNlY3VyZUNvbm5lY3Rpb24sXG4gICAgICAgICAgICAgICAgY2lkOiB0aGlzLmlkXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMud3JpdGVCeXRlc0NvdW50ZXIgKz0gY2h1bmsubGVuZ3RoO1xuXG4gICAgICAgIHRoaXMud3JpdGVTb2NrZXQud3JpdGUoY2h1bmspO1xuICAgIH1cblxuICAgIHN0YXRzKHJlc2V0KSB7XG4gICAgICAgIGxldCByZXN1bHQgPSB7XG4gICAgICAgICAgICBzZW50OiB0aGlzLndyaXRlQnl0ZXNDb3VudGVyIHx8IDAsXG4gICAgICAgICAgICByZWNlaXZlZDogKHRoaXMuc3RyZWFtZXIgJiYgdGhpcy5zdHJlYW1lci5yZWFkQnl0ZXNDb3VudGVyKSB8fCAwXG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKHJlc2V0KSB7XG4gICAgICAgICAgICB0aGlzLndyaXRlQnl0ZXNDb3VudGVyID0gMDtcbiAgICAgICAgICAgIGlmICh0aGlzLnN0cmVhbWVyKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zdHJlYW1lci5yZWFkQnl0ZXNDb3VudGVyID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgYXN5bmMgc2VuZChkYXRhKSB7XG4gICAgICAgIGlmICh0aGlzLnN0YXRlID09PSB0aGlzLnN0YXRlcy5MT0dPVVQpIHtcbiAgICAgICAgICAgIC8vIGFscmVhZHkgbG9nZ2VkIG91dFxuICAgICAgICAgICAgaWYgKGRhdGEudGFnKSB7XG4gICAgICAgICAgICAgICAgbGV0IHJlcXVlc3QgPSB0aGlzLnJlcXVlc3RUYWdNYXAuZ2V0KGRhdGEudGFnKTtcbiAgICAgICAgICAgICAgICBpZiAocmVxdWVzdCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlcXVlc3RUYWdNYXAuZGVsZXRlKHJlcXVlc3QudGFnKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZXJyb3IgPSBuZXcgRXJyb3IoJ0Nvbm5lY3Rpb24gbm90IGF2YWlsYWJsZScpO1xuICAgICAgICAgICAgICAgICAgICBlcnJvci5jb2RlID0gJ05vQ29ubmVjdGlvbic7XG4gICAgICAgICAgICAgICAgICAgIHJlcXVlc3QucmVqZWN0KGVycm9yKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgY29tcGlsZWQgPSBhd2FpdCBjb21waWxlcihkYXRhLCB7XG4gICAgICAgICAgICBhc0FycmF5OiB0cnVlLFxuICAgICAgICAgICAgbGl0ZXJhbE1pbnVzOiB0aGlzLmNhcGFiaWxpdGllcy5oYXMoJ0xJVEVSQUwtJykgfHwgdGhpcy5jYXBhYmlsaXRpZXMuaGFzKCdMSVRFUkFMKycpXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmNvbW1hbmRQYXJ0cyA9IGNvbXBpbGVkO1xuXG4gICAgICAgIGxldCBsb2dDb21waWxlZCA9IGF3YWl0IGNvbXBpbGVyKGRhdGEsIHtcbiAgICAgICAgICAgIGlzTG9nZ2luZzogdHJ1ZVxuICAgICAgICB9KTtcblxuICAgICAgICBsZXQgb3B0aW9ucyA9IGRhdGEub3B0aW9ucyB8fCB7fTtcblxuICAgICAgICB0aGlzLmxvZy5kZWJ1Zyh7IHNyYzogJ3MnLCBtc2c6IGxvZ0NvbXBpbGVkLnRvU3RyaW5nKCksIGNpZDogdGhpcy5pZCwgY29tbWVudDogb3B0aW9ucy5jb21tZW50IH0pO1xuXG4gICAgICAgIHRoaXMud3JpdGUodGhpcy5jb21tYW5kUGFydHMuc2hpZnQoKSk7XG5cbiAgICAgICAgaWYgKHR5cGVvZiBvcHRpb25zLm9uU2VuZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgb3B0aW9ucy5vblNlbmQoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGFzeW5jIHRyeVNlbmQoKSB7XG4gICAgICAgIGlmICh0aGlzLmN1cnJlbnRSZXF1ZXN0IHx8ICF0aGlzLnJlcXVlc3RRdWV1ZS5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmN1cnJlbnRSZXF1ZXN0ID0gdGhpcy5yZXF1ZXN0UXVldWUuc2hpZnQoKTtcblxuICAgICAgICBhd2FpdCB0aGlzLnNlbmQoe1xuICAgICAgICAgICAgdGFnOiB0aGlzLmN1cnJlbnRSZXF1ZXN0LnRhZyxcbiAgICAgICAgICAgIGNvbW1hbmQ6IHRoaXMuY3VycmVudFJlcXVlc3QuY29tbWFuZCxcbiAgICAgICAgICAgIGF0dHJpYnV0ZXM6IHRoaXMuY3VycmVudFJlcXVlc3QuYXR0cmlidXRlcyxcbiAgICAgICAgICAgIG9wdGlvbnM6IHRoaXMuY3VycmVudFJlcXVlc3Qub3B0aW9uc1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBhc3luYyBleGVjKGNvbW1hbmQsIGF0dHJpYnV0ZXMsIG9wdGlvbnMpIHtcbiAgICAgICAgaWYgKHRoaXMuc29ja2V0LmRlc3Ryb3llZCkge1xuICAgICAgICAgICAgbGV0IGVycm9yID0gbmV3IEVycm9yKCdDb25uZWN0aW9uIGNsb3NlZCcpO1xuICAgICAgICAgICAgZXJyb3IuY29kZSA9ICdFQ29ubmVjdGlvbkNsb3NlZCc7XG4gICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCB0YWcgPSAoKyt0aGlzLnRhZ0NvdW50ZXIpLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpO1xuXG4gICAgICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuXG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICB0aGlzLnJlcXVlc3RUYWdNYXAuc2V0KHRhZywgeyBjb21tYW5kLCBhdHRyaWJ1dGVzLCBvcHRpb25zLCByZXNvbHZlLCByZWplY3QgfSk7XG4gICAgICAgICAgICB0aGlzLnJlcXVlc3RRdWV1ZS5wdXNoKHsgdGFnLCBjb21tYW5kLCBhdHRyaWJ1dGVzLCBvcHRpb25zIH0pO1xuICAgICAgICAgICAgdGhpcy50cnlTZW5kKCkuY2F0Y2goZXJyID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnJlcXVlc3RUYWdNYXAuZGVsZXRlKHRhZyk7XG4gICAgICAgICAgICAgICAgcmVqZWN0KGVycik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgZ2V0VW50YWdnZWRIYW5kbGVyKGNvbW1hbmQsIGF0dHJpYnV0ZXMpIHtcbiAgICAgICAgaWYgKC9eWzAtOV0rJC8udGVzdChjb21tYW5kKSkge1xuICAgICAgICAgICAgbGV0IHR5cGUgPSBhdHRyaWJ1dGVzICYmIGF0dHJpYnV0ZXMubGVuZ3RoICYmIHR5cGVvZiBhdHRyaWJ1dGVzWzBdLnZhbHVlID09PSAnc3RyaW5nJyA/IGF0dHJpYnV0ZXNbMF0udmFsdWUudG9VcHBlckNhc2UoKSA6IGZhbHNlO1xuICAgICAgICAgICAgaWYgKHR5cGUpIHtcbiAgICAgICAgICAgICAgICAvLyBFWElTVFMsIEVYUFVOR0UsIFJFQ0VOVCwgRkVUQ0ggZXRjXG4gICAgICAgICAgICAgICAgY29tbWFuZCA9IHR5cGU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb21tYW5kID0gY29tbWFuZC50b1VwcGVyQ2FzZSgpLnRyaW0oKTtcbiAgICAgICAgaWYgKHRoaXMuY3VycmVudFJlcXVlc3QgJiYgdGhpcy5jdXJyZW50UmVxdWVzdC5vcHRpb25zICYmIHRoaXMuY3VycmVudFJlcXVlc3Qub3B0aW9ucy51bnRhZ2dlZCAmJiB0aGlzLmN1cnJlbnRSZXF1ZXN0Lm9wdGlvbnMudW50YWdnZWRbY29tbWFuZF0pIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmN1cnJlbnRSZXF1ZXN0Lm9wdGlvbnMudW50YWdnZWRbY29tbWFuZF07XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy51bnRhZ2dlZEhhbmRsZXJzW2NvbW1hbmRdKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy51bnRhZ2dlZEhhbmRsZXJzW2NvbW1hbmRdO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZ2V0U2VjdGlvbkhhbmRsZXIoa2V5KSB7XG4gICAgICAgIGlmICh0aGlzLnNlY3Rpb25IYW5kbGVyc1trZXldKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5zZWN0aW9uSGFuZGxlcnNba2V5XTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGFzeW5jIHJlYWRlcigpIHtcbiAgICAgICAgbGV0IGRhdGE7XG4gICAgICAgIHdoaWxlICgoZGF0YSA9IHRoaXMuc3RyZWFtZXIucmVhZCgpKSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgbGV0IHBhcnNlZDtcblxuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBwYXJzZWQgPSBhd2FpdCBwYXJzZXIoZGF0YS5wYXlsb2FkLCB7IGxpdGVyYWxzOiBkYXRhLmxpdGVyYWxzIH0pO1xuICAgICAgICAgICAgICAgIGlmIChwYXJzZWQudGFnICYmICFbJyonLCAnKyddLmluY2x1ZGVzKHBhcnNlZC50YWcpICYmIHBhcnNlZC5jb21tYW5kKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBwYXlsb2FkID0geyByZXNwb25zZTogcGFyc2VkLmNvbW1hbmQgfTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJzZWQuYXR0cmlidXRlcyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VkLmF0dHJpYnV0ZXNbMF0gJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlZC5hdHRyaWJ1dGVzWzBdLnNlY3Rpb24gJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlZC5hdHRyaWJ1dGVzWzBdLnNlY3Rpb25bMF0gJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlZC5hdHRyaWJ1dGVzWzBdLnNlY3Rpb25bMF0udHlwZSA9PT0gJ0FUT00nXG4gICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcGF5bG9hZC5jb2RlID0gcGFyc2VkLmF0dHJpYnV0ZXNbMF0uc2VjdGlvblswXS52YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmVtaXQoJ3Jlc3BvbnNlJywgcGF5bG9hZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgLy8gY2FuIG5vdCBtYWtlIHNlbnNlIG9mIHRoaXNcbiAgICAgICAgICAgICAgICB0aGlzLmxvZy5lcnJvcih7IHNyYzogJ3MnLCBtc2c6IGRhdGEucGF5bG9hZC50b1N0cmluZygpLCBlcnIsIGNpZDogdGhpcy5pZCB9KTtcbiAgICAgICAgICAgICAgICBkYXRhLm5leHQoKTtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbGV0IGxvZ0NvbXBpbGVkID0gYXdhaXQgY29tcGlsZXIocGFyc2VkLCB7XG4gICAgICAgICAgICAgICAgaXNMb2dnaW5nOiB0cnVlXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgaWYgKC9eXFxkKyQvLnRlc3QocGFyc2VkLmNvbW1hbmQpICYmIHBhcnNlZC5hdHRyaWJ1dGVzICYmIHBhcnNlZC5hdHRyaWJ1dGVzWzBdICYmIHBhcnNlZC5hdHRyaWJ1dGVzWzBdLnZhbHVlID09PSAnRkVUQ0gnKSB7XG4gICAgICAgICAgICAgICAgLy8gdG9vIG1hbnkgRkVUQ0ggcmVzcG9uc2VzLCBtaWdodCB3YW50IHRvIGZpbHRlciB0aGVzZSBvdXRcbiAgICAgICAgICAgICAgICB0aGlzLmxvZy50cmFjZSh7IHNyYzogJ3MnLCBtc2c6IGxvZ0NvbXBpbGVkLnRvU3RyaW5nKCksIGNpZDogdGhpcy5pZCwgbnVsbEJ5dGVzUmVtb3ZlZDogcGFyc2VkLm51bGxCeXRlc1JlbW92ZWQgfSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMubG9nLmRlYnVnKHsgc3JjOiAncycsIG1zZzogbG9nQ29tcGlsZWQudG9TdHJpbmcoKSwgY2lkOiB0aGlzLmlkLCBudWxsQnl0ZXNSZW1vdmVkOiBwYXJzZWQubnVsbEJ5dGVzUmVtb3ZlZCB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHBhcnNlZC50YWcgPT09ICcrJyAmJiB0aGlzLmN1cnJlbnRSZXF1ZXN0ICYmIHRoaXMuY3VycmVudFJlcXVlc3Qub3B0aW9ucyAmJiB0eXBlb2YgdGhpcy5jdXJyZW50UmVxdWVzdC5vcHRpb25zLm9uUGx1c1RhZyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuY3VycmVudFJlcXVlc3Qub3B0aW9ucy5vblBsdXNUYWcocGFyc2VkKTtcbiAgICAgICAgICAgICAgICBkYXRhLm5leHQoKTtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHBhcnNlZC50YWcgPT09ICcrJyAmJiB0aGlzLmNvbW1hbmRQYXJ0cy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBsZXQgY29udGVudCA9IHRoaXMuY29tbWFuZFBhcnRzLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgdGhpcy53cml0ZShjb250ZW50KTtcbiAgICAgICAgICAgICAgICB0aGlzLmxvZy5kZWJ1Zyh7IHNyYzogJ2MnLCBtc2c6IGAoKiAke2NvbnRlbnQubGVuZ3RofUIgY29udGludWF0aW9uICopYCwgY2lkOiB0aGlzLmlkIH0pO1xuICAgICAgICAgICAgICAgIGRhdGEubmV4dCgpO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsZXQgc2VjdGlvbiA9IHBhcnNlZC5hdHRyaWJ1dGVzICYmIHBhcnNlZC5hdHRyaWJ1dGVzLmxlbmd0aCAmJiBwYXJzZWQuYXR0cmlidXRlc1swXSAmJiAhcGFyc2VkLmF0dHJpYnV0ZXNbMF0udmFsdWUgJiYgcGFyc2VkLmF0dHJpYnV0ZXNbMF0uc2VjdGlvbjtcbiAgICAgICAgICAgIGlmIChzZWN0aW9uICYmIHNlY3Rpb24ubGVuZ3RoICYmIHNlY3Rpb25bMF0udHlwZSA9PT0gJ0FUT00nICYmIHR5cGVvZiBzZWN0aW9uWzBdLnZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgIGxldCBzZWN0aW9uSGFuZGxlciA9IHRoaXMuZ2V0U2VjdGlvbkhhbmRsZXIoc2VjdGlvblswXS52YWx1ZS50b1VwcGVyQ2FzZSgpLnRyaW0oKSk7XG4gICAgICAgICAgICAgICAgaWYgKHNlY3Rpb25IYW5kbGVyKSB7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHNlY3Rpb25IYW5kbGVyKHNlY3Rpb24uc2xpY2UoMSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHBhcnNlZC50YWcgPT09ICcqJyAmJiBwYXJzZWQuY29tbWFuZCkge1xuICAgICAgICAgICAgICAgIGxldCB1bnRhZ2dlZEhhbmRsZXIgPSB0aGlzLmdldFVudGFnZ2VkSGFuZGxlcihwYXJzZWQuY29tbWFuZCwgcGFyc2VkLmF0dHJpYnV0ZXMpO1xuICAgICAgICAgICAgICAgIGlmICh1bnRhZ2dlZEhhbmRsZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHVudGFnZ2VkSGFuZGxlcihwYXJzZWQpO1xuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9nLndhcm4oeyBlcnIsIGNpZDogdGhpcy5pZCB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEubmV4dCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0aGlzLnJlcXVlc3RUYWdNYXAuaGFzKHBhcnNlZC50YWcpKSB7XG4gICAgICAgICAgICAgICAgbGV0IHJlcXVlc3QgPSB0aGlzLnJlcXVlc3RUYWdNYXAuZ2V0KHBhcnNlZC50YWcpO1xuICAgICAgICAgICAgICAgIHRoaXMucmVxdWVzdFRhZ01hcC5kZWxldGUocGFyc2VkLnRhZyk7XG5cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5jdXJyZW50UmVxdWVzdCAmJiB0aGlzLmN1cnJlbnRSZXF1ZXN0LnRhZyA9PT0gcGFyc2VkLnRhZykge1xuICAgICAgICAgICAgICAgICAgICAvLyBzZW5kIG5leHQgcGVuZGluZyBjb21tYW5kXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudFJlcXVlc3QgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy50cnlTZW5kKCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgc3dpdGNoIChwYXJzZWQuY29tbWFuZC50b1VwcGVyQ2FzZSgpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ09LJzpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnQllFJzpcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKHJlc29sdmUgPT4gcmVxdWVzdC5yZXNvbHZlKHsgcmVzcG9uc2U6IHBhcnNlZCwgbmV4dDogcmVzb2x2ZSB9KSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgICAgICBjYXNlICdOTyc6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ0JBRCc6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0eHQgPVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlZC5hdHRyaWJ1dGVzICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VkLmF0dHJpYnV0ZXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmZpbHRlcih2YWwgPT4gdmFsLnR5cGUgPT09ICdURVhUJylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1hcCh2YWwgPT4gdmFsLnZhbHVlLnRyaW0oKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmpvaW4oJyAnKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGVyciA9IG5ldyBFcnJvcignQ29tbWFuZCBmYWlsZWQnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVyci5yZXNwb25zZSA9IHBhcnNlZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVyci5yZXNwb25zZVN0YXR1cyA9IHBhcnNlZC5jb21tYW5kLnRvVXBwZXJDYXNlKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyLmV4ZWN1dGVkQ29tbWFuZCA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlZC50YWcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBjb21waWxlcihyZXF1ZXN0LCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNMb2dnaW5nOiB0cnVlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmVcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR4dCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyci5yZXNwb25zZVRleHQgPSB0eHQ7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXJyLnJlc3BvbnNlU3RhdHVzID09PSAnTk8nICYmIHR4dC5pbmNsdWRlcygnU29tZSBvZiB0aGUgcmVxdWVzdGVkIG1lc3NhZ2VzIG5vIGxvbmdlciBleGlzdCcpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRyZWF0IGFzIHN1Y2Nlc3NmdWwgcmVzcG9uc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2cud2Fybih7IG1zZzogJ1BhcnRpYWwgRkVUQ0ggcmVzcG9uc2UnLCBjaWQ6IHRoaXMuaWQsIGVyciB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgbmV3IFByb21pc2UocmVzb2x2ZSA9PiByZXF1ZXN0LnJlc29sdmUoeyByZXNwb25zZTogcGFyc2VkLCBuZXh0OiByZXNvbHZlIH0pKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRocm90dGxlRGVsYXkgPSBmYWxzZTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE1TMzY1IHRocm90dGxpbmdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0YWcgQkFEIFJlcXVlc3QgaXMgdGhyb3R0bGVkLiBTdWdnZXN0ZWQgQmFja29mZiBUaW1lOiA5MjQxNSBtaWxsaXNlY29uZHNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoL1JlcXVlc3QgaXMgdGhyb3R0bGVkL2kudGVzdCh0eHQpICYmIC9CYWNrb2ZmIFRpbWUvaS50ZXN0KHR4dCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRocm90dGxpbmdNYXRjaCA9IHR4dC5tYXRjaCgvQmFja29mZiBUaW1lWzo9XFxzXSsoXFxkKykvaSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aHJvdHRsaW5nTWF0Y2ggJiYgdGhyb3R0bGluZ01hdGNoWzFdICYmICFpc05hTih0aHJvdHRsaW5nTWF0Y2hbMV0pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdHRsZURlbGF5ID0gTnVtYmVyKHRocm90dGxpbmdNYXRjaFsxXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBXYWl0IGFuZCByZXR1cm4gYSB0aHJvdHRsaW5nIGVycm9yXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRocm90dGxlRGVsYXkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyLmNvZGUgPSAnRVRIUk9UVExFJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyLnRocm90dGxlUmVzZXQgPSB0aHJvdHRsZURlbGF5O1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBkZWxheVJlc3BvbnNlID0gdGhyb3R0bGVEZWxheTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlbGF5UmVzcG9uc2UgPiA1ICogNjAgKiAxMDAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtYXggZGVsYXkgY2FwXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxheVJlc3BvbnNlID0gNSAqIDYwICogMTAwMDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9nLndhcm4oeyBtc2c6ICdUaHJvdHRsaW5nIGRldGVjdGVkJywgY2lkOiB0aGlzLmlkLCB0aHJvdHRsZURlbGF5LCBkZWxheVJlc3BvbnNlLCBlcnIgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKHIgPT4gc2V0VGltZW91dChyLCBkZWxheVJlc3BvbnNlKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LnJlamVjdChlcnIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgZXJyID0gbmV3IEVycm9yKCdJbnZhbGlkIHNlcnZlciByZXNwb25zZScpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZXJyLmNvZGUgPSAnSW52YWxpZFJlc3BvbnNlJztcbiAgICAgICAgICAgICAgICAgICAgICAgIGVyci5yZXNwb25zZSA9IHBhcnNlZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QucmVqZWN0KGVycik7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZGF0YS5uZXh0KCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzZXRFdmVudEhhbmRsZXJzKCkge1xuICAgICAgICB0aGlzLnNvY2tldFJlYWRhYmxlID0gKCkgPT4ge1xuICAgICAgICAgICAgaWYgKCF0aGlzLnJlYWRpbmcpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJlYWRpbmcgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHRoaXMucmVhZGVyKClcbiAgICAgICAgICAgICAgICAgICAgLmNhdGNoKGVyciA9PiB0aGlzLmxvZy5lcnJvcih7IGVyciwgY2lkOiB0aGlzLmlkIH0pKVxuICAgICAgICAgICAgICAgICAgICAuZmluYWxseSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgdGhpcy5zdHJlYW1lci5vbigncmVhZGFibGUnLCB0aGlzLnNvY2tldFJlYWRhYmxlKTtcbiAgICB9XG5cbiAgICBzZXRTb2NrZXRIYW5kbGVycygpIHtcbiAgICAgICAgdGhpcy5fc29ja2V0RXJyb3IgPVxuICAgICAgICAgICAgdGhpcy5fc29ja2V0RXJyb3IgfHxcbiAgICAgICAgICAgIChlcnIgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMubG9nLmVycm9yKHsgZXJyLCBjaWQ6IHRoaXMuaWQgfSk7XG4gICAgICAgICAgICAgICAgc2V0SW1tZWRpYXRlKCgpID0+IHRoaXMuY2xvc2UoKSk7XG4gICAgICAgICAgICAgICAgdGhpcy5lbWl0RXJyb3IoZXJyKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB0aGlzLl9zb2NrZXRDbG9zZSA9XG4gICAgICAgICAgICB0aGlzLl9zb2NrZXRDbG9zZSB8fFxuICAgICAgICAgICAgKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmNsb3NlKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5fc29ja2V0RW5kID1cbiAgICAgICAgICAgIHRoaXMuX3NvY2tldEVuZCB8fFxuICAgICAgICAgICAgKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmNsb3NlKCk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLl9zb2NrZXRUaW1lb3V0ID1cbiAgICAgICAgICAgIHRoaXMuX3NvY2tldFRpbWVvdXQgfHxcbiAgICAgICAgICAgICgoKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaWRsaW5nKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucnVuKCdOT09QJylcbiAgICAgICAgICAgICAgICAgICAgICAgIC50aGVuKCgpID0+IHRoaXMuaWRsZSgpKVxuICAgICAgICAgICAgICAgICAgICAgICAgLmNhdGNoKHRoaXMuX3NvY2tldEVycm9yKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZy5kZWJ1Zyh7IG1zZzogJ1NvY2tldCB0aW1lb3V0JywgY2lkOiB0aGlzLmlkIH0pO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNsb3NlKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5zb2NrZXQub24oJ2Vycm9yJywgdGhpcy5fc29ja2V0RXJyb3IpO1xuICAgICAgICB0aGlzLnNvY2tldC5vbignY2xvc2UnLCB0aGlzLl9zb2NrZXRDbG9zZSk7XG4gICAgICAgIHRoaXMuc29ja2V0Lm9uKCdlbmQnLCB0aGlzLl9zb2NrZXRFbmQpO1xuICAgICAgICB0aGlzLnNvY2tldC5vbigndGxzQ2xpZW50RXJyb3InLCB0aGlzLl9zb2NrZXRFcnJvcik7XG4gICAgICAgIHRoaXMuc29ja2V0Lm9uKCd0aW1lb3V0JywgdGhpcy5fc29ja2V0VGltZW91dCk7XG5cbiAgICAgICAgdGhpcy53cml0ZVNvY2tldC5vbignZXJyb3InLCB0aGlzLl9zb2NrZXRFcnJvcik7XG4gICAgfVxuXG4gICAgY2xlYXJTb2NrZXRIYW5kbGVycygpIHtcbiAgICAgICAgaWYgKHRoaXMuX3NvY2tldEVycm9yKSB7XG4gICAgICAgICAgICB0aGlzLnNvY2tldC5yZW1vdmVMaXN0ZW5lcignZXJyb3InLCB0aGlzLl9zb2NrZXRFcnJvcik7XG4gICAgICAgICAgICB0aGlzLnNvY2tldC5yZW1vdmVMaXN0ZW5lcigndGxzQ2xpZW50RXJyb3InLCB0aGlzLl9zb2NrZXRFcnJvcik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX3NvY2tldENsb3NlKSB7XG4gICAgICAgICAgICB0aGlzLnNvY2tldC5yZW1vdmVMaXN0ZW5lcignY2xvc2UnLCB0aGlzLl9zb2NrZXRDbG9zZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX3NvY2tldEVuZCkge1xuICAgICAgICAgICAgdGhpcy5zb2NrZXQucmVtb3ZlTGlzdGVuZXIoJ2VuZCcsIHRoaXMuX3NvY2tldEVuZCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhc3luYyBzdGFydFNlc3Npb24oKSB7XG4gICAgICAgIGF3YWl0IHRoaXMucnVuKCdDQVBBQklMSVRZJyk7XG5cbiAgICAgICAgaWYgKHRoaXMuY2FwYWJpbGl0aWVzLmhhcygnSUQnKSkge1xuICAgICAgICAgICAgdGhpcy5pZFJlcXVlc3RlZCA9IGF3YWl0IHRoaXMucnVuKCdJRCcsIHRoaXMuY2xpZW50SW5mbyk7XG4gICAgICAgIH1cblxuICAgICAgICBhd2FpdCB0aGlzLnVwZ3JhZGVUb1NUQVJUVExTKCk7XG5cbiAgICAgICAgYXdhaXQgdGhpcy5hdXRoZW50aWNhdGUoKTtcblxuICAgICAgICBpZiAoIXRoaXMuaWRSZXF1ZXN0ZWQgJiYgdGhpcy5jYXBhYmlsaXRpZXMuaGFzKCdJRCcpKSB7XG4gICAgICAgICAgICAvLyByZS1yZXF1ZXN0IElEIGFmdGVyIExPR0lOXG4gICAgICAgICAgICB0aGlzLmlkUmVxdWVzdGVkID0gYXdhaXQgdGhpcy5ydW4oJ0lEJywgdGhpcy5jbGllbnRJbmZvKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE1ha2Ugc3VyZSB3ZSBoYXZlIG5hbWVzcGFjZSBzZXQuIFRoaXMgc2hvdWxkIGFsc28gdGhyb3cgaWYgRXhjaGFuZ2UgYWN0dWFsbHkgZmFpbGVkIGF1dGhlbnRpY2F0aW9uXG4gICAgICAgIGxldCBuc1Jlc3BvbnNlID0gYXdhaXQgdGhpcy5ydW4oJ05BTUVTUEFDRScpO1xuICAgICAgICBpZiAobnNSZXNwb25zZSAmJiBuc1Jlc3BvbnNlLmVycm9yICYmIG5zUmVzcG9uc2Uuc3RhdHVzID09PSAnQkFEJyAmJiAvVXNlciBpcyBhdXRoZW50aWNhdGVkIGJ1dCBub3QgY29ubmVjdGVkL2kudGVzdChuc1Jlc3BvbnNlLnRleHQpKSB7XG4gICAgICAgICAgICAvLyBOb3QgYSBOQU1FU1BBQ0UgZmFpbHVyZSBidXQgYXV0aGVudGljYXRpb24gZmFpbHVyZSwgc28gcmVwb3J0IGFzXG4gICAgICAgICAgICB0aGlzLmF1dGhlbnRpY2F0ZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIGxldCBlcnIgPSBuZXcgQXV0aGVudGljYXRpb25GYWlsdXJlKCdBdXRoZW50aWNhdGlvbiBmYWlsZWQnKTtcbiAgICAgICAgICAgIGVyci5yZXNwb25zZSA9IG5zUmVzcG9uc2UudGV4dDtcbiAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMudmVyaWZ5T25seSkge1xuICAgICAgICAgICAgLy8gTGlzdCBhbGwgZm9sZGVycyBhbmQgbG9nb3V0XG4gICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmluY2x1ZGVNYWlsYm94ZXMpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9tYWlsYm94TGlzdCA9IGF3YWl0IHRoaXMubGlzdCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMubG9nb3V0KCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyB0cnkgdG8gdXNlIGNvbXByZXNzaW9uIChpZiBzdXBwb3J0ZWQpXG4gICAgICAgIGlmICghdGhpcy5vcHRpb25zLmRpc2FibGVDb21wcmVzc2lvbikge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5jb21wcmVzcygpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMuZGlzYWJsZUF1dG9FbmFibGUpIHtcbiAgICAgICAgICAgIC8vIGVuYWJsZSBleHRlbnNpb25zIGlmIHBvc3NpYmxlXG4gICAgICAgICAgICBhd2FpdCB0aGlzLnJ1bignRU5BQkxFJywgWydDT05EU1RPUkUnLCAnVVRGOD1BQ0NFUFQnXS5jb25jYXQodGhpcy5vcHRpb25zLnFyZXN5bmMgPyAnUVJFU1lOQycgOiBbXSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy51c2FibGUgPSB0cnVlO1xuICAgIH1cblxuICAgIGFzeW5jIGNvbXByZXNzKCkge1xuICAgICAgICBpZiAoIShhd2FpdCB0aGlzLnJ1bignQ09NUFJFU1MnKSkpIHtcbiAgICAgICAgICAgIHJldHVybjsgLy8gd2FzIG5vdCBhYmxlIHRvIG5lZ290aWF0ZSBjb21wcmVzc2lvblxuICAgICAgICB9XG5cbiAgICAgICAgLy8gY3JlYXRlIGRlZmxhdGUvaW5mbGF0ZSBzdHJlYW1zXG4gICAgICAgIHRoaXMuX2RlZmxhdGUgPSB6bGliLmNyZWF0ZURlZmxhdGVSYXcoe1xuICAgICAgICAgICAgd2luZG93Qml0czogMTVcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuX2luZmxhdGUgPSB6bGliLmNyZWF0ZUluZmxhdGVSYXcoKTtcblxuICAgICAgICAvLyByb3V0ZSBpbmNvbWluZyBzb2NrZXQgdmlhIGluZmxhdGUgc3RyZWFtXG4gICAgICAgIHRoaXMuc29ja2V0LnVucGlwZSh0aGlzLnN0cmVhbWVyKTtcbiAgICAgICAgdGhpcy5zdHJlYW1lci5jb21wcmVzcyA9IHRydWU7XG4gICAgICAgIHRoaXMuc29ja2V0LnBpcGUodGhpcy5faW5mbGF0ZSkucGlwZSh0aGlzLnN0cmVhbWVyKTtcbiAgICAgICAgdGhpcy5faW5mbGF0ZS5vbignZXJyb3InLCBlcnIgPT4ge1xuICAgICAgICAgICAgdGhpcy5zdHJlYW1lci5lbWl0KCdlcnJvcicsIGVycik7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIHJvdXRlIG91dGdvaW5nIHNvY2tldCB2aWEgZGVmbGF0ZSBzdHJlYW1cbiAgICAgICAgdGhpcy53cml0ZVNvY2tldCA9IG5ldyBQYXNzVGhyb3VnaCgpO1xuXG4gICAgICAgIHRoaXMud3JpdGVTb2NrZXQuZGVzdHJveVNvb24gPSAoKSA9PiB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnNvY2tldCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNvY2tldC5kZXN0cm95KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMud3JpdGVTb2NrZXQuZW5kKCk7XG4gICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxvZy5lcnJvcih7IGVyciwgaW5mbzogJ0ZhaWxlZCB0byBkZXN0cm95IFBhc3NUaHJvdWdoIHNvY2tldCcsIGNpZDogdGhpcy5pZCB9KTtcbiAgICAgICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMud3JpdGVTb2NrZXQsICdkZXN0cm95ZWQnLCB7XG4gICAgICAgICAgICBnZXQ6ICgpID0+IHRoaXMuc29ja2V0LmRlc3Ryb3llZFxuICAgICAgICB9KTtcblxuICAgICAgICAvLyB3ZSBuZWVkIHRvIGZvcmNlIGZsdXNoIGRlZmxhdGVkIGRhdGEgdG8gc29ja2V0IHNvIHdlIGNhbid0XG4gICAgICAgIC8vIHVzZSBub3JtYWwgcGlwZXMgZm9yIHRoaXMud3JpdGVTb2NrZXQgLT4gdGhpcy5fZGVmbGF0ZSAtPiB0aGlzLnNvY2tldFxuICAgICAgICBsZXQgcmVhZGluZyA9IGZhbHNlO1xuICAgICAgICBsZXQgcmVhZE5leHQgPSAoKSA9PiB7XG4gICAgICAgICAgICByZWFkaW5nID0gdHJ1ZTtcblxuICAgICAgICAgICAgbGV0IGNodW5rO1xuICAgICAgICAgICAgd2hpbGUgKChjaHVuayA9IHRoaXMud3JpdGVTb2NrZXQucmVhZCgpKSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9kZWZsYXRlICYmIHRoaXMuX2RlZmxhdGUud3JpdGUoY2h1bmspID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fZGVmbGF0ZS5vbmNlKCdkcmFpbicsIHJlYWROZXh0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIGZsdXNoIGRhdGEgdG8gc29ja2V0XG4gICAgICAgICAgICBpZiAodGhpcy5fZGVmbGF0ZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2RlZmxhdGUuZmx1c2goKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmVhZGluZyA9IGZhbHNlO1xuICAgICAgICB9O1xuXG4gICAgICAgIHRoaXMud3JpdGVTb2NrZXQub24oJ3JlYWRhYmxlJywgKCkgPT4ge1xuICAgICAgICAgICAgaWYgKCFyZWFkaW5nKSB7XG4gICAgICAgICAgICAgICAgcmVhZE5leHQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMud3JpdGVTb2NrZXQub24oJ2Vycm9yJywgZXJyID0+IHtcbiAgICAgICAgICAgIHRoaXMuc29ja2V0LmVtaXQoJ2Vycm9yJywgZXJyKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5fZGVmbGF0ZS5waXBlKHRoaXMuc29ja2V0KTtcbiAgICAgICAgdGhpcy5fZGVmbGF0ZS5vbignZXJyb3InLCBlcnIgPT4ge1xuICAgICAgICAgICAgdGhpcy5zb2NrZXQuZW1pdCgnZXJyb3InLCBlcnIpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBfZmFpbFNUQVJUVExTKCkge1xuICAgICAgICBpZiAodGhpcy5vcHRpb25zLmRvU1RBUlRUTFMgPT09IHRydWUpIHtcbiAgICAgICAgICAgIC8vIFNUQVJUVExTIGNvbmZpZ3VyZWQgYXMgcmVxdWlyZW1lbnRcbiAgICAgICAgICAgIGxldCBlcnIgPSBuZXcgRXJyb3IoJ1NlcnZlciBkb2VzIG5vdCBzdXBwb3J0IFNUQVJUVExTJyk7XG4gICAgICAgICAgICBlcnIudGxzRmFpbGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIE9wcG9ydHVuaXN0aWMgU1RBUlRUTFMuIEJ1dCBpdCdzIG5vdCBwb3NzaWJsZSByaWdodCBub3cuXG4gICAgICAgICAgICAvLyBBdHRlbnRpb246IENvdWxkIGJlIGEgZG93bmdyYWRlIGF0dGFjay5cbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRyaWVzIHRvIHVwZ3JhZGUgdGhlIGNvbm5lY3Rpb24gdG8gVExTIHVzaW5nIFNUQVJUVExTLlxuICAgICAqIEB0aHJvd3MgaWYgU1RBUlRUTFMgaXMgcmVxdWlyZWQsIGJ1dCBub3QgcG9zc2libGUuXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IHRydWUsIGlmIHRoZSBjb25uZWN0aW9uIGlzIG5vdyBwcm90ZWN0ZWQgYnkgVExTLCBlaXRoZXIgZGlyZWN0IFRMUyBvciBTVEFSVFRMUy5cbiAgICAgKi9cbiAgICBhc3luYyB1cGdyYWRlVG9TVEFSVFRMUygpIHtcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5kb1NUQVJUVExTID09PSB0cnVlICYmIHRoaXMub3B0aW9ucy5zZWN1cmUgPT09IHRydWUpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignTWlzY29uZmlndXJhdGlvbjogQ2Fubm90IHNldCBib3RoIHNlY3VyZT10cnVlIGZvciBUTFMgYW5kIGRvU1RBUlRUTFM9dHJ1ZSBmb3IgU1RBUlRUTFMuJyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5zZWN1cmVDb25uZWN0aW9uKSB7XG4gICAgICAgICAgICAvLyBBbHJlYWR5IHVzaW5nIGRpcmVjdCBUTFMuIE5vIG5lZWQgZm9yIFNUQVJUVExTLlxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5vcHRpb25zLmRvU1RBUlRUTFMgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAvLyBTVEFSVFRMUyBleHBsaWN0bHkgZGlzYWJsZWQgYnkgY29uZmlnXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMuY2FwYWJpbGl0aWVzLmhhcygnU1RBUlRUTFMnKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2ZhaWxTVEFSVFRMUygpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5leHBlY3RDYXBhYmlsaXR5VXBkYXRlID0gdHJ1ZTtcbiAgICAgICAgbGV0IGNhblVwZ3JhZGUgPSBhd2FpdCB0aGlzLnJ1bignU1RBUlRUTFMnKTtcbiAgICAgICAgaWYgKCFjYW5VcGdyYWRlKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fZmFpbFNUQVJUVExTKCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnNvY2tldC51bnBpcGUodGhpcy5zdHJlYW1lcik7XG4gICAgICAgIGxldCB1cGdyYWRlZCA9IGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIGxldCBzb2NrZXRQbGFpbiA9IHRoaXMuc29ja2V0O1xuICAgICAgICAgICAgbGV0IG9wdHMgPSBPYmplY3QuYXNzaWduKFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgc29ja2V0OiB0aGlzLnNvY2tldCxcbiAgICAgICAgICAgICAgICAgICAgc2VydmVybmFtZTogdGhpcy5zZXJ2ZXJuYW1lLFxuICAgICAgICAgICAgICAgICAgICBwb3J0OiB0aGlzLnBvcnRcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy50bHMgfHwge31cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICB0aGlzLmNsZWFyU29ja2V0SGFuZGxlcnMoKTtcblxuICAgICAgICAgICAgc29ja2V0UGxhaW4ub25jZSgnZXJyb3InLCBlcnIgPT4ge1xuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aGlzLmNvbm5lY3RUaW1lb3V0KTtcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQodGhpcy51cGdyYWRlVGltZW91dCk7XG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLnVwZ3JhZGluZykge1xuICAgICAgICAgICAgICAgICAgICAvLyBkb24ndCBjYXJlIGFueW1vcmVcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBzZXRJbW1lZGlhdGUoKCkgPT4gdGhpcy5jbG9zZSgpKTtcbiAgICAgICAgICAgICAgICB0aGlzLnVwZ3JhZGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGVyci50bHNGYWlsZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHRoaXMudXBncmFkZVRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMudXBncmFkaW5nKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgc2V0SW1tZWRpYXRlKCgpID0+IHRoaXMuY2xvc2UoKSk7XG4gICAgICAgICAgICAgICAgbGV0IGVyciA9IG5ldyBFcnJvcignRmFpbGVkIHRvIHVwZ3JhZGUgY29ubmVjdGlvbiBpbiByZXF1aXJlZCB0aW1lJyk7XG4gICAgICAgICAgICAgICAgZXJyLnRsc0ZhaWxlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgZXJyLmNvZGUgPSAnVVBHUkFERV9USU1FT1VUJztcbiAgICAgICAgICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgICAgICAgIH0sIFVQR1JBREVfVElNRU9VVCk7XG5cbiAgICAgICAgICAgIHRoaXMudXBncmFkaW5nID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMuc29ja2V0ID0gdGxzLmNvbm5lY3Qob3B0cywgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aGlzLnVwZ3JhZGVUaW1lb3V0KTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5pc0Nsb3NlZCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBub3Qgc3VyZSBpZiB0aGlzIGlzIHBvc3NpYmxlP1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5jbG9zZSgpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHRoaXMuc2VjdXJlQ29ubmVjdGlvbiA9IHRydWU7XG4gICAgICAgICAgICAgICAgdGhpcy51cGdyYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB0aGlzLnN0cmVhbWVyLnNlY3VyZUNvbm5lY3Rpb24gPSB0cnVlO1xuICAgICAgICAgICAgICAgIHRoaXMuc29ja2V0LnBpcGUodGhpcy5zdHJlYW1lcik7XG4gICAgICAgICAgICAgICAgdGhpcy50bHMgPSB0eXBlb2YgdGhpcy5zb2NrZXQuZ2V0Q2lwaGVyID09PSAnZnVuY3Rpb24nID8gdGhpcy5zb2NrZXQuZ2V0Q2lwaGVyKCkgOiBmYWxzZTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy50bHMpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50bHMuYXV0aG9yaXplZCA9IHRoaXMuc29ja2V0LmF1dGhvcml6ZWQ7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubG9nLmluZm8oe1xuICAgICAgICAgICAgICAgICAgICAgICAgc3JjOiAndGxzJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1zZzogJ0VzdGFibGlzaGVkIFRMUyBzZXNzaW9uJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNpZDogdGhpcy5pZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGF1dGhvcml6ZWQ6IHRoaXMudGxzLmF1dGhvcml6ZWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBhbGdvOiB0aGlzLnRscy5zdGFuZGFyZE5hbWUgfHwgdGhpcy50bHMubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHZlcnNpb246IHRoaXMudGxzLnZlcnNpb25cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc29sdmUodHJ1ZSk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgdGhpcy53cml0ZVNvY2tldCA9IHRoaXMuc29ja2V0O1xuXG4gICAgICAgICAgICB0aGlzLnNldFNvY2tldEhhbmRsZXJzKCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmICh1cGdyYWRlZCAmJiB0aGlzLmV4cGVjdENhcGFiaWxpdHlVcGRhdGUpIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMucnVuKCdDQVBBQklMSVRZJyk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdXBncmFkZWQ7XG4gICAgfVxuXG4gICAgYXN5bmMgc2V0QXV0aGVudGljYXRpb25TdGF0ZSgpIHtcbiAgICAgICAgdGhpcy5zdGF0ZSA9IHRoaXMuc3RhdGVzLkFVVEhFTlRJQ0FURUQ7XG4gICAgICAgIHRoaXMuYXV0aGVudGljYXRlZCA9IHRydWU7XG4gICAgICAgIGlmICh0aGlzLmV4cGVjdENhcGFiaWxpdHlVcGRhdGUpIHtcbiAgICAgICAgICAgIC8vIHVwZGF0ZSBjYXBhYmlsaXRpZXNcbiAgICAgICAgICAgIGF3YWl0IHRoaXMucnVuKCdDQVBBQklMSVRZJyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhc3luYyBhdXRoZW50aWNhdGUoKSB7XG4gICAgICAgIGlmICh0aGlzLnN0YXRlID09PSB0aGlzLnN0YXRlcy5MT0dPVVQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBBdXRoZW50aWNhdGlvbkZhaWx1cmUoJ0FscmVhZHkgbG9nZ2VkIG91dCcpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuc3RhdGUgIT09IHRoaXMuc3RhdGVzLk5PVF9BVVRIRU5USUNBVEVEKSB7XG4gICAgICAgICAgICAvLyBub3RoaW5nIHRvIGRvIGhlcmUsIHVzdWFsbHkgaGFwcGVucyB3aXRoIFBSRUFVVEggZ3JlZXRpbmdcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMuYXV0aCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEF1dGhlbnRpY2F0aW9uRmFpbHVyZSgnUGxlYXNlIGNvbmZpZ3VyZSB0aGUgbG9naW4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZXhwZWN0Q2FwYWJpbGl0eVVwZGF0ZSA9IHRydWU7XG5cbiAgICAgICAgbGV0IGxvZ2luTWV0aG9kID0gKHRoaXMub3B0aW9ucy5hdXRoLmxvZ2luTWV0aG9kIHx8ICcnKS50b1N0cmluZygpLnRyaW0oKS50b1VwcGVyQ2FzZSgpO1xuICAgICAgICBpZiAoIWxvZ2luTWV0aG9kICYmIC9cXFxcfFxcLy8udGVzdCh0aGlzLm9wdGlvbnMuYXV0aC51c2VyKSkge1xuICAgICAgICAgICAgLy8gU3BlY2lhbCBvdmVycmlkZSBmb3IgTVMgRXhjaGFuZ2Ugd2hlbiBhdXRoZW50aWNhdGluZyBhcyBzb21lIG90aGVyIHVzZXIgb3Igbm9uLWVtYWlsIGFjY291bnRcbiAgICAgICAgICAgIGxvZ2luTWV0aG9kID0gJ0xPR0lOJztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMuYXV0aC5hY2Nlc3NUb2tlbikge1xuICAgICAgICAgICAgdGhpcy5hdXRoZW50aWNhdGVkID0gYXdhaXQgdGhpcy5ydW4oJ0FVVEhFTlRJQ0FURScsIHRoaXMub3B0aW9ucy5hdXRoLnVzZXIsIHsgYWNjZXNzVG9rZW46IHRoaXMub3B0aW9ucy5hdXRoLmFjY2Vzc1Rva2VuIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMub3B0aW9ucy5hdXRoLnBhc3MpIHtcbiAgICAgICAgICAgIGlmICgodGhpcy5jYXBhYmlsaXRpZXMuaGFzKCdBVVRIPUxPR0lOJykgfHwgdGhpcy5jYXBhYmlsaXRpZXMuaGFzKCdBVVRIPVBMQUlOJykpICYmIGxvZ2luTWV0aG9kICE9PSAnTE9HSU4nKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5hdXRoZW50aWNhdGVkID0gYXdhaXQgdGhpcy5ydW4oJ0FVVEhFTlRJQ0FURScsIHRoaXMub3B0aW9ucy5hdXRoLnVzZXIsIHsgcGFzc3dvcmQ6IHRoaXMub3B0aW9ucy5hdXRoLnBhc3MsIGxvZ2luTWV0aG9kIH0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5jYXBhYmlsaXRpZXMuaGFzKCdMT0dJTkRJU0FCTEVEJykpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEF1dGhlbnRpY2F0aW9uRmFpbHVyZSgnTG9naW4gaXMgZGlzYWJsZWQnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5hdXRoZW50aWNhdGVkID0gYXdhaXQgdGhpcy5ydW4oJ0xPR0lOJywgdGhpcy5vcHRpb25zLmF1dGgudXNlciwgdGhpcy5vcHRpb25zLmF1dGgucGFzcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQXV0aGVudGljYXRpb25GYWlsdXJlKCdObyBwYXNzd29yZCBjb25maWd1cmVkJyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5hdXRoZW50aWNhdGVkKSB7XG4gICAgICAgICAgICB0aGlzLmxvZy5pbmZvKHtcbiAgICAgICAgICAgICAgICBzcmM6ICdhdXRoJyxcbiAgICAgICAgICAgICAgICBtc2c6ICdVc2VyIGF1dGhlbnRpY2F0ZWQnLFxuICAgICAgICAgICAgICAgIGNpZDogdGhpcy5pZCxcbiAgICAgICAgICAgICAgICB1c2VyOiB0aGlzLm9wdGlvbnMuYXV0aC51c2VyXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuc2V0QXV0aGVudGljYXRpb25TdGF0ZSgpO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICB0aHJvdyBuZXcgQXV0aGVudGljYXRpb25GYWlsdXJlKCdObyBtYXRjaGluZyBhdXRoZW50aWNhdGlvbiBtZXRob2QnKTtcbiAgICB9XG5cbiAgICBhc3luYyBpbml0aWFsT0sobWVzc2FnZSkge1xuICAgICAgICB0aGlzLmdyZWV0aW5nID0gKG1lc3NhZ2UuYXR0cmlidXRlcyB8fCBbXSlcbiAgICAgICAgICAgIC5maWx0ZXIoZW50cnkgPT4gZW50cnkudHlwZSA9PT0gJ1RFWFQnKVxuICAgICAgICAgICAgLm1hcChlbnRyeSA9PiBlbnRyeS52YWx1ZSlcbiAgICAgICAgICAgIC5maWx0ZXIoZW50cnkgPT4gZW50cnkpXG4gICAgICAgICAgICAuam9pbignJyk7XG5cbiAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuZ3JlZXRpbmdUaW1lb3V0KTtcbiAgICAgICAgdGhpcy51bnRhZ2dlZEhhbmRsZXJzLk9LID0gbnVsbDtcbiAgICAgICAgdGhpcy51bnRhZ2dlZEhhbmRsZXJzLlBSRUFVVEggPSBudWxsO1xuXG4gICAgICAgIGlmICh0aGlzLmlzQ2xvc2VkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBnZXQgb3V0IG9mIGN1cnJlbnQgcGFyc2luZyBcInRocmVhZFwiLCBzbyBkbyBub3QgYXdhaXQgZm9yIHN0YXJ0U2Vzc2lvblxuICAgICAgICB0aGlzLnN0YXJ0U2Vzc2lvbigpXG4gICAgICAgICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmluaXRpYWxSZXNvbHZlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCByZXNvbHZlID0gdGhpcy5pbml0aWFsUmVzb2x2ZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbml0aWFsUmVzb2x2ZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmluaXRpYWxSZWplY3QgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc29sdmUoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLmNhdGNoKGVyciA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2cuZXJyb3IoeyBlcnIsIGNpZDogdGhpcy5pZCB9KTtcblxuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdGhpcy5pbml0aWFsUmVqZWN0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aGlzLmdyZWV0aW5nVGltZW91dCk7XG4gICAgICAgICAgICAgICAgICAgIGxldCByZWplY3QgPSB0aGlzLmluaXRpYWxSZWplY3Q7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW5pdGlhbFJlc29sdmUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbml0aWFsUmVqZWN0ID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZWplY3QoZXJyKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBzZXRJbW1lZGlhdGUoKCkgPT4gdGhpcy5jbG9zZSgpKTtcbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIGFzeW5jIGluaXRpYWxQUkVBVVRIKCkge1xuICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5ncmVldGluZ1RpbWVvdXQpO1xuICAgICAgICB0aGlzLnVudGFnZ2VkSGFuZGxlcnMuT0sgPSBudWxsO1xuICAgICAgICB0aGlzLnVudGFnZ2VkSGFuZGxlcnMuUFJFQVVUSCA9IG51bGw7XG5cbiAgICAgICAgaWYgKHRoaXMuaXNDbG9zZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuc3RhdGUgPSB0aGlzLnN0YXRlcy5BVVRIRU5USUNBVEVEO1xuXG4gICAgICAgIC8vIGdldCBvdXQgb2YgY3VycmVudCBwYXJzaW5nIFwidGhyZWFkXCIsIHNvIGRvIG5vdCBhd2FpdCBmb3Igc3RhcnRTZXNzaW9uXG4gICAgICAgIHRoaXMuc3RhcnRTZXNzaW9uKClcbiAgICAgICAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHRoaXMuaW5pdGlhbFJlc29sdmUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJlc29sdmUgPSB0aGlzLmluaXRpYWxSZXNvbHZlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmluaXRpYWxSZXNvbHZlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW5pdGlhbFJlamVjdCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzb2x2ZSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAuY2F0Y2goZXJyID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmxvZy5lcnJvcih7IGVyciwgY2lkOiB0aGlzLmlkIH0pO1xuXG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmluaXRpYWxSZWplY3QgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuZ3JlZXRpbmdUaW1lb3V0KTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJlamVjdCA9IHRoaXMuaW5pdGlhbFJlamVjdDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbml0aWFsUmVzb2x2ZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmluaXRpYWxSZWplY3QgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlamVjdChlcnIpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHNldEltbWVkaWF0ZSgoKSA9PiB0aGlzLmNsb3NlKCkpO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgYXN5bmMgc2VydmVyQnllKCkge1xuICAgICAgICB0aGlzLnVudGFnZ2VkSGFuZGxlcnMuQllFID0gbnVsbDtcbiAgICAgICAgdGhpcy5zdGF0ZSA9IHRoaXMuc3RhdGVzLkxPR09VVDtcbiAgICB9XG5cbiAgICBhc3luYyBzZWN0aW9uQ2FwYWJpbGl0eShzZWN0aW9uKSB7XG4gICAgICAgIHRoaXMucmF3Q2FwYWJpbGl0aWVzID0gc2VjdGlvbjtcbiAgICAgICAgdGhpcy5jYXBhYmlsaXRpZXMgPSB1cGRhdGVDYXBhYmlsaXRpZXMoc2VjdGlvbik7XG5cbiAgICAgICAgaWYgKHRoaXMuY2FwYWJpbGl0aWVzKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBbY2FwYV0gb2YgdGhpcy5jYXBhYmlsaXRpZXMpIHtcbiAgICAgICAgICAgICAgICBpZiAoL15BVVRIPS9pLnRlc3QoY2FwYSkgJiYgIXRoaXMuYXV0aENhcGFiaWxpdGllcy5oYXMoY2FwYS50b1VwcGVyQ2FzZSgpKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmF1dGhDYXBhYmlsaXRpZXMuc2V0KGNhcGEudG9VcHBlckNhc2UoKSwgZmFsc2UpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmV4cGVjdENhcGFiaWxpdHlVcGRhdGUpIHtcbiAgICAgICAgICAgIHRoaXMuZXhwZWN0Q2FwYWJpbGl0eVVwZGF0ZSA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYXN5bmMgdW50YWdnZWRDYXBhYmlsaXR5KHVudGFnZ2VkKSB7XG4gICAgICAgIHRoaXMucmF3Q2FwYWJpbGl0aWVzID0gdW50YWdnZWQuYXR0cmlidXRlcztcbiAgICAgICAgdGhpcy5jYXBhYmlsaXRpZXMgPSB1cGRhdGVDYXBhYmlsaXRpZXModW50YWdnZWQuYXR0cmlidXRlcyk7XG5cbiAgICAgICAgaWYgKHRoaXMuY2FwYWJpbGl0aWVzKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBbY2FwYV0gb2YgdGhpcy5jYXBhYmlsaXRpZXMpIHtcbiAgICAgICAgICAgICAgICBpZiAoL15BVVRIPS9pLnRlc3QoY2FwYSkgJiYgIXRoaXMuYXV0aENhcGFiaWxpdGllcy5oYXMoY2FwYS50b1VwcGVyQ2FzZSgpKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmF1dGhDYXBhYmlsaXRpZXMuc2V0KGNhcGEudG9VcHBlckNhc2UoKSwgZmFsc2UpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmV4cGVjdENhcGFiaWxpdHlVcGRhdGUpIHtcbiAgICAgICAgICAgIHRoaXMuZXhwZWN0Q2FwYWJpbGl0eVVwZGF0ZSA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYXN5bmMgdW50YWdnZWRFeGlzdHModW50YWdnZWQpIHtcbiAgICAgICAgaWYgKCF0aGlzLm1haWxib3gpIHtcbiAgICAgICAgICAgIC8vIG1haWxib3ggY2xvc2VkLCBpZ25vcmVcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdW50YWdnZWQgfHwgIXVudGFnZ2VkLmNvbW1hbmQgfHwgaXNOYU4odW50YWdnZWQuY29tbWFuZCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBjb3VudCA9IE51bWJlcih1bnRhZ2dlZC5jb21tYW5kKTtcbiAgICAgICAgaWYgKGNvdW50ID09PSB0aGlzLm1haWxib3guZXhpc3RzKSB7XG4gICAgICAgICAgICAvLyBub3RoaW5nIGNoYW5nZWQ/XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBrZWVwIGV4aXN0cyB1cCB0byBkYXRlXG4gICAgICAgIGxldCBwcmV2Q291bnQgPSB0aGlzLm1haWxib3guZXhpc3RzO1xuICAgICAgICB0aGlzLm1haWxib3guZXhpc3RzID0gY291bnQ7XG4gICAgICAgIHRoaXMuZW1pdCgnZXhpc3RzJywge1xuICAgICAgICAgICAgcGF0aDogdGhpcy5tYWlsYm94LnBhdGgsXG4gICAgICAgICAgICBjb3VudCxcbiAgICAgICAgICAgIHByZXZDb3VudFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBhc3luYyB1bnRhZ2dlZEV4cHVuZ2UodW50YWdnZWQpIHtcbiAgICAgICAgaWYgKCF0aGlzLm1haWxib3gpIHtcbiAgICAgICAgICAgIC8vIG1haWxib3ggY2xvc2VkLCBpZ25vcmVcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdW50YWdnZWQgfHwgIXVudGFnZ2VkLmNvbW1hbmQgfHwgaXNOYU4odW50YWdnZWQuY29tbWFuZCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBzZXEgPSBOdW1iZXIodW50YWdnZWQuY29tbWFuZCk7XG4gICAgICAgIGlmIChzZXEgJiYgc2VxIDw9IHRoaXMubWFpbGJveC5leGlzdHMpIHtcbiAgICAgICAgICAgIHRoaXMubWFpbGJveC5leGlzdHMtLTtcbiAgICAgICAgICAgIGxldCBwYXlsb2FkID0ge1xuICAgICAgICAgICAgICAgIHBhdGg6IHRoaXMubWFpbGJveC5wYXRoLFxuICAgICAgICAgICAgICAgIHNlcSxcbiAgICAgICAgICAgICAgICB2YW5pc2hlZDogZmFsc2VcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIGlmICh0eXBlb2YgdGhpcy5vcHRpb25zLmV4cHVuZ2VIYW5kbGVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5vcHRpb25zLmV4cHVuZ2VIYW5kbGVyKHBheWxvYWQpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZy5lcnJvcih7IG1zZzogJ0ZhaWxlZCB0byBub3RpZnkgZXhwdW5nZSBldmVudCcsIHBheWxvYWQsIGVycm9yOiBlcnIsIGNpZDogdGhpcy5pZCB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuZW1pdCgnZXhwdW5nZScsIHBheWxvYWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgYXN5bmMgdW50YWdnZWRWYW5pc2hlZCh1bnRhZ2dlZCwgbWFpbGJveCkge1xuICAgICAgICBtYWlsYm94ID0gbWFpbGJveCB8fCB0aGlzLm1haWxib3g7XG4gICAgICAgIGlmICghbWFpbGJveCkge1xuICAgICAgICAgICAgLy8gbWFpbGJveCBjbG9zZWQsIGlnbm9yZVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHRhZ3MgPSBbXTtcbiAgICAgICAgbGV0IHVpZHMgPSBmYWxzZTtcblxuICAgICAgICBpZiAodW50YWdnZWQuYXR0cmlidXRlcy5sZW5ndGggPiAxICYmIEFycmF5LmlzQXJyYXkodW50YWdnZWQuYXR0cmlidXRlc1swXSkpIHtcbiAgICAgICAgICAgIHRhZ3MgPSB1bnRhZ2dlZC5hdHRyaWJ1dGVzWzBdLm1hcChlbnRyeSA9PiAodHlwZW9mIGVudHJ5LnZhbHVlID09PSAnc3RyaW5nJyA/IGVudHJ5LnZhbHVlLnRvVXBwZXJDYXNlKCkgOiBmYWxzZSkpLmZpbHRlcih2YWx1ZSA9PiB2YWx1ZSk7XG4gICAgICAgICAgICB1bnRhZ2dlZC5hdHRyaWJ1dGVzLnNoaWZ0KCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodW50YWdnZWQuYXR0cmlidXRlc1swXSAmJiB0eXBlb2YgdW50YWdnZWQuYXR0cmlidXRlc1swXS52YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHVpZHMgPSB1bnRhZ2dlZC5hdHRyaWJ1dGVzWzBdLnZhbHVlO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHVpZExpc3QgPSBleHBhbmRSYW5nZSh1aWRzKTtcblxuICAgICAgICBmb3IgKGxldCB1aWQgb2YgdWlkTGlzdCkge1xuICAgICAgICAgICAgbGV0IHBheWxvYWQgPSB7XG4gICAgICAgICAgICAgICAgcGF0aDogbWFpbGJveC5wYXRoLFxuICAgICAgICAgICAgICAgIHVpZCxcbiAgICAgICAgICAgICAgICB2YW5pc2hlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICBlYXJsaWVyOiB0YWdzLmluY2x1ZGVzKCdFQVJMSUVSJylcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIGlmICh0eXBlb2YgdGhpcy5vcHRpb25zLmV4cHVuZ2VIYW5kbGVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5vcHRpb25zLmV4cHVuZ2VIYW5kbGVyKHBheWxvYWQpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZy5lcnJvcih7IG1zZzogJ0ZhaWxlZCB0byBub3RpZnkgZXhwdW5nZSBldmVudCcsIHBheWxvYWQsIGVycm9yOiBlcnIsIGNpZDogdGhpcy5pZCB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuZW1pdCgnZXhwdW5nZScsIHBheWxvYWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgYXN5bmMgdW50YWdnZWRGZXRjaCh1bnRhZ2dlZCwgbWFpbGJveCkge1xuICAgICAgICBtYWlsYm94ID0gbWFpbGJveCB8fCB0aGlzLm1haWxib3g7XG4gICAgICAgIGlmICghbWFpbGJveCkge1xuICAgICAgICAgICAgLy8gbWFpbGJveCBjbG9zZWQsIGlnbm9yZVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IG1lc3NhZ2UgPSBhd2FpdCBmb3JtYXRNZXNzYWdlUmVzcG9uc2UodW50YWdnZWQsIG1haWxib3gpO1xuICAgICAgICBpZiAobWVzc2FnZS5mbGFncykge1xuICAgICAgICAgICAgbGV0IHVwZGF0ZUV2ZW50ID0ge1xuICAgICAgICAgICAgICAgIHBhdGg6IG1haWxib3gucGF0aCxcbiAgICAgICAgICAgICAgICBzZXE6IG1lc3NhZ2Uuc2VxXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBpZiAobWVzc2FnZS51aWQpIHtcbiAgICAgICAgICAgICAgICB1cGRhdGVFdmVudC51aWQgPSBtZXNzYWdlLnVpZDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKG1lc3NhZ2UubW9kc2VxKSB7XG4gICAgICAgICAgICAgICAgdXBkYXRlRXZlbnQubW9kc2VxID0gbWVzc2FnZS5tb2RzZXE7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHVwZGF0ZUV2ZW50LmZsYWdzID0gbWVzc2FnZS5mbGFncztcblxuICAgICAgICAgICAgaWYgKG1lc3NhZ2UuZmxhZ0NvbG9yKSB7XG4gICAgICAgICAgICAgICAgdXBkYXRlRXZlbnQuZmxhZ0NvbG9yID0gbWVzc2FnZS5mbGFnQ29sb3I7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuZW1pdCgnZmxhZ3MnLCB1cGRhdGVFdmVudCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhc3luYyBlbnN1cmVTZWxlY3RlZE1haWxib3gocGF0aCkge1xuICAgICAgICBpZiAoIXBhdGgpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICgoIXRoaXMubWFpbGJveCAmJiBwYXRoKSB8fCAodGhpcy5tYWlsYm94ICYmIHBhdGggJiYgIWNvbXBhcmVQYXRocyh0aGlzLCB0aGlzLm1haWxib3gucGF0aCwgcGF0aCkpKSB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5tYWlsYm94T3BlbihwYXRoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGFzeW5jIHJlc29sdmVSYW5nZShyYW5nZSwgb3B0aW9ucykge1xuICAgICAgICBpZiAodHlwZW9mIHJhbmdlID09PSAnbnVtYmVyJyB8fCB0eXBlb2YgcmFuZ2UgPT09ICdiaWdpbnQnKSB7XG4gICAgICAgICAgICByYW5nZSA9IHJhbmdlLnRvU3RyaW5nKCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBzcGVjaWFsIGNhc2UsIHNvbWUgc2VydmVycyBhbGxvdyB0aGlzLCBzb21lIGRvIG5vdCwgc28gcmVwbGFjZSBpdCB3aXRoIHRoZSBsYXN0IGtub3duIEVYSVNUUyB2YWx1ZVxuICAgICAgICBpZiAocmFuZ2UgPT09ICcqJykge1xuICAgICAgICAgICAgaWYgKCF0aGlzLm1haWxib3guZXhpc3RzKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmFuZ2UgPSB0aGlzLm1haWxib3guZXhpc3RzLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICBvcHRpb25zLnVpZCA9IGZhbHNlOyAvLyBzZXF1ZW5jZSBxdWVyeVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHJhbmdlICYmIHR5cGVvZiByYW5nZSA9PT0gJ29iamVjdCcgJiYgIUFycmF5LmlzQXJyYXkocmFuZ2UpKSB7XG4gICAgICAgICAgICBpZiAocmFuZ2UuYWxsICYmIE9iamVjdC5rZXlzKHJhbmdlKS5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgICAgICByYW5nZSA9ICcxOionO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChyYW5nZS51aWQgJiYgT2JqZWN0LmtleXMocmFuZ2UpLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgICAgIHJhbmdlID0gcmFuZ2UudWlkO1xuICAgICAgICAgICAgICAgIG9wdGlvbnMudWlkID0gdHJ1ZTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gcmVzb2x2ZSByYW5nZSBieSBzZWFyY2hpbmdcbiAgICAgICAgICAgICAgICBvcHRpb25zLnVpZCA9IHRydWU7IC8vIGZvcmNlIFVJRHMgaW5zdGVhZCBvZiBzZXF1ZW5jZSBudW1iZXJzXG4gICAgICAgICAgICAgICAgcmFuZ2UgPSBhd2FpdCB0aGlzLnJ1bignU0VBUkNIJywgcmFuZ2UsIG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgIGlmIChyYW5nZSAmJiByYW5nZS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgcmFuZ2UgPSBwYWNrTWVzc2FnZVJhbmdlKHJhbmdlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShyYW5nZSkpIHtcbiAgICAgICAgICAgIHJhbmdlID0gcmFuZ2Uuam9pbignLCcpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFyYW5nZSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJhbmdlO1xuICAgIH1cblxuICAgIGF1dG9pZGxlKCkge1xuICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5pZGxlU3RhcnRUaW1lcik7XG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMuZGlzYWJsZUF1dG9JZGxlIHx8IHRoaXMuc3RhdGUgIT09IHRoaXMuc3RhdGVzLlNFTEVDVEVEKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5pZGxlU3RhcnRUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5pZGxlKCkuY2F0Y2goZXJyID0+IHRoaXMubG9nLndhcm4oeyBlcnIsIGNpZDogdGhpcy5pZCB9KSk7XG4gICAgICAgIH0sIDE1ICogMTAwMCk7XG4gICAgfVxuXG4gICAgLy8gUFVCTElDIEFQSSBNRVRIT0RTXG5cbiAgICAvKipcbiAgICAgKiBJbml0aWF0ZXMgYSBjb25uZWN0aW9uIGFnYWluc3QgSU1BUCBzZXJ2ZXIuIFRocm93cyBpZiBhbnl0aGluZyBnb2VzIHdyb25nLiBUaGlzIGlzIHNvbWV0aGluZyB5b3UgaGF2ZSB0byBjYWxsIGJlZm9yZSB5b3UgY2FuIHJ1biBhbnkgSU1BUCBjb21tYW5kc1xuICAgICAqXG4gICAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAgICogQHRocm93cyBXaWxsIHRocm93IGFuIGVycm9yIGlmIGNvbm5lY3Rpb24gb3IgYXV0aGVudGljYXRpb24gZmFpbHNcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGxldCBjbGllbnQgPSBuZXcgSW1hcEZsb3coey4uLn0pO1xuICAgICAqIGF3YWl0IGNsaWVudC5jb25uZWN0KCk7XG4gICAgICovXG4gICAgYXN5bmMgY29ubmVjdCgpIHtcbiAgICAgICAgaWYgKHRoaXMuX2Nvbm5lY3RDYWxsZWQpIHtcbiAgICAgICAgICAgIC8vIFByZXZlbnQgcmUtdXNpbmcgSW1hcEZsb3cgaW5zdGFuY2VzIGJ5IGFsbG93aW5nIHRvIGNhbGwgY29ubmVjdCBqdXN0IG9uY2UuXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NhbiBub3QgcmUtdXNlIEltYXBGbG93IGluc3RhbmNlJyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fY29ubmVjdENhbGxlZCA9IHRydWU7XG5cbiAgICAgICAgbGV0IGNvbm5lY3RvciA9IHRoaXMuc2VjdXJlQ29ubmVjdGlvbiA/IHRscyA6IG5ldDtcblxuICAgICAgICBsZXQgb3B0cyA9IE9iamVjdC5hc3NpZ24oXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgaG9zdDogdGhpcy5ob3N0LFxuICAgICAgICAgICAgICAgIHNlcnZlcm5hbWU6IHRoaXMuc2VydmVybmFtZSxcbiAgICAgICAgICAgICAgICBwb3J0OiB0aGlzLnBvcnRcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMudGxzIHx8IHt9XG4gICAgICAgICk7XG5cbiAgICAgICAgdGhpcy51bnRhZ2dlZEhhbmRsZXJzLk9LID0gKC4uLmFyZ3MpID0+IHRoaXMuaW5pdGlhbE9LKC4uLmFyZ3MpO1xuICAgICAgICB0aGlzLnVudGFnZ2VkSGFuZGxlcnMuQllFID0gKC4uLmFyZ3MpID0+IHRoaXMuc2VydmVyQnllKC4uLmFyZ3MpO1xuICAgICAgICB0aGlzLnVudGFnZ2VkSGFuZGxlcnMuUFJFQVVUSCA9ICguLi5hcmdzKSA9PiB0aGlzLmluaXRpYWxQUkVBVVRIKC4uLmFyZ3MpO1xuXG4gICAgICAgIHRoaXMudW50YWdnZWRIYW5kbGVycy5DQVBBQklMSVRZID0gKC4uLmFyZ3MpID0+IHRoaXMudW50YWdnZWRDYXBhYmlsaXR5KC4uLmFyZ3MpO1xuICAgICAgICB0aGlzLnNlY3Rpb25IYW5kbGVycy5DQVBBQklMSVRZID0gKC4uLmFyZ3MpID0+IHRoaXMuc2VjdGlvbkNhcGFiaWxpdHkoLi4uYXJncyk7XG5cbiAgICAgICAgdGhpcy51bnRhZ2dlZEhhbmRsZXJzLkVYSVNUUyA9ICguLi5hcmdzKSA9PiB0aGlzLnVudGFnZ2VkRXhpc3RzKC4uLmFyZ3MpO1xuICAgICAgICB0aGlzLnVudGFnZ2VkSGFuZGxlcnMuRVhQVU5HRSA9ICguLi5hcmdzKSA9PiB0aGlzLnVudGFnZ2VkRXhwdW5nZSguLi5hcmdzKTtcblxuICAgICAgICAvLyB0aGVzZSBtZXRob2RzIHRha2UgYW4gb3B0aW9uYWwgc2Vjb25kIGFyZ3VtZW50LCBzbyBtYWtlIHN1cmUgdGhhdCBzb21lIHJhbmRvbSBJTUFQIHRhZyBpcyBub3QgdXNlZCBhcyB0aGUgc2Vjb25kIGFyZ3VtZW50XG4gICAgICAgIHRoaXMudW50YWdnZWRIYW5kbGVycy5GRVRDSCA9IHVudGFnZ2VkID0+IHRoaXMudW50YWdnZWRGZXRjaCh1bnRhZ2dlZCk7XG4gICAgICAgIHRoaXMudW50YWdnZWRIYW5kbGVycy5WQU5JU0hFRCA9IHVudGFnZ2VkID0+IHRoaXMudW50YWdnZWRWYW5pc2hlZCh1bnRhZ2dlZCk7XG5cbiAgICAgICAgbGV0IHNvY2tldCA9IGZhbHNlO1xuICAgICAgICBpZiAodGhpcy5vcHRpb25zLnByb3h5KSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHNvY2tldCA9IGF3YWl0IHByb3h5Q29ubmVjdGlvbih0aGlzLmxvZywgdGhpcy5vcHRpb25zLnByb3h5LCB0aGlzLmhvc3QsIHRoaXMucG9ydCk7XG4gICAgICAgICAgICAgICAgaWYgKCFzb2NrZXQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdGYWlsZWQgdG8gc2V0dXAgcHJveHkgY29ubmVjdGlvbicpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgIGxldCBlcnJvciA9IG5ldyBFcnJvcignRmFpbGVkIHRvIHNldHVwIHByb3h5IGNvbm5lY3Rpb24nKTtcbiAgICAgICAgICAgICAgICBlcnJvci5jb2RlID0gZXJyLmNvZGUgfHwgJ1Byb3h5RXJyb3InO1xuICAgICAgICAgICAgICAgIGVycm9yLl9lcnIgPSBlcnI7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2cuZXJyb3IoeyBlcnJvciwgY2lkOiB0aGlzLmlkIH0pO1xuICAgICAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5jb25uZWN0VGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIGxldCBlcnIgPSBuZXcgRXJyb3IoJ0ZhaWxlZCB0byBlc3RhYmxpc2ggY29ubmVjdGlvbiBpbiByZXF1aXJlZCB0aW1lJyk7XG4gICAgICAgICAgICAgICAgZXJyLmNvZGUgPSAnQ09OTkVDVF9USU1FT1VUJztcbiAgICAgICAgICAgICAgICBlcnIuZGV0YWlscyA9IHtcbiAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvblRpbWVvdXQ6IHRoaXMub3B0aW9ucy5jb25uZWN0aW9uVGltZW91dCB8fCBDT05ORUNUX1RJTUVPVVRcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIHRoaXMubG9nLmVycm9yKHsgZXJyLCBjaWQ6IHRoaXMuaWQgfSk7XG4gICAgICAgICAgICAgICAgc2V0SW1tZWRpYXRlKCgpID0+IHRoaXMuY2xvc2UoKSk7XG4gICAgICAgICAgICAgICAgcmVqZWN0KGVycik7XG4gICAgICAgICAgICB9LCB0aGlzLm9wdGlvbnMuY29ubmVjdGlvblRpbWVvdXQgfHwgQ09OTkVDVF9USU1FT1VUKTtcblxuICAgICAgICAgICAgbGV0IG9uQ29ubmVjdCA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5jb25uZWN0VGltZW91dCk7XG4gICAgICAgICAgICAgICAgdGhpcy5zb2NrZXQuc2V0S2VlcEFsaXZlKHRydWUsIDUgKiAxMDAwKTtcbiAgICAgICAgICAgICAgICB0aGlzLnNvY2tldC5zZXRUaW1lb3V0KHRoaXMub3B0aW9ucy5zb2NrZXRUaW1lb3V0IHx8IFNPQ0tFVF9USU1FT1VUKTtcblxuICAgICAgICAgICAgICAgIHRoaXMuZ3JlZXRpbmdUaW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBlcnIgPSBuZXcgRXJyb3IoYEZhaWxlZCB0byByZWNlaXZlIGdyZWV0aW5nIGZyb20gc2VydmVyIGluIHJlcXVpcmVkIHRpbWUkeyF0aGlzLnNlY3VyZUNvbm5lY3Rpb24gPyAnLiBNYXliZSBzaG91bGQgdXNlIFRMUz8nIDogJyd9YCk7XG4gICAgICAgICAgICAgICAgICAgIGVyci5jb2RlID0gJ0dSRUVUSU5HX1RJTUVPVVQnO1xuICAgICAgICAgICAgICAgICAgICBlcnIuZGV0YWlscyA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGdyZWV0aW5nVGltZW91dDogdGhpcy5vcHRpb25zLmdyZWV0aW5nVGltZW91dCB8fCBHUkVFVElOR19USU1FT1VUXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubG9nLmVycm9yKHsgZXJyLCBjaWQ6IHRoaXMuaWQgfSk7XG4gICAgICAgICAgICAgICAgICAgIHNldEltbWVkaWF0ZSgoKSA9PiB0aGlzLmNsb3NlKCkpO1xuICAgICAgICAgICAgICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgICAgICAgICAgICB9LCB0aGlzLm9wdGlvbnMuZ3JlZXRpbmdUaW1lb3V0IHx8IEdSRUVUSU5HX1RJTUVPVVQpO1xuXG4gICAgICAgICAgICAgICAgdGhpcy50bHMgPSB0eXBlb2YgdGhpcy5zb2NrZXQuZ2V0Q2lwaGVyID09PSAnZnVuY3Rpb24nID8gdGhpcy5zb2NrZXQuZ2V0Q2lwaGVyKCkgOiBmYWxzZTtcblxuICAgICAgICAgICAgICAgIGxldCBsb2dJbmZvID0ge1xuICAgICAgICAgICAgICAgICAgICBzcmM6ICdjb25uZWN0aW9uJyxcbiAgICAgICAgICAgICAgICAgICAgbXNnOiBgRXN0YWJsaXNoZWQgJHt0aGlzLnRscyA/ICdzZWN1cmUgJyA6ICcnfVRDUCBjb25uZWN0aW9uYCxcbiAgICAgICAgICAgICAgICAgICAgY2lkOiB0aGlzLmlkLFxuICAgICAgICAgICAgICAgICAgICBzZWN1cmU6ICEhdGhpcy50bHMsXG4gICAgICAgICAgICAgICAgICAgIGhvc3Q6IHRoaXMuaG9zdCxcbiAgICAgICAgICAgICAgICAgICAgc2VydmVybmFtZTogdGhpcy5zZXJ2ZXJuYW1lLFxuICAgICAgICAgICAgICAgICAgICBwb3J0OiB0aGlzLnNvY2tldC5yZW1vdGVQb3J0LFxuICAgICAgICAgICAgICAgICAgICBhZGRyZXNzOiB0aGlzLnNvY2tldC5yZW1vdGVBZGRyZXNzLFxuICAgICAgICAgICAgICAgICAgICBsb2NhbEFkZHJlc3M6IHRoaXMuc29ja2V0LmxvY2FsQWRkcmVzcyxcbiAgICAgICAgICAgICAgICAgICAgbG9jYWxQb3J0OiB0aGlzLnNvY2tldC5sb2NhbFBvcnRcbiAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMudGxzKSB7XG4gICAgICAgICAgICAgICAgICAgIGxvZ0luZm8uYXV0aG9yaXplZCA9IHRoaXMudGxzLmF1dGhvcml6ZWQgPSB0aGlzLnNvY2tldC5hdXRob3JpemVkO1xuICAgICAgICAgICAgICAgICAgICBsb2dJbmZvLmFsZ28gPSB0aGlzLnRscy5zdGFuZGFyZE5hbWUgfHwgdGhpcy50bHMubmFtZTtcbiAgICAgICAgICAgICAgICAgICAgbG9nSW5mby52ZXJzaW9uID0gdGhpcy50bHMudmVyc2lvbjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB0aGlzLmxvZy5pbmZvKGxvZ0luZm8pO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5zZXRTb2NrZXRIYW5kbGVycygpO1xuICAgICAgICAgICAgICAgIHRoaXMuc29ja2V0LnBpcGUodGhpcy5zdHJlYW1lcik7XG5cbiAgICAgICAgICAgICAgICAvLyBleGVjdXRlZCBieSBpbml0aWFsIFwiKiBPS1wiXG4gICAgICAgICAgICAgICAgdGhpcy5pbml0aWFsUmVzb2x2ZSA9IHJlc29sdmU7XG4gICAgICAgICAgICAgICAgdGhpcy5pbml0aWFsUmVqZWN0ID0gcmVqZWN0O1xuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgaWYgKHNvY2tldCkge1xuICAgICAgICAgICAgICAgIC8vIHNvY2tldCBpcyBhbHJlYWR5IGVzdGFibGlzaGVkIHZpYSBwcm94eVxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnNlY3VyZUNvbm5lY3Rpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gVExTIHNvY2tldCByZXF1aXJlcyBhIGhhbmRzaGFrZVxuICAgICAgICAgICAgICAgICAgICBvcHRzLnNvY2tldCA9IHNvY2tldDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zb2NrZXQgPSBjb25uZWN0b3IuY29ubmVjdChvcHRzLCBvbkNvbm5lY3QpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGNsZWFydGV4dCBzb2NrZXQgaXMgYWxyZWFkeSB1c2FibGVcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zb2NrZXQgPSBzb2NrZXQ7XG4gICAgICAgICAgICAgICAgICAgIHNldEltbWVkaWF0ZShvbkNvbm5lY3QpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zb2NrZXQgPSBjb25uZWN0b3IuY29ubmVjdChvcHRzLCBvbkNvbm5lY3QpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLndyaXRlU29ja2V0ID0gdGhpcy5zb2NrZXQ7XG5cbiAgICAgICAgICAgIHRoaXMuc29ja2V0Lm9uKCdlcnJvcicsIGVyciA9PiB7XG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuY29ubmVjdFRpbWVvdXQpO1xuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aGlzLmdyZWV0aW5nVGltZW91dCk7XG4gICAgICAgICAgICAgICAgc2V0SW1tZWRpYXRlKCgpID0+IHRoaXMuY2xvc2UoKSk7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2cuZXJyb3IoeyBlcnIsIGNpZDogdGhpcy5pZCB9KTtcbiAgICAgICAgICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICB0aGlzLnNldEV2ZW50SGFuZGxlcnMoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR3JhY2VmdWwgY29ubmVjdGlvbiBjbG9zZSBieSBzZW5kaW5nIGxvZ291dCBjb21tYW5kIHRvIHNlcnZlci4gVENQIGNvbm5lY3Rpb24gaXMgY2xvc2VkIG9uY2UgY29tbWFuZCBpcyBmaW5pc2hlZC5cbiAgICAgKlxuICAgICAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59XG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBsZXQgY2xpZW50ID0gbmV3IEltYXBGbG93KHsuLi59KTtcbiAgICAgKiBhd2FpdCBjbGllbnQuY29ubmVjdCgpO1xuICAgICAqIC4uLlxuICAgICAqIGF3YWl0IGNsaWVudC5sb2dvdXQoKTtcbiAgICAgKi9cbiAgICBhc3luYyBsb2dvdXQoKSB7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLnJ1bignTE9HT1VUJyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2xvc2VzIFRDUCBjb25uZWN0aW9uIHdpdGhvdXQgbm90aWZ5aW5nIHRoZSBzZXJ2ZXIuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGxldCBjbGllbnQgPSBuZXcgSW1hcEZsb3coey4uLn0pO1xuICAgICAqIGF3YWl0IGNsaWVudC5jb25uZWN0KCk7XG4gICAgICogLi4uXG4gICAgICogY2xpZW50LmNsb3NlKCk7XG4gICAgICovXG4gICAgY2xvc2UoKSB7XG4gICAgICAgIC8vIGNsZWFyIHBlbmRpbmcgdGltZXJzXG4gICAgICAgIGNsZWFyVGltZW91dCh0aGlzLmlkbGVTdGFydFRpbWVyKTtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMudXBncmFkZVRpbWVvdXQpO1xuICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5jb25uZWN0VGltZW91dCk7XG5cbiAgICAgICAgdGhpcy51c2FibGUgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5pZGxpbmcgPSBmYWxzZTtcblxuICAgICAgICBpZiAodHlwZW9mIHRoaXMuaW5pdGlhbFJlamVjdCA9PT0gJ2Z1bmN0aW9uJyAmJiAhdGhpcy5vcHRpb25zLnZlcmlmeU9ubHkpIHtcbiAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aGlzLmdyZWV0aW5nVGltZW91dCk7XG4gICAgICAgICAgICBsZXQgcmVqZWN0ID0gdGhpcy5pbml0aWFsUmVqZWN0O1xuICAgICAgICAgICAgdGhpcy5pbml0aWFsUmVzb2x2ZSA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5pbml0aWFsUmVqZWN0ID0gZmFsc2U7XG4gICAgICAgICAgICBsZXQgZXJyID0gbmV3IEVycm9yKCdVbmV4cGVjdGVkIGNsb3NlJyk7XG4gICAgICAgICAgICBlcnIuY29kZSA9IGBDbG9zZWRBZnRlckNvbm5lY3Qke3RoaXMuc2VjdXJlQ29ubmVjdGlvbiA/ICdUTFMnIDogJ1RleHQnfWA7XG4gICAgICAgICAgICAvLyBzdGlsbCBoYXMgdG8gZ28gdGhyb3VnaCB0aGUgbG9naWMgYmVsb3dcbiAgICAgICAgICAgIHNldEltbWVkaWF0ZSgoKSA9PiByZWplY3QoZXJyKSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZW9mIHRoaXMucHJlQ2hlY2sgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHRoaXMucHJlQ2hlY2soKS5jYXRjaChlcnIgPT4gdGhpcy5sb2cud2Fybih7IGVyciwgY2lkOiB0aGlzLmlkIH0pKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHJlamVjdCBjb21tYW5kIHRoYXQgaXMgY3VycmVudGx5IHByb2Nlc3NlZFxuICAgICAgICBpZiAodGhpcy5jdXJyZW50UmVxdWVzdCAmJiB0aGlzLnJlcXVlc3RUYWdNYXAuaGFzKHRoaXMuY3VycmVudFJlcXVlc3QudGFnKSkge1xuICAgICAgICAgICAgbGV0IHJlcXVlc3QgPSB0aGlzLnJlcXVlc3RUYWdNYXAuZ2V0KHRoaXMuY3VycmVudFJlcXVlc3QudGFnKTtcbiAgICAgICAgICAgIGlmIChyZXF1ZXN0KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZXF1ZXN0VGFnTWFwLmRlbGV0ZShyZXF1ZXN0LnRhZyk7XG4gICAgICAgICAgICAgICAgY29uc3QgZXJyb3IgPSBuZXcgRXJyb3IoJ0Nvbm5lY3Rpb24gbm90IGF2YWlsYWJsZScpO1xuICAgICAgICAgICAgICAgIGVycm9yLmNvZGUgPSAnTm9Db25uZWN0aW9uJztcbiAgICAgICAgICAgICAgICByZXF1ZXN0LnJlamVjdChlcnJvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRSZXF1ZXN0ID0gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICAvLyByZWplY3QgYWxsIG90aGVyIHBlbmRpbmcgY29tbWFuZHNcbiAgICAgICAgd2hpbGUgKHRoaXMucmVxdWVzdFF1ZXVlLmxlbmd0aCkge1xuICAgICAgICAgICAgbGV0IHJlcSA9IHRoaXMucmVxdWVzdFF1ZXVlLnNoaWZ0KCk7XG4gICAgICAgICAgICBpZiAocmVxICYmIHRoaXMucmVxdWVzdFRhZ01hcC5oYXMocmVxLnRhZykpIHtcbiAgICAgICAgICAgICAgICBsZXQgcmVxdWVzdCA9IHRoaXMucmVxdWVzdFRhZ01hcC5nZXQocmVxLnRhZyk7XG4gICAgICAgICAgICAgICAgaWYgKHJlcXVlc3QpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZXF1ZXN0VGFnTWFwLmRlbGV0ZShyZXF1ZXN0LnRhZyk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGVycm9yID0gbmV3IEVycm9yKCdDb25uZWN0aW9uIG5vdCBhdmFpbGFibGUnKTtcbiAgICAgICAgICAgICAgICAgICAgZXJyb3IuY29kZSA9ICdOb0Nvbm5lY3Rpb24nO1xuICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LnJlamVjdChlcnJvcik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5zdGF0ZSA9IHRoaXMuc3RhdGVzLkxPR09VVDtcbiAgICAgICAgaWYgKHRoaXMuaXNDbG9zZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmlzQ2xvc2VkID0gdHJ1ZTtcblxuICAgICAgICBpZiAodGhpcy53cml0ZVNvY2tldCAmJiAhdGhpcy53cml0ZVNvY2tldC5kZXN0cm95ZWQpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgdGhpcy53cml0ZVNvY2tldC5kZXN0cm95KCk7XG4gICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxvZy5lcnJvcih7IGVyciwgY2lkOiB0aGlzLmlkIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuc29ja2V0ICYmICF0aGlzLnNvY2tldC5kZXN0cm95ZWQgJiYgdGhpcy53cml0ZVNvY2tldCAhPT0gdGhpcy5zb2NrZXQpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zb2NrZXQuZGVzdHJveSgpO1xuICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2cuZXJyb3IoeyBlcnIsIGNpZDogdGhpcy5pZCB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMubG9nLnRyYWNlKHsgbXNnOiAnQ29ubmVjdGlvbiBjbG9zZWQnLCBjaWQ6IHRoaXMuaWQgfSk7XG4gICAgICAgIHRoaXMuZW1pdCgnY2xvc2UnKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAdHlwZWRlZiB7T2JqZWN0fSBRdW90YVJlc3BvbnNlXG4gICAgICogQGdsb2JhbFxuICAgICAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBwYXRoPUlOQk9YIG1haWxib3ggcGF0aCB0aGlzIHF1b3RhIGFwcGxpZXMgdG9cbiAgICAgKiBAcHJvcGVydHkge09iamVjdH0gW3N0b3JhZ2VdIFN0b3JhZ2UgcXVvdGEgaWYgcHJvdmlkZWQgYnkgc2VydmVyXG4gICAgICogQHByb3BlcnR5IHtOdW1iZXJ9IFtzdG9yYWdlLnVzZWRdIHVzZWQgc3RvcmFnZSBpbiBieXRlc1xuICAgICAqIEBwcm9wZXJ0eSB7TnVtYmVyfSBbc3RvcmFnZS5saW1pdF0gdG90YWwgc3RvcmFnZSBhdmFpbGFibGVcbiAgICAgKiBAcHJvcGVydHkge09iamVjdH0gW21lc3NhZ2VzXSBNZXNzYWdlIGNvdW50IHF1b3RhIGlmIHByb3ZpZGVkIGJ5IHNlcnZlclxuICAgICAqIEBwcm9wZXJ0eSB7TnVtYmVyfSBbbWVzc2FnZXMudXNlZF0gc3RvcmVkIG1lc3NhZ2VzXG4gICAgICogQHByb3BlcnR5IHtOdW1iZXJ9IFttZXNzYWdlcy5saW1pdF0gbWF4aW11bSBtZXNzYWdlcyBhbGxvd2VkXG4gICAgICovXG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGN1cnJlbnQgcXVvdGFcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBbcGF0aF0gT3B0aW9uYWwgbWFpbGJveCBwYXRoIGlmIHlvdSB3YW50IHRvIGNoZWNrIHF1b3RhIGZvciBzcGVjaWZpYyBmb2xkZXJcbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTxRdW90YVJlc3BvbnNlfEJvb2xlYW4+fSBRdW90YSBpbmZvcm1hdGlvbiBvciBgZmFsc2VgIGlmIFFVVE9BIGV4dGVuc2lvbiBpcyBub3Qgc3VwcG9ydGVkIG9yIHJlcXVlc3RlZCBwYXRoIGRvZXMgbm90IGV4aXN0XG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGxldCBxdW90YSA9IGF3YWl0IGNsaWVudC5nZXRRdW90YSgpO1xuICAgICAqIGNvbnNvbGUubG9nKHF1b3RhLnN0b3JhZ2UudXNlZCwgcXVvdGEuc3RvcmFnZS5hdmFpbGFibGUpXG4gICAgICovXG4gICAgYXN5bmMgZ2V0UXVvdGEocGF0aCkge1xuICAgICAgICBwYXRoID0gcGF0aCB8fCAnSU5CT1gnO1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5ydW4oJ1FVT1RBJywgcGF0aCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHR5cGVkZWYge09iamVjdH0gTGlzdFJlc3BvbnNlXG4gICAgICogQGdsb2JhbFxuICAgICAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBwYXRoIG1haWxib3ggcGF0aCAodW5pY29kZSBzdHJpbmcpXG4gICAgICogQHByb3BlcnR5IHtTdHJpbmd9IHBhdGhBc0xpc3RlZCBtYWlsYm94IHBhdGggYXMgbGlzdGVkIGluIHRoZSBMSVNUL0xTVUIgcmVzcG9uc2VcbiAgICAgKiBAcHJvcGVydHkge1N0cmluZ30gbmFtZSBtYWlsYm94IG5hbWUgKGxhc3QgcGFydCBvZiBwYXRoIGFmdGVyIGRlbGltaXRlcilcbiAgICAgKiBAcHJvcGVydHkge1N0cmluZ30gZGVsaW1pdGVyIG1haWxib3ggcGF0aCBkZWxpbWl0ZXIsIHVzdWFsbHkgXCIuXCIgb3IgXCIvXCJcbiAgICAgKiBAcHJvcGVydHkge1N0cmluZ1tdfSBwYXJlbnQgQW4gYXJyYXkgb2YgcGFyZW50IGZvbGRlciBuYW1lcy4gQWxsIG5hbWVzIGFyZSBpbiB1bmljb2RlXG4gICAgICogQHByb3BlcnR5IHtTdHJpbmd9IHBhcmVudFBhdGggU2FtZSBhcyBgcGFyZW50YCwgYnV0IGFzIGEgY29tcGxldGUgc3RyaW5nIHBhdGggKHVuaWNvZGUgc3RyaW5nKVxuICAgICAqIEBwcm9wZXJ0eSB7U2V0PHN0cmluZz59IGZsYWdzIGEgc2V0IG9mIGZsYWdzIGZvciB0aGlzIG1haWxib3hcbiAgICAgKiBAcHJvcGVydHkge1N0cmluZ30gc3BlY2lhbFVzZSBvbmUgb2Ygc3BlY2lhbC11c2UgZmxhZ3MgKGlmIGFwcGxpY2FibGUpOiBcIlxcQWxsXCIsIFwiXFxBcmNoaXZlXCIsIFwiXFxEcmFmdHNcIiwgXCJcXEZsYWdnZWRcIiwgXCJcXEp1bmtcIiwgXCJcXFNlbnRcIiwgXCJcXFRyYXNoXCIuIEFkZGl0aW9uYWxseSBJTkJPWCBoYXMgbm9uLXN0YW5kYXJkIFwiXFxJbmJveFwiIGZsYWcgc2V0XG4gICAgICogQHByb3BlcnR5IHtCb29sZWFufSBsaXN0ZWQgYHRydWVgIGlmIG1haWxib3ggd2FzIGZvdW5kIGZyb20gdGhlIG91dHB1dCBvZiBMSVNUIGNvbW1hbmRcbiAgICAgKiBAcHJvcGVydHkge0Jvb2xlYW59IHN1YnNjcmliZWQgYHRydWVgIGlmIG1haWxib3ggd2FzIGZvdW5kIGZyb20gdGhlIG91dHB1dCBvZiBMU1VCIGNvbW1hbmRcbiAgICAgKiBAcHJvcGVydHkge1N0YXR1c09iamVjdH0gW3N0YXR1c10gSWYgYHN0YXR1c1F1ZXJ5YCB3YXMgdXNlZCwgdGhlbiB0aGlzIHZhbHVlIGluY2x1ZGVzIHRoZSBzdGF0dXMgcmVzcG9uc2VcbiAgICAgKi9cblxuICAgIC8qKlxuICAgICAqIEB0eXBlZGVmIHtPYmplY3R9IExpc3RPcHRpb25zXG4gICAgICogQGdsb2JhbFxuICAgICAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBbc3RhdHVzUXVlcnldIHJlcXVlc3Qgc3RhdHVzIGl0ZW1zIGZvciBldmVyeSBsaXN0ZWQgZW50cnlcbiAgICAgKiBAcHJvcGVydHkge0Jvb2xlYW59IFtzdGF0dXNRdWVyeS5tZXNzYWdlc10gaWYgYHRydWVgIHJlcXVlc3QgY291bnQgb2YgbWVzc2FnZXNcbiAgICAgKiBAcHJvcGVydHkge0Jvb2xlYW59IFtzdGF0dXNRdWVyeS5yZWNlbnRdIGlmIGB0cnVlYCByZXF1ZXN0IGNvdW50IG9mIG1lc3NhZ2VzIHdpdGggXFxcXFJlY2VudCB0YWdcbiAgICAgKiBAcHJvcGVydHkge0Jvb2xlYW59IFtzdGF0dXNRdWVyeS51aWROZXh0XSBpZiBgdHJ1ZWAgcmVxdWVzdCBwcmVkaWN0ZWQgbmV4dCBVSURcbiAgICAgKiBAcHJvcGVydHkge0Jvb2xlYW59IFtzdGF0dXNRdWVyeS51aWRWYWxpZGl0eV0gaWYgYHRydWVgIHJlcXVlc3QgbWFpbGJveCBgVUlEVkFMSURJVFlgIHZhbHVlXG4gICAgICogQHByb3BlcnR5IHtCb29sZWFufSBbc3RhdHVzUXVlcnkudW5zZWVuXSBpZiBgdHJ1ZWAgcmVxdWVzdCBjb3VudCBvZiB1bnNlZW4gbWVzc2FnZXNcbiAgICAgKiBAcHJvcGVydHkge0Jvb2xlYW59IFtzdGF0dXNRdWVyeS5oaWdoZXN0TW9kc2VxXSBpZiBgdHJ1ZWAgcmVxdWVzdCBsYXN0IGtub3duIG1vZHNlcSB2YWx1ZVxuICAgICAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBbc3BlY2lhbFVzZUhpbnRzXSBzZXQgc3BlY2lmaWMgcGF0aHMgYXMgc3BlY2lhbCB1c2UgZm9sZGVycywgdGhpcyB3b3VsZCBvdmVycmlkZSBzcGVjaWFsIHVzZSBmbGFncyBwcm92aWRlZCBmcm9tIHRoZSBzZXJ2ZXJcbiAgICAgKiBAcHJvcGVydHkge1N0cmluZ30gW3NwZWNpYWxVc2VIaW50cy5zZW50XSBQYXRoIHRvIFwiU2VudCBNYWlsXCIgZm9sZGVyXG4gICAgICogQHByb3BlcnR5IHtTdHJpbmd9IFtzcGVjaWFsVXNlSGludHMudHJhc2hdIFBhdGggdG8gXCJUcmFzaFwiIGZvbGRlclxuICAgICAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBbc3BlY2lhbFVzZUhpbnRzLmp1bmtdIFBhdGggdG8gXCJKdW5rIE1haWxcIiBmb2xkZXJcbiAgICAgKiBAcHJvcGVydHkge1N0cmluZ30gW3NwZWNpYWxVc2VIaW50cy5kcmFmdHNdIFBhdGggdG8gXCJEcmFmdHNcIiBmb2xkZXJcbiAgICAgKi9cblxuICAgIC8qKlxuICAgICAqIExpc3RzIGF2YWlsYWJsZSBtYWlsYm94ZXMgYXMgYW4gQXJyYXlcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7TGlzdE9wdGlvbnN9IFtvcHRpb25zXSBkZWZpbmVzIGFkZGl0aW9uYWwgbGlzdGluZyBvcHRpb25zXG4gICAgICogQHJldHVybnMge1Byb21pc2U8TGlzdFJlc3BvbnNlW10+fSBBbiBhcnJheSBvZiBMaXN0UmVzcG9uc2Ugb2JqZWN0c1xuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBsZXQgbGlzdCA9IGF3YWl0IGNsaWVudC5saXN0KCk7XG4gICAgICogbGlzdC5mb3JFYWNoKG1haWxib3g9PmNvbnNvbGUubG9nKG1haWxib3gucGF0aCkpO1xuICAgICAqL1xuICAgIGFzeW5jIGxpc3Qob3B0aW9ucykge1xuICAgICAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgICAgICAgbGV0IGZvbGRlcnMgPSBhd2FpdCB0aGlzLnJ1bignTElTVCcsICcnLCAnKicsIG9wdGlvbnMpO1xuICAgICAgICB0aGlzLmZvbGRlcnMgPSBuZXcgTWFwKGZvbGRlcnMubWFwKGZvbGRlciA9PiBbZm9sZGVyLnBhdGgsIGZvbGRlcl0pKTtcbiAgICAgICAgcmV0dXJuIGZvbGRlcnM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHR5cGVkZWYge09iamVjdH0gTGlzdFRyZWVSZXNwb25zZVxuICAgICAqIEBnbG9iYWxcbiAgICAgKiBAcHJvcGVydHkge0Jvb2xlYW59IHJvb3QgSWYgYHRydWVgIHRoZW4gdGhpcyBpcyByb290IG5vZGUgd2l0aG91dCBhbnkgYWRkaXRpb25hbCBwcm9wZXJ0aWVzIGJlc2lkZXMgKmZvbGRlcnMqXG4gICAgICogQHByb3BlcnR5IHtTdHJpbmd9IHBhdGggbWFpbGJveCBwYXRoXG4gICAgICogQHByb3BlcnR5IHtTdHJpbmd9IG5hbWUgbWFpbGJveCBuYW1lIChsYXN0IHBhcnQgb2YgcGF0aCBhZnRlciBkZWxpbWl0ZXIpXG4gICAgICogQHByb3BlcnR5IHtTdHJpbmd9IGRlbGltaXRlciBtYWlsYm94IHBhdGggZGVsaW1pdGVyLCB1c3VhbGx5IFwiLlwiIG9yIFwiL1wiXG4gICAgICogQHByb3BlcnR5IHtTdHJpbmdbXX0gZmxhZ3MgbGlzdCBvZiBmbGFncyBmb3IgdGhpcyBtYWlsYm94XG4gICAgICogQHByb3BlcnR5IHtTdHJpbmd9IHNwZWNpYWxVc2Ugb25lIG9mIHNwZWNpYWwtdXNlIGZsYWdzIChpZiBhcHBsaWNhYmxlKTogXCJcXEFsbFwiLCBcIlxcQXJjaGl2ZVwiLCBcIlxcRHJhZnRzXCIsIFwiXFxGbGFnZ2VkXCIsIFwiXFxKdW5rXCIsIFwiXFxTZW50XCIsIFwiXFxUcmFzaFwiLiBBZGRpdGlvbmFsbHkgSU5CT1ggaGFzIG5vbi1zdGFuZGFyZCBcIlxcSW5ib3hcIiBmbGFnIHNldFxuICAgICAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gbGlzdGVkIGB0cnVlYCBpZiBtYWlsYm94IHdhcyBmb3VuZCBmcm9tIHRoZSBvdXRwdXQgb2YgTElTVCBjb21tYW5kXG4gICAgICogQHByb3BlcnR5IHtCb29sZWFufSBzdWJzY3JpYmVkIGB0cnVlYCBpZiBtYWlsYm94IHdhcyBmb3VuZCBmcm9tIHRoZSBvdXRwdXQgb2YgTFNVQiBjb21tYW5kXG4gICAgICogQHByb3BlcnR5IHtCb29sZWFufSBkaXNhYmxlZCBJZiBgdHJ1ZWAgdGhlbiB0aGlzIG1haWxib3ggY2FuIG5vdCBiZSBzZWxlY3RlZCBpbiB0aGUgVUlcbiAgICAgKiBAcHJvcGVydHkge0xpc3RUcmVlUmVzcG9uc2VbXX0gZm9sZGVycyBBbiBhcnJheSBvZiBzdWJmb2xkZXJzXG4gICAgICovXG5cbiAgICAvKipcbiAgICAgKiBMaXN0cyBhdmFpbGFibGUgbWFpbGJveGVzIGFzIGEgdHJlZSBzdHJ1Y3R1cmVkIG9iamVjdFxuICAgICAqXG4gICAgICogQHBhcmFtIHtMaXN0T3B0aW9uc30gW29wdGlvbnNdIGRlZmluZXMgYWRkaXRpb25hbCBsaXN0aW5nIG9wdGlvbnNcbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTxMaXN0VHJlZVJlc3BvbnNlPn0gVHJlZSBzdHJ1Y3R1cmVkIG9iamVjdFxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBsZXQgdHJlZSA9IGF3YWl0IGNsaWVudC5saXN0VHJlZSgpO1xuICAgICAqIHRyZWUuZm9sZGVycy5mb3JFYWNoKG1haWxib3g9PmNvbnNvbGUubG9nKG1haWxib3gucGF0aCkpO1xuICAgICAqL1xuICAgIGFzeW5jIGxpc3RUcmVlKG9wdGlvbnMpIHtcbiAgICAgICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gICAgICAgIGxldCBmb2xkZXJzID0gYXdhaXQgdGhpcy5ydW4oJ0xJU1QnLCAnJywgJyonLCBvcHRpb25zKTtcbiAgICAgICAgdGhpcy5mb2xkZXJzID0gbmV3IE1hcChmb2xkZXJzLm1hcChmb2xkZXIgPT4gW2ZvbGRlci5wYXRoLCBmb2xkZXJdKSk7XG4gICAgICAgIHJldHVybiBnZXRGb2xkZXJUcmVlKGZvbGRlcnMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBlcmZvcm1zIGEgbm8tb3AgY2FsbCBhZ2FpbnN0IHNlcnZlclxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgICAqL1xuICAgIGFzeW5jIG5vb3AoKSB7XG4gICAgICAgIGF3YWl0IHRoaXMucnVuKCdOT09QJyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHR5cGVkZWYge09iamVjdH0gTWFpbGJveENyZWF0ZVJlc3BvbnNlXG4gICAgICogQGdsb2JhbFxuICAgICAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBwYXRoIGZ1bGwgbWFpbGJveCBwYXRoXG4gICAgICogQHByb3BlcnR5IHtTdHJpbmd9IFttYWlsYm94SWRdIHVuaXF1ZSBtYWlsYm94IElEIGlmIHNlcnZlciBzdXBwb3J0cyBgT0JKRUNUSURgIGV4dGVuc2lvbiAoY3VycmVudGx5IFlhaG9vIGFuZCBzb21lIG90aGVycylcbiAgICAgKiBAcHJvcGVydHkge0Jvb2xlYW59IGNyZWF0ZWQgSWYgYHRydWVgIHRoZW4gbWFpbGJveCB3YXMgY3JlYXRlZCBvdGhlcndpc2UgaXQgYWxyZWFkeSBleGlzdGVkXG4gICAgICovXG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IG1haWxib3ggZm9sZGVyIGFuZCBzZXRzIHVwIHN1YnNjcmlwdGlvbiBmb3IgdGhlIGNyZWF0ZWQgbWFpbGJveC4gVGhyb3dzIG9uIGVycm9yLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd8YXJyYXl9IHBhdGggRnVsbCBtYWlsYm94IHBhdGguIFVuaWNvZGUgaXMgYWxsb3dlZC4gSWYgdmFsdWUgaXMgYW4gYXJyYXkgdGhlbiBpdCBpcyBqb2luZWQgdXNpbmcgY3VycmVudCBkZWxpbWl0ZXIgc3ltYm9scy4gTmFtZXNwYWNlIHByZWZpeCBpcyBhZGRlZCBhdXRvbWF0aWNhbGx5IGlmIHJlcXVpcmVkLlxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlPE1haWxib3hDcmVhdGVSZXNwb25zZT59IE1haWxib3ggaW5mb1xuICAgICAqIEB0aHJvd3MgV2lsbCB0aHJvdyBhbiBlcnJvciBpZiBtYWlsYm94IGNhbiBub3QgYmUgY3JlYXRlZFxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBsZXQgaW5mbyA9IGF3YWl0IGNsaWVudC5tYWlsYm94Q3JlYXRlKFsncGFyZW50JywgJ2NoaWxkJ10pO1xuICAgICAqIGNvbnNvbGUubG9nKGluZm8ucGF0aCk7XG4gICAgICogLy8gXCJJTkJPWC5wYXJlbnQuY2hpbGRcIiAvLyBhc3N1bWVzIFwiSU5CT1guXCIgYXMgbmFtZXNwYWNlIHByZWZpeCBhbmQgXCIuXCIgYXMgZGVsaW1pdGVyXG4gICAgICovXG4gICAgYXN5bmMgbWFpbGJveENyZWF0ZShwYXRoKSB7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLnJ1bignQ1JFQVRFJywgcGF0aCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHR5cGVkZWYge09iamVjdH0gTWFpbGJveFJlbmFtZVJlc3BvbnNlXG4gICAgICogQGdsb2JhbFxuICAgICAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBwYXRoIGZ1bGwgbWFpbGJveCBwYXRoIHRoYXQgd2FzIHJlbmFtZWRcbiAgICAgKiBAcHJvcGVydHkge1N0cmluZ30gbmV3UGF0aCBuZXcgZnVsbCBtYWlsYm94IHBhdGhcbiAgICAgKi9cblxuICAgIC8qKlxuICAgICAqIFJlbmFtZXMgYSBtYWlsYm94LiBUaHJvd3Mgb24gZXJyb3IuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ3xhcnJheX0gcGF0aCAgUGF0aCBmb3IgdGhlIG1haWxib3ggdG8gcmVuYW1lLiBVbmljb2RlIGlzIGFsbG93ZWQuIElmIHZhbHVlIGlzIGFuIGFycmF5IHRoZW4gaXQgaXMgam9pbmVkIHVzaW5nIGN1cnJlbnQgZGVsaW1pdGVyIHN5bWJvbHMuIE5hbWVzcGFjZSBwcmVmaXggaXMgYWRkZWQgYXV0b21hdGljYWxseSBpZiByZXF1aXJlZC5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ3xhcnJheX0gbmV3UGF0aCBOZXcgcGF0aCBmb3IgdGhlIG1haWxib3hcbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTxNYWlsYm94UmVuYW1lUmVzcG9uc2U+fSBNYWlsYm94IGluZm9cbiAgICAgKiBAdGhyb3dzIFdpbGwgdGhyb3cgYW4gZXJyb3IgaWYgbWFpbGJveCBkb2VzIG5vdCBleGlzdCBvciBjYW4gbm90IGJlIHJlbmFtZWRcbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogbGV0IGluZm8gPSBhd2FpdCBjbGllbnQubWFpbGJveFJlbmFtZSgncGFyZW50LmNoaWxkJywgJ0ltcG9ydGFudCBzdHVmZiDinZfvuI8nKTtcbiAgICAgKiBjb25zb2xlLmxvZyhpbmZvLm5ld1BhdGgpO1xuICAgICAqIC8vIFwiSU5CT1guSW1wb3J0YW50IHN0dWZmIOKdl++4j1wiIC8vIGFzc3VtZXMgXCJJTkJPWC5cIiBhcyBuYW1lc3BhY2UgcHJlZml4XG4gICAgICovXG4gICAgYXN5bmMgbWFpbGJveFJlbmFtZShwYXRoLCBuZXdQYXRoKSB7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLnJ1bignUkVOQU1FJywgcGF0aCwgbmV3UGF0aCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHR5cGVkZWYge09iamVjdH0gTWFpbGJveERlbGV0ZVJlc3BvbnNlXG4gICAgICogQGdsb2JhbFxuICAgICAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBwYXRoIGZ1bGwgbWFpbGJveCBwYXRoIHRoYXQgd2FzIGRlbGV0ZWRcbiAgICAgKi9cblxuICAgIC8qKlxuICAgICAqIERlbGV0ZXMgYSBtYWlsYm94LiBUaHJvd3Mgb24gZXJyb3IuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ3xhcnJheX0gcGF0aCBQYXRoIGZvciB0aGUgbWFpbGJveCB0byBkZWxldGUuIFVuaWNvZGUgaXMgYWxsb3dlZC4gSWYgdmFsdWUgaXMgYW4gYXJyYXkgdGhlbiBpdCBpcyBqb2luZWQgdXNpbmcgY3VycmVudCBkZWxpbWl0ZXIgc3ltYm9scy4gTmFtZXNwYWNlIHByZWZpeCBpcyBhZGRlZCBhdXRvbWF0aWNhbGx5IGlmIHJlcXVpcmVkLlxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlPE1haWxib3hEZWxldGVSZXNwb25zZT59IE1haWxib3ggaW5mb1xuICAgICAqIEB0aHJvd3MgV2lsbCB0aHJvdyBhbiBlcnJvciBpZiBtYWlsYm94IGRvZXMgbm90IGV4aXN0IG9yIGNhbiBub3QgYmUgZGVsZXRlZFxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBsZXQgaW5mbyA9IGF3YWl0IGNsaWVudC5tYWlsYm94RGVsZXRlKCdJbXBvcnRhbnQgc3R1ZmYg4p2X77iPJyk7XG4gICAgICogY29uc29sZS5sb2coaW5mby5wYXRoKTtcbiAgICAgKiAvLyBcIklOQk9YLkltcG9ydGFudCBzdHVmZiDinZfvuI9cIiAvLyBhc3N1bWVzIFwiSU5CT1guXCIgYXMgbmFtZXNwYWNlIHByZWZpeFxuICAgICAqL1xuICAgIGFzeW5jIG1haWxib3hEZWxldGUocGF0aCkge1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5ydW4oJ0RFTEVURScsIHBhdGgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFN1YnNjcmliZXMgdG8gYSBtYWlsYm94XG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ3xhcnJheX0gcGF0aCBQYXRoIGZvciB0aGUgbWFpbGJveCB0byBzdWJzY3JpYmUgdG8uIFVuaWNvZGUgaXMgYWxsb3dlZC4gSWYgdmFsdWUgaXMgYW4gYXJyYXkgdGhlbiBpdCBpcyBqb2luZWQgdXNpbmcgY3VycmVudCBkZWxpbWl0ZXIgc3ltYm9scy4gTmFtZXNwYWNlIHByZWZpeCBpcyBhZGRlZCBhdXRvbWF0aWNhbGx5IGlmIHJlcXVpcmVkLlxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlPEJvb2xlYW4+fSBgdHJ1ZWAgaWYgc3Vic2NyaXB0aW9uIG9wZXJhdGlvbiBzdWNjZWVkZWQsIGBmYWxzZWAgb3RoZXJ3aXNlXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGF3YWl0IGNsaWVudC5tYWlsYm94U3Vic2NyaWJlKCdJbXBvcnRhbnQgc3R1ZmYg4p2X77iPJyk7XG4gICAgICovXG4gICAgYXN5bmMgbWFpbGJveFN1YnNjcmliZShwYXRoKSB7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLnJ1bignU1VCU0NSSUJFJywgcGF0aCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVW5zdWJzY3JpYmVzIGZyb20gYSBtYWlsYm94XG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ3xhcnJheX0gcGF0aCAqKlBhdGggZm9yIHRoZSBtYWlsYm94KiogdG8gdW5zdWJzY3JpYmUgZnJvbS4gVW5pY29kZSBpcyBhbGxvd2VkLiBJZiB2YWx1ZSBpcyBhbiBhcnJheSB0aGVuIGl0IGlzIGpvaW5lZCB1c2luZyBjdXJyZW50IGRlbGltaXRlciBzeW1ib2xzLiBOYW1lc3BhY2UgcHJlZml4IGlzIGFkZGVkIGF1dG9tYXRpY2FsbHkgaWYgcmVxdWlyZWQuXG4gICAgICogQHJldHVybnMge1Byb21pc2U8Qm9vbGVhbj59IGB0cnVlYCBpZiB1bnN1YnNjcmlwdGlvbiBvcGVyYXRpb24gc3VjY2VlZGVkLCBgZmFsc2VgIG90aGVyd2lzZVxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBhd2FpdCBjbGllbnQubWFpbGJveFVuc3Vic2NyaWJlKCdJbXBvcnRhbnQgc3R1ZmYg4p2X77iPJyk7XG4gICAgICovXG4gICAgYXN5bmMgbWFpbGJveFVuc3Vic2NyaWJlKHBhdGgpIHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMucnVuKCdVTlNVQlNDUklCRScsIHBhdGgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE9wZW5zIGEgbWFpbGJveCB0byBhY2Nlc3MgbWVzc2FnZXMuIFlvdSBjYW4gcGVyZm9ybSBtZXNzYWdlIG9wZXJhdGlvbnMgb25seSBhZ2FpbnN0IGFuIG9wZW5lZCBtYWlsYm94LlxuICAgICAqIFVzaW5nIHtAbGluayBtb2R1bGU6aW1hcGZsb3d+SW1hcEZsb3cjZ2V0TWFpbGJveExvY2t8Z2V0TWFpbGJveExvY2soKX0gaW5zdGVhZCBvZiBgbWFpbGJveE9wZW4oKWAgaXMgcHJlZmVycmVkLiBCb3RoIGRvIHRoZSBzYW1lIHRoaW5nXG4gICAgICogYnV0IG5leHQgYGdldE1haWxib3hMb2NrKClgIGNhbGwgaXMgbm90IGV4ZWN1dGVkIHVudGlsIHByZXZpb3VzIG9uZSBpcyByZWxlYXNlZC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfGFycmF5fSBwYXRoICoqUGF0aCBmb3IgdGhlIG1haWxib3gqKiB0byBvcGVuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXSBvcHRpb25hbCBvcHRpb25zXG4gICAgICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5yZWFkT25seT1mYWxzZV0gSWYgYHRydWVgIHRoZW4gb3BlbnMgbWFpbGJveCBpbiByZWFkLW9ubHkgbW9kZS4gWW91IGNhbiBzdGlsbCB0cnkgdG8gcGVyZm9ybSB3cml0ZSBvcGVyYXRpb25zIGJ1dCB0aGVzZSB3b3VsZCBwcm9iYWJseSBmYWlsLlxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlPE1haWxib3hPYmplY3Q+fSBNYWlsYm94IGluZm9cbiAgICAgKiBAdGhyb3dzIFdpbGwgdGhyb3cgYW4gZXJyb3IgaWYgbWFpbGJveCBkb2VzIG5vdCBleGlzdCBvciBjYW4gbm90IGJlIG9wZW5lZFxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBsZXQgbWFpbGJveCA9IGF3YWl0IGNsaWVudC5tYWlsYm94T3BlbignSW1wb3J0YW50IHN0dWZmIOKdl++4jycpO1xuICAgICAqIGNvbnNvbGUubG9nKG1haWxib3guZXhpc3RzKTtcbiAgICAgKiAvLyAxMjVcbiAgICAgKi9cbiAgICBhc3luYyBtYWlsYm94T3BlbihwYXRoLCBvcHRpb25zKSB7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLnJ1bignU0VMRUNUJywgcGF0aCwgb3B0aW9ucyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2xvc2VzIGEgcHJldmlvdXNseSBvcGVuZWQgbWFpbGJveFxuICAgICAqXG4gICAgICogQHJldHVybnMge1Byb21pc2U8Qm9vbGVhbj59IERpZCB0aGUgb3BlcmF0aW9uIHN1Y2NlZWQgb3Igbm90XG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGxldCBtYWlsYm94ID0gYXdhaXQgY2xpZW50Lm1haWxib3hPcGVuKCdJTkJPWCcpO1xuICAgICAqIGF3YWl0IGNsaWVudC5tYWlsYm94Q2xvc2UoKTtcbiAgICAgKi9cbiAgICBhc3luYyBtYWlsYm94Q2xvc2UoKSB7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLnJ1bignQ0xPU0UnKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAdHlwZWRlZiB7T2JqZWN0fSBTdGF0dXNPYmplY3RcbiAgICAgKiBAZ2xvYmFsXG4gICAgICogQHByb3BlcnR5IHtTdHJpbmd9IHBhdGggZnVsbCBtYWlsYm94IHBhdGggdGhhdCB3YXMgY2hlY2tlZFxuICAgICAqIEBwcm9wZXJ0eSB7TnVtYmVyfSBbbWVzc2FnZXNdIENvdW50IG9mIG1lc3NhZ2VzXG4gICAgICogQHByb3BlcnR5IHtOdW1iZXJ9IFtyZWNlbnRdIENvdW50IG9mIG1lc3NhZ2VzIHdpdGggXFxcXFJlY2VudCB0YWdcbiAgICAgKiBAcHJvcGVydHkge051bWJlcn0gW3VpZE5leHRdIFByZWRpY3RlZCBuZXh0IFVJRFxuICAgICAqIEBwcm9wZXJ0eSB7QmlnSW50fSBbdWlkVmFsaWRpdHldIE1haWxib3ggYFVJRFZBTElESVRZYCB2YWx1ZVxuICAgICAqIEBwcm9wZXJ0eSB7TnVtYmVyfSBbdW5zZWVuXSBDb3VudCBvZiB1bnNlZW4gbWVzc2FnZXNcbiAgICAgKiBAcHJvcGVydHkge0JpZ0ludH0gW2hpZ2hlc3RNb2RzZXFdIExhc3Qga25vd24gbW9kc2VxIHZhbHVlIChpZiBDT05EU1RPUkUgZXh0ZW5zaW9uIGlzIGVuYWJsZWQpXG4gICAgICovXG5cbiAgICAvKipcbiAgICAgKiBSZXF1ZXN0cyB0aGUgc3RhdHVzIG9mIHRoZSBpbmRpY2F0ZWQgbWFpbGJveC4gT25seSByZXF1ZXN0ZWQgc3RhdHVzIHZhbHVlcyB3aWxsIGJlIHJldHVybmVkLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IHBhdGggbWFpbGJveCBwYXRoIHRvIGNoZWNrIGZvciAodW5pY29kZSBzdHJpbmcpXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHF1ZXJ5IGRlZmluZXMgcmVxdWVzdGVkIHN0YXR1cyBpdGVtc1xuICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gcXVlcnkubWVzc2FnZXMgaWYgYHRydWVgIHJlcXVlc3QgY291bnQgb2YgbWVzc2FnZXNcbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IHF1ZXJ5LnJlY2VudCBpZiBgdHJ1ZWAgcmVxdWVzdCBjb3VudCBvZiBtZXNzYWdlcyB3aXRoIFxcXFxSZWNlbnQgdGFnXG4gICAgICogQHBhcmFtIHtCb29sZWFufSBxdWVyeS51aWROZXh0IGlmIGB0cnVlYCByZXF1ZXN0IHByZWRpY3RlZCBuZXh0IFVJRFxuICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gcXVlcnkudWlkVmFsaWRpdHkgaWYgYHRydWVgIHJlcXVlc3QgbWFpbGJveCBgVUlEVkFMSURJVFlgIHZhbHVlXG4gICAgICogQHBhcmFtIHtCb29sZWFufSBxdWVyeS51bnNlZW4gaWYgYHRydWVgIHJlcXVlc3QgY291bnQgb2YgdW5zZWVuIG1lc3NhZ2VzXG4gICAgICogQHBhcmFtIHtCb29sZWFufSBxdWVyeS5oaWdoZXN0TW9kc2VxIGlmIGB0cnVlYCByZXF1ZXN0IGxhc3Qga25vd24gbW9kc2VxIHZhbHVlXG4gICAgICogQHJldHVybnMge1Byb21pc2U8U3RhdHVzT2JqZWN0Pn0gc3RhdHVzIG9mIHRoZSBpbmRpY2F0ZWQgbWFpbGJveFxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBsZXQgc3RhdHVzID0gYXdhaXQgY2xpZW50LnN0YXR1cygnSU5CT1gnLCB7dW5zZWVuOiB0cnVlfSk7XG4gICAgICogY29uc29sZS5sb2coc3RhdHVzLnVuc2Vlbik7XG4gICAgICogLy8gMTIzXG4gICAgICovXG4gICAgYXN5bmMgc3RhdHVzKHBhdGgsIHF1ZXJ5KSB7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLnJ1bignU1RBVFVTJywgcGF0aCwgcXVlcnkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFN0YXJ0cyBsaXN0ZW5pbmcgZm9yIG5ldyBvciBkZWxldGVkIG1lc3NhZ2VzIGZyb20gdGhlIGN1cnJlbnRseSBvcGVuZWQgbWFpbGJveC4gT25seSByZXF1aXJlZCBpZiB7QGxpbmsgSW1hcEZsb3cjZGlzYWJsZUF1dG9JZGxlfSBpcyBzZXQgdG8gYHRydWVgXG4gICAgICogb3RoZXJ3aXNlIElETEUgaXMgc3RhcnRlZCBieSBkZWZhdWx0IG9uIGNvbm5lY3Rpb24gaW5hY3Rpdml0eS4gTkIhIElmIGBpZGxlKClgIGlzIGNhbGxlZCBtYW51YWxseSB0aGVuIGl0IGRvZXMgbm90XG4gICAgICogcmV0dXJuIHVudGlsIElETEUgaXMgZmluaXNoZWQgd2hpY2ggbWVhbnMgeW91IHdvdWxkIGhhdmUgdG8gY2FsbCBzb21lIG90aGVyIGNvbW1hbmQgb3V0IG9mIHNjb3BlLlxuICAgICAqXG4gICAgICogQHJldHVybnMge1Byb21pc2U8Qm9vbGVhbj59IERpZCB0aGUgb3BlcmF0aW9uIHN1Y2NlZWQgb3Igbm90XG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGxldCBtYWlsYm94ID0gYXdhaXQgY2xpZW50Lm1haWxib3hPcGVuKCdJTkJPWCcpO1xuICAgICAqXG4gICAgICogYXdhaXQgY2xpZW50LmlkbGUoKTtcbiAgICAgKi9cbiAgICBhc3luYyBpZGxlKCkge1xuICAgICAgICBpZiAoIXRoaXMuaWRsaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5ydW4oJ0lETEUnLCB0aGlzLm1heElkbGVUaW1lKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNlcXVlbmNlIHJhbmdlIHN0cmluZy4gU2VwYXJhdGUgZGlmZmVyZW50IHZhbHVlcyB3aXRoIGNvbW1hcywgbnVtYmVyIHJhbmdlcyB3aXRoIGNvbG9ucyBhbmQgdXNlIFxcXFwqIGFzIHRoZSBwbGFjZWhvbGRlciBmb3IgdGhlIG5ld2VzdCBtZXNzYWdlIGluIG1haWxib3hcbiAgICAgKiBAdHlwZWRlZiB7U3RyaW5nfSBTZXF1ZW5jZVN0cmluZ1xuICAgICAqIEBnbG9iYWxcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIFwiMToqXCIgLy8gZm9yIGFsbCBtZXNzYWdlc1xuICAgICAqIFwiMSwyLDNcIiAvLyBmb3IgbWVzc2FnZXMgMSwgMiBhbmQgM1xuICAgICAqIFwiMSwyLDQ6NlwiIC8vIGZvciBtZXNzYWdlcyAxLDIsNCw1LDZcbiAgICAgKiBcIipcIiAvLyBmb3IgdGhlIG5ld2VzdCBtZXNzYWdlXG4gICAgICovXG5cbiAgICAvKipcbiAgICAgKiBJTUFQIHNlYXJjaCBxdWVyeSBvcHRpb25zLiBCeSBkZWZhdWx0IGFsbCBjb25kaXRpb25zIG11c3QgbWF0Y2guIEluIGNhc2Ugb2YgYG9yYCBxdWVyeSB0ZXJtIGF0IGxlYXN0IG9uZSBjb25kaXRpb24gbXVzdCBtYXRjaC5cbiAgICAgKiBAdHlwZWRlZiB7T2JqZWN0fSBTZWFyY2hPYmplY3RcbiAgICAgKiBAZ2xvYmFsXG4gICAgICogQHByb3BlcnR5IHtTZXF1ZW5jZVN0cmluZ30gW3NlcV0gbWVzc2FnZSBvcmRlcmluZyBzZXF1ZW5jZSByYW5nZVxuICAgICAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gW2Fuc3dlcmVkXSBNZXNzYWdlcyB3aXRoICh2YWx1ZSBpcyBgdHJ1ZWApIG9yIHdpdGhvdXQgKHZhbHVlIGlzIGBmYWxzZWApIFxcXFxBbnN3ZXJlZCBmbGFnXG4gICAgICogQHByb3BlcnR5IHtCb29sZWFufSBbZGVsZXRlZF0gTWVzc2FnZXMgd2l0aCAodmFsdWUgaXMgYHRydWVgKSBvciB3aXRob3V0ICh2YWx1ZSBpcyBgZmFsc2VgKSBcXFxcRGVsZXRlZCBmbGFnXG4gICAgICogQHByb3BlcnR5IHtCb29sZWFufSBbZHJhZnRdIE1lc3NhZ2VzIHdpdGggKHZhbHVlIGlzIGB0cnVlYCkgb3Igd2l0aG91dCAodmFsdWUgaXMgYGZhbHNlYCkgXFxcXERyYWZ0IGZsYWdcbiAgICAgKiBAcHJvcGVydHkge0Jvb2xlYW59IFtmbGFnZ2VkXSBNZXNzYWdlcyB3aXRoICh2YWx1ZSBpcyBgdHJ1ZWApIG9yIHdpdGhvdXQgKHZhbHVlIGlzIGBmYWxzZWApIFxcXFxGbGFnZ2VkIGZsYWdcbiAgICAgKiBAcHJvcGVydHkge0Jvb2xlYW59IFtzZWVuXSBNZXNzYWdlcyB3aXRoICh2YWx1ZSBpcyBgdHJ1ZWApIG9yIHdpdGhvdXQgKHZhbHVlIGlzIGBmYWxzZWApIFxcXFxTZWVuIGZsYWdcbiAgICAgKiBAcHJvcGVydHkge0Jvb2xlYW59IFthbGxdIElmIGB0cnVlYCBtYXRjaGVzIGFsbCBtZXNzYWdlc1xuICAgICAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gW25ld10gSWYgYHRydWVgIG1hdGNoZXMgbWVzc2FnZXMgdGhhdCBoYXZlIHRoZSBcXFxcUmVjZW50IGZsYWcgc2V0IGJ1dCBub3QgdGhlIFxcXFxTZWVuIGZsYWdcbiAgICAgKiBAcHJvcGVydHkge0Jvb2xlYW59IFtvbGRdIElmIGB0cnVlYCBtYXRjaGVzIG1lc3NhZ2VzIHRoYXQgZG8gbm90IGhhdmUgdGhlIFxcXFxSZWNlbnQgZmxhZyBzZXRcbiAgICAgKiBAcHJvcGVydHkge0Jvb2xlYW59IFtyZWNlbnRdIElmIGB0cnVlYCBtYXRjaGVzIG1lc3NhZ2VzIHRoYXQgaGF2ZSB0aGUgXFxcXFJlY2VudCBmbGFnIHNldFxuICAgICAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBbZnJvbV0gTWF0Y2hlcyBGcm9tOiBhZGRyZXNzIGZpZWxkXG4gICAgICogQHByb3BlcnR5IHtTdHJpbmd9IFt0b10gTWF0Y2hlcyBUbzogYWRkcmVzcyBmaWVsZFxuICAgICAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBbY2NdIE1hdGNoZXMgQ2M6IGFkZHJlc3MgZmllbGRcbiAgICAgKiBAcHJvcGVydHkge1N0cmluZ30gW2JjY10gTWF0Y2hlcyBCY2M6IGFkZHJlc3MgZmllbGRcbiAgICAgKiBAcHJvcGVydHkge1N0cmluZ30gW2JvZHldIE1hdGNoZXMgbWVzc2FnZSBib2R5XG4gICAgICogQHByb3BlcnR5IHtTdHJpbmd9IFtzdWJqZWN0XSBNYXRjaGVzIG1lc3NhZ2Ugc3ViamVjdFxuICAgICAqIEBwcm9wZXJ0eSB7TnVtYmVyfSBbbGFyZ2VyXSBNYXRjaGVzIG1lc3NhZ2VzIGxhcmdlciB0aGFuIHZhbHVlXG4gICAgICogQHByb3BlcnR5IHtOdW1iZXJ9IFtzbWFsbGVyXSBNYXRjaGVzIG1lc3NhZ2VzIHNtYWxsZXIgdGhhbiB2YWx1ZVxuICAgICAqIEBwcm9wZXJ0eSB7U2VxdWVuY2VTdHJpbmd9IFt1aWRdIFVJRCBzZXF1ZW5jZSByYW5nZVxuICAgICAqIEBwcm9wZXJ0eSB7QmlnSW50fSBbbW9kc2VxXSBNYXRjaGVzIG1lc3NhZ2VzIHdpdGggbW9kc2VxIGhpZ2hlciB0aGFuIHZhbHVlXG4gICAgICogQHByb3BlcnR5IHtTdHJpbmd9IFtlbWFpbElkXSB1bmlxdWUgZW1haWwgSUQuIE9ubHkgdXNlZCBpZiBzZXJ2ZXIgc3VwcG9ydHMgYE9CSkVDVElEYCBvciBgWC1HTS1FWFQtMWAgZXh0ZW5zaW9uc1xuICAgICAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBbdGhyZWFkSWRdIHVuaXF1ZSB0aHJlYWQgSUQuIE9ubHkgdXNlZCBpZiBzZXJ2ZXIgc3VwcG9ydHMgYE9CSkVDVElEYCBvciBgWC1HTS1FWFQtMWAgZXh0ZW5zaW9uc1xuICAgICAqIEBwcm9wZXJ0eSB7RGF0ZXxzdHJpbmd9IFtiZWZvcmVdIE1hdGNoZXMgbWVzc2FnZXMgcmVjZWl2ZWQgYmVmb3JlIGRhdGVcbiAgICAgKiBAcHJvcGVydHkge0RhdGV8c3RyaW5nfSBbb25dIE1hdGNoZXMgbWVzc2FnZXMgcmVjZWl2ZWQgb24gZGF0ZSAoaWdub3JlcyB0aW1lKVxuICAgICAqIEBwcm9wZXJ0eSB7RGF0ZXxzdHJpbmd9IFtzaW5jZV0gTWF0Y2hlcyBtZXNzYWdlcyByZWNlaXZlZCBhZnRlciBkYXRlXG4gICAgICogQHByb3BlcnR5IHtEYXRlfHN0cmluZ30gW3NlbnRCZWZvcmVdIE1hdGNoZXMgbWVzc2FnZXMgc2VudCBiZWZvcmUgZGF0ZVxuICAgICAqIEBwcm9wZXJ0eSB7RGF0ZXxzdHJpbmd9IFtzZW50T25dIE1hdGNoZXMgbWVzc2FnZXMgc2VudCBvbiBkYXRlIChpZ25vcmVzIHRpbWUpXG4gICAgICogQHByb3BlcnR5IHtEYXRlfHN0cmluZ30gW3NlbnRTaW5jZV0gTWF0Y2hlcyBtZXNzYWdlcyBzZW50IGFmdGVyIGRhdGVcbiAgICAgKiBAcHJvcGVydHkge1N0cmluZ30gW2tleXdvcmRdIE1hdGNoZXMgbWVzc2FnZXMgdGhhdCBoYXZlIHRoZSBjdXN0b20gZmxhZyBzZXRcbiAgICAgKiBAcHJvcGVydHkge1N0cmluZ30gW3VuS2V5d29yZF0gTWF0Y2hlcyBtZXNzYWdlcyB0aGF0IGRvIG5vdCBoYXZlIHRoZSBjdXN0b20gZmxhZyBzZXRcbiAgICAgKiBAcHJvcGVydHkge09iamVjdC48c3RyaW5nLCBCb29sZWFufFN0cmluZz59IFtoZWFkZXJdIE1hdGNoZXMgbWVzc2FnZXMgd2l0aCBoZWFkZXIga2V5IHNldCBpZiB2YWx1ZSBpcyBgdHJ1ZWAgKCoqTkIhKiogbm90IHN1cHBvcnRlZCBieSBhbGwgc2VydmVycykgb3IgbWVzc2FnZXMgd2hlcmUgaGVhZGVyIHBhcnRpYWxseSBtYXRjaGVzIGEgc3RyaW5nIHZhbHVlXG4gICAgICogQHByb3BlcnR5IHtTZWFyY2hPYmplY3RbXX0gW29yXSBBbiBhcnJheSBvZiAyIG9yIG1vcmUge0BsaW5rIFNlYXJjaE9iamVjdH0gb2JqZWN0cy4gQXQgbGVhc3Qgb24gb2YgdGhlc2UgbXVzdCBtYXRjaFxuICAgICAqL1xuXG4gICAgLyoqXG4gICAgICogU2V0cyBmbGFncyBmb3IgYSBtZXNzYWdlIG9yIG1lc3NhZ2UgcmFuZ2VcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7U2VxdWVuY2VTdHJpbmcgfCBOdW1iZXJbXSB8IFNlYXJjaE9iamVjdH0gcmFuZ2UgUmFuZ2UgdG8gZmlsdGVyIHRoZSBtZXNzYWdlc1xuICAgICAqIEBwYXJhbSB7c3RyaW5nW119IEFycmF5IG9mIGZsYWdzIHRvIHNldC4gT25seSBmbGFncyB0aGF0IGFyZSBwZXJtaXR0ZWQgdG8gc2V0IGFyZSB1c2VkLCBvdGhlciBmbGFncyBhcmUgaWdub3JlZFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc11cbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLnVpZF0gSWYgYHRydWVgIHRoZW4gdXNlcyBVSUQge0BsaW5rIFNlcXVlbmNlU3RyaW5nfSBpbnN0ZWFkIG9mIHNlcXVlbmNlIG51bWJlcnNcbiAgICAgKiBAcGFyYW0ge0JpZ0ludH0gW29wdGlvbnMudW5jaGFuZ2VkU2luY2VdIElmIHNldCB0aGVuIG9ubHkgbWVzc2FnZXMgd2l0aCBhIGxvd2VyIG9yIGVxdWFsIGBtb2RzZXFgIHZhbHVlIGFyZSB1cGRhdGVkLiBJZ25vcmVkIGlmIHNlcnZlciBkb2VzIG5vdCBzdXBwb3J0IGBDT05EU1RPUkVgIGV4dGVuc2lvbi5cbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLnVzZUxhYmVscz1mYWxzZV0gSWYgdHJ1ZSB0aGVuIHVwZGF0ZSBHbWFpbCBsYWJlbHMgaW5zdGVhZCBvZiBtZXNzYWdlIGZsYWdzXG4gICAgICogQHJldHVybnMge1Byb21pc2U8Qm9vbGVhbj59IERpZCB0aGUgb3BlcmF0aW9uIHN1Y2NlZWQgb3Igbm90XG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGxldCBtYWlsYm94ID0gYXdhaXQgY2xpZW50Lm1haWxib3hPcGVuKCdJTkJPWCcpO1xuICAgICAqIC8vIG1hcmsgYWxsIHVuc2VlbiBtZXNzYWdlcyBhcyBzZWVuIChhbmQgcmVtb3ZlIG90aGVyIGZsYWdzKVxuICAgICAqIGF3YWl0IGNsaWVudC5tZXNzYWdlRmxhZ3NTZXQoe3NlZW46IGZhbHNlfSwgWydcXFNlZW5dKTtcbiAgICAgKi9cbiAgICBhc3luYyBtZXNzYWdlRmxhZ3NTZXQocmFuZ2UsIGZsYWdzLCBvcHRpb25zKSB7XG4gICAgICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuXG4gICAgICAgIHJhbmdlID0gYXdhaXQgdGhpcy5yZXNvbHZlUmFuZ2UocmFuZ2UsIG9wdGlvbnMpO1xuICAgICAgICBpZiAoIXJhbmdlKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgcXVlcnlPcHRzID0gT2JqZWN0LmFzc2lnbihcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBvcGVyYXRpb246ICdzZXQnXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgb3B0aW9uc1xuICAgICAgICApO1xuXG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLnJ1bignU1RPUkUnLCByYW5nZSwgZmxhZ3MsIHF1ZXJ5T3B0cyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWRkcyBmbGFncyBmb3IgYSBtZXNzYWdlIG9yIG1lc3NhZ2UgcmFuZ2VcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7U2VxdWVuY2VTdHJpbmcgfCBOdW1iZXJbXSB8IFNlYXJjaE9iamVjdH0gcmFuZ2UgUmFuZ2UgdG8gZmlsdGVyIHRoZSBtZXNzYWdlc1xuICAgICAqIEBwYXJhbSB7c3RyaW5nW119IEFycmF5IG9mIGZsYWdzIHRvIHNldC4gT25seSBmbGFncyB0aGF0IGFyZSBwZXJtaXR0ZWQgdG8gc2V0IGFyZSB1c2VkLCBvdGhlciBmbGFncyBhcmUgaWdub3JlZFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc11cbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLnVpZF0gSWYgYHRydWVgIHRoZW4gdXNlcyBVSUQge0BsaW5rIFNlcXVlbmNlU3RyaW5nfSBpbnN0ZWFkIG9mIHNlcXVlbmNlIG51bWJlcnNcbiAgICAgKiBAcGFyYW0ge0JpZ0ludH0gW29wdGlvbnMudW5jaGFuZ2VkU2luY2VdIElmIHNldCB0aGVuIG9ubHkgbWVzc2FnZXMgd2l0aCBhIGxvd2VyIG9yIGVxdWFsIGBtb2RzZXFgIHZhbHVlIGFyZSB1cGRhdGVkLiBJZ25vcmVkIGlmIHNlcnZlciBkb2VzIG5vdCBzdXBwb3J0IGBDT05EU1RPUkVgIGV4dGVuc2lvbi5cbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLnVzZUxhYmVscz1mYWxzZV0gSWYgdHJ1ZSB0aGVuIHVwZGF0ZSBHbWFpbCBsYWJlbHMgaW5zdGVhZCBvZiBtZXNzYWdlIGZsYWdzXG4gICAgICogQHJldHVybnMge1Byb21pc2U8Qm9vbGVhbj59IERpZCB0aGUgb3BlcmF0aW9uIHN1Y2NlZWQgb3Igbm90XG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGxldCBtYWlsYm94ID0gYXdhaXQgY2xpZW50Lm1haWxib3hPcGVuKCdJTkJPWCcpO1xuICAgICAqIC8vIG1hcmsgYWxsIHVuc2VlbiBtZXNzYWdlcyBhcyBzZWVuIChhbmQga2VlcCBvdGhlciBmbGFncyBhcyBpcylcbiAgICAgKiBhd2FpdCBjbGllbnQubWVzc2FnZUZsYWdzQWRkKHtzZWVuOiBmYWxzZX0sIFsnXFxTZWVuXSk7XG4gICAgICovXG4gICAgYXN5bmMgbWVzc2FnZUZsYWdzQWRkKHJhbmdlLCBmbGFncywgb3B0aW9ucykge1xuICAgICAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcblxuICAgICAgICByYW5nZSA9IGF3YWl0IHRoaXMucmVzb2x2ZVJhbmdlKHJhbmdlLCBvcHRpb25zKTtcbiAgICAgICAgaWYgKCFyYW5nZSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHF1ZXJ5T3B0cyA9IE9iamVjdC5hc3NpZ24oXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgb3BlcmF0aW9uOiAnYWRkJ1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG9wdGlvbnNcbiAgICAgICAgKTtcblxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5ydW4oJ1NUT1JFJywgcmFuZ2UsIGZsYWdzLCBxdWVyeU9wdHMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZSBzcGVjaWZpYyBmbGFncyBmcm9tIGEgbWVzc2FnZSBvciBtZXNzYWdlIHJhbmdlXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1NlcXVlbmNlU3RyaW5nIHwgTnVtYmVyW10gfCBTZWFyY2hPYmplY3R9IHJhbmdlIFJhbmdlIHRvIGZpbHRlciB0aGUgbWVzc2FnZXNcbiAgICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBBcnJheSBvZiBmbGFncyB0byByZW1vdmUuIE9ubHkgZmxhZ3MgdGhhdCBhcmUgcGVybWl0dGVkIHRvIHNldCBhcmUgdXNlZCwgb3RoZXIgZmxhZ3MgYXJlIGlnbm9yZWRcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdXG4gICAgICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy51aWRdIElmIGB0cnVlYCB0aGVuIHVzZXMgVUlEIHtAbGluayBTZXF1ZW5jZVN0cmluZ30gaW5zdGVhZCBvZiBzZXF1ZW5jZSBudW1iZXJzXG4gICAgICogQHBhcmFtIHtCaWdJbnR9IFtvcHRpb25zLnVuY2hhbmdlZFNpbmNlXSBJZiBzZXQgdGhlbiBvbmx5IG1lc3NhZ2VzIHdpdGggYSBsb3dlciBvciBlcXVhbCBgbW9kc2VxYCB2YWx1ZSBhcmUgdXBkYXRlZC4gSWdub3JlZCBpZiBzZXJ2ZXIgZG9lcyBub3Qgc3VwcG9ydCBgQ09ORFNUT1JFYCBleHRlbnNpb24uXG4gICAgICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy51c2VMYWJlbHM9ZmFsc2VdIElmIHRydWUgdGhlbiB1cGRhdGUgR21haWwgbGFiZWxzIGluc3RlYWQgb2YgbWVzc2FnZSBmbGFnc1xuICAgICAqIEByZXR1cm5zIHtQcm9taXNlPEJvb2xlYW4+fSBEaWQgdGhlIG9wZXJhdGlvbiBzdWNjZWVkIG9yIG5vdFxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBsZXQgbWFpbGJveCA9IGF3YWl0IGNsaWVudC5tYWlsYm94T3BlbignSU5CT1gnKTtcbiAgICAgKiAvLyBtYXJrIGFsbCBzZWVuIG1lc3NhZ2VzIGFzIHVuc2VlbiBieSByZW1vdmluZyBcXFxcU2VlbiBmbGFnXG4gICAgICogYXdhaXQgY2xpZW50Lm1lc3NhZ2VGbGFnc1JlbW92ZSh7c2VlbjogdHJ1ZX0sIFsnXFxTZWVuXSk7XG4gICAgICovXG4gICAgYXN5bmMgbWVzc2FnZUZsYWdzUmVtb3ZlKHJhbmdlLCBmbGFncywgb3B0aW9ucykge1xuICAgICAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcblxuICAgICAgICByYW5nZSA9IGF3YWl0IHRoaXMucmVzb2x2ZVJhbmdlKHJhbmdlLCBvcHRpb25zKTtcbiAgICAgICAgaWYgKCFyYW5nZSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHF1ZXJ5T3B0cyA9IE9iamVjdC5hc3NpZ24oXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgb3BlcmF0aW9uOiAncmVtb3ZlJ1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG9wdGlvbnNcbiAgICAgICAgKTtcblxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5ydW4oJ1NUT1JFJywgcmFuZ2UsIGZsYWdzLCBxdWVyeU9wdHMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgYSBjb2xvcmVkIGZsYWcgZm9yIGFuIGVtYWlsLiBPbmx5IHN1cHBvcnRlZCBieSBtYWlsIGNsaWVudHMgbGlrZSBBcHBsZSBNYWlsXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1NlcXVlbmNlU3RyaW5nIHwgTnVtYmVyW10gfCBTZWFyY2hPYmplY3R9IHJhbmdlIFJhbmdlIHRvIGZpbHRlciB0aGUgbWVzc2FnZXNcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gVGhlIGNvbG9yIHRvIHNldC4gT25lIG9mICdyZWQnLCAnb3JhbmdlJywgJ3llbGxvdycsICdncmVlbicsICdibHVlJywgJ3B1cnBsZScsIGFuZCAnZ3JleSdcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdXG4gICAgICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy51aWRdIElmIGB0cnVlYCB0aGVuIHVzZXMgVUlEIHtAbGluayBTZXF1ZW5jZVN0cmluZ30gaW5zdGVhZCBvZiBzZXF1ZW5jZSBudW1iZXJzXG4gICAgICogQHBhcmFtIHtCaWdJbnR9IFtvcHRpb25zLnVuY2hhbmdlZFNpbmNlXSBJZiBzZXQgdGhlbiBvbmx5IG1lc3NhZ2VzIHdpdGggYSBsb3dlciBvciBlcXVhbCBgbW9kc2VxYCB2YWx1ZSBhcmUgdXBkYXRlZC4gSWdub3JlZCBpZiBzZXJ2ZXIgZG9lcyBub3Qgc3VwcG9ydCBgQ09ORFNUT1JFYCBleHRlbnNpb24uXG4gICAgICogQHJldHVybnMge1Byb21pc2U8Qm9vbGVhbj59IERpZCB0aGUgb3BlcmF0aW9uIHN1Y2NlZWQgb3Igbm90XG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGxldCBtYWlsYm94ID0gYXdhaXQgY2xpZW50Lm1haWxib3hPcGVuKCdJTkJPWCcpO1xuICAgICAqIC8vIGFkZCBhIHB1cnBsZSBmbGFnIGZvciBhbGwgZW1haWxzXG4gICAgICogYXdhaXQgY2xpZW50LnNldEZsYWdDb2xvcignMToqJywgJ1B1cnBsZScpO1xuICAgICAqL1xuICAgIGFzeW5jIHNldEZsYWdDb2xvcihyYW5nZSwgY29sb3IsIG9wdGlvbnMpIHtcbiAgICAgICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cbiAgICAgICAgcmFuZ2UgPSBhd2FpdCB0aGlzLnJlc29sdmVSYW5nZShyYW5nZSwgb3B0aW9ucyk7XG4gICAgICAgIGlmICghcmFuZ2UpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBmbGFnQ2hhbmdlcyA9IGdldENvbG9yRmxhZ3MoY29sb3IpO1xuICAgICAgICBpZiAoIWZsYWdDaGFuZ2VzKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgYWRkUmVzdWx0cztcbiAgICAgICAgbGV0IHJlbW92ZVJlc3VsdHM7XG5cbiAgICAgICAgaWYgKGZsYWdDaGFuZ2VzLmFkZCAmJiBmbGFnQ2hhbmdlcy5hZGQubGVuZ3RoKSB7XG4gICAgICAgICAgICBsZXQgcXVlcnlPcHRzID0gT2JqZWN0LmFzc2lnbihcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbjogJ2FkZCdcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIG9wdGlvbnMsXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICB1c2VMYWJlbHM6IGZhbHNlLCAvLyBvdmVycmlkZSBpZiBzZXRcbiAgICAgICAgICAgICAgICAgICAgLy8gcHJldmVudCB0cmlnZ2VyaW5nIGEgcHJlbWF0dXJlIEZsYWdzIGNoYW5nZSBub3RpZmljYXRpb25cbiAgICAgICAgICAgICAgICAgICAgc2lsZW50OiBmbGFnQ2hhbmdlcy5yZW1vdmUgJiYgZmxhZ0NoYW5nZXMucmVtb3ZlLmxlbmd0aFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIGFkZFJlc3VsdHMgPSBhd2FpdCB0aGlzLnJ1bignU1RPUkUnLCByYW5nZSwgZmxhZ0NoYW5nZXMuYWRkLCBxdWVyeU9wdHMpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGZsYWdDaGFuZ2VzLnJlbW92ZSAmJiBmbGFnQ2hhbmdlcy5yZW1vdmUubGVuZ3RoKSB7XG4gICAgICAgICAgICBsZXQgcXVlcnlPcHRzID0gT2JqZWN0LmFzc2lnbihcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbjogJ3JlbW92ZSdcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIG9wdGlvbnMsXG4gICAgICAgICAgICAgICAgeyB1c2VMYWJlbHM6IGZhbHNlIH0gLy8gb3ZlcnJpZGUgaWYgc2V0XG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICByZW1vdmVSZXN1bHRzID0gYXdhaXQgdGhpcy5ydW4oJ1NUT1JFJywgcmFuZ2UsIGZsYWdDaGFuZ2VzLnJlbW92ZSwgcXVlcnlPcHRzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBhZGRSZXN1bHRzIHx8IHJlbW92ZVJlc3VsdHMgfHwgZmFsc2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGVsZXRlIG1lc3NhZ2VzIGZyb20gdGhlIGN1cnJlbnRseSBvcGVuZWQgbWFpbGJveC4gTWV0aG9kIGRvZXMgbm90IGluZGljYXRlIGluZm8gYWJvdXQgZGVsZXRlZCBtZXNzYWdlcyxcbiAgICAgKiBpbnN0ZWFkIHlvdSBzaG91bGQgYmUgdXNpbmcge0BsaW5rIEltYXBGbG93I2V4cHVuZ2V9IGV2ZW50IGZvciB0aGlzXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1NlcXVlbmNlU3RyaW5nIHwgTnVtYmVyW10gfCBTZWFyY2hPYmplY3R9IHJhbmdlIFJhbmdlIHRvIGZpbHRlciB0aGUgbWVzc2FnZXNcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdXG4gICAgICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy51aWRdIElmIGB0cnVlYCB0aGVuIHVzZXMgVUlEIHtAbGluayBTZXF1ZW5jZVN0cmluZ30gaW5zdGVhZCBvZiBzZXF1ZW5jZSBudW1iZXJzXG4gICAgICogQHJldHVybnMge1Byb21pc2U8Qm9vbGVhbj59IERpZCB0aGUgb3BlcmF0aW9uIHN1Y2NlZWQgb3Igbm90XG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGxldCBtYWlsYm94ID0gYXdhaXQgY2xpZW50Lm1haWxib3hPcGVuKCdJTkJPWCcpO1xuICAgICAqIC8vIGRlbGV0ZSBhbGwgc2VlbiBtZXNzYWdlc1xuICAgICAqIGF3YWl0IGNsaWVudC5tZXNzYWdlRGVsZXRlKHtzZWVuOiB0cnVlfSk7XG4gICAgICovXG4gICAgYXN5bmMgbWVzc2FnZURlbGV0ZShyYW5nZSwgb3B0aW9ucykge1xuICAgICAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgICAgICAgcmFuZ2UgPSBhd2FpdCB0aGlzLnJlc29sdmVSYW5nZShyYW5nZSwgb3B0aW9ucyk7XG4gICAgICAgIGlmICghcmFuZ2UpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5ydW4oJ0VYUFVOR0UnLCByYW5nZSwgb3B0aW9ucyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHR5cGVkZWYge09iamVjdH0gQXBwZW5kUmVzcG9uc2VPYmplY3RcbiAgICAgKiBAZ2xvYmFsXG4gICAgICogQHByb3BlcnR5IHtTdHJpbmd9IGRlc3RpbmF0aW9uIGZ1bGwgbWFpbGJveCBwYXRoIHdoZXJlIHRoZSBtZXNzYWdlIHdhcyB1cGxvYWRlZCB0b1xuICAgICAqIEBwcm9wZXJ0eSB7QmlnSW50fSBbdWlkVmFsaWRpdHldIG1haWxib3ggYFVJRFZBTElESVRZYCBpZiBzZXJ2ZXIgaGFzIGBVSURQTFVTYCBleHRlbnNpb24gZW5hYmxlZFxuICAgICAqIEBwcm9wZXJ0eSB7TnVtYmVyfSBbdWlkXSBVSUQgb2YgdGhlIHVwbG9hZGVkIG1lc3NhZ2UgaWYgc2VydmVyIGhhcyBgVUlEUExVU2AgZXh0ZW5zaW9uIGVuYWJsZWRcbiAgICAgKiBAcHJvcGVydHkge051bWJlcn0gW3NlcV0gc2VxdWVuY2UgbnVtYmVyIG9mIHRoZSB1cGxvYWRlZCBtZXNzYWdlIGlmIHBhdGggaXMgY3VycmVudGx5IHNlbGVjdGVkIG1haWxib3hcbiAgICAgKi9cblxuICAgIC8qKlxuICAgICAqIEFwcGVuZHMgYSBuZXcgbWVzc2FnZSB0byBhIG1haWxib3hcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBwYXRoIE1haWxib3ggcGF0aCB0byB1cGxvYWQgdGhlIG1lc3NhZ2UgdG8gKHVuaWNvZGUgc3RyaW5nKVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfEJ1ZmZlcn0gY29udGVudCBSRkM4MjIgZm9ybWF0dGVkIGVtYWlsIG1lc3NhZ2VcbiAgICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBbZmxhZ3NdIGFuIGFycmF5IG9mIGZsYWdzIHRvIGJlIHNldCBmb3IgdGhlIHVwbG9hZGVkIG1lc3NhZ2VcbiAgICAgKiBAcGFyYW0ge0RhdGV8c3RyaW5nfSBbaWRhdGU9bm93XSBpbnRlcm5hbCBkYXRlIHRvIGJlIHNldCBmb3IgdGhlIG1lc3NhZ2VcbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTxBcHBlbmRSZXNwb25zZU9iamVjdD59IGluZm8gYWJvdXQgdXBsb2FkZWQgbWVzc2FnZVxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBhd2FpdCBjbGllbnQuYXBwZW5kKCdJTkJPWCcsIHJhd01lc3NhZ2VCdWZmZXIsIFsnXFxcXFNlZW4nXSwgbmV3IERhdGUoMjAwMCwgMSwgMSkpO1xuICAgICAqL1xuICAgIGFzeW5jIGFwcGVuZChwYXRoLCBjb250ZW50LCBmbGFncywgaWRhdGUpIHtcbiAgICAgICAgbGV0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5ydW4oJ0FQUEVORCcsIHBhdGgsIGNvbnRlbnQsIGZsYWdzLCBpZGF0ZSk7XG5cbiAgICAgICAgaWYgKCFyZXNwb25zZSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlc3BvbnNlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEB0eXBlZGVmIHtPYmplY3R9IENvcHlSZXNwb25zZU9iamVjdFxuICAgICAqIEBnbG9iYWxcbiAgICAgKiBAcHJvcGVydHkge1N0cmluZ30gcGF0aCBwYXRoIG9mIHNvdXJjZSBtYWlsYm94XG4gICAgICogQHByb3BlcnR5IHtTdHJpbmd9IGRlc3RpbmF0aW9uIHBhdGggb2YgZGVzdGluYXRpb24gbWFpbGJveFxuICAgICAqIEBwcm9wZXJ0eSB7QmlnSW50fSBbdWlkVmFsaWRpdHldIGRlc3RpbmF0aW9uIG1haWxib3ggYFVJRFZBTElESVRZYCBpZiBzZXJ2ZXIgaGFzIGBVSURQTFVTYCBleHRlbnNpb24gZW5hYmxlZFxuICAgICAqIEBwcm9wZXJ0eSB7TWFwPG51bWJlciwgbnVtYmVyPn0gW3VpZE1hcF0gTWFwIG9mIFVJRCB2YWx1ZXMgKGlmIHNlcnZlciBoYXMgYFVJRFBMVVNgIGV4dGVuc2lvbiBlbmFibGVkKSB3aGVyZSBrZXkgaXMgVUlEIGluIHNvdXJjZSBtYWlsYm94IGFuZCB2YWx1ZSBpcyB0aGUgVUlEIGZvciB0aGUgc2FtZSBtZXNzYWdlIGluIGRlc3RpbmF0aW9uIG1haWxib3hcbiAgICAgKi9cblxuICAgIC8qKlxuICAgICAqIENvcGllcyBtZXNzYWdlcyBmcm9tIGN1cnJlbnQgbWFpbGJveCB0byBkZXN0aW5hdGlvbiBtYWlsYm94XG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1NlcXVlbmNlU3RyaW5nIHwgTnVtYmVyW10gfCBTZWFyY2hPYmplY3R9IHJhbmdlIFJhbmdlIG9mIG1lc3NhZ2VzIHRvIGNvcHlcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gZGVzdGluYXRpb24gTWFpbGJveCBwYXRoIHRvIGNvcHkgdGhlIG1lc3NhZ2VzIHRvXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXVxuICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMudWlkXSBJZiBgdHJ1ZWAgdGhlbiB1c2VzIFVJRCB7QGxpbmsgU2VxdWVuY2VTdHJpbmd9IGluc3RlYWQgb2Ygc2VxdWVuY2UgbnVtYmVyc1xuICAgICAqIEByZXR1cm5zIHtQcm9taXNlPENvcHlSZXNwb25zZU9iamVjdD59IGluZm8gYWJvdXQgY29waWVzIG1lc3NhZ2VzXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGF3YWl0IGNsaWVudC5tYWlsYm94T3BlbignSU5CT1gnKTtcbiAgICAgKiAvLyBjb3B5IGFsbCBtZXNzYWdlcyB0byBhIG1haWxib3ggY2FsbGVkIFwiQmFja3VwXCIgKG11c3QgZXhpc3QpXG4gICAgICogbGV0IHJlc3VsdCA9IGF3YWl0IGNsaWVudC5tZXNzYWdlQ29weSgnMToqJywgJ0JhY2t1cCcpO1xuICAgICAqIGNvbnNvbGUubG9nKCdDb3BpZWQgJXMgbWVzc2FnZXMnLCByZXN1bHQudWlkTWFwLnNpemUpO1xuICAgICAqL1xuICAgIGFzeW5jIG1lc3NhZ2VDb3B5KHJhbmdlLCBkZXN0aW5hdGlvbiwgb3B0aW9ucykge1xuICAgICAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgICAgICAgcmFuZ2UgPSBhd2FpdCB0aGlzLnJlc29sdmVSYW5nZShyYW5nZSwgb3B0aW9ucyk7XG4gICAgICAgIGlmICghcmFuZ2UpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5ydW4oJ0NPUFknLCByYW5nZSwgZGVzdGluYXRpb24sIG9wdGlvbnMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE1vdmVzIG1lc3NhZ2VzIGZyb20gY3VycmVudCBtYWlsYm94IHRvIGRlc3RpbmF0aW9uIG1haWxib3hcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7U2VxdWVuY2VTdHJpbmcgfCBOdW1iZXJbXSB8IFNlYXJjaE9iamVjdH0gcmFuZ2UgUmFuZ2Ugb2YgbWVzc2FnZXMgdG8gbW92ZVxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBkZXN0aW5hdGlvbiBNYWlsYm94IHBhdGggdG8gbW92ZSB0aGUgbWVzc2FnZXMgdG9cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdXG4gICAgICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy51aWRdIElmIGB0cnVlYCB0aGVuIHVzZXMgVUlEIHtAbGluayBTZXF1ZW5jZVN0cmluZ30gaW5zdGVhZCBvZiBzZXF1ZW5jZSBudW1iZXJzXG4gICAgICogQHJldHVybnMge1Byb21pc2U8Q29weVJlc3BvbnNlT2JqZWN0Pn0gaW5mbyBhYm91dCBtb3ZlZCBtZXNzYWdlc1xuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBhd2FpdCBjbGllbnQubWFpbGJveE9wZW4oJ0lOQk9YJyk7XG4gICAgICogLy8gbW92ZSBhbGwgbWVzc2FnZXMgdG8gYSBtYWlsYm94IGNhbGxlZCBcIlRyYXNoXCIgKG11c3QgZXhpc3QpXG4gICAgICogbGV0IHJlc3VsdCA9IGF3YWl0IGNsaWVudC5tZXNzYWdlTW92ZSgnMToqJywgJ1RyYXNoJyk7XG4gICAgICogY29uc29sZS5sb2coJ01vdmVkICVzIG1lc3NhZ2VzJywgcmVzdWx0LnVpZE1hcC5zaXplKTtcbiAgICAgKi9cbiAgICBhc3luYyBtZXNzYWdlTW92ZShyYW5nZSwgZGVzdGluYXRpb24sIG9wdGlvbnMpIHtcbiAgICAgICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gICAgICAgIHJhbmdlID0gYXdhaXQgdGhpcy5yZXNvbHZlUmFuZ2UocmFuZ2UsIG9wdGlvbnMpO1xuICAgICAgICBpZiAoIXJhbmdlKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMucnVuKCdNT1ZFJywgcmFuZ2UsIGRlc3RpbmF0aW9uLCBvcHRpb25zKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZWFyY2ggbWVzc2FnZXMgZnJvbSB0aGUgY3VycmVudGx5IG9wZW5lZCBtYWlsYm94XG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1NlYXJjaE9iamVjdH0gcXVlcnkgUXVlcnkgdG8gZmlsdGVyIHRoZSBtZXNzYWdlc1xuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc11cbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLnVpZF0gSWYgYHRydWVgIHRoZW4gcmV0dXJucyBVSUQgbnVtYmVycyBpbnN0ZWFkIG9mIHNlcXVlbmNlIG51bWJlcnNcbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTxOdW1iZXJbXT59IEFuIGFycmF5IG9mIHNlcXVlbmNlIG9yIFVJRCBudW1iZXJzXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGxldCBtYWlsYm94ID0gYXdhaXQgY2xpZW50Lm1haWxib3hPcGVuKCdJTkJPWCcpO1xuICAgICAqIC8vIGZpbmQgYWxsIHVuc2VlbiBtZXNzYWdlc1xuICAgICAqIGxldCBsaXN0ID0gYXdhaXQgY2xpZW50LnNlYXJjaCh7c2VlbjogZmFsc2V9KTtcbiAgICAgKiAvLyB1c2UgT1IgbW9kaWZpZXIgKGFycmF5IG9mIDIgb3IgbW9yZSBzZWFyY2ggcXVlcmllcylcbiAgICAgKiBsZXQgbGlzdCA9IGF3YWl0IGNsaWVudC5zZWFyY2goe1xuICAgICAqICAgc2VlbjogZmFsc2UsXG4gICAgICogICBvcjogW1xuICAgICAqICAgICB7ZmxhZ2dlZDogdHJ1ZX0sXG4gICAgICogICAgIHtmcm9tOiAnYW5kcmlzJ30sXG4gICAgICogICAgIHtzdWJqZWN0OiAndGVzdCd9XG4gICAgICogICBdfSk7XG4gICAgICovXG4gICAgYXN5bmMgc2VhcmNoKHF1ZXJ5LCBvcHRpb25zKSB7XG4gICAgICAgIGlmICghdGhpcy5tYWlsYm94KSB7XG4gICAgICAgICAgICAvLyBubyBtYWlsYm94IHNlbGVjdGVkLCBub3RoaW5nIHRvIGRvXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLnJ1bignU0VBUkNIJywgcXVlcnksIG9wdGlvbnMpO1xuXG4gICAgICAgIGlmICghcmVzcG9uc2UpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXNwb25zZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAdHlwZWRlZiB7T2JqZWN0fSBGZXRjaFF1ZXJ5T2JqZWN0XG4gICAgICogQGdsb2JhbFxuICAgICAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gW3VpZF0gaWYgYHRydWVgIHRoZW4gaW5jbHVkZSBVSUQgaW4gdGhlIHJlc3BvbnNlXG4gICAgICogQHByb3BlcnR5IHtCb29sZWFufSBbZmxhZ3NdIGlmIGB0cnVlYCB0aGVuIGluY2x1ZGUgZmxhZ3MgU2V0IGluIHRoZSByZXNwb25zZS4gQWxzbyBhZGRzIGBmbGFnQ29sb3JgIHRvIHRoZSByZXNwb25zZSBpZiB0aGUgbWVzc2FnZSBpcyBmbGFnZ2VkLlxuICAgICAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gW2JvZHlTdHJ1Y3R1cmVdIGlmIGB0cnVlYCB0aGVuIGluY2x1ZGUgcGFyc2VkIEJPRFlTVFJVQ1RVUkUgb2JqZWN0IGluIHRoZSByZXNwb25zZVxuICAgICAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gW2VudmVsb3BlXSBpZiBgdHJ1ZWAgdGhlbiBpbmNsdWRlIHBhcnNlZCBFTlZFTE9QRSBvYmplY3QgaW4gdGhlIHJlc3BvbnNlXG4gICAgICogQHByb3BlcnR5IHtCb29sZWFufSBbaW50ZXJuYWxEYXRlXSBpZiBgdHJ1ZWAgdGhlbiBpbmNsdWRlIGludGVybmFsIGRhdGUgdmFsdWUgaW4gdGhlIHJlc3BvbnNlXG4gICAgICogQHByb3BlcnR5IHtCb29sZWFufSBbc2l6ZV0gaWYgYHRydWVgIHRoZW4gaW5jbHVkZSBtZXNzYWdlIHNpemUgaW4gdGhlIHJlc3BvbnNlXG4gICAgICogQHByb3BlcnR5IHtib29sZWFuIHwgT2JqZWN0fSBbc291cmNlXSBpZiBgdHJ1ZWAgdGhlbiBpbmNsdWRlIGZ1bGwgbWVzc2FnZSBpbiB0aGUgcmVzcG9uc2VcbiAgICAgKiBAcHJvcGVydHkge051bWJlcn0gW3NvdXJjZS5zdGFydF0gaW5jbHVkZSBmdWxsIG1lc3NhZ2UgaW4gdGhlIHJlc3BvbnNlIHN0YXJ0aW5nIGZyb20gKnN0YXJ0KiBieXRlXG4gICAgICogQHByb3BlcnR5IHtOdW1iZXJ9IFtzb3VyY2UubWF4TGVuZ3RoXSBpbmNsdWRlIGZ1bGwgbWVzc2FnZSBpbiB0aGUgcmVzcG9uc2UsIHVwIHRvICptYXhMZW5ndGgqIGJ5dGVzXG4gICAgICogQHByb3BlcnR5IHtTdHJpbmd9IFt0aHJlYWRJZF0gaWYgYHRydWVgIHRoZW4gaW5jbHVkZSB0aHJlYWQgSUQgaW4gdGhlIHJlc3BvbnNlIChvbmx5IGlmIHNlcnZlciBzdXBwb3J0cyBlaXRoZXIgYE9CSkVDVElEYCBvciBgWC1HTS1FWFQtMWAgZXh0ZW5zaW9ucylcbiAgICAgKiBAcHJvcGVydHkge0Jvb2xlYW59IFtsYWJlbHNdIGlmIGB0cnVlYCB0aGVuIGluY2x1ZGUgR01haWwgbGFiZWxzIGluIHRoZSByZXNwb25zZSAob25seSBpZiBzZXJ2ZXIgc3VwcG9ydHMgYFgtR00tRVhULTFgIGV4dGVuc2lvbilcbiAgICAgKiBAcHJvcGVydHkge2Jvb2xlYW4gfCBzdHJpbmdbXX0gW2hlYWRlcnNdIGlmIGB0cnVlYCB0aGVuIGluY2x1ZGVzIGZ1bGwgaGVhZGVycyBvZiB0aGUgbWVzc2FnZSBpbiB0aGUgcmVzcG9uc2UuIElmIHRoZSB2YWx1ZSBpcyBhbiBhcnJheSBvZiBoZWFkZXIga2V5cyB0aGVuIGluY2x1ZGVzIG9ubHkgaGVhZGVycyBsaXN0ZWQgaW4gdGhlIGFycmF5XG4gICAgICogQHByb3BlcnR5IHtzdHJpbmdbXX0gW2JvZHlQYXJ0c10gQW4gYXJyYXkgb2YgQk9EWVBBUlQgaWRlbnRpZmllcnMgdG8gaW5jbHVkZSBpbiB0aGUgcmVzcG9uc2VcbiAgICAgKi9cblxuICAgIC8qKlxuICAgICAqIFBhcnNlZCBlbWFpbCBhZGRyZXNzIGVudHJ5XG4gICAgICpcbiAgICAgKiBAdHlwZWRlZiB7T2JqZWN0fSBNZXNzYWdlQWRkcmVzc09iamVjdFxuICAgICAqIEBnbG9iYWxcbiAgICAgKiBAcHJvcGVydHkge1N0cmluZ30gW25hbWVdIG5hbWUgb2YgdGhlIGFkZHJlc3Mgb2JqZWN0ICh1bmljb2RlKVxuICAgICAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBbYWRkcmVzc10gZW1haWwgYWRkcmVzc1xuICAgICAqL1xuXG4gICAgLyoqXG4gICAgICogUGFyc2VkIElNQVAgRU5WRUxPUEUgb2JqZWN0XG4gICAgICpcbiAgICAgKiBAdHlwZWRlZiB7T2JqZWN0fSBNZXNzYWdlRW52ZWxvcGVPYmplY3RcbiAgICAgKiBAZ2xvYmFsXG4gICAgICogQHByb3BlcnR5IHtEYXRlfSBbZGF0ZV0gaGVhZGVyIGRhdGVcbiAgICAgKiBAcHJvcGVydHkge1N0cmluZ30gW3N1YmplY3RdIG1lc3NhZ2Ugc3ViamVjdCAodW5pY29kZSlcbiAgICAgKiBAcHJvcGVydHkge1N0cmluZ30gW21lc3NhZ2VJZF0gTWVzc2FnZSBJRCBvZiB0aGUgbWVzc2FnZVxuICAgICAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBbaW5SZXBseVRvXSBNZXNzYWdlIElEIGZyb20gSW4tUmVwbHktVG8gaGVhZGVyXG4gICAgICogQHByb3BlcnR5IHtNZXNzYWdlQWRkcmVzc09iamVjdFtdfSBbZnJvbV0gQXJyYXkgb2YgYWRkcmVzc2VzIGZyb20gdGhlIEZyb206IGhlYWRlclxuICAgICAqIEBwcm9wZXJ0eSB7TWVzc2FnZUFkZHJlc3NPYmplY3RbXX0gW3NlbmRlcl0gQXJyYXkgb2YgYWRkcmVzc2VzIGZyb20gdGhlIFNlbmRlcjogaGVhZGVyXG4gICAgICogQHByb3BlcnR5IHtNZXNzYWdlQWRkcmVzc09iamVjdFtdfSBbcmVwbHlUb10gQXJyYXkgb2YgYWRkcmVzc2VzIGZyb20gdGhlIFJlcGx5LVRvOiBoZWFkZXJcbiAgICAgKiBAcHJvcGVydHkge01lc3NhZ2VBZGRyZXNzT2JqZWN0W119IFt0b10gQXJyYXkgb2YgYWRkcmVzc2VzIGZyb20gdGhlIFRvOiBoZWFkZXJcbiAgICAgKiBAcHJvcGVydHkge01lc3NhZ2VBZGRyZXNzT2JqZWN0W119IFtjY10gQXJyYXkgb2YgYWRkcmVzc2VzIGZyb20gdGhlIENjOiBoZWFkZXJcbiAgICAgKiBAcHJvcGVydHkge01lc3NhZ2VBZGRyZXNzT2JqZWN0W119IFtiY2NdIEFycmF5IG9mIGFkZHJlc3NlcyBmcm9tIHRoZSBCY2M6IGhlYWRlclxuICAgICAqL1xuXG4gICAgLyoqXG4gICAgICogUGFyc2VkIElNQVAgQk9EWVNUUlVDVFVSRSBvYmplY3RcbiAgICAgKlxuICAgICAqIEB0eXBlZGVmIHtPYmplY3R9IE1lc3NhZ2VTdHJ1Y3R1cmVPYmplY3RcbiAgICAgKiBAZ2xvYmFsXG4gICAgICogQHByb3BlcnR5IHtTdHJpbmd9IHBhcnQgQm9keSBwYXJ0IG51bWJlci4gVGhpcyB2YWx1ZSBjYW4gYmUgdXNlZCB0byBsYXRlciBmZXRjaCB0aGUgY29udGVudHMgb2YgdGhpcyBwYXJ0IG9mIHRoZSBtZXNzYWdlXG4gICAgICogQHByb3BlcnR5IHtTdHJpbmd9IHR5cGUgQ29udGVudC1UeXBlIG9mIHRoaXMgbm9kZVxuICAgICAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBbcGFyYW1ldGVyc10gQWRkaXRpb25hbCBwYXJhbWV0ZXJzIGZvciBDb250ZW50LVR5cGUsIGVnIFwiY2hhcnNldFwiXG4gICAgICogQHByb3BlcnR5IHtTdHJpbmd9IFtpZF0gQ29udGVudC1JRFxuICAgICAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBbZW5jb2RpbmddIFRyYW5zZmVyIGVuY29kaW5nXG4gICAgICogQHByb3BlcnR5IHtOdW1iZXJ9IFtzaXplXSBFeHBlY3RlZCBzaXplIG9mIHRoZSBub2RlXG4gICAgICogQHByb3BlcnR5IHtNZXNzYWdlRW52ZWxvcGVPYmplY3R9IFtlbnZlbG9wZV0gbWVzc2FnZSBlbnZlbG9wZSBvZiBlbWJlZGRlZCBSRkM4MjIgbWVzc2FnZVxuICAgICAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBbZGlzcG9zaXRpb25dIENvbnRlbnQgZGlzcG9zaXRpb25cbiAgICAgKiBAcHJvcGVydHkge09iamVjdH0gW2Rpc3Bvc2l0aW9uUGFyYW1ldGVyc10gQWRkaXRpb25hbCBwYXJhbWV0ZXJzIGZvciBDb250ZW50LURpc3Bvc2l0aW9uXG4gICAgICogQHByb3BlcnR5IHtNZXNzYWdlU3RydWN0dXJlT2JqZWN0W119IGNoaWxkTm9kZXMgQW4gYXJyYXkgb2YgY2hpbGQgbm9kZXMgaWYgdGhpcyBpcyBhIG11bHRpcGFydCBub2RlLiBOb3QgcHJlc2VudCBmb3Igbm9ybWFsIG5vZGVzXG4gICAgICovXG5cbiAgICAvKipcbiAgICAgKiBGZXRjaGVkIG1lc3NhZ2UgZGF0YVxuICAgICAqXG4gICAgICogQHR5cGVkZWYge09iamVjdH0gRmV0Y2hNZXNzYWdlT2JqZWN0XG4gICAgICogQGdsb2JhbFxuICAgICAqIEBwcm9wZXJ0eSB7TnVtYmVyfSBzZXEgbWVzc2FnZSBzZXF1ZW5jZSBudW1iZXIuIEFsd2F5cyBpbmNsdWRlZCBpbiB0aGUgcmVzcG9uc2VcbiAgICAgKiBAcHJvcGVydHkge051bWJlcn0gdWlkIG1lc3NhZ2UgVUlEIG51bWJlci4gQWx3YXlzIGluY2x1ZGVkIGluIHRoZSByZXNwb25zZVxuICAgICAqIEBwcm9wZXJ0eSB7QnVmZmVyfSBbc291cmNlXSBtZXNzYWdlIHNvdXJjZSBmb3IgdGhlIHJlcXVlc3RlZCBieXRlIHJhbmdlXG4gICAgICogQHByb3BlcnR5IHtCaWdJbnR9IFttb2RzZXFdIG1lc3NhZ2UgTW9kc2VxIG51bWJlci4gQWx3YXlzIGluY2x1ZGVkIGlmIHRoZSBzZXJ2ZXIgc3VwcG9ydHMgQ09ORFNUT1JFIGV4dGVuc2lvblxuICAgICAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBbZW1haWxJZF0gdW5pcXVlIGVtYWlsIElELiBBbHdheXMgaW5jbHVkZWQgaWYgc2VydmVyIHN1cHBvcnRzIGBPQkpFQ1RJRGAgb3IgYFgtR00tRVhULTFgIGV4dGVuc2lvbnNcbiAgICAgKiBAcHJvcGVydHkge1N0cmluZ30gW3RocmVhZGlkXSB1bmlxdWUgdGhyZWFkIElELiBPbmx5IHByZXNlbnQgaWYgc2VydmVyIHN1cHBvcnRzIGBPQkpFQ1RJRGAgb3IgYFgtR00tRVhULTFgIGV4dGVuc2lvblxuICAgICAqIEBwcm9wZXJ0eSB7U2V0PHN0cmluZz59IFtsYWJlbHNdIGEgU2V0IG9mIGxhYmVscy4gT25seSBwcmVzZW50IGlmIHNlcnZlciBzdXBwb3J0cyBgWC1HTS1FWFQtMWAgZXh0ZW5zaW9uXG4gICAgICogQHByb3BlcnR5IHtOdW1iZXJ9IFtzaXplXSBtZXNzYWdlIHNpemVcbiAgICAgKiBAcHJvcGVydHkge1NldDxzdHJpbmc+fSBbZmxhZ3NdIGEgc2V0IG9mIG1lc3NhZ2UgZmxhZ3NcbiAgICAgKiBAcHJvcGVydHkge1N0cmluZ30gW2ZsYWdDb2xvcl0gZmxhZyBjb2xvciBsaWtlIFwicmVkXCIsIG9yIFwieWVsbG93XCIuIFRoaXMgdmFsdWUgaXMgZGVyaXZlZCBmcm9tIHRoZSBgZmxhZ3NgIFNldCBhbmQgaXQgdXNlcyB0aGUgc2FtZSBjb2xvciBydWxlcyBhcyBBcHBsZSBNYWlsXG4gICAgICogQHByb3BlcnR5IHtNZXNzYWdlRW52ZWxvcGVPYmplY3R9IFtlbnZlbG9wZV0gbWVzc2FnZSBlbnZlbG9wZVxuICAgICAqIEBwcm9wZXJ0eSB7TWVzc2FnZVN0cnVjdHVyZU9iamVjdH0gW2JvZHlTdHJ1Y3R1cmVdIG1lc3NhZ2UgYm9keSBzdHJ1Y3R1cmVcbiAgICAgKiBAcHJvcGVydHkge0RhdGV9IFtpbnRlcm5hbERhdGVdIG1lc3NhZ2UgaW50ZXJuYWwgZGF0ZVxuICAgICAqIEBwcm9wZXJ0eSB7TWFwPHN0cmluZywgQnVmZmVyPn0gW2JvZHlQYXJ0c10gYSBNYXAgb2YgbWVzc2FnZSBib2R5IHBhcnRzIHdoZXJlIGtleSBpcyByZXF1ZXN0ZWQgcGFydCBpZGVudGlmaWVyIGFuZCB2YWx1ZSBpcyBhIEJ1ZmZlclxuICAgICAqIEBwcm9wZXJ0eSB7QnVmZmVyfSBbaGVhZGVyc10gUmVxdWVzdGVkIGhlYWRlciBsaW5lcyBhcyBCdWZmZXJcbiAgICAgKi9cblxuICAgIC8qKlxuICAgICAqIEZldGNoIG1lc3NhZ2VzIGZyb20gdGhlIGN1cnJlbnRseSBvcGVuZWQgbWFpbGJveFxuICAgICAqXG4gICAgICogQHBhcmFtIHtTZXF1ZW5jZVN0cmluZyB8IE51bWJlcltdIHwgU2VhcmNoT2JqZWN0fSByYW5nZSBSYW5nZSBvZiBtZXNzYWdlcyB0byBmZXRjaFxuICAgICAqIEBwYXJhbSB7RmV0Y2hRdWVyeU9iamVjdH0gcXVlcnkgRmV0Y2ggcXVlcnlcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdXG4gICAgICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy51aWRdIElmIGB0cnVlYCB0aGVuIHVzZXMgVUlEIG51bWJlcnMgaW5zdGVhZCBvZiBzZXF1ZW5jZSBudW1iZXJzIGZvciBgcmFuZ2VgXG4gICAgICogQHBhcmFtIHtCaWdJbnR9IFtvcHRpb25zLmNoYW5nZWRTaW5jZV0gSWYgc2V0IHRoZW4gb25seSBtZXNzYWdlcyB3aXRoIGEgaGlnaGVyIG1vZHNlcSB2YWx1ZSBhcmUgcmV0dXJuZWQuIElnbm9yZWQgaWYgc2VydmVyIGRvZXMgbm90IHN1cHBvcnQgYENPTkRTVE9SRWAgZXh0ZW5zaW9uLlxuICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMuYmluYXJ5PWZhbHNlXSBJZiBgdHJ1ZWAgdGhlbiByZXF1ZXN0cyBhIGJpbmFyeSByZXNwb25zZSBpZiB0aGUgc2VydmVyIHN1cHBvcnRzIHRoaXNcbiAgICAgKiBAeWllbGRzIHtQcm9taXNlPEZldGNoTWVzc2FnZU9iamVjdD59IE1lc3NhZ2UgZGF0YSBvYmplY3RcbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogbGV0IG1haWxib3ggPSBhd2FpdCBjbGllbnQubWFpbGJveE9wZW4oJ0lOQk9YJyk7XG4gICAgICogLy8gZmV0Y2ggVUlEIGZvciBhbGwgbWVzc2FnZXMgaW4gYSBtYWlsYm94XG4gICAgICogZm9yIGF3YWl0IChsZXQgbXNnIG9mIGNsaWVudC5mZXRjaCgnMToqJywge3VpZDogdHJ1ZX0pKXtcbiAgICAgKiAgICAgY29uc29sZS5sb2cobXNnLnVpZCk7XG4gICAgICogICAgIC8vIE5CISBZb3UgY2FuIG5vdCBydW4gYW55IElNQVAgY29tbWFuZHMgaW4gdGhpcyBsb29wXG4gICAgICogICAgIC8vIG90aGVyd2lzZSB5b3Ugd2lsbCBlbmQgdXAgaW4gYSBkZWFkbG9vcFxuICAgICAqIH1cbiAgICAgKi9cbiAgICBhc3luYyAqZmV0Y2gocmFuZ2UsIHF1ZXJ5LCBvcHRpb25zKSB7XG4gICAgICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuXG4gICAgICAgIGlmICghdGhpcy5tYWlsYm94KSB7XG4gICAgICAgICAgICAvLyBubyBtYWlsYm94IHNlbGVjdGVkLCBub3RoaW5nIHRvIGRvXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICByYW5nZSA9IGF3YWl0IHRoaXMucmVzb2x2ZVJhbmdlKHJhbmdlLCBvcHRpb25zKTtcbiAgICAgICAgaWYgKCFyYW5nZSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGZpbmlzaGVkID0gZmFsc2U7XG4gICAgICAgIGxldCBwdXNoID0gZmFsc2U7XG4gICAgICAgIGxldCByb3dRdWV1ZSA9IFtdO1xuXG4gICAgICAgIGxldCBnZXROZXh0ID0gKCkgPT5cbiAgICAgICAgICAgIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgICAgICBsZXQgY2hlY2sgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyb3dRdWV1ZS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBlbnRyeSA9IHJvd1F1ZXVlLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZW50cnkuZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlamVjdChlbnRyeS5lcnIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzb2x2ZShlbnRyeS52YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZiAoZmluaXNoZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXNvbHZlKG51bGwpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gd2FpdCB1bnRpbCBkYXRhIGlzIHB1c2hlZCB0byBxdWV1ZSBhbmQgdHJ5IGFnYWluXG4gICAgICAgICAgICAgICAgICAgIHB1c2ggPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwdXNoID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICBjaGVjaygpO1xuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgY2hlY2soKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMucnVuKCdGRVRDSCcsIHJhbmdlLCBxdWVyeSwge1xuICAgICAgICAgICAgdWlkOiAhIW9wdGlvbnMudWlkLFxuICAgICAgICAgICAgYmluYXJ5OiBvcHRpb25zLmJpbmFyeSxcbiAgICAgICAgICAgIGNoYW5nZWRTaW5jZTogb3B0aW9ucy5jaGFuZ2VkU2luY2UsXG4gICAgICAgICAgICBvblVudGFnZ2VkRmV0Y2g6ICh1bnRhZ2dlZCwgbmV4dCkgPT4ge1xuICAgICAgICAgICAgICAgIHJvd1F1ZXVlLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZToge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2U6IHVudGFnZ2VkLFxuICAgICAgICAgICAgICAgICAgICAgICAgbmV4dFxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBwdXNoID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgIHB1c2goKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICAgICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgZmluaXNoZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgcHVzaCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICBwdXNoKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5jYXRjaChlcnIgPT4ge1xuICAgICAgICAgICAgICAgIHJvd1F1ZXVlLnB1c2goeyBlcnIgfSk7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBwdXNoID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgIHB1c2goKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICBsZXQgcmVzO1xuICAgICAgICB3aGlsZSAoKHJlcyA9IGF3YWl0IGdldE5leHQoKSkpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmlzQ2xvc2VkIHx8IHRoaXMuc29ja2V0LmRlc3Ryb3llZCkge1xuICAgICAgICAgICAgICAgIGxldCBlcnJvciA9IG5ldyBFcnJvcignQ29ubmVjdGlvbiBjbG9zZWQnKTtcbiAgICAgICAgICAgICAgICBlcnJvci5jb2RlID0gJ0VDb25uZWN0aW9uQ2xvc2VkJztcbiAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHJlcyAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHlpZWxkIHJlcy5yZXNwb25zZTtcbiAgICAgICAgICAgICAgICByZXMubmV4dCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFmaW5pc2hlZCkge1xuICAgICAgICAgICAgLy8gRkVUQ0ggbmV2ZXIgZmluaXNoZWQhXG4gICAgICAgICAgICBsZXQgZXJyb3IgPSBuZXcgRXJyb3IoJ0ZFVENIIGRpZCBub3QgZmluaXNoJyk7XG4gICAgICAgICAgICBlcnJvci5jb2RlID0gJ0VOb3RGaW5pc2hlZCc7XG4gICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZldGNoIG1lc3NhZ2VzIGZyb20gdGhlIGN1cnJlbnRseSBvcGVuZWQgbWFpbGJveC5cbiAgICAgKlxuICAgICAqIFRoaXMgbWV0aG9kIHdpbGwgZmV0Y2ggYWxsIG1lc3NhZ2VzIGJlZm9yZSByZXNvbHZpbmcgdGhlIHByb21pc2UsIHVubGlrZSAuZmV0Y2goKSwgd2hpY2hcbiAgICAgKiBpcyBhbiBhc3luYyBnZW5lcmF0b3IuIERvIG5vdCB1c2UgbGFyZ2UgcmFuZ2VzIGxpa2UgMToqLCBhcyB0aGlzIG1pZ2h0IGV4aGF1c3QgYWxsIGF2YWlsYWJsZVxuICAgICAqIG1lbW9yeSBpZiB0aGUgbWFpbGJveCBjb250YWlucyBhIGxhcmdlIG51bWJlciBvZiBlbWFpbHMuXG4gICAgICogQHBhcmFtIHtTZXF1ZW5jZVN0cmluZyB8IE51bWJlcltdIHwgU2VhcmNoT2JqZWN0fSByYW5nZSBSYW5nZSBvZiBtZXNzYWdlcyB0byBmZXRjaFxuICAgICAqIEBwYXJhbSB7RmV0Y2hRdWVyeU9iamVjdH0gcXVlcnkgRmV0Y2ggcXVlcnlcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdXG4gICAgICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy51aWRdIElmIGB0cnVlYCB0aGVuIHVzZXMgVUlEIG51bWJlcnMgaW5zdGVhZCBvZiBzZXF1ZW5jZSBudW1iZXJzIGZvciBgcmFuZ2VgXG4gICAgICogQHBhcmFtIHtCaWdJbnR9IFtvcHRpb25zLmNoYW5nZWRTaW5jZV0gSWYgc2V0IHRoZW4gb25seSBtZXNzYWdlcyB3aXRoIGEgaGlnaGVyIG1vZHNlcSB2YWx1ZSBhcmUgcmV0dXJuZWQuIElnbm9yZWQgaWYgc2VydmVyIGRvZXMgbm90IHN1cHBvcnQgYENPTkRTVE9SRWAgZXh0ZW5zaW9uLlxuICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMuYmluYXJ5PWZhbHNlXSBJZiBgdHJ1ZWAgdGhlbiByZXF1ZXN0cyBhIGJpbmFyeSByZXNwb25zZSBpZiB0aGUgc2VydmVyIHN1cHBvcnRzIHRoaXNcbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTxGZXRjaE1lc3NhZ2VPYmplY3RbXT59IEFycmF5IG9mIE1lc3NhZ2UgZGF0YSBvYmplY3RcbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogbGV0IG1haWxib3ggPSBhd2FpdCBjbGllbnQubWFpbGJveE9wZW4oJ0lOQk9YJyk7XG4gICAgICogLy8gZmV0Y2ggVUlEIGZvciBhbGwgbWVzc2FnZXMgaW4gYSBtYWlsYm94XG4gICAgICogY29uc3QgbWVzc2FnZXMgPSBhd2FpdCBjbGllbnQuZmV0Y2hBbGwoJzE6KicsIHt1aWQ6IHRydWV9KTtcbiAgICAgKiBmb3IgKGxldCBtc2cgb2YgbWVzc2FnZXMpe1xuICAgICAqICAgICBjb25zb2xlLmxvZyhtc2cudWlkKTtcbiAgICAgKiB9XG4gICAgICovXG4gICAgYXN5bmMgZmV0Y2hBbGwocmFuZ2UsIHF1ZXJ5LCBvcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdHMgPSBbXTtcbiAgICAgICAgY29uc3QgZ2VuZXJhdG9yID0gdGhpcy5mZXRjaChyYW5nZSwgcXVlcnksIG9wdGlvbnMpO1xuICAgICAgICBmb3IgYXdhaXQgKGNvbnN0IG1lc3NhZ2Ugb2YgZ2VuZXJhdG9yKSB7XG4gICAgICAgICAgICByZXN1bHRzLnB1c2gobWVzc2FnZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdHM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRmV0Y2ggYSBzaW5nbGUgbWVzc2FnZSBmcm9tIHRoZSBjdXJyZW50bHkgb3BlbmVkIG1haWxib3hcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7U2VxdWVuY2VTdHJpbmd9IHNlcSBTaW5nbGUgVUlEIG9yIHNlcXVlbmNlIG51bWJlciBvZiB0aGUgbWVzc2FnZSB0byBmZXRjaCBmb3JcbiAgICAgKiBAcGFyYW0ge0ZldGNoUXVlcnlPYmplY3R9IHF1ZXJ5IEZldGNoIHF1ZXJ5XG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXVxuICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMudWlkXSBJZiBgdHJ1ZWAgdGhlbiB1c2VzIFVJRCBudW1iZXIgaW5zdGVhZCBvZiBzZXF1ZW5jZSBudW1iZXIgZm9yIGBzZXFgXG4gICAgICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5iaW5hcnk9ZmFsc2VdIElmIGB0cnVlYCB0aGVuIHJlcXVlc3RzIGEgYmluYXJ5IHJlc3BvbnNlIGlmIHRoZSBzZXJ2ZXIgc3VwcG9ydHMgdGhpc1xuICAgICAqIEByZXR1cm5zIHtQcm9taXNlPEZldGNoTWVzc2FnZU9iamVjdD59IE1lc3NhZ2UgZGF0YSBvYmplY3RcbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogbGV0IG1haWxib3ggPSBhd2FpdCBjbGllbnQubWFpbGJveE9wZW4oJ0lOQk9YJyk7XG4gICAgICogLy8gZmV0Y2ggVUlEIGZvciB0aGUgbGFzdCBlbWFpbCBpbiB0aGUgc2VsZWN0ZWQgbWFpbGJveFxuICAgICAqIGxldCBsYXN0TXNnID0gYXdhaXQgY2xpZW50LmZldGNoT25lKCcqJywge3VpZDogdHJ1ZX0pXG4gICAgICogY29uc29sZS5sb2cobGFzdE1zZy51aWQpO1xuICAgICAqL1xuICAgIGFzeW5jIGZldGNoT25lKHNlcSwgcXVlcnksIG9wdGlvbnMpIHtcbiAgICAgICAgaWYgKCF0aGlzLm1haWxib3gpIHtcbiAgICAgICAgICAgIC8vIG5vIG1haWxib3ggc2VsZWN0ZWQsIG5vdGhpbmcgdG8gZG9cbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzZXEgPT09ICcqJykge1xuICAgICAgICAgICAgaWYgKCF0aGlzLm1haWxib3guZXhpc3RzKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc2VxID0gdGhpcy5tYWlsYm94LmV4aXN0cy50b1N0cmluZygpO1xuICAgICAgICAgICAgb3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oe30sIG9wdGlvbnMgfHwge30sIHsgdWlkOiBmYWxzZSB9KTsgLy8gZm9yY2UgaW50byBhIHNlcXVlbmNlIHF1ZXJ5XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLnJ1bignRkVUQ0gnLCAoc2VxIHx8ICcnKS50b1N0cmluZygpLCBxdWVyeSwgb3B0aW9ucyk7XG5cbiAgICAgICAgaWYgKCFyZXNwb25zZSB8fCAhcmVzcG9uc2UubGlzdCB8fCAhcmVzcG9uc2UubGlzdC5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXNwb25zZS5saXN0WzBdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEB0eXBlZGVmIHtPYmplY3R9IERvd25sb2FkT2JqZWN0XG4gICAgICogQGdsb2JhbFxuICAgICAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBtZXRhIGNvbnRlbnQgbWV0YWRhdGFcbiAgICAgKiBAcHJvcGVydHkge251bWJlcn0gbWV0YS5leHBlY3RlZFNpemUgVGhlIGZldGNoIHJlc3BvbnNlIHNpemVcbiAgICAgKiBAcHJvcGVydHkge1N0cmluZ30gbWV0YS5jb250ZW50VHlwZSBDb250ZW50LVR5cGUgb2YgdGhlIHN0cmVhbWVkIGZpbGUuIElmIHBhcnQgd2FzIG5vdCBzZXQgdGhlbiB0aGlzIHZhbHVlIGlzIFwibWVzc2FnZS9yZmM4MjJcIlxuICAgICAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBbbWV0YS5jaGFyc2V0XSBDaGFyc2V0IG9mIHRoZSBib2R5IHBhcnQuIFRleHQgcGFydHMgYXJlIGF1dG9tYXRpY2FsbHkgY29udmVydGVkIHRvIFVURi04LCBhdHRhY2htZW50cyBhcmUga2VwdCBhcyBpc1xuICAgICAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBbbWV0YS5kaXNwb3NpdGlvbl0gQ29udGVudC1EaXNwb3NpdGlvbiBvZiB0aGUgc3RyZWFtZWQgZmlsZVxuICAgICAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBbbWV0YS5maWxlbmFtZV0gRmlsZW5hbWUgb2YgdGhlIHN0cmVhbWVkIGJvZHkgcGFydFxuICAgICAqIEBwcm9wZXJ0eSB7UmVhZGFibGVTdHJlYW19IGNvbnRlbnQgU3RyZWFtZWQgY29udGVudFxuICAgICAqL1xuXG4gICAgLyoqXG4gICAgICogRG93bmxvYWQgZWl0aGVyIGZ1bGwgcmZjODIyIGZvcm1hdHRlZCBtZXNzYWdlIG9yIGEgc3BlY2lmaWMgYm9keXN0cnVjdHVyZSBwYXJ0IGFzIGEgU3RyZWFtLlxuICAgICAqIEJvZHlzdHJ1Y3R1cmUgcGFydHMgYXJlIGRlY29kZWQgc28gdGhlIHJlc3VsdGluZyBzdHJlYW0gaXMgYSBiaW5hcnkgZmlsZS4gVGV4dCBjb250ZW50XG4gICAgICogaXMgYXV0b21hdGljYWxseSBjb252ZXJ0ZWQgdG8gVVRGLTggY2hhcnNldC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7U2VxdWVuY2VTdHJpbmd9IHJhbmdlIFVJRCBvciBzZXF1ZW5jZSBudW1iZXIgZm9yIHRoZSBtZXNzYWdlIHRvIGZldGNoXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IFtwYXJ0XSBJZiBub3Qgc2V0IHRoZW4gZG93bmxvYWRzIGVudGlyZSByZmM4MjIgZm9ybWF0dGVkIG1lc3NhZ2UsIG90aGVyd2lzZSBkb3dubG9hZHMgc3BlY2lmaWMgYm9keXN0cnVjdHVyZSBwYXJ0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXVxuICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMudWlkXSBJZiBgdHJ1ZWAgdGhlbiB1c2VzIFVJRCBudW1iZXIgaW5zdGVhZCBvZiBzZXF1ZW5jZSBudW1iZXIgZm9yIGByYW5nZWBcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW29wdGlvbnMubWF4Qnl0ZXNdIElmIHNldCB0aGVuIGxpbWl0cyBkb3dubG9hZCBzaXplIHRvIHNwZWNpZmllZCBieXRlc1xuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0aW9ucy5jaHVua1NpemU9NjU1MzZdIEhvdyBsYXJnZSBjb250ZW50IHBhcnRzIHRvIGFzayBmcm9tIHRoZSBzZXJ2ZXJcbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTxEb3dubG9hZE9iamVjdD59IERvd25sb2FkIGRhdGEgb2JqZWN0XG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGxldCBtYWlsYm94ID0gYXdhaXQgY2xpZW50Lm1haWxib3hPcGVuKCdJTkJPWCcpO1xuICAgICAqIC8vIGRvd25sb2FkIGJvZHkgcGFydCBuciAnMS4yJyBmcm9tIGxhdGVzdCBtZXNzYWdlXG4gICAgICogbGV0IHttZXRhLCBjb250ZW50fSA9IGF3YWl0IGNsaWVudC5kb3dubG9hZCgnKicsICcxLjInKTtcbiAgICAgKiBjb250ZW50LnBpcGUoZnMuY3JlYXRlV3JpdGVTdHJlYW0obWV0YS5maWxlbmFtZSkpO1xuICAgICAqL1xuICAgIGFzeW5jIGRvd25sb2FkKHJhbmdlLCBwYXJ0LCBvcHRpb25zKSB7XG4gICAgICAgIGlmICghdGhpcy5tYWlsYm94KSB7XG4gICAgICAgICAgICAvLyBubyBtYWlsYm94IHNlbGVjdGVkLCBub3RoaW5nIHRvIGRvXG4gICAgICAgICAgICByZXR1cm4ge307XG4gICAgICAgIH1cblxuICAgICAgICBvcHRpb25zID0gT2JqZWN0LmFzc2lnbihcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBjaHVua1NpemU6IDY0ICogMTAyNCxcbiAgICAgICAgICAgICAgICBtYXhCeXRlczogSW5maW5pdHlcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBvcHRpb25zIHx8IHt9XG4gICAgICAgICk7XG5cbiAgICAgICAgbGV0IGhhc01vcmUgPSB0cnVlO1xuICAgICAgICBsZXQgcHJvY2Vzc2VkID0gMDtcblxuICAgICAgICBsZXQgY2h1bmtTaXplID0gTnVtYmVyKG9wdGlvbnMuY2h1bmtTaXplKSB8fCA2NCAqIDEwMjQ7XG4gICAgICAgIGxldCBtYXhCeXRlcyA9IE51bWJlcihvcHRpb25zLm1heEJ5dGVzKSB8fCBJbmZpbml0eTtcblxuICAgICAgICBsZXQgdWlkID0gZmFsc2U7XG5cbiAgICAgICAgaWYgKHBhcnQgPT09ICcxJykge1xuICAgICAgICAgICAgLy8gRmlyc3QgcGFydCBoYXMgc3BlY2lhbCBjb25kaXRpb25zIGZvciBzaW5nbGUgbm9kZSBlbWFpbHMgYXNcbiAgICAgICAgICAgIC8vIHRoZSBtaW1lIHBhcnRzIGZvciByb290IG5vZGUgYXJlIG5vdCAxIGFuZCAxLk1JTUUgYnV0IFRFWFQgYW5kIEhFQURFUlNcbiAgICAgICAgICAgIGxldCByZXNwb25zZSA9IGF3YWl0IHRoaXMuZmV0Y2hPbmUocmFuZ2UsIHsgdWlkOiB0cnVlLCBib2R5U3RydWN0dXJlOiB0cnVlIH0sIG9wdGlvbnMpO1xuXG4gICAgICAgICAgICBpZiAoIXJlc3BvbnNlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgcmVzcG9uc2U6IGZhbHNlLCBjaHVuazogZmFsc2UgfTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKCF1aWQgJiYgcmVzcG9uc2UudWlkKSB7XG4gICAgICAgICAgICAgICAgdWlkID0gcmVzcG9uc2UudWlkO1xuICAgICAgICAgICAgICAgIC8vIGZvcmNlIFVJRCBmcm9tIG5vdyBvbiBldmVuIGlmIGZpcnN0IHJhbmdlIHdhcyBhIHNlcXVlbmNlIG51bWJlclxuICAgICAgICAgICAgICAgIHJhbmdlID0gdWlkO1xuICAgICAgICAgICAgICAgIG9wdGlvbnMudWlkID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKCFyZXNwb25zZS5ib2R5U3RydWN0dXJlLmNoaWxkTm9kZXMpIHtcbiAgICAgICAgICAgICAgICAvLyBzaW5nbGUgdGV4dCBtZXNzYWdlXG4gICAgICAgICAgICAgICAgcGFydCA9ICdURVhUJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBnZXROZXh0UGFydCA9IGFzeW5jIHF1ZXJ5ID0+IHtcbiAgICAgICAgICAgIHF1ZXJ5ID0gcXVlcnkgfHwge307XG5cbiAgICAgICAgICAgIGxldCBtaW1lS2V5O1xuXG4gICAgICAgICAgICBpZiAoIXBhcnQpIHtcbiAgICAgICAgICAgICAgICBxdWVyeS5zb3VyY2UgPSB7XG4gICAgICAgICAgICAgICAgICAgIHN0YXJ0OiBwcm9jZXNzZWQsXG4gICAgICAgICAgICAgICAgICAgIG1heExlbmd0aDogY2h1bmtTaXplXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcGFydCA9IHBhcnQudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpLnRyaW0oKTtcblxuICAgICAgICAgICAgICAgIGlmICghcXVlcnkuYm9keVBhcnRzKSB7XG4gICAgICAgICAgICAgICAgICAgIHF1ZXJ5LmJvZHlQYXJ0cyA9IFtdO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChxdWVyeS5zaXplKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICgvXltcXGQuXSskLy50ZXN0KHBhcnQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBmZXRjaCBtZXRhIGFzIHdlbGxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1pbWVLZXkgPSBwYXJ0ICsgJy5taW1lJztcbiAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5LmJvZHlQYXJ0cy5wdXNoKG1pbWVLZXkpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBhcnQgPT09ICd0ZXh0Jykge1xuICAgICAgICAgICAgICAgICAgICAgICAgbWltZUtleSA9ICdoZWFkZXInO1xuICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnkuYm9keVBhcnRzLnB1c2gobWltZUtleSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBxdWVyeS5ib2R5UGFydHMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgIGtleTogcGFydCxcbiAgICAgICAgICAgICAgICAgICAgc3RhcnQ6IHByb2Nlc3NlZCxcbiAgICAgICAgICAgICAgICAgICAgbWF4TGVuZ3RoOiBjaHVua1NpemVcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbGV0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5mZXRjaE9uZShyYW5nZSwgcXVlcnksIG9wdGlvbnMpO1xuXG4gICAgICAgICAgICBpZiAoIXJlc3BvbnNlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgcmVzcG9uc2U6IGZhbHNlLCBjaHVuazogZmFsc2UgfTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKCF1aWQgJiYgcmVzcG9uc2UudWlkKSB7XG4gICAgICAgICAgICAgICAgdWlkID0gcmVzcG9uc2UudWlkO1xuICAgICAgICAgICAgICAgIC8vIGZvcmNlIFVJRCBmcm9tIG5vdyBvbiBldmVuIGlmIGZpcnN0IHJhbmdlIHdhcyBhIHNlcXVlbmNlIG51bWJlclxuICAgICAgICAgICAgICAgIHJhbmdlID0gdWlkO1xuICAgICAgICAgICAgICAgIG9wdGlvbnMudWlkID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbGV0IGNodW5rID0gIXBhcnQgPyByZXNwb25zZS5zb3VyY2UgOiByZXNwb25zZS5ib2R5UGFydHMgJiYgcmVzcG9uc2UuYm9keVBhcnRzLmdldChwYXJ0KTtcbiAgICAgICAgICAgIGlmICghY2h1bmspIHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge307XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHByb2Nlc3NlZCArPSBjaHVuay5sZW5ndGg7XG4gICAgICAgICAgICBoYXNNb3JlID0gY2h1bmsubGVuZ3RoID49IGNodW5rU2l6ZTtcblxuICAgICAgICAgICAgbGV0IHJlc3VsdCA9IHsgY2h1bmsgfTtcbiAgICAgICAgICAgIGlmIChxdWVyeS5zaXplKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LnJlc3BvbnNlID0gcmVzcG9uc2U7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChxdWVyeS5ib2R5UGFydHMpIHtcbiAgICAgICAgICAgICAgICBpZiAobWltZUtleSA9PT0gJ2hlYWRlcicpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0Lm1pbWUgPSByZXNwb25zZS5oZWFkZXJzO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5taW1lID0gcmVzcG9uc2UuYm9keVBhcnRzLmdldChtaW1lS2V5KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH07XG5cbiAgICAgICAgbGV0IHsgcmVzcG9uc2UsIGNodW5rLCBtaW1lIH0gPSBhd2FpdCBnZXROZXh0UGFydCh7XG4gICAgICAgICAgICBzaXplOiB0cnVlLFxuICAgICAgICAgICAgdWlkOiB0cnVlXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmICghcmVzcG9uc2UgfHwgIWNodW5rKSB7XG4gICAgICAgICAgICAvLyA/Pz9cbiAgICAgICAgICAgIHJldHVybiB7fTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBtZXRhID0ge1xuICAgICAgICAgICAgZXhwZWN0ZWRTaXplOiByZXNwb25zZS5zaXplXG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKCFwYXJ0KSB7XG4gICAgICAgICAgICBtZXRhLmNvbnRlbnRUeXBlID0gJ21lc3NhZ2UvcmZjODIyJztcbiAgICAgICAgfSBlbHNlIGlmIChtaW1lKSB7XG4gICAgICAgICAgICBsZXQgaGVhZGVycyA9IG5ldyBIZWFkZXJzKG1pbWUpO1xuICAgICAgICAgICAgbGV0IGNvbnRlbnRUeXBlID0gbGlibWltZS5wYXJzZUhlYWRlclZhbHVlKGhlYWRlcnMuZ2V0Rmlyc3QoJ0NvbnRlbnQtVHlwZScpKTtcbiAgICAgICAgICAgIGxldCB0cmFuc2ZlckVuY29kaW5nID0gbGlibWltZS5wYXJzZUhlYWRlclZhbHVlKGhlYWRlcnMuZ2V0Rmlyc3QoJ0NvbnRlbnQtVHJhbnNmZXItRW5jb2RpbmcnKSk7XG4gICAgICAgICAgICBsZXQgZGlzcG9zaXRpb24gPSBsaWJtaW1lLnBhcnNlSGVhZGVyVmFsdWUoaGVhZGVycy5nZXRGaXJzdCgnQ29udGVudC1EaXNwb3NpdGlvbicpKTtcblxuICAgICAgICAgICAgaWYgKGNvbnRlbnRUeXBlLnZhbHVlLnRvTG93ZXJDYXNlKCkudHJpbSgpKSB7XG4gICAgICAgICAgICAgICAgbWV0YS5jb250ZW50VHlwZSA9IGNvbnRlbnRUeXBlLnZhbHVlLnRvTG93ZXJDYXNlKCkudHJpbSgpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoY29udGVudFR5cGUucGFyYW1zLmNoYXJzZXQpIHtcbiAgICAgICAgICAgICAgICBtZXRhLmNoYXJzZXQgPSBjb250ZW50VHlwZS5wYXJhbXMuY2hhcnNldC50b0xvd2VyQ2FzZSgpLnRyaW0oKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHRyYW5zZmVyRW5jb2RpbmcudmFsdWUpIHtcbiAgICAgICAgICAgICAgICBtZXRhLmVuY29kaW5nID0gdHJhbnNmZXJFbmNvZGluZy52YWx1ZVxuICAgICAgICAgICAgICAgICAgICAucmVwbGFjZSgvXFwoLipcXCkvZywgJycpXG4gICAgICAgICAgICAgICAgICAgIC50b0xvd2VyQ2FzZSgpXG4gICAgICAgICAgICAgICAgICAgIC50cmltKCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChkaXNwb3NpdGlvbi52YWx1ZSkge1xuICAgICAgICAgICAgICAgIG1ldGEuZGlzcG9zaXRpb24gPSBkaXNwb3NpdGlvbi52YWx1ZS50b0xvd2VyQ2FzZSgpLnRyaW0oKSB8fCBmYWxzZTtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBtZXRhLmRpc3Bvc2l0aW9uID0gbGlibWltZS5kZWNvZGVXb3JkcyhtZXRhLmRpc3Bvc2l0aW9uKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gZmFpbGVkIHRvIHBhcnNlIGRpc3Bvc2l0aW9uLCBrZWVwIGFzIGlzIChtb3N0IHByb2JhYmx5IGFuIHVua25vd24gY2hhcnNldCBpcyB1c2VkKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGNvbnRlbnRUeXBlLnBhcmFtcy5mb3JtYXQgJiYgY29udGVudFR5cGUucGFyYW1zLmZvcm1hdC50b0xvd2VyQ2FzZSgpLnRyaW0oKSA9PT0gJ2Zsb3dlZCcpIHtcbiAgICAgICAgICAgICAgICBtZXRhLmZsb3dlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgaWYgKGNvbnRlbnRUeXBlLnBhcmFtcy5kZWxzcCAmJiBjb250ZW50VHlwZS5wYXJhbXMuZGVsc3AudG9Mb3dlckNhc2UoKS50cmltKCkgPT09ICd5ZXMnKSB7XG4gICAgICAgICAgICAgICAgICAgIG1ldGEuZGVsU3AgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbGV0IGZpbGVuYW1lID0gZGlzcG9zaXRpb24ucGFyYW1zLmZpbGVuYW1lIHx8IGNvbnRlbnRUeXBlLnBhcmFtcy5uYW1lIHx8IGZhbHNlO1xuICAgICAgICAgICAgaWYgKGZpbGVuYW1lKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWUgPSBsaWJtaW1lLmRlY29kZVdvcmRzKGZpbGVuYW1lKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gZmFpbGVkIHRvIHBhcnNlIGZpbGVuYW1lLCBrZWVwIGFzIGlzIChtb3N0IHByb2JhYmx5IGFuIHVua25vd24gY2hhcnNldCBpcyB1c2VkKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBtZXRhLmZpbGVuYW1lID0gZmlsZW5hbWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgc3RyZWFtO1xuICAgICAgICBsZXQgb3V0cHV0O1xuXG4gICAgICAgIHN3aXRjaCAobWV0YS5lbmNvZGluZykge1xuICAgICAgICAgICAgY2FzZSAnYmFzZTY0JzpcbiAgICAgICAgICAgICAgICBvdXRwdXQgPSBzdHJlYW0gPSBuZXcgbGliYmFzZTY0LkRlY29kZXIoKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ3F1b3RlZC1wcmludGFibGUnOlxuICAgICAgICAgICAgICAgIG91dHB1dCA9IHN0cmVhbSA9IG5ldyBsaWJxcC5EZWNvZGVyKCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIG91dHB1dCA9IHN0cmVhbSA9IG5ldyBQYXNzVGhyb3VnaCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGlzVGV4dE5vZGUgPSBbJ3RleHQvaHRtbCcsICd0ZXh0L3BsYWluJywgJ3RleHQveC1hbXAtaHRtbCddLmluY2x1ZGVzKG1ldGEuY29udGVudFR5cGUpIHx8IChwYXJ0ID09PSAnMScgJiYgIW1ldGEuY29udGVudFR5cGUpO1xuICAgICAgICBpZiAoKCFtZXRhLmRpc3Bvc2l0aW9uIHx8IG1ldGEuZGlzcG9zaXRpb24gPT09ICdpbmxpbmUnKSAmJiBpc1RleHROb2RlKSB7XG4gICAgICAgICAgICAvLyBmbG93ZWQgdGV4dFxuICAgICAgICAgICAgaWYgKG1ldGEuZmxvd2VkKSB7XG4gICAgICAgICAgICAgICAgbGV0IGZsb3dEZWNvZGVyID0gbmV3IEZsb3dlZERlY29kZXIoe1xuICAgICAgICAgICAgICAgICAgICBkZWxTcDogbWV0YS5kZWxTcFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIG91dHB1dC5vbignZXJyb3InLCBlcnIgPT4ge1xuICAgICAgICAgICAgICAgICAgICBmbG93RGVjb2Rlci5lbWl0KCdlcnJvcicsIGVycik7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgb3V0cHV0ID0gb3V0cHV0LnBpcGUoZmxvd0RlY29kZXIpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBub3QgdXRmLTggdGV4dFxuICAgICAgICAgICAgaWYgKG1ldGEuY2hhcnNldCAmJiAhWydhc2NpaScsICd1c2FzY2lpJywgJ3V0ZjgnXS5pbmNsdWRlcyhtZXRhLmNoYXJzZXQudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9bXmEtejAtOV0rL2csICcnKSkpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgZGVjb2RlciA9IGdldERlY29kZXIobWV0YS5jaGFyc2V0KTtcbiAgICAgICAgICAgICAgICAgICAgb3V0cHV0Lm9uKCdlcnJvcicsIGVyciA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVyLmVtaXQoJ2Vycm9yJywgZXJyKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIG91dHB1dCA9IG91dHB1dC5waXBlKGRlY29kZXIpO1xuICAgICAgICAgICAgICAgICAgICAvLyBmb3JjZSB0byB1dGYtOCBmb3Igb3V0cHV0XG4gICAgICAgICAgICAgICAgICAgIG1ldGEuY2hhcnNldCA9ICd1dGYtOCc7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoRSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBkbyBub3QgZGVjb2RlIGNoYXJzZXRcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbGltaXRlciA9IG5ldyBMaW1pdGVkUGFzc3Rocm91Z2goeyBtYXhCeXRlcyB9KTtcbiAgICAgICAgb3V0cHV0Lm9uKCdlcnJvcicsIGVyciA9PiB7XG4gICAgICAgICAgICBsaW1pdGVyLmVtaXQoJ2Vycm9yJywgZXJyKTtcbiAgICAgICAgfSk7XG4gICAgICAgIG91dHB1dCA9IG91dHB1dC5waXBlKGxpbWl0ZXIpO1xuXG4gICAgICAgIGxldCB3cml0ZUNodW5rID0gY2h1bmsgPT4ge1xuICAgICAgICAgICAgaWYgKGxpbWl0ZXIubGltaXRlZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHN0cmVhbS53cml0ZShjaHVuayk7XG4gICAgICAgIH07XG5cbiAgICAgICAgbGV0IGZldGNoQWxsUGFydHMgPSBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICB3aGlsZSAoaGFzTW9yZSAmJiAhbGltaXRlci5saW1pdGVkKSB7XG4gICAgICAgICAgICAgICAgbGV0IHsgY2h1bmsgfSA9IGF3YWl0IGdldE5leHRQYXJ0KCk7XG4gICAgICAgICAgICAgICAgaWYgKCFjaHVuaykge1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAod3JpdGVDaHVuayhjaHVuaykgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKHJlc29sdmUgPT4gc3RyZWFtLm9uY2UoJ2RyYWluJywgcmVzb2x2ZSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICBzZXRJbW1lZGlhdGUoKCkgPT4ge1xuICAgICAgICAgICAgd3JpdGVDaHVuayhjaHVuayk7XG4gICAgICAgICAgICBmZXRjaEFsbFBhcnRzKClcbiAgICAgICAgICAgICAgICAuY2F0Y2goZXJyID0+IHN0cmVhbS5lbWl0KCdlcnJvcicsIGVycikpXG4gICAgICAgICAgICAgICAgLmZpbmFsbHkoKCkgPT4gc3RyZWFtLmVuZCgpKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG1ldGEsXG4gICAgICAgICAgICBjb250ZW50OiBvdXRwdXRcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGZXRjaCBtdWx0aXBsZSBhdHRhY2htZW50cyBhcyBCdWZmZXIgdmFsdWVzXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1NlcXVlbmNlU3RyaW5nfSByYW5nZSBVSUQgb3Igc2VxdWVuY2UgbnVtYmVyIGZvciB0aGUgbWVzc2FnZSB0byBmZXRjaFxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBwYXJ0cyBBIGxpc3Qgb2YgYm9keXN0cnVjdHVyZSBwYXJ0c1xuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc11cbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLnVpZF0gSWYgYHRydWVgIHRoZW4gdXNlcyBVSUQgbnVtYmVyIGluc3RlYWQgb2Ygc2VxdWVuY2UgbnVtYmVyIGZvciBgcmFuZ2VgXG4gICAgICogQHJldHVybnMge1Byb21pc2U8T2JqZWN0Pn0gRG93bmxvYWQgZGF0YSBvYmplY3RcbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogbGV0IG1haWxib3ggPSBhd2FpdCBjbGllbnQubWFpbGJveE9wZW4oJ0lOQk9YJyk7XG4gICAgICogLy8gZG93bmxvYWQgYm9keSBwYXJ0cyAnMicsIGFuZCAnMycgZnJvbSBhbGwgbWVzc2FnZXMgaW4gdGhlIHNlbGVjdGVkIG1haWxib3hcbiAgICAgKiBsZXQgcmVzcG9uc2UgPSBhd2FpdCBjbGllbnQuZG93bmxvYWRNYW55KCcqJywgWycyJywgJzMnXSk7XG4gICAgICogcHJvY2Vzcy5zdGRvdXQud3JpdGUocmVzcG9uc2VbMl0uY29udGVudClcbiAgICAgKiBwcm9jZXNzLnN0ZG91dC53cml0ZShyZXNwb25zZVszXS5jb250ZW50KVxuICAgICAqL1xuICAgIGFzeW5jIGRvd25sb2FkTWFueShyYW5nZSwgcGFydHMsIG9wdGlvbnMpIHtcbiAgICAgICAgaWYgKCF0aGlzLm1haWxib3gpIHtcbiAgICAgICAgICAgIC8vIG5vIG1haWxib3ggc2VsZWN0ZWQsIG5vdGhpbmcgdG8gZG9cbiAgICAgICAgICAgIHJldHVybiB7fTtcbiAgICAgICAgfVxuXG4gICAgICAgIG9wdGlvbnMgPSBPYmplY3QuYXNzaWduKFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGNodW5rU2l6ZTogNjQgKiAxMDI0LFxuICAgICAgICAgICAgICAgIG1heEJ5dGVzOiBJbmZpbml0eVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG9wdGlvbnMgfHwge31cbiAgICAgICAgKTtcblxuICAgICAgICBsZXQgcXVlcnkgPSB7IGJvZHlQYXJ0czogW10gfTtcblxuICAgICAgICBmb3IgKGxldCBwYXJ0IG9mIHBhcnRzKSB7XG4gICAgICAgICAgICBxdWVyeS5ib2R5UGFydHMucHVzaChwYXJ0ICsgJy5taW1lJyk7XG4gICAgICAgICAgICBxdWVyeS5ib2R5UGFydHMucHVzaChwYXJ0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCByZXNwb25zZSA9IGF3YWl0IHRoaXMuZmV0Y2hPbmUocmFuZ2UsIHF1ZXJ5LCBvcHRpb25zKTtcblxuICAgICAgICBpZiAoIXJlc3BvbnNlIHx8ICFyZXNwb25zZS5ib2R5UGFydHMpIHtcbiAgICAgICAgICAgIHJldHVybiB7IHJlc3BvbnNlOiBmYWxzZSB9O1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGRhdGEgPSB7fTtcblxuICAgICAgICBmb3IgKGxldCBbcGFydCwgY29udGVudF0gb2YgcmVzcG9uc2UuYm9keVBhcnRzKSB7XG4gICAgICAgICAgICBsZXQga2V5UGFydHMgPSBwYXJ0LnNwbGl0KCcubWltZScpO1xuICAgICAgICAgICAgaWYgKGtleVBhcnRzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgICAgIC8vIGNvbnRlbnRcbiAgICAgICAgICAgICAgICBsZXQga2V5ID0ga2V5UGFydHNbMF07XG4gICAgICAgICAgICAgICAgaWYgKCFkYXRhW2tleV0pIHtcbiAgICAgICAgICAgICAgICAgICAgZGF0YVtrZXldID0geyBjb250ZW50IH07XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgZGF0YVtrZXldLmNvbnRlbnQgPSBjb250ZW50O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoa2V5UGFydHMubGVuZ3RoID09PSAyKSB7XG4gICAgICAgICAgICAgICAgLy8gaGVhZGVyXG4gICAgICAgICAgICAgICAgbGV0IGtleSA9IGtleVBhcnRzWzBdO1xuICAgICAgICAgICAgICAgIGlmICghZGF0YVtrZXldKSB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGFba2V5XSA9IHt9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIWRhdGFba2V5XS5tZXRhKSB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGFba2V5XS5tZXRhID0ge307XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgbGV0IGhlYWRlcnMgPSBuZXcgSGVhZGVycyhjb250ZW50KTtcbiAgICAgICAgICAgICAgICBsZXQgY29udGVudFR5cGUgPSBsaWJtaW1lLnBhcnNlSGVhZGVyVmFsdWUoaGVhZGVycy5nZXRGaXJzdCgnQ29udGVudC1UeXBlJykpO1xuICAgICAgICAgICAgICAgIGxldCB0cmFuc2ZlckVuY29kaW5nID0gbGlibWltZS5wYXJzZUhlYWRlclZhbHVlKGhlYWRlcnMuZ2V0Rmlyc3QoJ0NvbnRlbnQtVHJhbnNmZXItRW5jb2RpbmcnKSk7XG4gICAgICAgICAgICAgICAgbGV0IGRpc3Bvc2l0aW9uID0gbGlibWltZS5wYXJzZUhlYWRlclZhbHVlKGhlYWRlcnMuZ2V0Rmlyc3QoJ0NvbnRlbnQtRGlzcG9zaXRpb24nKSk7XG5cbiAgICAgICAgICAgICAgICBpZiAoY29udGVudFR5cGUudmFsdWUudG9Mb3dlckNhc2UoKS50cmltKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgZGF0YVtrZXldLm1ldGEuY29udGVudFR5cGUgPSBjb250ZW50VHlwZS52YWx1ZS50b0xvd2VyQ2FzZSgpLnRyaW0oKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoY29udGVudFR5cGUucGFyYW1zLmNoYXJzZXQpIHtcbiAgICAgICAgICAgICAgICAgICAgZGF0YVtrZXldLm1ldGEuY2hhcnNldCA9IGNvbnRlbnRUeXBlLnBhcmFtcy5jaGFyc2V0LnRvTG93ZXJDYXNlKCkudHJpbSgpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmICh0cmFuc2ZlckVuY29kaW5nLnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGFba2V5XS5tZXRhLmVuY29kaW5nID0gdHJhbnNmZXJFbmNvZGluZy52YWx1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoL1xcKC4qXFwpL2csICcnKVxuICAgICAgICAgICAgICAgICAgICAgICAgLnRvTG93ZXJDYXNlKClcbiAgICAgICAgICAgICAgICAgICAgICAgIC50cmltKCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKGRpc3Bvc2l0aW9uLnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGFba2V5XS5tZXRhLmRpc3Bvc2l0aW9uID0gZGlzcG9zaXRpb24udmFsdWUudG9Mb3dlckNhc2UoKS50cmltKCkgfHwgZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhW2tleV0ubWV0YS5kaXNwb3NpdGlvbiA9IGxpYm1pbWUuZGVjb2RlV29yZHMoZGF0YVtrZXldLm1ldGEuZGlzcG9zaXRpb24pO1xuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZhaWxlZCB0byBwYXJzZSBkaXNwb3NpdGlvbiwga2VlcCBhcyBpcyAobW9zdCBwcm9iYWJseSBhbiB1bmtub3duIGNoYXJzZXQgaXMgdXNlZClcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChjb250ZW50VHlwZS5wYXJhbXMuZm9ybWF0ICYmIGNvbnRlbnRUeXBlLnBhcmFtcy5mb3JtYXQudG9Mb3dlckNhc2UoKS50cmltKCkgPT09ICdmbG93ZWQnKSB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGFba2V5XS5tZXRhLmZsb3dlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjb250ZW50VHlwZS5wYXJhbXMuZGVsc3AgJiYgY29udGVudFR5cGUucGFyYW1zLmRlbHNwLnRvTG93ZXJDYXNlKCkudHJpbSgpID09PSAneWVzJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVtrZXldLm1ldGEuZGVsU3AgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgbGV0IGZpbGVuYW1lID0gZGlzcG9zaXRpb24ucGFyYW1zLmZpbGVuYW1lIHx8IGNvbnRlbnRUeXBlLnBhcmFtcy5uYW1lIHx8IGZhbHNlO1xuICAgICAgICAgICAgICAgIGlmIChmaWxlbmFtZSkge1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWUgPSBsaWJtaW1lLmRlY29kZVdvcmRzKGZpbGVuYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBmYWlsZWQgdG8gcGFyc2UgZmlsZW5hbWUsIGtlZXAgYXMgaXMgKG1vc3QgcHJvYmFibHkgYW4gdW5rbm93biBjaGFyc2V0IGlzIHVzZWQpXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZGF0YVtrZXldLm1ldGEuZmlsZW5hbWUgPSBmaWxlbmFtZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGxldCBwYXJ0IG9mIE9iamVjdC5rZXlzKGRhdGEpKSB7XG4gICAgICAgICAgICBsZXQgbWV0YSA9IGRhdGFbcGFydF0ubWV0YTtcblxuICAgICAgICAgICAgc3dpdGNoIChtZXRhLmVuY29kaW5nKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAnYmFzZTY0JzpcbiAgICAgICAgICAgICAgICAgICAgZGF0YVtwYXJ0XS5jb250ZW50ID0gZGF0YVtwYXJ0XS5jb250ZW50ID8gbGliYmFzZTY0LmRlY29kZShkYXRhW3BhcnRdLmNvbnRlbnQudG9TdHJpbmcoKSkgOiBudWxsO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICdxdW90ZWQtcHJpbnRhYmxlJzpcbiAgICAgICAgICAgICAgICAgICAgZGF0YVtwYXJ0XS5jb250ZW50ID0gZGF0YVtwYXJ0XS5jb250ZW50ID8gbGlicXAuZGVjb2RlKGRhdGFbcGFydF0uY29udGVudC50b1N0cmluZygpKSA6IG51bGw7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgLy8ga2VlcCBhcyBpcywgYWxyZWFkeSBhIGJ1ZmZlclxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfVxuXG4gICAgYXN5bmMgcnVuKGNvbW1hbmQsIC4uLmFyZ3MpIHtcbiAgICAgICAgY29tbWFuZCA9IGNvbW1hbmQudG9VcHBlckNhc2UoKTtcbiAgICAgICAgaWYgKCF0aGlzLmNvbW1hbmRzLmhhcyhjb21tYW5kKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuc29ja2V0LmRlc3Ryb3llZCkge1xuICAgICAgICAgICAgY29uc3QgZXJyb3IgPSBuZXcgRXJyb3IoJ0Nvbm5lY3Rpb24gbm90IGF2YWlsYWJsZScpO1xuICAgICAgICAgICAgZXJyb3IuY29kZSA9ICdOb0Nvbm5lY3Rpb24nO1xuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cblxuICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5pZGxlU3RhcnRUaW1lcik7XG5cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnByZUNoZWNrID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLnByZUNoZWNrKCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgaGFuZGxlciA9IHRoaXMuY29tbWFuZHMuZ2V0KGNvbW1hbmQpO1xuXG4gICAgICAgIGxldCByZXN1bHQgPSBhd2FpdCBoYW5kbGVyKHRoaXMsIC4uLmFyZ3MpO1xuXG4gICAgICAgIGlmIChjb21tYW5kICE9PSAnSURMRScpIHtcbiAgICAgICAgICAgIC8vIGRvIG5vdCBhdXRvc3RhcnQgSURMRSwgaWYgSURMRSBpdHNlbGYgd2FzIHN0b3BwZWRcbiAgICAgICAgICAgIHRoaXMuYXV0b2lkbGUoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgYXN5bmMgcHJvY2Vzc0xvY2tzKGZvcmNlKSB7XG4gICAgICAgIGlmICghZm9yY2UgJiYgdGhpcy5wcm9jZXNzaW5nTG9jaykge1xuICAgICAgICAgICAgdGhpcy5sb2cudHJhY2Uoe1xuICAgICAgICAgICAgICAgIG1zZzogJ01haWxib3ggbG9ja2luZyBxdWV1ZWQnLFxuICAgICAgICAgICAgICAgIHBhdGg6IHRoaXMubWFpbGJveCAmJiB0aGlzLm1haWxib3gucGF0aCxcbiAgICAgICAgICAgICAgICBwZW5kaW5nOiB0aGlzLmxvY2tzLmxlbmd0aCxcbiAgICAgICAgICAgICAgICBpZGxpbmc6IHRoaXMuaWRsaW5nLFxuICAgICAgICAgICAgICAgIGFjdGl2ZUxvY2s6IHRoaXMuY3VycmVudExvY2tcbiAgICAgICAgICAgICAgICAgICAgPyB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2tJZDogdGhpcy5jdXJyZW50TG9jay5sb2NrSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC4uLih0aGlzLmN1cnJlbnRMb2NrLm9wdGlvbnM/LmRlc2NyaXB0aW9uICYmIHsgZGVzY3JpcHRpb246IHRoaXMuY3VycmVudExvY2sub3B0aW9ucz8uZGVzY3JpcHRpb24gfSlcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIDogbnVsbFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMubG9ja3MubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLnByb2Nlc3NpbmdMb2NrID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLmxvZy50cmFjZSh7XG4gICAgICAgICAgICAgICAgbXNnOiAnTWFpbGJveCBsb2NraW5nIHF1ZXVlIHByb2Nlc3NlZCcsXG4gICAgICAgICAgICAgICAgaWRsaW5nOiB0aGlzLmlkbGluZ1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnByb2Nlc3NpbmdMb2NrID0gdHJ1ZTtcblxuICAgICAgICBjb25zdCByZWxlYXNlID0gKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMuY3VycmVudExvY2spIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxvZy50cmFjZSh7XG4gICAgICAgICAgICAgICAgICAgIG1zZzogJ01haWxib3ggbG9jayByZWxlYXNlZCcsXG4gICAgICAgICAgICAgICAgICAgIGxvY2tJZDogdGhpcy5jdXJyZW50TG9jay5sb2NrSWQsXG4gICAgICAgICAgICAgICAgICAgIHBhdGg6IHRoaXMubWFpbGJveCAmJiB0aGlzLm1haWxib3gucGF0aCxcbiAgICAgICAgICAgICAgICAgICAgcGVuZGluZzogdGhpcy5sb2Nrcy5sZW5ndGgsXG4gICAgICAgICAgICAgICAgICAgIGlkbGluZzogdGhpcy5pZGxpbmdcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRMb2NrID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnByb2Nlc3NMb2Nrcyh0cnVlKS5jYXRjaChlcnIgPT4gdGhpcy5sb2cuZXJyb3IoeyBlcnIsIGNpZDogdGhpcy5pZCB9KSk7XG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3QgbG9jayA9IHRoaXMubG9ja3Muc2hpZnQoKTtcbiAgICAgICAgY29uc3QgeyByZXNvbHZlLCByZWplY3QsIHBhdGgsIG9wdGlvbnMsIGxvY2tJZCB9ID0gbG9jaztcblxuICAgICAgICBpZiAoIXRoaXMudXNhYmxlIHx8IHRoaXMuc29ja2V0LmRlc3Ryb3llZCkge1xuICAgICAgICAgICAgdGhpcy5sb2cudHJhY2UoeyBtc2c6ICdGYWlsZWQgdG8gYWNxdWlyZSBtYWlsYm94IGxvY2snLCBwYXRoLCBsb2NrSWQsIGlkbGluZzogdGhpcy5pZGxpbmcgfSk7XG4gICAgICAgICAgICAvLyByZWplY3QgYWxsXG4gICAgICAgICAgICBsZXQgZXJyb3IgPSBuZXcgRXJyb3IoJ0Nvbm5lY3Rpb24gbm90IGF2YWlsYWJsZScpO1xuICAgICAgICAgICAgZXJyb3IuY29kZSA9ICdOb0Nvbm5lY3Rpb24nO1xuICAgICAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLnByb2Nlc3NMb2Nrcyh0cnVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLm1haWxib3ggJiYgdGhpcy5tYWlsYm94LnBhdGggPT09IHBhdGggJiYgISF0aGlzLm1haWxib3gucmVhZE9ubHkgPT09ICEhb3B0aW9ucy5yZWFkT25seSkge1xuICAgICAgICAgICAgLy8gbm90aGluZyB0byBkbyBoZXJlLCBhbHJlYWR5IHNlbGVjdGVkXG4gICAgICAgICAgICB0aGlzLmxvZy50cmFjZSh7XG4gICAgICAgICAgICAgICAgbXNnOiAnTWFpbGJveCBsb2NrIGFjcXVpcmVkIFtleGlzdGluZ10nLFxuICAgICAgICAgICAgICAgIHBhdGgsXG4gICAgICAgICAgICAgICAgbG9ja0lkLFxuICAgICAgICAgICAgICAgIGlkbGluZzogdGhpcy5pZGxpbmcsXG4gICAgICAgICAgICAgICAgLi4uKG9wdGlvbnMuZGVzY3JpcHRpb24gJiYgeyBkZXNjcmlwdGlvbjogb3B0aW9ucy5kZXNjcmlwdGlvbiB9KVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRMb2NrID0gbG9jaztcbiAgICAgICAgICAgIHJldHVybiByZXNvbHZlKHsgcGF0aCwgcmVsZWFzZSB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgLy8gVHJ5IHRvIG9wZW4uIFRocm93cyBpZiBtYWlsYm94IGRvZXMgbm90IGV4aXN0cyBvciBjYW4ndCBvcGVuXG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5tYWlsYm94T3BlbihwYXRoLCBvcHRpb25zKTtcbiAgICAgICAgICAgICAgICB0aGlzLmxvZy50cmFjZSh7XG4gICAgICAgICAgICAgICAgICAgIG1zZzogJ01haWxib3ggbG9jayBhY3F1aXJlZCBbc2VsZWN0ZWRdJyxcbiAgICAgICAgICAgICAgICAgICAgcGF0aCxcbiAgICAgICAgICAgICAgICAgICAgbG9ja0lkLFxuICAgICAgICAgICAgICAgICAgICBpZGxpbmc6IHRoaXMuaWRsaW5nLFxuICAgICAgICAgICAgICAgICAgICAuLi4ob3B0aW9ucy5kZXNjcmlwdGlvbiAmJiB7IGRlc2NyaXB0aW9uOiBvcHRpb25zLmRlc2NyaXB0aW9uIH0pXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50TG9jayA9IGxvY2s7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc29sdmUoeyBwYXRoLCByZWxlYXNlIH0pO1xuICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgaWYgKGVyci5yZXNwb25zZVN0YXR1cyA9PT0gJ05PJykge1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGZvbGRlcnMgPSBhd2FpdCB0aGlzLnJ1bignTElTVCcsICcnLCBwYXRoLCB7IGxpc3RPbmx5OiB0cnVlIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFmb2xkZXJzIHx8ICFmb2xkZXJzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyci5tYWlsYm94TWlzc2luZyA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9nLnRyYWNlKHsgbXNnOiAnRmFpbGVkIHRvIHZlcmlmeSBmYWlsZWQgbWFpbGJveCcsIHBhdGgsIGVycjogRSB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHRoaXMubG9nLnRyYWNlKHtcbiAgICAgICAgICAgICAgICAgICAgbXNnOiAnRmFpbGVkIHRvIGFjcXVpcmUgbWFpbGJveCBsb2NrJyxcbiAgICAgICAgICAgICAgICAgICAgcGF0aCxcbiAgICAgICAgICAgICAgICAgICAgbG9ja0lkLFxuICAgICAgICAgICAgICAgICAgICBpZGxpbmc6IHRoaXMuaWRsaW5nLFxuICAgICAgICAgICAgICAgICAgICAuLi4ob3B0aW9ucy5kZXNjcmlwdGlvbiAmJiB7IGRlc2NyaXB0aW9uOiBvcHRpb25zLmRlc2NyaXB0aW9uIH0pLFxuICAgICAgICAgICAgICAgICAgICBlcnJcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnByb2Nlc3NMb2Nrcyh0cnVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE9wZW5zIGEgbWFpbGJveCBpZiBub3QgYWxyZWFkeSBvcGVuIGFuZCByZXR1cm5zIGEgbG9jay4gTmV4dCBjYWxsIHRvIGBnZXRNYWlsYm94TG9jaygpYCBpcyBxdWV1ZWRcbiAgICAgKiB1bnRpbCBwcmV2aW91cyBsb2NrIGlzIHJlbGVhc2VkLiBUaGlzIGlzIHN1Z2dlc3RlZCBvdmVyIHtAbGluayBtb2R1bGU6aW1hcGZsb3d+SW1hcEZsb3cjbWFpbGJveE9wZW58bWFpbGJveE9wZW4oKX0gYXNcbiAgICAgKiBgZ2V0TWFpbGJveExvY2soKWAgZ2l2ZXMgeW91IGEgd2VhayB0cmFuc2FjdGlvbiB3aGlsZSBgbWFpbGJveE9wZW4oKWAgaGFzIG5vIGd1YXJhbnRlZXMgd2hhdHNvZXZlciB0aGF0IGFub3RoZXJcbiAgICAgKiBtYWlsYm94IGlzIG9wZW5lZCB3aGlsZSB5b3UgdHJ5IHRvIGNhbGwgbXVsdGlwbGUgZmV0Y2ggb3Igc3RvcmUgY29tbWFuZHMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ3xhcnJheX0gcGF0aCAqKlBhdGggZm9yIHRoZSBtYWlsYm94KiogdG8gb3BlblxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc10gb3B0aW9uYWwgb3B0aW9uc1xuICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMucmVhZE9ubHk9ZmFsc2VdIElmIGB0cnVlYCB0aGVuIG9wZW5zIG1haWxib3ggaW4gcmVhZC1vbmx5IG1vZGUuIFlvdSBjYW4gc3RpbGwgdHJ5IHRvIHBlcmZvcm0gd3JpdGUgb3BlcmF0aW9ucyBidXQgdGhlc2Ugd291bGQgcHJvYmFibHkgZmFpbC5cbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTxNYWlsYm94TG9ja09iamVjdD59IE1haWxib3ggbG9ja1xuICAgICAqIEB0aHJvd3MgV2lsbCB0aHJvdyBhbiBlcnJvciBpZiBtYWlsYm94IGRvZXMgbm90IGV4aXN0IG9yIGNhbiBub3QgYmUgb3BlbmVkXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGxldCBsb2NrID0gYXdhaXQgY2xpZW50LmdldE1haWxib3hMb2NrKCdJTkJPWCcpO1xuICAgICAqIHRyeSB7XG4gICAgICogICAvLyBkbyBzb21ldGhpbmcgaW4gdGhlIG1haWxib3hcbiAgICAgKiB9IGZpbmFsbHkge1xuICAgICAqICAgLy8gdXNlIGZpbmFsbHl7fSB0byBtYWtlIHN1cmUgbG9jayBpcyByZWxlYXNlZCBldmVuIGlmIGV4Y2VwdGlvbiBvY2N1cnNcbiAgICAgKiAgIGxvY2sucmVsZWFzZSgpO1xuICAgICAqIH1cbiAgICAgKi9cbiAgICBhc3luYyBnZXRNYWlsYm94TG9jayhwYXRoLCBvcHRpb25zKSB7XG4gICAgICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuXG4gICAgICAgIHBhdGggPSBub3JtYWxpemVQYXRoKHRoaXMsIHBhdGgpO1xuXG4gICAgICAgIGxldCBsb2NrSWQgPSArK3RoaXMubG9ja0NvdW50ZXI7XG4gICAgICAgIHRoaXMubG9nLnRyYWNlKHtcbiAgICAgICAgICAgIG1zZzogJ1JlcXVlc3RpbmcgbG9jaycsXG4gICAgICAgICAgICBwYXRoLFxuICAgICAgICAgICAgbG9ja0lkLFxuICAgICAgICAgICAgLi4uKG9wdGlvbnMuZGVzY3JpcHRpb24gJiYgeyBkZXNjcmlwdGlvbjogb3B0aW9ucy5kZXNjcmlwdGlvbiB9KSxcbiAgICAgICAgICAgIGFjdGl2ZUxvY2s6IHRoaXMuY3VycmVudExvY2tcbiAgICAgICAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgICAgICAgICBsb2NrSWQ6IHRoaXMuY3VycmVudExvY2subG9ja0lkLFxuICAgICAgICAgICAgICAgICAgICAgIC4uLih0aGlzLmN1cnJlbnRMb2NrLm9wdGlvbnM/LmRlc2NyaXB0aW9uICYmIHsgZGVzY3JpcHRpb246IHRoaXMuY3VycmVudExvY2sub3B0aW9ucz8uZGVzY3JpcHRpb24gfSlcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA6IG51bGxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIHRoaXMubG9ja3MucHVzaCh7IHJlc29sdmUsIHJlamVjdCwgcGF0aCwgb3B0aW9ucywgbG9ja0lkIH0pO1xuICAgICAgICAgICAgdGhpcy5wcm9jZXNzTG9ja3MoKS5jYXRjaChlcnIgPT4gcmVqZWN0KGVycikpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBnZXRMb2dnZXIoKSB7XG4gICAgICAgIGxldCBtYWluTG9nZ2VyID1cbiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5sb2dnZXIgJiYgdHlwZW9mIHRoaXMub3B0aW9ucy5sb2dnZXIgPT09ICdvYmplY3QnXG4gICAgICAgICAgICAgICAgPyB0aGlzLm9wdGlvbnMubG9nZ2VyXG4gICAgICAgICAgICAgICAgOiBsb2dnZXIuY2hpbGQoe1xuICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudDogJ2ltYXAtY29ubmVjdGlvbicsXG4gICAgICAgICAgICAgICAgICAgICAgY2lkOiB0aGlzLmlkXG4gICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICBsZXQgc3ludGV0aWNMb2dnZXIgPSB7fTtcbiAgICAgICAgbGV0IGxldmVscyA9IFsndHJhY2UnLCAnZGVidWcnLCAnaW5mbycsICd3YXJuJywgJ2Vycm9yJywgJ2ZhdGFsJ107XG4gICAgICAgIGZvciAobGV0IGxldmVsIG9mIGxldmVscykge1xuICAgICAgICAgICAgc3ludGV0aWNMb2dnZXJbbGV2ZWxdID0gKC4uLmFyZ3MpID0+IHtcbiAgICAgICAgICAgICAgICAvLyB1c2luZyB7bG9nZ2VyOmZhbHNlfSBkaXNhYmxlcyBsb2dnaW5nXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5sb2dnZXIgIT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChsb2dnZXIpXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIG1haW5Mb2dnZXJbbGV2ZWxdICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2UgYXJlIGNoZWNraW5nIHRvIG1ha2Ugc3VyZSB0aGUgbGV2ZWwgaXMgc3VwcG9ydGVkLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIGl0IGlzbid0IHN1cHBvcnRlZCBidXQgdGhlIGxldmVsIGlzIGVycm9yIG9yIGZhdGFsLCBsb2cgdG8gY29uc29sZSBhbnl3YXkuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxldmVsID09PSAnZmF0YWwnIHx8IGxldmVsID09PSAnZXJyb3InKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKEpTT04uc3RyaW5naWZ5KC4uLmFyZ3MpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1haW5Mb2dnZXJbbGV2ZWxdKC4uLmFyZ3MpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmVtaXRMb2dzICYmIGFyZ3MgJiYgYXJnc1swXSAmJiB0eXBlb2YgYXJnc1swXSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGxvZ0VudHJ5ID0gT2JqZWN0LmFzc2lnbih7IGxldmVsLCB0OiBEYXRlLm5vdygpLCBjaWQ6IHRoaXMuaWQsIGxvOiArK3RoaXMubG8gfSwgYXJnc1swXSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChsb2dFbnRyeS5lcnIgJiYgdHlwZW9mIGxvZ0VudHJ5LmVyciA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBlcnIgPSBsb2dFbnRyeS5lcnI7XG4gICAgICAgICAgICAgICAgICAgICAgICBsb2dFbnRyeS5lcnIgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhY2s6IGVyci5zdGFja1xuICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVudW1lcmFibGUgZXJyb3IgZmllbGRzXG4gICAgICAgICAgICAgICAgICAgICAgICBPYmplY3Qua2V5cyhlcnIpLmZvckVhY2goa2V5ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dFbnRyeS5lcnJba2V5XSA9IGVycltrZXldO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5lbWl0KCdsb2cnLCBsb2dFbnRyeSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBzeW50ZXRpY0xvZ2dlcjtcbiAgICB9XG5cbiAgICB1bmJpbmQoKSB7XG4gICAgICAgIHRoaXMuc29ja2V0LnVucGlwZSh0aGlzLnN0cmVhbWVyKTtcbiAgICAgICAgaWYgKHRoaXMuX2luZmxhdGUpIHtcbiAgICAgICAgICAgIHRoaXMuX2luZmxhdGUudW5waXBlKHRoaXMuc3RyZWFtZXIpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5zb2NrZXQucmVtb3ZlTGlzdGVuZXIoJ2Vycm9yJywgdGhpcy5fc29ja2V0RXJyb3IpO1xuICAgICAgICB0aGlzLnNvY2tldC5yZW1vdmVMaXN0ZW5lcignY2xvc2UnLCB0aGlzLl9zb2NrZXRDbG9zZSk7XG4gICAgICAgIHRoaXMuc29ja2V0LnJlbW92ZUxpc3RlbmVyKCdlbmQnLCB0aGlzLl9zb2NrZXRFbmQpO1xuICAgICAgICB0aGlzLnNvY2tldC5yZW1vdmVMaXN0ZW5lcigndGxzQ2xpZW50RXJyb3InLCB0aGlzLl9zb2NrZXRFcnJvcik7XG4gICAgICAgIHRoaXMuc29ja2V0LnJlbW92ZUxpc3RlbmVyKCd0aW1lb3V0JywgdGhpcy5fc29ja2V0VGltZW91dCk7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHJlYWRTb2NrZXQ6IHRoaXMuX2luZmxhdGUgfHwgdGhpcy5zb2NrZXQsXG4gICAgICAgICAgICB3cml0ZVNvY2tldDogdGhpcy53cml0ZVNvY2tldCB8fCB0aGlzLnNvY2tldFxuICAgICAgICB9O1xuICAgIH1cbn1cblxuLyoqXG4gKiBDb25uZWN0aW9uIGNsb3NlIGV2ZW50LiAqKk5CISoqIEltYXBGbG93IGRvZXMgbm90IGhhbmRsZSByZWNvbm5lY3RzIGF1dG9tYXRpY2FsbHkuXG4gKiBTbyB3aGVuZXZlciBhICdjbG9zZScgZXZlbnQgb2NjdXJzIHlvdSBtdXN0IGNyZWF0ZSBhIG5ldyBjb25uZWN0aW9uIHlvdXJzZWxmLlxuICpcbiAqIEBldmVudCBtb2R1bGU6aW1hcGZsb3d+SW1hcEZsb3cjY2xvc2VcbiAqL1xuXG4vKipcbiAqIEVycm9yIGV2ZW50LiBJbiBtb3N0IGNhc2VzIGdldHRpbmcgYW4gZXJyb3IgZXZlbnQgYWxzbyBtZWFucyB0aGF0IGNvbm5lY3Rpb24gaXMgY2xvc2VkXG4gKiBhbmQgcGVuZGluZyBvcGVyYXRpb25zIHNob3VsZCByZXR1cm4gd2l0aCBhIGZhaWx1cmUuXG4gKlxuICogQGV2ZW50IG1vZHVsZTppbWFwZmxvd35JbWFwRmxvdyNlcnJvclxuICogQHR5cGUge0Vycm9yfVxuICogQGV4YW1wbGVcbiAqIGNsaWVudC5vbignZXJyb3InLCBlcnI9PntcbiAqICAgICBjb25zb2xlLmxvZyhgRXJyb3Igb2NjdXJyZWQ6ICR7ZXJyLm1lc3NhZ2V9YCk7XG4gKiB9KTtcbiAqL1xuXG4vKipcbiAqIE1lc3NhZ2UgY291bnQgaW4gY3VycmVudGx5IG9wZW5lZCBtYWlsYm94IGNoYW5nZWRcbiAqXG4gKiBAZXZlbnQgbW9kdWxlOmltYXBmbG93fkltYXBGbG93I2V4aXN0c1xuICogQHR5cGUge09iamVjdH1cbiAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBwYXRoIG1haWxib3ggcGF0aCB0aGlzIGV2ZW50IGFwcGxpZXMgdG9cbiAqIEBwcm9wZXJ0eSB7TnVtYmVyfSBjb3VudCB1cGRhdGVkIGNvdW50IG9mIG1lc3NhZ2VzXG4gKiBAcHJvcGVydHkge051bWJlcn0gcHJldkNvdW50IG1lc3NhZ2UgY291bnQgYmVmb3JlIHRoaXMgdXBkYXRlXG4gKiBAZXhhbXBsZVxuICogY2xpZW50Lm9uKCdleGlzdHMnLCBkYXRhPT57XG4gKiAgICAgY29uc29sZS5sb2coYE1lc3NhZ2UgY291bnQgaW4gXCIke2RhdGEucGF0aH1cIiBpcyAke2RhdGEuY291bnR9YCk7XG4gKiB9KTtcbiAqL1xuXG4vKipcbiAqIERlbGV0ZWQgbWVzc2FnZSBzZXF1ZW5jZSBudW1iZXIgaW4gY3VycmVudGx5IG9wZW5lZCBtYWlsYm94LiBPbmUgZXZlbnQgaXMgZmlyZWQgZm9yIGV2ZXJ5IGRlbGV0ZWQgZW1haWwuXG4gKlxuICogQGV2ZW50IG1vZHVsZTppbWFwZmxvd35JbWFwRmxvdyNleHB1bmdlXG4gKiBAdHlwZSB7T2JqZWN0fVxuICogQHByb3BlcnR5IHtTdHJpbmd9IHBhdGggbWFpbGJveCBwYXRoIHRoaXMgZXZlbnQgYXBwbGllcyB0b1xuICogQHByb3BlcnR5IHtOdW1iZXJ9IHNlcSBzZXF1ZW5jZSBudW1iZXIgb2YgZGVsZXRlZCBtZXNzYWdlXG4gKiBAZXhhbXBsZVxuICogY2xpZW50Lm9uKCdleHB1bmdlJywgZGF0YT0+e1xuICogICAgIGNvbnNvbGUubG9nKGBNZXNzYWdlICMke2RhdGEuc2VxfSB3YXMgZGVsZXRlZCBmcm9tIFwiJHtkYXRhLnBhdGh9XCJgKTtcbiAqIH0pO1xuICovXG5cbi8qKlxuICogRmxhZ3Mgd2VyZSB1cGRhdGVkIGZvciBhIG1lc3NhZ2UuIE5vdCBhbGwgc2VydmVycyBmaXJlIHRoaXMgZXZlbnQuXG4gKlxuICogQGV2ZW50IG1vZHVsZTppbWFwZmxvd35JbWFwRmxvdyNmbGFnc1xuICogQHR5cGUge09iamVjdH1cbiAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBwYXRoIG1haWxib3ggcGF0aCB0aGlzIGV2ZW50IGFwcGxpZXMgdG9cbiAqIEBwcm9wZXJ0eSB7TnVtYmVyfSBzZXEgc2VxdWVuY2UgbnVtYmVyIG9mIHVwZGF0ZWQgbWVzc2FnZVxuICogQHByb3BlcnR5IHtOdW1iZXJ9IFt1aWRdIFVJRCBudW1iZXIgb2YgdXBkYXRlZCBtZXNzYWdlIChpZiBzZXJ2ZXIgcHJvdmlkZWQgdGhpcyB2YWx1ZSlcbiAqIEBwcm9wZXJ0eSB7QmlnSW50fSBbbW9kc2VxXSBVcGRhdGVkIG1vZHNlcSBudW1iZXIgZm9yIHRoZSBtYWlsYm94IChpZiBzZXJ2ZXIgcHJvdmlkZWQgdGhpcyB2YWx1ZSlcbiAqIEBwcm9wZXJ0eSB7U2V0PHN0cmluZz59IGZsYWdzIEEgc2V0IG9mIGFsbCBmbGFncyBmb3IgdGhlIHVwZGF0ZWQgbWVzc2FnZVxuICogQGV4YW1wbGVcbiAqIGNsaWVudC5vbignZmxhZ3MnLCBkYXRhPT57XG4gKiAgICAgY29uc29sZS5sb2coYEZsYWcgc2V0IGZvciAjJHtkYXRhLnNlcX0gaXMgbm93IFwiJHtBcnJheS5mcm9tKGRhdGEuZmxhZ3MpLmpvaW4oJywgJyl9XCJgKTtcbiAqIH0pO1xuICovXG5cbi8qKlxuICogTWFpbGJveCB3YXMgb3BlbmVkXG4gKlxuICogQGV2ZW50IG1vZHVsZTppbWFwZmxvd35JbWFwRmxvdyNtYWlsYm94T3BlblxuICogQHR5cGUge01haWxib3hPYmplY3R9XG4gKiBAZXhhbXBsZVxuICogY2xpZW50Lm9uKCdtYWlsYm94T3BlbicsIG1haWxib3ggPT4ge1xuICogICAgIGNvbnNvbGUubG9nKGBNYWlsYm94ICR7bWFpbGJveC5wYXRofSB3YXMgb3BlbmVkYCk7XG4gKiB9KTtcbiAqL1xuXG4vKipcbiAqIE1haWxib3ggd2FzIGNsb3NlZFxuICpcbiAqIEBldmVudCBtb2R1bGU6aW1hcGZsb3d+SW1hcEZsb3cjbWFpbGJveENsb3NlXG4gKiBAdHlwZSB7TWFpbGJveE9iamVjdH1cbiAqIEBleGFtcGxlXG4gKiBjbGllbnQub24oJ21haWxib3hDbG9zZScsIG1haWxib3ggPT4ge1xuICogICAgIGNvbnNvbGUubG9nKGBNYWlsYm94ICR7bWFpbGJveC5wYXRofSB3YXMgY2xvc2VkYCk7XG4gKiB9KTtcbiAqL1xuXG4vKipcbiAqIExvZyBldmVudCBpZiBgZW1pdExvZ3M9dHJ1ZWBcbiAqXG4gKiBAZXZlbnQgbW9kdWxlOmltYXBmbG93fkltYXBGbG93I2xvZ1xuICogQHR5cGUge09iamVjdH1cbiAqIEBleGFtcGxlXG4gKiBjbGllbnQub24oJ2xvZycsIGVudHJ5ID0+IHtcbiAqICAgICBjb25zb2xlLmxvZyhgJHtsb2cuY2lkfSAke2xvZy5tc2d9YCk7XG4gKiB9KTtcbiAqL1xuXG5tb2R1bGUuZXhwb3J0cy5JbWFwRmxvdyA9IEltYXBGbG93O1xuIl0sIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6WzBdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(rsc)/./node_modules/imapflow/lib/imap-flow.js\n");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "(rsc)/./node_modules/imapflow/lib/jp-decoder.js":
|
|
/*!*************************************************!*\
|
|
!*** ./node_modules/imapflow/lib/jp-decoder.js ***!
|
|
\*************************************************/
|
|
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
|
|
|
|
eval("\n\nconst { Transform } = __webpack_require__(/*! stream */ \"stream\");\nconst encodingJapanese = __webpack_require__(/*! encoding-japanese */ \"(rsc)/./node_modules/encoding-japanese/src/index.js\");\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\nmodule.exports.JPDecoder = JPDecoder;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHJzYykvLi9ub2RlX21vZHVsZXMvaW1hcGZsb3cvbGliL2pwLWRlY29kZXIuanMiLCJtYXBwaW5ncyI6IkFBQWE7O0FBRWIsUUFBUSxZQUFZLEVBQUUsbUJBQU8sQ0FBQyxzQkFBUTtBQUN0Qyx5QkFBeUIsbUJBQU8sQ0FBQyw4RUFBbUI7O0FBRXBEO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLHdCQUF3QiIsInNvdXJjZXMiOlsiL2hvbWUvYWxtYS9uZXh0Z2VuL05lYWgtbWFpbC9ub2RlX21vZHVsZXMvaW1hcGZsb3cvbGliL2pwLWRlY29kZXIuanMiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCB7IFRyYW5zZm9ybSB9ID0gcmVxdWlyZSgnc3RyZWFtJyk7XG5jb25zdCBlbmNvZGluZ0phcGFuZXNlID0gcmVxdWlyZSgnZW5jb2RpbmctamFwYW5lc2UnKTtcblxuY2xhc3MgSlBEZWNvZGVyIGV4dGVuZHMgVHJhbnNmb3JtIHtcbiAgICBjb25zdHJ1Y3RvcihjaGFyc2V0KSB7XG4gICAgICAgIHN1cGVyKCk7XG5cbiAgICAgICAgdGhpcy5jaGFyc2V0ID0gY2hhcnNldDtcbiAgICAgICAgdGhpcy5jaHVua3MgPSBbXTtcbiAgICAgICAgdGhpcy5jaHVua2xlbiA9IDA7XG4gICAgfVxuXG4gICAgX3RyYW5zZm9ybShjaHVuaywgZW5jb2RpbmcsIGRvbmUpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBjaHVuayA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGNodW5rID0gQnVmZmVyLmZyb20oY2h1bmssIGVuY29kaW5nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY2h1bmtzLnB1c2goY2h1bmspO1xuICAgICAgICB0aGlzLmNodW5rbGVuICs9IGNodW5rLmxlbmd0aDtcbiAgICAgICAgZG9uZSgpO1xuICAgIH1cblxuICAgIF9mbHVzaChkb25lKSB7XG4gICAgICAgIGxldCBpbnB1dCA9IEJ1ZmZlci5jb25jYXQodGhpcy5jaHVua3MsIHRoaXMuY2h1bmtsZW4pO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgbGV0IG91dHB1dCA9IGVuY29kaW5nSmFwYW5lc2UuY29udmVydChpbnB1dCwge1xuICAgICAgICAgICAgICAgIHRvOiAnVU5JQ09ERScsIC8vIHRvX2VuY29kaW5nXG4gICAgICAgICAgICAgICAgZnJvbTogdGhpcy5jaGFyc2V0LCAvLyBmcm9tX2VuY29kaW5nXG4gICAgICAgICAgICAgICAgdHlwZTogJ3N0cmluZydcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBvdXRwdXQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgb3V0cHV0ID0gQnVmZmVyLmZyb20ob3V0cHV0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMucHVzaChvdXRwdXQpO1xuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIC8vIGtlZXAgYXMgaXMgb24gZXJyb3JzXG4gICAgICAgICAgICB0aGlzLnB1c2goaW5wdXQpO1xuICAgICAgICB9XG5cbiAgICAgICAgZG9uZSgpO1xuICAgIH1cbn1cblxubW9kdWxlLmV4cG9ydHMuSlBEZWNvZGVyID0gSlBEZWNvZGVyO1xuIl0sIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6WzBdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(rsc)/./node_modules/imapflow/lib/jp-decoder.js\n");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "(rsc)/./node_modules/imapflow/lib/limited-passthrough.js":
|
|
/*!**********************************************************!*\
|
|
!*** ./node_modules/imapflow/lib/limited-passthrough.js ***!
|
|
\**********************************************************/
|
|
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
|
|
|
|
eval("\n\nconst { Transform } = __webpack_require__(/*! stream */ \"stream\");\n\nclass LimitedPassthrough extends Transform {\n constructor(options) {\n super();\n this.options = options || {};\n this.maxBytes = this.options.maxBytes || Infinity;\n this.processed = 0;\n this.limited = false;\n }\n\n _transform(chunk, encoding, done) {\n if (this.limited) {\n return done();\n }\n\n if (this.processed + chunk.length > this.maxBytes) {\n if (this.maxBytes - this.processed < 1) {\n return done();\n }\n\n chunk = chunk.slice(0, this.maxBytes - this.processed);\n }\n\n this.processed += chunk.length;\n if (this.processed >= this.maxBytes) {\n this.limited = true;\n }\n\n this.push(chunk);\n done();\n }\n}\n\nmodule.exports.LimitedPassthrough = LimitedPassthrough;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHJzYykvLi9ub2RlX21vZHVsZXMvaW1hcGZsb3cvbGliL2xpbWl0ZWQtcGFzc3Rocm91Z2guanMiLCJtYXBwaW5ncyI6IkFBQWE7O0FBRWIsUUFBUSxZQUFZLEVBQUUsbUJBQU8sQ0FBQyxzQkFBUTs7QUFFdEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLGlDQUFpQyIsInNvdXJjZXMiOlsiL2hvbWUvYWxtYS9uZXh0Z2VuL05lYWgtbWFpbC9ub2RlX21vZHVsZXMvaW1hcGZsb3cvbGliL2xpbWl0ZWQtcGFzc3Rocm91Z2guanMiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCB7IFRyYW5zZm9ybSB9ID0gcmVxdWlyZSgnc3RyZWFtJyk7XG5cbmNsYXNzIExpbWl0ZWRQYXNzdGhyb3VnaCBleHRlbmRzIFRyYW5zZm9ybSB7XG4gICAgY29uc3RydWN0b3Iob3B0aW9ucykge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICAgICAgICB0aGlzLm1heEJ5dGVzID0gdGhpcy5vcHRpb25zLm1heEJ5dGVzIHx8IEluZmluaXR5O1xuICAgICAgICB0aGlzLnByb2Nlc3NlZCA9IDA7XG4gICAgICAgIHRoaXMubGltaXRlZCA9IGZhbHNlO1xuICAgIH1cblxuICAgIF90cmFuc2Zvcm0oY2h1bmssIGVuY29kaW5nLCBkb25lKSB7XG4gICAgICAgIGlmICh0aGlzLmxpbWl0ZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBkb25lKCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5wcm9jZXNzZWQgKyBjaHVuay5sZW5ndGggPiB0aGlzLm1heEJ5dGVzKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5tYXhCeXRlcyAtIHRoaXMucHJvY2Vzc2VkIDwgMSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBkb25lKCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNodW5rID0gY2h1bmsuc2xpY2UoMCwgdGhpcy5tYXhCeXRlcyAtIHRoaXMucHJvY2Vzc2VkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucHJvY2Vzc2VkICs9IGNodW5rLmxlbmd0aDtcbiAgICAgICAgaWYgKHRoaXMucHJvY2Vzc2VkID49IHRoaXMubWF4Qnl0ZXMpIHtcbiAgICAgICAgICAgIHRoaXMubGltaXRlZCA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnB1c2goY2h1bmspO1xuICAgICAgICBkb25lKCk7XG4gICAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cy5MaW1pdGVkUGFzc3Rocm91Z2ggPSBMaW1pdGVkUGFzc3Rocm91Z2g7XG4iXSwibmFtZXMiOltdLCJpZ25vcmVMaXN0IjpbMF0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(rsc)/./node_modules/imapflow/lib/limited-passthrough.js\n");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "(rsc)/./node_modules/imapflow/lib/logger.js":
|
|
/*!*********************************************!*\
|
|
!*** ./node_modules/imapflow/lib/logger.js ***!
|
|
\*********************************************/
|
|
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
|
|
|
|
eval("\n\nconst logger = __webpack_require__(/*! pino */ \"(rsc)/./node_modules/pino/pino.js\")();\nlogger.level = 'trace';\nmodule.exports = logger;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHJzYykvLi9ub2RlX21vZHVsZXMvaW1hcGZsb3cvbGliL2xvZ2dlci5qcyIsIm1hcHBpbmdzIjoiQUFBYTs7QUFFYixlQUFlLG1CQUFPLENBQUMsK0NBQU07QUFDN0I7QUFDQSIsInNvdXJjZXMiOlsiL2hvbWUvYWxtYS9uZXh0Z2VuL05lYWgtbWFpbC9ub2RlX21vZHVsZXMvaW1hcGZsb3cvbGliL2xvZ2dlci5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbmNvbnN0IGxvZ2dlciA9IHJlcXVpcmUoJ3Bpbm8nKSgpO1xubG9nZ2VyLmxldmVsID0gJ3RyYWNlJztcbm1vZHVsZS5leHBvcnRzID0gbG9nZ2VyO1xuIl0sIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6WzBdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(rsc)/./node_modules/imapflow/lib/logger.js\n");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "(rsc)/./node_modules/imapflow/lib/proxy-connection.js":
|
|
/*!*******************************************************!*\
|
|
!*** ./node_modules/imapflow/lib/proxy-connection.js ***!
|
|
\*******************************************************/
|
|
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
|
|
|
|
eval("\n\nconst httpProxyClient = __webpack_require__(/*! nodemailer/lib/smtp-connection/http-proxy-client */ \"(rsc)/./node_modules/imapflow/node_modules/nodemailer/lib/smtp-connection/http-proxy-client.js\");\nconst { SocksClient } = __webpack_require__(/*! socks */ \"(rsc)/./node_modules/socks/build/index.js\");\nconst util = __webpack_require__(/*! util */ \"util\");\nconst httpProxyClientAsync = util.promisify(httpProxyClient);\nconst dns = (__webpack_require__(/*! dns */ \"dns\").promises);\nconst net = __webpack_require__(/*! net */ \"net\");\n\nconst proxyConnection = async (logger, connectionUrl, host, port) => {\n let proxyUrl = new URL(connectionUrl);\n\n let protocol = proxyUrl.protocol.replace(/:$/, '').toLowerCase();\n\n if (!net.isIP(host)) {\n let resolveResult = await dns.resolve(host);\n if (resolveResult && resolveResult.length) {\n host = resolveResult[0];\n }\n }\n\n switch (protocol) {\n // Connect using a HTTP CONNECT method\n case 'http':\n case 'https': {\n try {\n let socket = await httpProxyClientAsync(proxyUrl.href, port, host);\n if (socket) {\n if (proxyUrl.password) {\n proxyUrl.password = '(hidden)';\n }\n logger.info({\n msg: 'Established a socket via HTTP proxy',\n proxyUrl: proxyUrl.href,\n port,\n host\n });\n }\n return socket;\n } catch (err) {\n if (proxyUrl.password) {\n proxyUrl.password = '(hidden)';\n }\n logger.error({\n msg: 'Failed to establish a socket via HTTP proxy',\n proxyUrl: proxyUrl.href,\n port,\n host,\n err\n });\n throw err;\n }\n }\n\n // SOCKS proxy\n case 'socks':\n case 'socks5':\n case 'socks4':\n case 'socks4a': {\n let proxyType = Number(protocol.replace(/\\D/g, '')) || 5;\n\n let targetHost = proxyUrl.hostname;\n if (!net.isIP(targetHost)) {\n let resolveResult = await dns.resolve(targetHost);\n if (resolveResult && resolveResult.length) {\n targetHost = resolveResult[0];\n }\n }\n\n let connectionOpts = {\n proxy: {\n host: targetHost,\n port: Number(proxyUrl.port) || 1080,\n type: proxyType\n },\n destination: {\n host,\n port\n },\n command: 'connect',\n set_tcp_nodelay: true\n };\n\n if (proxyUrl.username || proxyUrl.password) {\n connectionOpts.proxy.userId = proxyUrl.username;\n connectionOpts.proxy.password = proxyUrl.password;\n }\n\n try {\n const info = await SocksClient.createConnection(connectionOpts);\n if (info && info.socket) {\n if (proxyUrl.password) {\n proxyUrl.password = '(hidden)';\n }\n logger.info({\n msg: 'Established a socket via SOCKS proxy',\n proxyUrl: proxyUrl.href,\n port,\n host\n });\n }\n return info.socket;\n } catch (err) {\n if (proxyUrl.password) {\n proxyUrl.password = '(hidden)';\n }\n logger.error({\n msg: 'Failed to establish a socket via SOCKS proxy',\n proxyUrl: proxyUrl.href,\n port,\n host,\n err\n });\n throw err;\n }\n }\n }\n};\n\nmodule.exports = { proxyConnection };\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHJzYykvLi9ub2RlX21vZHVsZXMvaW1hcGZsb3cvbGliL3Byb3h5LWNvbm5lY3Rpb24uanMiLCJtYXBwaW5ncyI6IkFBQWE7O0FBRWIsd0JBQXdCLG1CQUFPLENBQUMsd0pBQWtEO0FBQ2xGLFFBQVEsY0FBYyxFQUFFLG1CQUFPLENBQUMsd0RBQU87QUFDdkMsYUFBYSxtQkFBTyxDQUFDLGtCQUFNO0FBQzNCO0FBQ0EsWUFBWSxnREFBdUI7QUFDbkMsWUFBWSxtQkFBTyxDQUFDLGdCQUFLOztBQUV6QjtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQjtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLG1CQUFtQiIsInNvdXJjZXMiOlsiL2hvbWUvYWxtYS9uZXh0Z2VuL05lYWgtbWFpbC9ub2RlX21vZHVsZXMvaW1hcGZsb3cvbGliL3Byb3h5LWNvbm5lY3Rpb24uanMiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCBodHRwUHJveHlDbGllbnQgPSByZXF1aXJlKCdub2RlbWFpbGVyL2xpYi9zbXRwLWNvbm5lY3Rpb24vaHR0cC1wcm94eS1jbGllbnQnKTtcbmNvbnN0IHsgU29ja3NDbGllbnQgfSA9IHJlcXVpcmUoJ3NvY2tzJyk7XG5jb25zdCB1dGlsID0gcmVxdWlyZSgndXRpbCcpO1xuY29uc3QgaHR0cFByb3h5Q2xpZW50QXN5bmMgPSB1dGlsLnByb21pc2lmeShodHRwUHJveHlDbGllbnQpO1xuY29uc3QgZG5zID0gcmVxdWlyZSgnZG5zJykucHJvbWlzZXM7XG5jb25zdCBuZXQgPSByZXF1aXJlKCduZXQnKTtcblxuY29uc3QgcHJveHlDb25uZWN0aW9uID0gYXN5bmMgKGxvZ2dlciwgY29ubmVjdGlvblVybCwgaG9zdCwgcG9ydCkgPT4ge1xuICAgIGxldCBwcm94eVVybCA9IG5ldyBVUkwoY29ubmVjdGlvblVybCk7XG5cbiAgICBsZXQgcHJvdG9jb2wgPSBwcm94eVVybC5wcm90b2NvbC5yZXBsYWNlKC86JC8sICcnKS50b0xvd2VyQ2FzZSgpO1xuXG4gICAgaWYgKCFuZXQuaXNJUChob3N0KSkge1xuICAgICAgICBsZXQgcmVzb2x2ZVJlc3VsdCA9IGF3YWl0IGRucy5yZXNvbHZlKGhvc3QpO1xuICAgICAgICBpZiAocmVzb2x2ZVJlc3VsdCAmJiByZXNvbHZlUmVzdWx0Lmxlbmd0aCkge1xuICAgICAgICAgICAgaG9zdCA9IHJlc29sdmVSZXN1bHRbMF07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzd2l0Y2ggKHByb3RvY29sKSB7XG4gICAgICAgIC8vIENvbm5lY3QgdXNpbmcgYSBIVFRQIENPTk5FQ1QgbWV0aG9kXG4gICAgICAgIGNhc2UgJ2h0dHAnOlxuICAgICAgICBjYXNlICdodHRwcyc6IHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgbGV0IHNvY2tldCA9IGF3YWl0IGh0dHBQcm94eUNsaWVudEFzeW5jKHByb3h5VXJsLmhyZWYsIHBvcnQsIGhvc3QpO1xuICAgICAgICAgICAgICAgIGlmIChzb2NrZXQpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHByb3h5VXJsLnBhc3N3b3JkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwcm94eVVybC5wYXNzd29yZCA9ICcoaGlkZGVuKSc7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oe1xuICAgICAgICAgICAgICAgICAgICAgICAgbXNnOiAnRXN0YWJsaXNoZWQgYSBzb2NrZXQgdmlhIEhUVFAgcHJveHknLFxuICAgICAgICAgICAgICAgICAgICAgICAgcHJveHlVcmw6IHByb3h5VXJsLmhyZWYsXG4gICAgICAgICAgICAgICAgICAgICAgICBwb3J0LFxuICAgICAgICAgICAgICAgICAgICAgICAgaG9zdFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHNvY2tldDtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgIGlmIChwcm94eVVybC5wYXNzd29yZCkge1xuICAgICAgICAgICAgICAgICAgICBwcm94eVVybC5wYXNzd29yZCA9ICcoaGlkZGVuKSc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcih7XG4gICAgICAgICAgICAgICAgICAgIG1zZzogJ0ZhaWxlZCB0byBlc3RhYmxpc2ggYSBzb2NrZXQgdmlhIEhUVFAgcHJveHknLFxuICAgICAgICAgICAgICAgICAgICBwcm94eVVybDogcHJveHlVcmwuaHJlZixcbiAgICAgICAgICAgICAgICAgICAgcG9ydCxcbiAgICAgICAgICAgICAgICAgICAgaG9zdCxcbiAgICAgICAgICAgICAgICAgICAgZXJyXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gU09DS1MgcHJveHlcbiAgICAgICAgY2FzZSAnc29ja3MnOlxuICAgICAgICBjYXNlICdzb2NrczUnOlxuICAgICAgICBjYXNlICdzb2NrczQnOlxuICAgICAgICBjYXNlICdzb2NrczRhJzoge1xuICAgICAgICAgICAgbGV0IHByb3h5VHlwZSA9IE51bWJlcihwcm90b2NvbC5yZXBsYWNlKC9cXEQvZywgJycpKSB8fCA1O1xuXG4gICAgICAgICAgICBsZXQgdGFyZ2V0SG9zdCA9IHByb3h5VXJsLmhvc3RuYW1lO1xuICAgICAgICAgICAgaWYgKCFuZXQuaXNJUCh0YXJnZXRIb3N0KSkge1xuICAgICAgICAgICAgICAgIGxldCByZXNvbHZlUmVzdWx0ID0gYXdhaXQgZG5zLnJlc29sdmUodGFyZ2V0SG9zdCk7XG4gICAgICAgICAgICAgICAgaWYgKHJlc29sdmVSZXN1bHQgJiYgcmVzb2x2ZVJlc3VsdC5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0SG9zdCA9IHJlc29sdmVSZXN1bHRbMF07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsZXQgY29ubmVjdGlvbk9wdHMgPSB7XG4gICAgICAgICAgICAgICAgcHJveHk6IHtcbiAgICAgICAgICAgICAgICAgICAgaG9zdDogdGFyZ2V0SG9zdCxcbiAgICAgICAgICAgICAgICAgICAgcG9ydDogTnVtYmVyKHByb3h5VXJsLnBvcnQpIHx8IDEwODAsXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IHByb3h5VHlwZVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgZGVzdGluYXRpb246IHtcbiAgICAgICAgICAgICAgICAgICAgaG9zdCxcbiAgICAgICAgICAgICAgICAgICAgcG9ydFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgY29tbWFuZDogJ2Nvbm5lY3QnLFxuICAgICAgICAgICAgICAgIHNldF90Y3Bfbm9kZWxheTogdHJ1ZVxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgaWYgKHByb3h5VXJsLnVzZXJuYW1lIHx8IHByb3h5VXJsLnBhc3N3b3JkKSB7XG4gICAgICAgICAgICAgICAgY29ubmVjdGlvbk9wdHMucHJveHkudXNlcklkID0gcHJveHlVcmwudXNlcm5hbWU7XG4gICAgICAgICAgICAgICAgY29ubmVjdGlvbk9wdHMucHJveHkucGFzc3dvcmQgPSBwcm94eVVybC5wYXNzd29yZDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBjb25zdCBpbmZvID0gYXdhaXQgU29ja3NDbGllbnQuY3JlYXRlQ29ubmVjdGlvbihjb25uZWN0aW9uT3B0cyk7XG4gICAgICAgICAgICAgICAgaWYgKGluZm8gJiYgaW5mby5zb2NrZXQpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHByb3h5VXJsLnBhc3N3b3JkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwcm94eVVybC5wYXNzd29yZCA9ICcoaGlkZGVuKSc7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oe1xuICAgICAgICAgICAgICAgICAgICAgICAgbXNnOiAnRXN0YWJsaXNoZWQgYSBzb2NrZXQgdmlhIFNPQ0tTIHByb3h5JyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb3h5VXJsOiBwcm94eVVybC5ocmVmLFxuICAgICAgICAgICAgICAgICAgICAgICAgcG9ydCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGhvc3RcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBpbmZvLnNvY2tldDtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgIGlmIChwcm94eVVybC5wYXNzd29yZCkge1xuICAgICAgICAgICAgICAgICAgICBwcm94eVVybC5wYXNzd29yZCA9ICcoaGlkZGVuKSc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcih7XG4gICAgICAgICAgICAgICAgICAgIG1zZzogJ0ZhaWxlZCB0byBlc3RhYmxpc2ggYSBzb2NrZXQgdmlhIFNPQ0tTIHByb3h5JyxcbiAgICAgICAgICAgICAgICAgICAgcHJveHlVcmw6IHByb3h5VXJsLmhyZWYsXG4gICAgICAgICAgICAgICAgICAgIHBvcnQsXG4gICAgICAgICAgICAgICAgICAgIGhvc3QsXG4gICAgICAgICAgICAgICAgICAgIGVyclxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn07XG5cbm1vZHVsZS5leHBvcnRzID0geyBwcm94eUNvbm5lY3Rpb24gfTtcbiJdLCJuYW1lcyI6W10sImlnbm9yZUxpc3QiOlswXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(rsc)/./node_modules/imapflow/lib/proxy-connection.js\n");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "(rsc)/./node_modules/imapflow/lib/search-compiler.js":
|
|
/*!******************************************************!*\
|
|
!*** ./node_modules/imapflow/lib/search-compiler.js ***!
|
|
\******************************************************/
|
|
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
|
|
|
|
eval("\n\nconst { formatDate, formatFlag, canUseFlag } = __webpack_require__(/*! ./tools.js */ \"(rsc)/./node_modules/imapflow/lib/tools.js\");\n\nlet setBoolOpt = (attributes, term, value) => {\n if (!value) {\n if (/^un/i.test(term)) {\n term = term.slice(2);\n } else {\n term = 'UN' + term;\n }\n }\n\n attributes.push({ type: 'ATOM', value: term.toUpperCase() });\n};\n\nlet setOpt = (attributes, term, value, type) => {\n type = type || 'ATOM';\n\n if (value === false || value === null) {\n attributes.push({ type, value: 'NOT' });\n }\n\n attributes.push({ type, value: term.toUpperCase() });\n\n if (Array.isArray(value)) {\n value.forEach(entry => attributes.push({ type, value: (entry || '').toString() }));\n } else {\n attributes.push({ type, value: value.toString() });\n }\n};\n\nlet processDateField = (attributes, term, value) => {\n let date = formatDate(value);\n if (!date) {\n return;\n }\n\n setOpt(attributes, term, date);\n};\n\nlet isUnicodeString = str => {\n if (!str || typeof str !== 'string') {\n return false;\n }\n\n return Buffer.byteLength(str) !== str.length;\n};\n\nmodule.exports.searchCompiler = (connection, query) => {\n const attributes = [];\n\n let hasUnicode = false;\n const mailbox = connection.mailbox;\n\n const walk = params => {\n Object.keys(params || {}).forEach(term => {\n switch (term.toUpperCase()) {\n case 'SEQ': // custom key for sequence range\n {\n let value = params[term];\n if (typeof value === 'number') {\n value = value.toString();\n }\n if (typeof value === 'string' && /^\\S+$/.test(value)) {\n attributes.push({ type: 'SEQUENCE', value });\n }\n }\n break;\n\n case 'ANSWERED':\n case 'DELETED':\n case 'DRAFT':\n case 'FLAGGED':\n case 'SEEN':\n case 'UNANSWERED':\n case 'UNDELETED':\n case 'UNDRAFT':\n case 'UNFLAGGED':\n case 'UNSEEN':\n // toggles UN-prefix for falsy values\n setBoolOpt(attributes, term, !!params[term]);\n break;\n\n case 'ALL':\n case 'NEW':\n case 'OLD':\n case 'RECENT':\n if (params[term]) {\n setBoolOpt(attributes, term, true);\n }\n break;\n\n case 'LARGER':\n case 'SMALLER':\n case 'MODSEQ':\n if (params[term]) {\n setOpt(attributes, term, params[term]);\n }\n break;\n\n case 'BCC':\n case 'BODY':\n case 'CC':\n case 'FROM':\n case 'SUBJECT':\n case 'TEXT':\n case 'TO':\n if (isUnicodeString(params[term])) {\n hasUnicode = true;\n }\n if (params[term]) {\n setOpt(attributes, term, params[term]);\n }\n break;\n\n case 'UID':\n if (params[term]) {\n setOpt(attributes, term, params[term], 'SEQUENCE');\n }\n break;\n\n case 'EMAILID':\n if (connection.capabilities.has('OBJECTID')) {\n setOpt(attributes, 'EMAILID', params[term]);\n } else if (connection.capabilities.has('X-GM-EXT-1')) {\n setOpt(attributes, 'X-GM-MSGID', params[term]);\n }\n break;\n\n case 'THREADID':\n if (connection.capabilities.has('OBJECTID')) {\n setOpt(attributes, 'THREADID', params[term]);\n } else if (connection.capabilities.has('X-GM-EXT-1')) {\n setOpt(attributes, 'X-GM-THRID', params[term]);\n }\n break;\n\n case 'GMRAW':\n case 'GMAILRAW': // alias for GMRAW\n if (connection.capabilities.has('X-GM-EXT-1')) {\n if (isUnicodeString(params[term])) {\n hasUnicode = true;\n }\n setOpt(attributes, 'X-GM-RAW', params[term]);\n } else {\n let error = new Error('Server does not support X-GM-EXT-1 extension required for X-GM-RAW');\n error.code = 'MissingServerExtension';\n throw error;\n }\n break;\n\n case 'BEFORE':\n case 'ON':\n case 'SINCE':\n case 'SENTBEFORE':\n case 'SENTON':\n case 'SENTSINCE':\n processDateField(attributes, term, params[term]);\n break;\n\n case 'KEYWORD':\n case 'UNKEYWORD':\n {\n let flag = formatFlag(params[term]);\n if (canUseFlag(mailbox, flag) || mailbox.flags.has(flag)) {\n setOpt(attributes, term, flag);\n }\n }\n break;\n\n case 'HEADER':\n if (params[term] && typeof params[term] === 'object') {\n Object.keys(params[term]).forEach(header => {\n let value = params[term][header];\n if (value === true) {\n value = '';\n }\n\n if (typeof value !== 'string') {\n return;\n }\n\n if (isUnicodeString(value)) {\n hasUnicode = true;\n }\n\n setOpt(attributes, term, [header.toUpperCase().trim(), value]);\n });\n }\n break;\n\n case 'OR':\n {\n if (!params[term] || !Array.isArray(params[term]) || !params[term].length) {\n break;\n }\n\n if (params[term].length === 1) {\n if (typeof params[term][0] === 'object' && params[term][0]) {\n walk(params[term][0]);\n }\n break;\n }\n\n // OR values has to be grouped by 2\n // OR conditional1 conditional2\n let genOrTree = list => {\n let group = false;\n let groups = [];\n\n list.forEach((entry, i) => {\n if (i % 2 === 0) {\n group = [entry];\n } else {\n group.push(entry);\n groups.push(group);\n group = false;\n }\n });\n\n if (group && group.length) {\n while (group.length === 1 && Array.isArray(group[0])) {\n group = group[0];\n }\n\n groups.push(group);\n }\n\n while (groups.length > 2) {\n groups = genOrTree(groups);\n }\n\n while (groups.length === 1 && Array.isArray(groups[0])) {\n groups = groups[0];\n }\n\n return groups;\n };\n\n let walkOrTree = entry => {\n if (Array.isArray(entry)) {\n if (entry.length > 1) {\n attributes.push({ type: 'ATOM', value: 'OR' });\n }\n entry.forEach(walkOrTree);\n return;\n }\n if (entry && typeof entry === 'object') {\n walk(entry);\n }\n };\n walkOrTree(genOrTree(params[term]));\n }\n break;\n }\n });\n };\n\n walk(query);\n\n if (hasUnicode && !connection.enabled.has('UTF8=ACCEPT')) {\n // Prepend search query with `CHARSET UTF-8`\n attributes.unshift({ type: 'ATOM', value: 'UTF-8' });\n attributes.unshift({ type: 'ATOM', value: 'CHARSET' });\n }\n\n return attributes;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHJzYykvLi9ub2RlX21vZHVsZXMvaW1hcGZsb3cvbGliL3NlYXJjaC1jb21waWxlci5qcyIsIm1hcHBpbmdzIjoiQUFBYTs7QUFFYixRQUFRLHFDQUFxQyxFQUFFLG1CQUFPLENBQUMsOERBQVk7O0FBRW5FO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTs7QUFFQSxzQkFBc0IseUNBQXlDO0FBQy9EOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSwwQkFBMEIsb0JBQW9CO0FBQzlDOztBQUVBLHNCQUFzQixpQ0FBaUM7O0FBRXZEO0FBQ0EsaURBQWlELHVDQUF1QztBQUN4RixNQUFNO0FBQ04sMEJBQTBCLCtCQUErQjtBQUN6RDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBLDZCQUE2QjtBQUM3Qjs7QUFFQTtBQUNBOztBQUVBO0FBQ0EsZ0NBQWdDO0FBQ2hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4Q0FBOEMseUJBQXlCO0FBQ3ZFO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0I7QUFDdEI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQjtBQUN0QjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0I7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EseUJBQXlCO0FBQ3pCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxrQ0FBa0M7QUFDbEM7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2QkFBNkI7O0FBRTdCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLHNEQUFzRCwyQkFBMkI7QUFDakY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUOztBQUVBOztBQUVBO0FBQ0E7QUFDQSw2QkFBNkIsOEJBQThCO0FBQzNELDZCQUE2QixnQ0FBZ0M7QUFDN0Q7O0FBRUE7QUFDQSIsInNvdXJjZXMiOlsiL2hvbWUvYWxtYS9uZXh0Z2VuL05lYWgtbWFpbC9ub2RlX21vZHVsZXMvaW1hcGZsb3cvbGliL3NlYXJjaC1jb21waWxlci5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbmNvbnN0IHsgZm9ybWF0RGF0ZSwgZm9ybWF0RmxhZywgY2FuVXNlRmxhZyB9ID0gcmVxdWlyZSgnLi90b29scy5qcycpO1xuXG5sZXQgc2V0Qm9vbE9wdCA9IChhdHRyaWJ1dGVzLCB0ZXJtLCB2YWx1ZSkgPT4ge1xuICAgIGlmICghdmFsdWUpIHtcbiAgICAgICAgaWYgKC9edW4vaS50ZXN0KHRlcm0pKSB7XG4gICAgICAgICAgICB0ZXJtID0gdGVybS5zbGljZSgyKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRlcm0gPSAnVU4nICsgdGVybTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGF0dHJpYnV0ZXMucHVzaCh7IHR5cGU6ICdBVE9NJywgdmFsdWU6IHRlcm0udG9VcHBlckNhc2UoKSB9KTtcbn07XG5cbmxldCBzZXRPcHQgPSAoYXR0cmlidXRlcywgdGVybSwgdmFsdWUsIHR5cGUpID0+IHtcbiAgICB0eXBlID0gdHlwZSB8fCAnQVRPTSc7XG5cbiAgICBpZiAodmFsdWUgPT09IGZhbHNlIHx8IHZhbHVlID09PSBudWxsKSB7XG4gICAgICAgIGF0dHJpYnV0ZXMucHVzaCh7IHR5cGUsIHZhbHVlOiAnTk9UJyB9KTtcbiAgICB9XG5cbiAgICBhdHRyaWJ1dGVzLnB1c2goeyB0eXBlLCB2YWx1ZTogdGVybS50b1VwcGVyQ2FzZSgpIH0pO1xuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgIHZhbHVlLmZvckVhY2goZW50cnkgPT4gYXR0cmlidXRlcy5wdXNoKHsgdHlwZSwgdmFsdWU6IChlbnRyeSB8fCAnJykudG9TdHJpbmcoKSB9KSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgYXR0cmlidXRlcy5wdXNoKHsgdHlwZSwgdmFsdWU6IHZhbHVlLnRvU3RyaW5nKCkgfSk7XG4gICAgfVxufTtcblxubGV0IHByb2Nlc3NEYXRlRmllbGQgPSAoYXR0cmlidXRlcywgdGVybSwgdmFsdWUpID0+IHtcbiAgICBsZXQgZGF0ZSA9IGZvcm1hdERhdGUodmFsdWUpO1xuICAgIGlmICghZGF0ZSkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgc2V0T3B0KGF0dHJpYnV0ZXMsIHRlcm0sIGRhdGUpO1xufTtcblxubGV0IGlzVW5pY29kZVN0cmluZyA9IHN0ciA9PiB7XG4gICAgaWYgKCFzdHIgfHwgdHlwZW9mIHN0ciAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiBCdWZmZXIuYnl0ZUxlbmd0aChzdHIpICE9PSBzdHIubGVuZ3RoO1xufTtcblxubW9kdWxlLmV4cG9ydHMuc2VhcmNoQ29tcGlsZXIgPSAoY29ubmVjdGlvbiwgcXVlcnkpID0+IHtcbiAgICBjb25zdCBhdHRyaWJ1dGVzID0gW107XG5cbiAgICBsZXQgaGFzVW5pY29kZSA9IGZhbHNlO1xuICAgIGNvbnN0IG1haWxib3ggPSBjb25uZWN0aW9uLm1haWxib3g7XG5cbiAgICBjb25zdCB3YWxrID0gcGFyYW1zID0+IHtcbiAgICAgICAgT2JqZWN0LmtleXMocGFyYW1zIHx8IHt9KS5mb3JFYWNoKHRlcm0gPT4ge1xuICAgICAgICAgICAgc3dpdGNoICh0ZXJtLnRvVXBwZXJDYXNlKCkpIHtcbiAgICAgICAgICAgICAgICBjYXNlICdTRVEnOiAvLyBjdXN0b20ga2V5IGZvciBzZXF1ZW5jZSByYW5nZVxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgdmFsdWUgPSBwYXJhbXNbdGVybV07XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsdWUudG9TdHJpbmcoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnICYmIC9eXFxTKyQvLnRlc3QodmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlcy5wdXNoKHsgdHlwZTogJ1NFUVVFTkNFJywgdmFsdWUgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgICBjYXNlICdBTlNXRVJFRCc6XG4gICAgICAgICAgICAgICAgY2FzZSAnREVMRVRFRCc6XG4gICAgICAgICAgICAgICAgY2FzZSAnRFJBRlQnOlxuICAgICAgICAgICAgICAgIGNhc2UgJ0ZMQUdHRUQnOlxuICAgICAgICAgICAgICAgIGNhc2UgJ1NFRU4nOlxuICAgICAgICAgICAgICAgIGNhc2UgJ1VOQU5TV0VSRUQnOlxuICAgICAgICAgICAgICAgIGNhc2UgJ1VOREVMRVRFRCc6XG4gICAgICAgICAgICAgICAgY2FzZSAnVU5EUkFGVCc6XG4gICAgICAgICAgICAgICAgY2FzZSAnVU5GTEFHR0VEJzpcbiAgICAgICAgICAgICAgICBjYXNlICdVTlNFRU4nOlxuICAgICAgICAgICAgICAgICAgICAvLyB0b2dnbGVzIFVOLXByZWZpeCBmb3IgZmFsc3kgdmFsdWVzXG4gICAgICAgICAgICAgICAgICAgIHNldEJvb2xPcHQoYXR0cmlidXRlcywgdGVybSwgISFwYXJhbXNbdGVybV0pO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgIGNhc2UgJ0FMTCc6XG4gICAgICAgICAgICAgICAgY2FzZSAnTkVXJzpcbiAgICAgICAgICAgICAgICBjYXNlICdPTEQnOlxuICAgICAgICAgICAgICAgIGNhc2UgJ1JFQ0VOVCc6XG4gICAgICAgICAgICAgICAgICAgIGlmIChwYXJhbXNbdGVybV0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldEJvb2xPcHQoYXR0cmlidXRlcywgdGVybSwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgICBjYXNlICdMQVJHRVInOlxuICAgICAgICAgICAgICAgIGNhc2UgJ1NNQUxMRVInOlxuICAgICAgICAgICAgICAgIGNhc2UgJ01PRFNFUSc6XG4gICAgICAgICAgICAgICAgICAgIGlmIChwYXJhbXNbdGVybV0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldE9wdChhdHRyaWJ1dGVzLCB0ZXJtLCBwYXJhbXNbdGVybV0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgY2FzZSAnQkNDJzpcbiAgICAgICAgICAgICAgICBjYXNlICdCT0RZJzpcbiAgICAgICAgICAgICAgICBjYXNlICdDQyc6XG4gICAgICAgICAgICAgICAgY2FzZSAnRlJPTSc6XG4gICAgICAgICAgICAgICAgY2FzZSAnU1VCSkVDVCc6XG4gICAgICAgICAgICAgICAgY2FzZSAnVEVYVCc6XG4gICAgICAgICAgICAgICAgY2FzZSAnVE8nOlxuICAgICAgICAgICAgICAgICAgICBpZiAoaXNVbmljb2RlU3RyaW5nKHBhcmFtc1t0ZXJtXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGhhc1VuaWNvZGUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChwYXJhbXNbdGVybV0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldE9wdChhdHRyaWJ1dGVzLCB0ZXJtLCBwYXJhbXNbdGVybV0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgY2FzZSAnVUlEJzpcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmFtc1t0ZXJtXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2V0T3B0KGF0dHJpYnV0ZXMsIHRlcm0sIHBhcmFtc1t0ZXJtXSwgJ1NFUVVFTkNFJyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgICBjYXNlICdFTUFJTElEJzpcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbm5lY3Rpb24uY2FwYWJpbGl0aWVzLmhhcygnT0JKRUNUSUQnKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2V0T3B0KGF0dHJpYnV0ZXMsICdFTUFJTElEJywgcGFyYW1zW3Rlcm1dKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjb25uZWN0aW9uLmNhcGFiaWxpdGllcy5oYXMoJ1gtR00tRVhULTEnKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2V0T3B0KGF0dHJpYnV0ZXMsICdYLUdNLU1TR0lEJywgcGFyYW1zW3Rlcm1dKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgIGNhc2UgJ1RIUkVBRElEJzpcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbm5lY3Rpb24uY2FwYWJpbGl0aWVzLmhhcygnT0JKRUNUSUQnKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2V0T3B0KGF0dHJpYnV0ZXMsICdUSFJFQURJRCcsIHBhcmFtc1t0ZXJtXSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY29ubmVjdGlvbi5jYXBhYmlsaXRpZXMuaGFzKCdYLUdNLUVYVC0xJykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldE9wdChhdHRyaWJ1dGVzLCAnWC1HTS1USFJJRCcsIHBhcmFtc1t0ZXJtXSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgICBjYXNlICdHTVJBVyc6XG4gICAgICAgICAgICAgICAgY2FzZSAnR01BSUxSQVcnOiAvLyBhbGlhcyBmb3IgR01SQVdcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbm5lY3Rpb24uY2FwYWJpbGl0aWVzLmhhcygnWC1HTS1FWFQtMScpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNVbmljb2RlU3RyaW5nKHBhcmFtc1t0ZXJtXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNVbmljb2RlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHNldE9wdChhdHRyaWJ1dGVzLCAnWC1HTS1SQVcnLCBwYXJhbXNbdGVybV0pO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGVycm9yID0gbmV3IEVycm9yKCdTZXJ2ZXIgZG9lcyBub3Qgc3VwcG9ydCBYLUdNLUVYVC0xIGV4dGVuc2lvbiByZXF1aXJlZCBmb3IgWC1HTS1SQVcnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yLmNvZGUgPSAnTWlzc2luZ1NlcnZlckV4dGVuc2lvbic7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgIGNhc2UgJ0JFRk9SRSc6XG4gICAgICAgICAgICAgICAgY2FzZSAnT04nOlxuICAgICAgICAgICAgICAgIGNhc2UgJ1NJTkNFJzpcbiAgICAgICAgICAgICAgICBjYXNlICdTRU5UQkVGT1JFJzpcbiAgICAgICAgICAgICAgICBjYXNlICdTRU5UT04nOlxuICAgICAgICAgICAgICAgIGNhc2UgJ1NFTlRTSU5DRSc6XG4gICAgICAgICAgICAgICAgICAgIHByb2Nlc3NEYXRlRmllbGQoYXR0cmlidXRlcywgdGVybSwgcGFyYW1zW3Rlcm1dKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgICBjYXNlICdLRVlXT1JEJzpcbiAgICAgICAgICAgICAgICBjYXNlICdVTktFWVdPUkQnOlxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgZmxhZyA9IGZvcm1hdEZsYWcocGFyYW1zW3Rlcm1dKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjYW5Vc2VGbGFnKG1haWxib3gsIGZsYWcpIHx8IG1haWxib3guZmxhZ3MuaGFzKGZsYWcpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0T3B0KGF0dHJpYnV0ZXMsIHRlcm0sIGZsYWcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgY2FzZSAnSEVBREVSJzpcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmFtc1t0ZXJtXSAmJiB0eXBlb2YgcGFyYW1zW3Rlcm1dID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmtleXMocGFyYW1zW3Rlcm1dKS5mb3JFYWNoKGhlYWRlciA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHZhbHVlID0gcGFyYW1zW3Rlcm1dW2hlYWRlcl07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gJyc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc1VuaWNvZGVTdHJpbmcodmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc1VuaWNvZGUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldE9wdChhdHRyaWJ1dGVzLCB0ZXJtLCBbaGVhZGVyLnRvVXBwZXJDYXNlKCkudHJpbSgpLCB2YWx1ZV0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgICBjYXNlICdPUic6XG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcGFyYW1zW3Rlcm1dIHx8ICFBcnJheS5pc0FycmF5KHBhcmFtc1t0ZXJtXSkgfHwgIXBhcmFtc1t0ZXJtXS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmFtc1t0ZXJtXS5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHBhcmFtc1t0ZXJtXVswXSA9PT0gJ29iamVjdCcgJiYgcGFyYW1zW3Rlcm1dWzBdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhbGsocGFyYW1zW3Rlcm1dWzBdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIE9SIHZhbHVlcyBoYXMgdG8gYmUgZ3JvdXBlZCBieSAyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBPUiBjb25kaXRpb25hbDEgY29uZGl0aW9uYWwyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgZ2VuT3JUcmVlID0gbGlzdCA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGdyb3VwID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGdyb3VwcyA9IFtdO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdC5mb3JFYWNoKChlbnRyeSwgaSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaSAlIDIgPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwID0gW2VudHJ5XTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwLnB1c2goZW50cnkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBzLnB1c2goZ3JvdXApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXAgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGdyb3VwICYmIGdyb3VwLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoZ3JvdXAubGVuZ3RoID09PSAxICYmIEFycmF5LmlzQXJyYXkoZ3JvdXBbMF0pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncm91cCA9IGdyb3VwWzBdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBzLnB1c2goZ3JvdXApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChncm91cHMubGVuZ3RoID4gMikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncm91cHMgPSBnZW5PclRyZWUoZ3JvdXBzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoZ3JvdXBzLmxlbmd0aCA9PT0gMSAmJiBBcnJheS5pc0FycmF5KGdyb3Vwc1swXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBzID0gZ3JvdXBzWzBdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBncm91cHM7XG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgd2Fsa09yVHJlZSA9IGVudHJ5ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShlbnRyeSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVudHJ5Lmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXMucHVzaCh7IHR5cGU6ICdBVE9NJywgdmFsdWU6ICdPUicgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cnkuZm9yRWFjaCh3YWxrT3JUcmVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZW50cnkgJiYgdHlwZW9mIGVudHJ5ID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YWxrKGVudHJ5KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgd2Fsa09yVHJlZShnZW5PclRyZWUocGFyYW1zW3Rlcm1dKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH07XG5cbiAgICB3YWxrKHF1ZXJ5KTtcblxuICAgIGlmIChoYXNVbmljb2RlICYmICFjb25uZWN0aW9uLmVuYWJsZWQuaGFzKCdVVEY4PUFDQ0VQVCcpKSB7XG4gICAgICAgIC8vIFByZXBlbmQgc2VhcmNoIHF1ZXJ5IHdpdGggYENIQVJTRVQgVVRGLThgXG4gICAgICAgIGF0dHJpYnV0ZXMudW5zaGlmdCh7IHR5cGU6ICdBVE9NJywgdmFsdWU6ICdVVEYtOCcgfSk7XG4gICAgICAgIGF0dHJpYnV0ZXMudW5zaGlmdCh7IHR5cGU6ICdBVE9NJywgdmFsdWU6ICdDSEFSU0VUJyB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gYXR0cmlidXRlcztcbn07XG4iXSwibmFtZXMiOltdLCJpZ25vcmVMaXN0IjpbMF0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(rsc)/./node_modules/imapflow/lib/search-compiler.js\n");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "(rsc)/./node_modules/imapflow/lib/special-use.js":
|
|
/*!**************************************************!*\
|
|
!*** ./node_modules/imapflow/lib/special-use.js ***!
|
|
\**************************************************/
|
|
/***/ ((module) => {
|
|
|
|
eval("\n\nmodule.exports = {\n flags: ['\\\\All', '\\\\Archive', '\\\\Drafts', '\\\\Flagged', '\\\\Junk', '\\\\Sent', '\\\\Trash'],\n names: {\n '\\\\Sent': [\n 'aika',\n 'bidaliak',\n 'bidalita',\n 'dihantar',\n 'e rometsweng',\n 'e tindami',\n 'elküldött',\n 'elküldöttek',\n 'elementos enviados',\n 'éléments envoyés',\n 'enviadas',\n 'enviadas',\n 'enviados',\n 'enviats',\n 'envoyés',\n 'ethunyelweyo',\n 'expediate',\n 'ezipuru',\n 'gesendete',\n 'gesendete elemente',\n 'gestuur',\n 'gönderilmiş öğeler',\n 'göndərilənlər',\n 'iberilen',\n 'inviati',\n 'išsiųstieji',\n 'kuthunyelwe',\n 'lasa',\n 'lähetetyt',\n 'messages envoyés',\n 'naipadala',\n 'nalefa',\n 'napadala',\n 'nosūtītās ziņas',\n 'odeslané',\n 'odeslaná pošta',\n 'padala',\n 'poslane',\n 'poslano',\n 'poslano',\n 'poslané',\n 'poslato',\n 'saadetud',\n 'saadetud kirjad',\n 'saadetud üksused',\n 'sendt',\n 'sendt',\n 'sent',\n 'sent items',\n 'sent messages',\n 'sända poster',\n 'sänt',\n 'terkirim',\n 'ti fi ranṣẹ',\n 'të dërguara',\n 'verzonden',\n 'vilivyotumwa',\n 'wysłane',\n 'đã gửi',\n 'σταλθέντα',\n 'жиберилген',\n 'жіберілгендер',\n 'изпратени',\n 'илгээсэн',\n 'ирсол шуд',\n 'испратено',\n 'надіслані',\n 'отправленные',\n 'пасланыя',\n 'юборилган',\n 'ուղարկված',\n 'נשלחו',\n 'פריטים שנשלחו',\n 'المرسلة',\n 'بھیجے گئے',\n 'سوزمژہ',\n 'لېګل شوی',\n 'موارد ارسال شده',\n 'पाठविले',\n 'पाठविलेले',\n 'प्रेषित',\n 'भेजा गया',\n 'প্রেরিত',\n 'প্রেরিত',\n 'প্ৰেৰিত',\n 'ਭੇਜੇ',\n 'મોકલેલા',\n 'ପଠାଗଲା',\n 'அனுப்பியவை',\n 'పంపించబడింది',\n 'ಕಳುಹಿಸಲಾದ',\n 'അയച്ചു',\n 'යැවු පණිවුඩ',\n 'ส่งแล้ว',\n 'გაგზავნილი',\n 'የተላኩ',\n 'បានផ្ញើ',\n '寄件備份',\n '寄件備份',\n '已发信息',\n '送信済みメール',\n '발신 메시지',\n '보낸 편지함'\n ],\n '\\\\Trash': [\n 'articole șterse',\n 'bin',\n 'borttagna objekt',\n 'deleted',\n 'deleted items',\n 'deleted messages',\n 'elementi eliminati',\n 'elementos borrados',\n 'elementos eliminados',\n 'gelöschte objekte',\n 'gelöschte elemente',\n 'item dipadam',\n 'itens apagados',\n 'itens excluídos',\n 'kustutatud üksused',\n 'mục đã xóa',\n 'odstraněné položky',\n 'odstraněná pošta',\n 'pesan terhapus',\n 'poistetut',\n 'praht',\n 'prügikast',\n 'silinmiş öğeler',\n 'slettede beskeder',\n 'slettede elementer',\n 'trash',\n 'törölt elemek',\n 'törölt',\n 'usunięte wiadomości',\n 'verwijderde items',\n 'vymazané správy',\n 'éléments supprimés',\n 'видалені',\n 'жойылғандар',\n 'удаленные',\n 'פריטים שנמחקו',\n 'العناصر المحذوفة',\n 'موارد حذف شده',\n 'รายการที่ลบ',\n '已删除邮件',\n '已刪除項目',\n '已刪除項目'\n ],\n '\\\\Junk': [\n 'bulk mail',\n 'correo no deseado',\n 'courrier indésirable',\n 'istenmeyen',\n 'istenmeyen e-posta',\n 'junk',\n 'junk e-mail',\n 'junk email',\n 'junk-e-mail',\n 'levélszemét',\n 'nevyžiadaná pošta',\n 'nevyžádaná pošta',\n 'no deseado',\n 'posta indesiderata',\n 'pourriel',\n 'roskaposti',\n 'rämpspost',\n 'skräppost',\n 'spam',\n 'spam',\n 'spamowanie',\n 'søppelpost',\n 'thư rác',\n 'wiadomości-śmieci',\n 'спам',\n 'דואר זבל',\n 'الرسائل العشوائية',\n 'هرزنامه',\n 'สแปม',\n '垃圾郵件',\n '垃圾邮件',\n '垃圾電郵'\n ],\n '\\\\Drafts': [\n 'ba brouillon',\n 'borrador',\n 'borrador',\n 'borradores',\n 'bozze',\n 'brouillons',\n 'bản thảo',\n 'ciorne',\n 'concepten',\n 'draf',\n 'draft',\n 'drafts',\n 'drög',\n 'entwürfe',\n 'esborranys',\n 'garalamalar',\n 'ihe edeturu',\n 'iidrafti',\n 'izinhlaka',\n 'juodraščiai',\n 'kladd',\n 'kladder',\n 'koncepty',\n 'koncepty',\n 'konsep',\n 'konsepte',\n 'kopie robocze',\n 'layihələr',\n 'luonnokset',\n 'melnraksti',\n 'meralo',\n 'mesazhe të padërguara',\n 'mga draft',\n 'mustandid',\n 'nacrti',\n 'nacrti',\n 'osnutki',\n 'piszkozatok',\n 'rascunhos',\n 'rasimu',\n 'skice',\n 'taslaklar',\n 'tsararrun saƙonni',\n 'utkast',\n 'vakiraoka',\n 'vázlatok',\n 'zirriborroak',\n 'àwọn àkọpamọ́',\n 'πρόχειρα',\n 'жобалар',\n 'нацрти',\n 'нооргууд',\n 'сиёҳнавис',\n 'хомаки хатлар',\n 'чарнавікі',\n 'чернетки',\n 'чернови',\n 'черновики',\n 'черновиктер',\n 'սևագրեր',\n 'טיוטות',\n 'مسودات',\n 'مسودات',\n 'موسودې',\n 'پیش نویسها',\n 'ڈرافٹ/',\n 'ड्राफ़्ट',\n 'प्रारूप',\n 'খসড়া',\n 'খসড়া',\n 'ড্ৰাফ্ট',\n 'ਡ੍ਰਾਫਟ',\n 'ડ્રાફ્ટસ',\n 'ଡ୍ରାଫ୍ଟ',\n 'வரைவுகள்',\n 'చిత్తు ప్రతులు',\n 'ಕರಡುಗಳು',\n 'കരടുകള്',\n 'කෙටුම් පත්',\n 'ฉบับร่าง',\n 'მონახაზები',\n 'ረቂቆች',\n 'សារព្រាង',\n '下書き',\n '草稿',\n '草稿',\n '草稿',\n '임시 보관함'\n ],\n\n '\\\\Archive': ['archive']\n },\n\n specialUse(hasSpecialUseExtension, folder) {\n let result;\n\n if (hasSpecialUseExtension) {\n result = {\n flag: module.exports.flags.find(flag => folder.flags.has(flag)),\n source: 'extension'\n };\n }\n\n if (!result || !result.flag) {\n let name = folder.name\n .toLowerCase()\n .replace(/\\u200e/g, '')\n .trim();\n\n result = {\n flag: Object.keys(module.exports.names).find(flag => module.exports.names[flag].includes(name)),\n source: 'name'\n };\n }\n\n return result && result.flag ? result : { flag: null };\n }\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHJzYykvLi9ub2RlX21vZHVsZXMvaW1hcGZsb3cvbGliL3NwZWNpYWwtdXNlLmpzIiwibWFwcGluZ3MiOiJBQUFhOztBQUViO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLGtEQUFrRDtBQUNsRDtBQUNBIiwic291cmNlcyI6WyIvaG9tZS9hbG1hL25leHRnZW4vTmVhaC1tYWlsL25vZGVfbW9kdWxlcy9pbWFwZmxvdy9saWIvc3BlY2lhbC11c2UuanMiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgICBmbGFnczogWydcXFxcQWxsJywgJ1xcXFxBcmNoaXZlJywgJ1xcXFxEcmFmdHMnLCAnXFxcXEZsYWdnZWQnLCAnXFxcXEp1bmsnLCAnXFxcXFNlbnQnLCAnXFxcXFRyYXNoJ10sXG4gICAgbmFtZXM6IHtcbiAgICAgICAgJ1xcXFxTZW50JzogW1xuICAgICAgICAgICAgJ2Fpa2EnLFxuICAgICAgICAgICAgJ2JpZGFsaWFrJyxcbiAgICAgICAgICAgICdiaWRhbGl0YScsXG4gICAgICAgICAgICAnZGloYW50YXInLFxuICAgICAgICAgICAgJ2Ugcm9tZXRzd2VuZycsXG4gICAgICAgICAgICAnZSB0aW5kYW1pJyxcbiAgICAgICAgICAgICdlbGvDvGxkw7Z0dCcsXG4gICAgICAgICAgICAnZWxrw7xsZMO2dHRlaycsXG4gICAgICAgICAgICAnZWxlbWVudG9zIGVudmlhZG9zJyxcbiAgICAgICAgICAgICfDqWzDqW1lbnRzIGVudm95w6lzJyxcbiAgICAgICAgICAgICdlbnZpYWRhcycsXG4gICAgICAgICAgICAnZW52aWFkYXMnLFxuICAgICAgICAgICAgJ2VudmlhZG9zJyxcbiAgICAgICAgICAgICdlbnZpYXRzJyxcbiAgICAgICAgICAgICdlbnZvecOpcycsXG4gICAgICAgICAgICAnZXRodW55ZWx3ZXlvJyxcbiAgICAgICAgICAgICdleHBlZGlhdGUnLFxuICAgICAgICAgICAgJ2V6aXB1cnUnLFxuICAgICAgICAgICAgJ2dlc2VuZGV0ZScsXG4gICAgICAgICAgICAnZ2VzZW5kZXRlIGVsZW1lbnRlJyxcbiAgICAgICAgICAgICdnZXN0dXVyJyxcbiAgICAgICAgICAgICdnw7ZuZGVyaWxtacWfIMO2xJ9lbGVyJyxcbiAgICAgICAgICAgICdnw7ZuZMmZcmlsyZlubMmZcicsXG4gICAgICAgICAgICAnaWJlcmlsZW4nLFxuICAgICAgICAgICAgJ2ludmlhdGknLFxuICAgICAgICAgICAgJ2nFoXNpxbNzdGllamknLFxuICAgICAgICAgICAgJ2t1dGh1bnllbHdlJyxcbiAgICAgICAgICAgICdsYXNhJyxcbiAgICAgICAgICAgICdsw6RoZXRldHl0JyxcbiAgICAgICAgICAgICdtZXNzYWdlcyBlbnZvecOpcycsXG4gICAgICAgICAgICAnbmFpcGFkYWxhJyxcbiAgICAgICAgICAgICduYWxlZmEnLFxuICAgICAgICAgICAgJ25hcGFkYWxhJyxcbiAgICAgICAgICAgICdub3PFq3TEq3TEgXMgemnFhmFzJyxcbiAgICAgICAgICAgICdvZGVzbGFuw6knLFxuICAgICAgICAgICAgJ29kZXNsYW7DoSBwb8WhdGEnLFxuICAgICAgICAgICAgJ3BhZGFsYScsXG4gICAgICAgICAgICAncG9zbGFuZScsXG4gICAgICAgICAgICAncG9zbGFubycsXG4gICAgICAgICAgICAncG9zbGFubycsXG4gICAgICAgICAgICAncG9zbGFuw6knLFxuICAgICAgICAgICAgJ3Bvc2xhdG8nLFxuICAgICAgICAgICAgJ3NhYWRldHVkJyxcbiAgICAgICAgICAgICdzYWFkZXR1ZCBraXJqYWQnLFxuICAgICAgICAgICAgJ3NhYWRldHVkIMO8a3N1c2VkJyxcbiAgICAgICAgICAgICdzZW5kdCcsXG4gICAgICAgICAgICAnc2VuZHQnLFxuICAgICAgICAgICAgJ3NlbnQnLFxuICAgICAgICAgICAgJ3NlbnQgaXRlbXMnLFxuICAgICAgICAgICAgJ3NlbnQgbWVzc2FnZXMnLFxuICAgICAgICAgICAgJ3PDpG5kYSBwb3N0ZXInLFxuICAgICAgICAgICAgJ3PDpG50JyxcbiAgICAgICAgICAgICd0ZXJraXJpbScsXG4gICAgICAgICAgICAndGkgZmkgcmFu4bmj4bq5JyxcbiAgICAgICAgICAgICd0w6sgZMOrcmd1YXJhJyxcbiAgICAgICAgICAgICd2ZXJ6b25kZW4nLFxuICAgICAgICAgICAgJ3ZpbGl2eW90dW13YScsXG4gICAgICAgICAgICAnd3lzxYJhbmUnLFxuICAgICAgICAgICAgJ8SRw6MgZ+G7rWknLFxuICAgICAgICAgICAgJ8+Dz4TOsc67zrjOrc69z4TOsScsXG4gICAgICAgICAgICAn0LbQuNCx0LXRgNC40LvQs9C10L0nLFxuICAgICAgICAgICAgJ9C20ZbQsdC10YDRltC70LPQtdC90LTQtdGAJyxcbiAgICAgICAgICAgICfQuNC30L/RgNCw0YLQtdC90LgnLFxuICAgICAgICAgICAgJ9C40LvQs9GN0Y3RgdGN0L0nLFxuICAgICAgICAgICAgJ9C40YDRgdC+0Lsg0YjRg9C0JyxcbiAgICAgICAgICAgICfQuNGB0L/RgNCw0YLQtdC90L4nLFxuICAgICAgICAgICAgJ9C90LDQtNGW0YHQu9Cw0L3RlicsXG4gICAgICAgICAgICAn0L7RgtC/0YDQsNCy0LvQtdC90L3Ri9C1JyxcbiAgICAgICAgICAgICfQv9Cw0YHQu9Cw0L3Ri9GPJyxcbiAgICAgICAgICAgICfRjtCx0L7RgNC40LvQs9Cw0L0nLFxuICAgICAgICAgICAgJ9W41oLVstWh1oDVr9W+1aHVricsXG4gICAgICAgICAgICAn16DXqdec15fXlScsXG4gICAgICAgICAgICAn16TXqNeZ15jXmdedINep16DXqdec15fXlScsXG4gICAgICAgICAgICAn2KfZhNmF2LHYs9mE2KknLFxuICAgICAgICAgICAgJ9io2r7bjNis25Ig2q/YptuSJyxcbiAgICAgICAgICAgICfYs9mI2LLZhdqY24EnLFxuICAgICAgICAgICAgJ9mE25Daq9mEINi02YjbjCcsXG4gICAgICAgICAgICAn2YXZiNin2LHYryDYp9ix2LPYp9mEINi02K/ZhycsXG4gICAgICAgICAgICAn4KSq4KS+4KSg4KS14KS/4KSy4KWHJyxcbiAgICAgICAgICAgICfgpKrgpL7gpKDgpLXgpL/gpLLgpYfgpLLgpYcnLFxuICAgICAgICAgICAgJ+CkquCljeCksOClh+Ckt+Ckv+CkpCcsXG4gICAgICAgICAgICAn4KSt4KWH4KSc4KS+IOCkl+Ckr+CkvicsXG4gICAgICAgICAgICAn4Kaq4KeN4Kaw4KeH4Kaw4Ka/4KakJyxcbiAgICAgICAgICAgICfgpqrgp43gprDgp4fgprDgpr/gpqQnLFxuICAgICAgICAgICAgJ+CmquCnjeCnsOCnh+CnsOCmv+CmpCcsXG4gICAgICAgICAgICAn4Kit4KmH4Kic4KmHJyxcbiAgICAgICAgICAgICfgqq7gq4vgqpXgqrLgq4fgqrLgqr4nLFxuICAgICAgICAgICAgJ+CsquCsoOCsvuCsl+CssuCsvicsXG4gICAgICAgICAgICAn4K6F4K6p4K+B4K6q4K+N4K6q4K6/4K6v4K614K+IJyxcbiAgICAgICAgICAgICfgsKrgsILgsKrgsL/gsILgsJrgsKzgsKHgsL/gsILgsKbgsL8nLFxuICAgICAgICAgICAgJ+CyleCys+CzgeCyueCyv+CyuOCysuCyvuCypicsXG4gICAgICAgICAgICAn4LSF4LSv4LSa4LWN4LSa4LWBJyxcbiAgICAgICAgICAgICfgtrrgt5Dgt4Dgt5Qg4La04Lar4LeS4LeA4LeU4LapJyxcbiAgICAgICAgICAgICfguKrguYjguIfguYHguKXguYnguKcnLFxuICAgICAgICAgICAgJ+GDkuGDkOGDkuGDluGDkOGDleGDnOGDmOGDmuGDmCcsXG4gICAgICAgICAgICAn4Yuo4Ymw4YiL4YqpJyxcbiAgICAgICAgICAgICfhnpThnrbhnpPigIvhnpXhn5Lhnonhnr4nLFxuICAgICAgICAgICAgJ+WvhOS7tuWCmeS7vScsXG4gICAgICAgICAgICAn5a+E5Lu25YKZ5Lu9JyxcbiAgICAgICAgICAgICflt7Llj5Hkv6Hmga8nLFxuICAgICAgICAgICAgJ+mAgeS/oea4iOOBv+++ku+9sO++mScsXG4gICAgICAgICAgICAn67Cc7IugIOuplOyLnOyngCcsXG4gICAgICAgICAgICAn67O064K4IO2OuOyngO2VqCdcbiAgICAgICAgXSxcbiAgICAgICAgJ1xcXFxUcmFzaCc6IFtcbiAgICAgICAgICAgICdhcnRpY29sZSDImXRlcnNlJyxcbiAgICAgICAgICAgICdiaW4nLFxuICAgICAgICAgICAgJ2JvcnR0YWduYSBvYmpla3QnLFxuICAgICAgICAgICAgJ2RlbGV0ZWQnLFxuICAgICAgICAgICAgJ2RlbGV0ZWQgaXRlbXMnLFxuICAgICAgICAgICAgJ2RlbGV0ZWQgbWVzc2FnZXMnLFxuICAgICAgICAgICAgJ2VsZW1lbnRpIGVsaW1pbmF0aScsXG4gICAgICAgICAgICAnZWxlbWVudG9zIGJvcnJhZG9zJyxcbiAgICAgICAgICAgICdlbGVtZW50b3MgZWxpbWluYWRvcycsXG4gICAgICAgICAgICAnZ2Vsw7ZzY2h0ZSBvYmpla3RlJyxcbiAgICAgICAgICAgICdnZWzDtnNjaHRlIGVsZW1lbnRlJyxcbiAgICAgICAgICAgICdpdGVtIGRpcGFkYW0nLFxuICAgICAgICAgICAgJ2l0ZW5zIGFwYWdhZG9zJyxcbiAgICAgICAgICAgICdpdGVucyBleGNsdcOtZG9zJyxcbiAgICAgICAgICAgICdrdXN0dXRhdHVkIMO8a3N1c2VkJyxcbiAgICAgICAgICAgICdt4bulYyDEkcOjIHjDs2EnLFxuICAgICAgICAgICAgJ29kc3RyYW7Em27DqSBwb2xvxb5reScsXG4gICAgICAgICAgICAnb2RzdHJhbsSbbsOhIHBvxaF0YScsXG4gICAgICAgICAgICAncGVzYW4gdGVyaGFwdXMnLFxuICAgICAgICAgICAgJ3BvaXN0ZXR1dCcsXG4gICAgICAgICAgICAncHJhaHQnLFxuICAgICAgICAgICAgJ3Byw7xnaWthc3QnLFxuICAgICAgICAgICAgJ3NpbGlubWnFnyDDtsSfZWxlcicsXG4gICAgICAgICAgICAnc2xldHRlZGUgYmVza2VkZXInLFxuICAgICAgICAgICAgJ3NsZXR0ZWRlIGVsZW1lbnRlcicsXG4gICAgICAgICAgICAndHJhc2gnLFxuICAgICAgICAgICAgJ3TDtnLDtmx0IGVsZW1laycsXG4gICAgICAgICAgICAndMO2csO2bHQnLFxuICAgICAgICAgICAgJ3VzdW5pxJl0ZSB3aWFkb21vxZtjaScsXG4gICAgICAgICAgICAndmVyd2lqZGVyZGUgaXRlbXMnLFxuICAgICAgICAgICAgJ3Z5bWF6YW7DqSBzcHLDoXZ5JyxcbiAgICAgICAgICAgICfDqWzDqW1lbnRzIHN1cHByaW3DqXMnLFxuICAgICAgICAgICAgJ9Cy0LjQtNCw0LvQtdC90ZYnLFxuICAgICAgICAgICAgJ9C20L7QudGL0LvSk9Cw0L3QtNCw0YAnLFxuICAgICAgICAgICAgJ9GD0LTQsNC70LXQvdC90YvQtScsXG4gICAgICAgICAgICAn16TXqNeZ15jXmdedINep16DXnteX16fXlScsXG4gICAgICAgICAgICAn2KfZhNi52YbYp9i12LEg2KfZhNmF2K3YsNmI2YHYqScsXG4gICAgICAgICAgICAn2YXZiNin2LHYryDYrdiw2YEg2LTYr9mHJyxcbiAgICAgICAgICAgICfguKPguLLguKLguIHguLLguKPguJfguLXguYjguKXguJonLFxuICAgICAgICAgICAgJ+W3suWIoOmZpOmCruS7ticsXG4gICAgICAgICAgICAn5bey5Yiq6Zmk6aCF55uuJyxcbiAgICAgICAgICAgICflt7LliKrpmaTpoIXnm64nXG4gICAgICAgIF0sXG4gICAgICAgICdcXFxcSnVuayc6IFtcbiAgICAgICAgICAgICdidWxrIG1haWwnLFxuICAgICAgICAgICAgJ2NvcnJlbyBubyBkZXNlYWRvJyxcbiAgICAgICAgICAgICdjb3VycmllciBpbmTDqXNpcmFibGUnLFxuICAgICAgICAgICAgJ2lzdGVubWV5ZW4nLFxuICAgICAgICAgICAgJ2lzdGVubWV5ZW4gZS1wb3N0YScsXG4gICAgICAgICAgICAnanVuaycsXG4gICAgICAgICAgICAnanVuayBlLW1haWwnLFxuICAgICAgICAgICAgJ2p1bmsgZW1haWwnLFxuICAgICAgICAgICAgJ2p1bmstZS1tYWlsJyxcbiAgICAgICAgICAgICdsZXbDqWxzemVtw6l0JyxcbiAgICAgICAgICAgICduZXZ5xb5pYWRhbsOhIHBvxaF0YScsXG4gICAgICAgICAgICAnbmV2ecW+w6FkYW7DoSBwb8WhdGEnLFxuICAgICAgICAgICAgJ25vIGRlc2VhZG8nLFxuICAgICAgICAgICAgJ3Bvc3RhIGluZGVzaWRlcmF0YScsXG4gICAgICAgICAgICAncG91cnJpZWwnLFxuICAgICAgICAgICAgJ3Jvc2thcG9zdGknLFxuICAgICAgICAgICAgJ3LDpG1wc3Bvc3QnLFxuICAgICAgICAgICAgJ3NrcsOkcHBvc3QnLFxuICAgICAgICAgICAgJ3NwYW0nLFxuICAgICAgICAgICAgJ3NwYW0nLFxuICAgICAgICAgICAgJ3NwYW1vd2FuaWUnLFxuICAgICAgICAgICAgJ3PDuHBwZWxwb3N0JyxcbiAgICAgICAgICAgICd0aMawIHLDoWMnLFxuICAgICAgICAgICAgJ3dpYWRvbW/Fm2NpLcWbbWllY2knLFxuICAgICAgICAgICAgJ9GB0L/QsNC8JyxcbiAgICAgICAgICAgICfXk9eV15DXqCDXlteR15wnLFxuICAgICAgICAgICAgJ9in2YTYsdiz2KfYptmEINin2YTYudi02YjYp9im2YrYqScsXG4gICAgICAgICAgICAn2YfYsdiy2YbYp9mF2YcnLFxuICAgICAgICAgICAgJ+C4quC5geC4m+C4oScsXG4gICAgICAgICAgICAn5Z6D5Zy+6YO15Lu2JyxcbiAgICAgICAgICAgICflnoPlnL7pgq7ku7YnLFxuICAgICAgICAgICAgJ+Weg+Wcvumbu+mDtSdcbiAgICAgICAgXSxcbiAgICAgICAgJ1xcXFxEcmFmdHMnOiBbXG4gICAgICAgICAgICAnYmEgYnJvdWlsbG9uJyxcbiAgICAgICAgICAgICdib3JyYWRvcicsXG4gICAgICAgICAgICAnYm9ycmFkb3InLFxuICAgICAgICAgICAgJ2JvcnJhZG9yZXMnLFxuICAgICAgICAgICAgJ2JvenplJyxcbiAgICAgICAgICAgICdicm91aWxsb25zJyxcbiAgICAgICAgICAgICdi4bqjbiB0aOG6o28nLFxuICAgICAgICAgICAgJ2Npb3JuZScsXG4gICAgICAgICAgICAnY29uY2VwdGVuJyxcbiAgICAgICAgICAgICdkcmFmJyxcbiAgICAgICAgICAgICdkcmFmdCcsXG4gICAgICAgICAgICAnZHJhZnRzJyxcbiAgICAgICAgICAgICdkcsO2ZycsXG4gICAgICAgICAgICAnZW50d8O8cmZlJyxcbiAgICAgICAgICAgICdlc2JvcnJhbnlzJyxcbiAgICAgICAgICAgICdnYXJhbGFtYWxhcicsXG4gICAgICAgICAgICAnaWhlIGVkZXR1cnUnLFxuICAgICAgICAgICAgJ2lpZHJhZnRpJyxcbiAgICAgICAgICAgICdpemluaGxha2EnLFxuICAgICAgICAgICAgJ2p1b2RyYcWhxI1pYWknLFxuICAgICAgICAgICAgJ2tsYWRkJyxcbiAgICAgICAgICAgICdrbGFkZGVyJyxcbiAgICAgICAgICAgICdrb25jZXB0eScsXG4gICAgICAgICAgICAna29uY2VwdHknLFxuICAgICAgICAgICAgJ2tvbnNlcCcsXG4gICAgICAgICAgICAna29uc2VwdGUnLFxuICAgICAgICAgICAgJ2tvcGllIHJvYm9jemUnLFxuICAgICAgICAgICAgJ2xheWloyZlsyZlyJyxcbiAgICAgICAgICAgICdsdW9ubm9rc2V0JyxcbiAgICAgICAgICAgICdtZWxucmFrc3RpJyxcbiAgICAgICAgICAgICdtZXJhbG8nLFxuICAgICAgICAgICAgJ21lc2F6aGUgdMOrIHBhZMOrcmd1YXJhJyxcbiAgICAgICAgICAgICdtZ2EgZHJhZnQnLFxuICAgICAgICAgICAgJ211c3RhbmRpZCcsXG4gICAgICAgICAgICAnbmFjcnRpJyxcbiAgICAgICAgICAgICduYWNydGknLFxuICAgICAgICAgICAgJ29zbnV0a2knLFxuICAgICAgICAgICAgJ3Bpc3prb3phdG9rJyxcbiAgICAgICAgICAgICdyYXNjdW5ob3MnLFxuICAgICAgICAgICAgJ3Jhc2ltdScsXG4gICAgICAgICAgICAnc2tpY2UnLFxuICAgICAgICAgICAgJ3Rhc2xha2xhcicsXG4gICAgICAgICAgICAndHNhcmFycnVuIHNhxplvbm5pJyxcbiAgICAgICAgICAgICd1dGthc3QnLFxuICAgICAgICAgICAgJ3Zha2lyYW9rYScsXG4gICAgICAgICAgICAndsOhemxhdG9rJyxcbiAgICAgICAgICAgICd6aXJyaWJvcnJvYWsnLFxuICAgICAgICAgICAgJ8Ogd+G7jW4gw6Br4buNcGFt4buNzIEnLFxuICAgICAgICAgICAgJ8+Az4HPjM+HzrXOuc+BzrEnLFxuICAgICAgICAgICAgJ9C20L7QsdCw0LvQsNGAJyxcbiAgICAgICAgICAgICfQvdCw0YbRgNGC0LgnLFxuICAgICAgICAgICAgJ9C90L7QvtGA0LPRg9GD0LQnLFxuICAgICAgICAgICAgJ9GB0LjRkdKz0L3QsNCy0LjRgScsXG4gICAgICAgICAgICAn0YXQvtC80LDQutC4INGF0LDRgtC70LDRgCcsXG4gICAgICAgICAgICAn0YfQsNGA0L3QsNCy0ZbQutGWJyxcbiAgICAgICAgICAgICfRh9C10YDQvdC10YLQutC4JyxcbiAgICAgICAgICAgICfRh9C10YDQvdC+0LLQuCcsXG4gICAgICAgICAgICAn0YfQtdGA0L3QvtCy0LjQutC4JyxcbiAgICAgICAgICAgICfRh9C10YDQvdC+0LLQuNC60YLQtdGAJyxcbiAgICAgICAgICAgICfVvdaH1aHVo9aA1aXWgCcsXG4gICAgICAgICAgICAn15jXmdeV15jXldeqJyxcbiAgICAgICAgICAgICfZhdiz2YjYr9in2KonLFxuICAgICAgICAgICAgJ9mF2LPZiNiv2KfYqicsXG4gICAgICAgICAgICAn2YXZiNiz2YjYr9uQJyxcbiAgICAgICAgICAgICfZvtuM2LQg2YbZiNuM2LPZh9inJyxcbiAgICAgICAgICAgICfaiNix2KfZgdm5LycsXG4gICAgICAgICAgICAn4KSh4KWN4KSw4KS+4KWe4KWN4KSfJyxcbiAgICAgICAgICAgICfgpKrgpY3gpLDgpL7gpLDgpYLgpKonLFxuICAgICAgICAgICAgJ+CmluCmuOCnnOCmvicsXG4gICAgICAgICAgICAn4KaW4Ka44Kec4Ka+JyxcbiAgICAgICAgICAgICfgpqHgp43gp7Dgpr7gpqvgp43gpp8nLFxuICAgICAgICAgICAgJ+CooeCpjeCosOCovuCoq+ConycsXG4gICAgICAgICAgICAn4Kqh4KuN4Kqw4Kq+4Kqr4KuN4Kqf4Kq4JyxcbiAgICAgICAgICAgICfgrKHgrY3grLDgrL7grKvgrY3grJ8nLFxuICAgICAgICAgICAgJ+CuteCusOCviOCuteCvgeCuleCus+CvjScsXG4gICAgICAgICAgICAn4LCa4LC/4LCk4LGN4LCk4LGBIOCwquCxjeCwsOCwpOCxgeCwsuCxgScsXG4gICAgICAgICAgICAn4LKV4LKw4LKh4LOB4LKX4LKz4LOBJyxcbiAgICAgICAgICAgICfgtJXgtLDgtJ/gtYHgtJXgtLPgtY3igI0nLFxuICAgICAgICAgICAgJ+C2muC3meC2p+C3lOC2uOC3iiDgtrTgtq3gt4onLFxuICAgICAgICAgICAgJ+C4ieC4muC4seC4muC4o+C5iOC4suC4hycsXG4gICAgICAgICAgICAn4YOb4YOd4YOc4YOQ4YOu4YOQ4YOW4YOU4YOR4YOYJyxcbiAgICAgICAgICAgICfhiKjhiYLhiYbhib0nLFxuICAgICAgICAgICAgJ+Gen+GetuGemuGeluGfkuGemuGetuGehCcsXG4gICAgICAgICAgICAn5LiL5pu444GNJyxcbiAgICAgICAgICAgICfojYnnqL8nLFxuICAgICAgICAgICAgJ+iNieeovycsXG4gICAgICAgICAgICAn6I2J56i/JyxcbiAgICAgICAgICAgICfsnoTsi5wg67O06rSA7ZWoJ1xuICAgICAgICBdLFxuXG4gICAgICAgICdcXFxcQXJjaGl2ZSc6IFsnYXJjaGl2ZSddXG4gICAgfSxcblxuICAgIHNwZWNpYWxVc2UoaGFzU3BlY2lhbFVzZUV4dGVuc2lvbiwgZm9sZGVyKSB7XG4gICAgICAgIGxldCByZXN1bHQ7XG5cbiAgICAgICAgaWYgKGhhc1NwZWNpYWxVc2VFeHRlbnNpb24pIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IHtcbiAgICAgICAgICAgICAgICBmbGFnOiBtb2R1bGUuZXhwb3J0cy5mbGFncy5maW5kKGZsYWcgPT4gZm9sZGVyLmZsYWdzLmhhcyhmbGFnKSksXG4gICAgICAgICAgICAgICAgc291cmNlOiAnZXh0ZW5zaW9uJ1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghcmVzdWx0IHx8ICFyZXN1bHQuZmxhZykge1xuICAgICAgICAgICAgbGV0IG5hbWUgPSBmb2xkZXIubmFtZVxuICAgICAgICAgICAgICAgIC50b0xvd2VyQ2FzZSgpXG4gICAgICAgICAgICAgICAgLnJlcGxhY2UoL1xcdTIwMGUvZywgJycpXG4gICAgICAgICAgICAgICAgLnRyaW0oKTtcblxuICAgICAgICAgICAgcmVzdWx0ID0ge1xuICAgICAgICAgICAgICAgIGZsYWc6IE9iamVjdC5rZXlzKG1vZHVsZS5leHBvcnRzLm5hbWVzKS5maW5kKGZsYWcgPT4gbW9kdWxlLmV4cG9ydHMubmFtZXNbZmxhZ10uaW5jbHVkZXMobmFtZSkpLFxuICAgICAgICAgICAgICAgIHNvdXJjZTogJ25hbWUnXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdCAmJiByZXN1bHQuZmxhZyA/IHJlc3VsdCA6IHsgZmxhZzogbnVsbCB9O1xuICAgIH1cbn07XG4iXSwibmFtZXMiOltdLCJpZ25vcmVMaXN0IjpbMF0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(rsc)/./node_modules/imapflow/lib/special-use.js\n");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "(rsc)/./node_modules/imapflow/lib/tools.js":
|
|
/*!********************************************!*\
|
|
!*** ./node_modules/imapflow/lib/tools.js ***!
|
|
\********************************************/
|
|
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
|
|
|
|
eval("/* eslint no-control-regex:0 */\n\n\n\nconst libmime = __webpack_require__(/*! libmime */ \"(rsc)/./node_modules/libmime/lib/libmime.js\");\nconst { resolveCharset } = __webpack_require__(/*! ./charsets */ \"(rsc)/./node_modules/imapflow/lib/charsets.js\");\nconst { compiler } = __webpack_require__(/*! ./handler/imap-handler */ \"(rsc)/./node_modules/imapflow/lib/handler/imap-handler.js\");\nconst { createHash } = __webpack_require__(/*! crypto */ \"crypto\");\nconst { JPDecoder } = __webpack_require__(/*! ./jp-decoder */ \"(rsc)/./node_modules/imapflow/lib/jp-decoder.js\");\nconst iconv = __webpack_require__(/*! iconv-lite */ \"(rsc)/./node_modules/iconv-lite/lib/index.js\");\n\nconst FLAG_COLORS = ['red', 'orange', 'yellow', 'green', 'blue', 'purple', 'grey'];\n\nclass AuthenticationFailure extends Error {\n authenticationFailed = true;\n}\n\nconst tools = {\n encodePath(connection, path) {\n path = (path || '').toString();\n if (!connection.enabled.has('UTF8=ACCEPT') && /[&\\x00-\\x08\\x0b-\\x0c\\x0e-\\x1f\\u0080-\\uffff]/.test(path)) {\n try {\n path = iconv.encode(path, 'utf-7-imap').toString();\n } catch (err) {\n // ignore, keep name as is\n }\n }\n return path;\n },\n\n decodePath(connection, path) {\n path = (path || '').toString();\n if (!connection.enabled.has('UTF8=ACCEPT') && /[&]/.test(path)) {\n try {\n path = iconv.decode(Buffer.from(path), 'utf-7-imap').toString();\n } catch (err) {\n // ignore, keep name as is\n }\n }\n return path;\n },\n\n normalizePath(connection, path, skipNamespace) {\n if (Array.isArray(path)) {\n path = path.join((connection.namespace && connection.namespace.delimiter) || '');\n }\n\n if (path.toUpperCase() === 'INBOX') {\n // inbox is not case sensitive\n return 'INBOX';\n }\n\n // ensure namespace prefix if needed\n if (!skipNamespace && connection.namespace && connection.namespace.prefix && path.indexOf(connection.namespace.prefix) !== 0) {\n path = connection.namespace.prefix + path;\n }\n\n return path;\n },\n\n comparePaths(connection, a, b) {\n if (!a || !b) {\n return false;\n }\n return tools.normalizePath(connection, a) === tools.normalizePath(connection, b);\n },\n\n updateCapabilities(list) {\n let map = new Map();\n\n if (list && Array.isArray(list)) {\n list.forEach(val => {\n if (typeof val.value !== 'string') {\n return false;\n }\n let capability = val.value.toUpperCase().trim();\n\n if (capability === 'IMAP4REV1') {\n map.set('IMAP4rev1', true);\n return;\n }\n\n if (capability.indexOf('APPENDLIMIT=') === 0) {\n let splitPos = capability.indexOf('=');\n let appendLimit = Number(capability.substr(splitPos + 1)) || 0;\n map.set('APPENDLIMIT', appendLimit);\n return;\n }\n\n map.set(capability, true);\n });\n }\n\n return map;\n },\n\n AuthenticationFailure,\n\n getStatusCode(response) {\n return response &&\n response.attributes &&\n response.attributes[0] &&\n response.attributes[0].section &&\n response.attributes[0].section[0] &&\n typeof response.attributes[0].section[0].value === 'string'\n ? response.attributes[0].section[0].value.toUpperCase().trim()\n : false;\n },\n\n async getErrorText(response) {\n if (!response) {\n return false;\n }\n\n return (await compiler(response)).toString();\n },\n\n getFolderTree(folders) {\n let tree = {\n root: true,\n folders: []\n };\n\n let getTreeNode = parents => {\n let node = tree;\n if (!parents || !parents.length) {\n return node;\n }\n\n for (let parent of parents) {\n let cur = node.folders && node.folders.find(folder => folder.name === parent);\n if (cur) {\n node = cur;\n } else {\n // not yet set\n cur = {\n name: parent,\n folders: []\n };\n }\n }\n\n return node;\n };\n\n for (let folder of folders) {\n let parent = getTreeNode(folder.parent);\n // see if entry already exists\n let existing = parent.folders && parent.folders.find(existing => existing.name === folder.name);\n if (existing) {\n // update values\n existing.name = folder.name;\n existing.flags = folder.flags;\n existing.path = folder.path;\n existing.subscribed = !!folder.subscribed;\n existing.listed = !!folder.listed;\n existing.status = !!folder.status;\n\n if (folder.specialUse) {\n existing.specialUse = folder.specialUse;\n }\n\n if (folder.flags.has('\\\\Noselect')) {\n existing.disabled = true;\n }\n if (folder.flags.has('\\\\HasChildren') && !existing.folders) {\n existing.folders = [];\n }\n } else {\n // create new\n let data = {\n name: folder.name,\n flags: folder.flags,\n path: folder.path,\n subscribed: !!folder.subscribed,\n listed: !!folder.listed,\n status: !!folder.status\n };\n\n if (folder.delimiter) {\n data.delimiter = folder.delimiter;\n }\n\n if (folder.specialUse) {\n data.specialUse = folder.specialUse;\n }\n\n if (folder.flags.has('\\\\Noselect')) {\n data.disabled = true;\n }\n\n if (folder.flags.has('\\\\HasChildren')) {\n data.folders = [];\n }\n\n if (!parent.folders) {\n parent.folders = [];\n }\n parent.folders.push(data);\n }\n }\n\n return tree;\n },\n\n getFlagColor(flags) {\n if (!flags.has('\\\\Flagged')) {\n return null;\n }\n\n const bit0 = flags.has('$MailFlagBit0') ? 1 : 0;\n const bit1 = flags.has('$MailFlagBit1') ? 2 : 0;\n const bit2 = flags.has('$MailFlagBit2') ? 4 : 0;\n\n const color = bit0 | bit1 | bit2; // eslint-disable-line no-bitwise\n\n return FLAG_COLORS[color] || 'red'; // default to red for the unused \\b111\n },\n\n getColorFlags(color) {\n const colorCode = color ? FLAG_COLORS.indexOf((color || '').toString().toLowerCase().trim()) : null;\n if (colorCode < 0 && colorCode !== null) {\n return null;\n }\n\n const bits = [];\n bits[0] = colorCode & 1; // eslint-disable-line no-bitwise\n bits[1] = colorCode & 2; // eslint-disable-line no-bitwise\n bits[2] = colorCode & 4; // eslint-disable-line no-bitwise\n\n let result = { add: colorCode ? ['\\\\Flagged'] : [], remove: colorCode ? [] : ['\\\\Flagged'] };\n\n for (let i = 0; i < bits.length; i++) {\n if (bits[i]) {\n result.add.push(`$MailFlagBit${i}`);\n } else {\n result.remove.push(`$MailFlagBit${i}`);\n }\n }\n return result;\n },\n\n async formatMessageResponse(untagged, mailbox) {\n let map = {};\n\n map.seq = Number(untagged.command);\n\n let key;\n let attributes = (untagged.attributes && untagged.attributes[1]) || [];\n for (let i = 0, len = attributes.length; i < len; i++) {\n let attribute = attributes[i];\n if (i % 2 === 0) {\n key = (\n await compiler({\n attributes: [attribute]\n })\n )\n .toString()\n .toLowerCase()\n .replace(/<\\d+(\\.\\d+)?>$/, '');\n continue;\n }\n if (typeof key !== 'string') {\n // should not happen\n continue;\n }\n\n let getString = attribute => {\n if (!attribute) {\n return false;\n }\n if (typeof attribute.value === 'string') {\n return attribute.value;\n }\n if (Buffer.isBuffer(attribute.value)) {\n return attribute.value.toString();\n }\n };\n\n let getBuffer = attribute => {\n if (!attribute) {\n return false;\n }\n if (Buffer.isBuffer(attribute.value)) {\n return attribute.value;\n }\n };\n\n let getArray = attribute => {\n if (Array.isArray(attribute)) {\n return attribute.map(entry => (entry && typeof entry.value === 'string' ? entry.value : false)).filter(entry => entry);\n }\n };\n\n switch (key) {\n case 'body[]':\n case 'binary[]':\n map.source = getBuffer(attribute);\n break;\n\n case 'uid':\n map.uid = Number(getString(attribute));\n if (map.uid && (!mailbox.uidNext || mailbox.uidNext <= map.uid)) {\n // current uidNext seems to be outdated, bump it\n mailbox.uidNext = map.uid + 1;\n }\n break;\n\n case 'modseq':\n map.modseq = BigInt(getArray(attribute)[0]);\n if (map.modseq && (!mailbox.highestModseq || mailbox.highestModseq < map.modseq)) {\n // current highestModseq seems to be outdated, bump it\n mailbox.highestModseq = map.modseq;\n }\n break;\n\n case 'emailid':\n map.emailId = getArray(attribute)[0];\n break;\n\n case 'x-gm-msgid':\n map.emailId = getString(attribute);\n break;\n\n case 'threadid':\n map.threadId = getArray(attribute)[0];\n break;\n\n case 'x-gm-thrid':\n map.threadId = getString(attribute);\n break;\n\n case 'x-gm-labels':\n map.labels = new Set(getArray(attribute));\n break;\n\n case 'rfc822.size':\n map.size = Number(getString(attribute)) || 0;\n break;\n\n case 'flags':\n map.flags = new Set(getArray(attribute));\n break;\n\n case 'envelope':\n map.envelope = tools.parseEnvelope(attribute);\n break;\n\n case 'bodystructure':\n map.bodyStructure = tools.parseBodystructure(attribute);\n break;\n\n case 'internaldate': {\n let value = getString(attribute);\n let date = new Date(value);\n if (date.toString() === 'Invalid Date') {\n map.internalDate = value;\n } else {\n map.internalDate = date;\n }\n break;\n }\n\n default: {\n let match = key.match(/(body|binary)\\[/i);\n if (match) {\n let partKey = key.replace(/^(body|binary)\\[|]$/gi, '');\n partKey = partKey.replace(/\\.fields.*$/g, '');\n\n let value = getBuffer(attribute);\n if (partKey === 'header') {\n map.headers = value;\n break;\n }\n\n if (!map.bodyParts) {\n map.bodyParts = new Map();\n }\n map.bodyParts.set(partKey, value);\n break;\n }\n break;\n }\n }\n }\n\n if (map.emailId || map.uid) {\n // define account unique ID for this email\n\n // normalize path to use ascii, so we would always get the same ID\n let path = mailbox.path;\n if (/[0x80-0xff]/.test(path)) {\n try {\n path = iconv.encode(path, 'utf-7-imap').toString();\n } catch (err) {\n // ignore\n }\n }\n\n map.id =\n map.emailId ||\n createHash('md5')\n .update([path, mailbox.uidValidity?.toString() || '', map.uid.toString()].join(':'))\n .digest('hex');\n }\n\n if (map.flags) {\n let flagColor = tools.getFlagColor(map.flags);\n if (flagColor) {\n map.flagColor = flagColor;\n }\n }\n\n return map;\n },\n\n processName(name) {\n name = (name || '').toString();\n if (name.length > 2 && name.at(0) === '\"' && name.at(-1) === '\"') {\n name = name.replace(/^\"|\"$/g, '');\n }\n return name;\n },\n\n parseEnvelope(entry) {\n let getStrValue = obj => {\n if (!obj) {\n return false;\n }\n if (typeof obj.value === 'string') {\n return obj.value;\n }\n if (Buffer.isBuffer(obj.value)) {\n return obj.value.toString();\n }\n return obj.value;\n };\n\n let processAddresses = function (list) {\n return []\n .concat(list || [])\n .map(addr => {\n let address = (getStrValue(addr[2]) || '') + '@' + (getStrValue(addr[3]) || '');\n if (address === '@') {\n address = '';\n }\n return {\n name: tools.processName(libmime.decodeWords(getStrValue(addr[0]))),\n address\n };\n })\n .filter(addr => addr.name || addr.address);\n },\n envelope = {};\n\n if (entry[0] && entry[0].value) {\n let date = new Date(getStrValue(entry[0]));\n if (date.toString() === 'Invalid Date') {\n envelope.date = getStrValue(entry[0]);\n } else {\n envelope.date = date;\n }\n }\n\n if (entry[1] && entry[1].value) {\n envelope.subject = libmime.decodeWords(getStrValue(entry[1]));\n }\n\n if (entry[2] && entry[2].length) {\n envelope.from = processAddresses(entry[2]);\n }\n\n if (entry[3] && entry[3].length) {\n envelope.sender = processAddresses(entry[3]);\n }\n\n if (entry[4] && entry[4].length) {\n envelope.replyTo = processAddresses(entry[4]);\n }\n\n if (entry[5] && entry[5].length) {\n envelope.to = processAddresses(entry[5]);\n }\n\n if (entry[6] && entry[6].length) {\n envelope.cc = processAddresses(entry[6]);\n }\n\n if (entry[7] && entry[7].length) {\n envelope.bcc = processAddresses(entry[7]);\n }\n\n if (entry[8] && entry[8].value) {\n envelope.inReplyTo = (getStrValue(entry[8]) || '').toString().trim();\n }\n\n if (entry[9] && entry[9].value) {\n envelope.messageId = (getStrValue(entry[9]) || '').toString().trim();\n }\n\n return envelope;\n },\n\n getStructuredParams(arr) {\n let key;\n\n let params = {};\n\n [].concat(arr || []).forEach((val, j) => {\n if (j % 2) {\n params[key] = libmime.decodeWords(((val && val.value) || '').toString());\n } else {\n key = ((val && val.value) || '').toString().toLowerCase();\n }\n });\n\n if (params.filename && !params['filename*'] && /^[a-z\\-_0-9]+'[a-z]*'[^'\\x00-\\x08\\x0b\\x0c\\x0e-\\x1f\\u0080-\\uFFFF]+/.test(params.filename)) {\n // seems like encoded value\n let [encoding, , encodedValue] = params.filename.split(\"'\");\n if (resolveCharset(encoding)) {\n params['filename*'] = `${encoding}''${encodedValue}`;\n }\n }\n\n // preprocess values\n Object.keys(params).forEach(key => {\n let actualKey;\n let nr;\n let value;\n\n let match = key.match(/\\*((\\d+)\\*?)?$/);\n\n if (!match) {\n // nothing to do here, does not seem like a continuation param\n return;\n }\n\n actualKey = key.substr(0, match.index).toLowerCase();\n nr = Number(match[2]) || 0;\n\n if (!params[actualKey] || typeof params[actualKey] !== 'object') {\n params[actualKey] = {\n charset: false,\n values: []\n };\n }\n\n value = params[key];\n\n if (nr === 0 && match[0].charAt(match[0].length - 1) === '*' && (match = value.match(/^([^']*)'[^']*'(.*)$/))) {\n params[actualKey].charset = match[1] || 'utf-8';\n value = match[2];\n }\n\n params[actualKey].values.push({ nr, value });\n\n // remove the old reference\n delete params[key];\n });\n\n // concatenate split rfc2231 strings and convert encoded strings to mime encoded words\n Object.keys(params).forEach(key => {\n let value;\n if (params[key] && Array.isArray(params[key].values)) {\n value = params[key].values\n .sort((a, b) => a.nr - b.nr)\n .map(val => (val && val.value) || '')\n .join('');\n\n if (params[key].charset) {\n // convert \"%AB\" to \"=?charset?Q?=AB?=\" and then to unicode\n params[key] = libmime.decodeWords(\n '=?' +\n params[key].charset +\n '?Q?' +\n value\n // fix invalidly encoded chars\n .replace(/[=?_\\s]/g, s => {\n let c = s.charCodeAt(0).toString(16);\n if (s === ' ') {\n return '_';\n } else {\n return '%' + (c.length < 2 ? '0' : '') + c;\n }\n })\n // change from urlencoding to percent encoding\n .replace(/%/g, '=') +\n '?='\n );\n } else {\n params[key] = libmime.decodeWords(value);\n }\n }\n });\n\n return params;\n },\n\n parseBodystructure(entry) {\n let walk = (node, path) => {\n path = path || [];\n\n let curNode = {},\n i = 0,\n part = 0;\n\n if (path.length) {\n curNode.part = path.join('.');\n }\n\n // multipart\n if (Array.isArray(node[0])) {\n curNode.childNodes = [];\n while (Array.isArray(node[i])) {\n curNode.childNodes.push(walk(node[i], path.concat(++part)));\n i++;\n }\n\n // multipart type\n curNode.type = 'multipart/' + ((node[i++] || {}).value || '').toString().toLowerCase();\n\n // extension data (not available for BODY requests)\n\n // body parameter parenthesized list\n if (i < node.length - 1) {\n if (node[i]) {\n curNode.parameters = tools.getStructuredParams(node[i]);\n }\n i++;\n }\n } else {\n // content type\n curNode.type = [((node[i++] || {}).value || '').toString().toLowerCase(), ((node[i++] || {}).value || '').toString().toLowerCase()].join('/');\n\n // body parameter parenthesized list\n if (node[i]) {\n curNode.parameters = tools.getStructuredParams(node[i]);\n }\n i++;\n\n // id\n if (node[i]) {\n curNode.id = ((node[i] || {}).value || '').toString();\n }\n i++;\n\n // description\n if (node[i]) {\n curNode.description = ((node[i] || {}).value || '').toString();\n }\n i++;\n\n // encoding\n if (node[i]) {\n curNode.encoding = ((node[i] || {}).value || '').toString().toLowerCase();\n }\n i++;\n\n // size\n if (node[i]) {\n curNode.size = Number((node[i] || {}).value || 0) || 0;\n }\n i++;\n\n if (curNode.type === 'message/rfc822') {\n // message/rfc adds additional envelope, bodystructure and line count values\n\n // envelope\n if (node[i]) {\n curNode.envelope = tools.parseEnvelope([].concat(node[i] || []));\n }\n i++;\n\n if (node[i]) {\n curNode.childNodes = [\n // rfc822 bodyparts share the same path, difference is between MIME and HEADER\n // path.MIME returns message/rfc822 header\n // path.HEADER returns inlined message header\n walk(node[i], path)\n ];\n }\n i++;\n\n // line count\n if (node[i]) {\n curNode.lineCount = Number((node[i] || {}).value || 0) || 0;\n }\n i++;\n }\n\n if (/^text\\//.test(curNode.type)) {\n // text/* adds additional line count value\n\n // NB! some less known servers do not include the line count value\n // length should be 12+\n if (node.length === 11 && Array.isArray(node[i + 1]) && !Array.isArray(node[i + 2])) {\n // invalid structure, disposition params are shifted\n } else {\n // correct structure, line count number is provided\n if (node[i]) {\n // line count\n curNode.lineCount = Number((node[i] || {}).value || 0) || 0;\n }\n i++;\n }\n }\n\n // extension data (not available for BODY requests)\n\n // md5\n if (i < node.length - 1) {\n if (node[i]) {\n curNode.md5 = ((node[i] || {}).value || '').toString().toLowerCase();\n }\n i++;\n }\n }\n\n // the following are shared extension values (for both multipart and non-multipart parts)\n // not available for BODY requests\n\n // body disposition\n if (i < node.length - 1) {\n if (Array.isArray(node[i]) && node[i].length) {\n curNode.disposition = ((node[i][0] || {}).value || '').toString().toLowerCase();\n if (Array.isArray(node[i][1])) {\n curNode.dispositionParameters = tools.getStructuredParams(node[i][1]);\n }\n }\n i++;\n }\n\n // body language\n if (i < node.length - 1) {\n if (node[i]) {\n curNode.language = [].concat(node[i] || []).map(val => ((val && val.value) || '').toString().toLowerCase());\n }\n i++;\n }\n\n // body location\n // NB! defined as a \"string list\" in RFC3501 but replaced in errata document with \"string\"\n // Errata: http://www.rfc-editor.org/errata_search.php?rfc=3501\n if (i < node.length - 1) {\n if (node[i]) {\n curNode.location = ((node[i] || {}).value || '').toString();\n }\n i++;\n }\n\n return curNode;\n };\n\n return walk(entry);\n },\n\n formatDate(value) {\n if (typeof value === 'string') {\n value = new Date(value);\n }\n\n if (Object.prototype.toString(value) !== '[object Object]' || value.toString() === 'Invalid Date') {\n return;\n }\n\n value = value.toISOString().substr(0, 10);\n value = value.split('-');\n value.reverse();\n\n let months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];\n value[1] = months[Number(value[1]) - 1];\n\n return value.join('-');\n },\n\n formatDateTime(value) {\n if (!value) {\n return;\n }\n\n if (typeof value === 'string') {\n value = new Date(value);\n }\n\n if (Object.prototype.toString(value) !== '[object Object]' || value.toString() === 'Invalid Date') {\n return;\n }\n\n let dateStr = tools.formatDate(value).replace(/^0/, ' '); //starts with date-day-fixed with leading 0 replaced by SP\n let timeStr = value.toISOString().substr(11, 8);\n\n return `${dateStr} ${timeStr} +0000`;\n },\n\n formatFlag(flag) {\n switch (flag.toLowerCase()) {\n case '\\\\recent':\n // can not set or remove\n return false;\n case '\\\\seen':\n case '\\\\answered':\n case '\\\\flagged':\n case '\\\\deleted':\n case '\\\\draft':\n // can not set or remove\n return flag.toLowerCase().replace(/^\\\\./, c => c.toUpperCase());\n }\n return flag;\n },\n\n canUseFlag(mailbox, flag) {\n return !mailbox || !mailbox.permanentFlags || mailbox.permanentFlags.has('\\\\*') || mailbox.permanentFlags.has(flag);\n },\n\n expandRange(range) {\n return range.split(',').flatMap(entry => {\n entry = entry.trim();\n let colon = entry.indexOf(':');\n if (colon < 0) {\n return Number(entry) || 0;\n }\n let first = Number(entry.substr(0, colon)) || 0;\n let second = Number(entry.substr(colon + 1)) || 0;\n if (first === second) {\n return first;\n }\n let list = [];\n if (first < second) {\n for (let i = first; i <= second; i++) {\n list.push(i);\n }\n } else {\n for (let i = first; i >= second; i--) {\n list.push(i);\n }\n }\n return list;\n });\n },\n\n getDecoder(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 packMessageRange(list) {\n if (typeof uidList === 'string')\n if (!Array.isArray(list)) {\n list = [].concat(list || []);\n }\n\n if (!list.length) {\n return '';\n }\n\n list.sort((a, b) => a - b);\n\n let last = list[list.length - 1];\n let result = [[last]];\n for (let i = list.length - 2; i >= 0; i--) {\n if (list[i] === list[i + 1] - 1) {\n result[0].unshift(list[i]);\n continue;\n }\n result.unshift([list[i]]);\n }\n\n result = result.map(item => {\n if (item.length === 1) {\n return item[0];\n }\n return item.shift() + ':' + item.pop();\n });\n\n return result.join(',');\n }\n};\n\nmodule.exports = tools;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHJzYykvLi9ub2RlX21vZHVsZXMvaW1hcGZsb3cvbGliL3Rvb2xzLmpzIiwibWFwcGluZ3MiOiJBQUFBOztBQUVhOztBQUViLGdCQUFnQixtQkFBTyxDQUFDLDREQUFTO0FBQ2pDLFFBQVEsaUJBQWlCLEVBQUUsbUJBQU8sQ0FBQyxpRUFBWTtBQUMvQyxRQUFRLFdBQVcsRUFBRSxtQkFBTyxDQUFDLHlGQUF3QjtBQUNyRCxRQUFRLGFBQWEsRUFBRSxtQkFBTyxDQUFDLHNCQUFRO0FBQ3ZDLFFBQVEsWUFBWSxFQUFFLG1CQUFPLENBQUMscUVBQWM7QUFDNUMsY0FBYyxtQkFBTyxDQUFDLGdFQUFZOztBQUVsQzs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsYUFBYTtBQUNiOztBQUVBO0FBQ0EsS0FBSzs7QUFFTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0I7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLDBDQUEwQzs7QUFFMUMsNENBQTRDO0FBQzVDLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGlDQUFpQztBQUNqQyxpQ0FBaUM7QUFDakMsaUNBQWlDOztBQUVqQyx1QkFBdUI7O0FBRXZCLHdCQUF3QixpQkFBaUI7QUFDekM7QUFDQSwrQ0FBK0MsRUFBRTtBQUNqRCxjQUFjO0FBQ2Qsa0RBQWtELEVBQUU7QUFDcEQ7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQSxpREFBaUQsU0FBUztBQUMxRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQjtBQUN0QjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQjtBQUNBLGFBQWE7QUFDYjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxLQUFLOztBQUVMO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUNBQXlDLFNBQVMsSUFBSSxhQUFhO0FBQ25FO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSw0Q0FBNEMsV0FBVzs7QUFFdkQ7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQ0FBc0M7QUFDdEM7QUFDQTtBQUNBLGlDQUFpQztBQUNqQztBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7O0FBRUEsNEJBQTRCO0FBQzVCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsK0RBQStEOztBQUUvRDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBLGlEQUFpRCwwREFBMEQ7O0FBRTNHO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGdEQUFnRDtBQUNoRDtBQUNBOztBQUVBO0FBQ0E7QUFDQSx5REFBeUQ7QUFDekQ7QUFDQTs7QUFFQTtBQUNBO0FBQ0Esc0RBQXNEO0FBQ3REO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLHdEQUF3RDtBQUN4RDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGlFQUFpRTtBQUNqRTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQjtBQUN0QjtBQUNBO0FBQ0E7QUFDQSxxRUFBcUU7QUFDckU7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0EscURBQXFEO0FBQ3JEO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsNERBQTREO0FBQzVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0RBQXNEO0FBQ3REO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEsa0VBQWtFO0FBQ2xFOztBQUVBLGtCQUFrQixTQUFTLEVBQUUsU0FBUztBQUN0QyxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQ0FBb0MsYUFBYTtBQUNqRDtBQUNBO0FBQ0EsY0FBYztBQUNkLG9DQUFvQyxhQUFhO0FBQ2pEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0Esc0NBQXNDLFFBQVE7QUFDOUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQTs7QUFFQSIsInNvdXJjZXMiOlsiL2hvbWUvYWxtYS9uZXh0Z2VuL05lYWgtbWFpbC9ub2RlX21vZHVsZXMvaW1hcGZsb3cvbGliL3Rvb2xzLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludCBuby1jb250cm9sLXJlZ2V4OjAgKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCBsaWJtaW1lID0gcmVxdWlyZSgnbGlibWltZScpO1xuY29uc3QgeyByZXNvbHZlQ2hhcnNldCB9ID0gcmVxdWlyZSgnLi9jaGFyc2V0cycpO1xuY29uc3QgeyBjb21waWxlciB9ID0gcmVxdWlyZSgnLi9oYW5kbGVyL2ltYXAtaGFuZGxlcicpO1xuY29uc3QgeyBjcmVhdGVIYXNoIH0gPSByZXF1aXJlKCdjcnlwdG8nKTtcbmNvbnN0IHsgSlBEZWNvZGVyIH0gPSByZXF1aXJlKCcuL2pwLWRlY29kZXInKTtcbmNvbnN0IGljb252ID0gcmVxdWlyZSgnaWNvbnYtbGl0ZScpO1xuXG5jb25zdCBGTEFHX0NPTE9SUyA9IFsncmVkJywgJ29yYW5nZScsICd5ZWxsb3cnLCAnZ3JlZW4nLCAnYmx1ZScsICdwdXJwbGUnLCAnZ3JleSddO1xuXG5jbGFzcyBBdXRoZW50aWNhdGlvbkZhaWx1cmUgZXh0ZW5kcyBFcnJvciB7XG4gICAgYXV0aGVudGljYXRpb25GYWlsZWQgPSB0cnVlO1xufVxuXG5jb25zdCB0b29scyA9IHtcbiAgICBlbmNvZGVQYXRoKGNvbm5lY3Rpb24sIHBhdGgpIHtcbiAgICAgICAgcGF0aCA9IChwYXRoIHx8ICcnKS50b1N0cmluZygpO1xuICAgICAgICBpZiAoIWNvbm5lY3Rpb24uZW5hYmxlZC5oYXMoJ1VURjg9QUNDRVBUJykgJiYgL1smXFx4MDAtXFx4MDhcXHgwYi1cXHgwY1xceDBlLVxceDFmXFx1MDA4MC1cXHVmZmZmXS8udGVzdChwYXRoKSkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBwYXRoID0gaWNvbnYuZW5jb2RlKHBhdGgsICd1dGYtNy1pbWFwJykudG9TdHJpbmcoKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgIC8vIGlnbm9yZSwga2VlcCBuYW1lIGFzIGlzXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHBhdGg7XG4gICAgfSxcblxuICAgIGRlY29kZVBhdGgoY29ubmVjdGlvbiwgcGF0aCkge1xuICAgICAgICBwYXRoID0gKHBhdGggfHwgJycpLnRvU3RyaW5nKCk7XG4gICAgICAgIGlmICghY29ubmVjdGlvbi5lbmFibGVkLmhhcygnVVRGOD1BQ0NFUFQnKSAmJiAvWyZdLy50ZXN0KHBhdGgpKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHBhdGggPSBpY29udi5kZWNvZGUoQnVmZmVyLmZyb20ocGF0aCksICd1dGYtNy1pbWFwJykudG9TdHJpbmcoKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgIC8vIGlnbm9yZSwga2VlcCBuYW1lIGFzIGlzXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHBhdGg7XG4gICAgfSxcblxuICAgIG5vcm1hbGl6ZVBhdGgoY29ubmVjdGlvbiwgcGF0aCwgc2tpcE5hbWVzcGFjZSkge1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShwYXRoKSkge1xuICAgICAgICAgICAgcGF0aCA9IHBhdGguam9pbigoY29ubmVjdGlvbi5uYW1lc3BhY2UgJiYgY29ubmVjdGlvbi5uYW1lc3BhY2UuZGVsaW1pdGVyKSB8fCAnJyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocGF0aC50b1VwcGVyQ2FzZSgpID09PSAnSU5CT1gnKSB7XG4gICAgICAgICAgICAvLyBpbmJveCBpcyBub3QgY2FzZSBzZW5zaXRpdmVcbiAgICAgICAgICAgIHJldHVybiAnSU5CT1gnO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gZW5zdXJlIG5hbWVzcGFjZSBwcmVmaXggaWYgbmVlZGVkXG4gICAgICAgIGlmICghc2tpcE5hbWVzcGFjZSAmJiBjb25uZWN0aW9uLm5hbWVzcGFjZSAmJiBjb25uZWN0aW9uLm5hbWVzcGFjZS5wcmVmaXggJiYgcGF0aC5pbmRleE9mKGNvbm5lY3Rpb24ubmFtZXNwYWNlLnByZWZpeCkgIT09IDApIHtcbiAgICAgICAgICAgIHBhdGggPSBjb25uZWN0aW9uLm5hbWVzcGFjZS5wcmVmaXggKyBwYXRoO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHBhdGg7XG4gICAgfSxcblxuICAgIGNvbXBhcmVQYXRocyhjb25uZWN0aW9uLCBhLCBiKSB7XG4gICAgICAgIGlmICghYSB8fCAhYikge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0b29scy5ub3JtYWxpemVQYXRoKGNvbm5lY3Rpb24sIGEpID09PSB0b29scy5ub3JtYWxpemVQYXRoKGNvbm5lY3Rpb24sIGIpO1xuICAgIH0sXG5cbiAgICB1cGRhdGVDYXBhYmlsaXRpZXMobGlzdCkge1xuICAgICAgICBsZXQgbWFwID0gbmV3IE1hcCgpO1xuXG4gICAgICAgIGlmIChsaXN0ICYmIEFycmF5LmlzQXJyYXkobGlzdCkpIHtcbiAgICAgICAgICAgIGxpc3QuZm9yRWFjaCh2YWwgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdmFsLnZhbHVlICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGxldCBjYXBhYmlsaXR5ID0gdmFsLnZhbHVlLnRvVXBwZXJDYXNlKCkudHJpbSgpO1xuXG4gICAgICAgICAgICAgICAgaWYgKGNhcGFiaWxpdHkgPT09ICdJTUFQNFJFVjEnKSB7XG4gICAgICAgICAgICAgICAgICAgIG1hcC5zZXQoJ0lNQVA0cmV2MScsIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKGNhcGFiaWxpdHkuaW5kZXhPZignQVBQRU5ETElNSVQ9JykgPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHNwbGl0UG9zID0gY2FwYWJpbGl0eS5pbmRleE9mKCc9Jyk7XG4gICAgICAgICAgICAgICAgICAgIGxldCBhcHBlbmRMaW1pdCA9IE51bWJlcihjYXBhYmlsaXR5LnN1YnN0cihzcGxpdFBvcyArIDEpKSB8fCAwO1xuICAgICAgICAgICAgICAgICAgICBtYXAuc2V0KCdBUFBFTkRMSU1JVCcsIGFwcGVuZExpbWl0KTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIG1hcC5zZXQoY2FwYWJpbGl0eSwgdHJ1ZSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBtYXA7XG4gICAgfSxcblxuICAgIEF1dGhlbnRpY2F0aW9uRmFpbHVyZSxcblxuICAgIGdldFN0YXR1c0NvZGUocmVzcG9uc2UpIHtcbiAgICAgICAgcmV0dXJuIHJlc3BvbnNlICYmXG4gICAgICAgICAgICByZXNwb25zZS5hdHRyaWJ1dGVzICYmXG4gICAgICAgICAgICByZXNwb25zZS5hdHRyaWJ1dGVzWzBdICYmXG4gICAgICAgICAgICByZXNwb25zZS5hdHRyaWJ1dGVzWzBdLnNlY3Rpb24gJiZcbiAgICAgICAgICAgIHJlc3BvbnNlLmF0dHJpYnV0ZXNbMF0uc2VjdGlvblswXSAmJlxuICAgICAgICAgICAgdHlwZW9mIHJlc3BvbnNlLmF0dHJpYnV0ZXNbMF0uc2VjdGlvblswXS52YWx1ZSA9PT0gJ3N0cmluZydcbiAgICAgICAgICAgID8gcmVzcG9uc2UuYXR0cmlidXRlc1swXS5zZWN0aW9uWzBdLnZhbHVlLnRvVXBwZXJDYXNlKCkudHJpbSgpXG4gICAgICAgICAgICA6IGZhbHNlO1xuICAgIH0sXG5cbiAgICBhc3luYyBnZXRFcnJvclRleHQocmVzcG9uc2UpIHtcbiAgICAgICAgaWYgKCFyZXNwb25zZSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIChhd2FpdCBjb21waWxlcihyZXNwb25zZSkpLnRvU3RyaW5nKCk7XG4gICAgfSxcblxuICAgIGdldEZvbGRlclRyZWUoZm9sZGVycykge1xuICAgICAgICBsZXQgdHJlZSA9IHtcbiAgICAgICAgICAgIHJvb3Q6IHRydWUsXG4gICAgICAgICAgICBmb2xkZXJzOiBbXVxuICAgICAgICB9O1xuXG4gICAgICAgIGxldCBnZXRUcmVlTm9kZSA9IHBhcmVudHMgPT4ge1xuICAgICAgICAgICAgbGV0IG5vZGUgPSB0cmVlO1xuICAgICAgICAgICAgaWYgKCFwYXJlbnRzIHx8ICFwYXJlbnRzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBub2RlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmb3IgKGxldCBwYXJlbnQgb2YgcGFyZW50cykge1xuICAgICAgICAgICAgICAgIGxldCBjdXIgPSBub2RlLmZvbGRlcnMgJiYgbm9kZS5mb2xkZXJzLmZpbmQoZm9sZGVyID0+IGZvbGRlci5uYW1lID09PSBwYXJlbnQpO1xuICAgICAgICAgICAgICAgIGlmIChjdXIpIHtcbiAgICAgICAgICAgICAgICAgICAgbm9kZSA9IGN1cjtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyBub3QgeWV0IHNldFxuICAgICAgICAgICAgICAgICAgICBjdXIgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBwYXJlbnQsXG4gICAgICAgICAgICAgICAgICAgICAgICBmb2xkZXJzOiBbXVxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgICAgIH07XG5cbiAgICAgICAgZm9yIChsZXQgZm9sZGVyIG9mIGZvbGRlcnMpIHtcbiAgICAgICAgICAgIGxldCBwYXJlbnQgPSBnZXRUcmVlTm9kZShmb2xkZXIucGFyZW50KTtcbiAgICAgICAgICAgIC8vIHNlZSBpZiBlbnRyeSBhbHJlYWR5IGV4aXN0c1xuICAgICAgICAgICAgbGV0IGV4aXN0aW5nID0gcGFyZW50LmZvbGRlcnMgJiYgcGFyZW50LmZvbGRlcnMuZmluZChleGlzdGluZyA9PiBleGlzdGluZy5uYW1lID09PSBmb2xkZXIubmFtZSk7XG4gICAgICAgICAgICBpZiAoZXhpc3RpbmcpIHtcbiAgICAgICAgICAgICAgICAvLyB1cGRhdGUgdmFsdWVzXG4gICAgICAgICAgICAgICAgZXhpc3RpbmcubmFtZSA9IGZvbGRlci5uYW1lO1xuICAgICAgICAgICAgICAgIGV4aXN0aW5nLmZsYWdzID0gZm9sZGVyLmZsYWdzO1xuICAgICAgICAgICAgICAgIGV4aXN0aW5nLnBhdGggPSBmb2xkZXIucGF0aDtcbiAgICAgICAgICAgICAgICBleGlzdGluZy5zdWJzY3JpYmVkID0gISFmb2xkZXIuc3Vic2NyaWJlZDtcbiAgICAgICAgICAgICAgICBleGlzdGluZy5saXN0ZWQgPSAhIWZvbGRlci5saXN0ZWQ7XG4gICAgICAgICAgICAgICAgZXhpc3Rpbmcuc3RhdHVzID0gISFmb2xkZXIuc3RhdHVzO1xuXG4gICAgICAgICAgICAgICAgaWYgKGZvbGRlci5zcGVjaWFsVXNlKSB7XG4gICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nLnNwZWNpYWxVc2UgPSBmb2xkZXIuc3BlY2lhbFVzZTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoZm9sZGVyLmZsYWdzLmhhcygnXFxcXE5vc2VsZWN0JykpIHtcbiAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmcuZGlzYWJsZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoZm9sZGVyLmZsYWdzLmhhcygnXFxcXEhhc0NoaWxkcmVuJykgJiYgIWV4aXN0aW5nLmZvbGRlcnMpIHtcbiAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmcuZm9sZGVycyA9IFtdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gY3JlYXRlIG5ld1xuICAgICAgICAgICAgICAgIGxldCBkYXRhID0ge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBmb2xkZXIubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgZmxhZ3M6IGZvbGRlci5mbGFncyxcbiAgICAgICAgICAgICAgICAgICAgcGF0aDogZm9sZGVyLnBhdGgsXG4gICAgICAgICAgICAgICAgICAgIHN1YnNjcmliZWQ6ICEhZm9sZGVyLnN1YnNjcmliZWQsXG4gICAgICAgICAgICAgICAgICAgIGxpc3RlZDogISFmb2xkZXIubGlzdGVkLFxuICAgICAgICAgICAgICAgICAgICBzdGF0dXM6ICEhZm9sZGVyLnN0YXR1c1xuICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICBpZiAoZm9sZGVyLmRlbGltaXRlcikge1xuICAgICAgICAgICAgICAgICAgICBkYXRhLmRlbGltaXRlciA9IGZvbGRlci5kZWxpbWl0ZXI7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKGZvbGRlci5zcGVjaWFsVXNlKSB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGEuc3BlY2lhbFVzZSA9IGZvbGRlci5zcGVjaWFsVXNlO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChmb2xkZXIuZmxhZ3MuaGFzKCdcXFxcTm9zZWxlY3QnKSkge1xuICAgICAgICAgICAgICAgICAgICBkYXRhLmRpc2FibGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoZm9sZGVyLmZsYWdzLmhhcygnXFxcXEhhc0NoaWxkcmVuJykpIHtcbiAgICAgICAgICAgICAgICAgICAgZGF0YS5mb2xkZXJzID0gW107XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKCFwYXJlbnQuZm9sZGVycykge1xuICAgICAgICAgICAgICAgICAgICBwYXJlbnQuZm9sZGVycyA9IFtdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBwYXJlbnQuZm9sZGVycy5wdXNoKGRhdGEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRyZWU7XG4gICAgfSxcblxuICAgIGdldEZsYWdDb2xvcihmbGFncykge1xuICAgICAgICBpZiAoIWZsYWdzLmhhcygnXFxcXEZsYWdnZWQnKSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBiaXQwID0gZmxhZ3MuaGFzKCckTWFpbEZsYWdCaXQwJykgPyAxIDogMDtcbiAgICAgICAgY29uc3QgYml0MSA9IGZsYWdzLmhhcygnJE1haWxGbGFnQml0MScpID8gMiA6IDA7XG4gICAgICAgIGNvbnN0IGJpdDIgPSBmbGFncy5oYXMoJyRNYWlsRmxhZ0JpdDInKSA/IDQgOiAwO1xuXG4gICAgICAgIGNvbnN0IGNvbG9yID0gYml0MCB8IGJpdDEgfCBiaXQyOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWJpdHdpc2VcblxuICAgICAgICByZXR1cm4gRkxBR19DT0xPUlNbY29sb3JdIHx8ICdyZWQnOyAvLyBkZWZhdWx0IHRvIHJlZCBmb3IgdGhlIHVudXNlZCBcXGIxMTFcbiAgICB9LFxuXG4gICAgZ2V0Q29sb3JGbGFncyhjb2xvcikge1xuICAgICAgICBjb25zdCBjb2xvckNvZGUgPSBjb2xvciA/IEZMQUdfQ09MT1JTLmluZGV4T2YoKGNvbG9yIHx8ICcnKS50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkudHJpbSgpKSA6IG51bGw7XG4gICAgICAgIGlmIChjb2xvckNvZGUgPCAwICYmIGNvbG9yQ29kZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBiaXRzID0gW107XG4gICAgICAgIGJpdHNbMF0gPSBjb2xvckNvZGUgJiAxOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWJpdHdpc2VcbiAgICAgICAgYml0c1sxXSA9IGNvbG9yQ29kZSAmIDI7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tYml0d2lzZVxuICAgICAgICBiaXRzWzJdID0gY29sb3JDb2RlICYgNDsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1iaXR3aXNlXG5cbiAgICAgICAgbGV0IHJlc3VsdCA9IHsgYWRkOiBjb2xvckNvZGUgPyBbJ1xcXFxGbGFnZ2VkJ10gOiBbXSwgcmVtb3ZlOiBjb2xvckNvZGUgPyBbXSA6IFsnXFxcXEZsYWdnZWQnXSB9O1xuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYml0cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKGJpdHNbaV0pIHtcbiAgICAgICAgICAgICAgICByZXN1bHQuYWRkLnB1c2goYCRNYWlsRmxhZ0JpdCR7aX1gKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LnJlbW92ZS5wdXNoKGAkTWFpbEZsYWdCaXQke2l9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9LFxuXG4gICAgYXN5bmMgZm9ybWF0TWVzc2FnZVJlc3BvbnNlKHVudGFnZ2VkLCBtYWlsYm94KSB7XG4gICAgICAgIGxldCBtYXAgPSB7fTtcblxuICAgICAgICBtYXAuc2VxID0gTnVtYmVyKHVudGFnZ2VkLmNvbW1hbmQpO1xuXG4gICAgICAgIGxldCBrZXk7XG4gICAgICAgIGxldCBhdHRyaWJ1dGVzID0gKHVudGFnZ2VkLmF0dHJpYnV0ZXMgJiYgdW50YWdnZWQuYXR0cmlidXRlc1sxXSkgfHwgW107XG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSBhdHRyaWJ1dGVzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgYXR0cmlidXRlID0gYXR0cmlidXRlc1tpXTtcbiAgICAgICAgICAgIGlmIChpICUgMiA9PT0gMCkge1xuICAgICAgICAgICAgICAgIGtleSA9IChcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgY29tcGlsZXIoe1xuICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlczogW2F0dHJpYnV0ZV1cbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgIC50b1N0cmluZygpXG4gICAgICAgICAgICAgICAgICAgIC50b0xvd2VyQ2FzZSgpXG4gICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKC88XFxkKyhcXC5cXGQrKT8+JC8sICcnKTtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0eXBlb2Yga2V5ICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgIC8vIHNob3VsZCBub3QgaGFwcGVuXG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxldCBnZXRTdHJpbmcgPSBhdHRyaWJ1dGUgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghYXR0cmlidXRlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBhdHRyaWJ1dGUudmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBhdHRyaWJ1dGUudmFsdWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChCdWZmZXIuaXNCdWZmZXIoYXR0cmlidXRlLnZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXR0cmlidXRlLnZhbHVlLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgbGV0IGdldEJ1ZmZlciA9IGF0dHJpYnV0ZSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCFhdHRyaWJ1dGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoQnVmZmVyLmlzQnVmZmVyKGF0dHJpYnV0ZS52YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGF0dHJpYnV0ZS52YWx1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBsZXQgZ2V0QXJyYXkgPSBhdHRyaWJ1dGUgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGF0dHJpYnV0ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGF0dHJpYnV0ZS5tYXAoZW50cnkgPT4gKGVudHJ5ICYmIHR5cGVvZiBlbnRyeS52YWx1ZSA9PT0gJ3N0cmluZycgPyBlbnRyeS52YWx1ZSA6IGZhbHNlKSkuZmlsdGVyKGVudHJ5ID0+IGVudHJ5KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBzd2l0Y2ggKGtleSkge1xuICAgICAgICAgICAgICAgIGNhc2UgJ2JvZHlbXSc6XG4gICAgICAgICAgICAgICAgY2FzZSAnYmluYXJ5W10nOlxuICAgICAgICAgICAgICAgICAgICBtYXAuc291cmNlID0gZ2V0QnVmZmVyKGF0dHJpYnV0ZSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgY2FzZSAndWlkJzpcbiAgICAgICAgICAgICAgICAgICAgbWFwLnVpZCA9IE51bWJlcihnZXRTdHJpbmcoYXR0cmlidXRlKSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChtYXAudWlkICYmICghbWFpbGJveC51aWROZXh0IHx8IG1haWxib3gudWlkTmV4dCA8PSBtYXAudWlkKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY3VycmVudCB1aWROZXh0IHNlZW1zIHRvIGJlIG91dGRhdGVkLCBidW1wIGl0XG4gICAgICAgICAgICAgICAgICAgICAgICBtYWlsYm94LnVpZE5leHQgPSBtYXAudWlkICsgMTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgIGNhc2UgJ21vZHNlcSc6XG4gICAgICAgICAgICAgICAgICAgIG1hcC5tb2RzZXEgPSBCaWdJbnQoZ2V0QXJyYXkoYXR0cmlidXRlKVswXSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChtYXAubW9kc2VxICYmICghbWFpbGJveC5oaWdoZXN0TW9kc2VxIHx8IG1haWxib3guaGlnaGVzdE1vZHNlcSA8IG1hcC5tb2RzZXEpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjdXJyZW50IGhpZ2hlc3RNb2RzZXEgc2VlbXMgdG8gYmUgb3V0ZGF0ZWQsIGJ1bXAgaXRcbiAgICAgICAgICAgICAgICAgICAgICAgIG1haWxib3guaGlnaGVzdE1vZHNlcSA9IG1hcC5tb2RzZXE7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgICBjYXNlICdlbWFpbGlkJzpcbiAgICAgICAgICAgICAgICAgICAgbWFwLmVtYWlsSWQgPSBnZXRBcnJheShhdHRyaWJ1dGUpWzBdO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgIGNhc2UgJ3gtZ20tbXNnaWQnOlxuICAgICAgICAgICAgICAgICAgICBtYXAuZW1haWxJZCA9IGdldFN0cmluZyhhdHRyaWJ1dGUpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgIGNhc2UgJ3RocmVhZGlkJzpcbiAgICAgICAgICAgICAgICAgICAgbWFwLnRocmVhZElkID0gZ2V0QXJyYXkoYXR0cmlidXRlKVswXTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgICBjYXNlICd4LWdtLXRocmlkJzpcbiAgICAgICAgICAgICAgICAgICAgbWFwLnRocmVhZElkID0gZ2V0U3RyaW5nKGF0dHJpYnV0ZSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgY2FzZSAneC1nbS1sYWJlbHMnOlxuICAgICAgICAgICAgICAgICAgICBtYXAubGFiZWxzID0gbmV3IFNldChnZXRBcnJheShhdHRyaWJ1dGUpKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgICBjYXNlICdyZmM4MjIuc2l6ZSc6XG4gICAgICAgICAgICAgICAgICAgIG1hcC5zaXplID0gTnVtYmVyKGdldFN0cmluZyhhdHRyaWJ1dGUpKSB8fCAwO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgIGNhc2UgJ2ZsYWdzJzpcbiAgICAgICAgICAgICAgICAgICAgbWFwLmZsYWdzID0gbmV3IFNldChnZXRBcnJheShhdHRyaWJ1dGUpKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgICBjYXNlICdlbnZlbG9wZSc6XG4gICAgICAgICAgICAgICAgICAgIG1hcC5lbnZlbG9wZSA9IHRvb2xzLnBhcnNlRW52ZWxvcGUoYXR0cmlidXRlKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgICBjYXNlICdib2R5c3RydWN0dXJlJzpcbiAgICAgICAgICAgICAgICAgICAgbWFwLmJvZHlTdHJ1Y3R1cmUgPSB0b29scy5wYXJzZUJvZHlzdHJ1Y3R1cmUoYXR0cmlidXRlKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgICBjYXNlICdpbnRlcm5hbGRhdGUnOiB7XG4gICAgICAgICAgICAgICAgICAgIGxldCB2YWx1ZSA9IGdldFN0cmluZyhhdHRyaWJ1dGUpO1xuICAgICAgICAgICAgICAgICAgICBsZXQgZGF0ZSA9IG5ldyBEYXRlKHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGUudG9TdHJpbmcoKSA9PT0gJ0ludmFsaWQgRGF0ZScpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1hcC5pbnRlcm5hbERhdGUgPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1hcC5pbnRlcm5hbERhdGUgPSBkYXRlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG1hdGNoID0ga2V5Lm1hdGNoKC8oYm9keXxiaW5hcnkpXFxbL2kpO1xuICAgICAgICAgICAgICAgICAgICBpZiAobWF0Y2gpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBwYXJ0S2V5ID0ga2V5LnJlcGxhY2UoL14oYm9keXxiaW5hcnkpXFxbfF0kL2dpLCAnJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJ0S2V5ID0gcGFydEtleS5yZXBsYWNlKC9cXC5maWVsZHMuKiQvZywgJycpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgdmFsdWUgPSBnZXRCdWZmZXIoYXR0cmlidXRlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXJ0S2V5ID09PSAnaGVhZGVyJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcC5oZWFkZXJzID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbWFwLmJvZHlQYXJ0cykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcC5ib2R5UGFydHMgPSBuZXcgTWFwKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBtYXAuYm9keVBhcnRzLnNldChwYXJ0S2V5LCB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobWFwLmVtYWlsSWQgfHwgbWFwLnVpZCkge1xuICAgICAgICAgICAgLy8gZGVmaW5lIGFjY291bnQgdW5pcXVlIElEIGZvciB0aGlzIGVtYWlsXG5cbiAgICAgICAgICAgIC8vIG5vcm1hbGl6ZSBwYXRoIHRvIHVzZSBhc2NpaSwgc28gd2Ugd291bGQgYWx3YXlzIGdldCB0aGUgc2FtZSBJRFxuICAgICAgICAgICAgbGV0IHBhdGggPSBtYWlsYm94LnBhdGg7XG4gICAgICAgICAgICBpZiAoL1sweDgwLTB4ZmZdLy50ZXN0KHBhdGgpKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgcGF0aCA9IGljb252LmVuY29kZShwYXRoLCAndXRmLTctaW1hcCcpLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbWFwLmlkID1cbiAgICAgICAgICAgICAgICBtYXAuZW1haWxJZCB8fFxuICAgICAgICAgICAgICAgIGNyZWF0ZUhhc2goJ21kNScpXG4gICAgICAgICAgICAgICAgICAgIC51cGRhdGUoW3BhdGgsIG1haWxib3gudWlkVmFsaWRpdHk/LnRvU3RyaW5nKCkgfHwgJycsIG1hcC51aWQudG9TdHJpbmcoKV0uam9pbignOicpKVxuICAgICAgICAgICAgICAgICAgICAuZGlnZXN0KCdoZXgnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChtYXAuZmxhZ3MpIHtcbiAgICAgICAgICAgIGxldCBmbGFnQ29sb3IgPSB0b29scy5nZXRGbGFnQ29sb3IobWFwLmZsYWdzKTtcbiAgICAgICAgICAgIGlmIChmbGFnQ29sb3IpIHtcbiAgICAgICAgICAgICAgICBtYXAuZmxhZ0NvbG9yID0gZmxhZ0NvbG9yO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG1hcDtcbiAgICB9LFxuXG4gICAgcHJvY2Vzc05hbWUobmFtZSkge1xuICAgICAgICBuYW1lID0gKG5hbWUgfHwgJycpLnRvU3RyaW5nKCk7XG4gICAgICAgIGlmIChuYW1lLmxlbmd0aCA+IDIgJiYgbmFtZS5hdCgwKSA9PT0gJ1wiJyAmJiBuYW1lLmF0KC0xKSA9PT0gJ1wiJykge1xuICAgICAgICAgICAgbmFtZSA9IG5hbWUucmVwbGFjZSgvXlwifFwiJC9nLCAnJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5hbWU7XG4gICAgfSxcblxuICAgIHBhcnNlRW52ZWxvcGUoZW50cnkpIHtcbiAgICAgICAgbGV0IGdldFN0clZhbHVlID0gb2JqID0+IHtcbiAgICAgICAgICAgIGlmICghb2JqKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHR5cGVvZiBvYmoudmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG9iai52YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChCdWZmZXIuaXNCdWZmZXIob2JqLnZhbHVlKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBvYmoudmFsdWUudG9TdHJpbmcoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBvYmoudmFsdWU7XG4gICAgICAgIH07XG5cbiAgICAgICAgbGV0IHByb2Nlc3NBZGRyZXNzZXMgPSBmdW5jdGlvbiAobGlzdCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBbXVxuICAgICAgICAgICAgICAgICAgICAuY29uY2F0KGxpc3QgfHwgW10pXG4gICAgICAgICAgICAgICAgICAgIC5tYXAoYWRkciA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgYWRkcmVzcyA9IChnZXRTdHJWYWx1ZShhZGRyWzJdKSB8fCAnJykgKyAnQCcgKyAoZ2V0U3RyVmFsdWUoYWRkclszXSkgfHwgJycpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFkZHJlc3MgPT09ICdAJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3MgPSAnJztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogdG9vbHMucHJvY2Vzc05hbWUobGlibWltZS5kZWNvZGVXb3JkcyhnZXRTdHJWYWx1ZShhZGRyWzBdKSkpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3NcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoYWRkciA9PiBhZGRyLm5hbWUgfHwgYWRkci5hZGRyZXNzKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBlbnZlbG9wZSA9IHt9O1xuXG4gICAgICAgIGlmIChlbnRyeVswXSAmJiBlbnRyeVswXS52YWx1ZSkge1xuICAgICAgICAgICAgbGV0IGRhdGUgPSBuZXcgRGF0ZShnZXRTdHJWYWx1ZShlbnRyeVswXSkpO1xuICAgICAgICAgICAgaWYgKGRhdGUudG9TdHJpbmcoKSA9PT0gJ0ludmFsaWQgRGF0ZScpIHtcbiAgICAgICAgICAgICAgICBlbnZlbG9wZS5kYXRlID0gZ2V0U3RyVmFsdWUoZW50cnlbMF0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBlbnZlbG9wZS5kYXRlID0gZGF0ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChlbnRyeVsxXSAmJiBlbnRyeVsxXS52YWx1ZSkge1xuICAgICAgICAgICAgZW52ZWxvcGUuc3ViamVjdCA9IGxpYm1pbWUuZGVjb2RlV29yZHMoZ2V0U3RyVmFsdWUoZW50cnlbMV0pKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChlbnRyeVsyXSAmJiBlbnRyeVsyXS5sZW5ndGgpIHtcbiAgICAgICAgICAgIGVudmVsb3BlLmZyb20gPSBwcm9jZXNzQWRkcmVzc2VzKGVudHJ5WzJdKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChlbnRyeVszXSAmJiBlbnRyeVszXS5sZW5ndGgpIHtcbiAgICAgICAgICAgIGVudmVsb3BlLnNlbmRlciA9IHByb2Nlc3NBZGRyZXNzZXMoZW50cnlbM10pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGVudHJ5WzRdICYmIGVudHJ5WzRdLmxlbmd0aCkge1xuICAgICAgICAgICAgZW52ZWxvcGUucmVwbHlUbyA9IHByb2Nlc3NBZGRyZXNzZXMoZW50cnlbNF0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGVudHJ5WzVdICYmIGVudHJ5WzVdLmxlbmd0aCkge1xuICAgICAgICAgICAgZW52ZWxvcGUudG8gPSBwcm9jZXNzQWRkcmVzc2VzKGVudHJ5WzVdKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChlbnRyeVs2XSAmJiBlbnRyeVs2XS5sZW5ndGgpIHtcbiAgICAgICAgICAgIGVudmVsb3BlLmNjID0gcHJvY2Vzc0FkZHJlc3NlcyhlbnRyeVs2XSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZW50cnlbN10gJiYgZW50cnlbN10ubGVuZ3RoKSB7XG4gICAgICAgICAgICBlbnZlbG9wZS5iY2MgPSBwcm9jZXNzQWRkcmVzc2VzKGVudHJ5WzddKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChlbnRyeVs4XSAmJiBlbnRyeVs4XS52YWx1ZSkge1xuICAgICAgICAgICAgZW52ZWxvcGUuaW5SZXBseVRvID0gKGdldFN0clZhbHVlKGVudHJ5WzhdKSB8fCAnJykudG9TdHJpbmcoKS50cmltKCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZW50cnlbOV0gJiYgZW50cnlbOV0udmFsdWUpIHtcbiAgICAgICAgICAgIGVudmVsb3BlLm1lc3NhZ2VJZCA9IChnZXRTdHJWYWx1ZShlbnRyeVs5XSkgfHwgJycpLnRvU3RyaW5nKCkudHJpbSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGVudmVsb3BlO1xuICAgIH0sXG5cbiAgICBnZXRTdHJ1Y3R1cmVkUGFyYW1zKGFycikge1xuICAgICAgICBsZXQga2V5O1xuXG4gICAgICAgIGxldCBwYXJhbXMgPSB7fTtcblxuICAgICAgICBbXS5jb25jYXQoYXJyIHx8IFtdKS5mb3JFYWNoKCh2YWwsIGopID0+IHtcbiAgICAgICAgICAgIGlmIChqICUgMikge1xuICAgICAgICAgICAgICAgIHBhcmFtc1trZXldID0gbGlibWltZS5kZWNvZGVXb3JkcygoKHZhbCAmJiB2YWwudmFsdWUpIHx8ICcnKS50b1N0cmluZygpKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAga2V5ID0gKCh2YWwgJiYgdmFsLnZhbHVlKSB8fCAnJykudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBpZiAocGFyYW1zLmZpbGVuYW1lICYmICFwYXJhbXNbJ2ZpbGVuYW1lKiddICYmIC9eW2EtelxcLV8wLTldKydbYS16XSonW14nXFx4MDAtXFx4MDhcXHgwYlxceDBjXFx4MGUtXFx4MWZcXHUwMDgwLVxcdUZGRkZdKy8udGVzdChwYXJhbXMuZmlsZW5hbWUpKSB7XG4gICAgICAgICAgICAvLyBzZWVtcyBsaWtlIGVuY29kZWQgdmFsdWVcbiAgICAgICAgICAgIGxldCBbZW5jb2RpbmcsICwgZW5jb2RlZFZhbHVlXSA9IHBhcmFtcy5maWxlbmFtZS5zcGxpdChcIidcIik7XG4gICAgICAgICAgICBpZiAocmVzb2x2ZUNoYXJzZXQoZW5jb2RpbmcpKSB7XG4gICAgICAgICAgICAgICAgcGFyYW1zWydmaWxlbmFtZSonXSA9IGAke2VuY29kaW5nfScnJHtlbmNvZGVkVmFsdWV9YDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHByZXByb2Nlc3MgdmFsdWVzXG4gICAgICAgIE9iamVjdC5rZXlzKHBhcmFtcykuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICAgICAgbGV0IGFjdHVhbEtleTtcbiAgICAgICAgICAgIGxldCBucjtcbiAgICAgICAgICAgIGxldCB2YWx1ZTtcblxuICAgICAgICAgICAgbGV0IG1hdGNoID0ga2V5Lm1hdGNoKC9cXCooKFxcZCspXFwqPyk/JC8pO1xuXG4gICAgICAgICAgICBpZiAoIW1hdGNoKSB7XG4gICAgICAgICAgICAgICAgLy8gbm90aGluZyB0byBkbyBoZXJlLCBkb2VzIG5vdCBzZWVtIGxpa2UgYSBjb250aW51YXRpb24gcGFyYW1cbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGFjdHVhbEtleSA9IGtleS5zdWJzdHIoMCwgbWF0Y2guaW5kZXgpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICBuciA9IE51bWJlcihtYXRjaFsyXSkgfHwgMDtcblxuICAgICAgICAgICAgaWYgKCFwYXJhbXNbYWN0dWFsS2V5XSB8fCB0eXBlb2YgcGFyYW1zW2FjdHVhbEtleV0gIT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICAgICAgcGFyYW1zW2FjdHVhbEtleV0gPSB7XG4gICAgICAgICAgICAgICAgICAgIGNoYXJzZXQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZXM6IFtdXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFsdWUgPSBwYXJhbXNba2V5XTtcblxuICAgICAgICAgICAgaWYgKG5yID09PSAwICYmIG1hdGNoWzBdLmNoYXJBdChtYXRjaFswXS5sZW5ndGggLSAxKSA9PT0gJyonICYmIChtYXRjaCA9IHZhbHVlLm1hdGNoKC9eKFteJ10qKSdbXiddKicoLiopJC8pKSkge1xuICAgICAgICAgICAgICAgIHBhcmFtc1thY3R1YWxLZXldLmNoYXJzZXQgPSBtYXRjaFsxXSB8fCAndXRmLTgnO1xuICAgICAgICAgICAgICAgIHZhbHVlID0gbWF0Y2hbMl07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHBhcmFtc1thY3R1YWxLZXldLnZhbHVlcy5wdXNoKHsgbnIsIHZhbHVlIH0pO1xuXG4gICAgICAgICAgICAvLyByZW1vdmUgdGhlIG9sZCByZWZlcmVuY2VcbiAgICAgICAgICAgIGRlbGV0ZSBwYXJhbXNba2V5XTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gY29uY2F0ZW5hdGUgc3BsaXQgcmZjMjIzMSBzdHJpbmdzIGFuZCBjb252ZXJ0IGVuY29kZWQgc3RyaW5ncyB0byBtaW1lIGVuY29kZWQgd29yZHNcbiAgICAgICAgT2JqZWN0LmtleXMocGFyYW1zKS5mb3JFYWNoKGtleSA9PiB7XG4gICAgICAgICAgICBsZXQgdmFsdWU7XG4gICAgICAgICAgICBpZiAocGFyYW1zW2tleV0gJiYgQXJyYXkuaXNBcnJheShwYXJhbXNba2V5XS52YWx1ZXMpKSB7XG4gICAgICAgICAgICAgICAgdmFsdWUgPSBwYXJhbXNba2V5XS52YWx1ZXNcbiAgICAgICAgICAgICAgICAgICAgLnNvcnQoKGEsIGIpID0+IGEubnIgLSBiLm5yKVxuICAgICAgICAgICAgICAgICAgICAubWFwKHZhbCA9PiAodmFsICYmIHZhbC52YWx1ZSkgfHwgJycpXG4gICAgICAgICAgICAgICAgICAgIC5qb2luKCcnKTtcblxuICAgICAgICAgICAgICAgIGlmIChwYXJhbXNba2V5XS5jaGFyc2V0KSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGNvbnZlcnQgXCIlQUJcIiB0byBcIj0/Y2hhcnNldD9RPz1BQj89XCIgYW5kIHRoZW4gdG8gdW5pY29kZVxuICAgICAgICAgICAgICAgICAgICBwYXJhbXNba2V5XSA9IGxpYm1pbWUuZGVjb2RlV29yZHMoXG4gICAgICAgICAgICAgICAgICAgICAgICAnPT8nICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXNba2V5XS5jaGFyc2V0ICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnP1E/JyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZml4IGludmFsaWRseSBlbmNvZGVkIGNoYXJzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKC9bPT9fXFxzXS9nLCBzID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjID0gcy5jaGFyQ29kZUF0KDApLnRvU3RyaW5nKDE2KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzID09PSAnICcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ18nO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJyUnICsgKGMubGVuZ3RoIDwgMiA/ICcwJyA6ICcnKSArIGM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNoYW5nZSBmcm9tIHVybGVuY29kaW5nIHRvIHBlcmNlbnQgZW5jb2RpbmdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoLyUvZywgJz0nKSArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJz89J1xuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHBhcmFtc1trZXldID0gbGlibWltZS5kZWNvZGVXb3Jkcyh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gcGFyYW1zO1xuICAgIH0sXG5cbiAgICBwYXJzZUJvZHlzdHJ1Y3R1cmUoZW50cnkpIHtcbiAgICAgICAgbGV0IHdhbGsgPSAobm9kZSwgcGF0aCkgPT4ge1xuICAgICAgICAgICAgcGF0aCA9IHBhdGggfHwgW107XG5cbiAgICAgICAgICAgIGxldCBjdXJOb2RlID0ge30sXG4gICAgICAgICAgICAgICAgaSA9IDAsXG4gICAgICAgICAgICAgICAgcGFydCA9IDA7XG5cbiAgICAgICAgICAgIGlmIChwYXRoLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIGN1ck5vZGUucGFydCA9IHBhdGguam9pbignLicpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBtdWx0aXBhcnRcbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KG5vZGVbMF0pKSB7XG4gICAgICAgICAgICAgICAgY3VyTm9kZS5jaGlsZE5vZGVzID0gW107XG4gICAgICAgICAgICAgICAgd2hpbGUgKEFycmF5LmlzQXJyYXkobm9kZVtpXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgY3VyTm9kZS5jaGlsZE5vZGVzLnB1c2god2Fsayhub2RlW2ldLCBwYXRoLmNvbmNhdCgrK3BhcnQpKSk7XG4gICAgICAgICAgICAgICAgICAgIGkrKztcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBtdWx0aXBhcnQgdHlwZVxuICAgICAgICAgICAgICAgIGN1ck5vZGUudHlwZSA9ICdtdWx0aXBhcnQvJyArICgobm9kZVtpKytdIHx8IHt9KS52YWx1ZSB8fCAnJykudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpO1xuXG4gICAgICAgICAgICAgICAgLy8gZXh0ZW5zaW9uIGRhdGEgKG5vdCBhdmFpbGFibGUgZm9yIEJPRFkgcmVxdWVzdHMpXG5cbiAgICAgICAgICAgICAgICAvLyBib2R5IHBhcmFtZXRlciBwYXJlbnRoZXNpemVkIGxpc3RcbiAgICAgICAgICAgICAgICBpZiAoaSA8IG5vZGUubGVuZ3RoIC0gMSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAobm9kZVtpXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY3VyTm9kZS5wYXJhbWV0ZXJzID0gdG9vbHMuZ2V0U3RydWN0dXJlZFBhcmFtcyhub2RlW2ldKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpKys7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBjb250ZW50IHR5cGVcbiAgICAgICAgICAgICAgICBjdXJOb2RlLnR5cGUgPSBbKChub2RlW2krK10gfHwge30pLnZhbHVlIHx8ICcnKS50b1N0cmluZygpLnRvTG93ZXJDYXNlKCksICgobm9kZVtpKytdIHx8IHt9KS52YWx1ZSB8fCAnJykudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpXS5qb2luKCcvJyk7XG5cbiAgICAgICAgICAgICAgICAvLyBib2R5IHBhcmFtZXRlciBwYXJlbnRoZXNpemVkIGxpc3RcbiAgICAgICAgICAgICAgICBpZiAobm9kZVtpXSkge1xuICAgICAgICAgICAgICAgICAgICBjdXJOb2RlLnBhcmFtZXRlcnMgPSB0b29scy5nZXRTdHJ1Y3R1cmVkUGFyYW1zKG5vZGVbaV0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpKys7XG5cbiAgICAgICAgICAgICAgICAvLyBpZFxuICAgICAgICAgICAgICAgIGlmIChub2RlW2ldKSB7XG4gICAgICAgICAgICAgICAgICAgIGN1ck5vZGUuaWQgPSAoKG5vZGVbaV0gfHwge30pLnZhbHVlIHx8ICcnKS50b1N0cmluZygpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpKys7XG5cbiAgICAgICAgICAgICAgICAvLyBkZXNjcmlwdGlvblxuICAgICAgICAgICAgICAgIGlmIChub2RlW2ldKSB7XG4gICAgICAgICAgICAgICAgICAgIGN1ck5vZGUuZGVzY3JpcHRpb24gPSAoKG5vZGVbaV0gfHwge30pLnZhbHVlIHx8ICcnKS50b1N0cmluZygpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpKys7XG5cbiAgICAgICAgICAgICAgICAvLyBlbmNvZGluZ1xuICAgICAgICAgICAgICAgIGlmIChub2RlW2ldKSB7XG4gICAgICAgICAgICAgICAgICAgIGN1ck5vZGUuZW5jb2RpbmcgPSAoKG5vZGVbaV0gfHwge30pLnZhbHVlIHx8ICcnKS50b1N0cmluZygpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGkrKztcblxuICAgICAgICAgICAgICAgIC8vIHNpemVcbiAgICAgICAgICAgICAgICBpZiAobm9kZVtpXSkge1xuICAgICAgICAgICAgICAgICAgICBjdXJOb2RlLnNpemUgPSBOdW1iZXIoKG5vZGVbaV0gfHwge30pLnZhbHVlIHx8IDApIHx8IDA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGkrKztcblxuICAgICAgICAgICAgICAgIGlmIChjdXJOb2RlLnR5cGUgPT09ICdtZXNzYWdlL3JmYzgyMicpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gbWVzc2FnZS9yZmMgYWRkcyBhZGRpdGlvbmFsIGVudmVsb3BlLCBib2R5c3RydWN0dXJlIGFuZCBsaW5lIGNvdW50IHZhbHVlc1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIGVudmVsb3BlXG4gICAgICAgICAgICAgICAgICAgIGlmIChub2RlW2ldKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJOb2RlLmVudmVsb3BlID0gdG9vbHMucGFyc2VFbnZlbG9wZShbXS5jb25jYXQobm9kZVtpXSB8fCBbXSkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGkrKztcblxuICAgICAgICAgICAgICAgICAgICBpZiAobm9kZVtpXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY3VyTm9kZS5jaGlsZE5vZGVzID0gW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJmYzgyMiBib2R5cGFydHMgc2hhcmUgdGhlIHNhbWUgcGF0aCwgZGlmZmVyZW5jZSBpcyBiZXR3ZWVuIE1JTUUgYW5kIEhFQURFUlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBhdGguTUlNRSByZXR1cm5zIG1lc3NhZ2UvcmZjODIyIGhlYWRlclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBhdGguSEVBREVSIHJldHVybnMgaW5saW5lZCBtZXNzYWdlIGhlYWRlclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhbGsobm9kZVtpXSwgcGF0aClcbiAgICAgICAgICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaSsrO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIGxpbmUgY291bnRcbiAgICAgICAgICAgICAgICAgICAgaWYgKG5vZGVbaV0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGN1ck5vZGUubGluZUNvdW50ID0gTnVtYmVyKChub2RlW2ldIHx8IHt9KS52YWx1ZSB8fCAwKSB8fCAwO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGkrKztcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoL150ZXh0XFwvLy50ZXN0KGN1ck5vZGUudHlwZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gdGV4dC8qIGFkZHMgYWRkaXRpb25hbCBsaW5lIGNvdW50IHZhbHVlXG5cbiAgICAgICAgICAgICAgICAgICAgLy8gTkIhIHNvbWUgbGVzcyBrbm93biBzZXJ2ZXJzIGRvIG5vdCBpbmNsdWRlIHRoZSBsaW5lIGNvdW50IHZhbHVlXG4gICAgICAgICAgICAgICAgICAgIC8vIGxlbmd0aCBzaG91bGQgYmUgMTIrXG4gICAgICAgICAgICAgICAgICAgIGlmIChub2RlLmxlbmd0aCA9PT0gMTEgJiYgQXJyYXkuaXNBcnJheShub2RlW2kgKyAxXSkgJiYgIUFycmF5LmlzQXJyYXkobm9kZVtpICsgMl0pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpbnZhbGlkIHN0cnVjdHVyZSwgZGlzcG9zaXRpb24gcGFyYW1zIGFyZSBzaGlmdGVkXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjb3JyZWN0IHN0cnVjdHVyZSwgbGluZSBjb3VudCBudW1iZXIgaXMgcHJvdmlkZWRcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChub2RlW2ldKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGluZSBjb3VudFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1ck5vZGUubGluZUNvdW50ID0gTnVtYmVyKChub2RlW2ldIHx8IHt9KS52YWx1ZSB8fCAwKSB8fCAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gZXh0ZW5zaW9uIGRhdGEgKG5vdCBhdmFpbGFibGUgZm9yIEJPRFkgcmVxdWVzdHMpXG5cbiAgICAgICAgICAgICAgICAvLyBtZDVcbiAgICAgICAgICAgICAgICBpZiAoaSA8IG5vZGUubGVuZ3RoIC0gMSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAobm9kZVtpXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY3VyTm9kZS5tZDUgPSAoKG5vZGVbaV0gfHwge30pLnZhbHVlIHx8ICcnKS50b1N0cmluZygpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gdGhlIGZvbGxvd2luZyBhcmUgc2hhcmVkIGV4dGVuc2lvbiB2YWx1ZXMgKGZvciBib3RoIG11bHRpcGFydCBhbmQgbm9uLW11bHRpcGFydCBwYXJ0cylcbiAgICAgICAgICAgIC8vIG5vdCBhdmFpbGFibGUgZm9yIEJPRFkgcmVxdWVzdHNcblxuICAgICAgICAgICAgLy8gYm9keSBkaXNwb3NpdGlvblxuICAgICAgICAgICAgaWYgKGkgPCBub2RlLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShub2RlW2ldKSAmJiBub2RlW2ldLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICBjdXJOb2RlLmRpc3Bvc2l0aW9uID0gKChub2RlW2ldWzBdIHx8IHt9KS52YWx1ZSB8fCAnJykudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShub2RlW2ldWzFdKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY3VyTm9kZS5kaXNwb3NpdGlvblBhcmFtZXRlcnMgPSB0b29scy5nZXRTdHJ1Y3R1cmVkUGFyYW1zKG5vZGVbaV1bMV0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGkrKztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gYm9keSBsYW5ndWFnZVxuICAgICAgICAgICAgaWYgKGkgPCBub2RlLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICAgICAgICBpZiAobm9kZVtpXSkge1xuICAgICAgICAgICAgICAgICAgICBjdXJOb2RlLmxhbmd1YWdlID0gW10uY29uY2F0KG5vZGVbaV0gfHwgW10pLm1hcCh2YWwgPT4gKCh2YWwgJiYgdmFsLnZhbHVlKSB8fCAnJykudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBib2R5IGxvY2F0aW9uXG4gICAgICAgICAgICAvLyBOQiEgZGVmaW5lZCBhcyBhIFwic3RyaW5nIGxpc3RcIiBpbiBSRkMzNTAxIGJ1dCByZXBsYWNlZCBpbiBlcnJhdGEgZG9jdW1lbnQgd2l0aCBcInN0cmluZ1wiXG4gICAgICAgICAgICAvLyBFcnJhdGE6IGh0dHA6Ly93d3cucmZjLWVkaXRvci5vcmcvZXJyYXRhX3NlYXJjaC5waHA/cmZjPTM1MDFcbiAgICAgICAgICAgIGlmIChpIDwgbm9kZS5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgICAgICAgaWYgKG5vZGVbaV0pIHtcbiAgICAgICAgICAgICAgICAgICAgY3VyTm9kZS5sb2NhdGlvbiA9ICgobm9kZVtpXSB8fCB7fSkudmFsdWUgfHwgJycpLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGkrKztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIGN1ck5vZGU7XG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIHdhbGsoZW50cnkpO1xuICAgIH0sXG5cbiAgICBmb3JtYXREYXRlKHZhbHVlKSB7XG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICB2YWx1ZSA9IG5ldyBEYXRlKHZhbHVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nKHZhbHVlKSAhPT0gJ1tvYmplY3QgT2JqZWN0XScgfHwgdmFsdWUudG9TdHJpbmcoKSA9PT0gJ0ludmFsaWQgRGF0ZScpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhbHVlID0gdmFsdWUudG9JU09TdHJpbmcoKS5zdWJzdHIoMCwgMTApO1xuICAgICAgICB2YWx1ZSA9IHZhbHVlLnNwbGl0KCctJyk7XG4gICAgICAgIHZhbHVlLnJldmVyc2UoKTtcblxuICAgICAgICBsZXQgbW9udGhzID0gWydKYW4nLCAnRmViJywgJ01hcicsICdBcHInLCAnTWF5JywgJ0p1bicsICdKdWwnLCAnQXVnJywgJ1NlcCcsICdPY3QnLCAnTm92JywgJ0RlYyddO1xuICAgICAgICB2YWx1ZVsxXSA9IG1vbnRoc1tOdW1iZXIodmFsdWVbMV0pIC0gMV07XG5cbiAgICAgICAgcmV0dXJuIHZhbHVlLmpvaW4oJy0nKTtcbiAgICB9LFxuXG4gICAgZm9ybWF0RGF0ZVRpbWUodmFsdWUpIHtcbiAgICAgICAgaWYgKCF2YWx1ZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHZhbHVlID0gbmV3IERhdGUodmFsdWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcodmFsdWUpICE9PSAnW29iamVjdCBPYmplY3RdJyB8fCB2YWx1ZS50b1N0cmluZygpID09PSAnSW52YWxpZCBEYXRlJykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGRhdGVTdHIgPSB0b29scy5mb3JtYXREYXRlKHZhbHVlKS5yZXBsYWNlKC9eMC8sICcgJyk7IC8vc3RhcnRzIHdpdGggZGF0ZS1kYXktZml4ZWQgd2l0aCBsZWFkaW5nIDAgcmVwbGFjZWQgYnkgU1BcbiAgICAgICAgbGV0IHRpbWVTdHIgPSB2YWx1ZS50b0lTT1N0cmluZygpLnN1YnN0cigxMSwgOCk7XG5cbiAgICAgICAgcmV0dXJuIGAke2RhdGVTdHJ9ICR7dGltZVN0cn0gKzAwMDBgO1xuICAgIH0sXG5cbiAgICBmb3JtYXRGbGFnKGZsYWcpIHtcbiAgICAgICAgc3dpdGNoIChmbGFnLnRvTG93ZXJDYXNlKCkpIHtcbiAgICAgICAgICAgIGNhc2UgJ1xcXFxyZWNlbnQnOlxuICAgICAgICAgICAgICAgIC8vIGNhbiBub3Qgc2V0IG9yIHJlbW92ZVxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIGNhc2UgJ1xcXFxzZWVuJzpcbiAgICAgICAgICAgIGNhc2UgJ1xcXFxhbnN3ZXJlZCc6XG4gICAgICAgICAgICBjYXNlICdcXFxcZmxhZ2dlZCc6XG4gICAgICAgICAgICBjYXNlICdcXFxcZGVsZXRlZCc6XG4gICAgICAgICAgICBjYXNlICdcXFxcZHJhZnQnOlxuICAgICAgICAgICAgICAgIC8vIGNhbiBub3Qgc2V0IG9yIHJlbW92ZVxuICAgICAgICAgICAgICAgIHJldHVybiBmbGFnLnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvXlxcXFwuLywgYyA9PiBjLnRvVXBwZXJDYXNlKCkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmbGFnO1xuICAgIH0sXG5cbiAgICBjYW5Vc2VGbGFnKG1haWxib3gsIGZsYWcpIHtcbiAgICAgICAgcmV0dXJuICFtYWlsYm94IHx8ICFtYWlsYm94LnBlcm1hbmVudEZsYWdzIHx8IG1haWxib3gucGVybWFuZW50RmxhZ3MuaGFzKCdcXFxcKicpIHx8IG1haWxib3gucGVybWFuZW50RmxhZ3MuaGFzKGZsYWcpO1xuICAgIH0sXG5cbiAgICBleHBhbmRSYW5nZShyYW5nZSkge1xuICAgICAgICByZXR1cm4gcmFuZ2Uuc3BsaXQoJywnKS5mbGF0TWFwKGVudHJ5ID0+IHtcbiAgICAgICAgICAgIGVudHJ5ID0gZW50cnkudHJpbSgpO1xuICAgICAgICAgICAgbGV0IGNvbG9uID0gZW50cnkuaW5kZXhPZignOicpO1xuICAgICAgICAgICAgaWYgKGNvbG9uIDwgMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBOdW1iZXIoZW50cnkpIHx8IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgZmlyc3QgPSBOdW1iZXIoZW50cnkuc3Vic3RyKDAsIGNvbG9uKSkgfHwgMDtcbiAgICAgICAgICAgIGxldCBzZWNvbmQgPSBOdW1iZXIoZW50cnkuc3Vic3RyKGNvbG9uICsgMSkpIHx8IDA7XG4gICAgICAgICAgICBpZiAoZmlyc3QgPT09IHNlY29uZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmaXJzdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCBsaXN0ID0gW107XG4gICAgICAgICAgICBpZiAoZmlyc3QgPCBzZWNvbmQpIHtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gZmlyc3Q7IGkgPD0gc2Vjb25kOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgbGlzdC5wdXNoKGkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IGZpcnN0OyBpID49IHNlY29uZDsgaS0tKSB7XG4gICAgICAgICAgICAgICAgICAgIGxpc3QucHVzaChpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbGlzdDtcbiAgICAgICAgfSk7XG4gICAgfSxcblxuICAgIGdldERlY29kZXIoY2hhcnNldCkge1xuICAgICAgICBjaGFyc2V0ID0gKGNoYXJzZXQgfHwgJ2FzY2lpJykudG9TdHJpbmcoKS50cmltKCkudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgaWYgKC9eamlzfF5pc28tPzIwMjItP2pwfF5FVUNKUC9pLnRlc3QoY2hhcnNldCkpIHtcbiAgICAgICAgICAgIC8vIHNwZWNpYWwgY2FzZSBub3Qgc3VwcG9ydGVkIGJ5IGljb252LWxpdGVcbiAgICAgICAgICAgIHJldHVybiBuZXcgSlBEZWNvZGVyKGNoYXJzZXQpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGljb252LmRlY29kZVN0cmVhbShjaGFyc2V0KTtcbiAgICB9LFxuXG4gICAgcGFja01lc3NhZ2VSYW5nZShsaXN0KSB7XG4gICAgICAgIGlmICh0eXBlb2YgdWlkTGlzdCA9PT0gJ3N0cmluZycpXG4gICAgICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkobGlzdCkpIHtcbiAgICAgICAgICAgICAgICBsaXN0ID0gW10uY29uY2F0KGxpc3QgfHwgW10pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgIGlmICghbGlzdC5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiAnJztcbiAgICAgICAgfVxuXG4gICAgICAgIGxpc3Quc29ydCgoYSwgYikgPT4gYSAtIGIpO1xuXG4gICAgICAgIGxldCBsYXN0ID0gbGlzdFtsaXN0Lmxlbmd0aCAtIDFdO1xuICAgICAgICBsZXQgcmVzdWx0ID0gW1tsYXN0XV07XG4gICAgICAgIGZvciAobGV0IGkgPSBsaXN0Lmxlbmd0aCAtIDI7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgICBpZiAobGlzdFtpXSA9PT0gbGlzdFtpICsgMV0gLSAxKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0WzBdLnVuc2hpZnQobGlzdFtpXSk7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXN1bHQudW5zaGlmdChbbGlzdFtpXV0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmVzdWx0ID0gcmVzdWx0Lm1hcChpdGVtID0+IHtcbiAgICAgICAgICAgIGlmIChpdGVtLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBpdGVtWzBdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGl0ZW0uc2hpZnQoKSArICc6JyArIGl0ZW0ucG9wKCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiByZXN1bHQuam9pbignLCcpO1xuICAgIH1cbn07XG5cbm1vZHVsZS5leHBvcnRzID0gdG9vbHM7XG4iXSwibmFtZXMiOltdLCJpZ25vcmVMaXN0IjpbMF0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(rsc)/./node_modules/imapflow/lib/tools.js\n");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "(rsc)/./node_modules/imapflow/node_modules/mailsplit/index.js":
|
|
/*!***************************************************************!*\
|
|
!*** ./node_modules/imapflow/node_modules/mailsplit/index.js ***!
|
|
\***************************************************************/
|
|
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
|
|
|
|
eval("\n\nconst MessageSplitter = __webpack_require__(/*! ./lib/message-splitter */ \"(rsc)/./node_modules/imapflow/node_modules/mailsplit/lib/message-splitter.js\");\nconst MessageJoiner = __webpack_require__(/*! ./lib/message-joiner */ \"(rsc)/./node_modules/imapflow/node_modules/mailsplit/lib/message-joiner.js\");\nconst NodeRewriter = __webpack_require__(/*! ./lib/node-rewriter */ \"(rsc)/./node_modules/imapflow/node_modules/mailsplit/lib/node-rewriter.js\");\nconst NodeStreamer = __webpack_require__(/*! ./lib/node-streamer */ \"(rsc)/./node_modules/imapflow/node_modules/mailsplit/lib/node-streamer.js\");\nconst Headers = __webpack_require__(/*! ./lib/headers */ \"(rsc)/./node_modules/imapflow/node_modules/mailsplit/lib/headers.js\");\n\nmodule.exports = {\n Splitter: MessageSplitter,\n Joiner: MessageJoiner,\n Rewriter: NodeRewriter,\n Streamer: NodeStreamer,\n Headers\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHJzYykvLi9ub2RlX21vZHVsZXMvaW1hcGZsb3cvbm9kZV9tb2R1bGVzL21haWxzcGxpdC9pbmRleC5qcyIsIm1hcHBpbmdzIjoiQUFBYTs7QUFFYix3QkFBd0IsbUJBQU8sQ0FBQyw0R0FBd0I7QUFDeEQsc0JBQXNCLG1CQUFPLENBQUMsd0dBQXNCO0FBQ3BELHFCQUFxQixtQkFBTyxDQUFDLHNHQUFxQjtBQUNsRCxxQkFBcUIsbUJBQU8sQ0FBQyxzR0FBcUI7QUFDbEQsZ0JBQWdCLG1CQUFPLENBQUMsMEZBQWU7O0FBRXZDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyIvaG9tZS9hbG1hL25leHRnZW4vTmVhaC1tYWlsL25vZGVfbW9kdWxlcy9pbWFwZmxvdy9ub2RlX21vZHVsZXMvbWFpbHNwbGl0L2luZGV4LmpzIl0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcblxuY29uc3QgTWVzc2FnZVNwbGl0dGVyID0gcmVxdWlyZSgnLi9saWIvbWVzc2FnZS1zcGxpdHRlcicpO1xuY29uc3QgTWVzc2FnZUpvaW5lciA9IHJlcXVpcmUoJy4vbGliL21lc3NhZ2Utam9pbmVyJyk7XG5jb25zdCBOb2RlUmV3cml0ZXIgPSByZXF1aXJlKCcuL2xpYi9ub2RlLXJld3JpdGVyJyk7XG5jb25zdCBOb2RlU3RyZWFtZXIgPSByZXF1aXJlKCcuL2xpYi9ub2RlLXN0cmVhbWVyJyk7XG5jb25zdCBIZWFkZXJzID0gcmVxdWlyZSgnLi9saWIvaGVhZGVycycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgICBTcGxpdHRlcjogTWVzc2FnZVNwbGl0dGVyLFxuICAgIEpvaW5lcjogTWVzc2FnZUpvaW5lcixcbiAgICBSZXdyaXRlcjogTm9kZVJld3JpdGVyLFxuICAgIFN0cmVhbWVyOiBOb2RlU3RyZWFtZXIsXG4gICAgSGVhZGVyc1xufTtcbiJdLCJuYW1lcyI6W10sImlnbm9yZUxpc3QiOlswXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(rsc)/./node_modules/imapflow/node_modules/mailsplit/index.js\n");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "(rsc)/./node_modules/imapflow/node_modules/mailsplit/lib/flowed-decoder.js":
|
|
/*!****************************************************************************!*\
|
|
!*** ./node_modules/imapflow/node_modules/mailsplit/lib/flowed-decoder.js ***!
|
|
\****************************************************************************/
|
|
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
|
|
|
|
eval("\n\n// Helper class to rewrite nodes with specific mime type\n\nconst Transform = (__webpack_require__(/*! stream */ \"stream\").Transform);\nconst libmime = __webpack_require__(/*! libmime */ \"(rsc)/./node_modules/libmime/lib/libmime.js\");\n\n/**\n * Really bad \"stream\" transform to parse format=flowed content\n *\n * @constructor\n * @param {String} delSp True if delsp option was used\n */\nclass FlowedDecoder extends Transform {\n constructor(config) {\n super();\n this.config = config || {};\n\n this.chunks = [];\n this.chunklen = 0;\n\n this.libmime = new libmime.Libmime({ Iconv: config.Iconv });\n }\n\n _transform(chunk, encoding, callback) {\n if (!chunk || !chunk.length) {\n return callback();\n }\n\n if (!encoding !== 'buffer') {\n chunk = Buffer.from(chunk, encoding);\n }\n\n this.chunks.push(chunk);\n this.chunklen += chunk.length;\n\n callback();\n }\n\n _flush(callback) {\n if (this.chunklen) {\n let currentBody = Buffer.concat(this.chunks, this.chunklen);\n\n if (this.config.encoding === 'base64') {\n currentBody = Buffer.from(currentBody.toString('binary'), 'base64');\n }\n\n let content = this.libmime.decodeFlowed(currentBody.toString('binary'), this.config.delSp);\n this.push(Buffer.from(content, 'binary'));\n }\n return callback();\n }\n}\n\nmodule.exports = FlowedDecoder;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHJzYykvLi9ub2RlX21vZHVsZXMvaW1hcGZsb3cvbm9kZV9tb2R1bGVzL21haWxzcGxpdC9saWIvZmxvd2VkLWRlY29kZXIuanMiLCJtYXBwaW5ncyI6IkFBQWE7O0FBRWI7O0FBRUEsa0JBQWtCLHVEQUEyQjtBQUM3QyxnQkFBZ0IsbUJBQU8sQ0FBQyw0REFBUzs7QUFFakM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBLDZDQUE2QyxxQkFBcUI7QUFDbEU7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSIsInNvdXJjZXMiOlsiL2hvbWUvYWxtYS9uZXh0Z2VuL05lYWgtbWFpbC9ub2RlX21vZHVsZXMvaW1hcGZsb3cvbm9kZV9tb2R1bGVzL21haWxzcGxpdC9saWIvZmxvd2VkLWRlY29kZXIuanMiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG4vLyBIZWxwZXIgY2xhc3MgdG8gcmV3cml0ZSBub2RlcyB3aXRoIHNwZWNpZmljIG1pbWUgdHlwZVxuXG5jb25zdCBUcmFuc2Zvcm0gPSByZXF1aXJlKCdzdHJlYW0nKS5UcmFuc2Zvcm07XG5jb25zdCBsaWJtaW1lID0gcmVxdWlyZSgnbGlibWltZScpO1xuXG4vKipcbiAqIFJlYWxseSBiYWQgXCJzdHJlYW1cIiB0cmFuc2Zvcm0gdG8gcGFyc2UgZm9ybWF0PWZsb3dlZCBjb250ZW50XG4gKlxuICogQGNvbnN0cnVjdG9yXG4gKiBAcGFyYW0ge1N0cmluZ30gZGVsU3AgVHJ1ZSBpZiBkZWxzcCBvcHRpb24gd2FzIHVzZWRcbiAqL1xuY2xhc3MgRmxvd2VkRGVjb2RlciBleHRlbmRzIFRyYW5zZm9ybSB7XG4gICAgY29uc3RydWN0b3IoY29uZmlnKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuY29uZmlnID0gY29uZmlnIHx8IHt9O1xuXG4gICAgICAgIHRoaXMuY2h1bmtzID0gW107XG4gICAgICAgIHRoaXMuY2h1bmtsZW4gPSAwO1xuXG4gICAgICAgIHRoaXMubGlibWltZSA9IG5ldyBsaWJtaW1lLkxpYm1pbWUoeyBJY29udjogY29uZmlnLkljb252IH0pO1xuICAgIH1cblxuICAgIF90cmFuc2Zvcm0oY2h1bmssIGVuY29kaW5nLCBjYWxsYmFjaykge1xuICAgICAgICBpZiAoIWNodW5rIHx8ICFjaHVuay5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiBjYWxsYmFjaygpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFlbmNvZGluZyAhPT0gJ2J1ZmZlcicpIHtcbiAgICAgICAgICAgIGNodW5rID0gQnVmZmVyLmZyb20oY2h1bmssIGVuY29kaW5nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY2h1bmtzLnB1c2goY2h1bmspO1xuICAgICAgICB0aGlzLmNodW5rbGVuICs9IGNodW5rLmxlbmd0aDtcblxuICAgICAgICBjYWxsYmFjaygpO1xuICAgIH1cblxuICAgIF9mbHVzaChjYWxsYmFjaykge1xuICAgICAgICBpZiAodGhpcy5jaHVua2xlbikge1xuICAgICAgICAgICAgbGV0IGN1cnJlbnRCb2R5ID0gQnVmZmVyLmNvbmNhdCh0aGlzLmNodW5rcywgdGhpcy5jaHVua2xlbik7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLmNvbmZpZy5lbmNvZGluZyA9PT0gJ2Jhc2U2NCcpIHtcbiAgICAgICAgICAgICAgICBjdXJyZW50Qm9keSA9IEJ1ZmZlci5mcm9tKGN1cnJlbnRCb2R5LnRvU3RyaW5nKCdiaW5hcnknKSwgJ2Jhc2U2NCcpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsZXQgY29udGVudCA9IHRoaXMubGlibWltZS5kZWNvZGVGbG93ZWQoY3VycmVudEJvZHkudG9TdHJpbmcoJ2JpbmFyeScpLCB0aGlzLmNvbmZpZy5kZWxTcCk7XG4gICAgICAgICAgICB0aGlzLnB1c2goQnVmZmVyLmZyb20oY29udGVudCwgJ2JpbmFyeScpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY2FsbGJhY2soKTtcbiAgICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gRmxvd2VkRGVjb2RlcjtcbiJdLCJuYW1lcyI6W10sImlnbm9yZUxpc3QiOlswXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(rsc)/./node_modules/imapflow/node_modules/mailsplit/lib/flowed-decoder.js\n");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "(rsc)/./node_modules/imapflow/node_modules/mailsplit/lib/headers.js":
|
|
/*!*********************************************************************!*\
|
|
!*** ./node_modules/imapflow/node_modules/mailsplit/lib/headers.js ***!
|
|
\*********************************************************************/
|
|
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
|
|
|
|
eval("\n\nconst libmime = __webpack_require__(/*! libmime */ \"(rsc)/./node_modules/libmime/lib/libmime.js\");\n\n/**\n * Class Headers to parse and handle message headers. Headers instance allows to\n * check existing, delete or add new headers\n */\nclass Headers {\n constructor(headers, config) {\n config = config || {};\n\n if (Array.isArray(headers)) {\n // already using parsed headers\n this.changed = true;\n this.headers = false;\n this.parsed = true;\n this.lines = headers;\n } else {\n // using original string/buffer headers\n this.changed = false;\n this.headers = headers;\n this.parsed = false;\n this.lines = false;\n }\n this.mbox = false;\n this.http = false;\n\n this.libmime = new libmime.Libmime({ Iconv: config.Iconv });\n }\n\n hasHeader(key) {\n if (!this.parsed) {\n this._parseHeaders();\n }\n key = this._normalizeHeader(key);\n return typeof this.lines.find(line => line.key === key) === 'object';\n }\n\n get(key) {\n if (!this.parsed) {\n this._parseHeaders();\n }\n key = this._normalizeHeader(key);\n let lines = this.lines.filter(line => line.key === key).map(line => line.line);\n\n return lines;\n }\n\n getDecoded(key) {\n return this.get(key)\n .map(line => this.libmime.decodeHeader(line))\n .filter(line => line && line.value);\n }\n\n getFirst(key) {\n if (!this.parsed) {\n this._parseHeaders();\n }\n key = this._normalizeHeader(key);\n let header = this.lines.find(line => line.key === key);\n if (!header) {\n return '';\n }\n return ((this.libmime.decodeHeader(header.line) || {}).value || '').toString().trim();\n }\n\n getList() {\n if (!this.parsed) {\n this._parseHeaders();\n }\n return this.lines;\n }\n\n add(key, value, index) {\n if (typeof value === 'undefined') {\n return;\n }\n\n if (typeof value === 'number') {\n value = value.toString();\n }\n\n if (typeof value === 'string') {\n value = Buffer.from(value);\n }\n\n value = value.toString('binary');\n this.addFormatted(key, this.libmime.foldLines(key + ': ' + value.replace(/\\r?\\n/g, ''), 76, false), index);\n }\n\n addFormatted(key, line, index) {\n if (!this.parsed) {\n this._parseHeaders();\n }\n index = index || 0;\n this.changed = true;\n\n if (!line) {\n return;\n }\n\n if (typeof line !== 'string') {\n line = line.toString('binary');\n }\n\n let header = {\n key: this._normalizeHeader(key),\n line\n };\n\n if (index < 1) {\n this.lines.unshift(header);\n } else if (index >= this.lines.length) {\n this.lines.push(header);\n } else {\n this.lines.splice(index, 0, header);\n }\n }\n\n remove(key) {\n if (!this.parsed) {\n this._parseHeaders();\n }\n key = this._normalizeHeader(key);\n for (let i = this.lines.length - 1; i >= 0; i--) {\n if (this.lines[i].key === key) {\n this.changed = true;\n this.lines.splice(i, 1);\n }\n }\n }\n\n update(key, value, relativeIndex) {\n if (!this.parsed) {\n this._parseHeaders();\n }\n let keyName = key;\n let index = 0;\n key = this._normalizeHeader(key);\n let relativeIndexCount = 0;\n let relativeMatchFound = false;\n for (let i = this.lines.length - 1; i >= 0; i--) {\n if (this.lines[i].key === key) {\n if (relativeIndex && relativeIndex !== relativeIndexCount) {\n relativeIndexCount++;\n continue;\n }\n index = i;\n this.changed = true;\n this.lines.splice(i, 1);\n if (relativeIndex) {\n relativeMatchFound = true;\n break;\n }\n }\n }\n\n if (relativeIndex && !relativeMatchFound) {\n return;\n }\n\n this.add(keyName, value, index);\n }\n\n build(lineEnd) {\n if (!this.changed && !lineEnd) {\n return typeof this.headers === 'string' ? Buffer.from(this.headers, 'binary') : this.headers;\n }\n\n if (!this.parsed) {\n this._parseHeaders();\n }\n\n lineEnd = lineEnd || '\\r\\n';\n\n let headers = this.lines.map(line => line.line.replace(/\\r?\\n/g, lineEnd)).join(lineEnd) + `${lineEnd}${lineEnd}`;\n\n if (this.mbox) {\n headers = this.mbox + lineEnd + headers;\n }\n\n if (this.http) {\n headers = this.http + lineEnd + headers;\n }\n\n return Buffer.from(headers, 'binary');\n }\n\n _normalizeHeader(key) {\n return (key || '').toLowerCase().trim();\n }\n\n _parseHeaders() {\n if (!this.headers) {\n this.lines = [];\n this.parsed = true;\n return;\n }\n\n let lines = this.headers\n .toString('binary')\n .replace(/[\\r\\n]+$/, '')\n .split(/\\r?\\n/);\n\n for (let i = lines.length - 1; i >= 0; i--) {\n let chr = lines[i].charAt(0);\n if (i && (chr === ' ' || chr === '\\t')) {\n lines[i - 1] += '\\r\\n' + lines[i];\n lines.splice(i, 1);\n } else {\n let line = lines[i];\n if (!i && /^From /i.test(line)) {\n // mbox file\n this.mbox = line;\n lines.splice(i, 1);\n continue;\n } else if (!i && /^POST /i.test(line)) {\n // HTTP POST request\n this.http = line;\n lines.splice(i, 1);\n continue;\n }\n let key = this._normalizeHeader(line.substr(0, line.indexOf(':')));\n lines[i] = {\n key,\n line\n };\n }\n }\n\n this.lines = lines;\n this.parsed = true;\n }\n}\n\n// expose to the world\nmodule.exports = Headers;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHJzYykvLi9ub2RlX21vZHVsZXMvaW1hcGZsb3cvbm9kZV9tb2R1bGVzL21haWxzcGxpdC9saWIvaGVhZGVycy5qcyIsIm1hcHBpbmdzIjoiQUFBYTs7QUFFYixnQkFBZ0IsbUJBQU8sQ0FBQyw0REFBUzs7QUFFakM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsNkNBQTZDLHFCQUFxQjtBQUNsRTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZEQUE2RDtBQUM3RDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRDQUE0QyxRQUFRO0FBQ3BEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0Q0FBNEMsUUFBUTtBQUNwRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQSxzR0FBc0csUUFBUSxFQUFFLFFBQVE7O0FBRXhIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLHVDQUF1QyxRQUFRO0FBQy9DO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSIsInNvdXJjZXMiOlsiL2hvbWUvYWxtYS9uZXh0Z2VuL05lYWgtbWFpbC9ub2RlX21vZHVsZXMvaW1hcGZsb3cvbm9kZV9tb2R1bGVzL21haWxzcGxpdC9saWIvaGVhZGVycy5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbmNvbnN0IGxpYm1pbWUgPSByZXF1aXJlKCdsaWJtaW1lJyk7XG5cbi8qKlxuICogQ2xhc3MgSGVhZGVycyB0byBwYXJzZSBhbmQgaGFuZGxlIG1lc3NhZ2UgaGVhZGVycy4gSGVhZGVycyBpbnN0YW5jZSBhbGxvd3MgdG9cbiAqIGNoZWNrIGV4aXN0aW5nLCBkZWxldGUgb3IgYWRkIG5ldyBoZWFkZXJzXG4gKi9cbmNsYXNzIEhlYWRlcnMge1xuICAgIGNvbnN0cnVjdG9yKGhlYWRlcnMsIGNvbmZpZykge1xuICAgICAgICBjb25maWcgPSBjb25maWcgfHwge307XG5cbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoaGVhZGVycykpIHtcbiAgICAgICAgICAgIC8vIGFscmVhZHkgdXNpbmcgcGFyc2VkIGhlYWRlcnNcbiAgICAgICAgICAgIHRoaXMuY2hhbmdlZCA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLmhlYWRlcnMgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMucGFyc2VkID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMubGluZXMgPSBoZWFkZXJzO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gdXNpbmcgb3JpZ2luYWwgc3RyaW5nL2J1ZmZlciBoZWFkZXJzXG4gICAgICAgICAgICB0aGlzLmNoYW5nZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMuaGVhZGVycyA9IGhlYWRlcnM7XG4gICAgICAgICAgICB0aGlzLnBhcnNlZCA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5saW5lcyA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubWJveCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmh0dHAgPSBmYWxzZTtcblxuICAgICAgICB0aGlzLmxpYm1pbWUgPSBuZXcgbGlibWltZS5MaWJtaW1lKHsgSWNvbnY6IGNvbmZpZy5JY29udiB9KTtcbiAgICB9XG5cbiAgICBoYXNIZWFkZXIoa2V5KSB7XG4gICAgICAgIGlmICghdGhpcy5wYXJzZWQpIHtcbiAgICAgICAgICAgIHRoaXMuX3BhcnNlSGVhZGVycygpO1xuICAgICAgICB9XG4gICAgICAgIGtleSA9IHRoaXMuX25vcm1hbGl6ZUhlYWRlcihrZXkpO1xuICAgICAgICByZXR1cm4gdHlwZW9mIHRoaXMubGluZXMuZmluZChsaW5lID0+IGxpbmUua2V5ID09PSBrZXkpID09PSAnb2JqZWN0JztcbiAgICB9XG5cbiAgICBnZXQoa2V5KSB7XG4gICAgICAgIGlmICghdGhpcy5wYXJzZWQpIHtcbiAgICAgICAgICAgIHRoaXMuX3BhcnNlSGVhZGVycygpO1xuICAgICAgICB9XG4gICAgICAgIGtleSA9IHRoaXMuX25vcm1hbGl6ZUhlYWRlcihrZXkpO1xuICAgICAgICBsZXQgbGluZXMgPSB0aGlzLmxpbmVzLmZpbHRlcihsaW5lID0+IGxpbmUua2V5ID09PSBrZXkpLm1hcChsaW5lID0+IGxpbmUubGluZSk7XG5cbiAgICAgICAgcmV0dXJuIGxpbmVzO1xuICAgIH1cblxuICAgIGdldERlY29kZWQoa2V5KSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldChrZXkpXG4gICAgICAgICAgICAubWFwKGxpbmUgPT4gdGhpcy5saWJtaW1lLmRlY29kZUhlYWRlcihsaW5lKSlcbiAgICAgICAgICAgIC5maWx0ZXIobGluZSA9PiBsaW5lICYmIGxpbmUudmFsdWUpO1xuICAgIH1cblxuICAgIGdldEZpcnN0KGtleSkge1xuICAgICAgICBpZiAoIXRoaXMucGFyc2VkKSB7XG4gICAgICAgICAgICB0aGlzLl9wYXJzZUhlYWRlcnMoKTtcbiAgICAgICAgfVxuICAgICAgICBrZXkgPSB0aGlzLl9ub3JtYWxpemVIZWFkZXIoa2V5KTtcbiAgICAgICAgbGV0IGhlYWRlciA9IHRoaXMubGluZXMuZmluZChsaW5lID0+IGxpbmUua2V5ID09PSBrZXkpO1xuICAgICAgICBpZiAoIWhlYWRlcikge1xuICAgICAgICAgICAgcmV0dXJuICcnO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAoKHRoaXMubGlibWltZS5kZWNvZGVIZWFkZXIoaGVhZGVyLmxpbmUpIHx8IHt9KS52YWx1ZSB8fCAnJykudG9TdHJpbmcoKS50cmltKCk7XG4gICAgfVxuXG4gICAgZ2V0TGlzdCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLnBhcnNlZCkge1xuICAgICAgICAgICAgdGhpcy5fcGFyc2VIZWFkZXJzKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMubGluZXM7XG4gICAgfVxuXG4gICAgYWRkKGtleSwgdmFsdWUsIGluZGV4KSB7XG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS50b1N0cmluZygpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHZhbHVlID0gQnVmZmVyLmZyb20odmFsdWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFsdWUgPSB2YWx1ZS50b1N0cmluZygnYmluYXJ5Jyk7XG4gICAgICAgIHRoaXMuYWRkRm9ybWF0dGVkKGtleSwgdGhpcy5saWJtaW1lLmZvbGRMaW5lcyhrZXkgKyAnOiAnICsgdmFsdWUucmVwbGFjZSgvXFxyP1xcbi9nLCAnJyksIDc2LCBmYWxzZSksIGluZGV4KTtcbiAgICB9XG5cbiAgICBhZGRGb3JtYXR0ZWQoa2V5LCBsaW5lLCBpbmRleCkge1xuICAgICAgICBpZiAoIXRoaXMucGFyc2VkKSB7XG4gICAgICAgICAgICB0aGlzLl9wYXJzZUhlYWRlcnMoKTtcbiAgICAgICAgfVxuICAgICAgICBpbmRleCA9IGluZGV4IHx8IDA7XG4gICAgICAgIHRoaXMuY2hhbmdlZCA9IHRydWU7XG5cbiAgICAgICAgaWYgKCFsaW5lKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZW9mIGxpbmUgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBsaW5lID0gbGluZS50b1N0cmluZygnYmluYXJ5Jyk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgaGVhZGVyID0ge1xuICAgICAgICAgICAga2V5OiB0aGlzLl9ub3JtYWxpemVIZWFkZXIoa2V5KSxcbiAgICAgICAgICAgIGxpbmVcbiAgICAgICAgfTtcblxuICAgICAgICBpZiAoaW5kZXggPCAxKSB7XG4gICAgICAgICAgICB0aGlzLmxpbmVzLnVuc2hpZnQoaGVhZGVyKTtcbiAgICAgICAgfSBlbHNlIGlmIChpbmRleCA+PSB0aGlzLmxpbmVzLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy5saW5lcy5wdXNoKGhlYWRlcik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmxpbmVzLnNwbGljZShpbmRleCwgMCwgaGVhZGVyKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJlbW92ZShrZXkpIHtcbiAgICAgICAgaWYgKCF0aGlzLnBhcnNlZCkge1xuICAgICAgICAgICAgdGhpcy5fcGFyc2VIZWFkZXJzKCk7XG4gICAgICAgIH1cbiAgICAgICAga2V5ID0gdGhpcy5fbm9ybWFsaXplSGVhZGVyKGtleSk7XG4gICAgICAgIGZvciAobGV0IGkgPSB0aGlzLmxpbmVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5saW5lc1tpXS5rZXkgPT09IGtleSkge1xuICAgICAgICAgICAgICAgIHRoaXMuY2hhbmdlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgdGhpcy5saW5lcy5zcGxpY2UoaSwgMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB1cGRhdGUoa2V5LCB2YWx1ZSwgcmVsYXRpdmVJbmRleCkge1xuICAgICAgICBpZiAoIXRoaXMucGFyc2VkKSB7XG4gICAgICAgICAgICB0aGlzLl9wYXJzZUhlYWRlcnMoKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQga2V5TmFtZSA9IGtleTtcbiAgICAgICAgbGV0IGluZGV4ID0gMDtcbiAgICAgICAga2V5ID0gdGhpcy5fbm9ybWFsaXplSGVhZGVyKGtleSk7XG4gICAgICAgIGxldCByZWxhdGl2ZUluZGV4Q291bnQgPSAwO1xuICAgICAgICBsZXQgcmVsYXRpdmVNYXRjaEZvdW5kID0gZmFsc2U7XG4gICAgICAgIGZvciAobGV0IGkgPSB0aGlzLmxpbmVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5saW5lc1tpXS5rZXkgPT09IGtleSkge1xuICAgICAgICAgICAgICAgIGlmIChyZWxhdGl2ZUluZGV4ICYmIHJlbGF0aXZlSW5kZXggIT09IHJlbGF0aXZlSW5kZXhDb3VudCkge1xuICAgICAgICAgICAgICAgICAgICByZWxhdGl2ZUluZGV4Q291bnQrKztcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGluZGV4ID0gaTtcbiAgICAgICAgICAgICAgICB0aGlzLmNoYW5nZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHRoaXMubGluZXMuc3BsaWNlKGksIDEpO1xuICAgICAgICAgICAgICAgIGlmIChyZWxhdGl2ZUluZGV4KSB7XG4gICAgICAgICAgICAgICAgICAgIHJlbGF0aXZlTWF0Y2hGb3VuZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChyZWxhdGl2ZUluZGV4ICYmICFyZWxhdGl2ZU1hdGNoRm91bmQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuYWRkKGtleU5hbWUsIHZhbHVlLCBpbmRleCk7XG4gICAgfVxuXG4gICAgYnVpbGQobGluZUVuZCkge1xuICAgICAgICBpZiAoIXRoaXMuY2hhbmdlZCAmJiAhbGluZUVuZCkge1xuICAgICAgICAgICAgcmV0dXJuIHR5cGVvZiB0aGlzLmhlYWRlcnMgPT09ICdzdHJpbmcnID8gQnVmZmVyLmZyb20odGhpcy5oZWFkZXJzLCAnYmluYXJ5JykgOiB0aGlzLmhlYWRlcnM7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMucGFyc2VkKSB7XG4gICAgICAgICAgICB0aGlzLl9wYXJzZUhlYWRlcnMoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxpbmVFbmQgPSBsaW5lRW5kIHx8ICdcXHJcXG4nO1xuXG4gICAgICAgIGxldCBoZWFkZXJzID0gdGhpcy5saW5lcy5tYXAobGluZSA9PiBsaW5lLmxpbmUucmVwbGFjZSgvXFxyP1xcbi9nLCBsaW5lRW5kKSkuam9pbihsaW5lRW5kKSArIGAke2xpbmVFbmR9JHtsaW5lRW5kfWA7XG5cbiAgICAgICAgaWYgKHRoaXMubWJveCkge1xuICAgICAgICAgICAgaGVhZGVycyA9IHRoaXMubWJveCArIGxpbmVFbmQgKyBoZWFkZXJzO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuaHR0cCkge1xuICAgICAgICAgICAgaGVhZGVycyA9IHRoaXMuaHR0cCArIGxpbmVFbmQgKyBoZWFkZXJzO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIEJ1ZmZlci5mcm9tKGhlYWRlcnMsICdiaW5hcnknKTtcbiAgICB9XG5cbiAgICBfbm9ybWFsaXplSGVhZGVyKGtleSkge1xuICAgICAgICByZXR1cm4gKGtleSB8fCAnJykudG9Mb3dlckNhc2UoKS50cmltKCk7XG4gICAgfVxuXG4gICAgX3BhcnNlSGVhZGVycygpIHtcbiAgICAgICAgaWYgKCF0aGlzLmhlYWRlcnMpIHtcbiAgICAgICAgICAgIHRoaXMubGluZXMgPSBbXTtcbiAgICAgICAgICAgIHRoaXMucGFyc2VkID0gdHJ1ZTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsaW5lcyA9IHRoaXMuaGVhZGVyc1xuICAgICAgICAgICAgLnRvU3RyaW5nKCdiaW5hcnknKVxuICAgICAgICAgICAgLnJlcGxhY2UoL1tcXHJcXG5dKyQvLCAnJylcbiAgICAgICAgICAgIC5zcGxpdCgvXFxyP1xcbi8pO1xuXG4gICAgICAgIGZvciAobGV0IGkgPSBsaW5lcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICAgICAgbGV0IGNociA9IGxpbmVzW2ldLmNoYXJBdCgwKTtcbiAgICAgICAgICAgIGlmIChpICYmIChjaHIgPT09ICcgJyB8fCBjaHIgPT09ICdcXHQnKSkge1xuICAgICAgICAgICAgICAgIGxpbmVzW2kgLSAxXSArPSAnXFxyXFxuJyArIGxpbmVzW2ldO1xuICAgICAgICAgICAgICAgIGxpbmVzLnNwbGljZShpLCAxKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgbGV0IGxpbmUgPSBsaW5lc1tpXTtcbiAgICAgICAgICAgICAgICBpZiAoIWkgJiYgL15Gcm9tIC9pLnRlc3QobGluZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gbWJveCBmaWxlXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubWJveCA9IGxpbmU7XG4gICAgICAgICAgICAgICAgICAgIGxpbmVzLnNwbGljZShpLCAxKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICghaSAmJiAvXlBPU1QgL2kudGVzdChsaW5lKSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBIVFRQIFBPU1QgcmVxdWVzdFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmh0dHAgPSBsaW5lO1xuICAgICAgICAgICAgICAgICAgICBsaW5lcy5zcGxpY2UoaSwgMSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBsZXQga2V5ID0gdGhpcy5fbm9ybWFsaXplSGVhZGVyKGxpbmUuc3Vic3RyKDAsIGxpbmUuaW5kZXhPZignOicpKSk7XG4gICAgICAgICAgICAgICAgbGluZXNbaV0gPSB7XG4gICAgICAgICAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgICAgICAgICAgbGluZVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmxpbmVzID0gbGluZXM7XG4gICAgICAgIHRoaXMucGFyc2VkID0gdHJ1ZTtcbiAgICB9XG59XG5cbi8vIGV4cG9zZSB0byB0aGUgd29ybGRcbm1vZHVsZS5leHBvcnRzID0gSGVhZGVycztcbiJdLCJuYW1lcyI6W10sImlnbm9yZUxpc3QiOlswXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(rsc)/./node_modules/imapflow/node_modules/mailsplit/lib/headers.js\n");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "(rsc)/./node_modules/imapflow/node_modules/mailsplit/lib/message-joiner.js":
|
|
/*!****************************************************************************!*\
|
|
!*** ./node_modules/imapflow/node_modules/mailsplit/lib/message-joiner.js ***!
|
|
\****************************************************************************/
|
|
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
|
|
|
|
eval("\n\nconst Transform = (__webpack_require__(/*! stream */ \"stream\").Transform);\n\nclass MessageJoiner extends Transform {\n constructor() {\n let options = {\n readableObjectMode: false,\n writableObjectMode: true\n };\n super(options);\n }\n\n _transform(obj, encoding, callback) {\n if (Buffer.isBuffer(obj)) {\n this.push(obj);\n } else if (obj.type === 'node') {\n this.push(obj.getHeaders());\n } else if (obj.value) {\n this.push(obj.value);\n }\n return callback();\n }\n\n _flush(callback) {\n return callback();\n }\n}\n\nmodule.exports = MessageJoiner;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHJzYykvLi9ub2RlX21vZHVsZXMvaW1hcGZsb3cvbm9kZV9tb2R1bGVzL21haWxzcGxpdC9saWIvbWVzc2FnZS1qb2luZXIuanMiLCJtYXBwaW5ncyI6IkFBQWE7O0FBRWIsa0JBQWtCLHVEQUEyQjs7QUFFN0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUEiLCJzb3VyY2VzIjpbIi9ob21lL2FsbWEvbmV4dGdlbi9OZWFoLW1haWwvbm9kZV9tb2R1bGVzL2ltYXBmbG93L25vZGVfbW9kdWxlcy9tYWlsc3BsaXQvbGliL21lc3NhZ2Utam9pbmVyLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcblxuY29uc3QgVHJhbnNmb3JtID0gcmVxdWlyZSgnc3RyZWFtJykuVHJhbnNmb3JtO1xuXG5jbGFzcyBNZXNzYWdlSm9pbmVyIGV4dGVuZHMgVHJhbnNmb3JtIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgbGV0IG9wdGlvbnMgPSB7XG4gICAgICAgICAgICByZWFkYWJsZU9iamVjdE1vZGU6IGZhbHNlLFxuICAgICAgICAgICAgd3JpdGFibGVPYmplY3RNb2RlOiB0cnVlXG4gICAgICAgIH07XG4gICAgICAgIHN1cGVyKG9wdGlvbnMpO1xuICAgIH1cblxuICAgIF90cmFuc2Zvcm0ob2JqLCBlbmNvZGluZywgY2FsbGJhY2spIHtcbiAgICAgICAgaWYgKEJ1ZmZlci5pc0J1ZmZlcihvYmopKSB7XG4gICAgICAgICAgICB0aGlzLnB1c2gob2JqKTtcbiAgICAgICAgfSBlbHNlIGlmIChvYmoudHlwZSA9PT0gJ25vZGUnKSB7XG4gICAgICAgICAgICB0aGlzLnB1c2gob2JqLmdldEhlYWRlcnMoKSk7XG4gICAgICAgIH0gZWxzZSBpZiAob2JqLnZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLnB1c2gob2JqLnZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY2FsbGJhY2soKTtcbiAgICB9XG5cbiAgICBfZmx1c2goY2FsbGJhY2spIHtcbiAgICAgICAgcmV0dXJuIGNhbGxiYWNrKCk7XG4gICAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IE1lc3NhZ2VKb2luZXI7XG4iXSwibmFtZXMiOltdLCJpZ25vcmVMaXN0IjpbMF0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(rsc)/./node_modules/imapflow/node_modules/mailsplit/lib/message-joiner.js\n");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "(rsc)/./node_modules/imapflow/node_modules/mailsplit/lib/message-splitter.js":
|
|
/*!******************************************************************************!*\
|
|
!*** ./node_modules/imapflow/node_modules/mailsplit/lib/message-splitter.js ***!
|
|
\******************************************************************************/
|
|
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
|
|
|
|
eval("\n\nconst Transform = (__webpack_require__(/*! stream */ \"stream\").Transform);\nconst MimeNode = __webpack_require__(/*! ./mime-node */ \"(rsc)/./node_modules/imapflow/node_modules/mailsplit/lib/mime-node.js\");\n\nconst MAX_HEAD_SIZE = 1 * 1024 * 1024;\nconst MAX_CHILD_NODES = 1000;\n\nconst HEAD = 0x01;\nconst BODY = 0x02;\n\nclass MessageSplitter extends Transform {\n constructor(config) {\n let options = {\n readableObjectMode: true,\n writableObjectMode: false\n };\n super(options);\n\n this.config = config || {};\n this.maxHeadSize = this.config.maxHeadSize || MAX_HEAD_SIZE;\n this.maxChildNodes = this.config.maxChildNodes || MAX_CHILD_NODES;\n this.tree = [];\n this.nodeCounter = 0;\n this.newNode();\n this.tree.push(this.node);\n this.line = false;\n this.hasFailed = false;\n }\n\n _transform(chunk, encoding, callback) {\n // process line by line\n // find next line ending\n let pos = 0;\n let i = 0;\n let group = {\n type: 'none'\n };\n let groupstart = this.line ? -this.line.length : 0;\n let groupend = 0;\n\n let checkTrailingLinebreak = data => {\n if (data.type === 'body' && data.node.parentNode && data.value && data.value.length) {\n if (data.value[data.value.length - 1] === 0x0a) {\n groupstart--;\n groupend--;\n pos--;\n if (data.value.length > 1 && data.value[data.value.length - 2] === 0x0d) {\n groupstart--;\n groupend--;\n pos--;\n if (groupstart < 0 && !this.line) {\n // store only <CR> as <LF> should be on the positive side\n this.line = Buffer.allocUnsafe(1);\n this.line[0] = 0x0d;\n }\n data.value = data.value.slice(0, data.value.length - 2);\n } else {\n data.value = data.value.slice(0, data.value.length - 1);\n }\n } else if (data.value[data.value.length - 1] === 0x0d) {\n groupstart--;\n groupend--;\n pos--;\n data.value = data.value.slice(0, data.value.length - 1);\n }\n }\n };\n\n let iterateData = () => {\n for (let len = chunk.length; i < len; i++) {\n // find next <LF>\n if (chunk[i] === 0x0a) {\n // line end\n\n let start = Math.max(pos, 0);\n pos = ++i;\n\n return this.processLine(chunk.slice(start, i), false, (err, data, flush) => {\n if (err) {\n this.hasFailed = true;\n return setImmediate(() => callback(err));\n }\n\n if (!data) {\n return setImmediate(iterateData);\n }\n\n if (flush) {\n if (group && group.type !== 'none') {\n if (group.type === 'body' && groupend >= groupstart && group.node.parentNode) {\n // do not include the last line ending for body\n if (chunk[groupend - 1] === 0x0a) {\n groupend--;\n if (groupend >= groupstart && chunk[groupend - 1] === 0x0d) {\n groupend--;\n }\n }\n }\n if (groupstart !== groupend) {\n group.value = chunk.slice(groupstart, groupend);\n if (groupend < i) {\n data.value = chunk.slice(groupend, i);\n }\n }\n this.push(group);\n group = {\n type: 'none'\n };\n groupstart = groupend = i;\n }\n this.push(data);\n groupend = i;\n return setImmediate(iterateData);\n }\n\n if (data.type === group.type) {\n // shift slice end position forward\n groupend = i;\n } else {\n if (group.type === 'body' && groupend >= groupstart && group.node.parentNode) {\n // do not include the last line ending for body\n if (chunk[groupend - 1] === 0x0a) {\n groupend--;\n if (groupend >= groupstart && chunk[groupend - 1] === 0x0d) {\n groupend--;\n }\n }\n }\n\n if (group.type !== 'none' && group.type !== 'node') {\n // we have a previous data/body chunk to output\n if (groupstart !== groupend) {\n group.value = chunk.slice(groupstart, groupend);\n if (group.value && group.value.length) {\n this.push(group);\n group = {\n type: 'none'\n };\n }\n }\n }\n\n if (data.type === 'node') {\n this.push(data);\n groupstart = i;\n groupend = i;\n } else if (groupstart < 0) {\n groupstart = i;\n groupend = i;\n checkTrailingLinebreak(data);\n if (data.value && data.value.length) {\n this.push(data);\n }\n } else {\n // start new body/data chunk\n group = data;\n groupstart = groupend;\n groupend = i;\n }\n }\n return setImmediate(iterateData);\n });\n }\n }\n\n // skip last linebreak for body\n if (pos >= groupstart + 1 && group.type === 'body' && group.node.parentNode) {\n // do not include the last line ending for body\n if (chunk[pos - 1] === 0x0a) {\n pos--;\n if (pos >= groupstart && chunk[pos - 1] === 0x0d) {\n pos--;\n }\n }\n }\n\n if (group.type !== 'none' && group.type !== 'node' && pos > groupstart) {\n // we have a leftover data/body chunk to push out\n group.value = chunk.slice(groupstart, pos);\n\n if (group.value && group.value.length) {\n this.push(group);\n group = {\n type: 'none'\n };\n }\n }\n\n if (pos < chunk.length) {\n if (this.line) {\n this.line = Buffer.concat([this.line, chunk.slice(pos)]);\n } else {\n this.line = chunk.slice(pos);\n }\n }\n callback();\n };\n\n setImmediate(iterateData);\n }\n\n _flush(callback) {\n if (this.hasFailed) {\n return callback();\n }\n this.processLine(false, true, (err, data) => {\n if (err) {\n return setImmediate(() => callback(err));\n }\n if (data && (data.type === 'node' || (data.value && data.value.length))) {\n this.push(data);\n }\n callback();\n });\n }\n\n compareBoundary(line, startpos, boundary) {\n // --{boundary}\\r\\n or --{boundary}--\\r\\n\n if (line.length < boundary.length + 3 + startpos || line.length > boundary.length + 6 + startpos) {\n return false;\n }\n for (let i = 0; i < boundary.length; i++) {\n if (line[i + 2 + startpos] !== boundary[i]) {\n return false;\n }\n }\n\n let pos = 0;\n for (let i = boundary.length + 2 + startpos; i < line.length; i++) {\n let c = line[i];\n if (pos === 0 && (c === 0x0d || c === 0x0a)) {\n // 1: next node\n return 1;\n }\n if (pos === 0 && c !== 0x2d) {\n // expecting \"-\"\n return false;\n }\n if (pos === 1 && c !== 0x2d) {\n // expecting \"-\"\n return false;\n }\n if (pos === 2 && c !== 0x0d && c !== 0x0a) {\n // expecting line terminator, either <CR> or <LF>\n return false;\n }\n if (pos === 3 && c !== 0x0a) {\n // expecting line terminator <LF>\n return false;\n }\n pos++;\n }\n\n // 2: multipart end\n return 2;\n }\n\n checkBoundary(line) {\n let startpos = 0;\n if (line.length >= 1 && (line[0] === 0x0d || line[0] === 0x0a)) {\n startpos++;\n if (line.length >= 2 && (line[0] === 0x0d || line[1] === 0x0a)) {\n startpos++;\n }\n }\n if (line.length < 4 || line[startpos] !== 0x2d || line[startpos + 1] !== 0x2d) {\n // defnitely not a boundary\n return false;\n }\n\n let boundary;\n if (this.node._boundary && (boundary = this.compareBoundary(line, startpos, this.node._boundary))) {\n // 1: next child\n // 2: multipart end\n return boundary;\n }\n\n if (this.node._parentBoundary && (boundary = this.compareBoundary(line, startpos, this.node._parentBoundary))) {\n // 3: next sibling\n // 4: parent end\n return boundary + 2;\n }\n\n return false;\n }\n\n processLine(line, final, next) {\n let flush = false;\n\n if (this.line && line) {\n line = Buffer.concat([this.line, line]);\n this.line = false;\n } else if (this.line && !line) {\n line = this.line;\n this.line = false;\n }\n\n if (!line) {\n line = Buffer.alloc(0);\n }\n\n if (this.nodeCounter > this.maxChildNodes) {\n let err = new Error('Max allowed child nodes exceeded');\n err.code = 'EMAXLEN';\n return next(err);\n }\n\n // we check boundary outside the HEAD/BODY scope as it may appear anywhere\n let boundary = this.checkBoundary(line);\n if (boundary) {\n // reached boundary, switch context\n switch (boundary) {\n case 1:\n // next child\n this.newNode(this.node);\n flush = true;\n break;\n case 2:\n // reached end of children, keep current node\n break;\n case 3: {\n // next sibling\n let parentNode = this.node.parentNode;\n if (parentNode && parentNode.contentType === 'message/rfc822') {\n // special case where immediate parent is an inline message block\n // move up another step\n parentNode = parentNode.parentNode;\n }\n this.newNode(parentNode);\n flush = true;\n break;\n }\n case 4:\n // special case when boundary close a node with only header.\n if (this.node && this.node._headerlen && !this.node.headers) {\n this.node.parseHeaders();\n this.push(this.node);\n }\n // move up\n if (this.tree.length) {\n this.node = this.tree.pop();\n }\n this.state = BODY;\n break;\n }\n\n return next(\n null,\n {\n node: this.node,\n type: 'data',\n value: line\n },\n flush\n );\n }\n\n switch (this.state) {\n case HEAD: {\n this.node.addHeaderChunk(line);\n if (this.node._headerlen > this.maxHeadSize) {\n let err = new Error('Max header size for a MIME node exceeded');\n err.code = 'EMAXLEN';\n return next(err);\n }\n if (final || (line.length === 1 && line[0] === 0x0a) || (line.length === 2 && line[0] === 0x0d && line[1] === 0x0a)) {\n let currentNode = this.node;\n\n currentNode.parseHeaders();\n\n // if the content is attached message then just continue\n if (\n currentNode.contentType === 'message/rfc822' &&\n !this.config.ignoreEmbedded &&\n (!currentNode.encoding || ['7bit', '8bit', 'binary'].includes(currentNode.encoding)) &&\n (this.config.defaultInlineEmbedded ? currentNode.disposition !== 'attachment' : currentNode.disposition === 'inline')\n ) {\n currentNode.messageNode = true;\n this.newNode(currentNode);\n if (currentNode.parentNode) {\n this.node._parentBoundary = currentNode.parentNode._boundary;\n }\n } else {\n if (currentNode.contentType === 'message/rfc822') {\n currentNode.messageNode = false;\n }\n this.state = BODY;\n if (currentNode.multipart && currentNode._boundary) {\n this.tree.push(currentNode);\n }\n }\n\n return next(null, currentNode, flush);\n }\n\n return next();\n }\n case BODY: {\n return next(\n null,\n {\n node: this.node,\n type: this.node.multipart ? 'data' : 'body',\n value: line\n },\n flush\n );\n }\n }\n\n next(null, false);\n }\n\n newNode(parent) {\n this.node = new MimeNode(parent || false, this.config);\n this.state = HEAD;\n this.nodeCounter++;\n }\n}\n\nmodule.exports = MessageSplitter;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHJzYykvLi9ub2RlX21vZHVsZXMvaW1hcGZsb3cvbm9kZV9tb2R1bGVzL21haWxzcGxpdC9saWIvbWVzc2FnZS1zcGxpdHRlci5qcyIsIm1hcHBpbmdzIjoiQUFBYTs7QUFFYixrQkFBa0IsdURBQTJCO0FBQzdDLGlCQUFpQixtQkFBTyxDQUFDLDBGQUFhOztBQUV0QztBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0I7QUFDdEI7QUFDQTtBQUNBLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLHlDQUF5QyxTQUFTO0FBQ2xEO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSwwQkFBMEI7QUFDMUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhCQUE4QjtBQUM5QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4QkFBOEI7QUFDOUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7O0FBRUE7QUFDQSxjQUFjLFNBQVMsV0FBVyxTQUFTO0FBQzNDO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixxQkFBcUI7QUFDN0M7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxxREFBcUQsaUJBQWlCO0FBQ3RFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEiLCJzb3VyY2VzIjpbIi9ob21lL2FsbWEvbmV4dGdlbi9OZWFoLW1haWwvbm9kZV9tb2R1bGVzL2ltYXBmbG93L25vZGVfbW9kdWxlcy9tYWlsc3BsaXQvbGliL21lc3NhZ2Utc3BsaXR0ZXIuanMiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCBUcmFuc2Zvcm0gPSByZXF1aXJlKCdzdHJlYW0nKS5UcmFuc2Zvcm07XG5jb25zdCBNaW1lTm9kZSA9IHJlcXVpcmUoJy4vbWltZS1ub2RlJyk7XG5cbmNvbnN0IE1BWF9IRUFEX1NJWkUgPSAxICogMTAyNCAqIDEwMjQ7XG5jb25zdCBNQVhfQ0hJTERfTk9ERVMgPSAxMDAwO1xuXG5jb25zdCBIRUFEID0gMHgwMTtcbmNvbnN0IEJPRFkgPSAweDAyO1xuXG5jbGFzcyBNZXNzYWdlU3BsaXR0ZXIgZXh0ZW5kcyBUcmFuc2Zvcm0ge1xuICAgIGNvbnN0cnVjdG9yKGNvbmZpZykge1xuICAgICAgICBsZXQgb3B0aW9ucyA9IHtcbiAgICAgICAgICAgIHJlYWRhYmxlT2JqZWN0TW9kZTogdHJ1ZSxcbiAgICAgICAgICAgIHdyaXRhYmxlT2JqZWN0TW9kZTogZmFsc2VcbiAgICAgICAgfTtcbiAgICAgICAgc3VwZXIob3B0aW9ucyk7XG5cbiAgICAgICAgdGhpcy5jb25maWcgPSBjb25maWcgfHwge307XG4gICAgICAgIHRoaXMubWF4SGVhZFNpemUgPSB0aGlzLmNvbmZpZy5tYXhIZWFkU2l6ZSB8fCBNQVhfSEVBRF9TSVpFO1xuICAgICAgICB0aGlzLm1heENoaWxkTm9kZXMgPSB0aGlzLmNvbmZpZy5tYXhDaGlsZE5vZGVzIHx8IE1BWF9DSElMRF9OT0RFUztcbiAgICAgICAgdGhpcy50cmVlID0gW107XG4gICAgICAgIHRoaXMubm9kZUNvdW50ZXIgPSAwO1xuICAgICAgICB0aGlzLm5ld05vZGUoKTtcbiAgICAgICAgdGhpcy50cmVlLnB1c2godGhpcy5ub2RlKTtcbiAgICAgICAgdGhpcy5saW5lID0gZmFsc2U7XG4gICAgICAgIHRoaXMuaGFzRmFpbGVkID0gZmFsc2U7XG4gICAgfVxuXG4gICAgX3RyYW5zZm9ybShjaHVuaywgZW5jb2RpbmcsIGNhbGxiYWNrKSB7XG4gICAgICAgIC8vIHByb2Nlc3MgbGluZSBieSBsaW5lXG4gICAgICAgIC8vIGZpbmQgbmV4dCBsaW5lIGVuZGluZ1xuICAgICAgICBsZXQgcG9zID0gMDtcbiAgICAgICAgbGV0IGkgPSAwO1xuICAgICAgICBsZXQgZ3JvdXAgPSB7XG4gICAgICAgICAgICB0eXBlOiAnbm9uZSdcbiAgICAgICAgfTtcbiAgICAgICAgbGV0IGdyb3Vwc3RhcnQgPSB0aGlzLmxpbmUgPyAtdGhpcy5saW5lLmxlbmd0aCA6IDA7XG4gICAgICAgIGxldCBncm91cGVuZCA9IDA7XG5cbiAgICAgICAgbGV0IGNoZWNrVHJhaWxpbmdMaW5lYnJlYWsgPSBkYXRhID0+IHtcbiAgICAgICAgICAgIGlmIChkYXRhLnR5cGUgPT09ICdib2R5JyAmJiBkYXRhLm5vZGUucGFyZW50Tm9kZSAmJiBkYXRhLnZhbHVlICYmIGRhdGEudmFsdWUubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgaWYgKGRhdGEudmFsdWVbZGF0YS52YWx1ZS5sZW5ndGggLSAxXSA9PT0gMHgwYSkge1xuICAgICAgICAgICAgICAgICAgICBncm91cHN0YXJ0LS07XG4gICAgICAgICAgICAgICAgICAgIGdyb3VwZW5kLS07XG4gICAgICAgICAgICAgICAgICAgIHBvcy0tO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YS52YWx1ZS5sZW5ndGggPiAxICYmIGRhdGEudmFsdWVbZGF0YS52YWx1ZS5sZW5ndGggLSAyXSA9PT0gMHgwZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBzdGFydC0tO1xuICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBlbmQtLTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBvcy0tO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGdyb3Vwc3RhcnQgPCAwICYmICF0aGlzLmxpbmUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzdG9yZSBvbmx5IDxDUj4gYXMgPExGPiBzaG91bGQgYmUgb24gdGhlIHBvc2l0aXZlIHNpZGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxpbmUgPSBCdWZmZXIuYWxsb2NVbnNhZmUoMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5saW5lWzBdID0gMHgwZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEudmFsdWUgPSBkYXRhLnZhbHVlLnNsaWNlKDAsIGRhdGEudmFsdWUubGVuZ3RoIC0gMik7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhLnZhbHVlID0gZGF0YS52YWx1ZS5zbGljZSgwLCBkYXRhLnZhbHVlLmxlbmd0aCAtIDEpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChkYXRhLnZhbHVlW2RhdGEudmFsdWUubGVuZ3RoIC0gMV0gPT09IDB4MGQpIHtcbiAgICAgICAgICAgICAgICAgICAgZ3JvdXBzdGFydC0tO1xuICAgICAgICAgICAgICAgICAgICBncm91cGVuZC0tO1xuICAgICAgICAgICAgICAgICAgICBwb3MtLTtcbiAgICAgICAgICAgICAgICAgICAgZGF0YS52YWx1ZSA9IGRhdGEudmFsdWUuc2xpY2UoMCwgZGF0YS52YWx1ZS5sZW5ndGggLSAxKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgbGV0IGl0ZXJhdGVEYXRhID0gKCkgPT4ge1xuICAgICAgICAgICAgZm9yIChsZXQgbGVuID0gY2h1bmsubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICAgICAgICAvLyBmaW5kIG5leHQgPExGPlxuICAgICAgICAgICAgICAgIGlmIChjaHVua1tpXSA9PT0gMHgwYSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBsaW5lIGVuZFxuXG4gICAgICAgICAgICAgICAgICAgIGxldCBzdGFydCA9IE1hdGgubWF4KHBvcywgMCk7XG4gICAgICAgICAgICAgICAgICAgIHBvcyA9ICsraTtcblxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5wcm9jZXNzTGluZShjaHVuay5zbGljZShzdGFydCwgaSksIGZhbHNlLCAoZXJyLCBkYXRhLCBmbHVzaCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaGFzRmFpbGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2V0SW1tZWRpYXRlKCgpID0+IGNhbGxiYWNrKGVycikpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWRhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2V0SW1tZWRpYXRlKGl0ZXJhdGVEYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZsdXNoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGdyb3VwICYmIGdyb3VwLnR5cGUgIT09ICdub25lJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZ3JvdXAudHlwZSA9PT0gJ2JvZHknICYmIGdyb3VwZW5kID49IGdyb3Vwc3RhcnQgJiYgZ3JvdXAubm9kZS5wYXJlbnROb2RlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkbyBub3QgaW5jbHVkZSB0aGUgbGFzdCBsaW5lIGVuZGluZyBmb3IgYm9keVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNodW5rW2dyb3VwZW5kIC0gMV0gPT09IDB4MGEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncm91cGVuZC0tO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChncm91cGVuZCA+PSBncm91cHN0YXJ0ICYmIGNodW5rW2dyb3VwZW5kIC0gMV0gPT09IDB4MGQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBlbmQtLTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGdyb3Vwc3RhcnQgIT09IGdyb3VwZW5kKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncm91cC52YWx1ZSA9IGNodW5rLnNsaWNlKGdyb3Vwc3RhcnQsIGdyb3VwZW5kKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChncm91cGVuZCA8IGkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLnZhbHVlID0gY2h1bmsuc2xpY2UoZ3JvdXBlbmQsIGkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHVzaChncm91cCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ25vbmUnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3Vwc3RhcnQgPSBncm91cGVuZCA9IGk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHVzaChkYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBncm91cGVuZCA9IGk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNldEltbWVkaWF0ZShpdGVyYXRlRGF0YSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkYXRhLnR5cGUgPT09IGdyb3VwLnR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzaGlmdCBzbGljZSBlbmQgcG9zaXRpb24gZm9yd2FyZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwZW5kID0gaTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGdyb3VwLnR5cGUgPT09ICdib2R5JyAmJiBncm91cGVuZCA+PSBncm91cHN0YXJ0ICYmIGdyb3VwLm5vZGUucGFyZW50Tm9kZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkbyBub3QgaW5jbHVkZSB0aGUgbGFzdCBsaW5lIGVuZGluZyBmb3IgYm9keVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2h1bmtbZ3JvdXBlbmQgLSAxXSA9PT0gMHgwYSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBlbmQtLTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChncm91cGVuZCA+PSBncm91cHN0YXJ0ICYmIGNodW5rW2dyb3VwZW5kIC0gMV0gPT09IDB4MGQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncm91cGVuZC0tO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGdyb3VwLnR5cGUgIT09ICdub25lJyAmJiBncm91cC50eXBlICE9PSAnbm9kZScpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2UgaGF2ZSBhIHByZXZpb3VzIGRhdGEvYm9keSBjaHVuayB0byBvdXRwdXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGdyb3Vwc3RhcnQgIT09IGdyb3VwZW5kKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncm91cC52YWx1ZSA9IGNodW5rLnNsaWNlKGdyb3Vwc3RhcnQsIGdyb3VwZW5kKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChncm91cC52YWx1ZSAmJiBncm91cC52YWx1ZS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnB1c2goZ3JvdXApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnbm9uZSdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGEudHlwZSA9PT0gJ25vZGUnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHVzaChkYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBzdGFydCA9IGk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwZW5kID0gaTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGdyb3Vwc3RhcnQgPCAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3Vwc3RhcnQgPSBpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncm91cGVuZCA9IGk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrVHJhaWxpbmdMaW5lYnJlYWsoZGF0YSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkYXRhLnZhbHVlICYmIGRhdGEudmFsdWUubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnB1c2goZGF0YSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzdGFydCBuZXcgYm9keS9kYXRhIGNodW5rXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwID0gZGF0YTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBzdGFydCA9IGdyb3VwZW5kO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncm91cGVuZCA9IGk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNldEltbWVkaWF0ZShpdGVyYXRlRGF0YSk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gc2tpcCBsYXN0IGxpbmVicmVhayBmb3IgYm9keVxuICAgICAgICAgICAgaWYgKHBvcyA+PSBncm91cHN0YXJ0ICsgMSAmJiBncm91cC50eXBlID09PSAnYm9keScgJiYgZ3JvdXAubm9kZS5wYXJlbnROb2RlKSB7XG4gICAgICAgICAgICAgICAgLy8gZG8gbm90IGluY2x1ZGUgdGhlIGxhc3QgbGluZSBlbmRpbmcgZm9yIGJvZHlcbiAgICAgICAgICAgICAgICBpZiAoY2h1bmtbcG9zIC0gMV0gPT09IDB4MGEpIHtcbiAgICAgICAgICAgICAgICAgICAgcG9zLS07XG4gICAgICAgICAgICAgICAgICAgIGlmIChwb3MgPj0gZ3JvdXBzdGFydCAmJiBjaHVua1twb3MgLSAxXSA9PT0gMHgwZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcG9zLS07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChncm91cC50eXBlICE9PSAnbm9uZScgJiYgZ3JvdXAudHlwZSAhPT0gJ25vZGUnICYmIHBvcyA+IGdyb3Vwc3RhcnQpIHtcbiAgICAgICAgICAgICAgICAvLyB3ZSBoYXZlIGEgbGVmdG92ZXIgZGF0YS9ib2R5IGNodW5rIHRvIHB1c2ggb3V0XG4gICAgICAgICAgICAgICAgZ3JvdXAudmFsdWUgPSBjaHVuay5zbGljZShncm91cHN0YXJ0LCBwb3MpO1xuXG4gICAgICAgICAgICAgICAgaWYgKGdyb3VwLnZhbHVlICYmIGdyb3VwLnZhbHVlLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnB1c2goZ3JvdXApO1xuICAgICAgICAgICAgICAgICAgICBncm91cCA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdub25lJ1xuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHBvcyA8IGNodW5rLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmxpbmUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5saW5lID0gQnVmZmVyLmNvbmNhdChbdGhpcy5saW5lLCBjaHVuay5zbGljZShwb3MpXSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5saW5lID0gY2h1bmsuc2xpY2UocG9zKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYWxsYmFjaygpO1xuICAgICAgICB9O1xuXG4gICAgICAgIHNldEltbWVkaWF0ZShpdGVyYXRlRGF0YSk7XG4gICAgfVxuXG4gICAgX2ZsdXNoKGNhbGxiYWNrKSB7XG4gICAgICAgIGlmICh0aGlzLmhhc0ZhaWxlZCkge1xuICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5wcm9jZXNzTGluZShmYWxzZSwgdHJ1ZSwgKGVyciwgZGF0YSkgPT4ge1xuICAgICAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgICAgICAgIHJldHVybiBzZXRJbW1lZGlhdGUoKCkgPT4gY2FsbGJhY2soZXJyKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZGF0YSAmJiAoZGF0YS50eXBlID09PSAnbm9kZScgfHwgKGRhdGEudmFsdWUgJiYgZGF0YS52YWx1ZS5sZW5ndGgpKSkge1xuICAgICAgICAgICAgICAgIHRoaXMucHVzaChkYXRhKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGNvbXBhcmVCb3VuZGFyeShsaW5lLCBzdGFydHBvcywgYm91bmRhcnkpIHtcbiAgICAgICAgLy8gLS17Ym91bmRhcnl9XFxyXFxuIG9yIC0te2JvdW5kYXJ5fS0tXFxyXFxuXG4gICAgICAgIGlmIChsaW5lLmxlbmd0aCA8IGJvdW5kYXJ5Lmxlbmd0aCArIDMgKyBzdGFydHBvcyB8fCBsaW5lLmxlbmd0aCA+IGJvdW5kYXJ5Lmxlbmd0aCArIDYgKyBzdGFydHBvcykge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYm91bmRhcnkubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChsaW5lW2kgKyAyICsgc3RhcnRwb3NdICE9PSBib3VuZGFyeVtpXSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBwb3MgPSAwO1xuICAgICAgICBmb3IgKGxldCBpID0gYm91bmRhcnkubGVuZ3RoICsgMiArIHN0YXJ0cG9zOyBpIDwgbGluZS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IGMgPSBsaW5lW2ldO1xuICAgICAgICAgICAgaWYgKHBvcyA9PT0gMCAmJiAoYyA9PT0gMHgwZCB8fCBjID09PSAweDBhKSkge1xuICAgICAgICAgICAgICAgIC8vIDE6IG5leHQgbm9kZVxuICAgICAgICAgICAgICAgIHJldHVybiAxO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHBvcyA9PT0gMCAmJiBjICE9PSAweDJkKSB7XG4gICAgICAgICAgICAgICAgLy8gZXhwZWN0aW5nIFwiLVwiXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHBvcyA9PT0gMSAmJiBjICE9PSAweDJkKSB7XG4gICAgICAgICAgICAgICAgLy8gZXhwZWN0aW5nIFwiLVwiXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHBvcyA9PT0gMiAmJiBjICE9PSAweDBkICYmIGMgIT09IDB4MGEpIHtcbiAgICAgICAgICAgICAgICAvLyBleHBlY3RpbmcgbGluZSB0ZXJtaW5hdG9yLCBlaXRoZXIgPENSPiBvciA8TEY+XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHBvcyA9PT0gMyAmJiBjICE9PSAweDBhKSB7XG4gICAgICAgICAgICAgICAgLy8gZXhwZWN0aW5nIGxpbmUgdGVybWluYXRvciA8TEY+XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcG9zKys7XG4gICAgICAgIH1cblxuICAgICAgICAvLyAyOiBtdWx0aXBhcnQgZW5kXG4gICAgICAgIHJldHVybiAyO1xuICAgIH1cblxuICAgIGNoZWNrQm91bmRhcnkobGluZSkge1xuICAgICAgICBsZXQgc3RhcnRwb3MgPSAwO1xuICAgICAgICBpZiAobGluZS5sZW5ndGggPj0gMSAmJiAobGluZVswXSA9PT0gMHgwZCB8fCBsaW5lWzBdID09PSAweDBhKSkge1xuICAgICAgICAgICAgc3RhcnRwb3MrKztcbiAgICAgICAgICAgIGlmIChsaW5lLmxlbmd0aCA+PSAyICYmIChsaW5lWzBdID09PSAweDBkIHx8IGxpbmVbMV0gPT09IDB4MGEpKSB7XG4gICAgICAgICAgICAgICAgc3RhcnRwb3MrKztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAobGluZS5sZW5ndGggPCA0IHx8IGxpbmVbc3RhcnRwb3NdICE9PSAweDJkIHx8IGxpbmVbc3RhcnRwb3MgKyAxXSAhPT0gMHgyZCkge1xuICAgICAgICAgICAgLy8gZGVmbml0ZWx5IG5vdCBhIGJvdW5kYXJ5XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgYm91bmRhcnk7XG4gICAgICAgIGlmICh0aGlzLm5vZGUuX2JvdW5kYXJ5ICYmIChib3VuZGFyeSA9IHRoaXMuY29tcGFyZUJvdW5kYXJ5KGxpbmUsIHN0YXJ0cG9zLCB0aGlzLm5vZGUuX2JvdW5kYXJ5KSkpIHtcbiAgICAgICAgICAgIC8vIDE6IG5leHQgY2hpbGRcbiAgICAgICAgICAgIC8vIDI6IG11bHRpcGFydCBlbmRcbiAgICAgICAgICAgIHJldHVybiBib3VuZGFyeTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLm5vZGUuX3BhcmVudEJvdW5kYXJ5ICYmIChib3VuZGFyeSA9IHRoaXMuY29tcGFyZUJvdW5kYXJ5KGxpbmUsIHN0YXJ0cG9zLCB0aGlzLm5vZGUuX3BhcmVudEJvdW5kYXJ5KSkpIHtcbiAgICAgICAgICAgIC8vIDM6IG5leHQgc2libGluZ1xuICAgICAgICAgICAgLy8gNDogcGFyZW50IGVuZFxuICAgICAgICAgICAgcmV0dXJuIGJvdW5kYXJ5ICsgMjtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBwcm9jZXNzTGluZShsaW5lLCBmaW5hbCwgbmV4dCkge1xuICAgICAgICBsZXQgZmx1c2ggPSBmYWxzZTtcblxuICAgICAgICBpZiAodGhpcy5saW5lICYmIGxpbmUpIHtcbiAgICAgICAgICAgIGxpbmUgPSBCdWZmZXIuY29uY2F0KFt0aGlzLmxpbmUsIGxpbmVdKTtcbiAgICAgICAgICAgIHRoaXMubGluZSA9IGZhbHNlO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMubGluZSAmJiAhbGluZSkge1xuICAgICAgICAgICAgbGluZSA9IHRoaXMubGluZTtcbiAgICAgICAgICAgIHRoaXMubGluZSA9IGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFsaW5lKSB7XG4gICAgICAgICAgICBsaW5lID0gQnVmZmVyLmFsbG9jKDApO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMubm9kZUNvdW50ZXIgPiB0aGlzLm1heENoaWxkTm9kZXMpIHtcbiAgICAgICAgICAgIGxldCBlcnIgPSBuZXcgRXJyb3IoJ01heCBhbGxvd2VkIGNoaWxkIG5vZGVzIGV4Y2VlZGVkJyk7XG4gICAgICAgICAgICBlcnIuY29kZSA9ICdFTUFYTEVOJztcbiAgICAgICAgICAgIHJldHVybiBuZXh0KGVycik7XG4gICAgICAgIH1cblxuICAgICAgICAvLyB3ZSBjaGVjayBib3VuZGFyeSBvdXRzaWRlIHRoZSBIRUFEL0JPRFkgc2NvcGUgYXMgaXQgbWF5IGFwcGVhciBhbnl3aGVyZVxuICAgICAgICBsZXQgYm91bmRhcnkgPSB0aGlzLmNoZWNrQm91bmRhcnkobGluZSk7XG4gICAgICAgIGlmIChib3VuZGFyeSkge1xuICAgICAgICAgICAgLy8gcmVhY2hlZCBib3VuZGFyeSwgc3dpdGNoIGNvbnRleHRcbiAgICAgICAgICAgIHN3aXRjaCAoYm91bmRhcnkpIHtcbiAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgIC8vIG5leHQgY2hpbGRcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5uZXdOb2RlKHRoaXMubm9kZSk7XG4gICAgICAgICAgICAgICAgICAgIGZsdXNoID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAvLyByZWFjaGVkIGVuZCBvZiBjaGlsZHJlbiwga2VlcCBjdXJyZW50IG5vZGVcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAzOiB7XG4gICAgICAgICAgICAgICAgICAgIC8vIG5leHQgc2libGluZ1xuICAgICAgICAgICAgICAgICAgICBsZXQgcGFyZW50Tm9kZSA9IHRoaXMubm9kZS5wYXJlbnROb2RlO1xuICAgICAgICAgICAgICAgICAgICBpZiAocGFyZW50Tm9kZSAmJiBwYXJlbnROb2RlLmNvbnRlbnRUeXBlID09PSAnbWVzc2FnZS9yZmM4MjInKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzcGVjaWFsIGNhc2Ugd2hlcmUgaW1tZWRpYXRlIHBhcmVudCBpcyBhbiBpbmxpbmUgbWVzc2FnZSBibG9ja1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbW92ZSB1cCBhbm90aGVyIHN0ZXBcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudE5vZGUgPSBwYXJlbnROb2RlLnBhcmVudE5vZGU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5uZXdOb2RlKHBhcmVudE5vZGUpO1xuICAgICAgICAgICAgICAgICAgICBmbHVzaCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgIC8vIHNwZWNpYWwgY2FzZSB3aGVuIGJvdW5kYXJ5IGNsb3NlIGEgbm9kZSB3aXRoIG9ubHkgaGVhZGVyLlxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5ub2RlICYmIHRoaXMubm9kZS5faGVhZGVybGVuICYmICF0aGlzLm5vZGUuaGVhZGVycykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ub2RlLnBhcnNlSGVhZGVycygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wdXNoKHRoaXMubm9kZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgLy8gbW92ZSB1cFxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy50cmVlLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ub2RlID0gdGhpcy50cmVlLnBvcCgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBCT0RZO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIG5leHQoXG4gICAgICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIG5vZGU6IHRoaXMubm9kZSxcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2RhdGEnLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogbGluZVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgZmx1c2hcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICBzd2l0Y2ggKHRoaXMuc3RhdGUpIHtcbiAgICAgICAgICAgIGNhc2UgSEVBRDoge1xuICAgICAgICAgICAgICAgIHRoaXMubm9kZS5hZGRIZWFkZXJDaHVuayhsaW5lKTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5ub2RlLl9oZWFkZXJsZW4gPiB0aGlzLm1heEhlYWRTaXplKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBlcnIgPSBuZXcgRXJyb3IoJ01heCBoZWFkZXIgc2l6ZSBmb3IgYSBNSU1FIG5vZGUgZXhjZWVkZWQnKTtcbiAgICAgICAgICAgICAgICAgICAgZXJyLmNvZGUgPSAnRU1BWExFTic7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXh0KGVycik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChmaW5hbCB8fCAobGluZS5sZW5ndGggPT09IDEgJiYgbGluZVswXSA9PT0gMHgwYSkgfHwgKGxpbmUubGVuZ3RoID09PSAyICYmIGxpbmVbMF0gPT09IDB4MGQgJiYgbGluZVsxXSA9PT0gMHgwYSkpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGN1cnJlbnROb2RlID0gdGhpcy5ub2RlO1xuXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnROb2RlLnBhcnNlSGVhZGVycygpO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBjb250ZW50IGlzIGF0dGFjaGVkIG1lc3NhZ2UgdGhlbiBqdXN0IGNvbnRpbnVlXG4gICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnROb2RlLmNvbnRlbnRUeXBlID09PSAnbWVzc2FnZS9yZmM4MjInICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAhdGhpcy5jb25maWcuaWdub3JlRW1iZWRkZWQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICghY3VycmVudE5vZGUuZW5jb2RpbmcgfHwgWyc3Yml0JywgJzhiaXQnLCAnYmluYXJ5J10uaW5jbHVkZXMoY3VycmVudE5vZGUuZW5jb2RpbmcpKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgKHRoaXMuY29uZmlnLmRlZmF1bHRJbmxpbmVFbWJlZGRlZCA/IGN1cnJlbnROb2RlLmRpc3Bvc2l0aW9uICE9PSAnYXR0YWNobWVudCcgOiBjdXJyZW50Tm9kZS5kaXNwb3NpdGlvbiA9PT0gJ2lubGluZScpXG4gICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudE5vZGUubWVzc2FnZU5vZGUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5uZXdOb2RlKGN1cnJlbnROb2RlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50Tm9kZS5wYXJlbnROb2RlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ub2RlLl9wYXJlbnRCb3VuZGFyeSA9IGN1cnJlbnROb2RlLnBhcmVudE5vZGUuX2JvdW5kYXJ5O1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnROb2RlLmNvbnRlbnRUeXBlID09PSAnbWVzc2FnZS9yZmM4MjInKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudE5vZGUubWVzc2FnZU5vZGUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBCT0RZO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnROb2RlLm11bHRpcGFydCAmJiBjdXJyZW50Tm9kZS5fYm91bmRhcnkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRyZWUucHVzaChjdXJyZW50Tm9kZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV4dChudWxsLCBjdXJyZW50Tm9kZSwgZmx1c2gpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHJldHVybiBuZXh0KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlIEJPRFk6IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV4dChcbiAgICAgICAgICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgbm9kZTogdGhpcy5ub2RlLFxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogdGhpcy5ub2RlLm11bHRpcGFydCA/ICdkYXRhJyA6ICdib2R5JyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBsaW5lXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIGZsdXNoXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIG5leHQobnVsbCwgZmFsc2UpO1xuICAgIH1cblxuICAgIG5ld05vZGUocGFyZW50KSB7XG4gICAgICAgIHRoaXMubm9kZSA9IG5ldyBNaW1lTm9kZShwYXJlbnQgfHwgZmFsc2UsIHRoaXMuY29uZmlnKTtcbiAgICAgICAgdGhpcy5zdGF0ZSA9IEhFQUQ7XG4gICAgICAgIHRoaXMubm9kZUNvdW50ZXIrKztcbiAgICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gTWVzc2FnZVNwbGl0dGVyO1xuIl0sIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6WzBdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(rsc)/./node_modules/imapflow/node_modules/mailsplit/lib/message-splitter.js\n");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "(rsc)/./node_modules/imapflow/node_modules/mailsplit/lib/mime-node.js":
|
|
/*!***********************************************************************!*\
|
|
!*** ./node_modules/imapflow/node_modules/mailsplit/lib/mime-node.js ***!
|
|
\***********************************************************************/
|
|
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
|
|
|
|
eval("\n\nconst Headers = __webpack_require__(/*! ./headers */ \"(rsc)/./node_modules/imapflow/node_modules/mailsplit/lib/headers.js\");\nconst libmime = __webpack_require__(/*! libmime */ \"(rsc)/./node_modules/libmime/lib/libmime.js\");\nconst libqp = __webpack_require__(/*! libqp */ \"(rsc)/./node_modules/libqp/lib/libqp.js\");\nconst libbase64 = __webpack_require__(/*! libbase64 */ \"(rsc)/./node_modules/libbase64/lib/libbase64.js\");\nconst PassThrough = (__webpack_require__(/*! stream */ \"stream\").PassThrough);\nconst pathlib = __webpack_require__(/*! path */ \"path\");\n\nclass MimeNode {\n constructor(parentNode, config) {\n this.type = 'node';\n this.root = !parentNode;\n this.parentNode = parentNode;\n\n this._parentBoundary = this.parentNode && this.parentNode._boundary;\n this._headersLines = [];\n this._headerlen = 0;\n\n this._parsedContentType = false;\n this._boundary = false;\n\n this.multipart = false;\n this.encoding = false;\n this.headers = false;\n this.contentType = false;\n this.flowed = false;\n this.delSp = false;\n\n this.config = config || {};\n this.libmime = new libmime.Libmime({ Iconv: this.config.Iconv });\n\n this.parentPartNumber = (parentNode && this.partNr) || [];\n this.partNr = false; // resolved later\n this.childPartNumbers = 0;\n }\n\n getPartNr(provided) {\n if (provided) {\n return []\n .concat(this.partNr || [])\n .filter(nr => !isNaN(nr))\n .concat(provided);\n }\n let childPartNr = ++this.childPartNumbers;\n return []\n .concat(this.partNr || [])\n .filter(nr => !isNaN(nr))\n .concat(childPartNr);\n }\n\n addHeaderChunk(line) {\n if (!line) {\n return;\n }\n this._headersLines.push(line);\n this._headerlen += line.length;\n }\n\n parseHeaders() {\n if (this.headers) {\n return;\n }\n this.headers = new Headers(Buffer.concat(this._headersLines, this._headerlen), this.config);\n\n this._parsedContentDisposition = this.libmime.parseHeaderValue(this.headers.getFirst('Content-Disposition'));\n\n // if content-type is missing default to plaintext\n let contentHeader;\n if (this.headers.get('Content-Type').length) {\n contentHeader = this.headers.getFirst('Content-Type');\n } else {\n if (this._parsedContentDisposition.params.filename) {\n let extension = pathlib.parse(this._parsedContentDisposition.params.filename).ext.replace(/^\\./, '');\n if (extension) {\n contentHeader = libmime.detectMimeType(extension);\n }\n }\n if (!contentHeader) {\n if (/^attachment$/i.test(this._parsedContentDisposition.value)) {\n contentHeader = 'application/octet-stream';\n } else {\n contentHeader = 'text/plain';\n }\n }\n }\n\n this._parsedContentType = this.libmime.parseHeaderValue(contentHeader);\n\n this.encoding = this.headers\n .getFirst('Content-Transfer-Encoding')\n .replace(/\\(.*\\)/g, '')\n .toLowerCase()\n .trim();\n this.contentType = (this._parsedContentType.value || '').toLowerCase().trim() || false;\n this.charset = this._parsedContentType.params.charset || false;\n this.disposition = (this._parsedContentDisposition.value || '').toLowerCase().trim() || false;\n\n // fix invalidly encoded disposition values\n if (this.disposition) {\n try {\n this.disposition = this.libmime.decodeWords(this.disposition);\n } catch (E) {\n // failed to parse disposition, keep as is (most probably an unknown charset is used)\n }\n }\n\n this.filename = this._parsedContentDisposition.params.filename || this._parsedContentType.params.name || false;\n\n if (this._parsedContentType.params.format && this._parsedContentType.params.format.toLowerCase().trim() === 'flowed') {\n this.flowed = true;\n if (this._parsedContentType.params.delsp && this._parsedContentType.params.delsp.toLowerCase().trim() === 'yes') {\n this.delSp = true;\n }\n }\n\n if (this.filename) {\n try {\n this.filename = this.libmime.decodeWords(this.filename);\n } catch (E) {\n // failed to parse filename, keep as is (most probably an unknown charset is used)\n }\n }\n\n this.multipart =\n (this.contentType &&\n this.contentType.substr(0, this.contentType.indexOf('/')) === 'multipart' &&\n this.contentType.substr(this.contentType.indexOf('/') + 1)) ||\n false;\n this._boundary = (this._parsedContentType.params.boundary && Buffer.from(this._parsedContentType.params.boundary)) || false;\n\n this.rfc822 = this.contentType === 'message/rfc822';\n\n if (!this.parentNode || this.parentNode.rfc822) {\n this.partNr = this.parentNode ? this.parentNode.getPartNr('TEXT') : ['TEXT'];\n } else {\n this.partNr = this.parentNode ? this.parentNode.getPartNr() : [];\n }\n }\n\n getHeaders() {\n if (!this.headers) {\n this.parseHeaders();\n }\n return this.headers.build();\n }\n\n setContentType(contentType) {\n if (!this.headers) {\n this.parseHeaders();\n }\n\n contentType = (contentType || '').toLowerCase().trim();\n if (contentType) {\n this._parsedContentType.value = contentType;\n }\n\n if (!this.flowed && this._parsedContentType.params.format) {\n delete this._parsedContentType.params.format;\n }\n\n if (!this.delSp && this._parsedContentType.params.delsp) {\n delete this._parsedContentType.params.delsp;\n }\n\n this.headers.update('Content-Type', this.libmime.buildHeaderValue(this._parsedContentType));\n }\n\n setCharset(charset) {\n if (!this.headers) {\n this.parseHeaders();\n }\n\n charset = (charset || '').toLowerCase().trim();\n\n if (charset === 'ascii') {\n charset = '';\n }\n\n if (!charset) {\n if (!this._parsedContentType.value) {\n // nothing to set or update\n return;\n }\n delete this._parsedContentType.params.charset;\n } else {\n this._parsedContentType.params.charset = charset;\n }\n\n if (!this._parsedContentType.value) {\n this._parsedContentType.value = 'text/plain';\n }\n\n this.headers.update('Content-Type', this.libmime.buildHeaderValue(this._parsedContentType));\n }\n\n setFilename(filename) {\n if (!this.headers) {\n this.parseHeaders();\n }\n\n this.filename = (filename || '').toLowerCase().trim();\n\n if (this._parsedContentType.params.name) {\n delete this._parsedContentType.params.name;\n this.headers.update('Content-Type', this.libmime.buildHeaderValue(this._parsedContentType));\n }\n\n if (!this.filename) {\n if (!this._parsedContentDisposition.value) {\n // nothing to set or update\n return;\n }\n delete this._parsedContentDisposition.params.filename;\n } else {\n this._parsedContentDisposition.params.filename = this.filename;\n }\n\n if (!this._parsedContentDisposition.value) {\n this._parsedContentDisposition.value = 'attachment';\n }\n\n this.headers.update('Content-Disposition', this.libmime.buildHeaderValue(this._parsedContentDisposition));\n }\n\n getDecoder() {\n if (!this.headers) {\n this.parseHeaders();\n }\n\n switch (this.encoding) {\n case 'base64':\n return new libbase64.Decoder();\n case 'quoted-printable':\n return new libqp.Decoder();\n default:\n return new PassThrough();\n }\n }\n\n getEncoder(encoding) {\n if (!this.headers) {\n this.parseHeaders();\n }\n\n encoding = (encoding || '').toString().toLowerCase().trim();\n\n if (encoding && encoding !== this.encoding) {\n this.headers.update('Content-Transfer-Encoding', encoding);\n } else {\n encoding = this.encoding;\n }\n\n switch (encoding) {\n case 'base64':\n return new libbase64.Encoder();\n case 'quoted-printable':\n return new libqp.Encoder();\n default:\n return new PassThrough();\n }\n }\n}\n\nmodule.exports = MimeNode;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHJzYykvLi9ub2RlX21vZHVsZXMvaW1hcGZsb3cvbm9kZV9tb2R1bGVzL21haWxzcGxpdC9saWIvbWltZS1ub2RlLmpzIiwibWFwcGluZ3MiOiJBQUFhOztBQUViLGdCQUFnQixtQkFBTyxDQUFDLHNGQUFXO0FBQ25DLGdCQUFnQixtQkFBTyxDQUFDLDREQUFTO0FBQ2pDLGNBQWMsbUJBQU8sQ0FBQyxzREFBTztBQUM3QixrQkFBa0IsbUJBQU8sQ0FBQyxrRUFBVztBQUNyQyxvQkFBb0IseURBQTZCO0FBQ2pELGdCQUFnQixtQkFBTyxDQUFDLGtCQUFNOztBQUU5QjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLDZDQUE2QywwQkFBMEI7O0FBRXZFO0FBQ0EsNkJBQTZCO0FBQzdCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0I7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEiLCJzb3VyY2VzIjpbIi9ob21lL2FsbWEvbmV4dGdlbi9OZWFoLW1haWwvbm9kZV9tb2R1bGVzL2ltYXBmbG93L25vZGVfbW9kdWxlcy9tYWlsc3BsaXQvbGliL21pbWUtbm9kZS5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbmNvbnN0IEhlYWRlcnMgPSByZXF1aXJlKCcuL2hlYWRlcnMnKTtcbmNvbnN0IGxpYm1pbWUgPSByZXF1aXJlKCdsaWJtaW1lJyk7XG5jb25zdCBsaWJxcCA9IHJlcXVpcmUoJ2xpYnFwJyk7XG5jb25zdCBsaWJiYXNlNjQgPSByZXF1aXJlKCdsaWJiYXNlNjQnKTtcbmNvbnN0IFBhc3NUaHJvdWdoID0gcmVxdWlyZSgnc3RyZWFtJykuUGFzc1Rocm91Z2g7XG5jb25zdCBwYXRobGliID0gcmVxdWlyZSgncGF0aCcpO1xuXG5jbGFzcyBNaW1lTm9kZSB7XG4gICAgY29uc3RydWN0b3IocGFyZW50Tm9kZSwgY29uZmlnKSB7XG4gICAgICAgIHRoaXMudHlwZSA9ICdub2RlJztcbiAgICAgICAgdGhpcy5yb290ID0gIXBhcmVudE5vZGU7XG4gICAgICAgIHRoaXMucGFyZW50Tm9kZSA9IHBhcmVudE5vZGU7XG5cbiAgICAgICAgdGhpcy5fcGFyZW50Qm91bmRhcnkgPSB0aGlzLnBhcmVudE5vZGUgJiYgdGhpcy5wYXJlbnROb2RlLl9ib3VuZGFyeTtcbiAgICAgICAgdGhpcy5faGVhZGVyc0xpbmVzID0gW107XG4gICAgICAgIHRoaXMuX2hlYWRlcmxlbiA9IDA7XG5cbiAgICAgICAgdGhpcy5fcGFyc2VkQ29udGVudFR5cGUgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5fYm91bmRhcnkgPSBmYWxzZTtcblxuICAgICAgICB0aGlzLm11bHRpcGFydCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmVuY29kaW5nID0gZmFsc2U7XG4gICAgICAgIHRoaXMuaGVhZGVycyA9IGZhbHNlO1xuICAgICAgICB0aGlzLmNvbnRlbnRUeXBlID0gZmFsc2U7XG4gICAgICAgIHRoaXMuZmxvd2VkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuZGVsU3AgPSBmYWxzZTtcblxuICAgICAgICB0aGlzLmNvbmZpZyA9IGNvbmZpZyB8fCB7fTtcbiAgICAgICAgdGhpcy5saWJtaW1lID0gbmV3IGxpYm1pbWUuTGlibWltZSh7IEljb252OiB0aGlzLmNvbmZpZy5JY29udiB9KTtcblxuICAgICAgICB0aGlzLnBhcmVudFBhcnROdW1iZXIgPSAocGFyZW50Tm9kZSAmJiB0aGlzLnBhcnROcikgfHwgW107XG4gICAgICAgIHRoaXMucGFydE5yID0gZmFsc2U7IC8vIHJlc29sdmVkIGxhdGVyXG4gICAgICAgIHRoaXMuY2hpbGRQYXJ0TnVtYmVycyA9IDA7XG4gICAgfVxuXG4gICAgZ2V0UGFydE5yKHByb3ZpZGVkKSB7XG4gICAgICAgIGlmIChwcm92aWRlZCkge1xuICAgICAgICAgICAgcmV0dXJuIFtdXG4gICAgICAgICAgICAgICAgLmNvbmNhdCh0aGlzLnBhcnROciB8fCBbXSlcbiAgICAgICAgICAgICAgICAuZmlsdGVyKG5yID0+ICFpc05hTihucikpXG4gICAgICAgICAgICAgICAgLmNvbmNhdChwcm92aWRlZCk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGNoaWxkUGFydE5yID0gKyt0aGlzLmNoaWxkUGFydE51bWJlcnM7XG4gICAgICAgIHJldHVybiBbXVxuICAgICAgICAgICAgLmNvbmNhdCh0aGlzLnBhcnROciB8fCBbXSlcbiAgICAgICAgICAgIC5maWx0ZXIobnIgPT4gIWlzTmFOKG5yKSlcbiAgICAgICAgICAgIC5jb25jYXQoY2hpbGRQYXJ0TnIpO1xuICAgIH1cblxuICAgIGFkZEhlYWRlckNodW5rKGxpbmUpIHtcbiAgICAgICAgaWYgKCFsaW5lKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5faGVhZGVyc0xpbmVzLnB1c2gobGluZSk7XG4gICAgICAgIHRoaXMuX2hlYWRlcmxlbiArPSBsaW5lLmxlbmd0aDtcbiAgICB9XG5cbiAgICBwYXJzZUhlYWRlcnMoKSB7XG4gICAgICAgIGlmICh0aGlzLmhlYWRlcnMpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmhlYWRlcnMgPSBuZXcgSGVhZGVycyhCdWZmZXIuY29uY2F0KHRoaXMuX2hlYWRlcnNMaW5lcywgdGhpcy5faGVhZGVybGVuKSwgdGhpcy5jb25maWcpO1xuXG4gICAgICAgIHRoaXMuX3BhcnNlZENvbnRlbnREaXNwb3NpdGlvbiA9IHRoaXMubGlibWltZS5wYXJzZUhlYWRlclZhbHVlKHRoaXMuaGVhZGVycy5nZXRGaXJzdCgnQ29udGVudC1EaXNwb3NpdGlvbicpKTtcblxuICAgICAgICAvLyBpZiBjb250ZW50LXR5cGUgaXMgbWlzc2luZyBkZWZhdWx0IHRvIHBsYWludGV4dFxuICAgICAgICBsZXQgY29udGVudEhlYWRlcjtcbiAgICAgICAgaWYgKHRoaXMuaGVhZGVycy5nZXQoJ0NvbnRlbnQtVHlwZScpLmxlbmd0aCkge1xuICAgICAgICAgICAgY29udGVudEhlYWRlciA9IHRoaXMuaGVhZGVycy5nZXRGaXJzdCgnQ29udGVudC1UeXBlJyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAodGhpcy5fcGFyc2VkQ29udGVudERpc3Bvc2l0aW9uLnBhcmFtcy5maWxlbmFtZSkge1xuICAgICAgICAgICAgICAgIGxldCBleHRlbnNpb24gPSBwYXRobGliLnBhcnNlKHRoaXMuX3BhcnNlZENvbnRlbnREaXNwb3NpdGlvbi5wYXJhbXMuZmlsZW5hbWUpLmV4dC5yZXBsYWNlKC9eXFwuLywgJycpO1xuICAgICAgICAgICAgICAgIGlmIChleHRlbnNpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGVudEhlYWRlciA9IGxpYm1pbWUuZGV0ZWN0TWltZVR5cGUoZXh0ZW5zaW9uKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIWNvbnRlbnRIZWFkZXIpIHtcbiAgICAgICAgICAgICAgICBpZiAoL15hdHRhY2htZW50JC9pLnRlc3QodGhpcy5fcGFyc2VkQ29udGVudERpc3Bvc2l0aW9uLnZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgICBjb250ZW50SGVhZGVyID0gJ2FwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSc7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGVudEhlYWRlciA9ICd0ZXh0L3BsYWluJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9wYXJzZWRDb250ZW50VHlwZSA9IHRoaXMubGlibWltZS5wYXJzZUhlYWRlclZhbHVlKGNvbnRlbnRIZWFkZXIpO1xuXG4gICAgICAgIHRoaXMuZW5jb2RpbmcgPSB0aGlzLmhlYWRlcnNcbiAgICAgICAgICAgIC5nZXRGaXJzdCgnQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZycpXG4gICAgICAgICAgICAucmVwbGFjZSgvXFwoLipcXCkvZywgJycpXG4gICAgICAgICAgICAudG9Mb3dlckNhc2UoKVxuICAgICAgICAgICAgLnRyaW0oKTtcbiAgICAgICAgdGhpcy5jb250ZW50VHlwZSA9ICh0aGlzLl9wYXJzZWRDb250ZW50VHlwZS52YWx1ZSB8fCAnJykudG9Mb3dlckNhc2UoKS50cmltKCkgfHwgZmFsc2U7XG4gICAgICAgIHRoaXMuY2hhcnNldCA9IHRoaXMuX3BhcnNlZENvbnRlbnRUeXBlLnBhcmFtcy5jaGFyc2V0IHx8IGZhbHNlO1xuICAgICAgICB0aGlzLmRpc3Bvc2l0aW9uID0gKHRoaXMuX3BhcnNlZENvbnRlbnREaXNwb3NpdGlvbi52YWx1ZSB8fCAnJykudG9Mb3dlckNhc2UoKS50cmltKCkgfHwgZmFsc2U7XG5cbiAgICAgICAgLy8gZml4IGludmFsaWRseSBlbmNvZGVkIGRpc3Bvc2l0aW9uIHZhbHVlc1xuICAgICAgICBpZiAodGhpcy5kaXNwb3NpdGlvbikge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICB0aGlzLmRpc3Bvc2l0aW9uID0gdGhpcy5saWJtaW1lLmRlY29kZVdvcmRzKHRoaXMuZGlzcG9zaXRpb24pO1xuICAgICAgICAgICAgfSBjYXRjaCAoRSkge1xuICAgICAgICAgICAgICAgIC8vIGZhaWxlZCB0byBwYXJzZSBkaXNwb3NpdGlvbiwga2VlcCBhcyBpcyAobW9zdCBwcm9iYWJseSBhbiB1bmtub3duIGNoYXJzZXQgaXMgdXNlZClcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZmlsZW5hbWUgPSB0aGlzLl9wYXJzZWRDb250ZW50RGlzcG9zaXRpb24ucGFyYW1zLmZpbGVuYW1lIHx8IHRoaXMuX3BhcnNlZENvbnRlbnRUeXBlLnBhcmFtcy5uYW1lIHx8IGZhbHNlO1xuXG4gICAgICAgIGlmICh0aGlzLl9wYXJzZWRDb250ZW50VHlwZS5wYXJhbXMuZm9ybWF0ICYmIHRoaXMuX3BhcnNlZENvbnRlbnRUeXBlLnBhcmFtcy5mb3JtYXQudG9Mb3dlckNhc2UoKS50cmltKCkgPT09ICdmbG93ZWQnKSB7XG4gICAgICAgICAgICB0aGlzLmZsb3dlZCA9IHRydWU7XG4gICAgICAgICAgICBpZiAodGhpcy5fcGFyc2VkQ29udGVudFR5cGUucGFyYW1zLmRlbHNwICYmIHRoaXMuX3BhcnNlZENvbnRlbnRUeXBlLnBhcmFtcy5kZWxzcC50b0xvd2VyQ2FzZSgpLnRyaW0oKSA9PT0gJ3llcycpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmRlbFNwID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmZpbGVuYW1lKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHRoaXMuZmlsZW5hbWUgPSB0aGlzLmxpYm1pbWUuZGVjb2RlV29yZHModGhpcy5maWxlbmFtZSk7XG4gICAgICAgICAgICB9IGNhdGNoIChFKSB7XG4gICAgICAgICAgICAgICAgLy8gZmFpbGVkIHRvIHBhcnNlIGZpbGVuYW1lLCBrZWVwIGFzIGlzIChtb3N0IHByb2JhYmx5IGFuIHVua25vd24gY2hhcnNldCBpcyB1c2VkKVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5tdWx0aXBhcnQgPVxuICAgICAgICAgICAgKHRoaXMuY29udGVudFR5cGUgJiZcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRlbnRUeXBlLnN1YnN0cigwLCB0aGlzLmNvbnRlbnRUeXBlLmluZGV4T2YoJy8nKSkgPT09ICdtdWx0aXBhcnQnICYmXG4gICAgICAgICAgICAgICAgdGhpcy5jb250ZW50VHlwZS5zdWJzdHIodGhpcy5jb250ZW50VHlwZS5pbmRleE9mKCcvJykgKyAxKSkgfHxcbiAgICAgICAgICAgIGZhbHNlO1xuICAgICAgICB0aGlzLl9ib3VuZGFyeSA9ICh0aGlzLl9wYXJzZWRDb250ZW50VHlwZS5wYXJhbXMuYm91bmRhcnkgJiYgQnVmZmVyLmZyb20odGhpcy5fcGFyc2VkQ29udGVudFR5cGUucGFyYW1zLmJvdW5kYXJ5KSkgfHwgZmFsc2U7XG5cbiAgICAgICAgdGhpcy5yZmM4MjIgPSB0aGlzLmNvbnRlbnRUeXBlID09PSAnbWVzc2FnZS9yZmM4MjInO1xuXG4gICAgICAgIGlmICghdGhpcy5wYXJlbnROb2RlIHx8IHRoaXMucGFyZW50Tm9kZS5yZmM4MjIpIHtcbiAgICAgICAgICAgIHRoaXMucGFydE5yID0gdGhpcy5wYXJlbnROb2RlID8gdGhpcy5wYXJlbnROb2RlLmdldFBhcnROcignVEVYVCcpIDogWydURVhUJ107XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnBhcnROciA9IHRoaXMucGFyZW50Tm9kZSA/IHRoaXMucGFyZW50Tm9kZS5nZXRQYXJ0TnIoKSA6IFtdO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZ2V0SGVhZGVycygpIHtcbiAgICAgICAgaWYgKCF0aGlzLmhlYWRlcnMpIHtcbiAgICAgICAgICAgIHRoaXMucGFyc2VIZWFkZXJzKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuaGVhZGVycy5idWlsZCgpO1xuICAgIH1cblxuICAgIHNldENvbnRlbnRUeXBlKGNvbnRlbnRUeXBlKSB7XG4gICAgICAgIGlmICghdGhpcy5oZWFkZXJzKSB7XG4gICAgICAgICAgICB0aGlzLnBhcnNlSGVhZGVycygpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29udGVudFR5cGUgPSAoY29udGVudFR5cGUgfHwgJycpLnRvTG93ZXJDYXNlKCkudHJpbSgpO1xuICAgICAgICBpZiAoY29udGVudFR5cGUpIHtcbiAgICAgICAgICAgIHRoaXMuX3BhcnNlZENvbnRlbnRUeXBlLnZhbHVlID0gY29udGVudFR5cGU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMuZmxvd2VkICYmIHRoaXMuX3BhcnNlZENvbnRlbnRUeXBlLnBhcmFtcy5mb3JtYXQpIHtcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLl9wYXJzZWRDb250ZW50VHlwZS5wYXJhbXMuZm9ybWF0O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0aGlzLmRlbFNwICYmIHRoaXMuX3BhcnNlZENvbnRlbnRUeXBlLnBhcmFtcy5kZWxzcCkge1xuICAgICAgICAgICAgZGVsZXRlIHRoaXMuX3BhcnNlZENvbnRlbnRUeXBlLnBhcmFtcy5kZWxzcDtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuaGVhZGVycy51cGRhdGUoJ0NvbnRlbnQtVHlwZScsIHRoaXMubGlibWltZS5idWlsZEhlYWRlclZhbHVlKHRoaXMuX3BhcnNlZENvbnRlbnRUeXBlKSk7XG4gICAgfVxuXG4gICAgc2V0Q2hhcnNldChjaGFyc2V0KSB7XG4gICAgICAgIGlmICghdGhpcy5oZWFkZXJzKSB7XG4gICAgICAgICAgICB0aGlzLnBhcnNlSGVhZGVycygpO1xuICAgICAgICB9XG5cbiAgICAgICAgY2hhcnNldCA9IChjaGFyc2V0IHx8ICcnKS50b0xvd2VyQ2FzZSgpLnRyaW0oKTtcblxuICAgICAgICBpZiAoY2hhcnNldCA9PT0gJ2FzY2lpJykge1xuICAgICAgICAgICAgY2hhcnNldCA9ICcnO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFjaGFyc2V0KSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuX3BhcnNlZENvbnRlbnRUeXBlLnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgLy8gbm90aGluZyB0byBzZXQgb3IgdXBkYXRlXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZGVsZXRlIHRoaXMuX3BhcnNlZENvbnRlbnRUeXBlLnBhcmFtcy5jaGFyc2V0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fcGFyc2VkQ29udGVudFR5cGUucGFyYW1zLmNoYXJzZXQgPSBjaGFyc2V0O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0aGlzLl9wYXJzZWRDb250ZW50VHlwZS52YWx1ZSkge1xuICAgICAgICAgICAgdGhpcy5fcGFyc2VkQ29udGVudFR5cGUudmFsdWUgPSAndGV4dC9wbGFpbic7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmhlYWRlcnMudXBkYXRlKCdDb250ZW50LVR5cGUnLCB0aGlzLmxpYm1pbWUuYnVpbGRIZWFkZXJWYWx1ZSh0aGlzLl9wYXJzZWRDb250ZW50VHlwZSkpO1xuICAgIH1cblxuICAgIHNldEZpbGVuYW1lKGZpbGVuYW1lKSB7XG4gICAgICAgIGlmICghdGhpcy5oZWFkZXJzKSB7XG4gICAgICAgICAgICB0aGlzLnBhcnNlSGVhZGVycygpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5maWxlbmFtZSA9IChmaWxlbmFtZSB8fCAnJykudG9Mb3dlckNhc2UoKS50cmltKCk7XG5cbiAgICAgICAgaWYgKHRoaXMuX3BhcnNlZENvbnRlbnRUeXBlLnBhcmFtcy5uYW1lKSB7XG4gICAgICAgICAgICBkZWxldGUgdGhpcy5fcGFyc2VkQ29udGVudFR5cGUucGFyYW1zLm5hbWU7XG4gICAgICAgICAgICB0aGlzLmhlYWRlcnMudXBkYXRlKCdDb250ZW50LVR5cGUnLCB0aGlzLmxpYm1pbWUuYnVpbGRIZWFkZXJWYWx1ZSh0aGlzLl9wYXJzZWRDb250ZW50VHlwZSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0aGlzLmZpbGVuYW1lKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuX3BhcnNlZENvbnRlbnREaXNwb3NpdGlvbi52YWx1ZSkge1xuICAgICAgICAgICAgICAgIC8vIG5vdGhpbmcgdG8gc2V0IG9yIHVwZGF0ZVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLl9wYXJzZWRDb250ZW50RGlzcG9zaXRpb24ucGFyYW1zLmZpbGVuYW1lO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fcGFyc2VkQ29udGVudERpc3Bvc2l0aW9uLnBhcmFtcy5maWxlbmFtZSA9IHRoaXMuZmlsZW5hbWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMuX3BhcnNlZENvbnRlbnREaXNwb3NpdGlvbi52YWx1ZSkge1xuICAgICAgICAgICAgdGhpcy5fcGFyc2VkQ29udGVudERpc3Bvc2l0aW9uLnZhbHVlID0gJ2F0dGFjaG1lbnQnO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5oZWFkZXJzLnVwZGF0ZSgnQ29udGVudC1EaXNwb3NpdGlvbicsIHRoaXMubGlibWltZS5idWlsZEhlYWRlclZhbHVlKHRoaXMuX3BhcnNlZENvbnRlbnREaXNwb3NpdGlvbikpO1xuICAgIH1cblxuICAgIGdldERlY29kZXIoKSB7XG4gICAgICAgIGlmICghdGhpcy5oZWFkZXJzKSB7XG4gICAgICAgICAgICB0aGlzLnBhcnNlSGVhZGVycygpO1xuICAgICAgICB9XG5cbiAgICAgICAgc3dpdGNoICh0aGlzLmVuY29kaW5nKSB7XG4gICAgICAgICAgICBjYXNlICdiYXNlNjQnOlxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgbGliYmFzZTY0LkRlY29kZXIoKTtcbiAgICAgICAgICAgIGNhc2UgJ3F1b3RlZC1wcmludGFibGUnOlxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgbGlicXAuRGVjb2RlcigpO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFBhc3NUaHJvdWdoKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBnZXRFbmNvZGVyKGVuY29kaW5nKSB7XG4gICAgICAgIGlmICghdGhpcy5oZWFkZXJzKSB7XG4gICAgICAgICAgICB0aGlzLnBhcnNlSGVhZGVycygpO1xuICAgICAgICB9XG5cbiAgICAgICAgZW5jb2RpbmcgPSAoZW5jb2RpbmcgfHwgJycpLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKS50cmltKCk7XG5cbiAgICAgICAgaWYgKGVuY29kaW5nICYmIGVuY29kaW5nICE9PSB0aGlzLmVuY29kaW5nKSB7XG4gICAgICAgICAgICB0aGlzLmhlYWRlcnMudXBkYXRlKCdDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nJywgZW5jb2RpbmcpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZW5jb2RpbmcgPSB0aGlzLmVuY29kaW5nO1xuICAgICAgICB9XG5cbiAgICAgICAgc3dpdGNoIChlbmNvZGluZykge1xuICAgICAgICAgICAgY2FzZSAnYmFzZTY0JzpcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IGxpYmJhc2U2NC5FbmNvZGVyKCk7XG4gICAgICAgICAgICBjYXNlICdxdW90ZWQtcHJpbnRhYmxlJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IGxpYnFwLkVuY29kZXIoKTtcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQYXNzVGhyb3VnaCgpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IE1pbWVOb2RlO1xuIl0sIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6WzBdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(rsc)/./node_modules/imapflow/node_modules/mailsplit/lib/mime-node.js\n");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "(rsc)/./node_modules/imapflow/node_modules/mailsplit/lib/node-rewriter.js":
|
|
/*!***************************************************************************!*\
|
|
!*** ./node_modules/imapflow/node_modules/mailsplit/lib/node-rewriter.js ***!
|
|
\***************************************************************************/
|
|
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
|
|
|
|
eval("\n\n// Helper class to rewrite nodes with specific mime type\n\nconst Transform = (__webpack_require__(/*! stream */ \"stream\").Transform);\nconst FlowedDecoder = __webpack_require__(/*! ./flowed-decoder */ \"(rsc)/./node_modules/imapflow/node_modules/mailsplit/lib/flowed-decoder.js\");\n\n/**\n * NodeRewriter Transform stream. Updates content for all nodes with specified mime type\n *\n * @constructor\n * @param {String} mimeType Define the Mime-Type to look for\n * @param {Function} rewriteAction Function to run with the node content\n */\nclass NodeRewriter extends Transform {\n constructor(filterFunc, rewriteAction) {\n let options = {\n readableObjectMode: true,\n writableObjectMode: true\n };\n super(options);\n\n this.filterFunc = filterFunc;\n this.rewriteAction = rewriteAction;\n\n this.decoder = false;\n this.encoder = false;\n this.continue = false;\n }\n\n _transform(data, encoding, callback) {\n this.processIncoming(data, callback);\n }\n\n _flush(callback) {\n if (this.decoder) {\n // emit an empty node just in case there is pending data to end\n return this.processIncoming(\n {\n type: 'none'\n },\n callback\n );\n }\n return callback();\n }\n\n processIncoming(data, callback) {\n if (this.decoder && data.type === 'body') {\n // data to parse\n if (!this.decoder.write(data.value)) {\n return this.decoder.once('drain', callback);\n } else {\n return callback();\n }\n } else if (this.decoder && data.type !== 'body') {\n // stop decoding.\n // we can not process the current data chunk as we need to wait until\n // the parsed data is completely processed, so we store a reference to the\n // continue callback\n this.continue = () => {\n this.continue = false;\n this.decoder = false;\n this.encoder = false;\n this.processIncoming(data, callback);\n };\n return this.decoder.end();\n } else if (data.type === 'node' && this.filterFunc(data)) {\n // found matching node, create new handler\n this.emit('node', this.createDecodePair(data));\n } else if (this.readable && data.type !== 'none') {\n // we don't care about this data, just pass it over to the joiner\n this.push(data);\n }\n callback();\n }\n\n createDecodePair(node) {\n this.decoder = node.getDecoder();\n\n if (['base64', 'quoted-printable'].includes(node.encoding)) {\n this.encoder = node.getEncoder();\n } else {\n this.encoder = node.getEncoder('quoted-printable');\n }\n\n let lastByte = false;\n\n let decoder = this.decoder;\n let encoder = this.encoder;\n let firstChunk = true;\n decoder.$reading = false;\n\n let readFromEncoder = () => {\n decoder.$reading = true;\n\n let data = encoder.read();\n if (data === null) {\n decoder.$reading = false;\n return;\n }\n\n if (firstChunk) {\n firstChunk = false;\n if (this.readable) {\n this.push(node);\n if (node.type === 'body') {\n lastByte = node.value && node.value.length && node.value[node.value.length - 1];\n }\n }\n }\n\n let writeMore = true;\n if (this.readable) {\n writeMore = this.push({\n node,\n type: 'body',\n value: data\n });\n lastByte = data && data.length && data[data.length - 1];\n }\n\n if (writeMore) {\n return setImmediate(readFromEncoder);\n } else {\n encoder.pause();\n // no idea how to catch drain? use timeout for now as poor man's substitute\n // this.once('drain', () => encoder.resume());\n setTimeout(() => {\n encoder.resume();\n setImmediate(readFromEncoder);\n }, 100);\n }\n };\n\n encoder.on('readable', () => {\n if (!decoder.$reading) {\n return readFromEncoder();\n }\n });\n\n encoder.on('end', () => {\n if (firstChunk) {\n firstChunk = false;\n if (this.readable) {\n this.push(node);\n if (node.type === 'body') {\n lastByte = node.value && node.value.length && node.value[node.value.length - 1];\n }\n }\n }\n\n if (lastByte !== 0x0a) {\n // make sure there is a terminating line break\n this.push({\n node,\n type: 'body',\n value: Buffer.from([0x0a])\n });\n }\n\n if (this.continue) {\n return this.continue();\n }\n });\n\n if (/^text\\//.test(node.contentType) && node.flowed) {\n // text/plain; format=flowed is a special case\n let flowDecoder = decoder;\n decoder = new FlowedDecoder({\n delSp: node.delSp,\n encoding: node.encoding\n });\n flowDecoder.on('error', err => {\n decoder.emit('error', err);\n });\n flowDecoder.pipe(decoder);\n\n // we don't know what kind of data we are going to get, does it comply with the\n // requirements of format=flowed, so we just cancel it\n node.flowed = false;\n node.delSp = false;\n node.setContentType();\n }\n\n return {\n node,\n decoder,\n encoder\n };\n }\n}\n\nmodule.exports = NodeRewriter;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHJzYykvLi9ub2RlX21vZHVsZXMvaW1hcGZsb3cvbm9kZV9tb2R1bGVzL21haWxzcGxpdC9saWIvbm9kZS1yZXdyaXRlci5qcyIsIm1hcHBpbmdzIjoiQUFBYTs7QUFFYjs7QUFFQSxrQkFBa0IsdURBQTJCO0FBQzdDLHNCQUFzQixtQkFBTyxDQUFDLG9HQUFrQjs7QUFFaEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkIsV0FBVyxVQUFVO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQSwyQkFBMkI7QUFDM0I7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBLGFBQWE7QUFDYjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEiLCJzb3VyY2VzIjpbIi9ob21lL2FsbWEvbmV4dGdlbi9OZWFoLW1haWwvbm9kZV9tb2R1bGVzL2ltYXBmbG93L25vZGVfbW9kdWxlcy9tYWlsc3BsaXQvbGliL25vZGUtcmV3cml0ZXIuanMiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG4vLyBIZWxwZXIgY2xhc3MgdG8gcmV3cml0ZSBub2RlcyB3aXRoIHNwZWNpZmljIG1pbWUgdHlwZVxuXG5jb25zdCBUcmFuc2Zvcm0gPSByZXF1aXJlKCdzdHJlYW0nKS5UcmFuc2Zvcm07XG5jb25zdCBGbG93ZWREZWNvZGVyID0gcmVxdWlyZSgnLi9mbG93ZWQtZGVjb2RlcicpO1xuXG4vKipcbiAqIE5vZGVSZXdyaXRlciBUcmFuc2Zvcm0gc3RyZWFtLiBVcGRhdGVzIGNvbnRlbnQgZm9yIGFsbCBub2RlcyB3aXRoIHNwZWNpZmllZCBtaW1lIHR5cGVcbiAqXG4gKiBAY29uc3RydWN0b3JcbiAqIEBwYXJhbSB7U3RyaW5nfSBtaW1lVHlwZSBEZWZpbmUgdGhlIE1pbWUtVHlwZSB0byBsb29rIGZvclxuICogQHBhcmFtIHtGdW5jdGlvbn0gcmV3cml0ZUFjdGlvbiBGdW5jdGlvbiB0byBydW4gd2l0aCB0aGUgbm9kZSBjb250ZW50XG4gKi9cbmNsYXNzIE5vZGVSZXdyaXRlciBleHRlbmRzIFRyYW5zZm9ybSB7XG4gICAgY29uc3RydWN0b3IoZmlsdGVyRnVuYywgcmV3cml0ZUFjdGlvbikge1xuICAgICAgICBsZXQgb3B0aW9ucyA9IHtcbiAgICAgICAgICAgIHJlYWRhYmxlT2JqZWN0TW9kZTogdHJ1ZSxcbiAgICAgICAgICAgIHdyaXRhYmxlT2JqZWN0TW9kZTogdHJ1ZVxuICAgICAgICB9O1xuICAgICAgICBzdXBlcihvcHRpb25zKTtcblxuICAgICAgICB0aGlzLmZpbHRlckZ1bmMgPSBmaWx0ZXJGdW5jO1xuICAgICAgICB0aGlzLnJld3JpdGVBY3Rpb24gPSByZXdyaXRlQWN0aW9uO1xuXG4gICAgICAgIHRoaXMuZGVjb2RlciA9IGZhbHNlO1xuICAgICAgICB0aGlzLmVuY29kZXIgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5jb250aW51ZSA9IGZhbHNlO1xuICAgIH1cblxuICAgIF90cmFuc2Zvcm0oZGF0YSwgZW5jb2RpbmcsIGNhbGxiYWNrKSB7XG4gICAgICAgIHRoaXMucHJvY2Vzc0luY29taW5nKGRhdGEsIGNhbGxiYWNrKTtcbiAgICB9XG5cbiAgICBfZmx1c2goY2FsbGJhY2spIHtcbiAgICAgICAgaWYgKHRoaXMuZGVjb2Rlcikge1xuICAgICAgICAgICAgLy8gZW1pdCBhbiBlbXB0eSBub2RlIGp1c3QgaW4gY2FzZSB0aGVyZSBpcyBwZW5kaW5nIGRhdGEgdG8gZW5kXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5wcm9jZXNzSW5jb21pbmcoXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnbm9uZSdcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGNhbGxiYWNrXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjYWxsYmFjaygpO1xuICAgIH1cblxuICAgIHByb2Nlc3NJbmNvbWluZyhkYXRhLCBjYWxsYmFjaykge1xuICAgICAgICBpZiAodGhpcy5kZWNvZGVyICYmIGRhdGEudHlwZSA9PT0gJ2JvZHknKSB7XG4gICAgICAgICAgICAvLyBkYXRhIHRvIHBhcnNlXG4gICAgICAgICAgICBpZiAoIXRoaXMuZGVjb2Rlci53cml0ZShkYXRhLnZhbHVlKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmRlY29kZXIub25jZSgnZHJhaW4nLCBjYWxsYmFjayk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBjYWxsYmFjaygpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuZGVjb2RlciAmJiBkYXRhLnR5cGUgIT09ICdib2R5Jykge1xuICAgICAgICAgICAgLy8gc3RvcCBkZWNvZGluZy5cbiAgICAgICAgICAgIC8vIHdlIGNhbiBub3QgcHJvY2VzcyB0aGUgY3VycmVudCBkYXRhIGNodW5rIGFzIHdlIG5lZWQgdG8gd2FpdCB1bnRpbFxuICAgICAgICAgICAgLy8gdGhlIHBhcnNlZCBkYXRhIGlzIGNvbXBsZXRlbHkgcHJvY2Vzc2VkLCBzbyB3ZSBzdG9yZSBhIHJlZmVyZW5jZSB0byB0aGVcbiAgICAgICAgICAgIC8vIGNvbnRpbnVlIGNhbGxiYWNrXG4gICAgICAgICAgICB0aGlzLmNvbnRpbnVlID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuY29udGludWUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB0aGlzLmRlY29kZXIgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB0aGlzLmVuY29kZXIgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB0aGlzLnByb2Nlc3NJbmNvbWluZyhkYXRhLCBjYWxsYmFjayk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGVjb2Rlci5lbmQoKTtcbiAgICAgICAgfSBlbHNlIGlmIChkYXRhLnR5cGUgPT09ICdub2RlJyAmJiB0aGlzLmZpbHRlckZ1bmMoZGF0YSkpIHtcbiAgICAgICAgICAgIC8vIGZvdW5kIG1hdGNoaW5nIG5vZGUsIGNyZWF0ZSBuZXcgaGFuZGxlclxuICAgICAgICAgICAgdGhpcy5lbWl0KCdub2RlJywgdGhpcy5jcmVhdGVEZWNvZGVQYWlyKGRhdGEpKTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnJlYWRhYmxlICYmIGRhdGEudHlwZSAhPT0gJ25vbmUnKSB7XG4gICAgICAgICAgICAvLyB3ZSBkb24ndCBjYXJlIGFib3V0IHRoaXMgZGF0YSwganVzdCBwYXNzIGl0IG92ZXIgdG8gdGhlIGpvaW5lclxuICAgICAgICAgICAgdGhpcy5wdXNoKGRhdGEpO1xuICAgICAgICB9XG4gICAgICAgIGNhbGxiYWNrKCk7XG4gICAgfVxuXG4gICAgY3JlYXRlRGVjb2RlUGFpcihub2RlKSB7XG4gICAgICAgIHRoaXMuZGVjb2RlciA9IG5vZGUuZ2V0RGVjb2RlcigpO1xuXG4gICAgICAgIGlmIChbJ2Jhc2U2NCcsICdxdW90ZWQtcHJpbnRhYmxlJ10uaW5jbHVkZXMobm9kZS5lbmNvZGluZykpIHtcbiAgICAgICAgICAgIHRoaXMuZW5jb2RlciA9IG5vZGUuZ2V0RW5jb2RlcigpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5lbmNvZGVyID0gbm9kZS5nZXRFbmNvZGVyKCdxdW90ZWQtcHJpbnRhYmxlJyk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbGFzdEJ5dGUgPSBmYWxzZTtcblxuICAgICAgICBsZXQgZGVjb2RlciA9IHRoaXMuZGVjb2RlcjtcbiAgICAgICAgbGV0IGVuY29kZXIgPSB0aGlzLmVuY29kZXI7XG4gICAgICAgIGxldCBmaXJzdENodW5rID0gdHJ1ZTtcbiAgICAgICAgZGVjb2Rlci4kcmVhZGluZyA9IGZhbHNlO1xuXG4gICAgICAgIGxldCByZWFkRnJvbUVuY29kZXIgPSAoKSA9PiB7XG4gICAgICAgICAgICBkZWNvZGVyLiRyZWFkaW5nID0gdHJ1ZTtcblxuICAgICAgICAgICAgbGV0IGRhdGEgPSBlbmNvZGVyLnJlYWQoKTtcbiAgICAgICAgICAgIGlmIChkYXRhID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgZGVjb2Rlci4kcmVhZGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGZpcnN0Q2h1bmspIHtcbiAgICAgICAgICAgICAgICBmaXJzdENodW5rID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMucmVhZGFibGUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wdXNoKG5vZGUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAobm9kZS50eXBlID09PSAnYm9keScpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RCeXRlID0gbm9kZS52YWx1ZSAmJiBub2RlLnZhbHVlLmxlbmd0aCAmJiBub2RlLnZhbHVlW25vZGUudmFsdWUubGVuZ3RoIC0gMV07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxldCB3cml0ZU1vcmUgPSB0cnVlO1xuICAgICAgICAgICAgaWYgKHRoaXMucmVhZGFibGUpIHtcbiAgICAgICAgICAgICAgICB3cml0ZU1vcmUgPSB0aGlzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICBub2RlLFxuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnYm9keScsXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiBkYXRhXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgbGFzdEJ5dGUgPSBkYXRhICYmIGRhdGEubGVuZ3RoICYmIGRhdGFbZGF0YS5sZW5ndGggLSAxXTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHdyaXRlTW9yZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBzZXRJbW1lZGlhdGUocmVhZEZyb21FbmNvZGVyKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZW5jb2Rlci5wYXVzZSgpO1xuICAgICAgICAgICAgICAgIC8vIG5vIGlkZWEgaG93IHRvIGNhdGNoIGRyYWluPyB1c2UgdGltZW91dCBmb3Igbm93IGFzIHBvb3IgbWFuJ3Mgc3Vic3RpdHV0ZVxuICAgICAgICAgICAgICAgIC8vIHRoaXMub25jZSgnZHJhaW4nLCAoKSA9PiBlbmNvZGVyLnJlc3VtZSgpKTtcbiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgZW5jb2Rlci5yZXN1bWUoKTtcbiAgICAgICAgICAgICAgICAgICAgc2V0SW1tZWRpYXRlKHJlYWRGcm9tRW5jb2Rlcik7XG4gICAgICAgICAgICAgICAgfSwgMTAwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICBlbmNvZGVyLm9uKCdyZWFkYWJsZScsICgpID0+IHtcbiAgICAgICAgICAgIGlmICghZGVjb2Rlci4kcmVhZGluZykge1xuICAgICAgICAgICAgICAgIHJldHVybiByZWFkRnJvbUVuY29kZXIoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgZW5jb2Rlci5vbignZW5kJywgKCkgPT4ge1xuICAgICAgICAgICAgaWYgKGZpcnN0Q2h1bmspIHtcbiAgICAgICAgICAgICAgICBmaXJzdENodW5rID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMucmVhZGFibGUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wdXNoKG5vZGUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAobm9kZS50eXBlID09PSAnYm9keScpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RCeXRlID0gbm9kZS52YWx1ZSAmJiBub2RlLnZhbHVlLmxlbmd0aCAmJiBub2RlLnZhbHVlW25vZGUudmFsdWUubGVuZ3RoIC0gMV07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChsYXN0Qnl0ZSAhPT0gMHgwYSkge1xuICAgICAgICAgICAgICAgIC8vIG1ha2Ugc3VyZSB0aGVyZSBpcyBhIHRlcm1pbmF0aW5nIGxpbmUgYnJlYWtcbiAgICAgICAgICAgICAgICB0aGlzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICBub2RlLFxuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnYm9keScsXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiBCdWZmZXIuZnJvbShbMHgwYV0pXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0aGlzLmNvbnRpbnVlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29udGludWUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKC9edGV4dFxcLy8udGVzdChub2RlLmNvbnRlbnRUeXBlKSAmJiBub2RlLmZsb3dlZCkge1xuICAgICAgICAgICAgLy8gdGV4dC9wbGFpbjsgZm9ybWF0PWZsb3dlZCBpcyBhIHNwZWNpYWwgY2FzZVxuICAgICAgICAgICAgbGV0IGZsb3dEZWNvZGVyID0gZGVjb2RlcjtcbiAgICAgICAgICAgIGRlY29kZXIgPSBuZXcgRmxvd2VkRGVjb2Rlcih7XG4gICAgICAgICAgICAgICAgZGVsU3A6IG5vZGUuZGVsU3AsXG4gICAgICAgICAgICAgICAgZW5jb2Rpbmc6IG5vZGUuZW5jb2RpbmdcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgZmxvd0RlY29kZXIub24oJ2Vycm9yJywgZXJyID0+IHtcbiAgICAgICAgICAgICAgICBkZWNvZGVyLmVtaXQoJ2Vycm9yJywgZXJyKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgZmxvd0RlY29kZXIucGlwZShkZWNvZGVyKTtcblxuICAgICAgICAgICAgLy8gd2UgZG9uJ3Qga25vdyB3aGF0IGtpbmQgb2YgZGF0YSB3ZSBhcmUgZ29pbmcgdG8gZ2V0LCBkb2VzIGl0IGNvbXBseSB3aXRoIHRoZVxuICAgICAgICAgICAgLy8gcmVxdWlyZW1lbnRzIG9mIGZvcm1hdD1mbG93ZWQsIHNvIHdlIGp1c3QgY2FuY2VsIGl0XG4gICAgICAgICAgICBub2RlLmZsb3dlZCA9IGZhbHNlO1xuICAgICAgICAgICAgbm9kZS5kZWxTcCA9IGZhbHNlO1xuICAgICAgICAgICAgbm9kZS5zZXRDb250ZW50VHlwZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG5vZGUsXG4gICAgICAgICAgICBkZWNvZGVyLFxuICAgICAgICAgICAgZW5jb2RlclxuICAgICAgICB9O1xuICAgIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBOb2RlUmV3cml0ZXI7XG4iXSwibmFtZXMiOltdLCJpZ25vcmVMaXN0IjpbMF0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(rsc)/./node_modules/imapflow/node_modules/mailsplit/lib/node-rewriter.js\n");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "(rsc)/./node_modules/imapflow/node_modules/mailsplit/lib/node-streamer.js":
|
|
/*!***************************************************************************!*\
|
|
!*** ./node_modules/imapflow/node_modules/mailsplit/lib/node-streamer.js ***!
|
|
\***************************************************************************/
|
|
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
|
|
|
|
eval("\n\n// Helper class to rewrite nodes with specific mime type\n\nconst Transform = (__webpack_require__(/*! stream */ \"stream\").Transform);\nconst FlowedDecoder = __webpack_require__(/*! ./flowed-decoder */ \"(rsc)/./node_modules/imapflow/node_modules/mailsplit/lib/flowed-decoder.js\");\n\n/**\n * NodeRewriter Transform stream. Updates content for all nodes with specified mime type\n *\n * @constructor\n * @param {String} mimeType Define the Mime-Type to look for\n * @param {Function} streamAction Function to run with the node content\n */\nclass NodeStreamer extends Transform {\n constructor(filterFunc, streamAction) {\n let options = {\n readableObjectMode: true,\n writableObjectMode: true\n };\n super(options);\n\n this.filterFunc = filterFunc;\n this.streamAction = streamAction;\n\n this.decoder = false;\n this.canContinue = false;\n this.continue = false;\n }\n\n _transform(data, encoding, callback) {\n this.processIncoming(data, callback);\n }\n\n _flush(callback) {\n if (this.decoder) {\n // emit an empty node just in case there is pending data to end\n return this.processIncoming(\n {\n type: 'none'\n },\n callback\n );\n }\n return callback();\n }\n\n processIncoming(data, callback) {\n if (this.decoder && data.type === 'body') {\n // data to parse\n this.push(data);\n if (!this.decoder.write(data.value)) {\n return this.decoder.once('drain', callback);\n } else {\n return callback();\n }\n } else if (this.decoder && data.type !== 'body') {\n // stop decoding.\n // we can not process the current data chunk as we need to wait until\n // the parsed data is completely processed, so we store a reference to the\n // continue callback\n\n let doContinue = () => {\n this.continue = false;\n this.decoder = false;\n this.canContinue = false;\n this.processIncoming(data, callback);\n };\n\n if (this.canContinue) {\n setImmediate(doContinue);\n } else {\n this.continue = () => doContinue();\n }\n\n return this.decoder.end();\n } else if (data.type === 'node' && this.filterFunc(data)) {\n this.push(data);\n // found matching node, create new handler\n this.emit('node', this.createDecoder(data));\n } else if (this.readable && data.type !== 'none') {\n // we don't care about this data, just pass it over to the joiner\n this.push(data);\n }\n callback();\n }\n\n createDecoder(node) {\n this.decoder = node.getDecoder();\n\n let decoder = this.decoder;\n decoder.$reading = false;\n\n if (/^text\\//.test(node.contentType) && node.flowed) {\n let flowDecoder = decoder;\n decoder = new FlowedDecoder({\n delSp: node.delSp\n });\n flowDecoder.on('error', err => {\n decoder.emit('error', err);\n });\n flowDecoder.pipe(decoder);\n }\n\n return {\n node,\n decoder,\n done: () => {\n if (typeof this.continue === 'function') {\n // called once input stream is processed\n this.continue();\n } else {\n // called before input stream is processed\n this.canContinue = true;\n }\n }\n };\n }\n}\n\nmodule.exports = NodeStreamer;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHJzYykvLi9ub2RlX21vZHVsZXMvaW1hcGZsb3cvbm9kZV9tb2R1bGVzL21haWxzcGxpdC9saWIvbm9kZS1zdHJlYW1lci5qcyIsIm1hcHBpbmdzIjoiQUFBYTs7QUFFYjs7QUFFQSxrQkFBa0IsdURBQTJCO0FBQzdDLHNCQUFzQixtQkFBTyxDQUFDLG9HQUFrQjs7QUFFaEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkIsV0FBVyxVQUFVO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTs7QUFFQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBIiwic291cmNlcyI6WyIvaG9tZS9hbG1hL25leHRnZW4vTmVhaC1tYWlsL25vZGVfbW9kdWxlcy9pbWFwZmxvdy9ub2RlX21vZHVsZXMvbWFpbHNwbGl0L2xpYi9ub2RlLXN0cmVhbWVyLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcblxuLy8gSGVscGVyIGNsYXNzIHRvIHJld3JpdGUgbm9kZXMgd2l0aCBzcGVjaWZpYyBtaW1lIHR5cGVcblxuY29uc3QgVHJhbnNmb3JtID0gcmVxdWlyZSgnc3RyZWFtJykuVHJhbnNmb3JtO1xuY29uc3QgRmxvd2VkRGVjb2RlciA9IHJlcXVpcmUoJy4vZmxvd2VkLWRlY29kZXInKTtcblxuLyoqXG4gKiBOb2RlUmV3cml0ZXIgVHJhbnNmb3JtIHN0cmVhbS4gVXBkYXRlcyBjb250ZW50IGZvciBhbGwgbm9kZXMgd2l0aCBzcGVjaWZpZWQgbWltZSB0eXBlXG4gKlxuICogQGNvbnN0cnVjdG9yXG4gKiBAcGFyYW0ge1N0cmluZ30gbWltZVR5cGUgRGVmaW5lIHRoZSBNaW1lLVR5cGUgdG8gbG9vayBmb3JcbiAqIEBwYXJhbSB7RnVuY3Rpb259IHN0cmVhbUFjdGlvbiBGdW5jdGlvbiB0byBydW4gd2l0aCB0aGUgbm9kZSBjb250ZW50XG4gKi9cbmNsYXNzIE5vZGVTdHJlYW1lciBleHRlbmRzIFRyYW5zZm9ybSB7XG4gICAgY29uc3RydWN0b3IoZmlsdGVyRnVuYywgc3RyZWFtQWN0aW9uKSB7XG4gICAgICAgIGxldCBvcHRpb25zID0ge1xuICAgICAgICAgICAgcmVhZGFibGVPYmplY3RNb2RlOiB0cnVlLFxuICAgICAgICAgICAgd3JpdGFibGVPYmplY3RNb2RlOiB0cnVlXG4gICAgICAgIH07XG4gICAgICAgIHN1cGVyKG9wdGlvbnMpO1xuXG4gICAgICAgIHRoaXMuZmlsdGVyRnVuYyA9IGZpbHRlckZ1bmM7XG4gICAgICAgIHRoaXMuc3RyZWFtQWN0aW9uID0gc3RyZWFtQWN0aW9uO1xuXG4gICAgICAgIHRoaXMuZGVjb2RlciA9IGZhbHNlO1xuICAgICAgICB0aGlzLmNhbkNvbnRpbnVlID0gZmFsc2U7XG4gICAgICAgIHRoaXMuY29udGludWUgPSBmYWxzZTtcbiAgICB9XG5cbiAgICBfdHJhbnNmb3JtKGRhdGEsIGVuY29kaW5nLCBjYWxsYmFjaykge1xuICAgICAgICB0aGlzLnByb2Nlc3NJbmNvbWluZyhkYXRhLCBjYWxsYmFjayk7XG4gICAgfVxuXG4gICAgX2ZsdXNoKGNhbGxiYWNrKSB7XG4gICAgICAgIGlmICh0aGlzLmRlY29kZXIpIHtcbiAgICAgICAgICAgIC8vIGVtaXQgYW4gZW1wdHkgbm9kZSBqdXN0IGluIGNhc2UgdGhlcmUgaXMgcGVuZGluZyBkYXRhIHRvIGVuZFxuICAgICAgICAgICAgcmV0dXJuIHRoaXMucHJvY2Vzc0luY29taW5nKFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ25vbmUnXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBjYWxsYmFja1xuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY2FsbGJhY2soKTtcbiAgICB9XG5cbiAgICBwcm9jZXNzSW5jb21pbmcoZGF0YSwgY2FsbGJhY2spIHtcbiAgICAgICAgaWYgKHRoaXMuZGVjb2RlciAmJiBkYXRhLnR5cGUgPT09ICdib2R5Jykge1xuICAgICAgICAgICAgLy8gZGF0YSB0byBwYXJzZVxuICAgICAgICAgICAgdGhpcy5wdXNoKGRhdGEpO1xuICAgICAgICAgICAgaWYgKCF0aGlzLmRlY29kZXIud3JpdGUoZGF0YS52YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5kZWNvZGVyLm9uY2UoJ2RyYWluJywgY2FsbGJhY2spO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY2FsbGJhY2soKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmRlY29kZXIgJiYgZGF0YS50eXBlICE9PSAnYm9keScpIHtcbiAgICAgICAgICAgIC8vIHN0b3AgZGVjb2RpbmcuXG4gICAgICAgICAgICAvLyB3ZSBjYW4gbm90IHByb2Nlc3MgdGhlIGN1cnJlbnQgZGF0YSBjaHVuayBhcyB3ZSBuZWVkIHRvIHdhaXQgdW50aWxcbiAgICAgICAgICAgIC8vIHRoZSBwYXJzZWQgZGF0YSBpcyBjb21wbGV0ZWx5IHByb2Nlc3NlZCwgc28gd2Ugc3RvcmUgYSByZWZlcmVuY2UgdG8gdGhlXG4gICAgICAgICAgICAvLyBjb250aW51ZSBjYWxsYmFja1xuXG4gICAgICAgICAgICBsZXQgZG9Db250aW51ZSA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRpbnVlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgdGhpcy5kZWNvZGVyID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgdGhpcy5jYW5Db250aW51ZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHRoaXMucHJvY2Vzc0luY29taW5nKGRhdGEsIGNhbGxiYWNrKTtcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIGlmICh0aGlzLmNhbkNvbnRpbnVlKSB7XG4gICAgICAgICAgICAgICAgc2V0SW1tZWRpYXRlKGRvQ29udGludWUpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRpbnVlID0gKCkgPT4gZG9Db250aW51ZSgpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5kZWNvZGVyLmVuZCgpO1xuICAgICAgICB9IGVsc2UgaWYgKGRhdGEudHlwZSA9PT0gJ25vZGUnICYmIHRoaXMuZmlsdGVyRnVuYyhkYXRhKSkge1xuICAgICAgICAgICAgdGhpcy5wdXNoKGRhdGEpO1xuICAgICAgICAgICAgLy8gZm91bmQgbWF0Y2hpbmcgbm9kZSwgY3JlYXRlIG5ldyBoYW5kbGVyXG4gICAgICAgICAgICB0aGlzLmVtaXQoJ25vZGUnLCB0aGlzLmNyZWF0ZURlY29kZXIoZGF0YSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMucmVhZGFibGUgJiYgZGF0YS50eXBlICE9PSAnbm9uZScpIHtcbiAgICAgICAgICAgIC8vIHdlIGRvbid0IGNhcmUgYWJvdXQgdGhpcyBkYXRhLCBqdXN0IHBhc3MgaXQgb3ZlciB0byB0aGUgam9pbmVyXG4gICAgICAgICAgICB0aGlzLnB1c2goZGF0YSk7XG4gICAgICAgIH1cbiAgICAgICAgY2FsbGJhY2soKTtcbiAgICB9XG5cbiAgICBjcmVhdGVEZWNvZGVyKG5vZGUpIHtcbiAgICAgICAgdGhpcy5kZWNvZGVyID0gbm9kZS5nZXREZWNvZGVyKCk7XG5cbiAgICAgICAgbGV0IGRlY29kZXIgPSB0aGlzLmRlY29kZXI7XG4gICAgICAgIGRlY29kZXIuJHJlYWRpbmcgPSBmYWxzZTtcblxuICAgICAgICBpZiAoL150ZXh0XFwvLy50ZXN0KG5vZGUuY29udGVudFR5cGUpICYmIG5vZGUuZmxvd2VkKSB7XG4gICAgICAgICAgICBsZXQgZmxvd0RlY29kZXIgPSBkZWNvZGVyO1xuICAgICAgICAgICAgZGVjb2RlciA9IG5ldyBGbG93ZWREZWNvZGVyKHtcbiAgICAgICAgICAgICAgICBkZWxTcDogbm9kZS5kZWxTcFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBmbG93RGVjb2Rlci5vbignZXJyb3InLCBlcnIgPT4ge1xuICAgICAgICAgICAgICAgIGRlY29kZXIuZW1pdCgnZXJyb3InLCBlcnIpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBmbG93RGVjb2Rlci5waXBlKGRlY29kZXIpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG5vZGUsXG4gICAgICAgICAgICBkZWNvZGVyLFxuICAgICAgICAgICAgZG9uZTogKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdGhpcy5jb250aW51ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICAvLyBjYWxsZWQgb25jZSBpbnB1dCBzdHJlYW0gaXMgcHJvY2Vzc2VkXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29udGludWUoKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyBjYWxsZWQgYmVmb3JlIGlucHV0IHN0cmVhbSBpcyBwcm9jZXNzZWRcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jYW5Db250aW51ZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBOb2RlU3RyZWFtZXI7XG4iXSwibmFtZXMiOltdLCJpZ25vcmVMaXN0IjpbMF0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(rsc)/./node_modules/imapflow/node_modules/mailsplit/lib/node-streamer.js\n");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "(rsc)/./node_modules/imapflow/node_modules/nodemailer/lib/smtp-connection/http-proxy-client.js":
|
|
/*!************************************************************************************************!*\
|
|
!*** ./node_modules/imapflow/node_modules/nodemailer/lib/smtp-connection/http-proxy-client.js ***!
|
|
\************************************************************************************************/
|
|
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
|
|
|
|
eval("\n\n/**\n * Minimal HTTP/S proxy client\n */\n\nconst net = __webpack_require__(/*! net */ \"net\");\nconst tls = __webpack_require__(/*! tls */ \"tls\");\nconst urllib = __webpack_require__(/*! url */ \"url\");\n\n/**\n * Establishes proxied connection to destinationPort\n *\n * httpProxyClient(\"http://localhost:3128/\", 80, \"google.com\", function(err, socket){\n * socket.write(\"GET / HTTP/1.0\\r\\n\\r\\n\");\n * });\n *\n * @param {String} proxyUrl proxy configuration, etg \"http://proxy.host:3128/\"\n * @param {Number} destinationPort Port to open in destination host\n * @param {String} destinationHost Destination hostname\n * @param {Function} callback Callback to run with the rocket object once connection is established\n */\nfunction httpProxyClient(proxyUrl, destinationPort, destinationHost, callback) {\n let proxy = urllib.parse(proxyUrl);\n\n // create a socket connection to the proxy server\n let options;\n let connect;\n let socket;\n\n options = {\n host: proxy.hostname,\n port: Number(proxy.port) ? Number(proxy.port) : proxy.protocol === 'https:' ? 443 : 80\n };\n\n if (proxy.protocol === 'https:') {\n // we can use untrusted proxies as long as we verify actual SMTP certificates\n options.rejectUnauthorized = false;\n connect = tls.connect.bind(tls);\n } else {\n connect = net.connect.bind(net);\n }\n\n // Error harness for initial connection. Once connection is established, the responsibility\n // to handle errors is passed to whoever uses this socket\n let finished = false;\n let tempSocketErr = err => {\n if (finished) {\n return;\n }\n finished = true;\n try {\n socket.destroy();\n } catch (E) {\n // ignore\n }\n callback(err);\n };\n\n let timeoutErr = () => {\n let err = new Error('Proxy socket timed out');\n err.code = 'ETIMEDOUT';\n tempSocketErr(err);\n };\n\n socket = connect(options, () => {\n if (finished) {\n return;\n }\n\n let reqHeaders = {\n Host: destinationHost + ':' + destinationPort,\n Connection: 'close'\n };\n if (proxy.auth) {\n reqHeaders['Proxy-Authorization'] = 'Basic ' + Buffer.from(proxy.auth).toString('base64');\n }\n\n socket.write(\n // HTTP method\n 'CONNECT ' +\n destinationHost +\n ':' +\n destinationPort +\n ' HTTP/1.1\\r\\n' +\n // HTTP request headers\n Object.keys(reqHeaders)\n .map(key => key + ': ' + reqHeaders[key])\n .join('\\r\\n') +\n // End request\n '\\r\\n\\r\\n'\n );\n\n let headers = '';\n let onSocketData = chunk => {\n let match;\n let remainder;\n\n if (finished) {\n return;\n }\n\n headers += chunk.toString('binary');\n if ((match = headers.match(/\\r\\n\\r\\n/))) {\n socket.removeListener('data', onSocketData);\n\n remainder = headers.substr(match.index + match[0].length);\n headers = headers.substr(0, match.index);\n if (remainder) {\n socket.unshift(Buffer.from(remainder, 'binary'));\n }\n\n // proxy connection is now established\n finished = true;\n\n // check response code\n match = headers.match(/^HTTP\\/\\d+\\.\\d+ (\\d+)/i);\n if (!match || (match[1] || '').charAt(0) !== '2') {\n try {\n socket.destroy();\n } catch (E) {\n // ignore\n }\n return callback(new Error('Invalid response from proxy' + ((match && ': ' + match[1]) || '')));\n }\n\n socket.removeListener('error', tempSocketErr);\n socket.removeListener('timeout', timeoutErr);\n socket.setTimeout(0);\n\n return callback(null, socket);\n }\n };\n socket.on('data', onSocketData);\n });\n\n socket.setTimeout(httpProxyClient.timeout || 30 * 1000);\n socket.on('timeout', timeoutErr);\n\n socket.once('error', tempSocketErr);\n}\n\nmodule.exports = httpProxyClient;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHJzYykvLi9ub2RlX21vZHVsZXMvaW1hcGZsb3cvbm9kZV9tb2R1bGVzL25vZGVtYWlsZXIvbGliL3NtdHAtY29ubmVjdGlvbi9odHRwLXByb3h5LWNsaWVudC5qcyIsIm1hcHBpbmdzIjoiQUFBYTs7QUFFYjtBQUNBO0FBQ0E7O0FBRUEsWUFBWSxtQkFBTyxDQUFDLGdCQUFLO0FBQ3pCLFlBQVksbUJBQU8sQ0FBQyxnQkFBSztBQUN6QixlQUFlLG1CQUFPLENBQUMsZ0JBQUs7O0FBRTVCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQSxXQUFXLFFBQVE7QUFDbkIsV0FBVyxRQUFRO0FBQ25CLFdBQVcsUUFBUTtBQUNuQixXQUFXLFVBQVU7QUFDckI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0I7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBOztBQUVBO0FBQ0E7O0FBRUEiLCJzb3VyY2VzIjpbIi9ob21lL2FsbWEvbmV4dGdlbi9OZWFoLW1haWwvbm9kZV9tb2R1bGVzL2ltYXBmbG93L25vZGVfbW9kdWxlcy9ub2RlbWFpbGVyL2xpYi9zbXRwLWNvbm5lY3Rpb24vaHR0cC1wcm94eS1jbGllbnQuanMiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIE1pbmltYWwgSFRUUC9TIHByb3h5IGNsaWVudFxuICovXG5cbmNvbnN0IG5ldCA9IHJlcXVpcmUoJ25ldCcpO1xuY29uc3QgdGxzID0gcmVxdWlyZSgndGxzJyk7XG5jb25zdCB1cmxsaWIgPSByZXF1aXJlKCd1cmwnKTtcblxuLyoqXG4gKiBFc3RhYmxpc2hlcyBwcm94aWVkIGNvbm5lY3Rpb24gdG8gZGVzdGluYXRpb25Qb3J0XG4gKlxuICogaHR0cFByb3h5Q2xpZW50KFwiaHR0cDovL2xvY2FsaG9zdDozMTI4L1wiLCA4MCwgXCJnb29nbGUuY29tXCIsIGZ1bmN0aW9uKGVyciwgc29ja2V0KXtcbiAqICAgICBzb2NrZXQud3JpdGUoXCJHRVQgLyBIVFRQLzEuMFxcclxcblxcclxcblwiKTtcbiAqIH0pO1xuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBwcm94eVVybCBwcm94eSBjb25maWd1cmF0aW9uLCBldGcgXCJodHRwOi8vcHJveHkuaG9zdDozMTI4L1wiXG4gKiBAcGFyYW0ge051bWJlcn0gZGVzdGluYXRpb25Qb3J0IFBvcnQgdG8gb3BlbiBpbiBkZXN0aW5hdGlvbiBob3N0XG4gKiBAcGFyYW0ge1N0cmluZ30gZGVzdGluYXRpb25Ib3N0IERlc3RpbmF0aW9uIGhvc3RuYW1lXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBDYWxsYmFjayB0byBydW4gd2l0aCB0aGUgcm9ja2V0IG9iamVjdCBvbmNlIGNvbm5lY3Rpb24gaXMgZXN0YWJsaXNoZWRcbiAqL1xuZnVuY3Rpb24gaHR0cFByb3h5Q2xpZW50KHByb3h5VXJsLCBkZXN0aW5hdGlvblBvcnQsIGRlc3RpbmF0aW9uSG9zdCwgY2FsbGJhY2spIHtcbiAgICBsZXQgcHJveHkgPSB1cmxsaWIucGFyc2UocHJveHlVcmwpO1xuXG4gICAgLy8gY3JlYXRlIGEgc29ja2V0IGNvbm5lY3Rpb24gdG8gdGhlIHByb3h5IHNlcnZlclxuICAgIGxldCBvcHRpb25zO1xuICAgIGxldCBjb25uZWN0O1xuICAgIGxldCBzb2NrZXQ7XG5cbiAgICBvcHRpb25zID0ge1xuICAgICAgICBob3N0OiBwcm94eS5ob3N0bmFtZSxcbiAgICAgICAgcG9ydDogTnVtYmVyKHByb3h5LnBvcnQpID8gTnVtYmVyKHByb3h5LnBvcnQpIDogcHJveHkucHJvdG9jb2wgPT09ICdodHRwczonID8gNDQzIDogODBcbiAgICB9O1xuXG4gICAgaWYgKHByb3h5LnByb3RvY29sID09PSAnaHR0cHM6Jykge1xuICAgICAgICAvLyB3ZSBjYW4gdXNlIHVudHJ1c3RlZCBwcm94aWVzIGFzIGxvbmcgYXMgd2UgdmVyaWZ5IGFjdHVhbCBTTVRQIGNlcnRpZmljYXRlc1xuICAgICAgICBvcHRpb25zLnJlamVjdFVuYXV0aG9yaXplZCA9IGZhbHNlO1xuICAgICAgICBjb25uZWN0ID0gdGxzLmNvbm5lY3QuYmluZCh0bHMpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbm5lY3QgPSBuZXQuY29ubmVjdC5iaW5kKG5ldCk7XG4gICAgfVxuXG4gICAgLy8gRXJyb3IgaGFybmVzcyBmb3IgaW5pdGlhbCBjb25uZWN0aW9uLiBPbmNlIGNvbm5lY3Rpb24gaXMgZXN0YWJsaXNoZWQsIHRoZSByZXNwb25zaWJpbGl0eVxuICAgIC8vIHRvIGhhbmRsZSBlcnJvcnMgaXMgcGFzc2VkIHRvIHdob2V2ZXIgdXNlcyB0aGlzIHNvY2tldFxuICAgIGxldCBmaW5pc2hlZCA9IGZhbHNlO1xuICAgIGxldCB0ZW1wU29ja2V0RXJyID0gZXJyID0+IHtcbiAgICAgICAgaWYgKGZpbmlzaGVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgZmluaXNoZWQgPSB0cnVlO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgc29ja2V0LmRlc3Ryb3koKTtcbiAgICAgICAgfSBjYXRjaCAoRSkge1xuICAgICAgICAgICAgLy8gaWdub3JlXG4gICAgICAgIH1cbiAgICAgICAgY2FsbGJhY2soZXJyKTtcbiAgICB9O1xuXG4gICAgbGV0IHRpbWVvdXRFcnIgPSAoKSA9PiB7XG4gICAgICAgIGxldCBlcnIgPSBuZXcgRXJyb3IoJ1Byb3h5IHNvY2tldCB0aW1lZCBvdXQnKTtcbiAgICAgICAgZXJyLmNvZGUgPSAnRVRJTUVET1VUJztcbiAgICAgICAgdGVtcFNvY2tldEVycihlcnIpO1xuICAgIH07XG5cbiAgICBzb2NrZXQgPSBjb25uZWN0KG9wdGlvbnMsICgpID0+IHtcbiAgICAgICAgaWYgKGZpbmlzaGVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgcmVxSGVhZGVycyA9IHtcbiAgICAgICAgICAgIEhvc3Q6IGRlc3RpbmF0aW9uSG9zdCArICc6JyArIGRlc3RpbmF0aW9uUG9ydCxcbiAgICAgICAgICAgIENvbm5lY3Rpb246ICdjbG9zZSdcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKHByb3h5LmF1dGgpIHtcbiAgICAgICAgICAgIHJlcUhlYWRlcnNbJ1Byb3h5LUF1dGhvcml6YXRpb24nXSA9ICdCYXNpYyAnICsgQnVmZmVyLmZyb20ocHJveHkuYXV0aCkudG9TdHJpbmcoJ2Jhc2U2NCcpO1xuICAgICAgICB9XG5cbiAgICAgICAgc29ja2V0LndyaXRlKFxuICAgICAgICAgICAgLy8gSFRUUCBtZXRob2RcbiAgICAgICAgICAgICdDT05ORUNUICcgK1xuICAgICAgICAgICAgICAgIGRlc3RpbmF0aW9uSG9zdCArXG4gICAgICAgICAgICAgICAgJzonICtcbiAgICAgICAgICAgICAgICBkZXN0aW5hdGlvblBvcnQgK1xuICAgICAgICAgICAgICAgICcgSFRUUC8xLjFcXHJcXG4nICtcbiAgICAgICAgICAgICAgICAvLyBIVFRQIHJlcXVlc3QgaGVhZGVyc1xuICAgICAgICAgICAgICAgIE9iamVjdC5rZXlzKHJlcUhlYWRlcnMpXG4gICAgICAgICAgICAgICAgICAgIC5tYXAoa2V5ID0+IGtleSArICc6ICcgKyByZXFIZWFkZXJzW2tleV0pXG4gICAgICAgICAgICAgICAgICAgIC5qb2luKCdcXHJcXG4nKSArXG4gICAgICAgICAgICAgICAgLy8gRW5kIHJlcXVlc3RcbiAgICAgICAgICAgICAgICAnXFxyXFxuXFxyXFxuJ1xuICAgICAgICApO1xuXG4gICAgICAgIGxldCBoZWFkZXJzID0gJyc7XG4gICAgICAgIGxldCBvblNvY2tldERhdGEgPSBjaHVuayA9PiB7XG4gICAgICAgICAgICBsZXQgbWF0Y2g7XG4gICAgICAgICAgICBsZXQgcmVtYWluZGVyO1xuXG4gICAgICAgICAgICBpZiAoZmluaXNoZWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGhlYWRlcnMgKz0gY2h1bmsudG9TdHJpbmcoJ2JpbmFyeScpO1xuICAgICAgICAgICAgaWYgKChtYXRjaCA9IGhlYWRlcnMubWF0Y2goL1xcclxcblxcclxcbi8pKSkge1xuICAgICAgICAgICAgICAgIHNvY2tldC5yZW1vdmVMaXN0ZW5lcignZGF0YScsIG9uU29ja2V0RGF0YSk7XG5cbiAgICAgICAgICAgICAgICByZW1haW5kZXIgPSBoZWFkZXJzLnN1YnN0cihtYXRjaC5pbmRleCArIG1hdGNoWzBdLmxlbmd0aCk7XG4gICAgICAgICAgICAgICAgaGVhZGVycyA9IGhlYWRlcnMuc3Vic3RyKDAsIG1hdGNoLmluZGV4KTtcbiAgICAgICAgICAgICAgICBpZiAocmVtYWluZGVyKSB7XG4gICAgICAgICAgICAgICAgICAgIHNvY2tldC51bnNoaWZ0KEJ1ZmZlci5mcm9tKHJlbWFpbmRlciwgJ2JpbmFyeScpKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBwcm94eSBjb25uZWN0aW9uIGlzIG5vdyBlc3RhYmxpc2hlZFxuICAgICAgICAgICAgICAgIGZpbmlzaGVkID0gdHJ1ZTtcblxuICAgICAgICAgICAgICAgIC8vIGNoZWNrIHJlc3BvbnNlIGNvZGVcbiAgICAgICAgICAgICAgICBtYXRjaCA9IGhlYWRlcnMubWF0Y2goL15IVFRQXFwvXFxkK1xcLlxcZCsgKFxcZCspL2kpO1xuICAgICAgICAgICAgICAgIGlmICghbWF0Y2ggfHwgKG1hdGNoWzFdIHx8ICcnKS5jaGFyQXQoMCkgIT09ICcyJykge1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgc29ja2V0LmRlc3Ryb3koKTtcbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoRSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKG5ldyBFcnJvcignSW52YWxpZCByZXNwb25zZSBmcm9tIHByb3h5JyArICgobWF0Y2ggJiYgJzogJyArIG1hdGNoWzFdKSB8fCAnJykpKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBzb2NrZXQucmVtb3ZlTGlzdGVuZXIoJ2Vycm9yJywgdGVtcFNvY2tldEVycik7XG4gICAgICAgICAgICAgICAgc29ja2V0LnJlbW92ZUxpc3RlbmVyKCd0aW1lb3V0JywgdGltZW91dEVycik7XG4gICAgICAgICAgICAgICAgc29ja2V0LnNldFRpbWVvdXQoMCk7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gY2FsbGJhY2sobnVsbCwgc29ja2V0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgc29ja2V0Lm9uKCdkYXRhJywgb25Tb2NrZXREYXRhKTtcbiAgICB9KTtcblxuICAgIHNvY2tldC5zZXRUaW1lb3V0KGh0dHBQcm94eUNsaWVudC50aW1lb3V0IHx8IDMwICogMTAwMCk7XG4gICAgc29ja2V0Lm9uKCd0aW1lb3V0JywgdGltZW91dEVycik7XG5cbiAgICBzb2NrZXQub25jZSgnZXJyb3InLCB0ZW1wU29ja2V0RXJyKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBodHRwUHJveHlDbGllbnQ7XG4iXSwibmFtZXMiOltdLCJpZ25vcmVMaXN0IjpbMF0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(rsc)/./node_modules/imapflow/node_modules/nodemailer/lib/smtp-connection/http-proxy-client.js\n");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "(rsc)/./node_modules/imapflow/package.json":
|
|
/*!********************************************!*\
|
|
!*** ./node_modules/imapflow/package.json ***!
|
|
\********************************************/
|
|
/***/ ((module) => {
|
|
|
|
module.exports = /*#__PURE__*/JSON.parse('{"name":"imapflow","version":"1.0.184","description":"IMAP Client for Node","main":"./lib/imap-flow.js","scripts":{"test":"grunt","prepare":"npm run build","docs":"rm -rf docs && mkdir -p docs && jsdoc lib/imap-flow.js -c jsdoc.json -R README.md --destination docs/ && cp assets/favicon.ico docs","dst":"node types.js","build":"npm run docs && npm run dst","st":"npm run docs && st -d docs -i index.html","update":"rm -rf node_modules package-lock.json && ncu -u && npm install"},"repository":{"type":"git","url":"git+https://github.com/postalsys/imapflow.git"},"keywords":["imap","email","mail"],"author":"Postal Systems OÜ","license":"MIT","bugs":{"url":"https://github.com/postalsys/imapflow/issues"},"homepage":"https://imapflow.com/","devDependencies":{"@babel/eslint-parser":"7.26.8","@babel/eslint-plugin":"7.25.9","@babel/plugin-syntax-class-properties":"7.12.13","@babel/preset-env":"7.26.9","@types/node":"22.13.10","eslint":"8.57.0","eslint-config-nodemailer":"1.2.0","eslint-config-prettier":"9.1.0","grunt":"1.6.1","grunt-cli":"1.5.0","grunt-contrib-nodeunit":"5.0.0","grunt-eslint":"24.3.0","imapflow-jsdoc-template":"3.4.0-imapflow.2","jsdoc":"3.6.11","st":"3.0.1","tsd-jsdoc":"2.5.0"},"dependencies":{"encoding-japanese":"2.2.0","iconv-lite":"0.6.3","libbase64":"1.3.0","libmime":"5.3.6","libqp":"2.1.1","mailsplit":"5.4.3","nodemailer":"6.10.0","pino":"9.6.0","socks":"2.8.4"}}');
|
|
|
|
/***/ })
|
|
|
|
};
|
|
; |