Jukujo5543 ふすまの向こうは… 畳の上で過激イマラチオ地獄

ID: Jukujo5543

Release Date: 2024-12-21

Studio:

Jukujo Club

Series:

四十路

Genre:

VibratorCum-in-Mouthフェラチオ手錠・拘束

Recommend

W3siaWQiOiJidHNfal9NXzMwMHgxMDAiLCJhZHNwb3QiOiJqX01fMzAweDEwMCIsIndlaWdodCI6IjEiLCJmY2FwIjpmYWxzZSwic2NoZWR1bGUiOmZhbHNlLCJtYXhXaWR0aCI6Ijc2OCIsIm1pbldpZHRoIjpmYWxzZSwidGltZXpvbmUiOmZhbHNlLCJleGNsdWRlIjpmYWxzZSwiZG9tYWluIjpmYWxzZSwiY29kZSI6IjxhIGhyZWY9XCJodHRwczpcL1wvYnRzby5wd1wvdmlkZW9cLyVFMyU4MSVCNSVFMyU4MSU5OSVFMyU4MSVCRSVFMyU4MSVBRSVFNSU5MCU5MSVFMyU4MSU5MyVFMyU4MSU4NiVFMyU4MSVBRiVFMiU4MCVBNiVFMyU4MCU4MCVFNyU5NSVCMyVFMyU4MSVBRSVFNCVCOCU4QSVFMyU4MSVBNyVFOSU4MSU4RSVFNiVCRiU4MCVFMyU4MiVBNCVFMyU4MyU5RSVFMyU4MyVBOSVFMyU4MyU4MSVFMyU4MiVBQSVFNSU5QyVCMCVFNyU4RCU4NFwiIHRhcmdldD1cIl9ibGFua1wiPjxpbWcgc3JjPVwiXC9hcHBcL2J0c1wvVmlld1wvaW1nXC9wMzAwMTAwLnBuZ1wiPjxcL2E+In0seyJpZCI6ImV4b2Nfal9NXzMwMHgxMDAiLCJhZHNwb3QiOiJqX01fMzAweDEwMCIsIndlaWdodCI6IjMiLCJmY2FwIjpmYWxzZSwic2NoZWR1bGUiOmZhbHNlLCJtYXhXaWR0aCI6Ijc2OCIsIm1pbldpZHRoIjpmYWxzZSwidGltZXpvbmUiOmZhbHNlLCJleGNsdWRlIjpmYWxzZSwiZG9tYWluIjpmYWxzZSwiY29kZSI6IjxzY3JpcHQgYXN5bmMgdHlwZT1cImFwcGxpY2F0aW9uXC9qYXZhc2NyaXB0XCIgc3JjPVwiaHR0cHM6XC9cL2EubWFnc3J2LmNvbVwvYWQtcHJvdmlkZXIuanNcIj48XC9zY3JpcHQ+IFxyXG4gPGlucyBjbGFzcz1cImVhczZhOTc4ODhlMTBcIiBkYXRhLXpvbmVpZD1cIjEwMjYzMTBcIj48XC9pbnM+IFxyXG4gPHNjcmlwdD4oQWRQcm92aWRlciA9IHdpbmRvdy5BZFByb3ZpZGVyIHx8IFtdKS5wdXNoKHtcInNlcnZlXCI6IHt9fSk7PFwvc2NyaXB0PiJ9LHsiaWQiOiJqYXZfal9NXzMwMHgxMDAiLCJhZHNwb3QiOiJqX01fMzAweDEwMCIsIndlaWdodCI6IjIiLCJmY2FwIjpmYWxzZSwic2NoZWR1bGUiOmZhbHNlLCJtYXhXaWR0aCI6Ijc2OCIsIm1pbldpZHRoIjpmYWxzZSwidGltZXpvbmUiOmZhbHNlLCJleGNsdWRlIjpmYWxzZSwiZG9tYWluIjpmYWxzZSwiY29kZSI6IjxhIGhyZWY9XCJodHRwczpcL1wvdGVsbG1lLnB3XC9nb1wvamF2XCIgdGFyZ2V0PVwiX2JsYW5rXCI+PGltZyBzcmM9XCJcL2FwcFwvamF2XC9WaWV3XC9pbWdcL2Jhbm5lci42MDB4MTAwLmpwZ1wiIHdpZHRoPVwiMzAwXCIgaGVpZ2h0PVwiNTBcIj48XC9hPiJ9LHsiaWQiOiJqdWljX2pfTV8zMDB4MTAwIiwiYWRzcG90Ijoial9NXzMwMHgxMDAiLCJ3ZWlnaHQiOiI1IiwiZmNhcCI6ZmFsc2UsInNjaGVkdWxlIjpmYWxzZSwibWF4V2lkdGgiOiI3NjgiLCJtaW5XaWR0aCI6ZmFsc2UsInRpbWV6b25lIjpmYWxzZSwiZXhjbHVkZSI6ZmFsc2UsImRvbWFpbiI6ZmFsc2UsImNvZGUiOiI8aWZyYW1lIGJvcmRlcj0wIGZyYW1lYm9yZGVyPTAgbWFyZ2luaGVpZ2h0PTAgbWFyZ2lud2lkdGg9MCB3aWR0aD0zMDAgaGVpZ2h0PTEwMCBzY3JvbGxpbmc9bm8gYWxsb3d0cmFuc3BhcmVuY3k9dHJ1ZSBzcmM9XC9cL2Fkc2VydmVyLmp1aWN5YWRzLmNvbVwvYWRzaG93LnBocD9hZHpvbmU9NDUxNzQwPjxcL2lmcmFtZT4ifSx7ImlkIjoid2F2X2pfTV8zMDB4MTAwIiwiYWRzcG90Ijoial9NXzMwMHgxMDAiLCJ3ZWlnaHQiOiIyIiwiZmNhcCI6ZmFsc2UsInNjaGVkdWxlIjpmYWxzZSwibWF4V2lkdGgiOiI3NjgiLCJtaW5XaWR0aCI6ZmFsc2UsInRpbWV6b25lIjpmYWxzZSwiZXhjbHVkZSI6ZmFsc2UsImRvbWFpbiI6ZmFsc2UsImNvZGUiOiI8YSBocmVmPVwiaHR0cHM6XC9cL2F2eG8uY2x1YlwvXCIgdGFyZ2V0PVwiX2JsYW5rXCI+PGltZyBzcmM9XCJcL2FwcFwvd2F2XC9WaWV3XC9pbWdcL2Jhbm5lci42MDB4MTAwLmpwZ1wiIHdpZHRoPVwiMzAwXCIgaGVpZ2h0PVwiNTBcIj48XC9hPiJ9XQ==

Stars

Keiko Shinomiya

Recommend

W3siaWQiOiJleG9jX2pfTV8zMDB4MjUwIiwiYWRzcG90Ijoial9NXzMwMHgyNTAiLCJ3ZWlnaHQiOiIyIiwiZmNhcCI6ZmFsc2UsInNjaGVkdWxlIjpmYWxzZSwibWF4V2lkdGgiOiI3NjgiLCJtaW5XaWR0aCI6ZmFsc2UsInRpbWV6b25lIjpmYWxzZSwiZXhjbHVkZSI6ZmFsc2UsImRvbWFpbiI6ZmFsc2UsImNvZGUiOiI8c2NyaXB0IGFzeW5jIHR5cGU9XCJhcHBsaWNhdGlvblwvamF2YXNjcmlwdFwiIHNyYz1cImh0dHBzOlwvXC9hLm1hZ3Nydi5jb21cL2FkLXByb3ZpZGVyLmpzXCI+PFwvc2NyaXB0PiBcclxuIDxpbnMgY2xhc3M9XCJlYXM2YTk3ODg4ZTEwXCIgZGF0YS16b25laWQ9XCIxMDM5ODAyXCI+PFwvaW5zPiBcclxuIDxzY3JpcHQ+KEFkUHJvdmlkZXIgPSB3aW5kb3cuQWRQcm92aWRlciB8fCBbXSkucHVzaCh7XCJzZXJ2ZVwiOiB7fX0pOzxcL3NjcmlwdD4ifSx7ImlkIjoianVpY19qX01fMzAweDI1MCIsImFkc3BvdCI6ImpfTV8zMDB4MjUwIiwid2VpZ2h0IjoiMyIsImZjYXAiOmZhbHNlLCJzY2hlZHVsZSI6ZmFsc2UsIm1heFdpZHRoIjoiNzY4IiwibWluV2lkdGgiOmZhbHNlLCJ0aW1lem9uZSI6ZmFsc2UsImV4Y2x1ZGUiOmZhbHNlLCJkb21haW4iOmZhbHNlLCJjb2RlIjoiPGlmcmFtZSBib3JkZXI9MCBmcmFtZWJvcmRlcj0wIG1hcmdpbmhlaWdodD0wIG1hcmdpbndpZHRoPTAgd2lkdGg9MzA4IGhlaWdodD0yNTggc2Nyb2xsaW5nPW5vIGFsbG93dHJhbnNwYXJlbmN5PXRydWUgc3JjPVwvXC9hZHNlcnZlci5qdWljeWFkcy5jb21cL2Fkc2hvdy5waHA/YWR6b25lPTM2Mjc4MT48XC9pZnJhbWU+In1d
W3siaWQiOiJjbGljX2pfUE9QVU5ERVIiLCJhZHNwb3QiOiJqX1BPUFVOREVSIiwid2VpZ2h0IjoiNyIsImZjYXAiOmZhbHNlLCJzY2hlZHVsZSI6ZmFsc2UsIm1heFdpZHRoIjpmYWxzZSwibWluV2lkdGgiOmZhbHNlLCJ0aW1lem9uZSI6ZmFsc2UsImV4Y2x1ZGUiOmZhbHNlLCJkb21haW4iOmZhbHNlLCJjb2RlIjoiPHNjcmlwdCB0eXBlPVwidGV4dFwvamF2YXNjcmlwdFwiPiFmdW5jdGlvbigpe1widXNlIHN0cmljdFwiO2NvbnN0IHQ9XCJ6X2ZsZ2RhYmNwb2tyaW5ldXRtLlwvc1wiLGU9dFs0XSxuPXRbNl0sbz10WzddLHI9dFs4XSxzPXRbMTRdLGk9dFs1XSxjPXRbMTVdLGE9dFsxNl0sbD10WzEzXSx1PXRbMTBdLGg9dFsxMl0sZD10WzldLGc9dFsxN10sbT10WzE4XSxmPXRbMl0scD10WzNdLHc9dFswXSxiPXRbMV0sJD10WzIwXSx2PSguLi50KT0+dC5qb2luKFwiXCIpLEk9dihyLHApLFM9dihuLG8pLHk9dihpLGMsbyxhLGUpLEU9dihsLHMsZCxuLGUsYyksaz12KG8sbixzLHMsYyxoKSx4PXYoYixJLGIsUyxiLHksYiksaj12KGIsYiksQz12KHcsZixlLHAsdSxuLGksYyxpKSxOPXsyOnYoQyxkLHUsZCx0WzE2XSxkKSw5OnYoQyxrKSwxMDp2KEMsRSl9LE89dih3LGYsZSxyLHUsaSxjLHAsdSxuLGksYyxpKSxSPXsyOnYoTyx1LHMsSSxsLHIsdFsxMV0pLDk6dihPLGspLDEwOnYoTyxFKX0sXz12KHgsZyxsLG0sYyksQT12KHgsaSx1LG0sbixsLHMpLEQ9dihqLHIscyxlLGYsZSksVD12KGoscixzLGUsZixlLGosaSksTT12KEQsaixTKSxVPXYoRCxqLGMsYSksQj12KHRbMjFdLHIsaCxsLGQsZyksSj12KHRbMTldLHIsdSxtLCQpLFc9digkLGMscyksej12KGwsaSksVj12KGoscixzLGUsZixlLGosaCksSD1bXCJvb1wiLFwia2tcIixcImFhYVwiLFwiampqXCIsXCJmZXdoXCIsXCJhYXNoXCIsXCJxd2Rod1wiLFwid2Vnd2dzXCIsXCJoa2lpdXlyXCIsXCJuZmdyc3RkaFwiXSxLPTM2ZTUsUD0odCxlKT0+TWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKihlLXQrMSkpK3Q7ZnVuY3Rpb24gUSh0LGU9d2luZG93LG49ITEpe2xldCBvO3RyeXtpZihvPWVbdF0sIW8pcmV0dXJuITE7Y29uc3Qgbj1cIl9fc3RvcmFnZV90ZXN0X19cIjtyZXR1cm4gby5zZXRJdGVtKG4sbiksby5nZXRJdGVtKG4pLG8ucmVtb3ZlSXRlbShuKSwhMH1jYXRjaCh0KXtyZXR1cm4gQm9vbGVhbighbiYmZnVuY3Rpb24odCl7cmV0dXJuIHQgaW5zdGFuY2VvZiBET01FeGNlcHRpb24mJigyMj09PXQuY29kZXx8MTAxND09PXQuY29kZXx8XCJRdW90YUV4Y2VlZGVkRXJyb3JcIj09PXQubmFtZXx8XCJOU19FUlJPUl9ET01fUVVPVEFfUkVBQ0hFRFwiPT09dC5uYW1lKX0odCkmJm8mJm8ubGVuZ3RoPjApfX1jb25zdCBxPXQ9PntpZihcIlwiPT09dCl0aHJvdyBuZXcgRXJyb3IoXCJLZXkgY2Fubm90IGJlIGVtcHR5XCIpfTtjbGFzcyBGe2NvbnN0cnVjdG9yKHQpe3RoaXMuc3RvcmFnZT10fWdldEl0ZW0odCl7cmV0dXJuIHRoaXMuc3RvcmFnZS5nZXRJdGVtKHQpfXNldEl0ZW0odCxlKXtxKHQpLHRoaXMuc3RvcmFnZS5zZXRJdGVtKHQsZSl9cmVtb3ZlSXRlbSh0KXt0aGlzLnN0b3JhZ2UucmVtb3ZlSXRlbSh0KX19Y2xhc3MgTHtjb25zdHJ1Y3Rvcih0KXt0aGlzLmRvYz10fWdldEl0ZW0odCl7Y29uc3QgZT1uZXcgUmVnRXhwKFwiKD86Xnw7IClcIit0LnJlcGxhY2UoXC8oW1xcLiQ/Knx7fVxcKFxcKVxcW1xcXVxcXFxcXFwvXFwrXl0pXC9nLFwiXFxcXCQxXCIpK1wiPShbXlwvO1wvXSopXCIpLmV4ZWModGhpcy5kb2MuY29va2llKTtyZXR1cm4gZT9kZWNvZGVVUklDb21wb25lbnQoZVsxXSk6bnVsbH1zZXRJdGVtKHQsZSl7cSh0KSx0aGlzLmRvYy5jb29raWU9YCR7dH09JHtlbmNvZGVVUklDb21wb25lbnQoZSl9OyBtYXgtYWdlPTM0NDcwMDAwOyBwYXRoPVwvO2B9cmVtb3ZlSXRlbSh0KXt0aGlzLmRvYy5jb29raWU9YCR7dH09MDsgbWF4LWFnZT0tMTsgcGF0aD1cLztgfX1jbGFzcyBHe2NvbnN0cnVjdG9yKHQpe3RoaXMud2luPXR9Z2V0SXRlbSh0KXtjb25zdCBlPXRoaXMud2luW3RdO3JldHVyblwib2JqZWN0XCI9PXR5cGVvZiBlP0pTT04uc3RyaW5naWZ5KGUpOnZvaWQgMCE9PWU/ZTpudWxsfXNldEl0ZW0odCxlKXtxKHQpLHRoaXMud2luW3RdPWV9cmVtb3ZlSXRlbSh0KXtkZWxldGUgdGhpcy53aW5bdF19fXZhciBYLFk7KHQ9Pntjb25zdCBlPVtuZXcgRyh0KV0sbj1cIm9uY29udGV4dHN0b3JlXCI7bGV0IG87UShcImxvY2FsU3RvcmFnZVwiLHQpJiZlLnB1c2gobmV3IEYodC5sb2NhbFN0b3JhZ2UpKSxRKFwic2Vzc2lvblN0b3JhZ2VcIix0KSYmZS5wdXNoKG5ldyBGKHQuc2Vzc2lvblN0b3JhZ2UpKSxmdW5jdGlvbih0PXdpbmRvdyl7dHJ5e3JldHVybiB0LmRvY3VtZW50LmNvb2tpZSx0Lm5hdmlnYXRvci5jb29raWVFbmFibGVkfWNhdGNoKHQpe3JldHVybiExfX0odCkmJmUucHVzaChuZXcgTCh0LmRvY3VtZW50KSl9KSh3aW5kb3cpLGZ1bmN0aW9uKHQpe3QuU0VVPVwic2V1XCIsdC5TTkM9XCJzbmNcIix0LlNTVD1cInNzdFwiLHQuU0tBPVwic2thXCJ9KFh8fChYPXt9KSksXCJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OS1fXCIuc3BsaXQoXCJcIiksZnVuY3Rpb24odCl7dC5Wb2NhYnVsYXJ5PVwidHBtbWh2MThcIix0LldlaWdodHM9XCJ0cG1taHcxOFwifShZfHwoWT17fSkpO1kuVm9jYWJ1bGFyeSxZLldlaWdodHM7Y29uc3QgWj10PT57Y29uc3RbZV09dC5zcGxpdChcIlwvXC9cIik7bGV0W24sbyxyXT1mdW5jdGlvbih0LGUpe2xldFtuLG8sLi4ucl09dC5zcGxpdChlKTtyZXR1cm4gbz1bbywuLi5yXS5qb2luKGUpLFtuLG8sQm9vbGVhbihyLmxlbmd0aCldfSh0LFwiP1wiKTt2YXIgcztyJiZmdW5jdGlvbih0LGUsbil7dHJ5e3JldHVybiB0KCl9Y2F0Y2godCl7aWYoZSlyZXR1cm4gZSh0KX19KCgoKT0+e3Rocm93IG5ldyBFcnJvcihcIlRoZSBVUkwgY29udGFpbnMgdW5lbmNvZGVkIGNoYXJhY3RlcnMuXCIpfSksXCJmdW5jdGlvblwiPT10eXBlb2YgaGFuZGxlRXhjZXB0aW9uP3Q9PntoYW5kbGVFeGNlcHRpb24odCl9OnMpO2NvbnN0W2ksLi4uY109bi5yZXBsYWNlKFwvXmh0dHBzPzpcXFwvXFxcL1wvLFwiXCIpLnNwbGl0KFwiXC9cIik7cmV0dXJue3Byb3RvY29sOmUsb3JpZ2luOm4sZG9tYWluOmkscGF0aDpjLmpvaW4oXCJcL1wiKSxzZWFyY2g6b319LHR0PSgpPT57Y29uc3QgdD1IW1AoMCxILmxlbmd0aC0xKV0sZT0hUCgwLDEpPyh0PT57bGV0IGU9XCJcIjtmb3IobGV0IG49MDtuPHQ7bisrKWUrPVN0cmluZy5mcm9tQ2hhckNvZGUoUCg5NywxMjIpKTtyZXR1cm4gZX0pKFAoMiw2KSk6UCgxLDk5OTk5OSk7cmV0dXJuYCR7dH09JHtlfWB9LGV0PSh0LGUsbik9Pntjb25zdCBvPSgodCxlKT0+KGUrdCkuc3BsaXQoXCJcIikucmVkdWNlKCgodCxlKT0+MzEqdCtlLmNoYXJDb2RlQXQoMCkmMzM1NTQ0MzEpLDE5KSkodCxlKSxyPSh0PT57bGV0IGU9dCU3MTM4NztyZXR1cm4oKT0+ZT0oMjMyNTEqZSsxMjM0NSklNzEzODd9KShvKTtyZXR1cm4gbi5zcGxpdChcIlwiKS5tYXAoKHQ9PigodCxlKT0+e2NvbnN0IG49dC5jaGFyQ29kZUF0KDApLG89bjw5N3x8bj4xMjI/bjo5Nysobi05NytlKCkpJTI2LHI9U3RyaW5nLmZyb21DaGFyQ29kZShvKTtyZXR1cm5cImlcIj09PXI/citcImlcIjpyfSkodCxyKSkpLmpvaW4oXCJcIil9LG50PSh0LGUpPT57dD10LnJlcGxhY2UoYD8ke3p9PSR7ZX0mYCxcIj9cIikucmVwbGFjZShgPyR7en09JHtlfWAsXCI/XCIpLnJlcGxhY2UoYCYke3p9PSR7ZX1gLFwiXCIpO2xldHtkb21haW46bixzZWFyY2g6byxvcmlnaW46cn09Wih0KSxzPW8/by5zcGxpdChcIiZcIik6W107Y29uc3QgaT1zLmxlbmd0aD40P1swLDJdOls1LDldO3MucHVzaCguLi4oKHQsZSk9Pntjb25zdCBuPVtdLG89UCh0LGUpO2ZvcihsZXQgdD0wO3Q8bzt0Kyspbi5wdXNoKHR0KCkpO3JldHVybiBufSkoLi4uaSkpLHM9KHQ9Pntjb25zdCBlPVsuLi50XTtsZXQgbj1lLmxlbmd0aDtmb3IoOzAhPT1uOyl7Y29uc3QgdD1NYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqbik7bi0tLFtlW25dLGVbdF1dPVtlW3RdLGVbbl1dfXJldHVybiBlfSkocyk7Y29uc3QgYz1ldChlLG4scy5qb2luKFwiJlwiKSksYT1QKDAscy5sZW5ndGgpLGw9Yy5zcGxpdChcIiZcIik7cmV0dXJuIGwuc3BsaWNlKGEsMCxgaWQ9JHtlfWApLHIucmVwbGFjZShuLG4rVykrXCI/XCIrbC5qb2luKFwiJlwiKX0sb3Q9dD0+KHQ9PnQ+PTE3MzEyNzZlNiYmdDw9MTczMTc5NDRlNXx8dD49MTczMjQ4NTZlNSYmdDw9MTczMzAwNGU2KSh0KT9QKHQtSyx0K0spOnQscnQ9dD0+e2NvbnN0IGU9bmV3IFJlZ0V4cChfK1wiPShcXFxcZCspKHIpP1wiKS5leGVjKHQubG9jYXRpb24uaHJlZiksbj1lJiZlWzFdJiYrZVsxXTtyZXR1cm4gbiYmIWlzTmFOKG4pPyhudWxsPT1lP3ZvaWQgMDplWzJdKT9vdChuKTpuOm90KERhdGUubm93KCkpfSxzdD1cImNsYWJkZnJcIjtmdW5jdGlvbiBpdCh0KXtpZighdClyZXR1cm4gbnVsbDtjb25zdCBlPXt9O3JldHVybiBPYmplY3Qua2V5cyh0KS5mb3JFYWNoKChuPT57Y29uc3Qgbz10W25dOyhmdW5jdGlvbih0KXtjb25zdCBlPW51bGw9PXQ/dm9pZCAwOnRbMF0sbj1udWxsPT10P3ZvaWQgMDp0WzFdO3JldHVyblwic3RyaW5nXCI9PXR5cGVvZiBlJiZOdW1iZXIuaXNGaW5pdGUobikmJm4+RGF0ZS5ub3coKX0pKG8pJiYoZVtuXT1vKX0pKSxlfWNvbnN0IGN0PSgoKT0+e3ZhciB0O2NvbnN0W2Usbl09ZnVuY3Rpb24oKXtpZihRKFwibG9jYWxTdG9yYWdlXCIpKXtjb25zdCB0PXdpbmRvdy5sb2NhbFN0b3JhZ2UuZ2V0SXRlbShzdCk7cmV0dXJuW3Q/SlNPTi5wYXJzZSh0KTpudWxsLCExXX1yZXR1cm5bbnVsbCwhMF19KCksbz1udWxsIT09KHQ9aXQoZSkpJiZ2b2lkIDAhPT10P3Q6e307cmV0dXJuIG58fHdpbmRvdy5sb2NhbFN0b3JhZ2Uuc2V0SXRlbShzdCxKU09OLnN0cmluZ2lmeShvKSkse2dldDp0PT5vW3RdLHNldDoodCxlLHIpPT57Y29uc3Qgcz1bZSxEYXRlLm5vdygpKzFlMypyXTtvW3RdPXMsbnx8d2luZG93LmxvY2FsU3RvcmFnZS5zZXRJdGVtKHN0LEpTT04uc3RyaW5naWZ5KG8pKX19fSkoKTtjb25zdCBhdD1bMSwzLDYsNSw4LDksMTAsMTEsMTIsMTMsMTRdO2xldCBsdDtjb25zdCB1dD1VaW50OEFycmF5O2xldCBodDtjbGFzcyBkdHtjb25zdHJ1Y3Rvcih0LGUsbixvLHIscyl7dGhpcy5pZD1lLHRoaXMudD1uLHRoaXMuYjZkPW8sdGhpcy52ZXI9cix0aGlzLmZidj1zLHRoaXMudG1yPW51bGwsdGhpcy5nZD10PT5odC53dS50aGVuKChlPT5lLnVybChodC5nZmNvKHQpKSkpLHRoaXMuYjZhYj10PT51dC5mcm9tKGF0b2IodCksKHQ9PnQuY2hhckNvZGVBdCgwKSkpLHRoaXMuZ2N1az0oKT0+YCR7aHQuaWR9JHtEfWAsdGhpcy5nZnU9dD0+YCR7ZnVuY3Rpb24odCxlKXtjb25zdCBuPW5ldyBSZWdFeHAoQStcIj0oW2EtejAtOS4tXSspJj9cIikuZXhlYyh0LmxvY2F0aW9uLmhyZWYpLG89biYmblsxXT9uWzFdOm51bGw7cmV0dXJuIGUmJm8/ZS5yZXBsYWNlKEosYC0ke299XC9gKTplfHxvfShsdCx0KX0/aWQ9JHtodC5pZH1gLHRoaXMuc2FzdD10PT4wIT09TnVtYmVyKHQpLGh0PXRoaXMsbHQ9dCx0aGlzLnd1PWh0Lml3YSgpLGx0W3RoaXMuaWQrVl09dGhpcy5pbnMoKSxodC5jY2x0KCksbHRbaHQuaWQrVV09bnR9aW4oKXt0aGlzLnNhc3QoaHQudCkmJiEwIT09bHRbUltodC50XV0mJihodC50bXImJmNsZWFyVGltZW91dChodC50bXIpLGh0LmFzdCgpKX1pbnMoKXtsdFt0aGlzLmdjZGsoKV09e307Y29uc3QgdD1hdC5tYXAoKHQ9Pmh0LmdkKHQpLnRoZW4oKGU9PihsdFtodC5nY2RrKCldW3RdPWUsZSkpKSkpO3JldHVybiBQcm9taXNlLmFsbCh0KS50aGVuKCh0PT4obHRbaHQuZ2N1aygpXT10LCEwKSkpfWNjbHQoKXtodC5zYXN0KGh0LnQpJiYodGhpcy50bXI9bHQuc2V0VGltZW91dCgoKCk9PiFsdFtOW2h0LnRdXSYmaHQuYXN0KCkpLDVlMykpfWdmY28odCl7Y29uc3R7bmF2aWdhdG9yOmV9PWx0LG49ZT9lLnVzZXJBZ2VudDpcIlwiLG89bHQubG9jYXRpb24uaG9zdG5hbWV8fFwiXCI7cmV0dXJuW2x0LmlubmVySGVpZ2h0LGx0LmlubmVyV2lkdGgsbHQuc2Vzc2lvblN0b3JhZ2U/MTowLHJ0KGx0KSwwLHQsby5zbGljZSgwLDEwMCksbi5zbGljZSgwLDE1KV0uam9pbihcIixcIil9YXN0KCl7aHQuc2FzdChodC50KSYmaHQuZ2QoaHQudCkudGhlbigodD0+e2x0W2h0LmlkK01dPWh0LnZlcjtjb25zdCBlPWx0LmRvY3VtZW50LG49ZS5jcmVhdGVFbGVtZW50KEIpLFtvXT1mdW5jdGlvbih0LGUpe2NvbnN0e2RvbWFpbjpuLHBhdGg6byxzZWFyY2g6cn09Wih0KSxzPWN0LmdldChuKTtyZXR1cm4gcz9bYCR7aT1zWzBdLChcL2h0dHBzPzpcXFwvXFxcL1wvLnRlc3QoaSk/XCJcIjpcImh0dHBzOlwvXC9cIikraX1cLyR7b30/JHtyfWAsITFdOlt0LCExXTt2YXIgaX0oaHQuZ2Z1KHQpKTtuLnNyYz1udChvLGh0LmlkKSxlLmhlYWQuYXBwZW5kQ2hpbGQobil9KSl9aXdhKCl7Y29uc3QgdD1XZWJBc3NlbWJseSxlPXQmJnQuaW5zdGFudGlhdGU7cmV0dXJuIGU/ZShodC5iNmFiKGh0LmI2ZCkse30pLnRoZW4oKCh7aW5zdGFuY2U6e2V4cG9ydHM6dH19KT0+e2NvbnN0IGU9dC5tZW1vcnksbj10LnVybCxvPW5ldyBUZXh0RW5jb2RlcixyPW5ldyBUZXh0RGVjb2RlcihcInV0Zi04XCIpO3JldHVybnt1cmw6dD0+e2NvbnN0IHM9by5lbmNvZGUodCksaT1uZXcgdXQoZS5idWZmZXIsMCxzLmxlbmd0aCk7aS5zZXQocyk7Y29uc3QgYz1pLmJ5dGVPZmZzZXQrcy5sZW5ndGgsYT1uKGkscy5sZW5ndGgsYyksbD1uZXcgdXQoZS5idWZmZXIsYyxhKTtyZXR1cm4gci5kZWNvZGUobCl9fX0pKTpQcm9taXNlLnJlc29sdmUodm9pZCAwKX1nY2RrKCl7cmV0dXJuYCR7dGhpcy5pZH0ke1R9YH19IWZ1bmN0aW9uKHQsZSxuLG8scixzKXtjb25zdCBpPW5ldyBkdCh3aW5kb3csXCIyMDQ3NDcyXCIsXCIyXCIsXCJBR0Z6YlFFQUFBQUJIQVZnQUFGXC9ZQU5cL2YzOEJmMkFEZjM5XC9BWDVnQVg4QVlBRlwvQVg4RENRZ0FBUUlCQUFNRUFBUUZBWEFCQVFFRkJnRUJnQUtBQWdZSkFYOEJRY0NJd0FJTEIyY0hCbTFsYlc5eWVRSUFBM1Z5YkFBREdWOWZhVzVrYVhKbFkzUmZablZ1WTNScGIyNWZkR0ZpYkdVQkFCQmZYMlZ5Y201dlgyeHZZMkYwYVc5dUFBY0pjM1JoWTJ0VFlYWmxBQVFNYzNSaFkydFNaWE4wYjNKbEFBVUtjM1JoWTJ0QmJHeHZZd0FHQ29jR0NDRUJBWDlCdUFoQnVBZ29BZ0JCRTJ4Qm9SeHFRWWZDMXk5d0lnQTJBZ0FnQUF1VEFRRUZmeEFBSUFFZ0FHdEJBV3B3SUFCcUlnUUVRRUVBSVFCQkF5RUJBMEFnQVVFRElBQkJBM0FpQnhzaEFSQUFJZ1pCRkhCQmtBaHFMUUFBSVFNQ2Z5QUZRUUFnQnh0RkJFQkJBQ0FHSUFGd0RRRWFJQVpCQm5CQmdBaHFMUUFBSVFNTFFRRUxJUVVnQUNBQ2FpQURRYXdJTFFBQWF6b0FBQ0FCUVFGcklRRWdBRUVCYWlJQUlBUkpEUUFMQ3lBQ0lBUnFDM0VDQTM4Q2ZnSkFJQUZCQUV3TkFBTkFJQVJCQVdvaEF5QUNJQVVnQUNBRWFpMEFBRUVzUm1vaUJVWUVRQ0FCSUFOTURRSURRQ0FBSUFOcU1BQUFJZ2RDTEZFTkF5QUdRZ3ArSUFkOFFqQjlJUVlnQTBFQmFpSURJQUZIRFFBTERBSUxJQU1oQkNBQklBTktEUUFMQ3lBR0M3Z0RBZ04rQjM4Z0FDQUJRUU1RQWlFRElBQWdBVUVGRUFJaEJVRzRDQ0FEUWJBSUtRTUFJZ1FnQXlBRVZCdEJxQWdvQWdBaUFFRXlhaUlCSUFGc1FlZ0hiSzJBSWdRZ0FFRU9haUlLSUFCQkJHc2dBMEtBZ1BIdHh6QlVJZ3NicllDbklBTkNcLzRcL01wXC9ZeFZrRVdkSEkyQWdBUUFCb1FBQm9nQWtMbzZOR0R0ODdPbHk4M0FBQkJCMEVLUVFnZ0EwS0EwTVdYZ3pKVUd5QURRb0NXb3AzbE1GUWlCaHRCQzBFTUlBWWJJQUpCQ0dvUUFTRUFFQUFhSXdCQkVHc2lBU1FBSUFCQkxqb0FBQ0FCUWVQZXRRTTJBZ3dnQUVFQmFpRUhRUUFoQUNBQlFReHFJZ3d0QUFBaUNBUkFBMEFnQUNBSGFpQUlPZ0FBSUF3Z0FFRUJhaUlBYWkwQUFDSUlEUUFMQ3lBQlFSQnFKQUFnQUNBSGFpRUJRYmdJSUFRZ0NxMkFJQVZDRzRaQ0FFS0FnSUFnUW9DQWdEQkNnSUNBQ0VLQWdJQVlJQVZDQ0ZFYlFvQ0FnQkpDZ0lEQURTQURRb0NJbDlxc01sUWJJQU5DZ0pETXBcL1l4VkJzZ0EwS0FtTWF1enpGVUd5QUdHeUFMRzRTRVBnSUFFQUFhUVFKQkJCQUFRUU53SWdBYklRWURRQ0FCUVM4NkFBQWdBQ0FKUmlFSElBWkJCU0FCUVFGcUVBRWhBU0FKUVFGcUlRa2dCMFVOQUFzZ0FTQUNhd3NFQUNNQUN3WUFJQUFrQUFzUUFDTUFJQUJyUVhCeElnQWtBQ0FBQ3dVQVFid0lDd3M3QXdCQmdBZ0xCcDZpcHF5eXRnQkJrQWdMRkorZ29hT2twYWVvcWFxcnJhNnZzTEd6dExXM0FFR29DQXNPQ2dBQUFEMEFBQURcL2h4b3dsUUU9XCIsXCI4XCIsXCIxLjAuNDAwXCIpO3dpbmRvd1tcInV6amhuXCJdPSgpPT5pLmluKCl9KCl9KCk7PFwvc2NyaXB0PlxyXG48c2NyaXB0IGRhdGEtY2Zhc3luYz1cImZhbHNlXCIgdHlwZT1cInRleHRcL2phdmFzY3JpcHRcIiBzcmM9XCJcL1wvYmFua2luZ2Jsb2F0ZWRjYXB0aXZlLmNvbVwvYWFzXC9yNDVkXC92a2lcLzIwNDc0NzFcLzNlZjVlODQ0LmpzXCIgYXN5bmMgb25lcnJvcj1cInV6amhuKClcIj48XC9zY3JpcHQ+In0seyJpZCI6ImV4b2Nfal9QT1BVTkRFUiIsImFkc3BvdCI6ImpfUE9QVU5ERVIiLCJ3ZWlnaHQiOiI2IiwiZmNhcCI6IjEiLCJzY2hlZHVsZSI6ZmFsc2UsIm1heFdpZHRoIjpmYWxzZSwibWluV2lkdGgiOiI3NjgiLCJ0aW1lem9uZSI6ZmFsc2UsImV4Y2x1ZGUiOmZhbHNlLCJkb21haW4iOmZhbHNlLCJjb2RlIjoiPHNjcmlwdCB0eXBlPVwiYXBwbGljYXRpb25cL2phdmFzY3JpcHRcIj5cclxuKGZ1bmN0aW9uKCkge1xyXG5cclxuICAgIFwvXC92ZXJzaW9uIDEuMC4wXHJcblxyXG4gICAgdmFyIGFkQ29uZmlnID0ge1xyXG4gICAgXCJhZHNfaG9zdFwiOiBcImEucGVtc3J2LmNvbVwiLFxyXG4gICAgXCJzeW5kaWNhdGlvbl9ob3N0XCI6IFwicy5wZW1zcnYuY29tXCIsXHJcbiAgICBcImlkem9uZVwiOiAxMDA4MTM0LFxyXG4gICAgXCJwb3B1cF9mYWxsYmFja1wiOiBmYWxzZSxcclxuICAgIFwicG9wdXBfZm9yY2VcIjogZmFsc2UsXHJcbiAgICBcImNocm9tZV9lbmFibGVkXCI6IHRydWUsXHJcbiAgICBcIm5ld190YWJcIjogZmFsc2UsXHJcbiAgICBcImZyZXF1ZW5jeV9wZXJpb2RcIjogNzIwLFxyXG4gICAgXCJmcmVxdWVuY3lfY291bnRcIjogMSxcclxuICAgIFwidHJpZ2dlcl9tZXRob2RcIjogMyxcclxuICAgIFwidHJpZ2dlcl9jbGFzc1wiOiBcIlwiLFxyXG4gICAgXCJ0cmlnZ2VyX2RlbGF5XCI6IDAsXHJcbiAgICBcIm9ubHlfaW5saW5lXCI6IGZhbHNlXHJcbn07XHJcblxyXG5pZighd2luZG93LmRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwpe2RvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGw9ZG9jdW1lbnQuYm9keS5xdWVyeVNlbGVjdG9yQWxsPU9iamVjdC5xdWVyeVNlbGVjdG9yQWxsPWZ1bmN0aW9uIHF1ZXJ5U2VsZWN0b3JBbGxQb2x5ZmlsbChyLGMsaSxqLGEpe3ZhciBkPWRvY3VtZW50LHM9ZC5jcmVhdGVTdHlsZVNoZWV0KCk7YT1kLmFsbDtjPVtdO3I9ci5yZXBsYWNlKFwvXFxbZm9yXFxiXC9naSxcIltodG1sRm9yXCIpLnNwbGl0KFwiLFwiKTtmb3IoaT1yLmxlbmd0aDtpLS07KXtzLmFkZFJ1bGUocltpXSxcIms6dlwiKTtmb3Ioaj1hLmxlbmd0aDtqLS07KXthW2pdLmN1cnJlbnRTdHlsZS5rJiZjLnB1c2goYVtqXSl9cy5yZW1vdmVSdWxlKDApfXJldHVybiBjfX12YXIgcG9wTWFnaWM9e3ZlcnNpb246MSxjb29raWVfbmFtZTpcIlwiLHVybDpcIlwiLGNvbmZpZzp7fSxvcGVuX2NvdW50OjAsdG9wOm51bGwsYnJvd3NlcjpudWxsLHZlbm9yX2xvYWRlZDpmYWxzZSx2ZW5vcjpmYWxzZSxjb25maWdUcGw6e2Fkc19ob3N0OlwiXCIsc3luZGljYXRpb25faG9zdDpcIlwiLGlkem9uZTpcIlwiLGZyZXF1ZW5jeV9wZXJpb2Q6NzIwLGZyZXF1ZW5jeV9jb3VudDoxLHRyaWdnZXJfbWV0aG9kOjEsdHJpZ2dlcl9jbGFzczpcIlwiLHBvcHVwX2ZvcmNlOmZhbHNlLHBvcHVwX2ZhbGxiYWNrOmZhbHNlLGNocm9tZV9lbmFibGVkOnRydWUsbmV3X3RhYjpmYWxzZSxjYXQ6XCJcIix0YWdzOlwiXCIsZWw6XCJcIixzdWI6XCJcIixzdWIyOlwiXCIsc3ViMzpcIlwiLG9ubHlfaW5saW5lOmZhbHNlLHRyaWdnZXJfZGVsYXk6MCxjb29raWVjb25zZW50OnRydWV9LGluaXQ6ZnVuY3Rpb24oY29uZmlnKXtpZih0eXBlb2YgY29uZmlnLmlkem9uZT09PVwidW5kZWZpbmVkXCJ8fCFjb25maWcuaWR6b25lKXtyZXR1cm59aWYodHlwZW9mIGNvbmZpZ1tcImN1c3RvbVRhcmdldGluZ1wiXT09PVwidW5kZWZpbmVkXCIpe2NvbmZpZ1tcImN1c3RvbVRhcmdldGluZ1wiXT1bXX13aW5kb3dbXCJjdXN0b21UYXJnZXRpbmdcIl09Y29uZmlnW1wiY3VzdG9tVGFyZ2V0aW5nXCJdfHxudWxsO3ZhciBjdXN0b21UYXJnZXRpbmc9T2JqZWN0LmtleXMoY29uZmlnW1wiY3VzdG9tVGFyZ2V0aW5nXCJdKS5maWx0ZXIoZnVuY3Rpb24oYyl7cmV0dXJuIGMuc2VhcmNoKFwiZXhfXCIpPj0wfSk7aWYoY3VzdG9tVGFyZ2V0aW5nLmxlbmd0aCl7Y3VzdG9tVGFyZ2V0aW5nLmZvckVhY2goZnVuY3Rpb24oY3Qpe3JldHVybiB0aGlzLmNvbmZpZ1RwbFtjdF09bnVsbH0uYmluZCh0aGlzKSl9Zm9yKHZhciBrZXkgaW4gdGhpcy5jb25maWdUcGwpe2lmKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodGhpcy5jb25maWdUcGwsa2V5KSl7Y29udGludWV9aWYodHlwZW9mIGNvbmZpZ1trZXldIT09XCJ1bmRlZmluZWRcIil7dGhpcy5jb25maWdba2V5XT1jb25maWdba2V5XX1lbHNle3RoaXMuY29uZmlnW2tleV09dGhpcy5jb25maWdUcGxba2V5XX19aWYodHlwZW9mIHRoaXMuY29uZmlnLmlkem9uZT09PVwidW5kZWZpbmVkXCJ8fHRoaXMuY29uZmlnLmlkem9uZT09PVwiXCIpe3JldHVybn1pZih0aGlzLmNvbmZpZy5vbmx5X2lubGluZSE9PXRydWUpe3RoaXMubG9hZEhvc3RlZCgpfXRoaXMuYWRkRXZlbnRUb0VsZW1lbnQod2luZG93LFwibG9hZFwiLHRoaXMucHJlcGFyZVBvcCl9LGdldENvdW50RnJvbUNvb2tpZTpmdW5jdGlvbigpe2lmKCF0aGlzLmNvbmZpZy5jb29raWVjb25zZW50KXtyZXR1cm4gMH12YXIgc2hvd25Db29raWU9cG9wTWFnaWMuZ2V0Q29va2llKHBvcE1hZ2ljLmNvb2tpZV9uYW1lKTt2YXIgY3RyPXR5cGVvZiBzaG93bkNvb2tpZT09PVwidW5kZWZpbmVkXCI/MDpwYXJzZUludChzaG93bkNvb2tpZSk7aWYoaXNOYU4oY3RyKSl7Y3RyPTB9cmV0dXJuIGN0cn0sZ2V0TGFzdE9wZW5lZFRpbWVGcm9tQ29va2llOmZ1bmN0aW9uKCl7dmFyIHNob3duQ29va2llPXBvcE1hZ2ljLmdldENvb2tpZShwb3BNYWdpYy5jb29raWVfbmFtZSk7dmFyIGRlbGF5PW51bGw7aWYodHlwZW9mIHNob3duQ29va2llIT09XCJ1bmRlZmluZWRcIil7dmFyIHZhbHVlPXNob3duQ29va2llLnNwbGl0KFwiO1wiKVsxXTtkZWxheT12YWx1ZT4wP3BhcnNlSW50KHZhbHVlKTowfWlmKGlzTmFOKGRlbGF5KSl7ZGVsYXk9bnVsbH1yZXR1cm4gZGVsYXl9LHNob3VsZFNob3c6ZnVuY3Rpb24oKXtpZihwb3BNYWdpYy5vcGVuX2NvdW50Pj1wb3BNYWdpYy5jb25maWcuZnJlcXVlbmN5X2NvdW50KXtyZXR1cm4gZmFsc2V9dmFyIGN0cj1wb3BNYWdpYy5nZXRDb3VudEZyb21Db29raWUoKTtjb25zdCBsYXN0X29wZW5lZF90aW1lPXBvcE1hZ2ljLmdldExhc3RPcGVuZWRUaW1lRnJvbUNvb2tpZSgpO2NvbnN0IGN1cnJlbnRfdGltZT1NYXRoLmZsb29yKERhdGUubm93KClcLzFlMyk7Y29uc3QgbWF4aW11bURlbGF5VGltZT1sYXN0X29wZW5lZF90aW1lK3BvcE1hZ2ljLmNvbmZpZy50cmlnZ2VyX2RlbGF5O2lmKGxhc3Rfb3BlbmVkX3RpbWUmJm1heGltdW1EZWxheVRpbWU+Y3VycmVudF90aW1lKXtyZXR1cm4gZmFsc2V9cG9wTWFnaWMub3Blbl9jb3VudD1jdHI7cmV0dXJuIShjdHI+PXBvcE1hZ2ljLmNvbmZpZy5mcmVxdWVuY3lfY291bnQpfSx2ZW5vclNob3VsZFNob3c6ZnVuY3Rpb24oKXtyZXR1cm4gcG9wTWFnaWMudmVub3JfbG9hZGVkJiZwb3BNYWdpYy52ZW5vcj09PVwiMFwifSxzZXRBc09wZW5lZDpmdW5jdGlvbigpe3ZhciBuZXdfY3RyPTE7aWYocG9wTWFnaWMub3Blbl9jb3VudCE9PTApe25ld19jdHI9cG9wTWFnaWMub3Blbl9jb3VudCsxfWVsc2V7bmV3X2N0cj1wb3BNYWdpYy5nZXRDb3VudEZyb21Db29raWUoKSsxfWNvbnN0IGxhc3Rfb3BlbmVkX3RpbWU9TWF0aC5mbG9vcihEYXRlLm5vdygpXC8xZTMpO2lmKHBvcE1hZ2ljLmNvbmZpZy5jb29raWVjb25zZW50KXtwb3BNYWdpYy5zZXRDb29raWUocG9wTWFnaWMuY29va2llX25hbWUsYCR7bmV3X2N0cn07JHtsYXN0X29wZW5lZF90aW1lfWAscG9wTWFnaWMuY29uZmlnLmZyZXF1ZW5jeV9wZXJpb2QpfX0sbG9hZEhvc3RlZDpmdW5jdGlvbigpe3ZhciBob3N0ZWRTY3JpcHQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNjcmlwdFwiKTtob3N0ZWRTY3JpcHQudHlwZT1cImFwcGxpY2F0aW9uXC9qYXZhc2NyaXB0XCI7aG9zdGVkU2NyaXB0LmFzeW5jPXRydWU7aG9zdGVkU2NyaXB0LnNyYz1cIlwvXC9cIit0aGlzLmNvbmZpZy5hZHNfaG9zdCtcIlwvcG9wdW5kZXIxMDAwLmpzXCI7aG9zdGVkU2NyaXB0LmlkPVwicG9wbWFnaWNsZHJcIjtmb3IodmFyIGtleSBpbiB0aGlzLmNvbmZpZyl7aWYoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0aGlzLmNvbmZpZyxrZXkpKXtjb250aW51ZX1pZihrZXk9PT1cImFkc19ob3N0XCJ8fGtleT09PVwic3luZGljYXRpb25faG9zdFwiKXtjb250aW51ZX1ob3N0ZWRTY3JpcHQuc2V0QXR0cmlidXRlKFwiZGF0YS1leG8tXCIra2V5LHRoaXMuY29uZmlnW2tleV0pfXZhciBpbnNlcnRBbmNob3I9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCJib2R5XCIpLml0ZW0oMCk7aWYoaW5zZXJ0QW5jaG9yLmZpcnN0Q2hpbGQpe2luc2VydEFuY2hvci5pbnNlcnRCZWZvcmUoaG9zdGVkU2NyaXB0LGluc2VydEFuY2hvci5maXJzdENoaWxkKX1lbHNle2luc2VydEFuY2hvci5hcHBlbmRDaGlsZChob3N0ZWRTY3JpcHQpfX0scHJlcGFyZVBvcDpmdW5jdGlvbigpe2lmKHR5cGVvZiBleG9Kc1BvcDEwMT09PVwib2JqZWN0XCImJk9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChleG9Kc1BvcDEwMSxcImFkZFwiKSl7cmV0dXJufXBvcE1hZ2ljLnRvcD1zZWxmO2lmKHBvcE1hZ2ljLnRvcCE9PXNlbGYpe3RyeXtpZih0b3AuZG9jdW1lbnQubG9jYXRpb24udG9TdHJpbmcoKSl7cG9wTWFnaWMudG9wPXRvcH19Y2F0Y2goZXJyKXt9fXBvcE1hZ2ljLmNvb2tpZV9uYW1lPVwiem9uZS1jYXAtXCIrcG9wTWFnaWMuY29uZmlnLmlkem9uZTtpZihwb3BNYWdpYy5zaG91bGRTaG93KCkpe3ZhciB4bWxodHRwPW5ldyBYTUxIdHRwUmVxdWVzdDt4bWxodHRwLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpe2lmKHhtbGh0dHAucmVhZHlTdGF0ZT09WE1MSHR0cFJlcXVlc3QuRE9ORSl7cG9wTWFnaWMudmVub3JfbG9hZGVkPXRydWU7aWYoeG1saHR0cC5zdGF0dXM9PTIwMCl7cG9wTWFnaWMudmVub3I9eG1saHR0cC5yZXNwb25zZVRleHR9ZWxzZXtwb3BNYWdpYy52ZW5vcj1cIjBcIn19fTt2YXIgcHJvdG9jb2w9ZG9jdW1lbnQubG9jYXRpb24ucHJvdG9jb2whPT1cImh0dHBzOlwiJiZkb2N1bWVudC5sb2NhdGlvbi5wcm90b2NvbCE9PVwiaHR0cDpcIj9cImh0dHBzOlwiOmRvY3VtZW50LmxvY2F0aW9uLnByb3RvY29sO3htbGh0dHAub3BlbihcIkdFVFwiLHByb3RvY29sK1wiXC9cL1wiK3BvcE1hZ2ljLmNvbmZpZy5zeW5kaWNhdGlvbl9ob3N0K1wiXC92ZW5vci5waHBcIix0cnVlKTt0cnl7eG1saHR0cC5zZW5kKCl9Y2F0Y2goZXJyb3Ipe3BvcE1hZ2ljLnZlbm9yX2xvYWRlZD10cnVlfX1wb3BNYWdpYy5idWlsZFVybCgpO3BvcE1hZ2ljLmJyb3dzZXI9cG9wTWFnaWMuYnJvd3NlckRldGVjdG9yLmRldGVjdEJyb3dzZXIobmF2aWdhdG9yLnVzZXJBZ2VudCk7aWYoIXBvcE1hZ2ljLmNvbmZpZy5jaHJvbWVfZW5hYmxlZCYmKHBvcE1hZ2ljLmJyb3dzZXIubmFtZT09PVwiY2hyb21lXCJ8fHBvcE1hZ2ljLmJyb3dzZXIubmFtZT09PVwiY3Jpb3NcIikpe3JldHVybn12YXIgcG9wTWV0aG9kPXBvcE1hZ2ljLmdldFBvcE1ldGhvZChwb3BNYWdpYy5icm93c2VyKTtwb3BNYWdpYy5hZGRFdmVudChcImNsaWNrXCIscG9wTWV0aG9kKX0sZ2V0UG9wTWV0aG9kOmZ1bmN0aW9uKGJyb3dzZXJJbmZvKXtpZihwb3BNYWdpYy5jb25maWcucG9wdXBfZm9yY2Upe3JldHVybiBwb3BNYWdpYy5tZXRob2RzLnBvcHVwfWlmKHBvcE1hZ2ljLmNvbmZpZy5wb3B1cF9mYWxsYmFjayYmYnJvd3NlckluZm8ubmFtZT09PVwiY2hyb21lXCImJmJyb3dzZXJJbmZvLnZlcnNpb24+PTY4JiYhYnJvd3NlckluZm8uaXNNb2JpbGUpe3JldHVybiBwb3BNYWdpYy5tZXRob2RzLnBvcHVwfWlmKGJyb3dzZXJJbmZvLmlzTW9iaWxlKXtyZXR1cm4gcG9wTWFnaWMubWV0aG9kcy5kZWZhdWx0fWlmKGJyb3dzZXJJbmZvLm5hbWU9PT1cImNocm9tZVwiKXtyZXR1cm4gcG9wTWFnaWMubWV0aG9kcy5jaHJvbWVUYWJ9cmV0dXJuIHBvcE1hZ2ljLm1ldGhvZHMuZGVmYXVsdH0sYnVpbGRVcmw6ZnVuY3Rpb24oKXt2YXIgcHJvdG9jb2w9ZG9jdW1lbnQubG9jYXRpb24ucHJvdG9jb2whPT1cImh0dHBzOlwiJiZkb2N1bWVudC5sb2NhdGlvbi5wcm90b2NvbCE9PVwiaHR0cDpcIj9cImh0dHBzOlwiOmRvY3VtZW50LmxvY2F0aW9uLnByb3RvY29sO3ZhciBwPXRvcD09PXNlbGY/ZG9jdW1lbnQuVVJMOmRvY3VtZW50LnJlZmVycmVyO3ZhciBzY3JpcHRfaW5mbz17dHlwZTpcImlubGluZVwiLG5hbWU6XCJwb3BNYWdpY1wiLHZlcjp0aGlzLnZlcnNpb259O3ZhciBlbmNvZGVTY3JpcHRJbmZvPWZ1bmN0aW9uKHNjcmlwdF9pbmZvKXt2YXIgcmVzdWx0PXNjcmlwdF9pbmZvW1widHlwZVwiXStcInxcIitzY3JpcHRfaW5mb1tcIm5hbWVcIl0rXCJ8XCIrc2NyaXB0X2luZm9bXCJ2ZXJcIl07cmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudChidG9hKHJlc3VsdCkpfTt2YXIgY3VzdG9tVGFyZ2V0aW5nUGFyYW1zPVwiXCI7aWYoY3VzdG9tVGFyZ2V0aW5nJiZPYmplY3Qua2V5cyhjdXN0b21UYXJnZXRpbmcpLmxlbmd0aCl7dmFyIGN1c3RvbVRhcmdldGluZ0tleXM9dHlwZW9mIGN1c3RvbVRhcmdldGluZz09PVwib2JqZWN0XCI/T2JqZWN0LmtleXMoY3VzdG9tVGFyZ2V0aW5nKTpjdXN0b21UYXJnZXRpbmc7dmFyIHZhbHVlO2N1c3RvbVRhcmdldGluZ0tleXMuZm9yRWFjaChmdW5jdGlvbihrZXkpe2lmKHR5cGVvZiBjdXN0b21UYXJnZXRpbmc9PT1cIm9iamVjdFwiKXt2YWx1ZT1jdXN0b21UYXJnZXRpbmdba2V5XX1lbHNlIGlmKEFycmF5LmlzQXJyYXkoY3VzdG9tVGFyZ2V0aW5nKSl7dmFsdWU9c2NyaXB0RWwuZ2V0QXR0cmlidXRlKGtleSl9dmFyIGtleVdpdGhvdXRFeG9QcmVmaXg9a2V5LnJlcGxhY2UoXCJkYXRhLWV4by1cIixcIlwiKTtjdXN0b21UYXJnZXRpbmdQYXJhbXMrPWAmJHtrZXlXaXRob3V0RXhvUHJlZml4fT0ke3ZhbHVlfWB9KX10aGlzLnVybD1wcm90b2NvbCtcIlwvXC9cIit0aGlzLmNvbmZpZy5zeW5kaWNhdGlvbl9ob3N0K1wiXC9zcGxhc2gucGhwXCIrXCI/Y2F0PVwiK3RoaXMuY29uZmlnLmNhdCtcIiZpZHpvbmU9XCIrdGhpcy5jb25maWcuaWR6b25lK1wiJnR5cGU9OFwiK1wiJnA9XCIrZW5jb2RlVVJJQ29tcG9uZW50KHApK1wiJnN1Yj1cIit0aGlzLmNvbmZpZy5zdWIrKHRoaXMuY29uZmlnLnN1YjIhPT1cIlwiP1wiJnN1YjI9XCIrdGhpcy5jb25maWcuc3ViMjpcIlwiKSsodGhpcy5jb25maWcuc3ViMyE9PVwiXCI/XCImc3ViMz1cIit0aGlzLmNvbmZpZy5zdWIzOlwiXCIpK1wiJmJsb2NrPTFcIitcIiZlbD1cIit0aGlzLmNvbmZpZy5lbCtcIiZ0YWdzPVwiK3RoaXMuY29uZmlnLnRhZ3MrXCImY29va2llY29uc2VudD1cIit0aGlzLmNvbmZpZy5jb29raWVjb25zZW50K1wiJnNjcl9pbmZvPVwiK2VuY29kZVNjcmlwdEluZm8oc2NyaXB0X2luZm8pK2N1c3RvbVRhcmdldGluZ1BhcmFtc30sYWRkRXZlbnRUb0VsZW1lbnQ6ZnVuY3Rpb24ob2JqLHR5cGUsZm4pe2lmKG9iai5hZGRFdmVudExpc3RlbmVyKXtvYmouYWRkRXZlbnRMaXN0ZW5lcih0eXBlLGZuLGZhbHNlKX1lbHNlIGlmKG9iai5hdHRhY2hFdmVudCl7b2JqW1wiZVwiK3R5cGUrZm5dPWZuO29ialt0eXBlK2ZuXT1mdW5jdGlvbigpe29ialtcImVcIit0eXBlK2ZuXSh3aW5kb3cuZXZlbnQpfTtvYmouYXR0YWNoRXZlbnQoXCJvblwiK3R5cGUsb2JqW3R5cGUrZm5dKX1lbHNle29ialtcIm9uXCIrdHlwZV09b2JqW1wiZVwiK3R5cGUrZm5dfX0sYWRkRXZlbnQ6ZnVuY3Rpb24odHlwZSxmbil7dmFyIHRhcmdldEVsZW1lbnRzO2lmKHBvcE1hZ2ljLmNvbmZpZy50cmlnZ2VyX21ldGhvZD09XCIzXCIpe3RhcmdldEVsZW1lbnRzPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXCJhXCIpO2ZvcihpPTA7aTx0YXJnZXRFbGVtZW50cy5sZW5ndGg7aSsrKXtwb3BNYWdpYy5hZGRFdmVudFRvRWxlbWVudCh0YXJnZXRFbGVtZW50c1tpXSx0eXBlLGZuKX1yZXR1cm59aWYocG9wTWFnaWMuY29uZmlnLnRyaWdnZXJfbWV0aG9kPT1cIjJcIiYmcG9wTWFnaWMuY29uZmlnLnRyaWdnZXJfbWV0aG9kIT1cIlwiKXt2YXIgdHJpZ2dlcl9jbGFzc2VzO3ZhciB0cmlnZ2VyX2NsYXNzZXNfZmluYWw9W107aWYocG9wTWFnaWMuY29uZmlnLnRyaWdnZXJfY2xhc3MuaW5kZXhPZihcIixcIik9PT0tMSl7dHJpZ2dlcl9jbGFzc2VzPXBvcE1hZ2ljLmNvbmZpZy50cmlnZ2VyX2NsYXNzLnNwbGl0KFwiIFwiKX1lbHNle3ZhciB0cmltbWVkX3RyaWdnZXJfY2xhc3Nlcz1wb3BNYWdpYy5jb25maWcudHJpZ2dlcl9jbGFzcy5yZXBsYWNlKFwvXFxzXC9nLFwiXCIpO3RyaWdnZXJfY2xhc3Nlcz10cmltbWVkX3RyaWdnZXJfY2xhc3Nlcy5zcGxpdChcIixcIil9Zm9yKHZhciBpPTA7aTx0cmlnZ2VyX2NsYXNzZXMubGVuZ3RoO2krKyl7aWYodHJpZ2dlcl9jbGFzc2VzW2ldIT09XCJcIil7dHJpZ2dlcl9jbGFzc2VzX2ZpbmFsLnB1c2goXCIuXCIrdHJpZ2dlcl9jbGFzc2VzW2ldKX19dGFyZ2V0RWxlbWVudHM9ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCh0cmlnZ2VyX2NsYXNzZXNfZmluYWwuam9pbihcIiwgXCIpKTtmb3IoaT0wO2k8dGFyZ2V0RWxlbWVudHMubGVuZ3RoO2krKyl7cG9wTWFnaWMuYWRkRXZlbnRUb0VsZW1lbnQodGFyZ2V0RWxlbWVudHNbaV0sdHlwZSxmbil9cmV0dXJufXBvcE1hZ2ljLmFkZEV2ZW50VG9FbGVtZW50KGRvY3VtZW50LHR5cGUsZm4pfSxzZXRDb29raWU6ZnVuY3Rpb24obmFtZSx2YWx1ZSx0dGxfbWludXRlcyl7aWYoIXRoaXMuY29uZmlnLmNvb2tpZWNvbnNlbnQpe3JldHVybiBmYWxzZX10dGxfbWludXRlcz1wYXJzZUludCh0dGxfbWludXRlcywxMCk7dmFyIG5vd19kYXRlPW5ldyBEYXRlO25vd19kYXRlLnNldE1pbnV0ZXMobm93X2RhdGUuZ2V0TWludXRlcygpK3BhcnNlSW50KHR0bF9taW51dGVzKSk7dmFyIGNfdmFsdWU9ZW5jb2RlVVJJQ29tcG9uZW50KHZhbHVlKStcIjsgZXhwaXJlcz1cIitub3dfZGF0ZS50b1VUQ1N0cmluZygpK1wiOyBwYXRoPVwvXCI7ZG9jdW1lbnQuY29va2llPW5hbWUrXCI9XCIrY192YWx1ZX0sZ2V0Q29va2llOmZ1bmN0aW9uKG5hbWUpe2lmKCF0aGlzLmNvbmZpZy5jb29raWVjb25zZW50KXtyZXR1cm4gZmFsc2V9dmFyIGkseCx5LGNvb2tpZXNBcnJheT1kb2N1bWVudC5jb29raWUuc3BsaXQoXCI7XCIpO2ZvcihpPTA7aTxjb29raWVzQXJyYXkubGVuZ3RoO2krKyl7eD1jb29raWVzQXJyYXlbaV0uc3Vic3RyKDAsY29va2llc0FycmF5W2ldLmluZGV4T2YoXCI9XCIpKTt5PWNvb2tpZXNBcnJheVtpXS5zdWJzdHIoY29va2llc0FycmF5W2ldLmluZGV4T2YoXCI9XCIpKzEpO3g9eC5yZXBsYWNlKFwvXlxccyt8XFxzKyRcL2csXCJcIik7aWYoeD09PW5hbWUpe3JldHVybiBkZWNvZGVVUklDb21wb25lbnQoeSl9fX0scmFuZFN0cjpmdW5jdGlvbihsZW5ndGgscG9zc2libGVDaGFycyl7dmFyIHRleHQ9XCJcIjt2YXIgcG9zc2libGU9cG9zc2libGVDaGFyc3x8XCJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OVwiO2Zvcih2YXIgaT0wO2k8bGVuZ3RoO2krKyl7dGV4dCs9cG9zc2libGUuY2hhckF0KE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSpwb3NzaWJsZS5sZW5ndGgpKX1yZXR1cm4gdGV4dH0saXNWYWxpZFVzZXJFdmVudDpmdW5jdGlvbihldmVudCl7aWYoXCJpc1RydXN0ZWRcImluIGV2ZW50JiZldmVudC5pc1RydXN0ZWQmJnBvcE1hZ2ljLmJyb3dzZXIubmFtZSE9PVwiaWVcIiYmcG9wTWFnaWMuYnJvd3Nlci5uYW1lIT09XCJzYWZhcmlcIil7cmV0dXJuIHRydWV9ZWxzZXtyZXR1cm4gZXZlbnQuc2NyZWVuWCE9MCYmZXZlbnQuc2NyZWVuWSE9MH19LGlzVmFsaWRIcmVmOmZ1bmN0aW9uKGhyZWYpe2lmKHR5cGVvZiBocmVmPT09XCJ1bmRlZmluZWRcInx8aHJlZj09XCJcIil7cmV0dXJuIGZhbHNlfXZhciBlbXB0eV9yZWY9XC9cXHM/amF2YXNjcmlwdFxccz86XC9pO3JldHVybiFlbXB0eV9yZWYudGVzdChocmVmKX0sZmluZExpbmtUb09wZW46ZnVuY3Rpb24oY2xpY2tlZEVsZW1lbnQpe3ZhciB0YXJnZXQ9Y2xpY2tlZEVsZW1lbnQ7dmFyIGxvY2F0aW9uPWZhbHNlO3RyeXt2YXIgYnJlYWtDdHI9MDt3aGlsZShicmVha0N0cjwyMCYmIXRhcmdldC5nZXRBdHRyaWJ1dGUoXCJocmVmXCIpJiZ0YXJnZXQhPT1kb2N1bWVudCYmdGFyZ2V0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkhPT1cImh0bWxcIil7dGFyZ2V0PXRhcmdldC5wYXJlbnROb2RlO2JyZWFrQ3RyKyt9dmFyIGVsZW1lbnRUYXJnZXRBdHRyPXRhcmdldC5nZXRBdHRyaWJ1dGUoXCJ0YXJnZXRcIik7aWYoIWVsZW1lbnRUYXJnZXRBdHRyfHxlbGVtZW50VGFyZ2V0QXR0ci5pbmRleE9mKFwiX2JsYW5rXCIpPT09LTEpe2xvY2F0aW9uPXRhcmdldC5nZXRBdHRyaWJ1dGUoXCJocmVmXCIpfX1jYXRjaChlcnIpe31pZighcG9wTWFnaWMuaXNWYWxpZEhyZWYobG9jYXRpb24pKXtsb2NhdGlvbj1mYWxzZX1yZXR1cm4gbG9jYXRpb258fHdpbmRvdy5sb2NhdGlvbi5ocmVmfSxnZXRQdUlkOmZ1bmN0aW9uKCl7cmV0dXJuXCJva19cIitNYXRoLmZsb29yKDg5OTk5OTk5Kk1hdGgucmFuZG9tKCkrMWU3KX0sYnJvd3NlckRldGVjdG9yOnticm93c2VyRGVmaW5pdGlvbnM6W1tcImZpcmVmb3hcIixcL0ZpcmVmb3hcXFwvKFswLTkuXSspKD86XFxzfCQpXC9dLFtcIm9wZXJhXCIsXC9PcGVyYVxcXC8oWzAtOS5dKykoPzpcXHN8JClcL10sW1wib3BlcmFcIixcL09QUlxcXC8oWzAtOS5dKykoOj9cXHN8JCkkXC9dLFtcImVkZ2VcIixcL0VkZyg/OmV8KVxcXC8oWzAtOS5fXSspXC9dLFtcImllXCIsXC9UcmlkZW50XFxcLzdcXC4wLipydjooWzAtOS5dKylcXCkuKkdlY2tvJFwvXSxbXCJpZVwiLFwvTVNJRVxccyhbMC05Ll0rKTsuKlRyaWRlbnRcXFwvWzQtN10uMFwvXSxbXCJpZVwiLFwvTVNJRVxccyg3XFwuMClcL10sW1wic2FmYXJpXCIsXC9WZXJzaW9uXFxcLyhbMC05Ll9dKykuKlNhZmFyaVwvXSxbXCJjaHJvbWVcIixcLyg/IUNocm9tLipFZGcoPzplfCkpQ2hyb20oPzplfGl1bSlcXFwvKFswLTkuXSspKDo/XFxzfCQpXC9dLFtcImNocm9tZVwiLFwvKD8hQ2hyb20uKk9QUilDaHJvbSg/OmV8aXVtKVxcXC8oWzAtOS5dKykoOj9cXHN8JClcL10sW1wiYmIxMFwiLFwvQkIxMDtcXHNUb3VjaC4qVmVyc2lvblxcXC8oWzAtOS5dKylcL10sW1wiYW5kcm9pZFwiLFwvQW5kcm9pZFxccyhbMC05Ll0rKVwvXSxbXCJpb3NcIixcL1ZlcnNpb25cXFwvKFswLTkuX10rKS4qTW9iaWxlLipTYWZhcmkuKlwvXSxbXCJ5YW5kZXhicm93c2VyXCIsXC9ZYUJyb3dzZXJcXFwvKFswLTkuX10rKVwvXSxbXCJjcmlvc1wiLFwvQ3JpT1NcXFwvKFswLTkuXSspKDo/XFxzfCQpXC9dXSxkZXRlY3RCcm93c2VyOmZ1bmN0aW9uKHVzZXJBZ2VudCl7dmFyIGlzTW9iaWxlPXVzZXJBZ2VudC5tYXRjaChcL0FuZHJvaWR8QmxhY2tCZXJyeXxpUGhvbmV8aVBhZHxpUG9kfE9wZXJhIE1pbml8SUVNb2JpbGV8V2ViT1N8V2luZG93cyBQaG9uZVwvaSk7Zm9yKHZhciBpIGluIHRoaXMuYnJvd3NlckRlZmluaXRpb25zKXt2YXIgZGVmaW5pdGlvbj10aGlzLmJyb3dzZXJEZWZpbml0aW9uc1tpXTtpZihkZWZpbml0aW9uWzFdLnRlc3QodXNlckFnZW50KSl7dmFyIG1hdGNoPWRlZmluaXRpb25bMV0uZXhlYyh1c2VyQWdlbnQpO3ZhciB2ZXJzaW9uPW1hdGNoJiZtYXRjaFsxXS5zcGxpdChcL1suX11cLykuc2xpY2UoMCwzKTt2YXIgdmVyc2lvblRhaWxzPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKHZlcnNpb24sMSkuam9pbihcIlwiKXx8XCIwXCI7aWYodmVyc2lvbiYmdmVyc2lvbi5sZW5ndGg8Myl7QXJyYXkucHJvdG90eXBlLnB1c2guYXBwbHkodmVyc2lvbix2ZXJzaW9uLmxlbmd0aD09PTE/WzAsMF06WzBdKX1yZXR1cm57bmFtZTpkZWZpbml0aW9uWzBdLHZlcnNpb246dmVyc2lvbi5qb2luKFwiLlwiKSx2ZXJzaW9uTnVtYmVyOnBhcnNlRmxvYXQodmVyc2lvblswXStcIi5cIit2ZXJzaW9uVGFpbHMpLGlzTW9iaWxlOmlzTW9iaWxlfX19cmV0dXJue25hbWU6XCJvdGhlclwiLHZlcnNpb246XCIxLjBcIix2ZXJzaW9uTnVtYmVyOjEsaXNNb2JpbGU6aXNNb2JpbGV9fX0sbWV0aG9kczp7ZGVmYXVsdDpmdW5jdGlvbih0cmlnZ2VyZWRFdmVudCl7aWYoIXBvcE1hZ2ljLnNob3VsZFNob3coKXx8IXBvcE1hZ2ljLnZlbm9yU2hvdWxkU2hvdygpfHwhcG9wTWFnaWMuaXNWYWxpZFVzZXJFdmVudCh0cmlnZ2VyZWRFdmVudCkpcmV0dXJuIHRydWU7dmFyIGNsaWNrZWRFbGVtZW50PXRyaWdnZXJlZEV2ZW50LnRhcmdldHx8dHJpZ2dlcmVkRXZlbnQuc3JjRWxlbWVudDt2YXIgaHJlZj1wb3BNYWdpYy5maW5kTGlua1RvT3BlbihjbGlja2VkRWxlbWVudCk7d2luZG93Lm9wZW4oaHJlZixcIl9ibGFua1wiKTtwb3BNYWdpYy5zZXRBc09wZW5lZCgpO3BvcE1hZ2ljLnRvcC5kb2N1bWVudC5sb2NhdGlvbj1wb3BNYWdpYy51cmw7aWYodHlwZW9mIHRyaWdnZXJlZEV2ZW50LnByZXZlbnREZWZhdWx0IT09XCJ1bmRlZmluZWRcIil7dHJpZ2dlcmVkRXZlbnQucHJldmVudERlZmF1bHQoKTt0cmlnZ2VyZWRFdmVudC5zdG9wUHJvcGFnYXRpb24oKX1yZXR1cm4gdHJ1ZX0sY2hyb21lVGFiOmZ1bmN0aW9uKGV2ZW50KXtpZighcG9wTWFnaWMuc2hvdWxkU2hvdygpfHwhcG9wTWFnaWMudmVub3JTaG91bGRTaG93KCl8fCFwb3BNYWdpYy5pc1ZhbGlkVXNlckV2ZW50KGV2ZW50KSlyZXR1cm4gdHJ1ZTtpZih0eXBlb2YgZXZlbnQucHJldmVudERlZmF1bHQhPT1cInVuZGVmaW5lZFwiKXtldmVudC5wcmV2ZW50RGVmYXVsdCgpO2V2ZW50LnN0b3BQcm9wYWdhdGlvbigpfWVsc2V7cmV0dXJuIHRydWV9dmFyIGE9dG9wLndpbmRvdy5kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYVwiKTt2YXIgdGFyZ2V0PWV2ZW50LnRhcmdldHx8ZXZlbnQuc3JjRWxlbWVudDthLmhyZWY9cG9wTWFnaWMuZmluZExpbmtUb09wZW4odGFyZ2V0KTtkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZShcImJvZHlcIilbMF0uYXBwZW5kQ2hpbGQoYSk7dmFyIGU9bmV3IE1vdXNlRXZlbnQoXCJjbGlja1wiLHtidWJibGVzOnRydWUsY2FuY2VsYWJsZTp0cnVlLHZpZXc6d2luZG93LHNjcmVlblg6MCxzY3JlZW5ZOjAsY2xpZW50WDowLGNsaWVudFk6MCxjdHJsS2V5OnRydWUsYWx0S2V5OmZhbHNlLHNoaWZ0S2V5OmZhbHNlLG1ldGFLZXk6dHJ1ZSxidXR0b246MH0pO2UucHJldmVudERlZmF1bHQ9dW5kZWZpbmVkO2EuZGlzcGF0Y2hFdmVudChlKTthLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYSk7d2luZG93Lm9wZW4ocG9wTWFnaWMudXJsLFwiX3NlbGZcIik7cG9wTWFnaWMuc2V0QXNPcGVuZWQoKX0scG9wdXA6ZnVuY3Rpb24odHJpZ2dlcmVkRXZlbnQpe2lmKCFwb3BNYWdpYy5zaG91bGRTaG93KCl8fCFwb3BNYWdpYy52ZW5vclNob3VsZFNob3coKXx8IXBvcE1hZ2ljLmlzVmFsaWRVc2VyRXZlbnQodHJpZ2dlcmVkRXZlbnQpKXJldHVybiB0cnVlO3ZhciB3aW5PcHRpb25zPVwiXCI7aWYocG9wTWFnaWMuY29uZmlnLnBvcHVwX2ZhbGxiYWNrJiYhcG9wTWFnaWMuY29uZmlnLnBvcHVwX2ZvcmNlKXt2YXIgaGVpZ2h0PU1hdGgubWF4KE1hdGgucm91bmQod2luZG93LmlubmVySGVpZ2h0Ki44KSwzMDApO3ZhciB3aWR0aD1NYXRoLm1heChNYXRoLnJvdW5kKHdpbmRvdy5pbm5lcldpZHRoKi43KSwzMDApO3ZhciB0b3A9d2luZG93LnNjcmVlblkrMTAwO3ZhciBsZWZ0PXdpbmRvdy5zY3JlZW5YKzEwMDt3aW5PcHRpb25zPVwibWVudWJhcj0xLHJlc2l6YWJsZT0xLHdpZHRoPVwiK3dpZHRoK1wiLGhlaWdodD1cIitoZWlnaHQrXCIsdG9wPVwiK3RvcCtcIixsZWZ0PVwiK2xlZnR9dmFyIHByZVBvcFVybD1kb2N1bWVudC5sb2NhdGlvbi5ocmVmO3ZhciBwb3BXaW49d2luZG93Lm9wZW4ocHJlUG9wVXJsLHBvcE1hZ2ljLmdldFB1SWQoKSx3aW5PcHRpb25zKTtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cG9wV2luLmxvY2F0aW9uLmhyZWY9cG9wTWFnaWMudXJsfSwyMDApO3BvcE1hZ2ljLnNldEFzT3BlbmVkKCk7aWYodHlwZW9mIHRyaWdnZXJlZEV2ZW50LnByZXZlbnREZWZhdWx0IT09XCJ1bmRlZmluZWRcIil7dHJpZ2dlcmVkRXZlbnQucHJldmVudERlZmF1bHQoKTt0cmlnZ2VyZWRFdmVudC5zdG9wUHJvcGFnYXRpb24oKX19fX07ICAgIHBvcE1hZ2ljLmluaXQoYWRDb25maWcpO1xyXG59KSgpO1xyXG5cclxuXHJcbjxcL3NjcmlwdD4ifSx7ImlkIjoiZXhvbV9qX1BPUFVOREVSIiwiYWRzcG90Ijoial9QT1BVTkRFUiIsIndlaWdodCI6IjYiLCJmY2FwIjoiMiIsInNjaGVkdWxlIjpmYWxzZSwibWF4V2lkdGgiOiI3NjgiLCJtaW5XaWR0aCI6ZmFsc2UsInRpbWV6b25lIjpmYWxzZSwiZXhjbHVkZSI6ZmFsc2UsImRvbWFpbiI6ZmFsc2UsImNvZGUiOiI8c2NyaXB0IHR5cGU9XCJhcHBsaWNhdGlvblwvamF2YXNjcmlwdFwiPlxyXG4oZnVuY3Rpb24oKSB7XHJcblxyXG4gICAgXC9cL3ZlcnNpb24gMS4wLjBcclxuXHJcbiAgICB2YXIgYWRDb25maWcgPSB7XHJcbiAgICBcImFkc19ob3N0XCI6IFwiYS5wZW1zcnYuY29tXCIsXHJcbiAgICBcInN5bmRpY2F0aW9uX2hvc3RcIjogXCJzLnBlbXNydi5jb21cIixcclxuICAgIFwiaWR6b25lXCI6IDExMzk3MjgsXHJcbiAgICBcInBvcHVwX2ZhbGxiYWNrXCI6IGZhbHNlLFxyXG4gICAgXCJwb3B1cF9mb3JjZVwiOiBmYWxzZSxcclxuICAgIFwiY2hyb21lX2VuYWJsZWRcIjogdHJ1ZSxcclxuICAgIFwibmV3X3RhYlwiOiBmYWxzZSxcclxuICAgIFwiZnJlcXVlbmN5X3BlcmlvZFwiOiA3MjAsXHJcbiAgICBcImZyZXF1ZW5jeV9jb3VudFwiOiAxLFxyXG4gICAgXCJ0cmlnZ2VyX21ldGhvZFwiOiAzLFxyXG4gICAgXCJ0cmlnZ2VyX2NsYXNzXCI6IFwiXCIsXHJcbiAgICBcInRyaWdnZXJfZGVsYXlcIjogMCxcclxuICAgIFwib25seV9pbmxpbmVcIjogZmFsc2VcclxufTtcclxuXHJcbmlmKCF3aW5kb3cuZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCl7ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbD1kb2N1bWVudC5ib2R5LnF1ZXJ5U2VsZWN0b3JBbGw9T2JqZWN0LnF1ZXJ5U2VsZWN0b3JBbGw9ZnVuY3Rpb24gcXVlcnlTZWxlY3RvckFsbFBvbHlmaWxsKHIsYyxpLGosYSl7dmFyIGQ9ZG9jdW1lbnQscz1kLmNyZWF0ZVN0eWxlU2hlZXQoKTthPWQuYWxsO2M9W107cj1yLnJlcGxhY2UoXC9cXFtmb3JcXGJcL2dpLFwiW2h0bWxGb3JcIikuc3BsaXQoXCIsXCIpO2ZvcihpPXIubGVuZ3RoO2ktLTspe3MuYWRkUnVsZShyW2ldLFwiazp2XCIpO2ZvcihqPWEubGVuZ3RoO2otLTspe2Fbal0uY3VycmVudFN0eWxlLmsmJmMucHVzaChhW2pdKX1zLnJlbW92ZVJ1bGUoMCl9cmV0dXJuIGN9fXZhciBwb3BNYWdpYz17dmVyc2lvbjoxLGNvb2tpZV9uYW1lOlwiXCIsdXJsOlwiXCIsY29uZmlnOnt9LG9wZW5fY291bnQ6MCx0b3A6bnVsbCxicm93c2VyOm51bGwsdmVub3JfbG9hZGVkOmZhbHNlLHZlbm9yOmZhbHNlLGNvbmZpZ1RwbDp7YWRzX2hvc3Q6XCJcIixzeW5kaWNhdGlvbl9ob3N0OlwiXCIsaWR6b25lOlwiXCIsZnJlcXVlbmN5X3BlcmlvZDo3MjAsZnJlcXVlbmN5X2NvdW50OjEsdHJpZ2dlcl9tZXRob2Q6MSx0cmlnZ2VyX2NsYXNzOlwiXCIscG9wdXBfZm9yY2U6ZmFsc2UscG9wdXBfZmFsbGJhY2s6ZmFsc2UsY2hyb21lX2VuYWJsZWQ6dHJ1ZSxuZXdfdGFiOmZhbHNlLGNhdDpcIlwiLHRhZ3M6XCJcIixlbDpcIlwiLHN1YjpcIlwiLHN1YjI6XCJcIixzdWIzOlwiXCIsb25seV9pbmxpbmU6ZmFsc2UsdHJpZ2dlcl9kZWxheTowLGNvb2tpZWNvbnNlbnQ6dHJ1ZX0saW5pdDpmdW5jdGlvbihjb25maWcpe2lmKHR5cGVvZiBjb25maWcuaWR6b25lPT09XCJ1bmRlZmluZWRcInx8IWNvbmZpZy5pZHpvbmUpe3JldHVybn1pZih0eXBlb2YgY29uZmlnW1wiY3VzdG9tVGFyZ2V0aW5nXCJdPT09XCJ1bmRlZmluZWRcIil7Y29uZmlnW1wiY3VzdG9tVGFyZ2V0aW5nXCJdPVtdfXdpbmRvd1tcImN1c3RvbVRhcmdldGluZ1wiXT1jb25maWdbXCJjdXN0b21UYXJnZXRpbmdcIl18fG51bGw7dmFyIGN1c3RvbVRhcmdldGluZz1PYmplY3Qua2V5cyhjb25maWdbXCJjdXN0b21UYXJnZXRpbmdcIl0pLmZpbHRlcihmdW5jdGlvbihjKXtyZXR1cm4gYy5zZWFyY2goXCJleF9cIik+PTB9KTtpZihjdXN0b21UYXJnZXRpbmcubGVuZ3RoKXtjdXN0b21UYXJnZXRpbmcuZm9yRWFjaChmdW5jdGlvbihjdCl7cmV0dXJuIHRoaXMuY29uZmlnVHBsW2N0XT1udWxsfS5iaW5kKHRoaXMpKX1mb3IodmFyIGtleSBpbiB0aGlzLmNvbmZpZ1RwbCl7aWYoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0aGlzLmNvbmZpZ1RwbCxrZXkpKXtjb250aW51ZX1pZih0eXBlb2YgY29uZmlnW2tleV0hPT1cInVuZGVmaW5lZFwiKXt0aGlzLmNvbmZpZ1trZXldPWNvbmZpZ1trZXldfWVsc2V7dGhpcy5jb25maWdba2V5XT10aGlzLmNvbmZpZ1RwbFtrZXldfX1pZih0eXBlb2YgdGhpcy5jb25maWcuaWR6b25lPT09XCJ1bmRlZmluZWRcInx8dGhpcy5jb25maWcuaWR6b25lPT09XCJcIil7cmV0dXJufWlmKHRoaXMuY29uZmlnLm9ubHlfaW5saW5lIT09dHJ1ZSl7dGhpcy5sb2FkSG9zdGVkKCl9dGhpcy5hZGRFdmVudFRvRWxlbWVudCh3aW5kb3csXCJsb2FkXCIsdGhpcy5wcmVwYXJlUG9wKX0sZ2V0Q291bnRGcm9tQ29va2llOmZ1bmN0aW9uKCl7aWYoIXRoaXMuY29uZmlnLmNvb2tpZWNvbnNlbnQpe3JldHVybiAwfXZhciBzaG93bkNvb2tpZT1wb3BNYWdpYy5nZXRDb29raWUocG9wTWFnaWMuY29va2llX25hbWUpO3ZhciBjdHI9dHlwZW9mIHNob3duQ29va2llPT09XCJ1bmRlZmluZWRcIj8wOnBhcnNlSW50KHNob3duQ29va2llKTtpZihpc05hTihjdHIpKXtjdHI9MH1yZXR1cm4gY3RyfSxnZXRMYXN0T3BlbmVkVGltZUZyb21Db29raWU6ZnVuY3Rpb24oKXt2YXIgc2hvd25Db29raWU9cG9wTWFnaWMuZ2V0Q29va2llKHBvcE1hZ2ljLmNvb2tpZV9uYW1lKTt2YXIgZGVsYXk9bnVsbDtpZih0eXBlb2Ygc2hvd25Db29raWUhPT1cInVuZGVmaW5lZFwiKXt2YXIgdmFsdWU9c2hvd25Db29raWUuc3BsaXQoXCI7XCIpWzFdO2RlbGF5PXZhbHVlPjA/cGFyc2VJbnQodmFsdWUpOjB9aWYoaXNOYU4oZGVsYXkpKXtkZWxheT1udWxsfXJldHVybiBkZWxheX0sc2hvdWxkU2hvdzpmdW5jdGlvbigpe2lmKHBvcE1hZ2ljLm9wZW5fY291bnQ+PXBvcE1hZ2ljLmNvbmZpZy5mcmVxdWVuY3lfY291bnQpe3JldHVybiBmYWxzZX12YXIgY3RyPXBvcE1hZ2ljLmdldENvdW50RnJvbUNvb2tpZSgpO2NvbnN0IGxhc3Rfb3BlbmVkX3RpbWU9cG9wTWFnaWMuZ2V0TGFzdE9wZW5lZFRpbWVGcm9tQ29va2llKCk7Y29uc3QgY3VycmVudF90aW1lPU1hdGguZmxvb3IoRGF0ZS5ub3coKVwvMWUzKTtjb25zdCBtYXhpbXVtRGVsYXlUaW1lPWxhc3Rfb3BlbmVkX3RpbWUrcG9wTWFnaWMuY29uZmlnLnRyaWdnZXJfZGVsYXk7aWYobGFzdF9vcGVuZWRfdGltZSYmbWF4aW11bURlbGF5VGltZT5jdXJyZW50X3RpbWUpe3JldHVybiBmYWxzZX1wb3BNYWdpYy5vcGVuX2NvdW50PWN0cjtyZXR1cm4hKGN0cj49cG9wTWFnaWMuY29uZmlnLmZyZXF1ZW5jeV9jb3VudCl9LHZlbm9yU2hvdWxkU2hvdzpmdW5jdGlvbigpe3JldHVybiBwb3BNYWdpYy52ZW5vcl9sb2FkZWQmJnBvcE1hZ2ljLnZlbm9yPT09XCIwXCJ9LHNldEFzT3BlbmVkOmZ1bmN0aW9uKCl7dmFyIG5ld19jdHI9MTtpZihwb3BNYWdpYy5vcGVuX2NvdW50IT09MCl7bmV3X2N0cj1wb3BNYWdpYy5vcGVuX2NvdW50KzF9ZWxzZXtuZXdfY3RyPXBvcE1hZ2ljLmdldENvdW50RnJvbUNvb2tpZSgpKzF9Y29uc3QgbGFzdF9vcGVuZWRfdGltZT1NYXRoLmZsb29yKERhdGUubm93KClcLzFlMyk7aWYocG9wTWFnaWMuY29uZmlnLmNvb2tpZWNvbnNlbnQpe3BvcE1hZ2ljLnNldENvb2tpZShwb3BNYWdpYy5jb29raWVfbmFtZSxgJHtuZXdfY3RyfTske2xhc3Rfb3BlbmVkX3RpbWV9YCxwb3BNYWdpYy5jb25maWcuZnJlcXVlbmN5X3BlcmlvZCl9fSxsb2FkSG9zdGVkOmZ1bmN0aW9uKCl7dmFyIGhvc3RlZFNjcmlwdD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic2NyaXB0XCIpO2hvc3RlZFNjcmlwdC50eXBlPVwiYXBwbGljYXRpb25cL2phdmFzY3JpcHRcIjtob3N0ZWRTY3JpcHQuYXN5bmM9dHJ1ZTtob3N0ZWRTY3JpcHQuc3JjPVwiXC9cL1wiK3RoaXMuY29uZmlnLmFkc19ob3N0K1wiXC9wb3B1bmRlcjEwMDAuanNcIjtob3N0ZWRTY3JpcHQuaWQ9XCJwb3BtYWdpY2xkclwiO2Zvcih2YXIga2V5IGluIHRoaXMuY29uZmlnKXtpZighT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHRoaXMuY29uZmlnLGtleSkpe2NvbnRpbnVlfWlmKGtleT09PVwiYWRzX2hvc3RcInx8a2V5PT09XCJzeW5kaWNhdGlvbl9ob3N0XCIpe2NvbnRpbnVlfWhvc3RlZFNjcmlwdC5zZXRBdHRyaWJ1dGUoXCJkYXRhLWV4by1cIitrZXksdGhpcy5jb25maWdba2V5XSl9dmFyIGluc2VydEFuY2hvcj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZShcImJvZHlcIikuaXRlbSgwKTtpZihpbnNlcnRBbmNob3IuZmlyc3RDaGlsZCl7aW5zZXJ0QW5jaG9yLmluc2VydEJlZm9yZShob3N0ZWRTY3JpcHQsaW5zZXJ0QW5jaG9yLmZpcnN0Q2hpbGQpfWVsc2V7aW5zZXJ0QW5jaG9yLmFwcGVuZENoaWxkKGhvc3RlZFNjcmlwdCl9fSxwcmVwYXJlUG9wOmZ1bmN0aW9uKCl7aWYodHlwZW9mIGV4b0pzUG9wMTAxPT09XCJvYmplY3RcIiYmT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGV4b0pzUG9wMTAxLFwiYWRkXCIpKXtyZXR1cm59cG9wTWFnaWMudG9wPXNlbGY7aWYocG9wTWFnaWMudG9wIT09c2VsZil7dHJ5e2lmKHRvcC5kb2N1bWVudC5sb2NhdGlvbi50b1N0cmluZygpKXtwb3BNYWdpYy50b3A9dG9wfX1jYXRjaChlcnIpe319cG9wTWFnaWMuY29va2llX25hbWU9XCJ6b25lLWNhcC1cIitwb3BNYWdpYy5jb25maWcuaWR6b25lO2lmKHBvcE1hZ2ljLnNob3VsZFNob3coKSl7dmFyIHhtbGh0dHA9bmV3IFhNTEh0dHBSZXF1ZXN0O3htbGh0dHAub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7aWYoeG1saHR0cC5yZWFkeVN0YXRlPT1YTUxIdHRwUmVxdWVzdC5ET05FKXtwb3BNYWdpYy52ZW5vcl9sb2FkZWQ9dHJ1ZTtpZih4bWxodHRwLnN0YXR1cz09MjAwKXtwb3BNYWdpYy52ZW5vcj14bWxodHRwLnJlc3BvbnNlVGV4dH1lbHNle3BvcE1hZ2ljLnZlbm9yPVwiMFwifX19O3ZhciBwcm90b2NvbD1kb2N1bWVudC5sb2NhdGlvbi5wcm90b2NvbCE9PVwiaHR0cHM6XCImJmRvY3VtZW50LmxvY2F0aW9uLnByb3RvY29sIT09XCJodHRwOlwiP1wiaHR0cHM6XCI6ZG9jdW1lbnQubG9jYXRpb24ucHJvdG9jb2w7eG1saHR0cC5vcGVuKFwiR0VUXCIscHJvdG9jb2wrXCJcL1wvXCIrcG9wTWFnaWMuY29uZmlnLnN5bmRpY2F0aW9uX2hvc3QrXCJcL3Zlbm9yLnBocFwiLHRydWUpO3RyeXt4bWxodHRwLnNlbmQoKX1jYXRjaChlcnJvcil7cG9wTWFnaWMudmVub3JfbG9hZGVkPXRydWV9fXBvcE1hZ2ljLmJ1aWxkVXJsKCk7cG9wTWFnaWMuYnJvd3Nlcj1wb3BNYWdpYy5icm93c2VyRGV0ZWN0b3IuZGV0ZWN0QnJvd3NlcihuYXZpZ2F0b3IudXNlckFnZW50KTtpZighcG9wTWFnaWMuY29uZmlnLmNocm9tZV9lbmFibGVkJiYocG9wTWFnaWMuYnJvd3Nlci5uYW1lPT09XCJjaHJvbWVcInx8cG9wTWFnaWMuYnJvd3Nlci5uYW1lPT09XCJjcmlvc1wiKSl7cmV0dXJufXZhciBwb3BNZXRob2Q9cG9wTWFnaWMuZ2V0UG9wTWV0aG9kKHBvcE1hZ2ljLmJyb3dzZXIpO3BvcE1hZ2ljLmFkZEV2ZW50KFwiY2xpY2tcIixwb3BNZXRob2QpfSxnZXRQb3BNZXRob2Q6ZnVuY3Rpb24oYnJvd3NlckluZm8pe2lmKHBvcE1hZ2ljLmNvbmZpZy5wb3B1cF9mb3JjZSl7cmV0dXJuIHBvcE1hZ2ljLm1ldGhvZHMucG9wdXB9aWYocG9wTWFnaWMuY29uZmlnLnBvcHVwX2ZhbGxiYWNrJiZicm93c2VySW5mby5uYW1lPT09XCJjaHJvbWVcIiYmYnJvd3NlckluZm8udmVyc2lvbj49NjgmJiFicm93c2VySW5mby5pc01vYmlsZSl7cmV0dXJuIHBvcE1hZ2ljLm1ldGhvZHMucG9wdXB9aWYoYnJvd3NlckluZm8uaXNNb2JpbGUpe3JldHVybiBwb3BNYWdpYy5tZXRob2RzLmRlZmF1bHR9aWYoYnJvd3NlckluZm8ubmFtZT09PVwiY2hyb21lXCIpe3JldHVybiBwb3BNYWdpYy5tZXRob2RzLmNocm9tZVRhYn1yZXR1cm4gcG9wTWFnaWMubWV0aG9kcy5kZWZhdWx0fSxidWlsZFVybDpmdW5jdGlvbigpe3ZhciBwcm90b2NvbD1kb2N1bWVudC5sb2NhdGlvbi5wcm90b2NvbCE9PVwiaHR0cHM6XCImJmRvY3VtZW50LmxvY2F0aW9uLnByb3RvY29sIT09XCJodHRwOlwiP1wiaHR0cHM6XCI6ZG9jdW1lbnQubG9jYXRpb24ucHJvdG9jb2w7dmFyIHA9dG9wPT09c2VsZj9kb2N1bWVudC5VUkw6ZG9jdW1lbnQucmVmZXJyZXI7dmFyIHNjcmlwdF9pbmZvPXt0eXBlOlwiaW5saW5lXCIsbmFtZTpcInBvcE1hZ2ljXCIsdmVyOnRoaXMudmVyc2lvbn07dmFyIGVuY29kZVNjcmlwdEluZm89ZnVuY3Rpb24oc2NyaXB0X2luZm8pe3ZhciByZXN1bHQ9c2NyaXB0X2luZm9bXCJ0eXBlXCJdK1wifFwiK3NjcmlwdF9pbmZvW1wibmFtZVwiXStcInxcIitzY3JpcHRfaW5mb1tcInZlclwiXTtyZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KGJ0b2EocmVzdWx0KSl9O3ZhciBjdXN0b21UYXJnZXRpbmdQYXJhbXM9XCJcIjtpZihjdXN0b21UYXJnZXRpbmcmJk9iamVjdC5rZXlzKGN1c3RvbVRhcmdldGluZykubGVuZ3RoKXt2YXIgY3VzdG9tVGFyZ2V0aW5nS2V5cz10eXBlb2YgY3VzdG9tVGFyZ2V0aW5nPT09XCJvYmplY3RcIj9PYmplY3Qua2V5cyhjdXN0b21UYXJnZXRpbmcpOmN1c3RvbVRhcmdldGluZzt2YXIgdmFsdWU7Y3VzdG9tVGFyZ2V0aW5nS2V5cy5mb3JFYWNoKGZ1bmN0aW9uKGtleSl7aWYodHlwZW9mIGN1c3RvbVRhcmdldGluZz09PVwib2JqZWN0XCIpe3ZhbHVlPWN1c3RvbVRhcmdldGluZ1trZXldfWVsc2UgaWYoQXJyYXkuaXNBcnJheShjdXN0b21UYXJnZXRpbmcpKXt2YWx1ZT1zY3JpcHRFbC5nZXRBdHRyaWJ1dGUoa2V5KX12YXIga2V5V2l0aG91dEV4b1ByZWZpeD1rZXkucmVwbGFjZShcImRhdGEtZXhvLVwiLFwiXCIpO2N1c3RvbVRhcmdldGluZ1BhcmFtcys9YCYke2tleVdpdGhvdXRFeG9QcmVmaXh9PSR7dmFsdWV9YH0pfXRoaXMudXJsPXByb3RvY29sK1wiXC9cL1wiK3RoaXMuY29uZmlnLnN5bmRpY2F0aW9uX2hvc3QrXCJcL3NwbGFzaC5waHBcIitcIj9jYXQ9XCIrdGhpcy5jb25maWcuY2F0K1wiJmlkem9uZT1cIit0aGlzLmNvbmZpZy5pZHpvbmUrXCImdHlwZT04XCIrXCImcD1cIitlbmNvZGVVUklDb21wb25lbnQocCkrXCImc3ViPVwiK3RoaXMuY29uZmlnLnN1YisodGhpcy5jb25maWcuc3ViMiE9PVwiXCI/XCImc3ViMj1cIit0aGlzLmNvbmZpZy5zdWIyOlwiXCIpKyh0aGlzLmNvbmZpZy5zdWIzIT09XCJcIj9cIiZzdWIzPVwiK3RoaXMuY29uZmlnLnN1YjM6XCJcIikrXCImYmxvY2s9MVwiK1wiJmVsPVwiK3RoaXMuY29uZmlnLmVsK1wiJnRhZ3M9XCIrdGhpcy5jb25maWcudGFncytcIiZjb29raWVjb25zZW50PVwiK3RoaXMuY29uZmlnLmNvb2tpZWNvbnNlbnQrXCImc2NyX2luZm89XCIrZW5jb2RlU2NyaXB0SW5mbyhzY3JpcHRfaW5mbykrY3VzdG9tVGFyZ2V0aW5nUGFyYW1zfSxhZGRFdmVudFRvRWxlbWVudDpmdW5jdGlvbihvYmosdHlwZSxmbil7aWYob2JqLmFkZEV2ZW50TGlzdGVuZXIpe29iai5hZGRFdmVudExpc3RlbmVyKHR5cGUsZm4sZmFsc2UpfWVsc2UgaWYob2JqLmF0dGFjaEV2ZW50KXtvYmpbXCJlXCIrdHlwZStmbl09Zm47b2JqW3R5cGUrZm5dPWZ1bmN0aW9uKCl7b2JqW1wiZVwiK3R5cGUrZm5dKHdpbmRvdy5ldmVudCl9O29iai5hdHRhY2hFdmVudChcIm9uXCIrdHlwZSxvYmpbdHlwZStmbl0pfWVsc2V7b2JqW1wib25cIit0eXBlXT1vYmpbXCJlXCIrdHlwZStmbl19fSxhZGRFdmVudDpmdW5jdGlvbih0eXBlLGZuKXt2YXIgdGFyZ2V0RWxlbWVudHM7aWYocG9wTWFnaWMuY29uZmlnLnRyaWdnZXJfbWV0aG9kPT1cIjNcIil7dGFyZ2V0RWxlbWVudHM9ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChcImFcIik7Zm9yKGk9MDtpPHRhcmdldEVsZW1lbnRzLmxlbmd0aDtpKyspe3BvcE1hZ2ljLmFkZEV2ZW50VG9FbGVtZW50KHRhcmdldEVsZW1lbnRzW2ldLHR5cGUsZm4pfXJldHVybn1pZihwb3BNYWdpYy5jb25maWcudHJpZ2dlcl9tZXRob2Q9PVwiMlwiJiZwb3BNYWdpYy5jb25maWcudHJpZ2dlcl9tZXRob2QhPVwiXCIpe3ZhciB0cmlnZ2VyX2NsYXNzZXM7dmFyIHRyaWdnZXJfY2xhc3Nlc19maW5hbD1bXTtpZihwb3BNYWdpYy5jb25maWcudHJpZ2dlcl9jbGFzcy5pbmRleE9mKFwiLFwiKT09PS0xKXt0cmlnZ2VyX2NsYXNzZXM9cG9wTWFnaWMuY29uZmlnLnRyaWdnZXJfY2xhc3Muc3BsaXQoXCIgXCIpfWVsc2V7dmFyIHRyaW1tZWRfdHJpZ2dlcl9jbGFzc2VzPXBvcE1hZ2ljLmNvbmZpZy50cmlnZ2VyX2NsYXNzLnJlcGxhY2UoXC9cXHNcL2csXCJcIik7dHJpZ2dlcl9jbGFzc2VzPXRyaW1tZWRfdHJpZ2dlcl9jbGFzc2VzLnNwbGl0KFwiLFwiKX1mb3IodmFyIGk9MDtpPHRyaWdnZXJfY2xhc3Nlcy5sZW5ndGg7aSsrKXtpZih0cmlnZ2VyX2NsYXNzZXNbaV0hPT1cIlwiKXt0cmlnZ2VyX2NsYXNzZXNfZmluYWwucHVzaChcIi5cIit0cmlnZ2VyX2NsYXNzZXNbaV0pfX10YXJnZXRFbGVtZW50cz1kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKHRyaWdnZXJfY2xhc3Nlc19maW5hbC5qb2luKFwiLCBcIikpO2ZvcihpPTA7aTx0YXJnZXRFbGVtZW50cy5sZW5ndGg7aSsrKXtwb3BNYWdpYy5hZGRFdmVudFRvRWxlbWVudCh0YXJnZXRFbGVtZW50c1tpXSx0eXBlLGZuKX1yZXR1cm59cG9wTWFnaWMuYWRkRXZlbnRUb0VsZW1lbnQoZG9jdW1lbnQsdHlwZSxmbil9LHNldENvb2tpZTpmdW5jdGlvbihuYW1lLHZhbHVlLHR0bF9taW51dGVzKXtpZighdGhpcy5jb25maWcuY29va2llY29uc2VudCl7cmV0dXJuIGZhbHNlfXR0bF9taW51dGVzPXBhcnNlSW50KHR0bF9taW51dGVzLDEwKTt2YXIgbm93X2RhdGU9bmV3IERhdGU7bm93X2RhdGUuc2V0TWludXRlcyhub3dfZGF0ZS5nZXRNaW51dGVzKCkrcGFyc2VJbnQodHRsX21pbnV0ZXMpKTt2YXIgY192YWx1ZT1lbmNvZGVVUklDb21wb25lbnQodmFsdWUpK1wiOyBleHBpcmVzPVwiK25vd19kYXRlLnRvVVRDU3RyaW5nKCkrXCI7IHBhdGg9XC9cIjtkb2N1bWVudC5jb29raWU9bmFtZStcIj1cIitjX3ZhbHVlfSxnZXRDb29raWU6ZnVuY3Rpb24obmFtZSl7aWYoIXRoaXMuY29uZmlnLmNvb2tpZWNvbnNlbnQpe3JldHVybiBmYWxzZX12YXIgaSx4LHksY29va2llc0FycmF5PWRvY3VtZW50LmNvb2tpZS5zcGxpdChcIjtcIik7Zm9yKGk9MDtpPGNvb2tpZXNBcnJheS5sZW5ndGg7aSsrKXt4PWNvb2tpZXNBcnJheVtpXS5zdWJzdHIoMCxjb29raWVzQXJyYXlbaV0uaW5kZXhPZihcIj1cIikpO3k9Y29va2llc0FycmF5W2ldLnN1YnN0cihjb29raWVzQXJyYXlbaV0uaW5kZXhPZihcIj1cIikrMSk7eD14LnJlcGxhY2UoXC9eXFxzK3xcXHMrJFwvZyxcIlwiKTtpZih4PT09bmFtZSl7cmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudCh5KX19fSxyYW5kU3RyOmZ1bmN0aW9uKGxlbmd0aCxwb3NzaWJsZUNoYXJzKXt2YXIgdGV4dD1cIlwiO3ZhciBwb3NzaWJsZT1wb3NzaWJsZUNoYXJzfHxcIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5XCI7Zm9yKHZhciBpPTA7aTxsZW5ndGg7aSsrKXt0ZXh0Kz1wb3NzaWJsZS5jaGFyQXQoTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKnBvc3NpYmxlLmxlbmd0aCkpfXJldHVybiB0ZXh0fSxpc1ZhbGlkVXNlckV2ZW50OmZ1bmN0aW9uKGV2ZW50KXtpZihcImlzVHJ1c3RlZFwiaW4gZXZlbnQmJmV2ZW50LmlzVHJ1c3RlZCYmcG9wTWFnaWMuYnJvd3Nlci5uYW1lIT09XCJpZVwiJiZwb3BNYWdpYy5icm93c2VyLm5hbWUhPT1cInNhZmFyaVwiKXtyZXR1cm4gdHJ1ZX1lbHNle3JldHVybiBldmVudC5zY3JlZW5YIT0wJiZldmVudC5zY3JlZW5ZIT0wfX0saXNWYWxpZEhyZWY6ZnVuY3Rpb24oaHJlZil7aWYodHlwZW9mIGhyZWY9PT1cInVuZGVmaW5lZFwifHxocmVmPT1cIlwiKXtyZXR1cm4gZmFsc2V9dmFyIGVtcHR5X3JlZj1cL1xccz9qYXZhc2NyaXB0XFxzPzpcL2k7cmV0dXJuIWVtcHR5X3JlZi50ZXN0KGhyZWYpfSxmaW5kTGlua1RvT3BlbjpmdW5jdGlvbihjbGlja2VkRWxlbWVudCl7dmFyIHRhcmdldD1jbGlja2VkRWxlbWVudDt2YXIgbG9jYXRpb249ZmFsc2U7dHJ5e3ZhciBicmVha0N0cj0wO3doaWxlKGJyZWFrQ3RyPDIwJiYhdGFyZ2V0LmdldEF0dHJpYnV0ZShcImhyZWZcIikmJnRhcmdldCE9PWRvY3VtZW50JiZ0YXJnZXQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSE9PVwiaHRtbFwiKXt0YXJnZXQ9dGFyZ2V0LnBhcmVudE5vZGU7YnJlYWtDdHIrK312YXIgZWxlbWVudFRhcmdldEF0dHI9dGFyZ2V0LmdldEF0dHJpYnV0ZShcInRhcmdldFwiKTtpZighZWxlbWVudFRhcmdldEF0dHJ8fGVsZW1lbnRUYXJnZXRBdHRyLmluZGV4T2YoXCJfYmxhbmtcIik9PT0tMSl7bG9jYXRpb249dGFyZ2V0LmdldEF0dHJpYnV0ZShcImhyZWZcIil9fWNhdGNoKGVycil7fWlmKCFwb3BNYWdpYy5pc1ZhbGlkSHJlZihsb2NhdGlvbikpe2xvY2F0aW9uPWZhbHNlfXJldHVybiBsb2NhdGlvbnx8d2luZG93LmxvY2F0aW9uLmhyZWZ9LGdldFB1SWQ6ZnVuY3Rpb24oKXtyZXR1cm5cIm9rX1wiK01hdGguZmxvb3IoODk5OTk5OTkqTWF0aC5yYW5kb20oKSsxZTcpfSxicm93c2VyRGV0ZWN0b3I6e2Jyb3dzZXJEZWZpbml0aW9uczpbW1wiZmlyZWZveFwiLFwvRmlyZWZveFxcXC8oWzAtOS5dKykoPzpcXHN8JClcL10sW1wib3BlcmFcIixcL09wZXJhXFxcLyhbMC05Ll0rKSg/Olxcc3wkKVwvXSxbXCJvcGVyYVwiLFwvT1BSXFxcLyhbMC05Ll0rKSg6P1xcc3wkKSRcL10sW1wiZWRnZVwiLFwvRWRnKD86ZXwpXFxcLyhbMC05Ll9dKylcL10sW1wiaWVcIixcL1RyaWRlbnRcXFwvN1xcLjAuKnJ2OihbMC05Ll0rKVxcKS4qR2Vja28kXC9dLFtcImllXCIsXC9NU0lFXFxzKFswLTkuXSspOy4qVHJpZGVudFxcXC9bNC03XS4wXC9dLFtcImllXCIsXC9NU0lFXFxzKDdcXC4wKVwvXSxbXCJzYWZhcmlcIixcL1ZlcnNpb25cXFwvKFswLTkuX10rKS4qU2FmYXJpXC9dLFtcImNocm9tZVwiLFwvKD8hQ2hyb20uKkVkZyg/OmV8KSlDaHJvbSg/OmV8aXVtKVxcXC8oWzAtOS5dKykoOj9cXHN8JClcL10sW1wiY2hyb21lXCIsXC8oPyFDaHJvbS4qT1BSKUNocm9tKD86ZXxpdW0pXFxcLyhbMC05Ll0rKSg6P1xcc3wkKVwvXSxbXCJiYjEwXCIsXC9CQjEwO1xcc1RvdWNoLipWZXJzaW9uXFxcLyhbMC05Ll0rKVwvXSxbXCJhbmRyb2lkXCIsXC9BbmRyb2lkXFxzKFswLTkuXSspXC9dLFtcImlvc1wiLFwvVmVyc2lvblxcXC8oWzAtOS5fXSspLipNb2JpbGUuKlNhZmFyaS4qXC9dLFtcInlhbmRleGJyb3dzZXJcIixcL1lhQnJvd3NlclxcXC8oWzAtOS5fXSspXC9dLFtcImNyaW9zXCIsXC9DcmlPU1xcXC8oWzAtOS5dKykoOj9cXHN8JClcL11dLGRldGVjdEJyb3dzZXI6ZnVuY3Rpb24odXNlckFnZW50KXt2YXIgaXNNb2JpbGU9dXNlckFnZW50Lm1hdGNoKFwvQW5kcm9pZHxCbGFja0JlcnJ5fGlQaG9uZXxpUGFkfGlQb2R8T3BlcmEgTWluaXxJRU1vYmlsZXxXZWJPU3xXaW5kb3dzIFBob25lXC9pKTtmb3IodmFyIGkgaW4gdGhpcy5icm93c2VyRGVmaW5pdGlvbnMpe3ZhciBkZWZpbml0aW9uPXRoaXMuYnJvd3NlckRlZmluaXRpb25zW2ldO2lmKGRlZmluaXRpb25bMV0udGVzdCh1c2VyQWdlbnQpKXt2YXIgbWF0Y2g9ZGVmaW5pdGlvblsxXS5leGVjKHVzZXJBZ2VudCk7dmFyIHZlcnNpb249bWF0Y2gmJm1hdGNoWzFdLnNwbGl0KFwvWy5fXVwvKS5zbGljZSgwLDMpO3ZhciB2ZXJzaW9uVGFpbHM9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwodmVyc2lvbiwxKS5qb2luKFwiXCIpfHxcIjBcIjtpZih2ZXJzaW9uJiZ2ZXJzaW9uLmxlbmd0aDwzKXtBcnJheS5wcm90b3R5cGUucHVzaC5hcHBseSh2ZXJzaW9uLHZlcnNpb24ubGVuZ3RoPT09MT9bMCwwXTpbMF0pfXJldHVybntuYW1lOmRlZmluaXRpb25bMF0sdmVyc2lvbjp2ZXJzaW9uLmpvaW4oXCIuXCIpLHZlcnNpb25OdW1iZXI6cGFyc2VGbG9hdCh2ZXJzaW9uWzBdK1wiLlwiK3ZlcnNpb25UYWlscyksaXNNb2JpbGU6aXNNb2JpbGV9fX1yZXR1cm57bmFtZTpcIm90aGVyXCIsdmVyc2lvbjpcIjEuMFwiLHZlcnNpb25OdW1iZXI6MSxpc01vYmlsZTppc01vYmlsZX19fSxtZXRob2RzOntkZWZhdWx0OmZ1bmN0aW9uKHRyaWdnZXJlZEV2ZW50KXtpZighcG9wTWFnaWMuc2hvdWxkU2hvdygpfHwhcG9wTWFnaWMudmVub3JTaG91bGRTaG93KCl8fCFwb3BNYWdpYy5pc1ZhbGlkVXNlckV2ZW50KHRyaWdnZXJlZEV2ZW50KSlyZXR1cm4gdHJ1ZTt2YXIgY2xpY2tlZEVsZW1lbnQ9dHJpZ2dlcmVkRXZlbnQudGFyZ2V0fHx0cmlnZ2VyZWRFdmVudC5zcmNFbGVtZW50O3ZhciBocmVmPXBvcE1hZ2ljLmZpbmRMaW5rVG9PcGVuKGNsaWNrZWRFbGVtZW50KTt3aW5kb3cub3BlbihocmVmLFwiX2JsYW5rXCIpO3BvcE1hZ2ljLnNldEFzT3BlbmVkKCk7cG9wTWFnaWMudG9wLmRvY3VtZW50LmxvY2F0aW9uPXBvcE1hZ2ljLnVybDtpZih0eXBlb2YgdHJpZ2dlcmVkRXZlbnQucHJldmVudERlZmF1bHQhPT1cInVuZGVmaW5lZFwiKXt0cmlnZ2VyZWRFdmVudC5wcmV2ZW50RGVmYXVsdCgpO3RyaWdnZXJlZEV2ZW50LnN0b3BQcm9wYWdhdGlvbigpfXJldHVybiB0cnVlfSxjaHJvbWVUYWI6ZnVuY3Rpb24oZXZlbnQpe2lmKCFwb3BNYWdpYy5zaG91bGRTaG93KCl8fCFwb3BNYWdpYy52ZW5vclNob3VsZFNob3coKXx8IXBvcE1hZ2ljLmlzVmFsaWRVc2VyRXZlbnQoZXZlbnQpKXJldHVybiB0cnVlO2lmKHR5cGVvZiBldmVudC5wcmV2ZW50RGVmYXVsdCE9PVwidW5kZWZpbmVkXCIpe2V2ZW50LnByZXZlbnREZWZhdWx0KCk7ZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCl9ZWxzZXtyZXR1cm4gdHJ1ZX12YXIgYT10b3Aud2luZG93LmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJhXCIpO3ZhciB0YXJnZXQ9ZXZlbnQudGFyZ2V0fHxldmVudC5zcmNFbGVtZW50O2EuaHJlZj1wb3BNYWdpYy5maW5kTGlua1RvT3Blbih0YXJnZXQpO2RvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKFwiYm9keVwiKVswXS5hcHBlbmRDaGlsZChhKTt2YXIgZT1uZXcgTW91c2VFdmVudChcImNsaWNrXCIse2J1YmJsZXM6dHJ1ZSxjYW5jZWxhYmxlOnRydWUsdmlldzp3aW5kb3csc2NyZWVuWDowLHNjcmVlblk6MCxjbGllbnRYOjAsY2xpZW50WTowLGN0cmxLZXk6dHJ1ZSxhbHRLZXk6ZmFsc2Usc2hpZnRLZXk6ZmFsc2UsbWV0YUtleTp0cnVlLGJ1dHRvbjowfSk7ZS5wcmV2ZW50RGVmYXVsdD11bmRlZmluZWQ7YS5kaXNwYXRjaEV2ZW50KGUpO2EucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhKTt3aW5kb3cub3Blbihwb3BNYWdpYy51cmwsXCJfc2VsZlwiKTtwb3BNYWdpYy5zZXRBc09wZW5lZCgpfSxwb3B1cDpmdW5jdGlvbih0cmlnZ2VyZWRFdmVudCl7aWYoIXBvcE1hZ2ljLnNob3VsZFNob3coKXx8IXBvcE1hZ2ljLnZlbm9yU2hvdWxkU2hvdygpfHwhcG9wTWFnaWMuaXNWYWxpZFVzZXJFdmVudCh0cmlnZ2VyZWRFdmVudCkpcmV0dXJuIHRydWU7dmFyIHdpbk9wdGlvbnM9XCJcIjtpZihwb3BNYWdpYy5jb25maWcucG9wdXBfZmFsbGJhY2smJiFwb3BNYWdpYy5jb25maWcucG9wdXBfZm9yY2Upe3ZhciBoZWlnaHQ9TWF0aC5tYXgoTWF0aC5yb3VuZCh3aW5kb3cuaW5uZXJIZWlnaHQqLjgpLDMwMCk7dmFyIHdpZHRoPU1hdGgubWF4KE1hdGgucm91bmQod2luZG93LmlubmVyV2lkdGgqLjcpLDMwMCk7dmFyIHRvcD13aW5kb3cuc2NyZWVuWSsxMDA7dmFyIGxlZnQ9d2luZG93LnNjcmVlblgrMTAwO3dpbk9wdGlvbnM9XCJtZW51YmFyPTEscmVzaXphYmxlPTEsd2lkdGg9XCIrd2lkdGgrXCIsaGVpZ2h0PVwiK2hlaWdodCtcIix0b3A9XCIrdG9wK1wiLGxlZnQ9XCIrbGVmdH12YXIgcHJlUG9wVXJsPWRvY3VtZW50LmxvY2F0aW9uLmhyZWY7dmFyIHBvcFdpbj13aW5kb3cub3BlbihwcmVQb3BVcmwscG9wTWFnaWMuZ2V0UHVJZCgpLHdpbk9wdGlvbnMpO3NldFRpbWVvdXQoZnVuY3Rpb24oKXtwb3BXaW4ubG9jYXRpb24uaHJlZj1wb3BNYWdpYy51cmx9LDIwMCk7cG9wTWFnaWMuc2V0QXNPcGVuZWQoKTtpZih0eXBlb2YgdHJpZ2dlcmVkRXZlbnQucHJldmVudERlZmF1bHQhPT1cInVuZGVmaW5lZFwiKXt0cmlnZ2VyZWRFdmVudC5wcmV2ZW50RGVmYXVsdCgpO3RyaWdnZXJlZEV2ZW50LnN0b3BQcm9wYWdhdGlvbigpfX19fTsgICAgcG9wTWFnaWMuaW5pdChhZENvbmZpZyk7XHJcbn0pKCk7XHJcblxyXG5cclxuPFwvc2NyaXB0PiJ9XQ==