Files
education/frontend/node_modules/.cache/babel-loader/c975932f97506e25c59916792dc7df4e.json
T

1 line
38 KiB
JSON

{"remainingRequest":"C:\\Users\\Admin\\Desktop\\education\\frontend\\node_modules\\thread-loader\\dist\\cjs.js!C:\\Users\\Admin\\Desktop\\education\\frontend\\node_modules\\babel-loader\\lib\\index.js!C:\\Users\\Admin\\Desktop\\education\\frontend\\node_modules\\quill\\modules\\keyboard.js","dependencies":[{"path":"C:\\Users\\Admin\\Desktop\\education\\frontend\\node_modules\\quill\\modules\\keyboard.js","mtime":1787309795305},{"path":"C:\\Users\\Admin\\Desktop\\education\\frontend\\babel.config.js","mtime":1787567871334},{"path":"C:\\Users\\Admin\\Desktop\\education\\frontend\\node_modules\\cache-loader\\dist\\cjs.js","mtime":1787309791955},{"path":"C:\\Users\\Admin\\Desktop\\education\\frontend\\node_modules\\thread-loader\\dist\\cjs.js","mtime":1787309791954},{"path":"C:\\Users\\Admin\\Desktop\\education\\frontend\\node_modules\\babel-loader\\lib\\index.js","mtime":1787309793142}],"contextDependencies":[],"result":[{"type":"Buffer","data":"base64:aW1wb3J0IF9kZWZpbmVQcm9wZXJ0eSBmcm9tICJDOi9Vc2Vycy9BZG1pbi9EZXNrdG9wL2VkdWNhdGlvbi9mcm9udGVuZC9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZGVmaW5lUHJvcGVydHkuanMiOwppbXBvcnQgX3R5cGVvZiBmcm9tICJDOi9Vc2Vycy9BZG1pbi9EZXNrdG9wL2VkdWNhdGlvbi9mcm9udGVuZC9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vdHlwZW9mLmpzIjsKaW1wb3J0IF9zbGljZWRUb0FycmF5IGZyb20gIkM6L1VzZXJzL0FkbWluL0Rlc2t0b3AvZWR1Y2F0aW9uL2Zyb250ZW5kL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9zbGljZWRUb0FycmF5LmpzIjsKaW1wb3J0IF9vYmplY3RTcHJlYWQgZnJvbSAiQzovVXNlcnMvQWRtaW4vRGVza3RvcC9lZHVjYXRpb24vZnJvbnRlbmQvbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFNwcmVhZDIuanMiOwppbXBvcnQgX2NsYXNzQ2FsbENoZWNrIGZyb20gIkM6L1VzZXJzL0FkbWluL0Rlc2t0b3AvZWR1Y2F0aW9uL2Zyb250ZW5kL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9jbGFzc0NhbGxDaGVjay5qcyI7CmltcG9ydCBfY3JlYXRlQ2xhc3MgZnJvbSAiQzovVXNlcnMvQWRtaW4vRGVza3RvcC9lZHVjYXRpb24vZnJvbnRlbmQvbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2NyZWF0ZUNsYXNzLmpzIjsKaW1wb3J0IF9jYWxsU3VwZXIgZnJvbSAiQzovVXNlcnMvQWRtaW4vRGVza3RvcC9lZHVjYXRpb24vZnJvbnRlbmQvbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2NhbGxTdXBlci5qcyI7CmltcG9ydCBfaW5oZXJpdHMgZnJvbSAiQzovVXNlcnMvQWRtaW4vRGVza3RvcC9lZHVjYXRpb24vZnJvbnRlbmQvbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2luaGVyaXRzLmpzIjsKaW1wb3J0ICJjb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkuY29uY2F0LmpzIjsKaW1wb3J0ICJjb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkuZmlsdGVyLmpzIjsKaW1wb3J0ICJjb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkuZmluZC5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5LnB1c2guanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5yZWR1Y2UuanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5zbGljZS5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL2VzLm9iamVjdC5rZXlzLmpzIjsKaW1wb3J0ICJjb3JlLWpzL21vZHVsZXMvZXMub2JqZWN0LnRvLXN0cmluZy5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL2VzLnJlZ2V4cC5leGVjLmpzIjsKaW1wb3J0ICJjb3JlLWpzL21vZHVsZXMvZXMucmVnZXhwLnRlc3QuanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5zdHJpbmcubWF0Y2guanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5zdHJpbmcuc3RhcnRzLXdpdGguanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5zdHJpbmcudHJpbS5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5pdGVyYXRvci5jb25zdHJ1Y3Rvci5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5pdGVyYXRvci5ldmVyeS5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5pdGVyYXRvci5maWx0ZXIuanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lc25leHQuaXRlcmF0b3IuZmluZC5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5pdGVyYXRvci5mb3ItZWFjaC5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5pdGVyYXRvci5yZWR1Y2UuanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lc25leHQuaXRlcmF0b3Iuc29tZS5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL3dlYi5kb20tY29sbGVjdGlvbnMuZm9yLWVhY2guanMiOwppbXBvcnQgeyBjbG9uZURlZXAsIGlzRXF1YWwgfSBmcm9tICdsb2Rhc2gtZXMnOwppbXBvcnQgRGVsdGEsIHsgQXR0cmlidXRlTWFwIH0gZnJvbSAncXVpbGwtZGVsdGEnOwppbXBvcnQgeyBFbWJlZEJsb3QsIFNjb3BlLCBUZXh0QmxvdCB9IGZyb20gJ3BhcmNobWVudCc7CmltcG9ydCBRdWlsbCBmcm9tICcuLi9jb3JlL3F1aWxsLmpzJzsKaW1wb3J0IGxvZ2dlciBmcm9tICcuLi9jb3JlL2xvZ2dlci5qcyc7CmltcG9ydCBNb2R1bGUgZnJvbSAnLi4vY29yZS9tb2R1bGUuanMnOwp2YXIgZGVidWcgPSBsb2dnZXIoJ3F1aWxsOmtleWJvYXJkJyk7CnZhciBTSE9SVEtFWSA9IC9NYWMvaS50ZXN0KG5hdmlnYXRvci5wbGF0Zm9ybSkgPyAnbWV0YUtleScgOiAnY3RybEtleSc7CnZhciBLZXlib2FyZCA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX01vZHVsZSkgewogIGZ1bmN0aW9uIEtleWJvYXJkKHF1aWxsLCBvcHRpb25zKSB7CiAgICB2YXIgX3RoaXM7CiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgS2V5Ym9hcmQpOwogICAgX3RoaXMgPSBfY2FsbFN1cGVyKHRoaXMsIEtleWJvYXJkLCBbcXVpbGwsIG9wdGlvbnNdKTsKICAgIF90aGlzLmJpbmRpbmdzID0ge307CiAgICAvLyBAdHMtZXhwZWN0LWVycm9yIEZpeCBtZSBsYXRlcgogICAgT2JqZWN0LmtleXMoX3RoaXMub3B0aW9ucy5iaW5kaW5ncykuZm9yRWFjaChmdW5jdGlvbiAobmFtZSkgewogICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIEZpeCBtZSBsYXRlcgogICAgICBpZiAoX3RoaXMub3B0aW9ucy5iaW5kaW5nc1tuYW1lXSkgewogICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgRml4IG1lIGxhdGVyCiAgICAgICAgX3RoaXMuYWRkQmluZGluZyhfdGhpcy5vcHRpb25zLmJpbmRpbmdzW25hbWVdKTsKICAgICAgfQogICAgfSk7CiAgICBfdGhpcy5hZGRCaW5kaW5nKHsKICAgICAga2V5OiAnRW50ZXInLAogICAgICBzaGlmdEtleTogbnVsbAogICAgfSwgX3RoaXMuaGFuZGxlRW50ZXIpOwogICAgX3RoaXMuYWRkQmluZGluZyh7CiAgICAgIGtleTogJ0VudGVyJywKICAgICAgbWV0YUtleTogbnVsbCwKICAgICAgY3RybEtleTogbnVsbCwKICAgICAgYWx0S2V5OiBudWxsCiAgICB9LCBmdW5jdGlvbiAoKSB7fSk7CiAgICBpZiAoL0ZpcmVmb3gvaS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpKSB7CiAgICAgIC8vIE5lZWQgdG8gaGFuZGxlIGRlbGV0ZSBhbmQgYmFja3NwYWNlIGZvciBGaXJlZm94IGluIHRoZSBnZW5lcmFsIGNhc2UgIzExNzEKICAgICAgX3RoaXMuYWRkQmluZGluZyh7CiAgICAgICAga2V5OiAnQmFja3NwYWNlJwogICAgICB9LCB7CiAgICAgICAgY29sbGFwc2VkOiB0cnVlCiAgICAgIH0sIF90aGlzLmhhbmRsZUJhY2tzcGFjZSk7CiAgICAgIF90aGlzLmFkZEJpbmRpbmcoewogICAgICAgIGtleTogJ0RlbGV0ZScKICAgICAgfSwgewogICAgICAgIGNvbGxhcHNlZDogdHJ1ZQogICAgICB9LCBfdGhpcy5oYW5kbGVEZWxldGUpOwogICAgfSBlbHNlIHsKICAgICAgX3RoaXMuYWRkQmluZGluZyh7CiAgICAgICAga2V5OiAnQmFja3NwYWNlJwogICAgICB9LCB7CiAgICAgICAgY29sbGFwc2VkOiB0cnVlLAogICAgICAgIHByZWZpeDogL14uPyQvCiAgICAgIH0sIF90aGlzLmhhbmRsZUJhY2tzcGFjZSk7CiAgICAgIF90aGlzLmFkZEJpbmRpbmcoewogICAgICAgIGtleTogJ0RlbGV0ZScKICAgICAgfSwgewogICAgICAgIGNvbGxhcHNlZDogdHJ1ZSwKICAgICAgICBzdWZmaXg6IC9eLj8kLwogICAgICB9LCBfdGhpcy5oYW5kbGVEZWxldGUpOwogICAgfQogICAgX3RoaXMuYWRkQmluZGluZyh7CiAgICAgIGtleTogJ0JhY2tzcGFjZScKICAgIH0sIHsKICAgICAgY29sbGFwc2VkOiBmYWxzZQogICAgfSwgX3RoaXMuaGFuZGxlRGVsZXRlUmFuZ2UpOwogICAgX3RoaXMuYWRkQmluZGluZyh7CiAgICAgIGtleTogJ0RlbGV0ZScKICAgIH0sIHsKICAgICAgY29sbGFwc2VkOiBmYWxzZQogICAgfSwgX3RoaXMuaGFuZGxlRGVsZXRlUmFuZ2UpOwogICAgX3RoaXMuYWRkQmluZGluZyh7CiAgICAgIGtleTogJ0JhY2tzcGFjZScsCiAgICAgIGFsdEtleTogbnVsbCwKICAgICAgY3RybEtleTogbnVsbCwKICAgICAgbWV0YUtleTogbnVsbCwKICAgICAgc2hpZnRLZXk6IG51bGwKICAgIH0sIHsKICAgICAgY29sbGFwc2VkOiB0cnVlLAogICAgICBvZmZzZXQ6IDAKICAgIH0sIF90aGlzLmhhbmRsZUJhY2tzcGFjZSk7CiAgICBfdGhpcy5saXN0ZW4oKTsKICAgIHJldHVybiBfdGhpczsKICB9CiAgX2luaGVyaXRzKEtleWJvYXJkLCBfTW9kdWxlKTsKICByZXR1cm4gX2NyZWF0ZUNsYXNzKEtleWJvYXJkLCBbewogICAga2V5OiAiYWRkQmluZGluZyIsCiAgICB2YWx1ZTogZnVuY3Rpb24gYWRkQmluZGluZyhrZXlCaW5kaW5nKSB7CiAgICAgIHZhciBfdGhpczIgPSB0aGlzOwogICAgICB2YXIgY29udGV4dCA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDoge307CiAgICAgIHZhciBoYW5kbGVyID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiB7fTsKICAgICAgdmFyIGJpbmRpbmcgPSBub3JtYWxpemUoa2V5QmluZGluZyk7CiAgICAgIGlmIChiaW5kaW5nID09IG51bGwpIHsKICAgICAgICBkZWJ1Zy53YXJuKCdBdHRlbXB0ZWQgdG8gYWRkIGludmFsaWQga2V5Ym9hcmQgYmluZGluZycsIGJpbmRpbmcpOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBpZiAodHlwZW9mIGNvbnRleHQgPT09ICdmdW5jdGlvbicpIHsKICAgICAgICBjb250ZXh0ID0gewogICAgICAgICAgaGFuZGxlcjogY29udGV4dAogICAgICAgIH07CiAgICAgIH0KICAgICAgaWYgKHR5cGVvZiBoYW5kbGVyID09PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgaGFuZGxlciA9IHsKICAgICAgICAgIGhhbmRsZXI6IGhhbmRsZXIKICAgICAgICB9OwogICAgICB9CiAgICAgIHZhciBrZXlzID0gQXJyYXkuaXNBcnJheShiaW5kaW5nLmtleSkgPyBiaW5kaW5nLmtleSA6IFtiaW5kaW5nLmtleV07CiAgICAgIGtleXMuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7CiAgICAgICAgdmFyIHNpbmdsZUJpbmRpbmcgPSBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgYmluZGluZyksIHt9LCB7CiAgICAgICAgICBrZXk6IGtleQogICAgICAgIH0sIGNvbnRleHQpLCBoYW5kbGVyKTsKICAgICAgICBfdGhpczIuYmluZGluZ3Nbc2luZ2xlQmluZGluZy5rZXldID0gX3RoaXMyLmJpbmRpbmdzW3NpbmdsZUJpbmRpbmcua2V5XSB8fCBbXTsKICAgICAgICBfdGhpczIuYmluZGluZ3Nbc2luZ2xlQmluZGluZy5rZXldLnB1c2goc2luZ2xlQmluZGluZyk7CiAgICAgIH0pOwogICAgfQogIH0sIHsKICAgIGtleTogImxpc3RlbiIsCiAgICB2YWx1ZTogZnVuY3Rpb24gbGlzdGVuKCkgewogICAgICB2YXIgX3RoaXMzID0gdGhpczsKICAgICAgdGhpcy5xdWlsbC5yb290LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCBmdW5jdGlvbiAoZXZ0KSB7CiAgICAgICAgaWYgKGV2dC5kZWZhdWx0UHJldmVudGVkIHx8IGV2dC5pc0NvbXBvc2luZykgcmV0dXJuOwoKICAgICAgICAvLyBldnQuaXNDb21wb3NpbmcgaXMgZmFsc2Ugd2hlbiBwcmVzc2luZyBFbnRlci9CYWNrc3BhY2Ugd2hlbiBjb21wb3NpbmcgaW4gU2FmYXJpCiAgICAgICAgLy8gaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTE2NTAwNAogICAgICAgIHZhciBpc0NvbXBvc2luZyA9IGV2dC5rZXlDb2RlID09PSAyMjkgJiYgKGV2dC5rZXkgPT09ICdFbnRlcicgfHwgZXZ0LmtleSA9PT0gJ0JhY2tzcGFjZScpOwogICAgICAgIGlmIChpc0NvbXBvc2luZykgcmV0dXJuOwogICAgICAgIHZhciBiaW5kaW5ncyA9IChfdGhpczMuYmluZGluZ3NbZXZ0LmtleV0gfHwgW10pLmNvbmNhdChfdGhpczMuYmluZGluZ3NbZXZ0LndoaWNoXSB8fCBbXSk7CiAgICAgICAgdmFyIG1hdGNoZXMgPSBiaW5kaW5ncy5maWx0ZXIoZnVuY3Rpb24gKGJpbmRpbmcpIHsKICAgICAgICAgIHJldHVybiBLZXlib2FyZC5tYXRjaChldnQsIGJpbmRpbmcpOwogICAgICAgIH0pOwogICAgICAgIGlmIChtYXRjaGVzLmxlbmd0aCA9PT0gMCkgcmV0dXJuOwogICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IKICAgICAgICB2YXIgYmxvdCA9IFF1aWxsLmZpbmQoZXZ0LnRhcmdldCwgdHJ1ZSk7CiAgICAgICAgaWYgKGJsb3QgJiYgYmxvdC5zY3JvbGwgIT09IF90aGlzMy5xdWlsbC5zY3JvbGwpIHJldHVybjsKICAgICAgICB2YXIgcmFuZ2UgPSBfdGhpczMucXVpbGwuZ2V0U2VsZWN0aW9uKCk7CiAgICAgICAgaWYgKHJhbmdlID09IG51bGwgfHwgIV90aGlzMy5xdWlsbC5oYXNGb2N1cygpKSByZXR1cm47CiAgICAgICAgdmFyIF90aGlzMyRxdWlsbCRnZXRMaW5lID0gX3RoaXMzLnF1aWxsLmdldExpbmUocmFuZ2UuaW5kZXgpLAogICAgICAgICAgX3RoaXMzJHF1aWxsJGdldExpbmUyID0gX3NsaWNlZFRvQXJyYXkoX3RoaXMzJHF1aWxsJGdldExpbmUsIDIpLAogICAgICAgICAgbGluZSA9IF90aGlzMyRxdWlsbCRnZXRMaW5lMlswXSwKICAgICAgICAgIG9mZnNldCA9IF90aGlzMyRxdWlsbCRnZXRMaW5lMlsxXTsKICAgICAgICB2YXIgX3RoaXMzJHF1aWxsJGdldExlYWYgPSBfdGhpczMucXVpbGwuZ2V0TGVhZihyYW5nZS5pbmRleCksCiAgICAgICAgICBfdGhpczMkcXVpbGwkZ2V0TGVhZjIgPSBfc2xpY2VkVG9BcnJheShfdGhpczMkcXVpbGwkZ2V0TGVhZiwgMiksCiAgICAgICAgICBsZWFmU3RhcnQgPSBfdGhpczMkcXVpbGwkZ2V0TGVhZjJbMF0sCiAgICAgICAgICBvZmZzZXRTdGFydCA9IF90aGlzMyRxdWlsbCRnZXRMZWFmMlsxXTsKICAgICAgICB2YXIgX3JlZjMgPSByYW5nZS5sZW5ndGggPT09IDAgPyBbbGVhZlN0YXJ0LCBvZmZzZXRTdGFydF0gOiBfdGhpczMucXVpbGwuZ2V0TGVhZihyYW5nZS5pbmRleCArIHJhbmdlLmxlbmd0aCksCiAgICAgICAgICBfcmVmNCA9IF9zbGljZWRUb0FycmF5KF9yZWYzLCAyKSwKICAgICAgICAgIGxlYWZFbmQgPSBfcmVmNFswXSwKICAgICAgICAgIG9mZnNldEVuZCA9IF9yZWY0WzFdOwogICAgICAgIHZhciBwcmVmaXhUZXh0ID0gbGVhZlN0YXJ0IGluc3RhbmNlb2YgVGV4dEJsb3QgPyBsZWFmU3RhcnQudmFsdWUoKS5zbGljZSgwLCBvZmZzZXRTdGFydCkgOiAnJzsKICAgICAgICB2YXIgc3VmZml4VGV4dCA9IGxlYWZFbmQgaW5zdGFuY2VvZiBUZXh0QmxvdCA/IGxlYWZFbmQudmFsdWUoKS5zbGljZShvZmZzZXRFbmQpIDogJyc7CiAgICAgICAgdmFyIGN1ckNvbnRleHQgPSB7CiAgICAgICAgICBjb2xsYXBzZWQ6IHJhbmdlLmxlbmd0aCA9PT0gMCwKICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgRml4IG1lIGxhdGVyCiAgICAgICAgICBlbXB0eTogcmFuZ2UubGVuZ3RoID09PSAwICYmIGxpbmUubGVuZ3RoKCkgPD0gMSwKICAgICAgICAgIGZvcm1hdDogX3RoaXMzLnF1aWxsLmdldEZvcm1hdChyYW5nZSksCiAgICAgICAgICBsaW5lOiBsaW5lLAogICAgICAgICAgb2Zmc2V0OiBvZmZzZXQsCiAgICAgICAgICBwcmVmaXg6IHByZWZpeFRleHQsCiAgICAgICAgICBzdWZmaXg6IHN1ZmZpeFRleHQsCiAgICAgICAgICBldmVudDogZXZ0CiAgICAgICAgfTsKICAgICAgICB2YXIgcHJldmVudGVkID0gbWF0Y2hlcy5zb21lKGZ1bmN0aW9uIChiaW5kaW5nKSB7CiAgICAgICAgICBpZiAoYmluZGluZy5jb2xsYXBzZWQgIT0gbnVsbCAmJiBiaW5kaW5nLmNvbGxhcHNlZCAhPT0gY3VyQ29udGV4dC5jb2xsYXBzZWQpIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgfQogICAgICAgICAgaWYgKGJpbmRpbmcuZW1wdHkgIT0gbnVsbCAmJiBiaW5kaW5nLmVtcHR5ICE9PSBjdXJDb250ZXh0LmVtcHR5KSB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChiaW5kaW5nLm9mZnNldCAhPSBudWxsICYmIGJpbmRpbmcub2Zmc2V0ICE9PSBjdXJDb250ZXh0Lm9mZnNldCkgewogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShiaW5kaW5nLmZvcm1hdCkpIHsKICAgICAgICAgICAgLy8gYW55IGZvcm1hdCBpcyBwcmVzZW50CiAgICAgICAgICAgIGlmIChiaW5kaW5nLmZvcm1hdC5ldmVyeShmdW5jdGlvbiAobmFtZSkgewogICAgICAgICAgICAgIHJldHVybiBjdXJDb250ZXh0LmZvcm1hdFtuYW1lXSA9PSBudWxsOwogICAgICAgICAgICB9KSkgewogICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgICAgfSBlbHNlIGlmIChfdHlwZW9mKGJpbmRpbmcuZm9ybWF0KSA9PT0gJ29iamVjdCcpIHsKICAgICAgICAgICAgLy8gYWxsIGZvcm1hdHMgbXVzdCBtYXRjaAogICAgICAgICAgICBpZiAoIU9iamVjdC5rZXlzKGJpbmRpbmcuZm9ybWF0KS5ldmVyeShmdW5jdGlvbiAobmFtZSkgewogICAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgRml4IG1lIGxhdGVyCiAgICAgICAgICAgICAgaWYgKGJpbmRpbmcuZm9ybWF0W25hbWVdID09PSB0cnVlKSByZXR1cm4gY3VyQ29udGV4dC5mb3JtYXRbbmFtZV0gIT0gbnVsbDsKICAgICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIEZpeCBtZSBsYXRlcgogICAgICAgICAgICAgIGlmIChiaW5kaW5nLmZvcm1hdFtuYW1lXSA9PT0gZmFsc2UpIHJldHVybiBjdXJDb250ZXh0LmZvcm1hdFtuYW1lXSA9PSBudWxsOwogICAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgRml4IG1lIGxhdGVyCiAgICAgICAgICAgICAgcmV0dXJuIGlzRXF1YWwoYmluZGluZy5mb3JtYXRbbmFtZV0sIGN1ckNvbnRleHQuZm9ybWF0W25hbWVdKTsKICAgICAgICAgICAgfSkpIHsKICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGlmIChiaW5kaW5nLnByZWZpeCAhPSBudWxsICYmICFiaW5kaW5nLnByZWZpeC50ZXN0KGN1ckNvbnRleHQucHJlZml4KSkgewogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoYmluZGluZy5zdWZmaXggIT0gbnVsbCAmJiAhYmluZGluZy5zdWZmaXgudGVzdChjdXJDb250ZXh0LnN1ZmZpeCkpIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgfQogICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBGaXggbWUgbGF0ZXIKICAgICAgICAgIHJldHVybiBiaW5kaW5nLmhhbmRsZXIuY2FsbChfdGhpczMsIHJhbmdlLCBjdXJDb250ZXh0LCBiaW5kaW5nKSAhPT0gdHJ1ZTsKICAgICAgICB9KTsKICAgICAgICBpZiAocHJldmVudGVkKSB7CiAgICAgICAgICBldnQucHJldmVudERlZmF1bHQoKTsKICAgICAgICB9CiAgICAgIH0pOwogICAgfQogIH0sIHsKICAgIGtleTogImhhbmRsZUJhY2tzcGFjZSIsCiAgICB2YWx1ZTogZnVuY3Rpb24gaGFuZGxlQmFja3NwYWNlKHJhbmdlLCBjb250ZXh0KSB7CiAgICAgIC8vIENoZWNrIGZvciBhc3RyYWwgc3ltYm9scwogICAgICB2YXIgbGVuZ3RoID0gL1tcdUQ4MDAtXHVEQkZGXVtcdURDMDAtXHVERkZGXSQvLnRlc3QoY29udGV4dC5wcmVmaXgpID8gMiA6IDE7CiAgICAgIGlmIChyYW5nZS5pbmRleCA9PT0gMCB8fCB0aGlzLnF1aWxsLmdldExlbmd0aCgpIDw9IDEpIHJldHVybjsKICAgICAgdmFyIGZvcm1hdHMgPSB7fTsKICAgICAgdmFyIF90aGlzJHF1aWxsJGdldExpbmUgPSB0aGlzLnF1aWxsLmdldExpbmUocmFuZ2UuaW5kZXgpLAogICAgICAgIF90aGlzJHF1aWxsJGdldExpbmUyID0gX3NsaWNlZFRvQXJyYXkoX3RoaXMkcXVpbGwkZ2V0TGluZSwgMSksCiAgICAgICAgbGluZSA9IF90aGlzJHF1aWxsJGdldExpbmUyWzBdOwogICAgICB2YXIgZGVsdGEgPSBuZXcgRGVsdGEoKS5yZXRhaW4ocmFuZ2UuaW5kZXggLSBsZW5ndGgpLmRlbGV0ZShsZW5ndGgpOwogICAgICBpZiAoY29udGV4dC5vZmZzZXQgPT09IDApIHsKICAgICAgICAvLyBBbHdheXMgZGVsZXRpbmcgbmV3bGluZSBoZXJlLCBsZW5ndGggYWx3YXlzIDEKICAgICAgICB2YXIgX3RoaXMkcXVpbGwkZ2V0TGluZTMgPSB0aGlzLnF1aWxsLmdldExpbmUocmFuZ2UuaW5kZXggLSAxKSwKICAgICAgICAgIF90aGlzJHF1aWxsJGdldExpbmU0ID0gX3NsaWNlZFRvQXJyYXkoX3RoaXMkcXVpbGwkZ2V0TGluZTMsIDEpLAogICAgICAgICAgcHJldiA9IF90aGlzJHF1aWxsJGdldExpbmU0WzBdOwogICAgICAgIGlmIChwcmV2KSB7CiAgICAgICAgICB2YXIgaXNQcmV2TGluZUVtcHR5ID0gcHJldi5zdGF0aWNzLmJsb3ROYW1lID09PSAnYmxvY2snICYmIHByZXYubGVuZ3RoKCkgPD0gMTsKICAgICAgICAgIGlmICghaXNQcmV2TGluZUVtcHR5KSB7CiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgRml4IG1lIGxhdGVyCiAgICAgICAgICAgIHZhciBjdXJGb3JtYXRzID0gbGluZS5mb3JtYXRzKCk7CiAgICAgICAgICAgIHZhciBwcmV2Rm9ybWF0cyA9IHRoaXMucXVpbGwuZ2V0Rm9ybWF0KHJhbmdlLmluZGV4IC0gMSwgMSk7CiAgICAgICAgICAgIGZvcm1hdHMgPSBBdHRyaWJ1dGVNYXAuZGlmZihjdXJGb3JtYXRzLCBwcmV2Rm9ybWF0cykgfHwge307CiAgICAgICAgICAgIGlmIChPYmplY3Qua2V5cyhmb3JtYXRzKS5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgLy8gbGluZS5sZW5ndGgoKSAtIDEgdGFyZ2V0cyBcbiBpbiBsaW5lLCBhbm90aGVyIC0xIGZvciBuZXdsaW5lIGJlaW5nIGRlbGV0ZWQKICAgICAgICAgICAgICB2YXIgZm9ybWF0RGVsdGEgPSBuZXcgRGVsdGEoKQogICAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgRml4IG1lIGxhdGVyCiAgICAgICAgICAgICAgLnJldGFpbihyYW5nZS5pbmRleCArIGxpbmUubGVuZ3RoKCkgLSAyKS5yZXRhaW4oMSwgZm9ybWF0cyk7CiAgICAgICAgICAgICAgZGVsdGEgPSBkZWx0YS5jb21wb3NlKGZvcm1hdERlbHRhKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgICB0aGlzLnF1aWxsLnVwZGF0ZUNvbnRlbnRzKGRlbHRhLCBRdWlsbC5zb3VyY2VzLlVTRVIpOwogICAgICB0aGlzLnF1aWxsLmZvY3VzKCk7CiAgICB9CiAgfSwgewogICAga2V5OiAiaGFuZGxlRGVsZXRlIiwKICAgIHZhbHVlOiBmdW5jdGlvbiBoYW5kbGVEZWxldGUocmFuZ2UsIGNvbnRleHQpIHsKICAgICAgLy8gQ2hlY2sgZm9yIGFzdHJhbCBzeW1ib2xzCiAgICAgIHZhciBsZW5ndGggPSAvXltcdUQ4MDAtXHVEQkZGXVtcdURDMDAtXHVERkZGXS8udGVzdChjb250ZXh0LnN1ZmZpeCkgPyAyIDogMTsKICAgICAgaWYgKHJhbmdlLmluZGV4ID49IHRoaXMucXVpbGwuZ2V0TGVuZ3RoKCkgLSBsZW5ndGgpIHJldHVybjsKICAgICAgdmFyIGZvcm1hdHMgPSB7fTsKICAgICAgdmFyIF90aGlzJHF1aWxsJGdldExpbmU1ID0gdGhpcy5xdWlsbC5nZXRMaW5lKHJhbmdlLmluZGV4KSwKICAgICAgICBfdGhpcyRxdWlsbCRnZXRMaW5lNiA9IF9zbGljZWRUb0FycmF5KF90aGlzJHF1aWxsJGdldExpbmU1LCAxKSwKICAgICAgICBsaW5lID0gX3RoaXMkcXVpbGwkZ2V0TGluZTZbMF07CiAgICAgIHZhciBkZWx0YSA9IG5ldyBEZWx0YSgpLnJldGFpbihyYW5nZS5pbmRleCkuZGVsZXRlKGxlbmd0aCk7CiAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgRml4IG1lIGxhdGVyCiAgICAgIGlmIChjb250ZXh0Lm9mZnNldCA+PSBsaW5lLmxlbmd0aCgpIC0gMSkgewogICAgICAgIHZhciBfdGhpcyRxdWlsbCRnZXRMaW5lNyA9IHRoaXMucXVpbGwuZ2V0TGluZShyYW5nZS5pbmRleCArIDEpLAogICAgICAgICAgX3RoaXMkcXVpbGwkZ2V0TGluZTggPSBfc2xpY2VkVG9BcnJheShfdGhpcyRxdWlsbCRnZXRMaW5lNywgMSksCiAgICAgICAgICBuZXh0ID0gX3RoaXMkcXVpbGwkZ2V0TGluZThbMF07CiAgICAgICAgaWYgKG5leHQpIHsKICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgRml4IG1lIGxhdGVyCiAgICAgICAgICB2YXIgY3VyRm9ybWF0cyA9IGxpbmUuZm9ybWF0cygpOwogICAgICAgICAgdmFyIG5leHRGb3JtYXRzID0gdGhpcy5xdWlsbC5nZXRGb3JtYXQocmFuZ2UuaW5kZXgsIDEpOwogICAgICAgICAgZm9ybWF0cyA9IEF0dHJpYnV0ZU1hcC5kaWZmKGN1ckZvcm1hdHMsIG5leHRGb3JtYXRzKSB8fCB7fTsKICAgICAgICAgIGlmIChPYmplY3Qua2V5cyhmb3JtYXRzKS5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgIGRlbHRhID0gZGVsdGEucmV0YWluKG5leHQubGVuZ3RoKCkgLSAxKS5yZXRhaW4oMSwgZm9ybWF0cyk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIHRoaXMucXVpbGwudXBkYXRlQ29udGVudHMoZGVsdGEsIFF1aWxsLnNvdXJjZXMuVVNFUik7CiAgICAgIHRoaXMucXVpbGwuZm9jdXMoKTsKICAgIH0KICB9LCB7CiAgICBrZXk6ICJoYW5kbGVEZWxldGVSYW5nZSIsCiAgICB2YWx1ZTogZnVuY3Rpb24gaGFuZGxlRGVsZXRlUmFuZ2UocmFuZ2UpIHsKICAgICAgZGVsZXRlUmFuZ2UoewogICAgICAgIHJhbmdlOiByYW5nZSwKICAgICAgICBxdWlsbDogdGhpcy5xdWlsbAogICAgICB9KTsKICAgICAgdGhpcy5xdWlsbC5mb2N1cygpOwogICAgfQogIH0sIHsKICAgIGtleTogImhhbmRsZUVudGVyIiwKICAgIHZhbHVlOiBmdW5jdGlvbiBoYW5kbGVFbnRlcihyYW5nZSwgY29udGV4dCkgewogICAgICB2YXIgX3RoaXM0ID0gdGhpczsKICAgICAgdmFyIGxpbmVGb3JtYXRzID0gT2JqZWN0LmtleXMoY29udGV4dC5mb3JtYXQpLnJlZHVjZShmdW5jdGlvbiAoZm9ybWF0cywgZm9ybWF0KSB7CiAgICAgICAgaWYgKF90aGlzNC5xdWlsbC5zY3JvbGwucXVlcnkoZm9ybWF0LCBTY29wZS5CTE9DSykgJiYgIUFycmF5LmlzQXJyYXkoY29udGV4dC5mb3JtYXRbZm9ybWF0XSkpIHsKICAgICAgICAgIGZvcm1hdHNbZm9ybWF0XSA9IGNvbnRleHQuZm9ybWF0W2Zvcm1hdF07CiAgICAgICAgfQogICAgICAgIHJldHVybiBmb3JtYXRzOwogICAgICB9LCB7fSk7CiAgICAgIHZhciBkZWx0YSA9IG5ldyBEZWx0YSgpLnJldGFpbihyYW5nZS5pbmRleCkuZGVsZXRlKHJhbmdlLmxlbmd0aCkuaW5zZXJ0KCdcbicsIGxpbmVGb3JtYXRzKTsKICAgICAgdGhpcy5xdWlsbC51cGRhdGVDb250ZW50cyhkZWx0YSwgUXVpbGwuc291cmNlcy5VU0VSKTsKICAgICAgdGhpcy5xdWlsbC5zZXRTZWxlY3Rpb24ocmFuZ2UuaW5kZXggKyAxLCBRdWlsbC5zb3VyY2VzLlNJTEVOVCk7CiAgICAgIHRoaXMucXVpbGwuZm9jdXMoKTsKICAgIH0KICB9XSwgW3sKICAgIGtleTogIm1hdGNoIiwKICAgIHZhbHVlOiBmdW5jdGlvbiBtYXRjaChldnQsIGJpbmRpbmcpIHsKICAgICAgaWYgKFsnYWx0S2V5JywgJ2N0cmxLZXknLCAnbWV0YUtleScsICdzaGlmdEtleSddLnNvbWUoZnVuY3Rpb24gKGtleSkgewogICAgICAgIHJldHVybiAhIWJpbmRpbmdba2V5XSAhPT0gZXZ0W2tleV0gJiYgYmluZGluZ1trZXldICE9PSBudWxsOwogICAgICB9KSkgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQogICAgICByZXR1cm4gYmluZGluZy5rZXkgPT09IGV2dC5rZXkgfHwgYmluZGluZy5rZXkgPT09IGV2dC53aGljaDsKICAgIH0KICB9XSk7Cn0oTW9kdWxlKTsKdmFyIGRlZmF1bHRPcHRpb25zID0gewogIGJpbmRpbmdzOiB7CiAgICBib2xkOiBtYWtlRm9ybWF0SGFuZGxlcignYm9sZCcpLAogICAgaXRhbGljOiBtYWtlRm9ybWF0SGFuZGxlcignaXRhbGljJyksCiAgICB1bmRlcmxpbmU6IG1ha2VGb3JtYXRIYW5kbGVyKCd1bmRlcmxpbmUnKSwKICAgIGluZGVudDogewogICAgICAvLyBoaWdobGlnaHQgdGFiIG9yIHRhYiBhdCBiZWdpbm5pbmcgb2YgbGlzdCwgaW5kZW50IG9yIGJsb2NrcXVvdGUKICAgICAga2V5OiAnVGFiJywKICAgICAgZm9ybWF0OiBbJ2Jsb2NrcXVvdGUnLCAnaW5kZW50JywgJ2xpc3QnXSwKICAgICAgaGFuZGxlcjogZnVuY3Rpb24gaGFuZGxlcihyYW5nZSwgY29udGV4dCkgewogICAgICAgIGlmIChjb250ZXh0LmNvbGxhcHNlZCAmJiBjb250ZXh0Lm9mZnNldCAhPT0gMCkgcmV0dXJuIHRydWU7CiAgICAgICAgdGhpcy5xdWlsbC5mb3JtYXQoJ2luZGVudCcsICcrMScsIFF1aWxsLnNvdXJjZXMuVVNFUik7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9CiAgICB9LAogICAgb3V0ZGVudDogewogICAgICBrZXk6ICdUYWInLAogICAgICBzaGlmdEtleTogdHJ1ZSwKICAgICAgZm9ybWF0OiBbJ2Jsb2NrcXVvdGUnLCAnaW5kZW50JywgJ2xpc3QnXSwKICAgICAgLy8gaGlnaGxpZ2h0IHRhYiBvciB0YWIgYXQgYmVnaW5uaW5nIG9mIGxpc3QsIGluZGVudCBvciBibG9ja3F1b3RlCiAgICAgIGhhbmRsZXI6IGZ1bmN0aW9uIGhhbmRsZXIocmFuZ2UsIGNvbnRleHQpIHsKICAgICAgICBpZiAoY29udGV4dC5jb2xsYXBzZWQgJiYgY29udGV4dC5vZmZzZXQgIT09IDApIHJldHVybiB0cnVlOwogICAgICAgIHRoaXMucXVpbGwuZm9ybWF0KCdpbmRlbnQnLCAnLTEnLCBRdWlsbC5zb3VyY2VzLlVTRVIpOwogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQogICAgfSwKICAgICdvdXRkZW50IGJhY2tzcGFjZSc6IHsKICAgICAga2V5OiAnQmFja3NwYWNlJywKICAgICAgY29sbGFwc2VkOiB0cnVlLAogICAgICBzaGlmdEtleTogbnVsbCwKICAgICAgbWV0YUtleTogbnVsbCwKICAgICAgY3RybEtleTogbnVsbCwKICAgICAgYWx0S2V5OiBudWxsLAogICAgICBmb3JtYXQ6IFsnaW5kZW50JywgJ2xpc3QnXSwKICAgICAgb2Zmc2V0OiAwLAogICAgICBoYW5kbGVyOiBmdW5jdGlvbiBoYW5kbGVyKHJhbmdlLCBjb250ZXh0KSB7CiAgICAgICAgaWYgKGNvbnRleHQuZm9ybWF0LmluZGVudCAhPSBudWxsKSB7CiAgICAgICAgICB0aGlzLnF1aWxsLmZvcm1hdCgnaW5kZW50JywgJy0xJywgUXVpbGwuc291cmNlcy5VU0VSKTsKICAgICAgICB9IGVsc2UgaWYgKGNvbnRleHQuZm9ybWF0Lmxpc3QgIT0gbnVsbCkgewogICAgICAgICAgdGhpcy5xdWlsbC5mb3JtYXQoJ2xpc3QnLCBmYWxzZSwgUXVpbGwuc291cmNlcy5VU0VSKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAnaW5kZW50IGNvZGUtYmxvY2snOiBtYWtlQ29kZUJsb2NrSGFuZGxlcih0cnVlKSwKICAgICdvdXRkZW50IGNvZGUtYmxvY2snOiBtYWtlQ29kZUJsb2NrSGFuZGxlcihmYWxzZSksCiAgICAncmVtb3ZlIHRhYic6IHsKICAgICAga2V5OiAnVGFiJywKICAgICAgc2hpZnRLZXk6IHRydWUsCiAgICAgIGNvbGxhcHNlZDogdHJ1ZSwKICAgICAgcHJlZml4OiAvXHQkLywKICAgICAgaGFuZGxlcjogZnVuY3Rpb24gaGFuZGxlcihyYW5nZSkgewogICAgICAgIHRoaXMucXVpbGwuZGVsZXRlVGV4dChyYW5nZS5pbmRleCAtIDEsIDEsIFF1aWxsLnNvdXJjZXMuVVNFUik7CiAgICAgIH0KICAgIH0sCiAgICB0YWI6IHsKICAgICAga2V5OiAnVGFiJywKICAgICAgaGFuZGxlcjogZnVuY3Rpb24gaGFuZGxlcihyYW5nZSwgY29udGV4dCkgewogICAgICAgIGlmIChjb250ZXh0LmZvcm1hdC50YWJsZSkgcmV0dXJuIHRydWU7CiAgICAgICAgdGhpcy5xdWlsbC5oaXN0b3J5LmN1dG9mZigpOwogICAgICAgIHZhciBkZWx0YSA9IG5ldyBEZWx0YSgpLnJldGFpbihyYW5nZS5pbmRleCkuZGVsZXRlKHJhbmdlLmxlbmd0aCkuaW5zZXJ0KCdcdCcpOwogICAgICAgIHRoaXMucXVpbGwudXBkYXRlQ29udGVudHMoZGVsdGEsIFF1aWxsLnNvdXJjZXMuVVNFUik7CiAgICAgICAgdGhpcy5xdWlsbC5oaXN0b3J5LmN1dG9mZigpOwogICAgICAgIHRoaXMucXVpbGwuc2V0U2VsZWN0aW9uKHJhbmdlLmluZGV4ICsgMSwgUXVpbGwuc291cmNlcy5TSUxFTlQpOwogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQogICAgfSwKICAgICdibG9ja3F1b3RlIGVtcHR5IGVudGVyJzogewogICAgICBrZXk6ICdFbnRlcicsCiAgICAgIGNvbGxhcHNlZDogdHJ1ZSwKICAgICAgZm9ybWF0OiBbJ2Jsb2NrcXVvdGUnXSwKICAgICAgZW1wdHk6IHRydWUsCiAgICAgIGhhbmRsZXI6IGZ1bmN0aW9uIGhhbmRsZXIoKSB7CiAgICAgICAgdGhpcy5xdWlsbC5mb3JtYXQoJ2Jsb2NrcXVvdGUnLCBmYWxzZSwgUXVpbGwuc291cmNlcy5VU0VSKTsKICAgICAgfQogICAgfSwKICAgICdsaXN0IGVtcHR5IGVudGVyJzogewogICAgICBrZXk6ICdFbnRlcicsCiAgICAgIGNvbGxhcHNlZDogdHJ1ZSwKICAgICAgZm9ybWF0OiBbJ2xpc3QnXSwKICAgICAgZW1wdHk6IHRydWUsCiAgICAgIGhhbmRsZXI6IGZ1bmN0aW9uIGhhbmRsZXIocmFuZ2UsIGNvbnRleHQpIHsKICAgICAgICB2YXIgZm9ybWF0cyA9IHsKICAgICAgICAgIGxpc3Q6IGZhbHNlCiAgICAgICAgfTsKICAgICAgICBpZiAoY29udGV4dC5mb3JtYXQuaW5kZW50KSB7CiAgICAgICAgICBmb3JtYXRzLmluZGVudCA9IGZhbHNlOwogICAgICAgIH0KICAgICAgICB0aGlzLnF1aWxsLmZvcm1hdExpbmUocmFuZ2UuaW5kZXgsIHJhbmdlLmxlbmd0aCwgZm9ybWF0cywgUXVpbGwuc291cmNlcy5VU0VSKTsKICAgICAgfQogICAgfSwKICAgICdjaGVja2xpc3QgZW50ZXInOiB7CiAgICAgIGtleTogJ0VudGVyJywKICAgICAgY29sbGFwc2VkOiB0cnVlLAogICAgICBmb3JtYXQ6IHsKICAgICAgICBsaXN0OiAnY2hlY2tlZCcKICAgICAgfSwKICAgICAgaGFuZGxlcjogZnVuY3Rpb24gaGFuZGxlcihyYW5nZSkgewogICAgICAgIHZhciBfdGhpcyRxdWlsbCRnZXRMaW5lOSA9IHRoaXMucXVpbGwuZ2V0TGluZShyYW5nZS5pbmRleCksCiAgICAgICAgICBfdGhpcyRxdWlsbCRnZXRMaW5lMCA9IF9zbGljZWRUb0FycmF5KF90aGlzJHF1aWxsJGdldExpbmU5LCAyKSwKICAgICAgICAgIGxpbmUgPSBfdGhpcyRxdWlsbCRnZXRMaW5lMFswXSwKICAgICAgICAgIG9mZnNldCA9IF90aGlzJHF1aWxsJGdldExpbmUwWzFdOwogICAgICAgIHZhciBmb3JtYXRzID0gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBsaW5lLmZvcm1hdHMoKSksIHt9LCB7CiAgICAgICAgICBsaXN0OiAnY2hlY2tlZCcKICAgICAgICB9KTsKICAgICAgICB2YXIgZGVsdGEgPSBuZXcgRGVsdGEoKS5yZXRhaW4ocmFuZ2UuaW5kZXgpLmluc2VydCgnXG4nLCBmb3JtYXRzKQogICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgRml4IG1lIGxhdGVyCiAgICAgICAgLnJldGFpbihsaW5lLmxlbmd0aCgpIC0gb2Zmc2V0IC0gMSkucmV0YWluKDEsIHsKICAgICAgICAgIGxpc3Q6ICd1bmNoZWNrZWQnCiAgICAgICAgfSk7CiAgICAgICAgdGhpcy5xdWlsbC51cGRhdGVDb250ZW50cyhkZWx0YSwgUXVpbGwuc291cmNlcy5VU0VSKTsKICAgICAgICB0aGlzLnF1aWxsLnNldFNlbGVjdGlvbihyYW5nZS5pbmRleCArIDEsIFF1aWxsLnNvdXJjZXMuU0lMRU5UKTsKICAgICAgICB0aGlzLnF1aWxsLnNjcm9sbFNlbGVjdGlvbkludG9WaWV3KCk7CiAgICAgIH0KICAgIH0sCiAgICAnaGVhZGVyIGVudGVyJzogewogICAgICBrZXk6ICdFbnRlcicsCiAgICAgIGNvbGxhcHNlZDogdHJ1ZSwKICAgICAgZm9ybWF0OiBbJ2hlYWRlciddLAogICAgICBzdWZmaXg6IC9eJC8sCiAgICAgIGhhbmRsZXI6IGZ1bmN0aW9uIGhhbmRsZXIocmFuZ2UsIGNvbnRleHQpIHsKICAgICAgICB2YXIgX3RoaXMkcXVpbGwkZ2V0TGluZTEgPSB0aGlzLnF1aWxsLmdldExpbmUocmFuZ2UuaW5kZXgpLAogICAgICAgICAgX3RoaXMkcXVpbGwkZ2V0TGluZTEwID0gX3NsaWNlZFRvQXJyYXkoX3RoaXMkcXVpbGwkZ2V0TGluZTEsIDIpLAogICAgICAgICAgbGluZSA9IF90aGlzJHF1aWxsJGdldExpbmUxMFswXSwKICAgICAgICAgIG9mZnNldCA9IF90aGlzJHF1aWxsJGdldExpbmUxMFsxXTsKICAgICAgICB2YXIgZGVsdGEgPSBuZXcgRGVsdGEoKS5yZXRhaW4ocmFuZ2UuaW5kZXgpLmluc2VydCgnXG4nLCBjb250ZXh0LmZvcm1hdCkKICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIEZpeCBtZSBsYXRlcgogICAgICAgIC5yZXRhaW4obGluZS5sZW5ndGgoKSAtIG9mZnNldCAtIDEpLnJldGFpbigxLCB7CiAgICAgICAgICBoZWFkZXI6IG51bGwKICAgICAgICB9KTsKICAgICAgICB0aGlzLnF1aWxsLnVwZGF0ZUNvbnRlbnRzKGRlbHRhLCBRdWlsbC5zb3VyY2VzLlVTRVIpOwogICAgICAgIHRoaXMucXVpbGwuc2V0U2VsZWN0aW9uKHJhbmdlLmluZGV4ICsgMSwgUXVpbGwuc291cmNlcy5TSUxFTlQpOwogICAgICAgIHRoaXMucXVpbGwuc2Nyb2xsU2VsZWN0aW9uSW50b1ZpZXcoKTsKICAgICAgfQogICAgfSwKICAgICd0YWJsZSBiYWNrc3BhY2UnOiB7CiAgICAgIGtleTogJ0JhY2tzcGFjZScsCiAgICAgIGZvcm1hdDogWyd0YWJsZSddLAogICAgICBjb2xsYXBzZWQ6IHRydWUsCiAgICAgIG9mZnNldDogMCwKICAgICAgaGFuZGxlcjogZnVuY3Rpb24gaGFuZGxlcigpIHt9CiAgICB9LAogICAgJ3RhYmxlIGRlbGV0ZSc6IHsKICAgICAga2V5OiAnRGVsZXRlJywKICAgICAgZm9ybWF0OiBbJ3RhYmxlJ10sCiAgICAgIGNvbGxhcHNlZDogdHJ1ZSwKICAgICAgc3VmZml4OiAvXiQvLAogICAgICBoYW5kbGVyOiBmdW5jdGlvbiBoYW5kbGVyKCkge30KICAgIH0sCiAgICAndGFibGUgZW50ZXInOiB7CiAgICAgIGtleTogJ0VudGVyJywKICAgICAgc2hpZnRLZXk6IG51bGwsCiAgICAgIGZvcm1hdDogWyd0YWJsZSddLAogICAgICBoYW5kbGVyOiBmdW5jdGlvbiBoYW5kbGVyKHJhbmdlKSB7CiAgICAgICAgdmFyIG1vZHVsZSA9IHRoaXMucXVpbGwuZ2V0TW9kdWxlKCd0YWJsZScpOwogICAgICAgIGlmIChtb2R1bGUpIHsKICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IKICAgICAgICAgIHZhciBfbW9kdWxlJGdldFRhYmxlID0gbW9kdWxlLmdldFRhYmxlKHJhbmdlKSwKICAgICAgICAgICAgX21vZHVsZSRnZXRUYWJsZTIgPSBfc2xpY2VkVG9BcnJheShfbW9kdWxlJGdldFRhYmxlLCA0KSwKICAgICAgICAgICAgdGFibGUgPSBfbW9kdWxlJGdldFRhYmxlMlswXSwKICAgICAgICAgICAgcm93ID0gX21vZHVsZSRnZXRUYWJsZTJbMV0sCiAgICAgICAgICAgIGNlbGwgPSBfbW9kdWxlJGdldFRhYmxlMlsyXSwKICAgICAgICAgICAgb2Zmc2V0ID0gX21vZHVsZSRnZXRUYWJsZTJbM107CiAgICAgICAgICB2YXIgc2hpZnQgPSB0YWJsZVNpZGUodGFibGUsIHJvdywgY2VsbCwgb2Zmc2V0KTsKICAgICAgICAgIGlmIChzaGlmdCA9PSBudWxsKSByZXR1cm47CiAgICAgICAgICB2YXIgaW5kZXggPSB0YWJsZS5vZmZzZXQoKTsKICAgICAgICAgIGlmIChzaGlmdCA8IDApIHsKICAgICAgICAgICAgdmFyIGRlbHRhID0gbmV3IERlbHRhKCkucmV0YWluKGluZGV4KS5pbnNlcnQoJ1xuJyk7CiAgICAgICAgICAgIHRoaXMucXVpbGwudXBkYXRlQ29udGVudHMoZGVsdGEsIFF1aWxsLnNvdXJjZXMuVVNFUik7CiAgICAgICAgICAgIHRoaXMucXVpbGwuc2V0U2VsZWN0aW9uKHJhbmdlLmluZGV4ICsgMSwgcmFuZ2UubGVuZ3RoLCBRdWlsbC5zb3VyY2VzLlNJTEVOVCk7CiAgICAgICAgICB9IGVsc2UgaWYgKHNoaWZ0ID4gMCkgewogICAgICAgICAgICBpbmRleCArPSB0YWJsZS5sZW5ndGgoKTsKICAgICAgICAgICAgdmFyIF9kZWx0YSA9IG5ldyBEZWx0YSgpLnJldGFpbihpbmRleCkuaW5zZXJ0KCdcbicpOwogICAgICAgICAgICB0aGlzLnF1aWxsLnVwZGF0ZUNvbnRlbnRzKF9kZWx0YSwgUXVpbGwuc291cmNlcy5VU0VSKTsKICAgICAgICAgICAgdGhpcy5xdWlsbC5zZXRTZWxlY3Rpb24oaW5kZXgsIFF1aWxsLnNvdXJjZXMuVVNFUik7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgJ3RhYmxlIHRhYic6IHsKICAgICAga2V5OiAnVGFiJywKICAgICAgc2hpZnRLZXk6IG51bGwsCiAgICAgIGZvcm1hdDogWyd0YWJsZSddLAogICAgICBoYW5kbGVyOiBmdW5jdGlvbiBoYW5kbGVyKHJhbmdlLCBjb250ZXh0KSB7CiAgICAgICAgdmFyIGV2ZW50ID0gY29udGV4dC5ldmVudCwKICAgICAgICAgIGNlbGwgPSBjb250ZXh0LmxpbmU7CiAgICAgICAgdmFyIG9mZnNldCA9IGNlbGwub2Zmc2V0KHRoaXMucXVpbGwuc2Nyb2xsKTsKICAgICAgICBpZiAoZXZlbnQuc2hpZnRLZXkpIHsKICAgICAgICAgIHRoaXMucXVpbGwuc2V0U2VsZWN0aW9uKG9mZnNldCAtIDEsIFF1aWxsLnNvdXJjZXMuVVNFUik7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHRoaXMucXVpbGwuc2V0U2VsZWN0aW9uKG9mZnNldCArIGNlbGwubGVuZ3RoKCksIFF1aWxsLnNvdXJjZXMuVVNFUik7CiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgJ2xpc3QgYXV0b2ZpbGwnOiB7CiAgICAgIGtleTogJyAnLAogICAgICBzaGlmdEtleTogbnVsbCwKICAgICAgY29sbGFwc2VkOiB0cnVlLAogICAgICBmb3JtYXQ6IHsKICAgICAgICAnY29kZS1ibG9jayc6IGZhbHNlLAogICAgICAgIGJsb2NrcXVvdGU6IGZhbHNlLAogICAgICAgIHRhYmxlOiBmYWxzZQogICAgICB9LAogICAgICBwcmVmaXg6IC9eXHMqPyhcZCtcLnwtfFwqfFxbID9cXXxcW3hcXSkkLywKICAgICAgaGFuZGxlcjogZnVuY3Rpb24gaGFuZGxlcihyYW5nZSwgY29udGV4dCkgewogICAgICAgIGlmICh0aGlzLnF1aWxsLnNjcm9sbC5xdWVyeSgnbGlzdCcpID09IG51bGwpIHJldHVybiB0cnVlOwogICAgICAgIHZhciBsZW5ndGggPSBjb250ZXh0LnByZWZpeC5sZW5ndGg7CiAgICAgICAgdmFyIF90aGlzJHF1aWxsJGdldExpbmUxMSA9IHRoaXMucXVpbGwuZ2V0TGluZShyYW5nZS5pbmRleCksCiAgICAgICAgICBfdGhpcyRxdWlsbCRnZXRMaW5lMTIgPSBfc2xpY2VkVG9BcnJheShfdGhpcyRxdWlsbCRnZXRMaW5lMTEsIDIpLAogICAgICAgICAgbGluZSA9IF90aGlzJHF1aWxsJGdldExpbmUxMlswXSwKICAgICAgICAgIG9mZnNldCA9IF90aGlzJHF1aWxsJGdldExpbmUxMlsxXTsKICAgICAgICBpZiAob2Zmc2V0ID4gbGVuZ3RoKSByZXR1cm4gdHJ1ZTsKICAgICAgICB2YXIgdmFsdWU7CiAgICAgICAgc3dpdGNoIChjb250ZXh0LnByZWZpeC50cmltKCkpIHsKICAgICAgICAgIGNhc2UgJ1tdJzoKICAgICAgICAgIGNhc2UgJ1sgXSc6CiAgICAgICAgICAgIHZhbHVlID0gJ3VuY2hlY2tlZCc7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSAnW3hdJzoKICAgICAgICAgICAgdmFsdWUgPSAnY2hlY2tlZCc7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSAnLSc6CiAgICAgICAgICBjYXNlICcqJzoKICAgICAgICAgICAgdmFsdWUgPSAnYnVsbGV0JzsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICB2YWx1ZSA9ICdvcmRlcmVkJzsKICAgICAgICB9CiAgICAgICAgdGhpcy5xdWlsbC5pbnNlcnRUZXh0KHJhbmdlLmluZGV4LCAnICcsIFF1aWxsLnNvdXJjZXMuVVNFUik7CiAgICAgICAgdGhpcy5xdWlsbC5oaXN0b3J5LmN1dG9mZigpOwogICAgICAgIHZhciBkZWx0YSA9IG5ldyBEZWx0YSgpLnJldGFpbihyYW5nZS5pbmRleCAtIG9mZnNldCkuZGVsZXRlKGxlbmd0aCArIDEpCiAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBGaXggbWUgbGF0ZXIKICAgICAgICAucmV0YWluKGxpbmUubGVuZ3RoKCkgLSAyIC0gb2Zmc2V0KS5yZXRhaW4oMSwgewogICAgICAgICAgbGlzdDogdmFsdWUKICAgICAgICB9KTsKICAgICAgICB0aGlzLnF1aWxsLnVwZGF0ZUNvbnRlbnRzKGRlbHRhLCBRdWlsbC5zb3VyY2VzLlVTRVIpOwogICAgICAgIHRoaXMucXVpbGwuaGlzdG9yeS5jdXRvZmYoKTsKICAgICAgICB0aGlzLnF1aWxsLnNldFNlbGVjdGlvbihyYW5nZS5pbmRleCAtIGxlbmd0aCwgUXVpbGwuc291cmNlcy5TSUxFTlQpOwogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQogICAgfSwKICAgICdjb2RlIGV4aXQnOiB7CiAgICAgIGtleTogJ0VudGVyJywKICAgICAgY29sbGFwc2VkOiB0cnVlLAogICAgICBmb3JtYXQ6IFsnY29kZS1ibG9jayddLAogICAgICBwcmVmaXg6IC9eJC8sCiAgICAgIHN1ZmZpeDogL15ccyokLywKICAgICAgaGFuZGxlcjogZnVuY3Rpb24gaGFuZGxlcihyYW5nZSkgewogICAgICAgIHZhciBfdGhpcyRxdWlsbCRnZXRMaW5lMTMgPSB0aGlzLnF1aWxsLmdldExpbmUocmFuZ2UuaW5kZXgpLAogICAgICAgICAgX3RoaXMkcXVpbGwkZ2V0TGluZTE0ID0gX3NsaWNlZFRvQXJyYXkoX3RoaXMkcXVpbGwkZ2V0TGluZTEzLCAyKSwKICAgICAgICAgIGxpbmUgPSBfdGhpcyRxdWlsbCRnZXRMaW5lMTRbMF0sCiAgICAgICAgICBvZmZzZXQgPSBfdGhpcyRxdWlsbCRnZXRMaW5lMTRbMV07CiAgICAgICAgdmFyIG51bUxpbmVzID0gMjsKICAgICAgICB2YXIgY3VyID0gbGluZTsKICAgICAgICB3aGlsZSAoY3VyICE9IG51bGwgJiYgY3VyLmxlbmd0aCgpIDw9IDEgJiYgY3VyLmZvcm1hdHMoKVsnY29kZS1ibG9jayddKSB7CiAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yCiAgICAgICAgICBjdXIgPSBjdXIucHJldjsKICAgICAgICAgIG51bUxpbmVzIC09IDE7CiAgICAgICAgICAvLyBSZXF1aXNpdGUgcHJldiBsaW5lcyBhcmUgZW1wdHkKICAgICAgICAgIGlmIChudW1MaW5lcyA8PSAwKSB7CiAgICAgICAgICAgIHZhciBkZWx0YSA9IG5ldyBEZWx0YSgpCiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgRml4IG1lIGxhdGVyCiAgICAgICAgICAgIC5yZXRhaW4ocmFuZ2UuaW5kZXggKyBsaW5lLmxlbmd0aCgpIC0gb2Zmc2V0IC0gMikucmV0YWluKDEsIHsKICAgICAgICAgICAgICAnY29kZS1ibG9jayc6IG51bGwKICAgICAgICAgICAgfSkuZGVsZXRlKDEpOwogICAgICAgICAgICB0aGlzLnF1aWxsLnVwZGF0ZUNvbnRlbnRzKGRlbHRhLCBRdWlsbC5zb3VyY2VzLlVTRVIpOwogICAgICAgICAgICB0aGlzLnF1aWxsLnNldFNlbGVjdGlvbihyYW5nZS5pbmRleCAtIDEsIFF1aWxsLnNvdXJjZXMuU0lMRU5UKTsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfQogICAgfSwKICAgICdlbWJlZCBsZWZ0JzogbWFrZUVtYmVkQXJyb3dIYW5kbGVyKCdBcnJvd0xlZnQnLCBmYWxzZSksCiAgICAnZW1iZWQgbGVmdCBzaGlmdCc6IG1ha2VFbWJlZEFycm93SGFuZGxlcignQXJyb3dMZWZ0JywgdHJ1ZSksCiAgICAnZW1iZWQgcmlnaHQnOiBtYWtlRW1iZWRBcnJvd0hhbmRsZXIoJ0Fycm93UmlnaHQnLCBmYWxzZSksCiAgICAnZW1iZWQgcmlnaHQgc2hpZnQnOiBtYWtlRW1iZWRBcnJvd0hhbmRsZXIoJ0Fycm93UmlnaHQnLCB0cnVlKSwKICAgICd0YWJsZSBkb3duJzogbWFrZVRhYmxlQXJyb3dIYW5kbGVyKGZhbHNlKSwKICAgICd0YWJsZSB1cCc6IG1ha2VUYWJsZUFycm93SGFuZGxlcih0cnVlKQogIH0KfTsKS2V5Ym9hcmQuREVGQVVMVFMgPSBkZWZhdWx0T3B0aW9uczsKZnVuY3Rpb24gbWFrZUNvZGVCbG9ja0hhbmRsZXIoaW5kZW50KSB7CiAgcmV0dXJuIHsKICAgIGtleTogJ1RhYicsCiAgICBzaGlmdEtleTogIWluZGVudCwKICAgIGZvcm1hdDogewogICAgICAnY29kZS1ibG9jayc6IHRydWUKICAgIH0sCiAgICBoYW5kbGVyOiBmdW5jdGlvbiBoYW5kbGVyKHJhbmdlLCBfcmVmKSB7CiAgICAgIHZhciBldmVudCA9IF9yZWYuZXZlbnQ7CiAgICAgIHZhciBDb2RlQmxvY2sgPSB0aGlzLnF1aWxsLnNjcm9sbC5xdWVyeSgnY29kZS1ibG9jaycpOwogICAgICAvLyBAdHMtZXhwZWN0LWVycm9yCiAgICAgIHZhciBUQUIgPSBDb2RlQmxvY2suVEFCOwogICAgICBpZiAocmFuZ2UubGVuZ3RoID09PSAwICYmICFldmVudC5zaGlmdEtleSkgewogICAgICAgIHRoaXMucXVpbGwuaW5zZXJ0VGV4dChyYW5nZS5pbmRleCwgVEFCLCBRdWlsbC5zb3VyY2VzLlVTRVIpOwogICAgICAgIHRoaXMucXVpbGwuc2V0U2VsZWN0aW9uKHJhbmdlLmluZGV4ICsgVEFCLmxlbmd0aCwgUXVpbGwuc291cmNlcy5TSUxFTlQpOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICB2YXIgbGluZXMgPSByYW5nZS5sZW5ndGggPT09IDAgPyB0aGlzLnF1aWxsLmdldExpbmVzKHJhbmdlLmluZGV4LCAxKSA6IHRoaXMucXVpbGwuZ2V0TGluZXMocmFuZ2UpOwogICAgICB2YXIgaW5kZXggPSByYW5nZS5pbmRleCwKICAgICAgICBsZW5ndGggPSByYW5nZS5sZW5ndGg7CiAgICAgIGxpbmVzLmZvckVhY2goZnVuY3Rpb24gKGxpbmUsIGkpIHsKICAgICAgICBpZiAoaW5kZW50KSB7CiAgICAgICAgICBsaW5lLmluc2VydEF0KDAsIFRBQik7CiAgICAgICAgICBpZiAoaSA9PT0gMCkgewogICAgICAgICAgICBpbmRleCArPSBUQUIubGVuZ3RoOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgbGVuZ3RoICs9IFRBQi5sZW5ndGg7CiAgICAgICAgICB9CiAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIEZpeCBtZSBsYXRlcgogICAgICAgIH0gZWxzZSBpZiAobGluZS5kb21Ob2RlLnRleHRDb250ZW50LnN0YXJ0c1dpdGgoVEFCKSkgewogICAgICAgICAgbGluZS5kZWxldGVBdCgwLCBUQUIubGVuZ3RoKTsKICAgICAgICAgIGlmIChpID09PSAwKSB7CiAgICAgICAgICAgIGluZGV4IC09IFRBQi5sZW5ndGg7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBsZW5ndGggLT0gVEFCLmxlbmd0aDsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0pOwogICAgICB0aGlzLnF1aWxsLnVwZGF0ZShRdWlsbC5zb3VyY2VzLlVTRVIpOwogICAgICB0aGlzLnF1aWxsLnNldFNlbGVjdGlvbihpbmRleCwgbGVuZ3RoLCBRdWlsbC5zb3VyY2VzLlNJTEVOVCk7CiAgICB9CiAgfTsKfQpmdW5jdGlvbiBtYWtlRW1iZWRBcnJvd0hhbmRsZXIoa2V5LCBzaGlmdEtleSkgewogIHZhciB3aGVyZSA9IGtleSA9PT0gJ0Fycm93TGVmdCcgPyAncHJlZml4JyA6ICdzdWZmaXgnOwogIHJldHVybiBfZGVmaW5lUHJvcGVydHkoX2RlZmluZVByb3BlcnR5KHsKICAgIGtleToga2V5LAogICAgc2hpZnRLZXk6IHNoaWZ0S2V5LAogICAgYWx0S2V5OiBudWxsCiAgfSwgd2hlcmUsIC9eJC8pLCAiaGFuZGxlciIsIGZ1bmN0aW9uIGhhbmRsZXIocmFuZ2UpIHsKICAgIHZhciBpbmRleCA9IHJhbmdlLmluZGV4OwogICAgaWYgKGtleSA9PT0gJ0Fycm93UmlnaHQnKSB7CiAgICAgIGluZGV4ICs9IHJhbmdlLmxlbmd0aCArIDE7CiAgICB9CiAgICB2YXIgX3RoaXMkcXVpbGwkZ2V0TGVhZiA9IHRoaXMucXVpbGwuZ2V0TGVhZihpbmRleCksCiAgICAgIF90aGlzJHF1aWxsJGdldExlYWYyID0gX3NsaWNlZFRvQXJyYXkoX3RoaXMkcXVpbGwkZ2V0TGVhZiwgMSksCiAgICAgIGxlYWYgPSBfdGhpcyRxdWlsbCRnZXRMZWFmMlswXTsKICAgIGlmICghKGxlYWYgaW5zdGFuY2VvZiBFbWJlZEJsb3QpKSByZXR1cm4gdHJ1ZTsKICAgIGlmIChrZXkgPT09ICdBcnJvd0xlZnQnKSB7CiAgICAgIGlmIChzaGlmdEtleSkgewogICAgICAgIHRoaXMucXVpbGwuc2V0U2VsZWN0aW9uKHJhbmdlLmluZGV4IC0gMSwgcmFuZ2UubGVuZ3RoICsgMSwgUXVpbGwuc291cmNlcy5VU0VSKTsKICAgICAgfSBlbHNlIHsKICAgICAgICB0aGlzLnF1aWxsLnNldFNlbGVjdGlvbihyYW5nZS5pbmRleCAtIDEsIFF1aWxsLnNvdXJjZXMuVVNFUik7CiAgICAgIH0KICAgIH0gZWxzZSBpZiAoc2hpZnRLZXkpIHsKICAgICAgdGhpcy5xdWlsbC5zZXRTZWxlY3Rpb24ocmFuZ2UuaW5kZXgsIHJhbmdlLmxlbmd0aCArIDEsIFF1aWxsLnNvdXJjZXMuVVNFUik7CiAgICB9IGVsc2UgewogICAgICB0aGlzLnF1aWxsLnNldFNlbGVjdGlvbihyYW5nZS5pbmRleCArIHJhbmdlLmxlbmd0aCArIDEsIFF1aWxsLnNvdXJjZXMuVVNFUik7CiAgICB9CiAgICByZXR1cm4gZmFsc2U7CiAgfSk7Cn0KZnVuY3Rpb24gbWFrZUZvcm1hdEhhbmRsZXIoZm9ybWF0KSB7CiAgcmV0dXJuIHsKICAgIGtleTogZm9ybWF0WzBdLAogICAgc2hvcnRLZXk6IHRydWUsCiAgICBoYW5kbGVyOiBmdW5jdGlvbiBoYW5kbGVyKHJhbmdlLCBjb250ZXh0KSB7CiAgICAgIHRoaXMucXVpbGwuZm9ybWF0KGZvcm1hdCwgIWNvbnRleHQuZm9ybWF0W2Zvcm1hdF0sIFF1aWxsLnNvdXJjZXMuVVNFUik7CiAgICB9CiAgfTsKfQpmdW5jdGlvbiBtYWtlVGFibGVBcnJvd0hhbmRsZXIodXApIHsKICByZXR1cm4gewogICAga2V5OiB1cCA/ICdBcnJvd1VwJyA6ICdBcnJvd0Rvd24nLAogICAgY29sbGFwc2VkOiB0cnVlLAogICAgZm9ybWF0OiBbJ3RhYmxlJ10sCiAgICBoYW5kbGVyOiBmdW5jdGlvbiBoYW5kbGVyKHJhbmdlLCBjb250ZXh0KSB7CiAgICAgIC8vIFRPRE8gbW92ZSB0byB0YWJsZSBtb2R1bGUKICAgICAgdmFyIGtleSA9IHVwID8gJ3ByZXYnIDogJ25leHQnOwogICAgICB2YXIgY2VsbCA9IGNvbnRleHQubGluZTsKICAgICAgdmFyIHRhcmdldFJvdyA9IGNlbGwucGFyZW50W2tleV07CiAgICAgIGlmICh0YXJnZXRSb3cgIT0gbnVsbCkgewogICAgICAgIGlmICh0YXJnZXRSb3cuc3RhdGljcy5ibG90TmFtZSA9PT0gJ3RhYmxlLXJvdycpIHsKICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IKICAgICAgICAgIHZhciB0YXJnZXRDZWxsID0gdGFyZ2V0Um93LmNoaWxkcmVuLmhlYWQ7CiAgICAgICAgICB2YXIgY3VyID0gY2VsbDsKICAgICAgICAgIHdoaWxlIChjdXIucHJldiAhPSBudWxsKSB7CiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IKICAgICAgICAgICAgY3VyID0gY3VyLnByZXY7CiAgICAgICAgICAgIHRhcmdldENlbGwgPSB0YXJnZXRDZWxsLm5leHQ7CiAgICAgICAgICB9CiAgICAgICAgICB2YXIgaW5kZXggPSB0YXJnZXRDZWxsLm9mZnNldCh0aGlzLnF1aWxsLnNjcm9sbCkgKyBNYXRoLm1pbihjb250ZXh0Lm9mZnNldCwgdGFyZ2V0Q2VsbC5sZW5ndGgoKSAtIDEpOwogICAgICAgICAgdGhpcy5xdWlsbC5zZXRTZWxlY3Rpb24oaW5kZXgsIDAsIFF1aWxsLnNvdXJjZXMuVVNFUik7CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IKICAgICAgICB2YXIgdGFyZ2V0TGluZSA9IGNlbGwudGFibGUoKVtrZXldOwogICAgICAgIGlmICh0YXJnZXRMaW5lICE9IG51bGwpIHsKICAgICAgICAgIGlmICh1cCkgewogICAgICAgICAgICB0aGlzLnF1aWxsLnNldFNlbGVjdGlvbih0YXJnZXRMaW5lLm9mZnNldCh0aGlzLnF1aWxsLnNjcm9sbCkgKyB0YXJnZXRMaW5lLmxlbmd0aCgpIC0gMSwgMCwgUXVpbGwuc291cmNlcy5VU0VSKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHRoaXMucXVpbGwuc2V0U2VsZWN0aW9uKHRhcmdldExpbmUub2Zmc2V0KHRoaXMucXVpbGwuc2Nyb2xsKSwgMCwgUXVpbGwuc291cmNlcy5VU0VSKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogIH07Cn0KZnVuY3Rpb24gbm9ybWFsaXplKGJpbmRpbmcpIHsKICBpZiAodHlwZW9mIGJpbmRpbmcgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiBiaW5kaW5nID09PSAnbnVtYmVyJykgewogICAgYmluZGluZyA9IHsKICAgICAga2V5OiBiaW5kaW5nCiAgICB9OwogIH0gZWxzZSBpZiAoX3R5cGVvZihiaW5kaW5nKSA9PT0gJ29iamVjdCcpIHsKICAgIGJpbmRpbmcgPSBjbG9uZURlZXAoYmluZGluZyk7CiAgfSBlbHNlIHsKICAgIHJldHVybiBudWxsOwogIH0KICBpZiAoYmluZGluZy5zaG9ydEtleSkgewogICAgYmluZGluZ1tTSE9SVEtFWV0gPSBiaW5kaW5nLnNob3J0S2V5OwogICAgZGVsZXRlIGJpbmRpbmcuc2hvcnRLZXk7CiAgfQogIHJldHVybiBiaW5kaW5nOwp9CgovLyBUT0RPOiBNb3ZlIGludG8gcXVpbGwudHMgb3IgZWRpdG9yLnRzCmZ1bmN0aW9uIGRlbGV0ZVJhbmdlKF9yZWYyKSB7CiAgdmFyIHF1aWxsID0gX3JlZjIucXVpbGwsCiAgICByYW5nZSA9IF9yZWYyLnJhbmdlOwogIHZhciBsaW5lcyA9IHF1aWxsLmdldExpbmVzKHJhbmdlKTsKICB2YXIgZm9ybWF0cyA9IHt9OwogIGlmIChsaW5lcy5sZW5ndGggPiAxKSB7CiAgICB2YXIgZmlyc3RGb3JtYXRzID0gbGluZXNbMF0uZm9ybWF0cygpOwogICAgdmFyIGxhc3RGb3JtYXRzID0gbGluZXNbbGluZXMubGVuZ3RoIC0gMV0uZm9ybWF0cygpOwogICAgZm9ybWF0cyA9IEF0dHJpYnV0ZU1hcC5kaWZmKGxhc3RGb3JtYXRzLCBmaXJzdEZvcm1hdHMpIHx8IHt9OwogIH0KICBxdWlsbC5kZWxldGVUZXh0KHJhbmdlLCBRdWlsbC5zb3VyY2VzLlVTRVIpOwogIGlmIChPYmplY3Qua2V5cyhmb3JtYXRzKS5sZW5ndGggPiAwKSB7CiAgICBxdWlsbC5mb3JtYXRMaW5lKHJhbmdlLmluZGV4LCAxLCBmb3JtYXRzLCBRdWlsbC5zb3VyY2VzLlVTRVIpOwogIH0KICBxdWlsbC5zZXRTZWxlY3Rpb24ocmFuZ2UuaW5kZXgsIFF1aWxsLnNvdXJjZXMuU0lMRU5UKTsKfQpmdW5jdGlvbiB0YWJsZVNpZGUoX3RhYmxlLCByb3csIGNlbGwsIG9mZnNldCkgewogIGlmIChyb3cucHJldiA9PSBudWxsICYmIHJvdy5uZXh0ID09IG51bGwpIHsKICAgIGlmIChjZWxsLnByZXYgPT0gbnVsbCAmJiBjZWxsLm5leHQgPT0gbnVsbCkgewogICAgICByZXR1cm4gb2Zmc2V0ID09PSAwID8gLTEgOiAxOwogICAgfQogICAgcmV0dXJuIGNlbGwucHJldiA9PSBudWxsID8gLTEgOiAxOwogIH0KICBpZiAocm93LnByZXYgPT0gbnVsbCkgewogICAgcmV0dXJuIC0xOwogIH0KICBpZiAocm93Lm5leHQgPT0gbnVsbCkgewogICAgcmV0dXJuIDE7CiAgfQogIHJldHVybiBudWxsOwp9CmV4cG9ydCB7IEtleWJvYXJkIGFzIGRlZmF1bHQsIFNIT1JUS0VZLCBub3JtYWxpemUsIGRlbGV0ZVJhbmdlIH07"},null]}