1 |
- {"remainingRequest":"E:\\boman-framwork\\ruoyi-ui\\node_modules\\thread-loader\\dist\\cjs.js!E:\\boman-framwork\\ruoyi-ui\\node_modules\\babel-loader\\lib\\index.js!E:\\boman-framwork\\ruoyi-ui\\src\\utils\\flow-desinger.js","dependencies":[{"path":"E:\\boman-framwork\\ruoyi-ui\\src\\utils\\flow-desinger.js","mtime":1620694705128},{"path":"E:\\boman-framwork\\ruoyi-ui\\node_modules\\cache-loader\\dist\\cjs.js","mtime":499162500000},{"path":"E:\\boman-framwork\\ruoyi-ui\\node_modules\\thread-loader\\dist\\cjs.js","mtime":499162500000},{"path":"E:\\boman-framwork\\ruoyi-ui\\node_modules\\babel-loader\\lib\\index.js","mtime":315532800000}],"contextDependencies":[],"result":[{"type":"Buffer","data":"base64:aW1wb3J0IF9kZWZpbmVQcm9wZXJ0eSBmcm9tICJFOi9ib21hbi1mcmFtd29yay9ydW95aS11aS9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZGVmaW5lUHJvcGVydHkiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5tYXAuanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5udW1iZXIuY29uc3RydWN0b3IuanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5maWxsLmpzIjsKaW1wb3J0IGljb25zIGZyb20gJy4vaWNvbi5qcyc7CgpmdW5jdGlvbiBGbG93RGVzaWduZXIoZGlhZ3JhbURpdiwgZXZlbnQpIHsKICB2YXIgRyA9IGdvLkdyYXBoT2JqZWN0Lm1ha2U7CiAgdmFyIF90aGlzID0ge307CiAgdmFyIF9kZXNpZ25lciA9IHt9OwogIHZhciBteVBhbGV0dGUgPSBudWxsOwogIHZhciBfanNvbk5ld1N0ZXAgPSB7CiAgICBrZXk6IGd1aWQoKSwKICAgIHRleHQ6ICLlrqHmibnoioLngrkiLAogICAgcmVtYXJrOiAnJywKICAgIHR5cGU6IDAKICB9OwogIC8qKiDlpITnkIbkvKDlhaXkuovku7YgKi8KCiAgaWYgKGV2ZW50LnNob3dFZGl0Tm9kZSkgewogICAgLy/nvJbovpHoioLngrkKICAgIF90aGlzLnNob3dFZGl0Tm9kZSA9IGV2ZW50LnNob3dFZGl0Tm9kZTsKICB9CgogIGlmIChldmVudC5TZWxlY3Rpb25EZWxldGVkKSB7CiAgICAvL+WIoOmZpOS6i+S7tgogICAgX3RoaXMuU2VsZWN0aW9uRGVsZXRlZCA9IGV2ZW50LlNlbGVjdGlvbkRlbGV0ZWQ7CiAgfQoKICBpZiAoZXZlbnQuTGlua0RyYXduKSB7CiAgICAvL+e6v+eahOeUn+aIkOS6i+S7tgogICAgX3RoaXMuTGlua0RyYXduID0gZXZlbnQuTGlua0RyYXduOwogIH0KCiAgaWYgKGV2ZW50LmV4dGVybmFsb2JqZWN0c2Ryb3BwZWQpIHsKICAgIC8v6IqC54K555qE55Sf5oiQ5LqL5Lu2CiAgICBfdGhpcy5leHRlcm5hbG9iamVjdHNkcm9wcGVkID0gZXZlbnQuZXh0ZXJuYWxvYmplY3RzZHJvcHBlZDsKICB9CgogIGlmIChldmVudC5MaW5rUmVsaW5rZWQpIHsKICAgIC8v6L+e57q/5L+u5pS5CiAgICBfdGhpcy5MaW5rUmVsaW5rZWQgPSBldmVudC5MaW5rUmVsaW5rZWQ7CiAgfQogIC8qKiAtLS0tLS0tLXB1YmxpYyBtZXRob2QtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKiovCgogIC8qKg0KICAgKiDliJ3lp4vljJblm77kvovpnaLmnb8NCiAgICogMOWuoeaJueiKgueCuSAx5byA5aeL6IqC54K5IDLnu5PmnZ/oioLngrkgM+aTjeS9nOiKgueCuSA05pyN5Yqh6IqC54K5DQogICAqIEByZXR1cm5zIHsqfQ0KICAgKi8KCgogIHRoaXMuaW5pdFRvb2xiYXIgPSBmdW5jdGlvbiAoZGl2LCBtb2R1bGVUeXBlKSB7CiAgICB2YXIgbW9kZWxBcnIgPSBbLy8geyBrZXk6IGd1aWQoKSwgdGV4dDogIuW8gOWniyIsIGZpZ3VyZTogIlRlcm1pbmF0b3IiLCBmaWxsOiAiIzRmYmE0ZiIsIHR5cGU6IDEgfSwKICAgIHsKICAgICAga2V5OiBndWlkKCksCiAgICAgIHRleHQ6ICLlrqHmibnoioLngrkiLAogICAgICByZW1hcms6ICcnLAogICAgICB0eXBlOiAwLAogICAgICBjYXRlZ29yeTogJ0FwcHJvdmFsJwogICAgfSwgewogICAgICBrZXk6IGd1aWQoKSwKICAgICAgdGV4dDogIuaTjeS9nOiKgueCuSIsCiAgICAgIHJlbWFyazogJycsCiAgICAgIHR5cGU6IDQsCiAgICAgIGNhdGVnb3J5OiAnT3BlcmF0aW9uJwogICAgfSwgewogICAgICBrZXk6IGd1aWQoKSwKICAgICAgdGV4dDogIuacjeWKoeiKgueCuSIsCiAgICAgIHJlbWFyazogJycsCiAgICAgIHR5cGU6IDMsCiAgICAgIGNhdGVnb3J5OiAnU2VydmljZScKICAgIH0sIHsKICAgICAga2V5OiBndWlkKCksCiAgICAgIHRleHQ6ICLlrZDmtYHnqIvoioLngrkiLAogICAgICByZW1hcms6ICcnLAogICAgICB0eXBlOiA2LAogICAgICBjYXRlZ29yeTogJ1N1YnByb2Nlc3NlcycKICAgIH0gLy8geyBrZXk6IGd1aWQoKSwgdGV4dDogIue7k+adnyIsIGZpZ3VyZTogIlRlcm1pbmF0b3IiLCBmaWxsOiAiI0NFMDYyMCIsIHR5cGU6IDIgfQogICAgXTsKCiAgICBpZiAoIW1vZHVsZVR5cGUpIHsKICAgICAgbW9kZWxBcnIgPSBbewogICAgICAgIGtleTogZ3VpZCgpLAogICAgICAgIHRleHQ6ICLlrqHmibnoioLngrkiLAogICAgICAgIHJlbWFyazogJycsCiAgICAgICAgdHlwZTogMCwKICAgICAgICBjYXRlZ29yeTogJ0FwcHJvdmFsJwogICAgICB9XTsKICAgIH0KCiAgICBpZiAoIW15UGFsZXR0ZSkgewogICAgICB2YXIgUGFsZXR0ZSA9IEcoZ28uUGFsZXR0ZSwgZGl2LCAvLyDlv4XpobvmmK9ESVblhYPntKAKICAgICAgewogICAgICAgIG1heFNlbGVjdGlvbkNvdW50OiAzLAogICAgICAgIG5vZGVUZW1wbGF0ZU1hcDogX2Rlc2lnbmVyLm5vZGVUZW1wbGF0ZU1hcCwKICAgICAgICAvLyDot5/orr7orqHlm77lhbHlkIzkuIDlpZfmoLflvI/mqKHmnb8KICAgICAgICBtb2RlbDogbmV3IGdvLkdyYXBoTGlua3NNb2RlbChtb2RlbEFycikKICAgICAgfSk7CiAgICAgIG15UGFsZXR0ZSA9IFBhbGV0dGU7CiAgICB9IGVsc2UgewogICAgICBteVBhbGV0dGUubW9kZWwubm9kZURhdGFBcnJheSA9IG1vZGVsQXJyOwogICAgfQoKICAgIGNvbnNvbGUubG9nKG15UGFsZXR0ZSwgMjIyMjIyKTsKICAgIHJldHVybiBteVBhbGV0dGU7CiAgfTsKICAvKioNCiAgICog5Zyo6K6+6K6h6Z2i5p2/5Lit5pi+56S65rWB56iL5Zu+DQogICAqIEBwYXJhbSBmbG93RGF0YSAg5rWB56iL5Zu+anNvbuaVsOaNrg0KICAgKi8KCgogIHRoaXMuZGlzcGxheUZsb3cgPSBmdW5jdGlvbiAoZmxvd0RhdGEpIHsKICAgIGlmICghZmxvd0RhdGEpIHJldHVybjsKICAgIF9kZXNpZ25lci5tb2RlbCA9IGdvLk1vZGVsLmZyb21Kc29uKGZsb3dEYXRhKTsKICAgIHZhciBwb3MgPSBfZGVzaWduZXIubW9kZWwubW9kZWxEYXRhLnBvc2l0aW9uOyAvLyBpZiAocG9zKSBfZGVzaWduZXIuaW5pdGlhbFBvc2l0aW9uID0gZ28uUG9pbnQucGFyc2UocG9zKTsKCiAgICB0aGlzLmRpYWdyYW0gPSBfZGVzaWduZXI7IC8vIOabtOaUueaJgOaciei/nue6v+S4remXtOeahOaWh+acrOiDjOaZr+iJsgoKICAgIHNldExpbmtUZXh0QmcoKTsKICB9OwogIC8qKg0KICAgKiDliJvlu7rmlrDmraXpqqQNCiAgICovCgoKICB0aGlzLmNyZWF0ZVN0ZXAgPSBmdW5jdGlvbiAoKSB7CiAgICB2YXIganNvbk5ld1N0ZXAgPSB7CiAgICAgIGtleTogX2pzb25OZXdTdGVwLmtleSwKICAgICAgdGV4dDogX2pzb25OZXdTdGVwLnRleHQKICAgIH07CiAgICBqc29uTmV3U3RlcC5sb2MgPSAiMjcwIDE0MCI7IC8vIOKAnOaWsOatpemqpOKAneaYvuekuueahOS9jee9rgoKICAgIF9kZXNpZ25lci5tb2RlbC5hZGROb2RlRGF0YShqc29uTmV3U3RlcCk7CiAgfTsKICAvKioNCiAgICog6I635Y+W5rWB56iL5Zu+5pWw5o2uDQogICAqIEByZXR1cm5zIHsqfQ0KICAgKi8KCgogIHRoaXMuZ2V0Rmxvd0RhdGEgPSBmdW5jdGlvbiAoKSB7CiAgICBfZGVzaWduZXIubW9kZWwubW9kZWxEYXRhLnBvc2l0aW9uID0gZ28uUG9pbnQuc3RyaW5naWZ5KF9kZXNpZ25lci5wb3NpdGlvbik7CiAgICByZXR1cm4gX2Rlc2lnbmVyLm1vZGVsLnRvSnNvbigpOwogIH07CiAgLyoqDQogICAqIOajgOmqjOa1geeoi+WbvuaYr+WQpuinhOiMgw0KICAgKi8KCgogIHRoaXMuY2hlY2tEYXRhID0gZnVuY3Rpb24gKCkgewogICAgdmFyIGVyck1zZyA9ICIiOyAvLyDmo4Dmn6XvvJrmr4/kuKrmraXpqqTlv4XpobvljIXlkKvop5LoibIKCiAgICBpZiAoIV9kZXNpZ25lci5tb2RlbC5ub2RlRGF0YUFycmF5KSByZXR1cm4gJ+ivt+e7mOWItua1geeoi+Wbvic7IC8vICQuZWFjaChfZGVzaWduZXIubW9kZWwubm9kZURhdGFBcnJheSwgZnVuY3Rpb24oaSwgaXRlbSkgewogICAgLy8gICAgIGlmICghaXRlbS5oYXNPd25Qcm9wZXJ0eSgicmVtYXJrIikgfHwgaXRlbS5yZW1hcmsgPT09ICIiKSB7CiAgICAvLyAgICAgICAgIGVyck1zZyA9ICLor7fkuLrmraXpqqTjgJAiICsgaXRlbS50ZXh0ICsgIuOAkeiuvue9ruWkh+azqH4iOwogICAgLy8gICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAvLyAgICAgfQogICAgLy8gfSk7CgogICAgX2Rlc2lnbmVyLm1vZGVsLm5vZGVEYXRhQXJyYXkubWFwKGZ1bmN0aW9uIChpdGVtKSB7CiAgICAgIGlmICghaXRlbS5oYXNPd25Qcm9wZXJ0eSgicmVtYXJrIikgfHwgaXRlbS5yZW1hcmsgPT09ICIiKSB7CiAgICAgICAgZXJyTXNnID0gIuivt+S4uuatpemqpOOAkCIgKyBpdGVtLnRleHQgKyAi44CR6K6+572u5aSH5rOofiI7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9CiAgICB9KTsKCiAgICByZXR1cm4gZXJyTXNnOwogIH07CiAgLyoqIC0tLS0tLS0tcHVibGljIG1ldGhvZC0tLS0tLS0tLS0tLS1lbmQtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qKi8KCgogIHRoaXMuZGlhZ3JhbSA9IGluaXQoZGlhZ3JhbURpdik7CiAgLyoqIC0tLS0tLS0tcHJpdmF0ZSBtZXRob2QtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKiovCgogIC8qKg0KICAgKiDliJ3lp4vljJbmtYHnqIvorr7orqHlmagNCiAgICogQHBhcmFtIGRpdklkIOiuvuiuoeWZqERpdg0KICAgKiANCiAgICogbm9kZSB0eXBlIA0KICAgKi8KCiAgZnVuY3Rpb24gaW5pdChkaXZJZCkgewogICAgdmFyIF9HLCBfRzIsIF9HMywgX0c0OwoKICAgIF9kZXNpZ25lciA9IEcoZ28uRGlhZ3JhbSwgZGl2SWQsIC8vIG11c3QgbmFtZSBvciByZWZlciB0byB0aGUgRElWIEhUTUwgZWxlbWVudAogICAgewogICAgICAvLyBncmlkOiBHKGdvLlBhbmVsLCAiR3JpZCIsICDog4zmma/moLwKICAgICAgLy8gICAgIEcoZ28uU2hhcGUsICJMaW5lSCIsIHsgc3Ryb2tlOiAibGlnaHRncmF5Iiwgc3Ryb2tlV2lkdGg6IDAuNSB9KSwKICAgICAgLy8gICAgIEcoZ28uU2hhcGUsICJMaW5lSCIsIHsgc3Ryb2tlOiAiZ3JheSIsIHN0cm9rZVdpZHRoOiAwLjUsIGludGVydmFsOiAxMCB9KSwKICAgICAgLy8gICAgIEcoZ28uU2hhcGUsICJMaW5lViIsIHsgc3Ryb2tlOiAibGlnaHRncmF5Iiwgc3Ryb2tlV2lkdGg6IDAuNSB9KSwKICAgICAgLy8gICAgIEcoZ28uU2hhcGUsICJMaW5lViIsIHsgc3Ryb2tlOiAiZ3JheSIsIHN0cm9rZVdpZHRoOiAwLjUsIGludGVydmFsOiAxMCB9KQogICAgICAvLyApLAogICAgICBhbGxvd0Ryb3A6IHRydWUsCiAgICAgIC8vIG11c3QgYmUgdHJ1ZSB0byBhY2NlcHQgZHJvcHMgZnJvbSB0aGUgUGFsZXR0ZQogICAgICBhbGxvd1RleHRFZGl0OiBmYWxzZSwKICAgICAgYWxsb3dIb3Jpem9udGFsU2Nyb2xsOiB0cnVlLAogICAgICBhbGxvd1ZlcnRpY2FsU2Nyb2xsOiB0cnVlLAogICAgICAvLyAiY2xpY2tDcmVhdGluZ1Rvb2wuaXNEb3VibGVDbGljayI6ZmFsc2UsCiAgICAgIC8vICJjbGlja0NyZWF0aW5nVG9vbC5hcmNoZXR5cGVOb2RlRGF0YSI6IHt9LCAvLyDlj4zlh7vliJvlu7rmlrDmraXpqqQKICAgICAgLy8gImRyYWdnaW5nVG9vbC5kcmFnc0xpbmsiOiB0cnVlLAogICAgICAiZHJhZ2dpbmdUb29sLmlzR3JpZFNuYXBFbmFibGVkIjogdHJ1ZSwKICAgICAgLy8gImxpbmtpbmdUb29sLmlzVW5jb25uZWN0ZWRMaW5rVmFsaWQiOiB0cnVlLAogICAgICAibGlua2luZ1Rvb2wucG9ydEdyYXZpdHkiOiAyMCwKICAgICAgLy8gInJlbGlua2luZ1Rvb2wuaXNVbmNvbm5lY3RlZExpbmtWYWxpZCI6IHRydWUsCiAgICAgICJyZWxpbmtpbmdUb29sLnBvcnRHcmF2aXR5IjogMjAsCiAgICAgICJyZWxpbmtpbmdUb29sLmZyb21IYW5kbGVBcmNoZXR5cGUiOiBHKGdvLlNoYXBlLCAiRGlhbW9uZCIsIHsKICAgICAgICBzZWdtZW50SW5kZXg6IDAsCiAgICAgICAgY3Vyc29yOiAicG9pbnRlciIsCiAgICAgICAgZGVzaXJlZFNpemU6IG5ldyBnby5TaXplKDgsIDgpLAogICAgICAgIGZpbGw6ICJ0b21hdG8iLAogICAgICAgIHN0cm9rZTogImRhcmtyZWQiCiAgICAgIH0pLAogICAgICAicmVsaW5raW5nVG9vbC50b0hhbmRsZUFyY2hldHlwZSI6IEcoZ28uU2hhcGUsICJEaWFtb25kIiwgewogICAgICAgIHNlZ21lbnRJbmRleDogLTEsCiAgICAgICAgY3Vyc29yOiAicG9pbnRlciIsCiAgICAgICAgZGVzaXJlZFNpemU6IG5ldyBnby5TaXplKDgsIDgpLAogICAgICAgIGZpbGw6ICJkYXJrcmVkIiwKICAgICAgICBzdHJva2U6ICJ0b21hdG8iCiAgICAgIH0pLAogICAgICAibGlua1Jlc2hhcGluZ1Rvb2wuaGFuZGxlQXJjaGV0eXBlIjogRyhnby5TaGFwZSwgIkRpYW1vbmQiLCB7CiAgICAgICAgZGVzaXJlZFNpemU6IG5ldyBnby5TaXplKDcsIDcpLAogICAgICAgIGZpbGw6ICJsaWdodGJsdWUiLAogICAgICAgIHN0cm9rZTogImRlZXBza3libHVlIgogICAgICB9KSwKICAgICAgInVuZG9NYW5hZ2VyLmlzRW5hYmxlZCI6IGZhbHNlCiAgICB9KTsgLy8g5rWB56iL5Zu+5aaC5p6c5pyJ5Y+Y5Yqo77yM5YiZ5o+Q56S655So5oi35L+d5a2YCgogICAgX2Rlc2lnbmVyLmFkZERpYWdyYW1MaXN0ZW5lcigiTW9kaWZpZWQiLCBvbkRpYWdyYW1Nb2RpZmllZCk7IC8vIOWPjOWHu+S6i+S7tgoKCiAgICBfZGVzaWduZXIuYWRkRGlhZ3JhbUxpc3RlbmVyKCJPYmplY3REb3VibGVDbGlja2VkIiwgb25PYmplY3REb3VibGVDbGlja2VkKTsgLy8g56e76Zmk5LqL5Lu2CgoKICAgIF9kZXNpZ25lci5hZGREaWFncmFtTGlzdGVuZXIoIlNlbGVjdGlvbkRlbGV0ZWQiLCBmdW5jdGlvbiAoZSkgewogICAgICBlLnN1YmplY3QuZWFjaChmdW5jdGlvbiAobikgewogICAgICAgIF90aGlzLlNlbGVjdGlvbkRlbGV0ZWQobi5kYXRhKTsKICAgICAgfSk7CiAgICB9KTsgLy/nur/nmoTnlJ/miJAKCgogICAgX2Rlc2lnbmVyLmFkZERpYWdyYW1MaXN0ZW5lcigiTGlua0RyYXduIiwgZnVuY3Rpb24gKGUpIHsKICAgICAgZS5zdWJqZWN0LmRhdGEua2V5ID0gZ3VpZCgpOwoKICAgICAgX3RoaXMuTGlua0RyYXduKGUuc3ViamVjdC5kYXRhKTsKICAgIH0pOyAvL+e6v+eahOmHjee7mAoKCiAgICBfZGVzaWduZXIuYWRkRGlhZ3JhbUxpc3RlbmVyKCJMaW5rUmVsaW5rZWQiLCBmdW5jdGlvbiAoZSkgewogICAgICBfdGhpcy5MaW5rUmVsaW5rZWQoZS5zdWJqZWN0LmRhdGEpOwogICAgfSk7IC8v5re75Yqg55uR5ZCs6IqC54K555Sf5oiQ5LqL5Lu2CgoKICAgIF9kZXNpZ25lci5hZGREaWFncmFtTGlzdGVuZXIoImV4dGVybmFsb2JqZWN0c2Ryb3BwZWQiLCBmdW5jdGlvbiAoZSkgewogICAgICAvLyB2YXIganNvbk5ld1N0ZXAgPSB7a2V5Ol9qc29uTmV3U3RlcC5rZXksIHRleHQ6X2pzb25OZXdTdGVwLnRleHR9OwogICAgICBlLnN1YmplY3QuZWFjaChmdW5jdGlvbiAobikgewogICAgICAgIC8v5b6X5Yiw5LuOUGFsZXR0ZeaLlui/h+adpeeahOiKgueCuQogICAgICAgIF90aGlzLmV4dGVybmFsb2JqZWN0c2Ryb3BwZWQobi5kYXRhKTsKICAgICAgfSk7IC8vIGpzb25OZXdTdGVwLmxvYyA9ICItMTAwIDAiOy8vIOKAnOaWsOatpemqpOKAneaYvuekuueahOS9jee9rgogICAgICAvLyBqc29uTmV3U3RlcC50eXBlID0gMCAKICAgICAgLy8ganNvbk5ld1N0ZXAua2V5ID0gZ3VpZCgpCiAgICAgIC8vIC8vIF9kZXNpZ25lci5tb2RlbC5hZGROb2RlRGF0YShqc29uTmV3U3RlcCk7CiAgICAgIC8vIF90aGlzLmV4dGVybmFsb2JqZWN0c2Ryb3BwZWQoanNvbk5ld1N0ZXApCiAgICB9KTsgLy/nm5HlkKzoioLngrnmiJbnur/nmoTliKDpmaTliY3kuovku7YKCgogICAgX2Rlc2lnbmVyLmNvbW1hbmRIYW5kbGVyLmNhbkRlbGV0ZVNlbGVjdGlvbiA9IGZ1bmN0aW9uIChlKSB7CiAgICAgIC8v55So5L6L6I635Y+W6YCJ5Lit55qE6IqC54K55oiW57q/IAogICAgICByZXR1cm4gX2Rlc2lnbmVyLnNlbGVjdGlvbi5hbGwoZnVuY3Rpb24gKG5vZGVPckxpbmspIHsKICAgICAgICAvL+WIpOaWreaYr+WQpuaYr+W8gOWni+aIluiAhee7k+adn+iKgueCuQogICAgICAgIGlmIChub2RlT3JMaW5rLmRhdGEudHlwZSA9PT0gMSB8fCBub2RlT3JMaW5rLmRhdGEudHlwZSA9PT0gMikgewogICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICAgIH0pOwogICAgfTsgLy8gdmFyIHRvb2wgPSBfZGVzaWduZXIudG9vbE1hbmFnZXIuY2xpY2tDcmVhdGluZ1Rvb2w7CiAgICAvLyB0b29sLmluc2VydFBhcnQgPSAobG9jKSA9PiB7CiAgICAvLyAgICAgdmFyIGpzb25OZXdTdGVwID0ge2tleTpfanNvbk5ld1N0ZXAua2V5LCB0ZXh0Ol9qc29uTmV3U3RlcC50ZXh0fTsKICAgIC8vICAgICBqc29uTmV3U3RlcC50eXBlID0gMCAKICAgIC8vICAgICBqc29uTmV3U3RlcC5sb2MgPSBgJHtsb2MueH0gJHtsb2MueX1gOwogICAgLy8gICAgIF9kZXNpZ25lci5tb2RlbC5hZGROb2RlRGF0YShqc29uTmV3U3RlcCk7CiAgICAvLyAgICAgX3RoaXMuZXh0ZXJuYWxvYmplY3RzZHJvcHBlZChqc29uTmV3U3RlcCkKICAgIC8vIH0KICAgIC8vIOa1geeoi+atpemqpOeahOagt+W8j+aooeadvwogICAgLy8gX2Rlc2lnbmVyLm5vZGVUZW1wbGF0ZSA9IGFwcHJvdmFsTm9kZVRlbXBsYXRlKCk7CiAgICAvLyBfZGVzaWduZXIubm9kZVRlbXBsYXRlID0gb3BlcmF0aW9uTm9kZVRlbXBsYXRlKCk7CiAgICAvLyBfZGVzaWduZXIubm9kZVRlbXBsYXRlTWFwLmFkZCgnQXBwcm92YWwnLGFwcHJvdmFsTm9kZVRlbXBsYXRlKQogICAgLy8g5pyN5Yqh6IqC54K5CgoKICAgIF9kZXNpZ25lci5ub2RlVGVtcGxhdGVNYXAuYWRkKCdTdWJwcm9jZXNzZXMnLCBHKGdvLk5vZGUsICJTcG90IiwgewogICAgICBsb2NhdGlvblNwb3Q6IGdvLlNwb3QuQ2VudGVyCiAgICB9LCBuZXcgZ28uQmluZGluZygibG9jYXRpb24iLCAibG9jIiwgZ28uUG9pbnQucGFyc2UpLm1ha2VUd29XYXkoZ28uUG9pbnQuc3RyaW5naWZ5KSwgewogICAgICBzZWxlY3RhYmxlOiB0cnVlLAogICAgICBzZWxlY3Rpb25BZG9ybm1lbnRUZW1wbGF0ZTogbWFrZU5vZGVTZWxlY3Rpb25BZG9ybm1lbnRUZW1wbGF0ZSgpCiAgICB9LCBuZXcgZ28uQmluZGluZygiYW5nbGUiKS5tYWtlVHdvV2F5KCksIC8vIHRoZSBtYWluIG9iamVjdCBpcyBhIFBhbmVsIHRoYXQgc3Vycm91bmRzIGEgVGV4dEJsb2NrIHdpdGggYSBTaGFwZQogICAgRyhnby5QYW5lbCwgIkF1dG8iLCB7CiAgICAgIG5hbWU6ICJQQU5FTCIKICAgIH0sIG5ldyBnby5CaW5kaW5nKCJkZXNpcmVkU2l6ZSIsICJzaXplIiwgZ28uU2l6ZS5wYXJzZSkubWFrZVR3b1dheShnby5TaXplLnN0cmluZ2lmeSksIEcoZ28uU2hhcGUsICJSb3VuZGVkUmVjdGFuZ2xlIiwgLy8gZGVmYXVsdCBmaWd1cmUKICAgIHsKICAgICAgcG9ydElkOiAiIiwKICAgICAgLy8gdGhlIGRlZmF1bHQgcG9ydDogaWYgbm8gc3BvdCBvbiBsaW5rIGRhdGEsIHVzZSBjbG9zZXN0IHNpZGUKICAgICAgbmFtZTogIlBJUEUiLAogICAgICBmcm9tTGlua2FibGU6IHRydWUsCiAgICAgIHRvTGlua2FibGU6IHRydWUsCiAgICAgIGN1cnNvcjogInBvaW50ZXIiLAogICAgICBmaWxsOiAid2hpdGUiLAogICAgICAvLyBkZWZhdWx0IGNvbG9yCiAgICAgIHN0cm9rZVdpZHRoOiAxLAogICAgICBzdHJva2U6ICIjRENERUUyIgogICAgfSwgbmV3IGdvLkJpbmRpbmcoImZpZ3VyZSIpLCBuZXcgZ28uQmluZGluZygic3Ryb2tlIiksIG5ldyBnby5CaW5kaW5nKCJzdHJva2VEYXNoQXJyYXkiKSwgbmV3IGdvLkJpbmRpbmcoInN0cm9rZVdpZHRoIiksIG5ldyBnby5CaW5kaW5nKCJmaWxsIikpLCBHKGdvLlNoYXBlLCB7CiAgICAgIG1hcmdpbjogNSwKICAgICAgZmlsbDogJ2JsYWNrJywKICAgICAgc3Ryb2tlV2lkdGg6IDAsCiAgICAgIHdpZHRoOiAyOCwKICAgICAgaGVpZ2h0OiAyMCwKICAgICAgYWxpZ25tZW50OiBnby5TcG90LlRvcFJpZ2h0LAogICAgICBnZW9tZXRyeTogZ28uR2VvbWV0cnkucGFyc2UoZ2VvRnVuYygnc3VicHJvY2Vzc2VzJykpCiAgICB9KSwgRyhnby5UZXh0QmxvY2ssIChfRyA9IHsKICAgICAgZm9udDogImJvbGQgMTFwdCBIZWx2ZXRpY2EsIEFyaWFsLCBzYW5zLXNlcmlmIiwKICAgICAgbWFyZ2luOiA4LAogICAgICB3cmFwOiBnby5UZXh0QmxvY2suV3JhcEZpdCwKICAgICAgc3Ryb2tlOiAiIzM0MzQzNCIsCiAgICAgIHRleHRBbGlnbjogImNlbnRlciIsCiAgICAgIGFsaWdubWVudDogZ28uU3BvdC5DZW50ZXIsCiAgICAgIHZlcnRpY2FsQWxpZ25tZW50OiBnby5TcG90LkNlbnRlcgogICAgfSwgX2RlZmluZVByb3BlcnR5KF9HLCAid3JhcCIsIGdvLlRleHRCbG9jay5XcmFwRml0KSwgX2RlZmluZVByb3BlcnR5KF9HLCAibWluU2l6ZSIsIG5ldyBnby5TaXplKDEyNiwgMjcpKSwgX2RlZmluZVByb3BlcnR5KF9HLCAibWF4U2l6ZSIsIG5ldyBnby5TaXplKDEyNiwgTmFOKSksIF9HKSwgbmV3IGdvLkJpbmRpbmcoInRleHQiKS5tYWtlVHdvV2F5KCkpLCAvLyB0aGUgbGFiZWwgc2hvd3MgdGhlIG5vZGUgZGF0YSdzIHRleHQKICAgIHsKICAgICAgdG9vbFRpcDogLy8gdGhpcyB0b29sdGlwIEFkb3JubWVudCBpcyBzaGFyZWQgYnkgYWxsIG5vZGVzCiAgICAgIEcoZ28uQWRvcm5tZW50LCAiQXV0byIsIEcoZ28uU2hhcGUsIHsKICAgICAgICBmaWxsOiAiI0ZGRkZDQyIKICAgICAgfSksIEcoZ28uVGV4dEJsb2NrLCB7CiAgICAgICAgbWFyZ2luOiA0CiAgICAgIH0sIC8vIHRoZSB0b29sdGlwIHNob3dzIHRoZSByZXN1bHQgb2YgY2FsbGluZyBub2RlSW5mbyhkYXRhKQogICAgICBuZXcgZ28uQmluZGluZygidGV4dCIsICIiLCBub2RlSW5mbykpKSAvLyDnu5HlrprkuIrkuIvmlofoj5zljZUKICAgICAgLy8gY29udGV4dE1lbnU6IG1ha2VQYXJ0Q29udGV4dE1lbnUoKQoKICAgIH0pLCAvLyA05Liq6L+e5o6l54K5CiAgICBtYWtlTm9kZVBvcnQoIlQiLCBnby5TcG90LlRvcCwgZmFsc2UsIHRydWUpLCBtYWtlTm9kZVBvcnQoIkwiLCBnby5TcG90LkxlZnQsIHRydWUsIHRydWUpLCBtYWtlTm9kZVBvcnQoIlIiLCBnby5TcG90LlJpZ2h0LCB0cnVlLCB0cnVlKSwgbWFrZU5vZGVQb3J0KCJCIiwgZ28uU3BvdC5Cb3R0b20sIHRydWUsIGZhbHNlKSwgewogICAgICBtb3VzZUVudGVyOiBmdW5jdGlvbiBtb3VzZUVudGVyKGUsIG5vZGUpIHsKICAgICAgICBzaG93Tm9kZVBvcnQobm9kZSwgdHJ1ZSk7CiAgICAgIH0sCiAgICAgIG1vdXNlTGVhdmU6IGZ1bmN0aW9uIG1vdXNlTGVhdmUoZSwgbm9kZSkgewogICAgICAgIHNob3dOb2RlUG9ydChub2RlLCBmYWxzZSk7CiAgICAgIH0KICAgIH0pKTsgLy8g5pyN5Yqh6IqC54K5CgoKICAgIF9kZXNpZ25lci5ub2RlVGVtcGxhdGVNYXAuYWRkKCdTZXJ2aWNlJywgRyhnby5Ob2RlLCAiU3BvdCIsIHsKICAgICAgbG9jYXRpb25TcG90OiBnby5TcG90LkNlbnRlcgogICAgfSwgbmV3IGdvLkJpbmRpbmcoImxvY2F0aW9uIiwgImxvYyIsIGdvLlBvaW50LnBhcnNlKS5tYWtlVHdvV2F5KGdvLlBvaW50LnN0cmluZ2lmeSksIHsKICAgICAgc2VsZWN0YWJsZTogdHJ1ZSwKICAgICAgc2VsZWN0aW9uQWRvcm5tZW50VGVtcGxhdGU6IG1ha2VOb2RlU2VsZWN0aW9uQWRvcm5tZW50VGVtcGxhdGUoKQogICAgfSwgbmV3IGdvLkJpbmRpbmcoImFuZ2xlIikubWFrZVR3b1dheSgpLCAvLyB0aGUgbWFpbiBvYmplY3QgaXMgYSBQYW5lbCB0aGF0IHN1cnJvdW5kcyBhIFRleHRCbG9jayB3aXRoIGEgU2hhcGUKICAgIEcoZ28uUGFuZWwsICJBdXRvIiwgewogICAgICBuYW1lOiAiUEFORUwiCiAgICB9LCBuZXcgZ28uQmluZGluZygiZGVzaXJlZFNpemUiLCAic2l6ZSIsIGdvLlNpemUucGFyc2UpLm1ha2VUd29XYXkoZ28uU2l6ZS5zdHJpbmdpZnkpLCBHKGdvLlNoYXBlLCAiUm91bmRlZFJlY3RhbmdsZSIsIC8vIGRlZmF1bHQgZmlndXJlCiAgICB7CiAgICAgIHBvcnRJZDogIiIsCiAgICAgIC8vIHRoZSBkZWZhdWx0IHBvcnQ6IGlmIG5vIHNwb3Qgb24gbGluayBkYXRhLCB1c2UgY2xvc2VzdCBzaWRlCiAgICAgIG5hbWU6ICJQSVBFIiwKICAgICAgZnJvbUxpbmthYmxlOiB0cnVlLAogICAgICB0b0xpbmthYmxlOiB0cnVlLAogICAgICBjdXJzb3I6ICJwb2ludGVyIiwKICAgICAgZmlsbDogIndoaXRlIiwKICAgICAgLy8gZGVmYXVsdCBjb2xvcgogICAgICBzdHJva2VXaWR0aDogMSwKICAgICAgc3Ryb2tlOiAiI0RDREVFMiIKICAgIH0sIG5ldyBnby5CaW5kaW5nKCJmaWd1cmUiKSwgbmV3IGdvLkJpbmRpbmcoInN0cm9rZSIpLCBuZXcgZ28uQmluZGluZygic3Ryb2tlRGFzaEFycmF5IiksIG5ldyBnby5CaW5kaW5nKCJzdHJva2VXaWR0aCIpLCBuZXcgZ28uQmluZGluZygiZmlsbCIpKSwgRyhnby5TaGFwZSwgewogICAgICBtYXJnaW46IDUsCiAgICAgIGZpbGw6ICdibGFjaycsCiAgICAgIHN0cm9rZVdpZHRoOiAwLAogICAgICB3aWR0aDogMjgsCiAgICAgIGhlaWdodDogMjAsCiAgICAgIGFsaWdubWVudDogZ28uU3BvdC5Ub3BSaWdodCwKICAgICAgZ2VvbWV0cnk6IGdvLkdlb21ldHJ5LnBhcnNlKGdlb0Z1bmMoJ3NlcnZpY2UnKSkKICAgIH0pLCBHKGdvLlRleHRCbG9jaywgKF9HMiA9IHsKICAgICAgZm9udDogImJvbGQgMTFwdCBIZWx2ZXRpY2EsIEFyaWFsLCBzYW5zLXNlcmlmIiwKICAgICAgbWFyZ2luOiA4LAogICAgICB3cmFwOiBnby5UZXh0QmxvY2suV3JhcEZpdCwKICAgICAgc3Ryb2tlOiAiIzM0MzQzNCIsCiAgICAgIHRleHRBbGlnbjogImNlbnRlciIsCiAgICAgIGFsaWdubWVudDogZ28uU3BvdC5DZW50ZXIsCiAgICAgIHZlcnRpY2FsQWxpZ25tZW50OiBnby5TcG90LkNlbnRlcgogICAgfSwgX2RlZmluZVByb3BlcnR5KF9HMiwgIndyYXAiLCBnby5UZXh0QmxvY2suV3JhcEZpdCksIF9kZWZpbmVQcm9wZXJ0eShfRzIsICJtaW5TaXplIiwgbmV3IGdvLlNpemUoMTI2LCAyNykpLCBfZGVmaW5lUHJvcGVydHkoX0cyLCAibWF4U2l6ZSIsIG5ldyBnby5TaXplKDEyNiwgTmFOKSksIF9HMiksIG5ldyBnby5CaW5kaW5nKCJ0ZXh0IikubWFrZVR3b1dheSgpKSwgLy8gdGhlIGxhYmVsIHNob3dzIHRoZSBub2RlIGRhdGEncyB0ZXh0CiAgICB7CiAgICAgIHRvb2xUaXA6IC8vIHRoaXMgdG9vbHRpcCBBZG9ybm1lbnQgaXMgc2hhcmVkIGJ5IGFsbCBub2RlcwogICAgICBHKGdvLkFkb3JubWVudCwgIkF1dG8iLCBHKGdvLlNoYXBlLCB7CiAgICAgICAgZmlsbDogIiNGRkZGQ0MiCiAgICAgIH0pLCBHKGdvLlRleHRCbG9jaywgewogICAgICAgIG1hcmdpbjogNAogICAgICB9LCAvLyB0aGUgdG9vbHRpcCBzaG93cyB0aGUgcmVzdWx0IG9mIGNhbGxpbmcgbm9kZUluZm8oZGF0YSkKICAgICAgbmV3IGdvLkJpbmRpbmcoInRleHQiLCAiIiwgbm9kZUluZm8pKSkgLy8g57uR5a6a5LiK5LiL5paH6I+c5Y2VCiAgICAgIC8vIGNvbnRleHRNZW51OiBtYWtlUGFydENvbnRleHRNZW51KCkKCiAgICB9KSwgLy8gNOS4qui/nuaOpeeCuQogICAgbWFrZU5vZGVQb3J0KCJUIiwgZ28uU3BvdC5Ub3AsIGZhbHNlLCB0cnVlKSwgbWFrZU5vZGVQb3J0KCJMIiwgZ28uU3BvdC5MZWZ0LCB0cnVlLCB0cnVlKSwgbWFrZU5vZGVQb3J0KCJSIiwgZ28uU3BvdC5SaWdodCwgdHJ1ZSwgdHJ1ZSksIG1ha2VOb2RlUG9ydCgiQiIsIGdvLlNwb3QuQm90dG9tLCB0cnVlLCBmYWxzZSksIHsKICAgICAgbW91c2VFbnRlcjogZnVuY3Rpb24gbW91c2VFbnRlcihlLCBub2RlKSB7CiAgICAgICAgc2hvd05vZGVQb3J0KG5vZGUsIHRydWUpOwogICAgICB9LAogICAgICBtb3VzZUxlYXZlOiBmdW5jdGlvbiBtb3VzZUxlYXZlKGUsIG5vZGUpIHsKICAgICAgICBzaG93Tm9kZVBvcnQobm9kZSwgZmFsc2UpOwogICAgICB9CiAgICB9KSk7IC8vIOWuoeaJueiKgueCuQoKCiAgICBfZGVzaWduZXIubm9kZVRlbXBsYXRlTWFwLmFkZCgnQXBwcm92YWwnLCBHKGdvLk5vZGUsICJTcG90IiwgewogICAgICBsb2NhdGlvblNwb3Q6IGdvLlNwb3QuQ2VudGVyCiAgICB9LCBuZXcgZ28uQmluZGluZygibG9jYXRpb24iLCAibG9jIiwgZ28uUG9pbnQucGFyc2UpLm1ha2VUd29XYXkoZ28uUG9pbnQuc3RyaW5naWZ5KSwgewogICAgICBzZWxlY3RhYmxlOiB0cnVlLAogICAgICBzZWxlY3Rpb25BZG9ybm1lbnRUZW1wbGF0ZTogbWFrZU5vZGVTZWxlY3Rpb25BZG9ybm1lbnRUZW1wbGF0ZSgpCiAgICB9LCBuZXcgZ28uQmluZGluZygiYW5nbGUiKS5tYWtlVHdvV2F5KCksIC8vIHRoZSBtYWluIG9iamVjdCBpcyBhIFBhbmVsIHRoYXQgc3Vycm91bmRzIGEgVGV4dEJsb2NrIHdpdGggYSBTaGFwZQogICAgRyhnby5QYW5lbCwgIkF1dG8iLCB7CiAgICAgIG5hbWU6ICJQQU5FTCIKICAgIH0sIG5ldyBnby5CaW5kaW5nKCJkZXNpcmVkU2l6ZSIsICJzaXplIiwgZ28uU2l6ZS5wYXJzZSkubWFrZVR3b1dheShnby5TaXplLnN0cmluZ2lmeSksIEcoZ28uU2hhcGUsICJSb3VuZGVkUmVjdGFuZ2xlIiwgLy8gZGVmYXVsdCBmaWd1cmUKICAgIHsKICAgICAgcG9ydElkOiAiIiwKICAgICAgLy8gdGhlIGRlZmF1bHQgcG9ydDogaWYgbm8gc3BvdCBvbiBsaW5rIGRhdGEsIHVzZSBjbG9zZXN0IHNpZGUKICAgICAgbmFtZTogIlBJUEUiLAogICAgICBmcm9tTGlua2FibGU6IHRydWUsCiAgICAgIHRvTGlua2FibGU6IHRydWUsCiAgICAgIGN1cnNvcjogInBvaW50ZXIiLAogICAgICBmaWxsOiAid2hpdGUiLAogICAgICAvLyBkZWZhdWx0IGNvbG9yCiAgICAgIHN0cm9rZVdpZHRoOiAxLAogICAgICBzdHJva2U6ICIjRENERUUyIgogICAgfSwgbmV3IGdvLkJpbmRpbmcoImZpZ3VyZSIpLCBuZXcgZ28uQmluZGluZygic3Ryb2tlIiksIG5ldyBnby5CaW5kaW5nKCJzdHJva2VEYXNoQXJyYXkiKSwgbmV3IGdvLkJpbmRpbmcoInN0cm9rZVdpZHRoIiksIG5ldyBnby5CaW5kaW5nKCJmaWxsIikpLCBHKGdvLlNoYXBlLCB7CiAgICAgIG1hcmdpbjogNSwKICAgICAgZmlsbDogJ2JsYWNrJywKICAgICAgc3Ryb2tlV2lkdGg6IDAsCiAgICAgIHdpZHRoOiAyOCwKICAgICAgaGVpZ2h0OiAyMCwKICAgICAgYWxpZ25tZW50OiBnby5TcG90LlRvcFJpZ2h0LAogICAgICBnZW9tZXRyeTogZ28uR2VvbWV0cnkucGFyc2UoZ2VvRnVuYygnYXBwcm92YWwnKSkKICAgIH0pLCBHKGdvLlRleHRCbG9jaywgKF9HMyA9IHsKICAgICAgZm9udDogImJvbGQgMTFwdCBIZWx2ZXRpY2EsIEFyaWFsLCBzYW5zLXNlcmlmIiwKICAgICAgbWFyZ2luOiA4LAogICAgICB3cmFwOiBnby5UZXh0QmxvY2suV3JhcEZpdCwKICAgICAgc3Ryb2tlOiAiIzM0MzQzNCIsCiAgICAgIHRleHRBbGlnbjogImNlbnRlciIsCiAgICAgIGFsaWdubWVudDogZ28uU3BvdC5DZW50ZXIsCiAgICAgIHZlcnRpY2FsQWxpZ25tZW50OiBnby5TcG90LkNlbnRlcgogICAgfSwgX2RlZmluZVByb3BlcnR5KF9HMywgIndyYXAiLCBnby5UZXh0QmxvY2suV3JhcEZpdCksIF9kZWZpbmVQcm9wZXJ0eShfRzMsICJtaW5TaXplIiwgbmV3IGdvLlNpemUoMTI2LCAyNykpLCBfZGVmaW5lUHJvcGVydHkoX0czLCAibWF4U2l6ZSIsIG5ldyBnby5TaXplKDEyNiwgTmFOKSksIF9HMyksIG5ldyBnby5CaW5kaW5nKCJ0ZXh0IikubWFrZVR3b1dheSgpKSwgLy8gdGhlIGxhYmVsIHNob3dzIHRoZSBub2RlIGRhdGEncyB0ZXh0CiAgICB7CiAgICAgIHRvb2xUaXA6IC8vIHRoaXMgdG9vbHRpcCBBZG9ybm1lbnQgaXMgc2hhcmVkIGJ5IGFsbCBub2RlcwogICAgICBHKGdvLkFkb3JubWVudCwgIkF1dG8iLCBHKGdvLlNoYXBlLCB7CiAgICAgICAgZmlsbDogIiNGRkZGQ0MiCiAgICAgIH0pLCBHKGdvLlRleHRCbG9jaywgewogICAgICAgIG1hcmdpbjogNAogICAgICB9LCAvLyB0aGUgdG9vbHRpcCBzaG93cyB0aGUgcmVzdWx0IG9mIGNhbGxpbmcgbm9kZUluZm8oZGF0YSkKICAgICAgbmV3IGdvLkJpbmRpbmcoInRleHQiLCAiIiwgbm9kZUluZm8pKSkgLy8g57uR5a6a5LiK5LiL5paH6I+c5Y2VCiAgICAgIC8vIGNvbnRleHRNZW51OiBtYWtlUGFydENvbnRleHRNZW51KCkKCiAgICB9KSwgLy8gNOS4qui/nuaOpeeCuQogICAgbWFrZU5vZGVQb3J0KCJUIiwgZ28uU3BvdC5Ub3AsIGZhbHNlLCB0cnVlKSwgbWFrZU5vZGVQb3J0KCJMIiwgZ28uU3BvdC5MZWZ0LCB0cnVlLCB0cnVlKSwgbWFrZU5vZGVQb3J0KCJSIiwgZ28uU3BvdC5SaWdodCwgdHJ1ZSwgdHJ1ZSksIG1ha2VOb2RlUG9ydCgiQiIsIGdvLlNwb3QuQm90dG9tLCB0cnVlLCBmYWxzZSksIHsKICAgICAgbW91c2VFbnRlcjogZnVuY3Rpb24gbW91c2VFbnRlcihlLCBub2RlKSB7CiAgICAgICAgc2hvd05vZGVQb3J0KG5vZGUsIHRydWUpOwogICAgICB9LAogICAgICBtb3VzZUxlYXZlOiBmdW5jdGlvbiBtb3VzZUxlYXZlKGUsIG5vZGUpIHsKICAgICAgICBzaG93Tm9kZVBvcnQobm9kZSwgZmFsc2UpOwogICAgICB9CiAgICB9KSk7IC8vIOaTjeS9nOiKgueCuQoKCiAgICBfZGVzaWduZXIubm9kZVRlbXBsYXRlTWFwLmFkZCgnT3BlcmF0aW9uJywgRyhnby5Ob2RlLCAiU3BvdCIsIHsKICAgICAgbG9jYXRpb25TcG90OiBnby5TcG90LkNlbnRlcgogICAgfSwgbmV3IGdvLkJpbmRpbmcoImxvY2F0aW9uIiwgImxvYyIsIGdvLlBvaW50LnBhcnNlKS5tYWtlVHdvV2F5KGdvLlBvaW50LnN0cmluZ2lmeSksIHsKICAgICAgc2VsZWN0YWJsZTogdHJ1ZSwKICAgICAgc2VsZWN0aW9uQWRvcm5tZW50VGVtcGxhdGU6IG1ha2VOb2RlU2VsZWN0aW9uQWRvcm5tZW50VGVtcGxhdGUoKQogICAgfSwgbmV3IGdvLkJpbmRpbmcoImFuZ2xlIikubWFrZVR3b1dheSgpLCAvLyB0aGUgbWFpbiBvYmplY3QgaXMgYSBQYW5lbCB0aGF0IHN1cnJvdW5kcyBhIFRleHRCbG9jayB3aXRoIGEgU2hhcGUKICAgIEcoZ28uUGFuZWwsICJBdXRvIiwgewogICAgICBuYW1lOiAiUEFORUwiCiAgICB9LCBuZXcgZ28uQmluZGluZygiZGVzaXJlZFNpemUiLCAic2l6ZSIsIGdvLlNpemUucGFyc2UpLm1ha2VUd29XYXkoZ28uU2l6ZS5zdHJpbmdpZnkpLCBHKGdvLlNoYXBlLCAiUm91bmRlZFJlY3RhbmdsZSIsIC8vIGRlZmF1bHQgZmlndXJlCiAgICB7CiAgICAgIHBvcnRJZDogIiIsCiAgICAgIC8vIHRoZSBkZWZhdWx0IHBvcnQ6IGlmIG5vIHNwb3Qgb24gbGluayBkYXRhLCB1c2UgY2xvc2VzdCBzaWRlCiAgICAgIG5hbWU6ICJQSVBFIiwKICAgICAgZnJvbUxpbmthYmxlOiB0cnVlLAogICAgICB0b0xpbmthYmxlOiB0cnVlLAogICAgICBjdXJzb3I6ICJwb2ludGVyIiwKICAgICAgZmlsbDogIndoaXRlIiwKICAgICAgLy8gZGVmYXVsdCBjb2xvcgogICAgICBzdHJva2VXaWR0aDogMSwKICAgICAgc3Ryb2tlOiAiI0RDREVFMiIKICAgIH0sIG5ldyBnby5CaW5kaW5nKCJmaWd1cmUiKSwgbmV3IGdvLkJpbmRpbmcoInN0cm9rZSIpLCBuZXcgZ28uQmluZGluZygic3Ryb2tlRGFzaEFycmF5IiksIG5ldyBnby5CaW5kaW5nKCJzdHJva2VXaWR0aCIpLCBuZXcgZ28uQmluZGluZygiZmlsbCIpKSwgRyhnby5TaGFwZSwgewogICAgICBtYXJnaW46IDUsCiAgICAgIGZpbGw6ICdibGFjaycsCiAgICAgIHN0cm9rZVdpZHRoOiAwLAogICAgICB3aWR0aDogMjgsCiAgICAgIGhlaWdodDogMjAsCiAgICAgIGFsaWdubWVudDogZ28uU3BvdC5Ub3BSaWdodCwKICAgICAgZ2VvbWV0cnk6IGdvLkdlb21ldHJ5LnBhcnNlKGdlb0Z1bmMoJ29wZXJhdGlvbicpKQogICAgfSksIEcoZ28uVGV4dEJsb2NrLCAoX0c0ID0gewogICAgICBmb250OiAiYm9sZCAxMXB0IEhlbHZldGljYSwgQXJpYWwsIHNhbnMtc2VyaWYiLAogICAgICBtYXJnaW46IDgsCiAgICAgIHdyYXA6IGdvLlRleHRCbG9jay5XcmFwRml0LAogICAgICBzdHJva2U6ICIjMzQzNDM0IiwKICAgICAgdGV4dEFsaWduOiAiY2VudGVyIiwKICAgICAgYWxpZ25tZW50OiBnby5TcG90LkNlbnRlciwKICAgICAgdmVydGljYWxBbGlnbm1lbnQ6IGdvLlNwb3QuQ2VudGVyCiAgICB9LCBfZGVmaW5lUHJvcGVydHkoX0c0LCAid3JhcCIsIGdvLlRleHRCbG9jay5XcmFwRml0KSwgX2RlZmluZVByb3BlcnR5KF9HNCwgIm1pblNpemUiLCBuZXcgZ28uU2l6ZSgxMjYsIDI3KSksIF9kZWZpbmVQcm9wZXJ0eShfRzQsICJtYXhTaXplIiwgbmV3IGdvLlNpemUoMTI2LCBOYU4pKSwgX0c0KSwgbmV3IGdvLkJpbmRpbmcoInRleHQiKS5tYWtlVHdvV2F5KCkpLCAvLyB0aGUgbGFiZWwgc2hvd3MgdGhlIG5vZGUgZGF0YSdzIHRleHQKICAgIHsKICAgICAgdG9vbFRpcDogLy8gdGhpcyB0b29sdGlwIEFkb3JubWVudCBpcyBzaGFyZWQgYnkgYWxsIG5vZGVzCiAgICAgIEcoZ28uQWRvcm5tZW50LCAiQXV0byIsIEcoZ28uU2hhcGUsIHsKICAgICAgICBmaWxsOiAiI0ZGRkZDQyIKICAgICAgfSksIEcoZ28uVGV4dEJsb2NrLCB7CiAgICAgICAgbWFyZ2luOiA0CiAgICAgIH0sIC8vIHRoZSB0b29sdGlwIHNob3dzIHRoZSByZXN1bHQgb2YgY2FsbGluZyBub2RlSW5mbyhkYXRhKQogICAgICBuZXcgZ28uQmluZGluZygidGV4dCIsICIiLCBub2RlSW5mbykpKSAvLyDnu5HlrprkuIrkuIvmlofoj5zljZUKICAgICAgLy8gY29udGV4dE1lbnU6IG1ha2VQYXJ0Q29udGV4dE1lbnUoKQoKICAgIH0pLCAvLyA05Liq6L+e5o6l54K5CiAgICBtYWtlTm9kZVBvcnQoIlQiLCBnby5TcG90LlRvcCwgZmFsc2UsIHRydWUpLCBtYWtlTm9kZVBvcnQoIkwiLCBnby5TcG90LkxlZnQsIHRydWUsIHRydWUpLCBtYWtlTm9kZVBvcnQoIlIiLCBnby5TcG90LlJpZ2h0LCB0cnVlLCB0cnVlKSwgbWFrZU5vZGVQb3J0KCJCIiwgZ28uU3BvdC5Cb3R0b20sIHRydWUsIGZhbHNlKSwgewogICAgICBtb3VzZUVudGVyOiBmdW5jdGlvbiBtb3VzZUVudGVyKGUsIG5vZGUpIHsKICAgICAgICBzaG93Tm9kZVBvcnQobm9kZSwgdHJ1ZSk7CiAgICAgIH0sCiAgICAgIG1vdXNlTGVhdmU6IGZ1bmN0aW9uIG1vdXNlTGVhdmUoZSwgbm9kZSkgewogICAgICAgIHNob3dOb2RlUG9ydChub2RlLCBmYWxzZSk7CiAgICAgIH0KICAgIH0pKTsgLy8g5re75Yqg5byA5aeL6IqC54K5CgoKICAgIF9kZXNpZ25lci5ub2RlVGVtcGxhdGVNYXAuYWRkKCJTdGFydCIsIEcoZ28uTm9kZSwgIlNwb3QiLCB7CiAgICAgIGxvY2F0aW9uU3BvdDogZ28uU3BvdC5DZW50ZXIKICAgIH0sIG5ldyBnby5CaW5kaW5nKCJsb2NhdGlvbiIsICJsb2MiLCBnby5Qb2ludC5wYXJzZSkubWFrZVR3b1dheShnby5Qb2ludC5zdHJpbmdpZnkpLCB7CiAgICAgIHNlbGVjdGFibGU6IHRydWUsCiAgICAgIHNlbGVjdGlvbkFkb3JubWVudFRlbXBsYXRlOiBtYWtlTm9kZVNlbGVjdGlvbkFkb3JubWVudFRlbXBsYXRlKCkKICAgIH0sIG5ldyBnby5CaW5kaW5nKCJhbmdsZSIpLm1ha2VUd29XYXkoKSwgRyhnby5QYW5lbCwgIkF1dG8iLCB7CiAgICAgIG5hbWU6ICJTdGFydCIKICAgIH0sIG5ldyBnby5CaW5kaW5nKCJkZXNpcmVkU2l6ZSIsICJzaXplIiwgZ28uU2l6ZS5wYXJzZSkubWFrZVR3b1dheShnby5TaXplLnN0cmluZ2lmeSksIEcoZ28uU2hhcGUsICJDaXJjbGUiLCAvLyBkZWZhdWx0IGZpZ3VyZQogICAgewogICAgICBwb3J0SWQ6ICIiLAogICAgICAvLyB0aGUgZGVmYXVsdCBwb3J0OiBpZiBubyBzcG90IG9uIGxpbmsgZGF0YSwgdXNlIGNsb3Nlc3Qgc2lkZQogICAgICBuYW1lOiAiU3RhcnQiLAogICAgICBmcm9tTGlua2FibGU6IHRydWUsCiAgICAgIHRvTGlua2FibGU6IHRydWUsCiAgICAgIGN1cnNvcjogInBvaW50ZXIiLAogICAgICBmaWxsOiAiIzVGNzc5MCIsCiAgICAgIC8vIGRlZmF1bHQgY29sb3IKICAgICAgc3Ryb2tlV2lkdGg6IDEsCiAgICAgIHN0cm9rZTogIiM1Rjc3OTAiIC8vIGdlb21ldHJ5U3RyaW5nOiAiRiBNMCAwIEwxMDAgMCBCLTkwIDE4MCAxMDAgMjUgMjUgMjUgTDAgNTAgQjkwIDE4MCAwIDI1IDI1IDI1IgoKICAgIH0sIG5ldyBnby5CaW5kaW5nKCJmaWd1cmUiKSwgbmV3IGdvLkJpbmRpbmcoInN0cm9rZSIpLCBuZXcgZ28uQmluZGluZygic3Ryb2tlRGFzaEFycmF5IiksIG5ldyBnby5CaW5kaW5nKCJzdHJva2VXaWR0aCIpLCBuZXcgZ28uQmluZGluZygiZmlsbCIpKSwgRyhnby5UZXh0QmxvY2ssIHsKICAgICAgZm9udDogImJvbGQgMTFwdCBIZWx2ZXRpY2EsIEFyaWFsLCBzYW5zLXNlcmlmIiwKICAgICAgbWFyZ2luOiA4LAogICAgICB3cmFwOiBnby5UZXh0QmxvY2suV3JhcEZpdCwKICAgICAgc3Ryb2tlOiAid2hpdGUiLAogICAgICBvdmVyZmxvdzogZ28uVGV4dEJsb2NrLk92ZXJmbG93RWxsaXBzaXMKICAgIH0sIG5ldyBnby5CaW5kaW5nKCJ0ZXh0IikubWFrZVR3b1dheSgpKSwgewogICAgICB0b29sVGlwOiBHKGdvLkFkb3JubWVudCwgIkF1dG8iLCBHKGdvLlNoYXBlLCB7CiAgICAgICAgZmlsbDogIiNGRkZGQ0MiCiAgICAgIH0pLCBHKGdvLlRleHRCbG9jaywgewogICAgICAgIG1hcmdpbjogNAogICAgICB9LCBuZXcgZ28uQmluZGluZygidGV4dCIsICIiLCBub2RlSW5mbykpKQogICAgfSksIC8vIDTkuKrov57mjqXngrkKICAgIG1ha2VOb2RlUG9ydCgiQiIsIGdvLlNwb3QuQm90dG9tLCB0cnVlLCBmYWxzZSksIHsKICAgICAgbW91c2VFbnRlcjogZnVuY3Rpb24gbW91c2VFbnRlcihlLCBub2RlKSB7CiAgICAgICAgc2hvd05vZGVQb3J0KG5vZGUsIHRydWUpOwogICAgICB9LAogICAgICBtb3VzZUxlYXZlOiBmdW5jdGlvbiBtb3VzZUxlYXZlKGUsIG5vZGUpIHsKICAgICAgICBzaG93Tm9kZVBvcnQobm9kZSwgZmFsc2UpOwogICAgICB9CiAgICB9KSk7IC8vIOa3u+WKoOe7k+adn+iKgueCuQoKCiAgICBfZGVzaWduZXIubm9kZVRlbXBsYXRlTWFwLmFkZCgiRW5kIiwgRyhnby5Ob2RlLCAiU3BvdCIsIHsKICAgICAgbG9jYXRpb25TcG90OiBnby5TcG90LkNlbnRlcgogICAgfSwgbmV3IGdvLkJpbmRpbmcoImxvY2F0aW9uIiwgImxvYyIsIGdvLlBvaW50LnBhcnNlKS5tYWtlVHdvV2F5KGdvLlBvaW50LnN0cmluZ2lmeSksIHsKICAgICAgc2VsZWN0YWJsZTogdHJ1ZSwKICAgICAgc2VsZWN0aW9uQWRvcm5tZW50VGVtcGxhdGU6IG1ha2VOb2RlU2VsZWN0aW9uQWRvcm5tZW50VGVtcGxhdGUoKQogICAgfSwgbmV3IGdvLkJpbmRpbmcoImFuZ2xlIikubWFrZVR3b1dheSgpLCBHKGdvLlBhbmVsLCAiQXV0byIsIHsKICAgICAgbmFtZTogIkVuZCIKICAgIH0sIG5ldyBnby5CaW5kaW5nKCJkZXNpcmVkU2l6ZSIsICJzaXplIiwgZ28uU2l6ZS5wYXJzZSkubWFrZVR3b1dheShnby5TaXplLnN0cmluZ2lmeSksIEcoZ28uU2hhcGUsICJDaXJjbGUiLCAvLyBkZWZhdWx0IGZpZ3VyZQogICAgewogICAgICBwb3J0SWQ6ICIiLAogICAgICAvLyB0aGUgZGVmYXVsdCBwb3J0OiBpZiBubyBzcG90IG9uIGxpbmsgZGF0YSwgdXNlIGNsb3Nlc3Qgc2lkZQogICAgICBuYW1lOiAiRW5kIiwKICAgICAgZnJvbUxpbmthYmxlOiB0cnVlLAogICAgICB0b0xpbmthYmxlOiB0cnVlLAogICAgICBjdXJzb3I6ICJwb2ludGVyIiwKICAgICAgZmlsbDogIiM1Rjc3OTAiLAogICAgICAvLyBkZWZhdWx0IGNvbG9yCiAgICAgIHN0cm9rZVdpZHRoOiAxLAogICAgICBzdHJva2U6ICIjNUY3NzkwIiAvLyBnZW9tZXRyeVN0cmluZzogIkYgTTAgMCBMMTAwIDAgUTE3NSAyNSAxMDAgNTAgTDAgNTAgUS03NSAyNSAwIDAiCgogICAgfSwgbmV3IGdvLkJpbmRpbmcoImZpZ3VyZSIpLCBuZXcgZ28uQmluZGluZygic3Ryb2tlIiksIG5ldyBnby5CaW5kaW5nKCJzdHJva2VEYXNoQXJyYXkiKSwgbmV3IGdvLkJpbmRpbmcoInN0cm9rZVdpZHRoIiksIG5ldyBnby5CaW5kaW5nKCJmaWxsIikpLCBHKGdvLlRleHRCbG9jaywgewogICAgICBmb250OiAiYm9sZCAxMXB0IEhlbHZldGljYSwgQXJpYWwsIHNhbnMtc2VyaWYiLAogICAgICBtYXJnaW46IDgsCiAgICAgIHdyYXA6IGdvLlRleHRCbG9jay5XcmFwRml0LAogICAgICBzdHJva2U6ICJ3aGl0ZSIKICAgIH0sIG5ldyBnby5CaW5kaW5nKCJ0ZXh0IikubWFrZVR3b1dheSgpKSwgewogICAgICB0b29sVGlwOiBHKGdvLkFkb3JubWVudCwgIkF1dG8iLCBHKGdvLlNoYXBlLCB7CiAgICAgICAgZmlsbDogIiNGRkZGQ0MiCiAgICAgIH0pLCBHKGdvLlRleHRCbG9jaywgewogICAgICAgIG1hcmdpbjogNAogICAgICB9LCBuZXcgZ28uQmluZGluZygidGV4dCIsICIiLCBub2RlSW5mbykpKQogICAgfSksIC8vIDTkuKrov57mjqXngrkKICAgIG1ha2VOb2RlUG9ydCgiVCIsIGdvLlNwb3QuVG9wLCBmYWxzZSwgdHJ1ZSksIHsKICAgICAgbW91c2VFbnRlcjogZnVuY3Rpb24gbW91c2VFbnRlcihlLCBub2RlKSB7CiAgICAgICAgc2hvd05vZGVQb3J0KG5vZGUsIHRydWUpOwogICAgICB9LAogICAgICBtb3VzZUxlYXZlOiBmdW5jdGlvbiBtb3VzZUxlYXZlKGUsIG5vZGUpIHsKICAgICAgICBzaG93Tm9kZVBvcnQobm9kZSwgZmFsc2UpOwogICAgICB9CiAgICB9KSk7IC8vIOa1geeoi+i/nuaOpee6v+eahOagt+W8j+aooeadvwoKCiAgICBfZGVzaWduZXIubGlua1RlbXBsYXRlID0gbWFrZUxpbmtUZW1wbGF0ZSgpOwogICAgcmV0dXJuIF9kZXNpZ25lcjsKICB9CiAgLyoqDQogICAqIOeUn+aIkEdVSUQNCiAgICogQHJldHVybnMge3N0cmluZ30NCiAgICovCgoKICBmdW5jdGlvbiBndWlkKCkgewogICAgdmFyIHIgPSBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAoMzAwMDAgLSAxICsgMSkgKyAxKTsKICAgIHJldHVybiBOdW1iZXIocik7CiAgfQoKICBmdW5jdGlvbiBnZW9GdW5jKGdlb25hbWUpIHsKICAgIGlmIChpY29uc1tnZW9uYW1lXSkgcmV0dXJuIGljb25zW2dlb25hbWVdO2Vsc2UgcmV0dXJuIGljb25zWyJhcHByb3ZhbCJdOyAvLyBkZWZhdWx0IGljb24KICB9CiAgLyoqDQogICAqIOaTjeS9nOiKgueCueagt+W8j+aooeadvw0KICAgKiBAcmV0dXJucyB7Kn0NCiAgICovCgoKICBmdW5jdGlvbiBvcGVyYXRpb25Ob2RlVGVtcGxhdGUoKSB7CiAgICB2YXIgX0c1OwoKICAgIHJldHVybiBHKGdvLk5vZGUsICJTcG90IiwgewogICAgICBsb2NhdGlvblNwb3Q6IGdvLlNwb3QuQ2VudGVyCiAgICB9LCBuZXcgZ28uQmluZGluZygibG9jYXRpb24iLCAibG9jIiwgZ28uUG9pbnQucGFyc2UpLm1ha2VUd29XYXkoZ28uUG9pbnQuc3RyaW5naWZ5KSwgewogICAgICBzZWxlY3RhYmxlOiB0cnVlLAogICAgICBzZWxlY3Rpb25BZG9ybm1lbnRUZW1wbGF0ZTogbWFrZU5vZGVTZWxlY3Rpb25BZG9ybm1lbnRUZW1wbGF0ZSgpCiAgICB9LCBuZXcgZ28uQmluZGluZygiYW5nbGUiKS5tYWtlVHdvV2F5KCksIC8vIHRoZSBtYWluIG9iamVjdCBpcyBhIFBhbmVsIHRoYXQgc3Vycm91bmRzIGEgVGV4dEJsb2NrIHdpdGggYSBTaGFwZQogICAgRyhnby5QYW5lbCwgIkF1dG8iLCB7CiAgICAgIG5hbWU6ICJQQU5FTCIKICAgIH0sIG5ldyBnby5CaW5kaW5nKCJkZXNpcmVkU2l6ZSIsICJzaXplIiwgZ28uU2l6ZS5wYXJzZSkubWFrZVR3b1dheShnby5TaXplLnN0cmluZ2lmeSksIEcoZ28uU2hhcGUsICJSb3VuZGVkUmVjdGFuZ2xlIiwgLy8gZGVmYXVsdCBmaWd1cmUKICAgIHsKICAgICAgcG9ydElkOiAiIiwKICAgICAgLy8gdGhlIGRlZmF1bHQgcG9ydDogaWYgbm8gc3BvdCBvbiBsaW5rIGRhdGEsIHVzZSBjbG9zZXN0IHNpZGUKICAgICAgbmFtZTogIlBJUEUiLAogICAgICBmcm9tTGlua2FibGU6IHRydWUsCiAgICAgIHRvTGlua2FibGU6IHRydWUsCiAgICAgIGN1cnNvcjogInBvaW50ZXIiLAogICAgICBmaWxsOiAid2hpdGUiLAogICAgICAvLyBkZWZhdWx0IGNvbG9yCiAgICAgIHN0cm9rZVdpZHRoOiAxLAogICAgICBzdHJva2U6ICIjRENERUUyIgogICAgfSwgbmV3IGdvLkJpbmRpbmcoImZpZ3VyZSIpLCBuZXcgZ28uQmluZGluZygic3Ryb2tlIiksIG5ldyBnby5CaW5kaW5nKCJzdHJva2VEYXNoQXJyYXkiKSwgbmV3IGdvLkJpbmRpbmcoInN0cm9rZVdpZHRoIiksIG5ldyBnby5CaW5kaW5nKCJmaWxsIikpLCBHKGdvLlNoYXBlLCB7CiAgICAgIG1hcmdpbjogNSwKICAgICAgZmlsbDogJ2JsYWNrJywKICAgICAgc3Ryb2tlV2lkdGg6IDAsCiAgICAgIHdpZHRoOiAyMCwKICAgICAgaGVpZ2h0OiAyMCwKICAgICAgYWxpZ25tZW50OiBnby5TcG90LlRvcFJpZ2h0LAogICAgICBnZW9tZXRyeTogZ28uR2VvbWV0cnkucGFyc2UoZ2VvRnVuYygnb3BlcmF0aW9uJykpCiAgICB9KSwgRyhnby5UZXh0QmxvY2ssIChfRzUgPSB7CiAgICAgIGZvbnQ6ICJib2xkIDExcHQgSGVsdmV0aWNhLCBBcmlhbCwgc2Fucy1zZXJpZiIsCiAgICAgIG1hcmdpbjogOCwKICAgICAgd3JhcDogZ28uVGV4dEJsb2NrLldyYXBGaXQsCiAgICAgIHN0cm9rZTogIiMzNDM0MzQiLAogICAgICB0ZXh0QWxpZ246ICJjZW50ZXIiLAogICAgICBhbGlnbm1lbnQ6IGdvLlNwb3QuQ2VudGVyLAogICAgICB2ZXJ0aWNhbEFsaWdubWVudDogZ28uU3BvdC5DZW50ZXIKICAgIH0sIF9kZWZpbmVQcm9wZXJ0eShfRzUsICJ3cmFwIiwgZ28uVGV4dEJsb2NrLldyYXBGaXQpLCBfZGVmaW5lUHJvcGVydHkoX0c1LCAibWluU2l6ZSIsIG5ldyBnby5TaXplKDEyNiwgMjcpKSwgX2RlZmluZVByb3BlcnR5KF9HNSwgIm1heFNpemUiLCBuZXcgZ28uU2l6ZSgxMjYsIE5hTikpLCBfRzUpLCBuZXcgZ28uQmluZGluZygidGV4dCIpLm1ha2VUd29XYXkoKSksIC8vIHRoZSBsYWJlbCBzaG93cyB0aGUgbm9kZSBkYXRhJ3MgdGV4dAogICAgewogICAgICB0b29sVGlwOiAvLyB0aGlzIHRvb2x0aXAgQWRvcm5tZW50IGlzIHNoYXJlZCBieSBhbGwgbm9kZXMKICAgICAgRyhnby5BZG9ybm1lbnQsICJBdXRvIiwgRyhnby5TaGFwZSwgewogICAgICAgIGZpbGw6ICIjRkZGRkNDIgogICAgICB9KSwgRyhnby5UZXh0QmxvY2ssIHsKICAgICAgICBtYXJnaW46IDQKICAgICAgfSwgLy8gdGhlIHRvb2x0aXAgc2hvd3MgdGhlIHJlc3VsdCBvZiBjYWxsaW5nIG5vZGVJbmZvKGRhdGEpCiAgICAgIG5ldyBnby5CaW5kaW5nKCJ0ZXh0IiwgIiIsIG5vZGVJbmZvKSkpIC8vIOe7keWumuS4iuS4i+aWh+iPnOWNlQogICAgICAvLyBjb250ZXh0TWVudTogbWFrZVBhcnRDb250ZXh0TWVudSgpCgogICAgfSksIC8vIDTkuKrov57mjqXngrkKICAgIG1ha2VOb2RlUG9ydCgiVCIsIGdvLlNwb3QuVG9wLCBmYWxzZSwgdHJ1ZSksIG1ha2VOb2RlUG9ydCgiTCIsIGdvLlNwb3QuTGVmdCwgdHJ1ZSwgdHJ1ZSksIG1ha2VOb2RlUG9ydCgiUiIsIGdvLlNwb3QuUmlnaHQsIHRydWUsIHRydWUpLCBtYWtlTm9kZVBvcnQoIkIiLCBnby5TcG90LkJvdHRvbSwgdHJ1ZSwgZmFsc2UpLCB7CiAgICAgIG1vdXNlRW50ZXI6IGZ1bmN0aW9uIG1vdXNlRW50ZXIoZSwgbm9kZSkgewogICAgICAgIHNob3dOb2RlUG9ydChub2RlLCB0cnVlKTsKICAgICAgfSwKICAgICAgbW91c2VMZWF2ZTogZnVuY3Rpb24gbW91c2VMZWF2ZShlLCBub2RlKSB7CiAgICAgICAgc2hvd05vZGVQb3J0KG5vZGUsIGZhbHNlKTsKICAgICAgfQogICAgfSk7CiAgfQogIC8qKg0KICAgKiDmk43kvZzoioLngrnmoLflvI/mqKHmnb8NCiAgICogQHJldHVybnMgeyp9DQogICAqLwoKCiAgZnVuY3Rpb24gYXBwcm92YWxOb2RlVGVtcGxhdGUoKSB7CiAgICB2YXIgX0c2OwoKICAgIGNvbnNvbGUubG9nKDEyMjIpOwogICAgcmV0dXJuIEcoZ28uTm9kZSwgIlNwb3QiLCB7CiAgICAgIGxvY2F0aW9uU3BvdDogZ28uU3BvdC5DZW50ZXIKICAgIH0sIG5ldyBnby5CaW5kaW5nKCJsb2NhdGlvbiIsICJsb2MiLCBnby5Qb2ludC5wYXJzZSkubWFrZVR3b1dheShnby5Qb2ludC5zdHJpbmdpZnkpLCB7CiAgICAgIHNlbGVjdGFibGU6IHRydWUsCiAgICAgIHNlbGVjdGlvbkFkb3JubWVudFRlbXBsYXRlOiBtYWtlTm9kZVNlbGVjdGlvbkFkb3JubWVudFRlbXBsYXRlKCkKICAgIH0sIG5ldyBnby5CaW5kaW5nKCJhbmdsZSIpLm1ha2VUd29XYXkoKSwgLy8gdGhlIG1haW4gb2JqZWN0IGlzIGEgUGFuZWwgdGhhdCBzdXJyb3VuZHMgYSBUZXh0QmxvY2sgd2l0aCBhIFNoYXBlCiAgICBHKGdvLlBhbmVsLCAiQXV0byIsIHsKICAgICAgbmFtZTogIlBBTkVMIgogICAgfSwgbmV3IGdvLkJpbmRpbmcoImRlc2lyZWRTaXplIiwgInNpemUiLCBnby5TaXplLnBhcnNlKS5tYWtlVHdvV2F5KGdvLlNpemUuc3RyaW5naWZ5KSwgRyhnby5TaGFwZSwgIlJvdW5kZWRSZWN0YW5nbGUiLCAvLyBkZWZhdWx0IGZpZ3VyZQogICAgewogICAgICBwb3J0SWQ6ICIiLAogICAgICAvLyB0aGUgZGVmYXVsdCBwb3J0OiBpZiBubyBzcG90IG9uIGxpbmsgZGF0YSwgdXNlIGNsb3Nlc3Qgc2lkZQogICAgICBuYW1lOiAiUElQRSIsCiAgICAgIGZyb21MaW5rYWJsZTogdHJ1ZSwKICAgICAgdG9MaW5rYWJsZTogdHJ1ZSwKICAgICAgY3Vyc29yOiAicG9pbnRlciIsCiAgICAgIGZpbGw6ICJ3aGl0ZSIsCiAgICAgIC8vIGRlZmF1bHQgY29sb3IKICAgICAgc3Ryb2tlV2lkdGg6IDEsCiAgICAgIHN0cm9rZTogIiNEQ0RFRTIiCiAgICB9LCBuZXcgZ28uQmluZGluZygiZmlndXJlIiksIG5ldyBnby5CaW5kaW5nKCJzdHJva2UiKSwgbmV3IGdvLkJpbmRpbmcoInN0cm9rZURhc2hBcnJheSIpLCBuZXcgZ28uQmluZGluZygic3Ryb2tlV2lkdGgiKSwgbmV3IGdvLkJpbmRpbmcoImZpbGwiKSksIEcoZ28uU2hhcGUsIHsKICAgICAgbWFyZ2luOiA1LAogICAgICBmaWxsOiAnYmxhY2snLAogICAgICBzdHJva2VXaWR0aDogMCwKICAgICAgd2lkdGg6IDIwLAogICAgICBoZWlnaHQ6IDIwLAogICAgICBhbGlnbm1lbnQ6IGdvLlNwb3QuVG9wUmlnaHQsCiAgICAgIGdlb21ldHJ5OiBnby5HZW9tZXRyeS5wYXJzZShnZW9GdW5jKCdhcHByb3ZhbCcpKQogICAgfSksIEcoZ28uVGV4dEJsb2NrLCAoX0c2ID0gewogICAgICBmb250OiAiYm9sZCAxMXB0IEhlbHZldGljYSwgQXJpYWwsIHNhbnMtc2VyaWYiLAogICAgICBtYXJnaW46IDgsCiAgICAgIHdyYXA6IGdvLlRleHRCbG9jay5XcmFwRml0LAogICAgICBzdHJva2U6ICIjMzQzNDM0IiwKICAgICAgdGV4dEFsaWduOiAiY2VudGVyIiwKICAgICAgYWxpZ25tZW50OiBnby5TcG90LkNlbnRlciwKICAgICAgdmVydGljYWxBbGlnbm1lbnQ6IGdvLlNwb3QuQ2VudGVyCiAgICB9LCBfZGVmaW5lUHJvcGVydHkoX0c2LCAid3JhcCIsIGdvLlRleHRCbG9jay5XcmFwRml0KSwgX2RlZmluZVByb3BlcnR5KF9HNiwgIm1pblNpemUiLCBuZXcgZ28uU2l6ZSgxMjYsIDI3KSksIF9kZWZpbmVQcm9wZXJ0eShfRzYsICJtYXhTaXplIiwgbmV3IGdvLlNpemUoMTI2LCBOYU4pKSwgX0c2KSwgbmV3IGdvLkJpbmRpbmcoInRleHQiKS5tYWtlVHdvV2F5KCkpLCAvLyB0aGUgbGFiZWwgc2hvd3MgdGhlIG5vZGUgZGF0YSdzIHRleHQKICAgIHsKICAgICAgdG9vbFRpcDogLy8gdGhpcyB0b29sdGlwIEFkb3JubWVudCBpcyBzaGFyZWQgYnkgYWxsIG5vZGVzCiAgICAgIEcoZ28uQWRvcm5tZW50LCAiQXV0byIsIEcoZ28uU2hhcGUsIHsKICAgICAgICBmaWxsOiAiI0ZGRkZDQyIKICAgICAgfSksIEcoZ28uVGV4dEJsb2NrLCB7CiAgICAgICAgbWFyZ2luOiA0CiAgICAgIH0sIC8vIHRoZSB0b29sdGlwIHNob3dzIHRoZSByZXN1bHQgb2YgY2FsbGluZyBub2RlSW5mbyhkYXRhKQogICAgICBuZXcgZ28uQmluZGluZygidGV4dCIsICIiLCBub2RlSW5mbykpKSAvLyDnu5HlrprkuIrkuIvmlofoj5zljZUKICAgICAgLy8gY29udGV4dE1lbnU6IG1ha2VQYXJ0Q29udGV4dE1lbnUoKQoKICAgIH0pLCAvLyA05Liq6L+e5o6l54K5CiAgICBtYWtlTm9kZVBvcnQoIlQiLCBnby5TcG90LlRvcCwgZmFsc2UsIHRydWUpLCBtYWtlTm9kZVBvcnQoIkwiLCBnby5TcG90LkxlZnQsIHRydWUsIHRydWUpLCBtYWtlTm9kZVBvcnQoIlIiLCBnby5TcG90LlJpZ2h0LCB0cnVlLCB0cnVlKSwgbWFrZU5vZGVQb3J0KCJCIiwgZ28uU3BvdC5Cb3R0b20sIHRydWUsIGZhbHNlKSwgewogICAgICBtb3VzZUVudGVyOiBmdW5jdGlvbiBtb3VzZUVudGVyKGUsIG5vZGUpIHsKICAgICAgICBzaG93Tm9kZVBvcnQobm9kZSwgdHJ1ZSk7CiAgICAgIH0sCiAgICAgIG1vdXNlTGVhdmU6IGZ1bmN0aW9uIG1vdXNlTGVhdmUoZSwgbm9kZSkgewogICAgICAgIHNob3dOb2RlUG9ydChub2RlLCBmYWxzZSk7CiAgICAgIH0KICAgIH0pOwogIH0KICAvKioNCiAgICog6YCJ5Lit6IqC54K555qE5qC35byPDQogICAqIEByZXR1cm5zIHsqfQ0KICAgKi8KCgogIGZ1bmN0aW9uIG1ha2VOb2RlU2VsZWN0aW9uQWRvcm5tZW50VGVtcGxhdGUoKSB7CiAgICByZXR1cm4gRyhnby5BZG9ybm1lbnQsICJBdXRvIiwgRyhnby5TaGFwZSwgewogICAgICBmaWxsOiBudWxsLAogICAgICBzdHJva2U6ICJkZWVwc2t5Ymx1ZSIsCiAgICAgIHN0cm9rZVdpZHRoOiAxLjUsCiAgICAgIHN0cm9rZURhc2hBcnJheTogWzQsIDJdCiAgICB9KSwgRyhnby5QbGFjZWhvbGRlcikpOwogIH0KICAvKioNCiAgICog5Yib5bu66L+e5o6l54K5DQogICAqIEBwYXJhbSBuYW1lDQogICAqIEBwYXJhbSBzcG90DQogICAqIEBwYXJhbSBvdXRwdXQNCiAgICogQHBhcmFtIGlucHV0DQogICAqIEByZXR1cm5zIHsqfQ0KICAgKi8KCgogIGZ1bmN0aW9uIG1ha2VOb2RlUG9ydChuYW1lLCBzcG90LCBvdXRwdXQsIGlucHV0KSB7CiAgICAvLyB0aGUgcG9ydCBpcyBiYXNpY2FsbHkganVzdCBhIHNtYWxsIHRyYW5zcGFyZW50IHNxdWFyZQogICAgcmV0dXJuIEcoZ28uU2hhcGUsICJDaXJjbGUiLCB7CiAgICAgIGZpbGw6IG51bGwsCiAgICAgIC8vIG5vdCBzZWVuLCBieSBkZWZhdWx0OyBzZXQgdG8gYSB0cmFuc2x1Y2VudCBncmF5IGJ5IHNob3dTbWFsbFBvcnRzLCBkZWZpbmVkIGJlbG93CiAgICAgIHN0cm9rZTogbnVsbCwKICAgICAgZGVzaXJlZFNpemU6IG5ldyBnby5TaXplKDcsIDcpLAogICAgICBhbGlnbm1lbnQ6IHNwb3QsCiAgICAgIC8vIGFsaWduIHRoZSBwb3J0IG9uIHRoZSBtYWluIFNoYXBlCiAgICAgIGFsaWdubWVudEZvY3VzOiBzcG90LAogICAgICAvLyBqdXN0IGluc2lkZSB0aGUgU2hhcGUKICAgICAgcG9ydElkOiBuYW1lLAogICAgICAvLyBkZWNsYXJlIHRoaXMgb2JqZWN0IHRvIGJlIGEgInBvcnQiCiAgICAgIGZyb21TcG90OiBzcG90LAogICAgICB0b1Nwb3Q6IHNwb3QsCiAgICAgIC8vIGRlY2xhcmUgd2hlcmUgbGlua3MgbWF5IGNvbm5lY3QgYXQgdGhpcyBwb3J0CiAgICAgIGZyb21MaW5rYWJsZTogb3V0cHV0LAogICAgICB0b0xpbmthYmxlOiBpbnB1dCwKICAgICAgLy8gZGVjbGFyZSB3aGV0aGVyIHRoZSB1c2VyIG1heSBkcmF3IGxpbmtzIHRvL2Zyb20gaGVyZQogICAgICBjdXJzb3I6ICJwb2ludGVyIiAvLyBzaG93IGEgZGlmZmVyZW50IGN1cnNvciB0byBpbmRpY2F0ZSBwb3RlbnRpYWwgbGluayBwb2ludAoKICAgIH0pOwogIH0KICAvKioNCiAgICogdG9vbHRpcOS4iuaYvuekuueahOS/oeaBrw0KICAgKiBAcGFyYW0gZA0KICAgKiBAcmV0dXJucyB7c3RyaW5nfQ0KICAgKi8KCgogIGZ1bmN0aW9uIG5vZGVJbmZvKGQpIHsKICAgIHJldHVybiAn5Y+M5Ye75Y+v57yW6L6RJzsKICB9CiAgLyoqDQogICAqIOWPs+mUruiPnOWNlQ0KICAgKiBAcmV0dXJucyB7Kn0NCiAgICovCgoKICBmdW5jdGlvbiBtYWtlUGFydENvbnRleHRNZW51KCkgewogICAgcmV0dXJuIEcoZ28uQWRvcm5tZW50LCAiVmVydGljYWwiLCBtYWtlTWVudUl0ZW0oIue8lui+kSIsIGZ1bmN0aW9uIChlLCBvYmopIHsKICAgICAgLy8gT0JKIGlzIHRoaXMgQnV0dG9uCiAgICAgIHZhciBjb250ZXh0bWVudSA9IG9iai5wYXJ0OyAvLyB0aGUgQnV0dG9uIGlzIGluIHRoZSBjb250ZXh0IG1lbnUgQWRvcm5tZW50CgogICAgICB2YXIgcGFydCA9IGNvbnRleHRtZW51LmFkb3JuZWRQYXJ0OyAvLyB0aGUgYWRvcm5lZFBhcnQgaXMgdGhlIFBhcnQgdGhhdCB0aGUgY29udGV4dCBtZW51IGFkb3JucwogICAgICAvLyBub3cgY2FuIGRvIHNvbWV0aGluZyB3aXRoIFBBUlQsIG9yIHdpdGggaXRzIGRhdGEsIG9yIHdpdGggdGhlIEFkb3JubWVudCAodGhlIGNvbnRleHQgbWVudSkKCiAgICAgIHNob3dFZGl0Tm9kZShwYXJ0KTsKICAgIH0pLCBtYWtlTWVudUl0ZW0oIuWJquWIhyIsIGZ1bmN0aW9uIChlLCBvYmopIHsKICAgICAgZS5kaWFncmFtLmNvbW1hbmRIYW5kbGVyLmN1dFNlbGVjdGlvbigpOwogICAgfSwgZnVuY3Rpb24gKG8pIHsKICAgICAgcmV0dXJuIG8uZGlhZ3JhbS5jb21tYW5kSGFuZGxlci5jYW5DdXRTZWxlY3Rpb24oKTsKICAgIH0pLCBtYWtlTWVudUl0ZW0oIuWkjeWItiIsIGZ1bmN0aW9uIChlLCBvYmopIHsKICAgICAgZS5kaWFncmFtLmNvbW1hbmRIYW5kbGVyLmNvcHlTZWxlY3Rpb24oKTsKICAgIH0sIGZ1bmN0aW9uIChvKSB7CiAgICAgIHJldHVybiBvLmRpYWdyYW0uY29tbWFuZEhhbmRsZXIuY2FuQ29weVNlbGVjdGlvbigpOwogICAgfSksIG1ha2VNZW51SXRlbSgi5Yig6ZmkIiwgZnVuY3Rpb24gKGUsIG9iaikgewogICAgICBlLmRpYWdyYW0uY29tbWFuZEhhbmRsZXIuZGVsZXRlU2VsZWN0aW9uKCk7CiAgICB9LCBmdW5jdGlvbiAobykgewogICAgICByZXR1cm4gby5kaWFncmFtLmNvbW1hbmRIYW5kbGVyLmNhbkRlbGV0ZVNlbGVjdGlvbigpOwogICAgfSkpOwogIH0KICAvKioNCiAgICog55Sf5oiQ5Y+z6ZSu6I+c5Y2V6aG5DQogICAqIEBwYXJhbSB0ZXh0DQogICAqIEBwYXJhbSBhY3Rpb24NCiAgICogQHBhcmFtIHZpc2libGVQcmVkaWNhdGUNCiAgICogQHJldHVybnMgeyp9DQogICAqLwoKCiAgZnVuY3Rpb24gbWFrZU1lbnVJdGVtKHRleHQsIGFjdGlvbiwgdmlzaWJsZVByZWRpY2F0ZSkgewogICAgcmV0dXJuIEcoIkNvbnRleHRNZW51QnV0dG9uIiwgRyhnby5UZXh0QmxvY2ssIHRleHQsIHsKICAgICAgbWFyZ2luOiA1LAogICAgICB0ZXh0QWxpZ246ICJsZWZ0IiwKICAgICAgc3Ryb2tlOiAiIzU1NTU1NSIKICAgIH0pLCB7CiAgICAgIGNsaWNrOiBhY3Rpb24KICAgIH0sIC8vIGRvbid0IGJvdGhlciB3aXRoIGJpbmRpbmcgR3JhcGhPYmplY3QudmlzaWJsZSBpZiB0aGVyZSdzIG5vIHByZWRpY2F0ZQogICAgdmlzaWJsZVByZWRpY2F0ZSA/IG5ldyBnby5CaW5kaW5nKCJ2aXNpYmxlIiwgIiIsIHZpc2libGVQcmVkaWNhdGUpLm9mT2JqZWN0KCkgOiB7fSk7CiAgfQogIC8qKg0KICAgKiDmmK/lkKbmmL7npLrmraXpqqTnmoTov57mjqXngrkNCiAgICogQHBhcmFtIG5vZGUNCiAgICogQHBhcmFtIHNob3cNCiAgICovCgoKICBmdW5jdGlvbiBzaG93Tm9kZVBvcnQobm9kZSwgc2hvdykgewogICAgbm9kZS5wb3J0cy5lYWNoKGZ1bmN0aW9uIChwb3J0KSB7CiAgICAgIGlmIChwb3J0LnBvcnRJZCAhPT0gIiIpIHsKICAgICAgICAvLyBkb24ndCBjaGFuZ2UgdGhlIGRlZmF1bHQgcG9ydCwgd2hpY2ggaXMgdGhlIGJpZyBzaGFwZQogICAgICAgIHBvcnQuZmlsbCA9IHNob3cgPyAicmdiYSgyNTUsMCwwLC41KSIgOiBudWxsOwogICAgICB9CiAgICB9KTsKICB9CiAgLyoqDQogICAqIOi/nuaOpee6v+eahOmAieS4reagt+W8jw0KICAgKiBAcmV0dXJucyB7Kn0NCiAgICovCgoKICBmdW5jdGlvbiBtYWtlTGlua1NlbGVjdGlvbkFkb3JubWVudFRlbXBsYXRlKCkgewogICAgcmV0dXJuIEcoZ28uQWRvcm5tZW50LCAiTGluayIsIEcoZ28uU2hhcGUsIC8vIGlzUGFuZWxNYWluIGRlY2xhcmVzIHRoYXQgdGhpcyBTaGFwZSBzaGFyZXMgdGhlIExpbmsuZ2VvbWV0cnkKICAgIHsKICAgICAgaXNQYW5lbE1haW46IHRydWUsCiAgICAgIGZpbGw6IG51bGwsCiAgICAgIHN0cm9rZTogImRlZXBza3libHVlIiwKICAgICAgc3Ryb2tlV2lkdGg6IDAKICAgIH0pIC8vIHVzZSBzZWxlY3Rpb24gb2JqZWN0J3Mgc3Ryb2tlV2lkdGgKICAgICk7CiAgfQogIC8qKg0KICAgKiDlrprkuYnov57mjqXnur/nmoTmoLflvI/mqKHmnb8NCiAgICogQHJldHVybnMgeyp9DQogICAqLwoKCiAgZnVuY3Rpb24gbWFrZUxpbmtUZW1wbGF0ZSgpIHsKICAgIHJldHVybiBHKGdvLkxpbmssIC8vIHRoZSB3aG9sZSBsaW5rIHBhbmVsCiAgICB7CiAgICAgIHNlbGVjdGFibGU6IHRydWUsCiAgICAgIHNlbGVjdGlvbkFkb3JubWVudFRlbXBsYXRlOiBtYWtlTGlua1NlbGVjdGlvbkFkb3JubWVudFRlbXBsYXRlKCkKICAgIH0sIHsKICAgICAgcmVsaW5rYWJsZUZyb206IHRydWUsCiAgICAgIHJlbGlua2FibGVUbzogdHJ1ZSwKICAgICAgcmVzaGFwYWJsZTogdHJ1ZQogICAgfSwgewogICAgICByb3V0aW5nOiBnby5MaW5rLkF2b2lkc05vZGVzLAogICAgICBjdXJ2ZTogZ28uTGluay5KdW1wT3ZlciwKICAgICAgY29ybmVyOiA1LAogICAgICB0b1Nob3J0TGVuZ3RoOiA0CiAgICB9LCBHKGdvLlNoYXBlLCAvLyDnur/mnaEKICAgIHsKICAgICAgaXNQYW5lbE1haW46IHRydWUsCiAgICAgIHN0cm9rZTogIiNENUQ1RDUiLAogICAgICBzdHJva2VXaWR0aDogMwogICAgfSksIEcoZ28uU2hhcGUsIC8vIOeureWktAogICAgewogICAgICB0b0Fycm93OiAic3RhbmRhcmQiLAogICAgICBzdHJva2U6IG51bGwsCiAgICAgIGZpbGw6ICcjRDVENUQ1JwogICAgfSwgbmV3IGdvLkJpbmRpbmcoInN0cm9rZSIpLCBuZXcgZ28uQmluZGluZygiZmlsbCIpLCBuZXcgZ28uQmluZGluZygiek9yZGVyIikpLCBHKGdvLlBhbmVsLCAiQXV0byIsIEcoZ28uU2hhcGUsIHsKICAgICAgZmlsbDogbnVsbCwKICAgICAgc3Ryb2tlOiBudWxsCiAgICB9LCBuZXcgZ28uQmluZGluZygiZmlsbCIsICJwRmlsbCIpLCBuZXcgZ28uQmluZGluZygiek9yZGVyIikpLCBHKGdvLlRleHRCbG9jaywgewogICAgICB0ZXh0QWxpZ246ICJjZW50ZXIiLAogICAgICBmb250OiAiMTBwdCBoZWx2ZXRpY2EsIGFyaWFsLCBzYW5zLXNlcmlmIiwKICAgICAgc3Ryb2tlOiAiIzU1NTU1NSIsCiAgICAgIG1hcmdpbjogNAogICAgfSwgbmV3IGdvLkJpbmRpbmcoInRleHQiLCAidGV4dCIpLCBuZXcgZ28uQmluZGluZygiek9yZGVyIikpLCAvLyB0aGUgbGFiZWwgc2hvd3MgdGhlIG5vZGUgZGF0YSdzIHRleHQKICAgIHsKICAgICAgdG9vbFRpcDogLy8gdGhpcyB0b29sdGlwIEFkb3JubWVudCBpcyBzaGFyZWQgYnkgYWxsIG5vZGVzCiAgICAgIEcoZ28uQWRvcm5tZW50LCAiQXV0byIsIEcoZ28uU2hhcGUsIHsKICAgICAgICBmaWxsOiAiI0ZGRkZDQyIKICAgICAgfSksIEcoZ28uVGV4dEJsb2NrLCB7CiAgICAgICAgbWFyZ2luOiA0CiAgICAgIH0sIC8vIHRoZSB0b29sdGlwIHNob3dzIHRoZSByZXN1bHQgb2YgY2FsbGluZyBub2RlSW5mbyhkYXRhKQogICAgICBuZXcgZ28uQmluZGluZygidGV4dCIsICIiLCBub2RlSW5mbykpKSAvLyB0aGlzIGNvbnRleHQgbWVudSBBZG9ybm1lbnQgaXMgc2hhcmVkIGJ5IGFsbCBub2RlcwogICAgICAvLyBjb250ZXh0TWVudTogbWFrZVBhcnRDb250ZXh0TWVudSgpCgogICAgfSkpOwogIH0KICAvKioNCiAgICog5rWB56iL5Zu+5YWD57Sg55qE5Y+M5Ye75LqL5Lu2DQogICAqIEBwYXJhbSBldg0KICAgKi8KCgogIGZ1bmN0aW9uIG9uT2JqZWN0RG91YmxlQ2xpY2tlZChldikgewogICAgdmFyIHBhcnQgPSBldi5zdWJqZWN0LnBhcnQ7CiAgICBzaG93RWRpdE5vZGUocGFydCk7CiAgfQogIC8qKg0KICAgKiDmtYHnqIvlm77lpoLmnpzmnInlj5jliqjvvIzliJnmj5DnpLrnlKjmiLfkv53lrZgNCiAgICogQHBhcmFtIGUNCiAgICovCgoKICBmdW5jdGlvbiBvbkRpYWdyYW1Nb2RpZmllZChlKSB7CiAgICB2YXIgYnV0dG9uID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImJ0blNhdmVGbG93Iik7CiAgICBpZiAoYnV0dG9uKSBidXR0b24uZGlzYWJsZWQgPSAhX2Rlc2lnbmVyLmlzTW9kaWZpZWQ7CiAgICB2YXIgaWR4ID0gZG9jdW1lbnQudGl0bGUuaW5kZXhPZigiKiIpOwoKICAgIGlmIChfZGVzaWduZXIuaXNNb2RpZmllZCkgewogICAgICBpZiAoaWR4IDwgMCkgZG9jdW1lbnQudGl0bGUgKz0gIioiOwogICAgfSBlbHNlIHsKICAgICAgaWYgKGlkeCA+PSAwKSBkb2N1bWVudC50aXRsZSA9IGRvY3VtZW50LnRpdGxlLnN1YnN0cigwLCBpZHgpOwogICAgfQogIH0KICAvKioNCiAgICog57yW6L6R6IqC54K55L+h5oGvDQogICAqLwoKCiAgZnVuY3Rpb24gc2hvd0VkaXROb2RlKG5vZGUpIHsKICAgIF90aGlzLnNob3dFZGl0Tm9kZShub2RlKTsKCiAgICByZXR1cm4gbm9kZTsKICB9CiAgLyoqDQogICAqIOabtOaWsOiKgueCueS/oeaBrw0KICAgKiBAcGFyYW0gb2xkRGF0YQ0KICAgKiBAcGFyYW0gbmV3RGF0YQ0KICAgKi8KCgogIGZ1bmN0aW9uIHVwZGF0ZU5vZGVEYXRhKG5vZGUsIHRleHQpIHsKICAgIF9kZXNpZ25lci5zdGFydFRyYW5zYWN0aW9uKCJ2YWNhdGUiKTsKCiAgICBfZGVzaWduZXIubW9kZWwuc2V0RGF0YVByb3BlcnR5KG5vZGUuZGF0YSwgInRleHQiLCB0ZXh0KTsKCiAgICBfZGVzaWduZXIuY29tbWl0VHJhbnNhY3Rpb24oInZhY2F0ZSIpOwogIH0KICAvKioNCiAgICog5pu05pS55omA5pyJ6L+e57q/5Lit6Ze055qE5paH5pys6IOM5pmv6ImyDQogICAqLwoKCiAgZnVuY3Rpb24gc2V0TGlua1RleHRCZygpIHsKICAgIF9kZXNpZ25lci5saW5rcy5lYWNoKGZ1bmN0aW9uIChsaW5rKSB7CiAgICAgIF9kZXNpZ25lci5zdGFydFRyYW5zYWN0aW9uKCJ2YWNhdGUiKTsKCiAgICAgIGlmIChsaW5rLmRhdGEudGV4dCkgewogICAgICAgIF9kZXNpZ25lci5tb2RlbC5zZXREYXRhUHJvcGVydHkobGluay5kYXRhLCAicEZpbGwiLCB3aW5kb3cuZ28uR3JhcGhPYmplY3QubWFrZShnby5CcnVzaCwgIlJhZGlhbCIsIHsKICAgICAgICAgIDA6ICJyZ2IoMjQwLCAyNDAsIDI0MCkiLAogICAgICAgICAgMC4zOiAicmdiKDI0MCwgMjQwLCAyNDApIiwKICAgICAgICAgIDE6ICJyZ2JhKDI0MCwgMjQwLCAyNDAsIDApIgogICAgICAgIH0pKTsKICAgICAgfQoKICAgICAgX2Rlc2lnbmVyLmNvbW1pdFRyYW5zYWN0aW9uKCJ2YWNhdGUiKTsKICAgIH0pOwogIH0KICAvKiogLS0tLS0tLS1wcml2YXRlIG1ldGhvZC0tLS0tLS0tLS0tLS0tLS0tLWVuZC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qKi8KCgogIHJldHVybiB0aGlzOwp9CgpleHBvcnQgZGVmYXVsdCBGbG93RGVzaWduZXI7"},null]}
|