{"remainingRequest":"D:\\jenkins\\workspace\\dataShare-fvue\\node_modules\\@vue\\cli-plugin-babel\\node_modules\\thread-loader\\dist\\cjs.js!D:\\jenkins\\workspace\\dataShare-fvue\\node_modules\\babel-loader\\lib\\index.js!D:\\jenkins\\workspace\\dataShare-fvue\\node_modules\\@vue\\cli-plugin-eslint\\node_modules\\eslint-loader\\index.js??ref--13-0!D:\\jenkins\\workspace\\dataShare-fvue\\src\\hotent-ui-util.js","dependencies":[{"path":"D:\\jenkins\\workspace\\dataShare-fvue\\src\\hotent-ui-util.js","mtime":1733309212407},{"path":"D:\\jenkins\\workspace\\dataShare-fvue\\babel.config.js","mtime":1733906004399},{"path":"D:\\jenkins\\workspace\\dataShare-fvue\\node_modules\\@vue\\cli-plugin-babel\\node_modules\\cache-loader\\dist\\cjs.js","mtime":499162500000},{"path":"D:\\jenkins\\workspace\\dataShare-fvue\\node_modules\\@vue\\cli-plugin-babel\\node_modules\\thread-loader\\dist\\cjs.js","mtime":499162500000},{"path":"D:\\jenkins\\workspace\\dataShare-fvue\\node_modules\\babel-loader\\lib\\index.js","mtime":456789000000},{"path":"D:\\jenkins\\workspace\\dataShare-fvue\\node_modules\\@vue\\cli-plugin-eslint\\node_modules\\eslint-loader\\index.js","mtime":499162500000}],"contextDependencies":[],"result":[{"type":"Buffer","data":"base64:aW1wb3J0IF90b0NvbnN1bWFibGVBcnJheSBmcm9tICJEOi9qZW5raW5zL3dvcmtzcGFjZS9kYXRhU2hhcmUtZnZ1ZS9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vdG9Db25zdW1hYmxlQXJyYXkuanMiOwppbXBvcnQgX29iamVjdFNwcmVhZCBmcm9tICJEOi9qZW5raW5zL3dvcmtzcGFjZS9kYXRhU2hhcmUtZnZ1ZS9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0U3ByZWFkMi5qcyI7CmltcG9ydCBfdHlwZW9mIGZyb20gIkQ6L2plbmtpbnMvd29ya3NwYWNlL2RhdGFTaGFyZS1mdnVlL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS90eXBlb2YuanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5lcnJvci5jYXVzZS5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5LmNvbmNhdC5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5LmZpbHRlci5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5LmZpbmQtaW5kZXguanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5mcm9tLmpzIjsKaW1wb3J0ICJjb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkuam9pbi5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5Lm1hcC5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5LnB1c2guanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5yZWR1Y2UuanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5zbGljZS5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5LnNwbGljZS5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL2VzLm1hcC5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL2VzLm51bWJlci5jb25zdHJ1Y3Rvci5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL2VzLm51bWJlci5pcy1pbnRlZ2VyLmpzIjsKaW1wb3J0ICJjb3JlLWpzL21vZHVsZXMvZXMubnVtYmVyLnBhcnNlLWludC5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL2VzLm9iamVjdC5rZXlzLmpzIjsKaW1wb3J0ICJjb3JlLWpzL21vZHVsZXMvZXMub2JqZWN0LnRvLXN0cmluZy5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL2VzLm9iamVjdC52YWx1ZXMuanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5yZWdleHAuY29uc3RydWN0b3IuanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5yZWdleHAuZG90LWFsbC5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL2VzLnJlZ2V4cC5leGVjLmpzIjsKaW1wb3J0ICJjb3JlLWpzL21vZHVsZXMvZXMucmVnZXhwLnN0aWNreS5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL2VzLnJlZ2V4cC50ZXN0LmpzIjsKaW1wb3J0ICJjb3JlLWpzL21vZHVsZXMvZXMucmVnZXhwLnRvLXN0cmluZy5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL2VzLnNldC5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL2VzLnNldC5kaWZmZXJlbmNlLnYyLmpzIjsKaW1wb3J0ICJjb3JlLWpzL21vZHVsZXMvZXMuc2V0LmludGVyc2VjdGlvbi52Mi5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL2VzLnNldC5pcy1kaXNqb2ludC1mcm9tLnYyLmpzIjsKaW1wb3J0ICJjb3JlLWpzL21vZHVsZXMvZXMuc2V0LmlzLXN1YnNldC1vZi52Mi5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL2VzLnNldC5pcy1zdXBlcnNldC1vZi52Mi5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL2VzLnNldC5zeW1tZXRyaWMtZGlmZmVyZW5jZS52Mi5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL2VzLnNldC51bmlvbi52Mi5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy5pdGVyYXRvci5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy5tYXRjaC5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy5yZXBsYWNlLmpzIjsKaW1wb3J0ICJjb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLnNwbGl0LmpzIjsKaW1wb3J0ICJjb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLnRyaW0uanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lc25leHQuaXRlcmF0b3IuY29uc3RydWN0b3IuanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lc25leHQuaXRlcmF0b3IuZXZlcnkuanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lc25leHQuaXRlcmF0b3IuZmlsdGVyLmpzIjsKaW1wb3J0ICJjb3JlLWpzL21vZHVsZXMvZXNuZXh0Lml0ZXJhdG9yLmZvci1lYWNoLmpzIjsKaW1wb3J0ICJjb3JlLWpzL21vZHVsZXMvZXNuZXh0Lml0ZXJhdG9yLm1hcC5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5pdGVyYXRvci5yZWR1Y2UuanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lc25leHQuaXRlcmF0b3Iuc29tZS5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL3dlYi5kb20tY29sbGVjdGlvbnMuZm9yLWVhY2guanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy93ZWIuZG9tLWNvbGxlY3Rpb25zLml0ZXJhdG9yLmpzIjsKdmFyIHV0aWxzID0gewogIC8qKg0KICAgKiDlkIjlubYNCiAgICovCiAgZGVlcE1lcmdlOiBmdW5jdGlvbiAoX2RlZXBNZXJnZSkgewogICAgZnVuY3Rpb24gZGVlcE1lcmdlKF94LCBfeDIpIHsKICAgICAgcmV0dXJuIF9kZWVwTWVyZ2UuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgIH0KICAgIGRlZXBNZXJnZS50b1N0cmluZyA9IGZ1bmN0aW9uICgpIHsKICAgICAgcmV0dXJuIF9kZWVwTWVyZ2UudG9TdHJpbmcoKTsKICAgIH07CiAgICByZXR1cm4gZGVlcE1lcmdlOwogIH0oZnVuY3Rpb24gKHRhcmdldCwgbWVyZ2VkKSB7CiAgICBmb3IgKHZhciBrZXkgaW4gbWVyZ2VkKSB7CiAgICAgIGlmICh0YXJnZXRba2V5XSAmJiAoMCwgX3R5cGVvZjJbImRlZmF1bHQiXSkodGFyZ2V0W2tleV0pID09PSAnb2JqZWN0JykgewogICAgICAgIGRlZXBNZXJnZSh0YXJnZXRba2V5XSwgbWVyZ2VkW2tleV0pOwogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIGlmICgoMCwgX3R5cGVvZjJbImRlZmF1bHQiXSkobWVyZ2VkW2tleV0pID09PSAnb2JqZWN0JykgewogICAgICAgIHRhcmdldFtrZXldID0gKDAsIGRlZXBDbG9uZSkobWVyZ2VkW2tleV0sIHRydWUpOwogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIHRhcmdldFtrZXldID0gbWVyZ2VkW2tleV07CiAgICB9CiAgICByZXR1cm4gdGFyZ2V0OwogIH0pLAogIC8qKg0KICAgKiDmoLnmja7lrZflhbjnvJbnoIHojrflj5blrZflhbjmlbDmja4NCiAgICovCiAgZ2V0RGljdEl0ZW1zRnJvbUNhY2hlOiBmdW5jdGlvbiBnZXREaWN0SXRlbXNGcm9tQ2FjaGUoZGljdENvZGUpIHsKICAgIGlmICghZGljdENvZGUpIHsKICAgICAgcmV0dXJuICflrZflhbhDb2Rl5LiN6IO95Li656m6ISc7CiAgICB9CiAgICBpZiAoc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbSgnZGljdF9kYXRhJykpIHsKICAgICAgdmFyIGRpY3RfZGF0YSA9IEpTT04ucGFyc2Uoc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbSgnZGljdF9kYXRhJykpOwogICAgICBpZiAoZGljdF9kYXRhW2RpY3RDb2RlXSkgewogICAgICAgIHZhciBkaXN0SXRlbSA9IGRpY3RfZGF0YVtkaWN0Q29kZV07CiAgICAgICAgcmV0dXJuIGRpc3RJdGVtOwogICAgICB9CiAgICB9CiAgfSwKICAvKioNCiAgICog5rex5ou36LSdDQogICAqLwogIGRlZXBDbG9uZTogZnVuY3Rpb24gZGVlcENsb25lKGRhdGEpIHsKICAgIHZhciB0eXBlID0gdXRpbHMuZ2V0VHlwZShkYXRhKTsKICAgIHZhciBvYmo7CiAgICBpZiAodHlwZSA9PT0gImFycmF5IikgewogICAgICBvYmogPSBbXTsKICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gIm9iamVjdCIpIHsKICAgICAgb2JqID0ge307CiAgICB9IGVsc2UgewogICAgICAvL+S4jeWGjeWFt+acieS4i+S4gOWxguasoQogICAgICByZXR1cm4gZGF0YTsKICAgIH0KICAgIGlmICh0eXBlID09PSAiYXJyYXkiKSB7CiAgICAgIGZvciAodmFyIGkgPSAwLCBsZW4gPSBkYXRhLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7CiAgICAgICAgb2JqLnB1c2godXRpbHMuZGVlcENsb25lKGRhdGFbaV0pKTsKICAgICAgfQogICAgfSBlbHNlIGlmICh0eXBlID09PSAib2JqZWN0IikgewogICAgICBmb3IgKHZhciBrZXkgaW4gZGF0YSkgewogICAgICAgIG9ialtrZXldID0gdXRpbHMuZGVlcENsb25lKGRhdGFba2V5XSk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBvYmo7CiAgfSwKICBnZXRUeXBlOiBmdW5jdGlvbiBnZXRUeXBlKG9iaikgewogICAgLy90b3N0cmluZ+S8mui/lOWbnuWvueW6lOS4jeWQjOeahOagh+etvueahOaehOmAoOWHveaVsAogICAgdmFyIHRvU3RyaW5nID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZzsKICAgIHZhciBtYXAgPSB7CiAgICAgICJbb2JqZWN0IEJvb2xlYW5dIjogImJvb2xlYW4iLAogICAgICAiW29iamVjdCBOdW1iZXJdIjogIm51bWJlciIsCiAgICAgICJbb2JqZWN0IFN0cmluZ10iOiAic3RyaW5nIiwKICAgICAgIltvYmplY3QgRnVuY3Rpb25dIjogImZ1bmN0aW9uIiwKICAgICAgIltvYmplY3QgQXJyYXldIjogImFycmF5IiwKICAgICAgIltvYmplY3QgRGF0ZV0iOiAiZGF0ZSIsCiAgICAgICJbb2JqZWN0IFJlZ0V4cF0iOiAicmVnRXhwIiwKICAgICAgIltvYmplY3QgVW5kZWZpbmVkXSI6ICJ1bmRlZmluZWQiLAogICAgICAiW29iamVjdCBOdWxsXSI6ICJudWxsIiwKICAgICAgIltvYmplY3QgT2JqZWN0XSI6ICJvYmplY3QiCiAgICB9OwogICAgaWYgKG9iaiBpbnN0YW5jZW9mIEVsZW1lbnQpIHsKICAgICAgcmV0dXJuICJlbGVtZW50IjsKICAgIH0KICAgIHJldHVybiBtYXBbdG9TdHJpbmcuY2FsbChvYmopXTsKICB9LAogIGlzRW1wdHk6IGZ1bmN0aW9uIGlzRW1wdHkodmFsdWUpIHsKICAgIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHZhbHVlID09PSAiIikgewogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0gZWxzZSBpZiAodmFsdWUuY29uc3RydWN0b3IgPT0gT2JqZWN0KSB7CiAgICAgIHJldHVybiBPYmplY3Qua2V5cyh2YWx1ZSkubGVuZ3RoID09IDA7CiAgICB9IGVsc2UgaWYgKHZhbHVlLmNvbnN0cnVjdG9yID09IEFycmF5KSB7CiAgICAgIHJldHVybiB2YWx1ZS5sZW5ndGggPT0gMDsKICAgIH0KICAgIHJldHVybiBmYWxzZTsKICB9LAogIC8vIOino+aekFVSTOWcsOWdgO+8jOWmguaenHVybOWcsOWdgOWMheWQq+S6hiR7Zm9ybX3ov5nmoLfnmoTljaDkvY3nrKbvvIzkvJrmjInnhadzc28uanPkuK3phY3nva7nmoTlr7nlupTmnI3liqHnmoTlnLDlnYDmm7/mjaLjgIIKICBwYXJzZVVybDogZnVuY3Rpb24gcGFyc2VVcmwodXJsKSB7CiAgICBpZiAodXJsID09PSAiIikgcmV0dXJuOwogICAgdmFyIGN0eCA9IHdpbmRvdy5jb250ZXh0LAogICAgICByZWcgPSAvXihcJFx7KFx3KylcfSlcLy4qJC87CiAgICB2YXIgbWF0Y2ggPSByZWcuZXhlYyh1cmwpOwogICAgaWYgKG1hdGNoICE9IG51bGwpIHsKICAgICAgdmFyIG5hbWUgPSBtYXRjaFsyXSwKICAgICAgICBtYyA9IG1hdGNoWzFdLAogICAgICAgIHZhbCA9IGN0eFtuYW1lXTsKICAgICAgaWYgKCF2YWwpIHsKICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIlRoZSAnIiArIG5hbWUgKyAiJyBpbiB1cmw6IiArIHVybCArICIgZG9lcyBub3QgZGVmaW5lZCBpbiBjb250ZXh0IHByb3ZpZGVyLiIpOwogICAgICB9CiAgICAgIHJldHVybiB1cmwucmVwbGFjZShtYywgdmFsKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiB1cmw7CiAgICB9CiAgfSwKICAvLyDkvb/nlKhjdHjlr7nosaHkuK3nmoTlgLzmm7/mjaLmjolleHDkuK3miYDmnInnmoQke2tleX0KICBwYXJzZUV4cDogZnVuY3Rpb24gcGFyc2VFeHAoZXhwLCBjdHgpIHsKICAgIGlmICghZXhwIHx8IGV4cC5jb25zdHJ1Y3RvciAhPSBTdHJpbmcpIHJldHVybiBleHA7CiAgICBjdHggPSBjdHggfHwge307CiAgICB2YXIgcmVnID0gLyhcJFx7KFx3KylcfSkvLAogICAgICBtYXRjaCA9IG51bGwsCiAgICAgIGNvdW50ID0gMDsKICAgIHdoaWxlIChtYXRjaCA9IHJlZy5leGVjKGV4cCkpIHsKICAgICAgY291bnQrKzsKICAgICAgLy8g6YG/5YWN5q275b6q546vCiAgICAgIGlmIChjb3VudCA+IDk5OSkgewogICAgICAgIGJyZWFrOwogICAgICB9CiAgICAgIGlmIChtYXRjaCAhPSBudWxsKSB7CiAgICAgICAgZXhwID0gZXhwLnJlcGxhY2UobWF0Y2hbMV0sIGN0eC5oYXNPd25Qcm9wZXJ0eShtYXRjaFsyXSkgPyBjdHhbbWF0Y2hbMl1dIDogIiIpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gZXhwOwogIH0sCiAgLy8g6I635Y+W6ZqP5py655qE5ZCN56ewCiAgZ2V0TmFtZTogZnVuY3Rpb24gZ2V0TmFtZSgpIHsKICAgIHJldHVybiBNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zdWJzdHIoMiwgMTApOwogIH0sCiAgLy8g6I635Y+W5o6n5Lu25piv5ZCm5Y+v57yW6L6RCiAgZ2V0V3JpdGVhYmxlOiBmdW5jdGlvbiBnZXRXcml0ZWFibGUocGVybWlzc2lvbikgewogICAgaWYgKHBlcm1pc3Npb24gPT09ICduJyB8fCBwZXJtaXNzaW9uID09PSAncicpIHsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgcmV0dXJuIHRydWU7CiAgfSwKICAvLyDlkIjlubbpqozor4Hop4TliJko5aaC5p6ccnVsZXPlkoxhcHBlbmRSdWxlc+Wdh+S4uuWtl+espuS4suagvOW8j++8jOWQiOW5tuWQjuS7jeS4uuWtl+espuS4suagvOW8j++8m+WmguaenOWFtuS4reS4gOS4quS4uk9iamVjdOagvOW8j++8jOWQiOW5tuWQjuS4uk9iamVjdOagvOW8j+OAgikKICBtZXJnZVZhbGlkYXRlOiBmdW5jdGlvbiBtZXJnZVZhbGlkYXRlKHJ1bGVzLCBhcHBlbmRSdWxlcykgewogICAgaWYgKCFhcHBlbmRSdWxlcyB8fCBhcHBlbmRSdWxlcy5jb25zdHJ1Y3RvciAhPT0gT2JqZWN0ICYmIGFwcGVuZFJ1bGVzLmNvbnN0cnVjdG9yICE9PSBTdHJpbmcpIHsKICAgICAgcmV0dXJuIHJ1bGVzOwogICAgfQogICAgdmFyIHJ1bGVzVHlwZUlzU3RyaW5nID0gdHJ1ZSwKICAgICAgYXBwZW5kVHlwZUlzU3RyaW5nID0gYXBwZW5kUnVsZXMuY29uc3RydWN0b3IgPT09IFN0cmluZywKICAgICAgZmluYWxUeXBlSXNTdHJpbmcgPSB0cnVlOwogICAgaWYgKHJ1bGVzID09PSB1bmRlZmluZWQgfHwgcnVsZXMgPT09IG51bGwpIHsKICAgICAgcnVsZXNUeXBlSXNTdHJpbmcgPSBhcHBlbmRUeXBlSXNTdHJpbmc7CiAgICAgIHJ1bGVzID0gYXBwZW5kVHlwZUlzU3RyaW5nID8gIiIgOiB7fTsKICAgIH0gZWxzZSBpZiAocnVsZXMuY29uc3RydWN0b3IgPT09IE9iamVjdCB8fCBydWxlcy5jb25zdHJ1Y3RvciA9PT0gU3RyaW5nKSB7CiAgICAgIHJ1bGVzVHlwZUlzU3RyaW5nID0gcnVsZXMuY29uc3RydWN0b3IgPT09IFN0cmluZzsKICAgIH0gZWxzZSB7CiAgICAgIHRocm93ICJydWxlc1x1NzY4NFx1N0M3Qlx1NTc4Qlx1NEUzQSIuY29uY2F0KF90eXBlb2YocnVsZXMpLCAiXHVGRjBDXHU1M0VBXHU4MEZEXHU0RTNBT2JqZWN0XHU3QzdCXHU1NzhCXHU2MjE2U3RyaW5nXHU3QzdCXHU1NzhCXHUzMDAyIik7CiAgICB9CiAgICBmaW5hbFR5cGVJc1N0cmluZyA9IHJ1bGVzVHlwZUlzU3RyaW5nICYmIGFwcGVuZFR5cGVJc1N0cmluZzsKICAgIC8vIOS7jeeEtuS7pVN0cmluZ+agvOW8jwogICAgaWYgKGZpbmFsVHlwZUlzU3RyaW5nKSB7CiAgICAgIHZhciBydWxlQXJ5ID0gdXRpbHMuc3RyaW5nU3BsaXQocnVsZXMsICJ8Iik7CiAgICAgIHZhciBhcHBlbmRBcnkgPSB1dGlscy5zdHJpbmdTcGxpdChhcHBlbmRSdWxlcywgInwiKTsKICAgICAgdmFyIHJ1bGVPYmogPSB7fSwKICAgICAgICBhcHBlbmRPYmogPSB7fTsKICAgICAgcnVsZUFyeS5mb3JFYWNoKGZ1bmN0aW9uIChyKSB7CiAgICAgICAgdmFyIGsgPSB1dGlscy5zdHJpbmdTcGxpdChyLCAiOiIpWzBdOwogICAgICAgIHJ1bGVPYmpba10gPSByOwogICAgICB9KTsKICAgICAgYXBwZW5kQXJ5LmZvckVhY2goZnVuY3Rpb24gKGEpIHsKICAgICAgICB2YXIgayA9IHV0aWxzLnN0cmluZ1NwbGl0KGEsICI6IilbMF07CiAgICAgICAgYXBwZW5kT2JqW2tdID0gYTsKICAgICAgfSk7CiAgICAgIC8vIOWmguaenOaXp+inhOWImeS4reWtmOWcqOS4jui/veWKoOinhOWImeS4reeahOWQjOWQjeinhOWIme+8jOWImeS9v+eUqOi/veWKoOinhOWImeimhuebluaXp+inhOWImeOAggogICAgICB2YXIgbWVyZ2VPYmogPSBPYmplY3QuYXNzaWduKHJ1bGVPYmosIGFwcGVuZE9iaik7CiAgICAgIHJldHVybiBPYmplY3QudmFsdWVzKG1lcmdlT2JqKS5qb2luKCJ8Iik7CiAgICB9CiAgICAvLyDovazmjaLkuLpPYmplY3TmoLzlvI8KICAgIGVsc2UgewogICAgICB2YXIgX3J1bGVPYmogPSB7fSwKICAgICAgICBfYXBwZW5kT2JqID0ge307CiAgICAgIGlmIChydWxlc1R5cGVJc1N0cmluZykgewogICAgICAgIF9ydWxlT2JqID0gdXRpbHMudmFsaWRhdGVTdHJpbmcyT2JqZWN0KHJ1bGVzKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBfcnVsZU9iaiA9IF9vYmplY3RTcHJlYWQoe30sIHJ1bGVzKTsKICAgICAgfQogICAgICBpZiAoYXBwZW5kVHlwZUlzU3RyaW5nKSB7CiAgICAgICAgX2FwcGVuZE9iaiA9IHV0aWxzLnZhbGlkYXRlU3RyaW5nMk9iamVjdChhcHBlbmRSdWxlcyk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgX2FwcGVuZE9iaiA9IF9vYmplY3RTcHJlYWQoe30sIGFwcGVuZFJ1bGVzKTsKICAgICAgfQogICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihfcnVsZU9iaiwgX2FwcGVuZE9iaik7CiAgICB9CiAgfSwKICAvLyDlh4/lsJHmoKHpqozop4TliJkKICByZWR1Y2VWYWxpZGF0ZTogZnVuY3Rpb24gcmVkdWNlVmFsaWRhdGUocnVsZXMsIHJlZHVjZVJ1bGVzKSB7CiAgICBpZiAoIXJ1bGVzIHx8ICFyZWR1Y2VSdWxlcyB8fCByZWR1Y2VSdWxlcy5jb25zdHJ1Y3RvciAhPT0gT2JqZWN0ICYmIHJlZHVjZVJ1bGVzLmNvbnN0cnVjdG9yICE9PSBTdHJpbmcpIHsKICAgICAgcmV0dXJuIHJ1bGVzOwogICAgfQogICAgLy8g6KaB5YeP5bCR55qE5qCh6aqM6KeE5YiZ55qE5ZCN56ew6ZuG5ZCICiAgICB2YXIgcmVkdWNlUnVsZU5hbWVzID0gW107CiAgICBpZiAocmVkdWNlUnVsZXMuY29uc3RydWN0b3IgPT09IFN0cmluZykgewogICAgICB2YXIgcmVkdWNlUnVsZU9iaiA9IHV0aWxzLnZhbGlkYXRlU3RyaW5nMk9iamVjdChyZWR1Y2VSdWxlcyk7CiAgICAgIHJlZHVjZVJ1bGVOYW1lcyA9IE9iamVjdC5rZXlzKHJlZHVjZVJ1bGVPYmopOwogICAgfSBlbHNlIHsKICAgICAgcmVkdWNlUnVsZU5hbWVzID0gT2JqZWN0LmtleXMocmVkdWNlUnVsZXMpOwogICAgfQogICAgaWYgKHJ1bGVzLmNvbnN0cnVjdG9yID09PSBPYmplY3QpIHsKICAgICAgT2JqZWN0LmtleXMocnVsZXMpLmZvckVhY2goZnVuY3Rpb24gKGspIHsKICAgICAgICBpZiAocmVkdWNlUnVsZU5hbWVzLnNvbWUoZnVuY3Rpb24gKG4pIHsKICAgICAgICAgIHJldHVybiBuID09IGs7CiAgICAgICAgfSkpIHsKICAgICAgICAgIGRlbGV0ZSBydWxlc1trXTsKICAgICAgICB9CiAgICAgIH0pOwogICAgICByZXR1cm4gcnVsZXM7CiAgICB9IGVsc2UgaWYgKHJ1bGVzLmNvbnN0cnVjdG9yID09PSBTdHJpbmcpIHsKICAgICAgdmFyIHJ1bGVBcnkgPSB1dGlscy5zdHJpbmdTcGxpdChydWxlcywgInwiKTsKICAgICAgdmFyIG5SdWxlQXJ5ID0gcnVsZUFyeS5yZWR1Y2UoZnVuY3Rpb24gKGFyeSwgcikgewogICAgICAgIHZhciBuYW1lID0gdXRpbHMuc3RyaW5nU3BsaXQociwgIjoiKVswXTsKICAgICAgICBpZiAocmVkdWNlUnVsZU5hbWVzLmV2ZXJ5KGZ1bmN0aW9uIChtKSB7CiAgICAgICAgICByZXR1cm4gbSAhPSBuYW1lOwogICAgICAgIH0pKSB7CiAgICAgICAgICBhcnkucHVzaChyKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGFyeTsKICAgICAgfSwgW10pOwogICAgICByZXR1cm4gblJ1bGVBcnkuam9pbigifCIpOwogICAgfSBlbHNlIHsKICAgICAgdGhyb3cgInJ1bGVzXHU3Njg0XHU3QzdCXHU1NzhCXHU0RTNBIi5jb25jYXQoX3R5cGVvZihydWxlcyksICJcdUZGMENcdTUzRUFcdTgwRkRcdTRFM0FPYmplY3RcdTdDN0JcdTU3OEJcdTYyMTZTdHJpbmdcdTdDN0JcdTU3OEJcdTMwMDIiKTsKICAgIH0KICB9LAogIC8vIOWtl+espuS4suagvOW8j+eahOagoemqjOinhOWImei9rOS4uuWvueixoeagvOW8jwogIHZhbGlkYXRlU3RyaW5nMk9iamVjdDogZnVuY3Rpb24gdmFsaWRhdGVTdHJpbmcyT2JqZWN0KHJ1bGUpIHsKICAgIGlmICghcnVsZSB8fCBydWxlLmNvbnN0cnVjdG9yICE9PSBTdHJpbmcpIHsKICAgICAgcmV0dXJuIHJ1bGU7CiAgICB9CiAgICB2YXIgb2JqID0ge307CiAgICB2YXIgYXJ5ID0gdXRpbHMuc3RyaW5nU3BsaXQocnVsZSwgJ3wnKTsKICAgIGFyeS5mb3JFYWNoKGZ1bmN0aW9uIChtKSB7CiAgICAgIHZhciByZWdBbmRBcmdzID0gdXRpbHMuc3RyaW5nU3BsaXQobSwgJzonKTsKICAgICAgaWYgKHJlZ0FuZEFyZ3MubGVuZ3RoID09IDEpIHsKICAgICAgICBvYmpbcmVnQW5kQXJnc1swXV0gPSB0cnVlOwogICAgICB9IGVsc2UgaWYgKHJlZ0FuZEFyZ3MubGVuZ3RoID4gMSkgewogICAgICAgIHZhciBhcmdzID0gdXRpbHMuc3RyaW5nU3BsaXQocmVnQW5kQXJnc1sxXSwgIiwiKTsKICAgICAgICBvYmpbcmVnQW5kQXJnc1swXV0gPSBhcmdzOwogICAgICB9CiAgICB9KTsKICAgIHJldHVybiBvYmo7CiAgfSwKICAvLyDlrZfnrKbkuLJzdHLmjInnhadzZXDliIblibLkuLrmlbDnu4TvvIzlubbmuIXnkIbmjonmlbDnu4Tnu5PmnpzkuK3nmoTnqbrnmb3pobnjgIIKICBzdHJpbmdTcGxpdDogZnVuY3Rpb24gc3RyaW5nU3BsaXQoc3RyLCBzZXApIHsKICAgIGlmICghc3RyIHx8IHN0ci5jb25zdHJ1Y3RvciAhPT0gU3RyaW5nIHx8ICFzZXAgfHwgc2VwLmNvbnN0cnVjdG9yICE9PSBTdHJpbmcpIHsKICAgICAgcmV0dXJuIFtdOwogICAgfQogICAgdmFyIGFyeSA9IHN0ci5zcGxpdChzZXApOwogICAgYXJ5ID0gYXJ5Lm1hcChmdW5jdGlvbiAocCkgewogICAgICByZXR1cm4gcC50cmltKCk7CiAgICB9KTsKICAgIGFyeSA9IGFyeS50cmltKCk7CiAgICByZXR1cm4gYXJ5OwogIH0sCiAgLy8g6I635Y+W5o6n5Lu25piv5ZCm5re75Yqg5b+F5aGr5qCh6aqMCiAgYWRkUmVxdWlyZWRPck5vdDogZnVuY3Rpb24gYWRkUmVxdWlyZWRPck5vdChwZXJtaXNzaW9uLCB2YWxpZGF0ZSkgewogICAgaWYgKHBlcm1pc3Npb24gIT09ICdiJykgewogICAgICByZXR1cm4gdmFsaWRhdGU7CiAgICB9CiAgICBpZiAodmFsaWRhdGUgPT09IHVuZGVmaW5lZCB8fCB2YWxpZGF0ZSA9PT0gbnVsbCkgewogICAgICB2YWxpZGF0ZSA9ICIiOwogICAgfQogICAgcmV0dXJuIHV0aWxzLm1lcmdlVmFsaWRhdGUoInJlcXVpcmVkIiwgdmFsaWRhdGUpOwogIH0sCiAgLy8g5qC85byP5YyW5pel5pyf5pe26Ze0CiAgZm9ybWF0RGF0ZTogZnVuY3Rpb24gZm9ybWF0RGF0ZSh2YWx1ZSwgdHlwZSkgewogICAgdmFyIGRhdGUgPSBudWxsOwogICAgaWYgKCF2YWx1ZSkgewogICAgICByZXR1cm4gZGF0ZTsKICAgIH0KICAgIGlmICh2YWx1ZS5jb25zdHJ1Y3RvciA9PSBEYXRlICYmICFpc05hTih2YWx1ZS5nZXRUaW1lKCkpKSB7CiAgICAgIGRhdGUgPSB2YWx1ZTsKICAgIH0gZWxzZSBpZiAodmFsdWUuY29uc3RydWN0b3IgPT0gU3RyaW5nIHx8IHZhbHVlLmNvbnN0cnVjdG9yID09IE51bWJlcikgewogICAgICBkYXRlID0gbmV3IERhdGUodmFsdWUpOwogICAgfSBlbHNlIHsKICAgICAgdGhyb3cgIuagvOW8j+WMluaXpeacn+aXtu+8jOS8oOWFpeeahOaVsOaNruagvOW8j+S4jeato+ehruOAgiI7CiAgICB9CiAgICB2YXIgeSA9IGRhdGUuZ2V0RnVsbFllYXIoKTsKICAgIHZhciBNTSA9IGRhdGUuZ2V0TW9udGgoKSArIDE7CiAgICBNTSA9IE1NIDwgMTAgPyAnMCcgKyBNTSA6IE1NOwogICAgdmFyIGQgPSBkYXRlLmdldERhdGUoKTsKICAgIGQgPSBkIDwgMTAgPyAnMCcgKyBkIDogZDsKICAgIHZhciBoID0gZGF0ZS5nZXRIb3VycygpOwogICAgaCA9IGggPCAxMCA/ICcwJyArIGggOiBoOwogICAgdmFyIG0gPSBkYXRlLmdldE1pbnV0ZXMoKTsKICAgIG0gPSBtIDwgMTAgPyAnMCcgKyBtIDogbTsKICAgIHZhciBzID0gZGF0ZS5nZXRTZWNvbmRzKCk7CiAgICBzID0gcyA8IDEwID8gJzAnICsgcyA6IHM7CiAgICBpZiAodHlwZSA9PSAneWVhcicpIHsKICAgICAgcmV0dXJuIHk7CiAgICB9IGVsc2UgaWYgKHR5cGUgPT0gJ3llYXJNb250aCcpIHsKICAgICAgcmV0dXJuIHkgKyAnLScgKyBNTTsKICAgIH0gZWxzZSBpZiAodHlwZSA9PSAnZGF0ZScpIHsKICAgICAgcmV0dXJuIHkgKyAnLScgKyBNTSArICctJyArIGQ7CiAgICB9IGVsc2UgaWYgKHR5cGUgPT0gJ2RhdGVUaW1lJykgewogICAgICByZXR1cm4geSArICctJyArIE1NICsgJy0nICsgZCArICcgJyArIGggKyAnOicgKyBtICsgJzonICsgczsKICAgIH0KICB9LAogIC8vIOagvOW8j+WMluaXpeacnyAKICBmb3JtYXREYXRlWWVhcjogZnVuY3Rpb24gZm9ybWF0RGF0ZVllYXIodmFsdWUpIHsKICAgIHZhciBkYXRlID0gbmV3IERhdGUodmFsdWUpOwogICAgdmFyIHkgPSBkYXRlLmdldEZ1bGxZZWFyKCk7CiAgICB2YXIgTU0gPSBkYXRlLmdldE1vbnRoKCkgKyAxOwogICAgTU0gPSBNTSA8IDEwID8gJzAnICsgTU0gOiBNTTsKICAgIHZhciBkID0gZGF0ZS5nZXREYXRlKCk7CiAgICBkID0gZCA8IDEwID8gJzAnICsgZCA6IGQ7CiAgICByZXR1cm4geSArICctJyArIE1NICsgJy0nICsgZDsKICB9LAogIC8vIOaXpeacnzHmmK/lkKbml6nkuo7ml6XmnJ8yCiAgZGF0ZUlzQmVmb3JlOiBmdW5jdGlvbiBkYXRlSXNCZWZvcmUoZGF0ZU9uZSwgZGF0ZVR3bywgY2FuRXF1YWxzKSB7CiAgICBpZiAoIWRhdGVPbmUgfHwgIWRhdGVUd28pIHsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICB2YXIgZGF0ZTEgPSBuZXcgRGF0ZShkYXRlT25lKS5nZXRUaW1lKCkgfHwgbmV3IERhdGUobmV3IERhdGUoKS5mb3JtYXQoInl5eXktTU0tZGQiKSArICIgIiArIGRhdGVPbmUpLmdldFRpbWUoKTsKICAgIHZhciBkYXRlMiA9IG5ldyBEYXRlKGRhdGVUd28pLmdldFRpbWUoKSB8fCBuZXcgRGF0ZShuZXcgRGF0ZSgpLmZvcm1hdCgieXl5eS1NTS1kZCIpICsgIiAiICsgZGF0ZVR3bykuZ2V0VGltZSgpOwogICAgaWYgKCFjYW5FcXVhbHMpIHsKICAgICAgLy/lpKfkuo7jgIJ2Mj52MSDjgIIKICAgICAgaWYgKGRhdGUyID4gZGF0ZTEpIHsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfSBlbHNlIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIC8v5aSn5LqO562J5LqO44CCdjI+PXYxIOOAguWPquimgXYx5LiN5aSn5LqOdjLljbPlj68KICAgICAgaWYgKGRhdGUxID4gZGF0ZTIpIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0KICAgIH0KICB9LAogIC8vIOaXpeacn+iuoeeul++8jOS4jeS8oOWNleS9jeaXtu+8jOm7mOiupOS7pSflpKkn5Li65Y2V5L2N6K6h566XCiAgZGF0ZUNhbGM6IGZ1bmN0aW9uIGRhdGVDYWxjKHN0YXJ0RGF0ZSwgZW5kRGF0ZSwgb3ApIHsKICAgIGlmICghc3RhcnREYXRlIHx8ICFlbmREYXRlIHx8IHN0YXJ0RGF0ZS5sZW5ndGggPT0gMCB8fCBlbmREYXRlLmxlbmd0aCA9PSAwKSB7CiAgICAgIHJldHVybiAwOwogICAgfQogICAgaWYgKCFvcCB8fCBvcC5jb25zdHJ1Y3RvciAhPSBTdHJpbmcpIHsKICAgICAgb3AgPSAiZGF5IjsKICAgIH0KICAgIHZhciBvcEFyeSA9IFsneWVhcicsICdtb250aCcsICdkYXknLCAnaG91cicsICdtaW51dGUnLCAnc2Vjb25kJ107CiAgICBpZiAob3BBcnkuaW5kZXhPZihvcCkgPT0gLTEpIHsKICAgICAgdGhyb3cgIlx1OEJBMVx1N0I5N1x1NjVFNVx1NjcxRlx1NzY4NFx1NTM1NVx1NEY0RFx1NTNFQVx1ODBGRFx1NEVDRSIuY29uY2F0KG9wQXJ5LCAiXHU0RTJEXHU5MDA5XHU2MkU5Iik7CiAgICB9CiAgICB2YXIgZGF0ZTEgPSBuZXcgRGF0ZShEYXRlLnBhcnNlKHN0YXJ0RGF0ZS5yZXBsYWNlKC8tL2csICIvIikpKS5nZXRUaW1lKCk7CiAgICB2YXIgZGF0ZTIgPSBuZXcgRGF0ZShEYXRlLnBhcnNlKGVuZERhdGUucmVwbGFjZSgvLS9nLCAiLyIpKSkuZ2V0VGltZSgpOwogICAgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKGRhdGUxKSB8fCAhTnVtYmVyLmlzSW50ZWdlcihkYXRlMikpIHsKICAgICAgdmFyIG5vdyA9IG5ldyBEYXRlKCk7CiAgICAgIHZhciBub3dTdHIgPSBub3cuZ2V0RnVsbFllYXIoKSArICcvJyArIChub3cuZ2V0TW9udGgoKSArIDEpICsgJy8nICsgbm93LmdldERhdGUoKTsKICAgICAgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKGRhdGUxKSkgewogICAgICAgIGRhdGUxID0gbmV3IERhdGUoIiIuY29uY2F0KG5vd1N0ciwgIiAiKS5jb25jYXQoc3RhcnREYXRlKSkuZ2V0VGltZSgpOwogICAgICB9CiAgICAgIGlmICghTnVtYmVyLmlzSW50ZWdlcihkYXRlMSkpIHsKICAgICAgICBkYXRlMiA9IG5ldyBEYXRlKCIiLmNvbmNhdChub3dTdHIsICIgIikuY29uY2F0KGVuZERhdGUpKS5nZXRUaW1lKCk7CiAgICAgIH0KICAgICAgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKGRhdGUxKSB8fCAhTnVtYmVyLmlzSW50ZWdlcihkYXRlMikpIHsKICAgICAgICByZXR1cm4gMDsKICAgICAgfQogICAgfQogICAgdmFyIHJlcyA9IDA7CiAgICB2YXIgZGF5cyA9IGRhdGUyIC0gZGF0ZTE7CiAgICBzd2l0Y2ggKG9wKSB7CiAgICAgIGNhc2UgInllYXIiOgogICAgICAgIHJlcyA9IHBhcnNlSW50KGRheXMgLyAoMTAwMCAqIDYwICogNjAgKiAyNCAqIDMwICogMTIpKTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSAibW9udGgiOgogICAgICAgIHJlcyA9IHBhcnNlSW50KGRheXMgLyAoMTAwMCAqIDYwICogNjAgKiAyNCAqIDMwKSk7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgImRheSI6CiAgICAgICAgcmVzID0gcGFyc2VJbnQoZGF5cyAvICgxMDAwICogNjAgKiA2MCAqIDI0KSk7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgImhvdXIiOgogICAgICAgIHJlcyA9IHBhcnNlSW50KGRheXMgLyAoMTAwMCAqIDYwICogNjApKTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSAibWludXRlIjoKICAgICAgICByZXMgPSBwYXJzZUludChkYXlzIC8gKDEwMDAgKiA2MCkpOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlICJzZWNvbmQiOgogICAgICAgIHJlcyA9IHBhcnNlSW50KGRheXMgLyAxMDAwKTsKICAgIH0KICAgIHJldHVybiByZXM7CiAgfSwKICBuZXN0MnRpbGU6IGZ1bmN0aW9uIG5lc3QydGlsZShhcnIsIGNoaWxkcmVuS2V5LCBvYnRhaW5DaGlsZHJlbikgewogICAgdmFyIF9yZWY7CiAgICBpZiAoIWNoaWxkcmVuS2V5KSB7CiAgICAgIGNoaWxkcmVuS2V5ID0gImNoaWxkcmVuIjsKICAgIH0KICAgIHJldHVybiAoX3JlZiA9IFtdKS5jb25jYXQuYXBwbHkoX3JlZiwgX3RvQ29uc3VtYWJsZUFycmF5KGFyci5tYXAoZnVuY3Rpb24gKGl0ZW0pIHsKICAgICAgdmFyIF9yZWYyOwogICAgICB2YXIgX2l0ZW0gPSBfb2JqZWN0U3ByZWFkKHt9LCBpdGVtKTsKICAgICAgaWYgKG9idGFpbkNoaWxkcmVuID09IHVuZGVmaW5lZCB8fCBvYnRhaW5DaGlsZHJlbiA9PSBmYWxzZSkgewogICAgICAgIGRlbGV0ZSBfaXRlbVtjaGlsZHJlbktleV07CiAgICAgIH0KICAgICAgcmV0dXJuIChfcmVmMiA9IFtdKS5jb25jYXQuYXBwbHkoX3JlZjIsIFtfaXRlbV0uY29uY2F0KF90b0NvbnN1bWFibGVBcnJheSh1dGlscy5uZXN0MnRpbGUoaXRlbVtjaGlsZHJlbktleV0pKSkpOwogICAgfSkpKTsKICB9LAogIC8vIOW5s+mTuue7k+aehOi9rOW1jOWll+e7k+aehAogIHRpbGUybmVzdDogZnVuY3Rpb24gdGlsZTJuZXN0KGFycmF5LCBrZXksIHBLZXksIGNoaWxkcmVuS2V5KSB7CiAgICBpZiAoIWFycmF5IHx8IGFycmF5LmNvbnN0cnVjdG9yICE9PSBBcnJheSkgewogICAgICByZXR1cm4gYXJyYXk7CiAgICB9CiAgICAvLyDlpI3liLbkuIDku73vvIzpgb/lhY3kv67mlLnljp/lp4vmlbDnu4QKICAgIHZhciBhcnkgPSBfdG9Db25zdW1hYmxlQXJyYXkoYXJyYXkpOwogICAga2V5ID0ga2V5IHx8ICJpZCI7CiAgICBwS2V5ID0gcEtleSB8fCAicGFyZW50SWQiOwogICAgY2hpbGRyZW5LZXkgPSBjaGlsZHJlbktleSB8fCAiY2hpbGRyZW4iOwogICAgLy8g5a6a5LmJ5LiA5Liq5b6F56e76Zmk5pWw57uECiAgICB2YXIgYXJ5MnJlbW92ZSA9IFtdOwogICAgYXJ5Lm1hcChmdW5jdGlvbiAoaXRlbSkgewogICAgICBpZiAoaXRlbVtrZXldICE9PSBpdGVtW3BLZXldKSB7CiAgICAgICAgLy8g5om+54i26IqC54K5CiAgICAgICAgdmFyIHAgPSBhcnkuZmlsdGVyKGZ1bmN0aW9uIChjKSB7CiAgICAgICAgICByZXR1cm4gY1trZXldID09PSBpdGVtW3BLZXldOwogICAgICAgIH0pOwogICAgICAgIGlmIChwICYmIHAubGVuZ3RoID09IDEpIHsKICAgICAgICAgIHBbMF1bY2hpbGRyZW5LZXldID0gcFswXVtjaGlsZHJlbktleV0gfHwgW107CiAgICAgICAgICAvLyDlsIblrZDoioLngrnmlL7liLDniLboioLngrnkuK0KICAgICAgICAgIHBbMF1bY2hpbGRyZW5LZXldLnB1c2goaXRlbSk7CiAgICAgICAgICBhcnkycmVtb3ZlLnB1c2goaXRlbVtrZXldKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0pOwogICAgLy8g6YGN5Y6G56e76Zmk5b6F5Yig6Zmk5a+56LGhCiAgICBhcnkycmVtb3ZlLm1hcChmdW5jdGlvbiAoaXRlbSkgewogICAgICBhcnkgPSBhcnkuZmlsdGVyKGZ1bmN0aW9uIChjKSB7CiAgICAgICAgcmV0dXJuIGNba2V5XSAhPT0gaXRlbTsKICAgICAgfSk7CiAgICB9KTsKICAgIHJldHVybiBhcnk7CiAgfSwKICAvLyDojrflj5bmjqfku7bmiYDlnKjooajljZXlr7nlupTnmoTlrp7kvovlr7nosaEKICBnZXRPbmxpbmVGb3JtSW5zdGFuY2U6IGZ1bmN0aW9uIGdldE9ubGluZUZvcm1JbnN0YW5jZShpbnN0YW5jZSkgewogICAgaWYgKGluc3RhbmNlID09IGluc3RhbmNlLiRyb290KSB7CiAgICAgIHJldHVybiBpbnN0YW5jZTsKICAgIH0KICAgIGlmICghaW5zdGFuY2UpIHsKICAgICAgdGhyb3cgIlZ1ZUNvbXBvbmVudOWunuS+i+S4uuepui4iOwogICAgfQogICAgaWYgKGluc3RhbmNlLmhhc093blByb3BlcnR5KCJ3YXRjaE1hcCIpKSB7CiAgICAgIHJldHVybiBpbnN0YW5jZTsKICAgIH0gZWxzZSBpZiAoaW5zdGFuY2UuJHBhcmVudCkgewogICAgICByZXR1cm4gdXRpbHMuZ2V0T25saW5lRm9ybUluc3RhbmNlKGluc3RhbmNlLiRwYXJlbnQpOwogICAgfQogIH0sCiAgLy8g6I635Y+W5a2Q6KGo5q+P5LiA6KGM5omA5Zyo55qE5L2c55So5Z+f5YWD57Sg5Y+K57Si5byVCiAgZ2V0U3ViU2NvcGVFbEFuZEluZGV4OiBmdW5jdGlvbiBnZXRTdWJTY29wZUVsQW5kSW5kZXgoZWwpIHsKICAgIHZhciBzdWJTY29wZUVsID0gdXRpbHMuZ2V0UGFyZW50RWxlbWVudEJ5QXR0cmlidXRlKGVsLCAiZGF0YS1zdWJuYW1lIik7CiAgICBpZiAoIXN1YlNjb3BlRWwpIHsKICAgICAgcmV0dXJuIHsKICAgICAgICBzdWJTY29wZUVsOiBudWxsLAogICAgICAgIGluZGV4OiBudWxsCiAgICAgIH07CiAgICB9CiAgICB2YXIgaW5kZXggPSBzdWJTY29wZUVsLmRhdGFzZXRbImluZGV4Il07CiAgICBpZiAoaW5kZXggPT09IHVuZGVmaW5lZCkgewogICAgICB0aHJvdyAi6KaB6K6h566X55qE5a2Q6KGo6KGM5pyq6I635Y+W5YiwaW5kZXjlsZ7mgKcuIjsKICAgIH0KICAgIGluZGV4ID0gTnVtYmVyLnBhcnNlSW50KGluZGV4KTsKICAgIHJldHVybiB7CiAgICAgIHN1YlNjb3BlRWw6IHN1YlNjb3BlRWwsCiAgICAgIGluZGV4OiBpbmRleAogICAgfTsKICB9LAogIC8vIOWcqOWtkOihqOaMh+WumuihjOS4remAmui/h3YtbW9kZWzooajovr7lvI/ojrflj5ZpbnB1dOWvueW6lOeahHZ1ZeWunuS+iwogIGdldFN1YklucHV0U2NvcGVCeU1vZGVsRXhwcmVzc2lvbjogZnVuY3Rpb24gZ2V0U3ViSW5wdXRTY29wZUJ5TW9kZWxFeHByZXNzaW9uKHN1YlNjb3BlRWwsIGV4cHJlc3Npb24pIHsKICAgIHZhciBpbnB1dEFyeSA9IHN1YlNjb3BlRWwuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiaW5wdXRzIik7CiAgICB2YXIgcmVzdWx0ID0gbnVsbDsKICAgIGZvciAodmFyIGkgPSAwLCBjOyBjID0gaW5wdXRBcnlbaSsrXTspIHsKICAgICAgdmFyIGV4cHJlc3Npb25OYW1lID0gYy5fX3Z1ZV9fLiR2bm9kZS5kYXRhLm1vZGVsLmV4cHJlc3Npb247CiAgICAgIC8vIOWFvOWuuWZyb25056uv5L2/55SoCiAgICAgIGlmIChjLl9fdnVlX18uJHZub2RlICYmIGMuX192dWVfXy4kdm5vZGUuY29tcG9uZW50T3B0aW9ucyAmJiBjLl9fdnVlX18uJHZub2RlLmNvbXBvbmVudE9wdGlvbnMucHJvcHNEYXRhICYmIGMuX192dWVfXy4kdm5vZGUuY29tcG9uZW50T3B0aW9ucy5wcm9wc0RhdGEubW9kZWxFeHByZXNzaW9uKSB7CiAgICAgICAgZXhwcmVzc2lvbk5hbWUgPSBjLl9fdnVlX18uJHZub2RlLmNvbXBvbmVudE9wdGlvbnMucHJvcHNEYXRhLm1vZGVsRXhwcmVzc2lvbjsKICAgICAgfQogICAgICBpZiAoYyAmJiBjLl9fdnVlX18gJiYgYy5fX3Z1ZV9fLiR2bm9kZS5kYXRhLm1vZGVsICYmIGV4cHJlc3Npb25OYW1lID09PSBleHByZXNzaW9uKSB7CiAgICAgICAgcmVzdWx0ID0gYy5fX3Z1ZV9fOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gcmVzdWx0OwogIH0sCiAgLy8g6I635Y+W5Zyo57q/6KGo5Y2V55qEanNvbuagvOW8j+Wtl+espuS4sueahOihqOWNleaVsOaNrih2YWxpZGF0ZeWPguaVsOWGs+WumuaYr+WQpumcgOimgeWvueihqOWNlei/m+ihjOmqjOivgSkKICB2YWxpZGF0ZUZvcm06IGZ1bmN0aW9uIHZhbGlkYXRlRm9ybShpbnN0YW5jZSwgc2NvcGVOYW1lKSB7CiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgewogICAgICBpbnN0YW5jZS4kcm9vdC4kdmFsaWRhdG9yLnZhbGlkYXRlQWxsKHNjb3BlTmFtZSkudGhlbihmdW5jdGlvbiAocmVzdWx0KSB7CiAgICAgICAgaWYgKHJlc3VsdCkgewogICAgICAgICAgcmVzb2x2ZShyZXN1bHQpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICByZWplY3QoaW5zdGFuY2UuJHJvb3QuJHZhbGlkYXRvci5lcnJvcnMuaXRlbXMpOwogICAgICAgIH0KICAgICAgfSk7CiAgICB9KTsKICB9LAogIC8vIOiOt+WPluaMh+WummRvbeWFg+e0oOeahOeItue6p+S4reWFt+acieaMh+WumuWxnuaAp+eahGRvbeWFg+e0oAogIGdldFBhcmVudEVsZW1lbnRCeUF0dHJpYnV0ZTogZnVuY3Rpb24gZ2V0UGFyZW50RWxlbWVudEJ5QXR0cmlidXRlKGVsLCBhdHRyaWJ1dGUpIHsKICAgIGlmIChlbCA9PT0gbnVsbCB8fCBlbCA9PT0gdW5kZWZpbmVkKSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgaWYgKCFlbC5oYXNBdHRyaWJ1dGUgfHwgdHlwZW9mIGVsLmhhc0F0dHJpYnV0ZSAhPSAnZnVuY3Rpb24nKSB7CiAgICAgIHRocm93ICLkvKDlhaXnmoTlhYPntKBlbOS4jeiDveS4uuepuuS4lOW/hemhu+S4ukhUTUxIdG1sRWxlbWVudOexu+Weiy4iOwogICAgfQogICAgaWYgKCFhdHRyaWJ1dGUgfHwgYXR0cmlidXRlLmNvbnN0cnVjdG9yICE9PSBTdHJpbmcpIHsKICAgICAgdGhyb3cgIuS8oOWFpeeahOWxnuaAp2F0dHJpYnV0ZeS4jeiDveS4uuepuuS4lOW/hemhu+S4ulN0cmluZ+exu+Weiy4iOwogICAgfQogICAgaWYgKGVsLmhhc0F0dHJpYnV0ZShhdHRyaWJ1dGUpKSB7CiAgICAgIHJldHVybiBlbDsKICAgIH0gZWxzZSBpZiAoZWwudGFnTmFtZSA9PT0gJ0hUTUwnKSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIHV0aWxzLmdldFBhcmVudEVsZW1lbnRCeUF0dHJpYnV0ZShlbC5wYXJlbnRFbGVtZW50LCBhdHRyaWJ1dGUpOwogICAgfQogIH0sCiAgLy8g5LuO54i257qnZG9t5YWD57Sg5Lit6I635Y+W5oyH5a6a5bGe5oCn55qE5YC8CiAgZ2V0U29tZUF0dHJpYnV0ZUZyb21QYXJlbnRFbGVtZW50OiBmdW5jdGlvbiBnZXRTb21lQXR0cmlidXRlRnJvbVBhcmVudEVsZW1lbnQoZWwsIGF0dHJpYnV0ZSkgewogICAgdmFyIHBFbCA9IHV0aWxzLmdldFBhcmVudEVsZW1lbnRCeUF0dHJpYnV0ZShlbCwgYXR0cmlidXRlKTsKICAgIGlmIChwRWwgJiYgcEVsLmdldEF0dHJpYnV0ZSAmJiBwRWwuZ2V0QXR0cmlidXRlLmNvbnN0cnVjdG9yID09PSBGdW5jdGlvbikgewogICAgICByZXR1cm4gcEVsLmdldEF0dHJpYnV0ZShhdHRyaWJ1dGUpOwogICAgfQogICAgcmV0dXJuIG51bGw7CiAgfSwKICAvLyDlsIblrZDooajlsZ7mgKfot6/lvoTovazmjaLkuLrlrozmlbTnmoTlsZ7mgKfot6/lvoTvvIzkvovlpoLvvJppdGVtLm5hbWUgPT4gZGF0YS5zdWJbMF0ubmFtZQogIGdldFdob2xlUGF0aE9mU3ViOiBmdW5jdGlvbiBnZXRXaG9sZVBhdGhPZlN1YihzdWJQYXRoLCBtYWluUGF0aCwgaW5kZXgpIHsKICAgIGlmICghc3ViUGF0aCB8fCAhbWFpblBhdGggfHwgaW5kZXggPT09IG51bGwgfHwgIU51bWJlci5pc0ludGVnZXIoaW5kZXgpKSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgdmFyIG1hdGNoID0gc3ViUGF0aC5zcGxpdCgnLicpOwogICAgaWYgKG1hdGNoICYmIG1hdGNoLmxlbmd0aCA+IDEpIHsKICAgICAgcmV0dXJuICIiLmNvbmNhdChtYWluUGF0aCwgIlsiKS5jb25jYXQoaW5kZXgsICJdLiIpLmNvbmNhdChtYXRjaFttYXRjaC5sZW5ndGggLSAxXSk7CiAgICB9CiAgICByZXR1cm4gbnVsbDsKICB9LAogIC8vIOmAmui/h+i3r+W+hOWPluW+l+WvueixoeS4reeahOWxnuaApwogIGdldFZhbHVlQnlQYXRoOiBmdW5jdGlvbiBnZXRWYWx1ZUJ5UGF0aChvYmosIHBhdGgsIHN1YkluZGV4KSB7CiAgICBpZiAoIW9iaiB8fCAhcGF0aCB8fCBwYXRoLmNvbnN0cnVjdG9yICE9IFN0cmluZykgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIGlmICghL15cdz8uKltcd3xcXV0kLy50ZXN0KHBhdGgpKSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgdmFyIHBhdGhBcnkgPSBwYXRoLnNwbGl0KCIuIik7CiAgICBpZiAocGF0aEFyeS5sZW5ndGggPT0gMSkgewogICAgICByZXR1cm4gb2JqW3BhdGhdOwogICAgfSBlbHNlIGlmIChwYXRoQXJ5Lmxlbmd0aCA+IDEpIHsKICAgICAgdmFyIHJldCA9IG9iajsKICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwYXRoQXJ5Lmxlbmd0aDsgaSsrKSB7CiAgICAgICAgaWYgKHJldCA9PT0gbnVsbCB8fCByZXQgPT09IHVuZGVmaW5lZCkgewogICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQogICAgICAgIHZhciBrZXkgPSBwYXRoQXJ5W2ldOwogICAgICAgIHZhciBtYXRjaCA9IC9eKFx3KylcWyhcZCspXF0kLy5leGVjKGtleSk7CiAgICAgICAgaWYgKG1hdGNoKSB7CiAgICAgICAgICByZXQgPSByZXRbbWF0Y2hbMV1dW21hdGNoWzJdXTsKICAgICAgICB9IGVsc2UgaWYgKHJldCAmJiByZXQuY29uc3RydWN0b3IgPT09IEFycmF5KSB7CiAgICAgICAgICB2YXIgaW5kZXggPSAwOwogICAgICAgICAgaWYgKHN1YkluZGV4ICE9IG51bGwgJiYgc3ViSW5kZXggIT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgIHZhciBwcmVJbmRleCA9IE51bWJlci5wYXJzZUludChzdWJJbmRleCk7CiAgICAgICAgICAgIGlmICghaXNOYU4ocHJlSW5kZXgpKSB7CiAgICAgICAgICAgICAgaW5kZXggPSBwcmVJbmRleDsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgcmV0ID0gcmV0W2luZGV4XVtrZXldOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICByZXQgPSByZXRba2V5XTsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIHJldDsKICAgIH0KICAgIHJldHVybiBudWxsOwogIH0sCiAgLy8g6YCa6L+H6Lev5b6E6K6+572u5a+56LGh5Lit55qE5bGe5oCnCiAgc2V0VmFsdWVCeVBhdGg6IGZ1bmN0aW9uIHNldFZhbHVlQnlQYXRoKG9iaiwgcGF0aCwgdmFsdWUsIHN1YkluZGV4KSB7CiAgICBpZiAoIW9iaiB8fCAhcGF0aCB8fCBwYXRoLmNvbnN0cnVjdG9yICE9IFN0cmluZykgewogICAgICByZXR1cm47CiAgICB9CiAgICBpZiAoIS9eXHc/LipbXHd8XF1dJC8udGVzdChwYXRoKSkgewogICAgICByZXR1cm47CiAgICB9CiAgICB2YXIgcGF0aEFyeSA9IHBhdGguc3BsaXQoIi4iKTsKICAgIGlmIChwYXRoQXJ5Lmxlbmd0aCA9PSAxKSB7CiAgICAgIG9ialtwYXRoXSA9IHZhbHVlOwogICAgfSBlbHNlIGlmIChwYXRoQXJ5Lmxlbmd0aCA+IDEpIHsKICAgICAgdmFyIHJldCA9IG9iajsKICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwYXRoQXJ5Lmxlbmd0aDsgaSsrKSB7CiAgICAgICAgdmFyIGtleSA9IHBhdGhBcnlbaV07CiAgICAgICAgdmFyIG1hdGNoID0gL14oXHcrKVxbKFxkKylcXSQvLmV4ZWMoa2V5KTsKICAgICAgICBpZiAoaSA9PSBwYXRoQXJ5Lmxlbmd0aCAtIDEpIHsKICAgICAgICAgIGlmIChtYXRjaCkgewogICAgICAgICAgICByZXRbbWF0Y2hbMV1dW21hdGNoWzJdXSA9IHZhbHVlOwogICAgICAgICAgfSBlbHNlIGlmIChyZXQgJiYgcmV0LmNvbnN0cnVjdG9yID09PSBBcnJheSkgewogICAgICAgICAgICB2YXIgaW5kZXggPSAwOwogICAgICAgICAgICBpZiAoc3ViSW5kZXggIT0gbnVsbCAmJiBzdWJJbmRleCAhPSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgICB2YXIgcHJlSW5kZXggPSBOdW1iZXIucGFyc2VJbnQoc3ViSW5kZXgpOwogICAgICAgICAgICAgIGlmICghaXNOYU4ocHJlSW5kZXgpKSB7CiAgICAgICAgICAgICAgICBpbmRleCA9IHByZUluZGV4OwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICByZXRbaW5kZXhdW2tleV0gPSB2YWx1ZTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHJldFtrZXldID0gdmFsdWU7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGlmIChtYXRjaCkgewogICAgICAgICAgICByZXQgPSByZXRbbWF0Y2hbMV1dW21hdGNoWzJdXTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHJldCA9IHJldFtrZXldOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfQogIH0sCiAgLyoqDQogICog5bCG5a2X56ym5Liy6L2s5Li6anNvbuWvueixoeOAgg0KICAqIEBwYXJhbSBqc29uU3RyDQogICogQHBhcmFtIHR5cGUgIOWPr+S4jeWhq+WGmXBhcnNlVG9Kc29uDQogICogQHJldHVybnMNCiAgKi8KICBwYXJzZVRvSnNvbjogZnVuY3Rpb24gcGFyc2VUb0pzb24oanNvblN0ciwgdHlwZSkgewogICAgdHlwZSA9IHR5cGUgfHwgMTsKICAgIGlmICghanNvblN0ciB8fCBqc29uU3RyID09PSAiIiB8fCB0eXBlID4gMykgcmV0dXJuIG51bGw7CiAgICB0cnkgewogICAgICBzd2l0Y2ggKHR5cGUpIHsKICAgICAgICBjYXNlIDE6CiAgICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShqc29uU3RyKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMjoKICAgICAgICAgIHJldHVybiBldmFsKCIoIi5jb25jYXQoanNvblN0ciwgIikiKSk7CiAgICAgICAgICBicmVhazsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgdGhyb3cgIuino+aekGpzb27lr7nosaHplJnor68iOwogICAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgcmV0dXJuIHV0aWxzLnBhcnNlVG9Kc29uKGpzb25TdHIsIHR5cGUgKyAxKTsKICAgIH0KICB9LAogIC8qKg0KICAqIOWwhuaVsOWtl+i9rOaNouaIkOS6uuWQjeW4geWkp+WGmeOAgg0KICAqIA0KICAqIEBwYXJhbSBjdXJyZW5jeURpZ2l0cw0KICAqIEByZXR1cm5zDQogICovCiAgY29udmVydEN1cnJlbmN5OiBmdW5jdGlvbiBjb252ZXJ0Q3VycmVuY3koY3VycmVuY3lEaWdpdHMpIHsKICAgIHZhciBNQVhJTVVNX05VTUJFUiA9IDk5OTk5OTk5OTk5Ljk5OwogICAgdmFyIENOX1pFUk8gPSAi6Zu2IjsKICAgIHZhciBDTl9PTkUgPSAi5aO5IjsKICAgIHZhciBDTl9UV08gPSAi6LSwIjsKICAgIHZhciBDTl9USFJFRSA9ICLlj4EiOwogICAgdmFyIENOX0ZPVVIgPSAi6IKGIjsKICAgIHZhciBDTl9GSVZFID0gIuS8jSI7CiAgICB2YXIgQ05fU0lYID0gIumZhiI7CiAgICB2YXIgQ05fU0VWRU4gPSAi5p+SIjsKICAgIHZhciBDTl9FSUdIVCA9ICLmjYwiOwogICAgdmFyIENOX05JTkUgPSAi546WIjsKICAgIHZhciBDTl9URU4gPSAi5ou+IjsKICAgIHZhciBDTl9IVU5EUkVEID0gIuS9sCI7CiAgICB2YXIgQ05fVEhPVVNBTkQgPSAi5LufIjsKICAgIHZhciBDTl9URU5fVEhPVVNBTkQgPSAi5LiHIjsKICAgIHZhciBDTl9IVU5EUkVEX01JTExJT04gPSAi5Lq/IjsKICAgIHZhciBDTl9TWU1CT0wgPSAiIjsKICAgIHZhciBDTl9ET0xMQVIgPSAi5YWDIjsKICAgIHZhciBDTl9URU5fQ0VOVCA9ICLop5IiOwogICAgdmFyIENOX0NFTlQgPSAi5YiGIjsKICAgIHZhciBDTl9JTlRFR0VSID0gIuaVtCI7CiAgICB2YXIgaW50ZWdyYWw7CiAgICB2YXIgZGVjaW1hbDsKICAgIHZhciBvdXRwdXRDaGFyYWN0ZXJzOwogICAgdmFyIHBhcnRzOwogICAgdmFyIGRpZ2l0cywgcmFkaWNlcywgYmlnUmFkaWNlcywgZGVjaW1hbHM7CiAgICB2YXIgemVyb0NvdW50OwogICAgdmFyIGksIHAsIGQ7CiAgICB2YXIgcXVvdGllbnQsIG1vZHVsdXM7CiAgICBjdXJyZW5jeURpZ2l0cyA9IGN1cnJlbmN5RGlnaXRzLnRvU3RyaW5nKCk7CiAgICBpZiAoY3VycmVuY3lEaWdpdHMgPT0gIiIpIHsKICAgICAgcmV0dXJuICIiOwogICAgfQogICAgaWYgKGN1cnJlbmN5RGlnaXRzLm1hdGNoKC9bXiwuXGRdLykgIT0gbnVsbCkgewogICAgICByZXR1cm4gIiI7CiAgICB9CiAgICBpZiAoY3VycmVuY3lEaWdpdHMubWF0Y2goL14oKFxkezEsM30oLFxkezN9KSooLigoXGR7M30sKSpcZHsxLDN9KSk/KXwoXGQrKC5cZCspPykpJC8pID09IG51bGwpIHsKICAgICAgcmV0dXJuICIiOwogICAgfQogICAgY3VycmVuY3lEaWdpdHMgPSBjdXJyZW5jeURpZ2l0cy5yZXBsYWNlKC8sL2csICIiKTsKICAgIGN1cnJlbmN5RGlnaXRzID0gY3VycmVuY3lEaWdpdHMucmVwbGFjZSgvXjArLywgIiIpOwogICAgaWYgKE51bWJlcihjdXJyZW5jeURpZ2l0cykgPiBNQVhJTVVNX05VTUJFUikgewogICAgICByZXR1cm4gIiI7CiAgICB9CiAgICBwYXJ0cyA9IGN1cnJlbmN5RGlnaXRzLnNwbGl0KCIuIik7CiAgICBpZiAocGFydHMubGVuZ3RoID4gMSkgewogICAgICBpbnRlZ3JhbCA9IHBhcnRzWzBdOwogICAgICBkZWNpbWFsID0gcGFydHNbMV07CiAgICAgIGRlY2ltYWwgPSBkZWNpbWFsLnN1YnN0cigwLCAyKTsKICAgIH0gZWxzZSB7CiAgICAgIGludGVncmFsID0gcGFydHNbMF07CiAgICAgIGRlY2ltYWwgPSAiIjsKICAgIH0KICAgIGRpZ2l0cyA9IG5ldyBBcnJheShDTl9aRVJPLCBDTl9PTkUsIENOX1RXTywgQ05fVEhSRUUsIENOX0ZPVVIsIENOX0ZJVkUsIENOX1NJWCwgQ05fU0VWRU4sIENOX0VJR0hULCBDTl9OSU5FKTsKICAgIHJhZGljZXMgPSBuZXcgQXJyYXkoIiIsIENOX1RFTiwgQ05fSFVORFJFRCwgQ05fVEhPVVNBTkQpOwogICAgYmlnUmFkaWNlcyA9IG5ldyBBcnJheSgiIiwgQ05fVEVOX1RIT1VTQU5ELCBDTl9IVU5EUkVEX01JTExJT04pOwogICAgZGVjaW1hbHMgPSBuZXcgQXJyYXkoQ05fVEVOX0NFTlQsIENOX0NFTlQpOwogICAgb3V0cHV0Q2hhcmFjdGVycyA9ICIiOwogICAgaWYgKE51bWJlcihpbnRlZ3JhbCkgPiAwKSB7CiAgICAgIHplcm9Db3VudCA9IDA7CiAgICAgIGZvciAoaSA9IDA7IGkgPCBpbnRlZ3JhbC5sZW5ndGg7IGkrKykgewogICAgICAgIHAgPSBpbnRlZ3JhbC5sZW5ndGggLSBpIC0gMTsKICAgICAgICBkID0gaW50ZWdyYWwuc3Vic3RyKGksIDEpOwogICAgICAgIHF1b3RpZW50ID0gcCAvIDQ7CiAgICAgICAgbW9kdWx1cyA9IHAgJSA0OwogICAgICAgIGlmIChkID09ICIwIikgewogICAgICAgICAgemVyb0NvdW50Kys7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGlmICh6ZXJvQ291bnQgPiAwKSB7CiAgICAgICAgICAgIG91dHB1dENoYXJhY3RlcnMgKz0gZGlnaXRzWzBdOwogICAgICAgICAgfQogICAgICAgICAgemVyb0NvdW50ID0gMDsKICAgICAgICAgIG91dHB1dENoYXJhY3RlcnMgKz0gZGlnaXRzW051bWJlcihkKV0gKyByYWRpY2VzW21vZHVsdXNdOwogICAgICAgIH0KICAgICAgICBpZiAobW9kdWx1cyA9PSAwICYmIHplcm9Db3VudCA8IDQpIHsKICAgICAgICAgIG91dHB1dENoYXJhY3RlcnMgKz0gYmlnUmFkaWNlc1txdW90aWVudF07CiAgICAgICAgfQogICAgICB9CiAgICAgIG91dHB1dENoYXJhY3RlcnMgKz0gQ05fRE9MTEFSOwogICAgfQogICAgaWYgKGRlY2ltYWwgIT0gIiIpIHsKICAgICAgZm9yIChpID0gMDsgaSA8IGRlY2ltYWwubGVuZ3RoOyBpKyspIHsKICAgICAgICBkID0gZGVjaW1hbC5zdWJzdHIoaSwgMSk7CiAgICAgICAgaWYgKGQgIT0gIjAiKSB7CiAgICAgICAgICBvdXRwdXRDaGFyYWN0ZXJzICs9IGRpZ2l0c1tOdW1iZXIoZCldICsgZGVjaW1hbHNbaV07CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBpZiAob3V0cHV0Q2hhcmFjdGVycyA9PSAiIikgewogICAgICBvdXRwdXRDaGFyYWN0ZXJzID0gQ05fWkVSTyArIENOX0RPTExBUjsKICAgIH0KICAgIGlmIChkZWNpbWFsID09ICIiKSB7CiAgICAgIG91dHB1dENoYXJhY3RlcnMgKz0gQ05fSU5URUdFUjsKICAgIH0KICAgIG91dHB1dENoYXJhY3RlcnMgPSBDTl9TWU1CT0wgKyBvdXRwdXRDaGFyYWN0ZXJzOwogICAgcmV0dXJuIG91dHB1dENoYXJhY3RlcnM7CiAgfSwKICAvKioNCiAgICog6YCa6L+HbmFtZeiOt+WPlumhtemdonVybOWcsOWdgOWPguaVsA0KICAgKiBAcGFyYW0gbmFtZQ0KICAgKiBAcmV0dXJucw0KICAgKiANCiAgICovCiAgZ2V0VXJsS2V5OiBmdW5jdGlvbiBnZXRVcmxLZXkobmFtZSkgewogICAgcmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudCgobmV3IFJlZ0V4cCgnWz98Jl0nICsgbmFtZSArICc9JyArICcoW14mO10rPykoJnwjfDt8JCknKS5leGVjKGxvY2F0aW9uLmhyZWYpIHx8IFssICIiXSlbMV0ucmVwbGFjZSgvXCsvZywgJyUyMCcpKSB8fCBudWxsOwogIH0sCiAgLy8g6L+U5Zue6LCD5pW06aG65bqP5ZCO55qE5pWw57uEIHBhcnTvvJrmlbDnu4TkuK3nmoTkuIDkuKrmiJblpJrkuKrlhYPntKDvvIwgZGlyZWN077ya6LCD5pW055qE5pa55ZCRICB1cO+8muWQkeS4iiAgZG93bu+8muWQkeS4iwogIGFycmF5TW92ZTogZnVuY3Rpb24gYXJyYXlNb3ZlKGFyeSwgcGFydCwgZGlyZWN0KSB7CiAgICBkaXJlY3QgPSBkaXJlY3QgfHwgImRvd24iOwogICAgaWYgKCFwYXJ0IHx8IHBhcnQuY29uc3RydWN0b3IgIT09IE9iamVjdCAmJiBwYXJ0LmNvbnN0cnVjdG9yICE9PSBBcnJheSkgewogICAgICByZXR1cm4gYXJ5OwogICAgfQogICAgaWYgKHBhcnQuY29uc3RydWN0b3IgPT09IE9iamVjdCkgewogICAgICBwYXJ0ID0gW3BhcnRdOwogICAgfQogICAgaWYgKGRpcmVjdCA9PSAidXAiKSB7CiAgICAgIHBhcnQuZm9yRWFjaChmdW5jdGlvbiAobSkgewogICAgICAgIHZhciBpbmRleCA9IGFyeS5pbmRleE9mKG0sIDEpOwogICAgICAgIGlmIChpbmRleCA+IDApIHsKICAgICAgICAgIHZhciBuZXdBcnkgPSBfdG9Db25zdW1hYmxlQXJyYXkoYXJ5KTsKICAgICAgICAgIG5ld0FyeVtpbmRleCAtIDFdID0gYXJ5W2luZGV4XTsKICAgICAgICAgIG5ld0FyeVtpbmRleF0gPSBhcnlbaW5kZXggLSAxXTsKICAgICAgICAgIGFyeSA9IG5ld0FyeTsKICAgICAgICB9CiAgICAgIH0pOwogICAgfSBlbHNlIGlmIChkaXJlY3QgPT0gImRvd24iKSB7CiAgICAgIGZvciAodmFyIGkgPSBwYXJ0Lmxlbmd0aCAtIDEsIG07IG0gPSBwYXJ0W2ktLV07KSB7CiAgICAgICAgdmFyIGluZGV4ID0gYXJ5LmluZGV4T2YobSwgMCk7CiAgICAgICAgaWYgKGluZGV4ID4gLTEgJiYgaW5kZXggPCBhcnkubGVuZ3RoIC0gMSkgewogICAgICAgICAgdmFyIG5ld0FyeSA9IF90b0NvbnN1bWFibGVBcnJheShhcnkpOwogICAgICAgICAgbmV3QXJ5W2luZGV4ICsgMV0gPSBhcnlbaW5kZXhdOwogICAgICAgICAgbmV3QXJ5W2luZGV4XSA9IGFyeVtpbmRleCArIDFdOwogICAgICAgICAgYXJ5ID0gbmV3QXJ5OwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgcmV0dXJuIGFyeTsKICB9LAogIC8vIOmAmui/h+mFjee9ruS4reaMh+WumueahGtleeaJgOWvueW6lOeahOWxnuaAp+i3r+W+hOWcqOW9k+WJjeihqOWNleS4reiOt+WPluWvueW6lOeahOWAvO+8jOaUr+aMgemAmui/h2RhdGEubWFpbi5uYW1lIOaIluiAheaYryBpdGVtLm5hbWXmnaXliIbliKvojrflj5bkuLvooajmlbDmja7lj4rlrZDooajmlbDmja7nmoTmg4XlhrUKICBnZXRWYWx1ZUJ5Q29uZmlnS2V5OiBmdW5jdGlvbiBnZXRWYWx1ZUJ5Q29uZmlnS2V5KGluc3QsIGNvbmZpZywga2V5KSB7CiAgICBpZiAoIWNvbmZpZy5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7CiAgICAgIHRocm93ICJjb25maWdcdTVCRjlcdThDNjFcdTRFMkRcdTY3MkFcdTYyN0VcdTUyMzBcdTVDNUVcdTYwMjciLmNvbmNhdChrZXkpOwogICAgfQogICAgdmFyIGtleVBhdGggPSBjb25maWdba2V5XTsKICAgIC8vIOiOt+WPluW9k+WJjee7hOS7tuaJgOWcqOeahOihqOWNlQogICAgdmFyIGZvcm1JbnN0ID0gdXRpbHMuZ2V0T25saW5lRm9ybUluc3RhbmNlKGluc3QuJHBhcmVudCk7CiAgICAvLyDojrflj5blvZPliY3nu4Tku7bmmK/lkKblnKjlrZDooajkuK3nmoTmn5DkuIDooYwKICAgIHZhciBfdXRpbHMkZ2V0U3ViU2NvcGVFbEEgPSB1dGlscy5nZXRTdWJTY29wZUVsQW5kSW5kZXgoaW5zdC4kZWwpLAogICAgICBzdWJTY29wZUVsID0gX3V0aWxzJGdldFN1YlNjb3BlRWxBLnN1YlNjb3BlRWwsCiAgICAgIGluZGV4ID0gX3V0aWxzJGdldFN1YlNjb3BlRWxBLmluZGV4OwogICAgaWYgKHN1YlNjb3BlRWwpIHsKICAgICAgLy/liKTmlq3mmK/lkKbmnInlrZnooagKICAgICAgdmFyIHBhdGhzID0gc3ViU2NvcGVFbC5kYXRhc2V0WyJzdWJuYW1lIl07CiAgICAgIGlmIChwYXRocy5zcGxpdCgiLiIpLmxlbmd0aCA9PSA0ICYmIHBhdGhzLmluZGV4T2YoIlsiKSA9PSAtMSkgewogICAgICAgIC8v5a2Z6KGo5Zue5aGr6Lev5b6ECiAgICAgICAgcGF0aHMgPSBwYXRocy5zcGxpdCgiLiIpWzBdICsgIi4iICsgcGF0aHMuc3BsaXQoIi4iKVsxXSArICIuIiArIHBhdGhzLnNwbGl0KCIuIilbMl0gKyAiWyIgKyBwYXJzZUludCh1dGlscy5nZXRTb21lQXR0cmlidXRlRnJvbVBhcmVudEVsZW1lbnQoaW5zdC4kZWwsICJzdWItaW5kZXgiKSkgKyAiXSIgKyAiLiIgKyBwYXRocy5zcGxpdCgiLiIpWzNdOwogICAgICB9CiAgICAgIC8vIOWwhml0ZW0ubmFtZei/meagt+eahOi3r+W+hOabv+aNouS4umRhdGEuc3ViWzBdLm5hbWXov5nmoLfnmoTlhajot6/lvoTmoLzlvI8KICAgICAgdmFyIHdob2xlS2V5UGF0aCA9IHV0aWxzLmdldFdob2xlUGF0aE9mU3ViKGtleVBhdGgsIHBhdGhzLCBpbmRleCk7CiAgICAgIHJldHVybiB1dGlscy5nZXRWYWx1ZUJ5UGF0aChmb3JtSW5zdCwgd2hvbGVLZXlQYXRoKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiB1dGlscy5nZXRWYWx1ZUJ5UGF0aChmb3JtSW5zdCwga2V5UGF0aCk7CiAgICB9CiAgfSwKICAvLyDpgJrov4fphY3nva7kuK3mjIflrprnmoRrZXnmnaXorr7nva7lgLzliLDlr7nlupTnmoTlsZ7mgKfot6/lvoTkuIrvvIzmlK/mjIHorr7nva7kuLvooajmlbDmja5kYXRhLm1haW4ubmFtZSDmiJborr7nva7lrZDooajmlbDmja5pdGVtLm5hbWUKICBzZXRWYWx1ZUJ5Q29uZmlnS2V5OiBmdW5jdGlvbiBzZXRWYWx1ZUJ5Q29uZmlnS2V5KGluc3QsIGNvbmZpZywga2V5LCB2YWx1ZSkgewogICAgaWYgKCFjb25maWcuaGFzT3duUHJvcGVydHkoa2V5KSkgewogICAgICByZXR1cm47CiAgICB9CiAgICB2YXIga2V5UGF0aCA9IGNvbmZpZ1trZXldOwogICAgLy8g6I635Y+W5b2T5YmN57uE5Lu25omA5Zyo55qE6KGo5Y2VCiAgICB2YXIgZm9ybUluc3QgPSB1dGlscy5nZXRPbmxpbmVGb3JtSW5zdGFuY2UoaW5zdC4kcGFyZW50KTsKICAgIC8vIOiOt+WPluW9k+WJjee7hOS7tuaYr+WQpuWcqOWtkOihqOS4reeahOafkOS4gOihjAogICAgdmFyIF91dGlscyRnZXRTdWJTY29wZUVsQTIgPSB1dGlscy5nZXRTdWJTY29wZUVsQW5kSW5kZXgoaW5zdC4kZWwpLAogICAgICBzdWJTY29wZUVsID0gX3V0aWxzJGdldFN1YlNjb3BlRWxBMi5zdWJTY29wZUVsLAogICAgICBpbmRleCA9IF91dGlscyRnZXRTdWJTY29wZUVsQTIuaW5kZXg7CiAgICBpZiAoc3ViU2NvcGVFbCkgewogICAgICAvL+WIpOaWreaYr+WQpuacieWtmeihqAogICAgICB2YXIgcGF0aHMgPSBzdWJTY29wZUVsLmRhdGFzZXRbInN1Ym5hbWUiXTsKICAgICAgaWYgKHBhdGhzLnNwbGl0KCIuIikubGVuZ3RoID09IDQgJiYgcGF0aHMuaW5kZXhPZigiWyIpID09IC0xKSB7CiAgICAgICAgLy/lrZnooajlm57loavot6/lvoQKICAgICAgICBwYXRocyA9IHBhdGhzLnNwbGl0KCIuIilbMF0gKyAiLiIgKyBwYXRocy5zcGxpdCgiLiIpWzFdICsgIi4iICsgcGF0aHMuc3BsaXQoIi4iKVsyXSArICJbIiArIHBhcnNlSW50KHV0aWxzLmdldFNvbWVBdHRyaWJ1dGVGcm9tUGFyZW50RWxlbWVudChpbnN0LiRlbCwgInN1Yi1pbmRleCIpKSArICJdIiArICIuIiArIHBhdGhzLnNwbGl0KCIuIilbM107CiAgICAgIH0KICAgICAgLy8g5bCGaXRlbS5uYW1l6L+Z5qC355qE6Lev5b6E5pu/5o2i5Li6ZGF0YS5zdWJbMF0ubmFtZei/meagt+eahOWFqOi3r+W+hOagvOW8jwogICAgICB2YXIgd2hvbGVLZXlQYXRoID0gdXRpbHMuZ2V0V2hvbGVQYXRoT2ZTdWIoa2V5UGF0aCwgcGF0aHMsIGluZGV4KTsKICAgICAgdXRpbHMuc2V0VmFsdWVCeVBhdGgoZm9ybUluc3QsIHdob2xlS2V5UGF0aCwgdmFsdWUpOwogICAgfSBlbHNlIHsKICAgICAgdXRpbHMuc2V0VmFsdWVCeVBhdGgoZm9ybUluc3QsIGtleVBhdGgsIHZhbHVlKTsKICAgIH0KICB9LAogIC8vIOWIpOaWreS4pOS4quWvueixoeaYr+WQpuebuOetie+8iHByb3Bz5Li65bGe5oCn5pWw57uE77yM5pyJ5Lyg5YWl5pe277yM5Y+q5q+U5a+55Lyg5YWl55qE5bGe5oCn5piv5ZCm55u4562J77yJCiAgb2JqZWN0RXF1YWxzOiBmdW5jdGlvbiBvYmplY3RFcXVhbHMob2JqMSwgb2JqMiwgcHJvcHMpIHsKICAgIGlmICghcHJvcHMgfHwgcHJvcHMuY29uc3RydWN0b3IgIT09IEFycmF5KSB7CiAgICAgIHByb3BzID0gW107CiAgICB9CiAgICBpZiAoIW9iajEgfHwgIW9iajIpIHsKICAgICAgcmV0dXJuIG9iajEgPT09IG9iajI7CiAgICB9CiAgICBmb3IgKHZhciBwcm9wTmFtZSBpbiBvYmoxKSB7CiAgICAgIGlmIChwcm9wcy5sZW5ndGggPiAwICYmIHByb3BzLmluZGV4T2YocHJvcE5hbWUpID09PSAtMSkgewogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIGlmIChvYmoxLmhhc093blByb3BlcnR5KHByb3BOYW1lKSAhPSBvYmoyLmhhc093blByb3BlcnR5KHByb3BOYW1lKSkgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfSBlbHNlIGlmIChfdHlwZW9mKG9iajFbcHJvcE5hbWVdKSAhPSBfdHlwZW9mKG9iajJbcHJvcE5hbWVdKSkgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQogICAgfQogICAgZm9yICh2YXIgcHJvcE5hbWUgaW4gb2JqMikgewogICAgICBpZiAocHJvcHMubGVuZ3RoID4gMCAmJiBwcm9wcy5pbmRleE9mKHByb3BOYW1lKSA9PT0gLTEpIHsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICBpZiAob2JqMS5oYXNPd25Qcm9wZXJ0eShwcm9wTmFtZSkgIT0gb2JqMi5oYXNPd25Qcm9wZXJ0eShwcm9wTmFtZSkpIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0gZWxzZSBpZiAoX3R5cGVvZihvYmoxW3Byb3BOYW1lXSkgIT0gX3R5cGVvZihvYmoyW3Byb3BOYW1lXSkpIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgICAgaWYgKCFvYmoxLmhhc093blByb3BlcnR5KHByb3BOYW1lKSkgewogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIGlmIChvYmoxW3Byb3BOYW1lXSBpbnN0YW5jZW9mIEFycmF5ICYmIG9iajJbcHJvcE5hbWVdIGluc3RhbmNlb2YgQXJyYXkpIHsKICAgICAgICBpZiAoIXV0aWxzLmFycmF5RXF1YWxzKG9iajFbcHJvcE5hbWVdLCBvYmoyW3Byb3BOYW1lXSkpIHsKICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAob2JqMVtwcm9wTmFtZV0gaW5zdGFuY2VvZiBPYmplY3QgJiYgb2JqMltwcm9wTmFtZV0gaW5zdGFuY2VvZiBPYmplY3QpIHsKICAgICAgICBpZiAoIXV0aWxzLm9iamVjdEVxdWFscyhvYmoxW3Byb3BOYW1lXSwgb2JqMltwcm9wTmFtZV0pKSB7CiAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgICB9IGVsc2UgaWYgKG9iajFbcHJvcE5hbWVdICE9IG9iajJbcHJvcE5hbWVdKSB7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gdHJ1ZTsKICB9LAogIC8vIOWIpOaWreS4pOS4quaVsOe7hOaYr+WQpuebuOetie+8jOaUr+aMgeaVsOe7hOS4reWFg+e0oOS4uuWvueixoeaXtueahOa3seW6puWvueavlAogIGFycmF5RXF1YWxzOiBmdW5jdGlvbiBhcnJheUVxdWFscyhhcnkxLCBhcnkyKSB7CiAgICBpZiAoIWFyeTEgfHwgIWFyeTIpIHsKICAgICAgcmV0dXJuIGFyeTEgPT09IGFyeTI7CiAgICB9CiAgICBpZiAoYXJ5MS5sZW5ndGggIT0gYXJ5Mi5sZW5ndGgpIHsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgZm9yICh2YXIgaSA9IDAsIGwgPSBhcnkxLmxlbmd0aDsgaSA8IGw7IGkrKykgewogICAgICBpZiAoYXJ5MVtpXSBpbnN0YW5jZW9mIEFycmF5ICYmIGFyeTJbaV0gaW5zdGFuY2VvZiBBcnJheSkgewogICAgICAgIGlmICghdXRpbHMuYXJyYXlFcXVhbHMoYXJ5MVtpXSwgYXJ5MltpXSkpIHsKICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAoYXJ5MVtpXSBpbnN0YW5jZW9mIE9iamVjdCAmJiBhcnkyW2ldIGluc3RhbmNlb2YgT2JqZWN0KSB7CiAgICAgICAgaWYgKCF1dGlscy5vYmplY3RFcXVhbHMoYXJ5MVtpXSwgYXJ5MltpXSkpIHsKICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAoYXJ5MVtpXSAhPSBhcnkyW2ldKSB7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gdHJ1ZTsKICB9LAogIC8vIOS7peesrOS4gOihjOaWh+acrOeahOe8qei/m+epuuagvOaVsOS4uuWfuuWHhu+8jOWQjue7reeahOavj+S4gOihjOmDveWOu+aOiei/meS4quWfuuWHhuaJgOWvueW6lOeahOepuuagvOOAggogIHRyaW1FYWNoTGluZTogZnVuY3Rpb24gdHJpbUVhY2hMaW5lKHRleHQpIHsKICAgIGlmICghdGV4dCB8fCB0ZXh0LmNvbnN0cnVjdG9yICE9IFN0cmluZyB8fCB0ZXh0LmluZGV4T2YoIlxuIikgPT0gLTEpIHsKICAgICAgcmV0dXJuIHRleHQ7CiAgICB9CiAgICB2YXIgYXJ5ID0gdGV4dC5zcGxpdCgiXG4iKSwKICAgICAgdG90ZW0gPSAwOwogICAgcmV0dXJuIGFyeS5yZWR1Y2UoZnVuY3Rpb24gKHByZXYsIGN1ciwgaW5kZXgpIHsKICAgICAgaWYgKGluZGV4ID09IDEpIHsKICAgICAgICB2YXIgbWF0Y2ggPSAvXihccyspLiokLy5leGVjKGN1cik7CiAgICAgICAgbWF0Y2ggJiYgbWF0Y2gubGVuZ3RoID09IDIgJiYgKHRvdGVtID0gbWF0Y2hbMV0ubGVuZ3RoKTsKICAgICAgfQogICAgICByZXR1cm4gcHJldiArICJcbiIgKyBjdXIuc2xpY2UodG90ZW0sIGN1ci5sZW5ndGgpOwogICAgfSk7CiAgfSwKICAvLyDojrflj5blrZfnrKbkuLLnmoTlk4jluIznvJbnoIEKICBoYXNoQ29kZTogZnVuY3Rpb24gaGFzaENvZGUodGV4dCkgewogICAgdmFyIGhhc2ggPSAwLAogICAgICBjaGFyOwogICAgaWYgKHRleHQubGVuZ3RoID09IDApIHJldHVybiBoYXNoOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0ZXh0Lmxlbmd0aDsgaSsrKSB7CiAgICAgIGNoYXIgPSB0ZXh0LmNoYXJDb2RlQXQoaSk7CiAgICAgIGhhc2ggPSAoaGFzaCA8PCA1KSAtIGhhc2ggKyBjaGFyOwogICAgICBoYXNoID0gaGFzaCAmIGhhc2g7CiAgICB9CiAgICByZXR1cm4gaGFzaDsKICB9Cn07CgovLyDlnKjmlbDnu4TkuIrmianlsZXkuIDkuKrliKDpmaTmjIflrprpobnnmoTmlrnms5UKQXJyYXkucHJvdG90eXBlLnJlbW92ZSA9IGZ1bmN0aW9uIChpdGVtKSB7CiAgdmFyIGluZGV4ID0gdGhpcy5maW5kSW5kZXgoZnVuY3Rpb24gKHYpIHsKICAgIHJldHVybiB2ID09PSBpdGVtOwogIH0pOwogIGlmIChpbmRleCA+IC0xKSB7CiAgICB0aGlzLnNwbGljZShpbmRleCwgMSk7CiAgfQp9OwoKLy8g5riF56m65pWw57uECkFycmF5LnByb3RvdHlwZS5lbXB0eSA9IGZ1bmN0aW9uICgpIHsKICB0aGlzLnNwbGljZSgwLCB0aGlzLmxlbmd0aCk7Cn07CgovLyDlnKjmlbDnu4TkuIrmianlsZXkuIDkuKrljrvph43nmoTmlrnms5UKQXJyYXkucHJvdG90eXBlLnVuaXF1ZSA9IGZ1bmN0aW9uIChhcmcpIHsKICB2YXIgcmVzID0gbmV3IE1hcCgpOwogIHJldHVybiB0aGlzLmZpbHRlcihmdW5jdGlvbiAobSkgewogICAgaWYgKGFyZykgewogICAgICByZXR1cm4gIXJlcy5oYXMobVthcmddKSAmJiByZXMuc2V0KG1bYXJnXSwgMSk7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gIXJlcy5oYXMobSkgJiYgcmVzLnNldChtLCAxKTsKICAgIH0KICB9KTsKfTsKCi8vIOWOu+mZpOaVsOe7hOS4reeahOepuuWtl+espuS4sumAiemhuQpBcnJheS5wcm90b3R5cGUudHJpbSA9IGZ1bmN0aW9uICgpIHsKICByZXR1cm4gdGhpcy5maWx0ZXIoZnVuY3Rpb24gKG0pIHsKICAgIHJldHVybiBtICE9PSAnJzsKICB9KTsKfTsKCi8vIOaMieeFp+aVsOe7hOS4reeahOaMh+WummtleeWwhuaVsOe7hOi/m+ihjOWIhue7hApBcnJheS5wcm90b3R5cGUuZ3JvdXBCeUtleSA9IGZ1bmN0aW9uIChrZXkpIHsKICB2YXIgcmVzID0ge307CiAgdGhpcy5mb3JFYWNoKGZ1bmN0aW9uIChtKSB7CiAgICB2YXIgZ3JvdXAgPSByZXNbbVtrZXldXTsKICAgIGlmICghZ3JvdXApIHsKICAgICAgZ3JvdXAgPSBbXTsKICAgICAgcmVzW21ba2V5XV0gPSBncm91cDsKICAgIH0KICAgIGdyb3VwLnB1c2gobSk7CiAgfSk7CiAgcmV0dXJuIHJlczsKfTsKCi8vIOaMieeFp+aVsOe7hOS4reeahOaMh+WummtleeWwhuaVsOe7hOi/m+ihjOWIhue7hApBcnJheS5wcm90b3R5cGUuZ3JvdXBCeUtleSA9IGZ1bmN0aW9uIChrZXkpIHsKICB2YXIgcmVzID0ge307CiAgdGhpcy5mb3JFYWNoKGZ1bmN0aW9uIChtKSB7CiAgICB2YXIgZ3JvdXAgPSByZXNbbVtrZXldXTsKICAgIGlmICghZ3JvdXApIHsKICAgICAgZ3JvdXAgPSBbXTsKICAgICAgcmVzW21ba2V5XV0gPSBncm91cDsKICAgIH0KICAgIGdyb3VwLnB1c2gobSk7CiAgfSk7CiAgcmV0dXJuIHJlczsKfTsKCi8vIOWwhuaVsOe7hOWvueixoeS4reeahOafkOS4gOS4quWxnuaAp+WAvOWNleeLrOaKveWPluWHuuadpeaIkOS4uuS4gOS4quaWsOeahOaVsOe7hCAgW3tpZDonMScsbmFtZTon6Iu55p6cJ30se2lkOicyJyxuYW1lOifpppnolYknfV0uZXh0cmFjdEJ5S2V5KCJpZCIpID09PiBbJzEnLCcyJ10KQXJyYXkucHJvdG90eXBlLmV4dHJhY3RCeUtleSA9IGZ1bmN0aW9uIChrZXkpIHsKICB2YXIgc2V0ID0gbmV3IFNldCgpOwogIHRoaXMuZm9yRWFjaChmdW5jdGlvbiAobSkgewogICAgaWYgKGtleSAmJiBtW2tleV0pIHsKICAgICAgc2V0LmFkZChtW2tleV0pOwogICAgfQogIH0pOwogIHJldHVybiBBcnJheS5mcm9tKHNldCk7Cn07CgovKioNCiAqIOaXpeacn+agvOW8j+WMluOAgg0KICog5pel5pyf5qC85byP77yaDQogKiB5eXl577yMeXkg5bm05Lu9DQogKiBNTSDlpKflhpnooajnpLrmnIjku70NCiAqIGRkIOihqOekuuaXpeacnw0KICogaGgg6KGo56S65bCP5pe2DQogKiBtbSDooajnpLrliIbpkp8NCiAqIHNzIOihqOekuuenkg0KICogcSAg6KGo56S65a2j5bqmDQogKiDlrp7kvovlpoLkuIvvvJoNCiAqIHZhciBub3cgPSBuZXcgRGF0ZSgpOyANCiAqIHZhciBub3dTdHIgPSBub3cuZm9ybWF0KCJ5eXl5LU1NLWRkIGhoOm1tOnNzIik7IA0KICovCkRhdGUucHJvdG90eXBlLmZvcm1hdCA9IGZ1bmN0aW9uIChmb3JtYXQpIHsKICB2YXIgbyA9IHsKICAgICJNKyI6IHRoaXMuZ2V0TW9udGgoKSArIDEsCiAgICAvL21vbnRoIAogICAgImQrIjogdGhpcy5nZXREYXRlKCksCiAgICAvL2RheSAKICAgICJoKyI6IHRoaXMuZ2V0SG91cnMoKSwKICAgIC8vaG91ciAKICAgICJIKyI6IHRoaXMuZ2V0SG91cnMoKSwKICAgIC8vaG91cgogICAgIm0rIjogdGhpcy5nZXRNaW51dGVzKCksCiAgICAvL21pbnV0ZSAKICAgICJzKyI6IHRoaXMuZ2V0U2Vjb25kcygpLAogICAgLy9zZWNvbmQgCiAgICAicSsiOiBNYXRoLmZsb29yKCh0aGlzLmdldE1vbnRoKCkgKyAzKSAvIDMpLAogICAgLy9xdWFydGVyIAogICAgIlMiOiB0aGlzLmdldE1pbGxpc2Vjb25kcygpIC8vbWlsbGlzZWNvbmQgCiAgfTsKICBpZiAoLyh5KykvLnRlc3QoZm9ybWF0KSkgewogICAgZm9ybWF0ID0gZm9ybWF0LnJlcGxhY2UoUmVnRXhwLiQxLCAodGhpcy5nZXRGdWxsWWVhcigpICsgIiIpLnN1YnN0cig0IC0gUmVnRXhwLiQxLmxlbmd0aCkpOwogIH0KICBmb3IgKHZhciBrIGluIG8pIHsKICAgIGlmIChuZXcgUmVnRXhwKCIoIiArIGsgKyAiKSIpLnRlc3QoZm9ybWF0KSkgewogICAgICBmb3JtYXQgPSBmb3JtYXQucmVwbGFjZShSZWdFeHAuJDEsIFJlZ0V4cC4kMS5sZW5ndGggPT0gMSA/IG9ba10gOiAoIjAwIiArIG9ba10pLnN1YnN0cigoIiIgKyBvW2tdKS5sZW5ndGgpKTsKICAgIH0KICB9CiAgcmV0dXJuIGZvcm1hdDsKfTsKZXhwb3J0IGRlZmF1bHQgdXRpbHM7"},null]}