From 2a0e21dbf2538135bdc019783840644e3cd40ed7 Mon Sep 17 00:00:00 2001 From: Gitea Action Date: Sat, 20 Jun 2026 15:04:18 +0000 Subject: [PATCH] DRIVE: v3.6.0 (2026-06-20T15:04) --- DRIVE/sync-bundle-02.txt | 14432 +++++++++++++++++++------------------ 1 file changed, 7236 insertions(+), 7196 deletions(-) diff --git a/DRIVE/sync-bundle-02.txt b/DRIVE/sync-bundle-02.txt index f0ce3a2..58362fd 100644 --- a/DRIVE/sync-bundle-02.txt +++ b/DRIVE/sync-bundle-02.txt @@ -1,6 +1,6 @@ ### SYNC-TRANSFER 2/2 -- mit sync-entpacken.bat entpacken ### Base64 -### FILE: index.html | 553864 +### FILE: index.html | 554837 PCFET0NUWVBFIGh0bWw+CjxodG1sIGxhbmc9ImRlIj4KPGhlYWQ+CiAgICA8bWV0YSBjaGFyc2V0 PSJVVEYtOCI+CiAgICA8bWV0YSBuYW1lPSJ2aWV3cG9ydCIgY29udGVudD0id2lkdGg9ZGV2aWNl LXdpZHRoLCBpbml0aWFsLXNjYWxlPTEuMCI+CiAgICA8dGl0bGU+RC5SLkkuVi5FLiAtIFZJMyBD @@ -3108,6617 +3108,6634 @@ b25zdCByZXMgPSBhd2FpdCBmZXRjaCgnL2FwaS9lbnZpcm9uJyk7CiAgICAgICAgICAgIGlmIChy ZXMub2spIHsKICAgICAgICAgICAgICAgIHRoaXMuZW52aXJvbiA9IGF3YWl0IHJlcy5qc29uKCk7 CiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnQmVudXR6ZXI6JywgdGhpcy5lbnZpcm9uLnVz ZXJuYW1lLCAnQCcsIHRoaXMuZW52aXJvbi5jb21wdXRlcm5hbWUpOwogICAgICAgICAgICAgICAg -cmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgfSBjYXRjaCB7fQogICAgICAgIC8vIEZhbGxi -YWNrOiBJbSBOdXItTGVzZW4tTW9kdXMga2VpbmVuIE5hbWVuIGFiZnJhZ2VuCiAgICAgICAgaWYg -KHRoaXMucmVhZE9ubHkpIHsKICAgICAgICAgICAgY29uc3Qgc3RvcmVkID0gbG9jYWxTdG9yYWdl -LmdldEl0ZW0oJ2RyaXZlX3VzZXJuYW1lJyk7CiAgICAgICAgICAgIGlmIChzdG9yZWQpIHsKICAg -ICAgICAgICAgICAgIHRoaXMuZW52aXJvbiA9IHsgdXNlcm5hbWU6IHN0b3JlZCwgY29tcHV0ZXJu -YW1lOiAnLScgfTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHRoaXMuZW52 -aXJvbiA9IHsgdXNlcm5hbWU6ICdMZXNlcicsIGNvbXB1dGVybmFtZTogJy0nIH07CiAgICAgICAg -ICAgIH0KICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICAvLyBTY2hyZWlibW9k -dXM6IE5hbWVuIGFiZnJhZ2VuCiAgICAgICAgY29uc3Qgc3RvcmVkID0gbG9jYWxTdG9yYWdlLmdl -dEl0ZW0oJ2RyaXZlX3VzZXJuYW1lJyk7CiAgICAgICAgaWYgKHN0b3JlZCkgewogICAgICAgICAg -ICB0aGlzLmVudmlyb24gPSB7IHVzZXJuYW1lOiBzdG9yZWQsIGNvbXB1dGVybmFtZTogJy0nIH07 -CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgY29uc3QgbmFtZSA9IHByb21wdCgnQml0dGUg -Z2liIGRlaW5lbiBCZW51dHplcm5hbWVuIGVpbjonKTsKICAgICAgICAgICAgaWYgKG5hbWUpIHsK -ICAgICAgICAgICAgICAgIHRoaXMuZW52aXJvbiA9IHsgdXNlcm5hbWU6IG5hbWUudHJpbSgpLCBj -b21wdXRlcm5hbWU6ICctJyB9OwogICAgICAgICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0o -J2RyaXZlX3VzZXJuYW1lJywgbmFtZS50cmltKCkpOwogICAgICAgICAgICB9CiAgICAgICAgfQog -ICAgfSwKCiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 -PT09PT09PT09PT09PT09PT09PT09PQogICAgLy8gQ09ORklHCiAgICAvLyA9PT09PT09PT09PT09 +aWYgKHRoaXMuZW52aXJvbi51cGRhdGVBdmFpbGFibGUgJiYgIXdpbmRvdy5fZHJpdmVVcGRhdGVU +b2FzdFNob3duKSB7CiAgICAgICAgICAgICAgICAgICAgd2luZG93Ll9kcml2ZVVwZGF0ZVRvYXN0 +U2hvd24gPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gewogICAg +ICAgICAgICAgICAgICAgICAgICBjb25zdCBtc2cgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdk +aXYnKTsKICAgICAgICAgICAgICAgICAgICAgICAgbXNnLnN0eWxlLmNzc1RleHQgPSAncG9zaXRp +b246Zml4ZWQ7Ym90dG9tOjIwcHg7cmlnaHQ6MjBweDt6LWluZGV4Ojk5OTk7YmFja2dyb3VuZDoj +MWE3M2U4O2NvbG9yOiNmZmY7cGFkZGluZzoxNHB4IDIwcHg7Ym9yZGVyLXJhZGl1czo4cHg7Ym94 +LXNoYWRvdzowIDRweCAxMnB4IHJnYmEoMCwwLDAsLjMpO21heC13aWR0aDozNDBweDtmb250LXNp +emU6MTRweDtsaW5lLWhlaWdodDoxLjQ7Y3Vyc29yOnBvaW50ZXInOwogICAgICAgICAgICAgICAg +ICAgICAgICBtc2cuaW5uZXJIVE1MID0gJzxzdHJvbmc+VXBkYXRlIHZlcmbDvGdiYXI6IHYnICsg +KHRoaXMuZW52aXJvbi5yZW1vdGVWZXJzaW9uIHx8ICc/JykgKyAnPC9zdHJvbmc+PGJyPnVwZGF0 +ZS5iYXQgYXVzZsO8aHJlbiB1bmQgU2VydmVyIG5ldSBzdGFydGVuLic7CiAgICAgICAgICAgICAg +ICAgICAgICAgIG1zZy50aXRsZSA9ICdLbGlja2VuIHp1bSBTY2hsaWXDn2VuJzsKICAgICAgICAg +ICAgICAgICAgICAgICAgbXNnLm9uY2xpY2sgPSAoKSA9PiBtc2cucmVtb3ZlKCk7CiAgICAgICAg +ICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gbXNnLnJlbW92ZSgpLCAyMDAwMCk7CiAg +ICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQobXNnKTsKICAg +ICAgICAgICAgICAgICAgICB9LCAyMDAwKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAg +ICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgIH0gY2F0Y2gge30KICAgICAgICAvLyBG +YWxsYmFjazogSW0gTnVyLUxlc2VuLU1vZHVzIGtlaW5lbiBOYW1lbiBhYmZyYWdlbgogICAgICAg +IGlmICh0aGlzLnJlYWRPbmx5KSB7CiAgICAgICAgICAgIGNvbnN0IHN0b3JlZCA9IGxvY2FsU3Rv +cmFnZS5nZXRJdGVtKCdkcml2ZV91c2VybmFtZScpOwogICAgICAgICAgICBpZiAoc3RvcmVkKSB7 +CiAgICAgICAgICAgICAgICB0aGlzLmVudmlyb24gPSB7IHVzZXJuYW1lOiBzdG9yZWQsIGNvbXB1 +dGVybmFtZTogJy0nIH07CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICB0aGlz +LmVudmlyb24gPSB7IHVzZXJuYW1lOiAnTGVzZXInLCBjb21wdXRlcm5hbWU6ICctJyB9OwogICAg +ICAgICAgICB9CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgLy8gU2NocmVp +Ym1vZHVzOiBOYW1lbiBhYmZyYWdlbgogICAgICAgIGNvbnN0IHN0b3JlZCA9IGxvY2FsU3RvcmFn +ZS5nZXRJdGVtKCdkcml2ZV91c2VybmFtZScpOwogICAgICAgIGlmIChzdG9yZWQpIHsKICAgICAg +ICAgICAgdGhpcy5lbnZpcm9uID0geyB1c2VybmFtZTogc3RvcmVkLCBjb21wdXRlcm5hbWU6ICct +JyB9OwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGNvbnN0IG5hbWUgPSBwcm9tcHQoJ0Jp +dHRlIGdpYiBkZWluZW4gQmVudXR6ZXJuYW1lbiBlaW46Jyk7CiAgICAgICAgICAgIGlmIChuYW1l +KSB7CiAgICAgICAgICAgICAgICB0aGlzLmVudmlyb24gPSB7IHVzZXJuYW1lOiBuYW1lLnRyaW0o +KSwgY29tcHV0ZXJuYW1lOiAnLScgfTsKICAgICAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJ +dGVtKCdkcml2ZV91c2VybmFtZScsIG5hbWUudHJpbSgpKTsKICAgICAgICAgICAgfQogICAgICAg +IH0KICAgIH0sCgogICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 +PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgIC8vIENPTkZJRwogICAgLy8gPT09PT09PT09 +PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K +CiAgICBhc3luYyBsb2FkQ29uZmlnKCkgewogICAgICAgIGNvbnN0IGRlZmF1bHRDb25maWcgPSB7 +CiAgICAgICAgICAgIHZlcnNpb246ICczLjAnLAogICAgICAgICAgICBrYXRlZ29yaWVuOiBbJ1Zl +cmtlaHInLCAnU2ljaGVyaGVpdCcsICdQbGFudW5nJywgJ09yZ2FuaXNhdGlvbiddLAogICAgICAg +ICAgICBzdGF0dXM6IHsKICAgICAgICAgICAgICAgICdFbnR3dXJmJzogeyBsYWJlbDogJ0VudHd1 +cmYnLCBjb2xvcjogJyNGRkYzQ0QnLCB0ZXh0Q29sb3I6ICcjODU2NDA0JywgaWNvbjogJ1x1ZDgz +ZFx1ZGNkZCcsIGJlc2NocmVpYnVuZzogJ0Rva3VtZW50IGluIEJlYXJiZWl0dW5nJyB9LAogICAg +ICAgICAgICAgICAgJ1Byw7xmdW5nJzogeyBsYWJlbDogJ1p1ciBQcsO8ZnVuZycsIGNvbG9yOiAn +I0ZGRTVCNCcsIHRleHRDb2xvcjogJyM3QTQ0MTknLCBpY29uOiAn8J+Rge+4jycsIGJlc2NocmVp +YnVuZzogJ1dhcnRldCBhdWYgRnJlaWdhYmUnIH0sCiAgICAgICAgICAgICAgICAnRnJlaWdlZ2Vi +ZW4nOiB7IGxhYmVsOiAnRnJlaWdlZ2ViZW4nLCBjb2xvcjogJyNENEVEREEnLCB0ZXh0Q29sb3I6 +ICcjMTU1NzI0JywgaWNvbjogJ+KchScsIGJlc2NocmVpYnVuZzogJ1ZlcmbDvGdiYXIgdW5kIGVp +bnNhdHpiZXJlaXQnIH0KICAgICAgICAgICAgfQogICAgICAgIH07CgogICAgICAgIC8vIFNlcnZl +ci1Nb2R1czogY29uZmlnIHZpYSBIVFRQIGxhZGVuIChhYnNvbHV0ZXIgUGZhZCkKICAgICAgICBp +ZiAodGhpcy5tb2RlID09PSAnc2VydmVyJykgewogICAgICAgICAgICB0cnkgewogICAgICAgICAg +ICAgICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goJy9kYXRhL2NvbmZpZy5qc29uJyk7CiAgICAg +ICAgICAgICAgICBpZiAocmVzLm9rKSB7IHRoaXMuY29uZmlnID0gYXdhaXQgcmVzLmpzb24oKTsg +dGhpcy5zb3J0S2F0ZWdvcmllbigpOyByZXR1cm47IH0KICAgICAgICAgICAgfSBjYXRjaCB7fQog +ICAgICAgIH0KCiAgICAgICAgLy8gU3RhdGlzY2hlciBNb2R1czogY29uZmlnIHZpYSByZWxhdGl2 +ZW0gUGZhZCBsYWRlbgogICAgICAgIGlmICh0aGlzLm1vZGUgPT09ICdzdGF0aWMnKSB7CiAgICAg +ICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaCgnZGF0 +YS9jb25maWcuanNvbicpOwogICAgICAgICAgICAgICAgaWYgKHJlcy5vaykgeyB0aGlzLmNvbmZp +ZyA9IGF3YWl0IHJlcy5qc29uKCk7IHRoaXMuc29ydEthdGVnb3JpZW4oKTsgcmV0dXJuOyB9CiAg +ICAgICAgICAgIH0gY2F0Y2gge30KICAgICAgICB9CgogICAgICAgIC8vIEZpbGVzeXN0ZW0tTW9k +dXM6IGNvbmZpZy5qc29uIGF1cyBkYXRhLUhhbmRsZSBsYWRlbgogICAgICAgIGlmICh0aGlzLl9k +YXRhSGFuZGxlKSB7CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICBjb25zdCBmaCA9 +IGF3YWl0IHRoaXMuX2RhdGFIYW5kbGUuZ2V0RmlsZUhhbmRsZSgnY29uZmlnLmpzb24nKTsKICAg +ICAgICAgICAgICAgIGNvbnN0IGZpbGUgPSBhd2FpdCBmaC5nZXRGaWxlKCk7CiAgICAgICAgICAg +ICAgICB0aGlzLmNvbmZpZyA9IEpTT04ucGFyc2UoYXdhaXQgZmlsZS50ZXh0KCkpOwogICAgICAg +ICAgICAgICAgdGhpcy5zb3J0S2F0ZWdvcmllbigpOwogICAgICAgICAgICAgICAgcmV0dXJuOwog +ICAgICAgICAgICB9IGNhdGNoIHt9CiAgICAgICAgfQoKICAgICAgICB0aGlzLmNvbmZpZyA9IGRl +ZmF1bHRDb25maWc7CiAgICAgICAgdGhpcy5zb3J0S2F0ZWdvcmllbigpOwogICAgfSwKCiAgICAv +LyBLYXRlZ29yaWVuIGFscGhhYmV0aXNjaCBzb3J0aWVydCBoYWx0ZW4gKG5hY2ggamVkZW0gTGFk +ZW4vQWVuZGVybiBhdWZydWZlbikKICAgIHNvcnRLYXRlZ29yaWVuKCkgewogICAgICAgIGlmICh0 +aGlzLmNvbmZpZyAmJiB0aGlzLmNvbmZpZy5rYXRlZ29yaWVuKSB7CiAgICAgICAgICAgIHRoaXMu +Y29uZmlnLmthdGVnb3JpZW4uc29ydChmdW5jdGlvbihhLCBiKSB7IHJldHVybiBhLmxvY2FsZUNv +bXBhcmUoYiwgJ2RlJyk7IH0pOwogICAgICAgIH0KICAgIH0sCgogICAgLy8gPT09PT09PT09PT09 +PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAg +IC8vIExPQUQgQUxMIERPQ1VNRU5UUwogICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09 +PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgICBhc3luYyBsb2FkQWxs +RG9jdW1lbnRzKCkgewogICAgICAgIHRoaXMuZG9jdW1lbnRzID0gW107CiAgICAgICAgdGhpcy5m +aWxlVGltZXN0YW1wcyA9IHt9OwoKICAgICAgICBpZiAodGhpcy5tb2RlID09PSAnc3RhdGljJykg +ewogICAgICAgICAgICAvLyBTdGF0aXNjaGVyIE1vZHVzOiBEb2t1bWVudGUgd3VyZGVuIGJlcmVp +dHMgaW4gdHJ5U3RhdGljQ29ubmVjdCgpIGdlbGFkZW4KICAgICAgICAgICAgcmV0dXJuOwogICAg +ICAgIH0gZWxzZSBpZiAodGhpcy5tb2RlID09PSAnc2VydmVyJykgewogICAgICAgICAgICAvLyBT +ZXJ2ZXIgc2Nhbm50IGRpZSBPcmRuZXIgZnVlciB1bnMKICAgICAgICAgICAgY29uc3QgcmVzID0g +YXdhaXQgZmV0Y2goJy9hcGkvc2NhbicpOwogICAgICAgICAgICBjb25zdCBkYXRhID0gYXdhaXQg +cmVzLmpzb24oKTsKCiAgICAgICAgICAgIGZvciAoY29uc3QgZW50cnkgb2YgKGRhdGEuZmlsZXMg +fHwgW10pKSB7CiAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgIGNvbnN0 +IGRvY1JlcyA9IGF3YWl0IGZldGNoKCcvJyArIGVudHJ5LnBhdGgpOwogICAgICAgICAgICAgICAg +ICAgIGlmIChkb2NSZXMub2spIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZG9jID0g +YXdhaXQgZG9jUmVzLmpzb24oKTsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gVmVyc2lvbnNp +bnRlZ3JpdGFldCBwcnVlZmVuIHVuZCBnZ2YuIGtvcnJpZ2llcmVuCiAgICAgICAgICAgICAgICAg +ICAgICAgIGlmIChlbnN1cmVDb3JyZWN0VmVyc2lvbihkb2MpKSB7CiAgICAgICAgICAgICAgICAg +ICAgICAgICAgICAvLyBLb3JyaWdpZXJ0ZSBWZXJzaW9uIHp1cnVlY2tzY2hyZWliZW4KICAgICAg +ICAgICAgICAgICAgICAgICAgICAgIGZldGNoKCcvYXBpL3dyaXRlJywgewogICAgICAgICAgICAg +ICAgICAgICAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLAogICAgICAgICAgICAgICAgICAgICAg +ICAgICAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9 +LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsg +cGF0aDogZW50cnkucGF0aCwgZGF0YTogZG9jIH0pCiAgICAgICAgICAgICAgICAgICAgICAgICAg +ICB9KS5jYXRjaChmdW5jdGlvbigpIHt9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAg +ICAgICAgICAgICAgICAgICAgICB0aGlzLmRvY3VtZW50cy5wdXNoKGRvYyk7CiAgICAgICAgICAg +ICAgICAgICAgICAgIHRoaXMuZmlsZVRpbWVzdGFtcHNbZG9jLmlkXSA9IHsKICAgICAgICAgICAg +ICAgICAgICAgICAgICAgIG1vZGlmaWVkOiBlbnRyeS5tb2RpZmllZCwKICAgICAgICAgICAgICAg +ICAgICAgICAgICAgIGthdGVnb3JpZTogZW50cnkua2F0ZWdvcmllLAogICAgICAgICAgICAgICAg +ICAgICAgICAgICAgZmlsZW5hbWU6IGVudHJ5LmZpbGVuYW1lLAogICAgICAgICAgICAgICAgICAg +ICAgICAgICAgcGF0aDogZW50cnkucGF0aAogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAg +ICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycikgewogICAgICAg +ICAgICAgICAgICAgIGNvbnNvbGUud2FybignRmVobGVyIGJlaW0gTGFkZW46ICcgKyBlbnRyeS5w +YXRoLCBlcnIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNl +IHsKICAgICAgICAgICAgLy8gRmlsZXN5c3RlbS1Nb2R1czogS2F0ZWdvcmllLU9yZG5lciBkdXJj +aGxhdWZlbgogICAgICAgICAgICBmb3IgKGNvbnN0IGthdCBvZiAodGhpcy5jb25maWcua2F0ZWdv +cmllbiB8fCBbXSkpIHsKICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAg +Y29uc3Qga2F0RGlyID0gYXdhaXQgdGhpcy5fZGF0YUhhbmRsZS5nZXREaXJlY3RvcnlIYW5kbGUo +a2F0KTsKICAgICAgICAgICAgICAgICAgICBmb3IgYXdhaXQgKGNvbnN0IFtuYW1lLCBoYW5kbGVd +IG9mIGthdERpcikgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoaGFuZGxlLmtpbmQgPT09 +ICdmaWxlJyAmJiBuYW1lLmVuZHNXaXRoKCcuanNvbicpKSB7CiAgICAgICAgICAgICAgICAgICAg +ICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZpbGUg +PSBhd2FpdCBoYW5kbGUuZ2V0RmlsZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg +IGNvbnN0IGRvYyA9IEpTT04ucGFyc2UoYXdhaXQgZmlsZS50ZXh0KCkpOwogICAgICAgICAgICAg +ICAgICAgICAgICAgICAgICAgIGVuc3VyZUNvcnJlY3RWZXJzaW9uKGRvYyk7CiAgICAgICAgICAg +ICAgICAgICAgICAgICAgICAgICAgdGhpcy5kb2N1bWVudHMucHVzaChkb2MpOwogICAgICAgICAg +ICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZmlsZVRpbWVzdGFtcHNbZG9jLmlkXSA9IHsKICAg +ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kaWZpZWQ6IGZpbGUubGFzdE1vZGlm +aWVkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrYXRlZ29yaWU6IGthdCwK +ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWU6IG5hbWUsCiAgICAg +ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGg6ICdkYXRhLycgKyBrYXQgKyAnLycg +KyBuYW1lCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAg +ICAgICAgICAgICAgIH0gY2F0Y2ggKGVycikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAg +ICAgIGNvbnNvbGUud2FybignRmVobGVyOiAnICsga2F0ICsgJy8nICsgbmFtZSwgZXJyKTsKICAg +ICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAg +ICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0gY2F0Y2gge30KICAgICAgICAgICAg +fQogICAgICAgIH0KCiAgICAgICAgdGhpcy5kb2N1bWVudHMuc29ydCgoYSwgYikgPT4gKGIuZXJz +dGVsbHQgfHwgJycpLmxvY2FsZUNvbXBhcmUoYS5lcnN0ZWxsdCB8fCAnJykpOwogICAgICAgIGF3 +YWl0IHRoaXMudXBkYXRlSW5kZXgoKTsKICAgIH0sCgogICAgLy8gPT09PT09PT09PT09PT09PT09 +PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgIC8vIExP +QUQgU0lOR0xFIERPQ1VNRU5UIChmcmlzY2ggdm9uIERpc2spCiAgICAvLyA9PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKICAg -IGFzeW5jIGxvYWRDb25maWcoKSB7CiAgICAgICAgY29uc3QgZGVmYXVsdENvbmZpZyA9IHsKICAg -ICAgICAgICAgdmVyc2lvbjogJzMuMCcsCiAgICAgICAgICAgIGthdGVnb3JpZW46IFsnVmVya2Vo -cicsICdTaWNoZXJoZWl0JywgJ1BsYW51bmcnLCAnT3JnYW5pc2F0aW9uJ10sCiAgICAgICAgICAg -IHN0YXR1czogewogICAgICAgICAgICAgICAgJ0VudHd1cmYnOiB7IGxhYmVsOiAnRW50d3VyZics -IGNvbG9yOiAnI0ZGRjNDRCcsIHRleHRDb2xvcjogJyM4NTY0MDQnLCBpY29uOiAnXHVkODNkXHVk -Y2RkJywgYmVzY2hyZWlidW5nOiAnRG9rdW1lbnQgaW4gQmVhcmJlaXR1bmcnIH0sCiAgICAgICAg -ICAgICAgICAnUHLDvGZ1bmcnOiB7IGxhYmVsOiAnWnVyIFByw7xmdW5nJywgY29sb3I6ICcjRkZF -NUI0JywgdGV4dENvbG9yOiAnIzdBNDQxOScsIGljb246ICfwn5GB77iPJywgYmVzY2hyZWlidW5n -OiAnV2FydGV0IGF1ZiBGcmVpZ2FiZScgfSwKICAgICAgICAgICAgICAgICdGcmVpZ2VnZWJlbic6 -IHsgbGFiZWw6ICdGcmVpZ2VnZWJlbicsIGNvbG9yOiAnI0Q0RUREQScsIHRleHRDb2xvcjogJyMx -NTU3MjQnLCBpY29uOiAn4pyFJywgYmVzY2hyZWlidW5nOiAnVmVyZsO8Z2JhciB1bmQgZWluc2F0 -emJlcmVpdCcgfQogICAgICAgICAgICB9CiAgICAgICAgfTsKCiAgICAgICAgLy8gU2VydmVyLU1v -ZHVzOiBjb25maWcgdmlhIEhUVFAgbGFkZW4gKGFic29sdXRlciBQZmFkKQogICAgICAgIGlmICh0 -aGlzLm1vZGUgPT09ICdzZXJ2ZXInKSB7CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAg -ICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaCgnL2RhdGEvY29uZmlnLmpzb24nKTsKICAgICAgICAg -ICAgICAgIGlmIChyZXMub2spIHsgdGhpcy5jb25maWcgPSBhd2FpdCByZXMuanNvbigpOyB0aGlz -LnNvcnRLYXRlZ29yaWVuKCk7IHJldHVybjsgfQogICAgICAgICAgICB9IGNhdGNoIHt9CiAgICAg -ICAgfQoKICAgICAgICAvLyBTdGF0aXNjaGVyIE1vZHVzOiBjb25maWcgdmlhIHJlbGF0aXZlbSBQ -ZmFkIGxhZGVuCiAgICAgICAgaWYgKHRoaXMubW9kZSA9PT0gJ3N0YXRpYycpIHsKICAgICAgICAg -ICAgdHJ5IHsKICAgICAgICAgICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKCdkYXRhL2Nv -bmZpZy5qc29uJyk7CiAgICAgICAgICAgICAgICBpZiAocmVzLm9rKSB7IHRoaXMuY29uZmlnID0g -YXdhaXQgcmVzLmpzb24oKTsgdGhpcy5zb3J0S2F0ZWdvcmllbigpOyByZXR1cm47IH0KICAgICAg -ICAgICAgfSBjYXRjaCB7fQogICAgICAgIH0KCiAgICAgICAgLy8gRmlsZXN5c3RlbS1Nb2R1czog -Y29uZmlnLmpzb24gYXVzIGRhdGEtSGFuZGxlIGxhZGVuCiAgICAgICAgaWYgKHRoaXMuX2RhdGFI -YW5kbGUpIHsKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgIGNvbnN0IGZoID0gYXdh -aXQgdGhpcy5fZGF0YUhhbmRsZS5nZXRGaWxlSGFuZGxlKCdjb25maWcuanNvbicpOwogICAgICAg -ICAgICAgICAgY29uc3QgZmlsZSA9IGF3YWl0IGZoLmdldEZpbGUoKTsKICAgICAgICAgICAgICAg -IHRoaXMuY29uZmlnID0gSlNPTi5wYXJzZShhd2FpdCBmaWxlLnRleHQoKSk7CiAgICAgICAgICAg -ICAgICB0aGlzLnNvcnRLYXRlZ29yaWVuKCk7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAg -ICAgICAgIH0gY2F0Y2gge30KICAgICAgICB9CgogICAgICAgIHRoaXMuY29uZmlnID0gZGVmYXVs -dENvbmZpZzsKICAgICAgICB0aGlzLnNvcnRLYXRlZ29yaWVuKCk7CiAgICB9LAoKICAgIC8vIEth -dGVnb3JpZW4gYWxwaGFiZXRpc2NoIHNvcnRpZXJ0IGhhbHRlbiAobmFjaCBqZWRlbSBMYWRlbi9B -ZW5kZXJuIGF1ZnJ1ZmVuKQogICAgc29ydEthdGVnb3JpZW4oKSB7CiAgICAgICAgaWYgKHRoaXMu -Y29uZmlnICYmIHRoaXMuY29uZmlnLmthdGVnb3JpZW4pIHsKICAgICAgICAgICAgdGhpcy5jb25m -aWcua2F0ZWdvcmllbi5zb3J0KGZ1bmN0aW9uKGEsIGIpIHsgcmV0dXJuIGEubG9jYWxlQ29tcGFy -ZShiLCAnZGUnKTsgfSk7CiAgICAgICAgfQogICAgfSwKCiAgICAvLyA9PT09PT09PT09PT09PT09 -PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgLy8g -TE9BRCBBTEwgRE9DVU1FTlRTCiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 -PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKICAgIGFzeW5jIGxvYWRBbGxEb2N1 -bWVudHMoKSB7CiAgICAgICAgdGhpcy5kb2N1bWVudHMgPSBbXTsKICAgICAgICB0aGlzLmZpbGVU -aW1lc3RhbXBzID0ge307CgogICAgICAgIGlmICh0aGlzLm1vZGUgPT09ICdzdGF0aWMnKSB7CiAg -ICAgICAgICAgIC8vIFN0YXRpc2NoZXIgTW9kdXM6IERva3VtZW50ZSB3dXJkZW4gYmVyZWl0cyBp -biB0cnlTdGF0aWNDb25uZWN0KCkgZ2VsYWRlbgogICAgICAgICAgICByZXR1cm47CiAgICAgICAg -fSBlbHNlIGlmICh0aGlzLm1vZGUgPT09ICdzZXJ2ZXInKSB7CiAgICAgICAgICAgIC8vIFNlcnZl -ciBzY2FubnQgZGllIE9yZG5lciBmdWVyIHVucwogICAgICAgICAgICBjb25zdCByZXMgPSBhd2Fp -dCBmZXRjaCgnL2FwaS9zY2FuJyk7CiAgICAgICAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMu -anNvbigpOwoKICAgICAgICAgICAgZm9yIChjb25zdCBlbnRyeSBvZiAoZGF0YS5maWxlcyB8fCBb -XSkpIHsKICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgZG9j -UmVzID0gYXdhaXQgZmV0Y2goJy8nICsgZW50cnkucGF0aCk7CiAgICAgICAgICAgICAgICAgICAg -aWYgKGRvY1Jlcy5vaykgewogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkb2MgPSBhd2Fp -dCBkb2NSZXMuanNvbigpOwogICAgICAgICAgICAgICAgICAgICAgICAvLyBWZXJzaW9uc2ludGVn -cml0YWV0IHBydWVmZW4gdW5kIGdnZi4ga29ycmlnaWVyZW4KICAgICAgICAgICAgICAgICAgICAg -ICAgaWYgKGVuc3VyZUNvcnJlY3RWZXJzaW9uKGRvYykpIHsKICAgICAgICAgICAgICAgICAgICAg -ICAgICAgIC8vIEtvcnJpZ2llcnRlIFZlcnNpb24genVydWVja3NjaHJlaWJlbgogICAgICAgICAg -ICAgICAgICAgICAgICAgICAgZmV0Y2goJy9hcGkvd3JpdGUnLCB7CiAgICAgICAgICAgICAgICAg -ICAgICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAg -ICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sCiAg -ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBwYXRo -OiBlbnRyeS5wYXRoLCBkYXRhOiBkb2MgfSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0p -LmNhdGNoKGZ1bmN0aW9uKCkge30pOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAg -ICAgICAgICAgICAgICAgIHRoaXMuZG9jdW1lbnRzLnB1c2goZG9jKTsKICAgICAgICAgICAgICAg -ICAgICAgICAgdGhpcy5maWxlVGltZXN0YW1wc1tkb2MuaWRdID0gewogICAgICAgICAgICAgICAg -ICAgICAgICAgICAgbW9kaWZpZWQ6IGVudHJ5Lm1vZGlmaWVkLAogICAgICAgICAgICAgICAgICAg -ICAgICAgICAga2F0ZWdvcmllOiBlbnRyeS5rYXRlZ29yaWUsCiAgICAgICAgICAgICAgICAgICAg -ICAgICAgICBmaWxlbmFtZTogZW50cnkuZmlsZW5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAg -ICAgICBwYXRoOiBlbnRyeS5wYXRoCiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAg -ICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7CiAgICAgICAgICAg -ICAgICAgICAgY29uc29sZS53YXJuKCdGZWhsZXIgYmVpbSBMYWRlbjogJyArIGVudHJ5LnBhdGgs -IGVycik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2Ugewog -ICAgICAgICAgICAvLyBGaWxlc3lzdGVtLU1vZHVzOiBLYXRlZ29yaWUtT3JkbmVyIGR1cmNobGF1 -ZmVuCiAgICAgICAgICAgIGZvciAoY29uc3Qga2F0IG9mICh0aGlzLmNvbmZpZy5rYXRlZ29yaWVu -IHx8IFtdKSkgewogICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICBjb25z -dCBrYXREaXIgPSBhd2FpdCB0aGlzLl9kYXRhSGFuZGxlLmdldERpcmVjdG9yeUhhbmRsZShrYXQp -OwogICAgICAgICAgICAgICAgICAgIGZvciBhd2FpdCAoY29uc3QgW25hbWUsIGhhbmRsZV0gb2Yg -a2F0RGlyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoYW5kbGUua2luZCA9PT0gJ2Zp -bGUnICYmIG5hbWUuZW5kc1dpdGgoJy5qc29uJykpIHsKICAgICAgICAgICAgICAgICAgICAgICAg -ICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmlsZSA9IGF3 -YWl0IGhhbmRsZS5nZXRGaWxlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29u -c3QgZG9jID0gSlNPTi5wYXJzZShhd2FpdCBmaWxlLnRleHQoKSk7CiAgICAgICAgICAgICAgICAg -ICAgICAgICAgICAgICAgZW5zdXJlQ29ycmVjdFZlcnNpb24oZG9jKTsKICAgICAgICAgICAgICAg -ICAgICAgICAgICAgICAgICB0aGlzLmRvY3VtZW50cy5wdXNoKGRvYyk7CiAgICAgICAgICAgICAg -ICAgICAgICAgICAgICAgICAgdGhpcy5maWxlVGltZXN0YW1wc1tkb2MuaWRdID0gewogICAgICAg -ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RpZmllZDogZmlsZS5sYXN0TW9kaWZpZWQs -CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGthdGVnb3JpZToga2F0LAogICAg -ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZTogbmFtZSwKICAgICAgICAg -ICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aDogJ2RhdGEvJyArIGthdCArICcvJyArIG5h -bWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAg -ICAgICAgICAgfSBjYXRjaCAoZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg -Y29uc29sZS53YXJuKCdGZWhsZXI6ICcgKyBrYXQgKyAnLycgKyBuYW1lLCBlcnIpOwogICAgICAg -ICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAg -ICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSBjYXRjaCB7fQogICAgICAgICAgICB9CiAg -ICAgICAgfQoKICAgICAgICB0aGlzLmRvY3VtZW50cy5zb3J0KChhLCBiKSA9PiAoYi5lcnN0ZWxs -dCB8fCAnJykubG9jYWxlQ29tcGFyZShhLmVyc3RlbGx0IHx8ICcnKSk7CiAgICAgICAgYXdhaXQg -dGhpcy51cGRhdGVJbmRleCgpOwogICAgfSwKCiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09 -PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgLy8gTE9BRCBT -SU5HTEUgRE9DVU1FTlQgKGZyaXNjaCB2b24gRGlzaykKICAgIC8vID09PT09PT09PT09PT09PT09 -PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgogICAgYXN5 -bmMgbG9hZERvY3VtZW50KGRvY0lkKSB7CiAgICAgICAgY29uc3QgbWV0YSA9IHRoaXMuZmlsZVRp -bWVzdGFtcHNbZG9jSWRdOwogICAgICAgIGlmICghbWV0YSkgewogICAgICAgICAgICAvLyBLZWlu -IERhdGVpcGZhZCBiZWthbm50IC0gSW4tTWVtb3J5LUZhbGxiYWNrCiAgICAgICAgICAgIHJldHVy -biB0aGlzLmRvY3VtZW50cy5maW5kKGQgPT4gZC5pZCA9PT0gZG9jSWQpIHx8IG51bGw7CiAgICAg -ICAgfQoKICAgICAgICB0cnkgewogICAgICAgICAgICBpZiAodGhpcy5tb2RlID09PSAnc2VydmVy -JykgewogICAgICAgICAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goJy8nICsgbWV0YS5w -YXRoICsgJz90PScgKyBEYXRlLm5vdygpKTsKICAgICAgICAgICAgICAgIGlmICghcmVzLm9rKSB0 -aHJvdyBuZXcgRXJyb3IoJ0hUVFAgJyArIHJlcy5zdGF0dXMpOwogICAgICAgICAgICAgICAgcmV0 -dXJuIGF3YWl0IHJlcy5qc29uKCk7CiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5tb2RlID09 -PSAnc3RhdGljJykgewogICAgICAgICAgICAgICAgLy8gU3RhdGlzY2g6IEluLU1lbW9yeSB2ZXJ3 -ZW5kZW4gKGJlcmVpdHMga29tcGxldHQgZ2VsYWRlbikKICAgICAgICAgICAgICAgIHJldHVybiB0 -aGlzLmRvY3VtZW50cy5maW5kKGQgPT4gZC5pZCA9PT0gZG9jSWQpIHx8IG51bGw7CiAgICAgICAg -ICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBjb25zdCBrYXREaXIgPSBhd2FpdCB0aGlzLl9k -YXRhSGFuZGxlLmdldERpcmVjdG9yeUhhbmRsZShtZXRhLmthdGVnb3JpZSk7CiAgICAgICAgICAg -ICAgICBjb25zdCBmaCA9IGF3YWl0IGthdERpci5nZXRGaWxlSGFuZGxlKG1ldGEuZmlsZW5hbWUp -OwogICAgICAgICAgICAgICAgY29uc3QgZmlsZSA9IGF3YWl0IGZoLmdldEZpbGUoKTsKICAgICAg -ICAgICAgICAgIHJldHVybiBKU09OLnBhcnNlKGF3YWl0IGZpbGUudGV4dCgpKTsKICAgICAgICAg -ICAgfQogICAgICAgIH0gY2F0Y2ggKGVycikgewogICAgICAgICAgICBjb25zb2xlLndhcm4oJ2xv -YWREb2N1bWVudCBGZWhsZXIgZnVlciAnICsgZG9jSWQgKyAnOicsIGVycik7CiAgICAgICAgICAg -IC8vIEZhbGxiYWNrOiBJbi1NZW1vcnktVmVyc2lvbiB2ZXJ3ZW5kZW4gKGJlcmVpdHMgYmVpbSBT -dGFydCBnZWxhZGVuKQogICAgICAgICAgICBjb25zdCBtZW1Eb2MgPSB0aGlzLmRvY3VtZW50cy5m -aW5kKGQgPT4gZC5pZCA9PT0gZG9jSWQpOwogICAgICAgICAgICBpZiAobWVtRG9jKSByZXR1cm4g -bWVtRG9jOwogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CiAgICB9LAoKICAgIC8v -ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 -PT09PT09PT09CiAgICAvLyBTQVZFIERPQ1VNRU5UCiAgICAvLyA9PT09PT09PT09PT09PT09PT09 -PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKICAgIGFzeW5j -IHNhdmVEb2N1bWVudChkb2MpIHsKICAgICAgICBjb25zdCBkb2NJZCA9IGRvYy5pZDsKICAgICAg -ICBjb25zdCBtZXRhID0gdGhpcy5maWxlVGltZXN0YW1wc1tkb2NJZF07CiAgICAgICAgY29uc3Qg -bmV3UGF0aCA9IHRoaXMuZG9jUGF0aChkb2MpOwoKICAgICAgICAvLyBBbHRlIERhdGVpIGxvZXNj -aGVuIGZhbGxzIFBmYWQgc2ljaCBnZWFlbmRlcnQgaGF0CiAgICAgICAgaWYgKG1ldGEgJiYgbWV0 -YS5wYXRoICE9PSBuZXdQYXRoKSB7CiAgICAgICAgICAgIGF3YWl0IHRoaXMuZGVsZXRlRmlsZSht -ZXRhLnBhdGgpOwogICAgICAgIH0KCiAgICAgICAgLy8gR2VhZW5kZXJ0LVRpbWVzdGFtcCB1bmQg -QmVhcmJlaXRlciBzZXR6ZW4KICAgICAgICBkb2MuZ2VhZW5kZXJ0ID0gbmV3IERhdGUoKS50b0lT -T1N0cmluZygpLnNwbGl0KCdUJylbMF07CiAgICAgICAgaWYgKHRoaXMuZW52aXJvbiAmJiB0aGlz -LmVudmlyb24udXNlcm5hbWUpIHsKICAgICAgICAgICAgZG9jLmJlYXJiZWl0ZXRWb24gPSB0aGlz -LmVudmlyb24udXNlcm5hbWU7CiAgICAgICAgfQoKICAgICAgICAvLyBUZW1wb3JhZXJlIFByb3Bl -cnRpZXMgZW50ZmVybmVuIChtaXQgXyBQcmVmaXgsIG5pY2h0IHBlcnNpc3RpZXJlbikKICAgICAg -ICBkZWxldGUgZG9jLl9wcmV2aW91c0luaGFsdDsKICAgICAgICBkZWxldGUgZG9jLl9wcmV2aW91 -c1RpdGVsOwoKICAgICAgICAvLyBTcGVpY2hlcm4KICAgICAgICBpZiAodGhpcy5tb2RlID09PSAn -c2VydmVyJykgewogICAgICAgICAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaCgnL2FwaS93cml0 +IGFzeW5jIGxvYWREb2N1bWVudChkb2NJZCkgewogICAgICAgIGNvbnN0IG1ldGEgPSB0aGlzLmZp +bGVUaW1lc3RhbXBzW2RvY0lkXTsKICAgICAgICBpZiAoIW1ldGEpIHsKICAgICAgICAgICAgLy8g +S2VpbiBEYXRlaXBmYWQgYmVrYW5udCAtIEluLU1lbW9yeS1GYWxsYmFjawogICAgICAgICAgICBy +ZXR1cm4gdGhpcy5kb2N1bWVudHMuZmluZChkID0+IGQuaWQgPT09IGRvY0lkKSB8fCBudWxsOwog +ICAgICAgIH0KCiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgaWYgKHRoaXMubW9kZSA9PT0gJ3Nl +cnZlcicpIHsKICAgICAgICAgICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKCcvJyArIG1l +dGEucGF0aCArICc/dD0nICsgRGF0ZS5ub3coKSk7CiAgICAgICAgICAgICAgICBpZiAoIXJlcy5v +aykgdGhyb3cgbmV3IEVycm9yKCdIVFRQICcgKyByZXMuc3RhdHVzKTsKICAgICAgICAgICAgICAg +IHJldHVybiBhd2FpdCByZXMuanNvbigpOwogICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMubW9k +ZSA9PT0gJ3N0YXRpYycpIHsKICAgICAgICAgICAgICAgIC8vIFN0YXRpc2NoOiBJbi1NZW1vcnkg +dmVyd2VuZGVuIChiZXJlaXRzIGtvbXBsZXR0IGdlbGFkZW4pCiAgICAgICAgICAgICAgICByZXR1 +cm4gdGhpcy5kb2N1bWVudHMuZmluZChkID0+IGQuaWQgPT09IGRvY0lkKSB8fCBudWxsOwogICAg +ICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgY29uc3Qga2F0RGlyID0gYXdhaXQgdGhp +cy5fZGF0YUhhbmRsZS5nZXREaXJlY3RvcnlIYW5kbGUobWV0YS5rYXRlZ29yaWUpOwogICAgICAg +ICAgICAgICAgY29uc3QgZmggPSBhd2FpdCBrYXREaXIuZ2V0RmlsZUhhbmRsZShtZXRhLmZpbGVu +YW1lKTsKICAgICAgICAgICAgICAgIGNvbnN0IGZpbGUgPSBhd2FpdCBmaC5nZXRGaWxlKCk7CiAg +ICAgICAgICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShhd2FpdCBmaWxlLnRleHQoKSk7CiAgICAg +ICAgICAgIH0KICAgICAgICB9IGNhdGNoIChlcnIpIHsKICAgICAgICAgICAgY29uc29sZS53YXJu +KCdsb2FkRG9jdW1lbnQgRmVobGVyIGZ1ZXIgJyArIGRvY0lkICsgJzonLCBlcnIpOwogICAgICAg +ICAgICAvLyBGYWxsYmFjazogSW4tTWVtb3J5LVZlcnNpb24gdmVyd2VuZGVuIChiZXJlaXRzIGJl +aW0gU3RhcnQgZ2VsYWRlbikKICAgICAgICAgICAgY29uc3QgbWVtRG9jID0gdGhpcy5kb2N1bWVu +dHMuZmluZChkID0+IGQuaWQgPT09IGRvY0lkKTsKICAgICAgICAgICAgaWYgKG1lbURvYykgcmV0 +dXJuIG1lbURvYzsKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQogICAgfSwKCiAg +ICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 +PT09PT09PT09PT09PQogICAgLy8gU0FWRSBET0NVTUVOVAogICAgLy8gPT09PT09PT09PT09PT09 +PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgICBh +c3luYyBzYXZlRG9jdW1lbnQoZG9jKSB7CiAgICAgICAgY29uc3QgZG9jSWQgPSBkb2MuaWQ7CiAg +ICAgICAgY29uc3QgbWV0YSA9IHRoaXMuZmlsZVRpbWVzdGFtcHNbZG9jSWRdOwogICAgICAgIGNv +bnN0IG5ld1BhdGggPSB0aGlzLmRvY1BhdGgoZG9jKTsKCiAgICAgICAgLy8gQWx0ZSBEYXRlaSBs +b2VzY2hlbiBmYWxscyBQZmFkIHNpY2ggZ2VhZW5kZXJ0IGhhdAogICAgICAgIGlmIChtZXRhICYm +IG1ldGEucGF0aCAhPT0gbmV3UGF0aCkgewogICAgICAgICAgICBhd2FpdCB0aGlzLmRlbGV0ZUZp +bGUobWV0YS5wYXRoKTsKICAgICAgICB9CgogICAgICAgIC8vIEdlYWVuZGVydC1UaW1lc3RhbXAg +dW5kIEJlYXJiZWl0ZXIgc2V0emVuCiAgICAgICAgZG9jLmdlYWVuZGVydCA9IG5ldyBEYXRlKCku +dG9JU09TdHJpbmcoKS5zcGxpdCgnVCcpWzBdOwogICAgICAgIGlmICh0aGlzLmVudmlyb24gJiYg +dGhpcy5lbnZpcm9uLnVzZXJuYW1lKSB7CiAgICAgICAgICAgIGRvYy5iZWFyYmVpdGV0Vm9uID0g +dGhpcy5lbnZpcm9uLnVzZXJuYW1lOwogICAgICAgIH0KCiAgICAgICAgLy8gVGVtcG9yYWVyZSBQ +cm9wZXJ0aWVzIGVudGZlcm5lbiAobWl0IF8gUHJlZml4LCBuaWNodCBwZXJzaXN0aWVyZW4pCiAg +ICAgICAgZGVsZXRlIGRvYy5fcHJldmlvdXNJbmhhbHQ7CiAgICAgICAgZGVsZXRlIGRvYy5fcHJl +dmlvdXNUaXRlbDsKCiAgICAgICAgLy8gU3BlaWNoZXJuCiAgICAgICAgaWYgKHRoaXMubW9kZSA9 +PT0gJ3NlcnZlcicpIHsKICAgICAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goJy9hcGkv +d3JpdGUnLCB7CiAgICAgICAgICAgICAgICBtZXRob2Q6ICdQT1NUJywKICAgICAgICAgICAgICAg +IGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uOyBjaGFyc2V0PXV0 +Zi04JyB9LAogICAgICAgICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBwYXRoOiBuZXdQ +YXRoLCBkYXRhOiBkb2MgfSkKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGNvbnN0IHJlc3Vs +dCA9IGF3YWl0IHJlcy5qc29uKCk7CiAgICAgICAgICAgIGlmICghcmVzdWx0Lm9rKSB7CiAgICAg +ICAgICAgICAgICByZXR1cm4gcmVzdWx0LmVycm9yIHx8ICdVbmJla2FubnRlciBGZWhsZXInOwog +ICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuZmlsZVRpbWVzdGFtcHNbZG9jSWRdID0gewog +ICAgICAgICAgICAgICAgbW9kaWZpZWQ6IHJlc3VsdC5tb2RpZmllZCwKICAgICAgICAgICAgICAg +IGthdGVnb3JpZTogZG9jLmthdGVnb3JpZSwKICAgICAgICAgICAgICAgIGZpbGVuYW1lOiB0aGlz +LmRvY0ZpbGVuYW1lKGRvYyksCiAgICAgICAgICAgICAgICBwYXRoOiBuZXdQYXRoCiAgICAgICAg +ICAgIH07CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgY29uc3Qga2F0RGlyID0gYXdhaXQg +dGhpcy5fZGF0YUhhbmRsZS5nZXREaXJlY3RvcnlIYW5kbGUoZG9jLmthdGVnb3JpZSwgeyBjcmVh +dGU6IHRydWUgfSk7CiAgICAgICAgICAgIGNvbnN0IGZpbGVuYW1lID0gdGhpcy5kb2NGaWxlbmFt +ZShkb2MpOwogICAgICAgICAgICBjb25zdCBmaCA9IGF3YWl0IGthdERpci5nZXRGaWxlSGFuZGxl +KGZpbGVuYW1lLCB7IGNyZWF0ZTogdHJ1ZSB9KTsKICAgICAgICAgICAgY29uc3Qgd3JpdGFibGUg +PSBhd2FpdCBmaC5jcmVhdGVXcml0YWJsZSgpOwogICAgICAgICAgICBhd2FpdCB3cml0YWJsZS53 +cml0ZShKU09OLnN0cmluZ2lmeShkb2MsIG51bGwsIDIpKTsKICAgICAgICAgICAgYXdhaXQgd3Jp +dGFibGUuY2xvc2UoKTsKICAgICAgICAgICAgY29uc3Qgc2F2ZWRGaWxlID0gYXdhaXQgKGF3YWl0 +IGthdERpci5nZXRGaWxlSGFuZGxlKGZpbGVuYW1lKSkuZ2V0RmlsZSgpOwogICAgICAgICAgICB0 +aGlzLmZpbGVUaW1lc3RhbXBzW2RvY0lkXSA9IHsKICAgICAgICAgICAgICAgIG1vZGlmaWVkOiBz +YXZlZEZpbGUubGFzdE1vZGlmaWVkLAogICAgICAgICAgICAgICAga2F0ZWdvcmllOiBkb2Mua2F0 +ZWdvcmllLAogICAgICAgICAgICAgICAgZmlsZW5hbWU6IGZpbGVuYW1lLAogICAgICAgICAgICAg +ICAgcGF0aDogbmV3UGF0aAogICAgICAgICAgICB9OwogICAgICAgIH0KCiAgICAgICAgLy8gSW4t +TWVtb3J5IGFrdHVhbGlzaWVyZW4KICAgICAgICBjb25zdCBpZHggPSB0aGlzLmRvY3VtZW50cy5m +aW5kSW5kZXgoZCA9PiBkLmlkID09PSBkb2NJZCk7CiAgICAgICAgaWYgKGlkeCA+PSAwKSB7IHRo +aXMuZG9jdW1lbnRzW2lkeF0gPSBkb2M7IH0gZWxzZSB7IHRoaXMuZG9jdW1lbnRzLnB1c2goZG9j +KTsgfQoKICAgICAgICBhd2FpdCB0aGlzLnVwZGF0ZUluZGV4KCk7CiAgICAgICAgcmV0dXJuIHRy +dWU7CiAgICB9LAoKICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 +PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAvLyBERUxFVEUKICAgIC8vID09PT09PT09 +PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 +CgogICAgYXN5bmMgZGVsZXRlRmlsZShwYXRoKSB7CiAgICAgICAgaWYgKHRoaXMubW9kZSA9PT0g +J3NlcnZlcicpIHsKICAgICAgICAgICAgdmFyIHJlcyA9IGF3YWl0IGZldGNoKCcvYXBpL2RlbGV0 ZScsIHsKICAgICAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLAogICAgICAgICAgICAgICAgaGVh ZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb247IGNoYXJzZXQ9dXRmLTgn -IH0sCiAgICAgICAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IHBhdGg6IG5ld1BhdGgs -IGRhdGE6IGRvYyB9KQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0g -YXdhaXQgcmVzLmpzb24oKTsKICAgICAgICAgICAgaWYgKCFyZXN1bHQub2spIHsKICAgICAgICAg -ICAgICAgIHJldHVybiByZXN1bHQuZXJyb3IgfHwgJ1VuYmVrYW5udGVyIEZlaGxlcic7CiAgICAg -ICAgICAgIH0KICAgICAgICAgICAgdGhpcy5maWxlVGltZXN0YW1wc1tkb2NJZF0gPSB7CiAgICAg -ICAgICAgICAgICBtb2RpZmllZDogcmVzdWx0Lm1vZGlmaWVkLAogICAgICAgICAgICAgICAga2F0 -ZWdvcmllOiBkb2Mua2F0ZWdvcmllLAogICAgICAgICAgICAgICAgZmlsZW5hbWU6IHRoaXMuZG9j -RmlsZW5hbWUoZG9jKSwKICAgICAgICAgICAgICAgIHBhdGg6IG5ld1BhdGgKICAgICAgICAgICAg -fTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBjb25zdCBrYXREaXIgPSBhd2FpdCB0aGlz -Ll9kYXRhSGFuZGxlLmdldERpcmVjdG9yeUhhbmRsZShkb2Mua2F0ZWdvcmllLCB7IGNyZWF0ZTog -dHJ1ZSB9KTsKICAgICAgICAgICAgY29uc3QgZmlsZW5hbWUgPSB0aGlzLmRvY0ZpbGVuYW1lKGRv -Yyk7CiAgICAgICAgICAgIGNvbnN0IGZoID0gYXdhaXQga2F0RGlyLmdldEZpbGVIYW5kbGUoZmls -ZW5hbWUsIHsgY3JlYXRlOiB0cnVlIH0pOwogICAgICAgICAgICBjb25zdCB3cml0YWJsZSA9IGF3 -YWl0IGZoLmNyZWF0ZVdyaXRhYmxlKCk7CiAgICAgICAgICAgIGF3YWl0IHdyaXRhYmxlLndyaXRl -KEpTT04uc3RyaW5naWZ5KGRvYywgbnVsbCwgMikpOwogICAgICAgICAgICBhd2FpdCB3cml0YWJs -ZS5jbG9zZSgpOwogICAgICAgICAgICBjb25zdCBzYXZlZEZpbGUgPSBhd2FpdCAoYXdhaXQga2F0 -RGlyLmdldEZpbGVIYW5kbGUoZmlsZW5hbWUpKS5nZXRGaWxlKCk7CiAgICAgICAgICAgIHRoaXMu -ZmlsZVRpbWVzdGFtcHNbZG9jSWRdID0gewogICAgICAgICAgICAgICAgbW9kaWZpZWQ6IHNhdmVk -RmlsZS5sYXN0TW9kaWZpZWQsCiAgICAgICAgICAgICAgICBrYXRlZ29yaWU6IGRvYy5rYXRlZ29y -aWUsCiAgICAgICAgICAgICAgICBmaWxlbmFtZTogZmlsZW5hbWUsCiAgICAgICAgICAgICAgICBw -YXRoOiBuZXdQYXRoCiAgICAgICAgICAgIH07CiAgICAgICAgfQoKICAgICAgICAvLyBJbi1NZW1v -cnkgYWt0dWFsaXNpZXJlbgogICAgICAgIGNvbnN0IGlkeCA9IHRoaXMuZG9jdW1lbnRzLmZpbmRJ -bmRleChkID0+IGQuaWQgPT09IGRvY0lkKTsKICAgICAgICBpZiAoaWR4ID49IDApIHsgdGhpcy5k -b2N1bWVudHNbaWR4XSA9IGRvYzsgfSBlbHNlIHsgdGhpcy5kb2N1bWVudHMucHVzaChkb2MpOyB9 -CgogICAgICAgIGF3YWl0IHRoaXMudXBkYXRlSW5kZXgoKTsKICAgICAgICByZXR1cm4gdHJ1ZTsK -ICAgIH0sCgogICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 -PT09PT09PT09PT09PT09PT09PT09PT0KICAgIC8vIERFTEVURQogICAgLy8gPT09PT09PT09PT09 -PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAg -ICBhc3luYyBkZWxldGVGaWxlKHBhdGgpIHsKICAgICAgICBpZiAodGhpcy5tb2RlID09PSAnc2Vy -dmVyJykgewogICAgICAgICAgICB2YXIgcmVzID0gYXdhaXQgZmV0Y2goJy9hcGkvZGVsZXRlJywg -ewogICAgICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCcsCiAgICAgICAgICAgICAgICBoZWFkZXJz -OiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbjsgY2hhcnNldD11dGYtOCcgfSwK -ICAgICAgICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgcGF0aDogcGF0aCB9KQogICAg -ICAgICAgICB9KTsKICAgICAgICAgICAgaWYgKCFyZXMub2spIHsKICAgICAgICAgICAgICAgIHZh -ciBlcnIgPSBhd2FpdCByZXMuanNvbigpLmNhdGNoKGZ1bmN0aW9uKCkgeyByZXR1cm4ge307IH0p -OwogICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGVyci5lcnJvciB8fCAnTMO2c2NoZW4g -ZmVobGdlc2NobGFnZW4gKEhUVFAgJyArIHJlcy5zdGF0dXMgKyAnKScpOwogICAgICAgICAgICB9 -CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgLy8gRmlsZXN5c3RlbTogRGF0ZWkgYXVzIEth -dGVnb3JpZS1PcmRuZXIgbG9lc2NoZW4KICAgICAgICAgICAgY29uc3QgcGFydHMgPSBwYXRoLnNw -bGl0KCcvJyk7CiAgICAgICAgICAgIGNvbnN0IGthdCA9IHBhcnRzWzFdOwogICAgICAgICAgICBj -b25zdCBmaWxlbmFtZSA9IHBhcnRzWzJdOwogICAgICAgICAgICBjb25zdCBrYXREaXIgPSBhd2Fp -dCB0aGlzLl9kYXRhSGFuZGxlLmdldERpcmVjdG9yeUhhbmRsZShrYXQpOwogICAgICAgICAgICBh -d2FpdCBrYXREaXIucmVtb3ZlRW50cnkoZmlsZW5hbWUpOwogICAgICAgIH0KICAgIH0sCgogICAg -YXN5bmMgZGVsZXRlRG9jdW1lbnQoZG9jSWQpIHsKICAgICAgICBjb25zdCBtZXRhID0gdGhpcy5m -aWxlVGltZXN0YW1wc1tkb2NJZF07CiAgICAgICAgaWYgKCFtZXRhKSByZXR1cm4gZmFsc2U7Cgog -ICAgICAgIHRyeSB7CiAgICAgICAgICAgIGF3YWl0IHRoaXMuZGVsZXRlRmlsZShtZXRhLnBhdGgp -OwogICAgICAgICAgICB0aGlzLmRvY3VtZW50cyA9IHRoaXMuZG9jdW1lbnRzLmZpbHRlcihkID0+ -IGQuaWQgIT09IGRvY0lkKTsKICAgICAgICAgICAgZGVsZXRlIHRoaXMuZmlsZVRpbWVzdGFtcHNb -ZG9jSWRdOwoKICAgICAgICAgICAgLy8gTWVkaWEtT3JkbmVyIGxvZXNjaGVuCiAgICAgICAgICAg -IHRyeSB7CiAgICAgICAgICAgICAgICBpZiAodGhpcy5tb2RlID09PSAnc2VydmVyJykgewogICAg -ICAgICAgICAgICAgICAgIGF3YWl0IGZldGNoKCcvYXBpL2RlbGV0ZScsIHsKICAgICAgICAgICAg -ICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCcsCiAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRl -cnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uOyBjaGFyc2V0PXV0Zi04JyB9 -LAogICAgICAgICAgICAgICAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IHBhdGg6ICdt -ZWRpYS8nICsgZG9jSWQgfSkKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAg -IH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5fbWVkaWFIYW5kbGUucmVt -b3ZlRW50cnkoZG9jSWQsIHsgcmVjdXJzaXZlOiB0cnVlIH0pOwogICAgICAgICAgICAgICAgfQog -ICAgICAgICAgICB9IGNhdGNoIHt9CgogICAgICAgICAgICBhd2FpdCB0aGlzLnVwZGF0ZUluZGV4 -KCk7CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0gY2F0Y2ggKGVycikgewogICAg -ICAgICAgICBjb25zb2xlLmVycm9yKCdMb2VzY2hmZWhsZXI6JywgZXJyKTsKICAgICAgICAgICAg -cmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgIH0sCgogICAgLy8gPT09PT09PT09PT09PT09PT09 -PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgIC8vIElO -REVYCiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 -PT09PT09PT09PT09PT09PT09PQoKICAgIGFzeW5jIHVwZGF0ZUluZGV4KCkgewogICAgICAgIC8v -IFN0YXRpc2NoZXIgTW9kdXM6IEluZGV4IG5pY2h0IHNjaHJlaWJlbiAoa2VpbiBTY2hyZWlienVn -cmlmZikKICAgICAgICBpZiAodGhpcy5tb2RlID09PSAnc3RhdGljJykgcmV0dXJuOwoKICAgICAg -ICBjb25zdCBpbmRleERhdGEgPSB7CiAgICAgICAgICAgIHZlcnNpb246ICczLjAnLAogICAgICAg -ICAgICBsYXN0VXBkYXRlZDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLAogICAgICAgICAgICBk -b2N1bWVudHM6IHRoaXMuZG9jdW1lbnRzLm1hcChkb2MgPT4gKHsKICAgICAgICAgICAgICAgIGlk -OiBkb2MuaWQsCiAgICAgICAgICAgICAgICB0aXRlbDogZG9jLnRpdGVsLAogICAgICAgICAgICAg -ICAga2F0ZWdvcmllOiBkb2Mua2F0ZWdvcmllLAogICAgICAgICAgICAgICAgc3RhdHVzOiBkb2Mu -c3RhdHVzLAogICAgICAgICAgICAgICAgZXJzdGVsbHQ6IGRvYy5lcnN0ZWxsdCwKICAgICAgICAg -ICAgICAgIGdlYWVuZGVydDogZG9jLmdlYWVuZGVydCB8fCBkb2MuZXJzdGVsbHQsCiAgICAgICAg -ICAgICAgICB2ZXJzaW9uOiBkb2MudmVyc2lvbiwKICAgICAgICAgICAgICAgIGhhc01lZGlhOiAo -ZG9jLm1lZGlhcyAmJiBkb2MubWVkaWFzLmxlbmd0aCA+IDApIHx8IGZhbHNlLAogICAgICAgICAg -ICAgICAgZXJzdGVsbHRWb246IGRvYy5lcnN0ZWxsdFZvbiB8fCBudWxsLAogICAgICAgICAgICAg -ICAgYmVhcmJlaXRldFZvbjogZG9jLmJlYXJiZWl0ZXRWb24gfHwgbnVsbCwKICAgICAgICAgICAg -ICAgIHNjaGxhZ3dvZXJ0ZXI6IGRvYy5zY2hsYWd3b2VydGVyIHx8IFtdLAogICAgICAgICAgICAg -ICAgcGFyZW50SWQ6IGRvYy5wYXJlbnRJZCB8fCBudWxsCiAgICAgICAgICAgIH0pKQogICAgICAg -IH07CgogICAgICAgIC8vIEtvbXBsZXR0ZSBEYXRlbiBmdWVyIGZpbGU6Ly8tTGVzZW1vZHVzIChh -bGxlIERva3VtZW50ZSArIENvbmZpZyArIEdvdmVybmFuY2UtU2V0dGluZ3MpCiAgICAgICAgdmFy -IGdvdlB1YmxpYyA9IG51bGw7CiAgICAgICAgaWYgKERyaXZlR292ZXJuYW5jZS5kYXRhKSB7CiAg -ICAgICAgICAgIC8vIE51ciBsZXNiYXJlIEdvdmVybmFuY2UtRGF0ZW46IFNldHRpbmdzLCBLYXRl -Z29yaWVuLVNpY2h0YmFya2VpdCwgUmV2aWV3ZXItS2F0ZWdvcmllbiAoa2VpbmUgQ3JlZGVudGlh -bHMpCiAgICAgICAgICAgIGdvdlB1YmxpYyA9IHsKICAgICAgICAgICAgICAgIHNldHRpbmdzOiBE -cml2ZUdvdmVybmFuY2UuZGF0YS5zZXR0aW5ncyB8fCB7fSwKICAgICAgICAgICAgICAgIHJldmll -d2VyczogKERyaXZlR292ZXJuYW5jZS5kYXRhLnJldmlld2VycyB8fCBbXSkubWFwKGZ1bmN0aW9u -KHIpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4geyBkaXNwbGF5TmFtZTogci5kaXNwbGF5 -TmFtZSB8fCByLnVzZXJuYW1lLCBrYXRlZ29yaWVuOiByLmthdGVnb3JpZW4gfHwgW10gfTsKICAg -ICAgICAgICAgICAgIH0pLAogICAgICAgICAgICAgICAgaGlkZGVuS2F0ZWdvcmllbjogdGhpcy5j -b25maWcuaGlkZGVuS2F0ZWdvcmllbiB8fCBbXQogICAgICAgICAgICB9OwogICAgICAgIH0KICAg -ICAgICAvLyBTdGFydHNlaXRlIGZ1ZXIgTGVzZW1vZHVzIGVpbmJldHRlbgogICAgICAgIHZhciBz -dGFydHNlaXRlSHRtbCA9IG51bGw7CiAgICAgICAgdmFyIHdlbGNvbWVFbCA9IGRvY3VtZW50LnF1 -ZXJ5U2VsZWN0b3IoJy53ZWxjb21lLWNvbnRlbnQnKTsKICAgICAgICBpZiAod2VsY29tZUVsKSBz -dGFydHNlaXRlSHRtbCA9IHdlbGNvbWVFbC5pbm5lckhUTUw7CgogICAgICAgIHZhciBzdGF0aWNE -YXRhID0gewogICAgICAgICAgICB2ZXJzaW9uOiBpbmRleERhdGEudmVyc2lvbiwKICAgICAgICAg -ICAgbGFzdFVwZGF0ZWQ6IGluZGV4RGF0YS5sYXN0VXBkYXRlZCwKICAgICAgICAgICAgY29uZmln -OiB0aGlzLmNvbmZpZyB8fCBudWxsLAogICAgICAgICAgICBnb3Zlcm5hbmNlOiBnb3ZQdWJsaWMs -CiAgICAgICAgICAgIHN0YXJ0c2VpdGU6IHN0YXJ0c2VpdGVIdG1sLAogICAgICAgICAgICBkb2N1 -bWVudHM6IHRoaXMuZG9jdW1lbnRzLm1hcChmdW5jdGlvbihkb2MpIHsKICAgICAgICAgICAgICAg -IC8vIEtvbXBsZXR0ZXMgRG9rdW1lbnQga29waWVyZW4sIGFiZXIgX3ByaXZhdGUgUHJvcGVydGll -cyBlbnRmZXJuZW4KICAgICAgICAgICAgICAgIHZhciBjb3B5ID0ge307CiAgICAgICAgICAgICAg -ICBmb3IgKHZhciBrIGluIGRvYykgewogICAgICAgICAgICAgICAgICAgIGlmIChrLmNoYXJBdCgw -KSAhPT0gJ18nKSBjb3B5W2tdID0gZG9jW2tdOwogICAgICAgICAgICAgICAgfQogICAgICAgICAg -ICAgICAgcmV0dXJuIGNvcHk7CiAgICAgICAgICAgIH0pCiAgICAgICAgfTsKICAgICAgICB2YXIg -anNDb250ZW50ID0gJ3ZhciBEUklWRV9TVEFUSUNfSU5ERVggPSAnICsgSlNPTi5zdHJpbmdpZnko -c3RhdGljRGF0YSkgKyAnOyc7CgogICAgICAgIGlmICh0aGlzLm1vZGUgPT09ICdzZXJ2ZXInKSB7 -CiAgICAgICAgICAgIGF3YWl0IGZldGNoKCcvYXBpL3dyaXRlJywgewogICAgICAgICAgICAgICAg -bWV0aG9kOiAnUE9TVCcsCiAgICAgICAgICAgICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUn -OiAnYXBwbGljYXRpb24vanNvbjsgY2hhcnNldD11dGYtOCcgfSwKICAgICAgICAgICAgICAgIGJv -ZHk6IEpTT04uc3RyaW5naWZ5KHsgcGF0aDogJ2RhdGEvaW5kZXguanNvbicsIGRhdGE6IGluZGV4 -RGF0YSB9KQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgYXdhaXQgZmV0Y2goJy9hcGkvd3Jp -dGUnLCB7CiAgICAgICAgICAgICAgICBtZXRob2Q6ICdQT1NUJywKICAgICAgICAgICAgICAgIGhl -YWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uOyBjaGFyc2V0PXV0Zi04 -JyB9LAogICAgICAgICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBwYXRoOiAnZGF0YS9p -bmRleC5qcycsIGRhdGE6IGpzQ29udGVudCB9KQogICAgICAgICAgICB9KTsKICAgICAgICB9IGVs -c2UgaWYgKHRoaXMuX2RhdGFIYW5kbGUpIHsKICAgICAgICAgICAgY29uc3QgZmggPSBhd2FpdCB0 -aGlzLl9kYXRhSGFuZGxlLmdldEZpbGVIYW5kbGUoJ2luZGV4Lmpzb24nLCB7IGNyZWF0ZTogdHJ1 -ZSB9KTsKICAgICAgICAgICAgY29uc3Qgd3JpdGFibGUgPSBhd2FpdCBmaC5jcmVhdGVXcml0YWJs -ZSgpOwogICAgICAgICAgICBhd2FpdCB3cml0YWJsZS53cml0ZShKU09OLnN0cmluZ2lmeShpbmRl -eERhdGEsIG51bGwsIDIpKTsKICAgICAgICAgICAgYXdhaXQgd3JpdGFibGUuY2xvc2UoKTsKICAg -ICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgIGNvbnN0IGZoSnMgPSBhd2FpdCB0aGlzLl9k -YXRhSGFuZGxlLmdldEZpbGVIYW5kbGUoJ2luZGV4LmpzJywgeyBjcmVhdGU6IHRydWUgfSk7CiAg -ICAgICAgICAgICAgICBjb25zdCB3SnMgPSBhd2FpdCBmaEpzLmNyZWF0ZVdyaXRhYmxlKCk7CiAg -ICAgICAgICAgICAgICBhd2FpdCB3SnMud3JpdGUoanNDb250ZW50KTsKICAgICAgICAgICAgICAg -IGF3YWl0IHdKcy5jbG9zZSgpOwogICAgICAgICAgICB9IGNhdGNoIHt9CiAgICAgICAgfQoKICAg -ICAgICB0aGlzLmluZGV4ID0gaW5kZXhEYXRhOwogICAgfSwKCiAgICAvLyA9PT09PT09PT09PT09 -PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAg -Ly8gTUVESUEgVVBMT0FECiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 -PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKICAgIC8vIERhdGVpbmFtZW4gYmVyZWlu -aWdlbjogVW1sYXV0ZSB1bmQgU29uZGVyemVpY2hlbiBkdXJjaCBBU0NJSSBlcnNldHplbgogICAg -c2FuaXRpemVGaWxlbmFtZShuYW1lKSB7CiAgICAgICAgcmV0dXJuIG5hbWUKICAgICAgICAgICAg -LnJlcGxhY2UoL8OkL2csICdhZScpLnJlcGxhY2UoL8OEL2csICdBZScpCiAgICAgICAgICAgIC5y -ZXBsYWNlKC/Dti9nLCAnb2UnKS5yZXBsYWNlKC/Dli9nLCAnT2UnKQogICAgICAgICAgICAucmVw -bGFjZSgvw7wvZywgJ3VlJykucmVwbGFjZSgvw5wvZywgJ1VlJykKICAgICAgICAgICAgLnJlcGxh -Y2UoL8OfL2csICdzcycpCiAgICAgICAgICAgIC5yZXBsYWNlKC9bXlx3LlwtXS9nLCAnXycpCiAg -ICAgICAgICAgIC5yZXBsYWNlKC9fKy9nLCAnXycpOwogICAgfSwKCiAgICBhc3luYyB1cGxvYWRN -ZWRpYShkb2NJZCwgZmlsZSwgb25Qcm9ncmVzcykgewogICAgICAgIGNvbnN0IHNhZmVOYW1lID0g -dGhpcy5zYW5pdGl6ZUZpbGVuYW1lKGZpbGUubmFtZSk7CiAgICAgICAgY29uc3QgcmVsUGF0aCA9 -ICdtZWRpYS8nICsgZG9jSWQgKyAnLycgKyBzYWZlTmFtZTsKCiAgICAgICAgaWYgKHRoaXMubW9k -ZSA9PT0gJ3NlcnZlcicpIHsKICAgICAgICAgICAgLy8gWE1MSHR0cFJlcXVlc3Qgc3RhdHQgZmV0 -Y2g6IEVybW9lZ2xpY2h0IFVwbG9hZC1Gb3J0c2Nocml0dHNhbnplaWdlCiAgICAgICAgICAgIC8v -IHZpYSB4aHIudXBsb2FkLm9ucHJvZ3Jlc3MgKGZldGNoIHVudGVyc3R1ZXR6dCBrZWluIFVwbG9h -ZC1Qcm9ncmVzcykKICAgICAgICAgICAgY29uc3QgZm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKTsK -ICAgICAgICAgICAgZm9ybURhdGEuYXBwZW5kKCdmaWxlJywgZmlsZSk7CiAgICAgICAgICAgIGNv -bnN0IHVybCA9ICcvYXBpL3VwbG9hZD9wYXRoPScgKyBlbmNvZGVVUklDb21wb25lbnQocmVsUGF0 -aCk7CgogICAgICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWpl -Y3QpIHsKICAgICAgICAgICAgICAgIHZhciB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTsKICAg -ICAgICAgICAgICAgIHhoci5vcGVuKCdQT1NUJywgdXJsKTsKICAgICAgICAgICAgICAgIGlmIChv -blByb2dyZXNzKSB7CiAgICAgICAgICAgICAgICAgICAgeGhyLnVwbG9hZC5vbnByb2dyZXNzID0g -ZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZS5sZW5ndGhDb21wdXRh -YmxlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvblByb2dyZXNzKE1hdGgucm91bmQo -KGUubG9hZGVkIC8gZS50b3RhbCkgKiAxMDApLCBlLmxvYWRlZCwgZS50b3RhbCk7CiAgICAgICAg -ICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAg -fQogICAgICAgICAgICAgICAgeGhyLm9ubG9hZCA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAg -ICAgICAgIGlmICh4aHIuc3RhdHVzID49IDIwMCAmJiB4aHIuc3RhdHVzIDwgMzAwKSB7CiAgICAg -ICAgICAgICAgICAgICAgICAgIGlmIChvblByb2dyZXNzKSBvblByb2dyZXNzKDEwMCwgZmlsZS5z -aXplLCBmaWxlLnNpemUpOwogICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKCk7CiAgICAg -ICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGVyciA9 -IHt9OwogICAgICAgICAgICAgICAgICAgICAgICB0cnkgeyBlcnIgPSBKU09OLnBhcnNlKHhoci5y -ZXNwb25zZVRleHQpOyB9IGNhdGNoKGV4KSB7fQogICAgICAgICAgICAgICAgICAgICAgICByZWpl -Y3QobmV3IEVycm9yKGVyci5lcnJvciB8fCAnVXBsb2FkIGZlaGxnZXNjaGxhZ2VuIChIVFRQICcg -KyB4aHIuc3RhdHVzICsgJyknKSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAg -ICAgfTsKICAgICAgICAgICAgICAgIHhoci5vbmVycm9yID0gZnVuY3Rpb24oKSB7CiAgICAgICAg -ICAgICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcignU2VydmVyIG5pY2h0IGVycmVpY2hiYXIuIExh -ZXVmdCBkZXIgU2VydmVyIG5vY2g/JykpOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAg -ICAgIHhoci5zZW5kKGZvcm1EYXRhKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSBlbHNlIHsK -ICAgICAgICAgICAgY29uc3QgZG9jTWVkaWFEaXIgPSBhd2FpdCB0aGlzLl9tZWRpYUhhbmRsZS5n -ZXREaXJlY3RvcnlIYW5kbGUoZG9jSWQsIHsgY3JlYXRlOiB0cnVlIH0pOwogICAgICAgICAgICBj -b25zdCBmaCA9IGF3YWl0IGRvY01lZGlhRGlyLmdldEZpbGVIYW5kbGUoc2FmZU5hbWUsIHsgY3Jl -YXRlOiB0cnVlIH0pOwogICAgICAgICAgICBjb25zdCB3cml0YWJsZSA9IGF3YWl0IGZoLmNyZWF0 -ZVdyaXRhYmxlKCk7CiAgICAgICAgICAgIGF3YWl0IHdyaXRhYmxlLndyaXRlKGZpbGUpOwogICAg -ICAgICAgICBhd2FpdCB3cml0YWJsZS5jbG9zZSgpOwogICAgICAgICAgICBpZiAob25Qcm9ncmVz -cykgb25Qcm9ncmVzcygxMDAsIGZpbGUuc2l6ZSwgZmlsZS5zaXplKTsKICAgICAgICB9CgogICAg -ICAgIHJldHVybiByZWxQYXRoOwogICAgfSwKCiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09 -PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgLy8gVUkKICAg -IC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 -PT09PT09PT09PT09CgogICAgdXBkYXRlQ29ubmVjdGlvblVJKCkgewogICAgICAgIGNvbnN0IGJh -ciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb25uZWN0aW9uQmFyJyk7CiAgICAgICAgY29u -c3QgZG90ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N0YXR1c0RvdCcpOwogICAgICAgIGNv -bnN0IHRleHQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29ubmVjdGlvblRleHQnKTsKICAg -ICAgICBjb25zdCBzZWFyY2ggPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VhcmNoSW5wdXQn -KTsKICAgICAgICBjb25zdCBidG5OZXcgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYnRuTmV3 -RG9jJyk7CiAgICAgICAgY29uc3QgYnRuUmVjb25uZWN0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5 -SWQoJ2J0blJlY29ubmVjdCcpOwogICAgICAgIGNvbnN0IGJ0blNlcnZlciA9IGRvY3VtZW50Lmdl -dEVsZW1lbnRCeUlkKCdidG5BY3RpdmF0ZVNlcnZlcicpOwoKICAgICAgICBpZiAodGhpcy5jb25u -ZWN0ZWQpIHsKICAgICAgICAgICAgYmFyLnN0eWxlLmRpc3BsYXkgPSAnJzsKICAgICAgICAgICAg -ZG90LmNsYXNzTGlzdC5yZW1vdmUoJ2Nvbm5lY3RlZCcsICdyZWFkb25seScpOwogICAgICAgICAg -ICBpZiAodGhpcy5yZWFkT25seSkgewogICAgICAgICAgICAgICAgZG90LmNsYXNzTGlzdC5hZGQo -J3JlYWRvbmx5Jyk7CiAgICAgICAgICAgICAgICBjb25zdCBtb2RlUHJlZml4ID0gdGhpcy5tb2Rl -ID09PSAnc3RhdGljJyA/ICdMZXNlbW9kdXMnIDogJ051ciBMZXNlbic7CiAgICAgICAgICAgICAg -ICBjb25zdCB1c2VyU3RyID0gKHRoaXMuZW52aXJvbiAmJiB0aGlzLm1vZGUgIT09ICdzdGF0aWMn -KSA/ICcgfCAnICsgdGhpcy5lbnZpcm9uLnVzZXJuYW1lIDogJyc7CiAgICAgICAgICAgICAgICB0 -ZXh0LnRleHRDb250ZW50ID0gbW9kZVByZWZpeCArICcgKCcgKyB0aGlzLmRvY3VtZW50cy5sZW5n -dGggKyAnIERva3VtZW50ZSknICsgdXNlclN0cjsKICAgICAgICAgICAgICAgIGJ0bk5ldy5kaXNh -YmxlZCA9IHRydWU7CiAgICAgICAgICAgICAgICBidG5OZXcuc3R5bGUuZGlzcGxheSA9ICh0aGlz -Lm1vZGUgPT09ICdzdGF0aWMnKSA/ICdub25lJyA6ICcnOwogICAgICAgICAgICAgICAgYnRuTmV3 -LnRpdGxlID0gJ1NlcnZlciBzdGFydGVuIGbDvHIgQmVhcmJlaXR1bmcnOwogICAgICAgICAgICAg -ICAgYnRuU2VydmVyLnN0eWxlLmRpc3BsYXkgPSAodGhpcy5tb2RlID09PSAnc3RhdGljJykgPyAn -bm9uZScgOiAnJzsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGRvdC5jbGFz -c0xpc3QuYWRkKCdjb25uZWN0ZWQnKTsKICAgICAgICAgICAgICAgIGNvbnN0IHVzZXJTdHIgPSB0 -aGlzLmVudmlyb24gPyAnIHwgQmVudXR6ZXI6ICcgKyB0aGlzLmVudmlyb24udXNlcm5hbWUgOiAn -JzsKICAgICAgICAgICAgICAgIGNvbnN0IG1vZGVTdHIgPSB0aGlzLm1vZGUgPT09ICdzZXJ2ZXIn -ID8gJ1NlcnZlcicgOiAnTG9rYWwgKFZvbGx6dWdyaWZmKSc7CiAgICAgICAgICAgICAgICB0ZXh0 -LnRleHRDb250ZW50ID0gbW9kZVN0ciArICcgKCcgKyB0aGlzLmRvY3VtZW50cy5sZW5ndGggKyAn -IERva3VtZW50ZSknICsgdXNlclN0cjsKICAgICAgICAgICAgICAgIGJ0bk5ldy5kaXNhYmxlZCA9 -IGZhbHNlOwogICAgICAgICAgICAgICAgYnRuTmV3LnN0eWxlLmRpc3BsYXkgPSAnJzsKICAgICAg -ICAgICAgICAgIGJ0bk5ldy50aXRsZSA9ICcnOwogICAgICAgICAgICAgICAgYnRuU2VydmVyLnN0 -eWxlLmRpc3BsYXkgPSAnbm9uZSc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc2VhcmNoLmRp -c2FibGVkID0gZmFsc2U7CiAgICAgICAgICAgIGJ0blJlY29ubmVjdC5zdHlsZS5kaXNwbGF5ID0g -KHRoaXMubW9kZSA9PT0gJ2ZpbGVzeXN0ZW0nKSA/ICcnIDogJ25vbmUnOwogICAgICAgICAgICAv -LyBMZXNlbW9kdXMtQmFkZ2UgaW0gRm9vdGVyCiAgICAgICAgICAgIHZhciByZWFkQmFkZ2UgPSBk -b2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZm9vdGVyUmVhZE1vZGUnKTsKICAgICAgICAgICAgaWYg -KHJlYWRCYWRnZSkgcmVhZEJhZGdlLnN0eWxlLmRpc3BsYXkgPSB0aGlzLnJlYWRPbmx5ID8gJycg -OiAnbm9uZSc7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgYmFyLnN0eWxlLmRpc3BsYXkg -PSAnbm9uZSc7CiAgICAgICAgICAgIGRvdC5jbGFzc0xpc3QucmVtb3ZlKCdjb25uZWN0ZWQnLCAn -cmVhZG9ubHknKTsKICAgICAgICAgICAgc2VhcmNoLmRpc2FibGVkID0gdHJ1ZTsKICAgICAgICAg -ICAgYnRuTmV3LmRpc2FibGVkID0gdHJ1ZTsKICAgICAgICAgICAgYnRuTmV3LnN0eWxlLmRpc3Bs -YXkgPSAnbm9uZSc7CiAgICAgICAgICAgIGJ0blJlY29ubmVjdC5zdHlsZS5kaXNwbGF5ID0gJ25v -bmUnOwogICAgICAgICAgICBidG5TZXJ2ZXIuc3R5bGUuZGlzcGxheSA9ICdub25lJzsKICAgICAg -ICB9CiAgICB9LAoKICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 -PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAvLyBTWU5DIChwZXJpb2Rpc2NoIHBydWVm -ZW4gb2IgYW5kZXJlIFVzZXIgZXR3YXMgZ2VhZW5kZXJ0IGhhYmVuKQogICAgLy8gPT09PT09PT09 +IH0sCiAgICAgICAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IHBhdGg6IHBhdGggfSkK +ICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGlmICghcmVzLm9rKSB7CiAgICAgICAgICAgICAg +ICB2YXIgZXJyID0gYXdhaXQgcmVzLmpzb24oKS5jYXRjaChmdW5jdGlvbigpIHsgcmV0dXJuIHt9 +OyB9KTsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihlcnIuZXJyb3IgfHwgJ0zDtnNj +aGVuIGZlaGxnZXNjaGxhZ2VuIChIVFRQICcgKyByZXMuc3RhdHVzICsgJyknKTsKICAgICAgICAg +ICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIC8vIEZpbGVzeXN0ZW06IERhdGVpIGF1 +cyBLYXRlZ29yaWUtT3JkbmVyIGxvZXNjaGVuCiAgICAgICAgICAgIGNvbnN0IHBhcnRzID0gcGF0 +aC5zcGxpdCgnLycpOwogICAgICAgICAgICBjb25zdCBrYXQgPSBwYXJ0c1sxXTsKICAgICAgICAg +ICAgY29uc3QgZmlsZW5hbWUgPSBwYXJ0c1syXTsKICAgICAgICAgICAgY29uc3Qga2F0RGlyID0g +YXdhaXQgdGhpcy5fZGF0YUhhbmRsZS5nZXREaXJlY3RvcnlIYW5kbGUoa2F0KTsKICAgICAgICAg +ICAgYXdhaXQga2F0RGlyLnJlbW92ZUVudHJ5KGZpbGVuYW1lKTsKICAgICAgICB9CiAgICB9LAoK +ICAgIGFzeW5jIGRlbGV0ZURvY3VtZW50KGRvY0lkKSB7CiAgICAgICAgY29uc3QgbWV0YSA9IHRo +aXMuZmlsZVRpbWVzdGFtcHNbZG9jSWRdOwogICAgICAgIGlmICghbWV0YSkgcmV0dXJuIGZhbHNl +OwoKICAgICAgICB0cnkgewogICAgICAgICAgICBhd2FpdCB0aGlzLmRlbGV0ZUZpbGUobWV0YS5w +YXRoKTsKICAgICAgICAgICAgdGhpcy5kb2N1bWVudHMgPSB0aGlzLmRvY3VtZW50cy5maWx0ZXIo +ZCA9PiBkLmlkICE9PSBkb2NJZCk7CiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmZpbGVUaW1lc3Rh +bXBzW2RvY0lkXTsKCiAgICAgICAgICAgIC8vIE1lZGlhLU9yZG5lciBsb2VzY2hlbgogICAgICAg +ICAgICB0cnkgewogICAgICAgICAgICAgICAgaWYgKHRoaXMubW9kZSA9PT0gJ3NlcnZlcicpIHsK +ICAgICAgICAgICAgICAgICAgICBhd2FpdCBmZXRjaCgnL2FwaS9kZWxldGUnLCB7CiAgICAgICAg +ICAgICAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLAogICAgICAgICAgICAgICAgICAgICAgICBo +ZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbjsgY2hhcnNldD11dGYt +OCcgfSwKICAgICAgICAgICAgICAgICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBwYXRo +OiAnbWVkaWEvJyArIGRvY0lkIH0pCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAg +ICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuX21lZGlhSGFuZGxl +LnJlbW92ZUVudHJ5KGRvY0lkLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTsKICAgICAgICAgICAgICAg +IH0KICAgICAgICAgICAgfSBjYXRjaCB7fQoKICAgICAgICAgICAgYXdhaXQgdGhpcy51cGRhdGVJ +bmRleCgpOwogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9IGNhdGNoIChlcnIpIHsK +ICAgICAgICAgICAgY29uc29sZS5lcnJvcignTG9lc2NoZmVobGVyOicsIGVycik7CiAgICAgICAg +ICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICB9LAoKICAgIC8vID09PT09PT09PT09PT09 +PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAv +LyBJTkRFWAogICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 +PT09PT09PT09PT09PT09PT09PT09PT0KCiAgICBhc3luYyB1cGRhdGVJbmRleCgpIHsKICAgICAg +ICAvLyBTdGF0aXNjaGVyIE1vZHVzOiBJbmRleCBuaWNodCBzY2hyZWliZW4gKGtlaW4gU2NocmVp +Ynp1Z3JpZmYpCiAgICAgICAgaWYgKHRoaXMubW9kZSA9PT0gJ3N0YXRpYycpIHJldHVybjsKCiAg +ICAgICAgY29uc3QgaW5kZXhEYXRhID0gewogICAgICAgICAgICB2ZXJzaW9uOiAnMy4wJywKICAg +ICAgICAgICAgbGFzdFVwZGF0ZWQ6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSwKICAgICAgICAg +ICAgZG9jdW1lbnRzOiB0aGlzLmRvY3VtZW50cy5tYXAoZG9jID0+ICh7CiAgICAgICAgICAgICAg +ICBpZDogZG9jLmlkLAogICAgICAgICAgICAgICAgdGl0ZWw6IGRvYy50aXRlbCwKICAgICAgICAg +ICAgICAgIGthdGVnb3JpZTogZG9jLmthdGVnb3JpZSwKICAgICAgICAgICAgICAgIHN0YXR1czog +ZG9jLnN0YXR1cywKICAgICAgICAgICAgICAgIGVyc3RlbGx0OiBkb2MuZXJzdGVsbHQsCiAgICAg +ICAgICAgICAgICBnZWFlbmRlcnQ6IGRvYy5nZWFlbmRlcnQgfHwgZG9jLmVyc3RlbGx0LAogICAg +ICAgICAgICAgICAgdmVyc2lvbjogZG9jLnZlcnNpb24sCiAgICAgICAgICAgICAgICBoYXNNZWRp +YTogKGRvYy5tZWRpYXMgJiYgZG9jLm1lZGlhcy5sZW5ndGggPiAwKSB8fCBmYWxzZSwKICAgICAg +ICAgICAgICAgIGVyc3RlbGx0Vm9uOiBkb2MuZXJzdGVsbHRWb24gfHwgbnVsbCwKICAgICAgICAg +ICAgICAgIGJlYXJiZWl0ZXRWb246IGRvYy5iZWFyYmVpdGV0Vm9uIHx8IG51bGwsCiAgICAgICAg +ICAgICAgICBzY2hsYWd3b2VydGVyOiBkb2Muc2NobGFnd29lcnRlciB8fCBbXSwKICAgICAgICAg +ICAgICAgIHBhcmVudElkOiBkb2MucGFyZW50SWQgfHwgbnVsbAogICAgICAgICAgICB9KSkKICAg +ICAgICB9OwoKICAgICAgICAvLyBLb21wbGV0dGUgRGF0ZW4gZnVlciBmaWxlOi8vLUxlc2Vtb2R1 +cyAoYWxsZSBEb2t1bWVudGUgKyBDb25maWcgKyBHb3Zlcm5hbmNlLVNldHRpbmdzKQogICAgICAg +IHZhciBnb3ZQdWJsaWMgPSBudWxsOwogICAgICAgIGlmIChEcml2ZUdvdmVybmFuY2UuZGF0YSkg +ewogICAgICAgICAgICAvLyBOdXIgbGVzYmFyZSBHb3Zlcm5hbmNlLURhdGVuOiBTZXR0aW5ncywg +S2F0ZWdvcmllbi1TaWNodGJhcmtlaXQsIFJldmlld2VyLUthdGVnb3JpZW4gKGtlaW5lIENyZWRl +bnRpYWxzKQogICAgICAgICAgICBnb3ZQdWJsaWMgPSB7CiAgICAgICAgICAgICAgICBzZXR0aW5n +czogRHJpdmVHb3Zlcm5hbmNlLmRhdGEuc2V0dGluZ3MgfHwge30sCiAgICAgICAgICAgICAgICBy +ZXZpZXdlcnM6IChEcml2ZUdvdmVybmFuY2UuZGF0YS5yZXZpZXdlcnMgfHwgW10pLm1hcChmdW5j +dGlvbihyKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgZGlzcGxheU5hbWU6IHIuZGlz +cGxheU5hbWUgfHwgci51c2VybmFtZSwga2F0ZWdvcmllbjogci5rYXRlZ29yaWVuIHx8IFtdIH07 +CiAgICAgICAgICAgICAgICB9KSwKICAgICAgICAgICAgICAgIGhpZGRlbkthdGVnb3JpZW46IHRo +aXMuY29uZmlnLmhpZGRlbkthdGVnb3JpZW4gfHwgW10KICAgICAgICAgICAgfTsKICAgICAgICB9 +CiAgICAgICAgLy8gU3RhcnRzZWl0ZSBmdWVyIExlc2Vtb2R1cyBlaW5iZXR0ZW4KICAgICAgICB2 +YXIgc3RhcnRzZWl0ZUh0bWwgPSBudWxsOwogICAgICAgIHZhciB3ZWxjb21lRWwgPSBkb2N1bWVu +dC5xdWVyeVNlbGVjdG9yKCcud2VsY29tZS1jb250ZW50Jyk7CiAgICAgICAgaWYgKHdlbGNvbWVF +bCkgc3RhcnRzZWl0ZUh0bWwgPSB3ZWxjb21lRWwuaW5uZXJIVE1MOwoKICAgICAgICB2YXIgc3Rh +dGljRGF0YSA9IHsKICAgICAgICAgICAgdmVyc2lvbjogaW5kZXhEYXRhLnZlcnNpb24sCiAgICAg +ICAgICAgIGxhc3RVcGRhdGVkOiBpbmRleERhdGEubGFzdFVwZGF0ZWQsCiAgICAgICAgICAgIGNv +bmZpZzogdGhpcy5jb25maWcgfHwgbnVsbCwKICAgICAgICAgICAgZ292ZXJuYW5jZTogZ292UHVi +bGljLAogICAgICAgICAgICBzdGFydHNlaXRlOiBzdGFydHNlaXRlSHRtbCwKICAgICAgICAgICAg +ZG9jdW1lbnRzOiB0aGlzLmRvY3VtZW50cy5tYXAoZnVuY3Rpb24oZG9jKSB7CiAgICAgICAgICAg +ICAgICAvLyBLb21wbGV0dGVzIERva3VtZW50IGtvcGllcmVuLCBhYmVyIF9wcml2YXRlIFByb3Bl +cnRpZXMgZW50ZmVybmVuCiAgICAgICAgICAgICAgICB2YXIgY29weSA9IHt9OwogICAgICAgICAg +ICAgICAgZm9yICh2YXIgayBpbiBkb2MpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoay5jaGFy +QXQoMCkgIT09ICdfJykgY29weVtrXSA9IGRvY1trXTsKICAgICAgICAgICAgICAgIH0KICAgICAg +ICAgICAgICAgIHJldHVybiBjb3B5OwogICAgICAgICAgICB9KQogICAgICAgIH07CiAgICAgICAg +dmFyIGpzQ29udGVudCA9ICd2YXIgRFJJVkVfU1RBVElDX0lOREVYID0gJyArIEpTT04uc3RyaW5n +aWZ5KHN0YXRpY0RhdGEpICsgJzsnOwoKICAgICAgICBpZiAodGhpcy5tb2RlID09PSAnc2VydmVy +JykgewogICAgICAgICAgICBhd2FpdCBmZXRjaCgnL2FwaS93cml0ZScsIHsKICAgICAgICAgICAg +ICAgIG1ldGhvZDogJ1BPU1QnLAogICAgICAgICAgICAgICAgaGVhZGVyczogeyAnQ29udGVudC1U +eXBlJzogJ2FwcGxpY2F0aW9uL2pzb247IGNoYXJzZXQ9dXRmLTgnIH0sCiAgICAgICAgICAgICAg +ICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IHBhdGg6ICdkYXRhL2luZGV4Lmpzb24nLCBkYXRhOiBp +bmRleERhdGEgfSkKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGF3YWl0IGZldGNoKCcvYXBp +L3dyaXRlJywgewogICAgICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCcsCiAgICAgICAgICAgICAg +ICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbjsgY2hhcnNldD11 +dGYtOCcgfSwKICAgICAgICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgcGF0aDogJ2Rh +dGEvaW5kZXguanMnLCBkYXRhOiBqc0NvbnRlbnQgfSkKICAgICAgICAgICAgfSk7CiAgICAgICAg +fSBlbHNlIGlmICh0aGlzLl9kYXRhSGFuZGxlKSB7CiAgICAgICAgICAgIGNvbnN0IGZoID0gYXdh +aXQgdGhpcy5fZGF0YUhhbmRsZS5nZXRGaWxlSGFuZGxlKCdpbmRleC5qc29uJywgeyBjcmVhdGU6 +IHRydWUgfSk7CiAgICAgICAgICAgIGNvbnN0IHdyaXRhYmxlID0gYXdhaXQgZmguY3JlYXRlV3Jp +dGFibGUoKTsKICAgICAgICAgICAgYXdhaXQgd3JpdGFibGUud3JpdGUoSlNPTi5zdHJpbmdpZnko +aW5kZXhEYXRhLCBudWxsLCAyKSk7CiAgICAgICAgICAgIGF3YWl0IHdyaXRhYmxlLmNsb3NlKCk7 +CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICBjb25zdCBmaEpzID0gYXdhaXQgdGhp +cy5fZGF0YUhhbmRsZS5nZXRGaWxlSGFuZGxlKCdpbmRleC5qcycsIHsgY3JlYXRlOiB0cnVlIH0p +OwogICAgICAgICAgICAgICAgY29uc3Qgd0pzID0gYXdhaXQgZmhKcy5jcmVhdGVXcml0YWJsZSgp +OwogICAgICAgICAgICAgICAgYXdhaXQgd0pzLndyaXRlKGpzQ29udGVudCk7CiAgICAgICAgICAg +ICAgICBhd2FpdCB3SnMuY2xvc2UoKTsKICAgICAgICAgICAgfSBjYXRjaCB7fQogICAgICAgIH0K +CiAgICAgICAgdGhpcy5pbmRleCA9IGluZGV4RGF0YTsKICAgIH0sCgogICAgLy8gPT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K -CiAgICBzdGFydFN5bmMoKSB7CiAgICAgICAgaWYgKHRoaXMuc3luY0ludGVydmFsKSBjbGVhcklu -dGVydmFsKHRoaXMuc3luY0ludGVydmFsKTsKICAgICAgICB0aGlzLl9sYXN0VmlzdWFsU3luYyA9 -IDA7CgogICAgICAgIHRoaXMuc3luY0ludGVydmFsID0gc2V0SW50ZXJ2YWwoYXN5bmMgKCkgPT4g -ewogICAgICAgICAgICBpZiAoIXRoaXMuY29ubmVjdGVkKSByZXR1cm47CgogICAgICAgICAgICB0 -cnkgewogICAgICAgICAgICAgICAgbGV0IGNoYW5nZWQgPSBmYWxzZTsKCiAgICAgICAgICAgICAg -ICBpZiAodGhpcy5tb2RlID09PSAnc2VydmVyJykgewogICAgICAgICAgICAgICAgICAgIGNvbnN0 -IHJlcyA9IGF3YWl0IGZldGNoKCcvYXBpL3NjYW4nKTsKICAgICAgICAgICAgICAgICAgICBjb25z -dCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTsKICAgICAgICAgICAgICAgICAgICBjb25zdCBzZXJ2 -ZXJGaWxlcyA9IGRhdGEuZmlsZXMgfHwgW107CgogICAgICAgICAgICAgICAgICAgIC8vIEFuemFo -bCBnZWFlbmRlcnQ/CiAgICAgICAgICAgICAgICAgICAgaWYgKHNlcnZlckZpbGVzLmxlbmd0aCAh -PT0gdGhpcy5kb2N1bWVudHMubGVuZ3RoKSB7IGNoYW5nZWQgPSB0cnVlOyB9CgogICAgICAgICAg -ICAgICAgICAgIC8vIFRpbWVzdGFtcHMgZ2VhZW5kZXJ0PwogICAgICAgICAgICAgICAgICAgIGlm -ICghY2hhbmdlZCkgewogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGVudHJ5IG9m -IHNlcnZlckZpbGVzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkb2NJZCA9 -IGVudHJ5LmZpbGVuYW1lLnNwbGl0KCdfJylbMF07CiAgICAgICAgICAgICAgICAgICAgICAgICAg -ICBjb25zdCBtZXRhID0gdGhpcy5maWxlVGltZXN0YW1wc1tkb2NJZF07CiAgICAgICAgICAgICAg -ICAgICAgICAgICAgICBpZiAoIW1ldGEgfHwgZW50cnkubW9kaWZpZWQgIT09IG1ldGEubW9kaWZp -ZWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFuZ2VkID0gdHJ1ZTsKICAg -ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAg -ICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0K -ICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgLy8gRmlsZXN5c3Rl -bS1Nb2R1czogRGF0ZWllbiBwcnVlZmVuCiAgICAgICAgICAgICAgICAgICAgbGV0IHRvdGFsRmls -ZXMgPSAwOwogICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3Qga2F0IG9mICh0aGlzLmNvbmZp -Zy5rYXRlZ29yaWVuIHx8IFtdKSkgewogICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAg -ICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qga2F0RGlyID0gYXdhaXQgdGhpcy5fZGF0YUhh -bmRsZS5nZXREaXJlY3RvcnlIYW5kbGUoa2F0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAg -IGZvciBhd2FpdCAoY29uc3QgW25hbWUsIGhhbmRsZV0gb2Yga2F0RGlyKSB7CiAgICAgICAgICAg -ICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUuZW5kc1dpdGgoJy5qc29uJykpIHsKICAgICAg -ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG90YWxGaWxlcysrOwogICAgICAgICAgICAg -ICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmaWxlID0gYXdhaXQgaGFuZGxlLmdldEZpbGUo -KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZG9jSWQgPSBuYW1l -LnNwbGl0KCdfJylbMF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0 -IG1ldGEgPSB0aGlzLmZpbGVUaW1lc3RhbXBzW2RvY0lkXTsKICAgICAgICAgICAgICAgICAgICAg -ICAgICAgICAgICAgICAgaWYgKCFtZXRhIHx8IGZpbGUubGFzdE1vZGlmaWVkID4gbWV0YS5tb2Rp -ZmllZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbmdlZCA9 -IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAg -ICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAg -ICAgICAgICAgICAgICAgICAgIH0gY2F0Y2gge30KICAgICAgICAgICAgICAgICAgICB9CiAgICAg -ICAgICAgICAgICAgICAgaWYgKHRvdGFsRmlsZXMgIT09IHRoaXMuZG9jdW1lbnRzLmxlbmd0aCkg -Y2hhbmdlZCA9IHRydWU7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gTG9j -a3MgaW1tZXIgYWt0dWFsaXNpZXJlbiAodW5hYmhhZW5naWcgdm9uIERva3VtZW50ZW5hZW5kZXJ1 -bmdlbikKICAgICAgICAgICAgICAgIGF3YWl0IERyaXZlUG9ydGFsLmxvYWRMb2NrcygpOwoKICAg -ICAgICAgICAgICAgIGlmIChjaGFuZ2VkKSB7CiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhp -cy5sb2FkQWxsRG9jdW1lbnRzKCk7CiAgICAgICAgICAgICAgICAgICAgYXdhaXQgRHJpdmVHb3Zl -cm5hbmNlLmxvYWQoKTsKICAgICAgICAgICAgICAgICAgICBEcml2ZVBvcnRhbC5yZW5kZXIoKTsK -ICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3luY0luZm8nKS50 -ZXh0Q29udGVudCA9ICdBa3R1YWxpc2llcnQ6ICcgKyBuZXcgRGF0ZSgpLnRvTG9jYWxlVGltZVN0 -cmluZygpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAvLyBB -dWNoIG9obmUgRG9rdW1lbnRlbmFlbmRlcnVuZ2VuIGRpZSBMaXN0ZSBuZXUgcmVuZGVybiAoTG9j -ay1TdGF0dXMpCiAgICAgICAgICAgICAgICAgICAgRHJpdmVQb3J0YWwucmVuZGVyTGlzdCgpOwog -ICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIFZpc3VlbGxlIEFuemVpZ2UgaW0g -Rm9vdGVyIG51ciBhbGxlIDIwIE1pbnV0ZW4KICAgICAgICAgICAgICAgIGNvbnN0IG5vdyA9IERh -dGUubm93KCk7CiAgICAgICAgICAgICAgICBpZiAobm93IC0gdGhpcy5fbGFzdFZpc3VhbFN5bmMg -Pj0gMTIwMDAwMCkgewogICAgICAgICAgICAgICAgICAgIHRoaXMuX2xhc3RWaXN1YWxTeW5jID0g -bm93OwogICAgICAgICAgICAgICAgICAgIGNvbnN0IGVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5 -SWQoJ2Zvb3RlclN5bmNTdGF0dXMnKTsKICAgICAgICAgICAgICAgICAgICBpZiAoZWwpIHsKICAg -ICAgICAgICAgICAgICAgICAgICAgZWwudGV4dENvbnRlbnQgPSAnRC5SLkkuVi5FLiBha3R1YWxp -c2llcnQnOwogICAgICAgICAgICAgICAgICAgICAgICBlbC5jbGFzc0xpc3QuYWRkKCd2aXNpYmxl -Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gZWwuY2xhc3NMaXN0 -LnJlbW92ZSgndmlzaWJsZScpLCA0MDAwKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAg -ICAgICAgICB9CiAgICAgICAgICAgIH0gY2F0Y2ggKGVycikgewogICAgICAgICAgICAgICAgY29u -c29sZS53YXJuKCdTeW5jLUZlaGxlcjonLCBlcnIpOwogICAgICAgICAgICB9CiAgICAgICAgfSwg -MzAwMDAwKTsKICAgIH0KfTsKCi8vID09PT09PT09PT09PT09PT09PT09PSBQT1JUQUwgVUkgPT09 -PT09PT09PT09PT09PT09PT09CgovLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 -PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQovLyBNb2R1bDogRHJp -dmVQb3J0YWwgLSBEb2t1bWVudGVubGlzdGUsIEZpbHRlciwgRGV0YWlsYW5zaWNodAovLyBadXN0 -YWVuZGlnIGZ1ZXI6IFJlbmRlcm4gZGVyIERva3VtZW50ZW5saXN0ZSwgU3VjaGVyZ2Vibmlzc2Us -IERldGFpbC1WaWV3LCBUYWJlbGxlbmFuc2ljaHQKLy8gU2ljaGVyaGVpdDogQWxsZSBCZW51dHpl -cmRhdGVuIHdlcmRlbiB2b3IgZGVyIERhcnN0ZWxsdW5nIHVlYmVyIGVzY2FwZUhUTUwoKSAvIGVz -Y2FwZUF0dHIoKQovLyAgICAgICAgICAgICBiZXJlaW5pZ3QgKFhTUy1TY2h1dHopLiBTaWNodGJh -cmtlaXRzZmlsdGVyIChjYW5TZWVEb2N1bWVudCkgaXN0IHJlaW4gY2xpZW50c2VpdGlnCi8vICAg -ICAgICAgICAgIHVuZCBkaWVudCBkZXIgQmVudXR6ZXJmdWVocnVuZyAtIGRpZSBzZXJ2ZXJzZWl0 -aWdlIEF1dG9yaXNpZXJ1bmcgYmxlaWJ0IG1hc3NnZWJsaWNoLgovLyA9PT09PT09PT09PT09PT09 +ICAgIC8vIE1FRElBIFVQTE9BRAogICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 +PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgICAvLyBEYXRlaW5hbWVuIGJl +cmVpbmlnZW46IFVtbGF1dGUgdW5kIFNvbmRlcnplaWNoZW4gZHVyY2ggQVNDSUkgZXJzZXR6ZW4K +ICAgIHNhbml0aXplRmlsZW5hbWUobmFtZSkgewogICAgICAgIHJldHVybiBuYW1lCiAgICAgICAg +ICAgIC5yZXBsYWNlKC/DpC9nLCAnYWUnKS5yZXBsYWNlKC/DhC9nLCAnQWUnKQogICAgICAgICAg +ICAucmVwbGFjZSgvw7YvZywgJ29lJykucmVwbGFjZSgvw5YvZywgJ09lJykKICAgICAgICAgICAg +LnJlcGxhY2UoL8O8L2csICd1ZScpLnJlcGxhY2UoL8OcL2csICdVZScpCiAgICAgICAgICAgIC5y +ZXBsYWNlKC/Dny9nLCAnc3MnKQogICAgICAgICAgICAucmVwbGFjZSgvW15cdy5cLV0vZywgJ18n +KQogICAgICAgICAgICAucmVwbGFjZSgvXysvZywgJ18nKTsKICAgIH0sCgogICAgYXN5bmMgdXBs +b2FkTWVkaWEoZG9jSWQsIGZpbGUsIG9uUHJvZ3Jlc3MpIHsKICAgICAgICBjb25zdCBzYWZlTmFt +ZSA9IHRoaXMuc2FuaXRpemVGaWxlbmFtZShmaWxlLm5hbWUpOwogICAgICAgIGNvbnN0IHJlbFBh +dGggPSAnbWVkaWEvJyArIGRvY0lkICsgJy8nICsgc2FmZU5hbWU7CgogICAgICAgIGlmICh0aGlz +Lm1vZGUgPT09ICdzZXJ2ZXInKSB7CiAgICAgICAgICAgIC8vIFhNTEh0dHBSZXF1ZXN0IHN0YXR0 +IGZldGNoOiBFcm1vZWdsaWNodCBVcGxvYWQtRm9ydHNjaHJpdHRzYW56ZWlnZQogICAgICAgICAg +ICAvLyB2aWEgeGhyLnVwbG9hZC5vbnByb2dyZXNzIChmZXRjaCB1bnRlcnN0dWV0enQga2VpbiBV +cGxvYWQtUHJvZ3Jlc3MpCiAgICAgICAgICAgIGNvbnN0IGZvcm1EYXRhID0gbmV3IEZvcm1EYXRh +KCk7CiAgICAgICAgICAgIGZvcm1EYXRhLmFwcGVuZCgnZmlsZScsIGZpbGUpOwogICAgICAgICAg +ICBjb25zdCB1cmwgPSAnL2FwaS91cGxvYWQ/cGF0aD0nICsgZW5jb2RlVVJJQ29tcG9uZW50KHJl +bFBhdGgpOwoKICAgICAgICAgICAgYXdhaXQgbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwg +cmVqZWN0KSB7CiAgICAgICAgICAgICAgICB2YXIgeGhyID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7 +CiAgICAgICAgICAgICAgICB4aHIub3BlbignUE9TVCcsIHVybCk7CiAgICAgICAgICAgICAgICBp +ZiAob25Qcm9ncmVzcykgewogICAgICAgICAgICAgICAgICAgIHhoci51cGxvYWQub25wcm9ncmVz +cyA9IGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUubGVuZ3RoQ29t +cHV0YWJsZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgb25Qcm9ncmVzcyhNYXRoLnJv +dW5kKChlLmxvYWRlZCAvIGUudG90YWwpICogMTAwKSwgZS5sb2FkZWQsIGUudG90YWwpOwogICAg +ICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAg +ICAgIH0KICAgICAgICAgICAgICAgIHhoci5vbmxvYWQgPSBmdW5jdGlvbigpIHsKICAgICAgICAg +ICAgICAgICAgICBpZiAoeGhyLnN0YXR1cyA+PSAyMDAgJiYgeGhyLnN0YXR1cyA8IDMwMCkgewog +ICAgICAgICAgICAgICAgICAgICAgICBpZiAob25Qcm9ncmVzcykgb25Qcm9ncmVzcygxMDAsIGZp +bGUuc2l6ZSwgZmlsZS5zaXplKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpOwog +ICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBl +cnIgPSB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsgZXJyID0gSlNPTi5wYXJzZSh4 +aHIucmVzcG9uc2VUZXh0KTsgfSBjYXRjaChleCkge30KICAgICAgICAgICAgICAgICAgICAgICAg +cmVqZWN0KG5ldyBFcnJvcihlcnIuZXJyb3IgfHwgJ1VwbG9hZCBmZWhsZ2VzY2hsYWdlbiAoSFRU +UCAnICsgeGhyLnN0YXR1cyArICcpJykpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAg +ICAgICAgIH07CiAgICAgICAgICAgICAgICB4aHIub25lcnJvciA9IGZ1bmN0aW9uKCkgewogICAg +ICAgICAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoJ1NlcnZlciBuaWNodCBlcnJlaWNoYmFy +LiBMYWV1ZnQgZGVyIFNlcnZlciBub2NoPycpKTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAg +ICAgICAgICB4aHIuc2VuZChmb3JtRGF0YSk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0gZWxz +ZSB7CiAgICAgICAgICAgIGNvbnN0IGRvY01lZGlhRGlyID0gYXdhaXQgdGhpcy5fbWVkaWFIYW5k +bGUuZ2V0RGlyZWN0b3J5SGFuZGxlKGRvY0lkLCB7IGNyZWF0ZTogdHJ1ZSB9KTsKICAgICAgICAg +ICAgY29uc3QgZmggPSBhd2FpdCBkb2NNZWRpYURpci5nZXRGaWxlSGFuZGxlKHNhZmVOYW1lLCB7 +IGNyZWF0ZTogdHJ1ZSB9KTsKICAgICAgICAgICAgY29uc3Qgd3JpdGFibGUgPSBhd2FpdCBmaC5j +cmVhdGVXcml0YWJsZSgpOwogICAgICAgICAgICBhd2FpdCB3cml0YWJsZS53cml0ZShmaWxlKTsK +ICAgICAgICAgICAgYXdhaXQgd3JpdGFibGUuY2xvc2UoKTsKICAgICAgICAgICAgaWYgKG9uUHJv +Z3Jlc3MpIG9uUHJvZ3Jlc3MoMTAwLCBmaWxlLnNpemUsIGZpbGUuc2l6ZSk7CiAgICAgICAgfQoK +ICAgICAgICByZXR1cm4gcmVsUGF0aDsKICAgIH0sCgogICAgLy8gPT09PT09PT09PT09PT09PT09 +PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgIC8vIFVJ +CiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 +PT09PT09PT09PT09PT09PQoKICAgIHVwZGF0ZUNvbm5lY3Rpb25VSSgpIHsKICAgICAgICBjb25z +dCBiYXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29ubmVjdGlvbkJhcicpOwogICAgICAg +IGNvbnN0IGRvdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdGF0dXNEb3QnKTsKICAgICAg +ICBjb25zdCB0ZXh0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Nvbm5lY3Rpb25UZXh0Jyk7 +CiAgICAgICAgY29uc3Qgc2VhcmNoID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlYXJjaElu +cHV0Jyk7CiAgICAgICAgY29uc3QgYnRuTmV3ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2J0 +bk5ld0RvYycpOwogICAgICAgIGNvbnN0IGJ0blJlY29ubmVjdCA9IGRvY3VtZW50LmdldEVsZW1l +bnRCeUlkKCdidG5SZWNvbm5lY3QnKTsKICAgICAgICBjb25zdCBidG5TZXJ2ZXIgPSBkb2N1bWVu +dC5nZXRFbGVtZW50QnlJZCgnYnRuQWN0aXZhdGVTZXJ2ZXInKTsKCiAgICAgICAgaWYgKHRoaXMu +Y29ubmVjdGVkKSB7CiAgICAgICAgICAgIGJhci5zdHlsZS5kaXNwbGF5ID0gJyc7CiAgICAgICAg +ICAgIGRvdC5jbGFzc0xpc3QucmVtb3ZlKCdjb25uZWN0ZWQnLCAncmVhZG9ubHknKTsKICAgICAg +ICAgICAgaWYgKHRoaXMucmVhZE9ubHkpIHsKICAgICAgICAgICAgICAgIGRvdC5jbGFzc0xpc3Qu +YWRkKCdyZWFkb25seScpOwogICAgICAgICAgICAgICAgY29uc3QgbW9kZVByZWZpeCA9IHRoaXMu +bW9kZSA9PT0gJ3N0YXRpYycgPyAnTGVzZW1vZHVzJyA6ICdOdXIgTGVzZW4nOwogICAgICAgICAg +ICAgICAgY29uc3QgdXNlclN0ciA9ICh0aGlzLmVudmlyb24gJiYgdGhpcy5tb2RlICE9PSAnc3Rh +dGljJykgPyAnIHwgJyArIHRoaXMuZW52aXJvbi51c2VybmFtZSA6ICcnOwogICAgICAgICAgICAg +ICAgdGV4dC50ZXh0Q29udGVudCA9IG1vZGVQcmVmaXggKyAnICgnICsgdGhpcy5kb2N1bWVudHMu +bGVuZ3RoICsgJyBEb2t1bWVudGUpJyArIHVzZXJTdHI7CiAgICAgICAgICAgICAgICBidG5OZXcu +ZGlzYWJsZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgYnRuTmV3LnN0eWxlLmRpc3BsYXkgPSAo +dGhpcy5tb2RlID09PSAnc3RhdGljJykgPyAnbm9uZScgOiAnJzsKICAgICAgICAgICAgICAgIGJ0 +bk5ldy50aXRsZSA9ICdTZXJ2ZXIgc3RhcnRlbiBmw7xyIEJlYXJiZWl0dW5nJzsKICAgICAgICAg +ICAgICAgIGJ0blNlcnZlci5zdHlsZS5kaXNwbGF5ID0gKHRoaXMubW9kZSA9PT0gJ3N0YXRpYycp +ID8gJ25vbmUnIDogJyc7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBkb3Qu +Y2xhc3NMaXN0LmFkZCgnY29ubmVjdGVkJyk7CiAgICAgICAgICAgICAgICBjb25zdCB1c2VyU3Ry +ID0gdGhpcy5lbnZpcm9uID8gJyB8IEJlbnV0emVyOiAnICsgdGhpcy5lbnZpcm9uLnVzZXJuYW1l +IDogJyc7CiAgICAgICAgICAgICAgICBjb25zdCBtb2RlU3RyID0gdGhpcy5tb2RlID09PSAnc2Vy +dmVyJyA/ICdTZXJ2ZXInIDogJ0xva2FsIChWb2xsenVncmlmZiknOwogICAgICAgICAgICAgICAg +dGV4dC50ZXh0Q29udGVudCA9IG1vZGVTdHIgKyAnICgnICsgdGhpcy5kb2N1bWVudHMubGVuZ3Ro +ICsgJyBEb2t1bWVudGUpJyArIHVzZXJTdHI7CiAgICAgICAgICAgICAgICBidG5OZXcuZGlzYWJs +ZWQgPSBmYWxzZTsKICAgICAgICAgICAgICAgIGJ0bk5ldy5zdHlsZS5kaXNwbGF5ID0gJyc7CiAg +ICAgICAgICAgICAgICBidG5OZXcudGl0bGUgPSAnJzsKICAgICAgICAgICAgICAgIGJ0blNlcnZl +ci5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHNlYXJj +aC5kaXNhYmxlZCA9IGZhbHNlOwogICAgICAgICAgICBidG5SZWNvbm5lY3Quc3R5bGUuZGlzcGxh +eSA9ICh0aGlzLm1vZGUgPT09ICdmaWxlc3lzdGVtJykgPyAnJyA6ICdub25lJzsKICAgICAgICAg +ICAgLy8gTGVzZW1vZHVzLUJhZGdlIGltIEZvb3RlcgogICAgICAgICAgICB2YXIgcmVhZEJhZGdl +ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Zvb3RlclJlYWRNb2RlJyk7CiAgICAgICAgICAg +IGlmIChyZWFkQmFkZ2UpIHJlYWRCYWRnZS5zdHlsZS5kaXNwbGF5ID0gdGhpcy5yZWFkT25seSA/ +ICcnIDogJ25vbmUnOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGJhci5zdHlsZS5kaXNw +bGF5ID0gJ25vbmUnOwogICAgICAgICAgICBkb3QuY2xhc3NMaXN0LnJlbW92ZSgnY29ubmVjdGVk +JywgJ3JlYWRvbmx5Jyk7CiAgICAgICAgICAgIHNlYXJjaC5kaXNhYmxlZCA9IHRydWU7CiAgICAg +ICAgICAgIGJ0bk5ldy5kaXNhYmxlZCA9IHRydWU7CiAgICAgICAgICAgIGJ0bk5ldy5zdHlsZS5k +aXNwbGF5ID0gJ25vbmUnOwogICAgICAgICAgICBidG5SZWNvbm5lY3Quc3R5bGUuZGlzcGxheSA9 +ICdub25lJzsKICAgICAgICAgICAgYnRuU2VydmVyLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7CiAg +ICAgICAgfQogICAgfSwKCiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 +PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgLy8gU1lOQyAocGVyaW9kaXNjaCBw +cnVlZmVuIG9iIGFuZGVyZSBVc2VyIGV0d2FzIGdlYWVuZGVydCBoYWJlbikKICAgIC8vID09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 -PT09PQpjb25zdCBEcml2ZVBvcnRhbCA9IHsKICAgIGZpbHRlcmVkRG9jdW1lbnRzOiBbXSwKICAg -IHNlbGVjdGVkRG9jSWQ6IG51bGwsCiAgICBjdXJyZW50Q2F0ZWdvcnlGaWx0ZXI6ICdhbGwnLAog -ICAgY3VycmVudFN0YXR1c0ZpbHRlcjogJ2FsbCcsCiAgICB0YWJsZVZpZXdBY3RpdmU6IGZhbHNl -LAogICAgX3RhYmxlU29ydENvbDogJ2Vyc3RlbGx0JywKICAgIF90YWJsZVNvcnREaXI6ICdkZXNj -JywKCiAgICBhc3luYyBpbml0KCkgewogICAgICAgIC8vIFN0YXJ0c2VpdGVuLUhUTUw6IHdpcmQg -aW5pdGlhbCBhdXMgZGVtIERPTSBnZWxlc2VuLCBzcGFldGVyIHZvbgogICAgICAgIC8vIGxvYWRT -dGFydHNlaXRlKCkvc2F2ZVN0YXJ0c2VpdGUoKSBtaXQgZGVtIGdlc3BlaWNoZXJ0ZW4gSW5oYWx0 -IHVlYmVyc2NocmllYmVuLgogICAgICAgIHRoaXMuX3dlbGNvbWVIVE1MID0gZG9jdW1lbnQuZ2V0 -RWxlbWVudEJ5SWQoJ2RvY3VtZW50RGV0YWlsJykuaW5uZXJIVE1MOwogICAgICAgIHRoaXMuc2V0 -dXBGaWx0ZXJzKCk7CiAgICAgICAgdGhpcy5zZXR1cEV2ZW50TGlzdGVuZXJzKCk7CiAgICAgICAg -YXdhaXQgdGhpcy5sb2FkTG9ja3MoKTsKICAgICAgICB0aGlzLnJlbmRlcigpOwogICAgfSwKCiAg -ICBzZXR1cEZpbHRlcnMoKSB7CiAgICAgICAgY29uc3QgY2F0Q29udGFpbmVyID0gZG9jdW1lbnQu -Z2V0RWxlbWVudEJ5SWQoJ2NhdGVnb3J5RmlsdGVycycpOwogICAgICAgIGNhdENvbnRhaW5lci5p -bm5lckhUTUwgPSAnJzsKCiAgICAgICAgLy8gIkFsbGUiIEJ1dHRvbgogICAgICAgIGNvbnN0IGFs -bEJ0biA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2J1dHRvbicpOwogICAgICAgIGFsbEJ0bi5j -bGFzc05hbWUgPSAnZmlsdGVyLWJ0biBhY3RpdmUnOwogICAgICAgIGFsbEJ0bi5zZXRBdHRyaWJ1 -dGUoJ2RhdGEtZmlsdGVyJywgJ2FsbCcpOwogICAgICAgIGFsbEJ0bi50ZXh0Q29udGVudCA9ICdB -bGxlJzsKICAgICAgICBhbGxCdG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB0aGlz -LnNldENhdGVnb3J5KCdhbGwnKSk7CiAgICAgICAgY2F0Q29udGFpbmVyLmFwcGVuZENoaWxkKGFs -bEJ0bik7CgogICAgICAgIC8vIEthdGVnb3JpZS1CdXR0b25zIChhbHBoYWJldGlzY2ggc29ydGll -cnQsIGF1c2dlYmxlbmRldGUgdWViZXJzcHJpbmdlbikKICAgICAgICB2YXIgaGlkZGVuS2F0cyA9 -IERyaXZlRlMuY29uZmlnLmhpZGRlbkthdGVnb3JpZW4gfHwgW107CiAgICAgICAgKERyaXZlRlMu -Y29uZmlnLmthdGVnb3JpZW4gfHwgW10pLnNsaWNlKCkuc29ydChmdW5jdGlvbihhLGIpeyByZXR1 -cm4gYS5sb2NhbGVDb21wYXJlKGIsICdkZScpOyB9KS5mb3JFYWNoKGthdCA9PiB7CiAgICAgICAg -ICAgIGlmIChoaWRkZW5LYXRzLmluY2x1ZGVzKGthdCkpIHJldHVybjsKICAgICAgICAgICAgY29u -c3QgYnRuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYnV0dG9uJyk7CiAgICAgICAgICAgIGJ0 -bi5jbGFzc05hbWUgPSAnZmlsdGVyLWJ0bic7CiAgICAgICAgICAgIGJ0bi5zZXRBdHRyaWJ1dGUo -J2RhdGEtZmlsdGVyJywga2F0KTsKICAgICAgICAgICAgYnRuLnRleHRDb250ZW50ID0ga2F0Owog -ICAgICAgICAgICBidG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB0aGlzLnNldENh -dGVnb3J5KGthdCkpOwogICAgICAgICAgICBjYXRDb250YWluZXIuYXBwZW5kQ2hpbGQoYnRuKTsK -ICAgICAgICB9KTsKCiAgICAgICAgLy8gU3RhdHVzLUZpbHRlciAoaW0gTGVzZW1vZHVzIGF1c2Js -ZW5kZW4g4oCTIGVzIGdpYnQgbnVyIGZyZWlnZWdlYmVuZSBEb2t1bWVudGUpCiAgICAgICAgY29u -c3Qgc3RhdHVzQ29udGFpbmVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N0YXR1c0ZpbHRl -cnMnKTsKICAgICAgICBzdGF0dXNDb250YWluZXIuaW5uZXJIVE1MID0gJyc7CgogICAgICAgIGlm -IChEcml2ZUZTLm1vZGUgPT09ICdzdGF0aWMnKSB7CiAgICAgICAgICAgIC8vIExlc2Vtb2R1czog -S2VpbmUgU3RhdHVzLUZpbHRlciBub2V0aWcKICAgICAgICAgICAgc3RhdHVzQ29udGFpbmVyLnN0 -eWxlLmRpc3BsYXkgPSAnbm9uZSc7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgc3RhdHVz -Q29udGFpbmVyLnN0eWxlLmRpc3BsYXkgPSAnJzsKICAgICAgICAgICAgY29uc3QgYWxsU3RhdHVz -QnRuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYnV0dG9uJyk7CiAgICAgICAgICAgIGFsbFN0 -YXR1c0J0bi5jbGFzc05hbWUgPSAnc3RhdHVzLWZpbHRlci1idG4gYWN0aXZlJzsKICAgICAgICAg -ICAgYWxsU3RhdHVzQnRuLnNldEF0dHJpYnV0ZSgnZGF0YS1zdGF0dXMnLCAnYWxsJyk7CiAgICAg -ICAgICAgIGFsbFN0YXR1c0J0bi50ZXh0Q29udGVudCA9ICdBbGxlIFN0YXR1cyc7CiAgICAgICAg -ICAgIGFsbFN0YXR1c0J0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHRoaXMuc2V0 -U3RhdHVzKCdhbGwnKSk7CiAgICAgICAgICAgIHN0YXR1c0NvbnRhaW5lci5hcHBlbmRDaGlsZChh -bGxTdGF0dXNCdG4pOwoKICAgICAgICAgICAgY29uc3QgaXNTVSA9IERyaXZlR292ZXJuYW5jZS5p -c1N1cGVyVXNlcigpOwogICAgICAgICAgICBjb25zdCBpc0ZBID0gRHJpdmVHb3Zlcm5hbmNlLmlz -RmFjaGF1ZnNpY2h0KCk7CiAgICAgICAgICAgIGNvbnN0IHN0YXR1c0NvbmZpZyA9IERyaXZlRlMu -Y29uZmlnLnN0YXR1cyB8fCB7fTsKICAgICAgICAgICAgT2JqZWN0LmtleXMoc3RhdHVzQ29uZmln -KS5mb3JFYWNoKHN0YXR1cyA9PiB7CiAgICAgICAgICAgICAgICAvLyAiQWJnZWxlaG50IiBudXIg -ZnVlciBTdXBlclVzZXIgdW5kIEZhY2hhdWZzaWNodAogICAgICAgICAgICAgICAgaWYgKHN0YXR1 -cyA9PT0gJ0FiZ2VsZWhudCcgJiYgIWlzU1UgJiYgIWlzRkEpIHJldHVybjsKICAgICAgICAgICAg -ICAgIGNvbnN0IGNmZyA9IHN0YXR1c0NvbmZpZ1tzdGF0dXNdOwogICAgICAgICAgICAgICAgY29u -c3QgYnRuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYnV0dG9uJyk7CiAgICAgICAgICAgICAg -ICBidG4uY2xhc3NOYW1lID0gJ3N0YXR1cy1maWx0ZXItYnRuJzsKICAgICAgICAgICAgICAgIGJ0 -bi5zZXRBdHRyaWJ1dGUoJ2RhdGEtc3RhdHVzJywgc3RhdHVzKTsKICAgICAgICAgICAgICAgIGJ0 -bi5pbm5lckhUTUwgPSBjZmcubGFiZWw7CiAgICAgICAgICAgICAgICBidG4uc3R5bGUuYm9yZGVy -Q29sb3IgPSBjZmcuY29sb3I7CiAgICAgICAgICAgICAgICBidG4uYWRkRXZlbnRMaXN0ZW5lcign -Y2xpY2snLCAoKSA9PiB0aGlzLnNldFN0YXR1cyhzdGF0dXMpKTsKICAgICAgICAgICAgICAgIHN0 -YXR1c0NvbnRhaW5lci5hcHBlbmRDaGlsZChidG4pOwogICAgICAgICAgICB9KTsKICAgICAgICB9 -CiAgICB9LAoKICAgIHNldHVwRXZlbnRMaXN0ZW5lcnMoKSB7CiAgICAgICAgZG9jdW1lbnQuZ2V0 -RWxlbWVudEJ5SWQoJ3NlYXJjaElucHV0JykuYWRkRXZlbnRMaXN0ZW5lcigna2V5dXAnLCAoKSA9 -PiB0aGlzLnJlbmRlcigpKTsKICAgIH0sCgogICAgc2V0Q2F0ZWdvcnkoY2F0KSB7CiAgICAgICAg -dGhpcy5jdXJyZW50Q2F0ZWdvcnlGaWx0ZXIgPSBjYXQ7CiAgICAgICAgZG9jdW1lbnQucXVlcnlT -ZWxlY3RvckFsbCgnI2NhdGVnb3J5RmlsdGVycyAuZmlsdGVyLWJ0bicpLmZvckVhY2goYnRuID0+ -IHsKICAgICAgICAgICAgYnRuLmNsYXNzTGlzdC50b2dnbGUoJ2FjdGl2ZScsIGJ0bi5nZXRBdHRy -aWJ1dGUoJ2RhdGEtZmlsdGVyJykgPT09IGNhdCk7CiAgICAgICAgfSk7CiAgICAgICAgdGhpcy5y -ZW5kZXIoKTsKICAgIH0sCgogICAgc2V0U3RhdHVzKHN0YXR1cykgewogICAgICAgIHRoaXMuY3Vy -cmVudFN0YXR1c0ZpbHRlciA9IHN0YXR1czsKICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9y -QWxsKCcjc3RhdHVzRmlsdGVycyAuc3RhdHVzLWZpbHRlci1idG4nKS5mb3JFYWNoKGJ0biA9PiB7 -CiAgICAgICAgICAgIGJ0bi5jbGFzc0xpc3QudG9nZ2xlKCdhY3RpdmUnLCBidG4uZ2V0QXR0cmli -dXRlKCdkYXRhLXN0YXR1cycpID09PSBzdGF0dXMpOwogICAgICAgIH0pOwogICAgICAgIHRoaXMu -cmVuZGVyKCk7CiAgICB9LAoKICAgIHJlbmRlcigpIHsKICAgICAgICBjb25zdCBzZWFyY2ggPSAo -ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlYXJjaElucHV0JykudmFsdWUgfHwgJycpLnRvTG93 -ZXJDYXNlKCk7CgogICAgICAgIHRoaXMuZmlsdGVyZWREb2N1bWVudHMgPSBEcml2ZUZTLmRvY3Vt -ZW50cy5maWx0ZXIoZG9jID0+IHsKICAgICAgICAgICAgLy8gR292ZXJuYW5jZTogU2ljaHRiYXJr -ZWl0c3BydWVmdW5nCiAgICAgICAgICAgIGlmICghRHJpdmVHb3Zlcm5hbmNlLmNhblNlZURvY3Vt -ZW50KGRvYykpIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgaWYgKHRoaXMuY3VycmVudENhdGVn -b3J5RmlsdGVyICE9PSAnYWxsJyAmJiBkb2Mua2F0ZWdvcmllICE9PSB0aGlzLmN1cnJlbnRDYXRl -Z29yeUZpbHRlcikgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICBpZiAodGhpcy5jdXJyZW50U3Rh -dHVzRmlsdGVyICE9PSAnYWxsJyAmJiBkb2Muc3RhdHVzICE9PSB0aGlzLmN1cnJlbnRTdGF0dXNG -aWx0ZXIpIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgaWYgKHNlYXJjaCkgewogICAgICAgICAg -ICAgICAgY29uc3QgbWF0Y2ggPSAoZG9jLnRpdGVsIHx8ICcnKS50b0xvd2VyQ2FzZSgpLmluY2x1 -ZGVzKHNlYXJjaCkgfHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRvYy5pbmhhbHQg -fHwgJycpLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoc2VhcmNoKSB8fAogICAgICAgICAgICAgICAg -ICAgICAgICAgICAgICAoZG9jLmthdGVnb3JpZSB8fCAnJykudG9Mb3dlckNhc2UoKS5pbmNsdWRl -cyhzZWFyY2gpIHx8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkb2Muc2NobGFnd29l -cnRlciB8fCBbXSkuc29tZShrID0+IGsudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhzZWFyY2gpKTsK -ICAgICAgICAgICAgICAgIGlmICghbWF0Y2gpIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQog -ICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9KTsKCiAgICAgICAgdGhpcy5yZW5kZXJM -aXN0KCk7CiAgICAgICAgaWYgKHRoaXMudGFibGVWaWV3QWN0aXZlKSB0aGlzLnJlbmRlclRhYmxl -VmlldygpOwogICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkb2NDb3VudCcpLnRleHRD -b250ZW50ID0gdGhpcy5maWx0ZXJlZERvY3VtZW50cy5sZW5ndGggKyAnIC8gJyArIERyaXZlRlMu -ZG9jdW1lbnRzLmxlbmd0aDsKCiAgICAgICAgLy8gVXBkYXRlIGNvbm5lY3Rpb24gdGV4dAogICAg -ICAgIERyaXZlRlMudXBkYXRlQ29ubmVjdGlvblVJKHRydWUpOwogICAgfSwKCiAgICBhY3RpdmVM -b2Nrczoge30sICAvLyBkb2NJZCAtPiB7IHVzZXJuYW1lLCBtaW51dGVzIH0KCiAgICBhc3luYyBs -b2FkTG9ja3MoKSB7CiAgICAgICAgaWYgKERyaXZlRlMubW9kZSAhPT0gJ3NlcnZlcicpIHJldHVy -bjsKICAgICAgICB0cnkgewogICAgICAgICAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaCgnL2Fw -aS9sb2NrcycpOwogICAgICAgICAgICBpZiAocmVzLm9rKSB7CiAgICAgICAgICAgICAgICBjb25z -dCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTsKICAgICAgICAgICAgICAgIHRoaXMuYWN0aXZlTG9j -a3MgPSB7fTsKICAgICAgICAgICAgICAgIChkYXRhLmxvY2tzIHx8IFtdKS5mb3JFYWNoKGwgPT4g -ewogICAgICAgICAgICAgICAgICAgIHRoaXMuYWN0aXZlTG9ja3NbbC5kb2NJZF0gPSB7IHVzZXJu -YW1lOiBsLnVzZXJuYW1lLCBtaW51dGVzOiBsLm1pbnV0ZXMgfTsKICAgICAgICAgICAgICAgIH0p -OwogICAgICAgICAgICB9CiAgICAgICAgfSBjYXRjaCB7fQogICAgfSwKCiAgICBfc29ydFdpdGhD -aGlsZHJlbihkb2NzKSB7CiAgICAgICAgLy8gU29ydGllcmU6IEVsdGVybmFydGlrZWwgenVlcnN0 -LCBLaW5kZXIgZGlyZWt0IGRhaGludGVyCiAgICAgICAgY29uc3QgdG9wTGV2ZWwgPSBkb2NzLmZp -bHRlcihmdW5jdGlvbihkKXsgcmV0dXJuICFkLnBhcmVudElkOyB9KTsKICAgICAgICBjb25zdCBj -aGlsZE1hcCA9IHt9OwogICAgICAgIGRvY3MuZmlsdGVyKGZ1bmN0aW9uKGQpeyByZXR1cm4gZC5w -YXJlbnRJZDsgfSkuZm9yRWFjaChmdW5jdGlvbihkKXsKICAgICAgICAgICAgaWYgKCFjaGlsZE1h -cFtkLnBhcmVudElkXSkgY2hpbGRNYXBbZC5wYXJlbnRJZF0gPSBbXTsKICAgICAgICAgICAgY2hp -bGRNYXBbZC5wYXJlbnRJZF0ucHVzaChkKTsKICAgICAgICB9KTsKICAgICAgICB2YXIgcmVzdWx0 -ID0gW107CiAgICAgICAgdG9wTGV2ZWwuZm9yRWFjaChmdW5jdGlvbihwKXsKICAgICAgICAgICAg -cmVzdWx0LnB1c2gocCk7CiAgICAgICAgICAgIGlmIChjaGlsZE1hcFtwLmlkXSkgY2hpbGRNYXBb -cC5pZF0uZm9yRWFjaChmdW5jdGlvbihjKXsgcmVzdWx0LnB1c2goYyk7IH0pOwogICAgICAgIH0p -OwogICAgICAgIC8vIFdhaXNlbi1LaW5kZXIgKEVsdGVybiBuaWNodCBpbiBkZXIgZ2VmaWx0ZXJ0 -ZW4gTGlzdGUpCiAgICAgICAgZG9jcy5maWx0ZXIoZnVuY3Rpb24oZCl7IHJldHVybiBkLnBhcmVu -dElkICYmICF0b3BMZXZlbC5maW5kKGZ1bmN0aW9uKHQpe3JldHVybiB0LmlkPT09ZC5wYXJlbnRJ -ZDt9KTsgfSkuZm9yRWFjaChmdW5jdGlvbihkKXsKICAgICAgICAgICAgaWYgKHJlc3VsdC5pbmRl -eE9mKGQpID09PSAtMSkgcmVzdWx0LnB1c2goZCk7CiAgICAgICAgfSk7CiAgICAgICAgcmV0dXJu -IHJlc3VsdDsKICAgIH0sCgogICAgcmVuZGVyTGlzdCgpIHsKICAgICAgICBjb25zdCBsaXN0Q29u -dGFpbmVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RvY3VtZW50TGlzdCcpOwogICAgICAg -IGNvbnN0IHN0YXR1c0NvbmZpZyA9IERyaXZlRlMuY29uZmlnLnN0YXR1cyB8fCB7fTsKCiAgICAg -ICAgaWYgKHRoaXMuZmlsdGVyZWREb2N1bWVudHMubGVuZ3RoID09PSAwKSB7CiAgICAgICAgICAg -IGxpc3RDb250YWluZXIuaW5uZXJIVE1MID0gJzxkaXYgY2xhc3M9ImVtcHR5LXN0YXRlIj48cD5L -ZWluZSBEb2t1bWVudGUgZ2VmdW5kZW4uPC9wPjwvZGl2Pic7CiAgICAgICAgICAgIHJldHVybjsK -ICAgICAgICB9CgogICAgICAgIGNvbnN0IHNvcnRlZCA9IHRoaXMuX3NvcnRXaXRoQ2hpbGRyZW4o -dGhpcy5maWx0ZXJlZERvY3VtZW50cyk7CiAgICAgICAgbGlzdENvbnRhaW5lci5pbm5lckhUTUwg -PSBzb3J0ZWQubWFwKGRvYyA9PiB7CiAgICAgICAgICAgIGNvbnN0IGNmZyA9IHN0YXR1c0NvbmZp -Z1tkb2Muc3RhdHVzXSB8fCB7IGNvbG9yOiAnI2VlZScsIHRleHRDb2xvcjogJyMzMzMnLCBpY29u -OiAnJyB9OwogICAgICAgICAgICBjb25zdCBpc0FjdGl2ZSA9IHRoaXMuc2VsZWN0ZWREb2NJZCA9 -PT0gZG9jLmlkOwogICAgICAgICAgICBjb25zdCBpc0RyYWZ0ID0gZG9jLnN0YXR1cyA9PT0gJ0Vu -dHd1cmYnOwogICAgICAgICAgICBjb25zdCBoYXNNZWRpYSA9IGRvYy5tZWRpYXMgJiYgZG9jLm1l -ZGlhcy5sZW5ndGggPiAwOwogICAgICAgICAgICBjb25zdCBsb2NrID0gdGhpcy5hY3RpdmVMb2Nr -c1tkb2MuaWRdOwogICAgICAgICAgICBjb25zdCBpc0xvY2tlZCA9IGxvY2sgJiYgbG9jay51c2Vy -bmFtZSAhPT0gKERyaXZlRlMuZW52aXJvbiA/IERyaXZlRlMuZW52aXJvbi51c2VybmFtZSA6ICcn -KTsKCiAgICAgICAgICAgIC8vIFN0YXR1cy1CYWRnZTogIkZyZWlnZWdlYmVuIiBuaWNodCBhbnpl -aWdlbiAoaXN0IGRlciBOb3JtYWx6dXN0YW5kKQogICAgICAgICAgICB2YXIgc2hvd1N0YXR1cyA9 -IGRvYy5zdGF0dXMgIT09ICdGcmVpZ2VnZWJlbic7CgogICAgICAgICAgICByZXR1cm4gJzxkaXYg -Y2xhc3M9ImRvY3VtZW50LWl0ZW0nICsgKGlzQWN0aXZlID8gJyBhY3RpdmUnIDogJycpICsgKGlz -RHJhZnQgPyAnIGRyYWZ0JyA6ICcnKSArIChkb2MucGFyZW50SWQgPyAnIGNoaWxkLWFydGljbGUn -IDogJycpICsgJyIgb25jbGljaz0iRHJpdmVQb3J0YWwuc2VsZWN0RG9jdW1lbnQoXCcnICsgRHJp -dmVQb3J0YWwuZXNjYXBlQXR0cihkb2MuaWQpICsgJ1wnKSI+JyArCiAgICAgICAgICAgICAgICAn -PGRpdiBzdHlsZT0iZGlzcGxheTpmbGV4O2p1c3RpZnktY29udGVudDpzcGFjZS1iZXR3ZWVuO2Fs -aWduLWl0ZW1zOmZsZXgtc3RhcnQ7Ij4nICsKICAgICAgICAgICAgICAgICAgICAnPGRpdiBzdHls -ZT0iZmxleDoxO21pbi13aWR0aDowOyI+JyArCiAgICAgICAgICAgICAgICAgICAgICAgICc8ZGl2 -IGNsYXNzPSJkb2MtaXRlbS10aXRsZSI+JyArIHRoaXMuZXNjYXBlSFRNTChkb2MudGl0ZWwpICsK -ICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpc0xvY2tlZCA/ICcgPHNwYW4gc3R5bGU9ImZv -bnQtc2l6ZToxMXB4OyBjb2xvcjojZGMzNTQ1OyBmb250LXdlaWdodDo0MDA7IiB0aXRsZT0iV2ly -ZCBiZWFyYmVpdGV0IHZvbiAnICsgdGhpcy5lc2NhcGVBdHRyKGxvY2sudXNlcm5hbWUpICsgJyI+ -W2dlc3BlcnJ0OiAnICsgdGhpcy5lc2NhcGVIVE1MKGxvY2sudXNlcm5hbWUpICsgJ108L3NwYW4+ -JyA6ICcnKSArCiAgICAgICAgICAgICAgICAgICAgICAgICc8L2Rpdj4nICsKICAgICAgICAgICAg -ICAgICAgICAgICAgJzxkaXYgY2xhc3M9ImRvYy1pdGVtLW1ldGEiPicgKwogICAgICAgICAgICAg -ICAgICAgICAgICAgICAgJzxkaXYgY2xhc3M9ImRvYy1pdGVtLWNhdGVnb3J5Ij4nICsgdGhpcy5l -c2NhcGVIVE1MKGRvYy5rYXRlZ29yaWUpICsgJzwvZGl2PicgKwogICAgICAgICAgICAgICAgICAg -ICAgICAgICAgKGhhc01lZGlhID8gJzxzcGFuIHN0eWxlPSJmb250LXNpemU6MTFweDsgY29sb3I6 -dmFyKC0tdGV4dC1tdXRlZCk7Ij4rTWVkaWVuPC9zcGFuPicgOiAnJykgKwogICAgICAgICAgICAg -ICAgICAgICAgICAnPC9kaXY+JyArCiAgICAgICAgICAgICAgICAgICAgICAgICc8ZGl2IGNsYXNz -PSJkb2MtaXRlbS1kYXRlIj4nICsgZm9ybWF0RGF0ZShkb2MuZXJzdGVsbHQpICsKICAgICAgICAg -ICAgICAgICAgICAgICAgICAgIChkb2MuYmVhcmJlaXRldFZvbiA/ICcgfCAnICsgdGhpcy5lc2Nh -cGVIVE1MKGRvYy5iZWFyYmVpdGV0Vm9uKSA6ICcnKSArCiAgICAgICAgICAgICAgICAgICAgICAg -ICc8L2Rpdj4nICsKICAgICAgICAgICAgICAgICAgICAgICAgKGRvYy5wYXJlbnRJZCA/ICc8ZGl2 -IGNsYXNzPSJkb2MtcGFyZW50LXJlZiI+4oazIFVudGVyYXJ0aWtlbDwvZGl2PicgOiAnJykgKwog -ICAgICAgICAgICAgICAgICAgICc8L2Rpdj4nICsKICAgICAgICAgICAgICAgICAgICAoc2hvd1N0 -YXR1cyA/ICc8ZGl2IGNsYXNzPSJzdGF0dXMtYmFkZ2Utc21hbGwiIHN0eWxlPSJiYWNrZ3JvdW5k -LWNvbG9yOicgKyBjZmcuY29sb3IgKyAnOyBjb2xvcjonICsgY2ZnLnRleHRDb2xvciArICc7Zmxl -eC1zaHJpbms6MDttYXJnaW4tbGVmdDo4cHg7bWFyZ2luLXRvcDoycHg7Ij4nICsgZG9jLnN0YXR1 -cyArICc8L2Rpdj4nIDogJycpICsKICAgICAgICAgICAgICAgICc8L2Rpdj4nICsKICAgICAgICAg -ICAgJzwvZGl2Pic7CiAgICAgICAgfSkuam9pbignJyk7CiAgICB9LAoKICAgIHRvZ2dsZVRhYmxl -VmlldygpIHsKICAgICAgICB0aGlzLnRhYmxlVmlld0FjdGl2ZSA9ICF0aGlzLnRhYmxlVmlld0Fj -dGl2ZTsKICAgICAgICBjb25zdCBjb250YWluZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgn -Y29udGFpbmVyJyk7CiAgICAgICAgY29uc3QgdGFibGVDb250YWluZXIgPSBkb2N1bWVudC5nZXRF -bGVtZW50QnlJZCgndGFibGVWaWV3Q29udGFpbmVyJyk7CiAgICAgICAgY29uc3QgYnRuID0gZG9j -dW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2J0blRhYmxlVmlldycpOwogICAgICAgIGlmICh0aGlzLnRh -YmxlVmlld0FjdGl2ZSkgewogICAgICAgICAgICBjb250YWluZXIuc3R5bGUuZGlzcGxheSA9ICdu -b25lJzsKICAgICAgICAgICAgdGFibGVDb250YWluZXIuY2xhc3NMaXN0LmFkZCgnYWN0aXZlJyk7 -CiAgICAgICAgICAgIGJ0bi5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSAndmFyKC0tdGV4dC1oZWFk -aW5nKSc7IGJ0bi5zdHlsZS5jb2xvciA9ICd3aGl0ZSc7CiAgICAgICAgICAgIHRoaXMucmVuZGVy -VGFibGVWaWV3KCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgY29udGFpbmVyLnN0eWxl -LmRpc3BsYXkgPSAnJzsKICAgICAgICAgICAgdGFibGVDb250YWluZXIuY2xhc3NMaXN0LnJlbW92 -ZSgnYWN0aXZlJyk7CiAgICAgICAgICAgIGJ0bi5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSAnJzsg -YnRuLnN0eWxlLmNvbG9yID0gJyc7CiAgICAgICAgfQogICAgfSwKCiAgICBzb3J0VGFibGUoY29s -KSB7CiAgICAgICAgaWYgKHRoaXMuX3RhYmxlU29ydENvbCA9PT0gY29sKSB7CiAgICAgICAgICAg -IHRoaXMuX3RhYmxlU29ydERpciA9IHRoaXMuX3RhYmxlU29ydERpciA9PT0gJ2FzYycgPyAnZGVz -YycgOiAnYXNjJzsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB0aGlzLl90YWJsZVNvcnRD -b2wgPSBjb2w7CiAgICAgICAgICAgIHRoaXMuX3RhYmxlU29ydERpciA9ICdhc2MnOwogICAgICAg -IH0KICAgICAgICB0aGlzLnJlbmRlclRhYmxlVmlldygpOwogICAgfSwKCiAgICBfdGFibGVTZWxl -Y3RlZDogW10sCgogICAgcmVuZGVyVGFibGVWaWV3KCkgewogICAgICAgIGNvbnN0IGRvY3MgPSB0 -aGlzLmZpbHRlcmVkRG9jdW1lbnRzOwogICAgICAgIGNvbnN0IGNvbCA9IHRoaXMuX3RhYmxlU29y -dENvbDsKICAgICAgICBjb25zdCBkaXIgPSB0aGlzLl90YWJsZVNvcnREaXIgPT09ICdhc2MnID8g -MSA6IC0xOwogICAgICAgIGNvbnN0IHNvcnRlZCA9IFsuLi5kb2NzXS5zb3J0KGZ1bmN0aW9uKGEs -IGIpIHsKICAgICAgICAgICAgdmFyIHZhLCB2YjsKICAgICAgICAgICAgaWYgKGNvbCA9PT0gJ3Nj -aGxhZ3dvZXJ0ZXInKSB7CiAgICAgICAgICAgICAgICB2YSA9IChhLnNjaGxhZ3dvZXJ0ZXIgfHwg -W10pLmpvaW4oJywnKTsgdmIgPSAoYi5zY2hsYWd3b2VydGVyIHx8IFtdKS5qb2luKCcsJyk7CiAg -ICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICB2YSA9IChhW2NvbF0gfHwgJycpOyB2 -YiA9IChiW2NvbF0gfHwgJycpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICh0eXBlb2Yg -dmEgPT09ICdzdHJpbmcnKSByZXR1cm4gdmEubG9jYWxlQ29tcGFyZSh2YiwgJ2RlJykgKiBkaXI7 -CiAgICAgICAgICAgIHJldHVybiAodmEgLSB2YikgKiBkaXI7CiAgICAgICAgfSk7CgogICAgICAg -IGNvbnN0IHNjID0gdGhpcy5fdGFibGVTb3J0Q29sOwogICAgICAgIGNvbnN0IHNkID0gdGhpcy5f -dGFibGVTb3J0RGlyOwogICAgICAgIHZhciBjbHMgPSBmdW5jdGlvbihjKSB7IHJldHVybiBjID09 -PSBzYyA/ICcgY2xhc3M9InNvcnRlZC0nICsgc2QgKyAnIicgOiAnJzsgfTsKICAgICAgICBjb25z -dCBzdGF0dXNDb25maWcgPSBEcml2ZUZTLmNvbmZpZy5zdGF0dXMgfHwge307CiAgICAgICAgLy8g -QWRtaW4tRnVua3Rpb25lbiAoQ2hlY2tib3hlbiwgU3RpZnQpIG51ciB3ZW5uOgogICAgICAgIC8v -IDEuIFNlcnZlci1Nb2R1cyBha3RpdiAoc2VydmVyc2VpdGlnZXIgU2NodXR6IHZvcmhhbmRlbikK -ICAgICAgICAvLyAyLiBHb3Zlcm5hbmNlLURhdGVuIGdlbGFkZW4gVU5EIFVzZXIgaXN0IFNVL0ZB -CiAgICAgICAgdmFyIGhhc0dvdmVybmFuY2UgPSBEcml2ZUdvdmVybmFuY2UuZGF0YSAmJiBEcml2 -ZUdvdmVybmFuY2UuZGF0YS5zdXBlclVzZXJzOwogICAgICAgIHZhciBpc0FkbWluID0gRHJpdmVG -Uy5tb2RlID09PSAnc2VydmVyJyAmJiBoYXNHb3Zlcm5hbmNlICYmIChEcml2ZUdvdmVybmFuY2Uu -aXNTdXBlclVzZXIoKSB8fCBEcml2ZUdvdmVybmFuY2UuaXNGYWNoYXVmc2ljaHQoKSk7CiAgICAg -ICAgdGhpcy5fdGFibGVTZWxlY3RlZCA9IFtdOwoKICAgICAgICAvLyBCdWxrLUFrdGlvbnNsZWlz -dGUgKG51ciBTVS9GQSkKICAgICAgICB2YXIgaHRtbCA9ICcnOwogICAgICAgIGlmIChpc0FkbWlu -KSB7CiAgICAgICAgICAgIGh0bWwgKz0gJzxkaXYgaWQ9InRhYmxlQnVsa0JhciIgc3R5bGU9ImRp -c3BsYXk6bm9uZTtwYWRkaW5nOjhweCAxNHB4O2JhY2tncm91bmQ6dmFyKC0tdGV4dC1oZWFkaW5n -KTtjb2xvcjp3aGl0ZTtib3JkZXItcmFkaXVzOjZweDttYXJnaW4tYm90dG9tOjhweDtkaXNwbGF5 -Om5vbmU7YWxpZ24taXRlbXM6Y2VudGVyO2dhcDoxMHB4O2ZvbnQtc2l6ZToxM3B4OyI+JyArCiAg -ICAgICAgICAgICAgICAnPHNwYW4gaWQ9InRhYmxlQnVsa0NvdW50Ij4wIGF1c2dld8OkaGx0PC9z -cGFuPicgKwogICAgICAgICAgICAgICAgJzxidXR0b24gb25jbGljaz0iRHJpdmVQb3J0YWwuYnVs -a1F1aWNrRWRpdCgpIiBzdHlsZT0icGFkZGluZzo0cHggMTJweDtib3JkZXI6MXB4IHNvbGlkIHdo -aXRlO2JhY2tncm91bmQ6dHJhbnNwYXJlbnQ7Y29sb3I6d2hpdGU7Ym9yZGVyLXJhZGl1czo0cHg7 -Y3Vyc29yOnBvaW50ZXI7Zm9udC1zaXplOjEycHg7Ij5TY2huZWxsYmVhcmJlaXR1bmc8L2J1dHRv -bj4nICsKICAgICAgICAgICAgICAgICc8YnV0dG9uIG9uY2xpY2s9IkRyaXZlUG9ydGFsLmJ1bGtE -ZWxldGUoKSIgc3R5bGU9InBhZGRpbmc6NHB4IDEycHg7Ym9yZGVyOjFweCBzb2xpZCAjZjg4O2Jh -Y2tncm91bmQ6dHJhbnNwYXJlbnQ7Y29sb3I6I2ZhYTtib3JkZXItcmFkaXVzOjRweDtjdXJzb3I6 -cG9pbnRlcjtmb250LXNpemU6MTJweDsiPkzDtnNjaGVuPC9idXR0b24+JyArCiAgICAgICAgICAg -ICc8L2Rpdj4nOwogICAgICAgIH0KCiAgICAgICAgaHRtbCArPSAnPHRhYmxlIGNsYXNzPSJkcml2 -ZS10YWJsZSI+PHRoZWFkPjx0cj4nICsKICAgICAgICAgICAgKGlzQWRtaW4gPyAnPHRoIHN0eWxl -PSJ3aWR0aDozMHB4OyI+PGlucHV0IHR5cGU9ImNoZWNrYm94IiBpZD0idGFibGVTZWxlY3RBbGwi -IG9uY2hhbmdlPSJEcml2ZVBvcnRhbC50YWJsZVRvZ2dsZUFsbCh0aGlzLmNoZWNrZWQpIiB0aXRs -ZT0iQWxsZSBhdXN3w6RobGVuIj48L3RoPicgOiAnJykgKwogICAgICAgICAgICAnPHRoJyArIGNs -cygndGl0ZWwnKSArICcgb25jbGljaz0iRHJpdmVQb3J0YWwuc29ydFRhYmxlKFwndGl0ZWxcJyki -PlRpdGVsPC90aD4nICsKICAgICAgICAgICAgJzx0aCcgKyBjbHMoJ2thdGVnb3JpZScpICsgJyBv -bmNsaWNrPSJEcml2ZVBvcnRhbC5zb3J0VGFibGUoXCdrYXRlZ29yaWVcJykiPkthdGVnb3JpZTwv -dGg+JyArCiAgICAgICAgICAgICc8dGgnICsgY2xzKCdzdGF0dXMnKSArICcgb25jbGljaz0iRHJp -dmVQb3J0YWwuc29ydFRhYmxlKFwnc3RhdHVzXCcpIj5TdGF0dXM8L3RoPicgKwogICAgICAgICAg -ICAnPHRoJyArIGNscygnZXJzdGVsbHRWb24nKSArICcgb25jbGljaz0iRHJpdmVQb3J0YWwuc29y -dFRhYmxlKFwnZXJzdGVsbHRWb25cJykiPkVyc3RlbGxlcjwvdGg+JyArCiAgICAgICAgICAgICc8 -dGgnICsgY2xzKCdlcnN0ZWxsdCcpICsgJyBvbmNsaWNrPSJEcml2ZVBvcnRhbC5zb3J0VGFibGUo -XCdlcnN0ZWxsdFwnKSI+RXJzdGVsbHQ8L3RoPicgKwogICAgICAgICAgICAnPHRoJyArIGNscygn -Z2VhZW5kZXJ0JykgKyAnIG9uY2xpY2s9IkRyaXZlUG9ydGFsLnNvcnRUYWJsZShcJ2dlYWVuZGVy -dFwnKSI+R2XDpG5kZXJ0PC90aD4nICsKICAgICAgICAgICAgJzx0aCcgKyBjbHMoJ3ZlcnNpb24n -KSArICcgb25jbGljaz0iRHJpdmVQb3J0YWwuc29ydFRhYmxlKFwndmVyc2lvblwnKSI+VmVyc2lv -bjwvdGg+JyArCiAgICAgICAgICAgIChpc0FkbWluID8gJzx0aCBzdHlsZT0id2lkdGg6NDBweDsi -PjwvdGg+JyA6ICcnKSArCiAgICAgICAgJzwvdHI+PC90aGVhZD48dGJvZHk+JzsKCiAgICAgICAg -c29ydGVkLmZvckVhY2goZnVuY3Rpb24oZG9jKSB7CiAgICAgICAgICAgIHZhciBjZmcgPSBzdGF0 -dXNDb25maWdbZG9jLnN0YXR1c10gfHwgeyBjb2xvcjogJyNlZWUnLCB0ZXh0Q29sb3I6ICcjMzMz -JywgaWNvbjogJycgfTsKICAgICAgICAgICAgaHRtbCArPSAnPHRyPicgKwogICAgICAgICAgICAg -ICAgKGlzQWRtaW4gPyAnPHRkIG9uY2xpY2s9ImV2ZW50LnN0b3BQcm9wYWdhdGlvbigpIj48aW5w -dXQgdHlwZT0iY2hlY2tib3giIGNsYXNzPSJ0YWJsZS1yb3ctY2IiIHZhbHVlPSInICsgRHJpdmVQ -b3J0YWwuZXNjYXBlQXR0cihkb2MuaWQpICsgJyIgb25jaGFuZ2U9IkRyaXZlUG9ydGFsLnRhYmxl -U2VsZWN0aW9uQ2hhbmdlZCgpIj48L3RkPicgOiAnJykgKwogICAgICAgICAgICAgICAgJzx0ZCBv -bmNsaWNrPSJEcml2ZVBvcnRhbC5fdGFibGVPcGVuRG9jKFwnJyArIERyaXZlUG9ydGFsLmVzY2Fw -ZUF0dHIoZG9jLmlkKSArICdcJyk7IiBzdHlsZT0iY3Vyc29yOnBvaW50ZXI7Ij48c3Ryb25nPicg -KyBEcml2ZVBvcnRhbC5lc2NhcGVIVE1MKGRvYy50aXRlbCkgKyAnPC9zdHJvbmc+PC90ZD4nICsK -ICAgICAgICAgICAgICAgICc8dGQ+JyArIERyaXZlUG9ydGFsLmVzY2FwZUhUTUwoZG9jLmthdGVn -b3JpZSkgKyAnPC90ZD4nICsKICAgICAgICAgICAgICAgICc8dGQ+PHNwYW4gY2xhc3M9InN0YXR1 -cy1iYWRnZS1zbWFsbCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6JyArIGNmZy5jb2xvciArICc7 -Y29sb3I6JyArIGNmZy50ZXh0Q29sb3IgKyAnOyI+JyArIGRvYy5zdGF0dXMgKyAnPC9zcGFuPjwv -dGQ+JyArCiAgICAgICAgICAgICAgICAnPHRkPicgKyBEcml2ZVBvcnRhbC5lc2NhcGVIVE1MKGRv -Yy5lcnN0ZWxsdFZvbiB8fCAnLScpICsgJzwvdGQ+JyArCiAgICAgICAgICAgICAgICAnPHRkPicg -KyBmb3JtYXREYXRlKGRvYy5lcnN0ZWxsdCkgKyAnPC90ZD4nICsKICAgICAgICAgICAgICAgICc8 -dGQ+JyArIGZvcm1hdERhdGUoZG9jLmdlYWVuZGVydCkgKyAnPC90ZD4nICsKICAgICAgICAgICAg -ICAgICc8dGQ+JyArIERyaXZlUG9ydGFsLmVzY2FwZUhUTUwoZG9jLnZlcnNpb24gfHwgJy0nKSAr -ICc8L3RkPicgKwogICAgICAgICAgICAgICAgKGlzQWRtaW4gPyAnPHRkIG9uY2xpY2s9ImV2ZW50 -LnN0b3BQcm9wYWdhdGlvbigpIj48YnV0dG9uIG9uY2xpY2s9IkRyaXZlUG9ydGFsLnF1aWNrRWRp -dFNpbmdsZShcJycgKyBEcml2ZVBvcnRhbC5lc2NhcGVBdHRyKGRvYy5pZCkgKyAnXCcpIiBzdHls -ZT0icGFkZGluZzoycHggOHB4O2JvcmRlcjoxcHggc29saWQgdmFyKC0tYm9yZGVyLWNvbG9yKTti -YWNrZ3JvdW5kOnZhcigtLWJnLWNhcmQtYWx0KTtib3JkZXItcmFkaXVzOjNweDtjdXJzb3I6cG9p -bnRlcjtmb250LXNpemU6MTFweDtjb2xvcjp2YXIoLS10ZXh0LXNlY29uZGFyeSk7IiB0aXRsZT0i -U2NobmVsbGJlYXJiZWl0dW5nIj7inI48L2J1dHRvbj48L3RkPicgOiAnJykgKwogICAgICAgICAg -ICAnPC90cj4nOwogICAgICAgIH0pOwogICAgICAgIGh0bWwgKz0gJzwvdGJvZHk+PC90YWJsZT4n -OwogICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0YWJsZVZpZXdDb250YWluZXInKS5p -bm5lckhUTUwgPSBodG1sOwogICAgfSwKCiAgICBfdGFibGVPcGVuRG9jKGRvY0lkKSB7CiAgICAg -ICAgdGhpcy50YWJsZVZpZXdBY3RpdmUgPSBmYWxzZTsKICAgICAgICBkb2N1bWVudC5nZXRFbGVt -ZW50QnlJZCgnY29udGFpbmVyJykuc3R5bGUuZGlzcGxheSA9ICcnOwogICAgICAgIGRvY3VtZW50 -LmdldEVsZW1lbnRCeUlkKCd0YWJsZVZpZXdDb250YWluZXInKS5jbGFzc0xpc3QucmVtb3ZlKCdh -Y3RpdmUnKTsKICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYnRuVGFibGVWaWV3Jyku -c3R5bGUuYmFja2dyb3VuZENvbG9yID0gJyc7CiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5 -SWQoJ2J0blRhYmxlVmlldycpLnN0eWxlLmNvbG9yID0gJyc7CiAgICAgICAgdGhpcy5zZWxlY3RE -b2N1bWVudChkb2NJZCk7CiAgICB9LAoKICAgIHRhYmxlVG9nZ2xlQWxsKGNoZWNrZWQpIHsKICAg -ICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcudGFibGUtcm93LWNiJykuZm9yRWFjaChm -dW5jdGlvbihjYikgeyBjYi5jaGVja2VkID0gY2hlY2tlZDsgfSk7CiAgICAgICAgdGhpcy50YWJs -ZVNlbGVjdGlvbkNoYW5nZWQoKTsKICAgIH0sCgogICAgdGFibGVTZWxlY3Rpb25DaGFuZ2VkKCkg -ewogICAgICAgIHZhciBzZWxlY3RlZCA9IFtdOwogICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0 -b3JBbGwoJy50YWJsZS1yb3ctY2I6Y2hlY2tlZCcpLmZvckVhY2goZnVuY3Rpb24oY2IpIHsgc2Vs -ZWN0ZWQucHVzaChjYi52YWx1ZSk7IH0pOwogICAgICAgIHRoaXMuX3RhYmxlU2VsZWN0ZWQgPSBz -ZWxlY3RlZDsKICAgICAgICB2YXIgYmFyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RhYmxl -QnVsa0JhcicpOwogICAgICAgIGlmIChiYXIpIHsKICAgICAgICAgICAgYmFyLnN0eWxlLmRpc3Bs -YXkgPSBzZWxlY3RlZC5sZW5ndGggPiAwID8gJ2ZsZXgnIDogJ25vbmUnOwogICAgICAgICAgICBk -b2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGFibGVCdWxrQ291bnQnKS50ZXh0Q29udGVudCA9IHNl -bGVjdGVkLmxlbmd0aCArICcgYXVzZ2V3w6RobHQnOwogICAgICAgIH0KICAgIH0sCgogICAgYnVs -a1F1aWNrRWRpdCgpIHsKICAgICAgICBpZiAodGhpcy5fdGFibGVTZWxlY3RlZC5sZW5ndGggPT09 -IDApIHJldHVybjsKICAgICAgICB2YXIgZG9jcyA9IHRoaXMuX3RhYmxlU2VsZWN0ZWQubWFwKGZ1 -bmN0aW9uKGlkKSB7IHJldHVybiBEcml2ZUZTLmRvY3VtZW50cy5maW5kKGZ1bmN0aW9uKGQpIHsg -cmV0dXJuIGQuaWQgPT09IGlkOyB9KTsgfSkuZmlsdGVyKEJvb2xlYW4pOwogICAgICAgIHZhciBr -YXRlZ29yaWVuID0gRHJpdmVGUy5jb25maWcua2F0ZWdvcmllbiB8fCBbXTsKICAgICAgICB2YXIg -c3RhdHVzTGlzdCA9IE9iamVjdC5rZXlzKERyaXZlRlMuY29uZmlnLnN0YXR1cyB8fCB7fSk7Cgog -ICAgICAgIHZhciBtb2RhbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOwogICAgICAg -IG1vZGFsLnN0eWxlLmNzc1RleHQgPSAncG9zaXRpb246Zml4ZWQ7dG9wOjA7bGVmdDowO3dpZHRo -OjEwMCU7aGVpZ2h0OjEwMCU7YmFja2dyb3VuZDpyZ2JhKDAsMCwwLDAuNSk7ei1pbmRleDoxMDUw -MDtkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO2p1c3RpZnktY29udGVudDpjZW50ZXI7 -JzsKICAgICAgICBtb2RhbC5vbmNsaWNrID0gZnVuY3Rpb24oZSkgeyBpZiAoZS50YXJnZXQgPT09 -IG1vZGFsKSBtb2RhbC5yZW1vdmUoKTsgfTsKCiAgICAgICAgdmFyIGlucHV0U3R5bGUgPSAnd2lk -dGg6MTAwJTtwYWRkaW5nOjZweCAxMHB4O2JvcmRlcjoxcHggc29saWQgdmFyKC0tYm9yZGVyLWNv -bG9yKTtib3JkZXItcmFkaXVzOjRweDtmb250LXNpemU6MTNweDtiYWNrZ3JvdW5kOnZhcigtLWJn -LWlucHV0KTtjb2xvcjp2YXIoLS10ZXh0LXByaW1hcnkpOyc7CgogICAgICAgIHZhciBodG1sID0g -JzxkaXYgc3R5bGU9ImJhY2tncm91bmQ6dmFyKC0tYmctY2FyZCk7Ym9yZGVyLXJhZGl1czoxMHB4 -O3BhZGRpbmc6MjBweCAyNHB4O21heC13aWR0aDo1MDBweDt3aWR0aDo5MCU7Ym94LXNoYWRvdzow -IDhweCAzMnB4IHJnYmEoMCwwLDAsMC4zKTttYXgtaGVpZ2h0Ojg1dmg7b3ZlcmZsb3cteTphdXRv -OyI+JyArCiAgICAgICAgICAgICc8aDMgc3R5bGU9ImNvbG9yOnZhcigtLXRleHQtaGVhZGluZyk7 -bWFyZ2luLWJvdHRvbTo2cHg7Ij5TY2huZWxsYmVhcmJlaXR1bmc8L2gzPicgKwogICAgICAgICAg -ICAnPHAgc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2NvbG9yOnZhcigtLXRleHQtbXV0ZWQpO21hcmdp -bi1ib3R0b206MTRweDsiPicgKyBkb2NzLmxlbmd0aCArICcgQXJ0aWtlbCBhdXNnZXfDpGhsdC4g -TnVyIGF1c2dlZsO8bGx0ZSBGZWxkZXIgd2VyZGVuIGdlw6RuZGVydC48L3A+JyArCgogICAgICAg -ICAgICAnPGRpdiBzdHlsZT0ibWFyZ2luLWJvdHRvbToxMHB4OyI+PGxhYmVsIHN0eWxlPSJmb250 -LXNpemU6MTJweDtmb250LXdlaWdodDo2MDA7Y29sb3I6dmFyKC0tdGV4dC1zZWNvbmRhcnkpO2Rp -c3BsYXk6YmxvY2s7bWFyZ2luLWJvdHRvbTozcHg7Ij5LYXRlZ29yaWUgw6RuZGVybjwvbGFiZWw+ -JyArCiAgICAgICAgICAgICc8c2VsZWN0IGlkPSJidWxrS2F0ZWdvcmllIiBzdHlsZT0iJyArIGlu -cHV0U3R5bGUgKyAnIj48b3B0aW9uIHZhbHVlPSIiPuKAlCBOaWNodCDDpG5kZXJuIOKAlDwvb3B0 -aW9uPic7CiAgICAgICAga2F0ZWdvcmllbi5mb3JFYWNoKGZ1bmN0aW9uKGspIHsgaHRtbCArPSAn -PG9wdGlvbiB2YWx1ZT0iJyArIERyaXZlUG9ydGFsLmVzY2FwZUF0dHIoaykgKyAnIj4nICsgRHJp -dmVQb3J0YWwuZXNjYXBlSFRNTChrKSArICc8L29wdGlvbj4nOyB9KTsKICAgICAgICBodG1sICs9 -ICc8L3NlbGVjdD48L2Rpdj4nICsKCiAgICAgICAgICAgICc8ZGl2IHN0eWxlPSJtYXJnaW4tYm90 -dG9tOjEwcHg7Ij48bGFiZWwgc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZvbnQtd2VpZ2h0OjYwMDtj -b2xvcjp2YXIoLS10ZXh0LXNlY29uZGFyeSk7ZGlzcGxheTpibG9jazttYXJnaW4tYm90dG9tOjNw -eDsiPlN0YXR1cyDDpG5kZXJuPC9sYWJlbD4nICsKICAgICAgICAgICAgJzxzZWxlY3QgaWQ9ImJ1 -bGtTdGF0dXMiIHN0eWxlPSInICsgaW5wdXRTdHlsZSArICciPjxvcHRpb24gdmFsdWU9IiI+4oCU -IE5pY2h0IMOkbmRlcm4g4oCUPC9vcHRpb24+JzsKICAgICAgICBzdGF0dXNMaXN0LmZvckVhY2go -ZnVuY3Rpb24ocykgeyBodG1sICs9ICc8b3B0aW9uIHZhbHVlPSInICsgRHJpdmVQb3J0YWwuZXNj -YXBlQXR0cihzKSArICciPicgKyBEcml2ZVBvcnRhbC5lc2NhcGVIVE1MKHMpICsgJzwvb3B0aW9u -Pic7IH0pOwogICAgICAgIGh0bWwgKz0gJzwvc2VsZWN0PjwvZGl2PicgKwoKICAgICAgICAgICAg -JzxkaXYgc3R5bGU9Im1hcmdpbi1ib3R0b206MTBweDsiPjxsYWJlbCBzdHlsZT0iZm9udC1zaXpl -OjEycHg7Zm9udC13ZWlnaHQ6NjAwO2NvbG9yOnZhcigtLXRleHQtc2Vjb25kYXJ5KTtkaXNwbGF5 -OmJsb2NrO21hcmdpbi1ib3R0b206M3B4OyI+U2NobGFnd29ydCBoaW56dWbDvGdlbjwvbGFiZWw+ -JyArCiAgICAgICAgICAgICc8aW5wdXQgdHlwZT0idGV4dCIgaWQ9ImJ1bGtBZGRUYWciIHBsYWNl -aG9sZGVyPSJOZXVlcyBTY2hsYWd3b3J0Li4uIiBzdHlsZT0iJyArIGlucHV0U3R5bGUgKyAnIj48 -L2Rpdj4nICsKCiAgICAgICAgICAgICc8ZGl2IHN0eWxlPSJtYXJnaW4tYm90dG9tOjEwcHg7Ij48 -bGFiZWwgc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZvbnQtd2VpZ2h0OjYwMDtjb2xvcjp2YXIoLS10 -ZXh0LXNlY29uZGFyeSk7ZGlzcGxheTpibG9jazttYXJnaW4tYm90dG9tOjNweDsiPlNjaGxhZ3dv -cnQgZW50ZmVybmVuPC9sYWJlbD4nICsKICAgICAgICAgICAgJzxpbnB1dCB0eXBlPSJ0ZXh0IiBp -ZD0iYnVsa1JlbW92ZVRhZyIgcGxhY2Vob2xkZXI9Ilp1IGVudGZlcm5lbmRlcyBTY2hsYWd3b3J0 -Li4uIiBzdHlsZT0iJyArIGlucHV0U3R5bGUgKyAnIj48L2Rpdj4nICsKCiAgICAgICAgICAgICc8 -ZGl2IHN0eWxlPSJkaXNwbGF5OmZsZXg7Z2FwOjhweDtqdXN0aWZ5LWNvbnRlbnQ6ZmxleC1lbmQ7 -bWFyZ2luLXRvcDoxNHB4OyI+JyArCiAgICAgICAgICAgICAgICAnPGJ1dHRvbiBvbmNsaWNrPSJ0 -aGlzLmNsb3Nlc3QoXCdkaXZbc3R5bGVdXCcpLnBhcmVudEVsZW1lbnQucmVtb3ZlKCkiIHN0eWxl -PSJwYWRkaW5nOjhweCAxNnB4O2JvcmRlci1yYWRpdXM6NHB4O2JvcmRlcjoxcHggc29saWQgdmFy -KC0tYm9yZGVyLWNvbG9yKTtiYWNrZ3JvdW5kOnZhcigtLWJnLWNhcmQpO2NvbG9yOnZhcigtLXRl -eHQtcHJpbWFyeSk7Y3Vyc29yOnBvaW50ZXI7Ij5BYmJyZWNoZW48L2J1dHRvbj4nICsKICAgICAg -ICAgICAgICAgICc8YnV0dG9uIG9uY2xpY2s9IkRyaXZlUG9ydGFsLl9jb25maXJtQnVsa0VkaXQo -KSIgc3R5bGU9InBhZGRpbmc6OHB4IDE2cHg7Ym9yZGVyLXJhZGl1czo0cHg7Ym9yZGVyOm5vbmU7 -YmFja2dyb3VuZDp2YXIoLS10ZXh0LWhlYWRpbmcpO2NvbG9yOndoaXRlO2N1cnNvcjpwb2ludGVy -O2ZvbnQtd2VpZ2h0OjYwMDsiPsOEbmRlcnVuZ2VuIGFud2VuZGVuPC9idXR0b24+JyArCiAgICAg -ICAgICAgICc8L2Rpdj48L2Rpdj4nOwoKICAgICAgICBtb2RhbC5pbm5lckhUTUwgPSBodG1sOwog -ICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQobW9kYWwpOwogICAgfSwKCiAgICBhc3lu -YyBfY29uZmlybUJ1bGtFZGl0KCkgewogICAgICAgIHZhciBuZXdLYXQgPSBkb2N1bWVudC5nZXRF -bGVtZW50QnlJZCgnYnVsa0thdGVnb3JpZScpLnZhbHVlOwogICAgICAgIHZhciBuZXdTdGF0dXMg -PSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYnVsa1N0YXR1cycpLnZhbHVlOwogICAgICAgIHZh -ciBhZGRUYWcgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYnVsa0FkZFRhZycpLnZhbHVlLnRy -aW0oKTsKICAgICAgICB2YXIgcmVtb3ZlVGFnID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2J1 -bGtSZW1vdmVUYWcnKS52YWx1ZS50cmltKCk7CgogICAgICAgIGlmICghbmV3S2F0ICYmICFuZXdT -dGF0dXMgJiYgIWFkZFRhZyAmJiAhcmVtb3ZlVGFnKSB7CiAgICAgICAgICAgIHNob3dUb2FzdCgn -Qml0dGUgbWluZGVzdGVucyBlaW4gRmVsZCBhdXNmw7xsbGVuJywgJ3dhcm5pbmcnKTsKICAgICAg -ICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgLy8gTW9kYWwgc2NobGllc3NlbgogICAg -ICAgIHZhciBlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdidWxrS2F0ZWdvcmllJyk7CiAg -ICAgICAgaWYgKGVsKSB7IHZhciBtID0gZWw7IHdoaWxlIChtLnBhcmVudEVsZW1lbnQgIT09IGRv -Y3VtZW50LmJvZHkpIG0gPSBtLnBhcmVudEVsZW1lbnQ7IG0ucmVtb3ZlKCk7IH0KCiAgICAgICAg -dmFyIGNvdW50ID0gMDsKICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuX3RhYmxlU2Vs -ZWN0ZWQubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgdmFyIGRvYyA9IERyaXZlRlMuZG9jdW1l -bnRzLmZpbmQoZnVuY3Rpb24oZCkgeyByZXR1cm4gZC5pZCA9PT0gRHJpdmVQb3J0YWwuX3RhYmxl -U2VsZWN0ZWRbaV07IH0pOwogICAgICAgICAgICBpZiAoIWRvYykgY29udGludWU7CiAgICAgICAg -ICAgIGlmIChuZXdLYXQpIGRvYy5rYXRlZ29yaWUgPSBuZXdLYXQ7CiAgICAgICAgICAgIGlmIChu -ZXdTdGF0dXMpIHsKICAgICAgICAgICAgICAgIGRvYy52ZXJzaW9uID0gY2FsY3VsYXRlVmVyc2lv -bihkb2MsIGRvYy5pbmhhbHQsIGRvYy5pbmhhbHQsIG5ld1N0YXR1cyk7CiAgICAgICAgICAgICAg -ICBkb2Muc3RhdHVzID0gbmV3U3RhdHVzOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChh -ZGRUYWcpIHsKICAgICAgICAgICAgICAgIGlmICghZG9jLnNjaGxhZ3dvZXJ0ZXIpIGRvYy5zY2hs -YWd3b2VydGVyID0gW107CiAgICAgICAgICAgICAgICBpZiAoIWRvYy5zY2hsYWd3b2VydGVyLmlu -Y2x1ZGVzKGFkZFRhZykpIGRvYy5zY2hsYWd3b2VydGVyLnB1c2goYWRkVGFnKTsKICAgICAgICAg -ICAgfQogICAgICAgICAgICBpZiAocmVtb3ZlVGFnICYmIGRvYy5zY2hsYWd3b2VydGVyKSB7CiAg -ICAgICAgICAgICAgICBkb2Muc2NobGFnd29lcnRlciA9IGRvYy5zY2hsYWd3b2VydGVyLmZpbHRl -cihmdW5jdGlvbihrKSB7IHJldHVybiBrICE9PSByZW1vdmVUYWc7IH0pOwogICAgICAgICAgICB9 -CiAgICAgICAgICAgIGF3YWl0IERyaXZlRlMuc2F2ZURvY3VtZW50KGRvYyk7CiAgICAgICAgICAg -IGNvdW50Kys7CiAgICAgICAgfQogICAgICAgIHNob3dUb2FzdChjb3VudCArICcgQXJ0aWtlbCBh -a3R1YWxpc2llcnQnLCAnc3VjY2VzcycpOwogICAgICAgIHRoaXMucmVuZGVyKCk7CiAgICAgICAg -dGhpcy5yZW5kZXJUYWJsZVZpZXcoKTsKICAgIH0sCgogICAgYnVsa0RlbGV0ZSgpIHsKICAgICAg -ICB2YXIgY291bnQgPSB0aGlzLl90YWJsZVNlbGVjdGVkLmxlbmd0aDsKICAgICAgICBpZiAoY291 -bnQgPT09IDApIHJldHVybjsKCiAgICAgICAgdmFyIG1vZGFsID0gZG9jdW1lbnQuY3JlYXRlRWxl -bWVudCgnZGl2Jyk7CiAgICAgICAgbW9kYWwuc3R5bGUuY3NzVGV4dCA9ICdwb3NpdGlvbjpmaXhl -ZDt0b3A6MDtsZWZ0OjA7d2lkdGg6MTAwJTtoZWlnaHQ6MTAwJTtiYWNrZ3JvdW5kOnJnYmEoMCww -LDAsMC41KTt6LWluZGV4OjEwNTAwO2Rpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpjZW50ZXI7anVz -dGlmeS1jb250ZW50OmNlbnRlcjsnOwogICAgICAgIG1vZGFsLm9uY2xpY2sgPSBmdW5jdGlvbihl -KSB7IGlmIChlLnRhcmdldCA9PT0gbW9kYWwpIG1vZGFsLnJlbW92ZSgpOyB9OwogICAgICAgIG1v -ZGFsLmlubmVySFRNTCA9CiAgICAgICAgICAgICc8ZGl2IHN0eWxlPSJiYWNrZ3JvdW5kOnZhcigt -LWJnLWNhcmQpO2JvcmRlci1yYWRpdXM6MTBweDtwYWRkaW5nOjI0cHggMjhweDttYXgtd2lkdGg6 -NDIwcHg7d2lkdGg6OTAlO2JveC1zaGFkb3c6MCA4cHggMzJweCByZ2JhKDAsMCwwLDAuMyk7Ij4n -ICsKICAgICAgICAgICAgICAgICc8aDMgc3R5bGU9ImNvbG9yOiNkYzM1NDU7bWFyZ2luLWJvdHRv -bToxMHB4OyI+JyArIGNvdW50ICsgJyBBcnRpa2VsIGzDtnNjaGVuPzwvaDM+JyArCiAgICAgICAg -ICAgICAgICAnPHAgc3R5bGU9ImNvbG9yOnZhcigtLXRleHQtcHJpbWFyeSk7Zm9udC1zaXplOjE0 -cHg7bGluZS1oZWlnaHQ6MS43O21hcmdpbi1ib3R0b206MTRweDsiPicgKwogICAgICAgICAgICAg -ICAgICAgICdEaWUgYXVzZ2V3w6RobHRlbiBBcnRpa2VsIHdlcmRlbiBpbiBkZW4gUGFwaWVya29y -YiB2ZXJzY2hvYmVuIHVuZCBrw7ZubmVuIDI4IFRhZ2UgbGFuZyB3aWVkZXJoZXJnZXN0ZWxsdCB3 -ZXJkZW4uJyArCiAgICAgICAgICAgICAgICAnPC9wPicgKwogICAgICAgICAgICAgICAgJzxsYWJl -bCBzdHlsZT0iZm9udC1zaXplOjEycHg7Zm9udC13ZWlnaHQ6NjAwO2NvbG9yOnZhcigtLXRleHQt -c2Vjb25kYXJ5KTtkaXNwbGF5OmJsb2NrO21hcmdpbi1ib3R0b206NHB4OyI+TlctS2VubnVuZyB6 -dXIgQmVzdMOkdGlndW5nPC9sYWJlbD4nICsKICAgICAgICAgICAgICAgICc8aW5wdXQgdHlwZT0i -dGV4dCIgaWQ9ImJ1bGtEZWxldGVOVyIgcGxhY2Vob2xkZXI9Ik5XLUtlbm51bmcgZWluZ2ViZW4u -Li4iIHN0eWxlPSJ3aWR0aDoxMDAlO3BhZGRpbmc6OHB4IDEwcHg7Ym9yZGVyOjFweCBzb2xpZCB2 -YXIoLS1ib3JkZXItY29sb3IpO2JvcmRlci1yYWRpdXM6NHB4O2ZvbnQtc2l6ZToxNHB4O2JhY2tn -cm91bmQ6dmFyKC0tYmctaW5wdXQpO2NvbG9yOnZhcigtLXRleHQtcHJpbWFyeSk7bWFyZ2luLWJv -dHRvbToxNHB4OyI+JyArCiAgICAgICAgICAgICAgICAnPGRpdiBzdHlsZT0iZGlzcGxheTpmbGV4 -O2dhcDo4cHg7anVzdGlmeS1jb250ZW50OmZsZXgtZW5kOyI+JyArCiAgICAgICAgICAgICAgICAg -ICAgJzxidXR0b24gb25jbGljaz0idGhpcy5jbG9zZXN0KFwnZGl2W3N0eWxlXVwnKS5wYXJlbnRF -bGVtZW50LnJlbW92ZSgpIiBzdHlsZT0icGFkZGluZzo4cHggMTZweDtib3JkZXItcmFkaXVzOjRw -eDtib3JkZXI6MXB4IHNvbGlkIHZhcigtLWJvcmRlci1jb2xvcik7YmFja2dyb3VuZDp2YXIoLS1i -Zy1jYXJkKTtjb2xvcjp2YXIoLS10ZXh0LXByaW1hcnkpO2N1cnNvcjpwb2ludGVyOyI+QWJicmVj -aGVuPC9idXR0b24+JyArCiAgICAgICAgICAgICAgICAgICAgJzxidXR0b24gb25jbGljaz0iRHJp -dmVQb3J0YWwuX2NvbmZpcm1CdWxrRGVsZXRlKCkiIHN0eWxlPSJwYWRkaW5nOjhweCAxNnB4O2Jv -cmRlci1yYWRpdXM6NHB4O2JvcmRlcjpub25lO2JhY2tncm91bmQ6I2RjMzU0NTtjb2xvcjp3aGl0 -ZTtjdXJzb3I6cG9pbnRlcjtmb250LXdlaWdodDo2MDA7Ij5Mw7ZzY2hlbjwvYnV0dG9uPicgKwog -ICAgICAgICAgICAgICAgJzwvZGl2PicgKwogICAgICAgICAgICAnPC9kaXY+JzsKICAgICAgICBk -b2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKG1vZGFsKTsKICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0 -aW9uKCkgeyBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYnVsa0RlbGV0ZU5XJykuZm9jdXMoKTsg -fSwgNTApOwogICAgfSwKCiAgICBxdWlja0VkaXRTaW5nbGUoZG9jSWQpIHsKICAgICAgICB2YXIg -ZG9jID0gRHJpdmVGUy5kb2N1bWVudHMuZmluZChmdW5jdGlvbihkKSB7IHJldHVybiBkLmlkID09 -PSBkb2NJZDsgfSk7CiAgICAgICAgaWYgKCFkb2MpIHJldHVybjsKICAgICAgICB2YXIga2F0ZWdv -cmllbiA9IERyaXZlRlMuY29uZmlnLmthdGVnb3JpZW4gfHwgW107CiAgICAgICAgdmFyIHN0YXR1 -c0xpc3QgPSBPYmplY3Qua2V5cyhEcml2ZUZTLmNvbmZpZy5zdGF0dXMgfHwge30pOwogICAgICAg -IHZhciBpbnB1dFN0eWxlID0gJ3dpZHRoOjEwMCU7cGFkZGluZzo2cHggMTBweDtib3JkZXI6MXB4 -IHNvbGlkIHZhcigtLWJvcmRlci1jb2xvcik7Ym9yZGVyLXJhZGl1czo0cHg7Zm9udC1zaXplOjEz -cHg7YmFja2dyb3VuZDp2YXIoLS1iZy1pbnB1dCk7Y29sb3I6dmFyKC0tdGV4dC1wcmltYXJ5KTsn +PT09CgogICAgc3RhcnRTeW5jKCkgewogICAgICAgIGlmICh0aGlzLnN5bmNJbnRlcnZhbCkgY2xl +YXJJbnRlcnZhbCh0aGlzLnN5bmNJbnRlcnZhbCk7CiAgICAgICAgdGhpcy5fbGFzdFZpc3VhbFN5 +bmMgPSAwOwoKICAgICAgICB0aGlzLnN5bmNJbnRlcnZhbCA9IHNldEludGVydmFsKGFzeW5jICgp +ID0+IHsKICAgICAgICAgICAgaWYgKCF0aGlzLmNvbm5lY3RlZCkgcmV0dXJuOwoKICAgICAgICAg +ICAgdHJ5IHsKICAgICAgICAgICAgICAgIGxldCBjaGFuZ2VkID0gZmFsc2U7CgogICAgICAgICAg +ICAgICAgaWYgKHRoaXMubW9kZSA9PT0gJ3NlcnZlcicpIHsKICAgICAgICAgICAgICAgICAgICBj +b25zdCByZXMgPSBhd2FpdCBmZXRjaCgnL2FwaS9zY2FuJyk7CiAgICAgICAgICAgICAgICAgICAg +Y29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7CiAgICAgICAgICAgICAgICAgICAgY29uc3Qg +c2VydmVyRmlsZXMgPSBkYXRhLmZpbGVzIHx8IFtdOwoKICAgICAgICAgICAgICAgICAgICAvLyBB +bnphaGwgZ2VhZW5kZXJ0PwogICAgICAgICAgICAgICAgICAgIGlmIChzZXJ2ZXJGaWxlcy5sZW5n +dGggIT09IHRoaXMuZG9jdW1lbnRzLmxlbmd0aCkgeyBjaGFuZ2VkID0gdHJ1ZTsgfQoKICAgICAg +ICAgICAgICAgICAgICAvLyBUaW1lc3RhbXBzIGdlYWVuZGVydD8KICAgICAgICAgICAgICAgICAg +ICBpZiAoIWNoYW5nZWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBlbnRy +eSBvZiBzZXJ2ZXJGaWxlcykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZG9j +SWQgPSBlbnRyeS5maWxlbmFtZS5zcGxpdCgnXycpWzBdOwogICAgICAgICAgICAgICAgICAgICAg +ICAgICAgY29uc3QgbWV0YSA9IHRoaXMuZmlsZVRpbWVzdGFtcHNbZG9jSWRdOwogICAgICAgICAg +ICAgICAgICAgICAgICAgICAgaWYgKCFtZXRhIHx8IGVudHJ5Lm1vZGlmaWVkICE9PSBtZXRhLm1v +ZGlmaWVkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbmdlZCA9IHRydWU7 +CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAg +ICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAg +ICB9CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIC8vIEZpbGVz +eXN0ZW0tTW9kdXM6IERhdGVpZW4gcHJ1ZWZlbgogICAgICAgICAgICAgICAgICAgIGxldCB0b3Rh +bEZpbGVzID0gMDsKICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGthdCBvZiAodGhpcy5j +b25maWcua2F0ZWdvcmllbiB8fCBbXSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsK +ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGthdERpciA9IGF3YWl0IHRoaXMuX2Rh +dGFIYW5kbGUuZ2V0RGlyZWN0b3J5SGFuZGxlKGthdCk7CiAgICAgICAgICAgICAgICAgICAgICAg +ICAgICBmb3IgYXdhaXQgKGNvbnN0IFtuYW1lLCBoYW5kbGVdIG9mIGthdERpcikgewogICAgICAg +ICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lLmVuZHNXaXRoKCcuanNvbicpKSB7CiAg +ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsRmlsZXMrKzsKICAgICAgICAg +ICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmlsZSA9IGF3YWl0IGhhbmRsZS5nZXRG +aWxlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRvY0lkID0g +bmFtZS5zcGxpdCgnXycpWzBdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBj +b25zdCBtZXRhID0gdGhpcy5maWxlVGltZXN0YW1wc1tkb2NJZF07CiAgICAgICAgICAgICAgICAg +ICAgICAgICAgICAgICAgICAgIGlmICghbWV0YSB8fCBmaWxlLmxhc3RNb2RpZmllZCA+IG1ldGEu +bW9kaWZpZWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5n +ZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAg +ICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQog +ICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIHt9CiAgICAgICAgICAgICAgICAgICAgfQog +ICAgICAgICAgICAgICAgICAgIGlmICh0b3RhbEZpbGVzICE9PSB0aGlzLmRvY3VtZW50cy5sZW5n +dGgpIGNoYW5nZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8v +IExvY2tzIGltbWVyIGFrdHVhbGlzaWVyZW4gKHVuYWJoYWVuZ2lnIHZvbiBEb2t1bWVudGVuYWVu +ZGVydW5nZW4pCiAgICAgICAgICAgICAgICBhd2FpdCBEcml2ZVBvcnRhbC5sb2FkTG9ja3MoKTsK +CiAgICAgICAgICAgICAgICBpZiAoY2hhbmdlZCkgewogICAgICAgICAgICAgICAgICAgIGF3YWl0 +IHRoaXMubG9hZEFsbERvY3VtZW50cygpOwogICAgICAgICAgICAgICAgICAgIGF3YWl0IERyaXZl +R292ZXJuYW5jZS5sb2FkKCk7CiAgICAgICAgICAgICAgICAgICAgRHJpdmVQb3J0YWwucmVuZGVy +KCk7CiAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N5bmNJbmZv +JykudGV4dENvbnRlbnQgPSAnQWt0dWFsaXNpZXJ0OiAnICsgbmV3IERhdGUoKS50b0xvY2FsZVRp +bWVTdHJpbmcoKTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAg +Ly8gQXVjaCBvaG5lIERva3VtZW50ZW5hZW5kZXJ1bmdlbiBkaWUgTGlzdGUgbmV1IHJlbmRlcm4g +KExvY2stU3RhdHVzKQogICAgICAgICAgICAgICAgICAgIERyaXZlUG9ydGFsLnJlbmRlckxpc3Qo +KTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBWaXN1ZWxsZSBBbnplaWdl +IGltIEZvb3RlciBudXIgYWxsZSAyMCBNaW51dGVuCiAgICAgICAgICAgICAgICBjb25zdCBub3cg +PSBEYXRlLm5vdygpOwogICAgICAgICAgICAgICAgaWYgKG5vdyAtIHRoaXMuX2xhc3RWaXN1YWxT +eW5jID49IDEyMDAwMDApIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLl9sYXN0VmlzdWFsU3lu +YyA9IG5vdzsKICAgICAgICAgICAgICAgICAgICBjb25zdCBlbCA9IGRvY3VtZW50LmdldEVsZW1l +bnRCeUlkKCdmb290ZXJTeW5jU3RhdHVzJyk7CiAgICAgICAgICAgICAgICAgICAgaWYgKGVsKSB7 +CiAgICAgICAgICAgICAgICAgICAgICAgIGVsLnRleHRDb250ZW50ID0gJ0QuUi5JLlYuRS4gYWt0 +dWFsaXNpZXJ0JzsKICAgICAgICAgICAgICAgICAgICAgICAgZWwuY2xhc3NMaXN0LmFkZCgndmlz +aWJsZScpOwogICAgICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IGVsLmNsYXNz +TGlzdC5yZW1vdmUoJ3Zpc2libGUnKSwgNDAwMCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAg +ICAgICAgICAgICAgfQogICAgICAgICAgICB9IGNhdGNoIChlcnIpIHsKICAgICAgICAgICAgICAg +IGNvbnNvbGUud2FybignU3luYy1GZWhsZXI6JywgZXJyKTsKICAgICAgICAgICAgfQogICAgICAg +IH0sIDMwMDAwMCk7CiAgICB9Cn07CgovLyA9PT09PT09PT09PT09PT09PT09PT0gUE9SVEFMIFVJ +ID09PT09PT09PT09PT09PT09PT09PQoKLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 +PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLy8gTW9kdWw6 +IERyaXZlUG9ydGFsIC0gRG9rdW1lbnRlbmxpc3RlLCBGaWx0ZXIsIERldGFpbGFuc2ljaHQKLy8g +WnVzdGFlbmRpZyBmdWVyOiBSZW5kZXJuIGRlciBEb2t1bWVudGVubGlzdGUsIFN1Y2hlcmdlYm5p +c3NlLCBEZXRhaWwtVmlldywgVGFiZWxsZW5hbnNpY2h0Ci8vIFNpY2hlcmhlaXQ6IEFsbGUgQmVu +dXR6ZXJkYXRlbiB3ZXJkZW4gdm9yIGRlciBEYXJzdGVsbHVuZyB1ZWJlciBlc2NhcGVIVE1MKCkg +LyBlc2NhcGVBdHRyKCkKLy8gICAgICAgICAgICAgYmVyZWluaWd0IChYU1MtU2NodXR6KS4gU2lj +aHRiYXJrZWl0c2ZpbHRlciAoY2FuU2VlRG9jdW1lbnQpIGlzdCByZWluIGNsaWVudHNlaXRpZwov +LyAgICAgICAgICAgICB1bmQgZGllbnQgZGVyIEJlbnV0emVyZnVlaHJ1bmcgLSBkaWUgc2VydmVy +c2VpdGlnZSBBdXRvcmlzaWVydW5nIGJsZWlidCBtYXNzZ2VibGljaC4KLy8gPT09PT09PT09PT09 +PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 +PT09PT09PT0KY29uc3QgRHJpdmVQb3J0YWwgPSB7CiAgICBmaWx0ZXJlZERvY3VtZW50czogW10s +CiAgICBzZWxlY3RlZERvY0lkOiBudWxsLAogICAgY3VycmVudENhdGVnb3J5RmlsdGVyOiAnYWxs +JywKICAgIGN1cnJlbnRTdGF0dXNGaWx0ZXI6ICdhbGwnLAogICAgdGFibGVWaWV3QWN0aXZlOiBm +YWxzZSwKICAgIF90YWJsZVNvcnRDb2w6ICdlcnN0ZWxsdCcsCiAgICBfdGFibGVTb3J0RGlyOiAn +ZGVzYycsCgogICAgYXN5bmMgaW5pdCgpIHsKICAgICAgICAvLyBTdGFydHNlaXRlbi1IVE1MOiB3 +aXJkIGluaXRpYWwgYXVzIGRlbSBET00gZ2VsZXNlbiwgc3BhZXRlciB2b24KICAgICAgICAvLyBs +b2FkU3RhcnRzZWl0ZSgpL3NhdmVTdGFydHNlaXRlKCkgbWl0IGRlbSBnZXNwZWljaGVydGVuIElu +aGFsdCB1ZWJlcnNjaHJpZWJlbi4KICAgICAgICB0aGlzLl93ZWxjb21lSFRNTCA9IGRvY3VtZW50 +LmdldEVsZW1lbnRCeUlkKCdkb2N1bWVudERldGFpbCcpLmlubmVySFRNTDsKICAgICAgICB0aGlz +LnNldHVwRmlsdGVycygpOwogICAgICAgIHRoaXMuc2V0dXBFdmVudExpc3RlbmVycygpOwogICAg +ICAgIGF3YWl0IHRoaXMubG9hZExvY2tzKCk7CiAgICAgICAgdGhpcy5yZW5kZXIoKTsKICAgIH0s +CgogICAgc2V0dXBGaWx0ZXJzKCkgewogICAgICAgIGNvbnN0IGNhdENvbnRhaW5lciA9IGRvY3Vt +ZW50LmdldEVsZW1lbnRCeUlkKCdjYXRlZ29yeUZpbHRlcnMnKTsKICAgICAgICBjYXRDb250YWlu +ZXIuaW5uZXJIVE1MID0gJyc7CgogICAgICAgIC8vICJBbGxlIiBCdXR0b24KICAgICAgICBjb25z +dCBhbGxCdG4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdidXR0b24nKTsKICAgICAgICBhbGxC +dG4uY2xhc3NOYW1lID0gJ2ZpbHRlci1idG4gYWN0aXZlJzsKICAgICAgICBhbGxCdG4uc2V0QXR0 +cmlidXRlKCdkYXRhLWZpbHRlcicsICdhbGwnKTsKICAgICAgICBhbGxCdG4udGV4dENvbnRlbnQg +PSAnQWxsZSc7CiAgICAgICAgYWxsQnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4g +dGhpcy5zZXRDYXRlZ29yeSgnYWxsJykpOwogICAgICAgIGNhdENvbnRhaW5lci5hcHBlbmRDaGls +ZChhbGxCdG4pOwoKICAgICAgICAvLyBLYXRlZ29yaWUtQnV0dG9ucyAoYWxwaGFiZXRpc2NoIHNv +cnRpZXJ0LCBhdXNnZWJsZW5kZXRlIHVlYmVyc3ByaW5nZW4pCiAgICAgICAgdmFyIGhpZGRlbkth +dHMgPSBEcml2ZUZTLmNvbmZpZy5oaWRkZW5LYXRlZ29yaWVuIHx8IFtdOwogICAgICAgIChEcml2 +ZUZTLmNvbmZpZy5rYXRlZ29yaWVuIHx8IFtdKS5zbGljZSgpLnNvcnQoZnVuY3Rpb24oYSxiKXsg +cmV0dXJuIGEubG9jYWxlQ29tcGFyZShiLCAnZGUnKTsgfSkuZm9yRWFjaChrYXQgPT4gewogICAg +ICAgICAgICBpZiAoaGlkZGVuS2F0cy5pbmNsdWRlcyhrYXQpKSByZXR1cm47CiAgICAgICAgICAg +IGNvbnN0IGJ0biA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2J1dHRvbicpOwogICAgICAgICAg +ICBidG4uY2xhc3NOYW1lID0gJ2ZpbHRlci1idG4nOwogICAgICAgICAgICBidG4uc2V0QXR0cmli +dXRlKCdkYXRhLWZpbHRlcicsIGthdCk7CiAgICAgICAgICAgIGJ0bi50ZXh0Q29udGVudCA9IGth +dDsKICAgICAgICAgICAgYnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4gdGhpcy5z +ZXRDYXRlZ29yeShrYXQpKTsKICAgICAgICAgICAgY2F0Q29udGFpbmVyLmFwcGVuZENoaWxkKGJ0 +bik7CiAgICAgICAgfSk7CgogICAgICAgIC8vIFN0YXR1cy1GaWx0ZXIgKGltIExlc2Vtb2R1cyBh +dXNibGVuZGVuIOKAkyBlcyBnaWJ0IG51ciBmcmVpZ2VnZWJlbmUgRG9rdW1lbnRlKQogICAgICAg +IGNvbnN0IHN0YXR1c0NvbnRhaW5lciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdGF0dXNG +aWx0ZXJzJyk7CiAgICAgICAgc3RhdHVzQ29udGFpbmVyLmlubmVySFRNTCA9ICcnOwoKICAgICAg +ICBpZiAoRHJpdmVGUy5tb2RlID09PSAnc3RhdGljJykgewogICAgICAgICAgICAvLyBMZXNlbW9k +dXM6IEtlaW5lIFN0YXR1cy1GaWx0ZXIgbm9ldGlnCiAgICAgICAgICAgIHN0YXR1c0NvbnRhaW5l +ci5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHN0 +YXR1c0NvbnRhaW5lci5zdHlsZS5kaXNwbGF5ID0gJyc7CiAgICAgICAgICAgIGNvbnN0IGFsbFN0 +YXR1c0J0biA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2J1dHRvbicpOwogICAgICAgICAgICBh +bGxTdGF0dXNCdG4uY2xhc3NOYW1lID0gJ3N0YXR1cy1maWx0ZXItYnRuIGFjdGl2ZSc7CiAgICAg +ICAgICAgIGFsbFN0YXR1c0J0bi5zZXRBdHRyaWJ1dGUoJ2RhdGEtc3RhdHVzJywgJ2FsbCcpOwog +ICAgICAgICAgICBhbGxTdGF0dXNCdG4udGV4dENvbnRlbnQgPSAnQWxsZSBTdGF0dXMnOwogICAg +ICAgICAgICBhbGxTdGF0dXNCdG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB0aGlz +LnNldFN0YXR1cygnYWxsJykpOwogICAgICAgICAgICBzdGF0dXNDb250YWluZXIuYXBwZW5kQ2hp +bGQoYWxsU3RhdHVzQnRuKTsKCiAgICAgICAgICAgIGNvbnN0IGlzU1UgPSBEcml2ZUdvdmVybmFu +Y2UuaXNTdXBlclVzZXIoKTsKICAgICAgICAgICAgY29uc3QgaXNGQSA9IERyaXZlR292ZXJuYW5j +ZS5pc0ZhY2hhdWZzaWNodCgpOwogICAgICAgICAgICBjb25zdCBzdGF0dXNDb25maWcgPSBEcml2 +ZUZTLmNvbmZpZy5zdGF0dXMgfHwge307CiAgICAgICAgICAgIE9iamVjdC5rZXlzKHN0YXR1c0Nv +bmZpZykuZm9yRWFjaChzdGF0dXMgPT4gewogICAgICAgICAgICAgICAgLy8gIkFiZ2VsZWhudCIg +bnVyIGZ1ZXIgU3VwZXJVc2VyIHVuZCBGYWNoYXVmc2ljaHQKICAgICAgICAgICAgICAgIGlmIChz +dGF0dXMgPT09ICdBYmdlbGVobnQnICYmICFpc1NVICYmICFpc0ZBKSByZXR1cm47CiAgICAgICAg +ICAgICAgICBjb25zdCBjZmcgPSBzdGF0dXNDb25maWdbc3RhdHVzXTsKICAgICAgICAgICAgICAg +IGNvbnN0IGJ0biA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2J1dHRvbicpOwogICAgICAgICAg +ICAgICAgYnRuLmNsYXNzTmFtZSA9ICdzdGF0dXMtZmlsdGVyLWJ0bic7CiAgICAgICAgICAgICAg +ICBidG4uc2V0QXR0cmlidXRlKCdkYXRhLXN0YXR1cycsIHN0YXR1cyk7CiAgICAgICAgICAgICAg +ICBidG4uaW5uZXJIVE1MID0gY2ZnLmxhYmVsOwogICAgICAgICAgICAgICAgYnRuLnN0eWxlLmJv +cmRlckNvbG9yID0gY2ZnLmNvbG9yOwogICAgICAgICAgICAgICAgYnRuLmFkZEV2ZW50TGlzdGVu +ZXIoJ2NsaWNrJywgKCkgPT4gdGhpcy5zZXRTdGF0dXMoc3RhdHVzKSk7CiAgICAgICAgICAgICAg +ICBzdGF0dXNDb250YWluZXIuYXBwZW5kQ2hpbGQoYnRuKTsKICAgICAgICAgICAgfSk7CiAgICAg +ICAgfQogICAgfSwKCiAgICBzZXR1cEV2ZW50TGlzdGVuZXJzKCkgewogICAgICAgIGRvY3VtZW50 +LmdldEVsZW1lbnRCeUlkKCdzZWFyY2hJbnB1dCcpLmFkZEV2ZW50TGlzdGVuZXIoJ2tleXVwJywg +KCkgPT4gdGhpcy5yZW5kZXIoKSk7CiAgICB9LAoKICAgIHNldENhdGVnb3J5KGNhdCkgewogICAg +ICAgIHRoaXMuY3VycmVudENhdGVnb3J5RmlsdGVyID0gY2F0OwogICAgICAgIGRvY3VtZW50LnF1 +ZXJ5U2VsZWN0b3JBbGwoJyNjYXRlZ29yeUZpbHRlcnMgLmZpbHRlci1idG4nKS5mb3JFYWNoKGJ0 +biA9PiB7CiAgICAgICAgICAgIGJ0bi5jbGFzc0xpc3QudG9nZ2xlKCdhY3RpdmUnLCBidG4uZ2V0 +QXR0cmlidXRlKCdkYXRhLWZpbHRlcicpID09PSBjYXQpOwogICAgICAgIH0pOwogICAgICAgIHRo +aXMucmVuZGVyKCk7CiAgICB9LAoKICAgIHNldFN0YXR1cyhzdGF0dXMpIHsKICAgICAgICB0aGlz +LmN1cnJlbnRTdGF0dXNGaWx0ZXIgPSBzdGF0dXM7CiAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxl +Y3RvckFsbCgnI3N0YXR1c0ZpbHRlcnMgLnN0YXR1cy1maWx0ZXItYnRuJykuZm9yRWFjaChidG4g +PT4gewogICAgICAgICAgICBidG4uY2xhc3NMaXN0LnRvZ2dsZSgnYWN0aXZlJywgYnRuLmdldEF0 +dHJpYnV0ZSgnZGF0YS1zdGF0dXMnKSA9PT0gc3RhdHVzKTsKICAgICAgICB9KTsKICAgICAgICB0 +aGlzLnJlbmRlcigpOwogICAgfSwKCiAgICByZW5kZXIoKSB7CiAgICAgICAgY29uc3Qgc2VhcmNo +ID0gKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZWFyY2hJbnB1dCcpLnZhbHVlIHx8ICcnKS50 +b0xvd2VyQ2FzZSgpOwoKICAgICAgICB0aGlzLmZpbHRlcmVkRG9jdW1lbnRzID0gRHJpdmVGUy5k +b2N1bWVudHMuZmlsdGVyKGRvYyA9PiB7CiAgICAgICAgICAgIC8vIEdvdmVybmFuY2U6IFNpY2h0 +YmFya2VpdHNwcnVlZnVuZwogICAgICAgICAgICBpZiAoIURyaXZlR292ZXJuYW5jZS5jYW5TZWVE +b2N1bWVudChkb2MpKSByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIGlmICh0aGlzLmN1cnJlbnRD +YXRlZ29yeUZpbHRlciAhPT0gJ2FsbCcgJiYgZG9jLmthdGVnb3JpZSAhPT0gdGhpcy5jdXJyZW50 +Q2F0ZWdvcnlGaWx0ZXIpIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgaWYgKHRoaXMuY3VycmVu +dFN0YXR1c0ZpbHRlciAhPT0gJ2FsbCcgJiYgZG9jLnN0YXR1cyAhPT0gdGhpcy5jdXJyZW50U3Rh +dHVzRmlsdGVyKSByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIGlmIChzZWFyY2gpIHsKICAgICAg +ICAgICAgICAgIGNvbnN0IG1hdGNoID0gKGRvYy50aXRlbCB8fCAnJykudG9Mb3dlckNhc2UoKS5p +bmNsdWRlcyhzZWFyY2gpIHx8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkb2MuaW5o +YWx0IHx8ICcnKS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHNlYXJjaCkgfHwKICAgICAgICAgICAg +ICAgICAgICAgICAgICAgICAgKGRvYy5rYXRlZ29yaWUgfHwgJycpLnRvTG93ZXJDYXNlKCkuaW5j +bHVkZXMoc2VhcmNoKSB8fAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZG9jLnNjaGxh +Z3dvZXJ0ZXIgfHwgW10pLnNvbWUoayA9PiBrLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoc2VhcmNo +KSk7CiAgICAgICAgICAgICAgICBpZiAoIW1hdGNoKSByZXR1cm4gZmFsc2U7CiAgICAgICAgICAg +IH0KICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfSk7CgogICAgICAgIHRoaXMucmVu +ZGVyTGlzdCgpOwogICAgICAgIGlmICh0aGlzLnRhYmxlVmlld0FjdGl2ZSkgdGhpcy5yZW5kZXJU +YWJsZVZpZXcoKTsKICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZG9jQ291bnQnKS50 +ZXh0Q29udGVudCA9IHRoaXMuZmlsdGVyZWREb2N1bWVudHMubGVuZ3RoICsgJyAvICcgKyBEcml2 +ZUZTLmRvY3VtZW50cy5sZW5ndGg7CgogICAgICAgIC8vIFVwZGF0ZSBjb25uZWN0aW9uIHRleHQK +ICAgICAgICBEcml2ZUZTLnVwZGF0ZUNvbm5lY3Rpb25VSSh0cnVlKTsKICAgIH0sCgogICAgYWN0 +aXZlTG9ja3M6IHt9LCAgLy8gZG9jSWQgLT4geyB1c2VybmFtZSwgbWludXRlcyB9CgogICAgYXN5 +bmMgbG9hZExvY2tzKCkgewogICAgICAgIGlmIChEcml2ZUZTLm1vZGUgIT09ICdzZXJ2ZXInKSBy +ZXR1cm47CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2go +Jy9hcGkvbG9ja3MnKTsKICAgICAgICAgICAgaWYgKHJlcy5vaykgewogICAgICAgICAgICAgICAg +Y29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7CiAgICAgICAgICAgICAgICB0aGlzLmFjdGl2 +ZUxvY2tzID0ge307CiAgICAgICAgICAgICAgICAoZGF0YS5sb2NrcyB8fCBbXSkuZm9yRWFjaChs +ID0+IHsKICAgICAgICAgICAgICAgICAgICB0aGlzLmFjdGl2ZUxvY2tzW2wuZG9jSWRdID0geyB1 +c2VybmFtZTogbC51c2VybmFtZSwgbWludXRlczogbC5taW51dGVzIH07CiAgICAgICAgICAgICAg +ICB9KTsKICAgICAgICAgICAgfQogICAgICAgIH0gY2F0Y2gge30KICAgIH0sCgogICAgX3NvcnRX +aXRoQ2hpbGRyZW4oZG9jcykgewogICAgICAgIC8vIFNvcnRpZXJlOiBFbHRlcm5hcnRpa2VsIHp1 +ZXJzdCwgS2luZGVyIGRpcmVrdCBkYWhpbnRlcgogICAgICAgIGNvbnN0IHRvcExldmVsID0gZG9j +cy5maWx0ZXIoZnVuY3Rpb24oZCl7IHJldHVybiAhZC5wYXJlbnRJZDsgfSk7CiAgICAgICAgY29u +c3QgY2hpbGRNYXAgPSB7fTsKICAgICAgICBkb2NzLmZpbHRlcihmdW5jdGlvbihkKXsgcmV0dXJu +IGQucGFyZW50SWQ7IH0pLmZvckVhY2goZnVuY3Rpb24oZCl7CiAgICAgICAgICAgIGlmICghY2hp +bGRNYXBbZC5wYXJlbnRJZF0pIGNoaWxkTWFwW2QucGFyZW50SWRdID0gW107CiAgICAgICAgICAg +IGNoaWxkTWFwW2QucGFyZW50SWRdLnB1c2goZCk7CiAgICAgICAgfSk7CiAgICAgICAgdmFyIHJl +c3VsdCA9IFtdOwogICAgICAgIHRvcExldmVsLmZvckVhY2goZnVuY3Rpb24ocCl7CiAgICAgICAg +ICAgIHJlc3VsdC5wdXNoKHApOwogICAgICAgICAgICBpZiAoY2hpbGRNYXBbcC5pZF0pIGNoaWxk +TWFwW3AuaWRdLmZvckVhY2goZnVuY3Rpb24oYyl7IHJlc3VsdC5wdXNoKGMpOyB9KTsKICAgICAg +ICB9KTsKICAgICAgICAvLyBXYWlzZW4tS2luZGVyIChFbHRlcm4gbmljaHQgaW4gZGVyIGdlZmls +dGVydGVuIExpc3RlKQogICAgICAgIGRvY3MuZmlsdGVyKGZ1bmN0aW9uKGQpeyByZXR1cm4gZC5w +YXJlbnRJZCAmJiAhdG9wTGV2ZWwuZmluZChmdW5jdGlvbih0KXtyZXR1cm4gdC5pZD09PWQucGFy +ZW50SWQ7fSk7IH0pLmZvckVhY2goZnVuY3Rpb24oZCl7CiAgICAgICAgICAgIGlmIChyZXN1bHQu +aW5kZXhPZihkKSA9PT0gLTEpIHJlc3VsdC5wdXNoKGQpOwogICAgICAgIH0pOwogICAgICAgIHJl +dHVybiByZXN1bHQ7CiAgICB9LAoKICAgIHJlbmRlckxpc3QoKSB7CiAgICAgICAgY29uc3QgbGlz +dENvbnRhaW5lciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkb2N1bWVudExpc3QnKTsKICAg +ICAgICBjb25zdCBzdGF0dXNDb25maWcgPSBEcml2ZUZTLmNvbmZpZy5zdGF0dXMgfHwge307Cgog +ICAgICAgIGlmICh0aGlzLmZpbHRlcmVkRG9jdW1lbnRzLmxlbmd0aCA9PT0gMCkgewogICAgICAg +ICAgICBsaXN0Q29udGFpbmVyLmlubmVySFRNTCA9ICc8ZGl2IGNsYXNzPSJlbXB0eS1zdGF0ZSI+ +PHA+S2VpbmUgRG9rdW1lbnRlIGdlZnVuZGVuLjwvcD48L2Rpdj4nOwogICAgICAgICAgICByZXR1 +cm47CiAgICAgICAgfQoKICAgICAgICBjb25zdCBzb3J0ZWQgPSB0aGlzLl9zb3J0V2l0aENoaWxk +cmVuKHRoaXMuZmlsdGVyZWREb2N1bWVudHMpOwogICAgICAgIGxpc3RDb250YWluZXIuaW5uZXJI +VE1MID0gc29ydGVkLm1hcChkb2MgPT4gewogICAgICAgICAgICBjb25zdCBjZmcgPSBzdGF0dXND +b25maWdbZG9jLnN0YXR1c10gfHwgeyBjb2xvcjogJyNlZWUnLCB0ZXh0Q29sb3I6ICcjMzMzJywg +aWNvbjogJycgfTsKICAgICAgICAgICAgY29uc3QgaXNBY3RpdmUgPSB0aGlzLnNlbGVjdGVkRG9j +SWQgPT09IGRvYy5pZDsKICAgICAgICAgICAgY29uc3QgaXNEcmFmdCA9IGRvYy5zdGF0dXMgPT09 +ICdFbnR3dXJmJzsKICAgICAgICAgICAgY29uc3QgaGFzTWVkaWEgPSBkb2MubWVkaWFzICYmIGRv +Yy5tZWRpYXMubGVuZ3RoID4gMDsKICAgICAgICAgICAgY29uc3QgbG9jayA9IHRoaXMuYWN0aXZl +TG9ja3NbZG9jLmlkXTsKICAgICAgICAgICAgY29uc3QgaXNMb2NrZWQgPSBsb2NrICYmIGxvY2su +dXNlcm5hbWUgIT09IChEcml2ZUZTLmVudmlyb24gPyBEcml2ZUZTLmVudmlyb24udXNlcm5hbWUg +OiAnJyk7CgogICAgICAgICAgICAvLyBTdGF0dXMtQmFkZ2U6ICJGcmVpZ2VnZWJlbiIgbmljaHQg +YW56ZWlnZW4gKGlzdCBkZXIgTm9ybWFsenVzdGFuZCkKICAgICAgICAgICAgdmFyIHNob3dTdGF0 +dXMgPSBkb2Muc3RhdHVzICE9PSAnRnJlaWdlZ2ViZW4nOwoKICAgICAgICAgICAgcmV0dXJuICc8 +ZGl2IGNsYXNzPSJkb2N1bWVudC1pdGVtJyArIChpc0FjdGl2ZSA/ICcgYWN0aXZlJyA6ICcnKSAr +IChpc0RyYWZ0ID8gJyBkcmFmdCcgOiAnJykgKyAoZG9jLnBhcmVudElkID8gJyBjaGlsZC1hcnRp +Y2xlJyA6ICcnKSArICciIG9uY2xpY2s9IkRyaXZlUG9ydGFsLnNlbGVjdERvY3VtZW50KFwnJyAr +IERyaXZlUG9ydGFsLmVzY2FwZUF0dHIoZG9jLmlkKSArICdcJykiPicgKwogICAgICAgICAgICAg +ICAgJzxkaXYgc3R5bGU9ImRpc3BsYXk6ZmxleDtqdXN0aWZ5LWNvbnRlbnQ6c3BhY2UtYmV0d2Vl +bjthbGlnbi1pdGVtczpmbGV4LXN0YXJ0OyI+JyArCiAgICAgICAgICAgICAgICAgICAgJzxkaXYg +c3R5bGU9ImZsZXg6MTttaW4td2lkdGg6MDsiPicgKwogICAgICAgICAgICAgICAgICAgICAgICAn +PGRpdiBjbGFzcz0iZG9jLWl0ZW0tdGl0bGUiPicgKyB0aGlzLmVzY2FwZUhUTUwoZG9jLnRpdGVs +KSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaXNMb2NrZWQgPyAnIDxzcGFuIHN0eWxl +PSJmb250LXNpemU6MTFweDsgY29sb3I6I2RjMzU0NTsgZm9udC13ZWlnaHQ6NDAwOyIgdGl0bGU9 +IldpcmQgYmVhcmJlaXRldCB2b24gJyArIHRoaXMuZXNjYXBlQXR0cihsb2NrLnVzZXJuYW1lKSAr +ICciPltnZXNwZXJydDogJyArIHRoaXMuZXNjYXBlSFRNTChsb2NrLnVzZXJuYW1lKSArICddPC9z +cGFuPicgOiAnJykgKwogICAgICAgICAgICAgICAgICAgICAgICAnPC9kaXY+JyArCiAgICAgICAg +ICAgICAgICAgICAgICAgICc8ZGl2IGNsYXNzPSJkb2MtaXRlbS1tZXRhIj4nICsKICAgICAgICAg +ICAgICAgICAgICAgICAgICAgICc8ZGl2IGNsYXNzPSJkb2MtaXRlbS1jYXRlZ29yeSI+JyArIHRo +aXMuZXNjYXBlSFRNTChkb2Mua2F0ZWdvcmllKSArICc8L2Rpdj4nICsKICAgICAgICAgICAgICAg +ICAgICAgICAgICAgIChoYXNNZWRpYSA/ICc8c3BhbiBzdHlsZT0iZm9udC1zaXplOjExcHg7IGNv +bG9yOnZhcigtLXRleHQtbXV0ZWQpOyI+K01lZGllbjwvc3Bhbj4nIDogJycpICsKICAgICAgICAg +ICAgICAgICAgICAgICAgJzwvZGl2PicgKwogICAgICAgICAgICAgICAgICAgICAgICAnPGRpdiBj +bGFzcz0iZG9jLWl0ZW0tZGF0ZSI+JyArIGZvcm1hdERhdGUoZG9jLmVyc3RlbGx0KSArCiAgICAg +ICAgICAgICAgICAgICAgICAgICAgICAoZG9jLmJlYXJiZWl0ZXRWb24gPyAnIHwgJyArIHRoaXMu +ZXNjYXBlSFRNTChkb2MuYmVhcmJlaXRldFZvbikgOiAnJykgKwogICAgICAgICAgICAgICAgICAg +ICAgICAnPC9kaXY+JyArCiAgICAgICAgICAgICAgICAgICAgICAgIChkb2MucGFyZW50SWQgPyAn +PGRpdiBjbGFzcz0iZG9jLXBhcmVudC1yZWYiPuKGsyBVbnRlcmFydGlrZWw8L2Rpdj4nIDogJycp +ICsKICAgICAgICAgICAgICAgICAgICAnPC9kaXY+JyArCiAgICAgICAgICAgICAgICAgICAgKHNo +b3dTdGF0dXMgPyAnPGRpdiBjbGFzcz0ic3RhdHVzLWJhZGdlLXNtYWxsIiBzdHlsZT0iYmFja2dy +b3VuZC1jb2xvcjonICsgY2ZnLmNvbG9yICsgJzsgY29sb3I6JyArIGNmZy50ZXh0Q29sb3IgKyAn +O2ZsZXgtc2hyaW5rOjA7bWFyZ2luLWxlZnQ6OHB4O21hcmdpbi10b3A6MnB4OyI+JyArIGRvYy5z +dGF0dXMgKyAnPC9kaXY+JyA6ICcnKSArCiAgICAgICAgICAgICAgICAnPC9kaXY+JyArCiAgICAg +ICAgICAgICc8L2Rpdj4nOwogICAgICAgIH0pLmpvaW4oJycpOwogICAgfSwKCiAgICB0b2dnbGVU +YWJsZVZpZXcoKSB7CiAgICAgICAgdGhpcy50YWJsZVZpZXdBY3RpdmUgPSAhdGhpcy50YWJsZVZp +ZXdBY3RpdmU7CiAgICAgICAgY29uc3QgY29udGFpbmVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5 +SWQoJ2NvbnRhaW5lcicpOwogICAgICAgIGNvbnN0IHRhYmxlQ29udGFpbmVyID0gZG9jdW1lbnQu +Z2V0RWxlbWVudEJ5SWQoJ3RhYmxlVmlld0NvbnRhaW5lcicpOwogICAgICAgIGNvbnN0IGJ0biA9 +IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdidG5UYWJsZVZpZXcnKTsKICAgICAgICBpZiAodGhp +cy50YWJsZVZpZXdBY3RpdmUpIHsKICAgICAgICAgICAgY29udGFpbmVyLnN0eWxlLmRpc3BsYXkg +PSAnbm9uZSc7CiAgICAgICAgICAgIHRhYmxlQ29udGFpbmVyLmNsYXNzTGlzdC5hZGQoJ2FjdGl2 +ZScpOwogICAgICAgICAgICBidG4uc3R5bGUuYmFja2dyb3VuZENvbG9yID0gJ3ZhcigtLXRleHQt +aGVhZGluZyknOyBidG4uc3R5bGUuY29sb3IgPSAnd2hpdGUnOwogICAgICAgICAgICB0aGlzLnJl +bmRlclRhYmxlVmlldygpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGNvbnRhaW5lci5z +dHlsZS5kaXNwbGF5ID0gJyc7CiAgICAgICAgICAgIHRhYmxlQ29udGFpbmVyLmNsYXNzTGlzdC5y +ZW1vdmUoJ2FjdGl2ZScpOwogICAgICAgICAgICBidG4uc3R5bGUuYmFja2dyb3VuZENvbG9yID0g +Jyc7IGJ0bi5zdHlsZS5jb2xvciA9ICcnOwogICAgICAgIH0KICAgIH0sCgogICAgc29ydFRhYmxl +KGNvbCkgewogICAgICAgIGlmICh0aGlzLl90YWJsZVNvcnRDb2wgPT09IGNvbCkgewogICAgICAg +ICAgICB0aGlzLl90YWJsZVNvcnREaXIgPSB0aGlzLl90YWJsZVNvcnREaXIgPT09ICdhc2MnID8g +J2Rlc2MnIDogJ2FzYyc7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgdGhpcy5fdGFibGVT +b3J0Q29sID0gY29sOwogICAgICAgICAgICB0aGlzLl90YWJsZVNvcnREaXIgPSAnYXNjJzsKICAg +ICAgICB9CiAgICAgICAgdGhpcy5yZW5kZXJUYWJsZVZpZXcoKTsKICAgIH0sCgogICAgX3RhYmxl +U2VsZWN0ZWQ6IFtdLAoKICAgIHJlbmRlclRhYmxlVmlldygpIHsKICAgICAgICBjb25zdCBkb2Nz +ID0gdGhpcy5maWx0ZXJlZERvY3VtZW50czsKICAgICAgICBjb25zdCBjb2wgPSB0aGlzLl90YWJs +ZVNvcnRDb2w7CiAgICAgICAgY29uc3QgZGlyID0gdGhpcy5fdGFibGVTb3J0RGlyID09PSAnYXNj +JyA/IDEgOiAtMTsKICAgICAgICBjb25zdCBzb3J0ZWQgPSBbLi4uZG9jc10uc29ydChmdW5jdGlv +bihhLCBiKSB7CiAgICAgICAgICAgIHZhciB2YSwgdmI7CiAgICAgICAgICAgIGlmIChjb2wgPT09 +ICdzY2hsYWd3b2VydGVyJykgewogICAgICAgICAgICAgICAgdmEgPSAoYS5zY2hsYWd3b2VydGVy +IHx8IFtdKS5qb2luKCcsJyk7IHZiID0gKGIuc2NobGFnd29lcnRlciB8fCBbXSkuam9pbignLCcp +OwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgdmEgPSAoYVtjb2xdIHx8ICcn +KTsgdmIgPSAoYltjb2xdIHx8ICcnKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodHlw +ZW9mIHZhID09PSAnc3RyaW5nJykgcmV0dXJuIHZhLmxvY2FsZUNvbXBhcmUodmIsICdkZScpICog +ZGlyOwogICAgICAgICAgICByZXR1cm4gKHZhIC0gdmIpICogZGlyOwogICAgICAgIH0pOwoKICAg +ICAgICBjb25zdCBzYyA9IHRoaXMuX3RhYmxlU29ydENvbDsKICAgICAgICBjb25zdCBzZCA9IHRo +aXMuX3RhYmxlU29ydERpcjsKICAgICAgICB2YXIgY2xzID0gZnVuY3Rpb24oYykgeyByZXR1cm4g +YyA9PT0gc2MgPyAnIGNsYXNzPSJzb3J0ZWQtJyArIHNkICsgJyInIDogJyc7IH07CiAgICAgICAg +Y29uc3Qgc3RhdHVzQ29uZmlnID0gRHJpdmVGUy5jb25maWcuc3RhdHVzIHx8IHt9OwogICAgICAg +IC8vIEFkbWluLUZ1bmt0aW9uZW4gKENoZWNrYm94ZW4sIFN0aWZ0KSBudXIgd2VubjoKICAgICAg +ICAvLyAxLiBTZXJ2ZXItTW9kdXMgYWt0aXYgKHNlcnZlcnNlaXRpZ2VyIFNjaHV0eiB2b3JoYW5k +ZW4pCiAgICAgICAgLy8gMi4gR292ZXJuYW5jZS1EYXRlbiBnZWxhZGVuIFVORCBVc2VyIGlzdCBT +VS9GQQogICAgICAgIHZhciBoYXNHb3Zlcm5hbmNlID0gRHJpdmVHb3Zlcm5hbmNlLmRhdGEgJiYg +RHJpdmVHb3Zlcm5hbmNlLmRhdGEuc3VwZXJVc2VyczsKICAgICAgICB2YXIgaXNBZG1pbiA9IERy +aXZlRlMubW9kZSA9PT0gJ3NlcnZlcicgJiYgaGFzR292ZXJuYW5jZSAmJiAoRHJpdmVHb3Zlcm5h +bmNlLmlzU3VwZXJVc2VyKCkgfHwgRHJpdmVHb3Zlcm5hbmNlLmlzRmFjaGF1ZnNpY2h0KCkpOwog +ICAgICAgIHRoaXMuX3RhYmxlU2VsZWN0ZWQgPSBbXTsKCiAgICAgICAgLy8gQnVsay1Ba3Rpb25z +bGVpc3RlIChudXIgU1UvRkEpCiAgICAgICAgdmFyIGh0bWwgPSAnJzsKICAgICAgICBpZiAoaXNB +ZG1pbikgewogICAgICAgICAgICBodG1sICs9ICc8ZGl2IGlkPSJ0YWJsZUJ1bGtCYXIiIHN0eWxl +PSJkaXNwbGF5Om5vbmU7cGFkZGluZzo4cHggMTRweDtiYWNrZ3JvdW5kOnZhcigtLXRleHQtaGVh +ZGluZyk7Y29sb3I6d2hpdGU7Ym9yZGVyLXJhZGl1czo2cHg7bWFyZ2luLWJvdHRvbTo4cHg7ZGlz +cGxheTpub25lO2FsaWduLWl0ZW1zOmNlbnRlcjtnYXA6MTBweDtmb250LXNpemU6MTNweDsiPicg +KwogICAgICAgICAgICAgICAgJzxzcGFuIGlkPSJ0YWJsZUJ1bGtDb3VudCI+MCBhdXNnZXfDpGhs +dDwvc3Bhbj4nICsKICAgICAgICAgICAgICAgICc8YnV0dG9uIG9uY2xpY2s9IkRyaXZlUG9ydGFs +LmJ1bGtRdWlja0VkaXQoKSIgc3R5bGU9InBhZGRpbmc6NHB4IDEycHg7Ym9yZGVyOjFweCBzb2xp +ZCB3aGl0ZTtiYWNrZ3JvdW5kOnRyYW5zcGFyZW50O2NvbG9yOndoaXRlO2JvcmRlci1yYWRpdXM6 +NHB4O2N1cnNvcjpwb2ludGVyO2ZvbnQtc2l6ZToxMnB4OyI+U2NobmVsbGJlYXJiZWl0dW5nPC9i +dXR0b24+JyArCiAgICAgICAgICAgICAgICAnPGJ1dHRvbiBvbmNsaWNrPSJEcml2ZVBvcnRhbC5i +dWxrRGVsZXRlKCkiIHN0eWxlPSJwYWRkaW5nOjRweCAxMnB4O2JvcmRlcjoxcHggc29saWQgI2Y4 +ODtiYWNrZ3JvdW5kOnRyYW5zcGFyZW50O2NvbG9yOiNmYWE7Ym9yZGVyLXJhZGl1czo0cHg7Y3Vy +c29yOnBvaW50ZXI7Zm9udC1zaXplOjEycHg7Ij5Mw7ZzY2hlbjwvYnV0dG9uPicgKwogICAgICAg +ICAgICAnPC9kaXY+JzsKICAgICAgICB9CgogICAgICAgIGh0bWwgKz0gJzx0YWJsZSBjbGFzcz0i +ZHJpdmUtdGFibGUiPjx0aGVhZD48dHI+JyArCiAgICAgICAgICAgIChpc0FkbWluID8gJzx0aCBz +dHlsZT0id2lkdGg6MzBweDsiPjxpbnB1dCB0eXBlPSJjaGVja2JveCIgaWQ9InRhYmxlU2VsZWN0 +QWxsIiBvbmNoYW5nZT0iRHJpdmVQb3J0YWwudGFibGVUb2dnbGVBbGwodGhpcy5jaGVja2VkKSIg +dGl0bGU9IkFsbGUgYXVzd8OkaGxlbiI+PC90aD4nIDogJycpICsKICAgICAgICAgICAgJzx0aCcg +KyBjbHMoJ3RpdGVsJykgKyAnIG9uY2xpY2s9IkRyaXZlUG9ydGFsLnNvcnRUYWJsZShcJ3RpdGVs +XCcpIj5UaXRlbDwvdGg+JyArCiAgICAgICAgICAgICc8dGgnICsgY2xzKCdrYXRlZ29yaWUnKSAr +ICcgb25jbGljaz0iRHJpdmVQb3J0YWwuc29ydFRhYmxlKFwna2F0ZWdvcmllXCcpIj5LYXRlZ29y +aWU8L3RoPicgKwogICAgICAgICAgICAnPHRoJyArIGNscygnc3RhdHVzJykgKyAnIG9uY2xpY2s9 +IkRyaXZlUG9ydGFsLnNvcnRUYWJsZShcJ3N0YXR1c1wnKSI+U3RhdHVzPC90aD4nICsKICAgICAg +ICAgICAgJzx0aCcgKyBjbHMoJ2Vyc3RlbGx0Vm9uJykgKyAnIG9uY2xpY2s9IkRyaXZlUG9ydGFs +LnNvcnRUYWJsZShcJ2Vyc3RlbGx0Vm9uXCcpIj5FcnN0ZWxsZXI8L3RoPicgKwogICAgICAgICAg +ICAnPHRoJyArIGNscygnZXJzdGVsbHQnKSArICcgb25jbGljaz0iRHJpdmVQb3J0YWwuc29ydFRh +YmxlKFwnZXJzdGVsbHRcJykiPkVyc3RlbGx0PC90aD4nICsKICAgICAgICAgICAgJzx0aCcgKyBj +bHMoJ2dlYWVuZGVydCcpICsgJyBvbmNsaWNrPSJEcml2ZVBvcnRhbC5zb3J0VGFibGUoXCdnZWFl +bmRlcnRcJykiPkdlw6RuZGVydDwvdGg+JyArCiAgICAgICAgICAgICc8dGgnICsgY2xzKCd2ZXJz +aW9uJykgKyAnIG9uY2xpY2s9IkRyaXZlUG9ydGFsLnNvcnRUYWJsZShcJ3ZlcnNpb25cJykiPlZl +cnNpb248L3RoPicgKwogICAgICAgICAgICAoaXNBZG1pbiA/ICc8dGggc3R5bGU9IndpZHRoOjQw +cHg7Ij48L3RoPicgOiAnJykgKwogICAgICAgICc8L3RyPjwvdGhlYWQ+PHRib2R5Pic7CgogICAg +ICAgIHNvcnRlZC5mb3JFYWNoKGZ1bmN0aW9uKGRvYykgewogICAgICAgICAgICB2YXIgY2ZnID0g +c3RhdHVzQ29uZmlnW2RvYy5zdGF0dXNdIHx8IHsgY29sb3I6ICcjZWVlJywgdGV4dENvbG9yOiAn +IzMzMycsIGljb246ICcnIH07CiAgICAgICAgICAgIGh0bWwgKz0gJzx0cj4nICsKICAgICAgICAg +ICAgICAgIChpc0FkbWluID8gJzx0ZCBvbmNsaWNrPSJldmVudC5zdG9wUHJvcGFnYXRpb24oKSI+ +PGlucHV0IHR5cGU9ImNoZWNrYm94IiBjbGFzcz0idGFibGUtcm93LWNiIiB2YWx1ZT0iJyArIERy +aXZlUG9ydGFsLmVzY2FwZUF0dHIoZG9jLmlkKSArICciIG9uY2hhbmdlPSJEcml2ZVBvcnRhbC50 +YWJsZVNlbGVjdGlvbkNoYW5nZWQoKSI+PC90ZD4nIDogJycpICsKICAgICAgICAgICAgICAgICc8 +dGQgb25jbGljaz0iRHJpdmVQb3J0YWwuX3RhYmxlT3BlbkRvYyhcJycgKyBEcml2ZVBvcnRhbC5l +c2NhcGVBdHRyKGRvYy5pZCkgKyAnXCcpOyIgc3R5bGU9ImN1cnNvcjpwb2ludGVyOyI+PHN0cm9u +Zz4nICsgRHJpdmVQb3J0YWwuZXNjYXBlSFRNTChkb2MudGl0ZWwpICsgJzwvc3Ryb25nPjwvdGQ+ +JyArCiAgICAgICAgICAgICAgICAnPHRkPicgKyBEcml2ZVBvcnRhbC5lc2NhcGVIVE1MKGRvYy5r +YXRlZ29yaWUpICsgJzwvdGQ+JyArCiAgICAgICAgICAgICAgICAnPHRkPjxzcGFuIGNsYXNzPSJz +dGF0dXMtYmFkZ2Utc21hbGwiIHN0eWxlPSJiYWNrZ3JvdW5kLWNvbG9yOicgKyBjZmcuY29sb3Ig +KyAnO2NvbG9yOicgKyBjZmcudGV4dENvbG9yICsgJzsiPicgKyBkb2Muc3RhdHVzICsgJzwvc3Bh +bj48L3RkPicgKwogICAgICAgICAgICAgICAgJzx0ZD4nICsgRHJpdmVQb3J0YWwuZXNjYXBlSFRN +TChkb2MuZXJzdGVsbHRWb24gfHwgJy0nKSArICc8L3RkPicgKwogICAgICAgICAgICAgICAgJzx0 +ZD4nICsgZm9ybWF0RGF0ZShkb2MuZXJzdGVsbHQpICsgJzwvdGQ+JyArCiAgICAgICAgICAgICAg +ICAnPHRkPicgKyBmb3JtYXREYXRlKGRvYy5nZWFlbmRlcnQpICsgJzwvdGQ+JyArCiAgICAgICAg +ICAgICAgICAnPHRkPicgKyBEcml2ZVBvcnRhbC5lc2NhcGVIVE1MKGRvYy52ZXJzaW9uIHx8ICct +JykgKyAnPC90ZD4nICsKICAgICAgICAgICAgICAgIChpc0FkbWluID8gJzx0ZCBvbmNsaWNrPSJl +dmVudC5zdG9wUHJvcGFnYXRpb24oKSI+PGJ1dHRvbiBvbmNsaWNrPSJEcml2ZVBvcnRhbC5xdWlj +a0VkaXRTaW5nbGUoXCcnICsgRHJpdmVQb3J0YWwuZXNjYXBlQXR0cihkb2MuaWQpICsgJ1wnKSIg +c3R5bGU9InBhZGRpbmc6MnB4IDhweDtib3JkZXI6MXB4IHNvbGlkIHZhcigtLWJvcmRlci1jb2xv +cik7YmFja2dyb3VuZDp2YXIoLS1iZy1jYXJkLWFsdCk7Ym9yZGVyLXJhZGl1czozcHg7Y3Vyc29y +OnBvaW50ZXI7Zm9udC1zaXplOjExcHg7Y29sb3I6dmFyKC0tdGV4dC1zZWNvbmRhcnkpOyIgdGl0 +bGU9IlNjaG5lbGxiZWFyYmVpdHVuZyI+4pyOPC9idXR0b24+PC90ZD4nIDogJycpICsKICAgICAg +ICAgICAgJzwvdHI+JzsKICAgICAgICB9KTsKICAgICAgICBodG1sICs9ICc8L3Rib2R5PjwvdGFi +bGU+JzsKICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGFibGVWaWV3Q29udGFpbmVy +JykuaW5uZXJIVE1MID0gaHRtbDsKICAgIH0sCgogICAgX3RhYmxlT3BlbkRvYyhkb2NJZCkgewog +ICAgICAgIHRoaXMudGFibGVWaWV3QWN0aXZlID0gZmFsc2U7CiAgICAgICAgZG9jdW1lbnQuZ2V0 +RWxlbWVudEJ5SWQoJ2NvbnRhaW5lcicpLnN0eWxlLmRpc3BsYXkgPSAnJzsKICAgICAgICBkb2N1 +bWVudC5nZXRFbGVtZW50QnlJZCgndGFibGVWaWV3Q29udGFpbmVyJykuY2xhc3NMaXN0LnJlbW92 +ZSgnYWN0aXZlJyk7CiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2J0blRhYmxlVmll +dycpLnN0eWxlLmJhY2tncm91bmRDb2xvciA9ICcnOwogICAgICAgIGRvY3VtZW50LmdldEVsZW1l +bnRCeUlkKCdidG5UYWJsZVZpZXcnKS5zdHlsZS5jb2xvciA9ICcnOwogICAgICAgIHRoaXMuc2Vs +ZWN0RG9jdW1lbnQoZG9jSWQpOwogICAgfSwKCiAgICB0YWJsZVRvZ2dsZUFsbChjaGVja2VkKSB7 +CiAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnRhYmxlLXJvdy1jYicpLmZvckVh +Y2goZnVuY3Rpb24oY2IpIHsgY2IuY2hlY2tlZCA9IGNoZWNrZWQ7IH0pOwogICAgICAgIHRoaXMu +dGFibGVTZWxlY3Rpb25DaGFuZ2VkKCk7CiAgICB9LAoKICAgIHRhYmxlU2VsZWN0aW9uQ2hhbmdl +ZCgpIHsKICAgICAgICB2YXIgc2VsZWN0ZWQgPSBbXTsKICAgICAgICBkb2N1bWVudC5xdWVyeVNl +bGVjdG9yQWxsKCcudGFibGUtcm93LWNiOmNoZWNrZWQnKS5mb3JFYWNoKGZ1bmN0aW9uKGNiKSB7 +IHNlbGVjdGVkLnB1c2goY2IudmFsdWUpOyB9KTsKICAgICAgICB0aGlzLl90YWJsZVNlbGVjdGVk +ID0gc2VsZWN0ZWQ7CiAgICAgICAgdmFyIGJhciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0 +YWJsZUJ1bGtCYXInKTsKICAgICAgICBpZiAoYmFyKSB7CiAgICAgICAgICAgIGJhci5zdHlsZS5k +aXNwbGF5ID0gc2VsZWN0ZWQubGVuZ3RoID4gMCA/ICdmbGV4JyA6ICdub25lJzsKICAgICAgICAg +ICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RhYmxlQnVsa0NvdW50JykudGV4dENvbnRlbnQg +PSBzZWxlY3RlZC5sZW5ndGggKyAnIGF1c2dld8OkaGx0JzsKICAgICAgICB9CiAgICB9LAoKICAg +IGJ1bGtRdWlja0VkaXQoKSB7CiAgICAgICAgaWYgKHRoaXMuX3RhYmxlU2VsZWN0ZWQubGVuZ3Ro +ID09PSAwKSByZXR1cm47CiAgICAgICAgdmFyIGRvY3MgPSB0aGlzLl90YWJsZVNlbGVjdGVkLm1h +cChmdW5jdGlvbihpZCkgeyByZXR1cm4gRHJpdmVGUy5kb2N1bWVudHMuZmluZChmdW5jdGlvbihk +KSB7IHJldHVybiBkLmlkID09PSBpZDsgfSk7IH0pLmZpbHRlcihCb29sZWFuKTsKICAgICAgICB2 +YXIga2F0ZWdvcmllbiA9IERyaXZlRlMuY29uZmlnLmthdGVnb3JpZW4gfHwgW107CiAgICAgICAg +dmFyIHN0YXR1c0xpc3QgPSBPYmplY3Qua2V5cyhEcml2ZUZTLmNvbmZpZy5zdGF0dXMgfHwge30p OwoKICAgICAgICB2YXIgbW9kYWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKICAg ICAgICBtb2RhbC5zdHlsZS5jc3NUZXh0ID0gJ3Bvc2l0aW9uOmZpeGVkO3RvcDowO2xlZnQ6MDt3 aWR0aDoxMDAlO2hlaWdodDoxMDAlO2JhY2tncm91bmQ6cmdiYSgwLDAsMCwwLjUpO3otaW5kZXg6 MTA1MDA7ZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtqdXN0aWZ5LWNvbnRlbnQ6Y2Vu dGVyOyc7CiAgICAgICAgbW9kYWwub25jbGljayA9IGZ1bmN0aW9uKGUpIHsgaWYgKGUudGFyZ2V0 -ID09PSBtb2RhbCkgbW9kYWwucmVtb3ZlKCk7IH07CgogICAgICAgIHZhciBodG1sID0gJzxkaXYg -c3R5bGU9ImJhY2tncm91bmQ6dmFyKC0tYmctY2FyZCk7Ym9yZGVyLXJhZGl1czoxMHB4O3BhZGRp -bmc6MjBweCAyNHB4O21heC13aWR0aDo0ODBweDt3aWR0aDo5MCU7Ym94LXNoYWRvdzowIDhweCAz -MnB4IHJnYmEoMCwwLDAsMC4zKTsiPicgKwogICAgICAgICAgICAnPGgzIHN0eWxlPSJjb2xvcjp2 -YXIoLS10ZXh0LWhlYWRpbmcpO21hcmdpbi1ib3R0b206MTRweDsiPlNjaG5lbGxiZWFyYmVpdHVu -ZzwvaDM+JyArCgogICAgICAgICAgICAnPGRpdiBzdHlsZT0ibWFyZ2luLWJvdHRvbTo4cHg7Ij48 +ID09PSBtb2RhbCkgbW9kYWwucmVtb3ZlKCk7IH07CgogICAgICAgIHZhciBpbnB1dFN0eWxlID0g +J3dpZHRoOjEwMCU7cGFkZGluZzo2cHggMTBweDtib3JkZXI6MXB4IHNvbGlkIHZhcigtLWJvcmRl +ci1jb2xvcik7Ym9yZGVyLXJhZGl1czo0cHg7Zm9udC1zaXplOjEzcHg7YmFja2dyb3VuZDp2YXIo +LS1iZy1pbnB1dCk7Y29sb3I6dmFyKC0tdGV4dC1wcmltYXJ5KTsnOwoKICAgICAgICB2YXIgaHRt +bCA9ICc8ZGl2IHN0eWxlPSJiYWNrZ3JvdW5kOnZhcigtLWJnLWNhcmQpO2JvcmRlci1yYWRpdXM6 +MTBweDtwYWRkaW5nOjIwcHggMjRweDttYXgtd2lkdGg6NTAwcHg7d2lkdGg6OTAlO2JveC1zaGFk +b3c6MCA4cHggMzJweCByZ2JhKDAsMCwwLDAuMyk7bWF4LWhlaWdodDo4NXZoO292ZXJmbG93LXk6 +YXV0bzsiPicgKwogICAgICAgICAgICAnPGgzIHN0eWxlPSJjb2xvcjp2YXIoLS10ZXh0LWhlYWRp +bmcpO21hcmdpbi1ib3R0b206NnB4OyI+U2NobmVsbGJlYXJiZWl0dW5nPC9oMz4nICsKICAgICAg +ICAgICAgJzxwIHN0eWxlPSJmb250LXNpemU6MTJweDtjb2xvcjp2YXIoLS10ZXh0LW11dGVkKTtt +YXJnaW4tYm90dG9tOjE0cHg7Ij4nICsgZG9jcy5sZW5ndGggKyAnIEFydGlrZWwgYXVzZ2V3w6Ro +bHQuIE51ciBhdXNnZWbDvGxsdGUgRmVsZGVyIHdlcmRlbiBnZcOkbmRlcnQuPC9wPicgKwoKICAg +ICAgICAgICAgJzxkaXYgc3R5bGU9Im1hcmdpbi1ib3R0b206MTBweDsiPjxsYWJlbCBzdHlsZT0i +Zm9udC1zaXplOjEycHg7Zm9udC13ZWlnaHQ6NjAwO2NvbG9yOnZhcigtLXRleHQtc2Vjb25kYXJ5 +KTtkaXNwbGF5OmJsb2NrO21hcmdpbi1ib3R0b206M3B4OyI+S2F0ZWdvcmllIMOkbmRlcm48L2xh +YmVsPicgKwogICAgICAgICAgICAnPHNlbGVjdCBpZD0iYnVsa0thdGVnb3JpZSIgc3R5bGU9Iicg +KyBpbnB1dFN0eWxlICsgJyI+PG9wdGlvbiB2YWx1ZT0iIj7igJQgTmljaHQgw6RuZGVybiDigJQ8 +L29wdGlvbj4nOwogICAgICAgIGthdGVnb3JpZW4uZm9yRWFjaChmdW5jdGlvbihrKSB7IGh0bWwg +Kz0gJzxvcHRpb24gdmFsdWU9IicgKyBEcml2ZVBvcnRhbC5lc2NhcGVBdHRyKGspICsgJyI+JyAr +IERyaXZlUG9ydGFsLmVzY2FwZUhUTUwoaykgKyAnPC9vcHRpb24+JzsgfSk7CiAgICAgICAgaHRt +bCArPSAnPC9zZWxlY3Q+PC9kaXY+JyArCgogICAgICAgICAgICAnPGRpdiBzdHlsZT0ibWFyZ2lu +LWJvdHRvbToxMHB4OyI+PGxhYmVsIHN0eWxlPSJmb250LXNpemU6MTJweDtmb250LXdlaWdodDo2 +MDA7Y29sb3I6dmFyKC0tdGV4dC1zZWNvbmRhcnkpO2Rpc3BsYXk6YmxvY2s7bWFyZ2luLWJvdHRv +bTozcHg7Ij5TdGF0dXMgw6RuZGVybjwvbGFiZWw+JyArCiAgICAgICAgICAgICc8c2VsZWN0IGlk +PSJidWxrU3RhdHVzIiBzdHlsZT0iJyArIGlucHV0U3R5bGUgKyAnIj48b3B0aW9uIHZhbHVlPSIi +PuKAlCBOaWNodCDDpG5kZXJuIOKAlDwvb3B0aW9uPic7CiAgICAgICAgc3RhdHVzTGlzdC5mb3JF +YWNoKGZ1bmN0aW9uKHMpIHsgaHRtbCArPSAnPG9wdGlvbiB2YWx1ZT0iJyArIERyaXZlUG9ydGFs +LmVzY2FwZUF0dHIocykgKyAnIj4nICsgRHJpdmVQb3J0YWwuZXNjYXBlSFRNTChzKSArICc8L29w +dGlvbj4nOyB9KTsKICAgICAgICBodG1sICs9ICc8L3NlbGVjdD48L2Rpdj4nICsKCiAgICAgICAg +ICAgICc8ZGl2IHN0eWxlPSJtYXJnaW4tYm90dG9tOjEwcHg7Ij48bGFiZWwgc3R5bGU9ImZvbnQt +c2l6ZToxMnB4O2ZvbnQtd2VpZ2h0OjYwMDtjb2xvcjp2YXIoLS10ZXh0LXNlY29uZGFyeSk7ZGlz +cGxheTpibG9jazttYXJnaW4tYm90dG9tOjNweDsiPlNjaGxhZ3dvcnQgaGluenVmw7xnZW48L2xh +YmVsPicgKwogICAgICAgICAgICAnPGlucHV0IHR5cGU9InRleHQiIGlkPSJidWxrQWRkVGFnIiBw +bGFjZWhvbGRlcj0iTmV1ZXMgU2NobGFnd29ydC4uLiIgc3R5bGU9IicgKyBpbnB1dFN0eWxlICsg +JyI+PC9kaXY+JyArCgogICAgICAgICAgICAnPGRpdiBzdHlsZT0ibWFyZ2luLWJvdHRvbToxMHB4 +OyI+PGxhYmVsIHN0eWxlPSJmb250LXNpemU6MTJweDtmb250LXdlaWdodDo2MDA7Y29sb3I6dmFy +KC0tdGV4dC1zZWNvbmRhcnkpO2Rpc3BsYXk6YmxvY2s7bWFyZ2luLWJvdHRvbTozcHg7Ij5TY2hs +YWd3b3J0IGVudGZlcm5lbjwvbGFiZWw+JyArCiAgICAgICAgICAgICc8aW5wdXQgdHlwZT0idGV4 +dCIgaWQ9ImJ1bGtSZW1vdmVUYWciIHBsYWNlaG9sZGVyPSJadSBlbnRmZXJuZW5kZXMgU2NobGFn +d29ydC4uLiIgc3R5bGU9IicgKyBpbnB1dFN0eWxlICsgJyI+PC9kaXY+JyArCgogICAgICAgICAg +ICAnPGRpdiBzdHlsZT0iZGlzcGxheTpmbGV4O2dhcDo4cHg7anVzdGlmeS1jb250ZW50OmZsZXgt +ZW5kO21hcmdpbi10b3A6MTRweDsiPicgKwogICAgICAgICAgICAgICAgJzxidXR0b24gb25jbGlj +az0idGhpcy5jbG9zZXN0KFwnZGl2W3N0eWxlXVwnKS5wYXJlbnRFbGVtZW50LnJlbW92ZSgpIiBz +dHlsZT0icGFkZGluZzo4cHggMTZweDtib3JkZXItcmFkaXVzOjRweDtib3JkZXI6MXB4IHNvbGlk +IHZhcigtLWJvcmRlci1jb2xvcik7YmFja2dyb3VuZDp2YXIoLS1iZy1jYXJkKTtjb2xvcjp2YXIo +LS10ZXh0LXByaW1hcnkpO2N1cnNvcjpwb2ludGVyOyI+QWJicmVjaGVuPC9idXR0b24+JyArCiAg +ICAgICAgICAgICAgICAnPGJ1dHRvbiBvbmNsaWNrPSJEcml2ZVBvcnRhbC5fY29uZmlybUJ1bGtF +ZGl0KCkiIHN0eWxlPSJwYWRkaW5nOjhweCAxNnB4O2JvcmRlci1yYWRpdXM6NHB4O2JvcmRlcjpu +b25lO2JhY2tncm91bmQ6dmFyKC0tdGV4dC1oZWFkaW5nKTtjb2xvcjp3aGl0ZTtjdXJzb3I6cG9p +bnRlcjtmb250LXdlaWdodDo2MDA7Ij7DhG5kZXJ1bmdlbiBhbndlbmRlbjwvYnV0dG9uPicgKwog +ICAgICAgICAgICAnPC9kaXY+PC9kaXY+JzsKCiAgICAgICAgbW9kYWwuaW5uZXJIVE1MID0gaHRt +bDsKICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKG1vZGFsKTsKICAgIH0sCgogICAg +YXN5bmMgX2NvbmZpcm1CdWxrRWRpdCgpIHsKICAgICAgICB2YXIgbmV3S2F0ID0gZG9jdW1lbnQu +Z2V0RWxlbWVudEJ5SWQoJ2J1bGtLYXRlZ29yaWUnKS52YWx1ZTsKICAgICAgICB2YXIgbmV3U3Rh +dHVzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2J1bGtTdGF0dXMnKS52YWx1ZTsKICAgICAg +ICB2YXIgYWRkVGFnID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2J1bGtBZGRUYWcnKS52YWx1 +ZS50cmltKCk7CiAgICAgICAgdmFyIHJlbW92ZVRhZyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlk +KCdidWxrUmVtb3ZlVGFnJykudmFsdWUudHJpbSgpOwoKICAgICAgICBpZiAoIW5ld0thdCAmJiAh +bmV3U3RhdHVzICYmICFhZGRUYWcgJiYgIXJlbW92ZVRhZykgewogICAgICAgICAgICBzaG93VG9h +c3QoJ0JpdHRlIG1pbmRlc3RlbnMgZWluIEZlbGQgYXVzZsO8bGxlbicsICd3YXJuaW5nJyk7CiAg +ICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIC8vIE1vZGFsIHNjaGxpZXNzZW4K +ICAgICAgICB2YXIgZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYnVsa0thdGVnb3JpZScp +OwogICAgICAgIGlmIChlbCkgeyB2YXIgbSA9IGVsOyB3aGlsZSAobS5wYXJlbnRFbGVtZW50ICE9 +PSBkb2N1bWVudC5ib2R5KSBtID0gbS5wYXJlbnRFbGVtZW50OyBtLnJlbW92ZSgpOyB9CgogICAg +ICAgIHZhciBjb3VudCA9IDA7CiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLl90YWJs +ZVNlbGVjdGVkLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIHZhciBkb2MgPSBEcml2ZUZTLmRv +Y3VtZW50cy5maW5kKGZ1bmN0aW9uKGQpIHsgcmV0dXJuIGQuaWQgPT09IERyaXZlUG9ydGFsLl90 +YWJsZVNlbGVjdGVkW2ldOyB9KTsKICAgICAgICAgICAgaWYgKCFkb2MpIGNvbnRpbnVlOwogICAg +ICAgICAgICBpZiAobmV3S2F0KSBkb2Mua2F0ZWdvcmllID0gbmV3S2F0OwogICAgICAgICAgICBp +ZiAobmV3U3RhdHVzKSB7CiAgICAgICAgICAgICAgICBkb2MudmVyc2lvbiA9IGNhbGN1bGF0ZVZl +cnNpb24oZG9jLCBkb2MuaW5oYWx0LCBkb2MuaW5oYWx0LCBuZXdTdGF0dXMpOwogICAgICAgICAg +ICAgICAgZG9jLnN0YXR1cyA9IG5ld1N0YXR1czsKICAgICAgICAgICAgfQogICAgICAgICAgICBp +ZiAoYWRkVGFnKSB7CiAgICAgICAgICAgICAgICBpZiAoIWRvYy5zY2hsYWd3b2VydGVyKSBkb2Mu +c2NobGFnd29lcnRlciA9IFtdOwogICAgICAgICAgICAgICAgaWYgKCFkb2Muc2NobGFnd29lcnRl +ci5pbmNsdWRlcyhhZGRUYWcpKSBkb2Muc2NobGFnd29lcnRlci5wdXNoKGFkZFRhZyk7CiAgICAg +ICAgICAgIH0KICAgICAgICAgICAgaWYgKHJlbW92ZVRhZyAmJiBkb2Muc2NobGFnd29lcnRlcikg +ewogICAgICAgICAgICAgICAgZG9jLnNjaGxhZ3dvZXJ0ZXIgPSBkb2Muc2NobGFnd29lcnRlci5m +aWx0ZXIoZnVuY3Rpb24oaykgeyByZXR1cm4gayAhPT0gcmVtb3ZlVGFnOyB9KTsKICAgICAgICAg +ICAgfQogICAgICAgICAgICBhd2FpdCBEcml2ZUZTLnNhdmVEb2N1bWVudChkb2MpOwogICAgICAg +ICAgICBjb3VudCsrOwogICAgICAgIH0KICAgICAgICBzaG93VG9hc3QoY291bnQgKyAnIEFydGlr +ZWwgYWt0dWFsaXNpZXJ0JywgJ3N1Y2Nlc3MnKTsKICAgICAgICB0aGlzLnJlbmRlcigpOwogICAg +ICAgIHRoaXMucmVuZGVyVGFibGVWaWV3KCk7CiAgICB9LAoKICAgIGJ1bGtEZWxldGUoKSB7CiAg +ICAgICAgdmFyIGNvdW50ID0gdGhpcy5fdGFibGVTZWxlY3RlZC5sZW5ndGg7CiAgICAgICAgaWYg +KGNvdW50ID09PSAwKSByZXR1cm47CgogICAgICAgIHZhciBtb2RhbCA9IGRvY3VtZW50LmNyZWF0 +ZUVsZW1lbnQoJ2RpdicpOwogICAgICAgIG1vZGFsLnN0eWxlLmNzc1RleHQgPSAncG9zaXRpb246 +Zml4ZWQ7dG9wOjA7bGVmdDowO3dpZHRoOjEwMCU7aGVpZ2h0OjEwMCU7YmFja2dyb3VuZDpyZ2Jh +KDAsMCwwLDAuNSk7ei1pbmRleDoxMDUwMDtkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6Y2VudGVy +O2p1c3RpZnktY29udGVudDpjZW50ZXI7JzsKICAgICAgICBtb2RhbC5vbmNsaWNrID0gZnVuY3Rp +b24oZSkgeyBpZiAoZS50YXJnZXQgPT09IG1vZGFsKSBtb2RhbC5yZW1vdmUoKTsgfTsKICAgICAg +ICBtb2RhbC5pbm5lckhUTUwgPQogICAgICAgICAgICAnPGRpdiBzdHlsZT0iYmFja2dyb3VuZDp2 +YXIoLS1iZy1jYXJkKTtib3JkZXItcmFkaXVzOjEwcHg7cGFkZGluZzoyNHB4IDI4cHg7bWF4LXdp +ZHRoOjQyMHB4O3dpZHRoOjkwJTtib3gtc2hhZG93OjAgOHB4IDMycHggcmdiYSgwLDAsMCwwLjMp +OyI+JyArCiAgICAgICAgICAgICAgICAnPGgzIHN0eWxlPSJjb2xvcjojZGMzNTQ1O21hcmdpbi1i +b3R0b206MTBweDsiPicgKyBjb3VudCArICcgQXJ0aWtlbCBsw7ZzY2hlbj88L2gzPicgKwogICAg +ICAgICAgICAgICAgJzxwIHN0eWxlPSJjb2xvcjp2YXIoLS10ZXh0LXByaW1hcnkpO2ZvbnQtc2l6 +ZToxNHB4O2xpbmUtaGVpZ2h0OjEuNzttYXJnaW4tYm90dG9tOjE0cHg7Ij4nICsKICAgICAgICAg +ICAgICAgICAgICAnRGllIGF1c2dld8OkaGx0ZW4gQXJ0aWtlbCB3ZXJkZW4gaW4gZGVuIFBhcGll +cmtvcmIgdmVyc2Nob2JlbiB1bmQga8O2bm5lbiAyOCBUYWdlIGxhbmcgd2llZGVyaGVyZ2VzdGVs +bHQgd2VyZGVuLicgKwogICAgICAgICAgICAgICAgJzwvcD4nICsKICAgICAgICAgICAgICAgICc8 bGFiZWwgc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZvbnQtd2VpZ2h0OjYwMDtjb2xvcjp2YXIoLS10 -ZXh0LXNlY29uZGFyeSk7ZGlzcGxheTpibG9jazttYXJnaW4tYm90dG9tOjNweDsiPlRpdGVsPC9s -YWJlbD4nICsKICAgICAgICAgICAgJzxpbnB1dCB0eXBlPSJ0ZXh0IiBpZD0ic3FlVGl0ZWwiIHZh -bHVlPSInICsgRHJpdmVQb3J0YWwuZXNjYXBlQXR0cihkb2MudGl0ZWwpICsgJyIgc3R5bGU9Iicg -KyBpbnB1dFN0eWxlICsgJyI+PC9kaXY+JyArCgogICAgICAgICAgICAnPGRpdiBzdHlsZT0iZGlz -cGxheTpncmlkO2dyaWQtdGVtcGxhdGUtY29sdW1uczoxZnIgMWZyO2dhcDo4cHg7bWFyZ2luLWJv -dHRvbTo4cHg7Ij4nICsKICAgICAgICAgICAgICAgICc8ZGl2PjxsYWJlbCBzdHlsZT0iZm9udC1z -aXplOjEycHg7Zm9udC13ZWlnaHQ6NjAwO2NvbG9yOnZhcigtLXRleHQtc2Vjb25kYXJ5KTtkaXNw -bGF5OmJsb2NrO21hcmdpbi1ib3R0b206M3B4OyI+S2F0ZWdvcmllPC9sYWJlbD4nICsKICAgICAg -ICAgICAgICAgICc8c2VsZWN0IGlkPSJzcWVLYXRlZ29yaWUiIHN0eWxlPSInICsgaW5wdXRTdHls -ZSArICciPic7CiAgICAgICAga2F0ZWdvcmllbi5mb3JFYWNoKGZ1bmN0aW9uKGspIHsgaHRtbCAr -PSAnPG9wdGlvbiB2YWx1ZT0iJyArIERyaXZlUG9ydGFsLmVzY2FwZUF0dHIoaykgKyAnIicgKyAo -ayA9PT0gZG9jLmthdGVnb3JpZSA/ICcgc2VsZWN0ZWQnIDogJycpICsgJz4nICsgRHJpdmVQb3J0 -YWwuZXNjYXBlSFRNTChrKSArICc8L29wdGlvbj4nOyB9KTsKICAgICAgICBodG1sICs9ICc8L3Nl -bGVjdD48L2Rpdj4nICsKICAgICAgICAgICAgICAgICc8ZGl2PjxsYWJlbCBzdHlsZT0iZm9udC1z -aXplOjEycHg7Zm9udC13ZWlnaHQ6NjAwO2NvbG9yOnZhcigtLXRleHQtc2Vjb25kYXJ5KTtkaXNw -bGF5OmJsb2NrO21hcmdpbi1ib3R0b206M3B4OyI+U3RhdHVzPC9sYWJlbD4nICsKICAgICAgICAg -ICAgICAgICc8c2VsZWN0IGlkPSJzcWVTdGF0dXMiIHN0eWxlPSInICsgaW5wdXRTdHlsZSArICci -Pic7CiAgICAgICAgc3RhdHVzTGlzdC5mb3JFYWNoKGZ1bmN0aW9uKHMpIHsgaHRtbCArPSAnPG9w -dGlvbiB2YWx1ZT0iJyArIERyaXZlUG9ydGFsLmVzY2FwZUF0dHIocykgKyAnIicgKyAocyA9PT0g -ZG9jLnN0YXR1cyA/ICcgc2VsZWN0ZWQnIDogJycpICsgJz4nICsgRHJpdmVQb3J0YWwuZXNjYXBl -SFRNTChzKSArICc8L29wdGlvbj4nOyB9KTsKICAgICAgICBodG1sICs9ICc8L3NlbGVjdD48L2Rp -dj48L2Rpdj4nICsKCiAgICAgICAgICAgICc8ZGl2IHN0eWxlPSJkaXNwbGF5OmdyaWQ7Z3JpZC10 -ZW1wbGF0ZS1jb2x1bW5zOjFmciAxZnI7Z2FwOjhweDttYXJnaW4tYm90dG9tOjhweDsiPicgKwog -ICAgICAgICAgICAgICAgJzxkaXY+PGxhYmVsIHN0eWxlPSJmb250LXNpemU6MTJweDtmb250LXdl -aWdodDo2MDA7Y29sb3I6dmFyKC0tdGV4dC1zZWNvbmRhcnkpO2Rpc3BsYXk6YmxvY2s7bWFyZ2lu -LWJvdHRvbTozcHg7Ij5FcnN0ZWxsdCB2b248L2xhYmVsPicgKwogICAgICAgICAgICAgICAgJzxp -bnB1dCB0eXBlPSJ0ZXh0IiBpZD0ic3FlRXJzdGVsbGVyIiB2YWx1ZT0iJyArIERyaXZlUG9ydGFs -LmVzY2FwZUF0dHIoZG9jLmVyc3RlbGx0Vm9uIHx8ICcnKSArICciIHN0eWxlPSInICsgaW5wdXRT -dHlsZSArICciPjwvZGl2PicgKwogICAgICAgICAgICAgICAgJzxkaXY+PGxhYmVsIHN0eWxlPSJm -b250LXNpemU6MTJweDtmb250LXdlaWdodDo2MDA7Y29sb3I6dmFyKC0tdGV4dC1zZWNvbmRhcnkp -O2Rpc3BsYXk6YmxvY2s7bWFyZ2luLWJvdHRvbTozcHg7Ij5WZXJzaW9uPC9sYWJlbD4nICsKICAg -ICAgICAgICAgICAgICc8aW5wdXQgdHlwZT0idGV4dCIgaWQ9InNxZVZlcnNpb24iIHZhbHVlPSIn -ICsgRHJpdmVQb3J0YWwuZXNjYXBlQXR0cihkb2MudmVyc2lvbiB8fCAnJykgKyAnIiBzdHlsZT0i -JyArIGlucHV0U3R5bGUgKyAnIj48L2Rpdj4nICsKICAgICAgICAgICAgJzwvZGl2PicgKwoKICAg -ICAgICAgICAgJzxkaXYgc3R5bGU9ImRpc3BsYXk6ZmxleDtnYXA6OHB4O2p1c3RpZnktY29udGVu -dDpmbGV4LWVuZDttYXJnaW4tdG9wOjE0cHg7Ij4nICsKICAgICAgICAgICAgICAgICc8YnV0dG9u -IG9uY2xpY2s9InRoaXMuY2xvc2VzdChcJ2RpdltzdHlsZV1cJykucGFyZW50RWxlbWVudC5yZW1v -dmUoKSIgc3R5bGU9InBhZGRpbmc6OHB4IDE2cHg7Ym9yZGVyLXJhZGl1czo0cHg7Ym9yZGVyOjFw -eCBzb2xpZCB2YXIoLS1ib3JkZXItY29sb3IpO2JhY2tncm91bmQ6dmFyKC0tYmctY2FyZCk7Y29s -b3I6dmFyKC0tdGV4dC1wcmltYXJ5KTtjdXJzb3I6cG9pbnRlcjsiPkFiYnJlY2hlbjwvYnV0dG9u -PicgKwogICAgICAgICAgICAgICAgJzxidXR0b24gb25jbGljaz0iRHJpdmVQb3J0YWwuX2NvbmZp -cm1TaW5nbGVFZGl0KFwnJyArIERyaXZlUG9ydGFsLmVzY2FwZUF0dHIoZG9jSWQpICsgJ1wnKSIg -c3R5bGU9InBhZGRpbmc6OHB4IDE2cHg7Ym9yZGVyLXJhZGl1czo0cHg7Ym9yZGVyOm5vbmU7YmFj -a2dyb3VuZDp2YXIoLS10ZXh0LWhlYWRpbmcpO2NvbG9yOndoaXRlO2N1cnNvcjpwb2ludGVyO2Zv -bnQtd2VpZ2h0OjYwMDsiPlNwZWljaGVybjwvYnV0dG9uPicgKwogICAgICAgICAgICAnPC9kaXY+ -PC9kaXY+JzsKCiAgICAgICAgbW9kYWwuaW5uZXJIVE1MID0gaHRtbDsKICAgICAgICBkb2N1bWVu -dC5ib2R5LmFwcGVuZENoaWxkKG1vZGFsKTsKICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkg -eyBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3FlVGl0ZWwnKS5mb2N1cygpOyB9LCA1MCk7CiAg -ICB9LAoKICAgIGFzeW5jIF9jb25maXJtU2luZ2xlRWRpdChkb2NJZCkgewogICAgICAgIHZhciBk -b2MgPSBEcml2ZUZTLmRvY3VtZW50cy5maW5kKGZ1bmN0aW9uKGQpIHsgcmV0dXJuIGQuaWQgPT09 -IGRvY0lkOyB9KTsKICAgICAgICBpZiAoIWRvYykgcmV0dXJuOwoKICAgICAgICBkb2MudGl0ZWwg -PSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3FlVGl0ZWwnKS52YWx1ZS50cmltKCkgfHwgZG9j -LnRpdGVsOwogICAgICAgIGRvYy5rYXRlZ29yaWUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgn -c3FlS2F0ZWdvcmllJykudmFsdWU7CiAgICAgICAgdmFyIG5ld1N0YXR1cyA9IGRvY3VtZW50Lmdl -dEVsZW1lbnRCeUlkKCdzcWVTdGF0dXMnKS52YWx1ZTsKICAgICAgICBpZiAobmV3U3RhdHVzICE9 -PSBkb2Muc3RhdHVzKSB7CiAgICAgICAgICAgIGRvYy52ZXJzaW9uID0gY2FsY3VsYXRlVmVyc2lv -bihkb2MsIGRvYy5pbmhhbHQsIGRvYy5pbmhhbHQsIG5ld1N0YXR1cyk7CiAgICAgICAgICAgIGRv -Yy5zdGF0dXMgPSBuZXdTdGF0dXM7CiAgICAgICAgfQogICAgICAgIGRvYy5lcnN0ZWxsdFZvbiA9 -IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzcWVFcnN0ZWxsZXInKS52YWx1ZS50cmltKCkgfHwg -ZG9jLmVyc3RlbGx0Vm9uOwogICAgICAgIGRvYy52ZXJzaW9uID0gZG9jdW1lbnQuZ2V0RWxlbWVu -dEJ5SWQoJ3NxZVZlcnNpb24nKS52YWx1ZS50cmltKCkgfHwgZG9jLnZlcnNpb247CgogICAgICAg -IC8vIE1vZGFsIHNjaGxpZXNzZW4KICAgICAgICB2YXIgZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50 -QnlJZCgnc3FlVGl0ZWwnKTsKICAgICAgICBpZiAoZWwpIHsgdmFyIG0gPSBlbDsgd2hpbGUgKG0u -cGFyZW50RWxlbWVudCAhPT0gZG9jdW1lbnQuYm9keSkgbSA9IG0ucGFyZW50RWxlbWVudDsgbS5y -ZW1vdmUoKTsgfQoKICAgICAgICBhd2FpdCBEcml2ZUZTLnNhdmVEb2N1bWVudChkb2MpOwogICAg -ICAgIHNob3dUb2FzdCgnQXJ0aWtlbCBha3R1YWxpc2llcnQ6ICcgKyBkb2MudGl0ZWwsICdzdWNj -ZXNzJyk7CiAgICAgICAgdGhpcy5yZW5kZXIoKTsKICAgICAgICB0aGlzLnJlbmRlclRhYmxlVmll -dygpOwogICAgfSwKCiAgICBhc3luYyBfY29uZmlybUJ1bGtEZWxldGUoKSB7CiAgICAgICAgdmFy -IG53SW5wdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYnVsa0RlbGV0ZU5XJyk7CiAgICAg -ICAgdmFyIG53S2VubnVuZyA9IG53SW5wdXQgPyBud0lucHV0LnZhbHVlLnRyaW0oKSA6ICcnOwog -ICAgICAgIGlmICghbndLZW5udW5nKSB7IHNob3dUb2FzdCgnQml0dGUgTlctS2VubnVuZyBlaW5n -ZWJlbicsICd3YXJuaW5nJyk7IG53SW5wdXQuZm9jdXMoKTsgcmV0dXJuOyB9CgogICAgICAgIC8v -IE1vZGFsIHNjaGxpZXNzZW4KICAgICAgICB2YXIgbSA9IG53SW5wdXQ7IHdoaWxlIChtLnBhcmVu -dEVsZW1lbnQgIT09IGRvY3VtZW50LmJvZHkpIG0gPSBtLnBhcmVudEVsZW1lbnQ7IG0ucmVtb3Zl -KCk7CgogICAgICAgIHZhciBkZWxldGVkID0gMDsKICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8 -IHRoaXMuX3RhYmxlU2VsZWN0ZWQubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgdmFyIGRvY0lk -ID0gdGhpcy5fdGFibGVTZWxlY3RlZFtpXTsKICAgICAgICAgICAgdmFyIGRvYyA9IERyaXZlRlMu -ZG9jdW1lbnRzLmZpbmQoZnVuY3Rpb24oZCkgeyByZXR1cm4gZC5pZCA9PT0gZG9jSWQ7IH0pOwog -ICAgICAgICAgICBpZiAoIWRvYykgY29udGludWU7CgogICAgICAgICAgICAvLyBJbiBQYXBpZXJr -b3JiIHZlcnNjaGllYmVuCiAgICAgICAgICAgIHZhciB0cmFzaCA9IGF3YWl0IHRoaXMuX2xvYWRU -cmFzaCgpOwogICAgICAgICAgICB0cmFzaC5wdXNoKHsKICAgICAgICAgICAgICAgIGRvYzogZG9j -LAogICAgICAgICAgICAgICAgZGVsZXRlZEJ5OiBud0tlbm51bmcudHJpbSgpLAogICAgICAgICAg -ICAgICAgZGVsZXRlZEF0OiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksCiAgICAgICAgICAgICAg -ICBleHBpcmVzQXQ6IG5ldyBEYXRlKERhdGUubm93KCkgKyAyOCAqIDI0ICogNjAgKiA2MCAqIDEw -MDApLnRvSVNPU3RyaW5nKCkKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGF3YWl0IHRoaXMu -X3NhdmVUcmFzaCh0cmFzaCk7CgogICAgICAgICAgICAvLyBBdWRpdC1Mb2cKICAgICAgICAgICAg -YXdhaXQgdGhpcy5fYXBwZW5kRGVsZXRlTG9nKHsKICAgICAgICAgICAgICAgIGRvY0lkOiBkb2Mu -aWQsCiAgICAgICAgICAgICAgICB0aXRlbDogZG9jLnRpdGVsLAogICAgICAgICAgICAgICAga2F0 -ZWdvcmllOiBkb2Mua2F0ZWdvcmllLAogICAgICAgICAgICAgICAgZGVsZXRlZEJ5OiBud0tlbm51 -bmcudHJpbSgpLAogICAgICAgICAgICAgICAgZGVsZXRlZEF0OiBuZXcgRGF0ZSgpLnRvSVNPU3Ry -aW5nKCkKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAvLyBEYXRlaSBsb2VzY2hlbiArIE1l -ZGllbi1PcmRuZXIKICAgICAgICAgICAgdmFyIHBhdGggPSBEcml2ZUZTLmZpbGVUaW1lc3RhbXBz -W2RvY0lkXSA/IERyaXZlRlMuZmlsZVRpbWVzdGFtcHNbZG9jSWRdLnBhdGggOiBudWxsOwogICAg -ICAgICAgICBpZiAocGF0aCkgYXdhaXQgRHJpdmVGUy5kZWxldGVGaWxlKHBhdGgpOwoKICAgICAg -ICAgICAgLy8gTWVkaWVuLU9yZG5lciB2ZXJzY2hpZWJlbiAoU2VydmVyLU1vZHVzKQogICAgICAg -ICAgICBpZiAoRHJpdmVGUy5tb2RlID09PSAnc2VydmVyJykgewogICAgICAgICAgICAgICAgdHJ5 -IHsKICAgICAgICAgICAgICAgICAgICAvLyBNZWRpZW4gYmxlaWJlbiBpbSBtZWRpYS8tT3JkbmVy -IGVyaGFsdGVuIChQYXBpZXJrb3JiLVdpZWRlcmhlcnN0ZWxsdW5nKQogICAgICAgICAgICAgICAg -fSBjYXRjaChlKSB7fQogICAgICAgICAgICB9CgogICAgICAgICAgICBEcml2ZUZTLmRvY3VtZW50 -cyA9IERyaXZlRlMuZG9jdW1lbnRzLmZpbHRlcihmdW5jdGlvbihkKSB7IHJldHVybiBkLmlkICE9 -PSBkb2NJZDsgfSk7CiAgICAgICAgICAgIGRlbGV0ZWQrKzsKICAgICAgICB9CgogICAgICAgIGF3 -YWl0IERyaXZlRlMudXBkYXRlSW5kZXgoKTsKICAgICAgICBzaG93VG9hc3QoZGVsZXRlZCArICcg -QXJ0aWtlbCBpbiBkZW4gUGFwaWVya29yYiB2ZXJzY2hvYmVuJywgJ3N1Y2Nlc3MnKTsKICAgICAg -ICB0aGlzLl90YWJsZVNlbGVjdGVkID0gW107CiAgICAgICAgdGhpcy5yZW5kZXIoKTsKICAgICAg -ICB0aGlzLnJlbmRlclRhYmxlVmlldygpOwogICAgfSwKCiAgICBzaG93SG9tZSgpIHsKICAgICAg -ICB0aGlzLnNlbGVjdGVkRG9jSWQgPSBudWxsOwogICAgICAgIC8vIFN0YXJ0c2VpdGUgd2llZGVy -aGVyc3RlbGxlbgogICAgICAgIGlmICh0aGlzLl93ZWxjb21lSFRNTCkgewogICAgICAgICAgICBk -b2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZG9jdW1lbnREZXRhaWwnKS5pbm5lckhUTUwgPSB0aGlz -Ll93ZWxjb21lSFRNTDsKICAgICAgICB9CiAgICAgICAgLy8gQWt0aXZlcyBFbGVtZW50IGluIGRl -ciBMaXN0ZSBhYndhZWhsZW4KICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuZG9j -dW1lbnQtaXRlbS5hY3RpdmUnKS5mb3JFYWNoKGZ1bmN0aW9uKGVsKSB7IGVsLmNsYXNzTGlzdC5y -ZW1vdmUoJ2FjdGl2ZScpOyB9KTsKICAgIH0sCgogICAgX2RpZmZWaXNpYmxlOiBmYWxzZSwKCiAg -ICB0b2dnbGVEaWZmKGRvY0lkKSB7CiAgICAgICAgdmFyIGRvYyA9IERyaXZlRlMuZG9jdW1lbnRz -LmZpbmQoZnVuY3Rpb24oZCl7IHJldHVybiBkLmlkID09PSBkb2NJZDsgfSk7CiAgICAgICAgaWYg -KCFkb2MpIHJldHVybjsKICAgICAgICAvLyBWZXJnbGVpY2hzYmFzaXM6IGxldHp0ZSBSZXZpc2lv -biAocGVyc2lzdGllcnQpIG9kZXIgX3ByZXZpb3VzSW5oYWx0IChMZWdhY3kpCiAgICAgICAgdmFy -IHByZXZJbmhhbHQgPSBkb2MuX3ByZXZpb3VzSW5oYWx0OwogICAgICAgIGlmICghcHJldkluaGFs -dCAmJiBkb2MucmV2aXNpb25zICYmIGRvYy5yZXZpc2lvbnMubGVuZ3RoID4gMCkgewogICAgICAg -ICAgICBwcmV2SW5oYWx0ID0gZG9jLnJldmlzaW9uc1tkb2MucmV2aXNpb25zLmxlbmd0aCAtIDFd -LmluaGFsdDsKICAgICAgICB9CiAgICAgICAgaWYgKCFwcmV2SW5oYWx0KSByZXR1cm47CgogICAg -ICAgIHZhciBjb250ZW50RWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGV0YWlsQ29udGVu -dCcpOwogICAgICAgIHZhciBidG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYnRuRGlmZicp -OwogICAgICAgIGlmICghY29udGVudEVsKSByZXR1cm47CgogICAgICAgIGlmICh0aGlzLl9kaWZm -VmlzaWJsZSkgewogICAgICAgICAgICAvLyBadXJ1ZWNrIHp1ciBub3JtYWxlbiBBbnNpY2h0CiAg -ICAgICAgICAgIGNvbnRlbnRFbC5pbm5lckhUTUwgPSBEcml2ZVBvcnRhbC5zYW5pdGl6ZUhUTUwo -ZG9jLmluaGFsdCk7CiAgICAgICAgICAgIGlmIChidG4pIGJ0bi50ZXh0Q29udGVudCA9ICfDhG5k -ZXJ1bmdlbiBhbnplaWdlbic7CiAgICAgICAgICAgIHRoaXMuX2RpZmZWaXNpYmxlID0gZmFsc2U7 -CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgLy8gRGlmZiBiZXJlY2huZW4gdW5kIGFuemVp -Z2VuCiAgICAgICAgICAgIHZhciBkaWZmSHRtbCA9IHRoaXMuX2NvbXB1dGVEaWZmKHByZXZJbmhh -bHQsIGRvYy5pbmhhbHQgfHwgJycpOwogICAgICAgICAgICBjb250ZW50RWwuaW5uZXJIVE1MID0K -ICAgICAgICAgICAgICAgICc8ZGl2IGNsYXNzPSJkaWZmLWxlZ2VuZCI+JyArCiAgICAgICAgICAg -ICAgICAgICAgJzxzcGFuPjxzcGFuIGNsYXNzPSJkaWZmLWFkZGVkIj5CZWlzcGllbDwvc3Bhbj4g -SGluenVnZWbDvGd0PC9zcGFuPicgKwogICAgICAgICAgICAgICAgICAgICc8c3Bhbj48c3BhbiBj -bGFzcz0iZGlmZi1yZW1vdmVkIj5CZWlzcGllbDwvc3Bhbj4gRW50ZmVybnQ8L3NwYW4+JyArCiAg -ICAgICAgICAgICAgICAnPC9kaXY+JyArCiAgICAgICAgICAgICAgICBkaWZmSHRtbDsKICAgICAg -ICAgICAgaWYgKGJ0bikgYnRuLnRleHRDb250ZW50ID0gJ09yaWdpbmFsYW5zaWNodCc7CiAgICAg -ICAgICAgIHRoaXMuX2RpZmZWaXNpYmxlID0gdHJ1ZTsKICAgICAgICB9CiAgICB9LAoKICAgIF9j -b21wdXRlRGlmZihvbGRIdG1sLCBuZXdIdG1sKSB7CiAgICAgICAgLy8gSFRNTCBpbiBXb2VydGVy -IHplcmxlZ2VuIChUYWdzIGFscyBFaW5oZWl0IGJlaGFsdGVuKQogICAgICAgIGZ1bmN0aW9uIHRv -a2VuaXplKGh0bWwpIHsKICAgICAgICAgICAgdmFyIHRva2VucyA9IFtdOwogICAgICAgICAgICB2 -YXIgcmUgPSAvPFtePl0rPnxbXlxzPF0rfFxzKy9nOwogICAgICAgICAgICB2YXIgbTsKICAgICAg -ICAgICAgd2hpbGUgKChtID0gcmUuZXhlYyhodG1sKSkgIT09IG51bGwpIHsKICAgICAgICAgICAg -ICAgIHRva2Vucy5wdXNoKG1bMF0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiB0 -b2tlbnM7CiAgICAgICAgfQoKICAgICAgICB2YXIgb2xkVG9rZW5zID0gdG9rZW5pemUob2xkSHRt -bCk7CiAgICAgICAgdmFyIG5ld1Rva2VucyA9IHRva2VuaXplKG5ld0h0bWwpOwoKICAgICAgICAv -LyBMQ1MgKExvbmdlc3QgQ29tbW9uIFN1YnNlcXVlbmNlKSBiZXJlY2huZW4KICAgICAgICB2YXIg -biA9IG9sZFRva2Vucy5sZW5ndGgsIG0gPSBuZXdUb2tlbnMubGVuZ3RoOwoKICAgICAgICAvLyBG -dWVyIHNlaHIgZ3Jvc3NlIERva3VtZW50ZTogdmVyZWluZmFjaHRlciBBbnNhdHogbWl0IGJlZ3Jl -bnp0ZXIgTWF0cml4CiAgICAgICAgaWYgKG4gKiBtID4gMjAwMDAwMCkgewogICAgICAgICAgICAv -LyBGYWxsYmFjazogWmVpbGVud2Vpc2VyIFZlcmdsZWljaAogICAgICAgICAgICByZXR1cm4gdGhp -cy5fY29tcHV0ZUxpbmVEaWZmKG9sZEh0bWwsIG5ld0h0bWwpOwogICAgICAgIH0KCiAgICAgICAg -dmFyIGRwID0gW107CiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPD0gbjsgaSsrKSB7CiAgICAg -ICAgICAgIGRwW2ldID0gbmV3IFVpbnQxNkFycmF5KG0gKyAxKTsKICAgICAgICB9CgogICAgICAg -IGZvciAodmFyIGkgPSAxOyBpIDw9IG47IGkrKykgewogICAgICAgICAgICBmb3IgKHZhciBqID0g -MTsgaiA8PSBtOyBqKyspIHsKICAgICAgICAgICAgICAgIGlmIChvbGRUb2tlbnNbaS0xXSA9PT0g -bmV3VG9rZW5zW2otMV0pIHsKICAgICAgICAgICAgICAgICAgICBkcFtpXVtqXSA9IGRwW2ktMV1b -ai0xXSArIDE7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIGRw -W2ldW2pdID0gTWF0aC5tYXgoZHBbaS0xXVtqXSwgZHBbaV1bai0xXSk7CiAgICAgICAgICAgICAg -ICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8vIEJhY2t0cmFjazogRGlmZi1T -ZXF1ZW56IGVyc3RlbGxlbgogICAgICAgIHZhciByZXN1bHQgPSBbXTsKICAgICAgICB2YXIgaSA9 -IG4sIGogPSBtOwogICAgICAgIHdoaWxlIChpID4gMCB8fCBqID4gMCkgewogICAgICAgICAgICBp -ZiAoaSA+IDAgJiYgaiA+IDAgJiYgb2xkVG9rZW5zW2ktMV0gPT09IG5ld1Rva2Vuc1tqLTFdKSB7 -CiAgICAgICAgICAgICAgICByZXN1bHQudW5zaGlmdCh7IHR5cGU6ICdzYW1lJywgdGV4dDogb2xk -VG9rZW5zW2ktMV0gfSk7CiAgICAgICAgICAgICAgICBpLS07IGotLTsKICAgICAgICAgICAgfSBl -bHNlIGlmIChqID4gMCAmJiAoaSA9PT0gMCB8fCBkcFtpXVtqLTFdID49IGRwW2ktMV1bal0pKSB7 -CiAgICAgICAgICAgICAgICByZXN1bHQudW5zaGlmdCh7IHR5cGU6ICdhZGQnLCB0ZXh0OiBuZXdU -b2tlbnNbai0xXSB9KTsKICAgICAgICAgICAgICAgIGotLTsKICAgICAgICAgICAgfSBlbHNlIHsK -ICAgICAgICAgICAgICAgIHJlc3VsdC51bnNoaWZ0KHsgdHlwZTogJ2RlbCcsIHRleHQ6IG9sZFRv -a2Vuc1tpLTFdIH0pOwogICAgICAgICAgICAgICAgaS0tOwogICAgICAgICAgICB9CiAgICAgICAg -fQoKICAgICAgICAvLyBFcmdlYm5pcyBhbHMgSFRNTCByZW5kZXJuCiAgICAgICAgdmFyIGh0bWwg -PSAnJzsKICAgICAgICB2YXIgaW5BZGQgPSBmYWxzZSwgaW5EZWwgPSBmYWxzZTsKCiAgICAgICAg -Zm9yICh2YXIgayA9IDA7IGsgPCByZXN1bHQubGVuZ3RoOyBrKyspIHsKICAgICAgICAgICAgdmFy -IHIgPSByZXN1bHRba107CiAgICAgICAgICAgIHZhciBpc1RhZyA9IHIudGV4dC5jaGFyQXQoMCkg -PT09ICc8JzsKCiAgICAgICAgICAgIGlmIChyLnR5cGUgPT09ICdzYW1lJykgewogICAgICAgICAg -ICAgICAgaWYgKGluQWRkKSB7IGh0bWwgKz0gJzwvc3Bhbj4nOyBpbkFkZCA9IGZhbHNlOyB9CiAg -ICAgICAgICAgICAgICBpZiAoaW5EZWwpIHsgaHRtbCArPSAnPC9zcGFuPic7IGluRGVsID0gZmFs -c2U7IH0KICAgICAgICAgICAgICAgIGh0bWwgKz0gci50ZXh0OwogICAgICAgICAgICB9IGVsc2Ug -aWYgKHIudHlwZSA9PT0gJ2FkZCcpIHsKICAgICAgICAgICAgICAgIGlmIChpbkRlbCkgeyBodG1s -ICs9ICc8L3NwYW4+JzsgaW5EZWwgPSBmYWxzZTsgfQogICAgICAgICAgICAgICAgaWYgKGlzVGFn -KSB7IGh0bWwgKz0gci50ZXh0OyBjb250aW51ZTsgfQogICAgICAgICAgICAgICAgaWYgKCFpbkFk -ZCkgeyBodG1sICs9ICc8c3BhbiBjbGFzcz0iZGlmZi1hZGRlZCI+JzsgaW5BZGQgPSB0cnVlOyB9 -CiAgICAgICAgICAgICAgICBodG1sICs9IHIudGV4dDsKICAgICAgICAgICAgfSBlbHNlIGlmIChy -LnR5cGUgPT09ICdkZWwnKSB7CiAgICAgICAgICAgICAgICBpZiAoaW5BZGQpIHsgaHRtbCArPSAn -PC9zcGFuPic7IGluQWRkID0gZmFsc2U7IH0KICAgICAgICAgICAgICAgIGlmIChpc1RhZykgY29u -dGludWU7IC8vIEVudGZlcm50ZSBUYWdzIG5pY2h0IGFuemVpZ2VuCiAgICAgICAgICAgICAgICBp -ZiAoIWluRGVsKSB7IGh0bWwgKz0gJzxzcGFuIGNsYXNzPSJkaWZmLXJlbW92ZWQiPic7IGluRGVs -ID0gdHJ1ZTsgfQogICAgICAgICAgICAgICAgaHRtbCArPSByLnRleHQ7CiAgICAgICAgICAgIH0K -ICAgICAgICB9CiAgICAgICAgaWYgKGluQWRkKSBodG1sICs9ICc8L3NwYW4+JzsKICAgICAgICBp -ZiAoaW5EZWwpIGh0bWwgKz0gJzwvc3Bhbj4nOwoKICAgICAgICByZXR1cm4gaHRtbDsKICAgIH0s -CgogICAgX2NvbXB1dGVMaW5lRGlmZihvbGRIdG1sLCBuZXdIdG1sKSB7CiAgICAgICAgLy8gRWlu -ZmFjaGVyIEZhbGxiYWNrIGZ1ZXIgc2VociBncm9zc2UgRG9rdW1lbnRlOiBBYnNhdHp3ZWlzZXIg -VmVyZ2xlaWNoCiAgICAgICAgZnVuY3Rpb24gZ2V0UGFyYXMoaHRtbCkgewogICAgICAgICAgICB2 -YXIgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CiAgICAgICAgICAgIGRpdi5p -bm5lckhUTUwgPSBodG1sOwogICAgICAgICAgICB2YXIgYmxvY2tzID0gW107CiAgICAgICAgICAg -IGRpdi5jaGlsZE5vZGVzLmZvckVhY2goZnVuY3Rpb24obikgewogICAgICAgICAgICAgICAgYmxv -Y2tzLnB1c2gobi5vdXRlckhUTUwgfHwgbi50ZXh0Q29udGVudCk7CiAgICAgICAgICAgIH0pOwog -ICAgICAgICAgICByZXR1cm4gYmxvY2tzOwogICAgICAgIH0KCiAgICAgICAgdmFyIG9sZFBhcmFz -ID0gZ2V0UGFyYXMob2xkSHRtbCk7CiAgICAgICAgdmFyIG5ld1BhcmFzID0gZ2V0UGFyYXMobmV3 -SHRtbCk7CiAgICAgICAgdmFyIG9sZFNldCA9IG5ldyBTZXQob2xkUGFyYXMpOwogICAgICAgIHZh -ciBuZXdTZXQgPSBuZXcgU2V0KG5ld1BhcmFzKTsKCiAgICAgICAgdmFyIGh0bWwgPSAnJzsKICAg -ICAgICBuZXdQYXJhcy5mb3JFYWNoKGZ1bmN0aW9uKHApIHsKICAgICAgICAgICAgaWYgKG9sZFNl -dC5oYXMocCkpIHsKICAgICAgICAgICAgICAgIGh0bWwgKz0gcDsKICAgICAgICAgICAgfSBlbHNl -IHsKICAgICAgICAgICAgICAgIGh0bWwgKz0gJzxkaXYgY2xhc3M9ImRpZmYtYWRkZWQiIHN0eWxl -PSJkaXNwbGF5OmJsb2NrO3BhZGRpbmc6NHB4IDhweDttYXJnaW46NHB4IDA7Ym9yZGVyLXJhZGl1 -czo0cHg7Ij4nICsgcCArICc8L2Rpdj4nOwogICAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICAg -ICAgb2xkUGFyYXMuZm9yRWFjaChmdW5jdGlvbihwKSB7CiAgICAgICAgICAgIGlmICghbmV3U2V0 -LmhhcyhwKSkgewogICAgICAgICAgICAgICAgaHRtbCArPSAnPGRpdiBjbGFzcz0iZGlmZi1yZW1v -dmVkIiBzdHlsZT0iZGlzcGxheTpibG9jaztwYWRkaW5nOjRweCA4cHg7bWFyZ2luOjRweCAwO2Jv -cmRlci1yYWRpdXM6NHB4OyI+JyArIHAgKyAnPC9kaXY+JzsKICAgICAgICAgICAgfQogICAgICAg -IH0pOwoKICAgICAgICByZXR1cm4gaHRtbDsKICAgIH0sCgogICAgLy8gPT09PSBSZXZpc2lvbnNo -aXN0b3JpZSA9PT09CiAgICBfcmV2RG9jSWQ6IG51bGwsCiAgICBfcmV2U2VsZWN0ZWRJZHg6IC0x -LAogICAgX3Jldk1vZGU6ICdjb250ZW50JywgLy8gJ2NvbnRlbnQnIG9kZXIgJ2RpZmYnCgogICAg -b3BlblJldmlzaW9ucyhkb2NJZCkgewogICAgICAgIHZhciBkb2MgPSBEcml2ZUZTLmRvY3VtZW50 -cy5maW5kKGZ1bmN0aW9uKGQpIHsgcmV0dXJuIGQuaWQgPT09IGRvY0lkOyB9KTsKICAgICAgICBp -ZiAoIWRvYykgcmV0dXJuOwogICAgICAgIHRoaXMuX3JldkRvY0lkID0gZG9jSWQ7CiAgICAgICAg -dGhpcy5fcmV2U2VsZWN0ZWRJZHggPSAtMTsKICAgICAgICB0aGlzLl9yZXZNb2RlID0gJ2NvbnRl -bnQnOwoKICAgICAgICB2YXIgcmV2aXNpb25zID0gZG9jLnJldmlzaW9ucyB8fCBbXTsKICAgICAg -ICB2YXIgbGlzdEVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3JldmlzaW9uTGlzdCcpOwoK -ICAgICAgICBpZiAocmV2aXNpb25zLmxlbmd0aCA9PT0gMCkgewogICAgICAgICAgICBzaG93VG9h -c3QoJ0tlaW5lIGZydWVoZXJlbiBWZXJzaW9uZW4gdm9yaGFuZGVuJywgJ2luZm8nKTsKICAgICAg -ICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgLy8gTGlzdGUgYXVmYmF1ZW4gKG5ldWVz -dGUgenVlcnN0KQogICAgICAgIHZhciBodG1sID0gJyc7CiAgICAgICAgLy8gQWt0dWVsbGUgVmVy -c2lvbiBhbHMgZXJzdGVzIEVsZW1lbnQKICAgICAgICBodG1sICs9ICc8ZGl2IGNsYXNzPSJyZXZp -c2lvbi1pdGVtIiBvbmNsaWNrPSJEcml2ZVBvcnRhbC5zZWxlY3RSZXZpc2lvbigtMSkiPicgKwog -ICAgICAgICAgICAnPGRpdiBjbGFzcz0icmV2LWxhYmVsIj5Ba3R1ZWxsZSBWZXJzaW9uIDxzcGFu -IGNsYXNzPSJyZXYtYmFkZ2UiPkxpdmU8L3NwYW4+PC9kaXY+JyArCiAgICAgICAgICAgICc8ZGl2 -IGNsYXNzPSJyZXYtZGF0ZSI+JyArIChkb2MudGl0ZWwgfHwgJ09obmUgVGl0ZWwnKSArICc8L2Rp -dj4nICsKICAgICAgICAgICAgJzxkaXYgY2xhc3M9InJldi11c2VyIj5TdGF0dXM6ICcgKyBEcml2 -ZVBvcnRhbC5lc2NhcGVIVE1MKGRvYy5zdGF0dXMgfHwgJ0VudHd1cmYnKSArICc8L2Rpdj4nICsK -ICAgICAgICAnPC9kaXY+JzsKCiAgICAgICAgZm9yICh2YXIgaSA9IHJldmlzaW9ucy5sZW5ndGgg -LSAxOyBpID49IDA7IGktLSkgewogICAgICAgICAgICB2YXIgcmV2ID0gcmV2aXNpb25zW2ldOwog -ICAgICAgICAgICB2YXIgZCA9IG5ldyBEYXRlKHJldi5zYXZlZEF0KTsKICAgICAgICAgICAgdmFy -IGRhdGVTdHIgPSBkLnRvTG9jYWxlRGF0ZVN0cmluZygnZGUtREUnLCB7IGRheTogJzItZGlnaXQn -LCBtb250aDogJzItZGlnaXQnLCB5ZWFyOiAnbnVtZXJpYycgfSk7CiAgICAgICAgICAgIHZhciB0 -aW1lU3RyID0gZC50b0xvY2FsZVRpbWVTdHJpbmcoJ2RlLURFJywgeyBob3VyOiAnMi1kaWdpdCcs -IG1pbnV0ZTogJzItZGlnaXQnIH0pOwogICAgICAgICAgICB2YXIgcmV2TnVtID0gaSArIDE7CiAg -ICAgICAgICAgIGh0bWwgKz0gJzxkaXYgY2xhc3M9InJldmlzaW9uLWl0ZW0iIG9uY2xpY2s9IkRy -aXZlUG9ydGFsLnNlbGVjdFJldmlzaW9uKCcgKyBpICsgJykiPicgKwogICAgICAgICAgICAgICAg -JzxkaXYgY2xhc3M9InJldi1sYWJlbCI+VmVyc2lvbiAnICsgcmV2TnVtICsgJyA8c3BhbiBjbGFz -cz0icmV2LWJhZGdlIj52JyArIHJldk51bSArICc8L3NwYW4+PC9kaXY+JyArCiAgICAgICAgICAg -ICAgICAnPGRpdiBjbGFzcz0icmV2LWRhdGUiPicgKyBkYXRlU3RyICsgJyB1bSAnICsgdGltZVN0 -ciArICc8L2Rpdj4nICsKICAgICAgICAgICAgICAgICc8ZGl2IGNsYXNzPSJyZXYtdXNlciI+dm9u -ICcgKyBEcml2ZVBvcnRhbC5lc2NhcGVIVE1MKHJldi5zYXZlZEJ5IHx8ICdVbmJla2FubnQnKSAr -CiAgICAgICAgICAgICAgICAgICAgKHJldi5zdGF0dXMgPyAnICZtaWRkb3Q7ICcgKyBEcml2ZVBv -cnRhbC5lc2NhcGVIVE1MKHJldi5zdGF0dXMpIDogJycpICsgJzwvZGl2PicgKwogICAgICAgICAg -ICAnPC9kaXY+JzsKICAgICAgICB9CiAgICAgICAgbGlzdEVsLmlubmVySFRNTCA9IGh0bWw7Cgog -ICAgICAgIC8vIFRvb2xiYXIgdW5kIENvbnRlbnQgenVydWVja3NldHplbgogICAgICAgIGRvY3Vt -ZW50LmdldEVsZW1lbnRCeUlkKCdyZXZpc2lvblRvb2xiYXInKS5pbm5lckhUTUwgPSAnJzsKICAg -ICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmV2aXNpb25Db250ZW50JykuaW5uZXJIVE1M -ID0KICAgICAgICAgICAgJzxkaXYgc3R5bGU9InRleHQtYWxpZ246Y2VudGVyO2NvbG9yOnZhcigt -LXRleHQtbXV0ZWQpO21hcmdpbi10b3A6NjBweDsiPlZlcnNpb24gYXVzIGRlciBMaXN0ZSBhdXN3 -YWVobGVuPC9kaXY+JzsKCiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3JldmlzaW9u -TW9kYWwnKS5jbGFzc0xpc3QuYWRkKCdvcGVuJyk7CiAgICB9LAoKICAgIGNsb3NlUmV2aXNpb25z -KCkgewogICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyZXZpc2lvbk1vZGFsJykuY2xh -c3NMaXN0LnJlbW92ZSgnb3BlbicpOwogICAgICAgIHRoaXMuX3JldkRvY0lkID0gbnVsbDsKICAg -IH0sCgogICAgc2VsZWN0UmV2aXNpb24oaWR4KSB7CiAgICAgICAgdmFyIGRvYyA9IERyaXZlRlMu -ZG9jdW1lbnRzLmZpbmQoZnVuY3Rpb24oZCkgeyByZXR1cm4gZC5pZCA9PT0gRHJpdmVQb3J0YWwu -X3JldkRvY0lkOyB9KTsKICAgICAgICBpZiAoIWRvYykgcmV0dXJuOwogICAgICAgIHRoaXMuX3Jl -dlNlbGVjdGVkSWR4ID0gaWR4OwogICAgICAgIHRoaXMuX3Jldk1vZGUgPSAnY29udGVudCc7Cgog -ICAgICAgIC8vIEFrdGl2ZSBNYXJraWVydW5nIHNldHplbgogICAgICAgIHZhciBpdGVtcyA9IGRv -Y3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJyNyZXZpc2lvbkxpc3QgLnJldmlzaW9uLWl0ZW0nKTsK -ICAgICAgICB2YXIgcmV2aXNpb25zID0gZG9jLnJldmlzaW9ucyB8fCBbXTsKICAgICAgICAvLyBp -ZHg9LTEgaXN0ICJBa3R1ZWxsZSBWZXJzaW9uIiAoZXJzdGVyIEVpbnRyYWcpLCBzb25zdCB1bWdl -a2VocnQgd2VpbCBMaXN0ZSBpbnZlcnRpZXJ0CiAgICAgICAgdmFyIGFjdGl2ZVBvcyA9IChpZHgg -PT09IC0xKSA/IDAgOiAocmV2aXNpb25zLmxlbmd0aCAtIGlkeCk7CiAgICAgICAgaXRlbXMuZm9y -RWFjaChmdW5jdGlvbihlbCwgaSkgewogICAgICAgICAgICBlbC5jbGFzc0xpc3QudG9nZ2xlKCdh -Y3RpdmUnLCBpID09PSBhY3RpdmVQb3MpOwogICAgICAgIH0pOwoKICAgICAgICAvLyBUb29sYmFy -CiAgICAgICAgdmFyIHJldiA9IChpZHggPT09IC0xKSA/IG51bGwgOiByZXZpc2lvbnNbaWR4XTsK -ICAgICAgICB2YXIgdG9vbGJhciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyZXZpc2lvblRv -b2xiYXInKTsKICAgICAgICB2YXIgbGFiZWwgPSAnJzsKICAgICAgICBpZiAoaWR4ID09PSAtMSkg -ewogICAgICAgICAgICBsYWJlbCA9ICdBa3R1ZWxsZSBWZXJzaW9uJzsKICAgICAgICB9IGVsc2Ug -ewogICAgICAgICAgICB2YXIgZCA9IG5ldyBEYXRlKHJldi5zYXZlZEF0KTsKICAgICAgICAgICAg -bGFiZWwgPSAnVmVyc2lvbiAnICsgKGlkeCArIDEpICsgJyAmbWlkZG90OyAnICsKICAgICAgICAg -ICAgICAgIGQudG9Mb2NhbGVEYXRlU3RyaW5nKCdkZS1ERScsIHsgZGF5OiAnMi1kaWdpdCcsIG1v -bnRoOiAnMi1kaWdpdCcsIHllYXI6ICdudW1lcmljJyB9KSArICcgJyArCiAgICAgICAgICAgICAg -ICBkLnRvTG9jYWxlVGltZVN0cmluZygnZGUtREUnLCB7IGhvdXI6ICcyLWRpZ2l0JywgbWludXRl -OiAnMi1kaWdpdCcsIHNlY29uZDogJzItZGlnaXQnIH0pICsKICAgICAgICAgICAgICAgICcgJm1p -ZGRvdDsgJyArIERyaXZlUG9ydGFsLmVzY2FwZUhUTUwocmV2LnNhdmVkQnkgfHwgJ1VuYmVrYW5u -dCcpOwogICAgICAgIH0KCiAgICAgICAgdG9vbGJhci5pbm5lckhUTUwgPQogICAgICAgICAgICAn -PGJ1dHRvbiBjbGFzcz0iYWN0aXZlIiBpZD0icmV2QnRuQ29udGVudCIgb25jbGljaz0iRHJpdmVQ -b3J0YWwuc2hvd1JldkNvbnRlbnQoKSI+SW5oYWx0PC9idXR0b24+JyArCiAgICAgICAgICAgICc8 -YnV0dG9uIGlkPSJyZXZCdG5EaWZmIiBvbmNsaWNrPSJEcml2ZVBvcnRhbC5zaG93UmV2RGlmZigp -Ij5EaWZmIHp1ciBha3R1ZWxsZW4gVmVyc2lvbjwvYnV0dG9uPicgKwogICAgICAgICAgICAoaWR4 -ID49IDAgPyAnPGJ1dHRvbiBpZD0icmV2QnRuUmVzdG9yZSIgb25jbGljaz0iRHJpdmVQb3J0YWwu -cmVzdG9yZVJldmlzaW9uKCkiPkRpZXNlIFZlcnNpb24gd2llZGVyaGVyc3RlbGxlbjwvYnV0dG9u -PicgOiAnJykgKwogICAgICAgICAgICAnPHNwYW4gY2xhc3M9InJldi1pbmZvIj4nICsgbGFiZWwg -KyAnPC9zcGFuPic7CgogICAgICAgIHRoaXMuc2hvd1JldkNvbnRlbnQoKTsKICAgIH0sCgogICAg -c2hvd1JldkNvbnRlbnQoKSB7CiAgICAgICAgdmFyIGRvYyA9IERyaXZlRlMuZG9jdW1lbnRzLmZp -bmQoZnVuY3Rpb24oZCkgeyByZXR1cm4gZC5pZCA9PT0gRHJpdmVQb3J0YWwuX3JldkRvY0lkOyB9 -KTsKICAgICAgICBpZiAoIWRvYykgcmV0dXJuOwogICAgICAgIHRoaXMuX3Jldk1vZGUgPSAnY29u -dGVudCc7CgogICAgICAgIHZhciBjb250ZW50RWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgn -cmV2aXNpb25Db250ZW50Jyk7CiAgICAgICAgdmFyIHJldiA9ICh0aGlzLl9yZXZTZWxlY3RlZElk -eCA9PT0gLTEpID8gbnVsbCA6IChkb2MucmV2aXNpb25zIHx8IFtdKVt0aGlzLl9yZXZTZWxlY3Rl -ZElkeF07CiAgICAgICAgdmFyIGluaGFsdCA9IHJldiA/IHJldi5pbmhhbHQgOiBkb2MuaW5oYWx0 -OwogICAgICAgIHZhciB0aXRlbCA9IHJldiA/IHJldi50aXRlbCA6IGRvYy50aXRlbDsKCiAgICAg -ICAgY29udGVudEVsLmlubmVySFRNTCA9CiAgICAgICAgICAgICc8ZGl2IHN0eWxlPSJmb250LXNp -emU6MThweDtmb250LXdlaWdodDo3MDA7Y29sb3I6dmFyKC0tdGV4dC1oZWFkaW5nKTttYXJnaW4t -Ym90dG9tOjE2cHg7cGFkZGluZy1ib3R0b206OHB4O2JvcmRlci1ib3R0b206MXB4IHNvbGlkIHZh -cigtLWJvcmRlci1saWdodCk7Ij4nICsKICAgICAgICAgICAgICAgIERyaXZlUG9ydGFsLmVzY2Fw -ZUhUTUwodGl0ZWwgfHwgJ09obmUgVGl0ZWwnKSArCiAgICAgICAgICAgICc8L2Rpdj4nICsKICAg -ICAgICAgICAgKGluaGFsdCB8fCAnPHNwYW4gc3R5bGU9ImNvbG9yOnZhcigtLXRleHQtbXV0ZWQp -OyI+S2VpbiBJbmhhbHQ8L3NwYW4+Jyk7CgogICAgICAgIC8vIEJ1dHRvbi1TdGF0dXMKICAgICAg -ICB2YXIgYnRuQyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyZXZCdG5Db250ZW50Jyk7CiAg -ICAgICAgdmFyIGJ0bkQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmV2QnRuRGlmZicpOwog -ICAgICAgIGlmIChidG5DKSBidG5DLmNsYXNzTGlzdC5hZGQoJ2FjdGl2ZScpOwogICAgICAgIGlm -IChidG5EKSBidG5ELmNsYXNzTGlzdC5yZW1vdmUoJ2FjdGl2ZScpOwogICAgfSwKCiAgICBzaG93 -UmV2RGlmZigpIHsKICAgICAgICB2YXIgZG9jID0gRHJpdmVGUy5kb2N1bWVudHMuZmluZChmdW5j -dGlvbihkKSB7IHJldHVybiBkLmlkID09PSBEcml2ZVBvcnRhbC5fcmV2RG9jSWQ7IH0pOwogICAg -ICAgIGlmICghZG9jKSByZXR1cm47CiAgICAgICAgdGhpcy5fcmV2TW9kZSA9ICdkaWZmJzsKCiAg -ICAgICAgdmFyIGNvbnRlbnRFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyZXZpc2lvbkNv -bnRlbnQnKTsKICAgICAgICB2YXIgcmV2ID0gKHRoaXMuX3JldlNlbGVjdGVkSWR4ID09PSAtMSkg -PyBudWxsIDogKGRvYy5yZXZpc2lvbnMgfHwgW10pW3RoaXMuX3JldlNlbGVjdGVkSWR4XTsKCiAg -ICAgICAgaWYgKCFyZXYgfHwgdGhpcy5fcmV2U2VsZWN0ZWRJZHggPT09IC0xKSB7CiAgICAgICAg -ICAgIGNvbnRlbnRFbC5pbm5lckhUTUwgPSAnPGRpdiBzdHlsZT0idGV4dC1hbGlnbjpjZW50ZXI7 -Y29sb3I6dmFyKC0tdGV4dC1tdXRlZCk7bWFyZ2luLXRvcDo2MHB4OyI+RGlmZiBudXIgZsO8ciBm -csO8aGVyZSBWZXJzaW9uZW4gdmVyZnVlZ2JhcjwvZGl2Pic7CiAgICAgICAgICAgIHJldHVybjsK -ICAgICAgICB9CgogICAgICAgIHZhciBvbGRJbmhhbHQgPSByZXYuaW5oYWx0IHx8ICcnOwogICAg -ICAgIHZhciBuZXdJbmhhbHQgPSBkb2MuaW5oYWx0IHx8ICcnOwogICAgICAgIHZhciBkaWZmSHRt -bCA9IHRoaXMuX2NvbXB1dGVEaWZmKG9sZEluaGFsdCwgbmV3SW5oYWx0KTsKCiAgICAgICAgdmFy -IHRpdGVsQ2hhbmdlZCA9IHJldi50aXRlbCAhPT0gZG9jLnRpdGVsOwoKICAgICAgICBjb250ZW50 -RWwuaW5uZXJIVE1MID0KICAgICAgICAgICAgJzxkaXYgY2xhc3M9ImRpZmYtbGVnZW5kIj4nICsK -ICAgICAgICAgICAgICAgICc8c3Bhbj48c3BhbiBjbGFzcz0iZGlmZi1hZGRlZCI+QmVpc3BpZWw8 -L3NwYW4+IEhpbnp1Z2VmdWVndDwvc3Bhbj4nICsKICAgICAgICAgICAgICAgICc8c3Bhbj48c3Bh -biBjbGFzcz0iZGlmZi1yZW1vdmVkIj5CZWlzcGllbDwvc3Bhbj4gRW50ZmVybnQ8L3NwYW4+JyAr -CiAgICAgICAgICAgICc8L2Rpdj4nICsKICAgICAgICAgICAgKHRpdGVsQ2hhbmdlZCA/CiAgICAg -ICAgICAgICAgICAnPGRpdiBzdHlsZT0ibWFyZ2luLWJvdHRvbToxMnB4O3BhZGRpbmc6OHB4IDEy -cHg7Ym9yZGVyLXJhZGl1czo2cHg7YmFja2dyb3VuZDp2YXIoLS1iZy1jYXJkLWFsdCk7Zm9udC1z -aXplOjEzcHg7Ij4nICsKICAgICAgICAgICAgICAgICAgICAnVGl0ZWw6IDxzcGFuIGNsYXNzPSJk -aWZmLXJlbW92ZWQiPicgKyBEcml2ZVBvcnRhbC5lc2NhcGVIVE1MKHJldi50aXRlbCB8fCAnJykg -KyAnPC9zcGFuPiAmcmFycjsgJyArCiAgICAgICAgICAgICAgICAgICAgJzxzcGFuIGNsYXNzPSJk -aWZmLWFkZGVkIj4nICsgRHJpdmVQb3J0YWwuZXNjYXBlSFRNTChkb2MudGl0ZWwgfHwgJycpICsg -Jzwvc3Bhbj4nICsKICAgICAgICAgICAgICAgICc8L2Rpdj4nIDogJycpICsKICAgICAgICAgICAg -ZGlmZkh0bWw7CgogICAgICAgIC8vIEJ1dHRvbi1TdGF0dXMKICAgICAgICB2YXIgYnRuQyA9IGRv -Y3VtZW50LmdldEVsZW1lbnRCeUlkKCdyZXZCdG5Db250ZW50Jyk7CiAgICAgICAgdmFyIGJ0bkQg -PSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmV2QnRuRGlmZicpOwogICAgICAgIGlmIChidG5D -KSBidG5DLmNsYXNzTGlzdC5yZW1vdmUoJ2FjdGl2ZScpOwogICAgICAgIGlmIChidG5EKSBidG5E -LmNsYXNzTGlzdC5hZGQoJ2FjdGl2ZScpOwogICAgfSwKCiAgICBhc3luYyByZXN0b3JlUmV2aXNp -b24oKSB7CiAgICAgICAgdmFyIGRvYyA9IERyaXZlRlMuZG9jdW1lbnRzLmZpbmQoZnVuY3Rpb24o -ZCkgeyByZXR1cm4gZC5pZCA9PT0gRHJpdmVQb3J0YWwuX3JldkRvY0lkOyB9KTsKICAgICAgICBp -ZiAoIWRvYyB8fCB0aGlzLl9yZXZTZWxlY3RlZElkeCA8IDApIHJldHVybjsKICAgICAgICB2YXIg -cmV2ID0gKGRvYy5yZXZpc2lvbnMgfHwgW10pW3RoaXMuX3JldlNlbGVjdGVkSWR4XTsKICAgICAg -ICBpZiAoIXJldikgcmV0dXJuOwoKICAgICAgICBpZiAoIWNvbmZpcm0oJ1ZlcnNpb24gJyArICh0 -aGlzLl9yZXZTZWxlY3RlZElkeCArIDEpICsgJyB3aWVkZXJoZXJzdGVsbGVuP1xuXG5EZXIgYWt0 -dWVsbGUgSW5oYWx0IHdpcmQgYWxzIG5ldWUgUmV2aXNpb24gZ2VzaWNoZXJ0LicpKSByZXR1cm47 -CgogICAgICAgIHZhciB1c2VybmFtZSA9IChEcml2ZUZTLmVudmlyb24gJiYgRHJpdmVGUy5lbnZp -cm9uLnVzZXJuYW1lKSA/IERyaXZlRlMuZW52aXJvbi51c2VybmFtZSA6ICdVbmJla2FubnQnOwoK -ICAgICAgICAvLyBBa3R1ZWxsZW4gU3RhbmQgYWxzIFJldmlzaW9uIHNpY2hlcm4KICAgICAgICBp -ZiAoIWRvYy5yZXZpc2lvbnMpIGRvYy5yZXZpc2lvbnMgPSBbXTsKICAgICAgICBkb2MucmV2aXNp -b25zLnB1c2goewogICAgICAgICAgICBpbmhhbHQ6IGRvYy5pbmhhbHQsCiAgICAgICAgICAgIHRp -dGVsOiBkb2MudGl0ZWwsCiAgICAgICAgICAgIHN0YXR1czogZG9jLnN0YXR1cywKICAgICAgICAg -ICAgc2F2ZWRBdDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLAogICAgICAgICAgICBzYXZlZEJ5 -OiB1c2VybmFtZQogICAgICAgIH0pOwogICAgICAgIHdoaWxlIChkb2MucmV2aXNpb25zLmxlbmd0 -aCA+IDYpIHsKICAgICAgICAgICAgZG9jLnJldmlzaW9ucy5zaGlmdCgpOwogICAgICAgIH0KCiAg -ICAgICAgLy8gUmV2aXNpb24gd2llZGVyaGVyc3RlbGxlbgogICAgICAgIGRvYy5pbmhhbHQgPSBy -ZXYuaW5oYWx0OwogICAgICAgIGRvYy50aXRlbCA9IHJldi50aXRlbDsKCiAgICAgICAgdHJ5IHsK -ICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGF3YWl0IERyaXZlRlMuc2F2ZURvY3VtZW50KGRvYyk7 -CiAgICAgICAgICAgIGlmIChyZXN1bHQgPT09IHRydWUpIHsKICAgICAgICAgICAgICAgIHNob3dU -b2FzdCgnVmVyc2lvbiAnICsgKHRoaXMuX3JldlNlbGVjdGVkSWR4ICsgMSkgKyAnIHdpZWRlcmhl -cmdlc3RlbGx0JywgJ3N1Y2Nlc3MnKTsKICAgICAgICAgICAgICAgIHRoaXMuY2xvc2VSZXZpc2lv -bnMoKTsKICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyKCk7CiAgICAgICAgICAgICAgICBhd2Fp -dCB0aGlzLnNlbGVjdERvY3VtZW50KGRvYy5pZCk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAg -ICAgICAgICAgICBzaG93VG9hc3QoJ0ZlaGxlcjogJyArIHJlc3VsdCwgJ2Vycm9yJyk7CiAgICAg -ICAgICAgIH0KICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgIHNob3dUb2FzdCgnRmVo -bGVyOiAnICsgZS5tZXNzYWdlLCAnZXJyb3InKTsKICAgICAgICB9CiAgICB9LAoKICAgIGFzeW5j -IHNlbGVjdERvY3VtZW50KGRvY0lkKSB7CiAgICAgICAgdGhpcy5zZWxlY3RlZERvY0lkID0gZG9j -SWQ7CiAgICAgICAgdGhpcy5fZGlmZlZpc2libGUgPSBmYWxzZTsKCiAgICAgICAgLy8gTGFkZSBh -a3R1ZWxsc3RlIFZlcnNpb24gdm9uIERpc2sKICAgICAgICBjb25zdCBkb2MgPSBhd2FpdCBEcml2 -ZUZTLmxvYWREb2N1bWVudChkb2NJZCk7CiAgICAgICAgaWYgKCFkb2MpIHsKICAgICAgICAgICAg -c2hvd1RvYXN0KCdEb2t1bWVudCBrb25udGUgbmljaHQgZ2VsYWRlbiB3ZXJkZW4nLCAnZXJyb3In -KTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgLy8gSW4tTWVtb3J5IGFr -dHVhbGlzaWVyZW4KICAgICAgICBjb25zdCBpZHggPSBEcml2ZUZTLmRvY3VtZW50cy5maW5kSW5k -ZXgoZCA9PiBkLmlkID09PSBkb2NJZCk7CiAgICAgICAgaWYgKGlkeCA+PSAwKSBEcml2ZUZTLmRv -Y3VtZW50c1tpZHhdID0gZG9jOwoKICAgICAgICB0aGlzLnJlbmRlckxpc3QoKTsKICAgICAgICB0 -aGlzLnJlbmRlckRldGFpbChkb2MpOwogICAgfSwKCiAgICByZW5kZXJEZXRhaWwoZG9jKSB7CiAg -ICAgICAgY29uc3QgZGV0YWlsQ29udGFpbmVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Rv -Y3VtZW50RGV0YWlsJyk7CiAgICAgICAgY29uc3Qgc3RhdHVzQ29uZmlnID0gRHJpdmVGUy5jb25m -aWcuc3RhdHVzIHx8IHt9OwogICAgICAgIGNvbnN0IGNmZyA9IHN0YXR1c0NvbmZpZ1tkb2Muc3Rh -dHVzXSB8fCB7IGNvbG9yOiAnI2VlZScsIHRleHRDb2xvcjogJyMzMzMnLCBpY29uOiAnJywgbGFi -ZWw6IGRvYy5zdGF0dXMgfTsKCiAgICAgICAgbGV0IG1lZGlhSFRNTCA9ICcnOwogICAgICAgIGlm -IChkb2MubWVkaWFzICYmIGRvYy5tZWRpYXMubGVuZ3RoID4gMCkgewogICAgICAgICAgICAvLyBP -bmx5IHNob3cgYXR0YWNobWVudHMgc2VjdGlvbiAoaW5saW5lIG1lZGlhIGlzIHJlbmRlcmVkIGlu -IGRvYy5pbmhhbHQpCiAgICAgICAgICAgIGNvbnN0IGF0dGFjaG1lbnRzID0gZG9jLm1lZGlhcy5m -aWx0ZXIobSA9PiAhbS5kaXNwbGF5TW9kZSB8fCBtLmRpc3BsYXlNb2RlID09PSAnYXR0YWNobWVu -dCcpOwogICAgICAgICAgICBjb25zdCBpbmxpbmVNZWRpYSA9IGRvYy5tZWRpYXMuZmlsdGVyKG0g -PT4gbS5kaXNwbGF5TW9kZSAmJiBtLmRpc3BsYXlNb2RlICE9PSAnYXR0YWNobWVudCcpOwoKICAg -ICAgICAgICAgbGV0IHNlY3Rpb25zID0gJyc7CgogICAgICAgICAgICBpZiAoYXR0YWNobWVudHMu -bGVuZ3RoID4gMCkgewogICAgICAgICAgICAgICAgc2VjdGlvbnMgKz0gJzxoMyBzdHlsZT0iZm9u -dC1zaXplOjE2cHg7IGZvbnQtd2VpZ2h0OjYwMDsgY29sb3I6dmFyKC0tdGV4dC1oZWFkaW5nKTsg -bWFyZ2luLWJvdHRvbToxMnB4OyI+QW5ow6RuZ2UgKCcgKyBhdHRhY2htZW50cy5sZW5ndGggKyAn -KTwvaDM+JzsKICAgICAgICAgICAgICAgIHNlY3Rpb25zICs9ICc8ZGl2IHN0eWxlPSJkaXNwbGF5 -OmZsZXg7IGZsZXgtZGlyZWN0aW9uOmNvbHVtbjsgZ2FwOjhweDsgbWFyZ2luLWJvdHRvbToyMHB4 -OyI+JzsKICAgICAgICAgICAgICAgIGF0dGFjaG1lbnRzLmZvckVhY2gobWVkaWEgPT4gewogICAg -ICAgICAgICAgICAgICAgIGNvbnN0IHR5cGUgPSBtZWRpYS50eXBlIHx8ICdmaWxlJzsKICAgICAg -ICAgICAgICAgICAgICBjb25zdCB0eXBlTGFiZWwgPSB0eXBlLnRvVXBwZXJDYXNlKCk7CiAgICAg -ICAgICAgICAgICAgICAgY29uc3Qgc2FmZVVybCA9IHRoaXMuZXNjYXBlQXR0cihtZWRpYS51cmwp -OwogICAgICAgICAgICAgICAgICAgIGNvbnN0IHNhZmVUaXRsZSA9IHRoaXMuZXNjYXBlQXR0ciht -ZWRpYS50aXRsZSB8fCAnJyk7CgogICAgICAgICAgICAgICAgICAgIHNlY3Rpb25zICs9ICc8ZGl2 -IGNsYXNzPSJhdHRhY2htZW50LWl0ZW0iIG9uY2xpY2s9Im9wZW5NZWRpYU1vZGFsKFwnJyArIHNh -ZmVVcmwgKyAnXCcsXCcnICsgdHlwZSArICdcJyxcJycgKyBzYWZlVGl0bGUgKyAnXCcpIj4nICsK -ICAgICAgICAgICAgICAgICAgICAgICAgJzxzcGFuIGNsYXNzPSJkcml2ZS1maWxlLWljb24gJyAr -IHR5cGUgKyAnIj4nICsgdHlwZUxhYmVsICsgJzwvc3Bhbj4nICsKICAgICAgICAgICAgICAgICAg -ICAgICAgJzxkaXYgY2xhc3M9ImF0dGFjaG1lbnQtaW5mbyI+JyArCiAgICAgICAgICAgICAgICAg -ICAgICAgICAgICAnPGRpdiBjbGFzcz0iYXR0YWNobWVudC10aXRsZSI+JyArIHRoaXMuZXNjYXBl -SFRNTChtZWRpYS50aXRsZSB8fCBtZWRpYS51cmwuc3BsaXQoJy8nKS5wb3AoKSkgKyAnPC9kaXY+ -JyArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPGRpdiBjbGFzcz0iYXR0YWNobWVudC1t -ZXRhIj4nICsgdGhpcy5lc2NhcGVIVE1MKG1lZGlhLmRlc2NyaXB0aW9uIHx8ICcnKSArICc8L2Rp -dj4nICsKICAgICAgICAgICAgICAgICAgICAgICAgJzwvZGl2PicgKwogICAgICAgICAgICAgICAg -ICAgICAgICAnPGRpdiBjbGFzcz0iYXR0YWNobWVudC1hY3Rpb25zIiBvbmNsaWNrPSJldmVudC5z -dG9wUHJvcGFnYXRpb24oKSI+JzsKCiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGUgPT09ICdw -ZGYnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlY3Rpb25zICs9ICc8YnV0dG9uIG9uY2xp -Y2s9IndpbmRvdy5vcGVuKFwnJyArIHNhZmVVcmwgKyAnXCcsXCdfYmxhbmtcJykiPk5ldWVyIFRh -YjwvYnV0dG9uPic7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHNl -Y3Rpb25zICs9ICc8YnV0dG9uIG9uY2xpY2s9Im9wZW5NZWRpYU1vZGFsKFwnJyArIHNhZmVVcmwg -KyAnXCcsXCcnICsgdHlwZSArICdcJyxcJycgKyBzYWZlVGl0bGUgKyAnXCcpIj5BbnplaWdlbjwv -YnV0dG9uPic7CiAgICAgICAgICAgICAgICAgICAgc2VjdGlvbnMgKz0gJzwvZGl2PjwvZGl2Pic7 -CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIHNlY3Rpb25zICs9ICc8L2Rpdj4n -OwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoaW5saW5lTWVkaWEubGVuZ3RoID4gMCkg -ewogICAgICAgICAgICAgICAgc2VjdGlvbnMgKz0gJzxoMyBzdHlsZT0iZm9udC1zaXplOjE2cHg7 -IGZvbnQtd2VpZ2h0OjYwMDsgY29sb3I6dmFyKC0tdGV4dC1oZWFkaW5nKTsgbWFyZ2luLWJvdHRv -bToxMnB4OyI+RWluZ2ViZXR0ZXRlIE1lZGllbiAoJyArIGlubGluZU1lZGlhLmxlbmd0aCArICcp -PC9oMz4nOwogICAgICAgICAgICAgICAgc2VjdGlvbnMgKz0gJzxkaXYgc3R5bGU9ImRpc3BsYXk6 -ZmxleDsgZmxleC1kaXJlY3Rpb246Y29sdW1uOyBnYXA6OHB4OyI+JzsKICAgICAgICAgICAgICAg -IGlubGluZU1lZGlhLmZvckVhY2gobWVkaWEgPT4gewogICAgICAgICAgICAgICAgICAgIGNvbnN0 -IHR5cGUgPSBtZWRpYS50eXBlIHx8ICdmaWxlJzsKICAgICAgICAgICAgICAgICAgICBjb25zdCB0 -eXBlTGFiZWwgPSB0eXBlLnRvVXBwZXJDYXNlKCk7CiAgICAgICAgICAgICAgICAgICAgY29uc3Qg -c2FmZVVybCA9IHRoaXMuZXNjYXBlQXR0cihtZWRpYS51cmwpOwogICAgICAgICAgICAgICAgICAg -IGNvbnN0IHNhZmVUaXRsZSA9IHRoaXMuZXNjYXBlQXR0cihtZWRpYS50aXRsZSB8fCAnJyk7CiAg -ICAgICAgICAgICAgICAgICAgY29uc3QgbW9kZUxhYmVsID0gbWVkaWEuZGlzcGxheU1vZGUgPT09 -ICdpbmxpbmUnID8gJ0JpbGQnIDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg -ICBtZWRpYS5kaXNwbGF5TW9kZSA9PT0gJ3BkZi1saW5rJyA/ICdQREYtTGluaycgOgogICAgICAg -ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhLmRpc3BsYXlNb2RlID09PSAncGRm -LWlmcmFtZScgPyAnUERGIGVpbmdlYmV0dGV0JyA6IG1lZGlhLmRpc3BsYXlNb2RlOwoKICAgICAg -ICAgICAgICAgICAgICBzZWN0aW9ucyArPSAnPGRpdiBjbGFzcz0iYXR0YWNobWVudC1pdGVtIiBv -bmNsaWNrPSJvcGVuTWVkaWFNb2RhbChcJycgKyBzYWZlVXJsICsgJ1wnLFwnJyArIHR5cGUgKyAn -XCcsXCcnICsgc2FmZVRpdGxlICsgJ1wnKSI+JyArCiAgICAgICAgICAgICAgICAgICAgICAgICc8 -c3BhbiBjbGFzcz0iZHJpdmUtZmlsZS1pY29uICcgKyB0eXBlICsgJyI+JyArIHR5cGVMYWJlbCAr -ICc8L3NwYW4+JyArCiAgICAgICAgICAgICAgICAgICAgICAgICc8ZGl2IGNsYXNzPSJhdHRhY2ht -ZW50LWluZm8iPicgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJzxkaXYgY2xhc3M9ImF0 -dGFjaG1lbnQtdGl0bGUiPicgKyB0aGlzLmVzY2FwZUhUTUwobWVkaWEudGl0bGUgfHwgJycpICsg -JzwvZGl2PicgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJzxkaXYgY2xhc3M9ImF0dGFj -aG1lbnQtbWV0YSI+JyArIHRoaXMuZXNjYXBlSFRNTChtb2RlTGFiZWwpICsgKG1lZGlhLmFsaWdu -bWVudCA/ICcgfCAnICsgbWVkaWEuYWxpZ25tZW50IDogJycpICsgJzwvZGl2PicgKwogICAgICAg -ICAgICAgICAgICAgICAgICAnPC9kaXY+PC9kaXY+JzsKICAgICAgICAgICAgICAgIH0pOwogICAg -ICAgICAgICAgICAgc2VjdGlvbnMgKz0gJzwvZGl2Pic7CiAgICAgICAgICAgIH0KCiAgICAgICAg -ICAgIGlmIChzZWN0aW9ucykgewogICAgICAgICAgICAgICAgbWVkaWFIVE1MID0gJzxkaXYgY2xh -c3M9Im1lZGlhLXNlY3Rpb24iPicgKyBzZWN0aW9ucyArICc8L2Rpdj4nOwogICAgICAgICAgICB9 -CiAgICAgICAgfQoKICAgICAgICBkZXRhaWxDb250YWluZXIuaW5uZXJIVE1MID0KICAgICAgICAg -ICAgJzxkaXYgc3R5bGU9ImRpc3BsYXk6ZmxleDsganVzdGlmeS1jb250ZW50OnNwYWNlLWJldHdl -ZW47IGFsaWduLWl0ZW1zOmZsZXgtc3RhcnQ7IG1hcmdpbi1ib3R0b206MjBweDsiPicgKwogICAg -ICAgICAgICAgICAgJzxkaXYgY2xhc3M9ImRldGFpbC1oZWFkZXIiIHN0eWxlPSJmbGV4OjE7Ij4n -ICsKICAgICAgICAgICAgICAgICAgICAnPGgxIGNsYXNzPSJkZXRhaWwtdGl0bGUiPicgKyB0aGlz -LmVzY2FwZUhUTUwoZG9jLnRpdGVsKSArICc8L2gxPicgKwogICAgICAgICAgICAgICAgICAgICc8 -ZGl2IGNsYXNzPSJkZXRhaWwtbWV0YSI+JyArCiAgICAgICAgICAgICAgICAgICAgICAgICc8ZGl2 -IGNsYXNzPSJtZXRhLWl0ZW0iPjxkaXYgY2xhc3M9Im1ldGEtbGFiZWwiPkthdGVnb3JpZTwvZGl2 -PjxkaXY+JyArIHRoaXMuZXNjYXBlSFRNTChkb2Mua2F0ZWdvcmllKSArICc8L2Rpdj48L2Rpdj4n -ICsKICAgICAgICAgICAgICAgICAgICAgICAgJzxkaXYgY2xhc3M9Im1ldGEtaXRlbSI+PGRpdiBj -bGFzcz0ibWV0YS1sYWJlbCI+U3RhdHVzPC9kaXY+PGRpdj4nICsKICAgICAgICAgICAgICAgICAg -ICAgICAgICAgICc8c3BhbiBjbGFzcz0ic3RhdHVzLWJhZGdlIiBzdHlsZT0iYmFja2dyb3VuZC1j -b2xvcjonICsgY2ZnLmNvbG9yICsgJzsgY29sb3I6JyArIGNmZy50ZXh0Q29sb3IgKyAnOyI+JyAr -IGNmZy5sYWJlbCArICc8L3NwYW4+JyArCiAgICAgICAgICAgICAgICAgICAgICAgICc8L2Rpdj48 -L2Rpdj4nICsKICAgICAgICAgICAgICAgICAgICAgICAgJzxkaXYgY2xhc3M9Im1ldGEtaXRlbSI+ -PGRpdiBjbGFzcz0ibWV0YS1sYWJlbCI+VmVyc2lvbjwvZGl2PjxkaXY+PHNwYW4gc3R5bGU9ImN1 -cnNvcjpwb2ludGVyO2JvcmRlci1ib3R0b206MXB4IGRhc2hlZCB2YXIoLS10ZXh0LW11dGVkKTsi -IG9uY2xpY2s9InNob3dWZXJzaW9uTG9naWMoKSIgdGl0bGU9IktsaWNrZSBmw7xyIGVpbmUgRXJr -bMOkcnVuZyBkZXIgVmVyc2lvbmllcnVuZyI+JyArIHRoaXMuZXNjYXBlSFRNTChkb2MudmVyc2lv -biB8fCAnLScpICsgJzwvc3Bhbj48L2Rpdj48L2Rpdj4nICsKICAgICAgICAgICAgICAgICAgICAg -ICAgJzxkaXYgY2xhc3M9Im1ldGEtaXRlbSI+PGRpdiBjbGFzcz0ibWV0YS1sYWJlbCI+RXJzdGVs -bHQ8L2Rpdj48ZGl2PicgKyBmb3JtYXREYXRlKGRvYy5lcnN0ZWxsdCkgKyAnPC9kaXY+PC9kaXY+ -JyArCiAgICAgICAgICAgICAgICAgICAgICAgICc8ZGl2IGNsYXNzPSJtZXRhLWl0ZW0iPjxkaXYg -Y2xhc3M9Im1ldGEtbGFiZWwiPkdlw6RuZGVydDwvZGl2PjxkaXY+JyArIGZvcm1hdERhdGUoZG9j -LmdlYWVuZGVydCkgKyAnPC9kaXY+PC9kaXY+JyArCiAgICAgICAgICAgICAgICAgICAgICAgIChk -b2MuZXJzdGVsbHRWb24gPyAnPGRpdiBjbGFzcz0ibWV0YS1pdGVtIj48ZGl2IGNsYXNzPSJtZXRh -LWxhYmVsIj5FcnN0ZWxsdCB2b248L2Rpdj48ZGl2PicgKyB0aGlzLmVzY2FwZUhUTUwoZG9jLmVy -c3RlbGx0Vm9uKSArICc8L2Rpdj48L2Rpdj4nIDogJycpICsKICAgICAgICAgICAgICAgICAgICAg -ICAgKGRvYy5iZWFyYmVpdGV0Vm9uID8gJzxkaXYgY2xhc3M9Im1ldGEtaXRlbSI+PGRpdiBjbGFz -cz0ibWV0YS1sYWJlbCI+QmVhcmJlaXRldCB2b248L2Rpdj48ZGl2PicgKyB0aGlzLmVzY2FwZUhU -TUwoZG9jLmJlYXJiZWl0ZXRWb24pICsgJzwvZGl2PjwvZGl2PicgOiAnJykgKwogICAgICAgICAg -ICAgICAgICAgICAgICAoZG9jLnBhcmVudElkID8gJzxkaXYgY2xhc3M9Im1ldGEtaXRlbSI+PGRp -diBjbGFzcz0ibWV0YS1sYWJlbCI+w5xiZXJhcnRpa2VsPC9kaXY+PGRpdj48YSBzdHlsZT0iY29s -b3I6dmFyKC0tdGV4dC1oZWFkaW5nKTtjdXJzb3I6cG9pbnRlcjsiIG9uY2xpY2s9IkRyaXZlUG9y -dGFsLnNlbGVjdERvY3VtZW50KFwnJyArIERyaXZlUG9ydGFsLmVzY2FwZUF0dHIoZG9jLnBhcmVu -dElkKSArICdcJykiPicgKyB0aGlzLmVzY2FwZUhUTUwoKERyaXZlRlMuZG9jdW1lbnRzLmZpbmQo -ZnVuY3Rpb24oZCl7cmV0dXJuIGQuaWQ9PT1kb2MucGFyZW50SWR9KXx8e30pLnRpdGVsIHx8IGRv -Yy5wYXJlbnRJZCkgKyAnPC9hPjwvZGl2PjwvZGl2PicgOiAnJykgKwogICAgICAgICAgICAgICAg -ICAgICAgICAoKGRvYy5zY2hsYWd3b2VydGVyICYmIGRvYy5zY2hsYWd3b2VydGVyLmxlbmd0aCkg -PyAnPGRpdiBjbGFzcz0ibWV0YS1pdGVtIiBzdHlsZT0iZmxleC1iYXNpczoxMDAlOyI+PGRpdiBj -bGFzcz0ibWV0YS1sYWJlbCI+U2NobGFnd8O2cnRlcjwvZGl2PjxkaXY+JyArIGRvYy5zY2hsYWd3 -b2VydGVyLm1hcChmdW5jdGlvbihrKXtyZXR1cm4gJzxzcGFuIGNsYXNzPSJrZXl3b3JkLXRhZyI+ -JytEcml2ZVBvcnRhbC5lc2NhcGVIVE1MKGspKyc8L3NwYW4+Jzt9KS5qb2luKCcgJykgKyAnPC9k -aXY+PC9kaXY+JyA6ICcnKSArCiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3JlbmRlckNo -aWxkQXJ0aWNsZXMoZG9jKSArCiAgICAgICAgICAgICAgICAgICAgJzwvZGl2PicgKwogICAgICAg -ICAgICAgICAgJzwvZGl2PicgKwogICAgICAgICAgICAgICAgJzxkaXYgY2xhc3M9ImRldGFpbC1h -Y3Rpb25zIj4nICsKICAgICAgICAgICAgICAgICAgICAoRHJpdmVGUy5yZWFkT25seSA/ICcnIDog -JzxidXR0b24gb25jbGljaz0iRHJpdmVFZGl0b3IuZWRpdChcJycgKyBEcml2ZVBvcnRhbC5lc2Nh -cGVBdHRyKGRvYy5pZCkgKyAnXCcpIj5CZWFyYmVpdGVuPC9idXR0b24+JykgKwogICAgICAgICAg -ICAgICAgICAgICh0aGlzLl9jYW5TZWVSZXZpc2lvbnMoZG9jKSAmJiBkb2MucmV2aXNpb25zICYm -IGRvYy5yZXZpc2lvbnMubGVuZ3RoID4gMCA/ICc8YnV0dG9uIHN0eWxlPSJib3JkZXItY29sb3I6 -IzNiODJmNjtjb2xvcjojM2I4MmY2OyIgb25jbGljaz0iRHJpdmVQb3J0YWwub3BlblJldmlzaW9u -cyhcJycgKyBEcml2ZVBvcnRhbC5lc2NhcGVBdHRyKGRvYy5pZCkgKyAnXCcpIj5WZXJzaW9uZW4g -KCcgKyBkb2MucmV2aXNpb25zLmxlbmd0aCArICcpPC9idXR0b24+JyA6ICcnKSArCiAgICAgICAg -ICAgICAgICAgICAgKERyaXZlRlMucmVhZE9ubHkgPyAnJyA6ICc8YnV0dG9uIGNsYXNzPSJidG4t -ZGFuZ2VyIiBvbmNsaWNrPSJEcml2ZVBvcnRhbC5kZWxldGVEb2N1bWVudChcJycgKyBEcml2ZVBv -cnRhbC5lc2NhcGVBdHRyKGRvYy5pZCkgKyAnXCcpIj5Mw7ZzY2hlbjwvYnV0dG9uPicpICsKICAg -ICAgICAgICAgICAgICAgICAoZG9jLnN0YXR1cyA9PT0gJ1Byw7xmdW5nJyAmJiBEcml2ZUdvdmVy -bmFuY2UuY2FuQXBwcm92ZShkb2MpID8KICAgICAgICAgICAgICAgICAgICAgICAgKChkb2MucmV2 -aXNpb25zICYmIGRvYy5yZXZpc2lvbnMubGVuZ3RoID4gMCkgPyAnPGJ1dHRvbiBzdHlsZT0iYm9y -ZGVyLWNvbG9yOnZhcigtLXRleHQtaGVhZGluZyk7Y29sb3I6dmFyKC0tdGV4dC1oZWFkaW5nKTsi -IG9uY2xpY2s9IkRyaXZlUG9ydGFsLnRvZ2dsZURpZmYoXCcnICsgRHJpdmVQb3J0YWwuZXNjYXBl -QXR0cihkb2MuaWQpICsgJ1wnKSIgaWQ9ImJ0bkRpZmYiPsOEbmRlcnVuZ2VuIGFuemVpZ2VuPC9i -dXR0b24+JyA6ICcnKSArCiAgICAgICAgICAgICAgICAgICAgICAgICc8YnV0dG9uIHN0eWxlPSJi -b3JkZXItY29sb3I6IzI4YTc0NTtjb2xvcjojMjhhNzQ1OyIgb25jbGljaz0iRHJpdmVHb3Zlcm5h -bmNlLm9wZW5SZXZpZXdEaWFsb2coXCcnICsgRHJpdmVQb3J0YWwuZXNjYXBlQXR0cihkb2MuaWQp -ICsgJ1wnLFwnYXBwcm92ZVwnKSI+RnJlaWdlYmVuPC9idXR0b24+JyArCiAgICAgICAgICAgICAg -ICAgICAgICAgICc8YnV0dG9uIHN0eWxlPSJib3JkZXItY29sb3I6I2RjMzU0NTtjb2xvcjojZGMz -NTQ1OyIgb25jbGljaz0iRHJpdmVHb3Zlcm5hbmNlLm9wZW5SZXZpZXdEaWFsb2coXCcnICsgRHJp -dmVQb3J0YWwuZXNjYXBlQXR0cihkb2MuaWQpICsgJ1wnLFwncmVqZWN0XCcpIj5BYmxlaG5lbjwv -YnV0dG9uPicgOiAnJykgKwogICAgICAgICAgICAgICAgJzwvZGl2PicgKwogICAgICAgICAgICAn -PC9kaXY+JyArCiAgICAgICAgICAgICc8ZGl2IGNsYXNzPSJkZXRhaWwtY29udGVudCIgaWQ9ImRl -dGFpbENvbnRlbnQiPicgKyAoZG9jLmluaGFsdCB8fCAnJykgKyAnPC9kaXY+JyArCiAgICAgICAg -ICAgIHRoaXMucmVuZGVyQ29udHJpYnV0b3JzKGRvYykgKwogICAgICAgICAgICB0aGlzLnJlbmRl -clJldmlld0hpc3RvcnkoZG9jKSArCiAgICAgICAgICAgIG1lZGlhSFRNTDsKCiAgICAgICAgLy8g -UG9zdC1SZW5kZXI6IEFsbGUgTWVkaWVuIGltIEluaGFsdCBrbGlja2JhciBtYWNoZW4gKG9lZmZu -ZXQgTW9kYWwpCiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7CiAgICAgICAgICAgIGNvbnN0IGNv -bnRlbnQgPSBkZXRhaWxDb250YWluZXIucXVlcnlTZWxlY3RvcignLmRldGFpbC1jb250ZW50Jyk7 -CiAgICAgICAgICAgIGlmICghY29udGVudCkgcmV0dXJuOwoKICAgICAgICAgICAgLy8gQmlsZGVy -OiBLbGljayBvZWZmbmV0IE1vZGFsCiAgICAgICAgICAgIGNvbnRlbnQucXVlcnlTZWxlY3RvckFs -bCgnLmRyaXZlLW1lZGlhIGltZywgLmRldGFpbC1jb250ZW50ID4gaW1nJykuZm9yRWFjaChpbWcg -PT4gewogICAgICAgICAgICAgICAgaWYgKGltZy5fbW9kYWxCb3VuZCkgcmV0dXJuOwogICAgICAg -ICAgICAgICAgaW1nLnN0eWxlLmN1cnNvciA9ICdwb2ludGVyJzsKICAgICAgICAgICAgICAgIGlt -Zy5vbmNsaWNrID0gZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgIGUuc3RvcFByb3Bh -Z2F0aW9uKCk7CiAgICAgICAgICAgICAgICAgICAgb3Blbk1lZGlhTW9kYWwoaW1nLnNyYywgJ2lt -YWdlJywgaW1nLmFsdCB8fCAnJyk7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAg -aW1nLl9tb2RhbEJvdW5kID0gdHJ1ZTsKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAvLyBQ -REYtTGlua3M6IDxhIHRhcmdldD0iX2JsYW5rIj4gaW4gTW9kYWwtS2xpY2sgdW13YW5kZWxuCiAg -ICAgICAgICAgIGNvbnRlbnQucXVlcnlTZWxlY3RvckFsbCgnLmRyaXZlLW1lZGlhLXBkZi1saW5r -JykuZm9yRWFjaChlbCA9PiB7CiAgICAgICAgICAgICAgICBjb25zdCBsaW5rID0gZWwucXVlcnlT -ZWxlY3RvcignYScpOwogICAgICAgICAgICAgICAgY29uc3QgdGl0bGVTcGFuID0gZWwucXVlcnlT -ZWxlY3RvcignLnBkZi10aXRsZScpOwogICAgICAgICAgICAgICAgY29uc3QgcGRmVXJsID0gbGlu -ayA/IGxpbmsuaHJlZiA6ICcnOwogICAgICAgICAgICAgICAgY29uc3QgcGRmVGl0bGUgPSAodGl0 -bGVTcGFuIHx8IGxpbmsgfHwge30pLnRleHRDb250ZW50IHx8ICdQREYnOwogICAgICAgICAgICAg -ICAgaWYgKGxpbmspIHsKICAgICAgICAgICAgICAgICAgICBjb25zdCBzcGFuID0gZG9jdW1lbnQu -Y3JlYXRlRWxlbWVudCgnc3BhbicpOwogICAgICAgICAgICAgICAgICAgIHNwYW4uY2xhc3NOYW1l -ID0gJ3BkZi10aXRsZSc7CiAgICAgICAgICAgICAgICAgICAgc3Bhbi50ZXh0Q29udGVudCA9IGxp -bmsudGV4dENvbnRlbnQ7CiAgICAgICAgICAgICAgICAgICAgbGluay5yZXBsYWNlV2l0aChzcGFu -KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsLm9uY2xpY2sgPSBmdW5jdGlv -bihlKSB7IGUucHJldmVudERlZmF1bHQoKTsgZS5zdG9wUHJvcGFnYXRpb24oKTsgb3Blbk1lZGlh -TW9kYWwocGRmVXJsLCAncGRmJywgcGRmVGl0bGUpOyB9OwogICAgICAgICAgICB9KTsKCiAgICAg -ICAgICAgIC8vIFBERi1pRnJhbWVzOiBLbGljayBvZWZmbmV0IE1vZGFsCiAgICAgICAgICAgIGNv -bnRlbnQucXVlcnlTZWxlY3RvckFsbCgnLmRyaXZlLW1lZGlhLXBkZi1pZnJhbWUnKS5mb3JFYWNo -KGVsID0+IHsKICAgICAgICAgICAgICAgIGNvbnN0IGlmcmFtZSA9IGVsLnF1ZXJ5U2VsZWN0b3Io -J2lmcmFtZScpOwogICAgICAgICAgICAgICAgaWYgKGlmcmFtZSkgewogICAgICAgICAgICAgICAg -ICAgIGVsLm9uY2xpY2sgPSBmdW5jdGlvbihlKSB7IGUucHJldmVudERlZmF1bHQoKTsgZS5zdG9w -UHJvcGFnYXRpb24oKTsgb3Blbk1lZGlhTW9kYWwoaWZyYW1lLnNyYywgJ3BkZicsICdQREYnKTsg -fTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAvLyBWaWRl -bzogS2xpY2sgYXVmIENvbnRhaW5lciBvZWZmbmV0IE1vZGFsIChmYWxscyBuaWNodCBiZXJlaXRz -IGNvbnRyb2xzLWFrdGl2KQogICAgICAgICAgICBjb250ZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ3Zp -ZGVvJykuZm9yRWFjaCh2aWQgPT4gewogICAgICAgICAgICAgICAgaWYgKHZpZC5fbW9kYWxCb3Vu -ZCkgcmV0dXJuOwogICAgICAgICAgICAgICAgY29uc3Qgc3JjID0gdmlkLnF1ZXJ5U2VsZWN0b3Io -J3NvdXJjZScpID8gdmlkLnF1ZXJ5U2VsZWN0b3IoJ3NvdXJjZScpLnNyYyA6IHZpZC5zcmM7CiAg -ICAgICAgICAgICAgICBpZiAoc3JjKSB7CiAgICAgICAgICAgICAgICAgICAgdmlkLnN0eWxlLmN1 -cnNvciA9ICdwb2ludGVyJzsKICAgICAgICAgICAgICAgICAgICB2aWQub25kYmxjbGljayA9IGZ1 -bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTsK -ICAgICAgICAgICAgICAgICAgICAgICAgb3Blbk1lZGlhTW9kYWwoc3JjLCAndmlkZW8nLCAnJyk7 -CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAg -IHZpZC5fbW9kYWxCb3VuZCA9IHRydWU7CiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgLy8g -QXVkaW86IERvcHBlbGtsaWNrIG9lZmZuZXQgTW9kYWwKICAgICAgICAgICAgY29udGVudC5xdWVy -eVNlbGVjdG9yQWxsKCdhdWRpbycpLmZvckVhY2goYXVkID0+IHsKICAgICAgICAgICAgICAgIGlm -IChhdWQuX21vZGFsQm91bmQpIHJldHVybjsKICAgICAgICAgICAgICAgIGNvbnN0IHNyYyA9IGF1 -ZC5zcmMgfHwgKGF1ZC5xdWVyeVNlbGVjdG9yKCdzb3VyY2UnKSA/IGF1ZC5xdWVyeVNlbGVjdG9y -KCdzb3VyY2UnKS5zcmMgOiAnJyk7CiAgICAgICAgICAgICAgICBpZiAoc3JjKSB7CiAgICAgICAg -ICAgICAgICAgICAgYXVkLm9uZGJsY2xpY2sgPSBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAg -ICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIG9w -ZW5NZWRpYU1vZGFsKHNyYywgJ2F1ZGlvJywgJycpOwogICAgICAgICAgICAgICAgICAgIH07CiAg -ICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBhdWQuX21vZGFsQm91bmQgPSB0cnVlOwog -ICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIC8vIElubGluZS1FbWJlZHMgKFZpZGVvLCBBdWRp -bywgT2ZmaWNlKTogS2xpY2sgb2VmZm5ldCBNb2RhbAogICAgICAgICAgICBjb250ZW50LnF1ZXJ5 -U2VsZWN0b3JBbGwoJy5kcml2ZS1tZWRpYS1lbWJlZCcpLmZvckVhY2goZWwgPT4gewogICAgICAg -ICAgICAgICAgaWYgKGVsLl9tb2RhbEJvdW5kKSByZXR1cm47CiAgICAgICAgICAgICAgICBjb25z -dCBtZWRpYVVybCA9IGVsLmdldEF0dHJpYnV0ZSgnZGF0YS1tZWRpYS11cmwnKTsKICAgICAgICAg -ICAgICAgIGNvbnN0IG1lZGlhVHlwZSA9IGVsLmdldEF0dHJpYnV0ZSgnZGF0YS1tZWRpYS10eXBl -Jyk7CiAgICAgICAgICAgICAgICBjb25zdCBsYWJlbCA9IGVsLnF1ZXJ5U2VsZWN0b3IoJy5kcml2 -ZS1lbWJlZC1sYWJlbCcpOwogICAgICAgICAgICAgICAgY29uc3QgbWVkaWFUaXRsZSA9IGxhYmVs -ID8gbGFiZWwudGV4dENvbnRlbnQgOiAnJzsKICAgICAgICAgICAgICAgIGlmIChtZWRpYVVybCkg -ewogICAgICAgICAgICAgICAgICAgIGVsLm9uY2xpY2sgPSBmdW5jdGlvbihlKSB7IGUucHJldmVu -dERlZmF1bHQoKTsgZS5zdG9wUHJvcGFnYXRpb24oKTsgb3Blbk1lZGlhTW9kYWwobWVkaWFVcmws -IG1lZGlhVHlwZSwgbWVkaWFUaXRsZSk7IH07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAg -ICAgICBlbC5fbW9kYWxCb3VuZCA9IHRydWU7CiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAg -Ly8gPT09IEFjY29yZGlvbnMgYWt0aXZpZXJlbiAoQXVmLS9adWtsYXBwZW4sIHN0YW5kYXJkbWFl -c3NpZyBlaW5nZWtsYXBwdCkgPT09CiAgICAgICAgICAgIGNvbnRlbnQucXVlcnlTZWxlY3RvckFs -bCgnLmRyaXZlLWFjY29yZGlvbicpLmZvckVhY2goZnVuY3Rpb24oYWNjKSB7CiAgICAgICAgICAg -ICAgICBhY2Muc2V0QXR0cmlidXRlKCdjb250ZW50ZWRpdGFibGUnLCAnZmFsc2UnKTsKICAgICAg -ICAgICAgICAgIGFjYy5jbGFzc0xpc3QucmVtb3ZlKCdvcGVuJyk7CiAgICAgICAgICAgICAgICB2 -YXIgaGVhZGVyID0gYWNjLnF1ZXJ5U2VsZWN0b3IoJy5kcml2ZS1hY2NvcmRpb24taGVhZGVyJyk7 -CiAgICAgICAgICAgICAgICBpZiAoaGVhZGVyICYmICFoZWFkZXIuX2FjY0JvdW5kKSB7CiAgICAg -ICAgICAgICAgICAgICAgaGVhZGVyLm9uY2xpY2sgPSBmdW5jdGlvbihlKSB7CiAgICAgICAgICAg -ICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgICAgICAgICAg -ZS5zdG9wUHJvcGFnYXRpb24oKTsKICAgICAgICAgICAgICAgICAgICAgICAgYWNjLmNsYXNzTGlz -dC50b2dnbGUoJ29wZW4nKTsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAg -ICAgIGhlYWRlci5fYWNjQm91bmQgPSB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAg -ICB9KTsKCiAgICAgICAgICAgIC8vID09PSBGQVEtQmVyZWljaGUgYWt0aXZpZXJlbiAoQXVmLS9a -dWtsYXBwZW4sIHN0YW5kYXJkbWFlc3NpZyBlaW5nZWtsYXBwdCkgPT09CiAgICAgICAgICAgIGNv -bnRlbnQucXVlcnlTZWxlY3RvckFsbCgnLmRyaXZlLWZhcScpLmZvckVhY2goZnVuY3Rpb24oZmFx -KSB7CiAgICAgICAgICAgICAgICBmYXEuc2V0QXR0cmlidXRlKCdjb250ZW50ZWRpdGFibGUnLCAn -ZmFsc2UnKTsKICAgICAgICAgICAgICAgIGZhcS5xdWVyeVNlbGVjdG9yQWxsKCcuZHJpdmUtZmFx -LWl0ZW0nKS5mb3JFYWNoKGZ1bmN0aW9uKGl0ZW0pIHsgaXRlbS5jbGFzc0xpc3QucmVtb3ZlKCdv -cGVuJyk7IH0pOwogICAgICAgICAgICAgICAgZmFxLnF1ZXJ5U2VsZWN0b3JBbGwoJy5kcml2ZS1m -YXEtcXVlc3Rpb24nKS5mb3JFYWNoKGZ1bmN0aW9uKHEpIHsKICAgICAgICAgICAgICAgICAgICBp -ZiAocS5fZmFxQm91bmQpIHJldHVybjsKICAgICAgICAgICAgICAgICAgICBxLm9uY2xpY2sgPSBm -dW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsK -ICAgICAgICAgICAgICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTsKICAgICAgICAgICAg -ICAgICAgICAgICAgcS5jbG9zZXN0KCcuZHJpdmUtZmFxLWl0ZW0nKS5jbGFzc0xpc3QudG9nZ2xl -KCdvcGVuJyk7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBxLl9m -YXFCb3VuZCA9IHRydWU7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSk7CgogICAg -ICAgICAgICAvLyA9PT0gU29ydGllcmJhcmUgVGFiZWxsZW4gYWt0aXZpZXJlbiA9PT0KICAgICAg -ICAgICAgY29udGVudC5xdWVyeVNlbGVjdG9yQWxsKCcuZHJpdmUtdGFibGVbZGF0YS1zb3J0YWJs -ZT0idHJ1ZSJdJykuZm9yRWFjaChmdW5jdGlvbih0YWJsZSkgewogICAgICAgICAgICAgICAgdGFi -bGUucXVlcnlTZWxlY3RvckFsbCgndGguc29ydGFibGUnKS5mb3JFYWNoKGZ1bmN0aW9uKHRoKSB7 -CiAgICAgICAgICAgICAgICAgICAgaWYgKHRoLl9zb3J0Qm91bmQpIHJldHVybjsKICAgICAgICAg -ICAgICAgICAgICB0aC5zZXRBdHRyaWJ1dGUoJ2NvbnRlbnRlZGl0YWJsZScsICdmYWxzZScpOwog -ICAgICAgICAgICAgICAgICAgIHRoLm9uY2xpY2sgPSBmdW5jdGlvbihlKSB7CiAgICAgICAgICAg -ICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgICAgICAgICAg -ZS5zdG9wUHJvcGFnYXRpb24oKTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGlkeCA9IEFy -cmF5LmZyb20odGgucGFyZW50RWxlbWVudC5jaGlsZHJlbikuaW5kZXhPZih0aCk7CiAgICAgICAg -ICAgICAgICAgICAgICAgIHZhciB0Ym9keSA9IHRhYmxlLnF1ZXJ5U2VsZWN0b3IoJ3Rib2R5Jyk7 -CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGJvZHkpIHJldHVybjsKICAgICAgICAgICAg -ICAgICAgICAgICAgdmFyIGFzYyA9ICF0aC5jbGFzc0xpc3QuY29udGFpbnMoJ3NvcnQtYXNjJyk7 -CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFsbGUgU29ydC1NYXJrZXIgZW50ZmVybmVuCiAg -ICAgICAgICAgICAgICAgICAgICAgIHRhYmxlLnF1ZXJ5U2VsZWN0b3JBbGwoJ3RoJykuZm9yRWFj -aChmdW5jdGlvbihoKSB7IGguY2xhc3NMaXN0LnJlbW92ZSgnc29ydC1hc2MnLCAnc29ydC1kZXNj -Jyk7IH0pOwogICAgICAgICAgICAgICAgICAgICAgICB0aC5jbGFzc0xpc3QuYWRkKGFzYyA/ICdz -b3J0LWFzYycgOiAnc29ydC1kZXNjJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciByb3dz -ID0gQXJyYXkuZnJvbSh0Ym9keS5xdWVyeVNlbGVjdG9yQWxsKCd0cicpKTsKICAgICAgICAgICAg -ICAgICAgICAgICAgcm93cy5zb3J0KGZ1bmN0aW9uKGEsIGIpIHsKICAgICAgICAgICAgICAgICAg -ICAgICAgICAgIHZhciBhVGV4dCA9IChhLmNlbGxzW2lkeF0gPyBhLmNlbGxzW2lkeF0udGV4dENv -bnRlbnQudHJpbSgpIDogJycpLnRvTG93ZXJDYXNlKCk7CiAgICAgICAgICAgICAgICAgICAgICAg -ICAgICB2YXIgYlRleHQgPSAoYi5jZWxsc1tpZHhdID8gYi5jZWxsc1tpZHhdLnRleHRDb250ZW50 -LnRyaW0oKSA6ICcnKS50b0xvd2VyQ2FzZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAg -Ly8gTnVtZXJpc2NoZSBTb3J0aWVydW5nIHdlbm4gbW9lZ2xpY2gKICAgICAgICAgICAgICAgICAg -ICAgICAgICAgIHZhciBhTnVtID0gcGFyc2VGbG9hdChhVGV4dCksIGJOdW0gPSBwYXJzZUZsb2F0 -KGJUZXh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaXNOYU4oYU51bSkgJiYg -IWlzTmFOKGJOdW0pKSByZXR1cm4gYXNjID8gYU51bSAtIGJOdW0gOiBiTnVtIC0gYU51bTsKICAg -ICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhc2MgPyBhVGV4dC5sb2NhbGVDb21wYXJl -KGJUZXh0LCAnZGUnKSA6IGJUZXh0LmxvY2FsZUNvbXBhcmUoYVRleHQsICdkZScpOwogICAgICAg -ICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgcm93cy5mb3JFYWNo -KGZ1bmN0aW9uKHJvdykgeyB0Ym9keS5hcHBlbmRDaGlsZChyb3cpOyB9KTsKICAgICAgICAgICAg -ICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIHRoLl9zb3J0Qm91bmQgPSB0cnVlOwogICAg -ICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgLy8gPT09IMOcYmVy -c2NocmlmdGVuIG1pdCBBbmNob3ItSURzIHZlcnNlaGVuID09PQogICAgICAgICAgICBjb250ZW50 -LnF1ZXJ5U2VsZWN0b3JBbGwoJ2gxLCBoMiwgaDMsIGg0JykuZm9yRWFjaChmdW5jdGlvbihoKSB7 -CiAgICAgICAgICAgICAgICB2YXIgdGV4dCA9IGgudGV4dENvbnRlbnQudHJpbSgpOwogICAgICAg -ICAgICAgICAgaWYgKCF0ZXh0KSByZXR1cm47CiAgICAgICAgICAgICAgICB2YXIgc2x1ZyA9IHRl -eHQudG9Mb3dlckNhc2UoKQogICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKC/DpC9nLCAnYWUn -KS5yZXBsYWNlKC/Dti9nLCAnb2UnKS5yZXBsYWNlKC/DvC9nLCAndWUnKS5yZXBsYWNlKC/Dny9n -LCAnc3MnKQogICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKC9bXmEtejAtOV0rL2csICctJyku -cmVwbGFjZSgvXi18LSQvZywgJycpOwogICAgICAgICAgICAgICAgaC5pZCA9IHNsdWc7CiAgICAg -ICAgICAgIH0pOwoKICAgICAgICAgICAgLy8gPT09IE1hbnVlbGxlIENyb3NzbGlua3MgKC5kcml2 -ZS14cmVmKSBrbGlja2JhciBtYWNoZW4gPT09CiAgICAgICAgICAgIGNvbnRlbnQucXVlcnlTZWxl -Y3RvckFsbCgnLmRyaXZlLXhyZWYnKS5mb3JFYWNoKGZ1bmN0aW9uKGVsKSB7CiAgICAgICAgICAg -ICAgICB2YXIgdGFyZ2V0ID0gZWwuZ2V0QXR0cmlidXRlKCdkYXRhLXhyZWYtdGFyZ2V0Jyk7CiAg -ICAgICAgICAgICAgICBpZiAoIXRhcmdldCkgcmV0dXJuOwogICAgICAgICAgICAgICAgZWwub25j -bGljayA9IGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0 -KCk7CiAgICAgICAgICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTsKICAgICAgICAgICAg -ICAgICAgICB2YXIgcGFydHMgPSB0YXJnZXQuc3BsaXQoJyMnKTsKICAgICAgICAgICAgICAgICAg -ICB2YXIgZG9jSWQgPSBwYXJ0c1swXTsKICAgICAgICAgICAgICAgICAgICB2YXIgaGVhZGluZ1Ns -dWcgPSBwYXJ0c1sxXSB8fCAnJzsKICAgICAgICAgICAgICAgICAgICBEcml2ZVBvcnRhbC5zZWxl -Y3REb2N1bWVudChkb2NJZCkudGhlbihmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAg -ICAgRHJpdmVQb3J0YWwuaGlnaGxpZ2h0SXRlbShkb2NJZCk7CiAgICAgICAgICAgICAgICAgICAg -ICAgIGlmIChoZWFkaW5nU2x1ZykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTmFj -aCBSZW5kZXIgenVtIEhlYWRpbmcgc2Nyb2xsZW4KICAgICAgICAgICAgICAgICAgICAgICAgICAg -IHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg -dmFyIGhlYWRpbmcgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChoZWFkaW5nU2x1Zyk7CiAgICAg -ICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhlYWRpbmcpIHsKICAgICAgICAgICAgICAg -ICAgICAgICAgICAgICAgICAgICAgaGVhZGluZy5zY3JvbGxJbnRvVmlldyh7IGJlaGF2aW9yOiAn -c21vb3RoJywgYmxvY2s6ICdzdGFydCcgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAg -ICAgICAgIGhlYWRpbmcuc3R5bGUudHJhbnNpdGlvbiA9ICdiYWNrZ3JvdW5kIDAuM3MnOwogICAg -ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkaW5nLnN0eWxlLmJhY2tncm91bmQg -PSAndmFyKC0tYmctYWN0aXZlKSc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg -IHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7IGhlYWRpbmcuc3R5bGUuYmFja2dyb3VuZCA9ICcnOyB9 -LCAyMDAwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAg -ICAgICAgICAgICAgICB9LCAyMDApOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAg -ICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgLy8gTW91 -c2VvdmVyOiBQb3BvdmVyIG1pdCBaaWVsLUluZm8KICAgICAgICAgICAgICAgIGVsLmFkZEV2ZW50 -TGlzdGVuZXIoJ21vdXNlZW50ZXInLCBmdW5jdGlvbihldikgewogICAgICAgICAgICAgICAgICAg -IHZhciBwYXJ0cyA9IHRhcmdldC5zcGxpdCgnIycpOwogICAgICAgICAgICAgICAgICAgIHZhciBk -b2NJZCA9IHBhcnRzWzBdOwogICAgICAgICAgICAgICAgICAgIHZhciBkb2MgPSBEcml2ZUZTLmRv -Y3VtZW50cy5maW5kKGZ1bmN0aW9uKGQpIHsgcmV0dXJuIGQuaWQgPT09IGRvY0lkOyB9KTsKICAg -ICAgICAgICAgICAgICAgICBpZiAoZG9jKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIERyaXZl -UG9ydGFsLl9zaG93Q3Jvc3NsaW5rUG9wb3ZlcihldiwgW3sgdGVybTogZG9jLnRpdGVsLCB0eXBl -OiAncmVmZXJlbnonLCBkb2M6IGRvYyB9XSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAg -ICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBlbC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWxl -YXZlJywgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgRHJpdmVQb3J0YWwuX2hpZGVD -cm9zc2xpbmtQb3BvdmVyKCk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSk7Cgog -ICAgICAgICAgICAvLyA9PT0gQXV0b21hdGlzY2hlIENyb3NzbGluay1Fcmtlbm51bmcgPT09CiAg -ICAgICAgICAgIHRoaXMuX2FwcGx5Q3Jvc3NsaW5rcyhjb250ZW50LCBkb2MpOwogICAgICAgIH0s -IDUwKTsKICAgIH0sCgogICAgLy8gQ3Jvc3NsaW5rLUVuZ2luZTogRXJrZW5udCBWZXJ3ZWlzZSBh -dWYgYW5kZXJlIEFydGlrZWwgaW0gSW5oYWx0CiAgICBfY3Jvc3NsaW5rUG9wb3ZlcjogbnVsbCwK -ICAgIF9jcm9zc2xpbmtUaW1lb3V0OiBudWxsLAoKICAgIF9idWlsZENyb3NzbGlua0luZGV4KGV4 -Y2x1ZGVEb2NJZCkgewogICAgICAgIC8vIEluZGV4IGFsbGVyIERva3VtZW50ZSBtaXQgVGl0ZWxu -IHVuZCBTY2hsYWd3b2VydGVybgogICAgICAgIHZhciBpbmRleCA9IFtdOwogICAgICAgIERyaXZl -RlMuZG9jdW1lbnRzLmZvckVhY2goZnVuY3Rpb24oZCkgewogICAgICAgICAgICBpZiAoZC5pZCA9 -PT0gZXhjbHVkZURvY0lkKSByZXR1cm47CiAgICAgICAgICAgIC8vIFRpdGVsIGFscyBTdWNoYmVn -cmlmZiAobWluIDQgWmVpY2hlbikKICAgICAgICAgICAgaWYgKGQudGl0ZWwgJiYgZC50aXRlbC5s -ZW5ndGggPj0gNCkgewogICAgICAgICAgICAgICAgaW5kZXgucHVzaCh7IHRlcm06IGQudGl0ZWws -IHR5cGU6ICd0aXRlbCcsIGRvYzogZCB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBT -Y2hsYWd3b2VydGVyIGFscyBTdWNoYmVncmlmZmUgKG1pbiAzIFplaWNoZW4pCiAgICAgICAgICAg -IChkLnNjaGxhZ3dvZXJ0ZXIgfHwgW10pLmZvckVhY2goZnVuY3Rpb24oa3cpIHsKICAgICAgICAg -ICAgICAgIGlmIChrdyAmJiBrdy5sZW5ndGggPj0gMykgewogICAgICAgICAgICAgICAgICAgIGlu -ZGV4LnB1c2goeyB0ZXJtOiBrdywgdHlwZTogJ3NjaGxhZ3dvcnQnLCBkb2M6IGQgfSk7CiAgICAg -ICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0pOwogICAgICAgIC8vIExhZW5n -c3RlIEJlZ3JpZmZlIHp1ZXJzdCAodmVyaGluZGVydCBUZWlsbWF0Y2hlcykKICAgICAgICBpbmRl -eC5zb3J0KGZ1bmN0aW9uKGEsIGIpIHsgcmV0dXJuIGIudGVybS5sZW5ndGggLSBhLnRlcm0ubGVu -Z3RoOyB9KTsKICAgICAgICByZXR1cm4gaW5kZXg7CiAgICB9LAoKICAgIF9hcHBseUNyb3NzbGlu -a3MoY29udGVudEVsLCBjdXJyZW50RG9jKSB7CiAgICAgICAgLy8gR292ZXJuYW5jZS1FaW5zdGVs -bHVuZyBwcsO8ZmVuCiAgICAgICAgdmFyIHNldHRpbmdzID0gKERyaXZlR292ZXJuYW5jZS5kYXRh -ICYmIERyaXZlR292ZXJuYW5jZS5kYXRhLnNldHRpbmdzKSA/IERyaXZlR292ZXJuYW5jZS5kYXRh -LnNldHRpbmdzIDoge307CiAgICAgICAgaWYgKHNldHRpbmdzLmNyb3NzbGlua01vZGUgPT09ICdk -aXNhYmxlZCcpIHJldHVybjsKCiAgICAgICAgdmFyIGluZGV4ID0gdGhpcy5fYnVpbGRDcm9zc2xp -bmtJbmRleChjdXJyZW50RG9jLmlkKTsKICAgICAgICBpZiAoaW5kZXgubGVuZ3RoID09PSAwKSBy -ZXR1cm47CgogICAgICAgIC8vIEJlcmVpdHMgdmVybGlua3RlIFRlcm1lIHRyYWNrZW4gKGtlaW4g -ZG9wcGVsdGVzIE1hdGNoaW5nKQogICAgICAgIHZhciBtYXRjaGVkID0gbmV3IFNldCgpOwogICAg -ICAgIC8vIFNhbW1sZSBhbGxlIHVuaXF1ZSBEb2t1bWVudC1JRHMgZGllIGplIFRlcm0gbWF0Y2hl -bgogICAgICAgIHZhciB0ZXJtRG9jcyA9IHt9OwogICAgICAgIGluZGV4LmZvckVhY2goZnVuY3Rp -b24oZW50cnkpIHsKICAgICAgICAgICAgdmFyIGtleSA9IGVudHJ5LnRlcm0udG9Mb3dlckNhc2Uo -KTsKICAgICAgICAgICAgaWYgKCF0ZXJtRG9jc1trZXldKSB0ZXJtRG9jc1trZXldID0gW107CiAg -ICAgICAgICAgIC8vIE51ciB1bmlxdWUgRG9jcyBwcm8gVGVybQogICAgICAgICAgICBpZiAoIXRl -cm1Eb2NzW2tleV0uZmluZChmdW5jdGlvbihlKSB7IHJldHVybiBlLmRvYy5pZCA9PT0gZW50cnku -ZG9jLmlkOyB9KSkgewogICAgICAgICAgICAgICAgdGVybURvY3Nba2V5XS5wdXNoKGVudHJ5KTsK -ICAgICAgICAgICAgfQogICAgICAgIH0pOwoKICAgICAgICB2YXIgd2Fsa2VyID0gZG9jdW1lbnQu -Y3JlYXRlVHJlZVdhbGtlcihjb250ZW50RWwsIE5vZGVGaWx0ZXIuU0hPV19URVhULCBudWxsLCBm -YWxzZSk7CiAgICAgICAgdmFyIHRleHROb2RlcyA9IFtdOwogICAgICAgIHdoaWxlICh3YWxrZXIu -bmV4dE5vZGUoKSkgewogICAgICAgICAgICB2YXIgbm9kZSA9IHdhbGtlci5jdXJyZW50Tm9kZTsK -ICAgICAgICAgICAgLy8gTmljaHQgaW5uZXJoYWxiIHZvbiBMaW5rcywgQnV0dG9ucywgYmVyZWl0 -cyBtYXJraWVydGVuIENyb3NzbGlua3MsIG9kZXIgZHJpdmUtbWVkaWEgRWxlbWVudGVuCiAgICAg -ICAgICAgIHZhciBwYXJlbnQgPSBub2RlLnBhcmVudEVsZW1lbnQ7CiAgICAgICAgICAgIGlmIChw -YXJlbnQgJiYgKHBhcmVudC5jbG9zZXN0KCdhJykgfHwgcGFyZW50LmNsb3Nlc3QoJ2J1dHRvbicp -IHx8IHBhcmVudC5jbG9zZXN0KCcuY3Jvc3NsaW5rJykgfHwgcGFyZW50LmNsb3Nlc3QoJy5kcml2 -ZS1tZWRpYScpKSkgY29udGludWU7CiAgICAgICAgICAgIGlmIChub2RlLnRleHRDb250ZW50LnRy -aW0oKS5sZW5ndGggPiAyKSB7CiAgICAgICAgICAgICAgICB0ZXh0Tm9kZXMucHVzaChub2RlKTsK -ICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgdmFyIG1heExpbmtzID0gMzA7IC8vIFBl -cmZvcm1hbmNlLUxpbWl0CiAgICAgICAgdmFyIGxpbmtDb3VudCA9IDA7CgogICAgICAgIHRleHRO -b2Rlcy5mb3JFYWNoKGZ1bmN0aW9uKHRleHROb2RlKSB7CiAgICAgICAgICAgIGlmIChsaW5rQ291 -bnQgPj0gbWF4TGlua3MpIHJldHVybjsKICAgICAgICAgICAgdmFyIHRleHQgPSB0ZXh0Tm9kZS50 -ZXh0Q29udGVudDsKICAgICAgICAgICAgdmFyIHJlcGxhY2VtZW50cyA9IFtdOwoKICAgICAgICAg -ICAgaW5kZXguZm9yRWFjaChmdW5jdGlvbihlbnRyeSkgewogICAgICAgICAgICAgICAgaWYgKGxp -bmtDb3VudCA+PSBtYXhMaW5rcykgcmV0dXJuOwogICAgICAgICAgICAgICAgdmFyIHRlcm1Mb3dl -ciA9IGVudHJ5LnRlcm0udG9Mb3dlckNhc2UoKTsKICAgICAgICAgICAgICAgIGlmIChtYXRjaGVk -Lmhhcyh0ZXJtTG93ZXIpKSByZXR1cm47CgogICAgICAgICAgICAgICAgLy8gV29ydGdyZW56ZW4t -U3VjaGUgKGNhc2UtaW5zZW5zaXRpdmUpCiAgICAgICAgICAgICAgICB2YXIgZXNjYXBlZCA9IGVu -dHJ5LnRlcm0ucmVwbGFjZSgvWy4qKz9eJHt9KCl8W1xdXFxdL2csICdcXCQmJyk7CiAgICAgICAg -ICAgICAgICB2YXIgcmUgPSBuZXcgUmVnRXhwKCdcXGInICsgZXNjYXBlZCArICdcXGInLCAnaScp -OwogICAgICAgICAgICAgICAgdmFyIG0gPSByZS5leGVjKHRleHQpOwogICAgICAgICAgICAgICAg -aWYgKG0pIHsKICAgICAgICAgICAgICAgICAgICByZXBsYWNlbWVudHMucHVzaCh7CiAgICAgICAg -ICAgICAgICAgICAgICAgIHN0YXJ0OiBtLmluZGV4LAogICAgICAgICAgICAgICAgICAgICAgICBl -bmQ6IG0uaW5kZXggKyBtWzBdLmxlbmd0aCwKICAgICAgICAgICAgICAgICAgICAgICAgb3JpZ2lu -YWw6IG1bMF0sCiAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5OiBlbnRyeSwKICAgICAgICAg -ICAgICAgICAgICAgICAgZW50cmllczogdGVybURvY3NbdGVybUxvd2VyXSB8fCBbZW50cnldCiAg -ICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgbWF0Y2hlZC5hZGQodGVy -bUxvd2VyKTsKICAgICAgICAgICAgICAgICAgICBsaW5rQ291bnQrKzsKICAgICAgICAgICAgICAg -IH0KICAgICAgICAgICAgfSk7CgogICAgICAgICAgICBpZiAocmVwbGFjZW1lbnRzLmxlbmd0aCA9 -PT0gMCkgcmV0dXJuOwoKICAgICAgICAgICAgLy8gTmFjaCBQb3NpdGlvbiBzb3J0aWVyZW4gKHJ1 -ZWNrd2FlcnRzIGVyc2V0emVuKQogICAgICAgICAgICByZXBsYWNlbWVudHMuc29ydChmdW5jdGlv -bihhLCBiKSB7IHJldHVybiBiLnN0YXJ0IC0gYS5zdGFydDsgfSk7CgogICAgICAgICAgICAvLyBV -ZWJlcmxhcHB1bmdlbiBlbnRmZXJuZW4KICAgICAgICAgICAgdmFyIGNsZWFuID0gW3JlcGxhY2Vt -ZW50c1swXV07CiAgICAgICAgICAgIGZvciAodmFyIGkgPSAxOyBpIDwgcmVwbGFjZW1lbnRzLmxl -bmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICBpZiAocmVwbGFjZW1lbnRzW2ldLmVuZCA8PSBj -bGVhbltjbGVhbi5sZW5ndGggLSAxXS5zdGFydCkgewogICAgICAgICAgICAgICAgICAgIGNsZWFu -LnB1c2gocmVwbGFjZW1lbnRzW2ldKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoK -ICAgICAgICAgICAgLy8gRnJhZ21lbnQgYmF1ZW4KICAgICAgICAgICAgdmFyIGZyYWcgPSBkb2N1 -bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7CiAgICAgICAgICAgIHZhciBsYXN0SWR4ID0g -MDsKICAgICAgICAgICAgLy8gVm9yd2FlcnRzIHNvcnRpZXJlbiBmdWVyIEZyYWdtZW50LUF1ZmJh -dQogICAgICAgICAgICBjbGVhbi5zb3J0KGZ1bmN0aW9uKGEsIGIpIHsgcmV0dXJuIGEuc3RhcnQg -LSBiLnN0YXJ0OyB9KTsKCiAgICAgICAgICAgIGNsZWFuLmZvckVhY2goZnVuY3Rpb24ocikgewog -ICAgICAgICAgICAgICAgLy8gVGV4dCB2b3IgZGVtIE1hdGNoCiAgICAgICAgICAgICAgICBpZiAo -ci5zdGFydCA+IGxhc3RJZHgpIHsKICAgICAgICAgICAgICAgICAgICBmcmFnLmFwcGVuZENoaWxk -KGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKHRleHQuc3Vic3RyaW5nKGxhc3RJZHgsIHIuc3RhcnQp -KSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAvLyBDcm9zc2xpbmstU3Bhbgog -ICAgICAgICAgICAgICAgdmFyIHNwYW4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7 -CiAgICAgICAgICAgICAgICBzcGFuLmNsYXNzTmFtZSA9ICdjcm9zc2xpbmsnOwogICAgICAgICAg -ICAgICAgc3Bhbi50ZXh0Q29udGVudCA9IHIub3JpZ2luYWw7CiAgICAgICAgICAgICAgICAvLyBE -YXRlbiBmdWVyIFBvcG92ZXIKICAgICAgICAgICAgICAgIHZhciBkb2NzID0gci5lbnRyaWVzLm1h -cChmdW5jdGlvbihlKSB7IHJldHVybiBlLmRvYzsgfSk7CiAgICAgICAgICAgICAgICB2YXIgdHlw -ZXMgPSByLmVudHJpZXMubWFwKGZ1bmN0aW9uKGUpIHsgcmV0dXJuIGUudHlwZTsgfSk7CiAgICAg -ICAgICAgICAgICBzcGFuLnNldEF0dHJpYnV0ZSgnZGF0YS14bGluay1kb2NzJywgSlNPTi5zdHJp -bmdpZnkoZG9jcy5tYXAoZnVuY3Rpb24oZCkgeyByZXR1cm4gZC5pZDsgfSkpKTsKICAgICAgICAg -ICAgICAgIHNwYW4uc2V0QXR0cmlidXRlKCdkYXRhLXhsaW5rLXR5cGUnLCB0eXBlc1swXSk7Cgog -ICAgICAgICAgICAgICAgc3Bhbi5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWVudGVyJywgZnVuY3Rp -b24oZXYpIHsKICAgICAgICAgICAgICAgICAgICBEcml2ZVBvcnRhbC5fc2hvd0Nyb3NzbGlua1Bv -cG92ZXIoZXYsIHIuZW50cmllcyk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAg -IHNwYW4uYWRkRXZlbnRMaXN0ZW5lcignbW91c2VsZWF2ZScsIGZ1bmN0aW9uKCkgewogICAgICAg -ICAgICAgICAgICAgIERyaXZlUG9ydGFsLl9oaWRlQ3Jvc3NsaW5rUG9wb3ZlcigpOwogICAgICAg -ICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBzcGFuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNr -JywgZnVuY3Rpb24oZXYpIHsKICAgICAgICAgICAgICAgICAgICBldi5wcmV2ZW50RGVmYXVsdCgp -OwogICAgICAgICAgICAgICAgICAgIGV2LnN0b3BQcm9wYWdhdGlvbigpOwogICAgICAgICAgICAg -ICAgICAgIC8vIEJlaSBudXIgZWluZW0gVHJlZmZlcjogZGlyZWt0IG9lZmZuZW4KICAgICAgICAg -ICAgICAgICAgICBpZiAoZG9jcy5sZW5ndGggPT09IDEpIHsKICAgICAgICAgICAgICAgICAgICAg -ICAgRHJpdmVQb3J0YWwuc2VsZWN0RG9jdW1lbnQoZG9jc1swXS5pZCk7CiAgICAgICAgICAgICAg -ICAgICAgICAgIERyaXZlUG9ydGFsLmhpZ2hsaWdodEl0ZW0oZG9jc1swXS5pZCk7CiAgICAgICAg -ICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgZnJhZy5h -cHBlbmRDaGlsZChzcGFuKTsKICAgICAgICAgICAgICAgIGxhc3RJZHggPSByLmVuZDsKICAgICAg -ICAgICAgfSk7CgogICAgICAgICAgICAvLyBSZXN0LVRleHQKICAgICAgICAgICAgaWYgKGxhc3RJ -ZHggPCB0ZXh0Lmxlbmd0aCkgewogICAgICAgICAgICAgICAgZnJhZy5hcHBlbmRDaGlsZChkb2N1 -bWVudC5jcmVhdGVUZXh0Tm9kZSh0ZXh0LnN1YnN0cmluZyhsYXN0SWR4KSkpOwogICAgICAgICAg -ICB9CgogICAgICAgICAgICB0ZXh0Tm9kZS5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChmcmFnLCB0 -ZXh0Tm9kZSk7CiAgICAgICAgfSk7CiAgICB9LAoKICAgIF9zaG93Q3Jvc3NsaW5rUG9wb3Zlcihl -diwgZW50cmllcykgewogICAgICAgIGNsZWFyVGltZW91dCh0aGlzLl9jcm9zc2xpbmtUaW1lb3V0 -KTsKICAgICAgICB2YXIgcG9wb3ZlciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjcm9zc2xp -bmtQb3BvdmVyJyk7CiAgICAgICAgaWYgKCFwb3BvdmVyKSByZXR1cm47CgogICAgICAgIC8vIE1l -aHJlcmUgRG9rdW1lbnRlIGtvZW5uZW4gZGVuc2VsYmVuIEJlZ3JpZmYgbWF0Y2hlbgogICAgICAg -IHZhciBzZWVuID0gbmV3IFNldCgpOwogICAgICAgIHZhciB1bmlxdWVFbnRyaWVzID0gZW50cmll -cy5maWx0ZXIoZnVuY3Rpb24oZSkgewogICAgICAgICAgICBpZiAoc2Vlbi5oYXMoZS5kb2MuaWQp -KSByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIHNlZW4uYWRkKGUuZG9jLmlkKTsKICAgICAgICAg -ICAgcmV0dXJuIHRydWU7CiAgICAgICAgfSk7CgogICAgICAgIHZhciBodG1sID0gJyc7CiAgICAg -ICAgdW5pcXVlRW50cmllcy5mb3JFYWNoKGZ1bmN0aW9uKGVudHJ5LCBpZHgpIHsKICAgICAgICAg -ICAgdmFyIGRvYyA9IGVudHJ5LmRvYzsKICAgICAgICAgICAgdmFyIG1hdGNoVHlwZSA9IGVudHJ5 -LnR5cGUgPT09ICd0aXRlbCcgPyAnQXJ0aWtlbHRpdGVsJyA6ICdTY2hsYWd3b3J0JzsKICAgICAg -ICAgICAgLy8gVGV4dGF1c3p1ZyAoZXJzdGUgMTIwIFplaWNoZW4gZGVzIEluaGFsdHMsIEhUTUwt -VGFncyBlbnRmZXJudCkKICAgICAgICAgICAgdmFyIGV4Y2VycHQgPSAnJzsKICAgICAgICAgICAg -aWYgKGRvYy5pbmhhbHQpIHsKICAgICAgICAgICAgICAgIHZhciBkaXYgPSBkb2N1bWVudC5jcmVh -dGVFbGVtZW50KCdkaXYnKTsKICAgICAgICAgICAgICAgIGRpdi5pbm5lckhUTUwgPSBEcml2ZVBv -cnRhbC5zYW5pdGl6ZUhUTUwoZG9jLmluaGFsdCk7CiAgICAgICAgICAgICAgICBleGNlcnB0ID0g -ZGl2LnRleHRDb250ZW50LnN1YnN0cmluZygwLCAxMjApOwogICAgICAgICAgICAgICAgaWYgKGRp -di50ZXh0Q29udGVudC5sZW5ndGggPiAxMjApIGV4Y2VycHQgKz0gJy4uLic7CiAgICAgICAgICAg -IH0KICAgICAgICAgICAgaWYgKGlkeCA+IDApIGh0bWwgKz0gJzxkaXYgc3R5bGU9ImJvcmRlci10 -b3A6MXB4IHNvbGlkIHZhcigtLWJvcmRlci1saWdodCk7bWFyZ2luOjhweCAwOyI+PC9kaXY+JzsK -ICAgICAgICAgICAgaHRtbCArPSAnPGRpdiBjbGFzcz0ieGxpbmstaGVhZGVyIj48c3BhbiBjbGFz -cz0ieGxpbmstaWNvbiI+JiN4MUY1MTc7PC9zcGFuPiAnICsgRHJpdmVQb3J0YWwuZXNjYXBlSFRN -TChkb2MudGl0ZWwpICsgJzwvZGl2Pic7CiAgICAgICAgICAgIGh0bWwgKz0gJzxkaXYgY2xhc3M9 -InhsaW5rLW1ldGEiPic7CiAgICAgICAgICAgIGh0bWwgKz0gJzxzcGFuPicgKyBEcml2ZVBvcnRh -bC5lc2NhcGVIVE1MKGRvYy5rYXRlZ29yaWUpICsgJzwvc3Bhbj4nOwogICAgICAgICAgICBodG1s -ICs9ICc8c3Bhbj5UcmVmZmVyOiAnICsgbWF0Y2hUeXBlICsgJzwvc3Bhbj4nOwogICAgICAgICAg -ICBodG1sICs9ICc8c3Bhbj4nICsgRHJpdmVQb3J0YWwuZXNjYXBlSFRNTChkb2Muc3RhdHVzIHx8 -ICdFbnR3dXJmJykgKyAnPC9zcGFuPic7CiAgICAgICAgICAgIGh0bWwgKz0gJzwvZGl2Pic7CiAg -ICAgICAgICAgIGlmIChleGNlcnB0KSB7CiAgICAgICAgICAgICAgICBodG1sICs9ICc8ZGl2IGNs -YXNzPSJ4bGluay1leGNlcnB0Ij4nICsgRHJpdmVQb3J0YWwuZXNjYXBlSFRNTChleGNlcnB0KSAr -ICc8L2Rpdj4nOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChkb2Muc2NobGFnd29lcnRl -ciAmJiBkb2Muc2NobGFnd29lcnRlci5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICBodG1s -ICs9ICc8ZGl2IGNsYXNzPSJ4bGluay10YWdzIj4nICsgZG9jLnNjaGxhZ3dvZXJ0ZXIuc2xpY2Uo -MCwgNSkubWFwKGZ1bmN0aW9uKGspIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJzxzcGFu -PicgKyBEcml2ZVBvcnRhbC5lc2NhcGVIVE1MKGspICsgJzwvc3Bhbj4nOwogICAgICAgICAgICAg -ICAgfSkuam9pbignJykgKyAnPC9kaXY+JzsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAo -dW5pcXVlRW50cmllcy5sZW5ndGggPT09IDEpIHsKICAgICAgICAgICAgICAgIGh0bWwgKz0gJzxk -aXYgY2xhc3M9InhsaW5rLWFjdGlvbiIgb25jbGljaz0iRHJpdmVQb3J0YWwuc2VsZWN0RG9jdW1l -bnQoXCcnICsgRHJpdmVQb3J0YWwuZXNjYXBlQXR0cihkb2MuaWQpICsgJ1wnKTtEcml2ZVBvcnRh -bC5oaWdobGlnaHRJdGVtKFwnJyArIERyaXZlUG9ydGFsLmVzY2FwZUF0dHIoZG9jLmlkKSArICdc -Jyk7Ij5BcnRpa2VsIMO2ZmZuZW4g4oaSPC9kaXY+JzsKICAgICAgICAgICAgfQogICAgICAgIH0p -OwoKICAgICAgICBpZiAodW5pcXVlRW50cmllcy5sZW5ndGggPiAxKSB7CiAgICAgICAgICAgIGh0 -bWwgKz0gJzxkaXYgc3R5bGU9ImJvcmRlci10b3A6MXB4IHNvbGlkIHZhcigtLWJvcmRlci1saWdo -dCk7bWFyZ2luLXRvcDo4cHg7cGFkZGluZy10b3A6NnB4O2ZvbnQtc2l6ZToxMXB4O2NvbG9yOnZh -cigtLXRleHQtbXV0ZWQpOyI+JyArIHVuaXF1ZUVudHJpZXMubGVuZ3RoICsgJyB2ZXJ3YW5kdGUg -QXJ0aWtlbCBnZWZ1bmRlbjwvZGl2Pic7CiAgICAgICAgfQoKICAgICAgICBwb3BvdmVyLmlubmVy -SFRNTCA9IGh0bWw7CiAgICAgICAgcG9wb3Zlci5jbGFzc0xpc3QuYWRkKCd2aXNpYmxlJyk7Cgog -ICAgICAgIC8vIFBvc2l0aW9uIHJlbGF0aXYgenVtIFRyaWdnZXItRWxlbWVudAogICAgICAgIHZh -ciByZWN0ID0gZXYudGFyZ2V0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwogICAgICAgIHZhciBw -b3BXID0gMzIwOwogICAgICAgIHZhciBwb3BIID0gcG9wb3Zlci5vZmZzZXRIZWlnaHQgfHwgMjAw -OwogICAgICAgIHZhciBsZWZ0ID0gcmVjdC5sZWZ0OwogICAgICAgIHZhciB0b3AgPSByZWN0LmJv -dHRvbSArIDY7CiAgICAgICAgLy8gUmVjaHRzIHJhdXM/IExpbmtzIHZlcnNjaGllYmVuCiAgICAg -ICAgaWYgKGxlZnQgKyBwb3BXID4gd2luZG93LmlubmVyV2lkdGggLSAxMCkgewogICAgICAgICAg -ICBsZWZ0ID0gd2luZG93LmlubmVyV2lkdGggLSBwb3BXIC0gMTA7CiAgICAgICAgfQogICAgICAg -IC8vIFVudGVuIHJhdXM/IFVlYmVyIGRlbSBFbGVtZW50IGFuemVpZ2VuCiAgICAgICAgaWYgKHRv -cCArIHBvcEggPiB3aW5kb3cuaW5uZXJIZWlnaHQgLSAxMCkgewogICAgICAgICAgICB0b3AgPSBy -ZWN0LnRvcCAtIHBvcEggLSA2OwogICAgICAgIH0KICAgICAgICBwb3BvdmVyLnN0eWxlLmxlZnQg -PSBNYXRoLm1heCgxMCwgbGVmdCkgKyAncHgnOwogICAgICAgIHBvcG92ZXIuc3R5bGUudG9wID0g -TWF0aC5tYXgoMTAsIHRvcCkgKyAncHgnOwogICAgfSwKCiAgICBfaGlkZUNyb3NzbGlua1BvcG92 -ZXIoKSB7CiAgICAgICAgdGhpcy5fY3Jvc3NsaW5rVGltZW91dCA9IHNldFRpbWVvdXQoZnVuY3Rp -b24oKSB7CiAgICAgICAgICAgIHZhciBwb3BvdmVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQo -J2Nyb3NzbGlua1BvcG92ZXInKTsKICAgICAgICAgICAgaWYgKHBvcG92ZXIpIHBvcG92ZXIuY2xh -c3NMaXN0LnJlbW92ZSgndmlzaWJsZScpOwogICAgICAgIH0sIDIwMCk7CiAgICB9LAoKICAgIC8v -IFBydWVmZW4gb2IgZGVyIGFrdHVlbGxlIFVzZXIgUmV2aXNpb25lbi9EaWZmIHNlaGVuIGRhcmY6 -CiAgICAvLyAtIExlc2Vtb2R1czogbmllCiAgICAvLyAtIFN1cGVyVXNlciAvIEZhY2hhdWZzaWNo -dDogaW1tZXIKICAgIC8vIC0gWnVzdGFlbmRpZ2VyIFJldmlld2VyIGZ1ZXIgZGllIEthdGVnb3Jp -ZTogamEKICAgIC8vIC0gTWl0d2lya2VuZGVyIGFtIEFydGlrZWwgKENvbnRyaWJ1dG9yKTogamEK -ICAgIC8vIC0gQWxsZSBhbmRlcmVuOiBuZWluCiAgICBfY2FuU2VlUmV2aXNpb25zKGRvYykgewog -ICAgICAgIGlmIChEcml2ZUZTLm1vZGUgPT09ICdzdGF0aWMnKSByZXR1cm4gZmFsc2U7CiAgICAg -ICAgaWYgKERyaXZlR292ZXJuYW5jZS5pc1N1cGVyVXNlcigpIHx8IERyaXZlR292ZXJuYW5jZS5p -c0ZhY2hhdWZzaWNodCgpKSByZXR1cm4gdHJ1ZTsKICAgICAgICBpZiAoRHJpdmVHb3Zlcm5hbmNl -LmlzUmV2aWV3ZXIoZG9jLmthdGVnb3JpZSkpIHJldHVybiB0cnVlOwogICAgICAgIC8vIE1pdHdp -cmtlbmRlOiBVc2VybmFtZSBwcnVlZmVuCiAgICAgICAgdmFyIHVzZXJuYW1lID0gKERyaXZlRlMu -ZW52aXJvbiAmJiBEcml2ZUZTLmVudmlyb24udXNlcm5hbWUpID8gRHJpdmVGUy5lbnZpcm9uLnVz -ZXJuYW1lLnRvTG93ZXJDYXNlKCkgOiAnJzsKICAgICAgICBpZiAodXNlcm5hbWUgJiYgZG9jLmNv -bnRyaWJ1dG9ycykgewogICAgICAgICAgICBpZiAoZG9jLmNvbnRyaWJ1dG9ycy5zb21lKGZ1bmN0 -aW9uKGMpIHsgcmV0dXJuIChjLnVzZXJuYW1lIHx8ICcnKS50b0xvd2VyQ2FzZSgpID09PSB1c2Vy -bmFtZTsgfSkpIHJldHVybiB0cnVlOwogICAgICAgIH0KICAgICAgICAvLyBFcnN0ZWxsZXIgb2Rl -ciBsZXR6dGVyIEJlYXJiZWl0ZXIKICAgICAgICBpZiAodXNlcm5hbWUgJiYgKChkb2MuZXJzdGVs -bHRWb24gfHwgJycpLnRvTG93ZXJDYXNlKCkgPT09IHVzZXJuYW1lIHx8IChkb2MuYmVhcmJlaXRl -dFZvbiB8fCAnJykudG9Mb3dlckNhc2UoKSA9PT0gdXNlcm5hbWUpKSByZXR1cm4gdHJ1ZTsKICAg -ICAgICByZXR1cm4gZmFsc2U7CiAgICB9LAoKICAgIF9yZW5kZXJDaGlsZEFydGljbGVzKGRvYykg -ewogICAgICAgIGNvbnN0IGNoaWxkcmVuID0gRHJpdmVGUy5kb2N1bWVudHMuZmlsdGVyKGZ1bmN0 -aW9uKGQpeyByZXR1cm4gZC5wYXJlbnRJZCA9PT0gZG9jLmlkOyB9KTsKICAgICAgICBpZiAoY2hp -bGRyZW4ubGVuZ3RoID09PSAwKSByZXR1cm4gJyc7CiAgICAgICAgcmV0dXJuICc8ZGl2IGNsYXNz -PSJtZXRhLWl0ZW0iIHN0eWxlPSJmbGV4LWJhc2lzOjEwMCU7Ij48ZGl2IGNsYXNzPSJtZXRhLWxh -YmVsIj5VbnRlcmFydGlrZWw8L2Rpdj48ZGl2PicgKwogICAgICAgICAgICBjaGlsZHJlbi5tYXAo -ZnVuY3Rpb24oYyl7IHJldHVybiAnPGEgc3R5bGU9ImNvbG9yOnZhcigtLXRleHQtaGVhZGluZyk7 -Y3Vyc29yOnBvaW50ZXI7bWFyZ2luLXJpZ2h0OjhweDsiIG9uY2xpY2s9IkRyaXZlUG9ydGFsLnNl -bGVjdERvY3VtZW50KFwnJyArIERyaXZlUG9ydGFsLmVzY2FwZUF0dHIoYy5pZCkgKyAnXCcpIj4n -ICsgRHJpdmVQb3J0YWwuZXNjYXBlSFRNTChjLnRpdGVsKSArICc8L2E+JzsgfSkuam9pbignJykg -KwogICAgICAgICc8L2Rpdj48L2Rpdj4nOwogICAgfSwKCiAgICByZW5kZXJDb250cmlidXRvcnMo -ZG9jKSB7CiAgICAgICAgaWYgKCFkb2MuY29udHJpYnV0b3JzIHx8IGRvYy5jb250cmlidXRvcnMu -bGVuZ3RoID09PSAwKSByZXR1cm4gJyc7CgogICAgICAgIC8vIEdld2ljaHR1bmdlbiBiZXJlY2hu -ZW4KICAgICAgICBjb25zdCByb2xlV2VpZ2h0cyA9IHsgYXV0b3I6IDMsIHJlZGFrdGlvbjogMSwg -cmV2aWV3OiAxLjUgfTsKICAgICAgICBsZXQgdG90YWxXZWlnaHQgPSAwOwogICAgICAgIGNvbnN0 -IHdlaWdodGVkID0gZG9jLmNvbnRyaWJ1dG9ycy5tYXAoYyA9PiB7CiAgICAgICAgICAgIGNvbnN0 -IHcgPSAoYy5lbnRyaWVzIHx8IDEpICogKHJvbGVXZWlnaHRzW2Mucm9sZV0gfHwgMSk7CiAgICAg -ICAgICAgIHRvdGFsV2VpZ2h0ICs9IHc7CiAgICAgICAgICAgIHJldHVybiB7IC4uLmMsIHdlaWdo -dDogdyB9OwogICAgICAgIH0pOwoKICAgICAgICBjb25zdCByb2xlTGFiZWxzID0geyBhdXRvcjog -J0F1dG9yJywgcmVkYWt0aW9uOiAnUmVkYWt0aW9uJywgcmV2aWV3OiAnUmV2aWV3JyB9OwoKICAg -ICAgICBsZXQgaHRtbCA9ICc8ZGl2IGNsYXNzPSJjb250cmlidXRvcnMtc2VjdGlvbiI+PGgzPk1p -dHdpcmtlbmRlPC9oMz4nOwogICAgICAgIHdlaWdodGVkCiAgICAgICAgICAgIC5zb3J0KChhLCBi -KSA9PiBiLndlaWdodCAtIGEud2VpZ2h0KQogICAgICAgICAgICAuZm9yRWFjaChjID0+IHsKICAg -ICAgICAgICAgICAgIGNvbnN0IHBjdCA9IHRvdGFsV2VpZ2h0ID4gMCA/IE1hdGgucm91bmQoKGMu -d2VpZ2h0IC8gdG90YWxXZWlnaHQpICogMTAwKSA6IDA7CiAgICAgICAgICAgICAgICBjb25zdCBy -b2xlID0gYy5yb2xlIHx8ICdhdXRvcic7CiAgICAgICAgICAgICAgICBodG1sICs9ICc8ZGl2IGNs -YXNzPSJjb250cmlidXRvci1yb3ciPicgKwogICAgICAgICAgICAgICAgICAgICc8c3BhbiBjbGFz -cz0iY29udHJpYnV0b3ItbmFtZSI+JyArIERyaXZlUG9ydGFsLmVzY2FwZUhUTUwoYy51c2VybmFt -ZSkgKyAnPC9zcGFuPicgKwogICAgICAgICAgICAgICAgICAgICc8c3BhbiBjbGFzcz0iY29udHJp -YnV0b3Itcm9sZSAnICsgcm9sZSArICciPicgKyAocm9sZUxhYmVsc1tyb2xlXSB8fCByb2xlKSAr -ICc8L3NwYW4+JyArCiAgICAgICAgICAgICAgICAgICAgJzxzcGFuIHN0eWxlPSJmb250LXNpemU6 -MTFweDtjb2xvcjp2YXIoLS10ZXh0LW11dGVkKTt3aWR0aDoyNHB4O3RleHQtYWxpZ246cmlnaHQ7 -ZmxleC1zaHJpbms6MDsiPicgKyAoYy5lbnRyaWVzID4gMSA/IGMuZW50cmllcyArICd4JyA6ICcn -KSArICc8L3NwYW4+JyArCiAgICAgICAgICAgICAgICAgICAgJzxkaXYgY2xhc3M9ImNvbnRyaWJ1 -dG9yLWJhciI+PGRpdiBjbGFzcz0iY29udHJpYnV0b3ItYmFyLWZpbGwgJyArIHJvbGUgKyAnIiBz -dHlsZT0id2lkdGg6JyArIHBjdCArICclOyI+PC9kaXY+PC9kaXY+JyArCiAgICAgICAgICAgICAg -ICAgICAgJzxzcGFuIGNsYXNzPSJjb250cmlidXRvci1wY3QiPicgKyBwY3QgKyAnJTwvc3Bhbj4n -ICsKICAgICAgICAgICAgICAgICc8L2Rpdj4nOwogICAgICAgICAgICB9KTsKICAgICAgICBodG1s -ICs9ICc8L2Rpdj4nOwogICAgICAgIHJldHVybiBodG1sOwogICAgfSwKCiAgICByZW5kZXJSZXZp -ZXdIaXN0b3J5KGRvYykgewogICAgICAgIC8vIFBydWVmdW5nc3ZlcmxhdWYgbnVyIGZ1ZXIgU1Us -IEZBIHVuZCB6dXN0YWVuZGlnZSBSZXZpZXdlciBhbnplaWdlbgogICAgICAgIGlmICghRHJpdmVH -b3Zlcm5hbmNlLmlzU3VwZXJVc2VyKCkgJiYgIURyaXZlR292ZXJuYW5jZS5pc0ZhY2hhdWZzaWNo -dCgpICYmICFEcml2ZUdvdmVybmFuY2UuaXNSZXZpZXdlcihkb2Mua2F0ZWdvcmllKSkgcmV0dXJu -ICcnOwoKICAgICAgICBjb25zdCBnb3YgPSBkb2MuZ292ZXJuYW5jZTsKICAgICAgICBpZiAoIWdv -diB8fCAhZ292LnJldmlld0hpc3RvcnkgfHwgZ292LnJldmlld0hpc3RvcnkubGVuZ3RoID09PSAw -KSByZXR1cm4gJyc7CgogICAgICAgIGxldCBodG1sID0gJzxkaXYgY2xhc3M9InJldmlldy1oaXN0 -b3J5Ij48aDM+UHLDvGZ1bmdzdmVybGF1ZjwvaDM+JzsKICAgICAgICBnb3YucmV2aWV3SGlzdG9y -eS5zbGljZSgpLnJldmVyc2UoKS5mb3JFYWNoKGZ1bmN0aW9uKGVudHJ5LCBpZHgpIHsKICAgICAg -ICAgICAgdmFyIGFjdGlvbkxhYmVsID0gZW50cnkuYWN0aW9uID09PSAnYXBwcm92ZWQnID8gJ0Zy -ZWlnZWdlYmVuJyA6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cnkuYWN0aW9u -ID09PSAncmVqZWN0ZWQnID8gJ0FiZ2VsZWhudCcgOgogICAgICAgICAgICAgICAgICAgICAgICAg -ICAgICAgIGVudHJ5LmFjdGlvbiA9PT0gJ3N1Ym1pdHRlZCcgPyAnWnVyIFByw7xmdW5nJyA6IGVu -dHJ5LmFjdGlvbjsKICAgICAgICAgICAgdmFyIGRhdGUgPSBmb3JtYXREYXRlVGltZShlbnRyeS5h -dCk7CiAgICAgICAgICAgIHZhciBjb21tZW50SHRtbCA9ICcnOwogICAgICAgICAgICBpZiAoZW50 -cnkuY29tbWVudCkgewogICAgICAgICAgICAgICAgLy8gS29tbWVudGFyIGFscyBzaWNoZXJlcyBI -VE1MIHJlbmRlcm4gKGVybGF1YnQ6IGIsIGksIHUsIHVsLCBsaSwgYnIsIGZvbnQpCiAgICAgICAg -ICAgICAgICAvLyBBbGxlcyBhbmRlcmU6IFRhZ3MgYWxzIGdlcmVuZGVydGVuIFRleHQgemVpZ2Vu -CiAgICAgICAgICAgICAgICB2YXIgc2FmZUNvbW1lbnQgPSBlbnRyeS5jb21tZW50OwogICAgICAg -ICAgICAgICAgLy8gRmFsbHMgZGVyIEtvbW1lbnRhciByYXctSFRNTC1UYWdzIGFscyBUZXh0IGVu -dGhhZWx0IChhbHRlIEVpbnRyYWVnZSksIGVzY2FwZW4KICAgICAgICAgICAgICAgIGlmIChzYWZl -Q29tbWVudC5pbmRleE9mKCc8c3BhbiBzdHlsZT0nKSA+PSAwIHx8IHNhZmVDb21tZW50LmluZGV4 -T2YoJzxkaXYnKSA+PSAwIHx8IHNhZmVDb21tZW50LmluZGV4T2YoJzxhIGhyZWY9JykgPj0gMCkg -ewogICAgICAgICAgICAgICAgICAgIC8vIEFsdGVzIHVuc2FuaXRpZXJ0ZXMgSFRNTDogQWxzIEts -YXJ0ZXh0IGRhcnN0ZWxsZW4KICAgICAgICAgICAgICAgICAgICB2YXIgdG1wRGl2ID0gZG9jdW1l -bnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CiAgICAgICAgICAgICAgICAgICAgdG1wRGl2LmlubmVy -SFRNTCA9IHNhZmVDb21tZW50OwogICAgICAgICAgICAgICAgICAgIHNhZmVDb21tZW50ID0gRHJp -dmVQb3J0YWwuZXNjYXBlSFRNTCh0bXBEaXYudGV4dENvbnRlbnQpOwogICAgICAgICAgICAgICAg -fQogICAgICAgICAgICAgICAgdmFyIHVpZCA9ICdyY18nICsgaWR4OwogICAgICAgICAgICAgICAg -Y29tbWVudEh0bWwgPSAnPGRpdiBzdHlsZT0iZmxleC1iYXNpczoxMDAlO21hcmdpbi10b3A6NHB4 -OyI+JyArCiAgICAgICAgICAgICAgICAgICAgJzxkaXYgaWQ9IicgKyB1aWQgKyAnIiBzdHlsZT0i -YmFja2dyb3VuZDp2YXIoLS1iZy1jYXJkLWFsdCk7cGFkZGluZzowIDEwcHg7Ym9yZGVyLXJhZGl1 -czo0cHg7Ym9yZGVyLWxlZnQ6M3B4IHNvbGlkICNkYzM1NDU7Zm9udC1zaXplOjEycHg7Y29sb3I6 -dmFyKC0tdGV4dC1wcmltYXJ5KTtoZWlnaHQ6MjhweDtsaW5lLWhlaWdodDoyOHB4O292ZXJmbG93 -OmhpZGRlbjtjdXJzb3I6cG9pbnRlcjt0cmFuc2l0aW9uOmhlaWdodCAwLjNzO3doaXRlLXNwYWNl -Om5vd3JhcDt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzOyIgb25jbGljaz0idmFyIGVsPWRvY3VtZW50 -LmdldEVsZW1lbnRCeUlkKFwnJyArIHVpZCArICdcJyk7aWYoZWwuc3R5bGUuaGVpZ2h0PT09XCdh -dXRvXCcpe2VsLnN0eWxlLmhlaWdodD1cJzI4cHhcJztlbC5zdHlsZS5saW5lSGVpZ2h0PVwnMjhw -eFwnO2VsLnN0eWxlLndoaXRlU3BhY2U9XCdub3dyYXBcJztlbC5zdHlsZS5wYWRkaW5nPVwnMCAx -MHB4XCc7fWVsc2V7ZWwuc3R5bGUuaGVpZ2h0PVwnYXV0b1wnO2VsLnN0eWxlLmxpbmVIZWlnaHQ9 -XCcxLjVcJztlbC5zdHlsZS53aGl0ZVNwYWNlPVwnbm9ybWFsXCc7ZWwuc3R5bGUucGFkZGluZz1c -JzhweCAxMHB4XCc7fSIgdGl0bGU9IktsaWNrZSB6dW0gQXVmLS9adWtsYXBwZW4iPicgKwogICAg -ICAgICAgICAgICAgICAgICAgICBzYWZlQ29tbWVudCArCiAgICAgICAgICAgICAgICAgICAgJzwv -ZGl2PicgKwogICAgICAgICAgICAgICAgJzwvZGl2Pic7CiAgICAgICAgICAgIH0KICAgICAgICAg -ICAgaHRtbCArPSAnPGRpdiBjbGFzcz0icmV2aWV3LWhpc3RvcnktaXRlbSIgc3R5bGU9ImZsZXgt -d3JhcDp3cmFwOyI+JyArCiAgICAgICAgICAgICAgICAnPHNwYW4gY2xhc3M9ImFjdGlvbi1iYWRn -ZSAnICsgZW50cnkuYWN0aW9uICsgJyI+JyArIGFjdGlvbkxhYmVsICsgJzwvc3Bhbj4nICsKICAg -ICAgICAgICAgICAgICc8c3BhbiBzdHlsZT0iY29sb3I6dmFyKC0tdGV4dC1zZWNvbmRhcnkpOyI+ -JyArIERyaXZlUG9ydGFsLmVzY2FwZUhUTUwoZW50cnkuYnkgfHwgJy0nKSArICc8L3NwYW4+JyAr -CiAgICAgICAgICAgICAgICAnPHNwYW4gc3R5bGU9ImNvbG9yOnZhcigtLXRleHQtbXV0ZWQpOyI+ -JyArIGRhdGUgKyAnPC9zcGFuPicgKwogICAgICAgICAgICAgICAgY29tbWVudEh0bWwgKwogICAg -ICAgICAgICAnPC9kaXY+JzsKICAgICAgICB9KTsKICAgICAgICByZXR1cm4gaHRtbCArICc8L2Rp -dj4nOwogICAgfSwKCiAgICBfZGVsZXRlRG9jSWQ6IG51bGwsCgogICAgYXN5bmMgZGVsZXRlRG9j -dW1lbnQoZG9jSWQpIHsKICAgICAgICBpZiAoRHJpdmVGUy5yZWFkT25seSkgewogICAgICAgICAg -ICB2YXIgZ3JhbnRlZCA9IGF3YWl0IERyaXZlRlMuZW5zdXJlV3JpdGVBY2Nlc3MoKTsKICAgICAg -ICAgICAgaWYgKCFncmFudGVkKSByZXR1cm47CiAgICAgICAgfQogICAgICAgIHZhciBkb2MgPSBE -cml2ZUZTLmRvY3VtZW50cy5maW5kKGZ1bmN0aW9uKGQpeyByZXR1cm4gZC5pZCA9PT0gZG9jSWQ7 -IH0pOwogICAgICAgIGlmICghZG9jKSByZXR1cm47CiAgICAgICAgdGhpcy5fZGVsZXRlRG9jSWQg -PSBkb2NJZDsKICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGVsZXRlQ29uZmlybVRl -eHQnKS50ZXh0Q29udGVudCA9ICdEb2t1bWVudDog4oCeJyArIGRvYy50aXRlbCArICciICgnICsg -ZG9jLmthdGVnb3JpZSArICcpJzsKICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGVs -ZXRlQ29uZmlybUlucHV0JykudmFsdWUgPSAnJzsKICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50 -QnlJZCgnZGVsZXRlQ29uZmlybUJ0bicpLmRpc2FibGVkID0gdHJ1ZTsKICAgICAgICBkb2N1bWVu -dC5nZXRFbGVtZW50QnlJZCgnZGVsZXRlQ29uZmlybU1vZGFsJykuY2xhc3NMaXN0LmFkZCgnYWN0 -aXZlJyk7CiAgICAgICAgdmFyIGlucHV0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RlbGV0 -ZUNvbmZpcm1JbnB1dCcpOwogICAgICAgIGlucHV0LmZvY3VzKCk7CiAgICAgICAgaW5wdXQub25p -bnB1dCA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgn -ZGVsZXRlQ29uZmlybUJ0bicpLmRpc2FibGVkID0gIWlucHV0LnZhbHVlLnRyaW0oKTsKICAgICAg -ICB9OwogICAgfSwKCiAgICBjYW5jZWxEZWxldGUoKSB7CiAgICAgICAgdGhpcy5fZGVsZXRlRG9j -SWQgPSBudWxsOwogICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkZWxldGVDb25maXJt -TW9kYWwnKS5jbGFzc0xpc3QucmVtb3ZlKCdhY3RpdmUnKTsKICAgIH0sCgogICAgYXN5bmMgY29u -ZmlybURlbGV0ZSgpIHsKICAgICAgICB2YXIgZG9jSWQgPSB0aGlzLl9kZWxldGVEb2NJZDsKICAg -ICAgICBpZiAoIWRvY0lkKSByZXR1cm47CiAgICAgICAgdmFyIG53S2VubnVuZyA9IGRvY3VtZW50 -LmdldEVsZW1lbnRCeUlkKCdkZWxldGVDb25maXJtSW5wdXQnKS52YWx1ZS50cmltKCk7CiAgICAg -ICAgaWYgKCFud0tlbm51bmcpIHsgc2hvd1RvYXN0KCdCaXR0ZSBOVy1LZW5udW5nIGVpbmdlYmVu -JywgJ3dhcm5pbmcnKTsgcmV0dXJuOyB9CgogICAgICAgIHZhciBkb2MgPSBEcml2ZUZTLmRvY3Vt +ZXh0LXNlY29uZGFyeSk7ZGlzcGxheTpibG9jazttYXJnaW4tYm90dG9tOjRweDsiPk5XLUtlbm51 +bmcgenVyIEJlc3TDpHRpZ3VuZzwvbGFiZWw+JyArCiAgICAgICAgICAgICAgICAnPGlucHV0IHR5 +cGU9InRleHQiIGlkPSJidWxrRGVsZXRlTlciIHBsYWNlaG9sZGVyPSJOVy1LZW5udW5nIGVpbmdl +YmVuLi4uIiBzdHlsZT0id2lkdGg6MTAwJTtwYWRkaW5nOjhweCAxMHB4O2JvcmRlcjoxcHggc29s +aWQgdmFyKC0tYm9yZGVyLWNvbG9yKTtib3JkZXItcmFkaXVzOjRweDtmb250LXNpemU6MTRweDti +YWNrZ3JvdW5kOnZhcigtLWJnLWlucHV0KTtjb2xvcjp2YXIoLS10ZXh0LXByaW1hcnkpO21hcmdp +bi1ib3R0b206MTRweDsiPicgKwogICAgICAgICAgICAgICAgJzxkaXYgc3R5bGU9ImRpc3BsYXk6 +ZmxleDtnYXA6OHB4O2p1c3RpZnktY29udGVudDpmbGV4LWVuZDsiPicgKwogICAgICAgICAgICAg +ICAgICAgICc8YnV0dG9uIG9uY2xpY2s9InRoaXMuY2xvc2VzdChcJ2RpdltzdHlsZV1cJykucGFy +ZW50RWxlbWVudC5yZW1vdmUoKSIgc3R5bGU9InBhZGRpbmc6OHB4IDE2cHg7Ym9yZGVyLXJhZGl1 +czo0cHg7Ym9yZGVyOjFweCBzb2xpZCB2YXIoLS1ib3JkZXItY29sb3IpO2JhY2tncm91bmQ6dmFy +KC0tYmctY2FyZCk7Y29sb3I6dmFyKC0tdGV4dC1wcmltYXJ5KTtjdXJzb3I6cG9pbnRlcjsiPkFi +YnJlY2hlbjwvYnV0dG9uPicgKwogICAgICAgICAgICAgICAgICAgICc8YnV0dG9uIG9uY2xpY2s9 +IkRyaXZlUG9ydGFsLl9jb25maXJtQnVsa0RlbGV0ZSgpIiBzdHlsZT0icGFkZGluZzo4cHggMTZw +eDtib3JkZXItcmFkaXVzOjRweDtib3JkZXI6bm9uZTtiYWNrZ3JvdW5kOiNkYzM1NDU7Y29sb3I6 +d2hpdGU7Y3Vyc29yOnBvaW50ZXI7Zm9udC13ZWlnaHQ6NjAwOyI+TMO2c2NoZW48L2J1dHRvbj4n +ICsKICAgICAgICAgICAgICAgICc8L2Rpdj4nICsKICAgICAgICAgICAgJzwvZGl2Pic7CiAgICAg +ICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChtb2RhbCk7CiAgICAgICAgc2V0VGltZW91dChm +dW5jdGlvbigpIHsgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2J1bGtEZWxldGVOVycpLmZvY3Vz +KCk7IH0sIDUwKTsKICAgIH0sCgogICAgcXVpY2tFZGl0U2luZ2xlKGRvY0lkKSB7CiAgICAgICAg +dmFyIGRvYyA9IERyaXZlRlMuZG9jdW1lbnRzLmZpbmQoZnVuY3Rpb24oZCkgeyByZXR1cm4gZC5p +ZCA9PT0gZG9jSWQ7IH0pOwogICAgICAgIGlmICghZG9jKSByZXR1cm47CiAgICAgICAgdmFyIGth +dGVnb3JpZW4gPSBEcml2ZUZTLmNvbmZpZy5rYXRlZ29yaWVuIHx8IFtdOwogICAgICAgIHZhciBz +dGF0dXNMaXN0ID0gT2JqZWN0LmtleXMoRHJpdmVGUy5jb25maWcuc3RhdHVzIHx8IHt9KTsKICAg +ICAgICB2YXIgaW5wdXRTdHlsZSA9ICd3aWR0aDoxMDAlO3BhZGRpbmc6NnB4IDEwcHg7Ym9yZGVy +OjFweCBzb2xpZCB2YXIoLS1ib3JkZXItY29sb3IpO2JvcmRlci1yYWRpdXM6NHB4O2ZvbnQtc2l6 +ZToxM3B4O2JhY2tncm91bmQ6dmFyKC0tYmctaW5wdXQpO2NvbG9yOnZhcigtLXRleHQtcHJpbWFy +eSk7JzsKCiAgICAgICAgdmFyIG1vZGFsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7 +CiAgICAgICAgbW9kYWwuc3R5bGUuY3NzVGV4dCA9ICdwb3NpdGlvbjpmaXhlZDt0b3A6MDtsZWZ0 +OjA7d2lkdGg6MTAwJTtoZWlnaHQ6MTAwJTtiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsMC41KTt6LWlu +ZGV4OjEwNTAwO2Rpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpjZW50ZXI7anVzdGlmeS1jb250ZW50 +OmNlbnRlcjsnOwogICAgICAgIG1vZGFsLm9uY2xpY2sgPSBmdW5jdGlvbihlKSB7IGlmIChlLnRh +cmdldCA9PT0gbW9kYWwpIG1vZGFsLnJlbW92ZSgpOyB9OwoKICAgICAgICB2YXIgaHRtbCA9ICc8 +ZGl2IHN0eWxlPSJiYWNrZ3JvdW5kOnZhcigtLWJnLWNhcmQpO2JvcmRlci1yYWRpdXM6MTBweDtw +YWRkaW5nOjIwcHggMjRweDttYXgtd2lkdGg6NDgwcHg7d2lkdGg6OTAlO2JveC1zaGFkb3c6MCA4 +cHggMzJweCByZ2JhKDAsMCwwLDAuMyk7Ij4nICsKICAgICAgICAgICAgJzxoMyBzdHlsZT0iY29s +b3I6dmFyKC0tdGV4dC1oZWFkaW5nKTttYXJnaW4tYm90dG9tOjE0cHg7Ij5TY2huZWxsYmVhcmJl +aXR1bmc8L2gzPicgKwoKICAgICAgICAgICAgJzxkaXYgc3R5bGU9Im1hcmdpbi1ib3R0b206OHB4 +OyI+PGxhYmVsIHN0eWxlPSJmb250LXNpemU6MTJweDtmb250LXdlaWdodDo2MDA7Y29sb3I6dmFy +KC0tdGV4dC1zZWNvbmRhcnkpO2Rpc3BsYXk6YmxvY2s7bWFyZ2luLWJvdHRvbTozcHg7Ij5UaXRl +bDwvbGFiZWw+JyArCiAgICAgICAgICAgICc8aW5wdXQgdHlwZT0idGV4dCIgaWQ9InNxZVRpdGVs +IiB2YWx1ZT0iJyArIERyaXZlUG9ydGFsLmVzY2FwZUF0dHIoZG9jLnRpdGVsKSArICciIHN0eWxl +PSInICsgaW5wdXRTdHlsZSArICciPjwvZGl2PicgKwoKICAgICAgICAgICAgJzxkaXYgc3R5bGU9 +ImRpc3BsYXk6Z3JpZDtncmlkLXRlbXBsYXRlLWNvbHVtbnM6MWZyIDFmcjtnYXA6OHB4O21hcmdp +bi1ib3R0b206OHB4OyI+JyArCiAgICAgICAgICAgICAgICAnPGRpdj48bGFiZWwgc3R5bGU9ImZv +bnQtc2l6ZToxMnB4O2ZvbnQtd2VpZ2h0OjYwMDtjb2xvcjp2YXIoLS10ZXh0LXNlY29uZGFyeSk7 +ZGlzcGxheTpibG9jazttYXJnaW4tYm90dG9tOjNweDsiPkthdGVnb3JpZTwvbGFiZWw+JyArCiAg +ICAgICAgICAgICAgICAnPHNlbGVjdCBpZD0ic3FlS2F0ZWdvcmllIiBzdHlsZT0iJyArIGlucHV0 +U3R5bGUgKyAnIj4nOwogICAgICAgIGthdGVnb3JpZW4uZm9yRWFjaChmdW5jdGlvbihrKSB7IGh0 +bWwgKz0gJzxvcHRpb24gdmFsdWU9IicgKyBEcml2ZVBvcnRhbC5lc2NhcGVBdHRyKGspICsgJyIn +ICsgKGsgPT09IGRvYy5rYXRlZ29yaWUgPyAnIHNlbGVjdGVkJyA6ICcnKSArICc+JyArIERyaXZl +UG9ydGFsLmVzY2FwZUhUTUwoaykgKyAnPC9vcHRpb24+JzsgfSk7CiAgICAgICAgaHRtbCArPSAn +PC9zZWxlY3Q+PC9kaXY+JyArCiAgICAgICAgICAgICAgICAnPGRpdj48bGFiZWwgc3R5bGU9ImZv +bnQtc2l6ZToxMnB4O2ZvbnQtd2VpZ2h0OjYwMDtjb2xvcjp2YXIoLS10ZXh0LXNlY29uZGFyeSk7 +ZGlzcGxheTpibG9jazttYXJnaW4tYm90dG9tOjNweDsiPlN0YXR1czwvbGFiZWw+JyArCiAgICAg +ICAgICAgICAgICAnPHNlbGVjdCBpZD0ic3FlU3RhdHVzIiBzdHlsZT0iJyArIGlucHV0U3R5bGUg +KyAnIj4nOwogICAgICAgIHN0YXR1c0xpc3QuZm9yRWFjaChmdW5jdGlvbihzKSB7IGh0bWwgKz0g +JzxvcHRpb24gdmFsdWU9IicgKyBEcml2ZVBvcnRhbC5lc2NhcGVBdHRyKHMpICsgJyInICsgKHMg +PT09IGRvYy5zdGF0dXMgPyAnIHNlbGVjdGVkJyA6ICcnKSArICc+JyArIERyaXZlUG9ydGFsLmVz +Y2FwZUhUTUwocykgKyAnPC9vcHRpb24+JzsgfSk7CiAgICAgICAgaHRtbCArPSAnPC9zZWxlY3Q+ +PC9kaXY+PC9kaXY+JyArCgogICAgICAgICAgICAnPGRpdiBzdHlsZT0iZGlzcGxheTpncmlkO2dy +aWQtdGVtcGxhdGUtY29sdW1uczoxZnIgMWZyO2dhcDo4cHg7bWFyZ2luLWJvdHRvbTo4cHg7Ij4n +ICsKICAgICAgICAgICAgICAgICc8ZGl2PjxsYWJlbCBzdHlsZT0iZm9udC1zaXplOjEycHg7Zm9u +dC13ZWlnaHQ6NjAwO2NvbG9yOnZhcigtLXRleHQtc2Vjb25kYXJ5KTtkaXNwbGF5OmJsb2NrO21h +cmdpbi1ib3R0b206M3B4OyI+RXJzdGVsbHQgdm9uPC9sYWJlbD4nICsKICAgICAgICAgICAgICAg +ICc8aW5wdXQgdHlwZT0idGV4dCIgaWQ9InNxZUVyc3RlbGxlciIgdmFsdWU9IicgKyBEcml2ZVBv +cnRhbC5lc2NhcGVBdHRyKGRvYy5lcnN0ZWxsdFZvbiB8fCAnJykgKyAnIiBzdHlsZT0iJyArIGlu +cHV0U3R5bGUgKyAnIj48L2Rpdj4nICsKICAgICAgICAgICAgICAgICc8ZGl2PjxsYWJlbCBzdHls +ZT0iZm9udC1zaXplOjEycHg7Zm9udC13ZWlnaHQ6NjAwO2NvbG9yOnZhcigtLXRleHQtc2Vjb25k +YXJ5KTtkaXNwbGF5OmJsb2NrO21hcmdpbi1ib3R0b206M3B4OyI+VmVyc2lvbjwvbGFiZWw+JyAr +CiAgICAgICAgICAgICAgICAnPGlucHV0IHR5cGU9InRleHQiIGlkPSJzcWVWZXJzaW9uIiB2YWx1 +ZT0iJyArIERyaXZlUG9ydGFsLmVzY2FwZUF0dHIoZG9jLnZlcnNpb24gfHwgJycpICsgJyIgc3R5 +bGU9IicgKyBpbnB1dFN0eWxlICsgJyI+PC9kaXY+JyArCiAgICAgICAgICAgICc8L2Rpdj4nICsK +CiAgICAgICAgICAgICc8ZGl2IHN0eWxlPSJkaXNwbGF5OmZsZXg7Z2FwOjhweDtqdXN0aWZ5LWNv +bnRlbnQ6ZmxleC1lbmQ7bWFyZ2luLXRvcDoxNHB4OyI+JyArCiAgICAgICAgICAgICAgICAnPGJ1 +dHRvbiBvbmNsaWNrPSJ0aGlzLmNsb3Nlc3QoXCdkaXZbc3R5bGVdXCcpLnBhcmVudEVsZW1lbnQu +cmVtb3ZlKCkiIHN0eWxlPSJwYWRkaW5nOjhweCAxNnB4O2JvcmRlci1yYWRpdXM6NHB4O2JvcmRl +cjoxcHggc29saWQgdmFyKC0tYm9yZGVyLWNvbG9yKTtiYWNrZ3JvdW5kOnZhcigtLWJnLWNhcmQp +O2NvbG9yOnZhcigtLXRleHQtcHJpbWFyeSk7Y3Vyc29yOnBvaW50ZXI7Ij5BYmJyZWNoZW48L2J1 +dHRvbj4nICsKICAgICAgICAgICAgICAgICc8YnV0dG9uIG9uY2xpY2s9IkRyaXZlUG9ydGFsLl9j +b25maXJtU2luZ2xlRWRpdChcJycgKyBEcml2ZVBvcnRhbC5lc2NhcGVBdHRyKGRvY0lkKSArICdc +JykiIHN0eWxlPSJwYWRkaW5nOjhweCAxNnB4O2JvcmRlci1yYWRpdXM6NHB4O2JvcmRlcjpub25l +O2JhY2tncm91bmQ6dmFyKC0tdGV4dC1oZWFkaW5nKTtjb2xvcjp3aGl0ZTtjdXJzb3I6cG9pbnRl +cjtmb250LXdlaWdodDo2MDA7Ij5TcGVpY2hlcm48L2J1dHRvbj4nICsKICAgICAgICAgICAgJzwv +ZGl2PjwvZGl2Pic7CgogICAgICAgIG1vZGFsLmlubmVySFRNTCA9IGh0bWw7CiAgICAgICAgZG9j +dW1lbnQuYm9keS5hcHBlbmRDaGlsZChtb2RhbCk7CiAgICAgICAgc2V0VGltZW91dChmdW5jdGlv +bigpIHsgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NxZVRpdGVsJykuZm9jdXMoKTsgfSwgNTAp +OwogICAgfSwKCiAgICBhc3luYyBfY29uZmlybVNpbmdsZUVkaXQoZG9jSWQpIHsKICAgICAgICB2 +YXIgZG9jID0gRHJpdmVGUy5kb2N1bWVudHMuZmluZChmdW5jdGlvbihkKSB7IHJldHVybiBkLmlk +ID09PSBkb2NJZDsgfSk7CiAgICAgICAgaWYgKCFkb2MpIHJldHVybjsKCiAgICAgICAgZG9jLnRp +dGVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NxZVRpdGVsJykudmFsdWUudHJpbSgpIHx8 +IGRvYy50aXRlbDsKICAgICAgICBkb2Mua2F0ZWdvcmllID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5 +SWQoJ3NxZUthdGVnb3JpZScpLnZhbHVlOwogICAgICAgIHZhciBuZXdTdGF0dXMgPSBkb2N1bWVu +dC5nZXRFbGVtZW50QnlJZCgnc3FlU3RhdHVzJykudmFsdWU7CiAgICAgICAgaWYgKG5ld1N0YXR1 +cyAhPT0gZG9jLnN0YXR1cykgewogICAgICAgICAgICBkb2MudmVyc2lvbiA9IGNhbGN1bGF0ZVZl +cnNpb24oZG9jLCBkb2MuaW5oYWx0LCBkb2MuaW5oYWx0LCBuZXdTdGF0dXMpOwogICAgICAgICAg +ICBkb2Muc3RhdHVzID0gbmV3U3RhdHVzOwogICAgICAgIH0KICAgICAgICBkb2MuZXJzdGVsbHRW +b24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3FlRXJzdGVsbGVyJykudmFsdWUudHJpbSgp +IHx8IGRvYy5lcnN0ZWxsdFZvbjsKICAgICAgICBkb2MudmVyc2lvbiA9IGRvY3VtZW50LmdldEVs +ZW1lbnRCeUlkKCdzcWVWZXJzaW9uJykudmFsdWUudHJpbSgpIHx8IGRvYy52ZXJzaW9uOwoKICAg +ICAgICAvLyBNb2RhbCBzY2hsaWVzc2VuCiAgICAgICAgdmFyIGVsID0gZG9jdW1lbnQuZ2V0RWxl +bWVudEJ5SWQoJ3NxZVRpdGVsJyk7CiAgICAgICAgaWYgKGVsKSB7IHZhciBtID0gZWw7IHdoaWxl +IChtLnBhcmVudEVsZW1lbnQgIT09IGRvY3VtZW50LmJvZHkpIG0gPSBtLnBhcmVudEVsZW1lbnQ7 +IG0ucmVtb3ZlKCk7IH0KCiAgICAgICAgYXdhaXQgRHJpdmVGUy5zYXZlRG9jdW1lbnQoZG9jKTsK +ICAgICAgICBzaG93VG9hc3QoJ0FydGlrZWwgYWt0dWFsaXNpZXJ0OiAnICsgZG9jLnRpdGVsLCAn +c3VjY2VzcycpOwogICAgICAgIHRoaXMucmVuZGVyKCk7CiAgICAgICAgdGhpcy5yZW5kZXJUYWJs +ZVZpZXcoKTsKICAgIH0sCgogICAgYXN5bmMgX2NvbmZpcm1CdWxrRGVsZXRlKCkgewogICAgICAg +IHZhciBud0lucHV0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2J1bGtEZWxldGVOVycpOwog +ICAgICAgIHZhciBud0tlbm51bmcgPSBud0lucHV0ID8gbndJbnB1dC52YWx1ZS50cmltKCkgOiAn +JzsKICAgICAgICBpZiAoIW53S2VubnVuZykgeyBzaG93VG9hc3QoJ0JpdHRlIE5XLUtlbm51bmcg +ZWluZ2ViZW4nLCAnd2FybmluZycpOyBud0lucHV0LmZvY3VzKCk7IHJldHVybjsgfQoKICAgICAg +ICAvLyBNb2RhbCBzY2hsaWVzc2VuCiAgICAgICAgdmFyIG0gPSBud0lucHV0OyB3aGlsZSAobS5w +YXJlbnRFbGVtZW50ICE9PSBkb2N1bWVudC5ib2R5KSBtID0gbS5wYXJlbnRFbGVtZW50OyBtLnJl +bW92ZSgpOwoKICAgICAgICB2YXIgZGVsZXRlZCA9IDA7CiAgICAgICAgZm9yICh2YXIgaSA9IDA7 +IGkgPCB0aGlzLl90YWJsZVNlbGVjdGVkLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIHZhciBk +b2NJZCA9IHRoaXMuX3RhYmxlU2VsZWN0ZWRbaV07CiAgICAgICAgICAgIHZhciBkb2MgPSBEcml2 +ZUZTLmRvY3VtZW50cy5maW5kKGZ1bmN0aW9uKGQpIHsgcmV0dXJuIGQuaWQgPT09IGRvY0lkOyB9 +KTsKICAgICAgICAgICAgaWYgKCFkb2MpIGNvbnRpbnVlOwoKICAgICAgICAgICAgLy8gSW4gUGFw +aWVya29yYiB2ZXJzY2hpZWJlbgogICAgICAgICAgICB2YXIgdHJhc2ggPSBhd2FpdCB0aGlzLl9s +b2FkVHJhc2goKTsKICAgICAgICAgICAgdHJhc2gucHVzaCh7CiAgICAgICAgICAgICAgICBkb2M6 +IGRvYywKICAgICAgICAgICAgICAgIGRlbGV0ZWRCeTogbndLZW5udW5nLnRyaW0oKSwKICAgICAg +ICAgICAgICAgIGRlbGV0ZWRBdDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLAogICAgICAgICAg +ICAgICAgZXhwaXJlc0F0OiBuZXcgRGF0ZShEYXRlLm5vdygpICsgMjggKiAyNCAqIDYwICogNjAg +KiAxMDAwKS50b0lTT1N0cmluZygpCiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBhd2FpdCB0 +aGlzLl9zYXZlVHJhc2godHJhc2gpOwoKICAgICAgICAgICAgLy8gQXVkaXQtTG9nCiAgICAgICAg +ICAgIGF3YWl0IHRoaXMuX2FwcGVuZERlbGV0ZUxvZyh7CiAgICAgICAgICAgICAgICBkb2NJZDog +ZG9jLmlkLAogICAgICAgICAgICAgICAgdGl0ZWw6IGRvYy50aXRlbCwKICAgICAgICAgICAgICAg +IGthdGVnb3JpZTogZG9jLmthdGVnb3JpZSwKICAgICAgICAgICAgICAgIGRlbGV0ZWRCeTogbndL +ZW5udW5nLnRyaW0oKSwKICAgICAgICAgICAgICAgIGRlbGV0ZWRBdDogbmV3IERhdGUoKS50b0lT +T1N0cmluZygpCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgLy8gRGF0ZWkgbG9lc2NoZW4g +KyBNZWRpZW4tT3JkbmVyCiAgICAgICAgICAgIHZhciBwYXRoID0gRHJpdmVGUy5maWxlVGltZXN0 +YW1wc1tkb2NJZF0gPyBEcml2ZUZTLmZpbGVUaW1lc3RhbXBzW2RvY0lkXS5wYXRoIDogbnVsbDsK +ICAgICAgICAgICAgaWYgKHBhdGgpIGF3YWl0IERyaXZlRlMuZGVsZXRlRmlsZShwYXRoKTsKCiAg +ICAgICAgICAgIC8vIE1lZGllbi1PcmRuZXIgdmVyc2NoaWViZW4gKFNlcnZlci1Nb2R1cykKICAg +ICAgICAgICAgaWYgKERyaXZlRlMubW9kZSA9PT0gJ3NlcnZlcicpIHsKICAgICAgICAgICAgICAg +IHRyeSB7CiAgICAgICAgICAgICAgICAgICAgLy8gTWVkaWVuIGJsZWliZW4gaW0gbWVkaWEvLU9y +ZG5lciBlcmhhbHRlbiAoUGFwaWVya29yYi1XaWVkZXJoZXJzdGVsbHVuZykKICAgICAgICAgICAg +ICAgIH0gY2F0Y2goZSkge30KICAgICAgICAgICAgfQoKICAgICAgICAgICAgRHJpdmVGUy5kb2N1 +bWVudHMgPSBEcml2ZUZTLmRvY3VtZW50cy5maWx0ZXIoZnVuY3Rpb24oZCkgeyByZXR1cm4gZC5p +ZCAhPT0gZG9jSWQ7IH0pOwogICAgICAgICAgICBkZWxldGVkKys7CiAgICAgICAgfQoKICAgICAg +ICBhd2FpdCBEcml2ZUZTLnVwZGF0ZUluZGV4KCk7CiAgICAgICAgc2hvd1RvYXN0KGRlbGV0ZWQg +KyAnIEFydGlrZWwgaW4gZGVuIFBhcGllcmtvcmIgdmVyc2Nob2JlbicsICdzdWNjZXNzJyk7CiAg +ICAgICAgdGhpcy5fdGFibGVTZWxlY3RlZCA9IFtdOwogICAgICAgIHRoaXMucmVuZGVyKCk7CiAg +ICAgICAgdGhpcy5yZW5kZXJUYWJsZVZpZXcoKTsKICAgIH0sCgogICAgc2hvd0hvbWUoKSB7CiAg +ICAgICAgdGhpcy5zZWxlY3RlZERvY0lkID0gbnVsbDsKICAgICAgICAvLyBTdGFydHNlaXRlIHdp +ZWRlcmhlcnN0ZWxsZW4KICAgICAgICBpZiAodGhpcy5fd2VsY29tZUhUTUwpIHsKICAgICAgICAg +ICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RvY3VtZW50RGV0YWlsJykuaW5uZXJIVE1MID0g +dGhpcy5fd2VsY29tZUhUTUw7CiAgICAgICAgfQogICAgICAgIC8vIEFrdGl2ZXMgRWxlbWVudCBp +biBkZXIgTGlzdGUgYWJ3YWVobGVuCiAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgn +LmRvY3VtZW50LWl0ZW0uYWN0aXZlJykuZm9yRWFjaChmdW5jdGlvbihlbCkgeyBlbC5jbGFzc0xp +c3QucmVtb3ZlKCdhY3RpdmUnKTsgfSk7CiAgICB9LAoKICAgIF9kaWZmVmlzaWJsZTogZmFsc2Us +CgogICAgdG9nZ2xlRGlmZihkb2NJZCkgewogICAgICAgIHZhciBkb2MgPSBEcml2ZUZTLmRvY3Vt ZW50cy5maW5kKGZ1bmN0aW9uKGQpeyByZXR1cm4gZC5pZCA9PT0gZG9jSWQ7IH0pOwogICAgICAg -IGlmICghZG9jKSByZXR1cm47CgogICAgICAgIC8vIFNvZnQtRGVsZXRlOiBJbiBQYXBpZXJrb3Ji -IHZlcnNjaGllYmVuIHN0YXR0IHBoeXNpc2NoIGzDtnNjaGVuCiAgICAgICAgdmFyIHRyYXNoRW50 -cnkgPSB7CiAgICAgICAgICAgIGRvYzogSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShkb2MpKSwK -ICAgICAgICAgICAgZGVsZXRlZEJ5OiBud0tlbm51bmcsCiAgICAgICAgICAgIGRlbGV0ZWRBdDog -bmV3IERhdGUoKS50b0lTT1N0cmluZygpLAogICAgICAgICAgICBleHBpcmVzQXQ6IG5ldyBEYXRl -KERhdGUubm93KCkgKyAyOCAqIDI0ICogNjAgKiA2MCAqIDEwMDApLnRvSVNPU3RyaW5nKCkKICAg -ICAgICB9OwoKICAgICAgICAvLyBQYXBpZXJrb3JiIGxhZGVuL2Vyc3RlbGxlbgogICAgICAgIHZh -ciB0cmFzaCA9IGF3YWl0IHRoaXMuX2xvYWRUcmFzaCgpOwogICAgICAgIHRyYXNoLnB1c2godHJh -c2hFbnRyeSk7CiAgICAgICAgYXdhaXQgdGhpcy5fc2F2ZVRyYXNoKHRyYXNoKTsKCiAgICAgICAg -Ly8gTMO2c2NoLUxvZwogICAgICAgIHZhciBsb2dFbnRyeSA9IHsgYWN0aW9uOiAnZGVsZXRlJywg -ZG9jSWQ6IGRvY0lkLCB0aXRlbDogZG9jLnRpdGVsLCBrYXRlZ29yaWU6IGRvYy5rYXRlZ29yaWUs -IGRlbGV0ZWRCeTogbndLZW5udW5nLCB0aW1lc3RhbXA6IG5ldyBEYXRlKCkudG9JU09TdHJpbmco -KSB9OwogICAgICAgIGF3YWl0IHRoaXMuX2FwcGVuZERlbGV0ZUxvZyhsb2dFbnRyeSk7CgogICAg -ICAgIC8vIERva3VtZW50IHBoeXNpc2NoIGzDtnNjaGVuCiAgICAgICAgdmFyIHN1Y2Nlc3MgPSBh -d2FpdCBEcml2ZUZTLmRlbGV0ZURvY3VtZW50KGRvY0lkKTsKICAgICAgICBkb2N1bWVudC5nZXRF -bGVtZW50QnlJZCgnZGVsZXRlQ29uZmlybU1vZGFsJykuY2xhc3NMaXN0LnJlbW92ZSgnYWN0aXZl -Jyk7CiAgICAgICAgdGhpcy5fZGVsZXRlRG9jSWQgPSBudWxsOwoKICAgICAgICBpZiAoc3VjY2Vz -cykgewogICAgICAgICAgICB0aGlzLnNlbGVjdGVkRG9jSWQgPSBudWxsOwogICAgICAgICAgICBk -b2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZG9jdW1lbnREZXRhaWwnKS5pbm5lckhUTUwgPSAnPGRp -diBjbGFzcz0iZGV0YWlsLWVtcHR5Ij48cD5Eb2t1bWVudCBnZWzDtnNjaHQuIFfDpGhsZSBlaW4g -YW5kZXJlcyBEb2t1bWVudC48L3A+PC9kaXY+JzsKICAgICAgICAgICAgdGhpcy5yZW5kZXIoKTsK -ICAgICAgICAgICAgc2hvd1RvYXN0KCdEb2t1bWVudCBnZWzDtnNjaHQgKDI4IFRhZ2Ugd2llZGVy -aGVyc3RlbGxiYXIpJywgJ3N1Y2Nlc3MnKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBz -aG93VG9hc3QoJ0ZlaGxlciBiZWltIEzDtnNjaGVuJywgJ2Vycm9yJyk7CiAgICAgICAgfQogICAg -fSwKCiAgICBhc3luYyBfbG9hZFRyYXNoKCkgewogICAgICAgIHRyeSB7CiAgICAgICAgICAgIGlm -IChEcml2ZUZTLm1vZGUgPT09ICdzZXJ2ZXInKSB7CiAgICAgICAgICAgICAgICB2YXIgcmVzID0g -YXdhaXQgZmV0Y2goJy9kYXRhLy50cmFzaC5qc29uJyk7CiAgICAgICAgICAgICAgICBpZiAocmVz -Lm9rKSByZXR1cm4gYXdhaXQgcmVzLmpzb24oKTsKICAgICAgICAgICAgfSBlbHNlIGlmIChEcml2 -ZUZTLm1vZGUgPT09ICdmaWxlc3lzdGVtJyAmJiBEcml2ZUZTLl9kYXRhSGFuZGxlKSB7CiAgICAg -ICAgICAgICAgICB2YXIgZmggPSBhd2FpdCBEcml2ZUZTLl9kYXRhSGFuZGxlLmdldEZpbGVIYW5k -bGUoJy50cmFzaC5qc29uJyk7CiAgICAgICAgICAgICAgICB2YXIgZmlsZSA9IGF3YWl0IGZoLmdl -dEZpbGUoKTsKICAgICAgICAgICAgICAgIHJldHVybiBKU09OLnBhcnNlKGF3YWl0IGZpbGUudGV4 -dCgpKTsKICAgICAgICAgICAgfQogICAgICAgIH0gY2F0Y2goZSkge30KICAgICAgICByZXR1cm4g -W107CiAgICB9LAoKICAgIGFzeW5jIF9zYXZlVHJhc2godHJhc2gpIHsKICAgICAgICAvLyBBYmdl -bGF1ZmVuZSBlbnRmZXJuZW4gKD4yOCBUYWdlKQogICAgICAgIHZhciBub3cgPSBuZXcgRGF0ZSgp -LnRvSVNPU3RyaW5nKCk7CiAgICAgICAgdHJhc2ggPSB0cmFzaC5maWx0ZXIoZnVuY3Rpb24odCl7 -IHJldHVybiB0LmV4cGlyZXNBdCA+IG5vdzsgfSk7CiAgICAgICAgaWYgKERyaXZlRlMubW9kZSA9 -PT0gJ3NlcnZlcicpIHsKICAgICAgICAgICAgYXdhaXQgZmV0Y2goJy9hcGkvd3JpdGUnLCB7IG1l -dGhvZDogJ1BPU1QnLCBoZWFkZXJzOiB7J0NvbnRlbnQtVHlwZSc6J2FwcGxpY2F0aW9uL2pzb247 -IGNoYXJzZXQ9dXRmLTgnfSwKICAgICAgICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsg -cGF0aDogJ2RhdGEvLnRyYXNoLmpzb24nLCBkYXRhOiB0cmFzaCB9KSB9KTsKICAgICAgICB9IGVs -c2UgaWYgKERyaXZlRlMubW9kZSA9PT0gJ2ZpbGVzeXN0ZW0nICYmIERyaXZlRlMuX2RhdGFIYW5k -bGUpIHsKICAgICAgICAgICAgdmFyIGZoID0gYXdhaXQgRHJpdmVGUy5fZGF0YUhhbmRsZS5nZXRG -aWxlSGFuZGxlKCcudHJhc2guanNvbicsIHsgY3JlYXRlOiB0cnVlIH0pOwogICAgICAgICAgICB2 -YXIgd3JpdGFibGUgPSBhd2FpdCBmaC5jcmVhdGVXcml0YWJsZSgpOwogICAgICAgICAgICBhd2Fp -dCB3cml0YWJsZS53cml0ZShKU09OLnN0cmluZ2lmeSh0cmFzaCwgbnVsbCwgMikpOwogICAgICAg -ICAgICBhd2FpdCB3cml0YWJsZS5jbG9zZSgpOwogICAgICAgIH0KICAgIH0sCgogICAgYXN5bmMg -X2FwcGVuZERlbGV0ZUxvZyhlbnRyeSkgewogICAgICAgIHZhciBsb2cgPSBbXTsKICAgICAgICB0 -cnkgewogICAgICAgICAgICBpZiAoRHJpdmVGUy5tb2RlID09PSAnc2VydmVyJykgewogICAgICAg -ICAgICAgICAgdmFyIHJlcyA9IGF3YWl0IGZldGNoKCcvZGF0YS8uZGVsZXRlLWxvZy5qc29uJyk7 -CiAgICAgICAgICAgICAgICBpZiAocmVzLm9rKSBsb2cgPSBhd2FpdCByZXMuanNvbigpOwogICAg -ICAgICAgICB9IGVsc2UgaWYgKERyaXZlRlMubW9kZSA9PT0gJ2ZpbGVzeXN0ZW0nICYmIERyaXZl -RlMuX2RhdGFIYW5kbGUpIHsKICAgICAgICAgICAgICAgIHZhciBmaCA9IGF3YWl0IERyaXZlRlMu -X2RhdGFIYW5kbGUuZ2V0RmlsZUhhbmRsZSgnLmRlbGV0ZS1sb2cuanNvbicpOwogICAgICAgICAg -ICAgICAgdmFyIGZpbGUgPSBhd2FpdCBmaC5nZXRGaWxlKCk7CiAgICAgICAgICAgICAgICBsb2cg -PSBKU09OLnBhcnNlKGF3YWl0IGZpbGUudGV4dCgpKTsKICAgICAgICAgICAgfQogICAgICAgIH0g -Y2F0Y2goZSkge30KICAgICAgICBsb2cucHVzaChlbnRyeSk7CiAgICAgICAgaWYgKERyaXZlRlMu -bW9kZSA9PT0gJ3NlcnZlcicpIHsKICAgICAgICAgICAgYXdhaXQgZmV0Y2goJy9hcGkvd3JpdGUn -LCB7IG1ldGhvZDogJ1BPU1QnLCBoZWFkZXJzOiB7J0NvbnRlbnQtVHlwZSc6J2FwcGxpY2F0aW9u -L2pzb247IGNoYXJzZXQ9dXRmLTgnfSwKICAgICAgICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5n -aWZ5KHsgcGF0aDogJ2RhdGEvLmRlbGV0ZS1sb2cuanNvbicsIGRhdGE6IGxvZyB9KSB9KTsKICAg -ICAgICB9IGVsc2UgaWYgKERyaXZlRlMubW9kZSA9PT0gJ2ZpbGVzeXN0ZW0nICYmIERyaXZlRlMu -X2RhdGFIYW5kbGUpIHsKICAgICAgICAgICAgdmFyIGZoMiA9IGF3YWl0IERyaXZlRlMuX2RhdGFI -YW5kbGUuZ2V0RmlsZUhhbmRsZSgnLmRlbGV0ZS1sb2cuanNvbicsIHsgY3JlYXRlOiB0cnVlIH0p -OwogICAgICAgICAgICB2YXIgd3JpdGFibGUgPSBhd2FpdCBmaDIuY3JlYXRlV3JpdGFibGUoKTsK -ICAgICAgICAgICAgYXdhaXQgd3JpdGFibGUud3JpdGUoSlNPTi5zdHJpbmdpZnkobG9nLCBudWxs -LCAyKSk7CiAgICAgICAgICAgIGF3YWl0IHdyaXRhYmxlLmNsb3NlKCk7CiAgICAgICAgfQogICAg -fSwKCiAgICBhc3luYyBzaG93VHJhc2goKSB7CiAgICAgICAgdmFyIHRyYXNoID0gYXdhaXQgdGhp -cy5fbG9hZFRyYXNoKCk7CiAgICAgICAgdmFyIG5vdyA9IG5ldyBEYXRlKCkudG9JU09TdHJpbmco -KTsKICAgICAgICB0cmFzaCA9IHRyYXNoLmZpbHRlcihmdW5jdGlvbih0KXsgcmV0dXJuIHQuZXhw -aXJlc0F0ID4gbm93OyB9KTsKICAgICAgICB2YXIgaHRtbCA9ICcnOwogICAgICAgIGlmICh0cmFz -aC5sZW5ndGggPT09IDApIHsKICAgICAgICAgICAgaHRtbCA9ICc8ZGl2IGNsYXNzPSJnb3YtZW1w -dHkiPlBhcGllcmtvcmIgaXN0IGxlZXI8L2Rpdj4nOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAg -ICAgIHRyYXNoLmZvckVhY2goZnVuY3Rpb24odCwgaSkgewogICAgICAgICAgICAgICAgdmFyIGRh -eXNMZWZ0ID0gTWF0aC5jZWlsKChuZXcgRGF0ZSh0LmV4cGlyZXNBdCkgLSBuZXcgRGF0ZSgpKSAv -ICgyNCo2MCo2MCoxMDAwKSk7CiAgICAgICAgICAgICAgICBodG1sICs9ICc8ZGl2IGNsYXNzPSJ0 -cmFzaC1pdGVtIj4nICsKICAgICAgICAgICAgICAgICAgICAnPGRpdiBjbGFzcz0idHJhc2gtaXRl -bS10aXRsZSI+JyArIERyaXZlUG9ydGFsLmVzY2FwZUhUTUwodC5kb2MudGl0ZWwpICsgJzwvZGl2 -PicgKwogICAgICAgICAgICAgICAgICAgICc8ZGl2IGNsYXNzPSJ0cmFzaC1pdGVtLW1ldGEiPkdl -bMO2c2NodCB2b24gJyArIERyaXZlUG9ydGFsLmVzY2FwZUhUTUwodC5kZWxldGVkQnkpICsgJyBh -bSAnICsgZm9ybWF0RGF0ZVRpbWUodC5kZWxldGVkQXQpICsgJyB8IE5vY2ggJyArIGRheXNMZWZ0 -ICsgJyBUYWdlIHZlcmbDvGdiYXI8L2Rpdj4nICsKICAgICAgICAgICAgICAgICAgICAnPGRpdiBj -bGFzcz0idHJhc2gtaXRlbS1hY3Rpb25zIj4nICsKICAgICAgICAgICAgICAgICAgICAgICAgJzxi -dXR0b24gY2xhc3M9ImJ0bi1yZXN0b3JlIiBvbmNsaWNrPSJEcml2ZVBvcnRhbC5yZXN0b3JlRnJv -bVRyYXNoKCcgKyBpICsgJykiPldpZWRlcmhlcnN0ZWxsZW48L2J1dHRvbj4nICsKICAgICAgICAg -ICAgICAgICAgICAnPC9kaXY+JyArCiAgICAgICAgICAgICAgICAnPC9kaXY+JzsKICAgICAgICAg -ICAgfSk7CiAgICAgICAgfQogICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkb2N1bWVu -dERldGFpbCcpLmlubmVySFRNTCA9CiAgICAgICAgICAgICc8ZGl2IHN0eWxlPSJwYWRkaW5nOjIw -cHg7Ij48aDIgc3R5bGU9ImNvbG9yOnZhcigtLXRleHQtaGVhZGluZyk7bWFyZ2luLWJvdHRvbTox -NXB4OyI+UGFwaWVya29yYiAoJyArIHRyYXNoLmxlbmd0aCArICcpPC9oMj4nICsgaHRtbCArICc8 -L2Rpdj4nOwogICAgfSwKCiAgICBhc3luYyByZXN0b3JlRnJvbVRyYXNoKGluZGV4KSB7CiAgICAg -ICAgdmFyIHRyYXNoID0gYXdhaXQgdGhpcy5fbG9hZFRyYXNoKCk7CiAgICAgICAgaWYgKCF0cmFz -aFtpbmRleF0pIHJldHVybjsKICAgICAgICB2YXIgZW50cnkgPSB0cmFzaFtpbmRleF07CiAgICAg -ICAgdmFyIGRvYyA9IGVudHJ5LmRvYzsKICAgICAgICB2YXIgc2F2ZVJlc3VsdCA9IGF3YWl0IERy -aXZlRlMuc2F2ZURvY3VtZW50KGRvYyk7CiAgICAgICAgaWYgKHNhdmVSZXN1bHQgPT09IHRydWUp -IHsKICAgICAgICAgICAgdHJhc2guc3BsaWNlKGluZGV4LCAxKTsKICAgICAgICAgICAgYXdhaXQg -dGhpcy5fc2F2ZVRyYXNoKHRyYXNoKTsKICAgICAgICAgICAgdGhpcy5yZW5kZXIoKTsKICAgICAg -ICAgICAgdGhpcy5zZWxlY3REb2N1bWVudChkb2MuaWQpOwogICAgICAgICAgICBzaG93VG9hc3Qo -J0Rva3VtZW50IOKAnicgKyBkb2MudGl0ZWwgKyAnIiB3aWVkZXJoZXJnZXN0ZWxsdCcsICdzdWNj -ZXNzJyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgc2hvd1RvYXN0KCdGZWhsZXIgYmVp -bSBXaWVkZXJoZXJzdGVsbGVuJywgJ2Vycm9yJyk7CiAgICAgICAgfQogICAgfSwKCiAgICAvLyBY -U1MtU2NodXR6OiBCZXJlaW5pZ3QgWmVpY2hlbmtldHRlbiBiZXZvciBzaWUgYWxzIEhUTUwgZGFy -Z2VzdGVsbHQgd2VyZGVuLgogICAgICAgIC8vIGVzY2FwZUhUTUwoKSAtIGZ1ZXIgRWxlbWVudC1J -bmhhbHRlICh0ZXh0Q29udGVudC1iYXNpZXJ0LCBicm93c2Vyc2ljaGVyKQogICAgICAgIC8vIGVz -Y2FwZUF0dHIoKSAtIGZ1ZXIgSFRNTC1BdHRyaWJ1dHdlcnRlIChtYW51ZWxsZXMgRXNjYXBpbmcg -YWxsZXIgcmVsZXZhbnRlbiBaZWljaGVuKQogICAgICAgIC8vIEJlaWRlIEZ1bmt0aW9uZW4gd2Vy -ZGVuIGluIERyaXZlUG9ydGFsIGJlaSBqZWRlciBEYXJzdGVsbHVuZyB2b24gQmVudXR6ZXJkYXRl -biBhdWZnZXJ1ZmVuLgogICAgZXNjYXBlSFRNTChzdHIpIHsKICAgICAgICBpZiAoIXN0cikgcmV0 -dXJuICcnOwogICAgICAgIGNvbnN0IGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2Rpdicp -OwogICAgICAgIGRpdi50ZXh0Q29udGVudCA9IHN0cjsKICAgICAgICByZXR1cm4gZGl2LmlubmVy -SFRNTDsKICAgIH0sCgogICAgZXNjYXBlQXR0cihzdHIpIHsKICAgICAgICBpZiAoIXN0cikgcmV0 -dXJuICcnOwogICAgICAgIHJldHVybiBzdHIucmVwbGFjZSgvJi9nLCAnJmFtcDsnKS5yZXBsYWNl -KC8iL2csICcmcXVvdDsnKS5yZXBsYWNlKC8nL2csICcmIzM5OycpLnJlcGxhY2UoLzwvZywgJyZs -dDsnKS5yZXBsYWNlKC8+L2csICcmZ3Q7JykucmVwbGFjZSgvYC9nLCAnJiM5NjsnKTsKICAgIH0s -CgogICAgLy8gU2FuaXRpemUtRnVua3Rpb24gZnVlciBSaWNoLVRleHQtSW5oYWx0ZSAoZG9jLmlu -aGFsdCkuCiAgICAvLyBFbnRmZXJudCBnZWZhZWhybGljaGUgRWxlbWVudGUgKHNjcmlwdCwgaWZy -YW1lLCBvYmplY3QsIGVtYmVkLCBmb3JtLCBldGMuKQogICAgLy8gdW5kIGFsbGUgRXZlbnQtSGFu -ZGxlciAob25jbGljaywgb25lcnJvciwgb25sb2FkLCAuLi4pIHNvd2llIGphdmFzY3JpcHQ6LVVS -THMsCiAgICAvLyBiZWhhZWx0IGFiZXIgYWxsZSBGb3JtYXRpZXJ1bmdlbiAoYiwgaSwgdSwgaDEt -aDYsIHAsIHVsLCBvbCwgdGFibGUsIGltZywgYSwgZXRjLikKICAgIHNhbml0aXplSFRNTChodG1s -KSB7CiAgICAgICAgaWYgKCFodG1sKSByZXR1cm4gJyc7CiAgICAgICAgdmFyIGRvYyA9IG5ldyBE -T01QYXJzZXIoKS5wYXJzZUZyb21TdHJpbmcoaHRtbCwgJ3RleHQvaHRtbCcpOwogICAgICAgIC8v -IEdlZmFlaHJsaWNoZSBUYWdzIGtvbXBsZXR0IGVudGZlcm5lbgogICAgICAgIC8vIGlmcmFtZXMg -d2VyZGVuIG51ciBlbnRmZXJudCB3ZW5uIHNpZSBOSUNIVCBpbiBlaW5lbSBEUklWRS1laWdlbmVu -IFBERi1Db250YWluZXIgc3RlY2tlbgogICAgICAgIC8vIChkcml2ZS1tZWRpYS1wZGYtaWZyYW1l -KSB1bmQga2VpbmUgbG9rYWxlIHNyYyBoYWJlbgogICAgICAgIHZhciBkYW5nZXJvdXNUYWdzID0g -WydzY3JpcHQnLCdvYmplY3QnLCdlbWJlZCcsJ2Zvcm0nLCdtYXRoJywnYmFzZScsJ2xpbmsnLCdt -ZXRhJywnbm9zY3JpcHQnLCdzdHlsZSddOwogICAgICAgIGRhbmdlcm91c1RhZ3MuZm9yRWFjaChm -dW5jdGlvbih0YWcpIHsKICAgICAgICAgICAgZG9jLnF1ZXJ5U2VsZWN0b3JBbGwodGFnKS5mb3JF -YWNoKGZ1bmN0aW9uKGVsKSB7IGVsLnJlbW92ZSgpOyB9KTsKICAgICAgICB9KTsKICAgICAgICAv -LyBpZnJhbWVzIHNlcGFyYXQ6IG51ciBmcmVtZGUvZ2VmYWVocmxpY2hlIGVudGZlcm5lbiwgbG9r -YWxlIFBERi1FaW5iZXR0dW5nZW4gYmVpYmVoYWx0ZW4KICAgICAgICBkb2MucXVlcnlTZWxlY3Rv -ckFsbCgnaWZyYW1lJykuZm9yRWFjaChmdW5jdGlvbihlbCkgewogICAgICAgICAgICB2YXIgc3Jj -ID0gKGVsLmdldEF0dHJpYnV0ZSgnc3JjJykgfHwgJycpLnRyaW0oKS50b0xvd2VyQ2FzZSgpOwog -ICAgICAgICAgICB2YXIgcGFyZW50ID0gZWwucGFyZW50RWxlbWVudDsKICAgICAgICAgICAgdmFy -IGlzRHJpdmVQZGYgPSBwYXJlbnQgJiYgcGFyZW50LmNsYXNzTGlzdCAmJiBwYXJlbnQuY2xhc3NM -aXN0LmNvbnRhaW5zKCdkcml2ZS1tZWRpYS1wZGYtaWZyYW1lJyk7CiAgICAgICAgICAgIHZhciBp -c0xvY2FsU3JjID0gc3JjLnN0YXJ0c1dpdGgoJ21lZGlhLycpIHx8IHNyYy5zdGFydHNXaXRoKCcv -bWVkaWEvJykgfHwgc3JjLnN0YXJ0c1dpdGgoJy4vbWVkaWEvJyk7CiAgICAgICAgICAgIGlmICgh -aXNEcml2ZVBkZiAmJiAhaXNMb2NhbFNyYykgZWwucmVtb3ZlKCk7CiAgICAgICAgfSk7CiAgICAg -ICAgLy8gQWxsZSBFdmVudC1IYW5kbGVyIHVuZCBqYXZhc2NyaXB0Oi1VUkxzIGVudGZlcm5lbgog -ICAgICAgIGRvYy5xdWVyeVNlbGVjdG9yQWxsKCcqJykuZm9yRWFjaChmdW5jdGlvbihlbCkgewog -ICAgICAgICAgICB2YXIgYXR0cnMgPSBBcnJheS5mcm9tKGVsLmF0dHJpYnV0ZXMpOwogICAgICAg -ICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGF0dHJzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAg -ICAgICB2YXIgbmFtZSA9IGF0dHJzW2ldLm5hbWUudG9Mb3dlckNhc2UoKTsKICAgICAgICAgICAg -ICAgIC8vIG9uKi1FdmVudC1IYW5kbGVyIGVudGZlcm5lbgogICAgICAgICAgICAgICAgaWYgKG5h -bWUuc3RhcnRzV2l0aCgnb24nKSkgewogICAgICAgICAgICAgICAgICAgIGVsLnJlbW92ZUF0dHJp -YnV0ZShhdHRyc1tpXS5uYW1lKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8v -IGphdmFzY3JpcHQ6L2RhdGE6IFVSTHMgaW4gaHJlZi9zcmMvYWN0aW9uIGVudGZlcm5lbgogICAg -ICAgICAgICAgICAgaWYgKG5hbWUgPT09ICdocmVmJyB8fCBuYW1lID09PSAnc3JjJyB8fCBuYW1l -ID09PSAnYWN0aW9uJykgewogICAgICAgICAgICAgICAgICAgIHZhciB2YWwgPSAoYXR0cnNbaV0u -dmFsdWUgfHwgJycpLnRyaW0oKS50b0xvd2VyQ2FzZSgpOwogICAgICAgICAgICAgICAgICAgIGlm -ICh2YWwuc3RhcnRzV2l0aCgnamF2YXNjcmlwdDonKSB8fCB2YWwuc3RhcnRzV2l0aCgnZGF0YTp0 -ZXh0L2h0bWwnKSkgewogICAgICAgICAgICAgICAgICAgICAgICBlbC5yZW1vdmVBdHRyaWJ1dGUo -YXR0cnNbaV0ubmFtZSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQog -ICAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICAgICAgLy8gQWxsZSBMaW5rcyBtdWVzc2VuIGlu -IG5ldWVtIFRhYiBvZWZmbmVuIChQb3J0YWwgZGFyZiBuaWNodCB2ZXJsYXNzZW4gd2VyZGVuKQog -ICAgICAgIGRvYy5xdWVyeVNlbGVjdG9yQWxsKCdhW2hyZWZdJykuZm9yRWFjaChmdW5jdGlvbihh -KSB7CiAgICAgICAgICAgIHZhciBocmVmID0gKGEuZ2V0QXR0cmlidXRlKCdocmVmJykgfHwgJycp -LnRyaW0oKTsKICAgICAgICAgICAgLy8gSW50ZXJuZSBBbmtlciAoIy4uLikgdW5kIERSSVZFLUNy -b3NzbGlua3MgKC5kcml2ZS14cmVmKSBhdXNuZWhtZW4KICAgICAgICAgICAgaWYgKGhyZWYuc3Rh -cnRzV2l0aCgnIycpIHx8IGEuY2xhc3NMaXN0LmNvbnRhaW5zKCdkcml2ZS14cmVmJykpIHJldHVy -bjsKICAgICAgICAgICAgYS5zZXRBdHRyaWJ1dGUoJ3RhcmdldCcsICdfYmxhbmsnKTsKICAgICAg -ICAgICAgYS5zZXRBdHRyaWJ1dGUoJ3JlbCcsICdub29wZW5lciBub3JlZmVycmVyJyk7CiAgICAg -ICAgfSk7CiAgICAgICAgcmV0dXJuIGRvYy5ib2R5LmlubmVySFRNTDsKICAgIH0sCgogICAgaGln -aGxpZ2h0SXRlbShkb2NJZCkgewogICAgICAgIGNvbnN0IGl0ZW1zID0gZG9jdW1lbnQucXVlcnlT -ZWxlY3RvckFsbCgnI2RvY3VtZW50TGlzdCAuZG9jdW1lbnQtaXRlbScpOwogICAgICAgIGl0ZW1z -LmZvckVhY2goaXRlbSA9PiB7CiAgICAgICAgICAgIGlmIChpdGVtLmdldEF0dHJpYnV0ZSgnb25j -bGljaycpICYmIGl0ZW0uZ2V0QXR0cmlidXRlKCdvbmNsaWNrJykuaW5jbHVkZXMoZG9jSWQpKSB7 -CiAgICAgICAgICAgICAgICBpdGVtLmNsYXNzTGlzdC5hZGQoJ2hpZ2hsaWdodC1zYXZlZCcpOwog -ICAgICAgICAgICAgICAgaXRlbS5zY3JvbGxJbnRvVmlldyh7IGJlaGF2aW9yOiAnc21vb3RoJywg -YmxvY2s6ICduZWFyZXN0JyB9KTsKICAgICAgICAgICAgICAgIGl0ZW0uYWRkRXZlbnRMaXN0ZW5l -cignYW5pbWF0aW9uZW5kJywgKCkgPT4gaXRlbS5jbGFzc0xpc3QucmVtb3ZlKCdoaWdobGlnaHQt -c2F2ZWQnKSwgeyBvbmNlOiB0cnVlIH0pOwogICAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICB9 -Cn07CgovLyA9PT09PT09PT09PT09PT09PT09PT0gRURJVE9SID09PT09PT09PT09PT09PT09PT09 -PQoKLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 -PT09PT09PT09PT09PT09PT09PT09PT09PT0KLy8gTW9kdWw6IERyaXZlRWRpdG9yIC0gV1lTSVdZ -Ry1FZGl0b3IsIE1lZGllbi1VcGxvYWQsIERva3VtZW50ZW5iZWFyYmVpdHVuZwovLyBadXN0YWVu -ZGlnIGZ1ZXI6IEVkaXRvci1Nb2RhbCwgRm9ybWF0aWVydW5nLCBNZWRpZW4tVXBsb2FkLURpYWxv -ZywgU3BlaWNoZXJuCi8vIFNpY2hlcmhlaXQ6IEVpbmdlZnVlZ3RlIEhUTUwtSW5oYWx0ZSAoUGFz -dGUpIHdlcmRlbiB2aWEgRE9NUGFyc2VyIG5vcm1hbGlzaWVydC4KLy8gICAgICAgICAgICAgRGF0 -ZWluYW1lbiB3ZXJkZW4gdWViZXIgc2FuaXRpemVGaWxlbmFtZSgpIGJlcmVpbmlndCAoa2VpbmUg -U29uZGVyemVpY2hlbi9QZmFkdHJlbm5lcikuCi8vICAgICAgICAgICAgIFNwZWljaGVybiBzZW5k -ZXQgRGF0ZW4gYW4gL2FwaS93cml0ZSwgd28gc2VydmVyc2VpdGlnZSBBdXRvcmlzaWVydW5nIGdy -ZWlmdC4KLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 -PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KY29uc3QgRHJpdmVFZGl0b3IgPSB7CiAgICBj -dXJyZW50RG9jOiBudWxsLAogICAgaXNOZXc6IGZhbHNlLAogICAgaGlzdG9yeTogW10sCiAgICBo -aXN0b3J5SW5kZXg6IC0xLAogICAgaXNSZXN0b3Jpbmc6IGZhbHNlLAoKICAgIGFzeW5jIGNyZWF0 -ZU5ldygpIHsKICAgICAgICBpZiAoIURyaXZlRlMuY29ubmVjdGVkKSB7CiAgICAgICAgICAgIHNo -b3dUb2FzdCgnWnVtIEJlYXJiZWl0ZW4gYml0dGUgRFJJVkVfU3RhcnQuYmF0IHN0YXJ0ZW4nLCAn -d2FybmluZycpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGlmIChEcml2 -ZUZTLnJlYWRPbmx5KSB7CiAgICAgICAgICAgIGNvbnN0IGdyYW50ZWQgPSBhd2FpdCBEcml2ZUZT -LmVuc3VyZVdyaXRlQWNjZXNzKCk7CiAgICAgICAgICAgIGlmICghZ3JhbnRlZCkgcmV0dXJuOwog -ICAgICAgIH0KCiAgICAgICAgdGhpcy5pc05ldyA9IHRydWU7CiAgICAgICAgY29uc3QgdXNlcm5h -bWUgPSAoRHJpdmVGUy5lbnZpcm9uICYmIERyaXZlRlMuZW52aXJvbi51c2VybmFtZSkgPyBEcml2 -ZUZTLmVudmlyb24udXNlcm5hbWUgOiBudWxsOwogICAgICAgIHRoaXMuY3VycmVudERvYyA9IHsK -ICAgICAgICAgICAgaWQ6IERyaXZlRlMuZ2VuZXJhdGVJZCgpLAogICAgICAgICAgICB0aXRlbDog -JycsCiAgICAgICAgICAgIGthdGVnb3JpZTogKERyaXZlRlMuY29uZmlnLmthdGVnb3JpZW4gfHwg -WydWZXJrZWhyJ10pWzBdLAogICAgICAgICAgICBpbmhhbHQ6ICcnLAogICAgICAgICAgICBzdGF0 -dXM6ICdFbnR3dXJmJywKICAgICAgICAgICAgZXJzdGVsbHQ6IG5ldyBEYXRlKCkudG9JU09TdHJp -bmcoKS5zcGxpdCgnVCcpWzBdLAogICAgICAgICAgICBnZWFlbmRlcnQ6IG5ldyBEYXRlKCkudG9J -U09TdHJpbmcoKS5zcGxpdCgnVCcpWzBdLAogICAgICAgICAgICBlcnN0ZWxsdFZvbjogdXNlcm5h -bWUsCiAgICAgICAgICAgIGJlYXJiZWl0ZXRWb246IHVzZXJuYW1lLAogICAgICAgICAgICB2ZXJz -aW9uOiAndjAuMScsCiAgICAgICAgICAgIG1lZGlhczogW10sCiAgICAgICAgICAgIHNjaGxhZ3dv -ZXJ0ZXI6IFtdLAogICAgICAgICAgICBwYXJlbnRJZDogbnVsbAogICAgICAgIH07CgogICAgICAg -IHRoaXMub3Blbk1vZGFsKCdOZXVlcyBEb2t1bWVudCBlcnN0ZWxsZW4nKTsKICAgIH0sCgogICAg -X2xvY2tlZERvY0lkOiBudWxsLAoKICAgIGFzeW5jIGVkaXQoZG9jSWQpIHsKICAgICAgICBpZiAo +IGlmICghZG9jKSByZXR1cm47CiAgICAgICAgLy8gVmVyZ2xlaWNoc2Jhc2lzOiBsZXR6dGUgUmV2 +aXNpb24gKHBlcnNpc3RpZXJ0KSBvZGVyIF9wcmV2aW91c0luaGFsdCAoTGVnYWN5KQogICAgICAg +IHZhciBwcmV2SW5oYWx0ID0gZG9jLl9wcmV2aW91c0luaGFsdDsKICAgICAgICBpZiAoIXByZXZJ +bmhhbHQgJiYgZG9jLnJldmlzaW9ucyAmJiBkb2MucmV2aXNpb25zLmxlbmd0aCA+IDApIHsKICAg +ICAgICAgICAgcHJldkluaGFsdCA9IGRvYy5yZXZpc2lvbnNbZG9jLnJldmlzaW9ucy5sZW5ndGgg +LSAxXS5pbmhhbHQ7CiAgICAgICAgfQogICAgICAgIGlmICghcHJldkluaGFsdCkgcmV0dXJuOwoK +ICAgICAgICB2YXIgY29udGVudEVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RldGFpbENv +bnRlbnQnKTsKICAgICAgICB2YXIgYnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2J0bkRp +ZmYnKTsKICAgICAgICBpZiAoIWNvbnRlbnRFbCkgcmV0dXJuOwoKICAgICAgICBpZiAodGhpcy5f +ZGlmZlZpc2libGUpIHsKICAgICAgICAgICAgLy8gWnVydWVjayB6dXIgbm9ybWFsZW4gQW5zaWNo +dAogICAgICAgICAgICBjb250ZW50RWwuaW5uZXJIVE1MID0gRHJpdmVQb3J0YWwuc2FuaXRpemVI +VE1MKGRvYy5pbmhhbHQpOwogICAgICAgICAgICBpZiAoYnRuKSBidG4udGV4dENvbnRlbnQgPSAn +w4RuZGVydW5nZW4gYW56ZWlnZW4nOwogICAgICAgICAgICB0aGlzLl9kaWZmVmlzaWJsZSA9IGZh +bHNlOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIC8vIERpZmYgYmVyZWNobmVuIHVuZCBh +bnplaWdlbgogICAgICAgICAgICB2YXIgZGlmZkh0bWwgPSB0aGlzLl9jb21wdXRlRGlmZihwcmV2 +SW5oYWx0LCBkb2MuaW5oYWx0IHx8ICcnKTsKICAgICAgICAgICAgY29udGVudEVsLmlubmVySFRN +TCA9CiAgICAgICAgICAgICAgICAnPGRpdiBjbGFzcz0iZGlmZi1sZWdlbmQiPicgKwogICAgICAg +ICAgICAgICAgICAgICc8c3Bhbj48c3BhbiBjbGFzcz0iZGlmZi1hZGRlZCI+QmVpc3BpZWw8L3Nw +YW4+IEhpbnp1Z2Vmw7xndDwvc3Bhbj4nICsKICAgICAgICAgICAgICAgICAgICAnPHNwYW4+PHNw +YW4gY2xhc3M9ImRpZmYtcmVtb3ZlZCI+QmVpc3BpZWw8L3NwYW4+IEVudGZlcm50PC9zcGFuPicg +KwogICAgICAgICAgICAgICAgJzwvZGl2PicgKwogICAgICAgICAgICAgICAgZGlmZkh0bWw7CiAg +ICAgICAgICAgIGlmIChidG4pIGJ0bi50ZXh0Q29udGVudCA9ICdPcmlnaW5hbGFuc2ljaHQnOwog +ICAgICAgICAgICB0aGlzLl9kaWZmVmlzaWJsZSA9IHRydWU7CiAgICAgICAgfQogICAgfSwKCiAg +ICBfY29tcHV0ZURpZmYob2xkSHRtbCwgbmV3SHRtbCkgewogICAgICAgIC8vIEhUTUwgaW4gV29l +cnRlciB6ZXJsZWdlbiAoVGFncyBhbHMgRWluaGVpdCBiZWhhbHRlbikKICAgICAgICBmdW5jdGlv +biB0b2tlbml6ZShodG1sKSB7CiAgICAgICAgICAgIHZhciB0b2tlbnMgPSBbXTsKICAgICAgICAg +ICAgdmFyIHJlID0gLzxbXj5dKz58W15cczxdK3xccysvZzsKICAgICAgICAgICAgdmFyIG07CiAg +ICAgICAgICAgIHdoaWxlICgobSA9IHJlLmV4ZWMoaHRtbCkpICE9PSBudWxsKSB7CiAgICAgICAg +ICAgICAgICB0b2tlbnMucHVzaChtWzBdKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1 +cm4gdG9rZW5zOwogICAgICAgIH0KCiAgICAgICAgdmFyIG9sZFRva2VucyA9IHRva2VuaXplKG9s +ZEh0bWwpOwogICAgICAgIHZhciBuZXdUb2tlbnMgPSB0b2tlbml6ZShuZXdIdG1sKTsKCiAgICAg +ICAgLy8gTENTIChMb25nZXN0IENvbW1vbiBTdWJzZXF1ZW5jZSkgYmVyZWNobmVuCiAgICAgICAg +dmFyIG4gPSBvbGRUb2tlbnMubGVuZ3RoLCBtID0gbmV3VG9rZW5zLmxlbmd0aDsKCiAgICAgICAg +Ly8gRnVlciBzZWhyIGdyb3NzZSBEb2t1bWVudGU6IHZlcmVpbmZhY2h0ZXIgQW5zYXR6IG1pdCBi +ZWdyZW56dGVyIE1hdHJpeAogICAgICAgIGlmIChuICogbSA+IDIwMDAwMDApIHsKICAgICAgICAg +ICAgLy8gRmFsbGJhY2s6IFplaWxlbndlaXNlciBWZXJnbGVpY2gKICAgICAgICAgICAgcmV0dXJu +IHRoaXMuX2NvbXB1dGVMaW5lRGlmZihvbGRIdG1sLCBuZXdIdG1sKTsKICAgICAgICB9CgogICAg +ICAgIHZhciBkcCA9IFtdOwogICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDw9IG47IGkrKykgewog +ICAgICAgICAgICBkcFtpXSA9IG5ldyBVaW50MTZBcnJheShtICsgMSk7CiAgICAgICAgfQoKICAg +ICAgICBmb3IgKHZhciBpID0gMTsgaSA8PSBuOyBpKyspIHsKICAgICAgICAgICAgZm9yICh2YXIg +aiA9IDE7IGogPD0gbTsgaisrKSB7CiAgICAgICAgICAgICAgICBpZiAob2xkVG9rZW5zW2ktMV0g +PT09IG5ld1Rva2Vuc1tqLTFdKSB7CiAgICAgICAgICAgICAgICAgICAgZHBbaV1bal0gPSBkcFtp +LTFdW2otMV0gKyAxOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAg +ICBkcFtpXVtqXSA9IE1hdGgubWF4KGRwW2ktMV1bal0sIGRwW2ldW2otMV0pOwogICAgICAgICAg +ICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvLyBCYWNrdHJhY2s6IERp +ZmYtU2VxdWVueiBlcnN0ZWxsZW4KICAgICAgICB2YXIgcmVzdWx0ID0gW107CiAgICAgICAgdmFy +IGkgPSBuLCBqID0gbTsKICAgICAgICB3aGlsZSAoaSA+IDAgfHwgaiA+IDApIHsKICAgICAgICAg +ICAgaWYgKGkgPiAwICYmIGogPiAwICYmIG9sZFRva2Vuc1tpLTFdID09PSBuZXdUb2tlbnNbai0x +XSkgewogICAgICAgICAgICAgICAgcmVzdWx0LnVuc2hpZnQoeyB0eXBlOiAnc2FtZScsIHRleHQ6 +IG9sZFRva2Vuc1tpLTFdIH0pOwogICAgICAgICAgICAgICAgaS0tOyBqLS07CiAgICAgICAgICAg +IH0gZWxzZSBpZiAoaiA+IDAgJiYgKGkgPT09IDAgfHwgZHBbaV1bai0xXSA+PSBkcFtpLTFdW2pd +KSkgewogICAgICAgICAgICAgICAgcmVzdWx0LnVuc2hpZnQoeyB0eXBlOiAnYWRkJywgdGV4dDog +bmV3VG9rZW5zW2otMV0gfSk7CiAgICAgICAgICAgICAgICBqLS07CiAgICAgICAgICAgIH0gZWxz +ZSB7CiAgICAgICAgICAgICAgICByZXN1bHQudW5zaGlmdCh7IHR5cGU6ICdkZWwnLCB0ZXh0OiBv +bGRUb2tlbnNbaS0xXSB9KTsKICAgICAgICAgICAgICAgIGktLTsKICAgICAgICAgICAgfQogICAg +ICAgIH0KCiAgICAgICAgLy8gRXJnZWJuaXMgYWxzIEhUTUwgcmVuZGVybgogICAgICAgIHZhciBo +dG1sID0gJyc7CiAgICAgICAgdmFyIGluQWRkID0gZmFsc2UsIGluRGVsID0gZmFsc2U7CgogICAg +ICAgIGZvciAodmFyIGsgPSAwOyBrIDwgcmVzdWx0Lmxlbmd0aDsgaysrKSB7CiAgICAgICAgICAg +IHZhciByID0gcmVzdWx0W2tdOwogICAgICAgICAgICB2YXIgaXNUYWcgPSByLnRleHQuY2hhckF0 +KDApID09PSAnPCc7CgogICAgICAgICAgICBpZiAoci50eXBlID09PSAnc2FtZScpIHsKICAgICAg +ICAgICAgICAgIGlmIChpbkFkZCkgeyBodG1sICs9ICc8L3NwYW4+JzsgaW5BZGQgPSBmYWxzZTsg +fQogICAgICAgICAgICAgICAgaWYgKGluRGVsKSB7IGh0bWwgKz0gJzwvc3Bhbj4nOyBpbkRlbCA9 +IGZhbHNlOyB9CiAgICAgICAgICAgICAgICBodG1sICs9IHIudGV4dDsKICAgICAgICAgICAgfSBl +bHNlIGlmIChyLnR5cGUgPT09ICdhZGQnKSB7CiAgICAgICAgICAgICAgICBpZiAoaW5EZWwpIHsg +aHRtbCArPSAnPC9zcGFuPic7IGluRGVsID0gZmFsc2U7IH0KICAgICAgICAgICAgICAgIGlmIChp +c1RhZykgeyBodG1sICs9IHIudGV4dDsgY29udGludWU7IH0KICAgICAgICAgICAgICAgIGlmICgh +aW5BZGQpIHsgaHRtbCArPSAnPHNwYW4gY2xhc3M9ImRpZmYtYWRkZWQiPic7IGluQWRkID0gdHJ1 +ZTsgfQogICAgICAgICAgICAgICAgaHRtbCArPSByLnRleHQ7CiAgICAgICAgICAgIH0gZWxzZSBp +ZiAoci50eXBlID09PSAnZGVsJykgewogICAgICAgICAgICAgICAgaWYgKGluQWRkKSB7IGh0bWwg +Kz0gJzwvc3Bhbj4nOyBpbkFkZCA9IGZhbHNlOyB9CiAgICAgICAgICAgICAgICBpZiAoaXNUYWcp +IGNvbnRpbnVlOyAvLyBFbnRmZXJudGUgVGFncyBuaWNodCBhbnplaWdlbgogICAgICAgICAgICAg +ICAgaWYgKCFpbkRlbCkgeyBodG1sICs9ICc8c3BhbiBjbGFzcz0iZGlmZi1yZW1vdmVkIj4nOyBp +bkRlbCA9IHRydWU7IH0KICAgICAgICAgICAgICAgIGh0bWwgKz0gci50ZXh0OwogICAgICAgICAg +ICB9CiAgICAgICAgfQogICAgICAgIGlmIChpbkFkZCkgaHRtbCArPSAnPC9zcGFuPic7CiAgICAg +ICAgaWYgKGluRGVsKSBodG1sICs9ICc8L3NwYW4+JzsKCiAgICAgICAgcmV0dXJuIGh0bWw7CiAg +ICB9LAoKICAgIF9jb21wdXRlTGluZURpZmYob2xkSHRtbCwgbmV3SHRtbCkgewogICAgICAgIC8v +IEVpbmZhY2hlciBGYWxsYmFjayBmdWVyIHNlaHIgZ3Jvc3NlIERva3VtZW50ZTogQWJzYXR6d2Vp +c2VyIFZlcmdsZWljaAogICAgICAgIGZ1bmN0aW9uIGdldFBhcmFzKGh0bWwpIHsKICAgICAgICAg +ICAgdmFyIGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOwogICAgICAgICAgICBk +aXYuaW5uZXJIVE1MID0gaHRtbDsKICAgICAgICAgICAgdmFyIGJsb2NrcyA9IFtdOwogICAgICAg +ICAgICBkaXYuY2hpbGROb2Rlcy5mb3JFYWNoKGZ1bmN0aW9uKG4pIHsKICAgICAgICAgICAgICAg +IGJsb2Nrcy5wdXNoKG4ub3V0ZXJIVE1MIHx8IG4udGV4dENvbnRlbnQpOwogICAgICAgICAgICB9 +KTsKICAgICAgICAgICAgcmV0dXJuIGJsb2NrczsKICAgICAgICB9CgogICAgICAgIHZhciBvbGRQ +YXJhcyA9IGdldFBhcmFzKG9sZEh0bWwpOwogICAgICAgIHZhciBuZXdQYXJhcyA9IGdldFBhcmFz +KG5ld0h0bWwpOwogICAgICAgIHZhciBvbGRTZXQgPSBuZXcgU2V0KG9sZFBhcmFzKTsKICAgICAg +ICB2YXIgbmV3U2V0ID0gbmV3IFNldChuZXdQYXJhcyk7CgogICAgICAgIHZhciBodG1sID0gJyc7 +CiAgICAgICAgbmV3UGFyYXMuZm9yRWFjaChmdW5jdGlvbihwKSB7CiAgICAgICAgICAgIGlmIChv +bGRTZXQuaGFzKHApKSB7CiAgICAgICAgICAgICAgICBodG1sICs9IHA7CiAgICAgICAgICAgIH0g +ZWxzZSB7CiAgICAgICAgICAgICAgICBodG1sICs9ICc8ZGl2IGNsYXNzPSJkaWZmLWFkZGVkIiBz +dHlsZT0iZGlzcGxheTpibG9jaztwYWRkaW5nOjRweCA4cHg7bWFyZ2luOjRweCAwO2JvcmRlci1y +YWRpdXM6NHB4OyI+JyArIHAgKyAnPC9kaXY+JzsKICAgICAgICAgICAgfQogICAgICAgIH0pOwog +ICAgICAgIG9sZFBhcmFzLmZvckVhY2goZnVuY3Rpb24ocCkgewogICAgICAgICAgICBpZiAoIW5l +d1NldC5oYXMocCkpIHsKICAgICAgICAgICAgICAgIGh0bWwgKz0gJzxkaXYgY2xhc3M9ImRpZmYt +cmVtb3ZlZCIgc3R5bGU9ImRpc3BsYXk6YmxvY2s7cGFkZGluZzo0cHggOHB4O21hcmdpbjo0cHgg +MDtib3JkZXItcmFkaXVzOjRweDsiPicgKyBwICsgJzwvZGl2Pic7CiAgICAgICAgICAgIH0KICAg +ICAgICB9KTsKCiAgICAgICAgcmV0dXJuIGh0bWw7CiAgICB9LAoKICAgIC8vID09PT0gUmV2aXNp +b25zaGlzdG9yaWUgPT09PQogICAgX3JldkRvY0lkOiBudWxsLAogICAgX3JldlNlbGVjdGVkSWR4 +OiAtMSwKICAgIF9yZXZNb2RlOiAnY29udGVudCcsIC8vICdjb250ZW50JyBvZGVyICdkaWZmJwoK +ICAgIG9wZW5SZXZpc2lvbnMoZG9jSWQpIHsKICAgICAgICB2YXIgZG9jID0gRHJpdmVGUy5kb2N1 +bWVudHMuZmluZChmdW5jdGlvbihkKSB7IHJldHVybiBkLmlkID09PSBkb2NJZDsgfSk7CiAgICAg +ICAgaWYgKCFkb2MpIHJldHVybjsKICAgICAgICB0aGlzLl9yZXZEb2NJZCA9IGRvY0lkOwogICAg +ICAgIHRoaXMuX3JldlNlbGVjdGVkSWR4ID0gLTE7CiAgICAgICAgdGhpcy5fcmV2TW9kZSA9ICdj +b250ZW50JzsKCiAgICAgICAgdmFyIHJldmlzaW9ucyA9IGRvYy5yZXZpc2lvbnMgfHwgW107CiAg +ICAgICAgdmFyIGxpc3RFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyZXZpc2lvbkxpc3Qn +KTsKCiAgICAgICAgaWYgKHJldmlzaW9ucy5sZW5ndGggPT09IDApIHsKICAgICAgICAgICAgc2hv +d1RvYXN0KCdLZWluZSBmcnVlaGVyZW4gVmVyc2lvbmVuIHZvcmhhbmRlbicsICdpbmZvJyk7CiAg +ICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIC8vIExpc3RlIGF1ZmJhdWVuIChu +ZXVlc3RlIHp1ZXJzdCkKICAgICAgICB2YXIgaHRtbCA9ICcnOwogICAgICAgIC8vIEFrdHVlbGxl +IFZlcnNpb24gYWxzIGVyc3RlcyBFbGVtZW50CiAgICAgICAgaHRtbCArPSAnPGRpdiBjbGFzcz0i +cmV2aXNpb24taXRlbSIgb25jbGljaz0iRHJpdmVQb3J0YWwuc2VsZWN0UmV2aXNpb24oLTEpIj4n +ICsKICAgICAgICAgICAgJzxkaXYgY2xhc3M9InJldi1sYWJlbCI+QWt0dWVsbGUgVmVyc2lvbiA8 +c3BhbiBjbGFzcz0icmV2LWJhZGdlIj5MaXZlPC9zcGFuPjwvZGl2PicgKwogICAgICAgICAgICAn +PGRpdiBjbGFzcz0icmV2LWRhdGUiPicgKyAoZG9jLnRpdGVsIHx8ICdPaG5lIFRpdGVsJykgKyAn +PC9kaXY+JyArCiAgICAgICAgICAgICc8ZGl2IGNsYXNzPSJyZXYtdXNlciI+U3RhdHVzOiAnICsg +RHJpdmVQb3J0YWwuZXNjYXBlSFRNTChkb2Muc3RhdHVzIHx8ICdFbnR3dXJmJykgKyAnPC9kaXY+ +JyArCiAgICAgICAgJzwvZGl2Pic7CgogICAgICAgIGZvciAodmFyIGkgPSByZXZpc2lvbnMubGVu +Z3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsKICAgICAgICAgICAgdmFyIHJldiA9IHJldmlzaW9uc1tp +XTsKICAgICAgICAgICAgdmFyIGQgPSBuZXcgRGF0ZShyZXYuc2F2ZWRBdCk7CiAgICAgICAgICAg +IHZhciBkYXRlU3RyID0gZC50b0xvY2FsZURhdGVTdHJpbmcoJ2RlLURFJywgeyBkYXk6ICcyLWRp +Z2l0JywgbW9udGg6ICcyLWRpZ2l0JywgeWVhcjogJ251bWVyaWMnIH0pOwogICAgICAgICAgICB2 +YXIgdGltZVN0ciA9IGQudG9Mb2NhbGVUaW1lU3RyaW5nKCdkZS1ERScsIHsgaG91cjogJzItZGln +aXQnLCBtaW51dGU6ICcyLWRpZ2l0JyB9KTsKICAgICAgICAgICAgdmFyIHJldk51bSA9IGkgKyAx +OwogICAgICAgICAgICBodG1sICs9ICc8ZGl2IGNsYXNzPSJyZXZpc2lvbi1pdGVtIiBvbmNsaWNr +PSJEcml2ZVBvcnRhbC5zZWxlY3RSZXZpc2lvbignICsgaSArICcpIj4nICsKICAgICAgICAgICAg +ICAgICc8ZGl2IGNsYXNzPSJyZXYtbGFiZWwiPlZlcnNpb24gJyArIHJldk51bSArICcgPHNwYW4g +Y2xhc3M9InJldi1iYWRnZSI+dicgKyByZXZOdW0gKyAnPC9zcGFuPjwvZGl2PicgKwogICAgICAg +ICAgICAgICAgJzxkaXYgY2xhc3M9InJldi1kYXRlIj4nICsgZGF0ZVN0ciArICcgdW0gJyArIHRp +bWVTdHIgKyAnPC9kaXY+JyArCiAgICAgICAgICAgICAgICAnPGRpdiBjbGFzcz0icmV2LXVzZXIi +PnZvbiAnICsgRHJpdmVQb3J0YWwuZXNjYXBlSFRNTChyZXYuc2F2ZWRCeSB8fCAnVW5iZWthbm50 +JykgKwogICAgICAgICAgICAgICAgICAgIChyZXYuc3RhdHVzID8gJyAmbWlkZG90OyAnICsgRHJp +dmVQb3J0YWwuZXNjYXBlSFRNTChyZXYuc3RhdHVzKSA6ICcnKSArICc8L2Rpdj4nICsKICAgICAg +ICAgICAgJzwvZGl2Pic7CiAgICAgICAgfQogICAgICAgIGxpc3RFbC5pbm5lckhUTUwgPSBodG1s +OwoKICAgICAgICAvLyBUb29sYmFyIHVuZCBDb250ZW50IHp1cnVlY2tzZXR6ZW4KICAgICAgICBk +b2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmV2aXNpb25Ub29sYmFyJykuaW5uZXJIVE1MID0gJyc7 +CiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3JldmlzaW9uQ29udGVudCcpLmlubmVy +SFRNTCA9CiAgICAgICAgICAgICc8ZGl2IHN0eWxlPSJ0ZXh0LWFsaWduOmNlbnRlcjtjb2xvcjp2 +YXIoLS10ZXh0LW11dGVkKTttYXJnaW4tdG9wOjYwcHg7Ij5WZXJzaW9uIGF1cyBkZXIgTGlzdGUg +YXVzd2FlaGxlbjwvZGl2Pic7CgogICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyZXZp +c2lvbk1vZGFsJykuY2xhc3NMaXN0LmFkZCgnb3BlbicpOwogICAgfSwKCiAgICBjbG9zZVJldmlz +aW9ucygpIHsKICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmV2aXNpb25Nb2RhbCcp +LmNsYXNzTGlzdC5yZW1vdmUoJ29wZW4nKTsKICAgICAgICB0aGlzLl9yZXZEb2NJZCA9IG51bGw7 +CiAgICB9LAoKICAgIHNlbGVjdFJldmlzaW9uKGlkeCkgewogICAgICAgIHZhciBkb2MgPSBEcml2 +ZUZTLmRvY3VtZW50cy5maW5kKGZ1bmN0aW9uKGQpIHsgcmV0dXJuIGQuaWQgPT09IERyaXZlUG9y +dGFsLl9yZXZEb2NJZDsgfSk7CiAgICAgICAgaWYgKCFkb2MpIHJldHVybjsKICAgICAgICB0aGlz +Ll9yZXZTZWxlY3RlZElkeCA9IGlkeDsKICAgICAgICB0aGlzLl9yZXZNb2RlID0gJ2NvbnRlbnQn +OwoKICAgICAgICAvLyBBa3RpdmUgTWFya2llcnVuZyBzZXR6ZW4KICAgICAgICB2YXIgaXRlbXMg +PSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcjcmV2aXNpb25MaXN0IC5yZXZpc2lvbi1pdGVt +Jyk7CiAgICAgICAgdmFyIHJldmlzaW9ucyA9IGRvYy5yZXZpc2lvbnMgfHwgW107CiAgICAgICAg +Ly8gaWR4PS0xIGlzdCAiQWt0dWVsbGUgVmVyc2lvbiIgKGVyc3RlciBFaW50cmFnKSwgc29uc3Qg +dW1nZWtlaHJ0IHdlaWwgTGlzdGUgaW52ZXJ0aWVydAogICAgICAgIHZhciBhY3RpdmVQb3MgPSAo +aWR4ID09PSAtMSkgPyAwIDogKHJldmlzaW9ucy5sZW5ndGggLSBpZHgpOwogICAgICAgIGl0ZW1z +LmZvckVhY2goZnVuY3Rpb24oZWwsIGkpIHsKICAgICAgICAgICAgZWwuY2xhc3NMaXN0LnRvZ2ds +ZSgnYWN0aXZlJywgaSA9PT0gYWN0aXZlUG9zKTsKICAgICAgICB9KTsKCiAgICAgICAgLy8gVG9v +bGJhcgogICAgICAgIHZhciByZXYgPSAoaWR4ID09PSAtMSkgPyBudWxsIDogcmV2aXNpb25zW2lk +eF07CiAgICAgICAgdmFyIHRvb2xiYXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmV2aXNp +b25Ub29sYmFyJyk7CiAgICAgICAgdmFyIGxhYmVsID0gJyc7CiAgICAgICAgaWYgKGlkeCA9PT0g +LTEpIHsKICAgICAgICAgICAgbGFiZWwgPSAnQWt0dWVsbGUgVmVyc2lvbic7CiAgICAgICAgfSBl +bHNlIHsKICAgICAgICAgICAgdmFyIGQgPSBuZXcgRGF0ZShyZXYuc2F2ZWRBdCk7CiAgICAgICAg +ICAgIGxhYmVsID0gJ1ZlcnNpb24gJyArIChpZHggKyAxKSArICcgJm1pZGRvdDsgJyArCiAgICAg +ICAgICAgICAgICBkLnRvTG9jYWxlRGF0ZVN0cmluZygnZGUtREUnLCB7IGRheTogJzItZGlnaXQn +LCBtb250aDogJzItZGlnaXQnLCB5ZWFyOiAnbnVtZXJpYycgfSkgKyAnICcgKwogICAgICAgICAg +ICAgICAgZC50b0xvY2FsZVRpbWVTdHJpbmcoJ2RlLURFJywgeyBob3VyOiAnMi1kaWdpdCcsIG1p +bnV0ZTogJzItZGlnaXQnLCBzZWNvbmQ6ICcyLWRpZ2l0JyB9KSArCiAgICAgICAgICAgICAgICAn +ICZtaWRkb3Q7ICcgKyBEcml2ZVBvcnRhbC5lc2NhcGVIVE1MKHJldi5zYXZlZEJ5IHx8ICdVbmJl +a2FubnQnKTsKICAgICAgICB9CgogICAgICAgIHRvb2xiYXIuaW5uZXJIVE1MID0KICAgICAgICAg +ICAgJzxidXR0b24gY2xhc3M9ImFjdGl2ZSIgaWQ9InJldkJ0bkNvbnRlbnQiIG9uY2xpY2s9IkRy +aXZlUG9ydGFsLnNob3dSZXZDb250ZW50KCkiPkluaGFsdDwvYnV0dG9uPicgKwogICAgICAgICAg +ICAnPGJ1dHRvbiBpZD0icmV2QnRuRGlmZiIgb25jbGljaz0iRHJpdmVQb3J0YWwuc2hvd1JldkRp +ZmYoKSI+RGlmZiB6dXIgYWt0dWVsbGVuIFZlcnNpb248L2J1dHRvbj4nICsKICAgICAgICAgICAg +KGlkeCA+PSAwID8gJzxidXR0b24gaWQ9InJldkJ0blJlc3RvcmUiIG9uY2xpY2s9IkRyaXZlUG9y +dGFsLnJlc3RvcmVSZXZpc2lvbigpIj5EaWVzZSBWZXJzaW9uIHdpZWRlcmhlcnN0ZWxsZW48L2J1 +dHRvbj4nIDogJycpICsKICAgICAgICAgICAgJzxzcGFuIGNsYXNzPSJyZXYtaW5mbyI+JyArIGxh +YmVsICsgJzwvc3Bhbj4nOwoKICAgICAgICB0aGlzLnNob3dSZXZDb250ZW50KCk7CiAgICB9LAoK +ICAgIHNob3dSZXZDb250ZW50KCkgewogICAgICAgIHZhciBkb2MgPSBEcml2ZUZTLmRvY3VtZW50 +cy5maW5kKGZ1bmN0aW9uKGQpIHsgcmV0dXJuIGQuaWQgPT09IERyaXZlUG9ydGFsLl9yZXZEb2NJ +ZDsgfSk7CiAgICAgICAgaWYgKCFkb2MpIHJldHVybjsKICAgICAgICB0aGlzLl9yZXZNb2RlID0g +J2NvbnRlbnQnOwoKICAgICAgICB2YXIgY29udGVudEVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5 +SWQoJ3JldmlzaW9uQ29udGVudCcpOwogICAgICAgIHZhciByZXYgPSAodGhpcy5fcmV2U2VsZWN0 +ZWRJZHggPT09IC0xKSA/IG51bGwgOiAoZG9jLnJldmlzaW9ucyB8fCBbXSlbdGhpcy5fcmV2U2Vs +ZWN0ZWRJZHhdOwogICAgICAgIHZhciBpbmhhbHQgPSByZXYgPyByZXYuaW5oYWx0IDogZG9jLmlu +aGFsdDsKICAgICAgICB2YXIgdGl0ZWwgPSByZXYgPyByZXYudGl0ZWwgOiBkb2MudGl0ZWw7Cgog +ICAgICAgIGNvbnRlbnRFbC5pbm5lckhUTUwgPQogICAgICAgICAgICAnPGRpdiBzdHlsZT0iZm9u +dC1zaXplOjE4cHg7Zm9udC13ZWlnaHQ6NzAwO2NvbG9yOnZhcigtLXRleHQtaGVhZGluZyk7bWFy +Z2luLWJvdHRvbToxNnB4O3BhZGRpbmctYm90dG9tOjhweDtib3JkZXItYm90dG9tOjFweCBzb2xp +ZCB2YXIoLS1ib3JkZXItbGlnaHQpOyI+JyArCiAgICAgICAgICAgICAgICBEcml2ZVBvcnRhbC5l +c2NhcGVIVE1MKHRpdGVsIHx8ICdPaG5lIFRpdGVsJykgKwogICAgICAgICAgICAnPC9kaXY+JyAr +CiAgICAgICAgICAgIChpbmhhbHQgfHwgJzxzcGFuIHN0eWxlPSJjb2xvcjp2YXIoLS10ZXh0LW11 +dGVkKTsiPktlaW4gSW5oYWx0PC9zcGFuPicpOwoKICAgICAgICAvLyBCdXR0b24tU3RhdHVzCiAg +ICAgICAgdmFyIGJ0bkMgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmV2QnRuQ29udGVudCcp +OwogICAgICAgIHZhciBidG5EID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3JldkJ0bkRpZmYn +KTsKICAgICAgICBpZiAoYnRuQykgYnRuQy5jbGFzc0xpc3QuYWRkKCdhY3RpdmUnKTsKICAgICAg +ICBpZiAoYnRuRCkgYnRuRC5jbGFzc0xpc3QucmVtb3ZlKCdhY3RpdmUnKTsKICAgIH0sCgogICAg +c2hvd1JldkRpZmYoKSB7CiAgICAgICAgdmFyIGRvYyA9IERyaXZlRlMuZG9jdW1lbnRzLmZpbmQo +ZnVuY3Rpb24oZCkgeyByZXR1cm4gZC5pZCA9PT0gRHJpdmVQb3J0YWwuX3JldkRvY0lkOyB9KTsK +ICAgICAgICBpZiAoIWRvYykgcmV0dXJuOwogICAgICAgIHRoaXMuX3Jldk1vZGUgPSAnZGlmZic7 +CgogICAgICAgIHZhciBjb250ZW50RWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmV2aXNp +b25Db250ZW50Jyk7CiAgICAgICAgdmFyIHJldiA9ICh0aGlzLl9yZXZTZWxlY3RlZElkeCA9PT0g +LTEpID8gbnVsbCA6IChkb2MucmV2aXNpb25zIHx8IFtdKVt0aGlzLl9yZXZTZWxlY3RlZElkeF07 +CgogICAgICAgIGlmICghcmV2IHx8IHRoaXMuX3JldlNlbGVjdGVkSWR4ID09PSAtMSkgewogICAg +ICAgICAgICBjb250ZW50RWwuaW5uZXJIVE1MID0gJzxkaXYgc3R5bGU9InRleHQtYWxpZ246Y2Vu +dGVyO2NvbG9yOnZhcigtLXRleHQtbXV0ZWQpO21hcmdpbi10b3A6NjBweDsiPkRpZmYgbnVyIGbD +vHIgZnLDvGhlcmUgVmVyc2lvbmVuIHZlcmZ1ZWdiYXI8L2Rpdj4nOwogICAgICAgICAgICByZXR1 +cm47CiAgICAgICAgfQoKICAgICAgICB2YXIgb2xkSW5oYWx0ID0gcmV2LmluaGFsdCB8fCAnJzsK +ICAgICAgICB2YXIgbmV3SW5oYWx0ID0gZG9jLmluaGFsdCB8fCAnJzsKICAgICAgICB2YXIgZGlm +Zkh0bWwgPSB0aGlzLl9jb21wdXRlRGlmZihvbGRJbmhhbHQsIG5ld0luaGFsdCk7CgogICAgICAg +IHZhciB0aXRlbENoYW5nZWQgPSByZXYudGl0ZWwgIT09IGRvYy50aXRlbDsKCiAgICAgICAgY29u +dGVudEVsLmlubmVySFRNTCA9CiAgICAgICAgICAgICc8ZGl2IGNsYXNzPSJkaWZmLWxlZ2VuZCI+ +JyArCiAgICAgICAgICAgICAgICAnPHNwYW4+PHNwYW4gY2xhc3M9ImRpZmYtYWRkZWQiPkJlaXNw +aWVsPC9zcGFuPiBIaW56dWdlZnVlZ3Q8L3NwYW4+JyArCiAgICAgICAgICAgICAgICAnPHNwYW4+ +PHNwYW4gY2xhc3M9ImRpZmYtcmVtb3ZlZCI+QmVpc3BpZWw8L3NwYW4+IEVudGZlcm50PC9zcGFu +PicgKwogICAgICAgICAgICAnPC9kaXY+JyArCiAgICAgICAgICAgICh0aXRlbENoYW5nZWQgPwog +ICAgICAgICAgICAgICAgJzxkaXYgc3R5bGU9Im1hcmdpbi1ib3R0b206MTJweDtwYWRkaW5nOjhw +eCAxMnB4O2JvcmRlci1yYWRpdXM6NnB4O2JhY2tncm91bmQ6dmFyKC0tYmctY2FyZC1hbHQpO2Zv +bnQtc2l6ZToxM3B4OyI+JyArCiAgICAgICAgICAgICAgICAgICAgJ1RpdGVsOiA8c3BhbiBjbGFz +cz0iZGlmZi1yZW1vdmVkIj4nICsgRHJpdmVQb3J0YWwuZXNjYXBlSFRNTChyZXYudGl0ZWwgfHwg +JycpICsgJzwvc3Bhbj4gJnJhcnI7ICcgKwogICAgICAgICAgICAgICAgICAgICc8c3BhbiBjbGFz +cz0iZGlmZi1hZGRlZCI+JyArIERyaXZlUG9ydGFsLmVzY2FwZUhUTUwoZG9jLnRpdGVsIHx8ICcn +KSArICc8L3NwYW4+JyArCiAgICAgICAgICAgICAgICAnPC9kaXY+JyA6ICcnKSArCiAgICAgICAg +ICAgIGRpZmZIdG1sOwoKICAgICAgICAvLyBCdXR0b24tU3RhdHVzCiAgICAgICAgdmFyIGJ0bkMg +PSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmV2QnRuQ29udGVudCcpOwogICAgICAgIHZhciBi +dG5EID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3JldkJ0bkRpZmYnKTsKICAgICAgICBpZiAo +YnRuQykgYnRuQy5jbGFzc0xpc3QucmVtb3ZlKCdhY3RpdmUnKTsKICAgICAgICBpZiAoYnRuRCkg +YnRuRC5jbGFzc0xpc3QuYWRkKCdhY3RpdmUnKTsKICAgIH0sCgogICAgYXN5bmMgcmVzdG9yZVJl +dmlzaW9uKCkgewogICAgICAgIHZhciBkb2MgPSBEcml2ZUZTLmRvY3VtZW50cy5maW5kKGZ1bmN0 +aW9uKGQpIHsgcmV0dXJuIGQuaWQgPT09IERyaXZlUG9ydGFsLl9yZXZEb2NJZDsgfSk7CiAgICAg +ICAgaWYgKCFkb2MgfHwgdGhpcy5fcmV2U2VsZWN0ZWRJZHggPCAwKSByZXR1cm47CiAgICAgICAg +dmFyIHJldiA9IChkb2MucmV2aXNpb25zIHx8IFtdKVt0aGlzLl9yZXZTZWxlY3RlZElkeF07CiAg +ICAgICAgaWYgKCFyZXYpIHJldHVybjsKCiAgICAgICAgaWYgKCFjb25maXJtKCdWZXJzaW9uICcg +KyAodGhpcy5fcmV2U2VsZWN0ZWRJZHggKyAxKSArICcgd2llZGVyaGVyc3RlbGxlbj9cblxuRGVy +IGFrdHVlbGxlIEluaGFsdCB3aXJkIGFscyBuZXVlIFJldmlzaW9uIGdlc2ljaGVydC4nKSkgcmV0 +dXJuOwoKICAgICAgICB2YXIgdXNlcm5hbWUgPSAoRHJpdmVGUy5lbnZpcm9uICYmIERyaXZlRlMu +ZW52aXJvbi51c2VybmFtZSkgPyBEcml2ZUZTLmVudmlyb24udXNlcm5hbWUgOiAnVW5iZWthbm50 +JzsKCiAgICAgICAgLy8gQWt0dWVsbGVuIFN0YW5kIGFscyBSZXZpc2lvbiBzaWNoZXJuCiAgICAg +ICAgaWYgKCFkb2MucmV2aXNpb25zKSBkb2MucmV2aXNpb25zID0gW107CiAgICAgICAgZG9jLnJl +dmlzaW9ucy5wdXNoKHsKICAgICAgICAgICAgaW5oYWx0OiBkb2MuaW5oYWx0LAogICAgICAgICAg +ICB0aXRlbDogZG9jLnRpdGVsLAogICAgICAgICAgICBzdGF0dXM6IGRvYy5zdGF0dXMsCiAgICAg +ICAgICAgIHNhdmVkQXQ6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSwKICAgICAgICAgICAgc2F2 +ZWRCeTogdXNlcm5hbWUKICAgICAgICB9KTsKICAgICAgICB3aGlsZSAoZG9jLnJldmlzaW9ucy5s +ZW5ndGggPiA2KSB7CiAgICAgICAgICAgIGRvYy5yZXZpc2lvbnMuc2hpZnQoKTsKICAgICAgICB9 +CgogICAgICAgIC8vIFJldmlzaW9uIHdpZWRlcmhlcnN0ZWxsZW4KICAgICAgICBkb2MuaW5oYWx0 +ID0gcmV2LmluaGFsdDsKICAgICAgICBkb2MudGl0ZWwgPSByZXYudGl0ZWw7CgogICAgICAgIHRy +eSB7CiAgICAgICAgICAgIHZhciByZXN1bHQgPSBhd2FpdCBEcml2ZUZTLnNhdmVEb2N1bWVudChk +b2MpOwogICAgICAgICAgICBpZiAocmVzdWx0ID09PSB0cnVlKSB7CiAgICAgICAgICAgICAgICBz +aG93VG9hc3QoJ1ZlcnNpb24gJyArICh0aGlzLl9yZXZTZWxlY3RlZElkeCArIDEpICsgJyB3aWVk +ZXJoZXJnZXN0ZWxsdCcsICdzdWNjZXNzJyk7CiAgICAgICAgICAgICAgICB0aGlzLmNsb3NlUmV2 +aXNpb25zKCk7CiAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcigpOwogICAgICAgICAgICAgICAg +YXdhaXQgdGhpcy5zZWxlY3REb2N1bWVudChkb2MuaWQpOwogICAgICAgICAgICB9IGVsc2Ugewog +ICAgICAgICAgICAgICAgc2hvd1RvYXN0KCdGZWhsZXI6ICcgKyByZXN1bHQsICdlcnJvcicpOwog +ICAgICAgICAgICB9CiAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICBzaG93VG9hc3Qo +J0ZlaGxlcjogJyArIGUubWVzc2FnZSwgJ2Vycm9yJyk7CiAgICAgICAgfQogICAgfSwKCiAgICBh +c3luYyBzZWxlY3REb2N1bWVudChkb2NJZCkgewogICAgICAgIHRoaXMuc2VsZWN0ZWREb2NJZCA9 +IGRvY0lkOwogICAgICAgIHRoaXMuX2RpZmZWaXNpYmxlID0gZmFsc2U7CgogICAgICAgIC8vIExh +ZGUgYWt0dWVsbHN0ZSBWZXJzaW9uIHZvbiBEaXNrCiAgICAgICAgY29uc3QgZG9jID0gYXdhaXQg +RHJpdmVGUy5sb2FkRG9jdW1lbnQoZG9jSWQpOwogICAgICAgIGlmICghZG9jKSB7CiAgICAgICAg +ICAgIHNob3dUb2FzdCgnRG9rdW1lbnQga29ubnRlIG5pY2h0IGdlbGFkZW4gd2VyZGVuJywgJ2Vy +cm9yJyk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIC8vIEluLU1lbW9y +eSBha3R1YWxpc2llcmVuCiAgICAgICAgY29uc3QgaWR4ID0gRHJpdmVGUy5kb2N1bWVudHMuZmlu +ZEluZGV4KGQgPT4gZC5pZCA9PT0gZG9jSWQpOwogICAgICAgIGlmIChpZHggPj0gMCkgRHJpdmVG +Uy5kb2N1bWVudHNbaWR4XSA9IGRvYzsKCiAgICAgICAgdGhpcy5yZW5kZXJMaXN0KCk7CiAgICAg +ICAgdGhpcy5yZW5kZXJEZXRhaWwoZG9jKTsKICAgIH0sCgogICAgcmVuZGVyRGV0YWlsKGRvYykg +ewogICAgICAgIGNvbnN0IGRldGFpbENvbnRhaW5lciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlk +KCdkb2N1bWVudERldGFpbCcpOwogICAgICAgIGNvbnN0IHN0YXR1c0NvbmZpZyA9IERyaXZlRlMu +Y29uZmlnLnN0YXR1cyB8fCB7fTsKICAgICAgICBjb25zdCBjZmcgPSBzdGF0dXNDb25maWdbZG9j +LnN0YXR1c10gfHwgeyBjb2xvcjogJyNlZWUnLCB0ZXh0Q29sb3I6ICcjMzMzJywgaWNvbjogJycs +IGxhYmVsOiBkb2Muc3RhdHVzIH07CgogICAgICAgIGxldCBtZWRpYUhUTUwgPSAnJzsKICAgICAg +ICBpZiAoZG9jLm1lZGlhcyAmJiBkb2MubWVkaWFzLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAg +Ly8gT25seSBzaG93IGF0dGFjaG1lbnRzIHNlY3Rpb24gKGlubGluZSBtZWRpYSBpcyByZW5kZXJl +ZCBpbiBkb2MuaW5oYWx0KQogICAgICAgICAgICBjb25zdCBhdHRhY2htZW50cyA9IGRvYy5tZWRp +YXMuZmlsdGVyKG0gPT4gIW0uZGlzcGxheU1vZGUgfHwgbS5kaXNwbGF5TW9kZSA9PT0gJ2F0dGFj +aG1lbnQnKTsKICAgICAgICAgICAgY29uc3QgaW5saW5lTWVkaWEgPSBkb2MubWVkaWFzLmZpbHRl +cihtID0+IG0uZGlzcGxheU1vZGUgJiYgbS5kaXNwbGF5TW9kZSAhPT0gJ2F0dGFjaG1lbnQnKTsK +CiAgICAgICAgICAgIGxldCBzZWN0aW9ucyA9ICcnOwoKICAgICAgICAgICAgaWYgKGF0dGFjaG1l +bnRzLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgICAgIHNlY3Rpb25zICs9ICc8aDMgc3R5bGU9 +ImZvbnQtc2l6ZToxNnB4OyBmb250LXdlaWdodDo2MDA7IGNvbG9yOnZhcigtLXRleHQtaGVhZGlu +Zyk7IG1hcmdpbi1ib3R0b206MTJweDsiPkFuaMOkbmdlICgnICsgYXR0YWNobWVudHMubGVuZ3Ro +ICsgJyk8L2gzPic7CiAgICAgICAgICAgICAgICBzZWN0aW9ucyArPSAnPGRpdiBzdHlsZT0iZGlz +cGxheTpmbGV4OyBmbGV4LWRpcmVjdGlvbjpjb2x1bW47IGdhcDo4cHg7IG1hcmdpbi1ib3R0b206 +MjBweDsiPic7CiAgICAgICAgICAgICAgICBhdHRhY2htZW50cy5mb3JFYWNoKG1lZGlhID0+IHsK +ICAgICAgICAgICAgICAgICAgICBjb25zdCB0eXBlID0gbWVkaWEudHlwZSB8fCAnZmlsZSc7CiAg +ICAgICAgICAgICAgICAgICAgY29uc3QgdHlwZUxhYmVsID0gdHlwZS50b1VwcGVyQ2FzZSgpOwog +ICAgICAgICAgICAgICAgICAgIGNvbnN0IHNhZmVVcmwgPSB0aGlzLmVzY2FwZUF0dHIobWVkaWEu +dXJsKTsKICAgICAgICAgICAgICAgICAgICBjb25zdCBzYWZlVGl0bGUgPSB0aGlzLmVzY2FwZUF0 +dHIobWVkaWEudGl0bGUgfHwgJycpOwoKICAgICAgICAgICAgICAgICAgICBzZWN0aW9ucyArPSAn +PGRpdiBjbGFzcz0iYXR0YWNobWVudC1pdGVtIiBvbmNsaWNrPSJvcGVuTWVkaWFNb2RhbChcJycg +KyBzYWZlVXJsICsgJ1wnLFwnJyArIHR5cGUgKyAnXCcsXCcnICsgc2FmZVRpdGxlICsgJ1wnKSI+ +JyArCiAgICAgICAgICAgICAgICAgICAgICAgICc8c3BhbiBjbGFzcz0iZHJpdmUtZmlsZS1pY29u +ICcgKyB0eXBlICsgJyI+JyArIHR5cGVMYWJlbCArICc8L3NwYW4+JyArCiAgICAgICAgICAgICAg +ICAgICAgICAgICc8ZGl2IGNsYXNzPSJhdHRhY2htZW50LWluZm8iPicgKwogICAgICAgICAgICAg +ICAgICAgICAgICAgICAgJzxkaXYgY2xhc3M9ImF0dGFjaG1lbnQtdGl0bGUiPicgKyB0aGlzLmVz +Y2FwZUhUTUwobWVkaWEudGl0bGUgfHwgbWVkaWEudXJsLnNwbGl0KCcvJykucG9wKCkpICsgJzwv +ZGl2PicgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJzxkaXYgY2xhc3M9ImF0dGFjaG1l +bnQtbWV0YSI+JyArIHRoaXMuZXNjYXBlSFRNTChtZWRpYS5kZXNjcmlwdGlvbiB8fCAnJykgKyAn +PC9kaXY+JyArCiAgICAgICAgICAgICAgICAgICAgICAgICc8L2Rpdj4nICsKICAgICAgICAgICAg +ICAgICAgICAgICAgJzxkaXYgY2xhc3M9ImF0dGFjaG1lbnQtYWN0aW9ucyIgb25jbGljaz0iZXZl +bnQuc3RvcFByb3BhZ2F0aW9uKCkiPic7CgogICAgICAgICAgICAgICAgICAgIGlmICh0eXBlID09 +PSAncGRmJykgewogICAgICAgICAgICAgICAgICAgICAgICBzZWN0aW9ucyArPSAnPGJ1dHRvbiBv +bmNsaWNrPSJ3aW5kb3cub3BlbihcJycgKyBzYWZlVXJsICsgJ1wnLFwnX2JsYW5rXCcpIj5OZXVl +ciBUYWI8L2J1dHRvbj4nOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAg +ICBzZWN0aW9ucyArPSAnPGJ1dHRvbiBvbmNsaWNrPSJvcGVuTWVkaWFNb2RhbChcJycgKyBzYWZl +VXJsICsgJ1wnLFwnJyArIHR5cGUgKyAnXCcsXCcnICsgc2FmZVRpdGxlICsgJ1wnKSI+QW56ZWln +ZW48L2J1dHRvbj4nOwogICAgICAgICAgICAgICAgICAgIHNlY3Rpb25zICs9ICc8L2Rpdj48L2Rp +dj4nOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBzZWN0aW9ucyArPSAnPC9k +aXY+JzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKGlubGluZU1lZGlhLmxlbmd0aCA+ +IDApIHsKICAgICAgICAgICAgICAgIHNlY3Rpb25zICs9ICc8aDMgc3R5bGU9ImZvbnQtc2l6ZTox +NnB4OyBmb250LXdlaWdodDo2MDA7IGNvbG9yOnZhcigtLXRleHQtaGVhZGluZyk7IG1hcmdpbi1i +b3R0b206MTJweDsiPkVpbmdlYmV0dGV0ZSBNZWRpZW4gKCcgKyBpbmxpbmVNZWRpYS5sZW5ndGgg +KyAnKTwvaDM+JzsKICAgICAgICAgICAgICAgIHNlY3Rpb25zICs9ICc8ZGl2IHN0eWxlPSJkaXNw +bGF5OmZsZXg7IGZsZXgtZGlyZWN0aW9uOmNvbHVtbjsgZ2FwOjhweDsiPic7CiAgICAgICAgICAg +ICAgICBpbmxpbmVNZWRpYS5mb3JFYWNoKG1lZGlhID0+IHsKICAgICAgICAgICAgICAgICAgICBj +b25zdCB0eXBlID0gbWVkaWEudHlwZSB8fCAnZmlsZSc7CiAgICAgICAgICAgICAgICAgICAgY29u +c3QgdHlwZUxhYmVsID0gdHlwZS50b1VwcGVyQ2FzZSgpOwogICAgICAgICAgICAgICAgICAgIGNv +bnN0IHNhZmVVcmwgPSB0aGlzLmVzY2FwZUF0dHIobWVkaWEudXJsKTsKICAgICAgICAgICAgICAg +ICAgICBjb25zdCBzYWZlVGl0bGUgPSB0aGlzLmVzY2FwZUF0dHIobWVkaWEudGl0bGUgfHwgJycp +OwogICAgICAgICAgICAgICAgICAgIGNvbnN0IG1vZGVMYWJlbCA9IG1lZGlhLmRpc3BsYXlNb2Rl +ID09PSAnaW5saW5lJyA/ICdCaWxkJyA6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg +ICAgICAgbWVkaWEuZGlzcGxheU1vZGUgPT09ICdwZGYtbGluaycgPyAnUERGLUxpbmsnIDoKICAg +ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYS5kaXNwbGF5TW9kZSA9PT0g +J3BkZi1pZnJhbWUnID8gJ1BERiBlaW5nZWJldHRldCcgOiBtZWRpYS5kaXNwbGF5TW9kZTsKCiAg +ICAgICAgICAgICAgICAgICAgc2VjdGlvbnMgKz0gJzxkaXYgY2xhc3M9ImF0dGFjaG1lbnQtaXRl +bSIgb25jbGljaz0ib3Blbk1lZGlhTW9kYWwoXCcnICsgc2FmZVVybCArICdcJyxcJycgKyB0eXBl +ICsgJ1wnLFwnJyArIHNhZmVUaXRsZSArICdcJykiPicgKwogICAgICAgICAgICAgICAgICAgICAg +ICAnPHNwYW4gY2xhc3M9ImRyaXZlLWZpbGUtaWNvbiAnICsgdHlwZSArICciPicgKyB0eXBlTGFi +ZWwgKyAnPC9zcGFuPicgKwogICAgICAgICAgICAgICAgICAgICAgICAnPGRpdiBjbGFzcz0iYXR0 +YWNobWVudC1pbmZvIj4nICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICc8ZGl2IGNsYXNz +PSJhdHRhY2htZW50LXRpdGxlIj4nICsgdGhpcy5lc2NhcGVIVE1MKG1lZGlhLnRpdGxlIHx8ICcn +KSArICc8L2Rpdj4nICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICc8ZGl2IGNsYXNzPSJh +dHRhY2htZW50LW1ldGEiPicgKyB0aGlzLmVzY2FwZUhUTUwobW9kZUxhYmVsKSArIChtZWRpYS5h +bGlnbm1lbnQgPyAnIHwgJyArIG1lZGlhLmFsaWdubWVudCA6ICcnKSArICc8L2Rpdj4nICsKICAg +ICAgICAgICAgICAgICAgICAgICAgJzwvZGl2PjwvZGl2Pic7CiAgICAgICAgICAgICAgICB9KTsK +ICAgICAgICAgICAgICAgIHNlY3Rpb25zICs9ICc8L2Rpdj4nOwogICAgICAgICAgICB9CgogICAg +ICAgICAgICBpZiAoc2VjdGlvbnMpIHsKICAgICAgICAgICAgICAgIG1lZGlhSFRNTCA9ICc8ZGl2 +IGNsYXNzPSJtZWRpYS1zZWN0aW9uIj4nICsgc2VjdGlvbnMgKyAnPC9kaXY+JzsKICAgICAgICAg +ICAgfQogICAgICAgIH0KCiAgICAgICAgZGV0YWlsQ29udGFpbmVyLmlubmVySFRNTCA9CiAgICAg +ICAgICAgICc8ZGl2IHN0eWxlPSJkaXNwbGF5OmZsZXg7IGp1c3RpZnktY29udGVudDpzcGFjZS1i +ZXR3ZWVuOyBhbGlnbi1pdGVtczpmbGV4LXN0YXJ0OyBtYXJnaW4tYm90dG9tOjIwcHg7Ij4nICsK +ICAgICAgICAgICAgICAgICc8ZGl2IGNsYXNzPSJkZXRhaWwtaGVhZGVyIiBzdHlsZT0iZmxleDox +OyI+JyArCiAgICAgICAgICAgICAgICAgICAgJzxoMSBjbGFzcz0iZGV0YWlsLXRpdGxlIj4nICsg +dGhpcy5lc2NhcGVIVE1MKGRvYy50aXRlbCkgKyAnPC9oMT4nICsKICAgICAgICAgICAgICAgICAg +ICAnPGRpdiBjbGFzcz0iZGV0YWlsLW1ldGEiPicgKwogICAgICAgICAgICAgICAgICAgICAgICAn +PGRpdiBjbGFzcz0ibWV0YS1pdGVtIj48ZGl2IGNsYXNzPSJtZXRhLWxhYmVsIj5LYXRlZ29yaWU8 +L2Rpdj48ZGl2PicgKyB0aGlzLmVzY2FwZUhUTUwoZG9jLmthdGVnb3JpZSkgKyAnPC9kaXY+PC9k +aXY+JyArCiAgICAgICAgICAgICAgICAgICAgICAgICc8ZGl2IGNsYXNzPSJtZXRhLWl0ZW0iPjxk +aXYgY2xhc3M9Im1ldGEtbGFiZWwiPlN0YXR1czwvZGl2PjxkaXY+JyArCiAgICAgICAgICAgICAg +ICAgICAgICAgICAgICAnPHNwYW4gY2xhc3M9InN0YXR1cy1iYWRnZSIgc3R5bGU9ImJhY2tncm91 +bmQtY29sb3I6JyArIGNmZy5jb2xvciArICc7IGNvbG9yOicgKyBjZmcudGV4dENvbG9yICsgJzsi +PicgKyBjZmcubGFiZWwgKyAnPC9zcGFuPicgKwogICAgICAgICAgICAgICAgICAgICAgICAnPC9k +aXY+PC9kaXY+JyArCiAgICAgICAgICAgICAgICAgICAgICAgICc8ZGl2IGNsYXNzPSJtZXRhLWl0 +ZW0iPjxkaXYgY2xhc3M9Im1ldGEtbGFiZWwiPlZlcnNpb248L2Rpdj48ZGl2PjxzcGFuIHN0eWxl +PSJjdXJzb3I6cG9pbnRlcjtib3JkZXItYm90dG9tOjFweCBkYXNoZWQgdmFyKC0tdGV4dC1tdXRl +ZCk7IiBvbmNsaWNrPSJzaG93VmVyc2lvbkxvZ2ljKCkiIHRpdGxlPSJLbGlja2UgZsO8ciBlaW5l +IEVya2zDpHJ1bmcgZGVyIFZlcnNpb25pZXJ1bmciPicgKyB0aGlzLmVzY2FwZUhUTUwoZG9jLnZl +cnNpb24gfHwgJy0nKSArICc8L3NwYW4+PC9kaXY+PC9kaXY+JyArCiAgICAgICAgICAgICAgICAg +ICAgICAgICc8ZGl2IGNsYXNzPSJtZXRhLWl0ZW0iPjxkaXYgY2xhc3M9Im1ldGEtbGFiZWwiPkVy +c3RlbGx0PC9kaXY+PGRpdj4nICsgZm9ybWF0RGF0ZShkb2MuZXJzdGVsbHQpICsgJzwvZGl2Pjwv +ZGl2PicgKwogICAgICAgICAgICAgICAgICAgICAgICAnPGRpdiBjbGFzcz0ibWV0YS1pdGVtIj48 +ZGl2IGNsYXNzPSJtZXRhLWxhYmVsIj5HZcOkbmRlcnQ8L2Rpdj48ZGl2PicgKyBmb3JtYXREYXRl +KGRvYy5nZWFlbmRlcnQpICsgJzwvZGl2PjwvZGl2PicgKwogICAgICAgICAgICAgICAgICAgICAg +ICAoZG9jLmVyc3RlbGx0Vm9uID8gJzxkaXYgY2xhc3M9Im1ldGEtaXRlbSI+PGRpdiBjbGFzcz0i +bWV0YS1sYWJlbCI+RXJzdGVsbHQgdm9uPC9kaXY+PGRpdj4nICsgdGhpcy5lc2NhcGVIVE1MKGRv +Yy5lcnN0ZWxsdFZvbikgKyAnPC9kaXY+PC9kaXY+JyA6ICcnKSArCiAgICAgICAgICAgICAgICAg +ICAgICAgIChkb2MuYmVhcmJlaXRldFZvbiA/ICc8ZGl2IGNsYXNzPSJtZXRhLWl0ZW0iPjxkaXYg +Y2xhc3M9Im1ldGEtbGFiZWwiPkJlYXJiZWl0ZXQgdm9uPC9kaXY+PGRpdj4nICsgdGhpcy5lc2Nh +cGVIVE1MKGRvYy5iZWFyYmVpdGV0Vm9uKSArICc8L2Rpdj48L2Rpdj4nIDogJycpICsKICAgICAg +ICAgICAgICAgICAgICAgICAgKGRvYy5wYXJlbnRJZCA/ICc8ZGl2IGNsYXNzPSJtZXRhLWl0ZW0i +PjxkaXYgY2xhc3M9Im1ldGEtbGFiZWwiPsOcYmVyYXJ0aWtlbDwvZGl2PjxkaXY+PGEgc3R5bGU9 +ImNvbG9yOnZhcigtLXRleHQtaGVhZGluZyk7Y3Vyc29yOnBvaW50ZXI7IiBvbmNsaWNrPSJEcml2 +ZVBvcnRhbC5zZWxlY3REb2N1bWVudChcJycgKyBEcml2ZVBvcnRhbC5lc2NhcGVBdHRyKGRvYy5w +YXJlbnRJZCkgKyAnXCcpIj4nICsgdGhpcy5lc2NhcGVIVE1MKChEcml2ZUZTLmRvY3VtZW50cy5m +aW5kKGZ1bmN0aW9uKGQpe3JldHVybiBkLmlkPT09ZG9jLnBhcmVudElkfSl8fHt9KS50aXRlbCB8 +fCBkb2MucGFyZW50SWQpICsgJzwvYT48L2Rpdj48L2Rpdj4nIDogJycpICsKICAgICAgICAgICAg +ICAgICAgICAgICAgKChkb2Muc2NobGFnd29lcnRlciAmJiBkb2Muc2NobGFnd29lcnRlci5sZW5n +dGgpID8gJzxkaXYgY2xhc3M9Im1ldGEtaXRlbSIgc3R5bGU9ImZsZXgtYmFzaXM6MTAwJTsiPjxk +aXYgY2xhc3M9Im1ldGEtbGFiZWwiPlNjaGxhZ3fDtnJ0ZXI8L2Rpdj48ZGl2PicgKyBkb2Muc2No +bGFnd29lcnRlci5tYXAoZnVuY3Rpb24oayl7cmV0dXJuICc8c3BhbiBjbGFzcz0ia2V5d29yZC10 +YWciPicrRHJpdmVQb3J0YWwuZXNjYXBlSFRNTChrKSsnPC9zcGFuPic7fSkuam9pbignICcpICsg +JzwvZGl2PjwvZGl2PicgOiAnJykgKwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9yZW5k +ZXJDaGlsZEFydGljbGVzKGRvYykgKwogICAgICAgICAgICAgICAgICAgICc8L2Rpdj4nICsKICAg +ICAgICAgICAgICAgICc8L2Rpdj4nICsKICAgICAgICAgICAgICAgICc8ZGl2IGNsYXNzPSJkZXRh +aWwtYWN0aW9ucyI+JyArCiAgICAgICAgICAgICAgICAgICAgKERyaXZlRlMucmVhZE9ubHkgPyAn +JyA6ICc8YnV0dG9uIG9uY2xpY2s9IkRyaXZlRWRpdG9yLmVkaXQoXCcnICsgRHJpdmVQb3J0YWwu +ZXNjYXBlQXR0cihkb2MuaWQpICsgJ1wnKSI+QmVhcmJlaXRlbjwvYnV0dG9uPicpICsKICAgICAg +ICAgICAgICAgICAgICAodGhpcy5fY2FuU2VlUmV2aXNpb25zKGRvYykgJiYgZG9jLnJldmlzaW9u +cyAmJiBkb2MucmV2aXNpb25zLmxlbmd0aCA+IDAgPyAnPGJ1dHRvbiBzdHlsZT0iYm9yZGVyLWNv +bG9yOiMzYjgyZjY7Y29sb3I6IzNiODJmNjsiIG9uY2xpY2s9IkRyaXZlUG9ydGFsLm9wZW5SZXZp +c2lvbnMoXCcnICsgRHJpdmVQb3J0YWwuZXNjYXBlQXR0cihkb2MuaWQpICsgJ1wnKSI+VmVyc2lv +bmVuICgnICsgZG9jLnJldmlzaW9ucy5sZW5ndGggKyAnKTwvYnV0dG9uPicgOiAnJykgKwogICAg +ICAgICAgICAgICAgICAgIChEcml2ZUZTLnJlYWRPbmx5ID8gJycgOiAnPGJ1dHRvbiBjbGFzcz0i +YnRuLWRhbmdlciIgb25jbGljaz0iRHJpdmVQb3J0YWwuZGVsZXRlRG9jdW1lbnQoXCcnICsgRHJp +dmVQb3J0YWwuZXNjYXBlQXR0cihkb2MuaWQpICsgJ1wnKSI+TMO2c2NoZW48L2J1dHRvbj4nKSAr +CiAgICAgICAgICAgICAgICAgICAgKGRvYy5zdGF0dXMgPT09ICdQcsO8ZnVuZycgJiYgRHJpdmVH +b3Zlcm5hbmNlLmNhbkFwcHJvdmUoZG9jKSA/CiAgICAgICAgICAgICAgICAgICAgICAgICgoZG9j +LnJldmlzaW9ucyAmJiBkb2MucmV2aXNpb25zLmxlbmd0aCA+IDApID8gJzxidXR0b24gc3R5bGU9 +ImJvcmRlci1jb2xvcjp2YXIoLS10ZXh0LWhlYWRpbmcpO2NvbG9yOnZhcigtLXRleHQtaGVhZGlu +Zyk7IiBvbmNsaWNrPSJEcml2ZVBvcnRhbC50b2dnbGVEaWZmKFwnJyArIERyaXZlUG9ydGFsLmVz +Y2FwZUF0dHIoZG9jLmlkKSArICdcJykiIGlkPSJidG5EaWZmIj7DhG5kZXJ1bmdlbiBhbnplaWdl +bjwvYnV0dG9uPicgOiAnJykgKwogICAgICAgICAgICAgICAgICAgICAgICAnPGJ1dHRvbiBzdHls +ZT0iYm9yZGVyLWNvbG9yOiMyOGE3NDU7Y29sb3I6IzI4YTc0NTsiIG9uY2xpY2s9IkRyaXZlR292 +ZXJuYW5jZS5vcGVuUmV2aWV3RGlhbG9nKFwnJyArIERyaXZlUG9ydGFsLmVzY2FwZUF0dHIoZG9j +LmlkKSArICdcJyxcJ2FwcHJvdmVcJykiPkZyZWlnZWJlbjwvYnV0dG9uPicgKwogICAgICAgICAg +ICAgICAgICAgICAgICAnPGJ1dHRvbiBzdHlsZT0iYm9yZGVyLWNvbG9yOiNkYzM1NDU7Y29sb3I6 +I2RjMzU0NTsiIG9uY2xpY2s9IkRyaXZlR292ZXJuYW5jZS5vcGVuUmV2aWV3RGlhbG9nKFwnJyAr +IERyaXZlUG9ydGFsLmVzY2FwZUF0dHIoZG9jLmlkKSArICdcJyxcJ3JlamVjdFwnKSI+QWJsZWhu +ZW48L2J1dHRvbj4nIDogJycpICsKICAgICAgICAgICAgICAgICc8L2Rpdj4nICsKICAgICAgICAg +ICAgJzwvZGl2PicgKwogICAgICAgICAgICAnPGRpdiBjbGFzcz0iZGV0YWlsLWNvbnRlbnQiIGlk +PSJkZXRhaWxDb250ZW50Ij4nICsgKGRvYy5pbmhhbHQgfHwgJycpICsgJzwvZGl2PicgKwogICAg +ICAgICAgICB0aGlzLnJlbmRlckNvbnRyaWJ1dG9ycyhkb2MpICsKICAgICAgICAgICAgdGhpcy5y +ZW5kZXJSZXZpZXdIaXN0b3J5KGRvYykgKwogICAgICAgICAgICBtZWRpYUhUTUw7CgogICAgICAg +IC8vIFBvc3QtUmVuZGVyOiBBbGxlIE1lZGllbiBpbSBJbmhhbHQga2xpY2tiYXIgbWFjaGVuIChv +ZWZmbmV0IE1vZGFsKQogICAgICAgIHNldFRpbWVvdXQoKCkgPT4gewogICAgICAgICAgICBjb25z +dCBjb250ZW50ID0gZGV0YWlsQ29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJy5kZXRhaWwtY29udGVu +dCcpOwogICAgICAgICAgICBpZiAoIWNvbnRlbnQpIHJldHVybjsKCiAgICAgICAgICAgIC8vIEJp +bGRlcjogS2xpY2sgb2VmZm5ldCBNb2RhbAogICAgICAgICAgICBjb250ZW50LnF1ZXJ5U2VsZWN0 +b3JBbGwoJy5kcml2ZS1tZWRpYSBpbWcsIC5kZXRhaWwtY29udGVudCA+IGltZycpLmZvckVhY2go +aW1nID0+IHsKICAgICAgICAgICAgICAgIGlmIChpbWcuX21vZGFsQm91bmQpIHJldHVybjsKICAg +ICAgICAgICAgICAgIGltZy5zdHlsZS5jdXJzb3IgPSAncG9pbnRlcic7CiAgICAgICAgICAgICAg +ICBpbWcub25jbGljayA9IGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICBlLnN0b3BQ +cm9wYWdhdGlvbigpOwogICAgICAgICAgICAgICAgICAgIG9wZW5NZWRpYU1vZGFsKGltZy5zcmMs +ICdpbWFnZScsIGltZy5hbHQgfHwgJycpOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAg +ICAgIGltZy5fbW9kYWxCb3VuZCA9IHRydWU7CiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAg +Ly8gUERGLUxpbmtzOiA8YSB0YXJnZXQ9Il9ibGFuayI+IGluIE1vZGFsLUtsaWNrIHVtd2FuZGVs +bgogICAgICAgICAgICBjb250ZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5kcml2ZS1tZWRpYS1wZGYt +bGluaycpLmZvckVhY2goZWwgPT4gewogICAgICAgICAgICAgICAgY29uc3QgbGluayA9IGVsLnF1 +ZXJ5U2VsZWN0b3IoJ2EnKTsKICAgICAgICAgICAgICAgIGNvbnN0IHRpdGxlU3BhbiA9IGVsLnF1 +ZXJ5U2VsZWN0b3IoJy5wZGYtdGl0bGUnKTsKICAgICAgICAgICAgICAgIGNvbnN0IHBkZlVybCA9 +IGxpbmsgPyBsaW5rLmhyZWYgOiAnJzsKICAgICAgICAgICAgICAgIGNvbnN0IHBkZlRpdGxlID0g +KHRpdGxlU3BhbiB8fCBsaW5rIHx8IHt9KS50ZXh0Q29udGVudCB8fCAnUERGJzsKICAgICAgICAg +ICAgICAgIGlmIChsaW5rKSB7CiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3BhbiA9IGRvY3Vt +ZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTsKICAgICAgICAgICAgICAgICAgICBzcGFuLmNsYXNz +TmFtZSA9ICdwZGYtdGl0bGUnOwogICAgICAgICAgICAgICAgICAgIHNwYW4udGV4dENvbnRlbnQg +PSBsaW5rLnRleHRDb250ZW50OwogICAgICAgICAgICAgICAgICAgIGxpbmsucmVwbGFjZVdpdGgo +c3Bhbik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbC5vbmNsaWNrID0gZnVu +Y3Rpb24oZSkgeyBlLnByZXZlbnREZWZhdWx0KCk7IGUuc3RvcFByb3BhZ2F0aW9uKCk7IG9wZW5N +ZWRpYU1vZGFsKHBkZlVybCwgJ3BkZicsIHBkZlRpdGxlKTsgfTsKICAgICAgICAgICAgfSk7Cgog +ICAgICAgICAgICAvLyBQREYtaUZyYW1lczogS2xpY2sgb2VmZm5ldCBNb2RhbAogICAgICAgICAg +ICBjb250ZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5kcml2ZS1tZWRpYS1wZGYtaWZyYW1lJykuZm9y +RWFjaChlbCA9PiB7CiAgICAgICAgICAgICAgICBjb25zdCBpZnJhbWUgPSBlbC5xdWVyeVNlbGVj +dG9yKCdpZnJhbWUnKTsKICAgICAgICAgICAgICAgIGlmIChpZnJhbWUpIHsKICAgICAgICAgICAg +ICAgICAgICBlbC5vbmNsaWNrID0gZnVuY3Rpb24oZSkgeyBlLnByZXZlbnREZWZhdWx0KCk7IGUu +c3RvcFByb3BhZ2F0aW9uKCk7IG9wZW5NZWRpYU1vZGFsKGlmcmFtZS5zcmMsICdwZGYnLCAnUERG +Jyk7IH07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgLy8g +VmlkZW86IEtsaWNrIGF1ZiBDb250YWluZXIgb2VmZm5ldCBNb2RhbCAoZmFsbHMgbmljaHQgYmVy +ZWl0cyBjb250cm9scy1ha3RpdikKICAgICAgICAgICAgY29udGVudC5xdWVyeVNlbGVjdG9yQWxs +KCd2aWRlbycpLmZvckVhY2godmlkID0+IHsKICAgICAgICAgICAgICAgIGlmICh2aWQuX21vZGFs +Qm91bmQpIHJldHVybjsKICAgICAgICAgICAgICAgIGNvbnN0IHNyYyA9IHZpZC5xdWVyeVNlbGVj +dG9yKCdzb3VyY2UnKSA/IHZpZC5xdWVyeVNlbGVjdG9yKCdzb3VyY2UnKS5zcmMgOiB2aWQuc3Jj +OwogICAgICAgICAgICAgICAgaWYgKHNyYykgewogICAgICAgICAgICAgICAgICAgIHZpZC5zdHls +ZS5jdXJzb3IgPSAncG9pbnRlcic7CiAgICAgICAgICAgICAgICAgICAgdmlkLm9uZGJsY2xpY2sg +PSBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9u +KCk7CiAgICAgICAgICAgICAgICAgICAgICAgIG9wZW5NZWRpYU1vZGFsKHNyYywgJ3ZpZGVvJywg +JycpOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAg +ICAgICB2aWQuX21vZGFsQm91bmQgPSB0cnVlOwogICAgICAgICAgICB9KTsKCiAgICAgICAgICAg +IC8vIEF1ZGlvOiBEb3BwZWxrbGljayBvZWZmbmV0IE1vZGFsCiAgICAgICAgICAgIGNvbnRlbnQu +cXVlcnlTZWxlY3RvckFsbCgnYXVkaW8nKS5mb3JFYWNoKGF1ZCA9PiB7CiAgICAgICAgICAgICAg +ICBpZiAoYXVkLl9tb2RhbEJvdW5kKSByZXR1cm47CiAgICAgICAgICAgICAgICBjb25zdCBzcmMg +PSBhdWQuc3JjIHx8IChhdWQucXVlcnlTZWxlY3Rvcignc291cmNlJykgPyBhdWQucXVlcnlTZWxl +Y3Rvcignc291cmNlJykuc3JjIDogJycpOwogICAgICAgICAgICAgICAgaWYgKHNyYykgewogICAg +ICAgICAgICAgICAgICAgIGF1ZC5vbmRibGNsaWNrID0gZnVuY3Rpb24oZSkgewogICAgICAgICAg +ICAgICAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpOwogICAgICAgICAgICAgICAgICAgICAg +ICBvcGVuTWVkaWFNb2RhbChzcmMsICdhdWRpbycsICcnKTsKICAgICAgICAgICAgICAgICAgICB9 +OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgYXVkLl9tb2RhbEJvdW5kID0gdHJ1 +ZTsKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAvLyBJbmxpbmUtRW1iZWRzIChWaWRlbywg +QXVkaW8sIE9mZmljZSk6IEtsaWNrIG9lZmZuZXQgTW9kYWwKICAgICAgICAgICAgY29udGVudC5x +dWVyeVNlbGVjdG9yQWxsKCcuZHJpdmUtbWVkaWEtZW1iZWQnKS5mb3JFYWNoKGVsID0+IHsKICAg +ICAgICAgICAgICAgIGlmIChlbC5fbW9kYWxCb3VuZCkgcmV0dXJuOwogICAgICAgICAgICAgICAg +Y29uc3QgbWVkaWFVcmwgPSBlbC5nZXRBdHRyaWJ1dGUoJ2RhdGEtbWVkaWEtdXJsJyk7CiAgICAg +ICAgICAgICAgICBjb25zdCBtZWRpYVR5cGUgPSBlbC5nZXRBdHRyaWJ1dGUoJ2RhdGEtbWVkaWEt +dHlwZScpOwogICAgICAgICAgICAgICAgY29uc3QgbGFiZWwgPSBlbC5xdWVyeVNlbGVjdG9yKCcu +ZHJpdmUtZW1iZWQtbGFiZWwnKTsKICAgICAgICAgICAgICAgIGNvbnN0IG1lZGlhVGl0bGUgPSBs +YWJlbCA/IGxhYmVsLnRleHRDb250ZW50IDogJyc7CiAgICAgICAgICAgICAgICBpZiAobWVkaWFV +cmwpIHsKICAgICAgICAgICAgICAgICAgICBlbC5vbmNsaWNrID0gZnVuY3Rpb24oZSkgeyBlLnBy +ZXZlbnREZWZhdWx0KCk7IGUuc3RvcFByb3BhZ2F0aW9uKCk7IG9wZW5NZWRpYU1vZGFsKG1lZGlh +VXJsLCBtZWRpYVR5cGUsIG1lZGlhVGl0bGUpOyB9OwogICAgICAgICAgICAgICAgfQogICAgICAg +ICAgICAgICAgZWwuX21vZGFsQm91bmQgPSB0cnVlOwogICAgICAgICAgICB9KTsKCiAgICAgICAg +ICAgIC8vID09PSBBY2NvcmRpb25zIGFrdGl2aWVyZW4gKEF1Zi0vWnVrbGFwcGVuLCBzdGFuZGFy +ZG1hZXNzaWcgZWluZ2VrbGFwcHQpID09PQogICAgICAgICAgICBjb250ZW50LnF1ZXJ5U2VsZWN0 +b3JBbGwoJy5kcml2ZS1hY2NvcmRpb24nKS5mb3JFYWNoKGZ1bmN0aW9uKGFjYykgewogICAgICAg +ICAgICAgICAgYWNjLnNldEF0dHJpYnV0ZSgnY29udGVudGVkaXRhYmxlJywgJ2ZhbHNlJyk7CiAg +ICAgICAgICAgICAgICBhY2MuY2xhc3NMaXN0LnJlbW92ZSgnb3BlbicpOwogICAgICAgICAgICAg +ICAgdmFyIGhlYWRlciA9IGFjYy5xdWVyeVNlbGVjdG9yKCcuZHJpdmUtYWNjb3JkaW9uLWhlYWRl +cicpOwogICAgICAgICAgICAgICAgaWYgKGhlYWRlciAmJiAhaGVhZGVyLl9hY2NCb3VuZCkgewog +ICAgICAgICAgICAgICAgICAgIGhlYWRlci5vbmNsaWNrID0gZnVuY3Rpb24oZSkgewogICAgICAg +ICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgICAgICAgICAgICAg +ICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGFjYy5jbGFz +c0xpc3QudG9nZ2xlKCdvcGVuJyk7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAg +ICAgICAgICBoZWFkZXIuX2FjY0JvdW5kID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAg +ICAgICAgfSk7CgogICAgICAgICAgICAvLyA9PT0gRkFRLUJlcmVpY2hlIGFrdGl2aWVyZW4gKEF1 +Zi0vWnVrbGFwcGVuLCBzdGFuZGFyZG1hZXNzaWcgZWluZ2VrbGFwcHQpID09PQogICAgICAgICAg +ICBjb250ZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5kcml2ZS1mYXEnKS5mb3JFYWNoKGZ1bmN0aW9u +KGZhcSkgewogICAgICAgICAgICAgICAgZmFxLnNldEF0dHJpYnV0ZSgnY29udGVudGVkaXRhYmxl +JywgJ2ZhbHNlJyk7CiAgICAgICAgICAgICAgICBmYXEucXVlcnlTZWxlY3RvckFsbCgnLmRyaXZl +LWZhcS1pdGVtJykuZm9yRWFjaChmdW5jdGlvbihpdGVtKSB7IGl0ZW0uY2xhc3NMaXN0LnJlbW92 +ZSgnb3BlbicpOyB9KTsKICAgICAgICAgICAgICAgIGZhcS5xdWVyeVNlbGVjdG9yQWxsKCcuZHJp +dmUtZmFxLXF1ZXN0aW9uJykuZm9yRWFjaChmdW5jdGlvbihxKSB7CiAgICAgICAgICAgICAgICAg +ICAgaWYgKHEuX2ZhcUJvdW5kKSByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgcS5vbmNsaWNr +ID0gZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0 +KCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7CiAgICAgICAg +ICAgICAgICAgICAgICAgIHEuY2xvc2VzdCgnLmRyaXZlLWZhcS1pdGVtJykuY2xhc3NMaXN0LnRv +Z2dsZSgnb3BlbicpOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAg +cS5fZmFxQm91bmQgPSB0cnVlOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0pOwoK +ICAgICAgICAgICAgLy8gPT09IFNvcnRpZXJiYXJlIFRhYmVsbGVuIGFrdGl2aWVyZW4gPT09CiAg +ICAgICAgICAgIGNvbnRlbnQucXVlcnlTZWxlY3RvckFsbCgnLmRyaXZlLXRhYmxlW2RhdGEtc29y +dGFibGU9InRydWUiXScpLmZvckVhY2goZnVuY3Rpb24odGFibGUpIHsKICAgICAgICAgICAgICAg +IHRhYmxlLnF1ZXJ5U2VsZWN0b3JBbGwoJ3RoLnNvcnRhYmxlJykuZm9yRWFjaChmdW5jdGlvbih0 +aCkgewogICAgICAgICAgICAgICAgICAgIGlmICh0aC5fc29ydEJvdW5kKSByZXR1cm47CiAgICAg +ICAgICAgICAgICAgICAgdGguc2V0QXR0cmlidXRlKCdjb250ZW50ZWRpdGFibGUnLCAnZmFsc2Un +KTsKICAgICAgICAgICAgICAgICAgICB0aC5vbmNsaWNrID0gZnVuY3Rpb24oZSkgewogICAgICAg +ICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgICAgICAgICAgICAg +ICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpZHgg +PSBBcnJheS5mcm9tKHRoLnBhcmVudEVsZW1lbnQuY2hpbGRyZW4pLmluZGV4T2YodGgpOwogICAg +ICAgICAgICAgICAgICAgICAgICB2YXIgdGJvZHkgPSB0YWJsZS5xdWVyeVNlbGVjdG9yKCd0Ym9k +eScpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRib2R5KSByZXR1cm47CiAgICAgICAg +ICAgICAgICAgICAgICAgIHZhciBhc2MgPSAhdGguY2xhc3NMaXN0LmNvbnRhaW5zKCdzb3J0LWFz +YycpOwogICAgICAgICAgICAgICAgICAgICAgICAvLyBBbGxlIFNvcnQtTWFya2VyIGVudGZlcm5l +bgogICAgICAgICAgICAgICAgICAgICAgICB0YWJsZS5xdWVyeVNlbGVjdG9yQWxsKCd0aCcpLmZv +ckVhY2goZnVuY3Rpb24oaCkgeyBoLmNsYXNzTGlzdC5yZW1vdmUoJ3NvcnQtYXNjJywgJ3NvcnQt +ZGVzYycpOyB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgdGguY2xhc3NMaXN0LmFkZChhc2Mg +PyAnc29ydC1hc2MnIDogJ3NvcnQtZGVzYycpOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIg +cm93cyA9IEFycmF5LmZyb20odGJvZHkucXVlcnlTZWxlY3RvckFsbCgndHInKSk7CiAgICAgICAg +ICAgICAgICAgICAgICAgIHJvd3Muc29ydChmdW5jdGlvbihhLCBiKSB7CiAgICAgICAgICAgICAg +ICAgICAgICAgICAgICB2YXIgYVRleHQgPSAoYS5jZWxsc1tpZHhdID8gYS5jZWxsc1tpZHhdLnRl +eHRDb250ZW50LnRyaW0oKSA6ICcnKS50b0xvd2VyQ2FzZSgpOwogICAgICAgICAgICAgICAgICAg +ICAgICAgICAgdmFyIGJUZXh0ID0gKGIuY2VsbHNbaWR4XSA/IGIuY2VsbHNbaWR4XS50ZXh0Q29u +dGVudC50cmltKCkgOiAnJykudG9Mb3dlckNhc2UoKTsKICAgICAgICAgICAgICAgICAgICAgICAg +ICAgIC8vIE51bWVyaXNjaGUgU29ydGllcnVuZyB3ZW5uIG1vZWdsaWNoCiAgICAgICAgICAgICAg +ICAgICAgICAgICAgICB2YXIgYU51bSA9IHBhcnNlRmxvYXQoYVRleHQpLCBiTnVtID0gcGFyc2VG +bG9hdChiVGV4dCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWlzTmFOKGFOdW0p +ICYmICFpc05hTihiTnVtKSkgcmV0dXJuIGFzYyA/IGFOdW0gLSBiTnVtIDogYk51bSAtIGFOdW07 +CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXNjID8gYVRleHQubG9jYWxlQ29t +cGFyZShiVGV4dCwgJ2RlJykgOiBiVGV4dC5sb2NhbGVDb21wYXJlKGFUZXh0LCAnZGUnKTsKICAg +ICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJvd3MuZm9y +RWFjaChmdW5jdGlvbihyb3cpIHsgdGJvZHkuYXBwZW5kQ2hpbGQocm93KTsgfSk7CiAgICAgICAg +ICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICB0aC5fc29ydEJvdW5kID0gdHJ1ZTsK +ICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIC8vID09PSDD +nGJlcnNjaHJpZnRlbiBtaXQgQW5jaG9yLUlEcyB2ZXJzZWhlbiA9PT0KICAgICAgICAgICAgY29u +dGVudC5xdWVyeVNlbGVjdG9yQWxsKCdoMSwgaDIsIGgzLCBoNCcpLmZvckVhY2goZnVuY3Rpb24o +aCkgewogICAgICAgICAgICAgICAgdmFyIHRleHQgPSBoLnRleHRDb250ZW50LnRyaW0oKTsKICAg +ICAgICAgICAgICAgIGlmICghdGV4dCkgcmV0dXJuOwogICAgICAgICAgICAgICAgdmFyIHNsdWcg +PSB0ZXh0LnRvTG93ZXJDYXNlKCkKICAgICAgICAgICAgICAgICAgICAucmVwbGFjZSgvw6QvZywg +J2FlJykucmVwbGFjZSgvw7YvZywgJ29lJykucmVwbGFjZSgvw7wvZywgJ3VlJykucmVwbGFjZSgv +w58vZywgJ3NzJykKICAgICAgICAgICAgICAgICAgICAucmVwbGFjZSgvW15hLXowLTldKy9nLCAn +LScpLnJlcGxhY2UoL14tfC0kL2csICcnKTsKICAgICAgICAgICAgICAgIGguaWQgPSBzbHVnOwog +ICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIC8vID09PSBNYW51ZWxsZSBDcm9zc2xpbmtzICgu +ZHJpdmUteHJlZikga2xpY2tiYXIgbWFjaGVuID09PQogICAgICAgICAgICBjb250ZW50LnF1ZXJ5 +U2VsZWN0b3JBbGwoJy5kcml2ZS14cmVmJykuZm9yRWFjaChmdW5jdGlvbihlbCkgewogICAgICAg +ICAgICAgICAgdmFyIHRhcmdldCA9IGVsLmdldEF0dHJpYnV0ZSgnZGF0YS14cmVmLXRhcmdldCcp +OwogICAgICAgICAgICAgICAgaWYgKCF0YXJnZXQpIHJldHVybjsKICAgICAgICAgICAgICAgIGVs +Lm9uY2xpY2sgPSBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVm +YXVsdCgpOwogICAgICAgICAgICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7CiAgICAgICAg +ICAgICAgICAgICAgdmFyIHBhcnRzID0gdGFyZ2V0LnNwbGl0KCcjJyk7CiAgICAgICAgICAgICAg +ICAgICAgdmFyIGRvY0lkID0gcGFydHNbMF07CiAgICAgICAgICAgICAgICAgICAgdmFyIGhlYWRp +bmdTbHVnID0gcGFydHNbMV0gfHwgJyc7CiAgICAgICAgICAgICAgICAgICAgRHJpdmVQb3J0YWwu +c2VsZWN0RG9jdW1lbnQoZG9jSWQpLnRoZW4oZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAg +ICAgICAgIERyaXZlUG9ydGFsLmhpZ2hsaWdodEl0ZW0oZG9jSWQpOwogICAgICAgICAgICAgICAg +ICAgICAgICBpZiAoaGVhZGluZ1NsdWcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8v +IE5hY2ggUmVuZGVyIHp1bSBIZWFkaW5nIHNjcm9sbGVuCiAgICAgICAgICAgICAgICAgICAgICAg +ICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAg +ICAgIHZhciBoZWFkaW5nID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaGVhZGluZ1NsdWcpOwog +ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoZWFkaW5nKSB7CiAgICAgICAgICAg +ICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRpbmcuc2Nyb2xsSW50b1ZpZXcoeyBiZWhhdmlv +cjogJ3Ntb290aCcsIGJsb2NrOiAnc3RhcnQnIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAg +ICAgICAgICAgICBoZWFkaW5nLnN0eWxlLnRyYW5zaXRpb24gPSAnYmFja2dyb3VuZCAwLjNzJzsK +ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGluZy5zdHlsZS5iYWNrZ3Jv +dW5kID0gJ3ZhcigtLWJnLWFjdGl2ZSknOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg +ICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgeyBoZWFkaW5nLnN0eWxlLmJhY2tncm91bmQgPSAn +JzsgfSwgMjAwMCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAg +ICAgICAgICAgICAgICAgICAgfSwgMjAwKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAg +ICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIC8v +IE1vdXNlb3ZlcjogUG9wb3ZlciBtaXQgWmllbC1JbmZvCiAgICAgICAgICAgICAgICBlbC5hZGRF +dmVudExpc3RlbmVyKCdtb3VzZWVudGVyJywgZnVuY3Rpb24oZXYpIHsKICAgICAgICAgICAgICAg +ICAgICB2YXIgcGFydHMgPSB0YXJnZXQuc3BsaXQoJyMnKTsKICAgICAgICAgICAgICAgICAgICB2 +YXIgZG9jSWQgPSBwYXJ0c1swXTsKICAgICAgICAgICAgICAgICAgICB2YXIgZG9jID0gRHJpdmVG +Uy5kb2N1bWVudHMuZmluZChmdW5jdGlvbihkKSB7IHJldHVybiBkLmlkID09PSBkb2NJZDsgfSk7 +CiAgICAgICAgICAgICAgICAgICAgaWYgKGRvYykgewogICAgICAgICAgICAgICAgICAgICAgICBE +cml2ZVBvcnRhbC5fc2hvd0Nyb3NzbGlua1BvcG92ZXIoZXYsIFt7IHRlcm06IGRvYy50aXRlbCwg +dHlwZTogJ3JlZmVyZW56JywgZG9jOiBkb2MgfV0pOwogICAgICAgICAgICAgICAgICAgIH0KICAg +ICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgZWwuYWRkRXZlbnRMaXN0ZW5lcignbW91 +c2VsZWF2ZScsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgIERyaXZlUG9ydGFsLl9o +aWRlQ3Jvc3NsaW5rUG9wb3ZlcigpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0p +OwoKICAgICAgICAgICAgLy8gPT09IEF1dG9tYXRpc2NoZSBDcm9zc2xpbmstRXJrZW5udW5nID09 +PQogICAgICAgICAgICB0aGlzLl9hcHBseUNyb3NzbGlua3MoY29udGVudCwgZG9jKTsKICAgICAg +ICB9LCA1MCk7CiAgICB9LAoKICAgIC8vIENyb3NzbGluay1FbmdpbmU6IEVya2VubnQgVmVyd2Vp +c2UgYXVmIGFuZGVyZSBBcnRpa2VsIGltIEluaGFsdAogICAgX2Nyb3NzbGlua1BvcG92ZXI6IG51 +bGwsCiAgICBfY3Jvc3NsaW5rVGltZW91dDogbnVsbCwKCiAgICBfYnVpbGRDcm9zc2xpbmtJbmRl +eChleGNsdWRlRG9jSWQpIHsKICAgICAgICAvLyBJbmRleCBhbGxlciBEb2t1bWVudGUgbWl0IFRp +dGVsbiB1bmQgU2NobGFnd29lcnRlcm4KICAgICAgICB2YXIgaW5kZXggPSBbXTsKICAgICAgICBE +cml2ZUZTLmRvY3VtZW50cy5mb3JFYWNoKGZ1bmN0aW9uKGQpIHsKICAgICAgICAgICAgaWYgKGQu +aWQgPT09IGV4Y2x1ZGVEb2NJZCkgcmV0dXJuOwogICAgICAgICAgICAvLyBUaXRlbCBhbHMgU3Vj +aGJlZ3JpZmYgKG1pbiA0IFplaWNoZW4pCiAgICAgICAgICAgIGlmIChkLnRpdGVsICYmIGQudGl0 +ZWwubGVuZ3RoID49IDQpIHsKICAgICAgICAgICAgICAgIGluZGV4LnB1c2goeyB0ZXJtOiBkLnRp +dGVsLCB0eXBlOiAndGl0ZWwnLCBkb2M6IGQgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAg +Ly8gU2NobGFnd29lcnRlciBhbHMgU3VjaGJlZ3JpZmZlIChtaW4gMyBaZWljaGVuKQogICAgICAg +ICAgICAoZC5zY2hsYWd3b2VydGVyIHx8IFtdKS5mb3JFYWNoKGZ1bmN0aW9uKGt3KSB7CiAgICAg +ICAgICAgICAgICBpZiAoa3cgJiYga3cubGVuZ3RoID49IDMpIHsKICAgICAgICAgICAgICAgICAg +ICBpbmRleC5wdXNoKHsgdGVybToga3csIHR5cGU6ICdzY2hsYWd3b3J0JywgZG9jOiBkIH0pOwog +ICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9KTsKICAgICAgICAvLyBM +YWVuZ3N0ZSBCZWdyaWZmZSB6dWVyc3QgKHZlcmhpbmRlcnQgVGVpbG1hdGNoZXMpCiAgICAgICAg +aW5kZXguc29ydChmdW5jdGlvbihhLCBiKSB7IHJldHVybiBiLnRlcm0ubGVuZ3RoIC0gYS50ZXJt +Lmxlbmd0aDsgfSk7CiAgICAgICAgcmV0dXJuIGluZGV4OwogICAgfSwKCiAgICBfYXBwbHlDcm9z +c2xpbmtzKGNvbnRlbnRFbCwgY3VycmVudERvYykgewogICAgICAgIC8vIEdvdmVybmFuY2UtRWlu +c3RlbGx1bmcgcHLDvGZlbgogICAgICAgIHZhciBzZXR0aW5ncyA9IChEcml2ZUdvdmVybmFuY2Uu +ZGF0YSAmJiBEcml2ZUdvdmVybmFuY2UuZGF0YS5zZXR0aW5ncykgPyBEcml2ZUdvdmVybmFuY2Uu +ZGF0YS5zZXR0aW5ncyA6IHt9OwogICAgICAgIGlmIChzZXR0aW5ncy5jcm9zc2xpbmtNb2RlID09 +PSAnZGlzYWJsZWQnKSByZXR1cm47CgogICAgICAgIHZhciBpbmRleCA9IHRoaXMuX2J1aWxkQ3Jv +c3NsaW5rSW5kZXgoY3VycmVudERvYy5pZCk7CiAgICAgICAgaWYgKGluZGV4Lmxlbmd0aCA9PT0g +MCkgcmV0dXJuOwoKICAgICAgICAvLyBCZXJlaXRzIHZlcmxpbmt0ZSBUZXJtZSB0cmFja2VuIChr +ZWluIGRvcHBlbHRlcyBNYXRjaGluZykKICAgICAgICB2YXIgbWF0Y2hlZCA9IG5ldyBTZXQoKTsK +ICAgICAgICAvLyBTYW1tbGUgYWxsZSB1bmlxdWUgRG9rdW1lbnQtSURzIGRpZSBqZSBUZXJtIG1h +dGNoZW4KICAgICAgICB2YXIgdGVybURvY3MgPSB7fTsKICAgICAgICBpbmRleC5mb3JFYWNoKGZ1 +bmN0aW9uKGVudHJ5KSB7CiAgICAgICAgICAgIHZhciBrZXkgPSBlbnRyeS50ZXJtLnRvTG93ZXJD +YXNlKCk7CiAgICAgICAgICAgIGlmICghdGVybURvY3Nba2V5XSkgdGVybURvY3Nba2V5XSA9IFtd +OwogICAgICAgICAgICAvLyBOdXIgdW5pcXVlIERvY3MgcHJvIFRlcm0KICAgICAgICAgICAgaWYg +KCF0ZXJtRG9jc1trZXldLmZpbmQoZnVuY3Rpb24oZSkgeyByZXR1cm4gZS5kb2MuaWQgPT09IGVu +dHJ5LmRvYy5pZDsgfSkpIHsKICAgICAgICAgICAgICAgIHRlcm1Eb2NzW2tleV0ucHVzaChlbnRy +eSk7CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKCiAgICAgICAgdmFyIHdhbGtlciA9IGRvY3Vt +ZW50LmNyZWF0ZVRyZWVXYWxrZXIoY29udGVudEVsLCBOb2RlRmlsdGVyLlNIT1dfVEVYVCwgbnVs +bCwgZmFsc2UpOwogICAgICAgIHZhciB0ZXh0Tm9kZXMgPSBbXTsKICAgICAgICB3aGlsZSAod2Fs +a2VyLm5leHROb2RlKCkpIHsKICAgICAgICAgICAgdmFyIG5vZGUgPSB3YWxrZXIuY3VycmVudE5v +ZGU7CiAgICAgICAgICAgIC8vIE5pY2h0IGlubmVyaGFsYiB2b24gTGlua3MsIEJ1dHRvbnMsIGJl +cmVpdHMgbWFya2llcnRlbiBDcm9zc2xpbmtzLCBvZGVyIGRyaXZlLW1lZGlhIEVsZW1lbnRlbgog +ICAgICAgICAgICB2YXIgcGFyZW50ID0gbm9kZS5wYXJlbnRFbGVtZW50OwogICAgICAgICAgICBp +ZiAocGFyZW50ICYmIChwYXJlbnQuY2xvc2VzdCgnYScpIHx8IHBhcmVudC5jbG9zZXN0KCdidXR0 +b24nKSB8fCBwYXJlbnQuY2xvc2VzdCgnLmNyb3NzbGluaycpIHx8IHBhcmVudC5jbG9zZXN0KCcu +ZHJpdmUtbWVkaWEnKSkpIGNvbnRpbnVlOwogICAgICAgICAgICBpZiAobm9kZS50ZXh0Q29udGVu +dC50cmltKCkubGVuZ3RoID4gMikgewogICAgICAgICAgICAgICAgdGV4dE5vZGVzLnB1c2gobm9k +ZSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHZhciBtYXhMaW5rcyA9IDMwOyAv +LyBQZXJmb3JtYW5jZS1MaW1pdAogICAgICAgIHZhciBsaW5rQ291bnQgPSAwOwoKICAgICAgICB0 +ZXh0Tm9kZXMuZm9yRWFjaChmdW5jdGlvbih0ZXh0Tm9kZSkgewogICAgICAgICAgICBpZiAobGlu +a0NvdW50ID49IG1heExpbmtzKSByZXR1cm47CiAgICAgICAgICAgIHZhciB0ZXh0ID0gdGV4dE5v +ZGUudGV4dENvbnRlbnQ7CiAgICAgICAgICAgIHZhciByZXBsYWNlbWVudHMgPSBbXTsKCiAgICAg +ICAgICAgIGluZGV4LmZvckVhY2goZnVuY3Rpb24oZW50cnkpIHsKICAgICAgICAgICAgICAgIGlm +IChsaW5rQ291bnQgPj0gbWF4TGlua3MpIHJldHVybjsKICAgICAgICAgICAgICAgIHZhciB0ZXJt +TG93ZXIgPSBlbnRyeS50ZXJtLnRvTG93ZXJDYXNlKCk7CiAgICAgICAgICAgICAgICBpZiAobWF0 +Y2hlZC5oYXModGVybUxvd2VyKSkgcmV0dXJuOwoKICAgICAgICAgICAgICAgIC8vIFdvcnRncmVu +emVuLVN1Y2hlIChjYXNlLWluc2Vuc2l0aXZlKQogICAgICAgICAgICAgICAgdmFyIGVzY2FwZWQg +PSBlbnRyeS50ZXJtLnJlcGxhY2UoL1suKis/XiR7fSgpfFtcXVxcXS9nLCAnXFwkJicpOwogICAg +ICAgICAgICAgICAgdmFyIHJlID0gbmV3IFJlZ0V4cCgnXFxiJyArIGVzY2FwZWQgKyAnXFxiJywg +J2knKTsKICAgICAgICAgICAgICAgIHZhciBtID0gcmUuZXhlYyh0ZXh0KTsKICAgICAgICAgICAg +ICAgIGlmIChtKSB7CiAgICAgICAgICAgICAgICAgICAgcmVwbGFjZW1lbnRzLnB1c2goewogICAg +ICAgICAgICAgICAgICAgICAgICBzdGFydDogbS5pbmRleCwKICAgICAgICAgICAgICAgICAgICAg +ICAgZW5kOiBtLmluZGV4ICsgbVswXS5sZW5ndGgsCiAgICAgICAgICAgICAgICAgICAgICAgIG9y +aWdpbmFsOiBtWzBdLAogICAgICAgICAgICAgICAgICAgICAgICBlbnRyeTogZW50cnksCiAgICAg +ICAgICAgICAgICAgICAgICAgIGVudHJpZXM6IHRlcm1Eb2NzW3Rlcm1Mb3dlcl0gfHwgW2VudHJ5 +XQogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIG1hdGNoZWQuYWRk +KHRlcm1Mb3dlcik7CiAgICAgICAgICAgICAgICAgICAgbGlua0NvdW50Kys7CiAgICAgICAgICAg +ICAgICB9CiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgaWYgKHJlcGxhY2VtZW50cy5sZW5n +dGggPT09IDApIHJldHVybjsKCiAgICAgICAgICAgIC8vIE5hY2ggUG9zaXRpb24gc29ydGllcmVu +IChydWVja3dhZXJ0cyBlcnNldHplbikKICAgICAgICAgICAgcmVwbGFjZW1lbnRzLnNvcnQoZnVu +Y3Rpb24oYSwgYikgeyByZXR1cm4gYi5zdGFydCAtIGEuc3RhcnQ7IH0pOwoKICAgICAgICAgICAg +Ly8gVWViZXJsYXBwdW5nZW4gZW50ZmVybmVuCiAgICAgICAgICAgIHZhciBjbGVhbiA9IFtyZXBs +YWNlbWVudHNbMF1dOwogICAgICAgICAgICBmb3IgKHZhciBpID0gMTsgaSA8IHJlcGxhY2VtZW50 +cy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgaWYgKHJlcGxhY2VtZW50c1tpXS5lbmQg +PD0gY2xlYW5bY2xlYW4ubGVuZ3RoIC0gMV0uc3RhcnQpIHsKICAgICAgICAgICAgICAgICAgICBj +bGVhbi5wdXNoKHJlcGxhY2VtZW50c1tpXSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAg +IH0KCiAgICAgICAgICAgIC8vIEZyYWdtZW50IGJhdWVuCiAgICAgICAgICAgIHZhciBmcmFnID0g +ZG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpOwogICAgICAgICAgICB2YXIgbGFzdElk +eCA9IDA7CiAgICAgICAgICAgIC8vIFZvcndhZXJ0cyBzb3J0aWVyZW4gZnVlciBGcmFnbWVudC1B +dWZiYXUKICAgICAgICAgICAgY2xlYW4uc29ydChmdW5jdGlvbihhLCBiKSB7IHJldHVybiBhLnN0 +YXJ0IC0gYi5zdGFydDsgfSk7CgogICAgICAgICAgICBjbGVhbi5mb3JFYWNoKGZ1bmN0aW9uKHIp +IHsKICAgICAgICAgICAgICAgIC8vIFRleHQgdm9yIGRlbSBNYXRjaAogICAgICAgICAgICAgICAg +aWYgKHIuc3RhcnQgPiBsYXN0SWR4KSB7CiAgICAgICAgICAgICAgICAgICAgZnJhZy5hcHBlbmRD +aGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSh0ZXh0LnN1YnN0cmluZyhsYXN0SWR4LCByLnN0 +YXJ0KSkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLy8gQ3Jvc3NsaW5rLVNw +YW4KICAgICAgICAgICAgICAgIHZhciBzcGFuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3Bh +bicpOwogICAgICAgICAgICAgICAgc3Bhbi5jbGFzc05hbWUgPSAnY3Jvc3NsaW5rJzsKICAgICAg +ICAgICAgICAgIHNwYW4udGV4dENvbnRlbnQgPSByLm9yaWdpbmFsOwogICAgICAgICAgICAgICAg +Ly8gRGF0ZW4gZnVlciBQb3BvdmVyCiAgICAgICAgICAgICAgICB2YXIgZG9jcyA9IHIuZW50cmll +cy5tYXAoZnVuY3Rpb24oZSkgeyByZXR1cm4gZS5kb2M7IH0pOwogICAgICAgICAgICAgICAgdmFy +IHR5cGVzID0gci5lbnRyaWVzLm1hcChmdW5jdGlvbihlKSB7IHJldHVybiBlLnR5cGU7IH0pOwog +ICAgICAgICAgICAgICAgc3Bhbi5zZXRBdHRyaWJ1dGUoJ2RhdGEteGxpbmstZG9jcycsIEpTT04u +c3RyaW5naWZ5KGRvY3MubWFwKGZ1bmN0aW9uKGQpIHsgcmV0dXJuIGQuaWQ7IH0pKSk7CiAgICAg +ICAgICAgICAgICBzcGFuLnNldEF0dHJpYnV0ZSgnZGF0YS14bGluay10eXBlJywgdHlwZXNbMF0p +OwoKICAgICAgICAgICAgICAgIHNwYW4uYWRkRXZlbnRMaXN0ZW5lcignbW91c2VlbnRlcicsIGZ1 +bmN0aW9uKGV2KSB7CiAgICAgICAgICAgICAgICAgICAgRHJpdmVQb3J0YWwuX3Nob3dDcm9zc2xp +bmtQb3BvdmVyKGV2LCByLmVudHJpZXMpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAg +ICAgICBzcGFuLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbGVhdmUnLCBmdW5jdGlvbigpIHsKICAg +ICAgICAgICAgICAgICAgICBEcml2ZVBvcnRhbC5faGlkZUNyb3NzbGlua1BvcG92ZXIoKTsKICAg +ICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgc3Bhbi5hZGRFdmVudExpc3RlbmVyKCdj +bGljaycsIGZ1bmN0aW9uKGV2KSB7CiAgICAgICAgICAgICAgICAgICAgZXYucHJldmVudERlZmF1 +bHQoKTsKICAgICAgICAgICAgICAgICAgICBldi5zdG9wUHJvcGFnYXRpb24oKTsKICAgICAgICAg +ICAgICAgICAgICAvLyBCZWkgbnVyIGVpbmVtIFRyZWZmZXI6IGRpcmVrdCBvZWZmbmVuCiAgICAg +ICAgICAgICAgICAgICAgaWYgKGRvY3MubGVuZ3RoID09PSAxKSB7CiAgICAgICAgICAgICAgICAg +ICAgICAgIERyaXZlUG9ydGFsLnNlbGVjdERvY3VtZW50KGRvY3NbMF0uaWQpOwogICAgICAgICAg +ICAgICAgICAgICAgICBEcml2ZVBvcnRhbC5oaWdobGlnaHRJdGVtKGRvY3NbMF0uaWQpOwogICAg +ICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgIGZy +YWcuYXBwZW5kQ2hpbGQoc3Bhbik7CiAgICAgICAgICAgICAgICBsYXN0SWR4ID0gci5lbmQ7CiAg +ICAgICAgICAgIH0pOwoKICAgICAgICAgICAgLy8gUmVzdC1UZXh0CiAgICAgICAgICAgIGlmIChs +YXN0SWR4IDwgdGV4dC5sZW5ndGgpIHsKICAgICAgICAgICAgICAgIGZyYWcuYXBwZW5kQ2hpbGQo +ZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUodGV4dC5zdWJzdHJpbmcobGFzdElkeCkpKTsKICAgICAg +ICAgICAgfQoKICAgICAgICAgICAgdGV4dE5vZGUucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQoZnJh +ZywgdGV4dE5vZGUpOwogICAgICAgIH0pOwogICAgfSwKCiAgICBfc2hvd0Nyb3NzbGlua1BvcG92 +ZXIoZXYsIGVudHJpZXMpIHsKICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5fY3Jvc3NsaW5rVGlt +ZW91dCk7CiAgICAgICAgdmFyIHBvcG92ZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY3Jv +c3NsaW5rUG9wb3ZlcicpOwogICAgICAgIGlmICghcG9wb3ZlcikgcmV0dXJuOwoKICAgICAgICAv +LyBNZWhyZXJlIERva3VtZW50ZSBrb2VubmVuIGRlbnNlbGJlbiBCZWdyaWZmIG1hdGNoZW4KICAg +ICAgICB2YXIgc2VlbiA9IG5ldyBTZXQoKTsKICAgICAgICB2YXIgdW5pcXVlRW50cmllcyA9IGVu +dHJpZXMuZmlsdGVyKGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgaWYgKHNlZW4uaGFzKGUuZG9j +LmlkKSkgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICBzZWVuLmFkZChlLmRvYy5pZCk7CiAgICAg +ICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0pOwoKICAgICAgICB2YXIgaHRtbCA9ICcnOwog +ICAgICAgIHVuaXF1ZUVudHJpZXMuZm9yRWFjaChmdW5jdGlvbihlbnRyeSwgaWR4KSB7CiAgICAg +ICAgICAgIHZhciBkb2MgPSBlbnRyeS5kb2M7CiAgICAgICAgICAgIHZhciBtYXRjaFR5cGUgPSBl +bnRyeS50eXBlID09PSAndGl0ZWwnID8gJ0FydGlrZWx0aXRlbCcgOiAnU2NobGFnd29ydCc7CiAg +ICAgICAgICAgIC8vIFRleHRhdXN6dWcgKGVyc3RlIDEyMCBaZWljaGVuIGRlcyBJbmhhbHRzLCBI +VE1MLVRhZ3MgZW50ZmVybnQpCiAgICAgICAgICAgIHZhciBleGNlcnB0ID0gJyc7CiAgICAgICAg +ICAgIGlmIChkb2MuaW5oYWx0KSB7CiAgICAgICAgICAgICAgICB2YXIgZGl2ID0gZG9jdW1lbnQu +Y3JlYXRlRWxlbWVudCgnZGl2Jyk7CiAgICAgICAgICAgICAgICBkaXYuaW5uZXJIVE1MID0gRHJp +dmVQb3J0YWwuc2FuaXRpemVIVE1MKGRvYy5pbmhhbHQpOwogICAgICAgICAgICAgICAgZXhjZXJw +dCA9IGRpdi50ZXh0Q29udGVudC5zdWJzdHJpbmcoMCwgMTIwKTsKICAgICAgICAgICAgICAgIGlm +IChkaXYudGV4dENvbnRlbnQubGVuZ3RoID4gMTIwKSBleGNlcnB0ICs9ICcuLi4nOwogICAgICAg +ICAgICB9CiAgICAgICAgICAgIGlmIChpZHggPiAwKSBodG1sICs9ICc8ZGl2IHN0eWxlPSJib3Jk +ZXItdG9wOjFweCBzb2xpZCB2YXIoLS1ib3JkZXItbGlnaHQpO21hcmdpbjo4cHggMDsiPjwvZGl2 +Pic7CiAgICAgICAgICAgIGh0bWwgKz0gJzxkaXYgY2xhc3M9InhsaW5rLWhlYWRlciI+PHNwYW4g +Y2xhc3M9InhsaW5rLWljb24iPiYjeDFGNTE3Ozwvc3Bhbj4gJyArIERyaXZlUG9ydGFsLmVzY2Fw +ZUhUTUwoZG9jLnRpdGVsKSArICc8L2Rpdj4nOwogICAgICAgICAgICBodG1sICs9ICc8ZGl2IGNs +YXNzPSJ4bGluay1tZXRhIj4nOwogICAgICAgICAgICBodG1sICs9ICc8c3Bhbj4nICsgRHJpdmVQ +b3J0YWwuZXNjYXBlSFRNTChkb2Mua2F0ZWdvcmllKSArICc8L3NwYW4+JzsKICAgICAgICAgICAg +aHRtbCArPSAnPHNwYW4+VHJlZmZlcjogJyArIG1hdGNoVHlwZSArICc8L3NwYW4+JzsKICAgICAg +ICAgICAgaHRtbCArPSAnPHNwYW4+JyArIERyaXZlUG9ydGFsLmVzY2FwZUhUTUwoZG9jLnN0YXR1 +cyB8fCAnRW50d3VyZicpICsgJzwvc3Bhbj4nOwogICAgICAgICAgICBodG1sICs9ICc8L2Rpdj4n +OwogICAgICAgICAgICBpZiAoZXhjZXJwdCkgewogICAgICAgICAgICAgICAgaHRtbCArPSAnPGRp +diBjbGFzcz0ieGxpbmstZXhjZXJwdCI+JyArIERyaXZlUG9ydGFsLmVzY2FwZUhUTUwoZXhjZXJw +dCkgKyAnPC9kaXY+JzsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoZG9jLnNjaGxhZ3dv +ZXJ0ZXIgJiYgZG9jLnNjaGxhZ3dvZXJ0ZXIubGVuZ3RoID4gMCkgewogICAgICAgICAgICAgICAg +aHRtbCArPSAnPGRpdiBjbGFzcz0ieGxpbmstdGFncyI+JyArIGRvYy5zY2hsYWd3b2VydGVyLnNs +aWNlKDAsIDUpLm1hcChmdW5jdGlvbihrKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICc8 +c3Bhbj4nICsgRHJpdmVQb3J0YWwuZXNjYXBlSFRNTChrKSArICc8L3NwYW4+JzsKICAgICAgICAg +ICAgICAgIH0pLmpvaW4oJycpICsgJzwvZGl2Pic7CiAgICAgICAgICAgIH0KICAgICAgICAgICAg +aWYgKHVuaXF1ZUVudHJpZXMubGVuZ3RoID09PSAxKSB7CiAgICAgICAgICAgICAgICBodG1sICs9 +ICc8ZGl2IGNsYXNzPSJ4bGluay1hY3Rpb24iIG9uY2xpY2s9IkRyaXZlUG9ydGFsLnNlbGVjdERv +Y3VtZW50KFwnJyArIERyaXZlUG9ydGFsLmVzY2FwZUF0dHIoZG9jLmlkKSArICdcJyk7RHJpdmVQ +b3J0YWwuaGlnaGxpZ2h0SXRlbShcJycgKyBEcml2ZVBvcnRhbC5lc2NhcGVBdHRyKGRvYy5pZCkg +KyAnXCcpOyI+QXJ0aWtlbCDDtmZmbmVuIOKGkjwvZGl2Pic7CiAgICAgICAgICAgIH0KICAgICAg +ICB9KTsKCiAgICAgICAgaWYgKHVuaXF1ZUVudHJpZXMubGVuZ3RoID4gMSkgewogICAgICAgICAg +ICBodG1sICs9ICc8ZGl2IHN0eWxlPSJib3JkZXItdG9wOjFweCBzb2xpZCB2YXIoLS1ib3JkZXIt +bGlnaHQpO21hcmdpbi10b3A6OHB4O3BhZGRpbmctdG9wOjZweDtmb250LXNpemU6MTFweDtjb2xv +cjp2YXIoLS10ZXh0LW11dGVkKTsiPicgKyB1bmlxdWVFbnRyaWVzLmxlbmd0aCArICcgdmVyd2Fu +ZHRlIEFydGlrZWwgZ2VmdW5kZW48L2Rpdj4nOwogICAgICAgIH0KCiAgICAgICAgcG9wb3Zlci5p +bm5lckhUTUwgPSBodG1sOwogICAgICAgIHBvcG92ZXIuY2xhc3NMaXN0LmFkZCgndmlzaWJsZScp +OwoKICAgICAgICAvLyBQb3NpdGlvbiByZWxhdGl2IHp1bSBUcmlnZ2VyLUVsZW1lbnQKICAgICAg +ICB2YXIgcmVjdCA9IGV2LnRhcmdldC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKICAgICAgICB2 +YXIgcG9wVyA9IDMyMDsKICAgICAgICB2YXIgcG9wSCA9IHBvcG92ZXIub2Zmc2V0SGVpZ2h0IHx8 +IDIwMDsKICAgICAgICB2YXIgbGVmdCA9IHJlY3QubGVmdDsKICAgICAgICB2YXIgdG9wID0gcmVj +dC5ib3R0b20gKyA2OwogICAgICAgIC8vIFJlY2h0cyByYXVzPyBMaW5rcyB2ZXJzY2hpZWJlbgog +ICAgICAgIGlmIChsZWZ0ICsgcG9wVyA+IHdpbmRvdy5pbm5lcldpZHRoIC0gMTApIHsKICAgICAg +ICAgICAgbGVmdCA9IHdpbmRvdy5pbm5lcldpZHRoIC0gcG9wVyAtIDEwOwogICAgICAgIH0KICAg +ICAgICAvLyBVbnRlbiByYXVzPyBVZWJlciBkZW0gRWxlbWVudCBhbnplaWdlbgogICAgICAgIGlm +ICh0b3AgKyBwb3BIID4gd2luZG93LmlubmVySGVpZ2h0IC0gMTApIHsKICAgICAgICAgICAgdG9w +ID0gcmVjdC50b3AgLSBwb3BIIC0gNjsKICAgICAgICB9CiAgICAgICAgcG9wb3Zlci5zdHlsZS5s +ZWZ0ID0gTWF0aC5tYXgoMTAsIGxlZnQpICsgJ3B4JzsKICAgICAgICBwb3BvdmVyLnN0eWxlLnRv +cCA9IE1hdGgubWF4KDEwLCB0b3ApICsgJ3B4JzsKICAgIH0sCgogICAgX2hpZGVDcm9zc2xpbmtQ +b3BvdmVyKCkgewogICAgICAgIHRoaXMuX2Nyb3NzbGlua1RpbWVvdXQgPSBzZXRUaW1lb3V0KGZ1 +bmN0aW9uKCkgewogICAgICAgICAgICB2YXIgcG9wb3ZlciA9IGRvY3VtZW50LmdldEVsZW1lbnRC +eUlkKCdjcm9zc2xpbmtQb3BvdmVyJyk7CiAgICAgICAgICAgIGlmIChwb3BvdmVyKSBwb3BvdmVy +LmNsYXNzTGlzdC5yZW1vdmUoJ3Zpc2libGUnKTsKICAgICAgICB9LCAyMDApOwogICAgfSwKCiAg +ICAvLyBQcnVlZmVuIG9iIGRlciBha3R1ZWxsZSBVc2VyIFJldmlzaW9uZW4vRGlmZiBzZWhlbiBk +YXJmOgogICAgLy8gLSBMZXNlbW9kdXM6IG5pZQogICAgLy8gLSBTdXBlclVzZXIgLyBGYWNoYXVm +c2ljaHQ6IGltbWVyCiAgICAvLyAtIFp1c3RhZW5kaWdlciBSZXZpZXdlciBmdWVyIGRpZSBLYXRl +Z29yaWU6IGphCiAgICAvLyAtIE1pdHdpcmtlbmRlciBhbSBBcnRpa2VsIChDb250cmlidXRvcik6 +IGphCiAgICAvLyAtIEFsbGUgYW5kZXJlbjogbmVpbgogICAgX2NhblNlZVJldmlzaW9ucyhkb2Mp +IHsKICAgICAgICBpZiAoRHJpdmVGUy5tb2RlID09PSAnc3RhdGljJykgcmV0dXJuIGZhbHNlOwog +ICAgICAgIGlmIChEcml2ZUdvdmVybmFuY2UuaXNTdXBlclVzZXIoKSB8fCBEcml2ZUdvdmVybmFu +Y2UuaXNGYWNoYXVmc2ljaHQoKSkgcmV0dXJuIHRydWU7CiAgICAgICAgaWYgKERyaXZlR292ZXJu +YW5jZS5pc1Jldmlld2VyKGRvYy5rYXRlZ29yaWUpKSByZXR1cm4gdHJ1ZTsKICAgICAgICAvLyBN +aXR3aXJrZW5kZTogVXNlcm5hbWUgcHJ1ZWZlbgogICAgICAgIHZhciB1c2VybmFtZSA9IChEcml2 +ZUZTLmVudmlyb24gJiYgRHJpdmVGUy5lbnZpcm9uLnVzZXJuYW1lKSA/IERyaXZlRlMuZW52aXJv +bi51c2VybmFtZS50b0xvd2VyQ2FzZSgpIDogJyc7CiAgICAgICAgaWYgKHVzZXJuYW1lICYmIGRv +Yy5jb250cmlidXRvcnMpIHsKICAgICAgICAgICAgaWYgKGRvYy5jb250cmlidXRvcnMuc29tZShm +dW5jdGlvbihjKSB7IHJldHVybiAoYy51c2VybmFtZSB8fCAnJykudG9Mb3dlckNhc2UoKSA9PT0g +dXNlcm5hbWU7IH0pKSByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgLy8gRXJzdGVsbGVy +IG9kZXIgbGV0enRlciBCZWFyYmVpdGVyCiAgICAgICAgaWYgKHVzZXJuYW1lICYmICgoZG9jLmVy +c3RlbGx0Vm9uIHx8ICcnKS50b0xvd2VyQ2FzZSgpID09PSB1c2VybmFtZSB8fCAoZG9jLmJlYXJi +ZWl0ZXRWb24gfHwgJycpLnRvTG93ZXJDYXNlKCkgPT09IHVzZXJuYW1lKSkgcmV0dXJuIHRydWU7 +CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfSwKCiAgICBfcmVuZGVyQ2hpbGRBcnRpY2xlcyhk +b2MpIHsKICAgICAgICBjb25zdCBjaGlsZHJlbiA9IERyaXZlRlMuZG9jdW1lbnRzLmZpbHRlcihm +dW5jdGlvbihkKXsgcmV0dXJuIGQucGFyZW50SWQgPT09IGRvYy5pZDsgfSk7CiAgICAgICAgaWYg +KGNoaWxkcmVuLmxlbmd0aCA9PT0gMCkgcmV0dXJuICcnOwogICAgICAgIHJldHVybiAnPGRpdiBj +bGFzcz0ibWV0YS1pdGVtIiBzdHlsZT0iZmxleC1iYXNpczoxMDAlOyI+PGRpdiBjbGFzcz0ibWV0 +YS1sYWJlbCI+VW50ZXJhcnRpa2VsPC9kaXY+PGRpdj4nICsKICAgICAgICAgICAgY2hpbGRyZW4u +bWFwKGZ1bmN0aW9uKGMpeyByZXR1cm4gJzxhIHN0eWxlPSJjb2xvcjp2YXIoLS10ZXh0LWhlYWRp +bmcpO2N1cnNvcjpwb2ludGVyO21hcmdpbi1yaWdodDo4cHg7IiBvbmNsaWNrPSJEcml2ZVBvcnRh +bC5zZWxlY3REb2N1bWVudChcJycgKyBEcml2ZVBvcnRhbC5lc2NhcGVBdHRyKGMuaWQpICsgJ1wn +KSI+JyArIERyaXZlUG9ydGFsLmVzY2FwZUhUTUwoYy50aXRlbCkgKyAnPC9hPic7IH0pLmpvaW4o +JycpICsKICAgICAgICAnPC9kaXY+PC9kaXY+JzsKICAgIH0sCgogICAgcmVuZGVyQ29udHJpYnV0 +b3JzKGRvYykgewogICAgICAgIGlmICghZG9jLmNvbnRyaWJ1dG9ycyB8fCBkb2MuY29udHJpYnV0 +b3JzLmxlbmd0aCA9PT0gMCkgcmV0dXJuICcnOwoKICAgICAgICAvLyBHZXdpY2h0dW5nZW4gYmVy +ZWNobmVuCiAgICAgICAgY29uc3Qgcm9sZVdlaWdodHMgPSB7IGF1dG9yOiAzLCByZWRha3Rpb246 +IDEsIHJldmlldzogMS41IH07CiAgICAgICAgbGV0IHRvdGFsV2VpZ2h0ID0gMDsKICAgICAgICBj +b25zdCB3ZWlnaHRlZCA9IGRvYy5jb250cmlidXRvcnMubWFwKGMgPT4gewogICAgICAgICAgICBj +b25zdCB3ID0gKGMuZW50cmllcyB8fCAxKSAqIChyb2xlV2VpZ2h0c1tjLnJvbGVdIHx8IDEpOwog +ICAgICAgICAgICB0b3RhbFdlaWdodCArPSB3OwogICAgICAgICAgICByZXR1cm4geyAuLi5jLCB3 +ZWlnaHQ6IHcgfTsKICAgICAgICB9KTsKCiAgICAgICAgY29uc3Qgcm9sZUxhYmVscyA9IHsgYXV0 +b3I6ICdBdXRvcicsIHJlZGFrdGlvbjogJ1JlZGFrdGlvbicsIHJldmlldzogJ1JldmlldycgfTsK +CiAgICAgICAgbGV0IGh0bWwgPSAnPGRpdiBjbGFzcz0iY29udHJpYnV0b3JzLXNlY3Rpb24iPjxo +Mz5NaXR3aXJrZW5kZTwvaDM+JzsKICAgICAgICB3ZWlnaHRlZAogICAgICAgICAgICAuc29ydCgo +YSwgYikgPT4gYi53ZWlnaHQgLSBhLndlaWdodCkKICAgICAgICAgICAgLmZvckVhY2goYyA9PiB7 +CiAgICAgICAgICAgICAgICBjb25zdCBwY3QgPSB0b3RhbFdlaWdodCA+IDAgPyBNYXRoLnJvdW5k +KChjLndlaWdodCAvIHRvdGFsV2VpZ2h0KSAqIDEwMCkgOiAwOwogICAgICAgICAgICAgICAgY29u +c3Qgcm9sZSA9IGMucm9sZSB8fCAnYXV0b3InOwogICAgICAgICAgICAgICAgaHRtbCArPSAnPGRp +diBjbGFzcz0iY29udHJpYnV0b3Itcm93Ij4nICsKICAgICAgICAgICAgICAgICAgICAnPHNwYW4g +Y2xhc3M9ImNvbnRyaWJ1dG9yLW5hbWUiPicgKyBEcml2ZVBvcnRhbC5lc2NhcGVIVE1MKGMudXNl +cm5hbWUpICsgJzwvc3Bhbj4nICsKICAgICAgICAgICAgICAgICAgICAnPHNwYW4gY2xhc3M9ImNv +bnRyaWJ1dG9yLXJvbGUgJyArIHJvbGUgKyAnIj4nICsgKHJvbGVMYWJlbHNbcm9sZV0gfHwgcm9s +ZSkgKyAnPC9zcGFuPicgKwogICAgICAgICAgICAgICAgICAgICc8c3BhbiBzdHlsZT0iZm9udC1z +aXplOjExcHg7Y29sb3I6dmFyKC0tdGV4dC1tdXRlZCk7d2lkdGg6MjRweDt0ZXh0LWFsaWduOnJp +Z2h0O2ZsZXgtc2hyaW5rOjA7Ij4nICsgKGMuZW50cmllcyA+IDEgPyBjLmVudHJpZXMgKyAneCcg +OiAnJykgKyAnPC9zcGFuPicgKwogICAgICAgICAgICAgICAgICAgICc8ZGl2IGNsYXNzPSJjb250 +cmlidXRvci1iYXIiPjxkaXYgY2xhc3M9ImNvbnRyaWJ1dG9yLWJhci1maWxsICcgKyByb2xlICsg +JyIgc3R5bGU9IndpZHRoOicgKyBwY3QgKyAnJTsiPjwvZGl2PjwvZGl2PicgKwogICAgICAgICAg +ICAgICAgICAgICc8c3BhbiBjbGFzcz0iY29udHJpYnV0b3ItcGN0Ij4nICsgcGN0ICsgJyU8L3Nw +YW4+JyArCiAgICAgICAgICAgICAgICAnPC9kaXY+JzsKICAgICAgICAgICAgfSk7CiAgICAgICAg +aHRtbCArPSAnPC9kaXY+JzsKICAgICAgICByZXR1cm4gaHRtbDsKICAgIH0sCgogICAgcmVuZGVy +UmV2aWV3SGlzdG9yeShkb2MpIHsKICAgICAgICAvLyBQcnVlZnVuZ3N2ZXJsYXVmIG51ciBmdWVy +IFNVLCBGQSB1bmQgenVzdGFlbmRpZ2UgUmV2aWV3ZXIgYW56ZWlnZW4KICAgICAgICBpZiAoIURy +aXZlR292ZXJuYW5jZS5pc1N1cGVyVXNlcigpICYmICFEcml2ZUdvdmVybmFuY2UuaXNGYWNoYXVm +c2ljaHQoKSAmJiAhRHJpdmVHb3Zlcm5hbmNlLmlzUmV2aWV3ZXIoZG9jLmthdGVnb3JpZSkpIHJl +dHVybiAnJzsKCiAgICAgICAgY29uc3QgZ292ID0gZG9jLmdvdmVybmFuY2U7CiAgICAgICAgaWYg +KCFnb3YgfHwgIWdvdi5yZXZpZXdIaXN0b3J5IHx8IGdvdi5yZXZpZXdIaXN0b3J5Lmxlbmd0aCA9 +PT0gMCkgcmV0dXJuICcnOwoKICAgICAgICBsZXQgaHRtbCA9ICc8ZGl2IGNsYXNzPSJyZXZpZXct +aGlzdG9yeSI+PGgzPlByw7xmdW5nc3ZlcmxhdWY8L2gzPic7CiAgICAgICAgZ292LnJldmlld0hp +c3Rvcnkuc2xpY2UoKS5yZXZlcnNlKCkuZm9yRWFjaChmdW5jdGlvbihlbnRyeSwgaWR4KSB7CiAg +ICAgICAgICAgIHZhciBhY3Rpb25MYWJlbCA9IGVudHJ5LmFjdGlvbiA9PT0gJ2FwcHJvdmVkJyA/ +ICdGcmVpZ2VnZWJlbicgOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5LmFj +dGlvbiA9PT0gJ3JlamVjdGVkJyA/ICdBYmdlbGVobnQnIDoKICAgICAgICAgICAgICAgICAgICAg +ICAgICAgICAgICBlbnRyeS5hY3Rpb24gPT09ICdzdWJtaXR0ZWQnID8gJ1p1ciBQcsO8ZnVuZycg +OiBlbnRyeS5hY3Rpb247CiAgICAgICAgICAgIHZhciBkYXRlID0gZm9ybWF0RGF0ZVRpbWUoZW50 +cnkuYXQpOwogICAgICAgICAgICB2YXIgY29tbWVudEh0bWwgPSAnJzsKICAgICAgICAgICAgaWYg +KGVudHJ5LmNvbW1lbnQpIHsKICAgICAgICAgICAgICAgIC8vIEtvbW1lbnRhciBhbHMgc2ljaGVy +ZXMgSFRNTCByZW5kZXJuIChlcmxhdWJ0OiBiLCBpLCB1LCB1bCwgbGksIGJyLCBmb250KQogICAg +ICAgICAgICAgICAgLy8gQWxsZXMgYW5kZXJlOiBUYWdzIGFscyBnZXJlbmRlcnRlbiBUZXh0IHpl +aWdlbgogICAgICAgICAgICAgICAgdmFyIHNhZmVDb21tZW50ID0gZW50cnkuY29tbWVudDsKICAg +ICAgICAgICAgICAgIC8vIEZhbGxzIGRlciBLb21tZW50YXIgcmF3LUhUTUwtVGFncyBhbHMgVGV4 +dCBlbnRoYWVsdCAoYWx0ZSBFaW50cmFlZ2UpLCBlc2NhcGVuCiAgICAgICAgICAgICAgICBpZiAo +c2FmZUNvbW1lbnQuaW5kZXhPZignPHNwYW4gc3R5bGU9JykgPj0gMCB8fCBzYWZlQ29tbWVudC5p +bmRleE9mKCc8ZGl2JykgPj0gMCB8fCBzYWZlQ29tbWVudC5pbmRleE9mKCc8YSBocmVmPScpID49 +IDApIHsKICAgICAgICAgICAgICAgICAgICAvLyBBbHRlcyB1bnNhbml0aWVydGVzIEhUTUw6IEFs +cyBLbGFydGV4dCBkYXJzdGVsbGVuCiAgICAgICAgICAgICAgICAgICAgdmFyIHRtcERpdiA9IGRv +Y3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOwogICAgICAgICAgICAgICAgICAgIHRtcERpdi5p +bm5lckhUTUwgPSBzYWZlQ29tbWVudDsKICAgICAgICAgICAgICAgICAgICBzYWZlQ29tbWVudCA9 +IERyaXZlUG9ydGFsLmVzY2FwZUhUTUwodG1wRGl2LnRleHRDb250ZW50KTsKICAgICAgICAgICAg +ICAgIH0KICAgICAgICAgICAgICAgIHZhciB1aWQgPSAncmNfJyArIGlkeDsKICAgICAgICAgICAg +ICAgIGNvbW1lbnRIdG1sID0gJzxkaXYgc3R5bGU9ImZsZXgtYmFzaXM6MTAwJTttYXJnaW4tdG9w +OjRweDsiPicgKwogICAgICAgICAgICAgICAgICAgICc8ZGl2IGlkPSInICsgdWlkICsgJyIgc3R5 +bGU9ImJhY2tncm91bmQ6dmFyKC0tYmctY2FyZC1hbHQpO3BhZGRpbmc6MCAxMHB4O2JvcmRlci1y +YWRpdXM6NHB4O2JvcmRlci1sZWZ0OjNweCBzb2xpZCAjZGMzNTQ1O2ZvbnQtc2l6ZToxMnB4O2Nv +bG9yOnZhcigtLXRleHQtcHJpbWFyeSk7aGVpZ2h0OjI4cHg7bGluZS1oZWlnaHQ6MjhweDtvdmVy +ZmxvdzpoaWRkZW47Y3Vyc29yOnBvaW50ZXI7dHJhbnNpdGlvbjpoZWlnaHQgMC4zczt3aGl0ZS1z +cGFjZTpub3dyYXA7dGV4dC1vdmVyZmxvdzplbGxpcHNpczsiIG9uY2xpY2s9InZhciBlbD1kb2N1 +bWVudC5nZXRFbGVtZW50QnlJZChcJycgKyB1aWQgKyAnXCcpO2lmKGVsLnN0eWxlLmhlaWdodD09 +PVwnYXV0b1wnKXtlbC5zdHlsZS5oZWlnaHQ9XCcyOHB4XCc7ZWwuc3R5bGUubGluZUhlaWdodD1c +JzI4cHhcJztlbC5zdHlsZS53aGl0ZVNwYWNlPVwnbm93cmFwXCc7ZWwuc3R5bGUucGFkZGluZz1c +JzAgMTBweFwnO31lbHNle2VsLnN0eWxlLmhlaWdodD1cJ2F1dG9cJztlbC5zdHlsZS5saW5lSGVp +Z2h0PVwnMS41XCc7ZWwuc3R5bGUud2hpdGVTcGFjZT1cJ25vcm1hbFwnO2VsLnN0eWxlLnBhZGRp +bmc9XCc4cHggMTBweFwnO30iIHRpdGxlPSJLbGlja2UgenVtIEF1Zi0vWnVrbGFwcGVuIj4nICsK +ICAgICAgICAgICAgICAgICAgICAgICAgc2FmZUNvbW1lbnQgKwogICAgICAgICAgICAgICAgICAg +ICc8L2Rpdj4nICsKICAgICAgICAgICAgICAgICc8L2Rpdj4nOwogICAgICAgICAgICB9CiAgICAg +ICAgICAgIGh0bWwgKz0gJzxkaXYgY2xhc3M9InJldmlldy1oaXN0b3J5LWl0ZW0iIHN0eWxlPSJm +bGV4LXdyYXA6d3JhcDsiPicgKwogICAgICAgICAgICAgICAgJzxzcGFuIGNsYXNzPSJhY3Rpb24t +YmFkZ2UgJyArIGVudHJ5LmFjdGlvbiArICciPicgKyBhY3Rpb25MYWJlbCArICc8L3NwYW4+JyAr +CiAgICAgICAgICAgICAgICAnPHNwYW4gc3R5bGU9ImNvbG9yOnZhcigtLXRleHQtc2Vjb25kYXJ5 +KTsiPicgKyBEcml2ZVBvcnRhbC5lc2NhcGVIVE1MKGVudHJ5LmJ5IHx8ICctJykgKyAnPC9zcGFu +PicgKwogICAgICAgICAgICAgICAgJzxzcGFuIHN0eWxlPSJjb2xvcjp2YXIoLS10ZXh0LW11dGVk +KTsiPicgKyBkYXRlICsgJzwvc3Bhbj4nICsKICAgICAgICAgICAgICAgIGNvbW1lbnRIdG1sICsK +ICAgICAgICAgICAgJzwvZGl2Pic7CiAgICAgICAgfSk7CiAgICAgICAgcmV0dXJuIGh0bWwgKyAn +PC9kaXY+JzsKICAgIH0sCgogICAgX2RlbGV0ZURvY0lkOiBudWxsLAoKICAgIGFzeW5jIGRlbGV0 +ZURvY3VtZW50KGRvY0lkKSB7CiAgICAgICAgaWYgKERyaXZlRlMucmVhZE9ubHkpIHsKICAgICAg +ICAgICAgdmFyIGdyYW50ZWQgPSBhd2FpdCBEcml2ZUZTLmVuc3VyZVdyaXRlQWNjZXNzKCk7CiAg +ICAgICAgICAgIGlmICghZ3JhbnRlZCkgcmV0dXJuOwogICAgICAgIH0KICAgICAgICB2YXIgZG9j +ID0gRHJpdmVGUy5kb2N1bWVudHMuZmluZChmdW5jdGlvbihkKXsgcmV0dXJuIGQuaWQgPT09IGRv +Y0lkOyB9KTsKICAgICAgICBpZiAoIWRvYykgcmV0dXJuOwogICAgICAgIHRoaXMuX2RlbGV0ZURv +Y0lkID0gZG9jSWQ7CiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RlbGV0ZUNvbmZp +cm1UZXh0JykudGV4dENvbnRlbnQgPSAnRG9rdW1lbnQ6IOKAnicgKyBkb2MudGl0ZWwgKyAnIiAo +JyArIGRvYy5rYXRlZ29yaWUgKyAnKSc7CiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQo +J2RlbGV0ZUNvbmZpcm1JbnB1dCcpLnZhbHVlID0gJyc7CiAgICAgICAgZG9jdW1lbnQuZ2V0RWxl +bWVudEJ5SWQoJ2RlbGV0ZUNvbmZpcm1CdG4nKS5kaXNhYmxlZCA9IHRydWU7CiAgICAgICAgZG9j +dW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RlbGV0ZUNvbmZpcm1Nb2RhbCcpLmNsYXNzTGlzdC5hZGQo +J2FjdGl2ZScpOwogICAgICAgIHZhciBpbnB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdk +ZWxldGVDb25maXJtSW5wdXQnKTsKICAgICAgICBpbnB1dC5mb2N1cygpOwogICAgICAgIGlucHV0 +Lm9uaW5wdXQgPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5 +SWQoJ2RlbGV0ZUNvbmZpcm1CdG4nKS5kaXNhYmxlZCA9ICFpbnB1dC52YWx1ZS50cmltKCk7CiAg +ICAgICAgfTsKICAgIH0sCgogICAgY2FuY2VsRGVsZXRlKCkgewogICAgICAgIHRoaXMuX2RlbGV0 +ZURvY0lkID0gbnVsbDsKICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGVsZXRlQ29u +ZmlybU1vZGFsJykuY2xhc3NMaXN0LnJlbW92ZSgnYWN0aXZlJyk7CiAgICB9LAoKICAgIGFzeW5j +IGNvbmZpcm1EZWxldGUoKSB7CiAgICAgICAgdmFyIGRvY0lkID0gdGhpcy5fZGVsZXRlRG9jSWQ7 +CiAgICAgICAgaWYgKCFkb2NJZCkgcmV0dXJuOwogICAgICAgIHZhciBud0tlbm51bmcgPSBkb2N1 +bWVudC5nZXRFbGVtZW50QnlJZCgnZGVsZXRlQ29uZmlybUlucHV0JykudmFsdWUudHJpbSgpOwog +ICAgICAgIGlmICghbndLZW5udW5nKSB7IHNob3dUb2FzdCgnQml0dGUgTlctS2VubnVuZyBlaW5n +ZWJlbicsICd3YXJuaW5nJyk7IHJldHVybjsgfQoKICAgICAgICB2YXIgZG9jID0gRHJpdmVGUy5k +b2N1bWVudHMuZmluZChmdW5jdGlvbihkKXsgcmV0dXJuIGQuaWQgPT09IGRvY0lkOyB9KTsKICAg +ICAgICBpZiAoIWRvYykgcmV0dXJuOwoKICAgICAgICAvLyBTb2Z0LURlbGV0ZTogSW4gUGFwaWVy +a29yYiB2ZXJzY2hpZWJlbiBzdGF0dCBwaHlzaXNjaCBsw7ZzY2hlbgogICAgICAgIHZhciB0cmFz +aEVudHJ5ID0gewogICAgICAgICAgICBkb2M6IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoZG9j +KSksCiAgICAgICAgICAgIGRlbGV0ZWRCeTogbndLZW5udW5nLAogICAgICAgICAgICBkZWxldGVk +QXQ6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSwKICAgICAgICAgICAgZXhwaXJlc0F0OiBuZXcg +RGF0ZShEYXRlLm5vdygpICsgMjggKiAyNCAqIDYwICogNjAgKiAxMDAwKS50b0lTT1N0cmluZygp +CiAgICAgICAgfTsKCiAgICAgICAgLy8gUGFwaWVya29yYiBsYWRlbi9lcnN0ZWxsZW4KICAgICAg +ICB2YXIgdHJhc2ggPSBhd2FpdCB0aGlzLl9sb2FkVHJhc2goKTsKICAgICAgICB0cmFzaC5wdXNo +KHRyYXNoRW50cnkpOwogICAgICAgIGF3YWl0IHRoaXMuX3NhdmVUcmFzaCh0cmFzaCk7CgogICAg +ICAgIC8vIEzDtnNjaC1Mb2cKICAgICAgICB2YXIgbG9nRW50cnkgPSB7IGFjdGlvbjogJ2RlbGV0 +ZScsIGRvY0lkOiBkb2NJZCwgdGl0ZWw6IGRvYy50aXRlbCwga2F0ZWdvcmllOiBkb2Mua2F0ZWdv +cmllLCBkZWxldGVkQnk6IG53S2VubnVuZywgdGltZXN0YW1wOiBuZXcgRGF0ZSgpLnRvSVNPU3Ry +aW5nKCkgfTsKICAgICAgICBhd2FpdCB0aGlzLl9hcHBlbmREZWxldGVMb2cobG9nRW50cnkpOwoK +ICAgICAgICAvLyBEb2t1bWVudCBwaHlzaXNjaCBsw7ZzY2hlbgogICAgICAgIHZhciBzdWNjZXNz +ID0gYXdhaXQgRHJpdmVGUy5kZWxldGVEb2N1bWVudChkb2NJZCk7CiAgICAgICAgZG9jdW1lbnQu +Z2V0RWxlbWVudEJ5SWQoJ2RlbGV0ZUNvbmZpcm1Nb2RhbCcpLmNsYXNzTGlzdC5yZW1vdmUoJ2Fj +dGl2ZScpOwogICAgICAgIHRoaXMuX2RlbGV0ZURvY0lkID0gbnVsbDsKCiAgICAgICAgaWYgKHN1 +Y2Nlc3MpIHsKICAgICAgICAgICAgdGhpcy5zZWxlY3RlZERvY0lkID0gbnVsbDsKICAgICAgICAg +ICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RvY3VtZW50RGV0YWlsJykuaW5uZXJIVE1MID0g +JzxkaXYgY2xhc3M9ImRldGFpbC1lbXB0eSI+PHA+RG9rdW1lbnQgZ2Vsw7ZzY2h0LiBXw6RobGUg +ZWluIGFuZGVyZXMgRG9rdW1lbnQuPC9wPjwvZGl2Pic7CiAgICAgICAgICAgIHRoaXMucmVuZGVy +KCk7CiAgICAgICAgICAgIHNob3dUb2FzdCgnRG9rdW1lbnQgZ2Vsw7ZzY2h0ICgyOCBUYWdlIHdp +ZWRlcmhlcnN0ZWxsYmFyKScsICdzdWNjZXNzJyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAg +ICAgc2hvd1RvYXN0KCdGZWhsZXIgYmVpbSBMw7ZzY2hlbicsICdlcnJvcicpOwogICAgICAgIH0K +ICAgIH0sCgogICAgYXN5bmMgX2xvYWRUcmFzaCgpIHsKICAgICAgICB0cnkgewogICAgICAgICAg +ICBpZiAoRHJpdmVGUy5tb2RlID09PSAnc2VydmVyJykgewogICAgICAgICAgICAgICAgdmFyIHJl +cyA9IGF3YWl0IGZldGNoKCcvZGF0YS8udHJhc2guanNvbicpOwogICAgICAgICAgICAgICAgaWYg +KHJlcy5vaykgcmV0dXJuIGF3YWl0IHJlcy5qc29uKCk7CiAgICAgICAgICAgIH0gZWxzZSBpZiAo +RHJpdmVGUy5tb2RlID09PSAnZmlsZXN5c3RlbScgJiYgRHJpdmVGUy5fZGF0YUhhbmRsZSkgewog +ICAgICAgICAgICAgICAgdmFyIGZoID0gYXdhaXQgRHJpdmVGUy5fZGF0YUhhbmRsZS5nZXRGaWxl +SGFuZGxlKCcudHJhc2guanNvbicpOwogICAgICAgICAgICAgICAgdmFyIGZpbGUgPSBhd2FpdCBm +aC5nZXRGaWxlKCk7CiAgICAgICAgICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShhd2FpdCBmaWxl +LnRleHQoKSk7CiAgICAgICAgICAgIH0KICAgICAgICB9IGNhdGNoKGUpIHt9CiAgICAgICAgcmV0 +dXJuIFtdOwogICAgfSwKCiAgICBhc3luYyBfc2F2ZVRyYXNoKHRyYXNoKSB7CiAgICAgICAgLy8g +QWJnZWxhdWZlbmUgZW50ZmVybmVuICg+MjggVGFnZSkKICAgICAgICB2YXIgbm93ID0gbmV3IERh +dGUoKS50b0lTT1N0cmluZygpOwogICAgICAgIHRyYXNoID0gdHJhc2guZmlsdGVyKGZ1bmN0aW9u +KHQpeyByZXR1cm4gdC5leHBpcmVzQXQgPiBub3c7IH0pOwogICAgICAgIGlmIChEcml2ZUZTLm1v +ZGUgPT09ICdzZXJ2ZXInKSB7CiAgICAgICAgICAgIGF3YWl0IGZldGNoKCcvYXBpL3dyaXRlJywg +eyBtZXRob2Q6ICdQT1NUJywgaGVhZGVyczogeydDb250ZW50LVR5cGUnOidhcHBsaWNhdGlvbi9q +c29uOyBjaGFyc2V0PXV0Zi04J30sCiAgICAgICAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lm +eSh7IHBhdGg6ICdkYXRhLy50cmFzaC5qc29uJywgZGF0YTogdHJhc2ggfSkgfSk7CiAgICAgICAg +fSBlbHNlIGlmIChEcml2ZUZTLm1vZGUgPT09ICdmaWxlc3lzdGVtJyAmJiBEcml2ZUZTLl9kYXRh +SGFuZGxlKSB7CiAgICAgICAgICAgIHZhciBmaCA9IGF3YWl0IERyaXZlRlMuX2RhdGFIYW5kbGUu +Z2V0RmlsZUhhbmRsZSgnLnRyYXNoLmpzb24nLCB7IGNyZWF0ZTogdHJ1ZSB9KTsKICAgICAgICAg +ICAgdmFyIHdyaXRhYmxlID0gYXdhaXQgZmguY3JlYXRlV3JpdGFibGUoKTsKICAgICAgICAgICAg +YXdhaXQgd3JpdGFibGUud3JpdGUoSlNPTi5zdHJpbmdpZnkodHJhc2gsIG51bGwsIDIpKTsKICAg +ICAgICAgICAgYXdhaXQgd3JpdGFibGUuY2xvc2UoKTsKICAgICAgICB9CiAgICB9LAoKICAgIGFz +eW5jIF9hcHBlbmREZWxldGVMb2coZW50cnkpIHsKICAgICAgICB2YXIgbG9nID0gW107CiAgICAg +ICAgdHJ5IHsKICAgICAgICAgICAgaWYgKERyaXZlRlMubW9kZSA9PT0gJ3NlcnZlcicpIHsKICAg +ICAgICAgICAgICAgIHZhciByZXMgPSBhd2FpdCBmZXRjaCgnL2RhdGEvLmRlbGV0ZS1sb2cuanNv +bicpOwogICAgICAgICAgICAgICAgaWYgKHJlcy5vaykgbG9nID0gYXdhaXQgcmVzLmpzb24oKTsK +ICAgICAgICAgICAgfSBlbHNlIGlmIChEcml2ZUZTLm1vZGUgPT09ICdmaWxlc3lzdGVtJyAmJiBE +cml2ZUZTLl9kYXRhSGFuZGxlKSB7CiAgICAgICAgICAgICAgICB2YXIgZmggPSBhd2FpdCBEcml2 +ZUZTLl9kYXRhSGFuZGxlLmdldEZpbGVIYW5kbGUoJy5kZWxldGUtbG9nLmpzb24nKTsKICAgICAg +ICAgICAgICAgIHZhciBmaWxlID0gYXdhaXQgZmguZ2V0RmlsZSgpOwogICAgICAgICAgICAgICAg +bG9nID0gSlNPTi5wYXJzZShhd2FpdCBmaWxlLnRleHQoKSk7CiAgICAgICAgICAgIH0KICAgICAg +ICB9IGNhdGNoKGUpIHt9CiAgICAgICAgbG9nLnB1c2goZW50cnkpOwogICAgICAgIGlmIChEcml2 +ZUZTLm1vZGUgPT09ICdzZXJ2ZXInKSB7CiAgICAgICAgICAgIGF3YWl0IGZldGNoKCcvYXBpL3dy +aXRlJywgeyBtZXRob2Q6ICdQT1NUJywgaGVhZGVyczogeydDb250ZW50LVR5cGUnOidhcHBsaWNh +dGlvbi9qc29uOyBjaGFyc2V0PXV0Zi04J30sCiAgICAgICAgICAgICAgICBib2R5OiBKU09OLnN0 +cmluZ2lmeSh7IHBhdGg6ICdkYXRhLy5kZWxldGUtbG9nLmpzb24nLCBkYXRhOiBsb2cgfSkgfSk7 +CiAgICAgICAgfSBlbHNlIGlmIChEcml2ZUZTLm1vZGUgPT09ICdmaWxlc3lzdGVtJyAmJiBEcml2 +ZUZTLl9kYXRhSGFuZGxlKSB7CiAgICAgICAgICAgIHZhciBmaDIgPSBhd2FpdCBEcml2ZUZTLl9k +YXRhSGFuZGxlLmdldEZpbGVIYW5kbGUoJy5kZWxldGUtbG9nLmpzb24nLCB7IGNyZWF0ZTogdHJ1 +ZSB9KTsKICAgICAgICAgICAgdmFyIHdyaXRhYmxlID0gYXdhaXQgZmgyLmNyZWF0ZVdyaXRhYmxl +KCk7CiAgICAgICAgICAgIGF3YWl0IHdyaXRhYmxlLndyaXRlKEpTT04uc3RyaW5naWZ5KGxvZywg +bnVsbCwgMikpOwogICAgICAgICAgICBhd2FpdCB3cml0YWJsZS5jbG9zZSgpOwogICAgICAgIH0K +ICAgIH0sCgogICAgYXN5bmMgc2hvd1RyYXNoKCkgewogICAgICAgIHZhciB0cmFzaCA9IGF3YWl0 +IHRoaXMuX2xvYWRUcmFzaCgpOwogICAgICAgIHZhciBub3cgPSBuZXcgRGF0ZSgpLnRvSVNPU3Ry +aW5nKCk7CiAgICAgICAgdHJhc2ggPSB0cmFzaC5maWx0ZXIoZnVuY3Rpb24odCl7IHJldHVybiB0 +LmV4cGlyZXNBdCA+IG5vdzsgfSk7CiAgICAgICAgdmFyIGh0bWwgPSAnJzsKICAgICAgICBpZiAo +dHJhc2gubGVuZ3RoID09PSAwKSB7CiAgICAgICAgICAgIGh0bWwgPSAnPGRpdiBjbGFzcz0iZ292 +LWVtcHR5Ij5QYXBpZXJrb3JiIGlzdCBsZWVyPC9kaXY+JzsKICAgICAgICB9IGVsc2UgewogICAg +ICAgICAgICB0cmFzaC5mb3JFYWNoKGZ1bmN0aW9uKHQsIGkpIHsKICAgICAgICAgICAgICAgIHZh +ciBkYXlzTGVmdCA9IE1hdGguY2VpbCgobmV3IERhdGUodC5leHBpcmVzQXQpIC0gbmV3IERhdGUo +KSkgLyAoMjQqNjAqNjAqMTAwMCkpOwogICAgICAgICAgICAgICAgaHRtbCArPSAnPGRpdiBjbGFz +cz0idHJhc2gtaXRlbSI+JyArCiAgICAgICAgICAgICAgICAgICAgJzxkaXYgY2xhc3M9InRyYXNo +LWl0ZW0tdGl0bGUiPicgKyBEcml2ZVBvcnRhbC5lc2NhcGVIVE1MKHQuZG9jLnRpdGVsKSArICc8 +L2Rpdj4nICsKICAgICAgICAgICAgICAgICAgICAnPGRpdiBjbGFzcz0idHJhc2gtaXRlbS1tZXRh +Ij5HZWzDtnNjaHQgdm9uICcgKyBEcml2ZVBvcnRhbC5lc2NhcGVIVE1MKHQuZGVsZXRlZEJ5KSAr +ICcgYW0gJyArIGZvcm1hdERhdGVUaW1lKHQuZGVsZXRlZEF0KSArICcgfCBOb2NoICcgKyBkYXlz +TGVmdCArICcgVGFnZSB2ZXJmw7xnYmFyPC9kaXY+JyArCiAgICAgICAgICAgICAgICAgICAgJzxk +aXYgY2xhc3M9InRyYXNoLWl0ZW0tYWN0aW9ucyI+JyArCiAgICAgICAgICAgICAgICAgICAgICAg +ICc8YnV0dG9uIGNsYXNzPSJidG4tcmVzdG9yZSIgb25jbGljaz0iRHJpdmVQb3J0YWwucmVzdG9y +ZUZyb21UcmFzaCgnICsgaSArICcpIj5XaWVkZXJoZXJzdGVsbGVuPC9idXR0b24+JyArCiAgICAg +ICAgICAgICAgICAgICAgJzwvZGl2PicgKwogICAgICAgICAgICAgICAgJzwvZGl2Pic7CiAgICAg +ICAgICAgIH0pOwogICAgICAgIH0KICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZG9j +dW1lbnREZXRhaWwnKS5pbm5lckhUTUwgPQogICAgICAgICAgICAnPGRpdiBzdHlsZT0icGFkZGlu +ZzoyMHB4OyI+PGgyIHN0eWxlPSJjb2xvcjp2YXIoLS10ZXh0LWhlYWRpbmcpO21hcmdpbi1ib3R0 +b206MTVweDsiPlBhcGllcmtvcmIgKCcgKyB0cmFzaC5sZW5ndGggKyAnKTwvaDI+JyArIGh0bWwg +KyAnPC9kaXY+JzsKICAgIH0sCgogICAgYXN5bmMgcmVzdG9yZUZyb21UcmFzaChpbmRleCkgewog +ICAgICAgIHZhciB0cmFzaCA9IGF3YWl0IHRoaXMuX2xvYWRUcmFzaCgpOwogICAgICAgIGlmICgh +dHJhc2hbaW5kZXhdKSByZXR1cm47CiAgICAgICAgdmFyIGVudHJ5ID0gdHJhc2hbaW5kZXhdOwog +ICAgICAgIHZhciBkb2MgPSBlbnRyeS5kb2M7CiAgICAgICAgdmFyIHNhdmVSZXN1bHQgPSBhd2Fp +dCBEcml2ZUZTLnNhdmVEb2N1bWVudChkb2MpOwogICAgICAgIGlmIChzYXZlUmVzdWx0ID09PSB0 +cnVlKSB7CiAgICAgICAgICAgIHRyYXNoLnNwbGljZShpbmRleCwgMSk7CiAgICAgICAgICAgIGF3 +YWl0IHRoaXMuX3NhdmVUcmFzaCh0cmFzaCk7CiAgICAgICAgICAgIHRoaXMucmVuZGVyKCk7CiAg +ICAgICAgICAgIHRoaXMuc2VsZWN0RG9jdW1lbnQoZG9jLmlkKTsKICAgICAgICAgICAgc2hvd1Rv +YXN0KCdEb2t1bWVudCDigJ4nICsgZG9jLnRpdGVsICsgJyIgd2llZGVyaGVyZ2VzdGVsbHQnLCAn +c3VjY2VzcycpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHNob3dUb2FzdCgnRmVobGVy +IGJlaW0gV2llZGVyaGVyc3RlbGxlbicsICdlcnJvcicpOwogICAgICAgIH0KICAgIH0sCgogICAg +Ly8gWFNTLVNjaHV0ejogQmVyZWluaWd0IFplaWNoZW5rZXR0ZW4gYmV2b3Igc2llIGFscyBIVE1M +IGRhcmdlc3RlbGx0IHdlcmRlbi4KICAgICAgICAvLyBlc2NhcGVIVE1MKCkgLSBmdWVyIEVsZW1l +bnQtSW5oYWx0ZSAodGV4dENvbnRlbnQtYmFzaWVydCwgYnJvd3NlcnNpY2hlcikKICAgICAgICAv +LyBlc2NhcGVBdHRyKCkgLSBmdWVyIEhUTUwtQXR0cmlidXR3ZXJ0ZSAobWFudWVsbGVzIEVzY2Fw +aW5nIGFsbGVyIHJlbGV2YW50ZW4gWmVpY2hlbikKICAgICAgICAvLyBCZWlkZSBGdW5rdGlvbmVu +IHdlcmRlbiBpbiBEcml2ZVBvcnRhbCBiZWkgamVkZXIgRGFyc3RlbGx1bmcgdm9uIEJlbnV0emVy +ZGF0ZW4gYXVmZ2VydWZlbi4KICAgIGVzY2FwZUhUTUwoc3RyKSB7CiAgICAgICAgaWYgKCFzdHIp +IHJldHVybiAnJzsKICAgICAgICBjb25zdCBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdk +aXYnKTsKICAgICAgICBkaXYudGV4dENvbnRlbnQgPSBzdHI7CiAgICAgICAgcmV0dXJuIGRpdi5p +bm5lckhUTUw7CiAgICB9LAoKICAgIGVzY2FwZUF0dHIoc3RyKSB7CiAgICAgICAgaWYgKCFzdHIp +IHJldHVybiAnJzsKICAgICAgICByZXR1cm4gc3RyLnJlcGxhY2UoLyYvZywgJyZhbXA7JykucmVw +bGFjZSgvIi9nLCAnJnF1b3Q7JykucmVwbGFjZSgvJy9nLCAnJiMzOTsnKS5yZXBsYWNlKC88L2cs +ICcmbHQ7JykucmVwbGFjZSgvPi9nLCAnJmd0OycpLnJlcGxhY2UoL2AvZywgJyYjOTY7Jyk7CiAg +ICB9LAoKICAgIC8vIFNhbml0aXplLUZ1bmt0aW9uIGZ1ZXIgUmljaC1UZXh0LUluaGFsdGUgKGRv +Yy5pbmhhbHQpLgogICAgLy8gRW50ZmVybnQgZ2VmYWVocmxpY2hlIEVsZW1lbnRlIChzY3JpcHQs +IGlmcmFtZSwgb2JqZWN0LCBlbWJlZCwgZm9ybSwgZXRjLikKICAgIC8vIHVuZCBhbGxlIEV2ZW50 +LUhhbmRsZXIgKG9uY2xpY2ssIG9uZXJyb3IsIG9ubG9hZCwgLi4uKSBzb3dpZSBqYXZhc2NyaXB0 +Oi1VUkxzLAogICAgLy8gYmVoYWVsdCBhYmVyIGFsbGUgRm9ybWF0aWVydW5nZW4gKGIsIGksIHUs +IGgxLWg2LCBwLCB1bCwgb2wsIHRhYmxlLCBpbWcsIGEsIGV0Yy4pCiAgICBzYW5pdGl6ZUhUTUwo +aHRtbCkgewogICAgICAgIGlmICghaHRtbCkgcmV0dXJuICcnOwogICAgICAgIHZhciBkb2MgPSBu +ZXcgRE9NUGFyc2VyKCkucGFyc2VGcm9tU3RyaW5nKGh0bWwsICd0ZXh0L2h0bWwnKTsKICAgICAg +ICAvLyBHZWZhZWhybGljaGUgVGFncyBrb21wbGV0dCBlbnRmZXJuZW4KICAgICAgICAvLyBpZnJh +bWVzIHdlcmRlbiBudXIgZW50ZmVybnQgd2VubiBzaWUgTklDSFQgaW4gZWluZW0gRFJJVkUtZWln +ZW5lbiBQREYtQ29udGFpbmVyIHN0ZWNrZW4KICAgICAgICAvLyAoZHJpdmUtbWVkaWEtcGRmLWlm +cmFtZSkgdW5kIGtlaW5lIGxva2FsZSBzcmMgaGFiZW4KICAgICAgICB2YXIgZGFuZ2Vyb3VzVGFn +cyA9IFsnc2NyaXB0Jywnb2JqZWN0JywnZW1iZWQnLCdmb3JtJywnbWF0aCcsJ2Jhc2UnLCdsaW5r +JywnbWV0YScsJ25vc2NyaXB0Jywnc3R5bGUnXTsKICAgICAgICBkYW5nZXJvdXNUYWdzLmZvckVh +Y2goZnVuY3Rpb24odGFnKSB7CiAgICAgICAgICAgIGRvYy5xdWVyeVNlbGVjdG9yQWxsKHRhZyku +Zm9yRWFjaChmdW5jdGlvbihlbCkgeyBlbC5yZW1vdmUoKTsgfSk7CiAgICAgICAgfSk7CiAgICAg +ICAgLy8gaWZyYW1lcyBzZXBhcmF0OiBudXIgZnJlbWRlL2dlZmFlaHJsaWNoZSBlbnRmZXJuZW4s +IGxva2FsZSBQREYtRWluYmV0dHVuZ2VuIGJlaWJlaGFsdGVuCiAgICAgICAgZG9jLnF1ZXJ5U2Vs +ZWN0b3JBbGwoJ2lmcmFtZScpLmZvckVhY2goZnVuY3Rpb24oZWwpIHsKICAgICAgICAgICAgdmFy +IHNyYyA9IChlbC5nZXRBdHRyaWJ1dGUoJ3NyYycpIHx8ICcnKS50cmltKCkudG9Mb3dlckNhc2Uo +KTsKICAgICAgICAgICAgdmFyIHBhcmVudCA9IGVsLnBhcmVudEVsZW1lbnQ7CiAgICAgICAgICAg +IHZhciBpc0RyaXZlUGRmID0gcGFyZW50ICYmIHBhcmVudC5jbGFzc0xpc3QgJiYgcGFyZW50LmNs +YXNzTGlzdC5jb250YWlucygnZHJpdmUtbWVkaWEtcGRmLWlmcmFtZScpOwogICAgICAgICAgICB2 +YXIgaXNMb2NhbFNyYyA9IHNyYy5zdGFydHNXaXRoKCdtZWRpYS8nKSB8fCBzcmMuc3RhcnRzV2l0 +aCgnL21lZGlhLycpIHx8IHNyYy5zdGFydHNXaXRoKCcuL21lZGlhLycpOwogICAgICAgICAgICBp +ZiAoIWlzRHJpdmVQZGYgJiYgIWlzTG9jYWxTcmMpIGVsLnJlbW92ZSgpOwogICAgICAgIH0pOwog +ICAgICAgIC8vIEFsbGUgRXZlbnQtSGFuZGxlciB1bmQgamF2YXNjcmlwdDotVVJMcyBlbnRmZXJu +ZW4KICAgICAgICBkb2MucXVlcnlTZWxlY3RvckFsbCgnKicpLmZvckVhY2goZnVuY3Rpb24oZWwp +IHsKICAgICAgICAgICAgdmFyIGF0dHJzID0gQXJyYXkuZnJvbShlbC5hdHRyaWJ1dGVzKTsKICAg +ICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhdHRycy5sZW5ndGg7IGkrKykgewogICAgICAg +ICAgICAgICAgdmFyIG5hbWUgPSBhdHRyc1tpXS5uYW1lLnRvTG93ZXJDYXNlKCk7CiAgICAgICAg +ICAgICAgICAvLyBvbiotRXZlbnQtSGFuZGxlciBlbnRmZXJuZW4KICAgICAgICAgICAgICAgIGlm +IChuYW1lLnN0YXJ0c1dpdGgoJ29uJykpIHsKICAgICAgICAgICAgICAgICAgICBlbC5yZW1vdmVB +dHRyaWJ1dGUoYXR0cnNbaV0ubmFtZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAg +ICAvLyBqYXZhc2NyaXB0Oi9kYXRhOiBVUkxzIGluIGhyZWYvc3JjL2FjdGlvbiBlbnRmZXJuZW4K +ICAgICAgICAgICAgICAgIGlmIChuYW1lID09PSAnaHJlZicgfHwgbmFtZSA9PT0gJ3NyYycgfHwg +bmFtZSA9PT0gJ2FjdGlvbicpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgdmFsID0gKGF0dHJz +W2ldLnZhbHVlIHx8ICcnKS50cmltKCkudG9Mb3dlckNhc2UoKTsKICAgICAgICAgICAgICAgICAg +ICBpZiAodmFsLnN0YXJ0c1dpdGgoJ2phdmFzY3JpcHQ6JykgfHwgdmFsLnN0YXJ0c1dpdGgoJ2Rh +dGE6dGV4dC9odG1sJykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZWwucmVtb3ZlQXR0cmli +dXRlKGF0dHJzW2ldLm5hbWUpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAg +IH0KICAgICAgICAgICAgfQogICAgICAgIH0pOwogICAgICAgIC8vIEFsbGUgTGlua3MgbXVlc3Nl +biBpbiBuZXVlbSBUYWIgb2VmZm5lbiAoUG9ydGFsIGRhcmYgbmljaHQgdmVybGFzc2VuIHdlcmRl +bikKICAgICAgICBkb2MucXVlcnlTZWxlY3RvckFsbCgnYVtocmVmXScpLmZvckVhY2goZnVuY3Rp +b24oYSkgewogICAgICAgICAgICB2YXIgaHJlZiA9IChhLmdldEF0dHJpYnV0ZSgnaHJlZicpIHx8 +ICcnKS50cmltKCk7CiAgICAgICAgICAgIC8vIEludGVybmUgQW5rZXIgKCMuLi4pIHVuZCBEUklW +RS1Dcm9zc2xpbmtzICguZHJpdmUteHJlZikgYXVzbmVobWVuCiAgICAgICAgICAgIGlmIChocmVm +LnN0YXJ0c1dpdGgoJyMnKSB8fCBhLmNsYXNzTGlzdC5jb250YWlucygnZHJpdmUteHJlZicpKSBy +ZXR1cm47CiAgICAgICAgICAgIGEuc2V0QXR0cmlidXRlKCd0YXJnZXQnLCAnX2JsYW5rJyk7CiAg +ICAgICAgICAgIGEuc2V0QXR0cmlidXRlKCdyZWwnLCAnbm9vcGVuZXIgbm9yZWZlcnJlcicpOwog +ICAgICAgIH0pOwogICAgICAgIHJldHVybiBkb2MuYm9keS5pbm5lckhUTUw7CiAgICB9LAoKICAg +IGhpZ2hsaWdodEl0ZW0oZG9jSWQpIHsKICAgICAgICBjb25zdCBpdGVtcyA9IGRvY3VtZW50LnF1 +ZXJ5U2VsZWN0b3JBbGwoJyNkb2N1bWVudExpc3QgLmRvY3VtZW50LWl0ZW0nKTsKICAgICAgICBp +dGVtcy5mb3JFYWNoKGl0ZW0gPT4gewogICAgICAgICAgICBpZiAoaXRlbS5nZXRBdHRyaWJ1dGUo +J29uY2xpY2snKSAmJiBpdGVtLmdldEF0dHJpYnV0ZSgnb25jbGljaycpLmluY2x1ZGVzKGRvY0lk +KSkgewogICAgICAgICAgICAgICAgaXRlbS5jbGFzc0xpc3QuYWRkKCdoaWdobGlnaHQtc2F2ZWQn +KTsKICAgICAgICAgICAgICAgIGl0ZW0uc2Nyb2xsSW50b1ZpZXcoeyBiZWhhdmlvcjogJ3Ntb290 +aCcsIGJsb2NrOiAnbmVhcmVzdCcgfSk7CiAgICAgICAgICAgICAgICBpdGVtLmFkZEV2ZW50TGlz +dGVuZXIoJ2FuaW1hdGlvbmVuZCcsICgpID0+IGl0ZW0uY2xhc3NMaXN0LnJlbW92ZSgnaGlnaGxp +Z2h0LXNhdmVkJyksIHsgb25jZTogdHJ1ZSB9KTsKICAgICAgICAgICAgfQogICAgICAgIH0pOwog +ICAgfQp9OwoKLy8gPT09PT09PT09PT09PT09PT09PT09IEVESVRPUiA9PT09PT09PT09PT09PT09 +PT09PT0KCi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 +PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci8vIE1vZHVsOiBEcml2ZUVkaXRvciAtIFdZ +U0lXWUctRWRpdG9yLCBNZWRpZW4tVXBsb2FkLCBEb2t1bWVudGVuYmVhcmJlaXR1bmcKLy8gWnVz +dGFlbmRpZyBmdWVyOiBFZGl0b3ItTW9kYWwsIEZvcm1hdGllcnVuZywgTWVkaWVuLVVwbG9hZC1E +aWFsb2csIFNwZWljaGVybgovLyBTaWNoZXJoZWl0OiBFaW5nZWZ1ZWd0ZSBIVE1MLUluaGFsdGUg +KFBhc3RlKSB3ZXJkZW4gdmlhIERPTVBhcnNlciBub3JtYWxpc2llcnQuCi8vICAgICAgICAgICAg +IERhdGVpbmFtZW4gd2VyZGVuIHVlYmVyIHNhbml0aXplRmlsZW5hbWUoKSBiZXJlaW5pZ3QgKGtl +aW5lIFNvbmRlcnplaWNoZW4vUGZhZHRyZW5uZXIpLgovLyAgICAgICAgICAgICBTcGVpY2hlcm4g +c2VuZGV0IERhdGVuIGFuIC9hcGkvd3JpdGUsIHdvIHNlcnZlcnNlaXRpZ2UgQXV0b3Jpc2llcnVu +ZyBncmVpZnQuCi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 +PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CmNvbnN0IERyaXZlRWRpdG9yID0gewog +ICAgY3VycmVudERvYzogbnVsbCwKICAgIGlzTmV3OiBmYWxzZSwKICAgIGhpc3Rvcnk6IFtdLAog +ICAgaGlzdG9yeUluZGV4OiAtMSwKICAgIGlzUmVzdG9yaW5nOiBmYWxzZSwKCiAgICBhc3luYyBj +cmVhdGVOZXcoKSB7CiAgICAgICAgaWYgKCFEcml2ZUZTLmNvbm5lY3RlZCkgewogICAgICAgICAg +ICBzaG93VG9hc3QoJ1p1bSBCZWFyYmVpdGVuIGJpdHRlIERSSVZFX1N0YXJ0LmJhdCBzdGFydGVu +JywgJ3dhcm5pbmcnKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBpZiAo RHJpdmVGUy5yZWFkT25seSkgewogICAgICAgICAgICBjb25zdCBncmFudGVkID0gYXdhaXQgRHJp dmVGUy5lbnN1cmVXcml0ZUFjY2VzcygpOwogICAgICAgICAgICBpZiAoIWdyYW50ZWQpIHJldHVy -bjsKICAgICAgICB9CgogICAgICAgIC8vIFBlc3NpbWlzdGljIExvY2tpbmc6IExvY2sgYW5mb3Jk -ZXJuIGJldm9yIEVkaXRvciBvZWZmbmV0CiAgICAgICAgY29uc3QgbG9ja1Jlc3VsdCA9IGF3YWl0 -IHRoaXMuYWNxdWlyZUxvY2soZG9jSWQpOwogICAgICAgIGlmICghbG9ja1Jlc3VsdC5vaykgewog -ICAgICAgICAgICBzaG93VG9hc3QoJ0Rva3VtZW50IHdpcmQgdm9uICcgKyBsb2NrUmVzdWx0LmJ5 -ICsgJyBiZWFyYmVpdGV0IChzZWl0ICcgKyBsb2NrUmVzdWx0Lm1pbnV0ZXMgKyAnIE1pbi4pJywg -J3dhcm5pbmcnLCA1MDAwKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAg -Y29uc3QgZG9jID0gYXdhaXQgRHJpdmVGUy5sb2FkRG9jdW1lbnQoZG9jSWQpOwogICAgICAgIGlm -ICghZG9jKSB7CiAgICAgICAgICAgIGF3YWl0IHRoaXMucmVsZWFzZUxvY2soZG9jSWQpOwogICAg -ICAgICAgICBzaG93VG9hc3QoJ0Rva3VtZW50IGtvbm50ZSBuaWNodCBnZWxhZGVuIHdlcmRlbics -ICdlcnJvcicpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICB0aGlzLmlz -TmV3ID0gZmFsc2U7CiAgICAgICAgdGhpcy5fbG9ja2VkRG9jSWQgPSBkb2NJZDsKICAgICAgICB0 -aGlzLmN1cnJlbnREb2MgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGRvYykpOyAvLyBEZWVw -IGNvcHkKICAgICAgICB0aGlzLm9wZW5Nb2RhbCgnRG9rdW1lbnQgYmVhcmJlaXRlbjogJyArIGRv -Yy50aXRlbCk7CiAgICB9LAoKICAgIG9wZW5Nb2RhbCh0aXRsZSkgewogICAgICAgIGNvbnN0IGRv -YyA9IHRoaXMuY3VycmVudERvYzsKICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZWRp -dG9yTW9kYWxUaXRsZScpLnRleHRDb250ZW50ID0gdGl0bGU7CiAgICAgICAgZG9jdW1lbnQuZ2V0 -RWxlbWVudEJ5SWQoJ2VkaXRvclRpdGVsJykudmFsdWUgPSBkb2MudGl0ZWwgfHwgJyc7CgogICAg -ICAgIC8vIEthdGVnb3JpZS1TZWxlY3QgZnVlbGxlbiAoYXVzZ2VibGVuZGV0ZSBLYXRlZ29yaWVu -IHVlYmVyc3ByaW5nZW4sIGVzIHNlaSBkZW5uIGRhcyBEb2t1bWVudCBoYXQgZGllc2UgS2F0ZWdv -cmllKQogICAgICAgIGNvbnN0IGthdFNlbGVjdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdl -ZGl0b3JLYXRlZ29yaWUnKTsKICAgICAgICBrYXRTZWxlY3QuaW5uZXJIVE1MID0gJyc7CiAgICAg -ICAgdmFyIGVkaXRvckhpZGRlbkthdHMgPSBEcml2ZUZTLmNvbmZpZy5oaWRkZW5LYXRlZ29yaWVu -IHx8IFtdOwogICAgICAgIChEcml2ZUZTLmNvbmZpZy5rYXRlZ29yaWVuIHx8IFtdKS5mb3JFYWNo -KGthdCA9PiB7CiAgICAgICAgICAgIGlmIChlZGl0b3JIaWRkZW5LYXRzLmluY2x1ZGVzKGthdCkg -JiYga2F0ICE9PSBkb2Mua2F0ZWdvcmllKSByZXR1cm47CiAgICAgICAgICAgIGNvbnN0IG9wdCA9 -IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ29wdGlvbicpOwogICAgICAgICAgICBvcHQudmFsdWUg -PSBrYXQ7CiAgICAgICAgICAgIG9wdC50ZXh0Q29udGVudCA9IGthdDsKICAgICAgICAgICAgaWYg -KGthdCA9PT0gZG9jLmthdGVnb3JpZSkgb3B0LnNlbGVjdGVkID0gdHJ1ZTsKICAgICAgICAgICAg -a2F0U2VsZWN0LmFwcGVuZENoaWxkKG9wdCk7CiAgICAgICAgfSk7CgogICAgICAgIC8vIFVudGVy -a2F0ZWdvcmllbi1IaW53ZWlzIGJlaSBLYXRlZ29yaWUtV2VjaHNlbAogICAgICAgIGNvbnN0IHRp -dGVsSW5wdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZWRpdG9yVGl0ZWwnKTsKICAgICAg -ICBjb25zdCB1cGRhdGVTdWJ0YWdIaW50ID0gKCkgPT4gewogICAgICAgICAgICBjb25zdCBzdWJz -ID0gRHJpdmVFZGl0b3IuQ0FURUdPUllfU1VCVEFHU1trYXRTZWxlY3QudmFsdWVdOwogICAgICAg -ICAgICBpZiAoc3VicykgewogICAgICAgICAgICAgICAgdGl0ZWxJbnB1dC5wbGFjZWhvbGRlciA9 -ICdUaXRlbCB6LkIuICcgKyBrYXRTZWxlY3QudmFsdWUgKyAnICgnICsgc3Vicy5qb2luKCcgLyAn -KSArICcpJzsKICAgICAgICAgICAgICAgIC8vIFN1Yi1UYWdzIGF1dG9tYXRpc2NoIGFscyBLZXl3 -b3JkLVZvcnNjaGxhZWdlIHByaW9yaXNpZXJlbgogICAgICAgICAgICAgICAgc3Vicy5mb3JFYWNo -KHMgPT4gewogICAgICAgICAgICAgICAgICAgIGlmICghRHJpdmVFZGl0b3IuX2N1cnJlbnRLZXl3 -b3Jkcy5pbmNsdWRlcyhzKSkgewogICAgICAgICAgICAgICAgICAgICAgICBEcml2ZUVkaXRvci5f -cmVuZGVyU3VnZ2VzdGlvbnMoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAg -ICB9KTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHRpdGVsSW5wdXQucGxh -Y2Vob2xkZXIgPSAnVGl0ZWwgZGVzIERva3VtZW50cyc7CiAgICAgICAgICAgIH0KICAgICAgICB9 -OwogICAgICAgIGthdFNlbGVjdC5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCB1cGRhdGVTdWJ0 -YWdIaW50KTsKICAgICAgICB1cGRhdGVTdWJ0YWdIaW50KCk7CgogICAgICAgIC8vIFN0YXR1cy1T -ZWxlY3QgZnVlbGxlbiAoZ2VmaWx0ZXJ0IG5hY2ggR292ZXJuYW5jZS1Sb2xsZSkKICAgICAgICBj -b25zdCBzdGF0dXNTZWxlY3QgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZWRpdG9yU3RhdHVz -Jyk7CiAgICAgICAgc3RhdHVzU2VsZWN0LmlubmVySFRNTCA9ICcnOwogICAgICAgIGNvbnN0IGlz -U1UgPSBEcml2ZUdvdmVybmFuY2UuaXNTdXBlclVzZXIoKTsKICAgICAgICBjb25zdCBpc0ZBID0g -RHJpdmVHb3Zlcm5hbmNlLmlzRmFjaGF1ZnNpY2h0KCk7CiAgICAgICAgY29uc3QgaXNSZXYgPSBE -cml2ZUdvdmVybmFuY2UuaXNSZXZpZXdlcihkb2Mua2F0ZWdvcmllKTsKICAgICAgICBPYmplY3Qu -a2V5cyhEcml2ZUZTLmNvbmZpZy5zdGF0dXMgfHwge30pLmZvckVhY2goc3RhdHVzID0+IHsKICAg -ICAgICAgICAgLy8gTm9ybWFsZSBVc2VyOiBudXIgRW50d3VyZiArIFBydWVmdW5nCiAgICAgICAg -ICAgIGlmICghaXNTVSAmJiAhaXNGQSAmJiAhaXNSZXYgJiYgKHN0YXR1cyA9PT0gJ0ZyZWlnZWdl -YmVuJyB8fCBzdGF0dXMgPT09ICdBYmdlbGVobnQnKSkgcmV0dXJuOwogICAgICAgICAgICBjb25z -dCBjZmcgPSBEcml2ZUZTLmNvbmZpZy5zdGF0dXNbc3RhdHVzXTsKICAgICAgICAgICAgY29uc3Qg -b3B0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnb3B0aW9uJyk7CiAgICAgICAgICAgIG9wdC52 -YWx1ZSA9IHN0YXR1czsKICAgICAgICAgICAgb3B0LnRleHRDb250ZW50ID0gY2ZnLmxhYmVsOwog -ICAgICAgICAgICBpZiAoc3RhdHVzID09PSBkb2Muc3RhdHVzKSBvcHQuc2VsZWN0ZWQgPSB0cnVl -OwogICAgICAgICAgICBzdGF0dXNTZWxlY3QuYXBwZW5kQ2hpbGQob3B0KTsKICAgICAgICB9KTsK -CiAgICAgICAgLy8gw5xiZXJhcnRpa2VsLVNlbGVjdCBmw7xsbGVuCiAgICAgICAgY29uc3QgcGFy -ZW50U2VsZWN0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VkaXRvclBhcmVudCcpOwogICAg -ICAgIHBhcmVudFNlbGVjdC5pbm5lckhUTUwgPSAnPG9wdGlvbiB2YWx1ZT0iIj4tLSBLZWluIMOc -YmVyYXJ0aWtlbCAtLTwvb3B0aW9uPic7CiAgICAgICAgRHJpdmVGUy5kb2N1bWVudHMuZm9yRWFj -aChkID0+IHsKICAgICAgICAgICAgaWYgKGQuaWQgPT09IGRvYy5pZCkgcmV0dXJuOyAvLyBzaWNo -IHNlbGJzdCBhdXNzY2hsaWXDn2VuCiAgICAgICAgICAgIGlmIChkLnBhcmVudElkID09PSBkb2Mu -aWQpIHJldHVybjsgLy8gS2luZGVyIGF1c3NjaGxpZcOfZW4gKFppcmtlbHZlcm1laWR1bmcpCiAg -ICAgICAgICAgIGNvbnN0IG9wdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ29wdGlvbicpOwog -ICAgICAgICAgICBvcHQudmFsdWUgPSBkLmlkOwogICAgICAgICAgICBvcHQudGV4dENvbnRlbnQg -PSBkLnRpdGVsOwogICAgICAgICAgICBpZiAoZC5pZCA9PT0gZG9jLnBhcmVudElkKSBvcHQuc2Vs -ZWN0ZWQgPSB0cnVlOwogICAgICAgICAgICBwYXJlbnRTZWxlY3QuYXBwZW5kQ2hpbGQob3B0KTsK -ICAgICAgICB9KTsKCiAgICAgICAgLy8gU2NobGFnd8O2cnRlciBpbml0aWFsaXNpZXJlbiAoYWJo -YWVuZ2lnIHZvbiBHb3Zlcm5hbmNlLU1vZHVzKQogICAgICAgIGNvbnN0IGt3TW9kZSA9IChEcml2 +bjsKICAgICAgICB9CgogICAgICAgIHRoaXMuaXNOZXcgPSB0cnVlOwogICAgICAgIGNvbnN0IHVz +ZXJuYW1lID0gKERyaXZlRlMuZW52aXJvbiAmJiBEcml2ZUZTLmVudmlyb24udXNlcm5hbWUpID8g +RHJpdmVGUy5lbnZpcm9uLnVzZXJuYW1lIDogbnVsbDsKICAgICAgICB0aGlzLmN1cnJlbnREb2Mg +PSB7CiAgICAgICAgICAgIGlkOiBEcml2ZUZTLmdlbmVyYXRlSWQoKSwKICAgICAgICAgICAgdGl0 +ZWw6ICcnLAogICAgICAgICAgICBrYXRlZ29yaWU6IChEcml2ZUZTLmNvbmZpZy5rYXRlZ29yaWVu +IHx8IFsnVmVya2VociddKVswXSwKICAgICAgICAgICAgaW5oYWx0OiAnJywKICAgICAgICAgICAg +c3RhdHVzOiAnRW50d3VyZicsCiAgICAgICAgICAgIGVyc3RlbGx0OiBuZXcgRGF0ZSgpLnRvSVNP +U3RyaW5nKCkuc3BsaXQoJ1QnKVswXSwKICAgICAgICAgICAgZ2VhZW5kZXJ0OiBuZXcgRGF0ZSgp +LnRvSVNPU3RyaW5nKCkuc3BsaXQoJ1QnKVswXSwKICAgICAgICAgICAgZXJzdGVsbHRWb246IHVz +ZXJuYW1lLAogICAgICAgICAgICBiZWFyYmVpdGV0Vm9uOiB1c2VybmFtZSwKICAgICAgICAgICAg +dmVyc2lvbjogJ3YwLjEnLAogICAgICAgICAgICBtZWRpYXM6IFtdLAogICAgICAgICAgICBzY2hs +YWd3b2VydGVyOiBbXSwKICAgICAgICAgICAgcGFyZW50SWQ6IG51bGwKICAgICAgICB9OwoKICAg +ICAgICB0aGlzLm9wZW5Nb2RhbCgnTmV1ZXMgRG9rdW1lbnQgZXJzdGVsbGVuJyk7CiAgICB9LAoK +ICAgIF9sb2NrZWREb2NJZDogbnVsbCwKCiAgICBhc3luYyBlZGl0KGRvY0lkKSB7CiAgICAgICAg +aWYgKERyaXZlRlMucmVhZE9ubHkpIHsKICAgICAgICAgICAgY29uc3QgZ3JhbnRlZCA9IGF3YWl0 +IERyaXZlRlMuZW5zdXJlV3JpdGVBY2Nlc3MoKTsKICAgICAgICAgICAgaWYgKCFncmFudGVkKSBy +ZXR1cm47CiAgICAgICAgfQoKICAgICAgICAvLyBQZXNzaW1pc3RpYyBMb2NraW5nOiBMb2NrIGFu +Zm9yZGVybiBiZXZvciBFZGl0b3Igb2VmZm5ldAogICAgICAgIGNvbnN0IGxvY2tSZXN1bHQgPSBh +d2FpdCB0aGlzLmFjcXVpcmVMb2NrKGRvY0lkKTsKICAgICAgICBpZiAoIWxvY2tSZXN1bHQub2sp +IHsKICAgICAgICAgICAgc2hvd1RvYXN0KCdEb2t1bWVudCB3aXJkIHZvbiAnICsgbG9ja1Jlc3Vs +dC5ieSArICcgYmVhcmJlaXRldCAoc2VpdCAnICsgbG9ja1Jlc3VsdC5taW51dGVzICsgJyBNaW4u +KScsICd3YXJuaW5nJywgNTAwMCk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAg +ICAgIGNvbnN0IGRvYyA9IGF3YWl0IERyaXZlRlMubG9hZERvY3VtZW50KGRvY0lkKTsKICAgICAg +ICBpZiAoIWRvYykgewogICAgICAgICAgICBhd2FpdCB0aGlzLnJlbGVhc2VMb2NrKGRvY0lkKTsK +ICAgICAgICAgICAgc2hvd1RvYXN0KCdEb2t1bWVudCBrb25udGUgbmljaHQgZ2VsYWRlbiB3ZXJk +ZW4nLCAnZXJyb3InKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgdGhp +cy5pc05ldyA9IGZhbHNlOwogICAgICAgIHRoaXMuX2xvY2tlZERvY0lkID0gZG9jSWQ7CiAgICAg +ICAgdGhpcy5jdXJyZW50RG9jID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShkb2MpKTsgLy8g +RGVlcCBjb3B5CiAgICAgICAgdGhpcy5vcGVuTW9kYWwoJ0Rva3VtZW50IGJlYXJiZWl0ZW46ICcg +KyBkb2MudGl0ZWwpOwogICAgfSwKCiAgICBvcGVuTW9kYWwodGl0bGUpIHsKICAgICAgICBjb25z +dCBkb2MgPSB0aGlzLmN1cnJlbnREb2M7CiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQo +J2VkaXRvck1vZGFsVGl0bGUnKS50ZXh0Q29udGVudCA9IHRpdGxlOwogICAgICAgIGRvY3VtZW50 +LmdldEVsZW1lbnRCeUlkKCdlZGl0b3JUaXRlbCcpLnZhbHVlID0gZG9jLnRpdGVsIHx8ICcnOwoK +ICAgICAgICAvLyBLYXRlZ29yaWUtU2VsZWN0IGZ1ZWxsZW4gKGF1c2dlYmxlbmRldGUgS2F0ZWdv +cmllbiB1ZWJlcnNwcmluZ2VuLCBlcyBzZWkgZGVubiBkYXMgRG9rdW1lbnQgaGF0IGRpZXNlIEth +dGVnb3JpZSkKICAgICAgICBjb25zdCBrYXRTZWxlY3QgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJ +ZCgnZWRpdG9yS2F0ZWdvcmllJyk7CiAgICAgICAga2F0U2VsZWN0LmlubmVySFRNTCA9ICcnOwog +ICAgICAgIHZhciBlZGl0b3JIaWRkZW5LYXRzID0gRHJpdmVGUy5jb25maWcuaGlkZGVuS2F0ZWdv +cmllbiB8fCBbXTsKICAgICAgICAoRHJpdmVGUy5jb25maWcua2F0ZWdvcmllbiB8fCBbXSkuZm9y +RWFjaChrYXQgPT4gewogICAgICAgICAgICBpZiAoZWRpdG9ySGlkZGVuS2F0cy5pbmNsdWRlcyhr +YXQpICYmIGthdCAhPT0gZG9jLmthdGVnb3JpZSkgcmV0dXJuOwogICAgICAgICAgICBjb25zdCBv +cHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdvcHRpb24nKTsKICAgICAgICAgICAgb3B0LnZh +bHVlID0ga2F0OwogICAgICAgICAgICBvcHQudGV4dENvbnRlbnQgPSBrYXQ7CiAgICAgICAgICAg +IGlmIChrYXQgPT09IGRvYy5rYXRlZ29yaWUpIG9wdC5zZWxlY3RlZCA9IHRydWU7CiAgICAgICAg +ICAgIGthdFNlbGVjdC5hcHBlbmRDaGlsZChvcHQpOwogICAgICAgIH0pOwoKICAgICAgICAvLyBV +bnRlcmthdGVnb3JpZW4tSGlud2VpcyBiZWkgS2F0ZWdvcmllLVdlY2hzZWwKICAgICAgICBjb25z +dCB0aXRlbElucHV0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VkaXRvclRpdGVsJyk7CiAg +ICAgICAgY29uc3QgdXBkYXRlU3VidGFnSGludCA9ICgpID0+IHsKICAgICAgICAgICAgY29uc3Qg +c3VicyA9IERyaXZlRWRpdG9yLkNBVEVHT1JZX1NVQlRBR1Nba2F0U2VsZWN0LnZhbHVlXTsKICAg +ICAgICAgICAgaWYgKHN1YnMpIHsKICAgICAgICAgICAgICAgIHRpdGVsSW5wdXQucGxhY2Vob2xk +ZXIgPSAnVGl0ZWwgei5CLiAnICsga2F0U2VsZWN0LnZhbHVlICsgJyAoJyArIHN1YnMuam9pbign +IC8gJykgKyAnKSc7CiAgICAgICAgICAgICAgICAvLyBTdWItVGFncyBhdXRvbWF0aXNjaCBhbHMg +S2V5d29yZC1Wb3JzY2hsYWVnZSBwcmlvcmlzaWVyZW4KICAgICAgICAgICAgICAgIHN1YnMuZm9y +RWFjaChzID0+IHsKICAgICAgICAgICAgICAgICAgICBpZiAoIURyaXZlRWRpdG9yLl9jdXJyZW50 +S2V5d29yZHMuaW5jbHVkZXMocykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgRHJpdmVFZGl0 +b3IuX3JlbmRlclN1Z2dlc3Rpb25zKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAg +ICAgICAgfSk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICB0aXRlbElucHV0 +LnBsYWNlaG9sZGVyID0gJ1RpdGVsIGRlcyBEb2t1bWVudHMnOwogICAgICAgICAgICB9CiAgICAg +ICAgfTsKICAgICAgICBrYXRTZWxlY3QuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgdXBkYXRl +U3VidGFnSGludCk7CiAgICAgICAgdXBkYXRlU3VidGFnSGludCgpOwoKICAgICAgICAvLyBTdGF0 +dXMtU2VsZWN0IGZ1ZWxsZW4gKGdlZmlsdGVydCBuYWNoIEdvdmVybmFuY2UtUm9sbGUpCiAgICAg +ICAgY29uc3Qgc3RhdHVzU2VsZWN0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VkaXRvclN0 +YXR1cycpOwogICAgICAgIHN0YXR1c1NlbGVjdC5pbm5lckhUTUwgPSAnJzsKICAgICAgICBjb25z +dCBpc1NVID0gRHJpdmVHb3Zlcm5hbmNlLmlzU3VwZXJVc2VyKCk7CiAgICAgICAgY29uc3QgaXNG +QSA9IERyaXZlR292ZXJuYW5jZS5pc0ZhY2hhdWZzaWNodCgpOwogICAgICAgIGNvbnN0IGlzUmV2 +ID0gRHJpdmVHb3Zlcm5hbmNlLmlzUmV2aWV3ZXIoZG9jLmthdGVnb3JpZSk7CiAgICAgICAgT2Jq +ZWN0LmtleXMoRHJpdmVGUy5jb25maWcuc3RhdHVzIHx8IHt9KS5mb3JFYWNoKHN0YXR1cyA9PiB7 +CiAgICAgICAgICAgIC8vIE5vcm1hbGUgVXNlcjogbnVyIEVudHd1cmYgKyBQcnVlZnVuZwogICAg +ICAgICAgICBpZiAoIWlzU1UgJiYgIWlzRkEgJiYgIWlzUmV2ICYmIChzdGF0dXMgPT09ICdGcmVp +Z2VnZWJlbicgfHwgc3RhdHVzID09PSAnQWJnZWxlaG50JykpIHJldHVybjsKICAgICAgICAgICAg +Y29uc3QgY2ZnID0gRHJpdmVGUy5jb25maWcuc3RhdHVzW3N0YXR1c107CiAgICAgICAgICAgIGNv +bnN0IG9wdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ29wdGlvbicpOwogICAgICAgICAgICBv +cHQudmFsdWUgPSBzdGF0dXM7CiAgICAgICAgICAgIG9wdC50ZXh0Q29udGVudCA9IGNmZy5sYWJl +bDsKICAgICAgICAgICAgaWYgKHN0YXR1cyA9PT0gZG9jLnN0YXR1cykgb3B0LnNlbGVjdGVkID0g +dHJ1ZTsKICAgICAgICAgICAgc3RhdHVzU2VsZWN0LmFwcGVuZENoaWxkKG9wdCk7CiAgICAgICAg +fSk7CgogICAgICAgIC8vIMOcYmVyYXJ0aWtlbC1TZWxlY3QgZsO8bGxlbgogICAgICAgIGNvbnN0 +IHBhcmVudFNlbGVjdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlZGl0b3JQYXJlbnQnKTsK +ICAgICAgICBwYXJlbnRTZWxlY3QuaW5uZXJIVE1MID0gJzxvcHRpb24gdmFsdWU9IiI+LS0gS2Vp +biDDnGJlcmFydGlrZWwgLS08L29wdGlvbj4nOwogICAgICAgIERyaXZlRlMuZG9jdW1lbnRzLmZv +ckVhY2goZCA9PiB7CiAgICAgICAgICAgIGlmIChkLmlkID09PSBkb2MuaWQpIHJldHVybjsgLy8g +c2ljaCBzZWxic3QgYXVzc2NobGllw59lbgogICAgICAgICAgICBpZiAoZC5wYXJlbnRJZCA9PT0g +ZG9jLmlkKSByZXR1cm47IC8vIEtpbmRlciBhdXNzY2hsaWXDn2VuIChaaXJrZWx2ZXJtZWlkdW5n +KQogICAgICAgICAgICBjb25zdCBvcHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdvcHRpb24n +KTsKICAgICAgICAgICAgb3B0LnZhbHVlID0gZC5pZDsKICAgICAgICAgICAgb3B0LnRleHRDb250 +ZW50ID0gZC50aXRlbDsKICAgICAgICAgICAgaWYgKGQuaWQgPT09IGRvYy5wYXJlbnRJZCkgb3B0 +LnNlbGVjdGVkID0gdHJ1ZTsKICAgICAgICAgICAgcGFyZW50U2VsZWN0LmFwcGVuZENoaWxkKG9w +dCk7CiAgICAgICAgfSk7CgogICAgICAgIC8vIFNjaGxhZ3fDtnJ0ZXIgaW5pdGlhbGlzaWVyZW4g +KGFiaGFlbmdpZyB2b24gR292ZXJuYW5jZS1Nb2R1cykKICAgICAgICBjb25zdCBrd01vZGUgPSAo +RHJpdmVHb3Zlcm5hbmNlLmRhdGEgJiYgRHJpdmVHb3Zlcm5hbmNlLmRhdGEuc2V0dGluZ3MpID8g +KERyaXZlR292ZXJuYW5jZS5kYXRhLnNldHRpbmdzLmtleXdvcmRNb2RlIHx8ICdyZXF1aXJlZCcp +IDogJ3JlcXVpcmVkJzsKICAgICAgICBjb25zdCBrd1JvdyA9IGRvY3VtZW50LmdldEVsZW1lbnRC +eUlkKCdlZGl0b3JLZXl3b3JkUm93Jyk7CiAgICAgICAgaWYgKGt3Um93KSBrd1Jvdy5zdHlsZS5k +aXNwbGF5ID0gKGt3TW9kZSA9PT0gJ2Rpc2FibGVkJykgPyAnbm9uZScgOiAnJzsKICAgICAgICB0 +aGlzLl9jdXJyZW50S2V5d29yZHMgPSBbLi4uKGRvYy5zY2hsYWd3b2VydGVyIHx8IFtdKV07CiAg +ICAgICAgdGhpcy5fcmVuZGVyS2V5d29yZHMoKTsKICAgICAgICB0aGlzLl9zZXR1cEtleXdvcmRJ +bnB1dCgpOwoKICAgICAgICAvLyBJbmhhbHQgbGFkZW4KICAgICAgICBjb25zdCBlZGl0b3JJbnB1 +dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlZGl0b3JJbnB1dCcpOwogICAgICAgIGVkaXRv +cklucHV0LmlubmVySFRNTCA9IERyaXZlUG9ydGFsLnNhbml0aXplSFRNTChkb2MuaW5oYWx0KTsK +CiAgICAgICAgLy8gTW9kYWwgemVpZ2VuCiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQo +J2VkaXRvck1vZGFsJykuY2xhc3NMaXN0LmFkZCgnYWN0aXZlJyk7CiAgICAgICAgZWRpdG9ySW5w +dXQuZm9jdXMoKTsKCiAgICAgICAgLy8gSGlzdG9yeSBpbml0aWFsaXNpZXJlbgogICAgICAgIHRo +aXMuaW5pdEhpc3RvcnkoKTsKCiAgICAgICAgLy8gTWVkaWEgY29udGV4dCBtZW51IGV2ZW50cwog +ICAgICAgIHRoaXMuc2V0dXBFZGl0b3JNZWRpYUV2ZW50cygpOwogICAgfSwKCiAgICBhc3luYyBj +YW5jZWxXaXRoUHJvbXB0KCkgewogICAgICAgIC8vIFBydWVmZW4gb2IgSW5oYWx0IHZvcmhhbmRl +bgogICAgICAgIHZhciBlZGl0b3IgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZWRpdG9ySW5w +dXQnKTsKICAgICAgICB2YXIgdGl0ZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZWRpdG9y +VGl0ZWwnKTsKICAgICAgICB2YXIgaGFzQ29udGVudCA9IChlZGl0b3IgJiYgZWRpdG9yLnRleHRD +b250ZW50LnRyaW0oKS5sZW5ndGggPiAwKSB8fCAodGl0ZWwgJiYgdGl0ZWwudmFsdWUudHJpbSgp +Lmxlbmd0aCA+IDApOwoKICAgICAgICBpZiAoaGFzQ29udGVudCkgewogICAgICAgICAgICB2YXIg +bW9kYWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKICAgICAgICAgICAgbW9kYWwu +c3R5bGUuY3NzVGV4dCA9ICdwb3NpdGlvbjpmaXhlZDt0b3A6MDtsZWZ0OjA7d2lkdGg6MTAwJTto +ZWlnaHQ6MTAwJTtiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsMC41KTt6LWluZGV4OjEwNjAwO2Rpc3Bs +YXk6ZmxleDthbGlnbi1pdGVtczpjZW50ZXI7anVzdGlmeS1jb250ZW50OmNlbnRlcjsnOwogICAg +ICAgICAgICBtb2RhbC5pbm5lckhUTUwgPQogICAgICAgICAgICAgICAgJzxkaXYgc3R5bGU9ImJh +Y2tncm91bmQ6dmFyKC0tYmctY2FyZCk7Ym9yZGVyLXJhZGl1czoxMHB4O3BhZGRpbmc6MjRweCAy +OHB4O21heC13aWR0aDo0MjBweDt3aWR0aDo5MCU7Ym94LXNoYWRvdzowIDhweCAzMnB4IHJnYmEo +MCwwLDAsMC4zKTsiPicgKwogICAgICAgICAgICAgICAgICAgICc8aDMgc3R5bGU9ImNvbG9yOnZh +cigtLXRleHQtaGVhZGluZyk7bWFyZ2luLWJvdHRvbToxMnB4OyI+QXJ0aWtlbCBzY2hsaWXDn2Vu +PzwvaDM+JyArCiAgICAgICAgICAgICAgICAgICAgJzxwIHN0eWxlPSJjb2xvcjp2YXIoLS10ZXh0 +LXByaW1hcnkpO2ZvbnQtc2l6ZToxNHB4O2xpbmUtaGVpZ2h0OjEuNzttYXJnaW4tYm90dG9tOjE2 +cHg7Ij4nICsKICAgICAgICAgICAgICAgICAgICAgICAgJ03DtmNodGVzdCBkdSBkZW4gYWt0dWVs +bGVuIFN0YW5kIGFscyBFbnR3dXJmIHNwZWljaGVybiwgZGFtaXQgZHUgc3DDpHRlciBkYXJhbiB3 +ZWl0ZXJhcmJlaXRlbiBrYW5uc3Q/JyArCiAgICAgICAgICAgICAgICAgICAgJzwvcD4nICsKICAg +ICAgICAgICAgICAgICAgICAnPGRpdiBzdHlsZT0iZGlzcGxheTpmbGV4O2dhcDo4cHg7anVzdGlm +eS1jb250ZW50OmZsZXgtZW5kOyI+JyArCiAgICAgICAgICAgICAgICAgICAgICAgICc8YnV0dG9u +IGlkPSJjYW5jZWxEaXNjYXJkIiBzdHlsZT0icGFkZGluZzo4cHggMTZweDtib3JkZXItcmFkaXVz +OjRweDtib3JkZXI6MXB4IHNvbGlkIHZhcigtLWJvcmRlci1jb2xvcik7YmFja2dyb3VuZDp2YXIo +LS1iZy1jYXJkKTtjb2xvcjp2YXIoLS10ZXh0LXByaW1hcnkpO2N1cnNvcjpwb2ludGVyOyI+VmVy +d2VyZmVuPC9idXR0b24+JyArCiAgICAgICAgICAgICAgICAgICAgICAgICc8YnV0dG9uIGlkPSJj +YW5jZWxTYXZlRHJhZnQiIHN0eWxlPSJwYWRkaW5nOjhweCAxNnB4O2JvcmRlci1yYWRpdXM6NHB4 +O2JvcmRlcjpub25lO2JhY2tncm91bmQ6dmFyKC0tdGV4dC1oZWFkaW5nKTtjb2xvcjp3aGl0ZTtj +dXJzb3I6cG9pbnRlcjtmb250LXdlaWdodDo2MDA7Ij5BbHMgRW50d3VyZiBzcGVpY2hlcm48L2J1 +dHRvbj4nICsKICAgICAgICAgICAgICAgICAgICAnPC9kaXY+JyArCiAgICAgICAgICAgICAgICAn +PC9kaXY+JzsKICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChtb2RhbCk7Cgog +ICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1l +bnRCeUlkKCdjYW5jZWxEaXNjYXJkJykub25jbGljayA9IGZ1bmN0aW9uKCkgewogICAgICAgICAg +ICAgICAgbW9kYWwucmVtb3ZlKCk7CiAgICAgICAgICAgICAgICBzZWxmLmNsb3NlKCk7CiAgICAg +ICAgICAgIH07CiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjYW5jZWxTYXZl +RHJhZnQnKS5vbmNsaWNrID0gYXN5bmMgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICBtb2Rh +bC5yZW1vdmUoKTsKICAgICAgICAgICAgICAgIC8vIFN0YXR1cyBhdWYgRW50d3VyZiBzZXR6ZW4g +dW5kIHNwZWljaGVybgogICAgICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Vk +aXRvclN0YXR1cycpLnZhbHVlID0gJ0VudHd1cmYnOwogICAgICAgICAgICAgICAgYXdhaXQgc2Vs +Zi5zYXZlKHRydWUpOwogICAgICAgICAgICB9OwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAg +IHRoaXMuY2xvc2UoKTsKICAgICAgICB9CiAgICB9LAoKICAgIGNsb3NlKCkgewogICAgICAgIGRv +Y3VtZW50LmdldEVsZW1lbnRCeUlkKCdlZGl0b3JNb2RhbCcpLmNsYXNzTGlzdC5yZW1vdmUoJ2Fj +dGl2ZScpOwogICAgICAgIHRoaXMuaGlkZUNvbnRleHRNZW51KCk7CiAgICAgICAgdGhpcy5jbG9z +ZVVwbG9hZERpYWxvZygpOwogICAgICAgIHRoaXMuY2xvc2VDb250cmliRGlhbG9nKCk7CiAgICAg +ICAgLy8gTWV0YS1aZWlsZW4gd2llZGVyIGVpbmJsZW5kZW4gKGtvZW5uZW4gYmVpIFN0YXJ0c2Vp +dGVuLUJlYXJiZWl0dW5nIGF1c2dlYmxlbmRldCBzZWluKQogICAgICAgIGRvY3VtZW50LnF1ZXJ5 +U2VsZWN0b3JBbGwoJy5lZGl0b3ItbWV0YS1yb3cnKS5mb3JFYWNoKGZ1bmN0aW9uKHJvdykgeyBy +b3cuc3R5bGUuZGlzcGxheSA9ICcnOyB9KTsKICAgICAgICB0aGlzLl9pc1N0YXJ0c2VpdGUgPSBm +YWxzZTsKICAgICAgICAvLyBMb2NrIGZyZWlnZWJlbgogICAgICAgIGlmICh0aGlzLl9sb2NrZWRE +b2NJZCkgewogICAgICAgICAgICB0aGlzLnJlbGVhc2VMb2NrKHRoaXMuX2xvY2tlZERvY0lkKTsK +ICAgICAgICAgICAgdGhpcy5fbG9ja2VkRG9jSWQgPSBudWxsOwogICAgICAgIH0KICAgICAgICB0 +aGlzLmN1cnJlbnREb2MgPSBudWxsOwogICAgICAgIHRoaXMuaXNOZXcgPSBmYWxzZTsKICAgICAg +ICB0aGlzLl9wZW5kaW5nQ29udHJpYlR5cGUgPSBudWxsOwogICAgfSwKCiAgICBfcGVuZGluZ0Nv +bnRyaWJUeXBlOiBudWxsLAoKICAgIF9pc1N0YXJ0c2VpdGU6IGZhbHNlLAoKICAgIGFzeW5jIHNh +dmVBbmRDbG9zZSgpIHsKICAgICAgICBhd2FpdCB0aGlzLnNhdmUodHJ1ZSk7CiAgICB9LAoKICAg +IGFzeW5jIHNhdmUoY2xvc2VBZnRlcikgewogICAgICAgIGlmICghdGhpcy5jdXJyZW50RG9jKSBy +ZXR1cm47CgogICAgICAgIC8vIFNvbmRlcmZhbGw6IFN0YXJ0c2VpdGVuLUJlYXJiZWl0dW5nCiAg +ICAgICAgaWYgKHRoaXMuX2lzU3RhcnRzZWl0ZSkgewogICAgICAgICAgICB2YXIgY29udGVudCA9 +IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlZGl0b3JJbnB1dCcpLmlubmVySFRNTDsKICAgICAg +ICAgICAgYXdhaXQgRHJpdmVHb3Zlcm5hbmNlLnNhdmVTdGFydHNlaXRlKGNvbnRlbnQpOwogICAg +ICAgICAgICBpZiAoY2xvc2VBZnRlcikgewogICAgICAgICAgICAgICAgdGhpcy5faXNTdGFydHNl +aXRlID0gZmFsc2U7CiAgICAgICAgICAgICAgICB0aGlzLmNsb3NlKCk7CiAgICAgICAgICAgICAg +ICAvLyBadXLDvGNrIGlucyBHb3Zlcm5hbmNlLU1vZGFsCiAgICAgICAgICAgICAgICBEcml2ZUdv +dmVybmFuY2Uuc2hvd0FkbWluKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuOwog +ICAgICAgIH0KCiAgICAgICAgY29uc3QgdGl0ZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgn +ZWRpdG9yVGl0ZWwnKS52YWx1ZS50cmltKCk7CiAgICAgICAgaWYgKCF0aXRlbCkgewogICAgICAg +ICAgICBzaG93VG9hc3QoJ0JpdHRlIGVpbmVuIFRpdGVsIGVpbmdlYmVuJywgJ3dhcm5pbmcnKTsK +ICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VkaXRvclRpdGVsJykuZm9jdXMo +KTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgLy8gQmVpIGJlc3RlaGVu +ZGVuIERva3VtZW50ZW46IEJlaXRyYWdzYXJ0IGFiZnJhZ2VuIGZhbGxzIG5vY2ggbmljaHQgZ2V3 +YWVobHQKICAgICAgICBpZiAoIXRoaXMuaXNOZXcgJiYgIXRoaXMuX3BlbmRpbmdDb250cmliVHlw +ZSkgewogICAgICAgICAgICB0aGlzLl9wZW5kaW5nQ2xvc2VBZnRlciA9IGNsb3NlQWZ0ZXIgfHwg +ZmFsc2U7CiAgICAgICAgICAgIHRoaXMuc2hvd0NvbnRyaWJEaWFsb2coKTsKICAgICAgICAgICAg +cmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgLy8gU2NobGFnd8O2cnRlciBQZmxpY2h0ZmVsZCAo +bnVyIHdlbm4gTW9kdXMgPSAicmVxdWlyZWQiKQogICAgICAgIGNvbnN0IGt3TW9kZSA9IChEcml2 ZUdvdmVybmFuY2UuZGF0YSAmJiBEcml2ZUdvdmVybmFuY2UuZGF0YS5zZXR0aW5ncykgPyAoRHJp dmVHb3Zlcm5hbmNlLmRhdGEuc2V0dGluZ3Mua2V5d29yZE1vZGUgfHwgJ3JlcXVpcmVkJykgOiAn -cmVxdWlyZWQnOwogICAgICAgIGNvbnN0IGt3Um93ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQo -J2VkaXRvcktleXdvcmRSb3cnKTsKICAgICAgICBpZiAoa3dSb3cpIGt3Um93LnN0eWxlLmRpc3Bs -YXkgPSAoa3dNb2RlID09PSAnZGlzYWJsZWQnKSA/ICdub25lJyA6ICcnOwogICAgICAgIHRoaXMu -X2N1cnJlbnRLZXl3b3JkcyA9IFsuLi4oZG9jLnNjaGxhZ3dvZXJ0ZXIgfHwgW10pXTsKICAgICAg -ICB0aGlzLl9yZW5kZXJLZXl3b3JkcygpOwogICAgICAgIHRoaXMuX3NldHVwS2V5d29yZElucHV0 -KCk7CgogICAgICAgIC8vIEluaGFsdCBsYWRlbgogICAgICAgIGNvbnN0IGVkaXRvcklucHV0ID0g -ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VkaXRvcklucHV0Jyk7CiAgICAgICAgZWRpdG9ySW5w -dXQuaW5uZXJIVE1MID0gRHJpdmVQb3J0YWwuc2FuaXRpemVIVE1MKGRvYy5pbmhhbHQpOwoKICAg -ICAgICAvLyBNb2RhbCB6ZWlnZW4KICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZWRp -dG9yTW9kYWwnKS5jbGFzc0xpc3QuYWRkKCdhY3RpdmUnKTsKICAgICAgICBlZGl0b3JJbnB1dC5m -b2N1cygpOwoKICAgICAgICAvLyBIaXN0b3J5IGluaXRpYWxpc2llcmVuCiAgICAgICAgdGhpcy5p -bml0SGlzdG9yeSgpOwoKICAgICAgICAvLyBNZWRpYSBjb250ZXh0IG1lbnUgZXZlbnRzCiAgICAg -ICAgdGhpcy5zZXR1cEVkaXRvck1lZGlhRXZlbnRzKCk7CiAgICB9LAoKICAgIGFzeW5jIGNhbmNl -bFdpdGhQcm9tcHQoKSB7CiAgICAgICAgLy8gUHJ1ZWZlbiBvYiBJbmhhbHQgdm9yaGFuZGVuCiAg -ICAgICAgdmFyIGVkaXRvciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlZGl0b3JJbnB1dCcp -OwogICAgICAgIHZhciB0aXRlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlZGl0b3JUaXRl -bCcpOwogICAgICAgIHZhciBoYXNDb250ZW50ID0gKGVkaXRvciAmJiBlZGl0b3IudGV4dENvbnRl -bnQudHJpbSgpLmxlbmd0aCA+IDApIHx8ICh0aXRlbCAmJiB0aXRlbC52YWx1ZS50cmltKCkubGVu -Z3RoID4gMCk7CgogICAgICAgIGlmIChoYXNDb250ZW50KSB7CiAgICAgICAgICAgIHZhciBtb2Rh -bCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOwogICAgICAgICAgICBtb2RhbC5zdHls -ZS5jc3NUZXh0ID0gJ3Bvc2l0aW9uOmZpeGVkO3RvcDowO2xlZnQ6MDt3aWR0aDoxMDAlO2hlaWdo -dDoxMDAlO2JhY2tncm91bmQ6cmdiYSgwLDAsMCwwLjUpO3otaW5kZXg6MTA2MDA7ZGlzcGxheTpm -bGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyOyc7CiAgICAgICAg -ICAgIG1vZGFsLmlubmVySFRNTCA9CiAgICAgICAgICAgICAgICAnPGRpdiBzdHlsZT0iYmFja2dy -b3VuZDp2YXIoLS1iZy1jYXJkKTtib3JkZXItcmFkaXVzOjEwcHg7cGFkZGluZzoyNHB4IDI4cHg7 -bWF4LXdpZHRoOjQyMHB4O3dpZHRoOjkwJTtib3gtc2hhZG93OjAgOHB4IDMycHggcmdiYSgwLDAs -MCwwLjMpOyI+JyArCiAgICAgICAgICAgICAgICAgICAgJzxoMyBzdHlsZT0iY29sb3I6dmFyKC0t -dGV4dC1oZWFkaW5nKTttYXJnaW4tYm90dG9tOjEycHg7Ij5BcnRpa2VsIHNjaGxpZcOfZW4/PC9o -Mz4nICsKICAgICAgICAgICAgICAgICAgICAnPHAgc3R5bGU9ImNvbG9yOnZhcigtLXRleHQtcHJp -bWFyeSk7Zm9udC1zaXplOjE0cHg7bGluZS1oZWlnaHQ6MS43O21hcmdpbi1ib3R0b206MTZweDsi -PicgKwogICAgICAgICAgICAgICAgICAgICAgICAnTcO2Y2h0ZXN0IGR1IGRlbiBha3R1ZWxsZW4g -U3RhbmQgYWxzIEVudHd1cmYgc3BlaWNoZXJuLCBkYW1pdCBkdSBzcMOkdGVyIGRhcmFuIHdlaXRl -cmFyYmVpdGVuIGthbm5zdD8nICsKICAgICAgICAgICAgICAgICAgICAnPC9wPicgKwogICAgICAg -ICAgICAgICAgICAgICc8ZGl2IHN0eWxlPSJkaXNwbGF5OmZsZXg7Z2FwOjhweDtqdXN0aWZ5LWNv -bnRlbnQ6ZmxleC1lbmQ7Ij4nICsKICAgICAgICAgICAgICAgICAgICAgICAgJzxidXR0b24gaWQ9 -ImNhbmNlbERpc2NhcmQiIHN0eWxlPSJwYWRkaW5nOjhweCAxNnB4O2JvcmRlci1yYWRpdXM6NHB4 -O2JvcmRlcjoxcHggc29saWQgdmFyKC0tYm9yZGVyLWNvbG9yKTtiYWNrZ3JvdW5kOnZhcigtLWJn -LWNhcmQpO2NvbG9yOnZhcigtLXRleHQtcHJpbWFyeSk7Y3Vyc29yOnBvaW50ZXI7Ij5WZXJ3ZXJm -ZW48L2J1dHRvbj4nICsKICAgICAgICAgICAgICAgICAgICAgICAgJzxidXR0b24gaWQ9ImNhbmNl -bFNhdmVEcmFmdCIgc3R5bGU9InBhZGRpbmc6OHB4IDE2cHg7Ym9yZGVyLXJhZGl1czo0cHg7Ym9y -ZGVyOm5vbmU7YmFja2dyb3VuZDp2YXIoLS10ZXh0LWhlYWRpbmcpO2NvbG9yOndoaXRlO2N1cnNv -cjpwb2ludGVyO2ZvbnQtd2VpZ2h0OjYwMDsiPkFscyBFbnR3dXJmIHNwZWljaGVybjwvYnV0dG9u -PicgKwogICAgICAgICAgICAgICAgICAgICc8L2Rpdj4nICsKICAgICAgICAgICAgICAgICc8L2Rp -dj4nOwogICAgICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKG1vZGFsKTsKCiAgICAg -ICAgICAgIHZhciBzZWxmID0gdGhpczsKICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5 -SWQoJ2NhbmNlbERpc2NhcmQnKS5vbmNsaWNrID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAg -ICBtb2RhbC5yZW1vdmUoKTsKICAgICAgICAgICAgICAgIHNlbGYuY2xvc2UoKTsKICAgICAgICAg -ICAgfTsKICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NhbmNlbFNhdmVEcmFm -dCcpLm9uY2xpY2sgPSBhc3luYyBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIG1vZGFsLnJl -bW92ZSgpOwogICAgICAgICAgICAgICAgLy8gU3RhdHVzIGF1ZiBFbnR3dXJmIHNldHplbiB1bmQg -c3BlaWNoZXJuCiAgICAgICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZWRpdG9y -U3RhdHVzJykudmFsdWUgPSAnRW50d3VyZic7CiAgICAgICAgICAgICAgICBhd2FpdCBzZWxmLnNh -dmUodHJ1ZSk7CiAgICAgICAgICAgIH07CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgdGhp -cy5jbG9zZSgpOwogICAgICAgIH0KICAgIH0sCgogICAgY2xvc2UoKSB7CiAgICAgICAgZG9jdW1l -bnQuZ2V0RWxlbWVudEJ5SWQoJ2VkaXRvck1vZGFsJykuY2xhc3NMaXN0LnJlbW92ZSgnYWN0aXZl -Jyk7CiAgICAgICAgdGhpcy5oaWRlQ29udGV4dE1lbnUoKTsKICAgICAgICB0aGlzLmNsb3NlVXBs -b2FkRGlhbG9nKCk7CiAgICAgICAgdGhpcy5jbG9zZUNvbnRyaWJEaWFsb2coKTsKICAgICAgICAv -LyBNZXRhLVplaWxlbiB3aWVkZXIgZWluYmxlbmRlbiAoa29lbm5lbiBiZWkgU3RhcnRzZWl0ZW4t -QmVhcmJlaXR1bmcgYXVzZ2VibGVuZGV0IHNlaW4pCiAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxl -Y3RvckFsbCgnLmVkaXRvci1tZXRhLXJvdycpLmZvckVhY2goZnVuY3Rpb24ocm93KSB7IHJvdy5z -dHlsZS5kaXNwbGF5ID0gJyc7IH0pOwogICAgICAgIHRoaXMuX2lzU3RhcnRzZWl0ZSA9IGZhbHNl -OwogICAgICAgIC8vIExvY2sgZnJlaWdlYmVuCiAgICAgICAgaWYgKHRoaXMuX2xvY2tlZERvY0lk -KSB7CiAgICAgICAgICAgIHRoaXMucmVsZWFzZUxvY2sodGhpcy5fbG9ja2VkRG9jSWQpOwogICAg -ICAgICAgICB0aGlzLl9sb2NrZWREb2NJZCA9IG51bGw7CiAgICAgICAgfQogICAgICAgIHRoaXMu -Y3VycmVudERvYyA9IG51bGw7CiAgICAgICAgdGhpcy5pc05ldyA9IGZhbHNlOwogICAgICAgIHRo -aXMuX3BlbmRpbmdDb250cmliVHlwZSA9IG51bGw7CiAgICB9LAoKICAgIF9wZW5kaW5nQ29udHJp -YlR5cGU6IG51bGwsCgogICAgX2lzU3RhcnRzZWl0ZTogZmFsc2UsCgogICAgYXN5bmMgc2F2ZUFu -ZENsb3NlKCkgewogICAgICAgIGF3YWl0IHRoaXMuc2F2ZSh0cnVlKTsKICAgIH0sCgogICAgYXN5 -bmMgc2F2ZShjbG9zZUFmdGVyKSB7CiAgICAgICAgaWYgKCF0aGlzLmN1cnJlbnREb2MpIHJldHVy -bjsKCiAgICAgICAgLy8gU29uZGVyZmFsbDogU3RhcnRzZWl0ZW4tQmVhcmJlaXR1bmcKICAgICAg -ICBpZiAodGhpcy5faXNTdGFydHNlaXRlKSB7CiAgICAgICAgICAgIHZhciBjb250ZW50ID0gZG9j -dW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VkaXRvcklucHV0JykuaW5uZXJIVE1MOwogICAgICAgICAg -ICBhd2FpdCBEcml2ZUdvdmVybmFuY2Uuc2F2ZVN0YXJ0c2VpdGUoY29udGVudCk7CiAgICAgICAg -ICAgIGlmIChjbG9zZUFmdGVyKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9pc1N0YXJ0c2VpdGUg -PSBmYWxzZTsKICAgICAgICAgICAgICAgIHRoaXMuY2xvc2UoKTsKICAgICAgICAgICAgICAgIC8v -IFp1csO8Y2sgaW5zIEdvdmVybmFuY2UtTW9kYWwKICAgICAgICAgICAgICAgIERyaXZlR292ZXJu -YW5jZS5zaG93QWRtaW4oKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm47CiAgICAg -ICAgfQoKICAgICAgICBjb25zdCB0aXRlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlZGl0 -b3JUaXRlbCcpLnZhbHVlLnRyaW0oKTsKICAgICAgICBpZiAoIXRpdGVsKSB7CiAgICAgICAgICAg -IHNob3dUb2FzdCgnQml0dGUgZWluZW4gVGl0ZWwgZWluZ2ViZW4nLCAnd2FybmluZycpOwogICAg -ICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZWRpdG9yVGl0ZWwnKS5mb2N1cygpOwog -ICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICAvLyBCZWkgYmVzdGVoZW5kZW4g -RG9rdW1lbnRlbjogQmVpdHJhZ3NhcnQgYWJmcmFnZW4gZmFsbHMgbm9jaCBuaWNodCBnZXdhZWhs -dAogICAgICAgIGlmICghdGhpcy5pc05ldyAmJiAhdGhpcy5fcGVuZGluZ0NvbnRyaWJUeXBlKSB7 -CiAgICAgICAgICAgIHRoaXMuX3BlbmRpbmdDbG9zZUFmdGVyID0gY2xvc2VBZnRlciB8fCBmYWxz -ZTsKICAgICAgICAgICAgdGhpcy5zaG93Q29udHJpYkRpYWxvZygpOwogICAgICAgICAgICByZXR1 -cm47CiAgICAgICAgfQoKICAgICAgICAvLyBTY2hsYWd3w7ZydGVyIFBmbGljaHRmZWxkIChudXIg -d2VubiBNb2R1cyA9ICJyZXF1aXJlZCIpCiAgICAgICAgY29uc3Qga3dNb2RlID0gKERyaXZlR292 -ZXJuYW5jZS5kYXRhICYmIERyaXZlR292ZXJuYW5jZS5kYXRhLnNldHRpbmdzKSA/IChEcml2ZUdv -dmVybmFuY2UuZGF0YS5zZXR0aW5ncy5rZXl3b3JkTW9kZSB8fCAncmVxdWlyZWQnKSA6ICdyZXF1 -aXJlZCc7CiAgICAgICAgaWYgKGt3TW9kZSA9PT0gJ3JlcXVpcmVkJyAmJiAoIXRoaXMuX2N1cnJl -bnRLZXl3b3JkcyB8fCB0aGlzLl9jdXJyZW50S2V5d29yZHMubGVuZ3RoID09PSAwKSkgewogICAg -ICAgICAgICBzaG93VG9hc3QoJ0JpdHRlIG1pbmRlc3RlbnMgZWluIFNjaGxhZ3dvcnQgZWluZ2Vi -ZW4nLCAnd2FybmluZycpOwogICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZWRp -dG9yS2V5d29yZElucHV0JykuZm9jdXMoKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0K -CiAgICAgICAgdGhpcy5jdXJyZW50RG9jLnRpdGVsID0gdGl0ZWw7CiAgICAgICAgdGhpcy5jdXJy -ZW50RG9jLmthdGVnb3JpZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlZGl0b3JLYXRlZ29y -aWUnKS52YWx1ZTsKICAgICAgICB0aGlzLmN1cnJlbnREb2MucGFyZW50SWQgPSBkb2N1bWVudC5n -ZXRFbGVtZW50QnlJZCgnZWRpdG9yUGFyZW50JykudmFsdWUgfHwgbnVsbDsKICAgICAgICBpZiAo -a3dNb2RlICE9PSAnZGlzYWJsZWQnKSB7CiAgICAgICAgICAgIHRoaXMuY3VycmVudERvYy5zY2hs -YWd3b2VydGVyID0gWy4uLnRoaXMuX2N1cnJlbnRLZXl3b3Jkc107CiAgICAgICAgfQogICAgICAg -IGNvbnN0IHNlbGVjdGVkU3RhdHVzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VkaXRvclN0 -YXR1cycpLnZhbHVlOwogICAgICAgIGNvbnN0IG5ld0luaGFsdCA9IGRvY3VtZW50LmdldEVsZW1l -bnRCeUlkKCdlZGl0b3JJbnB1dCcpLmlubmVySFRNTDsKCiAgICAgICAgLy8gQ29udHJpYnV0b3It -VHJhY2tpbmc6IEJlaXRyYWdzYXJ0IGJlc3RpbW1lbgogICAgICAgIGNvbnN0IHVzZXJuYW1lID0g -KERyaXZlRlMuZW52aXJvbiAmJiBEcml2ZUZTLmVudmlyb24udXNlcm5hbWUpID8gRHJpdmVGUy5l -bnZpcm9uLnVzZXJuYW1lIDogJ1VuYmVrYW5udCc7CiAgICAgICAgaWYgKCF0aGlzLmN1cnJlbnRE -b2MuY29udHJpYnV0b3JzKSB0aGlzLmN1cnJlbnREb2MuY29udHJpYnV0b3JzID0gW107CgogICAg -ICAgIGlmICh0aGlzLmlzTmV3KSB7CiAgICAgICAgICAgIC8vIE5ldWVzIERva3VtZW50OiBFcnN0 -ZWxsZXIgPSAxMDAlIEF1dG9yCiAgICAgICAgICAgIHRoaXMuY3VycmVudERvYy5jb250cmlidXRv -cnMgPSBbeyB1c2VybmFtZTogdXNlcm5hbWUsIHJvbGU6ICdhdXRvcicsIGVudHJpZXM6IDEsIGZp -cnN0Q29udHJpYjogbmV3IERhdGUoKS50b0lTT1N0cmluZygpIH1dOwogICAgICAgIH0gZWxzZSBp -ZiAodGhpcy5fcGVuZGluZ0NvbnRyaWJUeXBlKSB7CiAgICAgICAgICAgIC8vIEJlc3RlaGVuZDog -RWludHJhZyBnZW1hZXNzIGdld2FlaGx0ZXIgQmVpdHJhZ3NhcnQgaGluenVmdWVnZW4KICAgICAg -ICAgICAgY29uc3QgZXhpc3RpbmcgPSB0aGlzLmN1cnJlbnREb2MuY29udHJpYnV0b3JzLmZpbmQo -YyA9PiBjLnVzZXJuYW1lID09PSB1c2VybmFtZSAmJiBjLnJvbGUgPT09IHRoaXMuX3BlbmRpbmdD -b250cmliVHlwZSk7CiAgICAgICAgICAgIGlmIChleGlzdGluZykgewogICAgICAgICAgICAgICAg -ZXhpc3RpbmcuZW50cmllcyA9IChleGlzdGluZy5lbnRyaWVzIHx8IDEpICsgMTsKICAgICAgICAg -ICAgICAgIGV4aXN0aW5nLmxhc3RDb250cmliID0gbmV3IERhdGUoKS50b0lTT1N0cmluZygpOwog -ICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50RG9jLmNvbnRy -aWJ1dG9ycy5wdXNoKHsKICAgICAgICAgICAgICAgICAgICB1c2VybmFtZTogdXNlcm5hbWUsCiAg -ICAgICAgICAgICAgICAgICAgcm9sZTogdGhpcy5fcGVuZGluZ0NvbnRyaWJUeXBlLAogICAgICAg -ICAgICAgICAgICAgIGVudHJpZXM6IDEsCiAgICAgICAgICAgICAgICAgICAgZmlyc3RDb250cmli -OiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCkKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAg -ICB9CiAgICAgICAgICAgIHRoaXMuX3BlbmRpbmdDb250cmliVHlwZSA9IG51bGw7CiAgICAgICAg -fQoKICAgICAgICAvLyBSZXZpc2lvbiBzaWNoZXJuOiBWb3JoZXJpZ2VuIFN0YW5kIHNwZWljaGVy -biAobWF4IDYgUmV2aXNpb25lbikKICAgICAgICBpZiAoIXRoaXMuaXNOZXcgJiYgdGhpcy5jdXJy -ZW50RG9jLmluaGFsdCAmJiB0aGlzLmN1cnJlbnREb2MuaW5oYWx0ICE9PSBuZXdJbmhhbHQpIHsK -ICAgICAgICAgICAgaWYgKCF0aGlzLmN1cnJlbnREb2MucmV2aXNpb25zKSB0aGlzLmN1cnJlbnRE -b2MucmV2aXNpb25zID0gW107CiAgICAgICAgICAgIHRoaXMuY3VycmVudERvYy5yZXZpc2lvbnMu -cHVzaCh7CiAgICAgICAgICAgICAgICBpbmhhbHQ6IHRoaXMuY3VycmVudERvYy5pbmhhbHQsCiAg -ICAgICAgICAgICAgICB0aXRlbDogdGhpcy5jdXJyZW50RG9jLnRpdGVsLAogICAgICAgICAgICAg -ICAgc3RhdHVzOiB0aGlzLmN1cnJlbnREb2Muc3RhdHVzLAogICAgICAgICAgICAgICAgc2F2ZWRB -dDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLAogICAgICAgICAgICAgICAgc2F2ZWRCeTogdXNl -cm5hbWUKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIC8vIE1heCA2IFJldmlzaW9uZW4gYmVo -YWx0ZW4gKGFlbHRlc3RlIGVudGZlcm5lbikKICAgICAgICAgICAgd2hpbGUgKHRoaXMuY3VycmVu -dERvYy5yZXZpc2lvbnMubGVuZ3RoID4gNikgewogICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50 -RG9jLnJldmlzaW9ucy5zaGlmdCgpOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAv -LyBWZXJzaW9uIGF1dG9tYXRpc2NoIGJlcmVjaG5lbgogICAgICAgIHRoaXMuY3VycmVudERvYy52 -ZXJzaW9uID0gY2FsY3VsYXRlVmVyc2lvbih0aGlzLmN1cnJlbnREb2MsIHRoaXMuY3VycmVudERv -Yy5pbmhhbHQsIG5ld0luaGFsdCwgc2VsZWN0ZWRTdGF0dXMpOwoKICAgICAgICB0aGlzLmN1cnJl -bnREb2MuaW5oYWx0ID0gbmV3SW5oYWx0OwoKICAgICAgICAvLyBHb3Zlcm5hbmNlLVdvcmtmbG93 -OiBTdGF0dXMtVWViZXJnYWVuZ2UgcHJ1ZWZlbgogICAgICAgIGNvbnN0IGdvdiA9IERyaXZlR292 -ZXJuYW5jZS5kYXRhOwogICAgICAgIGNvbnN0IHNldHRpbmdzID0gZ292ID8gZ292LnNldHRpbmdz -IDoge307CiAgICAgICAgY29uc3QgaXNTVSA9IERyaXZlR292ZXJuYW5jZS5pc1N1cGVyVXNlcigp -OwogICAgICAgIGNvbnN0IGlzRkEgPSBEcml2ZUdvdmVybmFuY2UuaXNGYWNoYXVmc2ljaHQoKTsK -ICAgICAgICBjb25zdCBpc1JldiA9IERyaXZlR292ZXJuYW5jZS5pc1Jldmlld2VyKHRoaXMuY3Vy -cmVudERvYy5rYXRlZ29yaWUpOwoKICAgICAgICBpZiAoc2VsZWN0ZWRTdGF0dXMgPT09ICdQcsO8 -ZnVuZycgJiYgIWlzU1UgJiYgIWlzRkEpIHsKICAgICAgICAgICAgLy8gWnVyIFBydWVmdW5nIGVp -bnJlaWNoZW4KICAgICAgICAgICAgYXdhaXQgRHJpdmVHb3Zlcm5hbmNlLnN1Ym1pdEZvclJldmll -dyh0aGlzLmN1cnJlbnREb2MpOwogICAgICAgICAgICBzaG93VG9hc3QoJ0Rva3VtZW50IHp1ciBQ -csO8ZnVuZyBlaW5nZXJlaWNodCcsICdpbmZvJyk7CiAgICAgICAgfSBlbHNlIGlmIChzZWxlY3Rl -ZFN0YXR1cyA9PT0gJ0ZyZWlnZWdlYmVuJyAmJiAhaXNTVSAmJiAhaXNGQSAmJiAhaXNSZXYpIHsK -ICAgICAgICAgICAgLy8gTm9ybWFsZXIgVXNlciBkYXJmIG5pY2h0IGRpcmVrdCBmcmVpZ2ViZW4K -ICAgICAgICAgICAgc2hvd1RvYXN0KCdLZWluZSBCZXJlY2h0aWd1bmcgenVyIEZyZWlnYWJlLiBC -aXR0ZSB6dXIgUHLDvGZ1bmcgZWlucmVpY2hlbi4nLCAnd2FybmluZycpOwogICAgICAgICAgICBy -ZXR1cm47CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgLy8gV2VubiBTdGF0dXMgYXVmIFBy -dWVmdW5nIGdlc2V0enQgd2lyZDogdm9yaGVyaWdlbiBJbmhhbHQgc2ljaGVybiBmdWVyIERpZmYK -ICAgICAgICAgICAgaWYgKHNlbGVjdGVkU3RhdHVzID09PSAnUHLDvGZ1bmcnICYmIHRoaXMuY3Vy -cmVudERvYy5zdGF0dXMgIT09ICdQcsO8ZnVuZycpIHsKICAgICAgICAgICAgICAgIHRyeSB7CiAg -ICAgICAgICAgICAgICAgICAgdmFyIHNhdmVkRG9jID0gYXdhaXQgRHJpdmVGUy5sb2FkRG9jdW1l -bnQodGhpcy5jdXJyZW50RG9jLmlkKTsKICAgICAgICAgICAgICAgICAgICBpZiAoc2F2ZWREb2Mg -JiYgc2F2ZWREb2MuaW5oYWx0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY3VycmVu -dERvYy5fcHJldmlvdXNJbmhhbHQgPSBzYXZlZERvYy5pbmhhbHQ7CiAgICAgICAgICAgICAgICAg -ICAgICAgIHRoaXMuY3VycmVudERvYy5fcHJldmlvdXNUaXRlbCA9IHNhdmVkRG9jLnRpdGVsOwog -ICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0gY2F0Y2goZSkge30KICAgICAg -ICAgICAgfQogICAgICAgICAgICB0aGlzLmN1cnJlbnREb2Muc3RhdHVzID0gc2VsZWN0ZWRTdGF0 -dXM7CiAgICAgICAgfQoKICAgICAgICAvLyBCZWkgbmV1ZW0gRG9rdW1lbnQ6IEdvdmVybmFuY2Ug -ZXJ6d2luZ2VuCiAgICAgICAgaWYgKHRoaXMuaXNOZXcgJiYgc2V0dGluZ3MucmVxdWlyZUFwcHJv -dmFsRm9yTmV3ICYmICFpc1NVKSB7CiAgICAgICAgICAgIGlmICh0aGlzLmN1cnJlbnREb2Muc3Rh -dHVzICE9PSAnRW50d3VyZicgJiYgdGhpcy5jdXJyZW50RG9jLnN0YXR1cyAhPT0gJ1Byw7xmdW5n -JykgewogICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50RG9jLnN0YXR1cyA9ICdFbnR3dXJmJzsK -ICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgY29uc3Qg -c2F2ZVJlc3VsdCA9IGF3YWl0IERyaXZlRlMuc2F2ZURvY3VtZW50KHRoaXMuY3VycmVudERvYyk7 -CiAgICAgICAgICAgIGlmIChzYXZlUmVzdWx0ID09PSB0cnVlKSB7CiAgICAgICAgICAgICAgICBj -b25zdCBzYXZlZERvY0lkID0gdGhpcy5jdXJyZW50RG9jLmlkOwogICAgICAgICAgICAgICAgc2hv -d1RvYXN0KCdEb2t1bWVudCAiJyArIHRpdGVsICsgJyIgZ2VzcGVpY2hlcnQnLCAnc3VjY2Vzcycp -OwogICAgICAgICAgICAgICAgRHJpdmVHb3Zlcm5hbmNlLnVwZGF0ZVVJKCk7CiAgICAgICAgICAg -ICAgICBEcml2ZVBvcnRhbC5yZW5kZXIoKTsKICAgICAgICAgICAgICAgIGlmIChjbG9zZUFmdGVy -KSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5jbG9zZSgpOwogICAgICAgICAgICAgICAgICAg -IGF3YWl0IERyaXZlUG9ydGFsLnNlbGVjdERvY3VtZW50KHNhdmVkRG9jSWQpOwogICAgICAgICAg -ICAgICAgICAgIERyaXZlUG9ydGFsLmhpZ2hsaWdodEl0ZW0oc2F2ZWREb2NJZCk7CiAgICAgICAg -ICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIC8vIEVkaXRvciBvZmZlbiBsYXNz -ZW4sIGFiZXIgRG9rdW1lbnRlbmxpc3RlIGFrdHVhbGlzaWVyZW4KICAgICAgICAgICAgICAgICAg -ICB0aGlzLmlzTmV3ID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fcGVuZGluZ0Nv -bnRyaWJUeXBlID0gbnVsbDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsK -ICAgICAgICAgICAgICAgIHNob3dUb2FzdCgnU3BlaWNoZXJuIGZlaGxnZXNjaGxhZ2VuOiAnICsg -c2F2ZVJlc3VsdCwgJ2Vycm9yJywgNTAwMCk7CiAgICAgICAgICAgIH0KICAgICAgICB9IGNhdGNo -IChlcnIpIHsKICAgICAgICAgICAgc2hvd1RvYXN0KCdTcGVpY2hlcm4gZmVobGdlc2NobGFnZW46 -ICcgKyBlcnIubWVzc2FnZSwgJ2Vycm9yJywgNTAwMCk7CiAgICAgICAgfQogICAgfSwKCiAgICAv -LyAtLS0gSGlzdG9yeSAoVW5kby9SZWRvKSAtLS0KICAgIGluaXRIaXN0b3J5KCkgewogICAgICAg -IGNvbnN0IGVkaXRvcklucHV0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VkaXRvcklucHV0 -Jyk7CiAgICAgICAgdGhpcy5oaXN0b3J5ID0gW2VkaXRvcklucHV0LmlubmVySFRNTF07CiAgICAg -ICAgdGhpcy5oaXN0b3J5SW5kZXggPSAwOwoKICAgICAgICAvLyBQYXN0ZS1IYW5kbGVyOiBIVE1M -LUluaGFsdGUgbm9ybWFsaXNpZXJlbiArIGV4dGVybmUgQmlsZGVyIGxva2FsIHNwZWljaGVybgog -ICAgICAgIGVkaXRvcklucHV0Lm9ucGFzdGUgPSAoZSkgPT4gewogICAgICAgICAgICBlLnByZXZl -bnREZWZhdWx0KCk7CgogICAgICAgICAgICAvLyBCaWxkZXIgYXVzIENsaXBib2FyZCAoU2NyZWVu -c2hvdCAvIENvcHktSW1hZ2UpCiAgICAgICAgICAgIGNvbnN0IGl0ZW1zID0gQXJyYXkuZnJvbShl -LmNsaXBib2FyZERhdGEuaXRlbXMgfHwgW10pOwogICAgICAgICAgICBjb25zdCBpbWdJdGVtID0g -aXRlbXMuZmluZChpID0+IGkudHlwZS5zdGFydHNXaXRoKCdpbWFnZS8nKSk7CiAgICAgICAgICAg -IGlmIChpbWdJdGVtICYmIHRoaXMuY3VycmVudERvYykgewogICAgICAgICAgICAgICAgY29uc3Qg -YmxvYiA9IGltZ0l0ZW0uZ2V0QXNGaWxlKCk7CiAgICAgICAgICAgICAgICBpZiAoYmxvYikgewog -ICAgICAgICAgICAgICAgICAgIHRoaXMuX3Bhc3RlSW1hZ2VCbG9iKGJsb2IpOwogICAgICAgICAg -ICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAg -ICAgICAgY29uc3QgY2xpcEh0bWwgPSBlLmNsaXBib2FyZERhdGEuZ2V0RGF0YSgndGV4dC9odG1s -Jyk7CiAgICAgICAgICAgIGNvbnN0IGNsaXBUZXh0ID0gZS5jbGlwYm9hcmREYXRhLmdldERhdGEo -J3RleHQvcGxhaW4nKTsKCiAgICAgICAgICAgIGlmIChjbGlwSHRtbCkgewogICAgICAgICAgICAg -ICAgY29uc3QgcGFyc2VyID0gbmV3IERPTVBhcnNlcigpOwogICAgICAgICAgICAgICAgY29uc3Qg -cGFyc2VkID0gcGFyc2VyLnBhcnNlRnJvbVN0cmluZyhjbGlwSHRtbCwgJ3RleHQvaHRtbCcpOwog -ICAgICAgICAgICAgICAgY29uc3QgaW1ncyA9IHBhcnNlZC5ib2R5LnF1ZXJ5U2VsZWN0b3JBbGwo -J2ltZycpOwogICAgICAgICAgICAgICAgY29uc3QgZXh0ZXJuYWxJbWdzID0gQXJyYXkuZnJvbShp -bWdzKS5maWx0ZXIoaW1nID0+CiAgICAgICAgICAgICAgICAgICAgaW1nLnNyYyAmJiAoaW1nLnNy -Yy5zdGFydHNXaXRoKCdodHRwOi8vJykgfHwgaW1nLnNyYy5zdGFydHNXaXRoKCdodHRwczovLycp -KQogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAvLyBJbmxpbmUtU3R5bGVzIGJl -cmVpbmlnZW46IEZhcmJlbiwgSGludGVyZ3J1ZW5kZSB1bmQgU2NocmlmdGFydGVuIGVudGZlcm5l -biwKICAgICAgICAgICAgICAgIC8vIGRhbWl0IGVpbmdlZnVlZ3RlciBUZXh0IGltIERhcmstL0xp -Z2h0LU1vZGUga29ycmVrdCBkYXJnZXN0ZWxsdCB3aXJkLgogICAgICAgICAgICAgICAgLy8gTGlz -dGVuICh1bC9vbC9saSkgdW5kIFRhYmVsbGVuICh0YWJsZS90ci90ZC90aCkgd2VyZGVuIGdlc2No -b250LAogICAgICAgICAgICAgICAgLy8gZGFtaXQgU3RydWt0dXIgdW5kIEVpbnJ1ZWNrdW5nIGVy -aGFsdGVuIGJsZWliZW4uCiAgICAgICAgICAgICAgICB2YXIgbGlzdFRhZ3MgPSBbJ1VMJywnT0wn -LCdMSSddOwogICAgICAgICAgICAgICAgdmFyIHRhYmxlVGFncyA9IFsnVEFCTEUnLCdUSEVBRCcs -J1RCT0RZJywnVFInLCdURCcsJ1RIJ107CiAgICAgICAgICAgICAgICBwYXJzZWQuYm9keS5xdWVy -eVNlbGVjdG9yQWxsKCcqJykuZm9yRWFjaChlbCA9PiB7CiAgICAgICAgICAgICAgICAgICAgdmFy -IHRhZyA9IGVsLnRhZ05hbWU7CiAgICAgICAgICAgICAgICAgICAgdmFyIGlzTGlzdCA9IGxpc3RU -YWdzLmluY2x1ZGVzKHRhZyk7CiAgICAgICAgICAgICAgICAgICAgdmFyIGlzVGFibGUgPSB0YWJs -ZVRhZ3MuaW5jbHVkZXModGFnKTsKICAgICAgICAgICAgICAgICAgICBpZiAoZWwuc3R5bGUpIHsK -ICAgICAgICAgICAgICAgICAgICAgICAgZWwuc3R5bGUucmVtb3ZlUHJvcGVydHkoJ2NvbG9yJyk7 -CiAgICAgICAgICAgICAgICAgICAgICAgIGVsLnN0eWxlLnJlbW92ZVByb3BlcnR5KCdiYWNrZ3Jv -dW5kLWNvbG9yJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIGVsLnN0eWxlLnJlbW92ZVByb3Bl -cnR5KCdiYWNrZ3JvdW5kJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIGVsLnN0eWxlLnJlbW92 -ZVByb3BlcnR5KCdmb250LWZhbWlseScpOwogICAgICAgICAgICAgICAgICAgICAgICBlbC5zdHls -ZS5yZW1vdmVQcm9wZXJ0eSgnZm9udC1zaXplJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIGVs -LnN0eWxlLnJlbW92ZVByb3BlcnR5KCd3aGl0ZS1zcGFjZScpOwogICAgICAgICAgICAgICAgICAg -ICAgICBlbC5zdHlsZS5yZW1vdmVQcm9wZXJ0eSgnb3ZlcmZsb3ctd3JhcCcpOwogICAgICAgICAg -ICAgICAgICAgICAgICBlbC5zdHlsZS5yZW1vdmVQcm9wZXJ0eSgnd29yZC1icmVhaycpOwogICAg -ICAgICAgICAgICAgICAgICAgICBlbC5zdHlsZS5yZW1vdmVQcm9wZXJ0eSgndGV4dC1kZWNvcmF0 -aW9uLWxpbmUnKTsKICAgICAgICAgICAgICAgICAgICAgICAgZWwuc3R5bGUucmVtb3ZlUHJvcGVy -dHkoJ2JvcmRlci1yYWRpdXMnKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpc1RhYmxl -KSBlbC5zdHlsZS5yZW1vdmVQcm9wZXJ0eSgnYm9yZGVyJyk7CiAgICAgICAgICAgICAgICAgICAg -ICAgIGlmICghaXNMaXN0ICYmICFpc1RhYmxlKSBlbC5zdHlsZS5yZW1vdmVQcm9wZXJ0eSgnbWFy -Z2luJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaXNMaXN0ICYmICFpc1RhYmxlKSBl -bC5zdHlsZS5yZW1vdmVQcm9wZXJ0eSgncGFkZGluZycpOwogICAgICAgICAgICAgICAgICAgICAg -ICBlbC5zdHlsZS5yZW1vdmVQcm9wZXJ0eSgnbGluZS1oZWlnaHQnKTsKICAgICAgICAgICAgICAg -ICAgICAgICAgaWYgKCFpc0xpc3QpIGVsLnN0eWxlLnJlbW92ZVByb3BlcnR5KCdkaXNwbGF5Jyk7 -CiAgICAgICAgICAgICAgICAgICAgICAgIGVsLnN0eWxlLnJlbW92ZVByb3BlcnR5KCdtYXgtd2lk -dGgnKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpc1RhYmxlKSBlbC5zdHlsZS5yZW1v -dmVQcm9wZXJ0eSgnd2lkdGgnKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAg -ICAgICAgLy8gY2xhc3MtIHVuZCBzdHlsZS1BdHRyaWJ1dGUgZXh0ZXJuZXIgU2VpdGVuIGVudGZl -cm5lbiB3ZW5uIHN0eWxlIGxlZXIKICAgICAgICAgICAgICAgICAgICAvLyBEUklWRS1pbnRlcm5l -IEtsYXNzZW4gKGRyaXZlLSopIGJlaWJlaGFsdGVuCiAgICAgICAgICAgICAgICAgICAgaWYgKGVs -LmdldEF0dHJpYnV0ZSgnY2xhc3MnKSkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgY2xh -c3NlcyA9IGVsLmdldEF0dHJpYnV0ZSgnY2xhc3MnKS5zcGxpdCgnICcpLmZpbHRlcihmdW5jdGlv -bihjKSB7IHJldHVybiBjLnN0YXJ0c1dpdGgoJ2RyaXZlLScpOyB9KTsKICAgICAgICAgICAgICAg -ICAgICAgICAgaWYgKGNsYXNzZXMubGVuZ3RoID4gMCkgZWwuc2V0QXR0cmlidXRlKCdjbGFzcycs -IGNsYXNzZXMuam9pbignICcpKTsKICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBlbC5yZW1v -dmVBdHRyaWJ1dGUoJ2NsYXNzJyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAg -ICAgICAgIGlmIChlbC5nZXRBdHRyaWJ1dGUoJ3N0eWxlJykgPT09ICcnKSBlbC5yZW1vdmVBdHRy -aWJ1dGUoJ3N0eWxlJyk7CiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAvLyBB -bGxlIExpbmtzIGF1ZiB0YXJnZXQ9X2JsYW5rIHNldHplbiAoUG9ydGFsIGRhcmYgbmljaHQgdmVy -bGFzc2VuIHdlcmRlbikKICAgICAgICAgICAgICAgIHBhcnNlZC5ib2R5LnF1ZXJ5U2VsZWN0b3JB -bGwoJ2FbaHJlZl0nKS5mb3JFYWNoKGZ1bmN0aW9uKGEpIHsKICAgICAgICAgICAgICAgICAgICB2 -YXIgaHJlZiA9IChhLmdldEF0dHJpYnV0ZSgnaHJlZicpIHx8ICcnKS50cmltKCk7CiAgICAgICAg -ICAgICAgICAgICAgaWYgKGhyZWYuc3RhcnRzV2l0aCgnIycpKSByZXR1cm47CiAgICAgICAgICAg -ICAgICAgICAgYS5zZXRBdHRyaWJ1dGUoJ3RhcmdldCcsICdfYmxhbmsnKTsKICAgICAgICAgICAg -ICAgICAgICBhLnNldEF0dHJpYnV0ZSgncmVsJywgJ25vb3BlbmVyIG5vcmVmZXJyZXInKTsKICAg -ICAgICAgICAgICAgICAgICAvLyB0YXJnZXQ9X3NlbGYgZXhwbGl6aXQgZW50ZmVybmVuIGZhbGxz -IGdlc2V0enQKICAgICAgICAgICAgICAgICAgICBpZiAoYS5nZXRBdHRyaWJ1dGUoJ3RhcmdldCcp -ID09PSAnX3NlbGYnKSBhLnNldEF0dHJpYnV0ZSgndGFyZ2V0JywgJ19ibGFuaycpOwogICAgICAg -ICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgaWYgKGV4dGVybmFsSW1ncy5sZW5ndGggPiAw -ICYmIHRoaXMuY3VycmVudERvYyAmJiBEcml2ZUZTLmNvbm5lY3RlZCkgewogICAgICAgICAgICAg -ICAgICAgIC8vIEV4dGVybmUgQmlsZGVyIGhlcnVudGVybGFkZW4gdW5kIGxva2FsIHNwZWljaGVy -bgogICAgICAgICAgICAgICAgICAgIHRoaXMuX3Bhc3RlSHRtbFdpdGhFeHRlcm5hbEltYWdlcyhw -YXJzZWQuYm9keSwgZXh0ZXJuYWxJbWdzKTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAg -ICAgICAgICAgICAgICAgZG9jdW1lbnQuZXhlY0NvbW1hbmQoJ2luc2VydEhUTUwnLCBmYWxzZSwg -cGFyc2VkLmJvZHkuaW5uZXJIVE1MKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBl -bHNlIGlmIChjbGlwVGV4dCkgewogICAgICAgICAgICAgICAgZG9jdW1lbnQuZXhlY0NvbW1hbmQo -J2luc2VydFRleHQnLCBmYWxzZSwgY2xpcFRleHQpOwogICAgICAgICAgICB9CiAgICAgICAgfTsK -CiAgICAgICAgbGV0IHNhdmVUaW1lb3V0OwogICAgICAgIGVkaXRvcklucHV0Lm9uaW5wdXQgPSAo -KSA9PiB7CiAgICAgICAgICAgIGNsZWFyVGltZW91dChzYXZlVGltZW91dCk7CiAgICAgICAgICAg -IHNhdmVUaW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB0aGlzLnNhdmVTdGF0ZSgpLCA1MDApOwog -ICAgICAgIH07CgogICAgICAgIGVkaXRvcklucHV0Lm9ua2V5ZG93biA9IChlKSA9PiB7CiAgICAg -ICAgICAgIC8vICMtUmVmZXJlbnogRHJvcGRvd24gc2NobGllc3NlbiBiZWkgRXNjYXBlCiAgICAg -ICAgICAgIGlmIChlLmtleSA9PT0gJ0VzY2FwZScgJiYgdGhpcy5feHJlZlZpc2libGUpIHsKICAg -ICAgICAgICAgICAgIHRoaXMuY2xvc2VYcmVmRHJvcGRvd24oKTsKICAgICAgICAgICAgICAgIGUu -cHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQog -ICAgICAgICAgICBpZiAoKGUuY3RybEtleSB8fCBlLm1ldGFLZXkpICYmIGUua2V5ID09PSAneicg -JiYgIWUuc2hpZnRLZXkpIHsKICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAg -ICAgICAgICAgICAgIHRoaXMudW5kbygpOwogICAgICAgICAgICB9IGVsc2UgaWYgKChlLmN0cmxL -ZXkgfHwgZS5tZXRhS2V5KSAmJiAoZS5rZXkgPT09ICd5JyB8fCAoZS5rZXkgPT09ICd6JyAmJiBl -LnNoaWZ0S2V5KSkpIHsKICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAg -ICAgICAgICAgIHRoaXMucmVkbygpOwogICAgICAgICAgICB9IGVsc2UgaWYgKGUua2V5ID09PSAn -IycgJiYgIWUuY3RybEtleSAmJiAhZS5tZXRhS2V5KSB7CiAgICAgICAgICAgICAgICAvLyAjLVRy -aWdnZXI6IEFydGlrZWwtUmVmZXJlbnotRHJvcGRvd24gw7ZmZm5lbgogICAgICAgICAgICAgICAg -c2V0VGltZW91dCgoKSA9PiB0aGlzLm9wZW5YcmVmRHJvcGRvd24oKSwgMTApOwogICAgICAgICAg -ICB9IGVsc2UgaWYgKGUua2V5ID09PSAnRW50ZXInKSB7CiAgICAgICAgICAgICAgICBlLnByZXZl -bnREZWZhdWx0KCk7CiAgICAgICAgICAgICAgICBjb25zdCBzZWwgPSB3aW5kb3cuZ2V0U2VsZWN0 -aW9uKCk7CiAgICAgICAgICAgICAgICBpZiAoIXNlbC5yYW5nZUNvdW50KSByZXR1cm47CiAgICAg -ICAgICAgICAgICBjb25zdCByYW5nZSA9IHNlbC5nZXRSYW5nZUF0KDApOwogICAgICAgICAgICAg -ICAgcmFuZ2UuZGVsZXRlQ29udGVudHMoKTsKCiAgICAgICAgICAgICAgICAvLyBCbG9jay1Lb250 -ZXh0IGVybWl0dGVsbgogICAgICAgICAgICAgICAgbGV0IGJsb2NrID0gcmFuZ2Uuc3RhcnRDb250 -YWluZXI7CiAgICAgICAgICAgICAgICB3aGlsZSAoYmxvY2sgJiYgYmxvY2sgIT09IGlucHV0ICYm -ICFbJ1AnLCdESVYnLCdIMScsJ0gyJywnSDMnLCdINCcsJ0g1JywnSDYnLCdMSSddLmluY2x1ZGVz -KGJsb2NrLm5vZGVOYW1lKSkgewogICAgICAgICAgICAgICAgICAgIGJsb2NrID0gYmxvY2sucGFy -ZW50Tm9kZTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoYmxvY2sgJiYg -WydIMScsJ0gyJywnSDMnLCdINCcsJ0g1JywnSDYnXS5pbmNsdWRlcyhibG9jay5ub2RlTmFtZSkp -IHsKICAgICAgICAgICAgICAgICAgICAvLyBJbiBIZWFkaW5nOiBDdXJzb3IgYW0gRW5kZT8gLT4g -bmV1ZXIgPHA+IG5hY2ggSGVhZGluZwogICAgICAgICAgICAgICAgICAgIGNvbnN0IGFmdGVyUmFu -Z2UgPSBkb2N1bWVudC5jcmVhdGVSYW5nZSgpOwogICAgICAgICAgICAgICAgICAgIGFmdGVyUmFu -Z2Uuc2VsZWN0Tm9kZUNvbnRlbnRzKGJsb2NrKTsKICAgICAgICAgICAgICAgICAgICBhZnRlclJh -bmdlLnNldFN0YXJ0KHJhbmdlLmVuZENvbnRhaW5lciwgcmFuZ2UuZW5kT2Zmc2V0KTsKICAgICAg -ICAgICAgICAgICAgICBjb25zdCB0cmFpbGluZyA9IGFmdGVyUmFuZ2UuY2xvbmVDb250ZW50cygp -LnRleHRDb250ZW50OwogICAgICAgICAgICAgICAgICAgIGlmICghdHJhaWxpbmcudHJpbSgpKSB7 -CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEN1cnNvciBhbSBFbmRlIGRlcyBIZWFkaW5ncyAt -PiBuZXVlciBBYnNhdHoKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcCA9IGRvY3VtZW50 -LmNyZWF0ZUVsZW1lbnQoJ3AnKTsKICAgICAgICAgICAgICAgICAgICAgICAgcC5pbm5lckhUTUwg -PSAnPGJyPic7CiAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrLnBhcmVudE5vZGUuaW5zZXJ0 -QmVmb3JlKHAsIGJsb2NrLm5leHRTaWJsaW5nKTsKICAgICAgICAgICAgICAgICAgICAgICAgY29u -c3QgbmV3UmFuZ2UgPSBkb2N1bWVudC5jcmVhdGVSYW5nZSgpOwogICAgICAgICAgICAgICAgICAg -ICAgICBuZXdSYW5nZS5zZXRTdGFydChwLCAwKTsKICAgICAgICAgICAgICAgICAgICAgICAgbmV3 -UmFuZ2UuY29sbGFwc2UodHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbC5yZW1vdmVB -bGxSYW5nZXMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsLmFkZFJhbmdlKG5ld1Jhbmdl -KTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAv -LyBDdXJzb3IgbWl0dGVuIGltIEhlYWRpbmcgLT4gSGVhZGluZyB0ZWlsZW4sIFJlc3QgaW4gPHA+ -CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3RGcmFnID0gYWZ0ZXJSYW5nZS5leHRy -YWN0Q29udGVudHMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcCA9IGRvY3VtZW50 -LmNyZWF0ZUVsZW1lbnQoJ3AnKTsKICAgICAgICAgICAgICAgICAgICAgICAgcC5hcHBlbmRDaGls -ZChyZXN0RnJhZyk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcC50ZXh0Q29udGVudC50 -cmltKCkgJiYgIXAucXVlcnlTZWxlY3RvcignaW1nLGJyJykpIHAuaW5uZXJIVE1MID0gJzxicj4n -OwogICAgICAgICAgICAgICAgICAgICAgICBibG9jay5wYXJlbnROb2RlLmluc2VydEJlZm9yZShw -LCBibG9jay5uZXh0U2libGluZyk7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5ld1Jh -bmdlID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTsKICAgICAgICAgICAgICAgICAgICAgICAgbmV3 -UmFuZ2Uuc2V0U3RhcnQocCwgMCk7CiAgICAgICAgICAgICAgICAgICAgICAgIG5ld1JhbmdlLmNv -bGxhcHNlKHRydWUpOwogICAgICAgICAgICAgICAgICAgICAgICBzZWwucmVtb3ZlQWxsUmFuZ2Vz -KCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbC5hZGRSYW5nZShuZXdSYW5nZSk7CiAgICAg -ICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSBlbHNlIGlmIChibG9jayAmJiBibG9j -ay5ub2RlTmFtZSA9PT0gJ0xJJykgewogICAgICAgICAgICAgICAgICAgIC8vIEluIExpc3RlbmVs -ZW1lbnQ6IGxlZXJlcyBMSSAtPiBMaXN0ZSB2ZXJsYXNzZW4KICAgICAgICAgICAgICAgICAgICBp -ZiAoIWJsb2NrLnRleHRDb250ZW50LnRyaW0oKSAmJiAhYmxvY2sucXVlcnlTZWxlY3RvcignaW1n -JykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGlzdCA9IGJsb2NrLnBhcmVudE5v -ZGU7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHAgPSBkb2N1bWVudC5jcmVhdGVFbGVt -ZW50KCdwJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIHAuaW5uZXJIVE1MID0gJzxicj4nOwog -ICAgICAgICAgICAgICAgICAgICAgICBsaXN0LnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKHAsIGxp -c3QubmV4dFNpYmxpbmcpOwogICAgICAgICAgICAgICAgICAgICAgICBibG9jay5yZW1vdmUoKTsK -ICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxpc3QucXVlcnlTZWxlY3RvckFsbCgnbGknKS5s -ZW5ndGggPT09IDApIGxpc3QucmVtb3ZlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0 -IG5ld1JhbmdlID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTsKICAgICAgICAgICAgICAgICAgICAg -ICAgbmV3UmFuZ2Uuc2V0U3RhcnQocCwgMCk7CiAgICAgICAgICAgICAgICAgICAgICAgIG5ld1Jh -bmdlLmNvbGxhcHNlKHRydWUpOwogICAgICAgICAgICAgICAgICAgICAgICBzZWwucmVtb3ZlQWxs -UmFuZ2VzKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbC5hZGRSYW5nZShuZXdSYW5nZSk7 -CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8g -TmV1ZXMgTEkgZWluZnVlZ2VuCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5ld0xpID0g -ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbGknKTsKICAgICAgICAgICAgICAgICAgICAgICAgY29u -c3QgYWZ0ZXJSYW5nZSA9IGRvY3VtZW50LmNyZWF0ZVJhbmdlKCk7CiAgICAgICAgICAgICAgICAg -ICAgICAgIGFmdGVyUmFuZ2Uuc2VsZWN0Tm9kZUNvbnRlbnRzKGJsb2NrKTsKICAgICAgICAgICAg -ICAgICAgICAgICAgYWZ0ZXJSYW5nZS5zZXRTdGFydChyYW5nZS5lbmRDb250YWluZXIsIHJhbmdl -LmVuZE9mZnNldCk7CiAgICAgICAgICAgICAgICAgICAgICAgIG5ld0xpLmFwcGVuZENoaWxkKGFm -dGVyUmFuZ2UuZXh0cmFjdENvbnRlbnRzKCkpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAo -IW5ld0xpLnRleHRDb250ZW50LnRyaW0oKSAmJiAhbmV3TGkucXVlcnlTZWxlY3RvcignaW1nLGJy -JykpIG5ld0xpLmlubmVySFRNTCA9ICc8YnI+JzsKICAgICAgICAgICAgICAgICAgICAgICAgYmxv -Y2sucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUobmV3TGksIGJsb2NrLm5leHRTaWJsaW5nKTsKICAg -ICAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV3UmFuZ2UgPSBkb2N1bWVudC5jcmVhdGVSYW5n -ZSgpOwogICAgICAgICAgICAgICAgICAgICAgICBuZXdSYW5nZS5zZXRTdGFydChuZXdMaSwgMCk7 -CiAgICAgICAgICAgICAgICAgICAgICAgIG5ld1JhbmdlLmNvbGxhcHNlKHRydWUpOwogICAgICAg -ICAgICAgICAgICAgICAgICBzZWwucmVtb3ZlQWxsUmFuZ2VzKCk7CiAgICAgICAgICAgICAgICAg -ICAgICAgIHNlbC5hZGRSYW5nZShuZXdSYW5nZSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAg -ICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAvLyBOb3JtYWxlciBUZXh0 -OiA8YnI+IGVpbmZ1ZWdlbiAoU29mdC1CcmVhaykKICAgICAgICAgICAgICAgICAgICBjb25zdCBi -ciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2JyJyk7CiAgICAgICAgICAgICAgICAgICAgcmFu -Z2UuaW5zZXJ0Tm9kZShicik7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgdGV4dCA9IGRvY3Vt -ZW50LmNyZWF0ZVRleHROb2RlKCdcdTIwMEInKTsKICAgICAgICAgICAgICAgICAgICByYW5nZS5z -ZXRTdGFydEFmdGVyKGJyKTsKICAgICAgICAgICAgICAgICAgICByYW5nZS5pbnNlcnROb2RlKHRl -eHQpOwogICAgICAgICAgICAgICAgICAgIHJhbmdlLnNldFN0YXJ0QWZ0ZXIodGV4dCk7CiAgICAg -ICAgICAgICAgICAgICAgcmFuZ2UuY29sbGFwc2UodHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAg -c2VsLnJlbW92ZUFsbFJhbmdlcygpOwogICAgICAgICAgICAgICAgICAgIHNlbC5hZGRSYW5nZShy -YW5nZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9OwogICAgfSwK -CiAgICBzYXZlU3RhdGUoKSB7CiAgICAgICAgaWYgKHRoaXMuaXNSZXN0b3JpbmcpIHJldHVybjsK -ICAgICAgICBjb25zdCBlZGl0b3JJbnB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlZGl0 -b3JJbnB1dCcpOwogICAgICAgIGlmICghZWRpdG9ySW5wdXQpIHJldHVybjsKICAgICAgICBpZiAo -dGhpcy5oaXN0b3J5SW5kZXggPCB0aGlzLmhpc3RvcnkubGVuZ3RoIC0gMSkgewogICAgICAgICAg -ICB0aGlzLmhpc3RvcnkgPSB0aGlzLmhpc3Rvcnkuc2xpY2UoMCwgdGhpcy5oaXN0b3J5SW5kZXgg -KyAxKTsKICAgICAgICB9CiAgICAgICAgdGhpcy5oaXN0b3J5LnB1c2goZWRpdG9ySW5wdXQuaW5u -ZXJIVE1MKTsKICAgICAgICB0aGlzLmhpc3RvcnlJbmRleCsrOwogICAgICAgIGlmICh0aGlzLmhp -c3RvcnkubGVuZ3RoID4gNTApIHsgdGhpcy5oaXN0b3J5LnNoaWZ0KCk7IHRoaXMuaGlzdG9yeUlu -ZGV4LS07IH0KICAgIH0sCgogICAgdW5kbygpIHsKICAgICAgICBpZiAodGhpcy5oaXN0b3J5SW5k -ZXggPiAwKSB7CiAgICAgICAgICAgIHRoaXMuaGlzdG9yeUluZGV4LS07CiAgICAgICAgICAgIHRo -aXMuaXNSZXN0b3JpbmcgPSB0cnVlOwogICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJ -ZCgnZWRpdG9ySW5wdXQnKS5pbm5lckhUTUwgPSB0aGlzLmhpc3RvcnlbdGhpcy5oaXN0b3J5SW5k -ZXhdOwogICAgICAgICAgICB0aGlzLmlzUmVzdG9yaW5nID0gZmFsc2U7CiAgICAgICAgfQogICAg -fSwKCiAgICByZWRvKCkgewogICAgICAgIGlmICh0aGlzLmhpc3RvcnlJbmRleCA8IHRoaXMuaGlz -dG9yeS5sZW5ndGggLSAxKSB7CiAgICAgICAgICAgIHRoaXMuaGlzdG9yeUluZGV4Kys7CiAgICAg -ICAgICAgIHRoaXMuaXNSZXN0b3JpbmcgPSB0cnVlOwogICAgICAgICAgICBkb2N1bWVudC5nZXRF -bGVtZW50QnlJZCgnZWRpdG9ySW5wdXQnKS5pbm5lckhUTUwgPSB0aGlzLmhpc3RvcnlbdGhpcy5o -aXN0b3J5SW5kZXhdOwogICAgICAgICAgICB0aGlzLmlzUmVzdG9yaW5nID0gZmFsc2U7CiAgICAg -ICAgfQogICAgfSwKCiAgICAvLyA9PT0gQXJ0aWtlbC1SZWZlcmVueiAoIy1BdXRvY29tcGxldGUp -ID09PQogICAgX3hyZWZWaXNpYmxlOiBmYWxzZSwKICAgIF94cmVmUmFuZ2U6IG51bGwsCiAgICBf -eHJlZlNlbGVjdGVkRG9jOiBudWxsLAoKICAgIG9wZW5YcmVmRHJvcGRvd24oKSB7CiAgICAgICAg -Ly8gQ3Vyc29yLVBvc2l0aW9uIG1lcmtlbiAoZGFzICMgd3VyZGUgZ2VyYWRlIGdldGlwcHQpCiAg -ICAgICAgdmFyIHNlbCA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTsKICAgICAgICBpZiAoIXNlbC5y -YW5nZUNvdW50KSByZXR1cm47CiAgICAgICAgdGhpcy5feHJlZlJhbmdlID0gc2VsLmdldFJhbmdl -QXQoMCkuY2xvbmVSYW5nZSgpOwoKICAgICAgICB2YXIgZHJvcGRvd24gPSBkb2N1bWVudC5nZXRF -bGVtZW50QnlJZCgneHJlZkRyb3Bkb3duJyk7CiAgICAgICAgdmFyIGlucHV0ID0gZG9jdW1lbnQu -Z2V0RWxlbWVudEJ5SWQoJ3hyZWZTZWFyY2hJbnB1dCcpOwoKICAgICAgICAvLyBQb3NpdGlvbjog -dW50ZXIgZGVtIEN1cnNvcgogICAgICAgIHZhciByZWN0ID0gdGhpcy5feHJlZlJhbmdlLmdldEJv -dW5kaW5nQ2xpZW50UmVjdCgpOwogICAgICAgIHZhciBsZWZ0ID0gcmVjdC5sZWZ0OwogICAgICAg -IHZhciB0b3AgPSByZWN0LmJvdHRvbSArIDQ7CiAgICAgICAgaWYgKGxlZnQgKyAzODAgPiB3aW5k -b3cuaW5uZXJXaWR0aCkgbGVmdCA9IHdpbmRvdy5pbm5lcldpZHRoIC0gMzkwOwogICAgICAgIGlm -ICh0b3AgKyAzNjAgPiB3aW5kb3cuaW5uZXJIZWlnaHQpIHRvcCA9IHJlY3QudG9wIC0gMzY0Owog -ICAgICAgIGRyb3Bkb3duLnN0eWxlLmxlZnQgPSBNYXRoLm1heCgxMCwgbGVmdCkgKyAncHgnOwog -ICAgICAgIGRyb3Bkb3duLnN0eWxlLnRvcCA9IE1hdGgubWF4KDEwLCB0b3ApICsgJ3B4JzsKCiAg -ICAgICAgdGhpcy5feHJlZlNlbGVjdGVkRG9jID0gbnVsbDsKICAgICAgICBpbnB1dC52YWx1ZSA9 -ICcnOwogICAgICAgIHRoaXMuX3JlbmRlclhyZWZBcnRpY2xlcygnJyk7CiAgICAgICAgZHJvcGRv -d24uY2xhc3NMaXN0LmFkZCgndmlzaWJsZScpOwogICAgICAgIHRoaXMuX3hyZWZWaXNpYmxlID0g -dHJ1ZTsKICAgICAgICBzZXRUaW1lb3V0KCgpID0+IGlucHV0LmZvY3VzKCksIDMwKTsKCiAgICAg -ICAgLy8gRWluZ2FiZS1IYW5kbGVyCiAgICAgICAgaW5wdXQub25pbnB1dCA9ICgpID0+IHsKICAg -ICAgICAgICAgaWYgKHRoaXMuX3hyZWZTZWxlY3RlZERvYykgewogICAgICAgICAgICAgICAgdGhp -cy5fcmVuZGVyWHJlZkhlYWRpbmdzKHRoaXMuX3hyZWZTZWxlY3RlZERvYywgaW5wdXQudmFsdWUp -OwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgdGhpcy5fcmVuZGVyWHJlZkFy -dGljbGVzKGlucHV0LnZhbHVlKTsKICAgICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgaW5w -dXQub25rZXlkb3duID0gKGUpID0+IHsKICAgICAgICAgICAgaWYgKGUua2V5ID09PSAnRXNjYXBl -JykgeyB0aGlzLmNsb3NlWHJlZkRyb3Bkb3duKCk7IGUucHJldmVudERlZmF1bHQoKTsgfQogICAg -ICAgIH07CgogICAgICAgIC8vIENsaWNrLU91dHNpZGUgc2NobGllc3NlbgogICAgICAgIHNldFRp -bWVvdXQoKCkgPT4gewogICAgICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3Vz -ZWRvd24nLCB0aGlzLl94cmVmT3V0c2lkZUhhbmRsZXIgPSAoZSkgPT4gewogICAgICAgICAgICAg -ICAgaWYgKCFkcm9wZG93bi5jb250YWlucyhlLnRhcmdldCkpIHRoaXMuY2xvc2VYcmVmRHJvcGRv -d24oKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwgNTApOwogICAgfSwKCiAgICBjbG9zZVhy -ZWZEcm9wZG93bigpIHsKICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgneHJlZkRyb3Bk -b3duJykuY2xhc3NMaXN0LnJlbW92ZSgndmlzaWJsZScpOwogICAgICAgIHRoaXMuX3hyZWZWaXNp -YmxlID0gZmFsc2U7CiAgICAgICAgdGhpcy5feHJlZlNlbGVjdGVkRG9jID0gbnVsbDsKICAgICAg -ICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCB0aGlzLl94cmVmT3V0 -c2lkZUhhbmRsZXIpOwogICAgICAgIC8vIEZva3VzIHp1csO8Y2sgenVtIEVkaXRvcgogICAgICAg -IHZhciBlZGl0b3IgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZWRpdG9ySW5wdXQnKTsKICAg -ICAgICBpZiAoZWRpdG9yKSBlZGl0b3IuZm9jdXMoKTsKICAgIH0sCgogICAgX3JlbmRlclhyZWZB -cnRpY2xlcyhxdWVyeSkgewogICAgICAgIHZhciBsaXN0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5 -SWQoJ3hyZWZMaXN0Jyk7CiAgICAgICAgdmFyIHEgPSBxdWVyeS50b0xvd2VyQ2FzZSgpLnRyaW0o -KTsKICAgICAgICB2YXIgZG9jcyA9IERyaXZlRlMuZG9jdW1lbnRzLmZpbHRlcihmdW5jdGlvbihk -KSB7CiAgICAgICAgICAgIGlmIChEcml2ZUVkaXRvci5jdXJyZW50RG9jICYmIGQuaWQgPT09IERy -aXZlRWRpdG9yLmN1cnJlbnREb2MuaWQpIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgaWYgKCFx -KSByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgcmV0dXJuIChkLnRpdGVsICYmIGQudGl0ZWwudG9M -b3dlckNhc2UoKS5pbmNsdWRlcyhxKSkgfHwKICAgICAgICAgICAgICAgICAgIChkLmthdGVnb3Jp -ZSAmJiBkLmthdGVnb3JpZS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHEpKSB8fAogICAgICAgICAg -ICAgICAgICAgKGQuc2NobGFnd29lcnRlciAmJiBkLnNjaGxhZ3dvZXJ0ZXIuc29tZShmdW5jdGlv -bihrKSB7IHJldHVybiBrLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMocSk7IH0pKTsKICAgICAgICB9 -KS5zbGljZSgwLCAyMCk7CgogICAgICAgIGlmIChkb2NzLmxlbmd0aCA9PT0gMCkgewogICAgICAg -ICAgICBsaXN0LmlubmVySFRNTCA9ICc8ZGl2IHN0eWxlPSJwYWRkaW5nOjE2cHg7dGV4dC1hbGln -bjpjZW50ZXI7Y29sb3I6dmFyKC0tdGV4dC1tdXRlZCk7Zm9udC1zaXplOjEzcHg7Ij5LZWluZSBB -cnRpa2VsIGdlZnVuZGVuPC9kaXY+JzsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAg -ICAgICAgbGlzdC5pbm5lckhUTUwgPSBkb2NzLm1hcChmdW5jdGlvbihkKSB7CiAgICAgICAgICAg -IHJldHVybiAnPGRpdiBjbGFzcz0ieHJlZi1pdGVtIiBvbmNsaWNrPSJEcml2ZUVkaXRvci5zZWxl -Y3RYcmVmQXJ0aWNsZShcJycgKyBEcml2ZVBvcnRhbC5lc2NhcGVBdHRyKGQuaWQpICsgJ1wnKSI+ -JyArCiAgICAgICAgICAgICAgICAnPGRpdiBjbGFzcz0ieHJlZi10aXRsZSI+JyArIERyaXZlUG9y -dGFsLmVzY2FwZUhUTUwoZC50aXRlbCkgKyAnPC9kaXY+JyArCiAgICAgICAgICAgICAgICAnPGRp -diBjbGFzcz0ieHJlZi1jYXQiPicgKyBEcml2ZVBvcnRhbC5lc2NhcGVIVE1MKGQua2F0ZWdvcmll -KSArCiAgICAgICAgICAgICAgICAoZC5zY2hsYWd3b2VydGVyICYmIGQuc2NobGFnd29lcnRlci5s -ZW5ndGggPyAnIMK3ICcgKyBkLnNjaGxhZ3dvZXJ0ZXIuc2xpY2UoMCwgMykuam9pbignLCAnKSA6 -ICcnKSArCiAgICAgICAgICAgICAgICAnPC9kaXY+PC9kaXY+JzsKICAgICAgICB9KS5qb2luKCcn -KTsKICAgIH0sCgogICAgc2VsZWN0WHJlZkFydGljbGUoZG9jSWQpIHsKICAgICAgICB2YXIgZG9j -ID0gRHJpdmVGUy5kb2N1bWVudHMuZmluZChmdW5jdGlvbihkKSB7IHJldHVybiBkLmlkID09PSBk -b2NJZDsgfSk7CiAgICAgICAgaWYgKCFkb2MpIHJldHVybjsKICAgICAgICB0aGlzLl94cmVmU2Vs -ZWN0ZWREb2MgPSBkb2M7CgogICAgICAgIHZhciBpbnB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRC -eUlkKCd4cmVmU2VhcmNoSW5wdXQnKTsKICAgICAgICBpbnB1dC52YWx1ZSA9ICcnOwogICAgICAg -IGlucHV0LnBsYWNlaG9sZGVyID0gJ8OcYmVyc2NocmlmdCBzdWNoZW4gKG9kZXIgbGVlciBsYXNz -ZW4gZsO8ciBBcnRpa2VsLUxpbmspLi4uJzsKCiAgICAgICAgdGhpcy5fcmVuZGVyWHJlZkhlYWRp -bmdzKGRvYywgJycpOwogICAgICAgIGlucHV0LmZvY3VzKCk7CiAgICB9LAoKICAgIF9leHRyYWN0 -SGVhZGluZ3MoaHRtbENvbnRlbnQpIHsKICAgICAgICBpZiAoIWh0bWxDb250ZW50KSByZXR1cm4g -W107CiAgICAgICAgdmFyIGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOwogICAg -ICAgIGRpdi5pbm5lckhUTUwgPSBodG1sQ29udGVudDsKICAgICAgICB2YXIgaGVhZGluZ3MgPSBb -XTsKICAgICAgICBkaXYucXVlcnlTZWxlY3RvckFsbCgnaDEsIGgyLCBoMywgaDQnKS5mb3JFYWNo -KGZ1bmN0aW9uKGgpIHsKICAgICAgICAgICAgdmFyIHRleHQgPSBoLnRleHRDb250ZW50LnRyaW0o -KTsKICAgICAgICAgICAgaWYgKHRleHQpIHsKICAgICAgICAgICAgICAgIHZhciBzbHVnID0gdGV4 -dC50b0xvd2VyQ2FzZSgpCiAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoL8OkL2csICdhZScp -LnJlcGxhY2UoL8O2L2csICdvZScpLnJlcGxhY2UoL8O8L2csICd1ZScpLnJlcGxhY2UoL8OfL2cs -ICdzcycpCiAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoL1teYS16MC05XSsvZywgJy0nKS5y -ZXBsYWNlKC9eLXwtJC9nLCAnJyk7CiAgICAgICAgICAgICAgICBoZWFkaW5ncy5wdXNoKHsKICAg -ICAgICAgICAgICAgICAgICB0ZXh0OiB0ZXh0LAogICAgICAgICAgICAgICAgICAgIGxldmVsOiBw -YXJzZUludChoLnRhZ05hbWUuY2hhckF0KDEpKSwKICAgICAgICAgICAgICAgICAgICBzbHVnOiBz -bHVnCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgIH0pOwogICAgICAg -IHJldHVybiBoZWFkaW5nczsKICAgIH0sCgogICAgX3JlbmRlclhyZWZIZWFkaW5ncyhkb2MsIHF1 -ZXJ5KSB7CiAgICAgICAgdmFyIGxpc3QgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgneHJlZkxp -c3QnKTsKICAgICAgICB2YXIgaGVhZGluZ3MgPSB0aGlzLl9leHRyYWN0SGVhZGluZ3MoZG9jLmlu -aGFsdCk7CiAgICAgICAgdmFyIHEgPSBxdWVyeS50b0xvd2VyQ2FzZSgpLnRyaW0oKTsKCiAgICAg -ICAgLy8gWnVyw7xjay1CdXR0b24gKyBBcnRpa2VsLUxpbmsgKG9obmUgw5xiZXJzY2hyaWZ0KQog -ICAgICAgIHZhciBodG1sID0gJzxkaXYgY2xhc3M9InhyZWYtYmFjayIgb25jbGljaz0iRHJpdmVF -ZGl0b3IuX3hyZWZTZWxlY3RlZERvYz1udWxsO2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwneHJl -ZlNlYXJjaElucHV0XCcpLnBsYWNlaG9sZGVyPVwnQXJ0aWtlbCBzdWNoZW4uLi5cJztEcml2ZUVk -aXRvci5fcmVuZGVyWHJlZkFydGljbGVzKFwnXCcpOyI+4oaQIFp1csO8Y2sgenVyIEFydGlrZWxs -aXN0ZTwvZGl2Pic7CiAgICAgICAgaHRtbCArPSAnPGRpdiBjbGFzcz0ieHJlZi1pdGVtIiBvbmNs -aWNrPSJEcml2ZUVkaXRvci5pbnNlcnRYcmVmKFwnJyArIERyaXZlUG9ydGFsLmVzY2FwZUF0dHIo -ZG9jLmlkKSArICdcJywgXCdcJykiPicgKwogICAgICAgICAgICAnPGRpdiBjbGFzcz0ieHJlZi10 -aXRsZSI+JyArIERyaXZlUG9ydGFsLmVzY2FwZUhUTUwoZG9jLnRpdGVsKSArICc8L2Rpdj4nICsK -ICAgICAgICAgICAgJzxkaXYgY2xhc3M9InhyZWYtY2F0Ij5HZXNhbXRlbiBBcnRpa2VsIHZlcmxp -bmtlbjwvZGl2PjwvZGl2Pic7CgogICAgICAgIHZhciBmaWx0ZXJlZCA9IGhlYWRpbmdzLmZpbHRl -cihmdW5jdGlvbihoKSB7CiAgICAgICAgICAgIHJldHVybiAhcSB8fCBoLnRleHQudG9Mb3dlckNh -c2UoKS5pbmNsdWRlcyhxKTsKICAgICAgICB9KTsKCiAgICAgICAgZmlsdGVyZWQuZm9yRWFjaChm -dW5jdGlvbihoKSB7CiAgICAgICAgICAgIHZhciBpbmRlbnQgPSAoaC5sZXZlbCAtIDEpICogMTI7 -CiAgICAgICAgICAgIGh0bWwgKz0gJzxkaXYgY2xhc3M9InhyZWYtaXRlbSBoZWFkaW5nIiBzdHls -ZT0icGFkZGluZy1sZWZ0OicgKyAoMTYgKyBpbmRlbnQpICsgJ3B4OyIgb25jbGljaz0iRHJpdmVF -ZGl0b3IuaW5zZXJ0WHJlZihcJycgKyBEcml2ZVBvcnRhbC5lc2NhcGVBdHRyKGRvYy5pZCkgKyAn -XCcsIFwnJyArIERyaXZlUG9ydGFsLmVzY2FwZUF0dHIoaC5zbHVnKSArICdcJykiPicgKwogICAg -ICAgICAgICAgICAgJzxkaXYgY2xhc3M9InhyZWYtdGl0bGUiPicgKyBEcml2ZVBvcnRhbC5lc2Nh -cGVIVE1MKGgudGV4dCkgKyAnPC9kaXY+PC9kaXY+JzsKICAgICAgICB9KTsKCiAgICAgICAgaWYg -KGhlYWRpbmdzLmxlbmd0aCA9PT0gMCkgewogICAgICAgICAgICBodG1sICs9ICc8ZGl2IHN0eWxl -PSJwYWRkaW5nOjEycHggMTZweDtmb250LXNpemU6MTJweDtjb2xvcjp2YXIoLS10ZXh0LW11dGVk -KTsiPktlaW5lIMOcYmVyc2NocmlmdGVuIGltIEFydGlrZWwgdm9yaGFuZGVuPC9kaXY+JzsKICAg -ICAgICB9CgogICAgICAgIGxpc3QuaW5uZXJIVE1MID0gaHRtbDsKICAgIH0sCgogICAgaW5zZXJ0 -WHJlZihkb2NJZCwgaGVhZGluZ1NsdWcpIHsKICAgICAgICB2YXIgZG9jID0gRHJpdmVGUy5kb2N1 -bWVudHMuZmluZChmdW5jdGlvbihkKSB7IHJldHVybiBkLmlkID09PSBkb2NJZDsgfSk7CiAgICAg -ICAgaWYgKCFkb2MpIHJldHVybjsKCiAgICAgICAgdGhpcy5jbG9zZVhyZWZEcm9wZG93bigpOwoK -ICAgICAgICAvLyBEYXMgIyBlbnRmZXJuZW4gZGFzIGRlbiBEcm9wZG93biBnZXRyaWdnZXJ0IGhh -dAogICAgICAgIHZhciBlZGl0b3IgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZWRpdG9ySW5w -dXQnKTsKICAgICAgICB2YXIgc2VsID0gd2luZG93LmdldFNlbGVjdGlvbigpOwoKICAgICAgICAv -LyBDdXJzb3ItUG9zaXRpb24gd2llZGVyaGVyc3RlbGxlbgogICAgICAgIGlmICh0aGlzLl94cmVm -UmFuZ2UpIHsKICAgICAgICAgICAgc2VsLnJlbW92ZUFsbFJhbmdlcygpOwogICAgICAgICAgICBz -ZWwuYWRkUmFuZ2UodGhpcy5feHJlZlJhbmdlKTsKICAgICAgICB9CgogICAgICAgIC8vIEVpbiBa -ZWljaGVuIHp1csO8Y2sgKGRhcyAjKSBsw7ZzY2hlbgogICAgICAgIGlmIChzZWwucmFuZ2VDb3Vu -dCkgewogICAgICAgICAgICB2YXIgcmFuZ2UgPSBzZWwuZ2V0UmFuZ2VBdCgwKTsKICAgICAgICAg -ICAgcmFuZ2Uuc2V0U3RhcnQocmFuZ2Uuc3RhcnRDb250YWluZXIsIE1hdGgubWF4KDAsIHJhbmdl -LnN0YXJ0T2Zmc2V0IC0gMSkpOwogICAgICAgICAgICByYW5nZS5kZWxldGVDb250ZW50cygpOwog -ICAgICAgIH0KCiAgICAgICAgLy8gQ3Jvc3NsaW5rLUVsZW1lbnQgZWluZsO8Z2VuCiAgICAgICAg -dmFyIGFuY2hvciA9IGhlYWRpbmdTbHVnID8gZG9jSWQgKyAnIycgKyBoZWFkaW5nU2x1ZyA6IGRv -Y0lkOwogICAgICAgIHZhciBsYWJlbCA9IGRvYy50aXRlbDsKICAgICAgICBpZiAoaGVhZGluZ1Ns -dWcpIHsKICAgICAgICAgICAgdmFyIGhlYWRpbmdzID0gdGhpcy5fZXh0cmFjdEhlYWRpbmdzKGRv -Yy5pbmhhbHQpOwogICAgICAgICAgICB2YXIgbWF0Y2ggPSBoZWFkaW5ncy5maW5kKGZ1bmN0aW9u -KGgpIHsgcmV0dXJuIGguc2x1ZyA9PT0gaGVhZGluZ1NsdWc7IH0pOwogICAgICAgICAgICBpZiAo -bWF0Y2gpIGxhYmVsID0gZG9jLnRpdGVsICsgJyDihpIgJyArIG1hdGNoLnRleHQ7CiAgICAgICAg -fQoKICAgICAgICB2YXIgeHJlZkh0bWwgPSAnPHNwYW4gY2xhc3M9ImRyaXZlLXhyZWYiIGRhdGEt -eHJlZi10YXJnZXQ9IicgKyBEcml2ZVBvcnRhbC5lc2NhcGVBdHRyKGFuY2hvcikgKyAnIiBjb250 -ZW50ZWRpdGFibGU9ImZhbHNlIj4nICsgRHJpdmVQb3J0YWwuZXNjYXBlSFRNTChsYWJlbCkgKyAn -PC9zcGFuPiZuYnNwOyc7CgogICAgICAgIGRvY3VtZW50LmV4ZWNDb21tYW5kKCdpbnNlcnRIVE1M -JywgZmFsc2UsIHhyZWZIdG1sKTsKICAgICAgICB0aGlzLnNhdmVTdGF0ZSgpOwogICAgfSwKCiAg -ICAvLyAtLS0gQWNjb3JkaW9uIChBdWZrbGFwcGJhcmVyIFRleHRiZXJlaWNoKSAtLS0KICAgIF9h -Y2NDb3VudGVyOiAwLAoKICAgIGluc2VydEFjY29yZGlvbigpIHsKICAgICAgICB2YXIgc2VsID0g -d2luZG93LmdldFNlbGVjdGlvbigpOwogICAgICAgIHRoaXMuX2FjY1JhbmdlID0gKHNlbCAmJiBz -ZWwucmFuZ2VDb3VudCkgPyBzZWwuZ2V0UmFuZ2VBdCgwKS5jbG9uZVJhbmdlKCkgOiBudWxsOwog -ICAgICAgIHRoaXMuX2FjY0NvdW50ZXIgPSAxOwogICAgICAgIHZhciBpbnB1dFN0eWxlID0gJ3dp -ZHRoOjEwMCU7cGFkZGluZzo2cHggMTBweDtib3JkZXI6MXB4IHNvbGlkIHZhcigtLWJvcmRlci1j -b2xvcik7Ym9yZGVyLXJhZGl1czo0cHg7Zm9udC1zaXplOjEzcHg7YmFja2dyb3VuZDp2YXIoLS1i -Zy1pbnB1dCk7Y29sb3I6dmFyKC0tdGV4dC1wcmltYXJ5KTsnOwoKICAgICAgICB2YXIgbW9kYWwg -PSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKICAgICAgICBtb2RhbC5zdHlsZS5jc3NU -ZXh0ID0gJ3Bvc2l0aW9uOmZpeGVkO3RvcDowO2xlZnQ6MDt3aWR0aDoxMDAlO2hlaWdodDoxMDAl -O2JhY2tncm91bmQ6cmdiYSgwLDAsMCwwLjUpO3otaW5kZXg6MTA1MDA7ZGlzcGxheTpmbGV4O2Fs -aWduLWl0ZW1zOmNlbnRlcjtqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyOyc7CiAgICAgICAgbW9kYWwu -b25jbGljayA9IGZ1bmN0aW9uKGUpIHsgaWYgKGUudGFyZ2V0ID09PSBtb2RhbCkgbW9kYWwucmVt -b3ZlKCk7IH07CiAgICAgICAgbW9kYWwuaW5uZXJIVE1MID0KICAgICAgICAgICAgJzxkaXYgc3R5 -bGU9ImJhY2tncm91bmQ6dmFyKC0tYmctY2FyZCk7Ym9yZGVyLXJhZGl1czoxMHB4O3BhZGRpbmc6 -MjBweCAyNHB4O21heC13aWR0aDo2MDBweDt3aWR0aDo5MCU7Ym94LXNoYWRvdzowIDhweCAzMnB4 -IHJnYmEoMCwwLDAsMC4zKTttYXgtaGVpZ2h0Ojg1dmg7ZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0 -aW9uOmNvbHVtbjsiPicgKwogICAgICAgICAgICAgICAgJzxoMyBzdHlsZT0iY29sb3I6dmFyKC0t -dGV4dC1oZWFkaW5nKTttYXJnaW4tYm90dG9tOjEwcHg7ZmxleC1zaHJpbms6MDsiPkF1ZmtsYXBw -YmFyZSBCZXJlaWNoZSBlaW5mw7xnZW48L2gzPicgKwogICAgICAgICAgICAgICAgJzxwIHN0eWxl -PSJmb250LXNpemU6MTJweDtjb2xvcjp2YXIoLS10ZXh0LW11dGVkKTttYXJnaW4tYm90dG9tOjEy -cHg7ZmxleC1zaHJpbms6MDsiPkplZGVyIEJlcmVpY2ggaGF0IGVpbmVuIFRpdGVsIChpbW1lciBz -aWNodGJhcikgdW5kIGVpbmVuIEluaGFsdCAod2lyZCBiZWltIEtsaWNrIGF1Zmdla2xhcHB0KS4g -RHUga2FubnN0IG1laHJlcmUgQmVyZWljaGUgYXVmIGVpbm1hbCBlaW5mw7xnZW4uPC9wPicgKwog -ICAgICAgICAgICAgICAgJzxkaXYgaWQ9ImFjY0luc2VydEl0ZW1zIiBzdHlsZT0ib3ZlcmZsb3ct -eTphdXRvO2ZsZXg6MTttaW4taGVpZ2h0OjA7cGFkZGluZy1yaWdodDo0cHg7Ij4nICsKICAgICAg -ICAgICAgICAgICAgICBEcml2ZUVkaXRvci5fYWNjSXRlbUh0bWwoMSkgKwogICAgICAgICAgICAg -ICAgJzwvZGl2PicgKwogICAgICAgICAgICAgICAgJzxkaXYgc3R5bGU9ImZsZXgtc2hyaW5rOjA7 -bWFyZ2luLXRvcDoxMHB4O3BhZGRpbmctdG9wOjEwcHg7Ym9yZGVyLXRvcDoxcHggc29saWQgdmFy -KC0tYm9yZGVyLWxpZ2h0KTsiPicgKwogICAgICAgICAgICAgICAgICAgICc8YnV0dG9uIG9uY2xp -Y2s9IkRyaXZlRWRpdG9yLl9hZGRBY2NJdGVtKCkiIHN0eWxlPSJ3aWR0aDoxMDAlO3BhZGRpbmc6 -OHB4O2JvcmRlcjoxcHggZGFzaGVkIHZhcigtLWJvcmRlci1jb2xvcik7YmFja2dyb3VuZDp2YXIo -LS1iZy1jYXJkLWFsdCk7Ym9yZGVyLXJhZGl1czo0cHg7Y3Vyc29yOnBvaW50ZXI7Y29sb3I6dmFy -KC0tdGV4dC1oZWFkaW5nKTtmb250LXdlaWdodDo2MDA7Zm9udC1zaXplOjEzcHg7Ij4rIFdlaXRl -cmVuIEJlcmVpY2ggaGluenVmw7xnZW48L2J1dHRvbj4nICsKICAgICAgICAgICAgICAgICc8L2Rp -dj4nICsKICAgICAgICAgICAgICAgICc8ZGl2IHN0eWxlPSJkaXNwbGF5OmZsZXg7Z2FwOjhweDtq -dXN0aWZ5LWNvbnRlbnQ6ZmxleC1lbmQ7bWFyZ2luLXRvcDoxMHB4O2ZsZXgtc2hyaW5rOjA7Ij4n -ICsKICAgICAgICAgICAgICAgICAgICAnPGJ1dHRvbiBvbmNsaWNrPSJ0aGlzLmNsb3Nlc3QoXCdk -aXZbc3R5bGVdXCcpLnBhcmVudEVsZW1lbnQucmVtb3ZlKCkiIHN0eWxlPSJwYWRkaW5nOjhweCAx -NnB4O2JvcmRlci1yYWRpdXM6NHB4O2JvcmRlcjoxcHggc29saWQgdmFyKC0tYm9yZGVyLWNvbG9y -KTtiYWNrZ3JvdW5kOnZhcigtLWJnLWNhcmQpO2NvbG9yOnZhcigtLXRleHQtcHJpbWFyeSk7Y3Vy -c29yOnBvaW50ZXI7Ij5BYmJyZWNoZW48L2J1dHRvbj4nICsKICAgICAgICAgICAgICAgICAgICAn -PGJ1dHRvbiBvbmNsaWNrPSJEcml2ZUVkaXRvci5fY29uZmlybUFjY29yZGlvbigpIiBzdHlsZT0i -cGFkZGluZzo4cHggMTZweDtib3JkZXItcmFkaXVzOjRweDtib3JkZXI6bm9uZTtiYWNrZ3JvdW5k -OnZhcigtLXRleHQtaGVhZGluZyk7Y29sb3I6d2hpdGU7Y3Vyc29yOnBvaW50ZXI7Zm9udC13ZWln -aHQ6NjAwOyI+RWluZsO8Z2VuPC9idXR0b24+JyArCiAgICAgICAgICAgICAgICAnPC9kaXY+JyAr -CiAgICAgICAgICAgICc8L2Rpdj4nOwogICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQo -bW9kYWwpOwogICAgICAgIHRoaXMuX2FjY01vZGFsID0gbW9kYWw7CiAgICAgICAgc2V0VGltZW91 -dChmdW5jdGlvbigpIHsKICAgICAgICAgICAgdmFyIGZpcnN0ID0gZG9jdW1lbnQuZ2V0RWxlbWVu -dEJ5SWQoJ2FjY1RfMScpOwogICAgICAgICAgICBpZiAoZmlyc3QpIGZpcnN0LmZvY3VzKCk7CiAg -ICAgICAgfSwgNTApOwogICAgfSwKCiAgICBfYWNjTW9kYWw6IG51bGwsCgogICAgX2FjY0l0ZW1I -dG1sKG51bSkgewogICAgICAgIHZhciBpbnB1dFN0eWxlID0gJ3dpZHRoOjEwMCU7cGFkZGluZzo2 -cHggMTBweDtib3JkZXI6MXB4IHNvbGlkIHZhcigtLWJvcmRlci1jb2xvcik7Ym9yZGVyLXJhZGl1 -czo0cHg7Zm9udC1zaXplOjEzcHg7YmFja2dyb3VuZDp2YXIoLS1iZy1pbnB1dCk7Y29sb3I6dmFy -KC0tdGV4dC1wcmltYXJ5KTsnOwogICAgICAgIHJldHVybiAnPGRpdiBjbGFzcz0iYWNjLWluc2Vy -dC1pdGVtIiBzdHlsZT0ibWFyZ2luLWJvdHRvbToxMHB4O3BhZGRpbmc6MTBweCAxMnB4O2JhY2tn -cm91bmQ6dmFyKC0tYmctY2FyZC1hbHQpO2JvcmRlci1yYWRpdXM6NnB4O2JvcmRlcjoxcHggc29s -aWQgdmFyKC0tYm9yZGVyLWxpZ2h0KTsiPicgKwogICAgICAgICAgICAnPGRpdiBzdHlsZT0iZGlz -cGxheTpmbGV4O2p1c3RpZnktY29udGVudDpzcGFjZS1iZXR3ZWVuO2FsaWduLWl0ZW1zOmNlbnRl -cjttYXJnaW4tYm90dG9tOjZweDsiPicgKwogICAgICAgICAgICAgICAgJzxsYWJlbCBzdHlsZT0i -Zm9udC1zaXplOjExcHg7Zm9udC13ZWlnaHQ6NjAwO2NvbG9yOnZhcigtLXRleHQtaGVhZGluZyk7 -Ij5CZXJlaWNoICcgKyBudW0gKyAnPC9sYWJlbD4nICsKICAgICAgICAgICAgICAgIChudW0gPiAx -ID8gJzxidXR0b24gb25jbGljaz0idGhpcy5jbG9zZXN0KFwnLmFjYy1pbnNlcnQtaXRlbVwnKS5y -ZW1vdmUoKSIgc3R5bGU9ImJhY2tncm91bmQ6bm9uZTtib3JkZXI6bm9uZTtjb2xvcjp2YXIoLS10 -ZXh0LW11dGVkKTtjdXJzb3I6cG9pbnRlcjtmb250LXNpemU6MTRweDsiIHRpdGxlPSJFbnRmZXJu -ZW4iPiZ0aW1lczs8L2J1dHRvbj4nIDogJycpICsKICAgICAgICAgICAgJzwvZGl2PicgKwogICAg -ICAgICAgICAnPGlucHV0IHR5cGU9InRleHQiIGlkPSJhY2NUXycgKyBudW0gKyAnIiBwbGFjZWhv -bGRlcj0iVGl0ZWwgKGltbWVyIHNpY2h0YmFyKS4uLiIgc3R5bGU9IicgKyBpbnB1dFN0eWxlICsg -J21hcmdpbi1ib3R0b206NnB4O2ZvbnQtd2VpZ2h0OjYwMDsiPicgKwogICAgICAgICAgICAnPHRl -eHRhcmVhIGlkPSJhY2NDXycgKyBudW0gKyAnIiBwbGFjZWhvbGRlcj0iSW5oYWx0ICh3aXJkIGF1 -Zmdla2xhcHB0KS4uLiIgcm93cz0iMyIgc3R5bGU9IicgKyBpbnB1dFN0eWxlICsgJ3Jlc2l6ZTp2 -ZXJ0aWNhbDtsaW5lLWhlaWdodDoxLjU7Ij48L3RleHRhcmVhPicgKwogICAgICAgICc8L2Rpdj4n -OwogICAgfSwKCiAgICBfYWRkQWNjSXRlbSgpIHsKICAgICAgICB0aGlzLl9hY2NDb3VudGVyKys7 -CiAgICAgICAgdmFyIGNvbnRhaW5lciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhY2NJbnNl -cnRJdGVtcycpOwogICAgICAgIGlmICghY29udGFpbmVyKSByZXR1cm47CiAgICAgICAgdmFyIGRp -diA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOwogICAgICAgIGRpdi5pbm5lckhUTUwg -PSB0aGlzLl9hY2NJdGVtSHRtbCh0aGlzLl9hY2NDb3VudGVyKTsKICAgICAgICBjb250YWluZXIu -YXBwZW5kQ2hpbGQoZGl2LmZpcnN0Q2hpbGQpOwogICAgICAgIHZhciBuZXdUID0gZG9jdW1lbnQu -Z2V0RWxlbWVudEJ5SWQoJ2FjY1RfJyArIHRoaXMuX2FjY0NvdW50ZXIpOwogICAgICAgIGlmIChu -ZXdUKSB7IG5ld1QuZm9jdXMoKTsgbmV3VC5zY3JvbGxJbnRvVmlldyh7IGJlaGF2aW9yOiAnc21v -b3RoJywgYmxvY2s6ICduZWFyZXN0JyB9KTsgfQogICAgfSwKCiAgICBfY29uZmlybUFjY29yZGlv -bigpIHsKICAgICAgICB2YXIgaXRlbXMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcjYWNj -SW5zZXJ0SXRlbXMgLmFjYy1pbnNlcnQtaXRlbScpOwogICAgICAgIHZhciBlbnRyaWVzID0gW107 -CiAgICAgICAgaXRlbXMuZm9yRWFjaChmdW5jdGlvbihpdGVtKSB7CiAgICAgICAgICAgIHZhciB0 -SW5wdXQgPSBpdGVtLnF1ZXJ5U2VsZWN0b3IoJ2lucHV0W2lkXj0iYWNjVF8iXScpOwogICAgICAg -ICAgICB2YXIgY0lucHV0ID0gaXRlbS5xdWVyeVNlbGVjdG9yKCd0ZXh0YXJlYVtpZF49ImFjY0Nf -Il0nKTsKICAgICAgICAgICAgdmFyIHQgPSB0SW5wdXQgPyB0SW5wdXQudmFsdWUudHJpbSgpIDog -Jyc7CiAgICAgICAgICAgIHZhciBjID0gY0lucHV0ID8gY0lucHV0LnZhbHVlLnRyaW0oKSA6ICcn -OwogICAgICAgICAgICBpZiAodCkgZW50cmllcy5wdXNoKHsgdGl0bGU6IHQsIGNvbnRlbnQ6IGMg -fHwgJycgfSk7CiAgICAgICAgfSk7CiAgICAgICAgaWYgKGVudHJpZXMubGVuZ3RoID09PSAwKSB7 -CiAgICAgICAgICAgIHNob3dUb2FzdCgnQml0dGUgbWluZGVzdGVucyBlaW5lbiBUaXRlbCBlaW5n -ZWJlbicsICd3YXJuaW5nJyk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAg -IGlmICh0aGlzLl9hY2NNb2RhbCkgeyB0aGlzLl9hY2NNb2RhbC5yZW1vdmUoKTsgdGhpcy5fYWNj -TW9kYWwgPSBudWxsOyB9CgogICAgICAgIHZhciBhY2NIdG1sID0gJyc7CiAgICAgICAgZW50cmll -cy5mb3JFYWNoKGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgdmFyIGNvbnRlbnQgPSBEcml2ZVBv -cnRhbC5lc2NhcGVIVE1MKGUuY29udGVudCkucmVwbGFjZSgvXG4vZywgJzxicj4nKSB8fCAnPHA+ -PC9wPic7CiAgICAgICAgICAgIGFjY0h0bWwgKz0KICAgICAgICAgICAgICAgICc8ZGl2IGNsYXNz -PSJkcml2ZS1hY2NvcmRpb24iIGNvbnRlbnRlZGl0YWJsZT0iZmFsc2UiPicgKwogICAgICAgICAg -ICAgICAgICAgICc8ZGl2IGNsYXNzPSJkcml2ZS1hY2NvcmRpb24taGVhZGVyIj4nICsKICAgICAg -ICAgICAgICAgICAgICAgICAgJzxzcGFuIGNsYXNzPSJkcml2ZS1hY2NvcmRpb24tYXJyb3ciPjxp -bWcgc3JjPSJjc3MvaWNvbnMvQ2hldnJvbi5wbmciIHN0eWxlPSJ3aWR0aDoxMnB4O2hlaWdodDox -MnB4OyI+PC9zcGFuPicgKwogICAgICAgICAgICAgICAgICAgICAgICAnPHNwYW4+JyArIERyaXZl -UG9ydGFsLmVzY2FwZUhUTUwoZS50aXRsZSkgKyAnPC9zcGFuPicgKwogICAgICAgICAgICAgICAg -ICAgICc8L2Rpdj4nICsKICAgICAgICAgICAgICAgICAgICAnPGRpdiBjbGFzcz0iZHJpdmUtYWNj -b3JkaW9uLWJvZHkiPicgKyBjb250ZW50ICsgJzwvZGl2PicgKwogICAgICAgICAgICAgICAgJzwv -ZGl2Pic7CiAgICAgICAgfSk7CiAgICAgICAgYWNjSHRtbCArPSAnPGJyPic7CgogICAgICAgIHZh -ciBlZGl0b3IgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZWRpdG9ySW5wdXQnKTsKICAgICAg -ICBlZGl0b3IuZm9jdXMoKTsKICAgICAgICBpZiAodGhpcy5fYWNjUmFuZ2UpIHsKICAgICAgICAg -ICAgdmFyIHNlbCA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTsKICAgICAgICAgICAgc2VsLnJlbW92 -ZUFsbFJhbmdlcygpOwogICAgICAgICAgICBzZWwuYWRkUmFuZ2UodGhpcy5fYWNjUmFuZ2UpOwog -ICAgICAgICAgICB0aGlzLl9hY2NSYW5nZSA9IG51bGw7CiAgICAgICAgfQogICAgICAgIGRvY3Vt -ZW50LmV4ZWNDb21tYW5kKCdpbnNlcnRIVE1MJywgZmFsc2UsIGFjY0h0bWwpOwogICAgICAgIHRo -aXMuc2F2ZVN0YXRlKCk7CiAgICB9LAoKICAgIC8vIC0tLSBGQVEtQmVyZWljaCAtLS0KICAgIF9m -YXFDb3VudGVyOiAwLAoKICAgIGluc2VydEZBUSgpIHsKICAgICAgICB0aGlzLl9mYXFDb3VudGVy -ID0gMTsKICAgICAgICAvLyBDdXJzb3ItUG9zaXRpb24gbWVya2VuCiAgICAgICAgdmFyIHNlbCA9 -IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTsKICAgICAgICB0aGlzLl9mYXFSYW5nZSA9IChzZWwgJiYg -c2VsLnJhbmdlQ291bnQpID8gc2VsLmdldFJhbmdlQXQoMCkuY2xvbmVSYW5nZSgpIDogbnVsbDsK -ICAgICAgICB2YXIgaW5wdXRTdHlsZSA9ICd3aWR0aDoxMDAlO3BhZGRpbmc6NnB4IDEwcHg7Ym9y -ZGVyOjFweCBzb2xpZCB2YXIoLS1ib3JkZXItY29sb3IpO2JvcmRlci1yYWRpdXM6NHB4O2ZvbnQt -c2l6ZToxM3B4O2JhY2tncm91bmQ6dmFyKC0tYmctaW5wdXQpO2NvbG9yOnZhcigtLXRleHQtcHJp -bWFyeSk7JzsKICAgICAgICB2YXIgbW9kYWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYn -KTsKICAgICAgICBtb2RhbC5zdHlsZS5jc3NUZXh0ID0gJ3Bvc2l0aW9uOmZpeGVkO3RvcDowO2xl -ZnQ6MDt3aWR0aDoxMDAlO2hlaWdodDoxMDAlO2JhY2tncm91bmQ6cmdiYSgwLDAsMCwwLjUpO3ot -aW5kZXg6MTA1MDA7ZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtqdXN0aWZ5LWNvbnRl -bnQ6Y2VudGVyOyc7CiAgICAgICAgbW9kYWwub25jbGljayA9IGZ1bmN0aW9uKGUpIHsgaWYgKGUu -dGFyZ2V0ID09PSBtb2RhbCkgbW9kYWwucmVtb3ZlKCk7IH07CiAgICAgICAgbW9kYWwuaW5uZXJI -VE1MID0KICAgICAgICAgICAgJzxkaXYgc3R5bGU9ImJhY2tncm91bmQ6dmFyKC0tYmctY2FyZCk7 -Ym9yZGVyLXJhZGl1czoxMHB4O3BhZGRpbmc6MjBweCAyNHB4O21heC13aWR0aDo2NDBweDt3aWR0 -aDo5MCU7Ym94LXNoYWRvdzowIDhweCAzMnB4IHJnYmEoMCwwLDAsMC4zKTttYXgtaGVpZ2h0Ojg1 -dmg7ZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjsiPicgKwogICAgICAgICAgICAg -ICAgJzxoMyBzdHlsZT0iY29sb3I6dmFyKC0tdGV4dC1oZWFkaW5nKTttYXJnaW4tYm90dG9tOjE0 -cHg7ZmxleC1zaHJpbms6MDsiPkZBUS1CZXJlaWNoIGVpbmbDvGdlbjwvaDM+JyArCiAgICAgICAg -ICAgICAgICAnPGRpdiBpZD0iZmFxSW5zZXJ0SXRlbXMiIHN0eWxlPSJvdmVyZmxvdy15OmF1dG87 -ZmxleDoxO21pbi1oZWlnaHQ6MDtwYWRkaW5nLXJpZ2h0OjRweDsiPicgKwogICAgICAgICAgICAg -ICAgICAgIERyaXZlRWRpdG9yLl9mYXFJdGVtSHRtbCgxKSArCiAgICAgICAgICAgICAgICAnPC9k -aXY+JyArCiAgICAgICAgICAgICAgICAnPGRpdiBzdHlsZT0iZmxleC1zaHJpbms6MDttYXJnaW4t -dG9wOjEwcHg7cGFkZGluZy10b3A6MTBweDtib3JkZXItdG9wOjFweCBzb2xpZCB2YXIoLS1ib3Jk -ZXItbGlnaHQpOyI+JyArCiAgICAgICAgICAgICAgICAgICAgJzxidXR0b24gb25jbGljaz0iRHJp -dmVFZGl0b3IuX2FkZEZhcUl0ZW0oKSIgc3R5bGU9IndpZHRoOjEwMCU7cGFkZGluZzo4cHg7Ym9y -ZGVyOjFweCBkYXNoZWQgdmFyKC0tYm9yZGVyLWNvbG9yKTtiYWNrZ3JvdW5kOnZhcigtLWJnLWNh -cmQtYWx0KTtib3JkZXItcmFkaXVzOjRweDtjdXJzb3I6cG9pbnRlcjtjb2xvcjp2YXIoLS10ZXh0 -LWhlYWRpbmcpO2ZvbnQtd2VpZ2h0OjYwMDtmb250LXNpemU6MTNweDsiPisgV2VpdGVyZSBGcmFn -ZSBoaW56dWbDvGdlbjwvYnV0dG9uPicgKwogICAgICAgICAgICAgICAgJzwvZGl2PicgKwogICAg -ICAgICAgICAgICAgJzxkaXYgc3R5bGU9ImRpc3BsYXk6ZmxleDtnYXA6OHB4O2p1c3RpZnktY29u -dGVudDpmbGV4LWVuZDttYXJnaW4tdG9wOjEwcHg7ZmxleC1zaHJpbms6MDsiPicgKwogICAgICAg -ICAgICAgICAgICAgICc8YnV0dG9uIG9uY2xpY2s9InRoaXMuY2xvc2VzdChcJ2RpdltzdHlsZV1c -JykucGFyZW50RWxlbWVudC5yZW1vdmUoKSIgc3R5bGU9InBhZGRpbmc6OHB4IDE2cHg7Ym9yZGVy -LXJhZGl1czo0cHg7Ym9yZGVyOjFweCBzb2xpZCB2YXIoLS1ib3JkZXItY29sb3IpO2JhY2tncm91 -bmQ6dmFyKC0tYmctY2FyZCk7Y29sb3I6dmFyKC0tdGV4dC1wcmltYXJ5KTtjdXJzb3I6cG9pbnRl -cjsiPkFiYnJlY2hlbjwvYnV0dG9uPicgKwogICAgICAgICAgICAgICAgICAgICc8YnV0dG9uIG9u -Y2xpY2s9IkRyaXZlRWRpdG9yLl9jb25maXJtRkFRKCkiIHN0eWxlPSJwYWRkaW5nOjhweCAxNnB4 -O2JvcmRlci1yYWRpdXM6NHB4O2JvcmRlcjpub25lO2JhY2tncm91bmQ6dmFyKC0tdGV4dC1oZWFk -aW5nKTtjb2xvcjp3aGl0ZTtjdXJzb3I6cG9pbnRlcjtmb250LXdlaWdodDo2MDA7Ij5FaW5mw7xn -ZW48L2J1dHRvbj4nICsKICAgICAgICAgICAgICAgICc8L2Rpdj4nICsKICAgICAgICAgICAgJzwv -ZGl2Pic7CiAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChtb2RhbCk7CiAgICAgICAg -dGhpcy5fZmFxTW9kYWwgPSBtb2RhbDsKICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgewog -ICAgICAgICAgICB2YXIgZmlyc3QgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZmFxUV8xJyk7 -CiAgICAgICAgICAgIGlmIChmaXJzdCkgZmlyc3QuZm9jdXMoKTsKICAgICAgICB9LCA1MCk7CiAg -ICB9LAoKICAgIF9mYXFNb2RhbDogbnVsbCwKCiAgICBfZmFxSXRlbUh0bWwobnVtKSB7CiAgICAg -ICAgdmFyIGlucHV0U3R5bGUgPSAnd2lkdGg6MTAwJTtwYWRkaW5nOjZweCAxMHB4O2JvcmRlcjox -cHggc29saWQgdmFyKC0tYm9yZGVyLWNvbG9yKTtib3JkZXItcmFkaXVzOjRweDtmb250LXNpemU6 -MTNweDtiYWNrZ3JvdW5kOnZhcigtLWJnLWlucHV0KTtjb2xvcjp2YXIoLS10ZXh0LXByaW1hcnkp -Oyc7CiAgICAgICAgcmV0dXJuICc8ZGl2IGNsYXNzPSJmYXEtaW5zZXJ0LWl0ZW0iIHN0eWxlPSJt -YXJnaW4tYm90dG9tOjEycHg7cGFkZGluZzoxMHB4IDEycHg7YmFja2dyb3VuZDp2YXIoLS1iZy1j -YXJkLWFsdCk7Ym9yZGVyLXJhZGl1czo2cHg7Ym9yZGVyOjFweCBzb2xpZCB2YXIoLS1ib3JkZXIt -bGlnaHQpOyI+JyArCiAgICAgICAgICAgICc8ZGl2IHN0eWxlPSJkaXNwbGF5OmZsZXg7anVzdGlm -eS1jb250ZW50OnNwYWNlLWJldHdlZW47YWxpZ24taXRlbXM6Y2VudGVyO21hcmdpbi1ib3R0b206 -NnB4OyI+JyArCiAgICAgICAgICAgICAgICAnPGxhYmVsIHN0eWxlPSJmb250LXNpemU6MTFweDtm -b250LXdlaWdodDo2MDA7Y29sb3I6dmFyKC0tdGV4dC1oZWFkaW5nKTsiPkZyYWdlICcgKyBudW0g -KyAnPC9sYWJlbD4nICsKICAgICAgICAgICAgICAgIChudW0gPiAxID8gJzxidXR0b24gb25jbGlj -az0idGhpcy5jbG9zZXN0KFwnLmZhcS1pbnNlcnQtaXRlbVwnKS5yZW1vdmUoKSIgc3R5bGU9ImJh -Y2tncm91bmQ6bm9uZTtib3JkZXI6bm9uZTtjb2xvcjp2YXIoLS10ZXh0LW11dGVkKTtjdXJzb3I6 -cG9pbnRlcjtmb250LXNpemU6MTRweDsiIHRpdGxlPSJFbnRmZXJuZW4iPiZ0aW1lczs8L2J1dHRv -bj4nIDogJycpICsKICAgICAgICAgICAgJzwvZGl2PicgKwogICAgICAgICAgICAnPGlucHV0IHR5 -cGU9InRleHQiIGlkPSJmYXFRXycgKyBudW0gKyAnIiBwbGFjZWhvbGRlcj0iRnJhZ2UgZWluZ2Vi -ZW4uLi4iIHN0eWxlPSInICsgaW5wdXRTdHlsZSArICdtYXJnaW4tYm90dG9tOjZweDtmb250LXdl -aWdodDo2MDA7Ij4nICsKICAgICAgICAgICAgJzx0ZXh0YXJlYSBpZD0iZmFxQV8nICsgbnVtICsg -JyIgcGxhY2Vob2xkZXI9IkFudHdvcnQgZWluZ2ViZW4uLi4iIHJvd3M9IjMiIHN0eWxlPSInICsg -aW5wdXRTdHlsZSArICdyZXNpemU6dmVydGljYWw7bGluZS1oZWlnaHQ6MS41OyI+PC90ZXh0YXJl -YT4nICsKICAgICAgICAnPC9kaXY+JzsKICAgIH0sCgogICAgX2FkZEZhcUl0ZW0oKSB7CiAgICAg -ICAgdGhpcy5fZmFxQ291bnRlcisrOwogICAgICAgIHZhciBjb250YWluZXIgPSBkb2N1bWVudC5n -ZXRFbGVtZW50QnlJZCgnZmFxSW5zZXJ0SXRlbXMnKTsKICAgICAgICBpZiAoIWNvbnRhaW5lcikg -cmV0dXJuOwogICAgICAgIHZhciBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsK -ICAgICAgICBkaXYuaW5uZXJIVE1MID0gdGhpcy5fZmFxSXRlbUh0bWwodGhpcy5fZmFxQ291bnRl -cik7CiAgICAgICAgY29udGFpbmVyLmFwcGVuZENoaWxkKGRpdi5maXJzdENoaWxkKTsKICAgICAg -ICB2YXIgbmV3USA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdmYXFRXycgKyB0aGlzLl9mYXFD -b3VudGVyKTsKICAgICAgICBpZiAobmV3USkgeyBuZXdRLmZvY3VzKCk7IG5ld1Euc2Nyb2xsSW50 -b1ZpZXcoeyBiZWhhdmlvcjogJ3Ntb290aCcsIGJsb2NrOiAnbmVhcmVzdCcgfSk7IH0KICAgIH0s -CgogICAgX2NvbmZpcm1GQVEoKSB7CiAgICAgICAgdmFyIGl0ZW1zID0gZG9jdW1lbnQucXVlcnlT -ZWxlY3RvckFsbCgnI2ZhcUluc2VydEl0ZW1zIC5mYXEtaW5zZXJ0LWl0ZW0nKTsKICAgICAgICB2 -YXIgcGFpcnMgPSBbXTsKICAgICAgICBpdGVtcy5mb3JFYWNoKGZ1bmN0aW9uKGl0ZW0pIHsKICAg -ICAgICAgICAgdmFyIHFJbnB1dCA9IGl0ZW0ucXVlcnlTZWxlY3RvcignaW5wdXRbaWRePSJmYXFR -XyJdJyk7CiAgICAgICAgICAgIHZhciBhSW5wdXQgPSBpdGVtLnF1ZXJ5U2VsZWN0b3IoJ3RleHRh -cmVhW2lkXj0iZmFxQV8iXScpOwogICAgICAgICAgICB2YXIgcSA9IHFJbnB1dCA/IHFJbnB1dC52 -YWx1ZS50cmltKCkgOiAnJzsKICAgICAgICAgICAgdmFyIGEgPSBhSW5wdXQgPyBhSW5wdXQudmFs -dWUudHJpbSgpIDogJyc7CiAgICAgICAgICAgIGlmIChxKSBwYWlycy5wdXNoKHsgcTogcSwgYTog -YSB8fCAnQW50d29ydCBhdXNzdGVoZW5kLicgfSk7CiAgICAgICAgfSk7CiAgICAgICAgaWYgKHBh -aXJzLmxlbmd0aCA9PT0gMCkgewogICAgICAgICAgICBzaG93VG9hc3QoJ0JpdHRlIG1pbmRlc3Rl -bnMgZWluZSBGcmFnZSBlaW5nZWJlbicsICd3YXJuaW5nJyk7CiAgICAgICAgICAgIHJldHVybjsK -ICAgICAgICB9CgogICAgICAgIGlmICh0aGlzLl9mYXFNb2RhbCkgeyB0aGlzLl9mYXFNb2RhbC5y -ZW1vdmUoKTsgdGhpcy5fZmFxTW9kYWwgPSBudWxsOyB9CgogICAgICAgIC8vIFNwcnVuZ21hcmtl -OiBmYXEte2FydGlrZWx0aXRlbC1zbHVnfQogICAgICAgIHZhciBzbHVnID0gJ2ZhcSc7CiAgICAg -ICAgaWYgKHRoaXMuY3VycmVudERvYyAmJiB0aGlzLmN1cnJlbnREb2MudGl0ZWwpIHsKICAgICAg -ICAgICAgc2x1ZyA9ICdmYXEtJyArIHRoaXMuY3VycmVudERvYy50aXRlbC50b0xvd2VyQ2FzZSgp -CiAgICAgICAgICAgICAgICAucmVwbGFjZSgvw6QvZywnYWUnKS5yZXBsYWNlKC/Dti9nLCdvZScp -LnJlcGxhY2UoL8O8L2csJ3VlJykucmVwbGFjZSgvw58vZywnc3MnKQogICAgICAgICAgICAgICAg -LnJlcGxhY2UoL1teYS16MC05XSsvZywnLScpLnJlcGxhY2UoL14tfC0kL2csJycpOwogICAgICAg -IH0KCiAgICAgICAgdmFyIGZhcUh0bWwgPSAnPGRpdiBjbGFzcz0iZHJpdmUtZmFxIiBpZD0iJyAr -IERyaXZlUG9ydGFsLmVzY2FwZUF0dHIoc2x1ZykgKyAnIiBjb250ZW50ZWRpdGFibGU9ImZhbHNl -Ij4nOwogICAgICAgIGZhcUh0bWwgKz0gJzxkaXYgY2xhc3M9ImRyaXZlLWZhcS1oZWFkZXIiPjxp -bWcgc3JjPSJjc3MvaWNvbnMvZmFxLnBuZyIgc3R5bGU9IndpZHRoOjIwcHg7aGVpZ2h0OjIwcHg7 -ZmlsdGVyOmludmVydCgxKSBicmlnaHRuZXNzKDIpOyI+IEZBUTwvZGl2Pic7CiAgICAgICAgZmFx -SHRtbCArPSAnPGRpdiBjbGFzcz0iZHJpdmUtZmFxLWJvZHkiPic7CiAgICAgICAgcGFpcnMuZm9y -RWFjaChmdW5jdGlvbihwKSB7CiAgICAgICAgICAgIGZhcUh0bWwgKz0gJzxkaXYgY2xhc3M9ImRy -aXZlLWZhcS1pdGVtIj4nICsKICAgICAgICAgICAgICAgICc8ZGl2IGNsYXNzPSJkcml2ZS1mYXEt -cXVlc3Rpb24iPjxzcGFuIGNsYXNzPSJkcml2ZS1mYXEtYXJyb3ciPjxpbWcgc3JjPSJjc3MvaWNv -bnMvQ2hldnJvbi5wbmciIHN0eWxlPSJ3aWR0aDoxMHB4O2hlaWdodDoxMHB4OyI+PC9zcGFuPjxz -cGFuPicgKyBEcml2ZVBvcnRhbC5lc2NhcGVIVE1MKHAucSkgKyAnPC9zcGFuPjwvZGl2PicgKwog -ICAgICAgICAgICAgICAgJzxkaXYgY2xhc3M9ImRyaXZlLWZhcS1hbnN3ZXIiPicgKyBEcml2ZVBv -cnRhbC5lc2NhcGVIVE1MKHAuYSkucmVwbGFjZSgvXG4vZywgJzxicj4nKSArICc8L2Rpdj4nICsK -ICAgICAgICAgICAgJzwvZGl2Pic7CiAgICAgICAgfSk7CiAgICAgICAgZmFxSHRtbCArPSAnPC9k -aXY+PC9kaXY+PGJyPic7CgogICAgICAgIHZhciBlZGl0b3IgPSBkb2N1bWVudC5nZXRFbGVtZW50 -QnlJZCgnZWRpdG9ySW5wdXQnKTsKICAgICAgICBlZGl0b3IuZm9jdXMoKTsKICAgICAgICAvLyBD -dXJzb3ItUG9zaXRpb24gd2llZGVyaGVyc3RlbGxlbgogICAgICAgIGlmICh0aGlzLl9mYXFSYW5n -ZSkgewogICAgICAgICAgICB2YXIgc2VsID0gd2luZG93LmdldFNlbGVjdGlvbigpOwogICAgICAg -ICAgICBzZWwucmVtb3ZlQWxsUmFuZ2VzKCk7CiAgICAgICAgICAgIHNlbC5hZGRSYW5nZSh0aGlz -Ll9mYXFSYW5nZSk7CiAgICAgICAgICAgIHRoaXMuX2ZhcVJhbmdlID0gbnVsbDsKICAgICAgICB9 -CiAgICAgICAgZG9jdW1lbnQuZXhlY0NvbW1hbmQoJ2luc2VydEhUTUwnLCBmYWxzZSwgZmFxSHRt -bCk7CiAgICAgICAgdGhpcy5zYXZlU3RhdGUoKTsKICAgIH0sCgogICAgLy8gLS0tIFRhYmVsbGUg -ZWluZsO8Z2VuIC0tLQogICAgaW5zZXJ0VGFibGUoKSB7CiAgICAgICAgdmFyIHNlbCA9IHdpbmRv -dy5nZXRTZWxlY3Rpb24oKTsKICAgICAgICB0aGlzLl90YmxSYW5nZSA9IChzZWwgJiYgc2VsLnJh -bmdlQ291bnQpID8gc2VsLmdldFJhbmdlQXQoMCkuY2xvbmVSYW5nZSgpIDogbnVsbDsKICAgICAg -ICB2YXIgbGFiZWxTdHlsZSA9ICdmb250LXNpemU6MTJweDtmb250LXdlaWdodDo2MDA7Y29sb3I6 -dmFyKC0tdGV4dC1zZWNvbmRhcnkpO2Rpc3BsYXk6YmxvY2s7bWFyZ2luLWJvdHRvbTozcHg7JzsK -ICAgICAgICB2YXIgaW5wdXRTdHlsZSA9ICd3aWR0aDoxMDAlO3BhZGRpbmc6NnB4IDEwcHg7Ym9y -ZGVyOjFweCBzb2xpZCB2YXIoLS1ib3JkZXItY29sb3IpO2JvcmRlci1yYWRpdXM6NHB4O2ZvbnQt -c2l6ZToxNHB4O2JhY2tncm91bmQ6dmFyKC0tYmctaW5wdXQpO2NvbG9yOnZhcigtLXRleHQtcHJp -bWFyeSk7JzsKICAgICAgICB2YXIgY2JTdHlsZSA9ICdkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6 -Y2VudGVyO2dhcDo2cHg7Zm9udC1zaXplOjEzcHg7Y29sb3I6dmFyKC0tdGV4dC1wcmltYXJ5KTtj -dXJzb3I6cG9pbnRlcjsnOwoKICAgICAgICB2YXIgbW9kYWwgPSBkb2N1bWVudC5jcmVhdGVFbGVt -ZW50KCdkaXYnKTsKICAgICAgICBtb2RhbC5zdHlsZS5jc3NUZXh0ID0gJ3Bvc2l0aW9uOmZpeGVk -O3RvcDowO2xlZnQ6MDt3aWR0aDoxMDAlO2hlaWdodDoxMDAlO2JhY2tncm91bmQ6cmdiYSgwLDAs -MCwwLjUpO3otaW5kZXg6MTA1MDA7ZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtqdXN0 -aWZ5LWNvbnRlbnQ6Y2VudGVyOyc7CiAgICAgICAgbW9kYWwub25jbGljayA9IGZ1bmN0aW9uKGUp -IHsgaWYgKGUudGFyZ2V0ID09PSBtb2RhbCkgbW9kYWwucmVtb3ZlKCk7IH07CiAgICAgICAgbW9k -YWwuaW5uZXJIVE1MID0KICAgICAgICAgICAgJzxkaXYgc3R5bGU9ImJhY2tncm91bmQ6dmFyKC0t -YmctY2FyZCk7Ym9yZGVyLXJhZGl1czoxMHB4O3BhZGRpbmc6MjBweCAyNHB4O21heC13aWR0aDo0 -NDBweDt3aWR0aDo5MCU7Ym94LXNoYWRvdzowIDhweCAzMnB4IHJnYmEoMCwwLDAsMC4zKTsiPicg -KwogICAgICAgICAgICAgICAgJzxoMyBzdHlsZT0iY29sb3I6dmFyKC0tdGV4dC1oZWFkaW5nKTtt -YXJnaW4tYm90dG9tOjE2cHg7Ij5UYWJlbGxlIGVpbmbDvGdlbjwvaDM+JyArCgogICAgICAgICAg -ICAgICAgJzxkaXYgc3R5bGU9ImRpc3BsYXk6Z3JpZDtncmlkLXRlbXBsYXRlLWNvbHVtbnM6MWZy -IDFmcjtnYXA6MTJweDttYXJnaW4tYm90dG9tOjE0cHg7Ij4nICsKICAgICAgICAgICAgICAgICAg -ICAnPGRpdj48bGFiZWwgc3R5bGU9IicgKyBsYWJlbFN0eWxlICsgJyI+U3BhbHRlbjwvbGFiZWw+ -JyArCiAgICAgICAgICAgICAgICAgICAgICAgICc8aW5wdXQgdHlwZT0ibnVtYmVyIiBpZD0idGJs -Q29scyIgdmFsdWU9IjMiIG1pbj0iMSIgbWF4PSIyMCIgc3R5bGU9IicgKyBpbnB1dFN0eWxlICsg -JyI+PC9kaXY+JyArCiAgICAgICAgICAgICAgICAgICAgJzxkaXY+PGxhYmVsIHN0eWxlPSInICsg -bGFiZWxTdHlsZSArICciPlplaWxlbjwvbGFiZWw+JyArCiAgICAgICAgICAgICAgICAgICAgICAg -ICc8aW5wdXQgdHlwZT0ibnVtYmVyIiBpZD0idGJsUm93cyIgdmFsdWU9IjQiIG1pbj0iMSIgbWF4 -PSI1MCIgc3R5bGU9IicgKyBpbnB1dFN0eWxlICsgJyI+PC9kaXY+JyArCiAgICAgICAgICAgICAg -ICAnPC9kaXY+JyArCgogICAgICAgICAgICAgICAgJzxkaXYgc3R5bGU9Im1hcmdpbi1ib3R0b206 -MTRweDtwYWRkaW5nOjEycHg7YmFja2dyb3VuZDp2YXIoLS1iZy1jYXJkLWFsdCk7Ym9yZGVyLXJh -ZGl1czo2cHg7Ij4nICsKICAgICAgICAgICAgICAgICAgICAnPGRpdiBzdHlsZT0iJyArIGxhYmVs -U3R5bGUgKyAnbWFyZ2luLWJvdHRvbTo4cHg7Ij7DnGJlcnNjaHJpZnRlbjwvZGl2PicgKwogICAg -ICAgICAgICAgICAgICAgICc8bGFiZWwgc3R5bGU9IicgKyBjYlN0eWxlICsgJ21hcmdpbi1ib3R0 -b206NnB4OyI+PGlucHV0IHR5cGU9ImNoZWNrYm94IiBpZD0idGJsQ29sSGVhZGVycyIgY2hlY2tl -ZD4gU3BhbHRlbsO8YmVyc2NocmlmdGVuIChlcnN0ZSBaZWlsZSBmZXR0KTwvbGFiZWw+JyArCiAg -ICAgICAgICAgICAgICAgICAgJzxsYWJlbCBzdHlsZT0iJyArIGNiU3R5bGUgKyAnIj48aW5wdXQg -dHlwZT0iY2hlY2tib3giIGlkPSJ0YmxSb3dIZWFkZXJzIj4gWmVpbGVuw7xiZXJzY2hyaWZ0ZW4g -KGVyc3RlIFNwYWx0ZSBmZXR0KTwvbGFiZWw+JyArCiAgICAgICAgICAgICAgICAnPC9kaXY+JyAr -CgogICAgICAgICAgICAgICAgJzxkaXYgc3R5bGU9Im1hcmdpbi1ib3R0b206MTZweDtwYWRkaW5n -OjEycHg7YmFja2dyb3VuZDp2YXIoLS1iZy1jYXJkLWFsdCk7Ym9yZGVyLXJhZGl1czo2cHg7Ij4n -ICsKICAgICAgICAgICAgICAgICAgICAnPGxhYmVsIHN0eWxlPSInICsgY2JTdHlsZSArICciPjxp -bnB1dCB0eXBlPSJjaGVja2JveCIgaWQ9InRibFNvcnRhYmxlIj4gU29ydGllcmJhciAoS2xpY2sg -YXVmIFNwYWx0ZW7DvGJlcnNjaHJpZnQgc29ydGllcnQpPC9sYWJlbD4nICsKICAgICAgICAgICAg -ICAgICc8L2Rpdj4nICsKCiAgICAgICAgICAgICAgICAnPGRpdiBzdHlsZT0iZGlzcGxheTpmbGV4 -O2dhcDo4cHg7anVzdGlmeS1jb250ZW50OmZsZXgtZW5kOyI+JyArCiAgICAgICAgICAgICAgICAg -ICAgJzxidXR0b24gb25jbGljaz0idGhpcy5jbG9zZXN0KFwnZGl2W3N0eWxlXVwnKS5wYXJlbnRF -bGVtZW50LnJlbW92ZSgpIiBzdHlsZT0icGFkZGluZzo4cHggMTZweDtib3JkZXItcmFkaXVzOjRw -eDtib3JkZXI6MXB4IHNvbGlkIHZhcigtLWJvcmRlci1jb2xvcik7YmFja2dyb3VuZDp2YXIoLS1i -Zy1jYXJkKTtjb2xvcjp2YXIoLS10ZXh0LXByaW1hcnkpO2N1cnNvcjpwb2ludGVyOyI+QWJicmVj -aGVuPC9idXR0b24+JyArCiAgICAgICAgICAgICAgICAgICAgJzxidXR0b24gb25jbGljaz0iRHJp -dmVFZGl0b3IuX2NvbmZpcm1UYWJsZSgpIiBzdHlsZT0icGFkZGluZzo4cHggMTZweDtib3JkZXIt -cmFkaXVzOjRweDtib3JkZXI6bm9uZTtiYWNrZ3JvdW5kOnZhcigtLXRleHQtaGVhZGluZyk7Y29s -b3I6d2hpdGU7Y3Vyc29yOnBvaW50ZXI7Zm9udC13ZWlnaHQ6NjAwOyI+RWluZsO8Z2VuPC9idXR0 -b24+JyArCiAgICAgICAgICAgICAgICAnPC9kaXY+JyArCiAgICAgICAgICAgICc8L2Rpdj4nOwog -ICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQobW9kYWwpOwogICAgICAgIHRoaXMuX3Ri -bE1vZGFsID0gbW9kYWw7CiAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpIHsgZG9jdW1lbnQu -Z2V0RWxlbWVudEJ5SWQoJ3RibENvbHMnKS5mb2N1cygpOyB9LCA1MCk7CiAgICB9LAoKICAgIF90 -YmxNb2RhbDogbnVsbCwKCiAgICBfY29uZmlybVRhYmxlKCkgewogICAgICAgIHZhciBjb2xzID0g -cGFyc2VJbnQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RibENvbHMnKS52YWx1ZSkgfHwgMzsK -ICAgICAgICB2YXIgcm93cyA9IHBhcnNlSW50KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0YmxS -b3dzJykudmFsdWUpIHx8IDQ7CiAgICAgICAgdmFyIGNvbEhlYWRlcnMgPSBkb2N1bWVudC5nZXRF -bGVtZW50QnlJZCgndGJsQ29sSGVhZGVycycpLmNoZWNrZWQ7CiAgICAgICAgdmFyIHJvd0hlYWRl -cnMgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGJsUm93SGVhZGVycycpLmNoZWNrZWQ7CiAg -ICAgICAgdmFyIHNvcnRhYmxlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RibFNvcnRhYmxl -JykuY2hlY2tlZDsKCiAgICAgICAgY29scyA9IE1hdGgubWF4KDEsIE1hdGgubWluKDIwLCBjb2xz -KSk7CiAgICAgICAgcm93cyA9IE1hdGgubWF4KDEsIE1hdGgubWluKDUwLCByb3dzKSk7CgogICAg -ICAgIGlmICh0aGlzLl90YmxNb2RhbCkgeyB0aGlzLl90YmxNb2RhbC5yZW1vdmUoKTsgdGhpcy5f -dGJsTW9kYWwgPSBudWxsOyB9CgogICAgICAgIHZhciBzb3J0Q2xhc3MgPSBzb3J0YWJsZSA/ICcg -c29ydGFibGUnIDogJyc7CiAgICAgICAgdmFyIGh0bWwgPSAnPGRpdiBjbGFzcz0iZHJpdmUtdGFi -bGUtd3JhcCIgY29udGVudGVkaXRhYmxlPSJmYWxzZSI+PHRhYmxlIGNsYXNzPSJkcml2ZS10YWJs -ZSInICsgKHNvcnRhYmxlID8gJyBkYXRhLXNvcnRhYmxlPSJ0cnVlIicgOiAnJykgKyAnPic7Cgog -ICAgICAgIC8vIFNwYWx0ZW4tSGVhZGVyCiAgICAgICAgaWYgKGNvbEhlYWRlcnMpIHsKICAgICAg -ICAgICAgaHRtbCArPSAnPHRoZWFkPjx0cj4nOwogICAgICAgICAgICBmb3IgKHZhciBjID0gMDsg -YyA8IGNvbHM7IGMrKykgewogICAgICAgICAgICAgICAgaHRtbCArPSAnPHRoIGNsYXNzPSInICsg -c29ydENsYXNzICsgJyIgY29udGVudGVkaXRhYmxlPSJ0cnVlIj5TcGFsdGUgJyArIChjICsgMSkg -KyAnPC90aD4nOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGh0bWwgKz0gJzwvdHI+PC90aGVh -ZD4nOwogICAgICAgIH0KCiAgICAgICAgaHRtbCArPSAnPHRib2R5Pic7CiAgICAgICAgdmFyIGRh -dGFSb3dzID0gY29sSGVhZGVycyA/IHJvd3MgLSAxIDogcm93czsKICAgICAgICBmb3IgKHZhciBy -ID0gMDsgciA8IGRhdGFSb3dzOyByKyspIHsKICAgICAgICAgICAgaHRtbCArPSAnPHRyPic7CiAg -ICAgICAgICAgIGZvciAodmFyIGMgPSAwOyBjIDwgY29sczsgYysrKSB7CiAgICAgICAgICAgICAg -ICBpZiAoYyA9PT0gMCAmJiByb3dIZWFkZXJzKSB7CiAgICAgICAgICAgICAgICAgICAgaHRtbCAr -PSAnPHRkIGNsYXNzPSJyb3ctaGVhZGVyIiBjb250ZW50ZWRpdGFibGU9InRydWUiPlplaWxlICcg -KyAociArIDEpICsgJzwvdGQ+JzsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAg -ICAgICAgICAgaHRtbCArPSAnPHRkIGNvbnRlbnRlZGl0YWJsZT0idHJ1ZSI+PC90ZD4nOwogICAg -ICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGh0bWwgKz0gJzwvdHI+JzsK -ICAgICAgICB9CiAgICAgICAgaHRtbCArPSAnPC90Ym9keT48L3RhYmxlPjwvZGl2Pjxicj4nOwoK -ICAgICAgICB2YXIgZWRpdG9yID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VkaXRvcklucHV0 -Jyk7CiAgICAgICAgZWRpdG9yLmZvY3VzKCk7CiAgICAgICAgaWYgKHRoaXMuX3RibFJhbmdlKSB7 -CiAgICAgICAgICAgIHZhciBzZWwgPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7CiAgICAgICAgICAg -IHNlbC5yZW1vdmVBbGxSYW5nZXMoKTsKICAgICAgICAgICAgc2VsLmFkZFJhbmdlKHRoaXMuX3Ri -bFJhbmdlKTsKICAgICAgICAgICAgdGhpcy5fdGJsUmFuZ2UgPSBudWxsOwogICAgICAgIH0KICAg -ICAgICBkb2N1bWVudC5leGVjQ29tbWFuZCgnaW5zZXJ0SFRNTCcsIGZhbHNlLCBodG1sKTsKICAg -ICAgICB0aGlzLnNhdmVTdGF0ZSgpOwogICAgfSwKCiAgICAvLyAtLS0gVHJlbm5saW5pZSArIElu -Zm9ib3ggLS0tCiAgICAvLyAtLS0gUkFXLU1vZHVzIChIVE1MLVF1ZWxsdGV4dCkgLS0tCiAgICBf -cmF3TW9kZTogZmFsc2UsCgogICAgdG9nZ2xlUmF3KCkgewogICAgICAgIHZhciBlZGl0b3IgPSBk -b2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZWRpdG9ySW5wdXQnKTsKICAgICAgICB2YXIgYnRuID0g -ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2J0blJhd01vZGUnKTsKICAgICAgICBpZiAoIWVkaXRv -cikgcmV0dXJuOwoKICAgICAgICBpZiAodGhpcy5fcmF3TW9kZSkgewogICAgICAgICAgICAvLyBS -QVcg4oaSIFdZU0lXWUc6IHRleHRhcmVhLUluaGFsdCB6dXJ1ZWNrIGluIGRlbiBFZGl0b3IKICAg -ICAgICAgICAgdmFyIHRleHRhcmVhID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VkaXRvclJh -d1RleHRhcmVhJyk7CiAgICAgICAgICAgIGlmICh0ZXh0YXJlYSkgewogICAgICAgICAgICAgICAg -ZWRpdG9yLmlubmVySFRNTCA9IHRleHRhcmVhLnZhbHVlOwogICAgICAgICAgICAgICAgdGV4dGFy -ZWEucmVtb3ZlKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWRpdG9yLnN0eWxlLmRpc3Bs -YXkgPSAnJzsKICAgICAgICAgICAgZWRpdG9yLmNvbnRlbnRFZGl0YWJsZSA9ICd0cnVlJzsKICAg -ICAgICAgICAgYnRuLnN0eWxlLm9wYWNpdHkgPSAnMC42JzsKICAgICAgICAgICAgYnRuLnN0eWxl -LmJhY2tncm91bmQgPSAnJzsKICAgICAgICAgICAgdGhpcy5fcmF3TW9kZSA9IGZhbHNlOwogICAg -ICAgIH0gZWxzZSB7CiAgICAgICAgICAgIC8vIFdZU0lXWUcg4oaSIFJBVzogRWRpdG9yLUhUTUwg -aW4gVGV4dGFyZWEgYW56ZWlnZW4KICAgICAgICAgICAgdmFyIHJhd0h0bWwgPSBlZGl0b3IuaW5u -ZXJIVE1MOwogICAgICAgICAgICBlZGl0b3Iuc3R5bGUuZGlzcGxheSA9ICdub25lJzsKICAgICAg -ICAgICAgdmFyIHRleHRhcmVhID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGV4dGFyZWEnKTsK -ICAgICAgICAgICAgdGV4dGFyZWEuaWQgPSAnZWRpdG9yUmF3VGV4dGFyZWEnOwogICAgICAgICAg -ICB0ZXh0YXJlYS52YWx1ZSA9IHJhd0h0bWw7CiAgICAgICAgICAgIHRleHRhcmVhLnN0eWxlLmNz -c1RleHQgPSAnd2lkdGg6MTAwJTtoZWlnaHQ6MTAwJTttaW4taGVpZ2h0OjMwMHB4O3BhZGRpbmc6 -MTJweDtib3JkZXI6bm9uZTtmb250LWZhbWlseTptb25vc3BhY2U7Zm9udC1zaXplOjEycHg7bGlu -ZS1oZWlnaHQ6MS42O2JhY2tncm91bmQ6dmFyKC0tYmctaW5wdXQpO2NvbG9yOnZhcigtLXRleHQt -cHJpbWFyeSk7cmVzaXplOm5vbmU7ZmxleDoxOyc7CiAgICAgICAgICAgIGVkaXRvci5wYXJlbnRO -b2RlLmluc2VydEJlZm9yZSh0ZXh0YXJlYSwgZWRpdG9yLm5leHRTaWJsaW5nKTsKICAgICAgICAg -ICAgYnRuLnN0eWxlLm9wYWNpdHkgPSAnMSc7CiAgICAgICAgICAgIGJ0bi5zdHlsZS5iYWNrZ3Jv -dW5kID0gJ3ZhcigtLXRleHQtaGVhZGluZyknOwogICAgICAgICAgICBidG4uc3R5bGUuY29sb3Ig -PSAnd2hpdGUnOwogICAgICAgICAgICB0aGlzLl9yYXdNb2RlID0gdHJ1ZTsKICAgICAgICB9CiAg -ICB9LAoKICAgIGluc2VydERpdmlkZXIoKSB7CiAgICAgICAgdmFyIGVkaXRvciA9IGRvY3VtZW50 -LmdldEVsZW1lbnRCeUlkKCdlZGl0b3JJbnB1dCcpOwogICAgICAgIGVkaXRvci5mb2N1cygpOwog -ICAgICAgIGRvY3VtZW50LmV4ZWNDb21tYW5kKCdpbnNlcnRIVE1MJywgZmFsc2UsICc8aHIgY2xh -c3M9ImRyaXZlLWRpdmlkZXIiPjxicj4nKTsKICAgICAgICB0aGlzLnNhdmVTdGF0ZSgpOwogICAg -fSwKCiAgICBpbnNlcnRJbmZvYm94KCkgewogICAgICAgIHZhciBzZWwgPSB3aW5kb3cuZ2V0U2Vs -ZWN0aW9uKCk7CiAgICAgICAgdGhpcy5faW5mb2JveFJhbmdlID0gKHNlbCAmJiBzZWwucmFuZ2VD -b3VudCkgPyBzZWwuZ2V0UmFuZ2VBdCgwKS5jbG9uZVJhbmdlKCkgOiBudWxsOwoKICAgICAgICB2 -YXIgYnRuU3R5bGUgPSAnYmFja2dyb3VuZDpub25lO2JvcmRlcjoxcHggc29saWQgdmFyKC0tYm9y -ZGVyLWNvbG9yKTtib3JkZXItcmFkaXVzOjNweDtwYWRkaW5nOjNweCA4cHg7Y3Vyc29yOnBvaW50 -ZXI7Zm9udC1zaXplOjEycHg7Y29sb3I6dmFyKC0tdGV4dC1wcmltYXJ5KTttaW4td2lkdGg6Mjhw -eDsnOwogICAgICAgIHZhciBidG5TdHlsZUJvbGQgPSBidG5TdHlsZSArICdmb250LXdlaWdodDo3 -MDA7JzsKICAgICAgICB2YXIgYnRuU3R5bGVJdGFsaWMgPSBidG5TdHlsZSArICdmb250LXN0eWxl -Oml0YWxpYzsnOwogICAgICAgIHZhciBidG5TdHlsZVVuZGVybGluZSA9IGJ0blN0eWxlICsgJ3Rl -eHQtZGVjb3JhdGlvbjp1bmRlcmxpbmU7JzsKICAgICAgICB2YXIgc2VsZWN0U3R5bGUgPSAnYmFj -a2dyb3VuZDp2YXIoLS1iZy1pbnB1dCk7Ym9yZGVyOjFweCBzb2xpZCB2YXIoLS1ib3JkZXItY29s -b3IpO2JvcmRlci1yYWRpdXM6M3B4O3BhZGRpbmc6M3B4IDRweDtmb250LXNpemU6MTFweDtjb2xv -cjp2YXIoLS10ZXh0LXByaW1hcnkpO2N1cnNvcjpwb2ludGVyOyc7CgogICAgICAgIHZhciBtb2Rh -bCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOwogICAgICAgIG1vZGFsLnN0eWxlLmNz -c1RleHQgPSAncG9zaXRpb246Zml4ZWQ7dG9wOjA7bGVmdDowO3dpZHRoOjEwMCU7aGVpZ2h0OjEw -MCU7YmFja2dyb3VuZDpyZ2JhKDAsMCwwLDAuNSk7ei1pbmRleDoxMDUwMDtkaXNwbGF5OmZsZXg7 -YWxpZ24taXRlbXM6Y2VudGVyO2p1c3RpZnktY29udGVudDpjZW50ZXI7JzsKICAgICAgICBtb2Rh -bC5vbmNsaWNrID0gZnVuY3Rpb24oZSkgeyBpZiAoZS50YXJnZXQgPT09IG1vZGFsKSBtb2RhbC5y -ZW1vdmUoKTsgfTsKICAgICAgICBtb2RhbC5pbm5lckhUTUwgPQogICAgICAgICAgICAnPGRpdiBz -dHlsZT0iYmFja2dyb3VuZDp2YXIoLS1iZy1jYXJkKTtib3JkZXItcmFkaXVzOjEwcHg7cGFkZGlu -ZzoyMHB4IDI0cHg7bWF4LXdpZHRoOjUyMHB4O3dpZHRoOjk0JTtib3gtc2hhZG93OjAgOHB4IDMy -cHggcmdiYSgwLDAsMCwwLjMpOyI+JyArCiAgICAgICAgICAgICAgICAnPGgzIHN0eWxlPSJjb2xv -cjp2YXIoLS10ZXh0LWhlYWRpbmcpO21hcmdpbi1ib3R0b206MTRweDsiPkluZm9ibG9jayBlaW5m -w7xnZW48L2gzPicgKwoKICAgICAgICAgICAgICAgICc8bGFiZWwgc3R5bGU9ImZvbnQtc2l6ZTox -MnB4O2ZvbnQtd2VpZ2h0OjYwMDtjb2xvcjp2YXIoLS10ZXh0LXNlY29uZGFyeSk7ZGlzcGxheTpi -bG9jazttYXJnaW4tYm90dG9tOjRweDsiPsOcYmVyc2NocmlmdDwvbGFiZWw+JyArCiAgICAgICAg -ICAgICAgICAnPGlucHV0IHR5cGU9InRleHQiIGlkPSJpbmZvYm94VGl0bGUiIHZhbHVlPSJIaW53 -ZWlzIiBwbGFjZWhvbGRlcj0iei5CLiBIaW53ZWlzLCBXaWNodGlnLCBUaXBwLi4uIiAnICsKICAg -ICAgICAgICAgICAgICdzdHlsZT0id2lkdGg6MTAwJTtwYWRkaW5nOjhweCAxMHB4O2JvcmRlcjox -cHggc29saWQgdmFyKC0tYm9yZGVyLWNvbG9yKTtib3JkZXItcmFkaXVzOjRweDtmb250LXNpemU6 -MTRweDtiYWNrZ3JvdW5kOnZhcigtLWJnLWlucHV0KTtjb2xvcjp2YXIoLS10ZXh0LXByaW1hcnkp -O21hcmdpbi1ib3R0b206MTRweDsiPicgKwoKICAgICAgICAgICAgICAgICc8bGFiZWwgc3R5bGU9 -ImZvbnQtc2l6ZToxMnB4O2ZvbnQtd2VpZ2h0OjYwMDtjb2xvcjp2YXIoLS10ZXh0LXNlY29uZGFy -eSk7ZGlzcGxheTpibG9jazttYXJnaW4tYm90dG9tOjRweDsiPkluaGFsdDwvbGFiZWw+JyArCiAg -ICAgICAgICAgICAgICAnPGRpdiBzdHlsZT0iYm9yZGVyOjFweCBzb2xpZCB2YXIoLS1ib3JkZXIt -Y29sb3IpO2JvcmRlci1yYWRpdXM6NHB4O292ZXJmbG93OmhpZGRlbjttYXJnaW4tYm90dG9tOjE0 -cHg7Ij4nICsKICAgICAgICAgICAgICAgICAgICAnPGRpdiBpZD0iaW5mb2JveFRvb2xiYXIiIHN0 -eWxlPSJkaXNwbGF5OmZsZXg7Z2FwOjRweDtmbGV4LXdyYXA6d3JhcDthbGlnbi1pdGVtczpjZW50 -ZXI7cGFkZGluZzo2cHggOHB4O2JvcmRlci1ib3R0b206MXB4IHNvbGlkIHZhcigtLWJvcmRlci1j -b2xvcik7YmFja2dyb3VuZDp2YXIoLS1iZy1jYXJkLWFsdCwjZjZmOGZhKTsiPicgKwogICAgICAg -ICAgICAgICAgICAgICAgICAnPGJ1dHRvbiBvbmNsaWNrPSJEcml2ZUVkaXRvci5faW5mb2JveENt -ZChcJ3VuZG9cJykiIHRpdGxlPSJSw7xja2fDpG5naWciIHN0eWxlPSInICsgYnRuU3R5bGUgKyAn -Ij4mIzg2MzA7PC9idXR0b24+JyArCiAgICAgICAgICAgICAgICAgICAgICAgICc8YnV0dG9uIG9u -Y2xpY2s9IkRyaXZlRWRpdG9yLl9pbmZvYm94Q21kKFwncmVkb1wnKSIgdGl0bGU9IldpZWRlcmhv -bGVuIiBzdHlsZT0iJyArIGJ0blN0eWxlICsgJyI+JiM4NjMxOzwvYnV0dG9uPicgKwogICAgICAg -ICAgICAgICAgICAgICAgICAnPHNwYW4gc3R5bGU9IndpZHRoOjFweDtoZWlnaHQ6MThweDtiYWNr -Z3JvdW5kOnZhcigtLWJvcmRlci1jb2xvcik7bWFyZ2luOjAgMnB4OyI+PC9zcGFuPicgKwogICAg -ICAgICAgICAgICAgICAgICAgICAnPGJ1dHRvbiBvbmNsaWNrPSJEcml2ZUVkaXRvci5faW5mb2Jv -eENtZChcJ2JvbGRcJykiIHRpdGxlPSJGZXR0IiBzdHlsZT0iJyArIGJ0blN0eWxlQm9sZCArICci -PkI8L2J1dHRvbj4nICsKICAgICAgICAgICAgICAgICAgICAgICAgJzxidXR0b24gb25jbGljaz0i -RHJpdmVFZGl0b3IuX2luZm9ib3hDbWQoXCdpdGFsaWNcJykiIHRpdGxlPSJLdXJzaXYiIHN0eWxl -PSInICsgYnRuU3R5bGVJdGFsaWMgKyAnIj5JPC9idXR0b24+JyArCiAgICAgICAgICAgICAgICAg -ICAgICAgICc8YnV0dG9uIG9uY2xpY2s9IkRyaXZlRWRpdG9yLl9pbmZvYm94Q21kKFwndW5kZXJs -aW5lXCcpIiB0aXRsZT0iVW50ZXJzdHJpY2hlbiIgc3R5bGU9IicgKyBidG5TdHlsZVVuZGVybGlu -ZSArICciPlU8L2J1dHRvbj4nICsKICAgICAgICAgICAgICAgICAgICAgICAgJzxzcGFuIHN0eWxl -PSJ3aWR0aDoxcHg7aGVpZ2h0OjE4cHg7YmFja2dyb3VuZDp2YXIoLS1ib3JkZXItY29sb3IpO21h -cmdpbjowIDJweDsiPjwvc3Bhbj4nICsKICAgICAgICAgICAgICAgICAgICAgICAgJzxidXR0b24g -b25jbGljaz0iRHJpdmVFZGl0b3IuX2luZm9ib3hDbWQoXCdpbnNlcnRVbm9yZGVyZWRMaXN0XCcp -IiB0aXRsZT0iQXVmesOkaGx1bmciIHN0eWxlPSInICsgYnRuU3R5bGUgKyAnIj4mIzgyMjY7IExp -c3RlPC9idXR0b24+JyArCiAgICAgICAgICAgICAgICAgICAgICAgICc8YnV0dG9uIG9uY2xpY2s9 -IkRyaXZlRWRpdG9yLl9pbmZvYm94Q21kKFwnaW5zZXJ0T3JkZXJlZExpc3RcJykiIHRpdGxlPSJO -dW1tZXJpZXJ1bmciIHN0eWxlPSInICsgYnRuU3R5bGUgKyAnIj4xLiBMaXN0ZTwvYnV0dG9uPicg -KwogICAgICAgICAgICAgICAgICAgICAgICAnPHNwYW4gc3R5bGU9IndpZHRoOjFweDtoZWlnaHQ6 -MThweDtiYWNrZ3JvdW5kOnZhcigtLWJvcmRlci1jb2xvcik7bWFyZ2luOjAgMnB4OyI+PC9zcGFu -PicgKwogICAgICAgICAgICAgICAgICAgICAgICAnPHNlbGVjdCBvbmNoYW5nZT0iRHJpdmVFZGl0 -b3IuX2luZm9ib3hDbWQoXCdmb250U2l6ZVwnLHRoaXMudmFsdWUpO3RoaXMuc2VsZWN0ZWRJbmRl -eD0wOyIgdGl0bGU9IlNjaHJpZnRncsO2w59lIiBzdHlsZT0iJyArIHNlbGVjdFN0eWxlICsgJyI+ -JyArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPG9wdGlvbiB2YWx1ZT0iIiBkaXNhYmxl -ZCBzZWxlY3RlZD5HcsO2w59lPC9vcHRpb24+JyArCiAgICAgICAgICAgICAgICAgICAgICAgICAg -ICAnPG9wdGlvbiB2YWx1ZT0iMSI+S2xlaW48L29wdGlvbj4nICsKICAgICAgICAgICAgICAgICAg -ICAgICAgICAgICc8b3B0aW9uIHZhbHVlPSIzIj5Ob3JtYWw8L29wdGlvbj4nICsKICAgICAgICAg -ICAgICAgICAgICAgICAgICAgICc8b3B0aW9uIHZhbHVlPSI0Ij5Hcm/Dnzwvb3B0aW9uPicgKwog -ICAgICAgICAgICAgICAgICAgICAgICAgICAgJzxvcHRpb24gdmFsdWU9IjUiPlNlaHIgZ3Jvw588 -L29wdGlvbj4nICsKICAgICAgICAgICAgICAgICAgICAgICAgJzwvc2VsZWN0PicgKwogICAgICAg -ICAgICAgICAgICAgICAgICAnPHNlbGVjdCBvbmNoYW5nZT0iRHJpdmVFZGl0b3IuX2luZm9ib3hD -bWQoXCdmb3JlQ29sb3JcJyx0aGlzLnZhbHVlKTt0aGlzLnNlbGVjdGVkSW5kZXg9MDsiIHRpdGxl -PSJUZXh0ZmFyYmUiIHN0eWxlPSInICsgc2VsZWN0U3R5bGUgKyAnIj4nICsKICAgICAgICAgICAg -ICAgICAgICAgICAgICAgICc8b3B0aW9uIHZhbHVlPSIiIGRpc2FibGVkIHNlbGVjdGVkPkZhcmJl -PC9vcHRpb24+JyArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPG9wdGlvbiB2YWx1ZT0i -IzAwMDAwMCIgc3R5bGU9ImNvbG9yOiMwMDAwMDA7Ij5TY2h3YXJ6PC9vcHRpb24+JyArCiAgICAg -ICAgICAgICAgICAgICAgICAgICAgICAnPG9wdGlvbiB2YWx1ZT0iIzJFNEE2MiIgc3R5bGU9ImNv -bG9yOiMyRTRBNjI7Ij5Qb2xpemVpLUJsYXU8L29wdGlvbj4nICsKICAgICAgICAgICAgICAgICAg -ICAgICAgICAgICc8b3B0aW9uIHZhbHVlPSIjM2E3YWEzIiBzdHlsZT0iY29sb3I6IzNhN2FhMzsi -PkJsYXU8L29wdGlvbj4nICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICc8b3B0aW9uIHZh -bHVlPSIjOGIzYTYyIiBzdHlsZT0iY29sb3I6IzhiM2E2MjsiPkJvcmRlYXV4PC9vcHRpb24+JyAr -CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPG9wdGlvbiB2YWx1ZT0iI2ZmMDAwMCIgc3R5 -bGU9ImNvbG9yOiNmZjAwMDA7Ij5Sb3Q8L29wdGlvbj4nICsKICAgICAgICAgICAgICAgICAgICAg -ICAgJzwvc2VsZWN0PicgKwogICAgICAgICAgICAgICAgICAgICAgICAnPHNwYW4gc3R5bGU9Indp -ZHRoOjFweDtoZWlnaHQ6MThweDtiYWNrZ3JvdW5kOnZhcigtLWJvcmRlci1jb2xvcik7bWFyZ2lu -OjAgMnB4OyI+PC9zcGFuPicgKwogICAgICAgICAgICAgICAgICAgICAgICAnPGJ1dHRvbiBvbmNs -aWNrPSJEcml2ZUVkaXRvci5faW5mb2JveENtZChcJ2luc2VydEhvcml6b250YWxSdWxlXCcpIiB0 -aXRsZT0iVHJlbm5saW5pZSIgc3R5bGU9IicgKyBidG5TdHlsZSArICciPuKAlSBMaW5pZTwvYnV0 -dG9uPicgKwogICAgICAgICAgICAgICAgICAgICc8L2Rpdj4nICsKICAgICAgICAgICAgICAgICAg -ICAnPGRpdiBpZD0iaW5mb2JveENvbnRlbnQiIGNvbnRlbnRlZGl0YWJsZT0idHJ1ZSIgJyArCiAg -ICAgICAgICAgICAgICAgICAgJ3N0eWxlPSJwYWRkaW5nOjEwcHggMTJweDttaW4taGVpZ2h0OjEw -MHB4O21heC1oZWlnaHQ6MjUwcHg7b3ZlcmZsb3cteTphdXRvO2ZvbnQtc2l6ZToxNHB4O2xpbmUt -aGVpZ2h0OjEuNjtjb2xvcjp2YXIoLS10ZXh0LXByaW1hcnkpO2JhY2tncm91bmQ6dmFyKC0tYmct -aW5wdXQpO291dGxpbmU6bm9uZTsiPjwvZGl2PicgKwogICAgICAgICAgICAgICAgJzwvZGl2Picg -KwoKICAgICAgICAgICAgICAgICc8ZGl2IHN0eWxlPSJkaXNwbGF5OmZsZXg7Z2FwOjhweDtqdXN0 -aWZ5LWNvbnRlbnQ6ZmxleC1lbmQ7Ij4nICsKICAgICAgICAgICAgICAgICAgICAnPGJ1dHRvbiBv -bmNsaWNrPSJ0aGlzLmNsb3Nlc3QoXCdkaXZbc3R5bGVdXCcpLnBhcmVudEVsZW1lbnQucmVtb3Zl -KCkiIHN0eWxlPSJwYWRkaW5nOjhweCAxNnB4O2JvcmRlci1yYWRpdXM6NHB4O2JvcmRlcjoxcHgg -c29saWQgdmFyKC0tYm9yZGVyLWNvbG9yKTtiYWNrZ3JvdW5kOnZhcigtLWJnLWNhcmQpO2NvbG9y -OnZhcigtLXRleHQtcHJpbWFyeSk7Y3Vyc29yOnBvaW50ZXI7Ij5BYmJyZWNoZW48L2J1dHRvbj4n -ICsKICAgICAgICAgICAgICAgICAgICAnPGJ1dHRvbiBvbmNsaWNrPSJEcml2ZUVkaXRvci5fY29u -ZmlybUluZm9ib3goKSIgc3R5bGU9InBhZGRpbmc6OHB4IDE2cHg7Ym9yZGVyLXJhZGl1czo0cHg7 -Ym9yZGVyOm5vbmU7YmFja2dyb3VuZDp2YXIoLS10ZXh0LWhlYWRpbmcpO2NvbG9yOndoaXRlO2N1 -cnNvcjpwb2ludGVyO2ZvbnQtd2VpZ2h0OjYwMDsiPkVpbmbDvGdlbjwvYnV0dG9uPicgKwogICAg -ICAgICAgICAgICAgJzwvZGl2PicgKwogICAgICAgICAgICAnPC9kaXY+JzsKICAgICAgICB0aGlz -Ll9pbmZvYm94TW9kYWwgPSBtb2RhbDsKICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxk -KG1vZGFsKTsKICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgewogICAgICAgICAgICBkb2N1 -bWVudC5nZXRFbGVtZW50QnlJZCgnaW5mb2JveFRpdGxlJykuc2VsZWN0KCk7CiAgICAgICAgICAg -IC8vIEZva3VzLUhhbmRsaW5nOiBUb29sYmFyLUJ1dHRvbnMgc29sbGVuIEZva3VzIGltIENvbnRl -bnQgbGFzc2VuCiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbmZvYm94VG9v -bGJhcicpLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsIGZ1bmN0aW9uKGUpIHsKICAgICAg -ICAgICAgICAgIGlmIChlLnRhcmdldC50YWdOYW1lID09PSAnQlVUVE9OJykgZS5wcmV2ZW50RGVm -YXVsdCgpOwogICAgICAgICAgICB9KTsKICAgICAgICB9LCA1MCk7CiAgICB9LAoKICAgIF9pbmZv -Ym94TW9kYWw6IG51bGwsCgogICAgLy8gRm9ybWF0aWVydW5nc2JlZmVobCBpbSBJbmZvYm94LUNv -bnRlbnRlZGl0YWJsZSBhdXNmdWVocmVuCiAgICBfaW5mb2JveENtZChjbWQsIHZhbHVlKSB7CiAg -ICAgICAgdmFyIGNvbnRlbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5mb2JveENvbnRl -bnQnKTsKICAgICAgICBpZiAoIWNvbnRlbnQpIHJldHVybjsKICAgICAgICBjb250ZW50LmZvY3Vz -KCk7CiAgICAgICAgZG9jdW1lbnQuZXhlY0NvbW1hbmQoY21kLCBmYWxzZSwgdmFsdWUgfHwgbnVs -bCk7CiAgICB9LAoKICAgIF9jb25maXJtSW5mb2JveCgpIHsKICAgICAgICB2YXIgdGl0bGVJbnB1 -dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbmZvYm94VGl0bGUnKTsKICAgICAgICB2YXIg -Y29udGVudEVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2luZm9ib3hDb250ZW50Jyk7CiAg -ICAgICAgdmFyIHRpdGxlID0gdGl0bGVJbnB1dCA/IHRpdGxlSW5wdXQudmFsdWUudHJpbSgpIDog -J0hpbndlaXMnOwogICAgICAgIGlmICghdGl0bGUpIHRpdGxlID0gJ0hpbndlaXMnOwogICAgICAg -IHZhciBjb250ZW50ID0gY29udGVudEVsID8gY29udGVudEVsLmlubmVySFRNTC50cmltKCkgOiAn -JzsKICAgICAgICBpZiAoIWNvbnRlbnQgfHwgY29udGVudCA9PT0gJzxicj4nKSBjb250ZW50ID0g -JzxwPlRleHQgaGllciBlaW5nZWJlbi4uLjwvcD4nOwoKICAgICAgICAvLyBNb2RhbCBzY2hsaWVz -c2VuCiAgICAgICAgaWYgKHRoaXMuX2luZm9ib3hNb2RhbCkgeyB0aGlzLl9pbmZvYm94TW9kYWwu -cmVtb3ZlKCk7IHRoaXMuX2luZm9ib3hNb2RhbCA9IG51bGw7IH0KCiAgICAgICAgdmFyIGh0bWwg -PSAnPGRpdiBjbGFzcz0iZHJpdmUtaW5mb2JveCI+PGgzPicgKyBEcml2ZVBvcnRhbC5lc2NhcGVI -VE1MKHRpdGxlKSArICc8L2gzPicgKyBjb250ZW50ICsgJzwvZGl2PjxwPjxicj48L3A+JzsKCiAg -ICAgICAgdmFyIGVkaXRvciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlZGl0b3JJbnB1dCcp -OwogICAgICAgIGVkaXRvci5mb2N1cygpOwogICAgICAgIGlmICh0aGlzLl9pbmZvYm94UmFuZ2Up -IHsKICAgICAgICAgICAgdmFyIHNlbCA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTsKICAgICAgICAg -ICAgc2VsLnJlbW92ZUFsbFJhbmdlcygpOwogICAgICAgICAgICBzZWwuYWRkUmFuZ2UodGhpcy5f -aW5mb2JveFJhbmdlKTsKICAgICAgICAgICAgdGhpcy5faW5mb2JveFJhbmdlID0gbnVsbDsKICAg -ICAgICB9CiAgICAgICAgZG9jdW1lbnQuZXhlY0NvbW1hbmQoJ2luc2VydEhUTUwnLCBmYWxzZSwg -aHRtbCk7CiAgICAgICAgdGhpcy5zYXZlU3RhdGUoKTsKICAgIH0sCgogICAgLy8gLS0tIFdpY2h0 -aWctQmxvY2sgZWluZnVlZ2VuIC0tLQogICAgX2ltcG9ydGFudE1vZGFsOiBudWxsLAoKICAgIGlu -c2VydEltcG9ydGFudCgpIHsKICAgICAgICB2YXIgc2VsID0gd2luZG93LmdldFNlbGVjdGlvbigp -OwogICAgICAgIHRoaXMuX2ltcG9ydGFudFJhbmdlID0gKHNlbCAmJiBzZWwucmFuZ2VDb3VudCkg -PyBzZWwuZ2V0UmFuZ2VBdCgwKS5jbG9uZVJhbmdlKCkgOiBudWxsOwoKICAgICAgICB2YXIgbW9k -YWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKICAgICAgICBtb2RhbC5zdHlsZS5j -c3NUZXh0ID0gJ3Bvc2l0aW9uOmZpeGVkO3RvcDowO2xlZnQ6MDt3aWR0aDoxMDAlO2hlaWdodDox -MDAlO2JhY2tncm91bmQ6cmdiYSgwLDAsMCwwLjUpO3otaW5kZXg6MTA1MDA7ZGlzcGxheTpmbGV4 -O2FsaWduLWl0ZW1zOmNlbnRlcjtqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyOyc7CiAgICAgICAgbW9k -YWwub25jbGljayA9IGZ1bmN0aW9uKGUpIHsgaWYgKGUudGFyZ2V0ID09PSBtb2RhbCkgbW9kYWwu -cmVtb3ZlKCk7IH07CiAgICAgICAgbW9kYWwuaW5uZXJIVE1MID0KICAgICAgICAgICAgJzxkaXYg -c3R5bGU9ImJhY2tncm91bmQ6dmFyKC0tYmctY2FyZCk7Ym9yZGVyLXJhZGl1czoxMHB4O3BhZGRp -bmc6MjBweCAyNHB4O21heC13aWR0aDo1MjBweDt3aWR0aDo5NCU7Ym94LXNoYWRvdzowIDhweCAz -MnB4IHJnYmEoMCwwLDAsMC4zKTsiPicgKwogICAgICAgICAgICAgICAgJzxkaXYgc3R5bGU9ImRp -c3BsYXk6ZmxleDthbGlnbi1pdGVtczpjZW50ZXI7Z2FwOjEwcHg7bWFyZ2luLWJvdHRvbToxNHB4 -OyI+JyArCiAgICAgICAgICAgICAgICAgICAgJzxpbWcgc3JjPSJjc3MvaWNvbnMvaW1wb3J0YW50 -LnBuZyIgc3R5bGU9IndpZHRoOjIycHg7aGVpZ2h0OjIycHg7Ij4nICsKICAgICAgICAgICAgICAg -ICAgICAnPGgzIHN0eWxlPSJjb2xvcjp2YXIoLS10ZXh0LWhlYWRpbmcpO21hcmdpbjowOyI+V2lj -aHRpZ2VuIEhpbndlaXMgZWluZnVlZ2VuPC9oMz4nICsKICAgICAgICAgICAgICAgICc8L2Rpdj4n -ICsKICAgICAgICAgICAgICAgICc8cCBzdHlsZT0iZm9udC1zaXplOjEycHg7Y29sb3I6dmFyKC0t -dGV4dC1tdXRlZCk7bWFyZ2luLWJvdHRvbToxMnB4OyI+RGVyIFRleHQgd2lyZCBhbHMgYXVmZmFl -bGxpZ2VyIEJsb2NrIGltIEFydGlrZWwgZGFyZ2VzdGVsbHQsIHVtIGF1ZiBiZXNvbmRlcnMgd2lj -aHRpZ2UgSW5mb3JtYXRpb25lbiBoaW56dXdlaXNlbi48L3A+JyArCiAgICAgICAgICAgICAgICAn -PGxhYmVsIHN0eWxlPSJmb250LXNpemU6MTJweDtmb250LXdlaWdodDo2MDA7Y29sb3I6dmFyKC0t -dGV4dC1zZWNvbmRhcnkpO2Rpc3BsYXk6YmxvY2s7bWFyZ2luLWJvdHRvbTo0cHg7Ij5IaW53ZWlz -dGV4dDwvbGFiZWw+JyArCiAgICAgICAgICAgICAgICAnPHRleHRhcmVhIGlkPSJpbXBvcnRhbnRU -ZXh0IiByb3dzPSI0IiBwbGFjZWhvbGRlcj0iei5CLiBCaXR0ZSBiZWFjaHRlbiBTaWUsIGRhc3Mu -Li4iICcgKwogICAgICAgICAgICAgICAgJ3N0eWxlPSJ3aWR0aDoxMDAlO3BhZGRpbmc6MTBweCAx -MnB4O2JvcmRlcjoxcHggc29saWQgdmFyKC0tYm9yZGVyLWNvbG9yKTtib3JkZXItcmFkaXVzOjRw -eDtmb250LXNpemU6MTRweDtsaW5lLWhlaWdodDoxLjY7YmFja2dyb3VuZDp2YXIoLS1iZy1pbnB1 -dCk7Y29sb3I6dmFyKC0tdGV4dC1wcmltYXJ5KTtyZXNpemU6dmVydGljYWw7Ij48L3RleHRhcmVh -PicgKwogICAgICAgICAgICAgICAgJzxkaXYgc3R5bGU9ImRpc3BsYXk6ZmxleDtnYXA6OHB4O2p1 -c3RpZnktY29udGVudDpmbGV4LWVuZDttYXJnaW4tdG9wOjE0cHg7Ij4nICsKICAgICAgICAgICAg -ICAgICAgICAnPGJ1dHRvbiBvbmNsaWNrPSJ0aGlzLmNsb3Nlc3QoXCdkaXZbc3R5bGVdXCcpLnBh -cmVudEVsZW1lbnQucmVtb3ZlKCkiIHN0eWxlPSJwYWRkaW5nOjhweCAxNnB4O2JvcmRlci1yYWRp -dXM6NHB4O2JvcmRlcjoxcHggc29saWQgdmFyKC0tYm9yZGVyLWNvbG9yKTtiYWNrZ3JvdW5kOnZh -cigtLWJnLWNhcmQpO2NvbG9yOnZhcigtLXRleHQtcHJpbWFyeSk7Y3Vyc29yOnBvaW50ZXI7Ij5B -YmJyZWNoZW48L2J1dHRvbj4nICsKICAgICAgICAgICAgICAgICAgICAnPGJ1dHRvbiBvbmNsaWNr -PSJEcml2ZUVkaXRvci5fY29uZmlybUltcG9ydGFudCgpIiBzdHlsZT0icGFkZGluZzo4cHggMTZw -eDtib3JkZXItcmFkaXVzOjRweDtib3JkZXI6bm9uZTtiYWNrZ3JvdW5kOiMxYTIzMzI7Y29sb3I6 -d2hpdGU7Y3Vyc29yOnBvaW50ZXI7Zm9udC13ZWlnaHQ6NjAwOyI+RWluZnVlZ2VuPC9idXR0b24+ -JyArCiAgICAgICAgICAgICAgICAnPC9kaXY+JyArCiAgICAgICAgICAgICc8L2Rpdj4nOwogICAg -ICAgIHRoaXMuX2ltcG9ydGFudE1vZGFsID0gbW9kYWw7CiAgICAgICAgZG9jdW1lbnQuYm9keS5h -cHBlbmRDaGlsZChtb2RhbCk7CiAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpIHsKICAgICAg -ICAgICAgdmFyIHRhID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ltcG9ydGFudFRleHQnKTsK -ICAgICAgICAgICAgaWYgKHRhKSB0YS5mb2N1cygpOwogICAgICAgIH0sIDUwKTsKICAgIH0sCgog -ICAgX2NvbmZpcm1JbXBvcnRhbnQoKSB7CiAgICAgICAgdmFyIHRleHRFbCA9IGRvY3VtZW50Lmdl -dEVsZW1lbnRCeUlkKCdpbXBvcnRhbnRUZXh0Jyk7CiAgICAgICAgdmFyIHRleHQgPSB0ZXh0RWwg -PyB0ZXh0RWwudmFsdWUudHJpbSgpIDogJyc7CiAgICAgICAgaWYgKCF0ZXh0KSB7CiAgICAgICAg -ICAgIHNob3dUb2FzdCgnQml0dGUgZWluZW4gSGlud2Vpc3RleHQgZWluZ2ViZW4nLCAnd2Fybmlu -ZycpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICAvLyBNb2RhbCBzY2hs -aWVzc2VuCiAgICAgICAgaWYgKHRoaXMuX2ltcG9ydGFudE1vZGFsKSB7IHRoaXMuX2ltcG9ydGFu -dE1vZGFsLnJlbW92ZSgpOyB0aGlzLl9pbXBvcnRhbnRNb2RhbCA9IG51bGw7IH0KCiAgICAgICAg -dmFyIGNvbnRlbnQgPSBEcml2ZVBvcnRhbC5lc2NhcGVIVE1MKHRleHQpLnJlcGxhY2UoL1xuL2cs -ICc8YnI+Jyk7CiAgICAgICAgdmFyIGh0bWwgPSAnPGRpdiBjbGFzcz0iZHJpdmUtaW1wb3J0YW50 -IiBjb250ZW50ZWRpdGFibGU9ImZhbHNlIj4nICsKICAgICAgICAgICAgJzxkaXYgY2xhc3M9ImRy -aXZlLWltcG9ydGFudC1oZWFkZXIiPjxpbWcgc3JjPSJjc3MvaWNvbnMvaW1wb3J0YW50LnBuZyI+ -IFdpY2h0aWc8L2Rpdj4nICsKICAgICAgICAgICAgJzxkaXYgY2xhc3M9ImRyaXZlLWltcG9ydGFu -dC1ib2R5Ij4nICsgY29udGVudCArICc8L2Rpdj4nICsKICAgICAgICAnPC9kaXY+PHA+PGJyPjwv -cD4nOwoKICAgICAgICB2YXIgZWRpdG9yID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VkaXRv -cklucHV0Jyk7CiAgICAgICAgZWRpdG9yLmZvY3VzKCk7CiAgICAgICAgaWYgKHRoaXMuX2ltcG9y -dGFudFJhbmdlKSB7CiAgICAgICAgICAgIHZhciBzZWwgPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7 -CiAgICAgICAgICAgIHNlbC5yZW1vdmVBbGxSYW5nZXMoKTsKICAgICAgICAgICAgc2VsLmFkZFJh -bmdlKHRoaXMuX2ltcG9ydGFudFJhbmdlKTsKICAgICAgICAgICAgdGhpcy5faW1wb3J0YW50UmFu -Z2UgPSBudWxsOwogICAgICAgIH0KICAgICAgICBkb2N1bWVudC5leGVjQ29tbWFuZCgnaW5zZXJ0 -SFRNTCcsIGZhbHNlLCBodG1sKTsKICAgICAgICB0aGlzLnNhdmVTdGF0ZSgpOwogICAgfSwKCiAg -ICAvLyAtLS0gRm9ybWF0aWVydW5nc2JlZmVobGUgLS0tCiAgICBoZWFkaW5nKHRhZykgewogICAg -ICAgIGNvbnN0IGlucHV0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VkaXRvcklucHV0Jyk7 -CiAgICAgICAgaW5wdXQuZm9jdXMoKTsKICAgICAgICBjb25zdCBzZWwgPSB3aW5kb3cuZ2V0U2Vs -ZWN0aW9uKCk7CiAgICAgICAgaWYgKCFzZWwucmFuZ2VDb3VudCkgcmV0dXJuOwogICAgICAgIGNv -bnN0IHJhbmdlID0gc2VsLmdldFJhbmdlQXQoMCk7CgogICAgICAgIC8vIEFrdHVlbGxlbiBCbG9j -ayBmaW5kZW4gKFAsIERJViBvZGVyIGJlcmVpdHMgZWluIEhlYWRpbmcpCiAgICAgICAgbGV0IGJs -b2NrID0gcmFuZ2Uuc3RhcnRDb250YWluZXI7CiAgICAgICAgd2hpbGUgKGJsb2NrICYmIGJsb2Nr -ICE9PSBpbnB1dCAmJiAhWydQJywnRElWJywnSDEnLCdIMicsJ0gzJywnSDQnLCdINScsJ0g2J10u -aW5jbHVkZXMoYmxvY2subm9kZU5hbWUpKSB7CiAgICAgICAgICAgIGJsb2NrID0gYmxvY2sucGFy -ZW50Tm9kZTsKICAgICAgICB9CgogICAgICAgIGlmICghdGFnKSB7CiAgICAgICAgICAgIC8vICJB -YnNhdHoiIGdld2FlaGx0OiBIZWFkaW5nIHp1cnVlY2sgaW4gPHA+IHVtd2FuZGVsbgogICAgICAg -ICAgICBpZiAoYmxvY2sgJiYgYmxvY2sgIT09IGlucHV0ICYmIFsnSDEnLCdIMicsJ0gzJywnSDQn -LCdINScsJ0g2J10uaW5jbHVkZXMoYmxvY2subm9kZU5hbWUpKSB7CiAgICAgICAgICAgICAgICBj -b25zdCBwID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgncCcpOwogICAgICAgICAgICAgICAgcC5p -bm5lckhUTUwgPSBibG9jay5pbm5lckhUTUw7CiAgICAgICAgICAgICAgICBibG9jay5wYXJlbnRO -b2RlLnJlcGxhY2VDaGlsZChwLCBibG9jayk7CiAgICAgICAgICAgICAgICBjb25zdCBuZXdSYW5n -ZSA9IGRvY3VtZW50LmNyZWF0ZVJhbmdlKCk7CiAgICAgICAgICAgICAgICBuZXdSYW5nZS5zZWxl -Y3ROb2RlQ29udGVudHMocCk7CiAgICAgICAgICAgICAgICBuZXdSYW5nZS5jb2xsYXBzZShmYWxz -ZSk7CiAgICAgICAgICAgICAgICBzZWwucmVtb3ZlQWxsUmFuZ2VzKCk7CiAgICAgICAgICAgICAg -ICBzZWwuYWRkUmFuZ2UobmV3UmFuZ2UpOwogICAgICAgICAgICAgICAgdGhpcy5zYXZlU3RhdGUo -KTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICBp -ZiAoYmxvY2sgJiYgYmxvY2sgIT09IGlucHV0KSB7CiAgICAgICAgICAgIC8vIEJlc3RlaGVuZGVu -IEJsb2NrIGluIEhlYWRpbmcgdW13YW5kZWxuCiAgICAgICAgICAgIGNvbnN0IGhlYWRpbmcgPSBk -b2N1bWVudC5jcmVhdGVFbGVtZW50KHRhZyk7CiAgICAgICAgICAgIGhlYWRpbmcuaW5uZXJIVE1M -ID0gYmxvY2suaW5uZXJIVE1MOwogICAgICAgICAgICBibG9jay5wYXJlbnROb2RlLnJlcGxhY2VD -aGlsZChoZWFkaW5nLCBibG9jayk7CiAgICAgICAgICAgIC8vIEN1cnNvciBhbnMgRW5kZSBzZXR6 -ZW4KICAgICAgICAgICAgY29uc3QgbmV3UmFuZ2UgPSBkb2N1bWVudC5jcmVhdGVSYW5nZSgpOwog -ICAgICAgICAgICBuZXdSYW5nZS5zZWxlY3ROb2RlQ29udGVudHMoaGVhZGluZyk7CiAgICAgICAg -ICAgIG5ld1JhbmdlLmNvbGxhcHNlKGZhbHNlKTsKICAgICAgICAgICAgc2VsLnJlbW92ZUFsbFJh -bmdlcygpOwogICAgICAgICAgICBzZWwuYWRkUmFuZ2UobmV3UmFuZ2UpOwogICAgICAgIH0gZWxz -ZSB7CiAgICAgICAgICAgIC8vIEtlaW4gQmxvY2s6IE5ldWVzIEhlYWRpbmcgZWluZnVlZ2VuCiAg -ICAgICAgICAgIGNvbnN0IGhlYWRpbmcgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KHRhZyk7CiAg -ICAgICAgICAgIGhlYWRpbmcudGV4dENvbnRlbnQgPSBzZWwudG9TdHJpbmcoKSB8fCAnw5xiZXJz -Y2hyaWZ0JzsKICAgICAgICAgICAgcmFuZ2UuZGVsZXRlQ29udGVudHMoKTsKICAgICAgICAgICAg -cmFuZ2UuaW5zZXJ0Tm9kZShoZWFkaW5nKTsKICAgICAgICAgICAgLy8gQ3Vyc29yIGFucyBFbmRl -CiAgICAgICAgICAgIGNvbnN0IG5ld1JhbmdlID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTsKICAg -ICAgICAgICAgbmV3UmFuZ2Uuc2VsZWN0Tm9kZUNvbnRlbnRzKGhlYWRpbmcpOwogICAgICAgICAg -ICBuZXdSYW5nZS5jb2xsYXBzZShmYWxzZSk7CiAgICAgICAgICAgIHNlbC5yZW1vdmVBbGxSYW5n -ZXMoKTsKICAgICAgICAgICAgc2VsLmFkZFJhbmdlKG5ld1JhbmdlKTsKICAgICAgICB9CiAgICAg -ICAgdGhpcy5zYXZlU3RhdGUoKTsKICAgIH0sCgogICAgY29tbWFuZChjbWQpIHsKICAgICAgICBj -b25zdCBpbnB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlZGl0b3JJbnB1dCcpOwogICAg -ICAgIGlucHV0LmZvY3VzKCk7CiAgICAgICAgY29uc3Qgc2VsID0gd2luZG93LmdldFNlbGVjdGlv -bigpOwogICAgICAgIGlmICghc2VsLnJhbmdlQ291bnQpIHJldHVybjsKCiAgICAgICAgc3dpdGNo -IChjbWQpIHsKICAgICAgICAgICAgY2FzZSAnYm9sZCc6IHRoaXMud3JhcFNlbGVjdGlvbignc3Ry -b25nJyk7IGJyZWFrOwogICAgICAgICAgICBjYXNlICdpdGFsaWMnOiB0aGlzLndyYXBTZWxlY3Rp -b24oJ2VtJyk7IGJyZWFrOwogICAgICAgICAgICBjYXNlICd1bmRlcmxpbmUnOiB0aGlzLndyYXBT -ZWxlY3Rpb24oJ3UnKTsgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ2luc2VydFVub3JkZXJlZExp -c3QnOiB0aGlzLmluc2VydExpc3QoJ3VsJyk7IGJyZWFrOwogICAgICAgICAgICBjYXNlICdpbnNl -cnRPcmRlcmVkTGlzdCc6IHRoaXMuaW5zZXJ0TGlzdCgnb2wnKTsgYnJlYWs7CiAgICAgICAgfQog -ICAgICAgIGlucHV0LmZvY3VzKCk7CiAgICB9LAoKICAgIHdyYXBTZWxlY3Rpb24odGFnTmFtZSkg -ewogICAgICAgIGNvbnN0IHNlbCA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTsKICAgICAgICBpZiAo -IXNlbC5yYW5nZUNvdW50KSByZXR1cm47CiAgICAgICAgY29uc3QgcmFuZ2UgPSBzZWwuZ2V0UmFu -Z2VBdCgwKTsKICAgICAgICBpZiAocmFuZ2UuY29sbGFwc2VkKSByZXR1cm47CiAgICAgICAgY29u -c3QgVEFHID0gdGFnTmFtZS50b1VwcGVyQ2FzZSgpOwoKICAgICAgICB0cnkgewogICAgICAgICAg -ICAvLyBQcnVlZmVuIG9iIGRpZSBnZXNhbXRlIFNlbGVrdGlvbiBiZXJlaXRzIGluIGRpZXNlbSBU -YWcgbGllZ3QKICAgICAgICAgICAgbGV0IG5vZGUgPSByYW5nZS5jb21tb25BbmNlc3RvckNvbnRh -aW5lcjsKICAgICAgICAgICAgbGV0IGV4aXN0aW5nID0gbnVsbDsKICAgICAgICAgICAgd2hpbGUg -KG5vZGUgJiYgbm9kZS5ub2RlVHlwZSAhPT0gTm9kZS5ET0NVTUVOVF9OT0RFKSB7CiAgICAgICAg -ICAgICAgICBpZiAobm9kZS5ub2RlVHlwZSA9PT0gTm9kZS5FTEVNRU5UX05PREUgJiYgbm9kZS50 -YWdOYW1lID09PSBUQUcpIHsKICAgICAgICAgICAgICAgICAgICBleGlzdGluZyA9IG5vZGU7CiAg -ICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAg -ICBub2RlID0gbm9kZS5wYXJlbnROb2RlOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAo -ZXhpc3RpbmcpIHsKICAgICAgICAgICAgICAgIC8vIFRvZ2dsZSBPRkY6IFRhZyBlbnRmZXJuZW4s -IEtpbmRlciBiZWliZWhhbHRlbgogICAgICAgICAgICAgICAgY29uc3QgcGFyZW50ID0gZXhpc3Rp -bmcucGFyZW50Tm9kZTsKICAgICAgICAgICAgICAgIGNvbnN0IGNoaWxkcmVuID0gQXJyYXkuZnJv -bShleGlzdGluZy5jaGlsZE5vZGVzKTsKICAgICAgICAgICAgICAgIGNvbnN0IGZpcnN0ID0gY2hp -bGRyZW5bMF0sIGxhc3QgPSBjaGlsZHJlbltjaGlsZHJlbi5sZW5ndGggLSAxXTsKICAgICAgICAg -ICAgICAgIHdoaWxlIChleGlzdGluZy5maXJzdENoaWxkKSBwYXJlbnQuaW5zZXJ0QmVmb3JlKGV4 -aXN0aW5nLmZpcnN0Q2hpbGQsIGV4aXN0aW5nKTsKICAgICAgICAgICAgICAgIHBhcmVudC5yZW1v -dmVDaGlsZChleGlzdGluZyk7CiAgICAgICAgICAgICAgICBpZiAoZmlyc3QgJiYgbGFzdCkgewog -ICAgICAgICAgICAgICAgICAgIHJhbmdlLnNldFN0YXJ0QmVmb3JlKGZpcnN0KTsKICAgICAgICAg -ICAgICAgICAgICByYW5nZS5zZXRFbmRBZnRlcihsYXN0KTsKICAgICAgICAgICAgICAgICAgICBz -ZWwucmVtb3ZlQWxsUmFuZ2VzKCk7CiAgICAgICAgICAgICAgICAgICAgc2VsLmFkZFJhbmdlKHJh -bmdlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAg -ICAgIGNvbnN0IGZyYWcgPSByYW5nZS5leHRyYWN0Q29udGVudHMoKTsKICAgICAgICAgICAgICAg -IC8vIEJlcmVpdHMgdm9yaGFuZGVuZSBnbGVpY2hlIFRhZ3MgaW0gRnJhZ21lbnQgYXVmbG9lc2Vu -ICh2ZXJoaW5kZXJ0IFZlcnNjaGFjaHRlbHVuZykKICAgICAgICAgICAgICAgIGZyYWcucXVlcnlT -ZWxlY3RvckFsbCh0YWdOYW1lKS5mb3JFYWNoKGZ1bmN0aW9uKGlubmVyKSB7CiAgICAgICAgICAg -ICAgICAgICAgd2hpbGUgKGlubmVyLmZpcnN0Q2hpbGQpIGlubmVyLnBhcmVudE5vZGUuaW5zZXJ0 -QmVmb3JlKGlubmVyLmZpcnN0Q2hpbGQsIGlubmVyKTsKICAgICAgICAgICAgICAgICAgICBpbm5l -ci5yZW1vdmUoKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgY29uc3Qgd3Jh -cHBlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQodGFnTmFtZSk7CiAgICAgICAgICAgICAgICB3 -cmFwcGVyLmFwcGVuZENoaWxkKGZyYWcpOwogICAgICAgICAgICAgICAgcmFuZ2UuaW5zZXJ0Tm9k -ZSh3cmFwcGVyKTsKICAgICAgICAgICAgICAgIHJhbmdlLnNlbGVjdE5vZGVDb250ZW50cyh3cmFw -cGVyKTsKICAgICAgICAgICAgICAgIHNlbC5yZW1vdmVBbGxSYW5nZXMoKTsKICAgICAgICAgICAg -ICAgIHNlbC5hZGRSYW5nZShyYW5nZSk7CiAgICAgICAgICAgIH0KICAgICAgICB9IGNhdGNoIChl -KSB7CiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1dyYXAgZXJyb3I6JywgZSk7CiAgICAgICAg -fQogICAgfSwKCiAgICBpbnNlcnRMaXN0KGxpc3RUeXBlKSB7CiAgICAgICAgY29uc3Qgc2VsID0g -d2luZG93LmdldFNlbGVjdGlvbigpOwogICAgICAgIGlmICghc2VsLnJhbmdlQ291bnQpIHJldHVy -bjsKICAgICAgICBjb25zdCByYW5nZSA9IHNlbC5nZXRSYW5nZUF0KDApOwogICAgICAgIGNvbnN0 -IGxpc3QgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KGxpc3RUeXBlKTsKCiAgICAgICAgaWYgKCFy -YW5nZS5jb2xsYXBzZWQpIHsKICAgICAgICAgICAgY29uc3QgZnJhZyA9IHJhbmdlLmV4dHJhY3RD -b250ZW50cygpOwogICAgICAgICAgICAvLyBUZXh0IGF1ZiBaZWlsZW51bWJydWVjaGUgYXVmdGVp -bGVuIGZ1ZXIgc2VwYXJhdGUgTEktRWxlbWVudGUKICAgICAgICAgICAgY29uc3QgdGVtcERpdiA9 -IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOwogICAgICAgICAgICB0ZW1wRGl2LmFwcGVu -ZENoaWxkKGZyYWcpOwogICAgICAgICAgICBjb25zdCB0ZXh0ID0gdGVtcERpdi5pbm5lckhUTUw7 -CiAgICAgICAgICAgIC8vIFNwbGl0IGF1ZiA8YnI+LCBcbiBvZGVyIEJsb2NrLUVsZW1lbnRlCiAg -ICAgICAgICAgIGNvbnN0IGxpbmVzID0gdGV4dC5zcGxpdCgvPGJyXHMqXC8/Pi9naSkubWFwKGZ1 -bmN0aW9uKGwpIHsgcmV0dXJuIGwudHJpbSgpOyB9KS5maWx0ZXIoZnVuY3Rpb24obCkgeyByZXR1 -cm4gbC5sZW5ndGggPiAwOyB9KTsKICAgICAgICAgICAgaWYgKGxpbmVzLmxlbmd0aCA+IDEpIHsK -ICAgICAgICAgICAgICAgIGxpbmVzLmZvckVhY2goZnVuY3Rpb24obGluZSkgewogICAgICAgICAg -ICAgICAgICAgIGNvbnN0IGxpID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbGknKTsKICAgICAg -ICAgICAgICAgICAgICBsaS5pbm5lckhUTUwgPSBsaW5lOwogICAgICAgICAgICAgICAgICAgIGxp -c3QuYXBwZW5kQ2hpbGQobGkpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0gZWxz -ZSB7CiAgICAgICAgICAgICAgICBjb25zdCBsaSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2xp -Jyk7CiAgICAgICAgICAgICAgICBsaS5hcHBlbmRDaGlsZCh0ZW1wRGl2LmZpcnN0Q2hpbGQgfHwg -ZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUodGVtcERpdi50ZXh0Q29udGVudCkpOwogICAgICAgICAg -ICAgICAgd2hpbGUgKHRlbXBEaXYuZmlyc3RDaGlsZCkgbGkuYXBwZW5kQ2hpbGQodGVtcERpdi5m -aXJzdENoaWxkKTsKICAgICAgICAgICAgICAgIGxpc3QuYXBwZW5kQ2hpbGQobGkpOwogICAgICAg -ICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgY29uc3QgbGkgPSBkb2N1bWVudC5j -cmVhdGVFbGVtZW50KCdsaScpOwogICAgICAgICAgICBsaS5hcHBlbmRDaGlsZChkb2N1bWVudC5j -cmVhdGVUZXh0Tm9kZSgnXHUwMEEwJykpOwogICAgICAgICAgICBsaXN0LmFwcGVuZENoaWxkKGxp -KTsKICAgICAgICB9CgogICAgICAgIHJhbmdlLmRlbGV0ZUNvbnRlbnRzKCk7CiAgICAgICAgcmFu -Z2UuaW5zZXJ0Tm9kZShsaXN0KTsKICAgICAgICBjb25zdCBsYXN0TGkgPSBsaXN0LnF1ZXJ5U2Vs -ZWN0b3IoJ2xpOmxhc3QtY2hpbGQnKTsKICAgICAgICBpZiAobGFzdExpKSB7CiAgICAgICAgICAg -IHJhbmdlLnNlbGVjdE5vZGVDb250ZW50cyhsYXN0TGkpOwogICAgICAgICAgICByYW5nZS5jb2xs -YXBzZShmYWxzZSk7CiAgICAgICAgfQogICAgICAgIHNlbC5yZW1vdmVBbGxSYW5nZXMoKTsKICAg -ICAgICBzZWwuYWRkUmFuZ2UocmFuZ2UpOwogICAgfSwKCiAgICBmb250U2l6ZShzaXplKSB7CiAg -ICAgICAgaWYgKCFzaXplKSByZXR1cm47CiAgICAgICAgY29uc3QgaW5wdXQgPSBkb2N1bWVudC5n -ZXRFbGVtZW50QnlJZCgnZWRpdG9ySW5wdXQnKTsKICAgICAgICBpbnB1dC5mb2N1cygpOwogICAg -ICAgIGNvbnN0IHNlbCA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTsKICAgICAgICBpZiAoIXNlbC5y -YW5nZUNvdW50KSByZXR1cm47CiAgICAgICAgY29uc3QgcmFuZ2UgPSBzZWwuZ2V0UmFuZ2VBdCgw -KTsKICAgICAgICBpZiAocmFuZ2UuY29sbGFwc2VkKSByZXR1cm47CgogICAgICAgIGNvbnN0IGZy -YWcgPSByYW5nZS5leHRyYWN0Q29udGVudHMoKTsKICAgICAgICAvLyBCZXN0ZWhlbmRlIGZvbnRT -aXplLVNwYW5zIGltIEZyYWdtZW50IGF1ZmxvZXNlbgogICAgICAgIGZyYWcucXVlcnlTZWxlY3Rv -ckFsbCgnc3BhbicpLmZvckVhY2goZnVuY3Rpb24ocykgewogICAgICAgICAgICBpZiAocy5zdHls -ZS5mb250U2l6ZSAmJiBzLnN0eWxlLmxlbmd0aCA8PSAxKSB7CiAgICAgICAgICAgICAgICAvLyBT -cGFuIGhhdCBudXIgZm9udC1zaXplIC0+IGR1cmNoIEluaGFsdCBlcnNldHplbgogICAgICAgICAg -ICAgICAgd2hpbGUgKHMuZmlyc3RDaGlsZCkgcy5wYXJlbnROb2RlLmluc2VydEJlZm9yZShzLmZp -cnN0Q2hpbGQsIHMpOwogICAgICAgICAgICAgICAgcy5yZW1vdmUoKTsKICAgICAgICAgICAgfSBl -bHNlIGlmIChzLnN0eWxlLmZvbnRTaXplKSB7CiAgICAgICAgICAgICAgICBzLnN0eWxlLnJlbW92 -ZVByb3BlcnR5KCdmb250LXNpemUnKTsKICAgICAgICAgICAgfQogICAgICAgIH0pOwogICAgICAg -IGNvbnN0IHdyYXBwZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7CiAgICAgICAg -d3JhcHBlci5zdHlsZS5mb250U2l6ZSA9IHNpemUgKyAncHgnOwogICAgICAgIHdyYXBwZXIuYXBw -ZW5kQ2hpbGQoZnJhZyk7CiAgICAgICAgcmFuZ2UuaW5zZXJ0Tm9kZSh3cmFwcGVyKTsKICAgICAg -ICByYW5nZS5zZWxlY3ROb2RlQ29udGVudHMod3JhcHBlcik7CiAgICAgICAgc2VsLnJlbW92ZUFs -bFJhbmdlcygpOwogICAgICAgIHNlbC5hZGRSYW5nZShyYW5nZSk7CgogICAgICAgIGRvY3VtZW50 -LmdldEVsZW1lbnRCeUlkKCdmb250U2l6ZVNlbGVjdCcpLnZhbHVlID0gJyc7CiAgICAgICAgaW5w -dXQuZm9jdXMoKTsKICAgIH0sCgogICAgY29sb3IoY29sb3IpIHsKICAgICAgICBjb25zdCBpbnB1 -dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlZGl0b3JJbnB1dCcpOwogICAgICAgIGNvbnN0 -IHNlbCA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTsKICAgICAgICBsZXQgc2F2ZWRSYW5nZSA9IG51 -bGw7CiAgICAgICAgaWYgKHNlbC5yYW5nZUNvdW50ID4gMCkgc2F2ZWRSYW5nZSA9IHNlbC5nZXRS -YW5nZUF0KDApLmNsb25lUmFuZ2UoKTsKCiAgICAgICAgaW5wdXQuZm9jdXMoKTsKCiAgICAgICAg -aWYgKHNhdmVkUmFuZ2UgJiYgIXNhdmVkUmFuZ2UuY29sbGFwc2VkKSB7CiAgICAgICAgICAgIHNl -bC5yZW1vdmVBbGxSYW5nZXMoKTsKICAgICAgICAgICAgc2VsLmFkZFJhbmdlKHNhdmVkUmFuZ2Up -OwogICAgICAgICAgICBjb25zdCBmcmFnID0gc2F2ZWRSYW5nZS5leHRyYWN0Q29udGVudHMoKTsK -ICAgICAgICAgICAgLy8gQmVzdGVoZW5kZSBjb2xvci1TcGFucyBpbSBGcmFnbWVudCBhdWZsb2Vz -ZW4KICAgICAgICAgICAgZnJhZy5xdWVyeVNlbGVjdG9yQWxsKCdzcGFuJykuZm9yRWFjaChmdW5j -dGlvbihzKSB7CiAgICAgICAgICAgICAgICBpZiAocy5zdHlsZS5jb2xvciAmJiBzLnN0eWxlLmxl -bmd0aCA8PSAxKSB7CiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHMuZmlyc3RDaGlsZCkgcy5w -YXJlbnROb2RlLmluc2VydEJlZm9yZShzLmZpcnN0Q2hpbGQsIHMpOwogICAgICAgICAgICAgICAg -ICAgIHMucmVtb3ZlKCk7CiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHMuc3R5bGUuY29sb3Ip -IHsKICAgICAgICAgICAgICAgICAgICBzLnN0eWxlLnJlbW92ZVByb3BlcnR5KCdjb2xvcicpOwog -ICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgY29uc3Qgd3JhcHBl -ciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTsKICAgICAgICAgICAgd3JhcHBlci5z -dHlsZS5jb2xvciA9IGNvbG9yOwogICAgICAgICAgICB3cmFwcGVyLmFwcGVuZENoaWxkKGZyYWcp -OwogICAgICAgICAgICBzYXZlZFJhbmdlLmluc2VydE5vZGUod3JhcHBlcik7CiAgICAgICAgICAg -IHNhdmVkUmFuZ2Uuc2VsZWN0Tm9kZUNvbnRlbnRzKHdyYXBwZXIpOwogICAgICAgICAgICBzZWwu -cmVtb3ZlQWxsUmFuZ2VzKCk7CiAgICAgICAgICAgIHNlbC5hZGRSYW5nZShzYXZlZFJhbmdlKTsK -ICAgICAgICB9CiAgICAgICAgaW5wdXQuZm9jdXMoKTsKICAgIH0sCgogICAgLy8gLS0tIE1lZGlh -IFR5cGUgRGV0ZWN0aW9uIC0tLQogICAgLy8gLS0tIFBhc3RlOiBFeHRlcm5lIEJpbGRlciBsb2th -bCBzcGVpY2hlcm4gLS0tCgogICAgX3Bhc3RlVXBsb2FkSW5Qcm9ncmVzczogZmFsc2UsCgogICAg -YXN5bmMgX3Bhc3RlSW1hZ2VCbG9iKGJsb2IpIHsKICAgICAgICBpZiAoIXRoaXMuY3VycmVudERv -YyB8fCAhRHJpdmVGUy5jb25uZWN0ZWQpIHJldHVybjsKICAgICAgICBpZiAodGhpcy5fcGFzdGVV -cGxvYWRJblByb2dyZXNzKSByZXR1cm47IC8vIERvcHBlbC1FaW5mdWVnZW4gdmVyaGluZGVybgog -ICAgICAgIHRoaXMuX3Bhc3RlVXBsb2FkSW5Qcm9ncmVzcyA9IHRydWU7CiAgICAgICAgY29uc3Qg -ZG9jSWQgPSB0aGlzLmN1cnJlbnREb2MuaWQ7CiAgICAgICAgY29uc3QgZXh0ID0gYmxvYi50eXBl -LnNwbGl0KCcvJylbMV0gfHwgJ3BuZyc7CiAgICAgICAgY29uc3QgdHMgPSBEYXRlLm5vdygpOwog -ICAgICAgIGNvbnN0IGZpbGVuYW1lID0gJ3Bhc3RlXycgKyB0cyArICcuJyArIGV4dDsKICAgICAg -ICBjb25zdCBmaWxlID0gbmV3IEZpbGUoW2Jsb2JdLCBmaWxlbmFtZSwgeyB0eXBlOiBibG9iLnR5 -cGUgfSk7CgogICAgICAgIHRyeSB7CiAgICAgICAgICAgIHNob3dUb2FzdCgnQmlsZCB3aXJkIGdl -c3BlaWNoZXJ0Li4uJywgJ2luZm8nLCAzMDAwKTsKICAgICAgICAgICAgY29uc3QgcmVsUGF0aCA9 -IGF3YWl0IERyaXZlRlMudXBsb2FkTWVkaWEoZG9jSWQsIGZpbGUpOwogICAgICAgICAgICBjb25z -dCBtZWRpYUlkID0gdGhpcy5nZW5lcmF0ZU1lZGlhSWQoKTsKCiAgICAgICAgICAgIGlmICghdGhp -cy5jdXJyZW50RG9jLm1lZGlhcykgdGhpcy5jdXJyZW50RG9jLm1lZGlhcyA9IFtdOwogICAgICAg -ICAgICB0aGlzLmN1cnJlbnREb2MubWVkaWFzLnB1c2goewogICAgICAgICAgICAgICAgdHlwZTog -J2ltYWdlJywgdXJsOiByZWxQYXRoLCB0aXRsZTogZmlsZW5hbWUsCiAgICAgICAgICAgICAgICBk -ZXNjcmlwdGlvbjogJycsIGRpc3BsYXlNb2RlOiAnaW5saW5lJywKICAgICAgICAgICAgICAgIGFs -aWdubWVudDogJ2NlbnRlcicsIHNpemU6ICdsYXJnZScsIG1lZGlhSWQ6IG1lZGlhSWQKICAgICAg -ICAgICAgfSk7CgogICAgICAgICAgICBjb25zdCBmaWd1cmUgPSBkb2N1bWVudC5jcmVhdGVFbGVt -ZW50KCdmaWd1cmUnKTsKICAgICAgICAgICAgZmlndXJlLmNsYXNzTmFtZSA9ICdkcml2ZS1tZWRp -YSBtZWRpYS1sYXJnZSBtZWRpYS1jZW50ZXInOwogICAgICAgICAgICBmaWd1cmUuc2V0QXR0cmli -dXRlKCdkYXRhLW1lZGlhLWlkJywgbWVkaWFJZCk7CiAgICAgICAgICAgIGZpZ3VyZS5jb250ZW50 -RWRpdGFibGUgPSAnZmFsc2UnOwogICAgICAgICAgICBjb25zdCBpbWcgPSBkb2N1bWVudC5jcmVh -dGVFbGVtZW50KCdpbWcnKTsKICAgICAgICAgICAgaW1nLnNyYyA9IHJlbFBhdGg7CiAgICAgICAg -ICAgIGltZy5hbHQgPSBmaWxlbmFtZTsKICAgICAgICAgICAgZmlndXJlLmFwcGVuZENoaWxkKGlt -Zyk7CiAgICAgICAgICAgIGRvY3VtZW50LmV4ZWNDb21tYW5kKCdpbnNlcnRIVE1MJywgZmFsc2Us -IGZpZ3VyZS5vdXRlckhUTUwpOwogICAgICAgICAgICB0aGlzLl9yZW5kZXJNZWRpYUxpc3QoKTsK -ICAgICAgICAgICAgc2hvd1RvYXN0KCdCaWxkIGVpbmdlZsO8Z3QnLCAnc3VjY2VzcycpOwogICAg -ICAgIH0gY2F0Y2ggKGVycikgewogICAgICAgICAgICBzaG93VG9hc3QoJ0JpbGQga29ubnRlIG5p -Y2h0IGdlc3BlaWNoZXJ0IHdlcmRlbjogJyArIGVyci5tZXNzYWdlLCAnZXJyb3InKTsKICAgICAg -ICB9IGZpbmFsbHkgewogICAgICAgICAgICB0aGlzLl9wYXN0ZVVwbG9hZEluUHJvZ3Jlc3MgPSBm -YWxzZTsKICAgICAgICB9CiAgICB9LAoKICAgIGFzeW5jIF9wYXN0ZUh0bWxXaXRoRXh0ZXJuYWxJ -bWFnZXMoYm9keUVsLCBleHRlcm5hbEltZ3MpIHsKICAgICAgICBjb25zdCBkb2NJZCA9IHRoaXMu -Y3VycmVudERvYy5pZDsKICAgICAgICBpZiAoIXRoaXMuY3VycmVudERvYy5tZWRpYXMpIHRoaXMu -Y3VycmVudERvYy5tZWRpYXMgPSBbXTsKCiAgICAgICAgc2hvd1RvYXN0KCdFeHRlcm5lIEJpbGRl -ciB3ZXJkZW4gaGVydW50ZXJnZWxhZGVuICgnICsgZXh0ZXJuYWxJbWdzLmxlbmd0aCArICcpLi4u -JywgJ2luZm8nLCA0MDAwKTsKICAgICAgICBsZXQgc2F2ZWQgPSAwOwoKICAgICAgICBmb3IgKGNv -bnN0IGltZyBvZiBleHRlcm5hbEltZ3MpIHsKICAgICAgICAgICAgY29uc3Qgc3JjID0gaW1nLnNy -YzsKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgIC8vIEJpbGQgaGVydW50ZXJsYWRl -bjogSW0gU2VydmVyLU1vZHVzIHVlYmVyIFByb3h5ICh1bWdlaHQgQ09SUykKICAgICAgICAgICAg -ICAgIGxldCByZXNwb25zZTsKICAgICAgICAgICAgICAgIGlmIChEcml2ZUZTLm1vZGUgPT09ICdz -ZXJ2ZXInKSB7CiAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCgnL2Fw -aS9mZXRjaC1pbWFnZScsIHsKICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCcs -CiAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBs -aWNhdGlvbi9qc29uJyB9LAogICAgICAgICAgICAgICAgICAgICAgICBib2R5OiBKU09OLnN0cmlu -Z2lmeSh7IHVybDogc3JjIH0pCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAg -ICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goc3Jj -LCB7IG1vZGU6ICdjb3JzJyB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlm -ICghcmVzcG9uc2Uub2spIHsgaW1nLnJlbW92ZSgpOyBjb250aW51ZTsgfQogICAgICAgICAgICAg -ICAgY29uc3QgYmxvYiA9IGF3YWl0IHJlc3BvbnNlLmJsb2IoKTsKCiAgICAgICAgICAgICAgICAv -LyBOdXIgZWNodGUgQmlsZGVyIHZlcmFyYmVpdGVuIChrZWluZSAwLUJ5dGUgdHJhY2tpbmctcGl4 -ZWwgb2RlciBGZWhsZXIpCiAgICAgICAgICAgICAgICBpZiAoIWJsb2IudHlwZS5zdGFydHNXaXRo -KCdpbWFnZS8nKSB8fCBibG9iLnNpemUgPCAxMDApIHsKICAgICAgICAgICAgICAgICAgICBpbWcu -cmVtb3ZlKCk7CiAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICB9 -CgogICAgICAgICAgICAgICAgY29uc3QgZXh0ID0gYmxvYi50eXBlLnNwbGl0KCcvJylbMV0gfHwg -J3BuZyc7CiAgICAgICAgICAgICAgICBjb25zdCB0cyA9IERhdGUubm93KCkgKyAnXycgKyBzYXZl -ZDsKICAgICAgICAgICAgICAgIGNvbnN0IGZpbGVuYW1lID0gJ3dlYl8nICsgdHMgKyAnLicgKyBl -eHQ7CiAgICAgICAgICAgICAgICBjb25zdCBmaWxlID0gbmV3IEZpbGUoW2Jsb2JdLCBmaWxlbmFt -ZSwgeyB0eXBlOiBibG9iLnR5cGUgfSk7CgogICAgICAgICAgICAgICAgY29uc3QgcmVsUGF0aCA9 -IGF3YWl0IERyaXZlRlMudXBsb2FkTWVkaWEoZG9jSWQsIGZpbGUpOwogICAgICAgICAgICAgICAg -Y29uc3QgbWVkaWFJZCA9IHRoaXMuZ2VuZXJhdGVNZWRpYUlkKCk7CgogICAgICAgICAgICAgICAg -dGhpcy5jdXJyZW50RG9jLm1lZGlhcy5wdXNoKHsKICAgICAgICAgICAgICAgICAgICB0eXBlOiAn -aW1hZ2UnLCB1cmw6IHJlbFBhdGgsIHRpdGxlOiBmaWxlbmFtZSwKICAgICAgICAgICAgICAgICAg -ICBkZXNjcmlwdGlvbjogJycsIGRpc3BsYXlNb2RlOiAnaW5saW5lJywKICAgICAgICAgICAgICAg -ICAgICBhbGlnbm1lbnQ6ICcnLCBzaXplOiAnbGFyZ2UnLCBtZWRpYUlkOiBtZWRpYUlkCiAgICAg -ICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAvLyBmaWd1cmUtRWxlbWVudCBlcnN0ZWxs -ZW4gZGFtaXQgZXMgb2ZmbGluZSBmdW5rdGlvbmllcnQKICAgICAgICAgICAgICAgIGNvbnN0IGZp -Z3VyZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2ZpZ3VyZScpOwogICAgICAgICAgICAgICAg -ZmlndXJlLmNsYXNzTmFtZSA9ICdkcml2ZS1tZWRpYSBtZWRpYS1sYXJnZSc7CiAgICAgICAgICAg -ICAgICBmaWd1cmUuc2V0QXR0cmlidXRlKCdkYXRhLW1lZGlhLWlkJywgbWVkaWFJZCk7CiAgICAg -ICAgICAgICAgICBmaWd1cmUuY29udGVudEVkaXRhYmxlID0gJ2ZhbHNlJzsKICAgICAgICAgICAg -ICAgIGNvbnN0IG5ld0ltZyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2ltZycpOwogICAgICAg -ICAgICAgICAgbmV3SW1nLnNyYyA9IHJlbFBhdGg7CiAgICAgICAgICAgICAgICBuZXdJbWcuYWx0 -ID0gaW1nLmFsdCB8fCBmaWxlbmFtZTsKICAgICAgICAgICAgICAgIGZpZ3VyZS5hcHBlbmRDaGls -ZChuZXdJbWcpOwoKICAgICAgICAgICAgICAgIC8vIE9yaWdpbmFsIGltZyBkdXJjaCBmaWd1cmUg -ZXJzZXR6ZW4KICAgICAgICAgICAgICAgIGltZy5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChmaWd1 -cmUsIGltZyk7CiAgICAgICAgICAgICAgICBzYXZlZCsrOwogICAgICAgICAgICB9IGNhdGNoIHsK -ICAgICAgICAgICAgICAgIC8vIEJpbGQga29ubnRlIG5pY2h0IGdlbGFkZW4gd2VyZGVuIC0gZW50 -ZmVybmVuIHN0YXR0IGthcHV0dGUgUmVmZXJlbnoKICAgICAgICAgICAgICAgIGltZy5yZW1vdmUo -KTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLy8gQmVyZWluaWd0ZXMgSFRNTCBl -aW5mdWVnZW4KICAgICAgICBkb2N1bWVudC5leGVjQ29tbWFuZCgnaW5zZXJ0SFRNTCcsIGZhbHNl -LCBib2R5RWwuaW5uZXJIVE1MKTsKICAgICAgICB0aGlzLl9yZW5kZXJNZWRpYUxpc3QoKTsKICAg -ICAgICBpZiAoc2F2ZWQgPiAwKSB7CiAgICAgICAgICAgIHNob3dUb2FzdChzYXZlZCArICcgQmls -ZCcgKyAoc2F2ZWQgPiAxID8gJ2VyJyA6ICcnKSArICcgbG9rYWwgZ2VzcGVpY2hlcnQnLCAnc3Vj -Y2VzcycpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHNob3dUb2FzdCgnS2VpbmUgQmls -ZGVyIGtvbm50ZW4gaGVydW50ZXJnZWxhZGVuIHdlcmRlbiAoZXZ0bC4gQ09SUy1TY2h1dHopJywg -J3dhcm5pbmcnKTsKICAgICAgICB9CiAgICB9LAoKICAgIGRldGVjdE1lZGlhVHlwZShmaWxlKSB7 -CiAgICAgICAgaWYgKGZpbGUudHlwZS5zdGFydHNXaXRoKCdpbWFnZS8nKSkgcmV0dXJuICdpbWFn -ZSc7CiAgICAgICAgaWYgKGZpbGUudHlwZS5zdGFydHNXaXRoKCd2aWRlby8nKSkgcmV0dXJuICd2 -aWRlbyc7CiAgICAgICAgaWYgKGZpbGUudHlwZS5zdGFydHNXaXRoKCdhdWRpby8nKSkgcmV0dXJu -ICdhdWRpbyc7CiAgICAgICAgaWYgKGZpbGUudHlwZSA9PT0gJ2FwcGxpY2F0aW9uL3BkZicpIHJl -dHVybiAncGRmJzsKICAgICAgICBjb25zdCBleHQgPSBmaWxlLm5hbWUuc3BsaXQoJy4nKS5wb3Ao -KS50b0xvd2VyQ2FzZSgpOwogICAgICAgIGlmIChleHQgPT09ICdkb2N4JykgcmV0dXJuICdkb2N4 -JzsKICAgICAgICBpZiAoZXh0ID09PSAneGxzeCcpIHJldHVybiAneGxzeCc7CiAgICAgICAgaWYg -KGV4dCA9PT0gJ3BwdHgnKSByZXR1cm4gJ3BwdHgnOwogICAgICAgIHJldHVybiAnZmlsZSc7CiAg -ICB9LAoKICAgIGdlbmVyYXRlTWVkaWFJZCgpIHsKICAgICAgICBpZiAoIXRoaXMuY3VycmVudERv -YyB8fCAhdGhpcy5jdXJyZW50RG9jLm1lZGlhcykgcmV0dXJuICdtMDAxJzsKICAgICAgICBsZXQg -bWF4ID0gMDsKICAgICAgICB0aGlzLmN1cnJlbnREb2MubWVkaWFzLmZvckVhY2gobSA9PiB7CiAg -ICAgICAgICAgIGlmIChtLm1lZGlhSWQpIHsKICAgICAgICAgICAgICAgIGNvbnN0IG4gPSBwYXJz -ZUludChtLm1lZGlhSWQucmVwbGFjZSgnbScsICcnKSwgMTApOwogICAgICAgICAgICAgICAgaWYg -KG4gPiBtYXgpIG1heCA9IG47CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKICAgICAgICByZXR1 -cm4gJ20nICsgU3RyaW5nKG1heCArIDEpLnBhZFN0YXJ0KDMsICcwJyk7CiAgICB9LAoKICAgIC8v -IC0tLSBVcGxvYWQgRGlhbG9nIC0tLQogICAgX3BlbmRpbmdGaWxlczogW10sCiAgICBfcGVuZGlu -Z0luZGV4OiAwLAogICAgX3VwbG9hZE9wdGlvbnM6IHsgZGlzcGxheU1vZGU6ICdhdHRhY2htZW50 -JywgYWxpZ246ICdjZW50ZXInLCBzaXplOiAndGh1bWJuYWlsJyB9LAogICAgX3NhdmVkRWRpdG9y -UmFuZ2U6IG51bGwsCgogICAgLy8gVXBsb2FkLUVpbnN0aWVncy1Nb2RhbCBtaXQgRHJhZyZEcm9w -IHVuZCBFcmtsYWVydW5nIG9lZmZuZW4KICAgIHNob3dVcGxvYWRNb2RhbCgpIHsKICAgICAgICBp -ZiAoIXRoaXMuY3VycmVudERvYyB8fCAhRHJpdmVGUy5jb25uZWN0ZWQpIHsKICAgICAgICAgICAg -c2hvd1RvYXN0KCdCaXR0ZSB6dWVyc3QgZWluIERva3VtZW50IMO2ZmZuZW4nLCAnd2FybmluZycp -OwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIC8vIEN1cnNvci1Qb3NpdGlv -biBtZXJrZW4KICAgICAgICBjb25zdCBzZWwgPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7CiAgICAg -ICAgaWYgKHNlbC5yYW5nZUNvdW50ID4gMCkgewogICAgICAgICAgICB0aGlzLl9zYXZlZEVkaXRv -clJhbmdlID0gc2VsLmdldFJhbmdlQXQoMCkuY2xvbmVSYW5nZSgpOwogICAgICAgIH0KICAgICAg -ICBjb25zdCBtb2RhbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtZWRpYVVwbG9hZFN0YXJ0 -TW9kYWwnKTsKICAgICAgICBtb2RhbC5jbGFzc0xpc3QuYWRkKCdhY3RpdmUnKTsKCiAgICAgICAg -Ly8gRHJhZyAmIERyb3AgU2V0dXAgKG51ciBlaW5tYWwpCiAgICAgICAgY29uc3QgZHJvcFpvbmUg -PSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndXBsb2FkRHJvcFpvbmUnKTsKICAgICAgICBpZiAo -IWRyb3Bab25lLl9kcmFnU2V0dXApIHsKICAgICAgICAgICAgZHJvcFpvbmUuX2RyYWdTZXR1cCA9 -IHRydWU7CiAgICAgICAgICAgIGRyb3Bab25lLmFkZEV2ZW50TGlzdGVuZXIoJ2RyYWdvdmVyJywg -KGUpID0+IHsgZS5wcmV2ZW50RGVmYXVsdCgpOyBkcm9wWm9uZS5jbGFzc0xpc3QuYWRkKCdkcmFn -LW92ZXInKTsgfSk7CiAgICAgICAgICAgIGRyb3Bab25lLmFkZEV2ZW50TGlzdGVuZXIoJ2RyYWds -ZWF2ZScsICgpID0+IHsgZHJvcFpvbmUuY2xhc3NMaXN0LnJlbW92ZSgnZHJhZy1vdmVyJyk7IH0p -OwogICAgICAgICAgICBkcm9wWm9uZS5hZGRFdmVudExpc3RlbmVyKCdkcm9wJywgKGUpID0+IHsK -ICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgIGRyb3Ba -b25lLmNsYXNzTGlzdC5yZW1vdmUoJ2RyYWctb3ZlcicpOwogICAgICAgICAgICAgICAgY29uc3Qg -ZmlsZXMgPSBBcnJheS5mcm9tKGUuZGF0YVRyYW5zZmVyLmZpbGVzKS5maWx0ZXIoZiA9PiB7CiAg -ICAgICAgICAgICAgICAgICAgY29uc3QgZXh0ID0gZi5uYW1lLnNwbGl0KCcuJykucG9wKCkudG9M -b3dlckNhc2UoKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZi50eXBlLnN0YXJ0c1dpdGgo -J2ltYWdlLycpIHx8IGYudHlwZS5zdGFydHNXaXRoKCd2aWRlby8nKSB8fCBmLnR5cGUuc3RhcnRz -V2l0aCgnYXVkaW8vJykgfHwKICAgICAgICAgICAgICAgICAgICAgICAgZi50eXBlID09PSAnYXBw -bGljYXRpb24vcGRmJyB8fCBbJ2RvY3gnLCd4bHN4JywncHB0eCddLmluY2x1ZGVzKGV4dCk7CiAg -ICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIGlmIChmaWxlcy5sZW5ndGggPT09IDAp -IHsKICAgICAgICAgICAgICAgICAgICBzaG93VG9hc3QoJ0RhdGVpdHlwIG5pY2h0IHVudGVyc3TD -vHR6dCcsICd3YXJuaW5nJyk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAg -ICAgICAgfQogICAgICAgICAgICAgICAgRHJpdmVFZGl0b3IuX3N0YXJ0RmlsZXNVcGxvYWQoZmls -ZXMpOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgLy8gS2xpY2sgYXVmIFpvbmUgPSBEYXRl -aWF1c3dhaGwKICAgICAgICAgICAgZHJvcFpvbmUuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAo -ZSkgPT4gewogICAgICAgICAgICAgICAgaWYgKGUudGFyZ2V0LnRhZ05hbWUgIT09ICdCVVRUT04n -KSBEcml2ZUVkaXRvci51cGxvYWRNZWRpYSgpOwogICAgICAgICAgICB9KTsKICAgICAgICB9CiAg -ICB9LAoKICAgIGNsb3NlVXBsb2FkU3RhcnRNb2RhbCgpIHsKICAgICAgICBkb2N1bWVudC5nZXRF -bGVtZW50QnlJZCgnbWVkaWFVcGxvYWRTdGFydE1vZGFsJykuY2xhc3NMaXN0LnJlbW92ZSgnYWN0 -aXZlJyk7CiAgICB9LAoKICAgIC8vIERhdGVpYXVzd2FobC1EaWFsb2cgKG5hdGl2KSBvZWZmbmVu -CiAgICB1cGxvYWRNZWRpYSgpIHsKICAgICAgICBpZiAoIXRoaXMuY3VycmVudERvYyB8fCAhRHJp -dmVGUy5jb25uZWN0ZWQpIHsKICAgICAgICAgICAgc2hvd1RvYXN0KCdCaXR0ZSB6dWVyc3QgZWlu -IERva3VtZW50IMO2ZmZuZW4nLCAnd2FybmluZycpOwogICAgICAgICAgICByZXR1cm47CiAgICAg -ICAgfQoKICAgICAgICBjb25zdCBmaWxlSW5wdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdp -bnB1dCcpOwogICAgICAgIGZpbGVJbnB1dC50eXBlID0gJ2ZpbGUnOwogICAgICAgIGZpbGVJbnB1 -dC5hY2NlcHQgPSAnaW1hZ2UvKix2aWRlby8qLGF1ZGlvLyosLnBkZiwuZG9jeCwueGxzeCwucHB0 -eCc7CiAgICAgICAgZmlsZUlucHV0Lm11bHRpcGxlID0gdHJ1ZTsKCiAgICAgICAgZmlsZUlucHV0 -Lm9uY2hhbmdlID0gKGUpID0+IHsKICAgICAgICAgICAgY29uc3QgZmlsZXMgPSBBcnJheS5mcm9t -KGUudGFyZ2V0LmZpbGVzKTsKICAgICAgICAgICAgaWYgKGZpbGVzLmxlbmd0aCA9PT0gMCkgcmV0 -dXJuOwogICAgICAgICAgICB0aGlzLl9zdGFydEZpbGVzVXBsb2FkKGZpbGVzKTsKICAgICAgICB9 -OwoKICAgICAgICBmaWxlSW5wdXQuY2xpY2soKTsKICAgIH0sCgogICAgLy8gR2VtZWluc2FtZXIg -RWluc3RpZWc6IERhdGVpZW4gaW4gRm9ybWF0aWVydW5ncy1RdWV1ZSBzdGVsbGVuCiAgICBfc3Rh -cnRGaWxlc1VwbG9hZChmaWxlcykgewogICAgICAgIC8vIEN1cnNvci1Qb3NpdGlvbiBtZXJrZW4g -ZmFsbHMgbm9jaCBuaWNodCBnZXNjaGVoZW4KICAgICAgICBpZiAoIXRoaXMuX3NhdmVkRWRpdG9y -UmFuZ2UpIHsKICAgICAgICAgICAgY29uc3Qgc2VsID0gd2luZG93LmdldFNlbGVjdGlvbigpOwog -ICAgICAgICAgICBpZiAoc2VsLnJhbmdlQ291bnQgPiAwKSB7CiAgICAgICAgICAgICAgICB0aGlz -Ll9zYXZlZEVkaXRvclJhbmdlID0gc2VsLmdldFJhbmdlQXQoMCkuY2xvbmVSYW5nZSgpOwogICAg -ICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHRoaXMuX3BlbmRpbmdGaWxlcyA9IGZpbGVzOwog -ICAgICAgIHRoaXMuX3BlbmRpbmdJbmRleCA9IDA7CiAgICAgICAgLy8gRWluc3RpZWdzLU1vZGFs -IHNjaGxpZXNzZW4sIEZvcm1hdGllcnVuZ3MtRGlhbG9nIG9lZmZuZW4KICAgICAgICB0aGlzLmNs -b3NlVXBsb2FkU3RhcnRNb2RhbCgpOwogICAgICAgIHRoaXMuc2hvd1VwbG9hZERpYWxvZygpOwog -ICAgfSwKCiAgICBzaG93VXBsb2FkRGlhbG9nKCkgewogICAgICAgIGlmICh0aGlzLl9wZW5kaW5n -SW5kZXggPj0gdGhpcy5fcGVuZGluZ0ZpbGVzLmxlbmd0aCkgewogICAgICAgICAgICB0aGlzLmNs -b3NlVXBsb2FkRGlhbG9nKCk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAg -IGNvbnN0IGZpbGUgPSB0aGlzLl9wZW5kaW5nRmlsZXNbdGhpcy5fcGVuZGluZ0luZGV4XTsKICAg -ICAgICBjb25zdCB0eXBlID0gdGhpcy5kZXRlY3RNZWRpYVR5cGUoZmlsZSk7CiAgICAgICAgY29u -c3QgcmVtYWluaW5nID0gdGhpcy5fcGVuZGluZ0ZpbGVzLmxlbmd0aCAtIHRoaXMuX3BlbmRpbmdJ -bmRleDsKCiAgICAgICAgLy8gUmVzZXQgb3B0aW9ucwogICAgICAgIHRoaXMuX3VwbG9hZE9wdGlv -bnMgPSB7IGRpc3BsYXlNb2RlOiAnYXR0YWNobWVudCcsIGFsaWduOiAnY2VudGVyJywgc2l6ZTog -J3RodW1ibmFpbCcgfTsKCiAgICAgICAgLy8gSGVhZGVyIG1pdCBGb3J0c2Nocml0dAogICAgICAg -IGNvbnN0IHRpdGxlRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndXBsb2FkRGlhbG9nVGl0 -bGUnKTsKICAgICAgICBpZiAodGhpcy5fcGVuZGluZ0ZpbGVzLmxlbmd0aCA+IDEpIHsKICAgICAg -ICAgICAgdGl0bGVFbC5pbm5lckhUTUwgPSAnRGF0ZWkga29uZmlndXJpZXJlbiA8c3BhbiBzdHls -ZT0iZm9udC13ZWlnaHQ6NDAwO2ZvbnQtc2l6ZToxM3B4O29wYWNpdHk6MC44OyI+KCcgKyAodGhp -cy5fcGVuZGluZ0luZGV4ICsgMSkgKyAnIHZvbiAnICsgdGhpcy5fcGVuZGluZ0ZpbGVzLmxlbmd0 -aCArICcpPC9zcGFuPic7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgdGl0bGVFbC50ZXh0 -Q29udGVudCA9ICdEYXRlaSBrb25maWd1cmllcmVuJzsKICAgICAgICB9CgogICAgICAgIC8vIFBy -ZXZpZXcgbWl0IERhdGVpaW5mbwogICAgICAgIGNvbnN0IHByZXZpZXcgPSBkb2N1bWVudC5nZXRF -bGVtZW50QnlJZCgndXBsb2FkUHJldmlldycpOwogICAgICAgIGNvbnN0IGZpbGVTaXplTUIgPSAo -ZmlsZS5zaXplIC8gKDEwMjQgKiAxMDI0KSkudG9GaXhlZCgxKTsKICAgICAgICBjb25zdCBmaWxl -U2l6ZVRleHQgPSBmaWxlLnNpemUgPCAxMDI0KjEwMjQKICAgICAgICAgICAgPyBNYXRoLnJvdW5k -KGZpbGUuc2l6ZSAvIDEwMjQpICsgJyBLQicKICAgICAgICAgICAgOiBmaWxlU2l6ZU1CICsgJyBN -Qic7CiAgICAgICAgY29uc3QgZmlsZUluZm9IdG1sID0gJzxwIHN0eWxlPSJtYXJnaW4tdG9wOjhw -eDtjb2xvcjp2YXIoLS10ZXh0LW11dGVkKTtmb250LXNpemU6MTJweDsiPicgKwogICAgICAgICAg -ICBEcml2ZVBvcnRhbC5lc2NhcGVIVE1MKGZpbGUubmFtZSkgKyAnICgnICsgZmlsZVNpemVUZXh0 -ICsgJyk8L3A+JzsKCiAgICAgICAgaWYgKHR5cGUgPT09ICdpbWFnZScpIHsKICAgICAgICAgICAg -Y29uc3QgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTsKICAgICAgICAgICAgcmVhZGVyLm9ubG9h -ZCA9IChlKSA9PiB7IHByZXZpZXcuaW5uZXJIVE1MID0gJzxpbWcgc3JjPSInICsgZS50YXJnZXQu -cmVzdWx0ICsgJyI+JyArIGZpbGVJbmZvSHRtbDsgfTsKICAgICAgICAgICAgcmVhZGVyLnJlYWRB -c0RhdGFVUkwoZmlsZSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgY29uc3QgaWNvbkNs -YXNzID0gdHlwZTsKICAgICAgICAgICAgY29uc3QgbGFiZWwgPSB0eXBlLnRvVXBwZXJDYXNlKCk7 -CiAgICAgICAgICAgIHByZXZpZXcuaW5uZXJIVE1MID0gJzxzcGFuIGNsYXNzPSJkcml2ZS1maWxl -LWljb24gJyArIGljb25DbGFzcyArICciIHN0eWxlPSJ3aWR0aDo2MHB4O2hlaWdodDo2MHB4O2Zv -bnQtc2l6ZToxOHB4O21hcmdpbjoxMHB4IGF1dG87Ij4nICsgbGFiZWwgKyAnPC9zcGFuPicgKyBm -aWxlSW5mb0h0bWw7CiAgICAgICAgfQoKICAgICAgICAvLyBUaXRsZSArIENhcHRpb24KICAgICAg -ICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndXBsb2FkVGl0bGUnKS52YWx1ZSA9IGZpbGUubmFt -ZS5yZXBsYWNlKC9cLlteLl0rJC8sICcnKTsKICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJ -ZCgndXBsb2FkQ2FwdGlvbicpLnZhbHVlID0gJyc7CgogICAgICAgIC8vIERpc3BsYXkgbW9kZSBv -cHRpb25zICh0eXBlLWRlcGVuZGVudCkKICAgICAgICBjb25zdCBkaXNwbGF5R3JvdXAgPSBkb2N1 -bWVudC5nZXRFbGVtZW50QnlJZCgndXBsb2FkRGlzcGxheU9wdGlvbnMnKTsKICAgICAgICBsZXQg -b3B0aW9ucyA9ICc8YnV0dG9uIGNsYXNzPSJ1cGxvYWQtb3B0aW9uLWJ0biBhY3RpdmUiIGRhdGEt -ZGlzcGxheT0iYXR0YWNobWVudCIgb25jbGljaz0iRHJpdmVFZGl0b3Iuc2V0VXBsb2FkT3B0aW9u -KFwnZGlzcGxheVwnLHRoaXMpIj5Bbmhhbmc8L2J1dHRvbj4nOwoKICAgICAgICBpZiAodHlwZSA9 -PT0gJ2ltYWdlJykgewogICAgICAgICAgICBvcHRpb25zICs9ICc8YnV0dG9uIGNsYXNzPSJ1cGxv -YWQtb3B0aW9uLWJ0biIgZGF0YS1kaXNwbGF5PSJpbmxpbmUiIG9uY2xpY2s9IkRyaXZlRWRpdG9y -LnNldFVwbG9hZE9wdGlvbihcJ2Rpc3BsYXlcJyx0aGlzKSI+SW0gQXJ0aWtlbDwvYnV0dG9uPic7 -CiAgICAgICAgfSBlbHNlIGlmICh0eXBlID09PSAncGRmJykgewogICAgICAgICAgICBvcHRpb25z -ICs9ICc8YnV0dG9uIGNsYXNzPSJ1cGxvYWQtb3B0aW9uLWJ0biIgZGF0YS1kaXNwbGF5PSJwZGYt -bGluayIgb25jbGljaz0iRHJpdmVFZGl0b3Iuc2V0VXBsb2FkT3B0aW9uKFwnZGlzcGxheVwnLHRo -aXMpIj5QREYtTGluayBpbSBBcnRpa2VsPC9idXR0b24+JzsKICAgICAgICAgICAgb3B0aW9ucyAr -PSAnPGJ1dHRvbiBjbGFzcz0idXBsb2FkLW9wdGlvbi1idG4iIGRhdGEtZGlzcGxheT0icGRmLWlm -cmFtZSIgb25jbGljaz0iRHJpdmVFZGl0b3Iuc2V0VXBsb2FkT3B0aW9uKFwnZGlzcGxheVwnLHRo -aXMpIj5QREYgZWluZ2ViZXR0ZXQ8L2J1dHRvbj4nOwogICAgICAgIH0gZWxzZSBpZiAodHlwZSA9 -PT0gJ3ZpZGVvJyB8fCB0eXBlID09PSAnYXVkaW8nKSB7CiAgICAgICAgICAgIG9wdGlvbnMgKz0g -JzxidXR0b24gY2xhc3M9InVwbG9hZC1vcHRpb24tYnRuIiBkYXRhLWRpc3BsYXk9Im1lZGlhLWlu -bGluZSIgb25jbGljaz0iRHJpdmVFZGl0b3Iuc2V0VXBsb2FkT3B0aW9uKFwnZGlzcGxheVwnLHRo -aXMpIj5JbSBBcnRpa2VsPC9idXR0b24+JzsKICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdk -b2N4JyB8fCB0eXBlID09PSAneGxzeCcgfHwgdHlwZSA9PT0gJ3BwdHgnKSB7CiAgICAgICAgICAg -IG9wdGlvbnMgKz0gJzxidXR0b24gY2xhc3M9InVwbG9hZC1vcHRpb24tYnRuIiBkYXRhLWRpc3Bs -YXk9Im9mZmljZS1pbmxpbmUiIG9uY2xpY2s9IkRyaXZlRWRpdG9yLnNldFVwbG9hZE9wdGlvbihc -J2Rpc3BsYXlcJyx0aGlzKSI+SW0gQXJ0aWtlbDwvYnV0dG9uPic7CiAgICAgICAgfQoKICAgICAg -ICBkaXNwbGF5R3JvdXAuaW5uZXJIVE1MID0gb3B0aW9uczsKCiAgICAgICAgLy8gSGlkZSBpbWFn -ZS1zcGVjaWZpYyBvcHRpb25zIGluaXRpYWxseQogICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRC -eUlkKCd1cGxvYWRBbGlnbkdyb3VwJykuc3R5bGUuZGlzcGxheSA9ICdub25lJzsKICAgICAgICBk -b2N1bWVudC5nZXRFbGVtZW50QnlJZCgndXBsb2FkU2l6ZUdyb3VwJykuc3R5bGUuZGlzcGxheSA9 -ICdub25lJzsKCiAgICAgICAgLy8gQ29uZmlybS1CdXR0b24gQmVzY2hyaWZ0dW5nCiAgICAgICAg -Y29uc3QgY29uZmlybUJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd1cGxvYWRDb25maXJt -QnRuJyk7CiAgICAgICAgaWYgKHRoaXMuX3BlbmRpbmdJbmRleCA8IHRoaXMuX3BlbmRpbmdGaWxl -cy5sZW5ndGggLSAxKSB7CiAgICAgICAgICAgIGNvbmZpcm1CdG4udGV4dENvbnRlbnQgPSAnRWlu -ZsO8Z2VuICYgbsOkY2hzdGUgRGF0ZWknOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGNv -bmZpcm1CdG4udGV4dENvbnRlbnQgPSAnRWluZsO8Z2VuJzsKICAgICAgICB9CgogICAgICAgIC8v -IFNob3cgZGlhbG9nCiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21lZGlhVXBsb2Fk -RGlhbG9nJykuY2xhc3NMaXN0LmFkZCgnYWN0aXZlJyk7CiAgICB9LAoKICAgIHNldFVwbG9hZE9w -dGlvbihncm91cCwgYnRuKSB7CiAgICAgICAgLy8gVG9nZ2xlIGFjdGl2ZSBpbiBncm91cAogICAg -ICAgIGJ0bi5wYXJlbnRFbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy51cGxvYWQtb3B0aW9uLWJ0 -bicpLmZvckVhY2goYiA9PiBiLmNsYXNzTGlzdC5yZW1vdmUoJ2FjdGl2ZScpKTsKICAgICAgICBi -dG4uY2xhc3NMaXN0LmFkZCgnYWN0aXZlJyk7CgogICAgICAgIGlmIChncm91cCA9PT0gJ2Rpc3Bs -YXknKSB7CiAgICAgICAgICAgIGNvbnN0IG1vZGUgPSBidG4uZ2V0QXR0cmlidXRlKCdkYXRhLWRp -c3BsYXknKTsKICAgICAgICAgICAgdGhpcy5fdXBsb2FkT3B0aW9ucy5kaXNwbGF5TW9kZSA9IG1v -ZGU7CiAgICAgICAgICAgIGNvbnN0IGlzSW5saW5lSW1hZ2UgPSAobW9kZSA9PT0gJ2lubGluZScp -OwogICAgICAgICAgICBjb25zdCBpc0lubGluZVBkZiA9IChtb2RlID09PSAncGRmLWxpbmsnIHx8 -IG1vZGUgPT09ICdwZGYtaWZyYW1lJyk7CiAgICAgICAgICAgIGNvbnN0IGlzSW5saW5lTWVkaWEg -PSAobW9kZSA9PT0gJ21lZGlhLWlubGluZScgfHwgbW9kZSA9PT0gJ29mZmljZS1pbmxpbmUnKTsK -ICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3VwbG9hZEFsaWduR3JvdXAnKS5z -dHlsZS5kaXNwbGF5ID0gKGlzSW5saW5lSW1hZ2UgfHwgaXNJbmxpbmVQZGYgfHwgaXNJbmxpbmVN -ZWRpYSkgPyAnJyA6ICdub25lJzsKICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQo -J3VwbG9hZFNpemVHcm91cCcpLnN0eWxlLmRpc3BsYXkgPSBpc0lubGluZUltYWdlID8gJycgOiAn -bm9uZSc7CiAgICAgICAgfSBlbHNlIGlmIChncm91cCA9PT0gJ2FsaWduJykgewogICAgICAgICAg -ICB0aGlzLl91cGxvYWRPcHRpb25zLmFsaWduID0gYnRuLmdldEF0dHJpYnV0ZSgnZGF0YS1hbGln -bicpOwogICAgICAgIH0gZWxzZSBpZiAoZ3JvdXAgPT09ICdzaXplJykgewogICAgICAgICAgICB0 -aGlzLl91cGxvYWRPcHRpb25zLnNpemUgPSBidG4uZ2V0QXR0cmlidXRlKCdkYXRhLXNpemUnKTsK -ICAgICAgICB9CiAgICB9LAoKICAgIGNsb3NlVXBsb2FkRGlhbG9nKCkgewogICAgICAgIGlmICh0 -aGlzLl91cGxvYWRJblByb2dyZXNzKSByZXR1cm47IC8vIExhdWZlbmRlbiBVcGxvYWQgbmljaHQg -YWJicmVjaGVuCiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21lZGlhVXBsb2FkRGlh -bG9nJykuY2xhc3NMaXN0LnJlbW92ZSgnYWN0aXZlJyk7CiAgICAgICAgdGhpcy5fcGVuZGluZ0Zp -bGVzID0gW107CiAgICAgICAgdGhpcy5fcGVuZGluZ0luZGV4ID0gMDsKICAgICAgICB0aGlzLl9z -aG93VXBsb2FkUHJvZ3Jlc3MoZmFsc2UpOwogICAgfSwKCiAgICBfdXBsb2FkSW5Qcm9ncmVzczog -ZmFsc2UsCgogICAgX2Zvcm1hdEJ5dGVzKGJ5dGVzKSB7CiAgICAgICAgaWYgKGJ5dGVzIDwgMTAy -NCkgcmV0dXJuIGJ5dGVzICsgJyBCJzsKICAgICAgICBpZiAoYnl0ZXMgPCAxMDI0ICogMTAyNCkg -cmV0dXJuIChieXRlcyAvIDEwMjQpLnRvRml4ZWQoMCkgKyAnIEtCJzsKICAgICAgICByZXR1cm4g -KGJ5dGVzIC8gKDEwMjQgKiAxMDI0KSkudG9GaXhlZCgxKSArICcgTUInOwogICAgfSwKCiAgICBf -c2hvd1VwbG9hZFByb2dyZXNzKHNob3cpIHsKICAgICAgICB2YXIgY29udGFpbmVyID0gZG9jdW1l -bnQuZ2V0RWxlbWVudEJ5SWQoJ3VwbG9hZFByb2dyZXNzQ29udGFpbmVyJyk7CiAgICAgICAgdmFy -IGJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd1cGxvYWRDb25maXJtQnRuJyk7CiAgICAg -ICAgaWYgKGNvbnRhaW5lcikgY29udGFpbmVyLnN0eWxlLmRpc3BsYXkgPSBzaG93ID8gJycgOiAn -bm9uZSc7CiAgICAgICAgaWYgKGJ0bikgewogICAgICAgICAgICBidG4uZGlzYWJsZWQgPSBzaG93 -OwogICAgICAgICAgICBidG4udGV4dENvbnRlbnQgPSBzaG93ID8gJ1dpcmQgaG9jaGdlbGFkZW4u -Li4nIDogJ0VpbmbDvGdlbic7CiAgICAgICAgICAgIGJ0bi5zdHlsZS5vcGFjaXR5ID0gc2hvdyA/ -ICcwLjUnIDogJyc7CiAgICAgICAgICAgIGJ0bi5zdHlsZS5jdXJzb3IgPSBzaG93ID8gJ25vdC1h -bGxvd2VkJyA6ICcnOwogICAgICAgIH0KICAgICAgICBpZiAoc2hvdykgewogICAgICAgICAgICB2 -YXIgYmFyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3VwbG9hZFByb2dyZXNzQmFyJyk7CiAg -ICAgICAgICAgIHZhciBwY3QgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndXBsb2FkUHJvZ3Jl -c3NQY3QnKTsKICAgICAgICAgICAgdmFyIHNpemVFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlk -KCd1cGxvYWRQcm9ncmVzc1NpemUnKTsKICAgICAgICAgICAgaWYgKGJhcikgYmFyLnN0eWxlLndp -ZHRoID0gJzAlJzsKICAgICAgICAgICAgaWYgKHBjdCkgcGN0LnRleHRDb250ZW50ID0gJzAlJzsK -ICAgICAgICAgICAgaWYgKHNpemVFbCkgc2l6ZUVsLnRleHRDb250ZW50ID0gJyc7CiAgICAgICAg -fQogICAgfSwKCiAgICBhc3luYyBjb25maXJtVXBsb2FkKCkgewogICAgICAgIGNvbnN0IGZpbGUg -PSB0aGlzLl9wZW5kaW5nRmlsZXNbdGhpcy5fcGVuZGluZ0luZGV4XTsKICAgICAgICBpZiAoIWZp -bGUgfHwgdGhpcy5fdXBsb2FkSW5Qcm9ncmVzcykgcmV0dXJuOwoKICAgICAgICBjb25zdCB0eXBl -ID0gdGhpcy5kZXRlY3RNZWRpYVR5cGUoZmlsZSk7CiAgICAgICAgY29uc3QgdGl0bGUgPSBkb2N1 -bWVudC5nZXRFbGVtZW50QnlJZCgndXBsb2FkVGl0bGUnKS52YWx1ZS50cmltKCkgfHwgZmlsZS5u -YW1lOwogICAgICAgIGNvbnN0IGNhcHRpb24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndXBs -b2FkQ2FwdGlvbicpLnZhbHVlLnRyaW0oKTsKICAgICAgICBjb25zdCBvcHRzID0gdGhpcy5fdXBs -b2FkT3B0aW9uczsKICAgICAgICBjb25zdCBtZWRpYUlkID0gdGhpcy5nZW5lcmF0ZU1lZGlhSWQo -KTsKICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CgogICAgICAgIC8vIFVwbG9hZC1VSTogQnV0dG9u -IGRlYWt0aXZpZXJlbiArIEZvcnRzY2hyaXR0c2JhbGtlbiBhbnplaWdlbgogICAgICAgIHRoaXMu -X3VwbG9hZEluUHJvZ3Jlc3MgPSB0cnVlOwogICAgICAgIHRoaXMuX3Nob3dVcGxvYWRQcm9ncmVz -cyh0cnVlKTsKCiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgLy8gVXBsb2FkIGZpbGUgbWl0IEZv -cnRzY2hyaXR0c2FuemVpZ2UKICAgICAgICAgICAgY29uc3QgcmVsUGF0aCA9IGF3YWl0IERyaXZl -RlMudXBsb2FkTWVkaWEodGhpcy5jdXJyZW50RG9jLmlkLCBmaWxlLCBmdW5jdGlvbihwY3QsIGxv -YWRlZCwgdG90YWwpIHsKICAgICAgICAgICAgICAgIHZhciBiYXIgPSBkb2N1bWVudC5nZXRFbGVt -ZW50QnlJZCgndXBsb2FkUHJvZ3Jlc3NCYXInKTsKICAgICAgICAgICAgICAgIHZhciBwY3RFbCA9 -IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd1cGxvYWRQcm9ncmVzc1BjdCcpOwogICAgICAgICAg -ICAgICAgdmFyIHNpemVFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd1cGxvYWRQcm9ncmVz -c1NpemUnKTsKICAgICAgICAgICAgICAgIHZhciBsYWJlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRC -eUlkKCd1cGxvYWRQcm9ncmVzc0xhYmVsJyk7CiAgICAgICAgICAgICAgICBpZiAoYmFyKSBiYXIu -c3R5bGUud2lkdGggPSBwY3QgKyAnJSc7CiAgICAgICAgICAgICAgICBpZiAocGN0RWwpIHBjdEVs -LnRleHRDb250ZW50ID0gcGN0ICsgJyUnOwogICAgICAgICAgICAgICAgaWYgKHNpemVFbCkgc2l6 -ZUVsLnRleHRDb250ZW50ID0gc2VsZi5fZm9ybWF0Qnl0ZXMobG9hZGVkKSArICcgLyAnICsgc2Vs -Zi5fZm9ybWF0Qnl0ZXModG90YWwpOwogICAgICAgICAgICAgICAgaWYgKGxhYmVsICYmIHBjdCA+ -PSAxMDApIGxhYmVsLnRleHRDb250ZW50ID0gJ1dpcmQgdmVyYXJiZWl0ZXQuLi4nOwogICAgICAg -ICAgICB9KTsKCiAgICAgICAgICAgIC8vIEFkZCB0byBkb2N1bWVudCBtZWRpYSBsaXN0CiAgICAg -ICAgICAgIGlmICghdGhpcy5jdXJyZW50RG9jLm1lZGlhcykgdGhpcy5jdXJyZW50RG9jLm1lZGlh -cyA9IFtdOwogICAgICAgICAgICB0aGlzLmN1cnJlbnREb2MubWVkaWFzLnB1c2goewogICAgICAg -ICAgICAgICAgdHlwZTogdHlwZSwKICAgICAgICAgICAgICAgIHVybDogcmVsUGF0aCwKICAgICAg -ICAgICAgICAgIHRpdGxlOiB0aXRsZSwKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBjYXB0 -aW9uLAogICAgICAgICAgICAgICAgZGlzcGxheU1vZGU6IG9wdHMuZGlzcGxheU1vZGUsCiAgICAg -ICAgICAgICAgICBhbGlnbm1lbnQ6IG9wdHMuYWxpZ24sCiAgICAgICAgICAgICAgICBzaXplOiBv -cHRzLnNpemUsCiAgICAgICAgICAgICAgICBtZWRpYUlkOiBtZWRpYUlkCiAgICAgICAgICAgIH0p -OwoKICAgICAgICAgICAgLy8gSW5zZXJ0IGlubGluZSBIVE1MIGlmIHJlcXVlc3RlZAogICAgICAg -ICAgICBpZiAob3B0cy5kaXNwbGF5TW9kZSAhPT0gJ2F0dGFjaG1lbnQnKSB7CiAgICAgICAgICAg -ICAgICB0aGlzLmluc2VydElubGluZU1lZGlhKHJlbFBhdGgsIHR5cGUsIHRpdGxlLCBjYXB0aW9u -LCBvcHRzLCBtZWRpYUlkKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhpcy5fcmVuZGVy -TWVkaWFMaXN0KCk7CiAgICAgICAgICAgIHNob3dUb2FzdCh0aXRsZSArICcgaGluenVnZWbDvGd0 -JywgJ3N1Y2Nlc3MnKTsKICAgICAgICB9IGNhdGNoIChlcnIpIHsKICAgICAgICAgICAgc2hvd1Rv -YXN0KCdGZWhsZXI6ICcgKyBlcnIubWVzc2FnZSwgJ2Vycm9yJyk7CiAgICAgICAgfQoKICAgICAg -ICAvLyBVcGxvYWQgYWJnZXNjaGxvc3NlbiAtIFVJIHp1cnVlY2tzZXR6ZW4KICAgICAgICB0aGlz -Ll91cGxvYWRJblByb2dyZXNzID0gZmFsc2U7CiAgICAgICAgdGhpcy5fc2hvd1VwbG9hZFByb2dy -ZXNzKGZhbHNlKTsKCiAgICAgICAgLy8gUHJvY2VzcyBuZXh0IGZpbGUgb3IgY2xvc2UKICAgICAg -ICB0aGlzLl9wZW5kaW5nSW5kZXgrKzsKICAgICAgICBpZiAodGhpcy5fcGVuZGluZ0luZGV4IDwg -dGhpcy5fcGVuZGluZ0ZpbGVzLmxlbmd0aCkgewogICAgICAgICAgICB0aGlzLnNob3dVcGxvYWRE -aWFsb2coKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB0aGlzLmNsb3NlVXBsb2FkRGlh -bG9nKCk7CiAgICAgICAgfQogICAgfSwKCiAgICBpbnNlcnRJbmxpbmVNZWRpYSh1cmwsIHR5cGUs -IHRpdGxlLCBjYXB0aW9uLCBvcHRzLCBtZWRpYUlkKSB7CiAgICAgICAgY29uc3QgZWRpdG9ySW5w -dXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZWRpdG9ySW5wdXQnKTsKICAgICAgICBsZXQg -ZWxlbWVudDsKCiAgICAgICAgaWYgKHR5cGUgPT09ICdpbWFnZScgJiYgb3B0cy5kaXNwbGF5TW9k -ZSA9PT0gJ2lubGluZScpIHsKICAgICAgICAgICAgLy8gSW1hZ2UgZmlndXJlCiAgICAgICAgICAg -IGNvbnN0IHNpemVDbGFzcyA9IG9wdHMuc2l6ZSA9PT0gJ2xhcmdlJyA/ICdkcml2ZS1tZWRpYS1s -YXJnZScgOiAnZHJpdmUtbWVkaWEtdGh1bWJuYWlsJzsKICAgICAgICAgICAgY29uc3QgYWxpZ25D -bGFzcyA9ICdkcml2ZS1hbGlnbi0nICsgb3B0cy5hbGlnbjsKCiAgICAgICAgICAgIGVsZW1lbnQg -PSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdmaWd1cmUnKTsKICAgICAgICAgICAgZWxlbWVudC5j -bGFzc05hbWUgPSAnZHJpdmUtbWVkaWEgJyArIHNpemVDbGFzcyArICcgJyArIGFsaWduQ2xhc3M7 -CiAgICAgICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKCdkYXRhLW1lZGlhLWlkJywgbWVkaWFJ -ZCk7CiAgICAgICAgICAgIGVsZW1lbnQuY29udGVudEVkaXRhYmxlID0gJ2ZhbHNlJzsKCiAgICAg -ICAgICAgIGNvbnN0IGltZyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2ltZycpOwogICAgICAg -ICAgICBpbWcuc3JjID0gdXJsOwogICAgICAgICAgICBpbWcuYWx0ID0gdGl0bGU7CiAgICAgICAg -ICAgIGltZy5zdHlsZS5jdXJzb3IgPSAncG9pbnRlcic7CiAgICAgICAgICAgIGltZy5vbmNsaWNr -ID0gZnVuY3Rpb24oZSkgeyBlLnByZXZlbnREZWZhdWx0KCk7IGUuc3RvcFByb3BhZ2F0aW9uKCk7 -IG9wZW5NZWRpYU1vZGFsKHVybCwgJ2ltYWdlJywgdGl0bGUpOyB9OwogICAgICAgICAgICBlbGVt -ZW50LmFwcGVuZENoaWxkKGltZyk7CgogICAgICAgICAgICBpZiAoY2FwdGlvbikgewogICAgICAg -ICAgICAgICAgY29uc3QgZmlnID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZmlnY2FwdGlvbicp -OwogICAgICAgICAgICAgICAgZmlnLnRleHRDb250ZW50ID0gY2FwdGlvbjsKICAgICAgICAgICAg -ICAgIGVsZW1lbnQuYXBwZW5kQ2hpbGQoZmlnKTsKICAgICAgICAgICAgfQogICAgICAgIH0gZWxz -ZSBpZiAodHlwZSA9PT0gJ3BkZicgJiYgb3B0cy5kaXNwbGF5TW9kZSA9PT0gJ3BkZi1saW5rJykg -ewogICAgICAgICAgICBlbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CiAg -ICAgICAgICAgIGVsZW1lbnQuY2xhc3NOYW1lID0gJ2RyaXZlLW1lZGlhIGRyaXZlLW1lZGlhLXBk -Zi1saW5rIGRyaXZlLWFsaWduLScgKyBvcHRzLmFsaWduOwogICAgICAgICAgICBlbGVtZW50LnNl -dEF0dHJpYnV0ZSgnZGF0YS1tZWRpYS1pZCcsIG1lZGlhSWQpOwogICAgICAgICAgICBlbGVtZW50 -LmNvbnRlbnRFZGl0YWJsZSA9ICdmYWxzZSc7CiAgICAgICAgICAgIGVsZW1lbnQuaW5uZXJIVE1M -ID0gJzxzcGFuIGNsYXNzPSJkcml2ZS1wZGYtaWNvbiI+UERGPC9zcGFuPicgKwogICAgICAgICAg -ICAgICAgJzxzcGFuIGNsYXNzPSJwZGYtdGl0bGUiPicgKyBEcml2ZVBvcnRhbC5lc2NhcGVIVE1M -KHRpdGxlKSArICc8L3NwYW4+JzsKICAgICAgICAgICAgZWxlbWVudC5vbmNsaWNrID0gZnVuY3Rp -b24oZSkgeyBlLnByZXZlbnREZWZhdWx0KCk7IGUuc3RvcFByb3BhZ2F0aW9uKCk7IG9wZW5NZWRp -YU1vZGFsKHVybCwgJ3BkZicsIHRpdGxlKTsgfTsKICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT09 -ICdwZGYnICYmIG9wdHMuZGlzcGxheU1vZGUgPT09ICdwZGYtaWZyYW1lJykgewogICAgICAgICAg -ICBlbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CiAgICAgICAgICAgIGVs -ZW1lbnQuY2xhc3NOYW1lID0gJ2RyaXZlLW1lZGlhIGRyaXZlLW1lZGlhLXBkZi1pZnJhbWUgZHJp -dmUtYWxpZ24tJyArIG9wdHMuYWxpZ247CiAgICAgICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRl -KCdkYXRhLW1lZGlhLWlkJywgbWVkaWFJZCk7CiAgICAgICAgICAgIGVsZW1lbnQuY29udGVudEVk -aXRhYmxlID0gJ2ZhbHNlJzsKICAgICAgICAgICAgZWxlbWVudC5pbm5lckhUTUwgPSAnPGlmcmFt -ZSBzcmM9IicgKyBEcml2ZVBvcnRhbC5lc2NhcGVBdHRyKHVybCkgKyAnIj48L2lmcmFtZT4nICsK -ICAgICAgICAgICAgICAgIChjYXB0aW9uID8gJzxwIGNsYXNzPSJkcml2ZS1tZWRpYS1jYXB0aW9u -Ij4nICsgRHJpdmVQb3J0YWwuZXNjYXBlSFRNTChjYXB0aW9uKSArICc8L3A+JyA6ICcnKTsKICAg -ICAgICAgICAgZWxlbWVudC5vbmNsaWNrID0gZnVuY3Rpb24oZSkgeyBlLnByZXZlbnREZWZhdWx0 -KCk7IGUuc3RvcFByb3BhZ2F0aW9uKCk7IG9wZW5NZWRpYU1vZGFsKHVybCwgJ3BkZicsIHRpdGxl -KTsgfTsKICAgICAgICB9IGVsc2UgaWYgKG9wdHMuZGlzcGxheU1vZGUgPT09ICdtZWRpYS1pbmxp -bmUnICYmICh0eXBlID09PSAndmlkZW8nIHx8IHR5cGUgPT09ICdhdWRpbycpKSB7CiAgICAgICAg -ICAgIC8vIFZpZGVvL0F1ZGlvIGFscyBrbGlja2JhcmVzIEljb24tRWxlbWVudCBpbSBBcnRpa2Vs -CiAgICAgICAgICAgIHZhciBpY29uID0gdHlwZSA9PT0gJ3ZpZGVvJyA/ICcmIzEyNzkxMDsnIDog -JyYjMTI3OTI1Oyc7CiAgICAgICAgICAgIHZhciBsYWJlbCA9IHR5cGUgPT09ICd2aWRlbycgPyAn -VmlkZW8nIDogJ0F1ZGlvJzsKICAgICAgICAgICAgZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVs -ZW1lbnQoJ2RpdicpOwogICAgICAgICAgICBlbGVtZW50LmNsYXNzTmFtZSA9ICdkcml2ZS1tZWRp -YSBkcml2ZS1tZWRpYS1lbWJlZCBkcml2ZS1hbGlnbi0nICsgb3B0cy5hbGlnbjsKICAgICAgICAg -ICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2RhdGEtbWVkaWEtaWQnLCBtZWRpYUlkKTsKICAgICAg -ICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2RhdGEtbWVkaWEtdHlwZScsIHR5cGUpOwogICAg -ICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZSgnZGF0YS1tZWRpYS11cmwnLCB1cmwpOwogICAg -ICAgICAgICBlbGVtZW50LmNvbnRlbnRFZGl0YWJsZSA9ICdmYWxzZSc7CiAgICAgICAgICAgIGVs -ZW1lbnQudGl0bGUgPSBsYWJlbCArICcgYWJzcGllbGVuOiAnICsgdGl0bGU7CiAgICAgICAgICAg -IGVsZW1lbnQuaW5uZXJIVE1MID0gJzxzcGFuIGNsYXNzPSJkcml2ZS1lbWJlZC1pY29uIGljb24t -JyArIHR5cGUgKyAnIj48L3NwYW4+JyArCiAgICAgICAgICAgICAgICAnPHNwYW4gY2xhc3M9ImRy -aXZlLWVtYmVkLWxhYmVsIj4nICsgRHJpdmVQb3J0YWwuZXNjYXBlSFRNTCh0aXRsZSkgKyAnPC9z -cGFuPic7CiAgICAgICAgICAgIGVsZW1lbnQub25jbGljayA9IGZ1bmN0aW9uKGUpIHsgZS5wcmV2 -ZW50RGVmYXVsdCgpOyBlLnN0b3BQcm9wYWdhdGlvbigpOyBvcGVuTWVkaWFNb2RhbCh1cmwsIHR5 -cGUsIHRpdGxlKTsgfTsKICAgICAgICB9IGVsc2UgaWYgKG9wdHMuZGlzcGxheU1vZGUgPT09ICdv -ZmZpY2UtaW5saW5lJyAmJiAodHlwZSA9PT0gJ2RvY3gnIHx8IHR5cGUgPT09ICd4bHN4JyB8fCB0 -eXBlID09PSAncHB0eCcpKSB7CiAgICAgICAgICAgIC8vIE9mZmljZS1EYXRlaWVuIGFscyBrbGlj -a2JhcmVzIEljb24tRWxlbWVudCBpbSBBcnRpa2VsCiAgICAgICAgICAgIGVsZW1lbnQgPSBkb2N1 -bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKICAgICAgICAgICAgZWxlbWVudC5jbGFzc05hbWUg -PSAnZHJpdmUtbWVkaWEgZHJpdmUtbWVkaWEtZW1iZWQgZHJpdmUtYWxpZ24tJyArIG9wdHMuYWxp -Z247CiAgICAgICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKCdkYXRhLW1lZGlhLWlkJywgbWVk -aWFJZCk7CiAgICAgICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKCdkYXRhLW1lZGlhLXR5cGUn -LCB0eXBlKTsKICAgICAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2RhdGEtbWVkaWEtdXJs -JywgdXJsKTsKICAgICAgICAgICAgZWxlbWVudC5jb250ZW50RWRpdGFibGUgPSAnZmFsc2UnOwog -ICAgICAgICAgICBlbGVtZW50LnRpdGxlID0gdHlwZS50b1VwcGVyQ2FzZSgpICsgJyBoZXJ1bnRl -cmxhZGVuOiAnICsgdGl0bGU7CiAgICAgICAgICAgIGVsZW1lbnQuaW5uZXJIVE1MID0gJzxzcGFu -IGNsYXNzPSJkcml2ZS1lbWJlZC1pY29uIGljb24tJyArIHR5cGUgKyAnIj48L3NwYW4+JyArCiAg -ICAgICAgICAgICAgICAnPHNwYW4gY2xhc3M9ImRyaXZlLWVtYmVkLWxhYmVsIj4nICsgRHJpdmVQ -b3J0YWwuZXNjYXBlSFRNTCh0aXRsZSkgKyAnPC9zcGFuPic7CiAgICAgICAgICAgIGVsZW1lbnQu -b25jbGljayA9IGZ1bmN0aW9uKGUpIHsgZS5wcmV2ZW50RGVmYXVsdCgpOyBlLnN0b3BQcm9wYWdh -dGlvbigpOyBvcGVuTWVkaWFNb2RhbCh1cmwsIHR5cGUsIHRpdGxlKTsgfTsKICAgICAgICB9Cgog -ICAgICAgIGlmICghZWxlbWVudCkgcmV0dXJuOwoKICAgICAgICAvLyBJbnNlcnQgYXQgY3Vyc29y -IHBvc2l0aW9uIG9yIGFwcGVuZAogICAgICAgIGNvbnN0IHNlbCA9IHdpbmRvdy5nZXRTZWxlY3Rp -b24oKTsKICAgICAgICBpZiAodGhpcy5fc2F2ZWRFZGl0b3JSYW5nZSAmJiBlZGl0b3JJbnB1dC5j -b250YWlucyh0aGlzLl9zYXZlZEVkaXRvclJhbmdlLmNvbW1vbkFuY2VzdG9yQ29udGFpbmVyKSkg -ewogICAgICAgICAgICBzZWwucmVtb3ZlQWxsUmFuZ2VzKCk7CiAgICAgICAgICAgIHNlbC5hZGRS -YW5nZSh0aGlzLl9zYXZlZEVkaXRvclJhbmdlKTsKICAgICAgICAgICAgY29uc3QgcmFuZ2UgPSBz -ZWwuZ2V0UmFuZ2VBdCgwKTsKICAgICAgICAgICAgcmFuZ2UuZGVsZXRlQ29udGVudHMoKTsKICAg -ICAgICAgICAgcmFuZ2UuaW5zZXJ0Tm9kZShlbGVtZW50KTsKICAgICAgICAgICAgLy8gUGxhY2Ug -Y3Vyc29yIGFmdGVyIGVsZW1lbnQKICAgICAgICAgICAgcmFuZ2Uuc2V0U3RhcnRBZnRlcihlbGVt -ZW50KTsKICAgICAgICAgICAgcmFuZ2UuY29sbGFwc2UodHJ1ZSk7CiAgICAgICAgICAgIHNlbC5y -ZW1vdmVBbGxSYW5nZXMoKTsKICAgICAgICAgICAgc2VsLmFkZFJhbmdlKHJhbmdlKTsKICAgICAg -ICAgICAgdGhpcy5fc2F2ZWRFZGl0b3JSYW5nZSA9IHJhbmdlLmNsb25lUmFuZ2UoKTsKICAgICAg -ICB9IGVsc2UgewogICAgICAgICAgICBlZGl0b3JJbnB1dC5hcHBlbmRDaGlsZChlbGVtZW50KTsK -ICAgICAgICB9CiAgICB9LAoKICAgIC8vIC0tLSBNZWRpYSBDb250ZXh0IE1lbnUgKGluIEVkaXRv -cikgLS0tCiAgICBfY29udGV4dFRhcmdldDogbnVsbCwKCiAgICAvLyAtLS0gU2NobGFnd8O2cnRl -ciAtLS0KICAgIFBSRURFRklORURfS0VZV09SRFM6IFsKICAgICAgICAnU296aWFsdm9yc2Nocmlm -dGVuJywgJ0xhZHVuZ3NzaWNoZXJ1bmcnLCAnw5xiZXJsYWR1bmcnLCAnS09NJywgJ0dHVlMnLAog -ICAgICAgICdGYWhyemV1Z3RlY2huaWsnLCAnVGVjaEtvbnRyb2xsVk8nLCAnS2Fib3RhZ2UnLCAn -RG9rdW1lbnRlbmbDpGxzY2h1bmcnLAogICAgICAgICdadWxhc3N1bmdlbicsICdadWxhc3N1bmdl -biBuYXRpb25hbCcsICdadWxhc3N1bmdlbiBpbnRlcm5hdGlvbmFsJywKICAgICAgICAnQWxrb2hv -bCcsICdCVE0nLCAnR2VzY2h3aW5kaWdrZWl0JywgJ0Fic3RhbmQnLCAnRmFsc2NoZmFocmVyJywK -ICAgICAgICAnVmVyZm9sZ3VuZ3NmYWhydCcsICdUdW5uZWwnLCAnU3TDtnJmYWxsJywgJ0ZvdG9n -cmFmaWUnLAogICAgICAgICdGb3RvZ3JhZmllIEJyw7xja2UnLCAnRm90b2dyYWZpZSBCYXVzdGVs -bGUnLCAnRm90b2dyYWZpZSBBYnN0YW5kJywKICAgICAgICAnVHVuaW5nJywgJ1ZLUicsICdTY2hs -ZXBwZW4nLCAnU2Nocm90dHNhbW1sZXInCiAgICBdLAogICAgLy8gVW50ZXJrYXRlZ29yaWVuOiBL -YXRlZ29yaWUgLT4gU3ViLVRhZ3MgKGZ1ZXIgS2xhbW1lcnZlcm1lcmsgaW0gVGl0ZWwgKyBBdXRv -LVRhZykKICAgIENBVEVHT1JZX1NVQlRBR1M6IHsKICAgICAgICAnWnVsYXNzdW5nZW4nOiBbJ25h -dGlvbmFsJywgJ2ludGVybmF0aW9uYWwnXSwKICAgICAgICAnRm90b2dyYWZpZSc6ICBbJ0Jyw7xj -a2UnLCAnQmF1c3RlbGxlJywgJ0Fic3RhbmQnXQogICAgfSwKICAgIF9jdXJyZW50S2V5d29yZHM6 -IFtdLAoKICAgIF9nZXRBbGxLbm93bktleXdvcmRzKCkgewogICAgICAgIGNvbnN0IHNldCA9IG5l -dyBTZXQodGhpcy5QUkVERUZJTkVEX0tFWVdPUkRTKTsKICAgICAgICBEcml2ZUZTLmRvY3VtZW50 -cy5mb3JFYWNoKGQgPT4gKGQuc2NobGFnd29lcnRlciB8fCBbXSkuZm9yRWFjaChrID0+IHNldC5h -ZGQoaykpKTsKICAgICAgICByZXR1cm4gWy4uLnNldF0uc29ydCgoYSwgYikgPT4gYS5sb2NhbGVD -b21wYXJlKGIsICdkZScpKTsKICAgIH0sCgogICAgX3JlbmRlcktleXdvcmRzKCkgewogICAgICAg -IGNvbnN0IGNvbnRhaW5lciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlZGl0b3JLZXl3b3Jk -cycpOwogICAgICAgIGNvbnN0IGlucHV0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VkaXRv -cktleXdvcmRJbnB1dCcpOwogICAgICAgIGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yQWxsKCcua2V5 -d29yZC1waWxsJykuZm9yRWFjaChwID0+IHAucmVtb3ZlKCkpOwogICAgICAgIHRoaXMuX2N1cnJl -bnRLZXl3b3Jkcy5mb3JFYWNoKChrdywgaSkgPT4gewogICAgICAgICAgICBjb25zdCBwaWxsID0g -ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpOwogICAgICAgICAgICBwaWxsLmNsYXNzTmFt -ZSA9ICdrZXl3b3JkLXBpbGwnOwogICAgICAgICAgICBwaWxsLmlubmVySFRNTCA9IERyaXZlUG9y -dGFsLmVzY2FwZUhUTUwoa3cpICsgJyA8c3BhbiBjbGFzcz0ia3ctcmVtb3ZlIiBvbmNsaWNrPSJE -cml2ZUVkaXRvci5yZW1vdmVLZXl3b3JkKCcgKyBpICsgJykiPiZ0aW1lczs8L3NwYW4+JzsKICAg -ICAgICAgICAgY29udGFpbmVyLmluc2VydEJlZm9yZShwaWxsLCBpbnB1dCk7CiAgICAgICAgfSk7 -CiAgICAgICAgdGhpcy5fcmVuZGVyU3VnZ2VzdGlvbnMoKTsKICAgIH0sCgogICAgX3JlbmRlclN1 -Z2dlc3Rpb25zKCkgewogICAgICAgIGNvbnN0IHBhbmVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5 -SWQoJ2tleXdvcmRTdWdnZXN0aW9ucycpOwogICAgICAgIGlmICghcGFuZWwpIHJldHVybjsKICAg -ICAgICBjb25zdCBjdXJyZW50ID0gdGhpcy5fY3VycmVudEtleXdvcmRzOwogICAgICAgIGNvbnN0 -IGRvYyA9IHRoaXMuY3VycmVudERvYzsKICAgICAgICBjb25zdCBrYXRlZ29yaWUgPSBkb2MgPyBk -b2Mua2F0ZWdvcmllIDogJyc7CgogICAgICAgIC8vIEFsbGUgYmVrYW5udGVuIFNjaGxhZ3fDtnJ0 -ZXIgc2FtbWVsbiBtaXQgR2V3aWNodHVuZwogICAgICAgIHZhciBrd1Njb3JlcyA9IHt9OwogICAg -ICAgIERyaXZlRlMuZG9jdW1lbnRzLmZvckVhY2goZnVuY3Rpb24oZCkgewogICAgICAgICAgICB2 -YXIgcmVsZXZhbmNlID0gMTsKICAgICAgICAgICAgaWYgKGQua2F0ZWdvcmllID09PSBrYXRlZ29y -aWUpIHJlbGV2YW5jZSA9IDM7IC8vIGdsZWljaGUgS2F0ZWdvcmllID0gaMO2aGVyZSBSZWxldmFu -egogICAgICAgICAgICBpZiAoZC5wYXJlbnRJZCA9PT0gKGRvYyAmJiBkb2MuaWQpKSByZWxldmFu -Y2UgPSA0OyAvLyBVbnRlcmFydGlrZWwKICAgICAgICAgICAgaWYgKGRvYyAmJiBkb2MucGFyZW50 -SWQgJiYgZC5pZCA9PT0gZG9jLnBhcmVudElkKSByZWxldmFuY2UgPSA0OyAvLyDDnGJlcmFydGlr -ZWwKICAgICAgICAgICAgLy8gVGhlbWVuw6RobmxpY2hrZWl0OiBnZW1laW5zYW1lIFNjaGxhZ3fD -tnJ0ZXIKICAgICAgICAgICAgdmFyIG92ZXJsYXAgPSAoZC5zY2hsYWd3b2VydGVyIHx8IFtdKS5m -aWx0ZXIoZnVuY3Rpb24oaykgeyByZXR1cm4gY3VycmVudC5pbmNsdWRlcyhrKTsgfSkubGVuZ3Ro -OwogICAgICAgICAgICBpZiAob3ZlcmxhcCA+IDApIHJlbGV2YW5jZSArPSBvdmVybGFwICogMjsK -ICAgICAgICAgICAgKGQuc2NobGFnd29lcnRlciB8fCBbXSkuZm9yRWFjaChmdW5jdGlvbihrKSB7 -CiAgICAgICAgICAgICAgICBpZiAoIWN1cnJlbnQuaW5jbHVkZXMoaykpIHsKICAgICAgICAgICAg -ICAgICAgICBrd1Njb3Jlc1trXSA9IChrd1Njb3Jlc1trXSB8fCAwKSArIHJlbGV2YW5jZTsKICAg -ICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSk7CgogICAgICAgIC8vIFZv -cmRlZmluaWVydGUgS2V5d29yZHMgYWxzIEJhc2lzLVZvcnNjaGzDpGdlIG1pdCBuaWVkcmlnZXIg -R2V3aWNodHVuZwogICAgICAgIHRoaXMuUFJFREVGSU5FRF9LRVlXT1JEUy5mb3JFYWNoKGZ1bmN0 -aW9uKGspIHsKICAgICAgICAgICAgaWYgKCFjdXJyZW50LmluY2x1ZGVzKGspICYmICFrd1Njb3Jl -c1trXSkga3dTY29yZXNba10gPSAwLjU7CiAgICAgICAgfSk7CiAgICAgICAgLy8gVW50ZXJrYXRl -Z29yaWUtU3ViLVRhZ3MgZGVyIGFrdHVlbGxlbiBLYXRlZ29yaWUgaG9jaCBwcmlvcmlzaWVyZW4K -ICAgICAgICB2YXIgY2F0U3VicyA9IHRoaXMuQ0FURUdPUllfU1VCVEFHU1trYXRlZ29yaWVdIHx8 -IFtdOwogICAgICAgIGNhdFN1YnMuZm9yRWFjaChmdW5jdGlvbihzKSB7CiAgICAgICAgICAgIGlm -ICghY3VycmVudC5pbmNsdWRlcyhzKSkga3dTY29yZXNbc10gPSAoa3dTY29yZXNbc10gfHwgMCkg -KyA1OwogICAgICAgIH0pOwogICAgICAgIHZhciBzb3J0ZWQgPSBPYmplY3QuZW50cmllcyhrd1Nj -b3Jlcykuc29ydChmdW5jdGlvbihhLGIpeyByZXR1cm4gYlsxXSAtIGFbMV07IH0pLnNsaWNlKDAs -IDE1KTsKCiAgICAgICAgaWYgKHNvcnRlZC5sZW5ndGggPT09IDApIHsKICAgICAgICAgICAgcGFu -ZWwuaW5uZXJIVE1MID0gJyc7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAg -IHBhbmVsLmlubmVySFRNTCA9ICc8c3BhbiBzdHlsZT0iZm9udC1zaXplOjEwcHg7Y29sb3I6dmFy -KC0tdGV4dC1tdXRlZCk7bWFyZ2luLXJpZ2h0OjRweDsiPlZvcnNjaGzDpGdlOjwvc3Bhbj4nICsK -ICAgICAgICAgICAgc29ydGVkLm1hcChmdW5jdGlvbihrdikgewogICAgICAgICAgICAgICAgcmV0 -dXJuICc8c3BhbiBjbGFzcz0ia2V5d29yZC1zdWdnZXN0aW9uIiBvbmNsaWNrPSJEcml2ZUVkaXRv -ci5hZGRLZXl3b3JkKFwnJyArIERyaXZlUG9ydGFsLmVzY2FwZUF0dHIoa3ZbMF0pICsgJ1wnKSI+ -JyArIERyaXZlUG9ydGFsLmVzY2FwZUhUTUwoa3ZbMF0pICsgJzwvc3Bhbj4nOwogICAgICAgICAg -ICB9KS5qb2luKCcnKTsKICAgIH0sCgogICAgYWRkS2V5d29yZCh3b3JkKSB7CiAgICAgICAgd29y -ZCA9IHdvcmQudHJpbSgpOwogICAgICAgIGlmICghd29yZCB8fCB0aGlzLl9jdXJyZW50S2V5d29y -ZHMuaW5jbHVkZXMod29yZCkpIHJldHVybjsKICAgICAgICB0aGlzLl9jdXJyZW50S2V5d29yZHMu -cHVzaCh3b3JkKTsKICAgICAgICB0aGlzLl9yZW5kZXJLZXl3b3JkcygpOwogICAgICAgIGRvY3Vt -ZW50LmdldEVsZW1lbnRCeUlkKCdlZGl0b3JLZXl3b3JkSW5wdXQnKS52YWx1ZSA9ICcnOwogICAg -ICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdrZXl3b3JkQXV0b2NvbXBsZXRlJykuY2xhc3NM -aXN0LnJlbW92ZSgnYWN0aXZlJyk7CiAgICB9LAoKICAgIHJlbW92ZUtleXdvcmQoaW5kZXgpIHsK -ICAgICAgICB0aGlzLl9jdXJyZW50S2V5d29yZHMuc3BsaWNlKGluZGV4LCAxKTsKICAgICAgICB0 -aGlzLl9yZW5kZXJLZXl3b3JkcygpOwogICAgfSwKCiAgICBfc2V0dXBLZXl3b3JkSW5wdXQoKSB7 -CiAgICAgICAgY29uc3QgaW5wdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZWRpdG9yS2V5 -d29yZElucHV0Jyk7CiAgICAgICAgY29uc3QgYWMgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgn -a2V5d29yZEF1dG9jb21wbGV0ZScpOwogICAgICAgIGlucHV0Lm9ua2V5ZG93biA9IChlKSA9PiB7 -CiAgICAgICAgICAgIGlmIChlLmtleSA9PT0gJ0VudGVyJyB8fCBlLmtleSA9PT0gJywnKSB7CiAg -ICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgICAgICAgICB0aGlzLmFk -ZEtleXdvcmQoaW5wdXQudmFsdWUucmVwbGFjZSgnLCcsICcnKSk7CiAgICAgICAgICAgIH0gZWxz -ZSBpZiAoZS5rZXkgPT09ICdCYWNrc3BhY2UnICYmICFpbnB1dC52YWx1ZSAmJiB0aGlzLl9jdXJy -ZW50S2V5d29yZHMubGVuZ3RoID4gMCkgewogICAgICAgICAgICAgICAgdGhpcy5yZW1vdmVLZXl3 -b3JkKHRoaXMuX2N1cnJlbnRLZXl3b3Jkcy5sZW5ndGggLSAxKTsKICAgICAgICAgICAgfQogICAg -ICAgIH07CiAgICAgICAgaW5wdXQub25pbnB1dCA9ICgpID0+IHsKICAgICAgICAgICAgY29uc3Qg -cSA9IGlucHV0LnZhbHVlLnRvTG93ZXJDYXNlKCkudHJpbSgpOwogICAgICAgICAgICBpZiAocS5s -ZW5ndGggPCAxKSB7IGFjLmNsYXNzTGlzdC5yZW1vdmUoJ2FjdGl2ZScpOyByZXR1cm47IH0KICAg -ICAgICAgICAgY29uc3Qga25vd24gPSB0aGlzLl9nZXRBbGxLbm93bktleXdvcmRzKCkuZmlsdGVy -KGsgPT4KICAgICAgICAgICAgICAgIGsudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhxKSAmJiAhdGhp -cy5fY3VycmVudEtleXdvcmRzLmluY2x1ZGVzKGspCiAgICAgICAgICAgICkuc2xpY2UoMCwgOCk7 -CiAgICAgICAgICAgIGlmIChrbm93bi5sZW5ndGggPT09IDApIHsgYWMuY2xhc3NMaXN0LnJlbW92 -ZSgnYWN0aXZlJyk7IHJldHVybjsgfQogICAgICAgICAgICBhYy5pbm5lckhUTUwgPSBrbm93bi5t -YXAoayA9PgogICAgICAgICAgICAgICAgJzxkaXYgY2xhc3M9ImtleXdvcmQtYXV0b2NvbXBsZXRl -LWl0ZW0iIG9ubW91c2Vkb3duPSJEcml2ZUVkaXRvci5hZGRLZXl3b3JkKFwnJyArIERyaXZlUG9y -dGFsLmVzY2FwZUF0dHIoaykgKyAnXCcpIj4nICsgRHJpdmVQb3J0YWwuZXNjYXBlSFRNTChrKSAr -ICc8L2Rpdj4nCiAgICAgICAgICAgICkuam9pbignJyk7CiAgICAgICAgICAgIGFjLmNsYXNzTGlz -dC5hZGQoJ2FjdGl2ZScpOwogICAgICAgIH07CiAgICAgICAgaW5wdXQub25ibHVyID0gKCkgPT4g -c2V0VGltZW91dCgoKSA9PiBhYy5jbGFzc0xpc3QucmVtb3ZlKCdhY3RpdmUnKSwgMjAwKTsKICAg -IH0sCgogICAgX3NlbGVjdGVkQmxvY2s6IG51bGwsCgogICAgX3NlbGVjdEJsb2NrKGJsb2NrKSB7 -CiAgICAgICAgdGhpcy5fZGVzZWxlY3RCbG9jaygpOwogICAgICAgIHRoaXMuX3NlbGVjdGVkQmxv -Y2sgPSBibG9jazsKICAgICAgICBibG9jay5zdHlsZS5vdXRsaW5lID0gJzJweCBzb2xpZCB2YXIo -LS10ZXh0LWhlYWRpbmcpJzsKICAgICAgICBibG9jay5zdHlsZS5vdXRsaW5lT2Zmc2V0ID0gJzJw -eCc7CiAgICB9LAoKICAgIF9kZXNlbGVjdEJsb2NrKCkgewogICAgICAgIGlmICh0aGlzLl9zZWxl -Y3RlZEJsb2NrKSB7CiAgICAgICAgICAgIHRoaXMuX3NlbGVjdGVkQmxvY2suc3R5bGUub3V0bGlu -ZSA9ICcnOwogICAgICAgICAgICB0aGlzLl9zZWxlY3RlZEJsb2NrLnN0eWxlLm91dGxpbmVPZmZz -ZXQgPSAnJzsKICAgICAgICAgICAgdGhpcy5fc2VsZWN0ZWRCbG9jayA9IG51bGw7CiAgICAgICAg -fQogICAgfSwKCiAgICBzZXR1cEVkaXRvck1lZGlhRXZlbnRzKCkgewogICAgICAgIGNvbnN0IGVk -aXRvcklucHV0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VkaXRvcklucHV0Jyk7CiAgICAg -ICAgY29uc3Qgc2VsZiA9IHRoaXM7CgogICAgICAgIGVkaXRvcklucHV0LmFkZEV2ZW50TGlzdGVu -ZXIoJ2NsaWNrJywgKGUpID0+IHsKICAgICAgICAgICAgY29uc3QgbWVkaWEgPSBlLnRhcmdldC5j -bG9zZXN0KCcuZHJpdmUtbWVkaWEnKTsKICAgICAgICAgICAgaWYgKG1lZGlhICYmIGVkaXRvcklu -cHV0LmNvbnRhaW5zKG1lZGlhKSkgewogICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgp -OwogICAgICAgICAgICAgICAgdGhpcy5zaG93Q29udGV4dE1lbnUobWVkaWEsIGUpOwogICAgICAg -ICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBLbGljayBhdWYg -QWNjb3JkaW9uLCBGQVEsIFRhYmVsbGU6IG1hcmtpZXJlbgogICAgICAgICAgICB2YXIgYmxvY2sg -PSBlLnRhcmdldC5jbG9zZXN0KCcuZHJpdmUtYWNjb3JkaW9uLCAuZHJpdmUtZmFxLCAuZHJpdmUt -dGFibGUtd3JhcCwgLmRyaXZlLWluZm9ib3gsIGhyLmRyaXZlLWRpdmlkZXInKTsKICAgICAgICAg -ICAgaWYgKGJsb2NrICYmIGVkaXRvcklucHV0LmNvbnRhaW5zKGJsb2NrKSkgewogICAgICAgICAg -ICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICAgICAgdGhpcy5fc2VsZWN0Qmxv -Y2soYmxvY2spOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgdGhpcy5fZGVz -ZWxlY3RCbG9jaygpOwogICAgICAgICAgICAgICAgdGhpcy5oaWRlQ29udGV4dE1lbnUoKTsKICAg -ICAgICAgICAgfQogICAgICAgIH0pOwoKICAgICAgICAvLyBCYWNrc3BhY2UvRGVsZXRlIGxvZXNj -aHQgbWFya2llcnRlbiBCbG9jawogICAgICAgIGVkaXRvcklucHV0LmFkZEV2ZW50TGlzdGVuZXIo -J2tleWRvd24nLCBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgIGlmIChzZWxmLl9zZWxlY3RlZEJs -b2NrICYmIChlLmtleSA9PT0gJ0JhY2tzcGFjZScgfHwgZS5rZXkgPT09ICdEZWxldGUnKSkgewog -ICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICAgICAgc2VsZi5f -c2VsZWN0ZWRCbG9jay5yZW1vdmUoKTsKICAgICAgICAgICAgICAgIHNlbGYuX3NlbGVjdGVkQmxv -Y2sgPSBudWxsOwogICAgICAgICAgICAgICAgc2VsZi5zYXZlU3RhdGUoKTsKICAgICAgICAgICAg -fQogICAgICAgIH0pOwogICAgfSwKCiAgICBzaG93Q29udGV4dE1lbnUoZWxlbWVudCwgZXZlbnQp -IHsKICAgICAgICB0aGlzLl9jb250ZXh0VGFyZ2V0ID0gZWxlbWVudDsKICAgICAgICBjb25zdCBt -ZW51ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21lZGlhQ29udGV4dE1lbnUnKTsKICAgICAg -ICBjb25zdCByZWN0ID0gZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKCiAgICAgICAg -bWVudS5zdHlsZS50b3AgPSAocmVjdC5ib3R0b20gKyB3aW5kb3cuc2Nyb2xsWSArIDUpICsgJ3B4 -JzsKICAgICAgICBtZW51LnN0eWxlLmxlZnQgPSBNYXRoLm1pbihyZWN0LmxlZnQgKyB3aW5kb3cu -c2Nyb2xsWCwgd2luZG93LmlubmVyV2lkdGggLSAyMDApICsgJ3B4JzsKICAgICAgICBtZW51LmNs -YXNzTGlzdC5hZGQoJ2FjdGl2ZScpOwoKICAgICAgICAvLyBIaWdobGlnaHQgY3VycmVudCBhbGln -bm1lbnQKICAgICAgICBjb25zdCBjdXJyZW50QWxpZ24gPSBlbGVtZW50LmNsYXNzTGlzdC5jb250 -YWlucygnZHJpdmUtYWxpZ24tbGVmdCcpID8gJ2xlZnQnCiAgICAgICAgICAgIDogZWxlbWVudC5j -bGFzc0xpc3QuY29udGFpbnMoJ2RyaXZlLWFsaWduLXJpZ2h0JykgPyAncmlnaHQnIDogJ2NlbnRl -cic7CiAgICAgICAgbWVudS5xdWVyeVNlbGVjdG9yQWxsKCcubWVkaWEtY29udGV4dC1ncm91cCBi -dXR0b24nKS5mb3JFYWNoKGJ0biA9PiB7CiAgICAgICAgICAgIGJ0bi5jbGFzc0xpc3QudG9nZ2xl -KCdhY3RpdmUnLCBidG4uZ2V0QXR0cmlidXRlKCdkYXRhLWFsaWduJykgPT09IGN1cnJlbnRBbGln -bik7CiAgICAgICAgfSk7CiAgICB9LAoKICAgIGhpZGVDb250ZXh0TWVudSgpIHsKICAgICAgICBk -b2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWVkaWFDb250ZXh0TWVudScpLmNsYXNzTGlzdC5yZW1v -dmUoJ2FjdGl2ZScpOwogICAgICAgIHRoaXMuX2NvbnRleHRUYXJnZXQgPSBudWxsOwogICAgfSwK -CiAgICBjb250ZXh0QWxpZ24oYWxpZ24pIHsKICAgICAgICBpZiAoIXRoaXMuX2NvbnRleHRUYXJn -ZXQpIHJldHVybjsKICAgICAgICB0aGlzLl9jb250ZXh0VGFyZ2V0LmNsYXNzTGlzdC5yZW1vdmUo -J2RyaXZlLWFsaWduLWxlZnQnLCAnZHJpdmUtYWxpZ24tY2VudGVyJywgJ2RyaXZlLWFsaWduLXJp -Z2h0Jyk7CiAgICAgICAgdGhpcy5fY29udGV4dFRhcmdldC5jbGFzc0xpc3QuYWRkKCdkcml2ZS1h -bGlnbi0nICsgYWxpZ24pOwoKICAgICAgICAvLyBVcGRhdGUgbWVkaWEgbWV0YWRhdGEKICAgICAg -ICBjb25zdCBtZWRpYUlkID0gdGhpcy5fY29udGV4dFRhcmdldC5nZXRBdHRyaWJ1dGUoJ2RhdGEt -bWVkaWEtaWQnKTsKICAgICAgICBpZiAobWVkaWFJZCAmJiB0aGlzLmN1cnJlbnREb2MpIHsKICAg -ICAgICAgICAgY29uc3QgbWVkaWEgPSAodGhpcy5jdXJyZW50RG9jLm1lZGlhcyB8fCBbXSkuZmlu -ZChtID0+IG0ubWVkaWFJZCA9PT0gbWVkaWFJZCk7CiAgICAgICAgICAgIGlmIChtZWRpYSkgbWVk -aWEuYWxpZ25tZW50ID0gYWxpZ247CiAgICAgICAgfQoKICAgICAgICB0aGlzLmhpZGVDb250ZXh0 -TWVudSgpOwogICAgfSwKCiAgICBjb250ZXh0RWRpdENhcHRpb24oKSB7CiAgICAgICAgaWYgKCF0 -aGlzLl9jb250ZXh0VGFyZ2V0KSByZXR1cm47CiAgICAgICAgY29uc3QgZmlnY2FwdGlvbiA9IHRo -aXMuX2NvbnRleHRUYXJnZXQucXVlcnlTZWxlY3RvcignZmlnY2FwdGlvbiwgLmRyaXZlLW1lZGlh -LWNhcHRpb24nKTsKICAgICAgICBjb25zdCBjdXJyZW50ID0gZmlnY2FwdGlvbiA/IGZpZ2NhcHRp -b24udGV4dENvbnRlbnQgOiAnJzsKICAgICAgICBjb25zdCBuZXdDYXB0aW9uID0gcHJvbXB0KCdV -bnRlcnRpdGVsIGJlYXJiZWl0ZW46JywgY3VycmVudCk7CiAgICAgICAgaWYgKG5ld0NhcHRpb24g -PT09IG51bGwpIHJldHVybjsKCiAgICAgICAgaWYgKGZpZ2NhcHRpb24pIHsKICAgICAgICAgICAg -aWYgKG5ld0NhcHRpb24pIHsgZmlnY2FwdGlvbi50ZXh0Q29udGVudCA9IG5ld0NhcHRpb247IH0K -ICAgICAgICAgICAgZWxzZSB7IGZpZ2NhcHRpb24ucmVtb3ZlKCk7IH0KICAgICAgICB9IGVsc2Ug -aWYgKG5ld0NhcHRpb24pIHsKICAgICAgICAgICAgY29uc3QgY2FwID0gZG9jdW1lbnQuY3JlYXRl -RWxlbWVudCgnZmlnY2FwdGlvbicpOwogICAgICAgICAgICBjYXAudGV4dENvbnRlbnQgPSBuZXdD -YXB0aW9uOwogICAgICAgICAgICB0aGlzLl9jb250ZXh0VGFyZ2V0LmFwcGVuZENoaWxkKGNhcCk7 -CiAgICAgICAgfQoKICAgICAgICAvLyBVcGRhdGUgbWV0YWRhdGEKICAgICAgICBjb25zdCBtZWRp -YUlkID0gdGhpcy5fY29udGV4dFRhcmdldC5nZXRBdHRyaWJ1dGUoJ2RhdGEtbWVkaWEtaWQnKTsK -ICAgICAgICBpZiAobWVkaWFJZCAmJiB0aGlzLmN1cnJlbnREb2MpIHsKICAgICAgICAgICAgY29u -c3QgbWVkaWEgPSAodGhpcy5jdXJyZW50RG9jLm1lZGlhcyB8fCBbXSkuZmluZChtID0+IG0ubWVk -aWFJZCA9PT0gbWVkaWFJZCk7CiAgICAgICAgICAgIGlmIChtZWRpYSkgbWVkaWEuZGVzY3JpcHRp -b24gPSBuZXdDYXB0aW9uOwogICAgICAgIH0KCiAgICAgICAgdGhpcy5oaWRlQ29udGV4dE1lbnUo -KTsKICAgIH0sCgogICAgY29udGV4dFJlbW92ZSgpIHsKICAgICAgICBpZiAoIXRoaXMuX2NvbnRl -eHRUYXJnZXQpIHJldHVybjsKICAgICAgICBjb25zdCBtZWRpYUlkID0gdGhpcy5fY29udGV4dFRh -cmdldC5nZXRBdHRyaWJ1dGUoJ2RhdGEtbWVkaWEtaWQnKTsKICAgICAgICBpZiAobWVkaWFJZCAm -JiB0aGlzLmN1cnJlbnREb2MgJiYgdGhpcy5jdXJyZW50RG9jLm1lZGlhcykgewogICAgICAgICAg -ICBjb25zdCBpZHggPSB0aGlzLmN1cnJlbnREb2MubWVkaWFzLmZpbmRJbmRleChtID0+IG0ubWVk -aWFJZCA9PT0gbWVkaWFJZCk7CiAgICAgICAgICAgIGlmIChpZHggPj0gMCkgewogICAgICAgICAg -ICAgICAgY29uc3QgbWVkaWEgPSB0aGlzLmN1cnJlbnREb2MubWVkaWFzW2lkeF07CiAgICAgICAg -ICAgICAgICAvLyBEYXRlaSBhdWYgZGVtIFNlcnZlciBsb2VzY2hlbgogICAgICAgICAgICAgICAg -aWYgKG1lZGlhLnVybCAmJiBEcml2ZUZTLm1vZGUgPT09ICdzZXJ2ZXInKSB7CiAgICAgICAgICAg -ICAgICAgICAgZmV0Y2goJy9hcGkvZGVsZXRlJywgewogICAgICAgICAgICAgICAgICAgICAgICBt -ZXRob2Q6ICdQT1NUJywKICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyczogeyAnQ29udGVu -dC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb247IGNoYXJzZXQ9dXRmLTgnIH0sCiAgICAgICAgICAg -ICAgICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgcGF0aDogbWVkaWEudXJsIH0pCiAg -ICAgICAgICAgICAgICAgICAgfSkuY2F0Y2goKCkgPT4ge30pOwogICAgICAgICAgICAgICAgfQog -ICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50RG9jLm1lZGlhcy5zcGxpY2UoaWR4LCAxKTsKICAg -ICAgICAgICAgfQogICAgICAgIH0KICAgICAgICB0aGlzLl9jb250ZXh0VGFyZ2V0LnJlbW92ZSgp -OwogICAgICAgIHRoaXMuX3JlbmRlck1lZGlhTGlzdCgpOwogICAgICAgIHRoaXMuaGlkZUNvbnRl -eHRNZW51KCk7CiAgICAgICAgc2hvd1RvYXN0KCdNZWRpdW0gZW50ZmVybnQnLCAnc3VjY2Vzcycp -OwogICAgfSwKCiAgICAvLyAtLS0gTWVkaWVuLVZlcndhbHR1bmcgaW0gRWRpdG9yIC0tLQogICAg -dG9nZ2xlTWVkaWFQYW5lbCgpIHsKICAgICAgICBjb25zdCBwYW5lbCA9IGRvY3VtZW50LmdldEVs -ZW1lbnRCeUlkKCdlZGl0b3JNZWRpYVBhbmVsJyk7CiAgICAgICAgaWYgKHBhbmVsLnN0eWxlLmRp -c3BsYXkgPT09ICdub25lJykgewogICAgICAgICAgICB0aGlzLl9yZW5kZXJNZWRpYUxpc3QoKTsK -ICAgICAgICAgICAgcGFuZWwuc3R5bGUuZGlzcGxheSA9ICcnOwogICAgICAgIH0gZWxzZSB7CiAg -ICAgICAgICAgIHBhbmVsLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7CiAgICAgICAgfQogICAgfSwK -CiAgICBfcmVuZGVyTWVkaWFMaXN0KCkgewogICAgICAgIGNvbnN0IGNvbnRhaW5lciA9IGRvY3Vt -ZW50LmdldEVsZW1lbnRCeUlkKCdlZGl0b3JNZWRpYUxpc3QnKTsKICAgICAgICBjb25zdCBwYW5l -bCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlZGl0b3JNZWRpYVBhbmVsJyk7CiAgICAgICAg -aWYgKCFjb250YWluZXIgfHwgIXRoaXMuY3VycmVudERvYykgcmV0dXJuOwogICAgICAgIGNvbnN0 -IG1lZGlhcyA9IHRoaXMuY3VycmVudERvYy5tZWRpYXMgfHwgW107CgogICAgICAgIGlmIChtZWRp -YXMubGVuZ3RoID09PSAwKSB7CiAgICAgICAgICAgIGNvbnRhaW5lci5pbm5lckhUTUwgPSAnPGRp -diBzdHlsZT0iZm9udC1zaXplOjEycHg7IGNvbG9yOnZhcigtLXRleHQtbXV0ZWQpOyBwYWRkaW5n -OjhweCAwOyB0ZXh0LWFsaWduOmNlbnRlcjsgbGluZS1oZWlnaHQ6MS44OyI+JyArCiAgICAgICAg -ICAgICAgICAnTm9jaCBrZWluZSBEYXRlaWVuIGhvY2hnZWxhZGVuLjxicj4nICsKICAgICAgICAg -ICAgICAgICc8YnV0dG9uIG9uY2xpY2s9IkRyaXZlRWRpdG9yLnNob3dVcGxvYWRNb2RhbCgpIiBz -dHlsZT0ibWFyZ2luLXRvcDo0cHg7cGFkZGluZzo0cHggMTRweDtib3JkZXI6MXB4IGRhc2hlZCB2 -YXIoLS1ib3JkZXItY29sb3IpO2JvcmRlci1yYWRpdXM6NHB4O2JhY2tncm91bmQ6bm9uZTtjdXJz -b3I6cG9pbnRlcjtmb250LXNpemU6MTJweDtjb2xvcjp2YXIoLS10ZXh0LWhlYWRpbmcpOyI+RGF0 -ZWllbiBob2NobGFkZW48L2J1dHRvbj4nICsKICAgICAgICAgICAgJzwvZGl2Pic7CiAgICAgICAg -ICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIGNvbnRhaW5lci5pbm5lckhUTUwgPSBtZWRp -YXMubWFwKChtLCBpKSA9PiB7CiAgICAgICAgICAgIGNvbnN0IHR5cGUgPSAobS50eXBlIHx8ICdm -aWxlJykudG9VcHBlckNhc2UoKTsKICAgICAgICAgICAgY29uc3QgdGl0bGUgPSBEcml2ZVBvcnRh -bC5lc2NhcGVIVE1MKG0udGl0bGUgfHwgbS51cmwuc3BsaXQoJy8nKS5wb3AoKSk7CiAgICAgICAg -ICAgIGNvbnN0IGRlc2MgPSBtLmRlc2NyaXB0aW9uID8gRHJpdmVQb3J0YWwuZXNjYXBlSFRNTCht -LmRlc2NyaXB0aW9uKSA6ICcnOwogICAgICAgICAgICBjb25zdCBtb2RlID0gbS5kaXNwbGF5TW9k -ZSA9PT0gJ2lubGluZScgPyAnSW5saW5lJyA6IG0uZGlzcGxheU1vZGUgPT09ICdwZGYtaWZyYW1l -JyA/ICdFaW5nZWJldHRldCcgOiAnQW5oYW5nJzsKICAgICAgICAgICAgcmV0dXJuICc8ZGl2IHN0 -eWxlPSJkaXNwbGF5OmZsZXg7IGFsaWduLWl0ZW1zOmNlbnRlcjsgZ2FwOjhweDsgcGFkZGluZzo0 -cHggMDsgYm9yZGVyLWJvdHRvbToxcHggc29saWQgdmFyKC0tYm9yZGVyLWxpZ2h0KTsgZm9udC1z -aXplOjEycHg7Ij4nICsKICAgICAgICAgICAgICAgICc8c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6 -NjAwOyBjb2xvcjp2YXIoLS10ZXh0LWhlYWRpbmcpOyBtaW4td2lkdGg6NDBweDsiPicgKyB0eXBl -ICsgJzwvc3Bhbj4nICsKICAgICAgICAgICAgICAgICc8c3BhbiBzdHlsZT0iZmxleDoxOyBvdmVy -ZmxvdzpoaWRkZW47IHRleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7IHdoaXRlLXNwYWNlOm5vd3JhcDsi -IHRpdGxlPSInICsgRHJpdmVQb3J0YWwuZXNjYXBlQXR0cihtLnVybCkgKyAnIj4nICsgdGl0bGUg -KyAnPC9zcGFuPicgKwogICAgICAgICAgICAgICAgJzxzcGFuIHN0eWxlPSJjb2xvcjp2YXIoLS10 -ZXh0LW11dGVkKTsgZm9udC1zaXplOjEwcHg7Ij4nICsgbW9kZSArICc8L3NwYW4+JyArCiAgICAg -ICAgICAgICAgICAnPGJ1dHRvbiBvbmNsaWNrPSJEcml2ZUVkaXRvci5lZGl0TWVkaWEoJyArIGkg -KyAnKSIgc3R5bGU9ImJhY2tncm91bmQ6bm9uZTsgYm9yZGVyOjFweCBzb2xpZCB2YXIoLS1ib3Jk -ZXItY29sb3IpOyBib3JkZXItcmFkaXVzOjNweDsgcGFkZGluZzoxcHggNnB4OyBmb250LXNpemU6 -MTFweDsgY3Vyc29yOnBvaW50ZXI7IGNvbG9yOnZhcigtLXRleHQtcHJpbWFyeSk7Ij5CZWFyYmVp -dGVuPC9idXR0b24+JyArCiAgICAgICAgICAgICAgICAnPGJ1dHRvbiBvbmNsaWNrPSJEcml2ZUVk -aXRvci5yZW1vdmVNZWRpYSgnICsgaSArICcpIiBzdHlsZT0iYmFja2dyb3VuZDpub25lOyBib3Jk -ZXI6MXB4IHNvbGlkICNkYzM1NDU7IGJvcmRlci1yYWRpdXM6M3B4OyBwYWRkaW5nOjFweCA2cHg7 -IGZvbnQtc2l6ZToxMXB4OyBjdXJzb3I6cG9pbnRlcjsgY29sb3I6I2RjMzU0NTsiPkzDtnNjaGVu -PC9idXR0b24+JyArCiAgICAgICAgICAgICc8L2Rpdj4nOwogICAgICAgIH0pLmpvaW4oJycpOwog -ICAgfSwKCiAgICBlZGl0TWVkaWEoaW5kZXgpIHsKICAgICAgICBpZiAoIXRoaXMuY3VycmVudERv -YyB8fCAhdGhpcy5jdXJyZW50RG9jLm1lZGlhcyB8fCAhdGhpcy5jdXJyZW50RG9jLm1lZGlhc1tp -bmRleF0pIHJldHVybjsKICAgICAgICBjb25zdCBtZWRpYSA9IHRoaXMuY3VycmVudERvYy5tZWRp -YXNbaW5kZXhdOwoKICAgICAgICBjb25zdCBuZXdUaXRsZSA9IHByb21wdCgnVGl0ZWw6JywgbWVk -aWEudGl0bGUgfHwgJycpOwogICAgICAgIGlmIChuZXdUaXRsZSA9PT0gbnVsbCkgcmV0dXJuOwog -ICAgICAgIG1lZGlhLnRpdGxlID0gbmV3VGl0bGU7CgogICAgICAgIGNvbnN0IG5ld0Rlc2MgPSBw -cm9tcHQoJ0Jlc2NocmVpYnVuZzonLCBtZWRpYS5kZXNjcmlwdGlvbiB8fCAnJyk7CiAgICAgICAg -aWYgKG5ld0Rlc2MgPT09IG51bGwpIHJldHVybjsKICAgICAgICBtZWRpYS5kZXNjcmlwdGlvbiA9 -IG5ld0Rlc2M7CgogICAgICAgIC8vIElubGluZS1NZWRpZW4gaW0gRWRpdG9yIGFrdHVhbGlzaWVy -ZW4gKGZpZ2NhcHRpb24pCiAgICAgICAgaWYgKG1lZGlhLm1lZGlhSWQpIHsKICAgICAgICAgICAg -Y29uc3QgZmlndXJlID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI2VkaXRvcklucHV0IFtkYXRh -LW1lZGlhLWlkPSInICsgbWVkaWEubWVkaWFJZCArICciXScpOwogICAgICAgICAgICBpZiAoZmln -dXJlKSB7CiAgICAgICAgICAgICAgICBsZXQgY2FwID0gZmlndXJlLnF1ZXJ5U2VsZWN0b3IoJ2Zp -Z2NhcHRpb24nKTsKICAgICAgICAgICAgICAgIGlmIChuZXdEZXNjKSB7CiAgICAgICAgICAgICAg -ICAgICAgaWYgKCFjYXApIHsgY2FwID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZmlnY2FwdGlv -bicpOyBmaWd1cmUuYXBwZW5kQ2hpbGQoY2FwKTsgfQogICAgICAgICAgICAgICAgICAgIGNhcC50 -ZXh0Q29udGVudCA9IG5ld0Rlc2M7CiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNhcCkgewog -ICAgICAgICAgICAgICAgICAgIGNhcC5yZW1vdmUoKTsKICAgICAgICAgICAgICAgIH0KICAgICAg -ICAgICAgfQogICAgICAgIH0KCiAgICAgICAgdGhpcy5fcmVuZGVyTWVkaWFMaXN0KCk7CiAgICAg -ICAgc2hvd1RvYXN0KCdBbmhhbmcgYWt0dWFsaXNpZXJ0JywgJ3N1Y2Nlc3MnKTsKICAgIH0sCgog -ICAgcmVtb3ZlTWVkaWEoaW5kZXgpIHsKICAgICAgICBpZiAoIXRoaXMuY3VycmVudERvYyB8fCAh -dGhpcy5jdXJyZW50RG9jLm1lZGlhcyB8fCAhdGhpcy5jdXJyZW50RG9jLm1lZGlhc1tpbmRleF0p -IHJldHVybjsKICAgICAgICBjb25zdCBtZWRpYSA9IHRoaXMuY3VycmVudERvYy5tZWRpYXNbaW5k -ZXhdOwogICAgICAgIGNvbnN0IG5hbWUgPSBtZWRpYS50aXRsZSB8fCBtZWRpYS51cmwuc3BsaXQo -Jy8nKS5wb3AoKTsKCiAgICAgICAgLy8gQmVzdGFldGlndW5nc2RpYWxvZyBhbHMgTW9kYWwgKHN0 -YXR0IGJyb3dzZXItbmF0aXZlbSBjb25maXJtKQogICAgICAgIHZhciBvdmVybGF5ID0gZG9jdW1l -bnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CiAgICAgICAgb3ZlcmxheS5zdHlsZS5jc3NUZXh0ID0g -J3Bvc2l0aW9uOmZpeGVkO2luc2V0OjA7ei1pbmRleDoxMTAwMDtiYWNrZ3JvdW5kOnJnYmEoMCww -LDAsMC41KTtkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO2p1c3RpZnktY29udGVudDpj -ZW50ZXI7JzsKICAgICAgICB2YXIgbW9kYWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYn -KTsKICAgICAgICBtb2RhbC5zdHlsZS5jc3NUZXh0ID0gJ2JhY2tncm91bmQ6dmFyKC0tYmctY2Fy -ZCwjZmZmKTtib3JkZXItcmFkaXVzOjEwcHg7cGFkZGluZzoyNHB4O21heC13aWR0aDo0MDBweDt3 -aWR0aDo5MCU7Ym94LXNoYWRvdzowIDhweCAzMnB4IHJnYmEoMCwwLDAsMC4yNSk7dGV4dC1hbGln -bjpjZW50ZXI7JzsKICAgICAgICBtb2RhbC5pbm5lckhUTUwgPQogICAgICAgICAgICAnPGRpdiBz -dHlsZT0iZm9udC1zaXplOjMycHg7bWFyZ2luLWJvdHRvbTo4cHg7Ij4mIzEyODQ2NTs8L2Rpdj4n -ICsKICAgICAgICAgICAgJzxkaXYgc3R5bGU9ImNvbG9yOnZhcigtLXRleHQtaGVhZGluZyk7Zm9u -dC1zaXplOjE1cHg7Zm9udC13ZWlnaHQ6NjAwO21hcmdpbi1ib3R0b206OHB4OyI+QW5oYW5nIGVu -dGZlcm5lbj88L2Rpdj4nICsKICAgICAgICAgICAgJzxkaXYgc3R5bGU9ImNvbG9yOnZhcigtLXRl -eHQtcHJpbWFyeSk7Zm9udC1zaXplOjEzcHg7bWFyZ2luLWJvdHRvbToxOHB4OyI+PHN0cm9uZz4n -ICsgRHJpdmVQb3J0YWwuZXNjYXBlSFRNTChuYW1lKSArICc8L3N0cm9uZz4gd2lyZCBhdXMgZGVt -IEFydGlrZWwgdW5kIHZvbSBTZXJ2ZXIgZ2Vsb2VzY2h0LjwvZGl2PicgKwogICAgICAgICAgICAn -PGRpdiBzdHlsZT0iZGlzcGxheTpmbGV4O2dhcDo4cHg7anVzdGlmeS1jb250ZW50OmNlbnRlcjsi -PicgKwogICAgICAgICAgICAgICAgJzxidXR0b24gaWQ9InJtTWVkaWFDYW5jZWwiIHN0eWxlPSJw -YWRkaW5nOjhweCAyMHB4O2JvcmRlci1yYWRpdXM6NnB4O2JvcmRlcjoxcHggc29saWQgdmFyKC0t -Ym9yZGVyLWNvbG9yKTtiYWNrZ3JvdW5kOnZhcigtLWJnLWNhcmQpO2NvbG9yOnZhcigtLXRleHQt -cHJpbWFyeSk7Y3Vyc29yOnBvaW50ZXI7Zm9udC1zaXplOjEzcHg7Ij5BYmJyZWNoZW48L2J1dHRv -bj4nICsKICAgICAgICAgICAgICAgICc8YnV0dG9uIGlkPSJybU1lZGlhQ29uZmlybSIgc3R5bGU9 -InBhZGRpbmc6OHB4IDIwcHg7Ym9yZGVyLXJhZGl1czo2cHg7Ym9yZGVyOm5vbmU7YmFja2dyb3Vu -ZDojZGMzNTQ1O2NvbG9yOiNmZmY7Y3Vyc29yOnBvaW50ZXI7Zm9udC13ZWlnaHQ6NjAwO2ZvbnQt -c2l6ZToxM3B4OyI+RW50ZmVybmVuPC9idXR0b24+JyArCiAgICAgICAgICAgICc8L2Rpdj4nOwog -ICAgICAgIG92ZXJsYXkuYXBwZW5kQ2hpbGQobW9kYWwpOwogICAgICAgIGRvY3VtZW50LmJvZHku -YXBwZW5kQ2hpbGQob3ZlcmxheSk7CgogICAgICAgIHZhciBzZWxmID0gdGhpczsKICAgICAgICBk -b2N1bWVudC5nZXRFbGVtZW50QnlJZCgncm1NZWRpYUNhbmNlbCcpLm9uY2xpY2sgPSBmdW5jdGlv -bigpIHsgb3ZlcmxheS5yZW1vdmUoKTsgfTsKICAgICAgICBvdmVybGF5Lm9uY2xpY2sgPSBmdW5j -dGlvbihlKSB7IGlmIChlLnRhcmdldCA9PT0gb3ZlcmxheSkgb3ZlcmxheS5yZW1vdmUoKTsgfTsK -ICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncm1NZWRpYUNvbmZpcm0nKS5vbmNsaWNr -ID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIG92ZXJsYXkucmVtb3ZlKCk7CgogICAgICAgICAg -ICAvLyBJbmxpbmUtRWxlbWVudCBhdXMgRWRpdG9yIGVudGZlcm5lbgogICAgICAgICAgICBpZiAo -bWVkaWEubWVkaWFJZCkgewogICAgICAgICAgICAgICAgdmFyIGZpZ3VyZSA9IGRvY3VtZW50LnF1 -ZXJ5U2VsZWN0b3IoJyNlZGl0b3JJbnB1dCBbZGF0YS1tZWRpYS1pZD0iJyArIG1lZGlhLm1lZGlh -SWQgKyAnIl0nKTsKICAgICAgICAgICAgICAgIGlmIChmaWd1cmUpIGZpZ3VyZS5yZW1vdmUoKTsK -ICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gRGF0ZWkgYXVmIGRlbSBTZXJ2ZXIgbG9lc2No -ZW4KICAgICAgICAgICAgaWYgKG1lZGlhLnVybCAmJiBEcml2ZUZTLm1vZGUgPT09ICdzZXJ2ZXIn -KSB7CiAgICAgICAgICAgICAgICBmZXRjaCgnL2FwaS9kZWxldGUnLCB7CiAgICAgICAgICAgICAg -ICAgICAgbWV0aG9kOiAnUE9TVCcsCiAgICAgICAgICAgICAgICAgICAgaGVhZGVyczogeyAnQ29u -dGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb247IGNoYXJzZXQ9dXRmLTgnIH0sCiAgICAgICAg -ICAgICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBwYXRoOiBtZWRpYS51cmwgfSkKICAg -ICAgICAgICAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uKCkge30pOwogICAgICAgICAgICB9CgogICAg -ICAgICAgICBzZWxmLmN1cnJlbnREb2MubWVkaWFzLnNwbGljZShpbmRleCwgMSk7CiAgICAgICAg -ICAgIHNlbGYuX3JlbmRlck1lZGlhTGlzdCgpOwogICAgICAgICAgICBzaG93VG9hc3QoJyInICsg -bmFtZSArICciIGVudGZlcm50JywgJ3N1Y2Nlc3MnKTsKICAgICAgICB9OwogICAgfSwKCiAgICAv -LyAtLS0gUGVzc2ltaXN0aWMgTG9ja2luZyAtLS0KICAgIGFzeW5jIGFjcXVpcmVMb2NrKGRvY0lk -KSB7CiAgICAgICAgaWYgKERyaXZlRlMubW9kZSA9PT0gJ3NlcnZlcicpIHsKICAgICAgICAgICAg -dHJ5IHsKICAgICAgICAgICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKCcvYXBpL2xvY2sn -LCB7CiAgICAgICAgICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCcsCiAgICAgICAgICAgICAgICAg -ICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb247IGNoYXJzZXQ9 -dXRmLTgnIH0sCiAgICAgICAgICAgICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBkb2NJ -ZDogZG9jSWQgfSkKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgaWYgKHJlcy5v -aykgcmV0dXJuIHsgb2s6IHRydWUgfTsKICAgICAgICAgICAgICAgIGNvbnN0IGRhdGEgPSBhd2Fp -dCByZXMuanNvbigpOwogICAgICAgICAgICAgICAgcmV0dXJuIHsgb2s6IGZhbHNlLCBieTogZGF0 -YS5ieSB8fCAnVW5iZWthbm50JywgbWludXRlczogZGF0YS5taW51dGVzIHx8ICc/JyB9OwogICAg -ICAgICAgICB9IGNhdGNoIHsKICAgICAgICAgICAgICAgIC8vIEtlaW4gU2VydmVyIG9kZXIgRmVo -bGVyOiBMb2NrIHVlYmVyc3ByaW5nZW4KICAgICAgICAgICAgICAgIHJldHVybiB7IG9rOiB0cnVl -IH07CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLy8gRmlsZXN5c3RlbS1Nb2R1czog -S2VpbiBMb2NraW5nIChTaW5nbGUtVXNlci1TemVuYXJpbykKICAgICAgICByZXR1cm4geyBvazog -dHJ1ZSB9OwogICAgfSwKCiAgICBhc3luYyByZWxlYXNlTG9jayhkb2NJZCkgewogICAgICAgIGlm -IChEcml2ZUZTLm1vZGUgPT09ICdzZXJ2ZXInKSB7CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAg -ICAgICAgICBhd2FpdCBmZXRjaCgnL2FwaS91bmxvY2snLCB7CiAgICAgICAgICAgICAgICAgICAg -bWV0aG9kOiAnUE9TVCcsCiAgICAgICAgICAgICAgICAgICAgaGVhZGVyczogeyAnQ29udGVudC1U -eXBlJzogJ2FwcGxpY2F0aW9uL2pzb247IGNoYXJzZXQ9dXRmLTgnIH0sCiAgICAgICAgICAgICAg -ICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBkb2NJZDogZG9jSWQgfSkKICAgICAgICAgICAg -ICAgIH0pOwogICAgICAgICAgICB9IGNhdGNoIHt9CiAgICAgICAgfQogICAgfSwKCiAgICAvLyAt -LS0gQ29udHJpYnV0aW9uIFR5cGUgRGlhbG9nIC0tLQogICAgc2hvd0NvbnRyaWJEaWFsb2coKSB7 -CiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NvbnRyaWJEaWFsb2cnKS5jbGFzc0xp -c3QuYWRkKCdhY3RpdmUnKTsKICAgIH0sCgogICAgY2xvc2VDb250cmliRGlhbG9nKCkgewogICAg -ICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb250cmliRGlhbG9nJykuY2xhc3NMaXN0LnJl -bW92ZSgnYWN0aXZlJyk7CiAgICB9LAoKICAgIHNldENvbnRyaWJUeXBlKHR5cGUpIHsKICAgICAg -ICB0aGlzLl9wZW5kaW5nQ29udHJpYlR5cGUgPSB0eXBlOwogICAgICAgIHRoaXMuY2xvc2VDb250 -cmliRGlhbG9nKCk7CiAgICAgICAgLy8gU2F2ZS1Qcm96ZXNzIGZvcnRzZXR6ZW4gKGNsb3NlQWZ0 -ZXIgYXVzIHZvcmhlcmlnZW0gQXVmcnVmIHVlYmVybmVobWVuKQogICAgICAgIHRoaXMuc2F2ZSh0 -aGlzLl9wZW5kaW5nQ2xvc2VBZnRlcik7CiAgICAgICAgdGhpcy5fcGVuZGluZ0Nsb3NlQWZ0ZXIg -PSBmYWxzZTsKICAgIH0KfTsKCi8vID09PT09PT09PT09PT09PT09PT09PSBNRURJQSBNT0RBTCA9 -PT09PT09PT09PT09PT09PT09PT0KCi8vID09PT09PT09PT09PT09PT09PT09PSBVTklWRVJTQUwg -TUVESUEgTU9EQUwgPT09PT09PT09PT09PT09PT09PT09CgpmdW5jdGlvbiBvcGVuTWVkaWFNb2Rh -bCh1cmwsIHR5cGUsIHRpdGxlKSB7CiAgICBjb25zdCBtb2RhbCA9IGRvY3VtZW50LmdldEVsZW1l -bnRCeUlkKCdtZWRpYU1vZGFsJyk7CiAgICBjb25zdCBjb250YWluZXIgPSBkb2N1bWVudC5nZXRF -bGVtZW50QnlJZCgnbWVkaWFNb2RhbENvbnRhaW5lcicpOwogICAgY29uc3Qgc2FmZVVybCA9IERy -aXZlUG9ydGFsLmVzY2FwZUF0dHIodXJsKTsKICAgIGNvbnN0IHNhZmVUaXRsZSA9IERyaXZlUG9y -dGFsLmVzY2FwZUhUTUwodGl0bGUgfHwgdXJsLnNwbGl0KCcvJykucG9wKCkpOwogICAgbGV0IGNv -bnRlbnQgPSAnJzsKICAgIGxldCB0b29sYmFyID0gJyc7CgogICAgc3dpdGNoICh0eXBlKSB7CiAg -ICAgICAgY2FzZSAnaW1hZ2UnOgogICAgICAgICAgICBjb250ZW50ID0gJzxpbWcgc3JjPSInICsg -c2FmZVVybCArICciIGFsdD0iJyArIERyaXZlUG9ydGFsLmVzY2FwZUF0dHIodGl0bGUgfHwgJycp -ICsgJyIgb25jbGljaz0idGhpcy5jbGFzc0xpc3QudG9nZ2xlKFwnem9vbWVkXCcpIj4nOwogICAg -ICAgICAgICB0b29sYmFyID0gJzxidXR0b24gb25jbGljaz0iZG9jdW1lbnQucXVlcnlTZWxlY3Rv -cihcJyNtZWRpYU1vZGFsQ29udGFpbmVyIGltZ1wnKS5jbGFzc0xpc3QudG9nZ2xlKFwnem9vbWVk -XCcpIj5ab29tPC9idXR0b24+JyArCiAgICAgICAgICAgICAgICAgICAgICAgJzxhIGhyZWY9Iicg -KyBzYWZlVXJsICsgJyIgZG93bmxvYWQ+SGVydW50ZXJsYWRlbjwvYT4nICsKICAgICAgICAgICAg -ICAgICAgICAgICAnPGJ1dHRvbiBvbmNsaWNrPSJ3aW5kb3cub3BlbihcJycgKyBzYWZlVXJsICsg -J1wnLFwnX2JsYW5rXCcpIj5JbiBuZXVlbSBUYWI8L2J1dHRvbj4nOwogICAgICAgICAgICBicmVh -azsKICAgICAgICBjYXNlICdwZGYnOgogICAgICAgICAgICAvLyBQREY6IE1heGltYWxlIEJyZWl0 -ZSB1bmQgSG9laGUgZnVlciBndXRlIExlc2JhcmtlaXQKICAgICAgICAgICAgdmFyIG1jID0gZG9j -dW1lbnQucXVlcnlTZWxlY3RvcignLm1lZGlhLW1vZGFsLWNvbnRlbnQnKTsKICAgICAgICAgICAg -bWMuc3R5bGUubWF4V2lkdGggPSAnOTV2dyc7CiAgICAgICAgICAgIG1jLnN0eWxlLndpZHRoID0g -JzEyMDBweCc7CiAgICAgICAgICAgIG1jLnN0eWxlLm1heEhlaWdodCA9ICc5NXZoJzsKICAgICAg -ICAgICAgbWMuc3R5bGUucGFkZGluZyA9ICcxMnB4JzsKICAgICAgICAgICAgY29udGVudCA9ICc8 -aWZyYW1lIHNyYz0iJyArIHNhZmVVcmwgKyAnIiBzdHlsZT0id2lkdGg6MTAwJTtoZWlnaHQ6ODJ2 -aDtib3JkZXI6bm9uZTtib3JkZXItcmFkaXVzOjRweDtiYWNrZ3JvdW5kOndoaXRlOyI+PC9pZnJh -bWU+JzsKICAgICAgICAgICAgdG9vbGJhciA9ICc8YSBocmVmPSInICsgc2FmZVVybCArICciIGRv -d25sb2FkPkhlcnVudGVybGFkZW48L2E+JyArCiAgICAgICAgICAgICAgICAgICAgICAgJzxidXR0 -b24gb25jbGljaz0id2luZG93Lm9wZW4oXCcnICsgc2FmZVVybCArICdcJyxcJ19ibGFua1wnKSI+ -SW4gbmV1ZW0gVGFiPC9idXR0b24+JzsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAn -dmlkZW8nOgogICAgICAgICAgICBjb250ZW50ID0gJzx2aWRlbyBjb250cm9scyBhdXRvcGxheSBz -dHlsZT0ibWF4LXdpZHRoOjEwMCU7bWF4LWhlaWdodDo3MHZoO2JvcmRlci1yYWRpdXM6OHB4OyI+ -JyArCiAgICAgICAgICAgICAgICAgICAgICAgJzxzb3VyY2Ugc3JjPSInICsgc2FmZVVybCArICci -PjwvdmlkZW8+JzsKICAgICAgICAgICAgdG9vbGJhciA9ICc8YSBocmVmPSInICsgc2FmZVVybCAr -ICciIGRvd25sb2FkPkhlcnVudGVybGFkZW48L2E+JzsKICAgICAgICAgICAgYnJlYWs7CiAgICAg -ICAgY2FzZSAnYXVkaW8nOgogICAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcubWVk -aWEtbW9kYWwtY29udGVudCcpLnN0eWxlLm1heFdpZHRoID0gJzYwMHB4JzsKICAgICAgICAgICAg -Y29udGVudCA9ICc8ZGl2IHN0eWxlPSJ0ZXh0LWFsaWduOmNlbnRlcjtwYWRkaW5nOjE2cHggMDsi -PicgKwogICAgICAgICAgICAgICAgICAgICAgICc8ZGl2IHN0eWxlPSJmb250LXNpemU6NDhweDtt -YXJnaW4tYm90dG9tOjEycHg7Ij4mIzEyNzkyNTs8L2Rpdj48L2Rpdj4nICsKICAgICAgICAgICAg -ICAgICAgICAgICAnPGRpdiBzdHlsZT0iYmFja2dyb3VuZDojZmZmO2JvcmRlci1yYWRpdXM6MzBw -eDtwYWRkaW5nOjZweCAxMHB4O3dpZHRoOjEwMCU7Ij4nICsKICAgICAgICAgICAgICAgICAgICAg -ICAnPGF1ZGlvIGNvbnRyb2xzIGF1dG9wbGF5IHNyYz0iJyArIHNhZmVVcmwgKyAnIiBzdHlsZT0i -ZGlzcGxheTpibG9jazt3aWR0aDoxMDAlO2hlaWdodDo0MHB4O2ZpbHRlcjpub25lOyI+PC9hdWRp -bz48L2Rpdj4nOwogICAgICAgICAgICB0b29sYmFyID0gJzxhIGhyZWY9IicgKyBzYWZlVXJsICsg -JyIgZG93bmxvYWQ+SGVydW50ZXJsYWRlbjwvYT4nOwogICAgICAgICAgICBicmVhazsKICAgICAg -ICBjYXNlICdkb2N4JzogY2FzZSAneGxzeCc6IGNhc2UgJ3BwdHgnOgogICAgICAgICAgICB2YXIg -dHlwZUxhYmVsID0gdHlwZS50b1VwcGVyQ2FzZSgpOwogICAgICAgICAgICBjb250ZW50ID0gJzxk -aXYgc3R5bGU9InRleHQtYWxpZ246Y2VudGVyO3BhZGRpbmc6MzBweCAwOyI+JyArCiAgICAgICAg -ICAgICAgICAgICAgICAgJzxzcGFuIGNsYXNzPSJkcml2ZS1maWxlLWljb24gJyArIHR5cGUgKyAn -IiBzdHlsZT0id2lkdGg6ODBweDtoZWlnaHQ6ODBweDtmb250LXNpemU6MjRweDttYXJnaW46MCBh -dXRvIDE1cHg7Ij4nICsgdHlwZUxhYmVsICsgJzwvc3Bhbj4nICsKICAgICAgICAgICAgICAgICAg -ICAgICAnPHAgc3R5bGU9ImNvbG9yOnZhcigtLXRleHQtc2Vjb25kYXJ5KTttYXJnaW4tdG9wOjEw -cHg7Ij5EaWVzZXMgRG9rdW1lbnQga2FubiBudXIgbG9rYWwgZ2VvZWZmbmV0IHdlcmRlbi48L3A+ -PC9kaXY+JzsKICAgICAgICAgICAgdG9vbGJhciA9ICc8YSBocmVmPSInICsgc2FmZVVybCArICci -IGRvd25sb2FkPkhlcnVudGVybGFkZW48L2E+JzsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAg -ZGVmYXVsdDoKICAgICAgICAgICAgY29udGVudCA9ICc8ZGl2IHN0eWxlPSJ0ZXh0LWFsaWduOmNl -bnRlcjtwYWRkaW5nOjMwcHggMDtmb250LXNpemU6NjRweDsiPiYjMTI4MTk2OzwvZGl2Pic7CiAg -ICAgICAgICAgIHRvb2xiYXIgPSAnPGEgaHJlZj0iJyArIHNhZmVVcmwgKyAnIiBkb3dubG9hZD5I -ZXJ1bnRlcmxhZGVuPC9hPic7CiAgICB9CgogICAgY29udGFpbmVyLmlubmVySFRNTCA9CiAgICAg -ICAgJzxkaXYgY2xhc3M9Im1lZGlhLW1vZGFsLXRpdGxlIj4nICsgc2FmZVRpdGxlICsgJzwvZGl2 -PicgKwogICAgICAgIGNvbnRlbnQgKwogICAgICAgICc8ZGl2IGNsYXNzPSJtZWRpYS1tb2RhbC10 -b29sYmFyIj4nICsgdG9vbGJhciArICc8L2Rpdj4nOwoKICAgIG1vZGFsLnN0eWxlLmRpc3BsYXkg -PSAnYmxvY2snOwogICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIG1lZGlh -TW9kYWxLZXlIYW5kbGVyKTsKfQoKZnVuY3Rpb24gY2xvc2VNZWRpYU1vZGFsKCkgewogICAgY29u -c3QgbW9kYWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWVkaWFNb2RhbCcpOwogICAgbW9k -YWwuc3R5bGUuZGlzcGxheSA9ICdub25lJzsKICAgIC8vIE1vZGFsLVN0eWxlcyB6dXJ1ZWNrc2V0 -emVuIChQREYvQXVkaW8gc2V0emVuIGVpZ2VuZSBHcm9lc3NlbikKICAgIHZhciBtYyA9IG1vZGFs -LnF1ZXJ5U2VsZWN0b3IoJy5tZWRpYS1tb2RhbC1jb250ZW50Jyk7CiAgICBpZiAobWMpIHsgbWMu -c3R5bGUubWF4V2lkdGggPSAnJzsgbWMuc3R5bGUud2lkdGggPSAnJzsgbWMuc3R5bGUubWF4SGVp -Z2h0ID0gJyc7IG1jLnN0eWxlLnBhZGRpbmcgPSAnJzsgfQogICAgLy8gQXVkaW8vVmlkZW8gc3Rv -cHBlbgogICAgbW9kYWwucXVlcnlTZWxlY3RvckFsbCgndmlkZW8sIGF1ZGlvJykuZm9yRWFjaChl -bCA9PiB7IGVsLnBhdXNlKCk7IGVsLnNyYyA9ICcnOyB9KTsKICAgIGRvY3VtZW50LnJlbW92ZUV2 -ZW50TGlzdGVuZXIoJ2tleWRvd24nLCBtZWRpYU1vZGFsS2V5SGFuZGxlcik7Cn0KCmZ1bmN0aW9u -IG1lZGlhTW9kYWxLZXlIYW5kbGVyKGUpIHsKICAgIGlmIChlLmtleSA9PT0gJ0VzY2FwZScpIGNs -b3NlTWVkaWFNb2RhbCgpOwp9CgovLyA9PT09PT09PT09PT09PT09PT09PT0gR09WRVJOQU5DRSA9 -PT09PT09PT09PT09PT09PT09PT0KCi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 -PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci8vIE1vZHVsOiBE -cml2ZUdvdmVybmFuY2UgLSBSb2xsZW4sIEZyZWlnYWJlLVdvcmtmbG93LCBBZG1pbi1QYW5lbAov -LyBadXN0YWVuZGlnIGZ1ZXI6IExhZGVuIGRlciBHb3Zlcm5hbmNlLURhdGVuLCBCZXJlY2h0aWd1 -bmdzcHJ1ZWZ1bmcsIFJldmlldy1VSSwgQXVkaXQtVHJhaWwKLy8gU2ljaGVyaGVpdDogQ2xpZW50 -LXNlaXRpZ2UgQmVyZWNodGlndW5nc3BydWVmdW5nZW4gKGNhbkFwcHJvdmUsIGNhblNlZURvY3Vt -ZW50LCBpc1N1cGVyVXNlcikKLy8gICAgICAgICAgICAgc3RldWVybiBudXIgZGllIFVJLURhcnN0 -ZWxsdW5nLiBEaWUgdGF0c2FlY2hsaWNoZSBBdXRvcmlzaWVydW5nIGVyZm9sZ3Qgc2VydmVyc2Vp -dGlnCi8vICAgICAgICAgICAgIGluIHNlcnZlci5wczEgLyBzZXJ2ZXIucHkgKFRlc3QtU3VwZXJV -c2VyLCBUZXN0LVJldmlld2VyKSBiZWkgamVkZW0gU2NocmVpYnp1Z3JpZmYuCi8vICAgICAgICAg -ICAgIGdvdmVybmFuY2UuanNvbiBpc3QgaW0gU2VydmVyLU1vZHVzIEFFUy0yNTYtdmVyc2NobHVl -c3NlbHQgKHNpZWhlIHNlcnZlci5wczEpLgovLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09 -PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpjb25zdCBE -cml2ZUdvdmVybmFuY2UgPSB7CiAgICBkYXRhOiBudWxsLAogICAgY3VycmVudFVzZXI6IG51bGws -CiAgICBjdXJyZW50RG9tYWluOiBudWxsLAogICAgX2lzU3VwZXJVc2VyOiBmYWxzZSwKICAgIF9y -ZXZpZXdEaWFsb2dDYWxsYmFjazogbnVsbCwKICAgIF9yZXZpZXdEaWFsb2dBY3Rpb246IG51bGws -CiAgICBfZWRpdGluZ1Jldmlld2VySW5kZXg6IC0xLAoKICAgIGFzeW5jIGxvYWQoKSB7CiAgICAg -ICAgdHJ5IHsKICAgICAgICAgICAgaWYgKERyaXZlRlMubW9kZSA9PT0gJ3NlcnZlcicpIHsKICAg -ICAgICAgICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKCcvYXBpL2dvdmVybmFuY2UnKTsK -ICAgICAgICAgICAgICAgIGlmIChyZXMub2spIHsKICAgICAgICAgICAgICAgICAgICBjb25zdCBy -ZXN1bHQgPSBhd2FpdCByZXMuanNvbigpOwogICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YSA9 -IHJlc3VsdC5nb3Zlcm5hbmNlOwogICAgICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudFVzZXIg -PSByZXN1bHQuY3VycmVudFVzZXI7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50RG9t -YWluID0gcmVzdWx0LmN1cnJlbnREb21haW47CiAgICAgICAgICAgICAgICAgICAgdGhpcy5faXNT -dXBlclVzZXIgPSByZXN1bHQuaXNTdXBlclVzZXI7CiAgICAgICAgICAgICAgICAgICAgdGhpcy51 -cGRhdGVVSSgpOwogICAgICAgICAgICAgICAgICAgIHRoaXMubG9hZEhlbHBDb250ZW50KCk7CiAg -ICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5sb2FkU3RhcnRzZWl0ZSgpOwogICAgICAgICAg -ICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAg -IH0gY2F0Y2gge30KCiAgICAgICAgLy8gU3RhdGlzY2hlciBNb2R1czogR292ZXJuYW5jZSBhdXMg -ZWluZ2ViZXR0ZXRlbiBEYXRlbiBsYWRlbgogICAgICAgIGlmIChEcml2ZUZTLm1vZGUgPT09ICdz -dGF0aWMnKSB7CiAgICAgICAgICAgIGlmICh0eXBlb2YgRFJJVkVfU1RBVElDX0lOREVYICE9PSAn -dW5kZWZpbmVkJyAmJiBEUklWRV9TVEFUSUNfSU5ERVggJiYgRFJJVkVfU1RBVElDX0lOREVYLmdv -dmVybmFuY2UpIHsKICAgICAgICAgICAgICAgIC8vIExlc2JhcmUgR292ZXJuYW5jZS1EYXRlbiBh -dXMgaW5kZXguanMgKFNldHRpbmdzICsgUmV2aWV3ZXItSW5mbykKICAgICAgICAgICAgICAgIHRo -aXMuZGF0YSA9IERSSVZFX1NUQVRJQ19JTkRFWC5nb3Zlcm5hbmNlOwogICAgICAgICAgICB9CiAg -ICAgICAgfQoKICAgICAgICAvLyBGaWxlc3lzdGVtLU1vZHVzOiBnb3Zlcm5hbmNlLmpzb24gYXVz -IEhhbmRsZSBsYWRlbgogICAgICAgIGlmIChEcml2ZUZTLm1vZGUgPT09ICdmaWxlc3lzdGVtJyAm -JiBEcml2ZUZTLl9kYXRhSGFuZGxlKSB7CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAg -ICBjb25zdCBmaCA9IGF3YWl0IERyaXZlRlMuX2RhdGFIYW5kbGUuZ2V0RmlsZUhhbmRsZSgnZ292 -ZXJuYW5jZS5qc29uJyk7CiAgICAgICAgICAgICAgICBjb25zdCBmaWxlID0gYXdhaXQgZmguZ2V0 -RmlsZSgpOwogICAgICAgICAgICAgICAgdGhpcy5kYXRhID0gSlNPTi5wYXJzZShhd2FpdCBmaWxl -LnRleHQoKSk7CiAgICAgICAgICAgIH0gY2F0Y2gge30KICAgICAgICB9CgogICAgICAgIHRoaXMu -Y3VycmVudFVzZXIgPSBEcml2ZUZTLmVudmlyb24gPyBEcml2ZUZTLmVudmlyb24udXNlcm5hbWUg -OiBudWxsOwogICAgICAgIHRoaXMuY3VycmVudERvbWFpbiA9IERyaXZlRlMuZW52aXJvbiA/IChE -cml2ZUZTLmVudmlyb24udXNlcmRvbWFpbiB8fCAnKicpIDogJyonOwogICAgICAgIHRoaXMuX2lz -U3VwZXJVc2VyID0gdGhpcy5fY2hlY2tTdXBlclVzZXIoKTsKICAgICAgICB0aGlzLnVwZGF0ZVVJ -KCk7CiAgICAgICAgdGhpcy5sb2FkSGVscENvbnRlbnQoKTsKICAgICAgICBhd2FpdCB0aGlzLmxv -YWRTdGFydHNlaXRlKCk7CiAgICB9LAoKICAgIF9jaGVja1N1cGVyVXNlcigpIHsKICAgICAgICBp -ZiAoIXRoaXMuZGF0YSB8fCAhdGhpcy5kYXRhLnN1cGVyVXNlcnMpIHJldHVybiB0cnVlOyAvLyBL -ZWluIEdvdmVybmFuY2UgPSBhbGxlcyBlcmxhdWJ0CiAgICAgICAgY29uc3QgdXNlciA9ICh0aGlz -LmN1cnJlbnRVc2VyIHx8ICcnKS50b0xvd2VyQ2FzZSgpOwogICAgICAgIGNvbnN0IGRvbWFpbiA9 -ICh0aGlzLmN1cnJlbnREb21haW4gfHwgJycpLnRvTG93ZXJDYXNlKCk7CiAgICAgICAgcmV0dXJu -IHRoaXMuZGF0YS5zdXBlclVzZXJzLnNvbWUoc3UgPT4KICAgICAgICAgICAgc3UudXNlcm5hbWUu -dG9Mb3dlckNhc2UoKSA9PT0gdXNlciAmJiAoc3UuZG9tYWluID09PSAnKicgfHwgc3UuZG9tYWlu -LnRvTG93ZXJDYXNlKCkgPT09IGRvbWFpbikKICAgICAgICApOwogICAgfSwKCiAgICBpc1N1cGVy -VXNlcigpIHsgcmV0dXJuIHRoaXMuX2lzU3VwZXJVc2VyOyB9LAoKICAgIGlzRmFjaGF1ZnNpY2h0 -KCkgewogICAgICAgIGlmICghdGhpcy5kYXRhIHx8ICF0aGlzLmRhdGEuZmFjaGF1ZnNpY2h0KSBy -ZXR1cm4gZmFsc2U7CiAgICAgICAgdmFyIHVzZXIgPSAodGhpcy5jdXJyZW50VXNlciB8fCAnJyku -dG9Mb3dlckNhc2UoKTsKICAgICAgICB2YXIgZG9tYWluID0gKHRoaXMuY3VycmVudERvbWFpbiB8 -fCAnJykudG9Mb3dlckNhc2UoKTsKICAgICAgICByZXR1cm4gdGhpcy5kYXRhLmZhY2hhdWZzaWNo -dC5zb21lKGZ1bmN0aW9uKGZhKSB7CiAgICAgICAgICAgIHJldHVybiBmYS51c2VybmFtZS50b0xv -d2VyQ2FzZSgpID09PSB1c2VyICYmIChmYS5kb21haW4gPT09ICcqJyB8fCBmYS5kb21haW4udG9M -b3dlckNhc2UoKSA9PT0gZG9tYWluKTsKICAgICAgICB9KTsKICAgIH0sCgogICAgaXNSZXZpZXdl -cihrYXRlZ29yaWUpIHsKICAgICAgICBpZiAoIXRoaXMuZGF0YSB8fCAhdGhpcy5kYXRhLnJldmll -d2VycykgcmV0dXJuIGZhbHNlOwogICAgICAgIGNvbnN0IHVzZXIgPSAodGhpcy5jdXJyZW50VXNl -ciB8fCAnJykudG9Mb3dlckNhc2UoKTsKICAgICAgICBjb25zdCBkb21haW4gPSAodGhpcy5jdXJy -ZW50RG9tYWluIHx8ICcnKS50b0xvd2VyQ2FzZSgpOwogICAgICAgIHJldHVybiB0aGlzLmRhdGEu -cmV2aWV3ZXJzLnNvbWUociA9PgogICAgICAgICAgICByLnVzZXJuYW1lLnRvTG93ZXJDYXNlKCkg -PT09IHVzZXIgJiYKICAgICAgICAgICAgKHIuZG9tYWluID09PSAnKicgfHwgci5kb21haW4udG9M -b3dlckNhc2UoKSA9PT0gZG9tYWluKSAmJgogICAgICAgICAgICByLmthdGVnb3JpZW4gJiYgci5r -YXRlZ29yaWVuLmluY2x1ZGVzKGthdGVnb3JpZSkKICAgICAgICApOwogICAgfSwKCiAgICBnZXRS -ZXZpZXdhYmxlQ2F0ZWdvcmllcygpIHsKICAgICAgICBpZiAoIXRoaXMuZGF0YSB8fCAhdGhpcy5k -YXRhLnJldmlld2VycykgcmV0dXJuIFtdOwogICAgICAgIGNvbnN0IGNhdHMgPSBbXTsKICAgICAg -ICBjb25zdCB1c2VyID0gKHRoaXMuY3VycmVudFVzZXIgfHwgJycpLnRvTG93ZXJDYXNlKCk7CiAg -ICAgICAgY29uc3QgZG9tYWluID0gKHRoaXMuY3VycmVudERvbWFpbiB8fCAnJykudG9Mb3dlckNh -c2UoKTsKICAgICAgICB0aGlzLmRhdGEucmV2aWV3ZXJzLmZvckVhY2gociA9PiB7CiAgICAgICAg -ICAgIGlmIChyLnVzZXJuYW1lLnRvTG93ZXJDYXNlKCkgPT09IHVzZXIgJiYgKHIuZG9tYWluID09 -PSAnKicgfHwgci5kb21haW4udG9Mb3dlckNhc2UoKSA9PT0gZG9tYWluKSkgewogICAgICAgICAg -ICAgICAgKHIua2F0ZWdvcmllbiB8fCBbXSkuZm9yRWFjaChrID0+IHsgaWYgKCFjYXRzLmluY2x1 -ZGVzKGspKSBjYXRzLnB1c2goayk7IH0pOwogICAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICAg -ICAgcmV0dXJuIGNhdHM7CiAgICB9LAoKICAgIC8vIFNpY2h0YmFya2VpdHNmaWx0ZXIgKHJlaW4g -Y2xpZW50LXNlaXRpZywgc3RldWVydCBVSS1EYXJzdGVsbHVuZyk6CiAgICAgICAgLy8gLSBGcmVp -Z2VnZWJlbmUgRG9rdW1lbnRlOiBmdWVyIGFsbGUgc2ljaHRiYXIKICAgICAgICAvLyAtIEVudHd1 -ZXJmZS9BYmdlbGVobnRlOiBudXIgZnVlciBBdXRvciwgenVzdGFlbmRpZ2UgUmV2aWV3ZXIgdW5k -IFN1cGVyVXNlcgogICAgICAgIC8vIEhpbndlaXM6IERpZXMgaXN0IGtlaW5lIFp1Z3JpZmZza29u -dHJvbGxlIC0gZGllIERva3VtZW50ZSBsaWVnZW4gYWxzIERhdGVpZW4gaW0gZGF0YS8tT3JkbmVy -LgogICAgICAgIC8vIERlciBGaWx0ZXIgdmVyaGluZGVydCwgZGFzcyBCZW51dHplciBpbiBkZXIg -T2JlcmZsYWVjaGUgRG9rdW1lbnRlIHNlaGVuLCBkaWUgc2llIG5pY2h0IGJlYXJiZWl0ZW4gc29s -bGVuLgogICAgY2FuU2VlRG9jdW1lbnQoZG9jKSB7CiAgICAgICAgaWYgKCF0aGlzLmRhdGEpIHJl -dHVybiB0cnVlOyAvLyBLZWluIEdvdmVybmFuY2UgPSBhbGxlcyBzaWNodGJhcgogICAgICAgIC8v -IEZyZWlnZWdlYmVuZSBEb2t1bWVudGU6IGFsbGUgc2VoZW4KICAgICAgICBpZiAoZG9jLnN0YXR1 -cyA9PT0gJ0ZyZWlnZWdlYmVuJykgcmV0dXJuIHRydWU7CiAgICAgICAgLy8gRWlnZW5lIERva3Vt -ZW50ZTogQXV0b3Igc2llaHQgaW1tZXIKICAgICAgICBjb25zdCB1c2VyID0gKHRoaXMuY3VycmVu -dFVzZXIgfHwgJycpLnRvTG93ZXJDYXNlKCk7CiAgICAgICAgaWYgKChkb2MuZXJzdGVsbHRWb24g -fHwgJycpLnRvTG93ZXJDYXNlKCkgPT09IHVzZXIgfHwgKGRvYy5iZWFyYmVpdGV0Vm9uIHx8ICcn -KS50b0xvd2VyQ2FzZSgpID09PSB1c2VyKSByZXR1cm4gdHJ1ZTsKICAgICAgICAvLyBTdXBlclVz -ZXIvRmFjaGF1ZnNpY2h0IHNpZWh0IGFsbGVzCiAgICAgICAgaWYgKHRoaXMuaXNTdXBlclVzZXIo -KSB8fCB0aGlzLmlzRmFjaGF1ZnNpY2h0KCkpIHJldHVybiB0cnVlOwogICAgICAgIC8vIFJldmll -d2VyIHNpZWh0IERva3VtZW50ZSBpbiBzZWluZW4gS2F0ZWdvcmllbgogICAgICAgIGlmICh0aGlz -LmlzUmV2aWV3ZXIoZG9jLmthdGVnb3JpZSkpIHJldHVybiB0cnVlOwogICAgICAgIHJldHVybiBm -YWxzZTsKICAgIH0sCgogICAgY2FuQXBwcm92ZShkb2MpIHsKICAgICAgICBpZiAodGhpcy5pc1N1 -cGVyVXNlcigpIHx8IHRoaXMuaXNGYWNoYXVmc2ljaHQoKSkgcmV0dXJuIHRydWU7CiAgICAgICAg -cmV0dXJuIHRoaXMuaXNSZXZpZXdlcihkb2Mua2F0ZWdvcmllKTsKICAgIH0sCgogICAgY2FuU2V0 -U3RhdHVzKHN0YXR1cykgewogICAgICAgIGlmICh0aGlzLmlzU3VwZXJVc2VyKCkgfHwgdGhpcy5p -c0ZhY2hhdWZzaWNodCgpKSByZXR1cm4gdHJ1ZTsKICAgICAgICBpZiAoc3RhdHVzID09PSAnRW50 -d3VyZicgfHwgc3RhdHVzID09PSAnUHLDvGZ1bmcnKSByZXR1cm4gdHJ1ZTsKICAgICAgICByZXR1 -cm4gZmFsc2U7IC8vIEZyZWlnZWdlYmVuL0FiZ2VsZWhudCBudXIgZnVlciBSZXZpZXdlci9TdXBl -clVzZXIKICAgIH0sCgogICAgLy8gLS0tIFVJIFVwZGF0ZXMgLS0tCiAgICB1cGRhdGVVSSgpIHsK -ICAgICAgICAvLyBSZXZpZXcgQmFkZ2UKICAgICAgICBjb25zdCBiYWRnZSA9IGRvY3VtZW50Lmdl -dEVsZW1lbnRCeUlkKCdyZXZpZXdCYWRnZScpOwogICAgICAgIGNvbnN0IHBlbmRpbmcgPSB0aGlz -LmdldFBlbmRpbmdSZXZpZXdzKCk7CiAgICAgICAgaWYgKHBlbmRpbmcubGVuZ3RoID4gMCAmJiAo -dGhpcy5pc1N1cGVyVXNlcigpIHx8IHRoaXMuaXNGYWNoYXVmc2ljaHQoKSB8fCB0aGlzLmdldFJl -dmlld2FibGVDYXRlZ29yaWVzKCkubGVuZ3RoID4gMCkpIHsKICAgICAgICAgICAgYmFkZ2Uuc3R5 -bGUuZGlzcGxheSA9ICcnOwogICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmV2 -aWV3Q291bnQnKS50ZXh0Q29udGVudCA9IHBlbmRpbmcubGVuZ3RoOwogICAgICAgIH0gZWxzZSB7 -CiAgICAgICAgICAgIGJhZGdlLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7CiAgICAgICAgfQoKICAg -ICAgICAvLyBHb3Zlcm5hbmNlIEFkbWluIEJ1dHRvbiAobnVyIFN1cGVyVXNlci9GYWNoYXVmc2lj -aHQgaW0gU2VydmVyLU1vZHVzKQogICAgICAgIGNvbnN0IGFkbWluQnRuID0gZG9jdW1lbnQuZ2V0 -RWxlbWVudEJ5SWQoJ2J0bkdvdkFkbWluJyk7CiAgICAgICAgYWRtaW5CdG4uc3R5bGUuZGlzcGxh -eSA9IChEcml2ZUZTLm1vZGUgPT09ICdzZXJ2ZXInICYmICh0aGlzLmlzU3VwZXJVc2VyKCkgfHwg -dGhpcy5pc0ZhY2hhdWZzaWNodCgpKSkgPyAnJyA6ICdub25lJzsKICAgIH0sCgogICAgZ2V0UGVu -ZGluZ1Jldmlld3MoKSB7CiAgICAgICAgaWYgKCFEcml2ZUZTLmRvY3VtZW50cykgcmV0dXJuIFtd -OwogICAgICAgIGNvbnN0IGNhdHMgPSAodGhpcy5pc1N1cGVyVXNlcigpIHx8IHRoaXMuaXNGYWNo -YXVmc2ljaHQoKSkKICAgICAgICAgICAgPyAoRHJpdmVGUy5jb25maWcua2F0ZWdvcmllbiB8fCBb -XSkKICAgICAgICAgICAgOiB0aGlzLmdldFJldmlld2FibGVDYXRlZ29yaWVzKCk7CiAgICAgICAg -cmV0dXJuIERyaXZlRlMuZG9jdW1lbnRzLmZpbHRlcihkb2MgPT4KICAgICAgICAgICAgZG9jLnN0 -YXR1cyA9PT0gJ1Byw7xmdW5nJyAmJiBjYXRzLmluY2x1ZGVzKGRvYy5rYXRlZ29yaWUpCiAgICAg -ICAgKTsKICAgIH0sCgogICAgLy8gLS0tIFJldmlldyBRdWV1ZSBQYW5lbCAtLS0KICAgIHNob3dR -dWV1ZSgpIHsKICAgICAgICBjb25zdCBwYW5lbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdy -ZXZpZXdQYW5lbCcpOwogICAgICAgIGNvbnN0IGJvZHkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJ -ZCgncmV2aWV3UGFuZWxCb2R5Jyk7CiAgICAgICAgY29uc3QgcGVuZGluZyA9IHRoaXMuZ2V0UGVu -ZGluZ1Jldmlld3MoKTsKCiAgICAgICAgaWYgKHBlbmRpbmcubGVuZ3RoID09PSAwKSB7CiAgICAg -ICAgICAgIGJvZHkuaW5uZXJIVE1MID0gJzxkaXYgc3R5bGU9InRleHQtYWxpZ246Y2VudGVyOyBw -YWRkaW5nOjQwcHg7IGNvbG9yOnZhcigtLXRleHQtbXV0ZWQpOyI+S2VpbmUgb2ZmZW5lbiBQcsO8 -ZnVuZ2VuLjwvZGl2Pic7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgYm9keS5pbm5lckhU -TUwgPSBwZW5kaW5nLm1hcChkb2MgPT4gewogICAgICAgICAgICAgICAgY29uc3QgZ292ID0gZG9j -LmdvdmVybmFuY2UgfHwge307CiAgICAgICAgICAgICAgICBjb25zdCBzdWJtaXR0ZWQgPSBnb3Yu -c3VibWl0dGVkRm9yUmV2aWV3IHx8IGRvYy5nZWFlbmRlcnQgfHwgJyc7CiAgICAgICAgICAgICAg -ICByZXR1cm4gJzxkaXYgY2xhc3M9InJldmlldy1pdGVtIj4nICsKICAgICAgICAgICAgICAgICAg -ICAnPGRpdiBjbGFzcz0icmV2aWV3LWl0ZW0tdGl0bGUiPicgKyBEcml2ZVBvcnRhbC5lc2NhcGVI -VE1MKGRvYy50aXRlbCkgKyAnPC9kaXY+JyArCiAgICAgICAgICAgICAgICAgICAgJzxkaXYgY2xh -c3M9InJldmlldy1pdGVtLW1ldGEiPicgKwogICAgICAgICAgICAgICAgICAgICAgICAnPHNwYW4+ -JyArIERyaXZlUG9ydGFsLmVzY2FwZUhUTUwoZG9jLmthdGVnb3JpZSkgKyAnPC9zcGFuPicgKwog -ICAgICAgICAgICAgICAgICAgICAgICAnPHNwYW4+dm9uICcgKyBEcml2ZVBvcnRhbC5lc2NhcGVI -VE1MKGRvYy5lcnN0ZWxsdFZvbiB8fCBkb2MuYmVhcmJlaXRldFZvbiB8fCAnLScpICsgJzwvc3Bh -bj4nICsKICAgICAgICAgICAgICAgICAgICAgICAgJzxzcGFuPicgKyBmb3JtYXREYXRlKHN1Ym1p -dHRlZCkgKyAnPC9zcGFuPicgKwogICAgICAgICAgICAgICAgICAgICc8L2Rpdj4nICsKICAgICAg -ICAgICAgICAgICAgICAnPGRpdiBjbGFzcz0icmV2aWV3LWl0ZW0tYWN0aW9ucyI+JyArCiAgICAg -ICAgICAgICAgICAgICAgICAgICc8YnV0dG9uIGNsYXNzPSJidG4tYXBwcm92ZSIgb25jbGljaz0i -ZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7IERyaXZlR292ZXJuYW5jZS5yZXZpZXdBbmRPcGVuKFwn -JyArIERyaXZlUG9ydGFsLmVzY2FwZUF0dHIoZG9jLmlkKSArICdcJykiPlByw7xmZW48L2J1dHRv -bj4nICsKICAgICAgICAgICAgICAgICAgICAgICAgJzxidXR0b24gY2xhc3M9ImJ0bi1yZWplY3Qi -IG9uY2xpY2s9ImV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOyBEcml2ZUdvdmVybmFuY2Uub3BlblJl -dmlld0RpYWxvZyhcJycgKyBEcml2ZVBvcnRhbC5lc2NhcGVBdHRyKGRvYy5pZCkgKyAnXCcsIFwn -cmVqZWN0XCcpIj5BYmxlaG5lbiB1bmQgQmVncsO8bmRlbjwvYnV0dG9uPicgKwogICAgICAgICAg -ICAgICAgICAgICc8L2Rpdj4nICsKICAgICAgICAgICAgICAgICc8L2Rpdj4nOwogICAgICAgICAg -ICB9KS5qb2luKCcnKTsKICAgICAgICB9CgogICAgICAgIHBhbmVsLmNsYXNzTGlzdC5hZGQoJ2Fj -dGl2ZScpOwogICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyZXZpZXdQYW5lbE92ZXJs -YXknKS5jbGFzc0xpc3QuYWRkKCdhY3RpdmUnKTsKICAgIH0sCgogICAgY2xvc2VRdWV1ZSgpIHsK -ICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmV2aWV3UGFuZWwnKS5jbGFzc0xpc3Qu -cmVtb3ZlKCdhY3RpdmUnKTsKICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmV2aWV3 -UGFuZWxPdmVybGF5JykuY2xhc3NMaXN0LnJlbW92ZSgnYWN0aXZlJyk7CiAgICB9LAoKICAgIC8v -IEFydGlrZWwgb2VmZm5lbiB1bmQgUGFuZWwgc2NobGllc3NlbgogICAgYXN5bmMgcmV2aWV3QW5k -T3Blbihkb2NJZCkgewogICAgICAgIHRoaXMuY2xvc2VRdWV1ZSgpOwogICAgICAgIGF3YWl0IERy -aXZlUG9ydGFsLnNlbGVjdERvY3VtZW50KGRvY0lkKTsKICAgICAgICBEcml2ZVBvcnRhbC5oaWdo -bGlnaHRJdGVtKGRvY0lkKTsKICAgIH0sCgogICAgLy8gLS0tIFJldmlldyBEaWFsb2cgLS0tCiAg -ICAvLyBSZXZpZXdlci1GYXJicGFsZXR0ZSAoYmlzIHp1IDggdW50ZXJzY2hpZWRsaWNoZSBSZXZp -ZXdlcikKICAgIF9yZXZpZXdlckNvbG9yczogWwogICAgICAgIHsgYmc6ICcjZThmNWU5JywgYm9y -ZGVyOiAnIzJlN2QzMicsIHRleHQ6ICcjMWI1ZTIwJyB9LAogICAgICAgIHsgYmc6ICcjZTNmMmZk -JywgYm9yZGVyOiAnIzE1NjVjMCcsIHRleHQ6ICcjMGQ0N2ExJyB9LAogICAgICAgIHsgYmc6ICcj -ZmZmM2UwJywgYm9yZGVyOiAnI2U2NTEwMCcsIHRleHQ6ICcjYmYzNjBjJyB9LAogICAgICAgIHsg -Ymc6ICcjZjNlNWY1JywgYm9yZGVyOiAnIzdiMWZhMicsIHRleHQ6ICcjNGExNDhjJyB9LAogICAg -ICAgIHsgYmc6ICcjZTBmN2ZhJywgYm9yZGVyOiAnIzAwODM4ZicsIHRleHQ6ICcjMDA2MDY0JyB9 -LAogICAgICAgIHsgYmc6ICcjZmNlNGVjJywgYm9yZGVyOiAnI2M2MjgyOCcsIHRleHQ6ICcjYjcx -YzFjJyB9LAogICAgICAgIHsgYmc6ICcjZjFmOGU5JywgYm9yZGVyOiAnIzU1OGIyZicsIHRleHQ6 -ICcjMzM2OTFlJyB9LAogICAgICAgIHsgYmc6ICcjZWRlN2Y2JywgYm9yZGVyOiAnIzQ1MjdhMCcs -IHRleHQ6ICcjMzExYjkyJyB9CiAgICBdLAoKICAgIF9nZXRSZXZpZXdlckNvbG9yKHJldmlld2Vy -TmFtZSkgewogICAgICAgIGlmICghdGhpcy5fcmV2aWV3ZXJDb2xvck1hcCkgdGhpcy5fcmV2aWV3 -ZXJDb2xvck1hcCA9IHt9OwogICAgICAgIGlmICh0aGlzLl9yZXZpZXdlckNvbG9yTWFwW3Jldmll -d2VyTmFtZV0pIHJldHVybiB0aGlzLl9yZXZpZXdlckNvbG9yTWFwW3Jldmlld2VyTmFtZV07CiAg -ICAgICAgdmFyIGlkeCA9IE9iamVjdC5rZXlzKHRoaXMuX3Jldmlld2VyQ29sb3JNYXApLmxlbmd0 -aCAlIHRoaXMuX3Jldmlld2VyQ29sb3JzLmxlbmd0aDsKICAgICAgICB0aGlzLl9yZXZpZXdlckNv -bG9yTWFwW3Jldmlld2VyTmFtZV0gPSB0aGlzLl9yZXZpZXdlckNvbG9yc1tpZHhdOwogICAgICAg -IHJldHVybiB0aGlzLl9yZXZpZXdlckNvbG9yTWFwW3Jldmlld2VyTmFtZV07CiAgICB9LAoKICAg -IG9wZW5SZXZpZXdEaWFsb2coZG9jSWQsIGFjdGlvbikgewogICAgICAgIGNvbnN0IGRvYyA9IERy -aXZlRlMuZG9jdW1lbnRzLmZpbmQoZCA9PiBkLmlkID09PSBkb2NJZCk7CiAgICAgICAgaWYgKCFk -b2MpIHJldHVybjsKCiAgICAgICAgdmFyIGhlYWRlckVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5 -SWQoJ3Jldmlld0RpYWxvZ0hlYWRlcicpOwogICAgICAgIHZhciBpbmZvID0gZG9jdW1lbnQuZ2V0 -RWxlbWVudEJ5SWQoJ3Jldmlld0RpYWxvZ0luZm8nKTsKICAgICAgICB2YXIgaGludCA9IGRvY3Vt -ZW50LmdldEVsZW1lbnRCeUlkKCdyZXZpZXdEaWFsb2dIaW50Jyk7CiAgICAgICAgdmFyIHRleHRh -cmVhID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Jldmlld0RpYWxvZ0NvbW1lbnQnKTsKICAg -ICAgICB2YXIgY29uZmlybUJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyZXZpZXdEaWFs -b2dDb25maXJtJyk7CiAgICAgICAgdmFyIGFydGljbGVDb250ZW50ID0gZG9jdW1lbnQuZ2V0RWxl -bWVudEJ5SWQoJ3Jldmlld0FydGljbGVDb250ZW50Jyk7CiAgICAgICAgdmFyIHByZXZDb21tZW50 -cyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyZXZpZXdQcmV2Q29tbWVudHMnKTsKCiAgICAg -ICAgLy8gSGVhZGVyCiAgICAgICAgdmFyIGhlYWRlclNwYW4gPSBoZWFkZXJFbC5xdWVyeVNlbGVj -dG9yKCdzcGFuOmZpcnN0LWNoaWxkJyk7CiAgICAgICAgaWYgKGFjdGlvbiA9PT0gJ2FwcHJvdmUn -KSB7CiAgICAgICAgICAgIGlmIChoZWFkZXJTcGFuKSBoZWFkZXJTcGFuLnRleHRDb250ZW50ID0g -J0Rva3VtZW50IGZyZWlnZWJlbic7CiAgICAgICAgICAgIGhlYWRlckVsLmNsYXNzTmFtZSA9ICdy -ZXZpZXctZGlhbG9nLWhlYWRlciBhcHByb3ZlJzsKICAgICAgICAgICAgY29uZmlybUJ0bi50ZXh0 -Q29udGVudCA9ICdGcmVpZ2ViZW4nOwogICAgICAgICAgICBjb25maXJtQnRuLmNsYXNzTmFtZSA9 -ICdidG4tY29uZmlybSBhcHByb3ZlJzsKICAgICAgICAgICAgaGludC50ZXh0Q29udGVudCA9ICcn -OwogICAgICAgICAgICBoaW50LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7CiAgICAgICAgICAgIHRl -eHRhcmVhLnNldEF0dHJpYnV0ZSgnZGF0YS1wbGFjZWhvbGRlcicsICdLb21tZW50YXIgKG9wdGlv -bmFsKS4uLicpOwogICAgICAgICAgICB0aGlzLl9yZXZpZXdDb21tZW50UmVxdWlyZWQgPSBmYWxz -ZTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBpZiAoaGVhZGVyU3BhbikgaGVhZGVyU3Bh -bi50ZXh0Q29udGVudCA9ICdEb2t1bWVudCBhYmxlaG5lbiB1bmQgYmVncsO8bmRlbic7CiAgICAg -ICAgICAgIGhlYWRlckVsLmNsYXNzTmFtZSA9ICdyZXZpZXctZGlhbG9nLWhlYWRlciByZWplY3Qn -OwogICAgICAgICAgICBjb25maXJtQnRuLnRleHRDb250ZW50ID0gJ0FibGVobmVuJzsKICAgICAg -ICAgICAgY29uZmlybUJ0bi5jbGFzc05hbWUgPSAnYnRuLWNvbmZpcm0gcmVqZWN0JzsKICAgICAg -ICAgICAgdmFyIHJlak1vZGUgPSAodGhpcy5kYXRhICYmIHRoaXMuZGF0YS5zZXR0aW5ncykgPyAo -dGhpcy5kYXRhLnNldHRpbmdzLnJlamVjdGlvblJlYXNvbk1vZGUgfHwgJ3JlcXVpcmVkJykgOiAn -cmVxdWlyZWQnOwogICAgICAgICAgICBoaW50LnN0eWxlLmRpc3BsYXkgPSAnJzsKICAgICAgICAg -ICAgaWYgKHJlak1vZGUgPT09ICdyZXF1aXJlZCcpIHsKICAgICAgICAgICAgICAgIGhpbnQudGV4 -dENvbnRlbnQgPSAnRWluZSBhdXNmw7xocmxpY2hlIEJlZ3LDvG5kdW5nIGlzdCBlcmZvcmRlcmxp -Y2guIEJlc2NocmVpYmUsIHdhcnVtIGRlciBBcnRpa2VsIGFiZ2VsZWhudCB3aXJkIHVuZCB3ZWxj -aGUgw4RuZGVydW5nZW4gbm90d2VuZGlnIHNpbmQuJzsKICAgICAgICAgICAgICAgIHRleHRhcmVh -LnNldEF0dHJpYnV0ZSgnZGF0YS1wbGFjZWhvbGRlcicsICdCZWdyw7xuZHVuZyAoUGZsaWNodGZl -bGQpLi4uJyk7CiAgICAgICAgICAgICAgICB0aGlzLl9yZXZpZXdDb21tZW50UmVxdWlyZWQgPSB0 -cnVlOwogICAgICAgICAgICB9IGVsc2UgaWYgKHJlak1vZGUgPT09ICdvcHRpb25hbCcpIHsKICAg -ICAgICAgICAgICAgIGhpbnQudGV4dENvbnRlbnQgPSAnRWluZSBCZWdyw7xuZHVuZyBpc3Qgb3B0 -aW9uYWwsIHdpcmQgYWJlciBlbXBmb2hsZW4uJzsKICAgICAgICAgICAgICAgIHRleHRhcmVhLnNl -dEF0dHJpYnV0ZSgnZGF0YS1wbGFjZWhvbGRlcicsICdCZWdyw7xuZHVuZyAob3B0aW9uYWwpLi4u -Jyk7CiAgICAgICAgICAgICAgICB0aGlzLl9yZXZpZXdDb21tZW50UmVxdWlyZWQgPSBmYWxzZTsK -ICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGhpbnQudGV4dENvbnRlbnQgPSAn -JzsgaGludC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOwogICAgICAgICAgICAgICAgdGV4dGFyZWEu -c2V0QXR0cmlidXRlKCdkYXRhLXBsYWNlaG9sZGVyJywgJ0tvbW1lbnRhciAob3B0aW9uYWwpLi4u -Jyk7CiAgICAgICAgICAgICAgICB0aGlzLl9yZXZpZXdDb21tZW50UmVxdWlyZWQgPSBmYWxzZTsK -ICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaW5mby50ZXh0Q29udGVudCA9IGRvYy50 -aXRlbCArICcgKCcgKyBkb2Mua2F0ZWdvcmllICsgJyknOwogICAgICAgIHRleHRhcmVhLmlubmVy -SFRNTCA9ICcnOwoKICAgICAgICAvLyBBcnRpa2VsaW5oYWx0IGxpbmtzIGFuemVpZ2VuCiAgICAg -ICAgdmFyIGluaGFsdCA9IGRvYy5pbmhhbHQgfHwgJzxlbSBzdHlsZT0iY29sb3I6dmFyKC0tdGV4 -dC1tdXRlZCk7Ij5LZWluIEluaGFsdDwvZW0+JzsKICAgICAgICBhcnRpY2xlQ29udGVudC5pbm5l -ckhUTUwgPSAnPGRpdiBzdHlsZT0ibWFyZ2luLWJvdHRvbTo4cHg7Zm9udC13ZWlnaHQ6NjAwO2Nv -bG9yOnZhcigtLXRleHQtaGVhZGluZyk7Zm9udC1zaXplOjE1cHg7Ij4nICsKICAgICAgICAgICAg -RHJpdmVQb3J0YWwuZXNjYXBlSFRNTChkb2MudGl0ZWwpICsgJzwvZGl2PicgKyBpbmhhbHQ7Cgog -ICAgICAgIC8vIEJpc2hlcmlnZSBLb21tZW50YXJlIG1pdCBSZXZpZXdlci1GYXJiZW4gYW56ZWln -ZW4KICAgICAgICB0aGlzLl9yZXZpZXdlckNvbG9yTWFwID0ge307CiAgICAgICAgdmFyIGhpc3Rv -cnkgPSAoZG9jLmdvdmVybmFuY2UgJiYgZG9jLmdvdmVybmFuY2UucmV2aWV3SGlzdG9yeSkgPyBk -b2MuZ292ZXJuYW5jZS5yZXZpZXdIaXN0b3J5IDogW107CiAgICAgICAgdmFyIGNvbW1lbnRzSHRt -bCA9ICcnOwogICAgICAgIGhpc3RvcnkuZm9yRWFjaChmdW5jdGlvbihlbnRyeSkgewogICAgICAg -ICAgICBpZiAoIWVudHJ5LmNvbW1lbnQpIHJldHVybjsKICAgICAgICAgICAgdmFyIGNvbG9yID0g -RHJpdmVHb3Zlcm5hbmNlLl9nZXRSZXZpZXdlckNvbG9yKGVudHJ5LmJ5IHx8ICdVbmJla2FubnQn -KTsKICAgICAgICAgICAgdmFyIGFjdGlvbkxhYmVsID0gZW50cnkuYWN0aW9uID09PSAnYXBwcm92 -ZWQnID8gJ0ZyZWlnZWdlYmVuJyA6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5 -LmFjdGlvbiA9PT0gJ3JlamVjdGVkJyA/ICdBYmdlbGVobnQnIDogJ0VpbmdlcmVpY2h0JzsKICAg -ICAgICAgICAgdmFyIG5pZ2h0QmcgPSBjb2xvci5iZzsKICAgICAgICAgICAgY29tbWVudHNIdG1s -ICs9ICc8ZGl2IGNsYXNzPSJyZXZpZXctY29tbWVudC1idWJibGUiIHN0eWxlPSJiYWNrZ3JvdW5k -OicgKyBjb2xvci5iZyArICc7Ym9yZGVyLWxlZnQtY29sb3I6JyArIGNvbG9yLmJvcmRlciArICc7 -IiB0aXRsZT0iJyArIGZvcm1hdERhdGVUaW1lKGVudHJ5LmF0KSArICciPicgKwogICAgICAgICAg -ICAgICAgJzxzcGFuIGNsYXNzPSJyYy1hdXRob3IiIHN0eWxlPSJjb2xvcjonICsgY29sb3IudGV4 -dCArICc7Ij4nICsgRHJpdmVQb3J0YWwuZXNjYXBlSFRNTChlbnRyeS5ieSB8fCAnVW5iZWthbm50 -JykgKyAnIOKAkyAnICsgYWN0aW9uTGFiZWwgKyAnPC9zcGFuPicgKwogICAgICAgICAgICAgICAg -JzxzcGFuIGNsYXNzPSJyYy1kYXRlIj4nICsgZm9ybWF0RGF0ZVRpbWUoZW50cnkuYXQpICsgJzwv -c3Bhbj4nICsKICAgICAgICAgICAgICAgICc8ZGl2IGNsYXNzPSJyYy10ZXh0Ij4nICsgZW50cnku -Y29tbWVudCArICc8L2Rpdj4nICsKICAgICAgICAgICAgJzwvZGl2Pic7CiAgICAgICAgfSk7CiAg -ICAgICAgaWYgKCFjb21tZW50c0h0bWwpIHsKICAgICAgICAgICAgY29tbWVudHNIdG1sID0gJzxk -aXYgc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2NvbG9yOnZhcigtLXRleHQtbXV0ZWQpO3BhZGRpbmc6 -OHB4IDA7Ij5Ob2NoIGtlaW5lIEtvbW1lbnRhcmUgdm9yaGFuZGVuLjwvZGl2Pic7CiAgICAgICAg -fQogICAgICAgIHByZXZDb21tZW50cy5pbm5lckhUTUwgPSBjb21tZW50c0h0bWw7CgogICAgICAg -IHRoaXMuX3Jldmlld0RpYWxvZ0FjdGlvbiA9IGFjdGlvbjsKICAgICAgICB0aGlzLl9yZXZpZXdE -aWFsb2dDYWxsYmFjayA9IGRvY0lkOwogICAgICAgIGNvbmZpcm1CdG4ub25jbGljayA9ICgpID0+ -IHRoaXMuY29uZmlybVJldmlldygpOwoKICAgICAgICAvLyBQYXN0ZS1IYW5kbGVyOiBOdXIgS2xh -cnRleHQgZWluZnVlZ2VuCiAgICAgICAgdGV4dGFyZWEub25wYXN0ZSA9IGZ1bmN0aW9uKGUpIHsK -ICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICB2YXIgdGV4dCA9IChl -LmNsaXBib2FyZERhdGEgfHwgd2luZG93LmNsaXBib2FyZERhdGEpLmdldERhdGEoJ3RleHQvcGxh -aW4nKTsKICAgICAgICAgICAgZG9jdW1lbnQuZXhlY0NvbW1hbmQoJ2luc2VydFRleHQnLCBmYWxz -ZSwgdGV4dCk7CiAgICAgICAgfTsKCiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Jl -dmlld0RpYWxvZycpLmNsYXNzTGlzdC5hZGQoJ2FjdGl2ZScpOwogICAgfSwKCiAgICBjbG9zZVJl -dmlld0RpYWxvZygpIHsKICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmV2aWV3RGlh -bG9nJykuY2xhc3NMaXN0LnJlbW92ZSgnYWN0aXZlJyk7CiAgICAgICAgdGhpcy5fcmV2aWV3RGlh -bG9nQ2FsbGJhY2sgPSBudWxsOwogICAgfSwKCiAgICBhc3luYyBjb25maXJtUmV2aWV3KCkgewog -ICAgICAgIGNvbnN0IGRvY0lkID0gdGhpcy5fcmV2aWV3RGlhbG9nQ2FsbGJhY2s7CiAgICAgICAg -Y29uc3QgYWN0aW9uID0gdGhpcy5fcmV2aWV3RGlhbG9nQWN0aW9uOwogICAgICAgIGNvbnN0IGNv -bW1lbnRFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyZXZpZXdEaWFsb2dDb21tZW50Jyk7 -CiAgICAgICAgLy8gS29tbWVudGFyLUhUTUwgc2FuaXRpemVuOiBudXIgZXJsYXVidGUgVGFncyBi -ZWhhbHRlbgogICAgICAgIHZhciByYXdIdG1sID0gY29tbWVudEVsLmlubmVySFRNTC50cmltKCku -cmVwbGFjZSgvXjxicj4kLywgJycpOwogICAgICAgIHZhciBzYW5pdGl6ZURpdiA9IGRvY3VtZW50 -LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOwogICAgICAgIHNhbml0aXplRGl2LmlubmVySFRNTCA9IHJh -d0h0bWw7CiAgICAgICAgLy8gQWxsZSB1bmVybGF1YnRlbiBUYWdzIGR1cmNoIGlocmVuIFRleHRp -bmhhbHQgZXJzZXR6ZW4KICAgICAgICBzYW5pdGl6ZURpdi5xdWVyeVNlbGVjdG9yQWxsKCdhLCBp -bWcsIHNjcmlwdCwgc3R5bGUsIGlmcmFtZSwgZGl2LCBzcGFuW3N0eWxlKj0iZm9udC1zaXplIl0s -IHNwYW5bc3R5bGUqPSJ3aGl0ZS1zcGFjZSJdJykuZm9yRWFjaChmdW5jdGlvbihlbCkgewogICAg -ICAgICAgICBpZiAoZWwudGFnTmFtZSA9PT0gJ0RJVicpIHsKICAgICAgICAgICAgICAgIC8vIERp -dnMgZHVyY2ggaWhyZW4gSW5oYWx0ICsgWmVpbGVudW1icnVjaCBlcnNldHplbgogICAgICAgICAg -ICAgICAgZWwuaW5zZXJ0QWRqYWNlbnRIVE1MKCdhZnRlcmVuZCcsICc8YnI+Jyk7CiAgICAgICAg -ICAgICAgICBlbC5yZXBsYWNlV2l0aChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShlbC50ZXh0Q29u -dGVudCkpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgZWwucmVwbGFjZVdp -dGgoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoZWwudGV4dENvbnRlbnQpKTsKICAgICAgICAgICAg -fQogICAgICAgIH0pOwogICAgICAgIGNvbnN0IGNvbW1lbnQgPSBzYW5pdGl6ZURpdi5pbm5lckhU -TUwudHJpbSgpLnJlcGxhY2UoL148YnI+JC8sICcnKTsKCiAgICAgICAgaWYgKCFkb2NJZCkgcmV0 -dXJuOwoKICAgICAgICAvLyBQZmxpY2h0ZmVsZC1QcnVlZnVuZyBmdWVyIEFibGVobnVuZ3NiZWdy -dWVuZHVuZwogICAgICAgIHZhciBjb21tZW50VGV4dCA9IGNvbW1lbnRFbC50ZXh0Q29udGVudC50 -cmltKCk7CiAgICAgICAgaWYgKGFjdGlvbiA9PT0gJ3JlamVjdCcpIHsKICAgICAgICAgICAgaWYg -KHRoaXMuX3Jldmlld0NvbW1lbnRSZXF1aXJlZCAmJiAhY29tbWVudFRleHQpIHsKICAgICAgICAg -ICAgICAgIHNob3dUb2FzdCgnQml0dGUgZWluZSBCZWdyw7xuZHVuZyBlaW5nZWJlbiAoUGZsaWNo -dGZlbGQpJywgJ3dhcm5pbmcnKTsKICAgICAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRC -eUlkKCdyZXZpZXdEaWFsb2dDb21tZW50JykuZm9jdXMoKTsKICAgICAgICAgICAgICAgIHJldHVy -bjsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLy8gU2NocmVpYnp1Z3JpZmYgc2lj -aGVyc3RlbGxlbiAoZmlsZTovLyBNb2R1cyBpc3Qgc3RhbmRhcmRtYWVzc2lnIHJlYWQtb25seSkK -ICAgICAgICBpZiAoRHJpdmVGUy5yZWFkT25seSkgewogICAgICAgICAgICBjb25zdCBncmFudGVk -ID0gYXdhaXQgRHJpdmVGUy5lbnN1cmVXcml0ZUFjY2VzcygpOwogICAgICAgICAgICBpZiAoIWdy -YW50ZWQpIHsKICAgICAgICAgICAgICAgIHNob3dUb2FzdCgnU2NocmVpYnp1Z3JpZmYgZXJmb3Jk -ZXJsaWNoIGbDvHIgRnJlaWdhYmUtQWt0aW9uZW4nLCAnd2FybmluZycpOwogICAgICAgICAgICAg -ICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBjb25zdCBkb2MgPSBE -cml2ZUZTLmRvY3VtZW50cy5maW5kKGQgPT4gZC5pZCA9PT0gZG9jSWQpOwogICAgICAgIGlmICgh -ZG9jKSByZXR1cm47CgogICAgICAgIC8vIEdvdmVybmFuY2UtRGF0ZW4genVtIERva3VtZW50IGhp -bnp1ZnVlZ2VuCiAgICAgICAgaWYgKCFkb2MuZ292ZXJuYW5jZSkgZG9jLmdvdmVybmFuY2UgPSB7 -IHJldmlld0hpc3Rvcnk6IFtdIH07CiAgICAgICAgaWYgKCFkb2MuZ292ZXJuYW5jZS5yZXZpZXdI -aXN0b3J5KSBkb2MuZ292ZXJuYW5jZS5yZXZpZXdIaXN0b3J5ID0gW107CgogICAgICAgIGRvYy5n -b3Zlcm5hbmNlLnJldmlld0hpc3RvcnkucHVzaCh7CiAgICAgICAgICAgIGFjdGlvbjogYWN0aW9u -ID09PSAnYXBwcm92ZScgPyAnYXBwcm92ZWQnIDogJ3JlamVjdGVkJywKICAgICAgICAgICAgYnk6 -IHRoaXMuY3VycmVudFVzZXIsCiAgICAgICAgICAgIGF0OiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5n -KCksCiAgICAgICAgICAgIGNvbW1lbnQ6IGNvbW1lbnQKICAgICAgICB9KTsKCiAgICAgICAgdmFy -IG5ld1N0YXR1cyA9IGFjdGlvbiA9PT0gJ2FwcHJvdmUnID8gJ0ZyZWlnZWdlYmVuJyA6ICdBYmdl -bGVobnQnOwogICAgICAgIGRvYy52ZXJzaW9uID0gY2FsY3VsYXRlVmVyc2lvbihkb2MsIGRvYy5p -bmhhbHQsIGRvYy5pbmhhbHQsIG5ld1N0YXR1cyk7CiAgICAgICAgaWYgKGFjdGlvbiA9PT0gJ2Fw -cHJvdmUnKSB7CiAgICAgICAgICAgIGRvYy5zdGF0dXMgPSAnRnJlaWdlZ2ViZW4nOwogICAgICAg -ICAgICBkb2MuZ292ZXJuYW5jZS5hcHByb3ZlZEJ5ID0gdGhpcy5jdXJyZW50VXNlcjsKICAgICAg -ICAgICAgZG9jLmdvdmVybmFuY2UuYXBwcm92ZWRBdCA9IG5ldyBEYXRlKCkudG9JU09TdHJpbmco -KTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBkb2Muc3RhdHVzID0gJ0FiZ2VsZWhudCc7 -CiAgICAgICAgfQogICAgICAgIC8vIERpZmYtRGF0ZW4gYmVyZWluaWdlbiAobmFjaCBGcmVpZ2Fi -ZS9BYmxlaG51bmcgbmljaHQgbWVociBub2V0aWcpCiAgICAgICAgZGVsZXRlIGRvYy5fcHJldmlv -dXNJbmhhbHQ7CiAgICAgICAgZGVsZXRlIGRvYy5fcHJldmlvdXNUaXRlbDsKCiAgICAgICAgdHJ5 -IHsKICAgICAgICAgICAgY29uc3Qgc2F2ZVJlc3VsdCA9IGF3YWl0IERyaXZlRlMuc2F2ZURvY3Vt -ZW50KGRvYyk7CiAgICAgICAgICAgIGlmIChzYXZlUmVzdWx0ID09PSB0cnVlKSB7CiAgICAgICAg -ICAgICAgICBjb25zdCBtc2cgPSBhY3Rpb24gPT09ICdhcHByb3ZlJyA/ICdEb2t1bWVudCBmcmVp -Z2VnZWJlbicgOiAnRG9rdW1lbnQgYWJnZWxlaG50JzsKICAgICAgICAgICAgICAgIHNob3dUb2Fz -dChtc2cgKyAnOiAnICsgZG9jLnRpdGVsLCBhY3Rpb24gPT09ICdhcHByb3ZlJyA/ICdzdWNjZXNz -JyA6ICd3YXJuaW5nJyk7CiAgICAgICAgICAgICAgICB0aGlzLmNsb3NlUmV2aWV3RGlhbG9nKCk7 -CiAgICAgICAgICAgICAgICB0aGlzLmNsb3NlUXVldWUoKTsKICAgICAgICAgICAgICAgIERyaXZl -UG9ydGFsLnJlbmRlcigpOwogICAgICAgICAgICAgICAgdGhpcy51cGRhdGVVSSgpOwogICAgICAg -ICAgICAgICAgYXdhaXQgRHJpdmVQb3J0YWwuc2VsZWN0RG9jdW1lbnQoZG9jSWQpOwogICAgICAg -ICAgICAgICAgRHJpdmVQb3J0YWwuaGlnaGxpZ2h0SXRlbShkb2NJZCk7CiAgICAgICAgICAgIH0g -ZWxzZSB7CiAgICAgICAgICAgICAgICBzaG93VG9hc3QoJ0ZlaGxlciBiZWltIFNwZWljaGVybjog +cmVxdWlyZWQnOwogICAgICAgIGlmIChrd01vZGUgPT09ICdyZXF1aXJlZCcgJiYgKCF0aGlzLl9j +dXJyZW50S2V5d29yZHMgfHwgdGhpcy5fY3VycmVudEtleXdvcmRzLmxlbmd0aCA9PT0gMCkpIHsK +ICAgICAgICAgICAgc2hvd1RvYXN0KCdCaXR0ZSBtaW5kZXN0ZW5zIGVpbiBTY2hsYWd3b3J0IGVp +bmdlYmVuJywgJ3dhcm5pbmcnKTsKICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQo +J2VkaXRvcktleXdvcmRJbnB1dCcpLmZvY3VzKCk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAg +ICB9CgogICAgICAgIHRoaXMuY3VycmVudERvYy50aXRlbCA9IHRpdGVsOwogICAgICAgIHRoaXMu +Y3VycmVudERvYy5rYXRlZ29yaWUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZWRpdG9yS2F0 +ZWdvcmllJykudmFsdWU7CiAgICAgICAgdGhpcy5jdXJyZW50RG9jLnBhcmVudElkID0gZG9jdW1l +bnQuZ2V0RWxlbWVudEJ5SWQoJ2VkaXRvclBhcmVudCcpLnZhbHVlIHx8IG51bGw7CiAgICAgICAg +aWYgKGt3TW9kZSAhPT0gJ2Rpc2FibGVkJykgewogICAgICAgICAgICB0aGlzLmN1cnJlbnREb2Mu +c2NobGFnd29lcnRlciA9IFsuLi50aGlzLl9jdXJyZW50S2V5d29yZHNdOwogICAgICAgIH0KICAg +ICAgICBjb25zdCBzZWxlY3RlZFN0YXR1cyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlZGl0 +b3JTdGF0dXMnKS52YWx1ZTsKICAgICAgICBjb25zdCBuZXdJbmhhbHQgPSBkb2N1bWVudC5nZXRF +bGVtZW50QnlJZCgnZWRpdG9ySW5wdXQnKS5pbm5lckhUTUw7CgogICAgICAgIC8vIENvbnRyaWJ1 +dG9yLVRyYWNraW5nOiBCZWl0cmFnc2FydCBiZXN0aW1tZW4KICAgICAgICBjb25zdCB1c2VybmFt +ZSA9IChEcml2ZUZTLmVudmlyb24gJiYgRHJpdmVGUy5lbnZpcm9uLnVzZXJuYW1lKSA/IERyaXZl +RlMuZW52aXJvbi51c2VybmFtZSA6ICdVbmJla2FubnQnOwogICAgICAgIGlmICghdGhpcy5jdXJy +ZW50RG9jLmNvbnRyaWJ1dG9ycykgdGhpcy5jdXJyZW50RG9jLmNvbnRyaWJ1dG9ycyA9IFtdOwoK +ICAgICAgICBpZiAodGhpcy5pc05ldykgewogICAgICAgICAgICAvLyBOZXVlcyBEb2t1bWVudDog +RXJzdGVsbGVyID0gMTAwJSBBdXRvcgogICAgICAgICAgICB0aGlzLmN1cnJlbnREb2MuY29udHJp +YnV0b3JzID0gW3sgdXNlcm5hbWU6IHVzZXJuYW1lLCByb2xlOiAnYXV0b3InLCBlbnRyaWVzOiAx +LCBmaXJzdENvbnRyaWI6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSB9XTsKICAgICAgICB9IGVs +c2UgaWYgKHRoaXMuX3BlbmRpbmdDb250cmliVHlwZSkgewogICAgICAgICAgICAvLyBCZXN0ZWhl +bmQ6IEVpbnRyYWcgZ2VtYWVzcyBnZXdhZWhsdGVyIEJlaXRyYWdzYXJ0IGhpbnp1ZnVlZ2VuCiAg +ICAgICAgICAgIGNvbnN0IGV4aXN0aW5nID0gdGhpcy5jdXJyZW50RG9jLmNvbnRyaWJ1dG9ycy5m +aW5kKGMgPT4gYy51c2VybmFtZSA9PT0gdXNlcm5hbWUgJiYgYy5yb2xlID09PSB0aGlzLl9wZW5k +aW5nQ29udHJpYlR5cGUpOwogICAgICAgICAgICBpZiAoZXhpc3RpbmcpIHsKICAgICAgICAgICAg +ICAgIGV4aXN0aW5nLmVudHJpZXMgPSAoZXhpc3RpbmcuZW50cmllcyB8fCAxKSArIDE7CiAgICAg +ICAgICAgICAgICBleGlzdGluZy5sYXN0Q29udHJpYiA9IG5ldyBEYXRlKCkudG9JU09TdHJpbmco +KTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudERvYy5j +b250cmlidXRvcnMucHVzaCh7CiAgICAgICAgICAgICAgICAgICAgdXNlcm5hbWU6IHVzZXJuYW1l +LAogICAgICAgICAgICAgICAgICAgIHJvbGU6IHRoaXMuX3BlbmRpbmdDb250cmliVHlwZSwKICAg +ICAgICAgICAgICAgICAgICBlbnRyaWVzOiAxLAogICAgICAgICAgICAgICAgICAgIGZpcnN0Q29u +dHJpYjogbmV3IERhdGUoKS50b0lTT1N0cmluZygpCiAgICAgICAgICAgICAgICB9KTsKICAgICAg +ICAgICAgfQogICAgICAgICAgICB0aGlzLl9wZW5kaW5nQ29udHJpYlR5cGUgPSBudWxsOwogICAg +ICAgIH0KCiAgICAgICAgLy8gUmV2aXNpb24gc2ljaGVybjogVm9yaGVyaWdlbiBTdGFuZCBzcGVp +Y2hlcm4gKG1heCA2IFJldmlzaW9uZW4pCiAgICAgICAgaWYgKCF0aGlzLmlzTmV3ICYmIHRoaXMu +Y3VycmVudERvYy5pbmhhbHQgJiYgdGhpcy5jdXJyZW50RG9jLmluaGFsdCAhPT0gbmV3SW5oYWx0 +KSB7CiAgICAgICAgICAgIGlmICghdGhpcy5jdXJyZW50RG9jLnJldmlzaW9ucykgdGhpcy5jdXJy +ZW50RG9jLnJldmlzaW9ucyA9IFtdOwogICAgICAgICAgICB0aGlzLmN1cnJlbnREb2MucmV2aXNp +b25zLnB1c2goewogICAgICAgICAgICAgICAgaW5oYWx0OiB0aGlzLmN1cnJlbnREb2MuaW5oYWx0 +LAogICAgICAgICAgICAgICAgdGl0ZWw6IHRoaXMuY3VycmVudERvYy50aXRlbCwKICAgICAgICAg +ICAgICAgIHN0YXR1czogdGhpcy5jdXJyZW50RG9jLnN0YXR1cywKICAgICAgICAgICAgICAgIHNh +dmVkQXQ6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSwKICAgICAgICAgICAgICAgIHNhdmVkQnk6 +IHVzZXJuYW1lCiAgICAgICAgICAgIH0pOwogICAgICAgICAgICAvLyBNYXggNiBSZXZpc2lvbmVu +IGJlaGFsdGVuIChhZWx0ZXN0ZSBlbnRmZXJuZW4pCiAgICAgICAgICAgIHdoaWxlICh0aGlzLmN1 +cnJlbnREb2MucmV2aXNpb25zLmxlbmd0aCA+IDYpIHsKICAgICAgICAgICAgICAgIHRoaXMuY3Vy +cmVudERvYy5yZXZpc2lvbnMuc2hpZnQoKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAg +ICAgLy8gVmVyc2lvbiBhdXRvbWF0aXNjaCBiZXJlY2huZW4KICAgICAgICB0aGlzLmN1cnJlbnRE +b2MudmVyc2lvbiA9IGNhbGN1bGF0ZVZlcnNpb24odGhpcy5jdXJyZW50RG9jLCB0aGlzLmN1cnJl +bnREb2MuaW5oYWx0LCBuZXdJbmhhbHQsIHNlbGVjdGVkU3RhdHVzKTsKCiAgICAgICAgdGhpcy5j +dXJyZW50RG9jLmluaGFsdCA9IG5ld0luaGFsdDsKCiAgICAgICAgLy8gR292ZXJuYW5jZS1Xb3Jr +ZmxvdzogU3RhdHVzLVVlYmVyZ2FlbmdlIHBydWVmZW4KICAgICAgICBjb25zdCBnb3YgPSBEcml2 +ZUdvdmVybmFuY2UuZGF0YTsKICAgICAgICBjb25zdCBzZXR0aW5ncyA9IGdvdiA/IGdvdi5zZXR0 +aW5ncyA6IHt9OwogICAgICAgIGNvbnN0IGlzU1UgPSBEcml2ZUdvdmVybmFuY2UuaXNTdXBlclVz +ZXIoKTsKICAgICAgICBjb25zdCBpc0ZBID0gRHJpdmVHb3Zlcm5hbmNlLmlzRmFjaGF1ZnNpY2h0 +KCk7CiAgICAgICAgY29uc3QgaXNSZXYgPSBEcml2ZUdvdmVybmFuY2UuaXNSZXZpZXdlcih0aGlz +LmN1cnJlbnREb2Mua2F0ZWdvcmllKTsKCiAgICAgICAgaWYgKHNlbGVjdGVkU3RhdHVzID09PSAn +UHLDvGZ1bmcnICYmICFpc1NVICYmICFpc0ZBKSB7CiAgICAgICAgICAgIC8vIFp1ciBQcnVlZnVu +ZyBlaW5yZWljaGVuCiAgICAgICAgICAgIGF3YWl0IERyaXZlR292ZXJuYW5jZS5zdWJtaXRGb3JS +ZXZpZXcodGhpcy5jdXJyZW50RG9jKTsKICAgICAgICAgICAgc2hvd1RvYXN0KCdEb2t1bWVudCB6 +dXIgUHLDvGZ1bmcgZWluZ2VyZWljaHQnLCAnaW5mbycpOwogICAgICAgIH0gZWxzZSBpZiAoc2Vs +ZWN0ZWRTdGF0dXMgPT09ICdGcmVpZ2VnZWJlbicgJiYgIWlzU1UgJiYgIWlzRkEgJiYgIWlzUmV2 +KSB7CiAgICAgICAgICAgIC8vIE5vcm1hbGVyIFVzZXIgZGFyZiBuaWNodCBkaXJla3QgZnJlaWdl +YmVuCiAgICAgICAgICAgIHNob3dUb2FzdCgnS2VpbmUgQmVyZWNodGlndW5nIHp1ciBGcmVpZ2Fi +ZS4gQml0dGUgenVyIFByw7xmdW5nIGVpbnJlaWNoZW4uJywgJ3dhcm5pbmcnKTsKICAgICAgICAg +ICAgcmV0dXJuOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIC8vIFdlbm4gU3RhdHVzIGF1 +ZiBQcnVlZnVuZyBnZXNldHp0IHdpcmQ6IHZvcmhlcmlnZW4gSW5oYWx0IHNpY2hlcm4gZnVlciBE +aWZmCiAgICAgICAgICAgIGlmIChzZWxlY3RlZFN0YXR1cyA9PT0gJ1Byw7xmdW5nJyAmJiB0aGlz +LmN1cnJlbnREb2Muc3RhdHVzICE9PSAnUHLDvGZ1bmcnKSB7CiAgICAgICAgICAgICAgICB0cnkg +ewogICAgICAgICAgICAgICAgICAgIHZhciBzYXZlZERvYyA9IGF3YWl0IERyaXZlRlMubG9hZERv +Y3VtZW50KHRoaXMuY3VycmVudERvYy5pZCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKHNhdmVk +RG9jICYmIHNhdmVkRG9jLmluaGFsdCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmN1 +cnJlbnREb2MuX3ByZXZpb3VzSW5oYWx0ID0gc2F2ZWREb2MuaW5oYWx0OwogICAgICAgICAgICAg +ICAgICAgICAgICB0aGlzLmN1cnJlbnREb2MuX3ByZXZpb3VzVGl0ZWwgPSBzYXZlZERvYy50aXRl +bDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9IGNhdGNoKGUpIHt9CiAg +ICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5jdXJyZW50RG9jLnN0YXR1cyA9IHNlbGVjdGVk +U3RhdHVzOwogICAgICAgIH0KCiAgICAgICAgLy8gQmVpIG5ldWVtIERva3VtZW50OiBHb3Zlcm5h +bmNlIGVyendpbmdlbgogICAgICAgIGlmICh0aGlzLmlzTmV3ICYmIHNldHRpbmdzLnJlcXVpcmVB +cHByb3ZhbEZvck5ldyAmJiAhaXNTVSkgewogICAgICAgICAgICBpZiAodGhpcy5jdXJyZW50RG9j +LnN0YXR1cyAhPT0gJ0VudHd1cmYnICYmIHRoaXMuY3VycmVudERvYy5zdGF0dXMgIT09ICdQcsO8 +ZnVuZycpIHsKICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudERvYy5zdGF0dXMgPSAnRW50d3Vy +Zic7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHRyeSB7CiAgICAgICAgICAgIGNv +bnN0IHNhdmVSZXN1bHQgPSBhd2FpdCBEcml2ZUZTLnNhdmVEb2N1bWVudCh0aGlzLmN1cnJlbnRE +b2MpOwogICAgICAgICAgICBpZiAoc2F2ZVJlc3VsdCA9PT0gdHJ1ZSkgewogICAgICAgICAgICAg +ICAgY29uc3Qgc2F2ZWREb2NJZCA9IHRoaXMuY3VycmVudERvYy5pZDsKICAgICAgICAgICAgICAg +IHNob3dUb2FzdCgnRG9rdW1lbnQgIicgKyB0aXRlbCArICciIGdlc3BlaWNoZXJ0JywgJ3N1Y2Nl +c3MnKTsKICAgICAgICAgICAgICAgIERyaXZlR292ZXJuYW5jZS51cGRhdGVVSSgpOwogICAgICAg +ICAgICAgICAgRHJpdmVQb3J0YWwucmVuZGVyKCk7CiAgICAgICAgICAgICAgICBpZiAoY2xvc2VB +ZnRlcikgewogICAgICAgICAgICAgICAgICAgIHRoaXMuY2xvc2UoKTsKICAgICAgICAgICAgICAg +ICAgICBhd2FpdCBEcml2ZVBvcnRhbC5zZWxlY3REb2N1bWVudChzYXZlZERvY0lkKTsKICAgICAg +ICAgICAgICAgICAgICBEcml2ZVBvcnRhbC5oaWdobGlnaHRJdGVtKHNhdmVkRG9jSWQpOwogICAg +ICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAvLyBFZGl0b3Igb2ZmZW4g +bGFzc2VuLCBhYmVyIERva3VtZW50ZW5saXN0ZSBha3R1YWxpc2llcmVuCiAgICAgICAgICAgICAg +ICAgICAgdGhpcy5pc05ldyA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgIHRoaXMuX3BlbmRp +bmdDb250cmliVHlwZSA9IG51bGw7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxz +ZSB7CiAgICAgICAgICAgICAgICBzaG93VG9hc3QoJ1NwZWljaGVybiBmZWhsZ2VzY2hsYWdlbjog JyArIHNhdmVSZXN1bHQsICdlcnJvcicsIDUwMDApOwogICAgICAgICAgICB9CiAgICAgICAgfSBj YXRjaCAoZXJyKSB7CiAgICAgICAgICAgIHNob3dUb2FzdCgnU3BlaWNoZXJuIGZlaGxnZXNjaGxh Z2VuOiAnICsgZXJyLm1lc3NhZ2UsICdlcnJvcicsIDUwMDApOwogICAgICAgIH0KICAgIH0sCgog -ICAgLy8gLS0tIFN1Ym1pdCBmb3IgUmV2aWV3IC0tLQogICAgYXN5bmMgc3VibWl0Rm9yUmV2aWV3 -KGRvYykgewogICAgICAgIGlmICghZG9jLmdvdmVybmFuY2UpIGRvYy5nb3Zlcm5hbmNlID0geyBy -ZXZpZXdIaXN0b3J5OiBbXSB9OwogICAgICAgIGlmICghZG9jLmdvdmVybmFuY2UucmV2aWV3SGlz -dG9yeSkgZG9jLmdvdmVybmFuY2UucmV2aWV3SGlzdG9yeSA9IFtdOwoKICAgICAgICAvLyBWb3Jo -ZXJpZ2VuIEluaGFsdCBzaWNoZXJuIGZ1ZXIgRGlmZi1BbnplaWdlIGJlaW0gUmV2aWV3CiAgICAg -ICAgLy8gTGVzZSBkaWUgenVsZXR6dCBnZXNwZWljaGVydGUgVmVyc2lvbiB2b24gRGlzayAobmlj -aHQgZGllIGdlcmFkZSBiZWFyYmVpdGV0ZSkKICAgICAgICB0cnkgewogICAgICAgICAgICB2YXIg -c2F2ZWREb2MgPSBhd2FpdCBEcml2ZUZTLmxvYWREb2N1bWVudChkb2MuaWQpOwogICAgICAgICAg -ICBpZiAoc2F2ZWREb2MgJiYgc2F2ZWREb2MuaW5oYWx0KSB7CiAgICAgICAgICAgICAgICBkb2Mu -X3ByZXZpb3VzSW5oYWx0ID0gc2F2ZWREb2MuaW5oYWx0OwogICAgICAgICAgICAgICAgZG9jLl9w -cmV2aW91c1RpdGVsID0gc2F2ZWREb2MudGl0ZWw7CiAgICAgICAgICAgIH0KICAgICAgICB9IGNh -dGNoKGUpIHt9CgogICAgICAgIGRvYy5zdGF0dXMgPSAnUHLDvGZ1bmcnOwogICAgICAgIGRvYy5n -b3Zlcm5hbmNlLnN1Ym1pdHRlZEZvclJldmlldyA9IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKTsK -ICAgICAgICBkb2MuZ292ZXJuYW5jZS5yZXZpZXdIaXN0b3J5LnB1c2goewogICAgICAgICAgICBh -Y3Rpb246ICdzdWJtaXR0ZWQnLAogICAgICAgICAgICBieTogdGhpcy5jdXJyZW50VXNlciwKICAg -ICAgICAgICAgYXQ6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSwKICAgICAgICAgICAgY29tbWVu -dDogJycKICAgICAgICB9KTsKICAgIH0sCgogICAgLy8gLS0tIEdvdmVybmFuY2UgQWRtaW4gUGFu -ZWwgLS0tCiAgICBzaG93QWRtaW4oKSB7CiAgICAgICAgaWYgKCF0aGlzLmlzU3VwZXJVc2VyKCkg -JiYgIXRoaXMuaXNGYWNoYXVmc2ljaHQoKSkgcmV0dXJuOwogICAgICAgIHRoaXMucmVuZGVyQWRt -aW4oKTsKICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZ292QWRtaW5QYW5lbCcpLmNs -YXNzTGlzdC5hZGQoJ2FjdGl2ZScpOwogICAgfSwKCiAgICBjbG9zZUFkbWluKCkgewogICAgICAg -IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdnb3ZBZG1pblBhbmVsJykuY2xhc3NMaXN0LnJlbW92 -ZSgnYWN0aXZlJyk7CiAgICB9LAoKICAgIHJlbmRlckFkbWluKCkgewogICAgICAgIGNvbnN0IGJv -ZHkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZ292QWRtaW5Cb2R5Jyk7CiAgICAgICAgY29u -c3QgZ292ID0gdGhpcy5kYXRhIHx8IHsgc3VwZXJVc2VyczogW10sIHJldmlld2VyczogW10sIGZh -Y2hhdWZzaWNodDogW10sIHNldHRpbmdzOiB7fSB9OwogICAgICAgIGlmICghZ292LmZhY2hhdWZz -aWNodCkgZ292LmZhY2hhdWZzaWNodCA9IFtdOwogICAgICAgIGlmICghZ292LnNldHRpbmdzKSBn -b3Yuc2V0dGluZ3MgPSB7fTsKICAgICAgICBjb25zdCBrYXRlZ29yaWVuID0gRHJpdmVGUy5jb25m -aWcua2F0ZWdvcmllbiB8fCBbXTsKICAgICAgICBjb25zdCBpc1NVID0gdGhpcy5pc1N1cGVyVXNl -cigpOwoKICAgICAgICAvLyAtLS0gU3VwZXJVc2VyIC0tLQogICAgICAgIGxldCBodG1sID0gJzxk -aXYgY2xhc3M9Imdvdi1zZWN0aW9uIj4nICsKICAgICAgICAgICAgJzxkaXYgY2xhc3M9Imdvdi1z -ZWN0aW9uLXRpdGxlIiB0aXRsZT0iU3VwZXJVc2VyIGhhYmVuIFZvbGx6dWdyaWZmIGF1ZiBhbGxl -IEZ1bmt0aW9uZW46IFJvbGxlbiB2ZXJnZWJlbiwgRWluc3RlbGx1bmdlbiDDpG5kZXJuLCBhbGxl -IEFydGlrZWwgZnJlaWdlYmVuIG9kZXIgYWJsZWhuZW4uIj5BZG1pbmlzdHJhdG9yZW4gKFN1cGVy -VXNlcik8L2Rpdj4nOwogICAgICAgIGdvdi5zdXBlclVzZXJzLmZvckVhY2goZnVuY3Rpb24oc3Us -IGkpIHsKICAgICAgICAgICAgdmFyIG9lID0gc3Uub3JnYW5pc2F0aW9uc2VpbmhlaXQgPyAnIMK3 -ICcgKyBEcml2ZVBvcnRhbC5lc2NhcGVIVE1MKHN1Lm9yZ2FuaXNhdGlvbnNlaW5oZWl0KSA6ICcn -OwogICAgICAgICAgICBodG1sICs9ICc8ZGl2IGNsYXNzPSJnb3YtdXNlci1yb3ciPicgKwogICAg -ICAgICAgICAgICAgJzxzcGFuIGNsYXNzPSJnb3Ytcm9sZS1pY29uIHN1Ij5TVTwvc3Bhbj4nICsK -ICAgICAgICAgICAgICAgICc8ZGl2IGNsYXNzPSJnb3YtdXNlci1pbmZvIj48ZGl2IGNsYXNzPSJn -b3YtdXNlci1uYW1lIj4nICsgRHJpdmVQb3J0YWwuZXNjYXBlSFRNTChzdS5kaXNwbGF5TmFtZSB8 -fCBzdS51c2VybmFtZSkgKyAnPC9kaXY+JyArCiAgICAgICAgICAgICAgICAgICAgJzxkaXYgY2xh -c3M9Imdvdi11c2VyLWRldGFpbCI+JyArIERyaXZlUG9ydGFsLmVzY2FwZUhUTUwoc3UudXNlcm5h -bWUpICsgb2UgKyAnPC9kaXY+PC9kaXY+JyArCiAgICAgICAgICAgICAgICAoaXNTVSAmJiBnb3Yu -c3VwZXJVc2Vycy5sZW5ndGggPiAxID8gJzxidXR0b24gY2xhc3M9InJlbW92ZSIgb25jbGljaz0i -RHJpdmVHb3Zlcm5hbmNlLnJlbW92ZVN1cGVyVXNlcignICsgaSArICcpIj5FbnRmZXJuZW48L2J1 -dHRvbj4nIDogJycpICsKICAgICAgICAgICAgJzwvZGl2Pic7CiAgICAgICAgfSk7CiAgICAgICAg -aWYgKGlzU1UpIHsKICAgICAgICAgICAgaHRtbCArPSAnPGRpdiBjbGFzcz0iZ292LWNhdC1hZGQt -cm93IiBzdHlsZT0iZ2FwOjZweDsiPicgKwogICAgICAgICAgICAgICAgJzxpbnB1dCB0eXBlPSJ0 -ZXh0IiBpZD0iZ292U1VVc2VyIiBwbGFjZWhvbGRlcj0iTlctS2VubnVuZyIgc3R5bGU9Im1heC13 -aWR0aDoxMjBweDsiPicgKwogICAgICAgICAgICAgICAgJzxpbnB1dCB0eXBlPSJ0ZXh0IiBpZD0i -Z292U1VOYW1lIiBwbGFjZWhvbGRlcj0iQW56ZWlnZW5hbWUiIHN0eWxlPSJmbGV4OjI7Ij4nICsK -ICAgICAgICAgICAgICAgICc8aW5wdXQgdHlwZT0idGV4dCIgaWQ9ImdvdlNVT0UiIHBsYWNlaG9s -ZGVyPSJPcmdhbmlzYXRpb25zZWluaGVpdCIgc3R5bGU9ImZsZXg6MjsiPicgKwogICAgICAgICAg -ICAgICAgJzxidXR0b24gY2xhc3M9Imdvdi1hZGQtYnRuIiBzdHlsZT0icGFkZGluZzo2cHggMTRw -eDsiIG9uY2xpY2s9IkRyaXZlR292ZXJuYW5jZS5hZGRTdXBlclVzZXIoKSI+SGluenVmw7xnZW48 -L2J1dHRvbj4nICsKICAgICAgICAgICAgJzwvZGl2Pic7CiAgICAgICAgfQogICAgICAgIGh0bWwg -Kz0gJzwvZGl2Pic7CgogICAgICAgIC8vIC0tLSBGYWNoYXVmc2ljaHQgLS0tCiAgICAgICAgaHRt -bCArPSAnPGRpdiBjbGFzcz0iZ292LXNlY3Rpb24iPicgKwogICAgICAgICAgICAnPGRpdiBjbGFz -cz0iZ292LXNlY3Rpb24tdGl0bGUiIHRpdGxlPSJEaWUgRmFjaGF1ZnNpY2h0IGhhdCBkaWUgZ2xl -aWNoZW4gUmVjaHRlIHdpZSBlaW4gU3VwZXJVc2VyLCBrYW5uIGFiZXIga2VpbmUgUm9sbGVuIHZl -cmdlYmVuLiBHZWRhY2h0IGbDvHIgVm9yZ2VzZXR6dGUsIGRpZSBJbmhhbHRlIHByw7xmZW4gc29s -bGVuLiI+RmFjaGF1ZnNpY2h0ICgnICsgZ292LmZhY2hhdWZzaWNodC5sZW5ndGggKyAnKTwvZGl2 -Pic7CiAgICAgICAgaWYgKGdvdi5mYWNoYXVmc2ljaHQubGVuZ3RoID09PSAwKSB7CiAgICAgICAg -ICAgIGh0bWwgKz0gJzxkaXYgY2xhc3M9Imdvdi1lbXB0eSI+Tm9jaCBrZWluZSBGYWNoYXVmc2lj -aHQga29uZmlndXJpZXJ0PC9kaXY+JzsKICAgICAgICB9CiAgICAgICAgZ292LmZhY2hhdWZzaWNo -dC5mb3JFYWNoKGZ1bmN0aW9uKGZhLCBpKSB7CiAgICAgICAgICAgIHZhciBvZSA9IGZhLm9yZ2Fu -aXNhdGlvbnNlaW5oZWl0ID8gJyDCtyAnICsgRHJpdmVQb3J0YWwuZXNjYXBlSFRNTChmYS5vcmdh -bmlzYXRpb25zZWluaGVpdCkgOiAnJzsKICAgICAgICAgICAgaHRtbCArPSAnPGRpdiBjbGFzcz0i -Z292LXVzZXItcm93Ij4nICsKICAgICAgICAgICAgICAgICc8c3BhbiBjbGFzcz0iZ292LXJvbGUt -aWNvbiBmYSI+RkE8L3NwYW4+JyArCiAgICAgICAgICAgICAgICAnPGRpdiBjbGFzcz0iZ292LXVz -ZXItaW5mbyI+PGRpdiBjbGFzcz0iZ292LXVzZXItbmFtZSI+JyArIERyaXZlUG9ydGFsLmVzY2Fw -ZUhUTUwoZmEuZGlzcGxheU5hbWUgfHwgZmEudXNlcm5hbWUpICsgJzwvZGl2PicgKwogICAgICAg -ICAgICAgICAgICAgICc8ZGl2IGNsYXNzPSJnb3YtdXNlci1kZXRhaWwiPicgKyBEcml2ZVBvcnRh -bC5lc2NhcGVIVE1MKGZhLnVzZXJuYW1lKSArIG9lICsgJzwvZGl2PjwvZGl2PicgKwogICAgICAg -ICAgICAgICAgJzxzcGFuIHN0eWxlPSJmb250LXNpemU6MTFweDtjb2xvcjojYzYyODI4OyI+QWxs -ZSBLYXRlZ29yaWVuPC9zcGFuPicgKwogICAgICAgICAgICAgICAgKGlzU1UgPyAnPGJ1dHRvbiBj -bGFzcz0icmVtb3ZlIiBvbmNsaWNrPSJEcml2ZUdvdmVybmFuY2UucmVtb3ZlRmFjaGF1ZnNpY2h0 -KCcgKyBpICsgJykiPkVudGZlcm5lbjwvYnV0dG9uPicgOiAnJykgKwogICAgICAgICAgICAnPC9k -aXY+JzsKICAgICAgICB9KTsKICAgICAgICBpZiAoaXNTVSkgewogICAgICAgICAgICBodG1sICs9 -ICc8ZGl2IGNsYXNzPSJnb3YtY2F0LWFkZC1yb3ciIHN0eWxlPSJnYXA6NnB4OyI+JyArCiAgICAg -ICAgICAgICAgICAnPGlucHV0IHR5cGU9InRleHQiIGlkPSJnb3ZGQVVzZXIiIHBsYWNlaG9sZGVy -PSJOVy1LZW5udW5nIiBzdHlsZT0ibWF4LXdpZHRoOjEyMHB4OyI+JyArCiAgICAgICAgICAgICAg -ICAnPGlucHV0IHR5cGU9InRleHQiIGlkPSJnb3ZGQU5hbWUiIHBsYWNlaG9sZGVyPSJBbnplaWdl -bmFtZSIgc3R5bGU9ImZsZXg6MjsiPicgKwogICAgICAgICAgICAgICAgJzxpbnB1dCB0eXBlPSJ0 -ZXh0IiBpZD0iZ292RkFPRSIgcGxhY2Vob2xkZXI9Ik9yZ2FuaXNhdGlvbnNlaW5oZWl0IiBzdHls -ZT0iZmxleDoyOyI+JyArCiAgICAgICAgICAgICAgICAnPGJ1dHRvbiBjbGFzcz0iZ292LWFkZC1i -dG4iIHN0eWxlPSJwYWRkaW5nOjZweCAxNHB4OyIgb25jbGljaz0iRHJpdmVHb3Zlcm5hbmNlLmFk -ZEZhY2hhdWZzaWNodCgpIj5IaW56dWbDvGdlbjwvYnV0dG9uPicgKwogICAgICAgICAgICAnPC9k -aXY+JzsKICAgICAgICB9CiAgICAgICAgaHRtbCArPSAnPC9kaXY+JzsKCiAgICAgICAgLy8gLS0t -IFJldmlld2VyIC0tLQogICAgICAgIGh0bWwgKz0gJzxkaXYgY2xhc3M9Imdvdi1zZWN0aW9uIj4n -ICsKICAgICAgICAgICAgJzxkaXYgY2xhc3M9Imdvdi1zZWN0aW9uLXRpdGxlIiB0aXRsZT0iUmV2 -aWV3ZXIgZMO8cmZlbiBBcnRpa2VsIGluIGRlbiBpaG5lbiB6dWdld2llc2VuZW4gS2F0ZWdvcmll -biBmcmVpZ2ViZW4gb2RlciBhYmxlaG5lbi4gSmVkZXIgUmV2aWV3ZXIgYmVrb21tdCBiZXN0aW1t -dGUgRmFjaGJlcmVpY2hlIHp1Z2V3aWVzZW4uIj5SZXZpZXdlciAoJyArIGdvdi5yZXZpZXdlcnMu -bGVuZ3RoICsgJyk8L2Rpdj4nOwogICAgICAgIGlmIChnb3YucmV2aWV3ZXJzLmxlbmd0aCA9PT0g -MCkgewogICAgICAgICAgICBodG1sICs9ICc8ZGl2IGNsYXNzPSJnb3YtZW1wdHkiPk5vY2gga2Vp -bmUgUmV2aWV3ZXIga29uZmlndXJpZXJ0PC9kaXY+JzsKICAgICAgICB9CiAgICAgICAgZ292LnJl -dmlld2Vycy5mb3JFYWNoKGZ1bmN0aW9uKHIsIGkpIHsKICAgICAgICAgICAgdmFyIG9lID0gci5v -cmdhbmlzYXRpb25zZWluaGVpdCA/ICcgwrcgJyArIERyaXZlUG9ydGFsLmVzY2FwZUhUTUwoci5v -cmdhbmlzYXRpb25zZWluaGVpdCkgOiAnJzsKICAgICAgICAgICAgaHRtbCArPSAnPGRpdiBjbGFz -cz0iZ292LXVzZXItcm93Ij4nICsKICAgICAgICAgICAgICAgICc8c3BhbiBjbGFzcz0iZ292LXJv -bGUtaWNvbiByZXYiPlI8L3NwYW4+JyArCiAgICAgICAgICAgICAgICAnPGRpdiBjbGFzcz0iZ292 -LXVzZXItaW5mbyI+PGRpdiBjbGFzcz0iZ292LXVzZXItbmFtZSI+JyArIERyaXZlUG9ydGFsLmVz -Y2FwZUhUTUwoci5kaXNwbGF5TmFtZSB8fCByLnVzZXJuYW1lKSArICc8L2Rpdj4nICsKICAgICAg -ICAgICAgICAgICAgICAnPGRpdiBjbGFzcz0iZ292LXVzZXItZGV0YWlsIj4nICsgRHJpdmVQb3J0 -YWwuZXNjYXBlSFRNTChyLnVzZXJuYW1lKSArIG9lICsgJzwvZGl2PjwvZGl2PicgKwogICAgICAg -ICAgICAgICAgJzxkaXYgY2xhc3M9Imdvdi1jYXQtdGFncyI+JyArIChyLmthdGVnb3JpZW4gfHwg -W10pLm1hcChmdW5jdGlvbihrKSB7IHJldHVybiAnPHNwYW4gY2xhc3M9Imdvdi1jYXQtdGFnIj4n -ICsgRHJpdmVQb3J0YWwuZXNjYXBlSFRNTChrKSArICc8L3NwYW4+JzsgfSkuam9pbignJykgKyAn -PC9kaXY+JyArCiAgICAgICAgICAgICAgICAnPGJ1dHRvbiBjbGFzcz0iZWRpdCIgb25jbGljaz0i -RHJpdmVHb3Zlcm5hbmNlLmVkaXRSZXZpZXdlcignICsgaSArICcpIj5CZWFyYmVpdGVuPC9idXR0 -b24+JyArCiAgICAgICAgICAgICAgICAnPGJ1dHRvbiBjbGFzcz0icmVtb3ZlIiBvbmNsaWNrPSJE -cml2ZUdvdmVybmFuY2UucmVtb3ZlUmV2aWV3ZXIoJyArIGkgKyAnKSI+RW50ZmVybmVuPC9idXR0 -b24+JyArCiAgICAgICAgICAgICc8L2Rpdj4nOwogICAgICAgIH0pOwogICAgICAgIGh0bWwgKz0g -JzwvZGl2Pic7CgogICAgICAgIC8vIC0tLSBSZXZpZXdlci1Gb3JtdWxhcjogRmVsZGVyIGxpbmtz -LCBLYXRlZ29yaWVuIHJlY2h0cyAtLS0KICAgICAgICB2YXIgaXNFZGl0aW5nID0gdGhpcy5fZWRp -dGluZ1Jldmlld2VySW5kZXggPj0gMDsKICAgICAgICB2YXIgZWRpdERhdGEgPSBpc0VkaXRpbmcg -PyBnb3YucmV2aWV3ZXJzW3RoaXMuX2VkaXRpbmdSZXZpZXdlckluZGV4XSA6IG51bGw7CiAgICAg -ICAgdmFyIGZvcm1UaXRsZSA9IGlzRWRpdGluZyA/ICdSZXZpZXdlciBiZWFyYmVpdGVuJyA6ICdS -ZXZpZXdlciBoaW56dWbDvGdlbic7CiAgICAgICAgdmFyIGZvcm1CdG5MYWJlbCA9IGlzRWRpdGlu -ZyA/ICdTcGVpY2hlcm4nIDogJ0hpbnp1ZsO8Z2VuJzsKCiAgICAgICAgaHRtbCArPSAnPGRpdiBj -bGFzcz0iZ292LXNlY3Rpb24iIGlkPSJnb3ZBZGRTZWN0aW9uIj4nICsKICAgICAgICAgICAgJzxk -aXYgY2xhc3M9Imdvdi1zZWN0aW9uLXRpdGxlIj4nICsgZm9ybVRpdGxlICsgJzwvZGl2PicgKwog -ICAgICAgICAgICAnPGRpdiBjbGFzcz0iZ292LXR3by1jb2wiIHN0eWxlPSJnYXA6MTJweDthbGln -bi1pdGVtczpzdHJldGNoOyI+JyArCiAgICAgICAgICAgICAgICAnPGRpdiBzdHlsZT0iZGlzcGxh -eTpmbGV4O2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjsiPicgKwogICAgICAgICAgICAgICAgICAgICc8 -ZGl2IHN0eWxlPSJtYXJnaW4tYm90dG9tOjZweDsiPjxsYWJlbCBzdHlsZT0iZm9udC1zaXplOjEx -cHg7Y29sb3I6dmFyKC0tdGV4dC1zZWNvbmRhcnkpO2ZvbnQtd2VpZ2h0OjYwMDsiPk5XLUtlbm51 -bmc8L2xhYmVsPicgKwogICAgICAgICAgICAgICAgICAgICAgICAnPGlucHV0IHR5cGU9InRleHQi -IGlkPSJnb3ZBZGRVc2VyIiBwbGFjZWhvbGRlcj0iei5CLiBudzEyMzQ1IiB2YWx1ZT0iJyArIChl -ZGl0RGF0YSA/IERyaXZlUG9ydGFsLmVzY2FwZUF0dHIoZWRpdERhdGEudXNlcm5hbWUpIDogJycp -ICsgJyIgc3R5bGU9IndpZHRoOjEwMCU7cGFkZGluZzo1cHggOHB4O2JvcmRlcjoxcHggc29saWQg -dmFyKC0tYm9yZGVyLXN0cm9uZyk7Ym9yZGVyLXJhZGl1czo0cHg7Zm9udC1zaXplOjEzcHg7bWFy -Z2luLXRvcDoycHg7YmFja2dyb3VuZDp2YXIoLS1iZy1pbnB1dCk7Y29sb3I6dmFyKC0tdGV4dC1w -cmltYXJ5KTsiPjwvZGl2PicgKwogICAgICAgICAgICAgICAgICAgICc8ZGl2IHN0eWxlPSJtYXJn -aW4tYm90dG9tOjZweDsiPjxsYWJlbCBzdHlsZT0iZm9udC1zaXplOjExcHg7Y29sb3I6dmFyKC0t -dGV4dC1zZWNvbmRhcnkpO2ZvbnQtd2VpZ2h0OjYwMDsiPkFuemVpZ2VuYW1lPC9sYWJlbD4nICsK -ICAgICAgICAgICAgICAgICAgICAgICAgJzxpbnB1dCB0eXBlPSJ0ZXh0IiBpZD0iZ292QWRkTmFt -ZSIgcGxhY2Vob2xkZXI9IlZvci0gdW5kIE5hY2huYW1lIiB2YWx1ZT0iJyArIChlZGl0RGF0YSA/ -IERyaXZlUG9ydGFsLmVzY2FwZUF0dHIoZWRpdERhdGEuZGlzcGxheU5hbWUgfHwgJycpIDogJycp -ICsgJyIgc3R5bGU9IndpZHRoOjEwMCU7cGFkZGluZzo1cHggOHB4O2JvcmRlcjoxcHggc29saWQg -dmFyKC0tYm9yZGVyLXN0cm9uZyk7Ym9yZGVyLXJhZGl1czo0cHg7Zm9udC1zaXplOjEzcHg7bWFy -Z2luLXRvcDoycHg7YmFja2dyb3VuZDp2YXIoLS1iZy1pbnB1dCk7Y29sb3I6dmFyKC0tdGV4dC1w -cmltYXJ5KTsiPjwvZGl2PicgKwogICAgICAgICAgICAgICAgICAgICc8ZGl2IHN0eWxlPSJtYXJn -aW4tYm90dG9tOjZweDsiPjxsYWJlbCBzdHlsZT0iZm9udC1zaXplOjExcHg7Y29sb3I6dmFyKC0t -dGV4dC1zZWNvbmRhcnkpO2ZvbnQtd2VpZ2h0OjYwMDsiPk9yZ2FuaXNhdGlvbnNlaW5oZWl0PC9s -YWJlbD4nICsKICAgICAgICAgICAgICAgICAgICAgICAgJzxpbnB1dCB0eXBlPSJ0ZXh0IiBpZD0i -Z292QWRkT0UiIHBsYWNlaG9sZGVyPSJic3AuIEZ1ZVN0IFYsIFZELUFQLi4uIiB2YWx1ZT0iJyAr -IChlZGl0RGF0YSA/IERyaXZlUG9ydGFsLmVzY2FwZUF0dHIoZWRpdERhdGEub3JnYW5pc2F0aW9u -c2VpbmhlaXQgfHwgJycpIDogJycpICsgJyIgc3R5bGU9IndpZHRoOjEwMCU7cGFkZGluZzo1cHgg -OHB4O2JvcmRlcjoxcHggc29saWQgdmFyKC0tYm9yZGVyLXN0cm9uZyk7Ym9yZGVyLXJhZGl1czo0 -cHg7Zm9udC1zaXplOjEzcHg7bWFyZ2luLXRvcDoycHg7YmFja2dyb3VuZDp2YXIoLS1iZy1pbnB1 -dCk7Y29sb3I6dmFyKC0tdGV4dC1wcmltYXJ5KTsiPjwvZGl2PicgKwogICAgICAgICAgICAgICAg -ICAgICc8ZGl2IHN0eWxlPSJkaXNwbGF5OmZsZXg7Z2FwOjZweDttYXJnaW4tdG9wOjRweDtqdXN0 -aWZ5LWNvbnRlbnQ6ZmxleC1lbmQ7Ij4nICsKICAgICAgICAgICAgICAgICAgICAgICAgKGlzRWRp -dGluZyA/ICc8YnV0dG9uIGNsYXNzPSJnb3YtY2FuY2VsLWJ0biIgc3R5bGU9InBhZGRpbmc6NnB4 -IDEycHg7IiBvbmNsaWNrPSJEcml2ZUdvdmVybmFuY2UuY2FuY2VsRWRpdCgpIj5BYmJyZWNoZW48 -L2J1dHRvbj4nIDogJycpICsKICAgICAgICAgICAgICAgICAgICAgICAgJzxidXR0b24gY2xhc3M9 -Imdvdi1hZGQtYnRuIiBzdHlsZT0icGFkZGluZzo2cHggMTZweDsiIG9uY2xpY2s9IkRyaXZlR292 -ZXJuYW5jZS5hZGRSZXZpZXdlcigpIj4nICsgZm9ybUJ0bkxhYmVsICsgJzwvYnV0dG9uPicgKwog -ICAgICAgICAgICAgICAgICAgICc8L2Rpdj4nICsKICAgICAgICAgICAgICAgICc8L2Rpdj4nICsK -ICAgICAgICAgICAgICAgICc8ZGl2IHN0eWxlPSJkaXNwbGF5OmZsZXg7ZmxleC1kaXJlY3Rpb246 -Y29sdW1uOyI+JyArCiAgICAgICAgICAgICAgICAgICAgJzxsYWJlbCBzdHlsZT0iZm9udC1zaXpl -OjExcHg7Y29sb3I6dmFyKC0tdGV4dC1zZWNvbmRhcnkpO2ZvbnQtd2VpZ2h0OjYwMDsiPkthdGVn -b3JpZW4gKE1laHJmYWNoYXVzd2FobCBtaXQgU3RyZytLbGljayk8L2xhYmVsPicgKwogICAgICAg -ICAgICAgICAgICAgICc8c2VsZWN0IGlkPSJnb3ZBZGRLYXQiIG11bHRpcGxlIHN0eWxlPSJ3aWR0 -aDoxMDAlO2ZsZXg6MTttYXJnaW4tdG9wOjJweDtwYWRkaW5nOjRweDtib3JkZXI6MXB4IHNvbGlk -IHZhcigtLWJvcmRlci1zdHJvbmcpO2JvcmRlci1yYWRpdXM6NHB4O2ZvbnQtc2l6ZToxM3B4O2Jh -Y2tncm91bmQ6dmFyKC0tYmctaW5wdXQpO2NvbG9yOnZhcigtLXRleHQtcHJpbWFyeSk7Ij4nOwog -ICAgICAgIHZhciBlZGl0S2F0cyA9IGVkaXREYXRhID8gKGVkaXREYXRhLmthdGVnb3JpZW4gfHwg -W10pIDogW107CiAgICAgICAga2F0ZWdvcmllbi5mb3JFYWNoKGZ1bmN0aW9uKGspIHsKICAgICAg -ICAgICAgdmFyIHNlbCA9IGVkaXRLYXRzLmluY2x1ZGVzKGspID8gJyBzZWxlY3RlZCcgOiAnJzsK -ICAgICAgICAgICAgaHRtbCArPSAnPG9wdGlvbiB2YWx1ZT0iJyArIERyaXZlUG9ydGFsLmVzY2Fw -ZUF0dHIoaykgKyAnIicgKyBzZWwgKyAnPicgKyBEcml2ZVBvcnRhbC5lc2NhcGVIVE1MKGspICsg -Jzwvb3B0aW9uPic7CiAgICAgICAgfSk7CiAgICAgICAgaHRtbCArPSAnPC9zZWxlY3Q+PC9kaXY+ -PC9kaXY+PC9kaXY+JzsKCiAgICAgICAgLy8gLS0tIEthdGVnb3JpZW4gKyBFaW5zdGVsbHVuZ2Vu -IGluIGVpbmVyIGdlbWVpbnNhbWVuIEJveCAtLS0KICAgICAgICBodG1sICs9ICc8ZGl2IGNsYXNz -PSJnb3Ytc2VjdGlvbiI+JzsKICAgICAgICBodG1sICs9ICc8ZGl2IGNsYXNzPSJnb3YtdHdvLWNv -bCBjYXQtc2V0dGluZ3MiIHN0eWxlPSJhbGlnbi1pdGVtczpzdHJldGNoOyI+JzsKCiAgICAgICAg -Ly8gS2F0ZWdvcmllbiAobGlua2UgU3BhbHRlKQogICAgICAgIHZhciBoaWRkZW5LYXRzID0gRHJp -dmVGUy5jb25maWcuaGlkZGVuS2F0ZWdvcmllbiB8fCBbXTsKICAgICAgICBodG1sICs9ICc8ZGl2 -IHN0eWxlPSJkaXNwbGF5OmZsZXg7ZmxleC1kaXJlY3Rpb246Y29sdW1uOyI+JyArCiAgICAgICAg -ICAgICc8ZGl2IGNsYXNzPSJnb3Ytc2VjdGlvbi10aXRsZSIgdGl0bGU9IkthdGVnb3JpZW4gc2lu -ZCBkaWUgRmFjaGJlcmVpY2hlLCBpbiBkaWUgQXJ0aWtlbCBlaW5zb3J0aWVydCB3ZXJkZW4uIER1 -IGthbm5zdCBLYXRlZ29yaWVuIGF1c2JsZW5kZW4gKHVuc2ljaHRiYXIgZsO8ciBOdXR6ZXIpIG9k -ZXIgZ2FueiBlbnRmZXJuZW4uIj5LYXRlZ29yaWVuICgnICsga2F0ZWdvcmllbi5sZW5ndGggKyAo -aGlkZGVuS2F0cy5sZW5ndGggPiAwID8gJywgJyArIGhpZGRlbkthdHMubGVuZ3RoICsgJyBhdXNn -ZWJsZW5kZXQnIDogJycpICsgJyk8L2Rpdj4nICsKICAgICAgICAgICAgJzxkaXYgY2xhc3M9Imdv -di1jYXQtbGlzdCIgc3R5bGU9ImZsZXg6MTsiPic7CiAgICAgICAga2F0ZWdvcmllbi5mb3JFYWNo -KGZ1bmN0aW9uKGthdCwgaSkgewogICAgICAgICAgICB2YXIgZG9jQ291bnQgPSBEcml2ZUZTLmRv -Y3VtZW50cy5maWx0ZXIoZnVuY3Rpb24oZCl7IHJldHVybiBkLmthdGVnb3JpZSA9PT0ga2F0OyB9 -KS5sZW5ndGg7CiAgICAgICAgICAgIHZhciBpc0hpZGRlbiA9IGhpZGRlbkthdHMuaW5jbHVkZXMo -a2F0KTsKICAgICAgICAgICAgaHRtbCArPSAnPGRpdiBjbGFzcz0iZ292LWNhdC1pdGVtJyArIChp -c0hpZGRlbiA/ICcgaGlkZGVuLWNhdCcgOiAnJykgKyAnIj4nICsKICAgICAgICAgICAgICAgICc8 -c3BhbiBjbGFzcz0iZ292LWNhdC1uYW1lIj4nICsgRHJpdmVQb3J0YWwuZXNjYXBlSFRNTChrYXQp -ICsgJzwvc3Bhbj4nICsKICAgICAgICAgICAgICAgICc8c3BhbiBzdHlsZT0iZm9udC1zaXplOjEx -cHg7Y29sb3I6Izg4ODsiPicgKyBkb2NDb3VudCArICcgRG9rLjwvc3Bhbj4nICsKICAgICAgICAg -ICAgICAgIChpc0hpZGRlbgogICAgICAgICAgICAgICAgICAgID8gJzxidXR0b24gY2xhc3M9InNo -b3ciIG9uY2xpY2s9IkRyaXZlR292ZXJuYW5jZS5zaG93Q2F0ZWdvcnkoJyArIGkgKyAnKSI+RWlu -YmxlbmRlbjwvYnV0dG9uPicKICAgICAgICAgICAgICAgICAgICA6ICc8YnV0dG9uIGNsYXNzPSJo -aWRlIiBvbmNsaWNrPSJEcml2ZUdvdmVybmFuY2UuaGlkZUNhdGVnb3J5KCcgKyBpICsgJykiPkF1 -c2JsZW5kZW48L2J1dHRvbj4nKSArCiAgICAgICAgICAgICAgICAnPGJ1dHRvbiBjbGFzcz0icmVt -b3ZlIiBvbmNsaWNrPSJEcml2ZUdvdmVybmFuY2UucmVtb3ZlQ2F0ZWdvcnkoJyArIGkgKyAnKSI+ -RW50ZmVybmVuPC9idXR0b24+JyArCiAgICAgICAgICAgICc8L2Rpdj4nOwogICAgICAgIH0pOwog -ICAgICAgIGh0bWwgKz0gJzwvZGl2Pic7CiAgICAgICAgaHRtbCArPSAnPGRpdiBzdHlsZT0iYm9y -ZGVyLXRvcDoycHggc29saWQgdmFyKC0tYm9yZGVyLWxpZ2h0KTttYXJnaW4tdG9wOjhweDtwYWRk -aW5nLXRvcDoxMHB4OyI+JyArCiAgICAgICAgICAgICc8ZGl2IGNsYXNzPSJnb3YtY2F0LWFkZC1y -b3ciPicgKwogICAgICAgICAgICAgICAgJzxpbnB1dCB0eXBlPSJ0ZXh0IiBpZD0iZ292TmV3Q2F0 -IiBwbGFjZWhvbGRlcj0iTmV1ZSBLYXRlZ29yaWUuLi4iPicgKwogICAgICAgICAgICAgICAgJzxi -dXR0b24gY2xhc3M9Imdvdi1hZGQtYnRuIiBzdHlsZT0icGFkZGluZzo2cHggMTRweDsiIG9uY2xp -Y2s9IkRyaXZlR292ZXJuYW5jZS5hZGRDYXRlZ29yeSgpIj5IaW56dWbDvGdlbjwvYnV0dG9uPicg -KwogICAgICAgICAgICAnPC9kaXY+PC9kaXY+PC9kaXY+JzsKCiAgICAgICAgLy8gRWluc3RlbGx1 -bmdlbiAocmVjaHRlIFNwYWx0ZSkKICAgICAgICBodG1sICs9ICc8ZGl2IHN0eWxlPSJkaXNwbGF5 -OmZsZXg7ZmxleC1kaXJlY3Rpb246Y29sdW1uO2JvcmRlci1sZWZ0OjFweCBzb2xpZCB2YXIoLS1i -b3JkZXItbGlnaHQpO3BhZGRpbmctbGVmdDoxNHB4OyI+JyArCiAgICAgICAgICAgICc8ZGl2IGNs -YXNzPSJnb3Ytc2VjdGlvbi10aXRsZSI+RWluc3RlbGx1bmdlbjwvZGl2PicgKwogICAgICAgICAg -ICAnPGxhYmVsIGNsYXNzPSJnb3Ytc2V0dGluZy1yb3ciIHRpdGxlPSJXZW5uIGFrdGl2LCBtw7xz -c2VuIG5ldWUgQXJ0aWtlbCBlcnN0IHZvbiBlaW5lbSBSZXZpZXdlciBmcmVpZ2VnZWJlbiB3ZXJk -ZW4sIGJldm9yIHNpZSBmw7xyIGFsbGUgc2ljaHRiYXIgc2luZC4iPjxpbnB1dCB0eXBlPSJjaGVj -a2JveCIgaWQ9ImdvdlJlcU5ldyIgJyArIChnb3Yuc2V0dGluZ3MucmVxdWlyZUFwcHJvdmFsRm9y -TmV3ID8gJ2NoZWNrZWQnIDogJycpICsgJyBvbmNoYW5nZT0iRHJpdmVHb3Zlcm5hbmNlLnNhdmVT -ZXR0aW5ncygpIj4gRnJlaWdhYmUgZsO8ciBuZXVlIEFydGlrZWw8L2xhYmVsPicgKwogICAgICAg -ICAgICAnPGxhYmVsIGNsYXNzPSJnb3Ytc2V0dGluZy1yb3ciIHRpdGxlPSJXZW5uIGFrdGl2LCBt -dXNzIGplZGUgQmVhcmJlaXR1bmcgZWluZXMgYmVzdGVoZW5kZW4gQXJ0aWtlbHMgZXJuZXV0IGZy -ZWlnZWdlYmVuIHdlcmRlbi4iPjxpbnB1dCB0eXBlPSJjaGVja2JveCIgaWQ9ImdvdlJlcUVkaXQi -ICcgKyAoZ292LnNldHRpbmdzLnJlcXVpcmVBcHByb3ZhbEZvckVkaXQgPyAnY2hlY2tlZCcgOiAn -JykgKyAnIG9uY2hhbmdlPSJEcml2ZUdvdmVybmFuY2Uuc2F2ZVNldHRpbmdzKCkiPiBGcmVpZ2Fi -ZSBuYWNoIEJlYXJiZWl0dW5nPC9sYWJlbD4nICsKICAgICAgICAgICAgJzxsYWJlbCBjbGFzcz0i -Z292LXNldHRpbmctcm93IiB0aXRsZT0iWmVpZ3QgdW50ZXIgamVkZW0gQXJ0aWtlbCBhbiwgd2Vy -IGRhcmFuIG1pdGdld2lya3QgaGF0IChBdXRvciwgUmVkYWt0aW9uLCBLb3JyZWt0dXIgdXN3Liku -Ij48aW5wdXQgdHlwZT0iY2hlY2tib3giIGlkPSJnb3ZTaG93Q29udHJpYiIgJyArIChnb3Yuc2V0 -dGluZ3Muc2hvd0NvbnRyaWJ1dG9ycyAhPT0gZmFsc2UgPyAnY2hlY2tlZCcgOiAnJykgKyAnIG9u -Y2hhbmdlPSJEcml2ZUdvdmVybmFuY2Uuc2F2ZVNldHRpbmdzKCkiPiBNaXR3aXJrZW5kZSBhbnpl -aWdlbjwvbGFiZWw+JyArCiAgICAgICAgICAgICc8bGFiZWwgY2xhc3M9Imdvdi1zZXR0aW5nLXJv -dyIgdGl0bGU9IlplaWd0IHVudGVyIGplZGVtIEFydGlrZWwgZGllIEhpc3RvcmllIGFsbGVyIEZy -ZWlnYWJlbiB1bmQgQWJsZWhudW5nZW4gYW4uIj48aW5wdXQgdHlwZT0iY2hlY2tib3giIGlkPSJn -b3ZTaG93UmV2aWV3SGlzdCIgJyArIChnb3Yuc2V0dGluZ3Muc2hvd1Jldmlld0hpc3RvcnkgIT09 -IGZhbHNlID8gJ2NoZWNrZWQnIDogJycpICsgJyBvbmNoYW5nZT0iRHJpdmVHb3Zlcm5hbmNlLnNh -dmVTZXR0aW5ncygpIj4gUHLDvGZ1bmdzdmVybGF1ZiBhbnplaWdlbjwvbGFiZWw+JyArCiAgICAg -ICAgICAgICc8ZGl2IGNsYXNzPSJnb3Ytc2V0dGluZy1yb3ciIHN0eWxlPSJkaXNwbGF5OmZsZXg7 -YWxpZ24taXRlbXM6Y2VudGVyO2p1c3RpZnktY29udGVudDpzcGFjZS1iZXR3ZWVuO2dhcDo4cHg7 -IiB0aXRsZT0iUGZsaWNodCA9IEplZGVyIEFydGlrZWwgYnJhdWNodCBtaW5kZXN0ZW5zIGVpbiBT -Y2hsYWd3b3J0LiBPcHRpb25hbCA9IFNjaGxhZ3fDtnJ0ZXIgd2VyZGVuIHZvcmdlc2NobGFnZW4s -IHNpbmQgYWJlciBuaWNodCBuw7Z0aWcuIERlYWt0aXZpZXJ0ID0gS2VpbmUgU2NobGFnd8O2cnRl -ci4iPicgKwogICAgICAgICAgICAgICAgJzxsYWJlbCBmb3I9ImdvdktleXdvcmRNb2RlIj5TY2hs -YWd3w7ZydGVyOjwvbGFiZWw+JyArCiAgICAgICAgICAgICAgICAnPHNlbGVjdCBpZD0iZ292S2V5 -d29yZE1vZGUiIG9uY2hhbmdlPSJEcml2ZUdvdmVybmFuY2Uuc2F2ZVNldHRpbmdzKCkiIHN0eWxl -PSJwYWRkaW5nOjRweCA4cHg7Ym9yZGVyLXJhZGl1czo0cHg7Ym9yZGVyOjFweCBzb2xpZCB2YXIo -LS1ib3JkZXItY29sb3IpO2JhY2tncm91bmQ6dmFyKC0tYmctaW5wdXQpO2NvbG9yOnZhcigtLXRl -eHQtcHJpbWFyeSk7Zm9udC1zaXplOjEzcHg7bWluLXdpZHRoOjEzMHB4OyI+JyArCiAgICAgICAg -ICAgICAgICAgICAgJzxvcHRpb24gdmFsdWU9InJlcXVpcmVkIicgKyAoKGdvdi5zZXR0aW5ncy5r -ZXl3b3JkTW9kZSB8fCAncmVxdWlyZWQnKSA9PT0gJ3JlcXVpcmVkJyA/ICcgc2VsZWN0ZWQnIDog -JycpICsgJz5QZmxpY2h0PC9vcHRpb24+JyArCiAgICAgICAgICAgICAgICAgICAgJzxvcHRpb24g -dmFsdWU9Im9wdGlvbmFsIicgKyAoZ292LnNldHRpbmdzLmtleXdvcmRNb2RlID09PSAnb3B0aW9u -YWwnID8gJyBzZWxlY3RlZCcgOiAnJykgKyAnPk9wdGlvbmFsPC9vcHRpb24+JyArCiAgICAgICAg -ICAgICAgICAgICAgJzxvcHRpb24gdmFsdWU9ImRpc2FibGVkIicgKyAoZ292LnNldHRpbmdzLmtl -eXdvcmRNb2RlID09PSAnZGlzYWJsZWQnID8gJyBzZWxlY3RlZCcgOiAnJykgKyAnPkRlYWt0aXZp -ZXJ0PC9vcHRpb24+JyArCiAgICAgICAgICAgICAgICAnPC9zZWxlY3Q+JyArCiAgICAgICAgICAg -ICc8L2Rpdj4nICsKICAgICAgICAgICAgJzxkaXYgY2xhc3M9Imdvdi1zZXR0aW5nLXJvdyIgc3R5 -bGU9ImRpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpjZW50ZXI7anVzdGlmeS1jb250ZW50OnNwYWNl -LWJldHdlZW47Z2FwOjhweDsiIHRpdGxlPSJQZmxpY2h0ID0gUmV2aWV3ZXIgbcO8c3NlbiBiZWkg -QWJsZWhudW5nIGltbWVyIGVpbmUgQmVncsO8bmR1bmcgc2NocmVpYmVuLiBPcHRpb25hbCA9IEJl -Z3LDvG5kdW5nIHdpcmQgZW1wZm9obGVuLiBOZWluID0gS2VpbmUgQmVncsO8bmR1bmcgbsO2dGln -LiI+JyArCiAgICAgICAgICAgICAgICAnPGxhYmVsIGZvcj0iZ292UmVqZWN0aW9uTW9kZSI+QWJs -ZWhudW5nc2JlZ3LDvG5kdW5nOjwvbGFiZWw+JyArCiAgICAgICAgICAgICAgICAnPHNlbGVjdCBp -ZD0iZ292UmVqZWN0aW9uTW9kZSIgb25jaGFuZ2U9IkRyaXZlR292ZXJuYW5jZS5zYXZlU2V0dGlu -Z3MoKSIgc3R5bGU9InBhZGRpbmc6NHB4IDhweDtib3JkZXItcmFkaXVzOjRweDtib3JkZXI6MXB4 -IHNvbGlkIHZhcigtLWJvcmRlci1jb2xvcik7YmFja2dyb3VuZDp2YXIoLS1iZy1pbnB1dCk7Y29s -b3I6dmFyKC0tdGV4dC1wcmltYXJ5KTtmb250LXNpemU6MTNweDttaW4td2lkdGg6MTMwcHg7Ij4n -ICsKICAgICAgICAgICAgICAgICAgICAnPG9wdGlvbiB2YWx1ZT0icmVxdWlyZWQiJyArICgoZ292 -LnNldHRpbmdzLnJlamVjdGlvblJlYXNvbk1vZGUgfHwgJ3JlcXVpcmVkJykgPT09ICdyZXF1aXJl -ZCcgPyAnIHNlbGVjdGVkJyA6ICcnKSArICc+UGZsaWNodDwvb3B0aW9uPicgKwogICAgICAgICAg -ICAgICAgICAgICc8b3B0aW9uIHZhbHVlPSJvcHRpb25hbCInICsgKGdvdi5zZXR0aW5ncy5yZWpl -Y3Rpb25SZWFzb25Nb2RlID09PSAnb3B0aW9uYWwnID8gJyBzZWxlY3RlZCcgOiAnJykgKyAnPk9w -dGlvbmFsPC9vcHRpb24+JyArCiAgICAgICAgICAgICAgICAgICAgJzxvcHRpb24gdmFsdWU9ImRp -c2FibGVkIicgKyAoZ292LnNldHRpbmdzLnJlamVjdGlvblJlYXNvbk1vZGUgPT09ICdkaXNhYmxl -ZCcgPyAnIHNlbGVjdGVkJyA6ICcnKSArICc+TmVpbjwvb3B0aW9uPicgKwogICAgICAgICAgICAg -ICAgJzwvc2VsZWN0PicgKwogICAgICAgICAgICAnPC9kaXY+JyArCiAgICAgICAgICAgICc8ZGl2 -IGNsYXNzPSJnb3Ytc2V0dGluZy1yb3ciIHN0eWxlPSJkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6 -Y2VudGVyO2p1c3RpZnktY29udGVudDpzcGFjZS1iZXR3ZWVuO2dhcDo4cHg7IiB0aXRsZT0iV2Vu -biBha3RpdmllcnQsIGVya2VubnQgZGFzIFBvcnRhbCBhdXRvbWF0aXNjaCBWZXJ3ZWlzZSBhdWYg -YW5kZXJlIEFydGlrZWwgaW0gVGV4dCB1bmQgemVpZ3QgYmVpIE1vdXNlb3ZlciBlaW5lIFZvcnNj -aGF1IGFuLiI+JyArCiAgICAgICAgICAgICAgICAnPGxhYmVsIGZvcj0iZ292Q3Jvc3NsaW5rTW9k -ZSI+Q3Jvc3NsaW5raW5nOjwvbGFiZWw+JyArCiAgICAgICAgICAgICAgICAnPHNlbGVjdCBpZD0i -Z292Q3Jvc3NsaW5rTW9kZSIgb25jaGFuZ2U9IkRyaXZlR292ZXJuYW5jZS5zYXZlU2V0dGluZ3Mo -KSIgc3R5bGU9InBhZGRpbmc6NHB4IDhweDtib3JkZXItcmFkaXVzOjRweDtib3JkZXI6MXB4IHNv -bGlkIHZhcigtLWJvcmRlci1jb2xvcik7YmFja2dyb3VuZDp2YXIoLS1iZy1pbnB1dCk7Y29sb3I6 -dmFyKC0tdGV4dC1wcmltYXJ5KTtmb250LXNpemU6MTNweDttaW4td2lkdGg6MTMwcHg7Ij4nICsK -ICAgICAgICAgICAgICAgICAgICAnPG9wdGlvbiB2YWx1ZT0iZW5hYmxlZCInICsgKChnb3Yuc2V0 -dGluZ3MuY3Jvc3NsaW5rTW9kZSB8fCAnZW5hYmxlZCcpID09PSAnZW5hYmxlZCcgPyAnIHNlbGVj -dGVkJyA6ICcnKSArICc+QWt0aXZpZXJ0PC9vcHRpb24+JyArCiAgICAgICAgICAgICAgICAgICAg -JzxvcHRpb24gdmFsdWU9ImRpc2FibGVkIicgKyAoZ292LnNldHRpbmdzLmNyb3NzbGlua01vZGUg -PT09ICdkaXNhYmxlZCcgPyAnIHNlbGVjdGVkJyA6ICcnKSArICc+RGVha3RpdmllcnQ8L29wdGlv -bj4nICsKICAgICAgICAgICAgICAgICc8L3NlbGVjdD4nICsKICAgICAgICAgICAgJzwvZGl2Picg -KwogICAgICAgICc8L2Rpdj4nOyAvLyBFbmRlIEVpbnN0ZWxsdW5nZW4tU3BhbHRlCgogICAgICAg -IGh0bWwgKz0gJzwvZGl2Pic7IC8vIEVuZGUgZ292LXR3by1jb2wKICAgICAgICBodG1sICs9ICc8 -L2Rpdj4nOyAvLyBFbmRlIGdvdi1zZWN0aW9uIChLYXRlZ29yaWVuK0VpbnN0ZWxsdW5nZW4pCgog -ICAgICAgIC8vIC0tLSBTY2hsYWd3w7ZydGVyIHZlcndhbHRlbiAtLS0KICAgICAgICBodG1sICs9 +ICAgLy8gLS0tIEhpc3RvcnkgKFVuZG8vUmVkbykgLS0tCiAgICBpbml0SGlzdG9yeSgpIHsKICAg +ICAgICBjb25zdCBlZGl0b3JJbnB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlZGl0b3JJ +bnB1dCcpOwogICAgICAgIHRoaXMuaGlzdG9yeSA9IFtlZGl0b3JJbnB1dC5pbm5lckhUTUxdOwog +ICAgICAgIHRoaXMuaGlzdG9yeUluZGV4ID0gMDsKCiAgICAgICAgLy8gUGFzdGUtSGFuZGxlcjog +SFRNTC1JbmhhbHRlIG5vcm1hbGlzaWVyZW4gKyBleHRlcm5lIEJpbGRlciBsb2thbCBzcGVpY2hl +cm4KICAgICAgICBlZGl0b3JJbnB1dC5vbnBhc3RlID0gKGUpID0+IHsKICAgICAgICAgICAgZS5w +cmV2ZW50RGVmYXVsdCgpOwoKICAgICAgICAgICAgLy8gQmlsZGVyIGF1cyBDbGlwYm9hcmQgKFNj +cmVlbnNob3QgLyBDb3B5LUltYWdlKQogICAgICAgICAgICBjb25zdCBpdGVtcyA9IEFycmF5LmZy +b20oZS5jbGlwYm9hcmREYXRhLml0ZW1zIHx8IFtdKTsKICAgICAgICAgICAgY29uc3QgaW1nSXRl +bSA9IGl0ZW1zLmZpbmQoaSA9PiBpLnR5cGUuc3RhcnRzV2l0aCgnaW1hZ2UvJykpOwogICAgICAg +ICAgICBpZiAoaW1nSXRlbSAmJiB0aGlzLmN1cnJlbnREb2MpIHsKICAgICAgICAgICAgICAgIGNv +bnN0IGJsb2IgPSBpbWdJdGVtLmdldEFzRmlsZSgpOwogICAgICAgICAgICAgICAgaWYgKGJsb2Ip +IHsKICAgICAgICAgICAgICAgICAgICB0aGlzLl9wYXN0ZUltYWdlQmxvYihibG9iKTsKICAgICAg +ICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAg +ICAgICAgICAgIGNvbnN0IGNsaXBIdG1sID0gZS5jbGlwYm9hcmREYXRhLmdldERhdGEoJ3RleHQv +aHRtbCcpOwogICAgICAgICAgICBjb25zdCBjbGlwVGV4dCA9IGUuY2xpcGJvYXJkRGF0YS5nZXRE +YXRhKCd0ZXh0L3BsYWluJyk7CgogICAgICAgICAgICBpZiAoY2xpcEh0bWwpIHsKICAgICAgICAg +ICAgICAgIGNvbnN0IHBhcnNlciA9IG5ldyBET01QYXJzZXIoKTsKICAgICAgICAgICAgICAgIGNv +bnN0IHBhcnNlZCA9IHBhcnNlci5wYXJzZUZyb21TdHJpbmcoY2xpcEh0bWwsICd0ZXh0L2h0bWwn +KTsKICAgICAgICAgICAgICAgIGNvbnN0IGltZ3MgPSBwYXJzZWQuYm9keS5xdWVyeVNlbGVjdG9y +QWxsKCdpbWcnKTsKICAgICAgICAgICAgICAgIGNvbnN0IGV4dGVybmFsSW1ncyA9IEFycmF5LmZy +b20oaW1ncykuZmlsdGVyKGltZyA9PgogICAgICAgICAgICAgICAgICAgIGltZy5zcmMgJiYgKGlt +Zy5zcmMuc3RhcnRzV2l0aCgnaHR0cDovLycpIHx8IGltZy5zcmMuc3RhcnRzV2l0aCgnaHR0cHM6 +Ly8nKSkKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgLy8gSW5saW5lLVN0eWxl +cyBiZXJlaW5pZ2VuOiBGYXJiZW4sIEhpbnRlcmdydWVuZGUgdW5kIFNjaHJpZnRhcnRlbiBlbnRm +ZXJuZW4sCiAgICAgICAgICAgICAgICAvLyBkYW1pdCBlaW5nZWZ1ZWd0ZXIgVGV4dCBpbSBEYXJr +LS9MaWdodC1Nb2RlIGtvcnJla3QgZGFyZ2VzdGVsbHQgd2lyZC4KICAgICAgICAgICAgICAgIC8v +IExpc3RlbiAodWwvb2wvbGkpIHVuZCBUYWJlbGxlbiAodGFibGUvdHIvdGQvdGgpIHdlcmRlbiBn +ZXNjaG9udCwKICAgICAgICAgICAgICAgIC8vIGRhbWl0IFN0cnVrdHVyIHVuZCBFaW5ydWVja3Vu +ZyBlcmhhbHRlbiBibGVpYmVuLgogICAgICAgICAgICAgICAgdmFyIGxpc3RUYWdzID0gWydVTCcs +J09MJywnTEknXTsKICAgICAgICAgICAgICAgIHZhciB0YWJsZVRhZ3MgPSBbJ1RBQkxFJywnVEhF +QUQnLCdUQk9EWScsJ1RSJywnVEQnLCdUSCddOwogICAgICAgICAgICAgICAgcGFyc2VkLmJvZHku +cXVlcnlTZWxlY3RvckFsbCgnKicpLmZvckVhY2goZWwgPT4gewogICAgICAgICAgICAgICAgICAg +IHZhciB0YWcgPSBlbC50YWdOYW1lOwogICAgICAgICAgICAgICAgICAgIHZhciBpc0xpc3QgPSBs +aXN0VGFncy5pbmNsdWRlcyh0YWcpOwogICAgICAgICAgICAgICAgICAgIHZhciBpc1RhYmxlID0g +dGFibGVUYWdzLmluY2x1ZGVzKHRhZyk7CiAgICAgICAgICAgICAgICAgICAgaWYgKGVsLnN0eWxl +KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGVsLnN0eWxlLnJlbW92ZVByb3BlcnR5KCdjb2xv +cicpOwogICAgICAgICAgICAgICAgICAgICAgICBlbC5zdHlsZS5yZW1vdmVQcm9wZXJ0eSgnYmFj +a2dyb3VuZC1jb2xvcicpOwogICAgICAgICAgICAgICAgICAgICAgICBlbC5zdHlsZS5yZW1vdmVQ +cm9wZXJ0eSgnYmFja2dyb3VuZCcpOwogICAgICAgICAgICAgICAgICAgICAgICBlbC5zdHlsZS5y +ZW1vdmVQcm9wZXJ0eSgnZm9udC1mYW1pbHknKTsKICAgICAgICAgICAgICAgICAgICAgICAgZWwu +c3R5bGUucmVtb3ZlUHJvcGVydHkoJ2ZvbnQtc2l6ZScpOwogICAgICAgICAgICAgICAgICAgICAg +ICBlbC5zdHlsZS5yZW1vdmVQcm9wZXJ0eSgnd2hpdGUtc3BhY2UnKTsKICAgICAgICAgICAgICAg +ICAgICAgICAgZWwuc3R5bGUucmVtb3ZlUHJvcGVydHkoJ292ZXJmbG93LXdyYXAnKTsKICAgICAg +ICAgICAgICAgICAgICAgICAgZWwuc3R5bGUucmVtb3ZlUHJvcGVydHkoJ3dvcmQtYnJlYWsnKTsK +ICAgICAgICAgICAgICAgICAgICAgICAgZWwuc3R5bGUucmVtb3ZlUHJvcGVydHkoJ3RleHQtZGVj +b3JhdGlvbi1saW5lJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIGVsLnN0eWxlLnJlbW92ZVBy +b3BlcnR5KCdib3JkZXItcmFkaXVzJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaXNU +YWJsZSkgZWwuc3R5bGUucmVtb3ZlUHJvcGVydHkoJ2JvcmRlcicpOwogICAgICAgICAgICAgICAg +ICAgICAgICBpZiAoIWlzTGlzdCAmJiAhaXNUYWJsZSkgZWwuc3R5bGUucmVtb3ZlUHJvcGVydHko +J21hcmdpbicpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWlzTGlzdCAmJiAhaXNUYWJs +ZSkgZWwuc3R5bGUucmVtb3ZlUHJvcGVydHkoJ3BhZGRpbmcnKTsKICAgICAgICAgICAgICAgICAg +ICAgICAgZWwuc3R5bGUucmVtb3ZlUHJvcGVydHkoJ2xpbmUtaGVpZ2h0Jyk7CiAgICAgICAgICAg +ICAgICAgICAgICAgIGlmICghaXNMaXN0KSBlbC5zdHlsZS5yZW1vdmVQcm9wZXJ0eSgnZGlzcGxh +eScpOwogICAgICAgICAgICAgICAgICAgICAgICBlbC5zdHlsZS5yZW1vdmVQcm9wZXJ0eSgnbWF4 +LXdpZHRoJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaXNUYWJsZSkgZWwuc3R5bGUu +cmVtb3ZlUHJvcGVydHkoJ3dpZHRoJyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAg +ICAgICAgICAgIC8vIGNsYXNzLSB1bmQgc3R5bGUtQXR0cmlidXRlIGV4dGVybmVyIFNlaXRlbiBl +bnRmZXJuZW4gd2VubiBzdHlsZSBsZWVyCiAgICAgICAgICAgICAgICAgICAgLy8gRFJJVkUtaW50 +ZXJuZSBLbGFzc2VuIChkcml2ZS0qKSBiZWliZWhhbHRlbgogICAgICAgICAgICAgICAgICAgIGlm +IChlbC5nZXRBdHRyaWJ1dGUoJ2NsYXNzJykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFy +IGNsYXNzZXMgPSBlbC5nZXRBdHRyaWJ1dGUoJ2NsYXNzJykuc3BsaXQoJyAnKS5maWx0ZXIoZnVu +Y3Rpb24oYykgeyByZXR1cm4gYy5zdGFydHNXaXRoKCdkcml2ZS0nKTsgfSk7CiAgICAgICAgICAg +ICAgICAgICAgICAgIGlmIChjbGFzc2VzLmxlbmd0aCA+IDApIGVsLnNldEF0dHJpYnV0ZSgnY2xh +c3MnLCBjbGFzc2VzLmpvaW4oJyAnKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgZWwu +cmVtb3ZlQXR0cmlidXRlKCdjbGFzcycpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAg +ICAgICAgICAgICBpZiAoZWwuZ2V0QXR0cmlidXRlKCdzdHlsZScpID09PSAnJykgZWwucmVtb3Zl +QXR0cmlidXRlKCdzdHlsZScpOwogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAg +Ly8gQWxsZSBMaW5rcyBhdWYgdGFyZ2V0PV9ibGFuayBzZXR6ZW4gKFBvcnRhbCBkYXJmIG5pY2h0 +IHZlcmxhc3NlbiB3ZXJkZW4pCiAgICAgICAgICAgICAgICBwYXJzZWQuYm9keS5xdWVyeVNlbGVj +dG9yQWxsKCdhW2hyZWZdJykuZm9yRWFjaChmdW5jdGlvbihhKSB7CiAgICAgICAgICAgICAgICAg +ICAgdmFyIGhyZWYgPSAoYS5nZXRBdHRyaWJ1dGUoJ2hyZWYnKSB8fCAnJykudHJpbSgpOwogICAg +ICAgICAgICAgICAgICAgIGlmIChocmVmLnN0YXJ0c1dpdGgoJyMnKSkgcmV0dXJuOwogICAgICAg +ICAgICAgICAgICAgIGEuc2V0QXR0cmlidXRlKCd0YXJnZXQnLCAnX2JsYW5rJyk7CiAgICAgICAg +ICAgICAgICAgICAgYS5zZXRBdHRyaWJ1dGUoJ3JlbCcsICdub29wZW5lciBub3JlZmVycmVyJyk7 +CiAgICAgICAgICAgICAgICAgICAgLy8gdGFyZ2V0PV9zZWxmIGV4cGxpeml0IGVudGZlcm5lbiBm +YWxscyBnZXNldHp0CiAgICAgICAgICAgICAgICAgICAgaWYgKGEuZ2V0QXR0cmlidXRlKCd0YXJn +ZXQnKSA9PT0gJ19zZWxmJykgYS5zZXRBdHRyaWJ1dGUoJ3RhcmdldCcsICdfYmxhbmsnKTsKICAg +ICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgIGlmIChleHRlcm5hbEltZ3MubGVuZ3Ro +ID4gMCAmJiB0aGlzLmN1cnJlbnREb2MgJiYgRHJpdmVGUy5jb25uZWN0ZWQpIHsKICAgICAgICAg +ICAgICAgICAgICAvLyBFeHRlcm5lIEJpbGRlciBoZXJ1bnRlcmxhZGVuIHVuZCBsb2thbCBzcGVp +Y2hlcm4KICAgICAgICAgICAgICAgICAgICB0aGlzLl9wYXN0ZUh0bWxXaXRoRXh0ZXJuYWxJbWFn +ZXMocGFyc2VkLmJvZHksIGV4dGVybmFsSW1ncyk7CiAgICAgICAgICAgICAgICB9IGVsc2Ugewog +ICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmV4ZWNDb21tYW5kKCdpbnNlcnRIVE1MJywgZmFs +c2UsIHBhcnNlZC5ib2R5LmlubmVySFRNTCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAg +IH0gZWxzZSBpZiAoY2xpcFRleHQpIHsKICAgICAgICAgICAgICAgIGRvY3VtZW50LmV4ZWNDb21t +YW5kKCdpbnNlcnRUZXh0JywgZmFsc2UsIGNsaXBUZXh0KTsKICAgICAgICAgICAgfQogICAgICAg +IH07CgogICAgICAgIGxldCBzYXZlVGltZW91dDsKICAgICAgICBlZGl0b3JJbnB1dC5vbmlucHV0 +ID0gKCkgPT4gewogICAgICAgICAgICBjbGVhclRpbWVvdXQoc2F2ZVRpbWVvdXQpOwogICAgICAg +ICAgICBzYXZlVGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4gdGhpcy5zYXZlU3RhdGUoKSwgNTAw +KTsKICAgICAgICB9OwoKICAgICAgICBlZGl0b3JJbnB1dC5vbmtleWRvd24gPSAoZSkgPT4gewog +ICAgICAgICAgICAvLyAjLVJlZmVyZW56IERyb3Bkb3duIHNjaGxpZXNzZW4gYmVpIEVzY2FwZQog +ICAgICAgICAgICBpZiAoZS5rZXkgPT09ICdFc2NhcGUnICYmIHRoaXMuX3hyZWZWaXNpYmxlKSB7 +CiAgICAgICAgICAgICAgICB0aGlzLmNsb3NlWHJlZkRyb3Bkb3duKCk7CiAgICAgICAgICAgICAg +ICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAg +IH0KICAgICAgICAgICAgaWYgKChlLmN0cmxLZXkgfHwgZS5tZXRhS2V5KSAmJiBlLmtleSA9PT0g +J3onICYmICFlLnNoaWZ0S2V5KSB7CiAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7 +CiAgICAgICAgICAgICAgICB0aGlzLnVuZG8oKTsKICAgICAgICAgICAgfSBlbHNlIGlmICgoZS5j +dHJsS2V5IHx8IGUubWV0YUtleSkgJiYgKGUua2V5ID09PSAneScgfHwgKGUua2V5ID09PSAneicg +JiYgZS5zaGlmdEtleSkpKSB7CiAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAg +ICAgICAgICAgICAgICB0aGlzLnJlZG8oKTsKICAgICAgICAgICAgfSBlbHNlIGlmIChlLmtleSA9 +PT0gJyMnICYmICFlLmN0cmxLZXkgJiYgIWUubWV0YUtleSkgewogICAgICAgICAgICAgICAgLy8g +Iy1UcmlnZ2VyOiBBcnRpa2VsLVJlZmVyZW56LURyb3Bkb3duIMO2ZmZuZW4KICAgICAgICAgICAg +ICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5vcGVuWHJlZkRyb3Bkb3duKCksIDEwKTsKICAgICAg +ICAgICAgfSBlbHNlIGlmIChlLmtleSA9PT0gJ0VudGVyJykgewogICAgICAgICAgICAgICAgZS5w +cmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICAgICAgY29uc3Qgc2VsID0gd2luZG93LmdldFNl +bGVjdGlvbigpOwogICAgICAgICAgICAgICAgaWYgKCFzZWwucmFuZ2VDb3VudCkgcmV0dXJuOwog +ICAgICAgICAgICAgICAgY29uc3QgcmFuZ2UgPSBzZWwuZ2V0UmFuZ2VBdCgwKTsKICAgICAgICAg +ICAgICAgIHJhbmdlLmRlbGV0ZUNvbnRlbnRzKCk7CgogICAgICAgICAgICAgICAgLy8gQmxvY2st +S29udGV4dCBlcm1pdHRlbG4KICAgICAgICAgICAgICAgIGxldCBibG9jayA9IHJhbmdlLnN0YXJ0 +Q29udGFpbmVyOwogICAgICAgICAgICAgICAgd2hpbGUgKGJsb2NrICYmIGJsb2NrICE9PSBpbnB1 +dCAmJiAhWydQJywnRElWJywnSDEnLCdIMicsJ0gzJywnSDQnLCdINScsJ0g2JywnTEknXS5pbmNs +dWRlcyhibG9jay5ub2RlTmFtZSkpIHsKICAgICAgICAgICAgICAgICAgICBibG9jayA9IGJsb2Nr +LnBhcmVudE5vZGU7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKGJsb2Nr +ICYmIFsnSDEnLCdIMicsJ0gzJywnSDQnLCdINScsJ0g2J10uaW5jbHVkZXMoYmxvY2subm9kZU5h +bWUpKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gSW4gSGVhZGluZzogQ3Vyc29yIGFtIEVuZGU/ +IC0+IG5ldWVyIDxwPiBuYWNoIEhlYWRpbmcKICAgICAgICAgICAgICAgICAgICBjb25zdCBhZnRl +clJhbmdlID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTsKICAgICAgICAgICAgICAgICAgICBhZnRl +clJhbmdlLnNlbGVjdE5vZGVDb250ZW50cyhibG9jayk7CiAgICAgICAgICAgICAgICAgICAgYWZ0 +ZXJSYW5nZS5zZXRTdGFydChyYW5nZS5lbmRDb250YWluZXIsIHJhbmdlLmVuZE9mZnNldCk7CiAg +ICAgICAgICAgICAgICAgICAgY29uc3QgdHJhaWxpbmcgPSBhZnRlclJhbmdlLmNsb25lQ29udGVu +dHMoKS50ZXh0Q29udGVudDsKICAgICAgICAgICAgICAgICAgICBpZiAoIXRyYWlsaW5nLnRyaW0o +KSkgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBDdXJzb3IgYW0gRW5kZSBkZXMgSGVhZGlu +Z3MgLT4gbmV1ZXIgQWJzYXR6CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHAgPSBkb2N1 +bWVudC5jcmVhdGVFbGVtZW50KCdwJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIHAuaW5uZXJI +VE1MID0gJzxicj4nOwogICAgICAgICAgICAgICAgICAgICAgICBibG9jay5wYXJlbnROb2RlLmlu +c2VydEJlZm9yZShwLCBibG9jay5uZXh0U2libGluZyk7CiAgICAgICAgICAgICAgICAgICAgICAg +IGNvbnN0IG5ld1JhbmdlID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTsKICAgICAgICAgICAgICAg +ICAgICAgICAgbmV3UmFuZ2Uuc2V0U3RhcnQocCwgMCk7CiAgICAgICAgICAgICAgICAgICAgICAg +IG5ld1JhbmdlLmNvbGxhcHNlKHRydWUpOwogICAgICAgICAgICAgICAgICAgICAgICBzZWwucmVt +b3ZlQWxsUmFuZ2VzKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbC5hZGRSYW5nZShuZXdS +YW5nZSk7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAg +ICAgLy8gQ3Vyc29yIG1pdHRlbiBpbSBIZWFkaW5nIC0+IEhlYWRpbmcgdGVpbGVuLCBSZXN0IGlu +IDxwPgogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXN0RnJhZyA9IGFmdGVyUmFuZ2Uu +ZXh0cmFjdENvbnRlbnRzKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHAgPSBkb2N1 +bWVudC5jcmVhdGVFbGVtZW50KCdwJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIHAuYXBwZW5k +Q2hpbGQocmVzdEZyYWcpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXAudGV4dENvbnRl +bnQudHJpbSgpICYmICFwLnF1ZXJ5U2VsZWN0b3IoJ2ltZyxicicpKSBwLmlubmVySFRNTCA9ICc8 +YnI+JzsKICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2sucGFyZW50Tm9kZS5pbnNlcnRCZWZv +cmUocCwgYmxvY2submV4dFNpYmxpbmcpOwogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBu +ZXdSYW5nZSA9IGRvY3VtZW50LmNyZWF0ZVJhbmdlKCk7CiAgICAgICAgICAgICAgICAgICAgICAg +IG5ld1JhbmdlLnNldFN0YXJ0KHAsIDApOwogICAgICAgICAgICAgICAgICAgICAgICBuZXdSYW5n +ZS5jb2xsYXBzZSh0cnVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsLnJlbW92ZUFsbFJh +bmdlcygpOwogICAgICAgICAgICAgICAgICAgICAgICBzZWwuYWRkUmFuZ2UobmV3UmFuZ2UpOwog +ICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYmxvY2sgJiYg +YmxvY2subm9kZU5hbWUgPT09ICdMSScpIHsKICAgICAgICAgICAgICAgICAgICAvLyBJbiBMaXN0 +ZW5lbGVtZW50OiBsZWVyZXMgTEkgLT4gTGlzdGUgdmVybGFzc2VuCiAgICAgICAgICAgICAgICAg +ICAgaWYgKCFibG9jay50ZXh0Q29udGVudC50cmltKCkgJiYgIWJsb2NrLnF1ZXJ5U2VsZWN0b3Io +J2ltZycpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxpc3QgPSBibG9jay5wYXJl +bnROb2RlOwogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwID0gZG9jdW1lbnQuY3JlYXRl +RWxlbWVudCgncCcpOwogICAgICAgICAgICAgICAgICAgICAgICBwLmlubmVySFRNTCA9ICc8YnI+ +JzsKICAgICAgICAgICAgICAgICAgICAgICAgbGlzdC5wYXJlbnROb2RlLmluc2VydEJlZm9yZShw +LCBsaXN0Lm5leHRTaWJsaW5nKTsKICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2sucmVtb3Zl +KCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsaXN0LnF1ZXJ5U2VsZWN0b3JBbGwoJ2xp +JykubGVuZ3RoID09PSAwKSBsaXN0LnJlbW92ZSgpOwogICAgICAgICAgICAgICAgICAgICAgICBj +b25zdCBuZXdSYW5nZSA9IGRvY3VtZW50LmNyZWF0ZVJhbmdlKCk7CiAgICAgICAgICAgICAgICAg +ICAgICAgIG5ld1JhbmdlLnNldFN0YXJ0KHAsIDApOwogICAgICAgICAgICAgICAgICAgICAgICBu +ZXdSYW5nZS5jb2xsYXBzZSh0cnVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsLnJlbW92 +ZUFsbFJhbmdlcygpOwogICAgICAgICAgICAgICAgICAgICAgICBzZWwuYWRkUmFuZ2UobmV3UmFu +Z2UpOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAg +IC8vIE5ldWVzIExJIGVpbmZ1ZWdlbgogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXdM +aSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2xpJyk7CiAgICAgICAgICAgICAgICAgICAgICAg +IGNvbnN0IGFmdGVyUmFuZ2UgPSBkb2N1bWVudC5jcmVhdGVSYW5nZSgpOwogICAgICAgICAgICAg +ICAgICAgICAgICBhZnRlclJhbmdlLnNlbGVjdE5vZGVDb250ZW50cyhibG9jayk7CiAgICAgICAg +ICAgICAgICAgICAgICAgIGFmdGVyUmFuZ2Uuc2V0U3RhcnQocmFuZ2UuZW5kQ29udGFpbmVyLCBy +YW5nZS5lbmRPZmZzZXQpOwogICAgICAgICAgICAgICAgICAgICAgICBuZXdMaS5hcHBlbmRDaGls +ZChhZnRlclJhbmdlLmV4dHJhY3RDb250ZW50cygpKTsKICAgICAgICAgICAgICAgICAgICAgICAg +aWYgKCFuZXdMaS50ZXh0Q29udGVudC50cmltKCkgJiYgIW5ld0xpLnF1ZXJ5U2VsZWN0b3IoJ2lt +ZyxicicpKSBuZXdMaS5pbm5lckhUTUwgPSAnPGJyPic7CiAgICAgICAgICAgICAgICAgICAgICAg +IGJsb2NrLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKG5ld0xpLCBibG9jay5uZXh0U2libGluZyk7 +CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5ld1JhbmdlID0gZG9jdW1lbnQuY3JlYXRl +UmFuZ2UoKTsKICAgICAgICAgICAgICAgICAgICAgICAgbmV3UmFuZ2Uuc2V0U3RhcnQobmV3TGks +IDApOwogICAgICAgICAgICAgICAgICAgICAgICBuZXdSYW5nZS5jb2xsYXBzZSh0cnVlKTsKICAg +ICAgICAgICAgICAgICAgICAgICAgc2VsLnJlbW92ZUFsbFJhbmdlcygpOwogICAgICAgICAgICAg +ICAgICAgICAgICBzZWwuYWRkUmFuZ2UobmV3UmFuZ2UpOwogICAgICAgICAgICAgICAgICAgIH0K +ICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgLy8gTm9ybWFsZXIg +VGV4dDogPGJyPiBlaW5mdWVnZW4gKFNvZnQtQnJlYWspCiAgICAgICAgICAgICAgICAgICAgY29u +c3QgYnIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdicicpOwogICAgICAgICAgICAgICAgICAg +IHJhbmdlLmluc2VydE5vZGUoYnIpOwogICAgICAgICAgICAgICAgICAgIGNvbnN0IHRleHQgPSBk +b2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgnXHUyMDBCJyk7CiAgICAgICAgICAgICAgICAgICAgcmFu +Z2Uuc2V0U3RhcnRBZnRlcihicik7CiAgICAgICAgICAgICAgICAgICAgcmFuZ2UuaW5zZXJ0Tm9k +ZSh0ZXh0KTsKICAgICAgICAgICAgICAgICAgICByYW5nZS5zZXRTdGFydEFmdGVyKHRleHQpOwog +ICAgICAgICAgICAgICAgICAgIHJhbmdlLmNvbGxhcHNlKHRydWUpOwogICAgICAgICAgICAgICAg +ICAgIHNlbC5yZW1vdmVBbGxSYW5nZXMoKTsKICAgICAgICAgICAgICAgICAgICBzZWwuYWRkUmFu +Z2UocmFuZ2UpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfTsKICAg +IH0sCgogICAgc2F2ZVN0YXRlKCkgewogICAgICAgIGlmICh0aGlzLmlzUmVzdG9yaW5nKSByZXR1 +cm47CiAgICAgICAgY29uc3QgZWRpdG9ySW5wdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgn +ZWRpdG9ySW5wdXQnKTsKICAgICAgICBpZiAoIWVkaXRvcklucHV0KSByZXR1cm47CiAgICAgICAg +aWYgKHRoaXMuaGlzdG9yeUluZGV4IDwgdGhpcy5oaXN0b3J5Lmxlbmd0aCAtIDEpIHsKICAgICAg +ICAgICAgdGhpcy5oaXN0b3J5ID0gdGhpcy5oaXN0b3J5LnNsaWNlKDAsIHRoaXMuaGlzdG9yeUlu +ZGV4ICsgMSk7CiAgICAgICAgfQogICAgICAgIHRoaXMuaGlzdG9yeS5wdXNoKGVkaXRvcklucHV0 +LmlubmVySFRNTCk7CiAgICAgICAgdGhpcy5oaXN0b3J5SW5kZXgrKzsKICAgICAgICBpZiAodGhp +cy5oaXN0b3J5Lmxlbmd0aCA+IDUwKSB7IHRoaXMuaGlzdG9yeS5zaGlmdCgpOyB0aGlzLmhpc3Rv +cnlJbmRleC0tOyB9CiAgICB9LAoKICAgIHVuZG8oKSB7CiAgICAgICAgaWYgKHRoaXMuaGlzdG9y +eUluZGV4ID4gMCkgewogICAgICAgICAgICB0aGlzLmhpc3RvcnlJbmRleC0tOwogICAgICAgICAg +ICB0aGlzLmlzUmVzdG9yaW5nID0gdHJ1ZTsKICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVu +dEJ5SWQoJ2VkaXRvcklucHV0JykuaW5uZXJIVE1MID0gdGhpcy5oaXN0b3J5W3RoaXMuaGlzdG9y +eUluZGV4XTsKICAgICAgICAgICAgdGhpcy5pc1Jlc3RvcmluZyA9IGZhbHNlOwogICAgICAgIH0K +ICAgIH0sCgogICAgcmVkbygpIHsKICAgICAgICBpZiAodGhpcy5oaXN0b3J5SW5kZXggPCB0aGlz +Lmhpc3RvcnkubGVuZ3RoIC0gMSkgewogICAgICAgICAgICB0aGlzLmhpc3RvcnlJbmRleCsrOwog +ICAgICAgICAgICB0aGlzLmlzUmVzdG9yaW5nID0gdHJ1ZTsKICAgICAgICAgICAgZG9jdW1lbnQu +Z2V0RWxlbWVudEJ5SWQoJ2VkaXRvcklucHV0JykuaW5uZXJIVE1MID0gdGhpcy5oaXN0b3J5W3Ro +aXMuaGlzdG9yeUluZGV4XTsKICAgICAgICAgICAgdGhpcy5pc1Jlc3RvcmluZyA9IGZhbHNlOwog +ICAgICAgIH0KICAgIH0sCgogICAgLy8gPT09IEFydGlrZWwtUmVmZXJlbnogKCMtQXV0b2NvbXBs +ZXRlKSA9PT0KICAgIF94cmVmVmlzaWJsZTogZmFsc2UsCiAgICBfeHJlZlJhbmdlOiBudWxsLAog +ICAgX3hyZWZTZWxlY3RlZERvYzogbnVsbCwKCiAgICBvcGVuWHJlZkRyb3Bkb3duKCkgewogICAg +ICAgIC8vIEN1cnNvci1Qb3NpdGlvbiBtZXJrZW4gKGRhcyAjIHd1cmRlIGdlcmFkZSBnZXRpcHB0 +KQogICAgICAgIHZhciBzZWwgPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7CiAgICAgICAgaWYgKCFz +ZWwucmFuZ2VDb3VudCkgcmV0dXJuOwogICAgICAgIHRoaXMuX3hyZWZSYW5nZSA9IHNlbC5nZXRS +YW5nZUF0KDApLmNsb25lUmFuZ2UoKTsKCiAgICAgICAgdmFyIGRyb3Bkb3duID0gZG9jdW1lbnQu +Z2V0RWxlbWVudEJ5SWQoJ3hyZWZEcm9wZG93bicpOwogICAgICAgIHZhciBpbnB1dCA9IGRvY3Vt +ZW50LmdldEVsZW1lbnRCeUlkKCd4cmVmU2VhcmNoSW5wdXQnKTsKCiAgICAgICAgLy8gUG9zaXRp +b246IHVudGVyIGRlbSBDdXJzb3IKICAgICAgICB2YXIgcmVjdCA9IHRoaXMuX3hyZWZSYW5nZS5n +ZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKICAgICAgICB2YXIgbGVmdCA9IHJlY3QubGVmdDsKICAg +ICAgICB2YXIgdG9wID0gcmVjdC5ib3R0b20gKyA0OwogICAgICAgIGlmIChsZWZ0ICsgMzgwID4g +d2luZG93LmlubmVyV2lkdGgpIGxlZnQgPSB3aW5kb3cuaW5uZXJXaWR0aCAtIDM5MDsKICAgICAg +ICBpZiAodG9wICsgMzYwID4gd2luZG93LmlubmVySGVpZ2h0KSB0b3AgPSByZWN0LnRvcCAtIDM2 +NDsKICAgICAgICBkcm9wZG93bi5zdHlsZS5sZWZ0ID0gTWF0aC5tYXgoMTAsIGxlZnQpICsgJ3B4 +JzsKICAgICAgICBkcm9wZG93bi5zdHlsZS50b3AgPSBNYXRoLm1heCgxMCwgdG9wKSArICdweCc7 +CgogICAgICAgIHRoaXMuX3hyZWZTZWxlY3RlZERvYyA9IG51bGw7CiAgICAgICAgaW5wdXQudmFs +dWUgPSAnJzsKICAgICAgICB0aGlzLl9yZW5kZXJYcmVmQXJ0aWNsZXMoJycpOwogICAgICAgIGRy +b3Bkb3duLmNsYXNzTGlzdC5hZGQoJ3Zpc2libGUnKTsKICAgICAgICB0aGlzLl94cmVmVmlzaWJs +ZSA9IHRydWU7CiAgICAgICAgc2V0VGltZW91dCgoKSA9PiBpbnB1dC5mb2N1cygpLCAzMCk7Cgog +ICAgICAgIC8vIEVpbmdhYmUtSGFuZGxlcgogICAgICAgIGlucHV0Lm9uaW5wdXQgPSAoKSA9PiB7 +CiAgICAgICAgICAgIGlmICh0aGlzLl94cmVmU2VsZWN0ZWREb2MpIHsKICAgICAgICAgICAgICAg +IHRoaXMuX3JlbmRlclhyZWZIZWFkaW5ncyh0aGlzLl94cmVmU2VsZWN0ZWREb2MsIGlucHV0LnZh +bHVlKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHRoaXMuX3JlbmRlclhy +ZWZBcnRpY2xlcyhpbnB1dC52YWx1ZSk7CiAgICAgICAgICAgIH0KICAgICAgICB9OwogICAgICAg +IGlucHV0Lm9ua2V5ZG93biA9IChlKSA9PiB7CiAgICAgICAgICAgIGlmIChlLmtleSA9PT0gJ0Vz +Y2FwZScpIHsgdGhpcy5jbG9zZVhyZWZEcm9wZG93bigpOyBlLnByZXZlbnREZWZhdWx0KCk7IH0K +ICAgICAgICB9OwoKICAgICAgICAvLyBDbGljay1PdXRzaWRlIHNjaGxpZXNzZW4KICAgICAgICBz +ZXRUaW1lb3V0KCgpID0+IHsKICAgICAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcign +bW91c2Vkb3duJywgdGhpcy5feHJlZk91dHNpZGVIYW5kbGVyID0gKGUpID0+IHsKICAgICAgICAg +ICAgICAgIGlmICghZHJvcGRvd24uY29udGFpbnMoZS50YXJnZXQpKSB0aGlzLmNsb3NlWHJlZkRy +b3Bkb3duKCk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sIDUwKTsKICAgIH0sCgogICAgY2xv +c2VYcmVmRHJvcGRvd24oKSB7CiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3hyZWZE +cm9wZG93bicpLmNsYXNzTGlzdC5yZW1vdmUoJ3Zpc2libGUnKTsKICAgICAgICB0aGlzLl94cmVm +VmlzaWJsZSA9IGZhbHNlOwogICAgICAgIHRoaXMuX3hyZWZTZWxlY3RlZERvYyA9IG51bGw7CiAg +ICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgdGhpcy5feHJl +Zk91dHNpZGVIYW5kbGVyKTsKICAgICAgICAvLyBGb2t1cyB6dXLDvGNrIHp1bSBFZGl0b3IKICAg +ICAgICB2YXIgZWRpdG9yID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VkaXRvcklucHV0Jyk7 +CiAgICAgICAgaWYgKGVkaXRvcikgZWRpdG9yLmZvY3VzKCk7CiAgICB9LAoKICAgIF9yZW5kZXJY +cmVmQXJ0aWNsZXMocXVlcnkpIHsKICAgICAgICB2YXIgbGlzdCA9IGRvY3VtZW50LmdldEVsZW1l +bnRCeUlkKCd4cmVmTGlzdCcpOwogICAgICAgIHZhciBxID0gcXVlcnkudG9Mb3dlckNhc2UoKS50 +cmltKCk7CiAgICAgICAgdmFyIGRvY3MgPSBEcml2ZUZTLmRvY3VtZW50cy5maWx0ZXIoZnVuY3Rp +b24oZCkgewogICAgICAgICAgICBpZiAoRHJpdmVFZGl0b3IuY3VycmVudERvYyAmJiBkLmlkID09 +PSBEcml2ZUVkaXRvci5jdXJyZW50RG9jLmlkKSByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIGlm +ICghcSkgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIHJldHVybiAoZC50aXRlbCAmJiBkLnRpdGVs +LnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMocSkpIHx8CiAgICAgICAgICAgICAgICAgICAoZC5rYXRl +Z29yaWUgJiYgZC5rYXRlZ29yaWUudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhxKSkgfHwKICAgICAg +ICAgICAgICAgICAgIChkLnNjaGxhZ3dvZXJ0ZXIgJiYgZC5zY2hsYWd3b2VydGVyLnNvbWUoZnVu +Y3Rpb24oaykgeyByZXR1cm4gay50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHEpOyB9KSk7CiAgICAg +ICAgfSkuc2xpY2UoMCwgMjApOwoKICAgICAgICBpZiAoZG9jcy5sZW5ndGggPT09IDApIHsKICAg +ICAgICAgICAgbGlzdC5pbm5lckhUTUwgPSAnPGRpdiBzdHlsZT0icGFkZGluZzoxNnB4O3RleHQt +YWxpZ246Y2VudGVyO2NvbG9yOnZhcigtLXRleHQtbXV0ZWQpO2ZvbnQtc2l6ZToxM3B4OyI+S2Vp +bmUgQXJ0aWtlbCBnZWZ1bmRlbjwvZGl2Pic7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9 +CgogICAgICAgIGxpc3QuaW5uZXJIVE1MID0gZG9jcy5tYXAoZnVuY3Rpb24oZCkgewogICAgICAg +ICAgICByZXR1cm4gJzxkaXYgY2xhc3M9InhyZWYtaXRlbSIgb25jbGljaz0iRHJpdmVFZGl0b3Iu +c2VsZWN0WHJlZkFydGljbGUoXCcnICsgRHJpdmVQb3J0YWwuZXNjYXBlQXR0cihkLmlkKSArICdc +JykiPicgKwogICAgICAgICAgICAgICAgJzxkaXYgY2xhc3M9InhyZWYtdGl0bGUiPicgKyBEcml2 +ZVBvcnRhbC5lc2NhcGVIVE1MKGQudGl0ZWwpICsgJzwvZGl2PicgKwogICAgICAgICAgICAgICAg +JzxkaXYgY2xhc3M9InhyZWYtY2F0Ij4nICsgRHJpdmVQb3J0YWwuZXNjYXBlSFRNTChkLmthdGVn +b3JpZSkgKwogICAgICAgICAgICAgICAgKGQuc2NobGFnd29lcnRlciAmJiBkLnNjaGxhZ3dvZXJ0 +ZXIubGVuZ3RoID8gJyDCtyAnICsgZC5zY2hsYWd3b2VydGVyLnNsaWNlKDAsIDMpLmpvaW4oJywg +JykgOiAnJykgKwogICAgICAgICAgICAgICAgJzwvZGl2PjwvZGl2Pic7CiAgICAgICAgfSkuam9p +bignJyk7CiAgICB9LAoKICAgIHNlbGVjdFhyZWZBcnRpY2xlKGRvY0lkKSB7CiAgICAgICAgdmFy +IGRvYyA9IERyaXZlRlMuZG9jdW1lbnRzLmZpbmQoZnVuY3Rpb24oZCkgeyByZXR1cm4gZC5pZCA9 +PT0gZG9jSWQ7IH0pOwogICAgICAgIGlmICghZG9jKSByZXR1cm47CiAgICAgICAgdGhpcy5feHJl +ZlNlbGVjdGVkRG9jID0gZG9jOwoKICAgICAgICB2YXIgaW5wdXQgPSBkb2N1bWVudC5nZXRFbGVt +ZW50QnlJZCgneHJlZlNlYXJjaElucHV0Jyk7CiAgICAgICAgaW5wdXQudmFsdWUgPSAnJzsKICAg +ICAgICBpbnB1dC5wbGFjZWhvbGRlciA9ICfDnGJlcnNjaHJpZnQgc3VjaGVuIChvZGVyIGxlZXIg +bGFzc2VuIGbDvHIgQXJ0aWtlbC1MaW5rKS4uLic7CgogICAgICAgIHRoaXMuX3JlbmRlclhyZWZI +ZWFkaW5ncyhkb2MsICcnKTsKICAgICAgICBpbnB1dC5mb2N1cygpOwogICAgfSwKCiAgICBfZXh0 +cmFjdEhlYWRpbmdzKGh0bWxDb250ZW50KSB7CiAgICAgICAgaWYgKCFodG1sQ29udGVudCkgcmV0 +dXJuIFtdOwogICAgICAgIHZhciBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsK +ICAgICAgICBkaXYuaW5uZXJIVE1MID0gaHRtbENvbnRlbnQ7CiAgICAgICAgdmFyIGhlYWRpbmdz +ID0gW107CiAgICAgICAgZGl2LnF1ZXJ5U2VsZWN0b3JBbGwoJ2gxLCBoMiwgaDMsIGg0JykuZm9y +RWFjaChmdW5jdGlvbihoKSB7CiAgICAgICAgICAgIHZhciB0ZXh0ID0gaC50ZXh0Q29udGVudC50 +cmltKCk7CiAgICAgICAgICAgIGlmICh0ZXh0KSB7CiAgICAgICAgICAgICAgICB2YXIgc2x1ZyA9 +IHRleHQudG9Mb3dlckNhc2UoKQogICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKC/DpC9nLCAn +YWUnKS5yZXBsYWNlKC/Dti9nLCAnb2UnKS5yZXBsYWNlKC/DvC9nLCAndWUnKS5yZXBsYWNlKC/D +ny9nLCAnc3MnKQogICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKC9bXmEtejAtOV0rL2csICct +JykucmVwbGFjZSgvXi18LSQvZywgJycpOwogICAgICAgICAgICAgICAgaGVhZGluZ3MucHVzaCh7 +CiAgICAgICAgICAgICAgICAgICAgdGV4dDogdGV4dCwKICAgICAgICAgICAgICAgICAgICBsZXZl +bDogcGFyc2VJbnQoaC50YWdOYW1lLmNoYXJBdCgxKSksCiAgICAgICAgICAgICAgICAgICAgc2x1 +Zzogc2x1ZwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKICAg +ICAgICByZXR1cm4gaGVhZGluZ3M7CiAgICB9LAoKICAgIF9yZW5kZXJYcmVmSGVhZGluZ3MoZG9j +LCBxdWVyeSkgewogICAgICAgIHZhciBsaXN0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3hy +ZWZMaXN0Jyk7CiAgICAgICAgdmFyIGhlYWRpbmdzID0gdGhpcy5fZXh0cmFjdEhlYWRpbmdzKGRv +Yy5pbmhhbHQpOwogICAgICAgIHZhciBxID0gcXVlcnkudG9Mb3dlckNhc2UoKS50cmltKCk7Cgog +ICAgICAgIC8vIFp1csO8Y2stQnV0dG9uICsgQXJ0aWtlbC1MaW5rIChvaG5lIMOcYmVyc2Nocmlm +dCkKICAgICAgICB2YXIgaHRtbCA9ICc8ZGl2IGNsYXNzPSJ4cmVmLWJhY2siIG9uY2xpY2s9IkRy +aXZlRWRpdG9yLl94cmVmU2VsZWN0ZWREb2M9bnVsbDtkb2N1bWVudC5nZXRFbGVtZW50QnlJZChc +J3hyZWZTZWFyY2hJbnB1dFwnKS5wbGFjZWhvbGRlcj1cJ0FydGlrZWwgc3VjaGVuLi4uXCc7RHJp +dmVFZGl0b3IuX3JlbmRlclhyZWZBcnRpY2xlcyhcJ1wnKTsiPuKGkCBadXLDvGNrIHp1ciBBcnRp +a2VsbGlzdGU8L2Rpdj4nOwogICAgICAgIGh0bWwgKz0gJzxkaXYgY2xhc3M9InhyZWYtaXRlbSIg +b25jbGljaz0iRHJpdmVFZGl0b3IuaW5zZXJ0WHJlZihcJycgKyBEcml2ZVBvcnRhbC5lc2NhcGVB +dHRyKGRvYy5pZCkgKyAnXCcsIFwnXCcpIj4nICsKICAgICAgICAgICAgJzxkaXYgY2xhc3M9Inhy +ZWYtdGl0bGUiPicgKyBEcml2ZVBvcnRhbC5lc2NhcGVIVE1MKGRvYy50aXRlbCkgKyAnPC9kaXY+ +JyArCiAgICAgICAgICAgICc8ZGl2IGNsYXNzPSJ4cmVmLWNhdCI+R2VzYW10ZW4gQXJ0aWtlbCB2 +ZXJsaW5rZW48L2Rpdj48L2Rpdj4nOwoKICAgICAgICB2YXIgZmlsdGVyZWQgPSBoZWFkaW5ncy5m +aWx0ZXIoZnVuY3Rpb24oaCkgewogICAgICAgICAgICByZXR1cm4gIXEgfHwgaC50ZXh0LnRvTG93 +ZXJDYXNlKCkuaW5jbHVkZXMocSk7CiAgICAgICAgfSk7CgogICAgICAgIGZpbHRlcmVkLmZvckVh +Y2goZnVuY3Rpb24oaCkgewogICAgICAgICAgICB2YXIgaW5kZW50ID0gKGgubGV2ZWwgLSAxKSAq +IDEyOwogICAgICAgICAgICBodG1sICs9ICc8ZGl2IGNsYXNzPSJ4cmVmLWl0ZW0gaGVhZGluZyIg +c3R5bGU9InBhZGRpbmctbGVmdDonICsgKDE2ICsgaW5kZW50KSArICdweDsiIG9uY2xpY2s9IkRy +aXZlRWRpdG9yLmluc2VydFhyZWYoXCcnICsgRHJpdmVQb3J0YWwuZXNjYXBlQXR0cihkb2MuaWQp +ICsgJ1wnLCBcJycgKyBEcml2ZVBvcnRhbC5lc2NhcGVBdHRyKGguc2x1ZykgKyAnXCcpIj4nICsK +ICAgICAgICAgICAgICAgICc8ZGl2IGNsYXNzPSJ4cmVmLXRpdGxlIj4nICsgRHJpdmVQb3J0YWwu +ZXNjYXBlSFRNTChoLnRleHQpICsgJzwvZGl2PjwvZGl2Pic7CiAgICAgICAgfSk7CgogICAgICAg +IGlmIChoZWFkaW5ncy5sZW5ndGggPT09IDApIHsKICAgICAgICAgICAgaHRtbCArPSAnPGRpdiBz +dHlsZT0icGFkZGluZzoxMnB4IDE2cHg7Zm9udC1zaXplOjEycHg7Y29sb3I6dmFyKC0tdGV4dC1t +dXRlZCk7Ij5LZWluZSDDnGJlcnNjaHJpZnRlbiBpbSBBcnRpa2VsIHZvcmhhbmRlbjwvZGl2Pic7 +CiAgICAgICAgfQoKICAgICAgICBsaXN0LmlubmVySFRNTCA9IGh0bWw7CiAgICB9LAoKICAgIGlu +c2VydFhyZWYoZG9jSWQsIGhlYWRpbmdTbHVnKSB7CiAgICAgICAgdmFyIGRvYyA9IERyaXZlRlMu +ZG9jdW1lbnRzLmZpbmQoZnVuY3Rpb24oZCkgeyByZXR1cm4gZC5pZCA9PT0gZG9jSWQ7IH0pOwog +ICAgICAgIGlmICghZG9jKSByZXR1cm47CgogICAgICAgIHRoaXMuY2xvc2VYcmVmRHJvcGRvd24o +KTsKCiAgICAgICAgLy8gRGFzICMgZW50ZmVybmVuIGRhcyBkZW4gRHJvcGRvd24gZ2V0cmlnZ2Vy +dCBoYXQKICAgICAgICB2YXIgZWRpdG9yID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VkaXRv +cklucHV0Jyk7CiAgICAgICAgdmFyIHNlbCA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTsKCiAgICAg +ICAgLy8gQ3Vyc29yLVBvc2l0aW9uIHdpZWRlcmhlcnN0ZWxsZW4KICAgICAgICBpZiAodGhpcy5f +eHJlZlJhbmdlKSB7CiAgICAgICAgICAgIHNlbC5yZW1vdmVBbGxSYW5nZXMoKTsKICAgICAgICAg +ICAgc2VsLmFkZFJhbmdlKHRoaXMuX3hyZWZSYW5nZSk7CiAgICAgICAgfQoKICAgICAgICAvLyBF +aW4gWmVpY2hlbiB6dXLDvGNrIChkYXMgIykgbMO2c2NoZW4KICAgICAgICBpZiAoc2VsLnJhbmdl +Q291bnQpIHsKICAgICAgICAgICAgdmFyIHJhbmdlID0gc2VsLmdldFJhbmdlQXQoMCk7CiAgICAg +ICAgICAgIHJhbmdlLnNldFN0YXJ0KHJhbmdlLnN0YXJ0Q29udGFpbmVyLCBNYXRoLm1heCgwLCBy +YW5nZS5zdGFydE9mZnNldCAtIDEpKTsKICAgICAgICAgICAgcmFuZ2UuZGVsZXRlQ29udGVudHMo +KTsKICAgICAgICB9CgogICAgICAgIC8vIENyb3NzbGluay1FbGVtZW50IGVpbmbDvGdlbgogICAg +ICAgIHZhciBhbmNob3IgPSBoZWFkaW5nU2x1ZyA/IGRvY0lkICsgJyMnICsgaGVhZGluZ1NsdWcg +OiBkb2NJZDsKICAgICAgICB2YXIgbGFiZWwgPSBkb2MudGl0ZWw7CiAgICAgICAgaWYgKGhlYWRp +bmdTbHVnKSB7CiAgICAgICAgICAgIHZhciBoZWFkaW5ncyA9IHRoaXMuX2V4dHJhY3RIZWFkaW5n +cyhkb2MuaW5oYWx0KTsKICAgICAgICAgICAgdmFyIG1hdGNoID0gaGVhZGluZ3MuZmluZChmdW5j +dGlvbihoKSB7IHJldHVybiBoLnNsdWcgPT09IGhlYWRpbmdTbHVnOyB9KTsKICAgICAgICAgICAg +aWYgKG1hdGNoKSBsYWJlbCA9IGRvYy50aXRlbCArICcg4oaSICcgKyBtYXRjaC50ZXh0OwogICAg +ICAgIH0KCiAgICAgICAgdmFyIHhyZWZIdG1sID0gJzxzcGFuIGNsYXNzPSJkcml2ZS14cmVmIiBk +YXRhLXhyZWYtdGFyZ2V0PSInICsgRHJpdmVQb3J0YWwuZXNjYXBlQXR0cihhbmNob3IpICsgJyIg +Y29udGVudGVkaXRhYmxlPSJmYWxzZSI+JyArIERyaXZlUG9ydGFsLmVzY2FwZUhUTUwobGFiZWwp +ICsgJzwvc3Bhbj4mbmJzcDsnOwoKICAgICAgICBkb2N1bWVudC5leGVjQ29tbWFuZCgnaW5zZXJ0 +SFRNTCcsIGZhbHNlLCB4cmVmSHRtbCk7CiAgICAgICAgdGhpcy5zYXZlU3RhdGUoKTsKICAgIH0s +CgogICAgLy8gLS0tIEFjY29yZGlvbiAoQXVma2xhcHBiYXJlciBUZXh0YmVyZWljaCkgLS0tCiAg +ICBfYWNjQ291bnRlcjogMCwKCiAgICBpbnNlcnRBY2NvcmRpb24oKSB7CiAgICAgICAgdmFyIHNl +bCA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTsKICAgICAgICB0aGlzLl9hY2NSYW5nZSA9IChzZWwg +JiYgc2VsLnJhbmdlQ291bnQpID8gc2VsLmdldFJhbmdlQXQoMCkuY2xvbmVSYW5nZSgpIDogbnVs +bDsKICAgICAgICB0aGlzLl9hY2NDb3VudGVyID0gMTsKICAgICAgICB2YXIgaW5wdXRTdHlsZSA9 +ICd3aWR0aDoxMDAlO3BhZGRpbmc6NnB4IDEwcHg7Ym9yZGVyOjFweCBzb2xpZCB2YXIoLS1ib3Jk +ZXItY29sb3IpO2JvcmRlci1yYWRpdXM6NHB4O2ZvbnQtc2l6ZToxM3B4O2JhY2tncm91bmQ6dmFy +KC0tYmctaW5wdXQpO2NvbG9yOnZhcigtLXRleHQtcHJpbWFyeSk7JzsKCiAgICAgICAgdmFyIG1v +ZGFsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CiAgICAgICAgbW9kYWwuc3R5bGUu +Y3NzVGV4dCA9ICdwb3NpdGlvbjpmaXhlZDt0b3A6MDtsZWZ0OjA7d2lkdGg6MTAwJTtoZWlnaHQ6 +MTAwJTtiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsMC41KTt6LWluZGV4OjEwNTAwO2Rpc3BsYXk6Zmxl +eDthbGlnbi1pdGVtczpjZW50ZXI7anVzdGlmeS1jb250ZW50OmNlbnRlcjsnOwogICAgICAgIG1v +ZGFsLm9uY2xpY2sgPSBmdW5jdGlvbihlKSB7IGlmIChlLnRhcmdldCA9PT0gbW9kYWwpIG1vZGFs +LnJlbW92ZSgpOyB9OwogICAgICAgIG1vZGFsLmlubmVySFRNTCA9CiAgICAgICAgICAgICc8ZGl2 +IHN0eWxlPSJiYWNrZ3JvdW5kOnZhcigtLWJnLWNhcmQpO2JvcmRlci1yYWRpdXM6MTBweDtwYWRk +aW5nOjIwcHggMjRweDttYXgtd2lkdGg6NjAwcHg7d2lkdGg6OTAlO2JveC1zaGFkb3c6MCA4cHgg +MzJweCByZ2JhKDAsMCwwLDAuMyk7bWF4LWhlaWdodDo4NXZoO2Rpc3BsYXk6ZmxleDtmbGV4LWRp +cmVjdGlvbjpjb2x1bW47Ij4nICsKICAgICAgICAgICAgICAgICc8aDMgc3R5bGU9ImNvbG9yOnZh +cigtLXRleHQtaGVhZGluZyk7bWFyZ2luLWJvdHRvbToxMHB4O2ZsZXgtc2hyaW5rOjA7Ij5BdWZr +bGFwcGJhcmUgQmVyZWljaGUgZWluZsO8Z2VuPC9oMz4nICsKICAgICAgICAgICAgICAgICc8cCBz +dHlsZT0iZm9udC1zaXplOjEycHg7Y29sb3I6dmFyKC0tdGV4dC1tdXRlZCk7bWFyZ2luLWJvdHRv +bToxMnB4O2ZsZXgtc2hyaW5rOjA7Ij5KZWRlciBCZXJlaWNoIGhhdCBlaW5lbiBUaXRlbCAoaW1t +ZXIgc2ljaHRiYXIpIHVuZCBlaW5lbiBJbmhhbHQgKHdpcmQgYmVpbSBLbGljayBhdWZnZWtsYXBw +dCkuIER1IGthbm5zdCBtZWhyZXJlIEJlcmVpY2hlIGF1ZiBlaW5tYWwgZWluZsO8Z2VuLjwvcD4n +ICsKICAgICAgICAgICAgICAgICc8ZGl2IGlkPSJhY2NJbnNlcnRJdGVtcyIgc3R5bGU9Im92ZXJm +bG93LXk6YXV0bztmbGV4OjE7bWluLWhlaWdodDowO3BhZGRpbmctcmlnaHQ6NHB4OyI+JyArCiAg +ICAgICAgICAgICAgICAgICAgRHJpdmVFZGl0b3IuX2FjY0l0ZW1IdG1sKDEpICsKICAgICAgICAg +ICAgICAgICc8L2Rpdj4nICsKICAgICAgICAgICAgICAgICc8ZGl2IHN0eWxlPSJmbGV4LXNocmlu +azowO21hcmdpbi10b3A6MTBweDtwYWRkaW5nLXRvcDoxMHB4O2JvcmRlci10b3A6MXB4IHNvbGlk +IHZhcigtLWJvcmRlci1saWdodCk7Ij4nICsKICAgICAgICAgICAgICAgICAgICAnPGJ1dHRvbiBv +bmNsaWNrPSJEcml2ZUVkaXRvci5fYWRkQWNjSXRlbSgpIiBzdHlsZT0id2lkdGg6MTAwJTtwYWRk +aW5nOjhweDtib3JkZXI6MXB4IGRhc2hlZCB2YXIoLS1ib3JkZXItY29sb3IpO2JhY2tncm91bmQ6 +dmFyKC0tYmctY2FyZC1hbHQpO2JvcmRlci1yYWRpdXM6NHB4O2N1cnNvcjpwb2ludGVyO2NvbG9y +OnZhcigtLXRleHQtaGVhZGluZyk7Zm9udC13ZWlnaHQ6NjAwO2ZvbnQtc2l6ZToxM3B4OyI+KyBX +ZWl0ZXJlbiBCZXJlaWNoIGhpbnp1ZsO8Z2VuPC9idXR0b24+JyArCiAgICAgICAgICAgICAgICAn +PC9kaXY+JyArCiAgICAgICAgICAgICAgICAnPGRpdiBzdHlsZT0iZGlzcGxheTpmbGV4O2dhcDo4 +cHg7anVzdGlmeS1jb250ZW50OmZsZXgtZW5kO21hcmdpbi10b3A6MTBweDtmbGV4LXNocmluazow +OyI+JyArCiAgICAgICAgICAgICAgICAgICAgJzxidXR0b24gb25jbGljaz0idGhpcy5jbG9zZXN0 +KFwnZGl2W3N0eWxlXVwnKS5wYXJlbnRFbGVtZW50LnJlbW92ZSgpIiBzdHlsZT0icGFkZGluZzo4 +cHggMTZweDtib3JkZXItcmFkaXVzOjRweDtib3JkZXI6MXB4IHNvbGlkIHZhcigtLWJvcmRlci1j +b2xvcik7YmFja2dyb3VuZDp2YXIoLS1iZy1jYXJkKTtjb2xvcjp2YXIoLS10ZXh0LXByaW1hcnkp +O2N1cnNvcjpwb2ludGVyOyI+QWJicmVjaGVuPC9idXR0b24+JyArCiAgICAgICAgICAgICAgICAg +ICAgJzxidXR0b24gb25jbGljaz0iRHJpdmVFZGl0b3IuX2NvbmZpcm1BY2NvcmRpb24oKSIgc3R5 +bGU9InBhZGRpbmc6OHB4IDE2cHg7Ym9yZGVyLXJhZGl1czo0cHg7Ym9yZGVyOm5vbmU7YmFja2dy +b3VuZDp2YXIoLS10ZXh0LWhlYWRpbmcpO2NvbG9yOndoaXRlO2N1cnNvcjpwb2ludGVyO2ZvbnQt +d2VpZ2h0OjYwMDsiPkVpbmbDvGdlbjwvYnV0dG9uPicgKwogICAgICAgICAgICAgICAgJzwvZGl2 +PicgKwogICAgICAgICAgICAnPC9kaXY+JzsKICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENo +aWxkKG1vZGFsKTsKICAgICAgICB0aGlzLl9hY2NNb2RhbCA9IG1vZGFsOwogICAgICAgIHNldFRp +bWVvdXQoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHZhciBmaXJzdCA9IGRvY3VtZW50LmdldEVs +ZW1lbnRCeUlkKCdhY2NUXzEnKTsKICAgICAgICAgICAgaWYgKGZpcnN0KSBmaXJzdC5mb2N1cygp +OwogICAgICAgIH0sIDUwKTsKICAgIH0sCgogICAgX2FjY01vZGFsOiBudWxsLAoKICAgIF9hY2NJ +dGVtSHRtbChudW0pIHsKICAgICAgICB2YXIgaW5wdXRTdHlsZSA9ICd3aWR0aDoxMDAlO3BhZGRp +bmc6NnB4IDEwcHg7Ym9yZGVyOjFweCBzb2xpZCB2YXIoLS1ib3JkZXItY29sb3IpO2JvcmRlci1y +YWRpdXM6NHB4O2ZvbnQtc2l6ZToxM3B4O2JhY2tncm91bmQ6dmFyKC0tYmctaW5wdXQpO2NvbG9y +OnZhcigtLXRleHQtcHJpbWFyeSk7JzsKICAgICAgICByZXR1cm4gJzxkaXYgY2xhc3M9ImFjYy1p +bnNlcnQtaXRlbSIgc3R5bGU9Im1hcmdpbi1ib3R0b206MTBweDtwYWRkaW5nOjEwcHggMTJweDti +YWNrZ3JvdW5kOnZhcigtLWJnLWNhcmQtYWx0KTtib3JkZXItcmFkaXVzOjZweDtib3JkZXI6MXB4 +IHNvbGlkIHZhcigtLWJvcmRlci1saWdodCk7Ij4nICsKICAgICAgICAgICAgJzxkaXYgc3R5bGU9 +ImRpc3BsYXk6ZmxleDtqdXN0aWZ5LWNvbnRlbnQ6c3BhY2UtYmV0d2VlbjthbGlnbi1pdGVtczpj +ZW50ZXI7bWFyZ2luLWJvdHRvbTo2cHg7Ij4nICsKICAgICAgICAgICAgICAgICc8bGFiZWwgc3R5 +bGU9ImZvbnQtc2l6ZToxMXB4O2ZvbnQtd2VpZ2h0OjYwMDtjb2xvcjp2YXIoLS10ZXh0LWhlYWRp +bmcpOyI+QmVyZWljaCAnICsgbnVtICsgJzwvbGFiZWw+JyArCiAgICAgICAgICAgICAgICAobnVt +ID4gMSA/ICc8YnV0dG9uIG9uY2xpY2s9InRoaXMuY2xvc2VzdChcJy5hY2MtaW5zZXJ0LWl0ZW1c +JykucmVtb3ZlKCkiIHN0eWxlPSJiYWNrZ3JvdW5kOm5vbmU7Ym9yZGVyOm5vbmU7Y29sb3I6dmFy +KC0tdGV4dC1tdXRlZCk7Y3Vyc29yOnBvaW50ZXI7Zm9udC1zaXplOjE0cHg7IiB0aXRsZT0iRW50 +ZmVybmVuIj4mdGltZXM7PC9idXR0b24+JyA6ICcnKSArCiAgICAgICAgICAgICc8L2Rpdj4nICsK +ICAgICAgICAgICAgJzxpbnB1dCB0eXBlPSJ0ZXh0IiBpZD0iYWNjVF8nICsgbnVtICsgJyIgcGxh +Y2Vob2xkZXI9IlRpdGVsIChpbW1lciBzaWNodGJhcikuLi4iIHN0eWxlPSInICsgaW5wdXRTdHls +ZSArICdtYXJnaW4tYm90dG9tOjZweDtmb250LXdlaWdodDo2MDA7Ij4nICsKICAgICAgICAgICAg +Jzx0ZXh0YXJlYSBpZD0iYWNjQ18nICsgbnVtICsgJyIgcGxhY2Vob2xkZXI9IkluaGFsdCAod2ly +ZCBhdWZnZWtsYXBwdCkuLi4iIHJvd3M9IjMiIHN0eWxlPSInICsgaW5wdXRTdHlsZSArICdyZXNp +emU6dmVydGljYWw7bGluZS1oZWlnaHQ6MS41OyI+PC90ZXh0YXJlYT4nICsKICAgICAgICAnPC9k +aXY+JzsKICAgIH0sCgogICAgX2FkZEFjY0l0ZW0oKSB7CiAgICAgICAgdGhpcy5fYWNjQ291bnRl +cisrOwogICAgICAgIHZhciBjb250YWluZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYWNj +SW5zZXJ0SXRlbXMnKTsKICAgICAgICBpZiAoIWNvbnRhaW5lcikgcmV0dXJuOwogICAgICAgIHZh +ciBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKICAgICAgICBkaXYuaW5uZXJI +VE1MID0gdGhpcy5fYWNjSXRlbUh0bWwodGhpcy5fYWNjQ291bnRlcik7CiAgICAgICAgY29udGFp +bmVyLmFwcGVuZENoaWxkKGRpdi5maXJzdENoaWxkKTsKICAgICAgICB2YXIgbmV3VCA9IGRvY3Vt +ZW50LmdldEVsZW1lbnRCeUlkKCdhY2NUXycgKyB0aGlzLl9hY2NDb3VudGVyKTsKICAgICAgICBp +ZiAobmV3VCkgeyBuZXdULmZvY3VzKCk7IG5ld1Quc2Nyb2xsSW50b1ZpZXcoeyBiZWhhdmlvcjog +J3Ntb290aCcsIGJsb2NrOiAnbmVhcmVzdCcgfSk7IH0KICAgIH0sCgogICAgX2NvbmZpcm1BY2Nv +cmRpb24oKSB7CiAgICAgICAgdmFyIGl0ZW1zID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgn +I2FjY0luc2VydEl0ZW1zIC5hY2MtaW5zZXJ0LWl0ZW0nKTsKICAgICAgICB2YXIgZW50cmllcyA9 +IFtdOwogICAgICAgIGl0ZW1zLmZvckVhY2goZnVuY3Rpb24oaXRlbSkgewogICAgICAgICAgICB2 +YXIgdElucHV0ID0gaXRlbS5xdWVyeVNlbGVjdG9yKCdpbnB1dFtpZF49ImFjY1RfIl0nKTsKICAg +ICAgICAgICAgdmFyIGNJbnB1dCA9IGl0ZW0ucXVlcnlTZWxlY3RvcigndGV4dGFyZWFbaWRePSJh +Y2NDXyJdJyk7CiAgICAgICAgICAgIHZhciB0ID0gdElucHV0ID8gdElucHV0LnZhbHVlLnRyaW0o +KSA6ICcnOwogICAgICAgICAgICB2YXIgYyA9IGNJbnB1dCA/IGNJbnB1dC52YWx1ZS50cmltKCkg +OiAnJzsKICAgICAgICAgICAgaWYgKHQpIGVudHJpZXMucHVzaCh7IHRpdGxlOiB0LCBjb250ZW50 +OiBjIHx8ICcnIH0pOwogICAgICAgIH0pOwogICAgICAgIGlmIChlbnRyaWVzLmxlbmd0aCA9PT0g +MCkgewogICAgICAgICAgICBzaG93VG9hc3QoJ0JpdHRlIG1pbmRlc3RlbnMgZWluZW4gVGl0ZWwg +ZWluZ2ViZW4nLCAnd2FybmluZycpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAg +ICAgICBpZiAodGhpcy5fYWNjTW9kYWwpIHsgdGhpcy5fYWNjTW9kYWwucmVtb3ZlKCk7IHRoaXMu +X2FjY01vZGFsID0gbnVsbDsgfQoKICAgICAgICB2YXIgYWNjSHRtbCA9ICcnOwogICAgICAgIGVu +dHJpZXMuZm9yRWFjaChmdW5jdGlvbihlKSB7CiAgICAgICAgICAgIHZhciBjb250ZW50ID0gRHJp +dmVQb3J0YWwuZXNjYXBlSFRNTChlLmNvbnRlbnQpLnJlcGxhY2UoL1xuL2csICc8YnI+JykgfHwg +JzxwPjwvcD4nOwogICAgICAgICAgICBhY2NIdG1sICs9CiAgICAgICAgICAgICAgICAnPGRpdiBj +bGFzcz0iZHJpdmUtYWNjb3JkaW9uIiBjb250ZW50ZWRpdGFibGU9ImZhbHNlIj4nICsKICAgICAg +ICAgICAgICAgICAgICAnPGRpdiBjbGFzcz0iZHJpdmUtYWNjb3JkaW9uLWhlYWRlciI+JyArCiAg +ICAgICAgICAgICAgICAgICAgICAgICc8c3BhbiBjbGFzcz0iZHJpdmUtYWNjb3JkaW9uLWFycm93 +Ij48aW1nIHNyYz0iY3NzL2ljb25zL0NoZXZyb24ucG5nIiBzdHlsZT0id2lkdGg6MTJweDtoZWln +aHQ6MTJweDsiPjwvc3Bhbj4nICsKICAgICAgICAgICAgICAgICAgICAgICAgJzxzcGFuPicgKyBE +cml2ZVBvcnRhbC5lc2NhcGVIVE1MKGUudGl0bGUpICsgJzwvc3Bhbj4nICsKICAgICAgICAgICAg +ICAgICAgICAnPC9kaXY+JyArCiAgICAgICAgICAgICAgICAgICAgJzxkaXYgY2xhc3M9ImRyaXZl +LWFjY29yZGlvbi1ib2R5Ij4nICsgY29udGVudCArICc8L2Rpdj4nICsKICAgICAgICAgICAgICAg +ICc8L2Rpdj4nOwogICAgICAgIH0pOwogICAgICAgIGFjY0h0bWwgKz0gJzxicj4nOwoKICAgICAg +ICB2YXIgZWRpdG9yID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VkaXRvcklucHV0Jyk7CiAg +ICAgICAgZWRpdG9yLmZvY3VzKCk7CiAgICAgICAgaWYgKHRoaXMuX2FjY1JhbmdlKSB7CiAgICAg +ICAgICAgIHZhciBzZWwgPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7CiAgICAgICAgICAgIHNlbC5y +ZW1vdmVBbGxSYW5nZXMoKTsKICAgICAgICAgICAgc2VsLmFkZFJhbmdlKHRoaXMuX2FjY1Jhbmdl +KTsKICAgICAgICAgICAgdGhpcy5fYWNjUmFuZ2UgPSBudWxsOwogICAgICAgIH0KICAgICAgICBk +b2N1bWVudC5leGVjQ29tbWFuZCgnaW5zZXJ0SFRNTCcsIGZhbHNlLCBhY2NIdG1sKTsKICAgICAg +ICB0aGlzLnNhdmVTdGF0ZSgpOwogICAgfSwKCiAgICAvLyAtLS0gRkFRLUJlcmVpY2ggLS0tCiAg +ICBfZmFxQ291bnRlcjogMCwKCiAgICBpbnNlcnRGQVEoKSB7CiAgICAgICAgdGhpcy5fZmFxQ291 +bnRlciA9IDE7CiAgICAgICAgLy8gQ3Vyc29yLVBvc2l0aW9uIG1lcmtlbgogICAgICAgIHZhciBz +ZWwgPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7CiAgICAgICAgdGhpcy5fZmFxUmFuZ2UgPSAoc2Vs +ICYmIHNlbC5yYW5nZUNvdW50KSA/IHNlbC5nZXRSYW5nZUF0KDApLmNsb25lUmFuZ2UoKSA6IG51 +bGw7CiAgICAgICAgdmFyIGlucHV0U3R5bGUgPSAnd2lkdGg6MTAwJTtwYWRkaW5nOjZweCAxMHB4 +O2JvcmRlcjoxcHggc29saWQgdmFyKC0tYm9yZGVyLWNvbG9yKTtib3JkZXItcmFkaXVzOjRweDtm +b250LXNpemU6MTNweDtiYWNrZ3JvdW5kOnZhcigtLWJnLWlucHV0KTtjb2xvcjp2YXIoLS10ZXh0 +LXByaW1hcnkpOyc7CiAgICAgICAgdmFyIG1vZGFsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgn +ZGl2Jyk7CiAgICAgICAgbW9kYWwuc3R5bGUuY3NzVGV4dCA9ICdwb3NpdGlvbjpmaXhlZDt0b3A6 +MDtsZWZ0OjA7d2lkdGg6MTAwJTtoZWlnaHQ6MTAwJTtiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsMC41 +KTt6LWluZGV4OjEwNTAwO2Rpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpjZW50ZXI7anVzdGlmeS1j +b250ZW50OmNlbnRlcjsnOwogICAgICAgIG1vZGFsLm9uY2xpY2sgPSBmdW5jdGlvbihlKSB7IGlm +IChlLnRhcmdldCA9PT0gbW9kYWwpIG1vZGFsLnJlbW92ZSgpOyB9OwogICAgICAgIG1vZGFsLmlu +bmVySFRNTCA9CiAgICAgICAgICAgICc8ZGl2IHN0eWxlPSJiYWNrZ3JvdW5kOnZhcigtLWJnLWNh +cmQpO2JvcmRlci1yYWRpdXM6MTBweDtwYWRkaW5nOjIwcHggMjRweDttYXgtd2lkdGg6NjQwcHg7 +d2lkdGg6OTAlO2JveC1zaGFkb3c6MCA4cHggMzJweCByZ2JhKDAsMCwwLDAuMyk7bWF4LWhlaWdo +dDo4NXZoO2Rpc3BsYXk6ZmxleDtmbGV4LWRpcmVjdGlvbjpjb2x1bW47Ij4nICsKICAgICAgICAg +ICAgICAgICc8aDMgc3R5bGU9ImNvbG9yOnZhcigtLXRleHQtaGVhZGluZyk7bWFyZ2luLWJvdHRv +bToxNHB4O2ZsZXgtc2hyaW5rOjA7Ij5GQVEtQmVyZWljaCBlaW5mw7xnZW48L2gzPicgKwogICAg +ICAgICAgICAgICAgJzxkaXYgaWQ9ImZhcUluc2VydEl0ZW1zIiBzdHlsZT0ib3ZlcmZsb3cteTph +dXRvO2ZsZXg6MTttaW4taGVpZ2h0OjA7cGFkZGluZy1yaWdodDo0cHg7Ij4nICsKICAgICAgICAg +ICAgICAgICAgICBEcml2ZUVkaXRvci5fZmFxSXRlbUh0bWwoMSkgKwogICAgICAgICAgICAgICAg +JzwvZGl2PicgKwogICAgICAgICAgICAgICAgJzxkaXYgc3R5bGU9ImZsZXgtc2hyaW5rOjA7bWFy +Z2luLXRvcDoxMHB4O3BhZGRpbmctdG9wOjEwcHg7Ym9yZGVyLXRvcDoxcHggc29saWQgdmFyKC0t +Ym9yZGVyLWxpZ2h0KTsiPicgKwogICAgICAgICAgICAgICAgICAgICc8YnV0dG9uIG9uY2xpY2s9 +IkRyaXZlRWRpdG9yLl9hZGRGYXFJdGVtKCkiIHN0eWxlPSJ3aWR0aDoxMDAlO3BhZGRpbmc6OHB4 +O2JvcmRlcjoxcHggZGFzaGVkIHZhcigtLWJvcmRlci1jb2xvcik7YmFja2dyb3VuZDp2YXIoLS1i +Zy1jYXJkLWFsdCk7Ym9yZGVyLXJhZGl1czo0cHg7Y3Vyc29yOnBvaW50ZXI7Y29sb3I6dmFyKC0t +dGV4dC1oZWFkaW5nKTtmb250LXdlaWdodDo2MDA7Zm9udC1zaXplOjEzcHg7Ij4rIFdlaXRlcmUg +RnJhZ2UgaGluenVmw7xnZW48L2J1dHRvbj4nICsKICAgICAgICAgICAgICAgICc8L2Rpdj4nICsK +ICAgICAgICAgICAgICAgICc8ZGl2IHN0eWxlPSJkaXNwbGF5OmZsZXg7Z2FwOjhweDtqdXN0aWZ5 +LWNvbnRlbnQ6ZmxleC1lbmQ7bWFyZ2luLXRvcDoxMHB4O2ZsZXgtc2hyaW5rOjA7Ij4nICsKICAg +ICAgICAgICAgICAgICAgICAnPGJ1dHRvbiBvbmNsaWNrPSJ0aGlzLmNsb3Nlc3QoXCdkaXZbc3R5 +bGVdXCcpLnBhcmVudEVsZW1lbnQucmVtb3ZlKCkiIHN0eWxlPSJwYWRkaW5nOjhweCAxNnB4O2Jv +cmRlci1yYWRpdXM6NHB4O2JvcmRlcjoxcHggc29saWQgdmFyKC0tYm9yZGVyLWNvbG9yKTtiYWNr +Z3JvdW5kOnZhcigtLWJnLWNhcmQpO2NvbG9yOnZhcigtLXRleHQtcHJpbWFyeSk7Y3Vyc29yOnBv +aW50ZXI7Ij5BYmJyZWNoZW48L2J1dHRvbj4nICsKICAgICAgICAgICAgICAgICAgICAnPGJ1dHRv +biBvbmNsaWNrPSJEcml2ZUVkaXRvci5fY29uZmlybUZBUSgpIiBzdHlsZT0icGFkZGluZzo4cHgg +MTZweDtib3JkZXItcmFkaXVzOjRweDtib3JkZXI6bm9uZTtiYWNrZ3JvdW5kOnZhcigtLXRleHQt +aGVhZGluZyk7Y29sb3I6d2hpdGU7Y3Vyc29yOnBvaW50ZXI7Zm9udC13ZWlnaHQ6NjAwOyI+RWlu +ZsO8Z2VuPC9idXR0b24+JyArCiAgICAgICAgICAgICAgICAnPC9kaXY+JyArCiAgICAgICAgICAg +ICc8L2Rpdj4nOwogICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQobW9kYWwpOwogICAg +ICAgIHRoaXMuX2ZhcU1vZGFsID0gbW9kYWw7CiAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigp +IHsKICAgICAgICAgICAgdmFyIGZpcnN0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ZhcVFf +MScpOwogICAgICAgICAgICBpZiAoZmlyc3QpIGZpcnN0LmZvY3VzKCk7CiAgICAgICAgfSwgNTAp +OwogICAgfSwKCiAgICBfZmFxTW9kYWw6IG51bGwsCgogICAgX2ZhcUl0ZW1IdG1sKG51bSkgewog +ICAgICAgIHZhciBpbnB1dFN0eWxlID0gJ3dpZHRoOjEwMCU7cGFkZGluZzo2cHggMTBweDtib3Jk +ZXI6MXB4IHNvbGlkIHZhcigtLWJvcmRlci1jb2xvcik7Ym9yZGVyLXJhZGl1czo0cHg7Zm9udC1z +aXplOjEzcHg7YmFja2dyb3VuZDp2YXIoLS1iZy1pbnB1dCk7Y29sb3I6dmFyKC0tdGV4dC1wcmlt +YXJ5KTsnOwogICAgICAgIHJldHVybiAnPGRpdiBjbGFzcz0iZmFxLWluc2VydC1pdGVtIiBzdHls +ZT0ibWFyZ2luLWJvdHRvbToxMnB4O3BhZGRpbmc6MTBweCAxMnB4O2JhY2tncm91bmQ6dmFyKC0t +YmctY2FyZC1hbHQpO2JvcmRlci1yYWRpdXM6NnB4O2JvcmRlcjoxcHggc29saWQgdmFyKC0tYm9y +ZGVyLWxpZ2h0KTsiPicgKwogICAgICAgICAgICAnPGRpdiBzdHlsZT0iZGlzcGxheTpmbGV4O2p1 +c3RpZnktY29udGVudDpzcGFjZS1iZXR3ZWVuO2FsaWduLWl0ZW1zOmNlbnRlcjttYXJnaW4tYm90 +dG9tOjZweDsiPicgKwogICAgICAgICAgICAgICAgJzxsYWJlbCBzdHlsZT0iZm9udC1zaXplOjEx +cHg7Zm9udC13ZWlnaHQ6NjAwO2NvbG9yOnZhcigtLXRleHQtaGVhZGluZyk7Ij5GcmFnZSAnICsg +bnVtICsgJzwvbGFiZWw+JyArCiAgICAgICAgICAgICAgICAobnVtID4gMSA/ICc8YnV0dG9uIG9u +Y2xpY2s9InRoaXMuY2xvc2VzdChcJy5mYXEtaW5zZXJ0LWl0ZW1cJykucmVtb3ZlKCkiIHN0eWxl +PSJiYWNrZ3JvdW5kOm5vbmU7Ym9yZGVyOm5vbmU7Y29sb3I6dmFyKC0tdGV4dC1tdXRlZCk7Y3Vy +c29yOnBvaW50ZXI7Zm9udC1zaXplOjE0cHg7IiB0aXRsZT0iRW50ZmVybmVuIj4mdGltZXM7PC9i +dXR0b24+JyA6ICcnKSArCiAgICAgICAgICAgICc8L2Rpdj4nICsKICAgICAgICAgICAgJzxpbnB1 +dCB0eXBlPSJ0ZXh0IiBpZD0iZmFxUV8nICsgbnVtICsgJyIgcGxhY2Vob2xkZXI9IkZyYWdlIGVp +bmdlYmVuLi4uIiBzdHlsZT0iJyArIGlucHV0U3R5bGUgKyAnbWFyZ2luLWJvdHRvbTo2cHg7Zm9u +dC13ZWlnaHQ6NjAwOyI+JyArCiAgICAgICAgICAgICc8dGV4dGFyZWEgaWQ9ImZhcUFfJyArIG51 +bSArICciIHBsYWNlaG9sZGVyPSJBbnR3b3J0IGVpbmdlYmVuLi4uIiByb3dzPSIzIiBzdHlsZT0i +JyArIGlucHV0U3R5bGUgKyAncmVzaXplOnZlcnRpY2FsO2xpbmUtaGVpZ2h0OjEuNTsiPjwvdGV4 +dGFyZWE+JyArCiAgICAgICAgJzwvZGl2Pic7CiAgICB9LAoKICAgIF9hZGRGYXFJdGVtKCkgewog +ICAgICAgIHRoaXMuX2ZhcUNvdW50ZXIrKzsKICAgICAgICB2YXIgY29udGFpbmVyID0gZG9jdW1l +bnQuZ2V0RWxlbWVudEJ5SWQoJ2ZhcUluc2VydEl0ZW1zJyk7CiAgICAgICAgaWYgKCFjb250YWlu +ZXIpIHJldHVybjsKICAgICAgICB2YXIgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2 +Jyk7CiAgICAgICAgZGl2LmlubmVySFRNTCA9IHRoaXMuX2ZhcUl0ZW1IdG1sKHRoaXMuX2ZhcUNv +dW50ZXIpOwogICAgICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZChkaXYuZmlyc3RDaGlsZCk7CiAg +ICAgICAgdmFyIG5ld1EgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZmFxUV8nICsgdGhpcy5f +ZmFxQ291bnRlcik7CiAgICAgICAgaWYgKG5ld1EpIHsgbmV3US5mb2N1cygpOyBuZXdRLnNjcm9s +bEludG9WaWV3KHsgYmVoYXZpb3I6ICdzbW9vdGgnLCBibG9jazogJ25lYXJlc3QnIH0pOyB9CiAg +ICB9LAoKICAgIF9jb25maXJtRkFRKCkgewogICAgICAgIHZhciBpdGVtcyA9IGRvY3VtZW50LnF1 +ZXJ5U2VsZWN0b3JBbGwoJyNmYXFJbnNlcnRJdGVtcyAuZmFxLWluc2VydC1pdGVtJyk7CiAgICAg +ICAgdmFyIHBhaXJzID0gW107CiAgICAgICAgaXRlbXMuZm9yRWFjaChmdW5jdGlvbihpdGVtKSB7 +CiAgICAgICAgICAgIHZhciBxSW5wdXQgPSBpdGVtLnF1ZXJ5U2VsZWN0b3IoJ2lucHV0W2lkXj0i +ZmFxUV8iXScpOwogICAgICAgICAgICB2YXIgYUlucHV0ID0gaXRlbS5xdWVyeVNlbGVjdG9yKCd0 +ZXh0YXJlYVtpZF49ImZhcUFfIl0nKTsKICAgICAgICAgICAgdmFyIHEgPSBxSW5wdXQgPyBxSW5w +dXQudmFsdWUudHJpbSgpIDogJyc7CiAgICAgICAgICAgIHZhciBhID0gYUlucHV0ID8gYUlucHV0 +LnZhbHVlLnRyaW0oKSA6ICcnOwogICAgICAgICAgICBpZiAocSkgcGFpcnMucHVzaCh7IHE6IHEs +IGE6IGEgfHwgJ0FudHdvcnQgYXVzc3RlaGVuZC4nIH0pOwogICAgICAgIH0pOwogICAgICAgIGlm +IChwYWlycy5sZW5ndGggPT09IDApIHsKICAgICAgICAgICAgc2hvd1RvYXN0KCdCaXR0ZSBtaW5k +ZXN0ZW5zIGVpbmUgRnJhZ2UgZWluZ2ViZW4nLCAnd2FybmluZycpOwogICAgICAgICAgICByZXR1 +cm47CiAgICAgICAgfQoKICAgICAgICBpZiAodGhpcy5fZmFxTW9kYWwpIHsgdGhpcy5fZmFxTW9k +YWwucmVtb3ZlKCk7IHRoaXMuX2ZhcU1vZGFsID0gbnVsbDsgfQoKICAgICAgICAvLyBTcHJ1bmdt +YXJrZTogZmFxLXthcnRpa2VsdGl0ZWwtc2x1Z30KICAgICAgICB2YXIgc2x1ZyA9ICdmYXEnOwog +ICAgICAgIGlmICh0aGlzLmN1cnJlbnREb2MgJiYgdGhpcy5jdXJyZW50RG9jLnRpdGVsKSB7CiAg +ICAgICAgICAgIHNsdWcgPSAnZmFxLScgKyB0aGlzLmN1cnJlbnREb2MudGl0ZWwudG9Mb3dlckNh +c2UoKQogICAgICAgICAgICAgICAgLnJlcGxhY2UoL8OkL2csJ2FlJykucmVwbGFjZSgvw7YvZywn +b2UnKS5yZXBsYWNlKC/DvC9nLCd1ZScpLnJlcGxhY2UoL8OfL2csJ3NzJykKICAgICAgICAgICAg +ICAgIC5yZXBsYWNlKC9bXmEtejAtOV0rL2csJy0nKS5yZXBsYWNlKC9eLXwtJC9nLCcnKTsKICAg +ICAgICB9CgogICAgICAgIHZhciBmYXFIdG1sID0gJzxkaXYgY2xhc3M9ImRyaXZlLWZhcSIgaWQ9 +IicgKyBEcml2ZVBvcnRhbC5lc2NhcGVBdHRyKHNsdWcpICsgJyIgY29udGVudGVkaXRhYmxlPSJm +YWxzZSI+JzsKICAgICAgICBmYXFIdG1sICs9ICc8ZGl2IGNsYXNzPSJkcml2ZS1mYXEtaGVhZGVy +Ij48aW1nIHNyYz0iY3NzL2ljb25zL2ZhcS5wbmciIHN0eWxlPSJ3aWR0aDoyMHB4O2hlaWdodDoy +MHB4O2ZpbHRlcjppbnZlcnQoMSkgYnJpZ2h0bmVzcygyKTsiPiBGQVE8L2Rpdj4nOwogICAgICAg +IGZhcUh0bWwgKz0gJzxkaXYgY2xhc3M9ImRyaXZlLWZhcS1ib2R5Ij4nOwogICAgICAgIHBhaXJz +LmZvckVhY2goZnVuY3Rpb24ocCkgewogICAgICAgICAgICBmYXFIdG1sICs9ICc8ZGl2IGNsYXNz +PSJkcml2ZS1mYXEtaXRlbSI+JyArCiAgICAgICAgICAgICAgICAnPGRpdiBjbGFzcz0iZHJpdmUt +ZmFxLXF1ZXN0aW9uIj48c3BhbiBjbGFzcz0iZHJpdmUtZmFxLWFycm93Ij48aW1nIHNyYz0iY3Nz +L2ljb25zL0NoZXZyb24ucG5nIiBzdHlsZT0id2lkdGg6MTBweDtoZWlnaHQ6MTBweDsiPjwvc3Bh +bj48c3Bhbj4nICsgRHJpdmVQb3J0YWwuZXNjYXBlSFRNTChwLnEpICsgJzwvc3Bhbj48L2Rpdj4n +ICsKICAgICAgICAgICAgICAgICc8ZGl2IGNsYXNzPSJkcml2ZS1mYXEtYW5zd2VyIj4nICsgRHJp +dmVQb3J0YWwuZXNjYXBlSFRNTChwLmEpLnJlcGxhY2UoL1xuL2csICc8YnI+JykgKyAnPC9kaXY+ +JyArCiAgICAgICAgICAgICc8L2Rpdj4nOwogICAgICAgIH0pOwogICAgICAgIGZhcUh0bWwgKz0g +JzwvZGl2PjwvZGl2Pjxicj4nOwoKICAgICAgICB2YXIgZWRpdG9yID0gZG9jdW1lbnQuZ2V0RWxl +bWVudEJ5SWQoJ2VkaXRvcklucHV0Jyk7CiAgICAgICAgZWRpdG9yLmZvY3VzKCk7CiAgICAgICAg +Ly8gQ3Vyc29yLVBvc2l0aW9uIHdpZWRlcmhlcnN0ZWxsZW4KICAgICAgICBpZiAodGhpcy5fZmFx +UmFuZ2UpIHsKICAgICAgICAgICAgdmFyIHNlbCA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTsKICAg +ICAgICAgICAgc2VsLnJlbW92ZUFsbFJhbmdlcygpOwogICAgICAgICAgICBzZWwuYWRkUmFuZ2Uo +dGhpcy5fZmFxUmFuZ2UpOwogICAgICAgICAgICB0aGlzLl9mYXFSYW5nZSA9IG51bGw7CiAgICAg +ICAgfQogICAgICAgIGRvY3VtZW50LmV4ZWNDb21tYW5kKCdpbnNlcnRIVE1MJywgZmFsc2UsIGZh +cUh0bWwpOwogICAgICAgIHRoaXMuc2F2ZVN0YXRlKCk7CiAgICB9LAoKICAgIC8vIC0tLSBUYWJl +bGxlIGVpbmbDvGdlbiAtLS0KICAgIGluc2VydFRhYmxlKCkgewogICAgICAgIHZhciBzZWwgPSB3 +aW5kb3cuZ2V0U2VsZWN0aW9uKCk7CiAgICAgICAgdGhpcy5fdGJsUmFuZ2UgPSAoc2VsICYmIHNl +bC5yYW5nZUNvdW50KSA/IHNlbC5nZXRSYW5nZUF0KDApLmNsb25lUmFuZ2UoKSA6IG51bGw7CiAg +ICAgICAgdmFyIGxhYmVsU3R5bGUgPSAnZm9udC1zaXplOjEycHg7Zm9udC13ZWlnaHQ6NjAwO2Nv +bG9yOnZhcigtLXRleHQtc2Vjb25kYXJ5KTtkaXNwbGF5OmJsb2NrO21hcmdpbi1ib3R0b206M3B4 +Oyc7CiAgICAgICAgdmFyIGlucHV0U3R5bGUgPSAnd2lkdGg6MTAwJTtwYWRkaW5nOjZweCAxMHB4 +O2JvcmRlcjoxcHggc29saWQgdmFyKC0tYm9yZGVyLWNvbG9yKTtib3JkZXItcmFkaXVzOjRweDtm +b250LXNpemU6MTRweDtiYWNrZ3JvdW5kOnZhcigtLWJnLWlucHV0KTtjb2xvcjp2YXIoLS10ZXh0 +LXByaW1hcnkpOyc7CiAgICAgICAgdmFyIGNiU3R5bGUgPSAnZGlzcGxheTpmbGV4O2FsaWduLWl0 +ZW1zOmNlbnRlcjtnYXA6NnB4O2ZvbnQtc2l6ZToxM3B4O2NvbG9yOnZhcigtLXRleHQtcHJpbWFy +eSk7Y3Vyc29yOnBvaW50ZXI7JzsKCiAgICAgICAgdmFyIG1vZGFsID0gZG9jdW1lbnQuY3JlYXRl +RWxlbWVudCgnZGl2Jyk7CiAgICAgICAgbW9kYWwuc3R5bGUuY3NzVGV4dCA9ICdwb3NpdGlvbjpm +aXhlZDt0b3A6MDtsZWZ0OjA7d2lkdGg6MTAwJTtoZWlnaHQ6MTAwJTtiYWNrZ3JvdW5kOnJnYmEo +MCwwLDAsMC41KTt6LWluZGV4OjEwNTAwO2Rpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpjZW50ZXI7 +anVzdGlmeS1jb250ZW50OmNlbnRlcjsnOwogICAgICAgIG1vZGFsLm9uY2xpY2sgPSBmdW5jdGlv +bihlKSB7IGlmIChlLnRhcmdldCA9PT0gbW9kYWwpIG1vZGFsLnJlbW92ZSgpOyB9OwogICAgICAg +IG1vZGFsLmlubmVySFRNTCA9CiAgICAgICAgICAgICc8ZGl2IHN0eWxlPSJiYWNrZ3JvdW5kOnZh +cigtLWJnLWNhcmQpO2JvcmRlci1yYWRpdXM6MTBweDtwYWRkaW5nOjIwcHggMjRweDttYXgtd2lk +dGg6NDQwcHg7d2lkdGg6OTAlO2JveC1zaGFkb3c6MCA4cHggMzJweCByZ2JhKDAsMCwwLDAuMyk7 +Ij4nICsKICAgICAgICAgICAgICAgICc8aDMgc3R5bGU9ImNvbG9yOnZhcigtLXRleHQtaGVhZGlu +Zyk7bWFyZ2luLWJvdHRvbToxNnB4OyI+VGFiZWxsZSBlaW5mw7xnZW48L2gzPicgKwoKICAgICAg +ICAgICAgICAgICc8ZGl2IHN0eWxlPSJkaXNwbGF5OmdyaWQ7Z3JpZC10ZW1wbGF0ZS1jb2x1bW5z +OjFmciAxZnI7Z2FwOjEycHg7bWFyZ2luLWJvdHRvbToxNHB4OyI+JyArCiAgICAgICAgICAgICAg +ICAgICAgJzxkaXY+PGxhYmVsIHN0eWxlPSInICsgbGFiZWxTdHlsZSArICciPlNwYWx0ZW48L2xh +YmVsPicgKwogICAgICAgICAgICAgICAgICAgICAgICAnPGlucHV0IHR5cGU9Im51bWJlciIgaWQ9 +InRibENvbHMiIHZhbHVlPSIzIiBtaW49IjEiIG1heD0iMjAiIHN0eWxlPSInICsgaW5wdXRTdHls +ZSArICciPjwvZGl2PicgKwogICAgICAgICAgICAgICAgICAgICc8ZGl2PjxsYWJlbCBzdHlsZT0i +JyArIGxhYmVsU3R5bGUgKyAnIj5aZWlsZW48L2xhYmVsPicgKwogICAgICAgICAgICAgICAgICAg +ICAgICAnPGlucHV0IHR5cGU9Im51bWJlciIgaWQ9InRibFJvd3MiIHZhbHVlPSI0IiBtaW49IjEi +IG1heD0iNTAiIHN0eWxlPSInICsgaW5wdXRTdHlsZSArICciPjwvZGl2PicgKwogICAgICAgICAg +ICAgICAgJzwvZGl2PicgKwoKICAgICAgICAgICAgICAgICc8ZGl2IHN0eWxlPSJtYXJnaW4tYm90 +dG9tOjE0cHg7cGFkZGluZzoxMnB4O2JhY2tncm91bmQ6dmFyKC0tYmctY2FyZC1hbHQpO2JvcmRl +ci1yYWRpdXM6NnB4OyI+JyArCiAgICAgICAgICAgICAgICAgICAgJzxkaXYgc3R5bGU9IicgKyBs +YWJlbFN0eWxlICsgJ21hcmdpbi1ib3R0b206OHB4OyI+w5xiZXJzY2hyaWZ0ZW48L2Rpdj4nICsK +ICAgICAgICAgICAgICAgICAgICAnPGxhYmVsIHN0eWxlPSInICsgY2JTdHlsZSArICdtYXJnaW4t +Ym90dG9tOjZweDsiPjxpbnB1dCB0eXBlPSJjaGVja2JveCIgaWQ9InRibENvbEhlYWRlcnMiIGNo +ZWNrZWQ+IFNwYWx0ZW7DvGJlcnNjaHJpZnRlbiAoZXJzdGUgWmVpbGUgZmV0dCk8L2xhYmVsPicg +KwogICAgICAgICAgICAgICAgICAgICc8bGFiZWwgc3R5bGU9IicgKyBjYlN0eWxlICsgJyI+PGlu +cHV0IHR5cGU9ImNoZWNrYm94IiBpZD0idGJsUm93SGVhZGVycyI+IFplaWxlbsO8YmVyc2Nocmlm +dGVuIChlcnN0ZSBTcGFsdGUgZmV0dCk8L2xhYmVsPicgKwogICAgICAgICAgICAgICAgJzwvZGl2 +PicgKwoKICAgICAgICAgICAgICAgICc8ZGl2IHN0eWxlPSJtYXJnaW4tYm90dG9tOjE2cHg7cGFk +ZGluZzoxMnB4O2JhY2tncm91bmQ6dmFyKC0tYmctY2FyZC1hbHQpO2JvcmRlci1yYWRpdXM6NnB4 +OyI+JyArCiAgICAgICAgICAgICAgICAgICAgJzxsYWJlbCBzdHlsZT0iJyArIGNiU3R5bGUgKyAn +Ij48aW5wdXQgdHlwZT0iY2hlY2tib3giIGlkPSJ0YmxTb3J0YWJsZSI+IFNvcnRpZXJiYXIgKEts +aWNrIGF1ZiBTcGFsdGVuw7xiZXJzY2hyaWZ0IHNvcnRpZXJ0KTwvbGFiZWw+JyArCiAgICAgICAg +ICAgICAgICAnPC9kaXY+JyArCgogICAgICAgICAgICAgICAgJzxkaXYgc3R5bGU9ImRpc3BsYXk6 +ZmxleDtnYXA6OHB4O2p1c3RpZnktY29udGVudDpmbGV4LWVuZDsiPicgKwogICAgICAgICAgICAg +ICAgICAgICc8YnV0dG9uIG9uY2xpY2s9InRoaXMuY2xvc2VzdChcJ2RpdltzdHlsZV1cJykucGFy +ZW50RWxlbWVudC5yZW1vdmUoKSIgc3R5bGU9InBhZGRpbmc6OHB4IDE2cHg7Ym9yZGVyLXJhZGl1 +czo0cHg7Ym9yZGVyOjFweCBzb2xpZCB2YXIoLS1ib3JkZXItY29sb3IpO2JhY2tncm91bmQ6dmFy +KC0tYmctY2FyZCk7Y29sb3I6dmFyKC0tdGV4dC1wcmltYXJ5KTtjdXJzb3I6cG9pbnRlcjsiPkFi +YnJlY2hlbjwvYnV0dG9uPicgKwogICAgICAgICAgICAgICAgICAgICc8YnV0dG9uIG9uY2xpY2s9 +IkRyaXZlRWRpdG9yLl9jb25maXJtVGFibGUoKSIgc3R5bGU9InBhZGRpbmc6OHB4IDE2cHg7Ym9y +ZGVyLXJhZGl1czo0cHg7Ym9yZGVyOm5vbmU7YmFja2dyb3VuZDp2YXIoLS10ZXh0LWhlYWRpbmcp +O2NvbG9yOndoaXRlO2N1cnNvcjpwb2ludGVyO2ZvbnQtd2VpZ2h0OjYwMDsiPkVpbmbDvGdlbjwv +YnV0dG9uPicgKwogICAgICAgICAgICAgICAgJzwvZGl2PicgKwogICAgICAgICAgICAnPC9kaXY+ +JzsKICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKG1vZGFsKTsKICAgICAgICB0aGlz +Ll90YmxNb2RhbCA9IG1vZGFsOwogICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7IGRvY3Vt +ZW50LmdldEVsZW1lbnRCeUlkKCd0YmxDb2xzJykuZm9jdXMoKTsgfSwgNTApOwogICAgfSwKCiAg +ICBfdGJsTW9kYWw6IG51bGwsCgogICAgX2NvbmZpcm1UYWJsZSgpIHsKICAgICAgICB2YXIgY29s +cyA9IHBhcnNlSW50KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0YmxDb2xzJykudmFsdWUpIHx8 +IDM7CiAgICAgICAgdmFyIHJvd3MgPSBwYXJzZUludChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgn +dGJsUm93cycpLnZhbHVlKSB8fCA0OwogICAgICAgIHZhciBjb2xIZWFkZXJzID0gZG9jdW1lbnQu +Z2V0RWxlbWVudEJ5SWQoJ3RibENvbEhlYWRlcnMnKS5jaGVja2VkOwogICAgICAgIHZhciByb3dI +ZWFkZXJzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RibFJvd0hlYWRlcnMnKS5jaGVja2Vk +OwogICAgICAgIHZhciBzb3J0YWJsZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0YmxTb3J0 +YWJsZScpLmNoZWNrZWQ7CgogICAgICAgIGNvbHMgPSBNYXRoLm1heCgxLCBNYXRoLm1pbigyMCwg +Y29scykpOwogICAgICAgIHJvd3MgPSBNYXRoLm1heCgxLCBNYXRoLm1pbig1MCwgcm93cykpOwoK +ICAgICAgICBpZiAodGhpcy5fdGJsTW9kYWwpIHsgdGhpcy5fdGJsTW9kYWwucmVtb3ZlKCk7IHRo +aXMuX3RibE1vZGFsID0gbnVsbDsgfQoKICAgICAgICB2YXIgc29ydENsYXNzID0gc29ydGFibGUg +PyAnIHNvcnRhYmxlJyA6ICcnOwogICAgICAgIHZhciBodG1sID0gJzxkaXYgY2xhc3M9ImRyaXZl +LXRhYmxlLXdyYXAiIGNvbnRlbnRlZGl0YWJsZT0iZmFsc2UiPjx0YWJsZSBjbGFzcz0iZHJpdmUt +dGFibGUiJyArIChzb3J0YWJsZSA/ICcgZGF0YS1zb3J0YWJsZT0idHJ1ZSInIDogJycpICsgJz4n +OwoKICAgICAgICAvLyBTcGFsdGVuLUhlYWRlcgogICAgICAgIGlmIChjb2xIZWFkZXJzKSB7CiAg +ICAgICAgICAgIGh0bWwgKz0gJzx0aGVhZD48dHI+JzsKICAgICAgICAgICAgZm9yICh2YXIgYyA9 +IDA7IGMgPCBjb2xzOyBjKyspIHsKICAgICAgICAgICAgICAgIGh0bWwgKz0gJzx0aCBjbGFzcz0i +JyArIHNvcnRDbGFzcyArICciIGNvbnRlbnRlZGl0YWJsZT0idHJ1ZSI+U3BhbHRlICcgKyAoYyAr +IDEpICsgJzwvdGg+JzsKICAgICAgICAgICAgfQogICAgICAgICAgICBodG1sICs9ICc8L3RyPjwv +dGhlYWQ+JzsKICAgICAgICB9CgogICAgICAgIGh0bWwgKz0gJzx0Ym9keT4nOwogICAgICAgIHZh +ciBkYXRhUm93cyA9IGNvbEhlYWRlcnMgPyByb3dzIC0gMSA6IHJvd3M7CiAgICAgICAgZm9yICh2 +YXIgciA9IDA7IHIgPCBkYXRhUm93czsgcisrKSB7CiAgICAgICAgICAgIGh0bWwgKz0gJzx0cj4n +OwogICAgICAgICAgICBmb3IgKHZhciBjID0gMDsgYyA8IGNvbHM7IGMrKykgewogICAgICAgICAg +ICAgICAgaWYgKGMgPT09IDAgJiYgcm93SGVhZGVycykgewogICAgICAgICAgICAgICAgICAgIGh0 +bWwgKz0gJzx0ZCBjbGFzcz0icm93LWhlYWRlciIgY29udGVudGVkaXRhYmxlPSJ0cnVlIj5aZWls +ZSAnICsgKHIgKyAxKSArICc8L3RkPic7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAg +ICAgICAgICAgICAgIGh0bWwgKz0gJzx0ZCBjb250ZW50ZWRpdGFibGU9InRydWUiPjwvdGQ+JzsK +ICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBodG1sICs9ICc8L3Ry +Pic7CiAgICAgICAgfQogICAgICAgIGh0bWwgKz0gJzwvdGJvZHk+PC90YWJsZT48L2Rpdj48YnI+ +JzsKCiAgICAgICAgdmFyIGVkaXRvciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlZGl0b3JJ +bnB1dCcpOwogICAgICAgIGVkaXRvci5mb2N1cygpOwogICAgICAgIGlmICh0aGlzLl90YmxSYW5n +ZSkgewogICAgICAgICAgICB2YXIgc2VsID0gd2luZG93LmdldFNlbGVjdGlvbigpOwogICAgICAg +ICAgICBzZWwucmVtb3ZlQWxsUmFuZ2VzKCk7CiAgICAgICAgICAgIHNlbC5hZGRSYW5nZSh0aGlz +Ll90YmxSYW5nZSk7CiAgICAgICAgICAgIHRoaXMuX3RibFJhbmdlID0gbnVsbDsKICAgICAgICB9 +CiAgICAgICAgZG9jdW1lbnQuZXhlY0NvbW1hbmQoJ2luc2VydEhUTUwnLCBmYWxzZSwgaHRtbCk7 +CiAgICAgICAgdGhpcy5zYXZlU3RhdGUoKTsKICAgIH0sCgogICAgLy8gLS0tIFRyZW5ubGluaWUg +KyBJbmZvYm94IC0tLQogICAgLy8gLS0tIFJBVy1Nb2R1cyAoSFRNTC1RdWVsbHRleHQpIC0tLQog +ICAgX3Jhd01vZGU6IGZhbHNlLAoKICAgIHRvZ2dsZVJhdygpIHsKICAgICAgICB2YXIgZWRpdG9y +ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VkaXRvcklucHV0Jyk7CiAgICAgICAgdmFyIGJ0 +biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdidG5SYXdNb2RlJyk7CiAgICAgICAgaWYgKCFl +ZGl0b3IpIHJldHVybjsKCiAgICAgICAgaWYgKHRoaXMuX3Jhd01vZGUpIHsKICAgICAgICAgICAg +Ly8gUkFXIOKGkiBXWVNJV1lHOiB0ZXh0YXJlYS1JbmhhbHQgenVydWVjayBpbiBkZW4gRWRpdG9y +CiAgICAgICAgICAgIHZhciB0ZXh0YXJlYSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlZGl0 +b3JSYXdUZXh0YXJlYScpOwogICAgICAgICAgICBpZiAodGV4dGFyZWEpIHsKICAgICAgICAgICAg +ICAgIGVkaXRvci5pbm5lckhUTUwgPSB0ZXh0YXJlYS52YWx1ZTsKICAgICAgICAgICAgICAgIHRl +eHRhcmVhLnJlbW92ZSgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVkaXRvci5zdHlsZS5k +aXNwbGF5ID0gJyc7CiAgICAgICAgICAgIGVkaXRvci5jb250ZW50RWRpdGFibGUgPSAndHJ1ZSc7 +CiAgICAgICAgICAgIGJ0bi5zdHlsZS5vcGFjaXR5ID0gJzAuNic7CiAgICAgICAgICAgIGJ0bi5z +dHlsZS5iYWNrZ3JvdW5kID0gJyc7CiAgICAgICAgICAgIHRoaXMuX3Jhd01vZGUgPSBmYWxzZTsK +ICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAvLyBXWVNJV1lHIOKGkiBSQVc6IEVkaXRvci1I +VE1MIGluIFRleHRhcmVhIGFuemVpZ2VuCiAgICAgICAgICAgIHZhciByYXdIdG1sID0gZWRpdG9y +LmlubmVySFRNTDsKICAgICAgICAgICAgZWRpdG9yLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7CiAg +ICAgICAgICAgIHZhciB0ZXh0YXJlYSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RleHRhcmVh +Jyk7CiAgICAgICAgICAgIHRleHRhcmVhLmlkID0gJ2VkaXRvclJhd1RleHRhcmVhJzsKICAgICAg +ICAgICAgdGV4dGFyZWEudmFsdWUgPSByYXdIdG1sOwogICAgICAgICAgICB0ZXh0YXJlYS5zdHls +ZS5jc3NUZXh0ID0gJ3dpZHRoOjEwMCU7aGVpZ2h0OjEwMCU7bWluLWhlaWdodDozMDBweDtwYWRk +aW5nOjEycHg7Ym9yZGVyOm5vbmU7Zm9udC1mYW1pbHk6bW9ub3NwYWNlO2ZvbnQtc2l6ZToxMnB4 +O2xpbmUtaGVpZ2h0OjEuNjtiYWNrZ3JvdW5kOnZhcigtLWJnLWlucHV0KTtjb2xvcjp2YXIoLS10 +ZXh0LXByaW1hcnkpO3Jlc2l6ZTpub25lO2ZsZXg6MTsnOwogICAgICAgICAgICBlZGl0b3IucGFy +ZW50Tm9kZS5pbnNlcnRCZWZvcmUodGV4dGFyZWEsIGVkaXRvci5uZXh0U2libGluZyk7CiAgICAg +ICAgICAgIGJ0bi5zdHlsZS5vcGFjaXR5ID0gJzEnOwogICAgICAgICAgICBidG4uc3R5bGUuYmFj +a2dyb3VuZCA9ICd2YXIoLS10ZXh0LWhlYWRpbmcpJzsKICAgICAgICAgICAgYnRuLnN0eWxlLmNv +bG9yID0gJ3doaXRlJzsKICAgICAgICAgICAgdGhpcy5fcmF3TW9kZSA9IHRydWU7CiAgICAgICAg +fQogICAgfSwKCiAgICBpbnNlcnREaXZpZGVyKCkgewogICAgICAgIHZhciBlZGl0b3IgPSBkb2N1 +bWVudC5nZXRFbGVtZW50QnlJZCgnZWRpdG9ySW5wdXQnKTsKICAgICAgICBlZGl0b3IuZm9jdXMo +KTsKICAgICAgICBkb2N1bWVudC5leGVjQ29tbWFuZCgnaW5zZXJ0SFRNTCcsIGZhbHNlLCAnPGhy +IGNsYXNzPSJkcml2ZS1kaXZpZGVyIj48YnI+Jyk7CiAgICAgICAgdGhpcy5zYXZlU3RhdGUoKTsK +ICAgIH0sCgogICAgaW5zZXJ0SW5mb2JveCgpIHsKICAgICAgICB2YXIgc2VsID0gd2luZG93Lmdl +dFNlbGVjdGlvbigpOwogICAgICAgIHRoaXMuX2luZm9ib3hSYW5nZSA9IChzZWwgJiYgc2VsLnJh +bmdlQ291bnQpID8gc2VsLmdldFJhbmdlQXQoMCkuY2xvbmVSYW5nZSgpIDogbnVsbDsKCiAgICAg +ICAgdmFyIGJ0blN0eWxlID0gJ2JhY2tncm91bmQ6bm9uZTtib3JkZXI6MXB4IHNvbGlkIHZhcigt +LWJvcmRlci1jb2xvcik7Ym9yZGVyLXJhZGl1czozcHg7cGFkZGluZzozcHggOHB4O2N1cnNvcjpw +b2ludGVyO2ZvbnQtc2l6ZToxMnB4O2NvbG9yOnZhcigtLXRleHQtcHJpbWFyeSk7bWluLXdpZHRo +OjI4cHg7JzsKICAgICAgICB2YXIgYnRuU3R5bGVCb2xkID0gYnRuU3R5bGUgKyAnZm9udC13ZWln +aHQ6NzAwOyc7CiAgICAgICAgdmFyIGJ0blN0eWxlSXRhbGljID0gYnRuU3R5bGUgKyAnZm9udC1z +dHlsZTppdGFsaWM7JzsKICAgICAgICB2YXIgYnRuU3R5bGVVbmRlcmxpbmUgPSBidG5TdHlsZSAr +ICd0ZXh0LWRlY29yYXRpb246dW5kZXJsaW5lOyc7CiAgICAgICAgdmFyIHNlbGVjdFN0eWxlID0g +J2JhY2tncm91bmQ6dmFyKC0tYmctaW5wdXQpO2JvcmRlcjoxcHggc29saWQgdmFyKC0tYm9yZGVy +LWNvbG9yKTtib3JkZXItcmFkaXVzOjNweDtwYWRkaW5nOjNweCA0cHg7Zm9udC1zaXplOjExcHg7 +Y29sb3I6dmFyKC0tdGV4dC1wcmltYXJ5KTtjdXJzb3I6cG9pbnRlcjsnOwoKICAgICAgICB2YXIg +bW9kYWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKICAgICAgICBtb2RhbC5zdHls +ZS5jc3NUZXh0ID0gJ3Bvc2l0aW9uOmZpeGVkO3RvcDowO2xlZnQ6MDt3aWR0aDoxMDAlO2hlaWdo +dDoxMDAlO2JhY2tncm91bmQ6cmdiYSgwLDAsMCwwLjUpO3otaW5kZXg6MTA1MDA7ZGlzcGxheTpm +bGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyOyc7CiAgICAgICAg +bW9kYWwub25jbGljayA9IGZ1bmN0aW9uKGUpIHsgaWYgKGUudGFyZ2V0ID09PSBtb2RhbCkgbW9k +YWwucmVtb3ZlKCk7IH07CiAgICAgICAgbW9kYWwuaW5uZXJIVE1MID0KICAgICAgICAgICAgJzxk +aXYgc3R5bGU9ImJhY2tncm91bmQ6dmFyKC0tYmctY2FyZCk7Ym9yZGVyLXJhZGl1czoxMHB4O3Bh +ZGRpbmc6MjBweCAyNHB4O21heC13aWR0aDo1MjBweDt3aWR0aDo5NCU7Ym94LXNoYWRvdzowIDhw +eCAzMnB4IHJnYmEoMCwwLDAsMC4zKTsiPicgKwogICAgICAgICAgICAgICAgJzxoMyBzdHlsZT0i +Y29sb3I6dmFyKC0tdGV4dC1oZWFkaW5nKTttYXJnaW4tYm90dG9tOjE0cHg7Ij5JbmZvYmxvY2sg +ZWluZsO8Z2VuPC9oMz4nICsKCiAgICAgICAgICAgICAgICAnPGxhYmVsIHN0eWxlPSJmb250LXNp +emU6MTJweDtmb250LXdlaWdodDo2MDA7Y29sb3I6dmFyKC0tdGV4dC1zZWNvbmRhcnkpO2Rpc3Bs +YXk6YmxvY2s7bWFyZ2luLWJvdHRvbTo0cHg7Ij7DnGJlcnNjaHJpZnQ8L2xhYmVsPicgKwogICAg +ICAgICAgICAgICAgJzxpbnB1dCB0eXBlPSJ0ZXh0IiBpZD0iaW5mb2JveFRpdGxlIiB2YWx1ZT0i +SGlud2VpcyIgcGxhY2Vob2xkZXI9InouQi4gSGlud2VpcywgV2ljaHRpZywgVGlwcC4uLiIgJyAr +CiAgICAgICAgICAgICAgICAnc3R5bGU9IndpZHRoOjEwMCU7cGFkZGluZzo4cHggMTBweDtib3Jk +ZXI6MXB4IHNvbGlkIHZhcigtLWJvcmRlci1jb2xvcik7Ym9yZGVyLXJhZGl1czo0cHg7Zm9udC1z +aXplOjE0cHg7YmFja2dyb3VuZDp2YXIoLS1iZy1pbnB1dCk7Y29sb3I6dmFyKC0tdGV4dC1wcmlt +YXJ5KTttYXJnaW4tYm90dG9tOjE0cHg7Ij4nICsKCiAgICAgICAgICAgICAgICAnPGxhYmVsIHN0 +eWxlPSJmb250LXNpemU6MTJweDtmb250LXdlaWdodDo2MDA7Y29sb3I6dmFyKC0tdGV4dC1zZWNv +bmRhcnkpO2Rpc3BsYXk6YmxvY2s7bWFyZ2luLWJvdHRvbTo0cHg7Ij5JbmhhbHQ8L2xhYmVsPicg +KwogICAgICAgICAgICAgICAgJzxkaXYgc3R5bGU9ImJvcmRlcjoxcHggc29saWQgdmFyKC0tYm9y +ZGVyLWNvbG9yKTtib3JkZXItcmFkaXVzOjRweDtvdmVyZmxvdzpoaWRkZW47bWFyZ2luLWJvdHRv +bToxNHB4OyI+JyArCiAgICAgICAgICAgICAgICAgICAgJzxkaXYgaWQ9ImluZm9ib3hUb29sYmFy +IiBzdHlsZT0iZGlzcGxheTpmbGV4O2dhcDo0cHg7ZmxleC13cmFwOndyYXA7YWxpZ24taXRlbXM6 +Y2VudGVyO3BhZGRpbmc6NnB4IDhweDtib3JkZXItYm90dG9tOjFweCBzb2xpZCB2YXIoLS1ib3Jk +ZXItY29sb3IpO2JhY2tncm91bmQ6dmFyKC0tYmctY2FyZC1hbHQsI2Y2ZjhmYSk7Ij4nICsKICAg +ICAgICAgICAgICAgICAgICAgICAgJzxidXR0b24gb25jbGljaz0iRHJpdmVFZGl0b3IuX2luZm9i +b3hDbWQoXCd1bmRvXCcpIiB0aXRsZT0iUsO8Y2tnw6RuZ2lnIiBzdHlsZT0iJyArIGJ0blN0eWxl +ICsgJyI+JiM4NjMwOzwvYnV0dG9uPicgKwogICAgICAgICAgICAgICAgICAgICAgICAnPGJ1dHRv +biBvbmNsaWNrPSJEcml2ZUVkaXRvci5faW5mb2JveENtZChcJ3JlZG9cJykiIHRpdGxlPSJXaWVk +ZXJob2xlbiIgc3R5bGU9IicgKyBidG5TdHlsZSArICciPiYjODYzMTs8L2J1dHRvbj4nICsKICAg +ICAgICAgICAgICAgICAgICAgICAgJzxzcGFuIHN0eWxlPSJ3aWR0aDoxcHg7aGVpZ2h0OjE4cHg7 +YmFja2dyb3VuZDp2YXIoLS1ib3JkZXItY29sb3IpO21hcmdpbjowIDJweDsiPjwvc3Bhbj4nICsK +ICAgICAgICAgICAgICAgICAgICAgICAgJzxidXR0b24gb25jbGljaz0iRHJpdmVFZGl0b3IuX2lu +Zm9ib3hDbWQoXCdib2xkXCcpIiB0aXRsZT0iRmV0dCIgc3R5bGU9IicgKyBidG5TdHlsZUJvbGQg +KyAnIj5CPC9idXR0b24+JyArCiAgICAgICAgICAgICAgICAgICAgICAgICc8YnV0dG9uIG9uY2xp +Y2s9IkRyaXZlRWRpdG9yLl9pbmZvYm94Q21kKFwnaXRhbGljXCcpIiB0aXRsZT0iS3Vyc2l2IiBz +dHlsZT0iJyArIGJ0blN0eWxlSXRhbGljICsgJyI+STwvYnV0dG9uPicgKwogICAgICAgICAgICAg +ICAgICAgICAgICAnPGJ1dHRvbiBvbmNsaWNrPSJEcml2ZUVkaXRvci5faW5mb2JveENtZChcJ3Vu +ZGVybGluZVwnKSIgdGl0bGU9IlVudGVyc3RyaWNoZW4iIHN0eWxlPSInICsgYnRuU3R5bGVVbmRl +cmxpbmUgKyAnIj5VPC9idXR0b24+JyArCiAgICAgICAgICAgICAgICAgICAgICAgICc8c3BhbiBz +dHlsZT0id2lkdGg6MXB4O2hlaWdodDoxOHB4O2JhY2tncm91bmQ6dmFyKC0tYm9yZGVyLWNvbG9y +KTttYXJnaW46MCAycHg7Ij48L3NwYW4+JyArCiAgICAgICAgICAgICAgICAgICAgICAgICc8YnV0 +dG9uIG9uY2xpY2s9IkRyaXZlRWRpdG9yLl9pbmZvYm94Q21kKFwnaW5zZXJ0VW5vcmRlcmVkTGlz +dFwnKSIgdGl0bGU9IkF1ZnrDpGhsdW5nIiBzdHlsZT0iJyArIGJ0blN0eWxlICsgJyI+JiM4MjI2 +OyBMaXN0ZTwvYnV0dG9uPicgKwogICAgICAgICAgICAgICAgICAgICAgICAnPGJ1dHRvbiBvbmNs +aWNrPSJEcml2ZUVkaXRvci5faW5mb2JveENtZChcJ2luc2VydE9yZGVyZWRMaXN0XCcpIiB0aXRs +ZT0iTnVtbWVyaWVydW5nIiBzdHlsZT0iJyArIGJ0blN0eWxlICsgJyI+MS4gTGlzdGU8L2J1dHRv +bj4nICsKICAgICAgICAgICAgICAgICAgICAgICAgJzxzcGFuIHN0eWxlPSJ3aWR0aDoxcHg7aGVp +Z2h0OjE4cHg7YmFja2dyb3VuZDp2YXIoLS1ib3JkZXItY29sb3IpO21hcmdpbjowIDJweDsiPjwv +c3Bhbj4nICsKICAgICAgICAgICAgICAgICAgICAgICAgJzxzZWxlY3Qgb25jaGFuZ2U9IkRyaXZl +RWRpdG9yLl9pbmZvYm94Q21kKFwnZm9udFNpemVcJyx0aGlzLnZhbHVlKTt0aGlzLnNlbGVjdGVk +SW5kZXg9MDsiIHRpdGxlPSJTY2hyaWZ0Z3LDtsOfZSIgc3R5bGU9IicgKyBzZWxlY3RTdHlsZSAr +ICciPicgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJzxvcHRpb24gdmFsdWU9IiIgZGlz +YWJsZWQgc2VsZWN0ZWQ+R3LDtsOfZTwvb3B0aW9uPicgKwogICAgICAgICAgICAgICAgICAgICAg +ICAgICAgJzxvcHRpb24gdmFsdWU9IjEiPktsZWluPC9vcHRpb24+JyArCiAgICAgICAgICAgICAg +ICAgICAgICAgICAgICAnPG9wdGlvbiB2YWx1ZT0iMyI+Tm9ybWFsPC9vcHRpb24+JyArCiAgICAg +ICAgICAgICAgICAgICAgICAgICAgICAnPG9wdGlvbiB2YWx1ZT0iNCI+R3Jvw588L29wdGlvbj4n +ICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICc8b3B0aW9uIHZhbHVlPSI1Ij5TZWhyIGdy +b8OfPC9vcHRpb24+JyArCiAgICAgICAgICAgICAgICAgICAgICAgICc8L3NlbGVjdD4nICsKICAg +ICAgICAgICAgICAgICAgICAgICAgJzxzZWxlY3Qgb25jaGFuZ2U9IkRyaXZlRWRpdG9yLl9pbmZv +Ym94Q21kKFwnZm9yZUNvbG9yXCcsdGhpcy52YWx1ZSk7dGhpcy5zZWxlY3RlZEluZGV4PTA7IiB0 +aXRsZT0iVGV4dGZhcmJlIiBzdHlsZT0iJyArIHNlbGVjdFN0eWxlICsgJyI+JyArCiAgICAgICAg +ICAgICAgICAgICAgICAgICAgICAnPG9wdGlvbiB2YWx1ZT0iIiBkaXNhYmxlZCBzZWxlY3RlZD5G +YXJiZTwvb3B0aW9uPicgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJzxvcHRpb24gdmFs +dWU9IiMwMDAwMDAiIHN0eWxlPSJjb2xvcjojMDAwMDAwOyI+U2Nod2Fyejwvb3B0aW9uPicgKwog +ICAgICAgICAgICAgICAgICAgICAgICAgICAgJzxvcHRpb24gdmFsdWU9IiMyRTRBNjIiIHN0eWxl +PSJjb2xvcjojMkU0QTYyOyI+UG9saXplaS1CbGF1PC9vcHRpb24+JyArCiAgICAgICAgICAgICAg +ICAgICAgICAgICAgICAnPG9wdGlvbiB2YWx1ZT0iIzNhN2FhMyIgc3R5bGU9ImNvbG9yOiMzYTdh +YTM7Ij5CbGF1PC9vcHRpb24+JyArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPG9wdGlv +biB2YWx1ZT0iIzhiM2E2MiIgc3R5bGU9ImNvbG9yOiM4YjNhNjI7Ij5Cb3JkZWF1eDwvb3B0aW9u +PicgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJzxvcHRpb24gdmFsdWU9IiNmZjAwMDAi +IHN0eWxlPSJjb2xvcjojZmYwMDAwOyI+Um90PC9vcHRpb24+JyArCiAgICAgICAgICAgICAgICAg +ICAgICAgICc8L3NlbGVjdD4nICsKICAgICAgICAgICAgICAgICAgICAgICAgJzxzcGFuIHN0eWxl +PSJ3aWR0aDoxcHg7aGVpZ2h0OjE4cHg7YmFja2dyb3VuZDp2YXIoLS1ib3JkZXItY29sb3IpO21h +cmdpbjowIDJweDsiPjwvc3Bhbj4nICsKICAgICAgICAgICAgICAgICAgICAgICAgJzxidXR0b24g +b25jbGljaz0iRHJpdmVFZGl0b3IuX2luZm9ib3hDbWQoXCdpbnNlcnRIb3Jpem9udGFsUnVsZVwn +KSIgdGl0bGU9IlRyZW5ubGluaWUiIHN0eWxlPSInICsgYnRuU3R5bGUgKyAnIj7igJUgTGluaWU8 +L2J1dHRvbj4nICsKICAgICAgICAgICAgICAgICAgICAnPC9kaXY+JyArCiAgICAgICAgICAgICAg +ICAgICAgJzxkaXYgaWQ9ImluZm9ib3hDb250ZW50IiBjb250ZW50ZWRpdGFibGU9InRydWUiICcg +KwogICAgICAgICAgICAgICAgICAgICdzdHlsZT0icGFkZGluZzoxMHB4IDEycHg7bWluLWhlaWdo +dDoxMDBweDttYXgtaGVpZ2h0OjI1MHB4O292ZXJmbG93LXk6YXV0bztmb250LXNpemU6MTRweDts +aW5lLWhlaWdodDoxLjY7Y29sb3I6dmFyKC0tdGV4dC1wcmltYXJ5KTtiYWNrZ3JvdW5kOnZhcigt +LWJnLWlucHV0KTtvdXRsaW5lOm5vbmU7Ij48L2Rpdj4nICsKICAgICAgICAgICAgICAgICc8L2Rp +dj4nICsKCiAgICAgICAgICAgICAgICAnPGRpdiBzdHlsZT0iZGlzcGxheTpmbGV4O2dhcDo4cHg7 +anVzdGlmeS1jb250ZW50OmZsZXgtZW5kOyI+JyArCiAgICAgICAgICAgICAgICAgICAgJzxidXR0 +b24gb25jbGljaz0idGhpcy5jbG9zZXN0KFwnZGl2W3N0eWxlXVwnKS5wYXJlbnRFbGVtZW50LnJl +bW92ZSgpIiBzdHlsZT0icGFkZGluZzo4cHggMTZweDtib3JkZXItcmFkaXVzOjRweDtib3JkZXI6 +MXB4IHNvbGlkIHZhcigtLWJvcmRlci1jb2xvcik7YmFja2dyb3VuZDp2YXIoLS1iZy1jYXJkKTtj +b2xvcjp2YXIoLS10ZXh0LXByaW1hcnkpO2N1cnNvcjpwb2ludGVyOyI+QWJicmVjaGVuPC9idXR0 +b24+JyArCiAgICAgICAgICAgICAgICAgICAgJzxidXR0b24gb25jbGljaz0iRHJpdmVFZGl0b3Iu +X2NvbmZpcm1JbmZvYm94KCkiIHN0eWxlPSJwYWRkaW5nOjhweCAxNnB4O2JvcmRlci1yYWRpdXM6 +NHB4O2JvcmRlcjpub25lO2JhY2tncm91bmQ6dmFyKC0tdGV4dC1oZWFkaW5nKTtjb2xvcjp3aGl0 +ZTtjdXJzb3I6cG9pbnRlcjtmb250LXdlaWdodDo2MDA7Ij5FaW5mw7xnZW48L2J1dHRvbj4nICsK +ICAgICAgICAgICAgICAgICc8L2Rpdj4nICsKICAgICAgICAgICAgJzwvZGl2Pic7CiAgICAgICAg +dGhpcy5faW5mb2JveE1vZGFsID0gbW9kYWw7CiAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRD +aGlsZChtb2RhbCk7CiAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpIHsKICAgICAgICAgICAg +ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2luZm9ib3hUaXRsZScpLnNlbGVjdCgpOwogICAgICAg +ICAgICAvLyBGb2t1cy1IYW5kbGluZzogVG9vbGJhci1CdXR0b25zIHNvbGxlbiBGb2t1cyBpbSBD +b250ZW50IGxhc3NlbgogICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5mb2Jv +eFRvb2xiYXInKS5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCBmdW5jdGlvbihlKSB7CiAg +ICAgICAgICAgICAgICBpZiAoZS50YXJnZXQudGFnTmFtZSA9PT0gJ0JVVFRPTicpIGUucHJldmVu +dERlZmF1bHQoKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwgNTApOwogICAgfSwKCiAgICBf +aW5mb2JveE1vZGFsOiBudWxsLAoKICAgIC8vIEZvcm1hdGllcnVuZ3NiZWZlaGwgaW0gSW5mb2Jv +eC1Db250ZW50ZWRpdGFibGUgYXVzZnVlaHJlbgogICAgX2luZm9ib3hDbWQoY21kLCB2YWx1ZSkg +ewogICAgICAgIHZhciBjb250ZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2luZm9ib3hD +b250ZW50Jyk7CiAgICAgICAgaWYgKCFjb250ZW50KSByZXR1cm47CiAgICAgICAgY29udGVudC5m +b2N1cygpOwogICAgICAgIGRvY3VtZW50LmV4ZWNDb21tYW5kKGNtZCwgZmFsc2UsIHZhbHVlIHx8 +IG51bGwpOwogICAgfSwKCiAgICBfY29uZmlybUluZm9ib3goKSB7CiAgICAgICAgdmFyIHRpdGxl +SW5wdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5mb2JveFRpdGxlJyk7CiAgICAgICAg +dmFyIGNvbnRlbnRFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbmZvYm94Q29udGVudCcp +OwogICAgICAgIHZhciB0aXRsZSA9IHRpdGxlSW5wdXQgPyB0aXRsZUlucHV0LnZhbHVlLnRyaW0o +KSA6ICdIaW53ZWlzJzsKICAgICAgICBpZiAoIXRpdGxlKSB0aXRsZSA9ICdIaW53ZWlzJzsKICAg +ICAgICB2YXIgY29udGVudCA9IGNvbnRlbnRFbCA/IGNvbnRlbnRFbC5pbm5lckhUTUwudHJpbSgp +IDogJyc7CiAgICAgICAgaWYgKCFjb250ZW50IHx8IGNvbnRlbnQgPT09ICc8YnI+JykgY29udGVu +dCA9ICc8cD5UZXh0IGhpZXIgZWluZ2ViZW4uLi48L3A+JzsKCiAgICAgICAgLy8gTW9kYWwgc2No +bGllc3NlbgogICAgICAgIGlmICh0aGlzLl9pbmZvYm94TW9kYWwpIHsgdGhpcy5faW5mb2JveE1v +ZGFsLnJlbW92ZSgpOyB0aGlzLl9pbmZvYm94TW9kYWwgPSBudWxsOyB9CgogICAgICAgIHZhciBo +dG1sID0gJzxkaXYgY2xhc3M9ImRyaXZlLWluZm9ib3giPjxoMz4nICsgRHJpdmVQb3J0YWwuZXNj +YXBlSFRNTCh0aXRsZSkgKyAnPC9oMz4nICsgY29udGVudCArICc8L2Rpdj48cD48YnI+PC9wPic7 +CgogICAgICAgIHZhciBlZGl0b3IgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZWRpdG9ySW5w +dXQnKTsKICAgICAgICBlZGl0b3IuZm9jdXMoKTsKICAgICAgICBpZiAodGhpcy5faW5mb2JveFJh +bmdlKSB7CiAgICAgICAgICAgIHZhciBzZWwgPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7CiAgICAg +ICAgICAgIHNlbC5yZW1vdmVBbGxSYW5nZXMoKTsKICAgICAgICAgICAgc2VsLmFkZFJhbmdlKHRo +aXMuX2luZm9ib3hSYW5nZSk7CiAgICAgICAgICAgIHRoaXMuX2luZm9ib3hSYW5nZSA9IG51bGw7 +CiAgICAgICAgfQogICAgICAgIGRvY3VtZW50LmV4ZWNDb21tYW5kKCdpbnNlcnRIVE1MJywgZmFs +c2UsIGh0bWwpOwogICAgICAgIHRoaXMuc2F2ZVN0YXRlKCk7CiAgICB9LAoKICAgIC8vIC0tLSBX +aWNodGlnLUJsb2NrIGVpbmZ1ZWdlbiAtLS0KICAgIF9pbXBvcnRhbnRNb2RhbDogbnVsbCwKCiAg +ICBpbnNlcnRJbXBvcnRhbnQoKSB7CiAgICAgICAgdmFyIHNlbCA9IHdpbmRvdy5nZXRTZWxlY3Rp +b24oKTsKICAgICAgICB0aGlzLl9pbXBvcnRhbnRSYW5nZSA9IChzZWwgJiYgc2VsLnJhbmdlQ291 +bnQpID8gc2VsLmdldFJhbmdlQXQoMCkuY2xvbmVSYW5nZSgpIDogbnVsbDsKCiAgICAgICAgdmFy +IG1vZGFsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CiAgICAgICAgbW9kYWwuc3R5 +bGUuY3NzVGV4dCA9ICdwb3NpdGlvbjpmaXhlZDt0b3A6MDtsZWZ0OjA7d2lkdGg6MTAwJTtoZWln +aHQ6MTAwJTtiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsMC41KTt6LWluZGV4OjEwNTAwO2Rpc3BsYXk6 +ZmxleDthbGlnbi1pdGVtczpjZW50ZXI7anVzdGlmeS1jb250ZW50OmNlbnRlcjsnOwogICAgICAg +IG1vZGFsLm9uY2xpY2sgPSBmdW5jdGlvbihlKSB7IGlmIChlLnRhcmdldCA9PT0gbW9kYWwpIG1v +ZGFsLnJlbW92ZSgpOyB9OwogICAgICAgIG1vZGFsLmlubmVySFRNTCA9CiAgICAgICAgICAgICc8 +ZGl2IHN0eWxlPSJiYWNrZ3JvdW5kOnZhcigtLWJnLWNhcmQpO2JvcmRlci1yYWRpdXM6MTBweDtw +YWRkaW5nOjIwcHggMjRweDttYXgtd2lkdGg6NTIwcHg7d2lkdGg6OTQlO2JveC1zaGFkb3c6MCA4 +cHggMzJweCByZ2JhKDAsMCwwLDAuMyk7Ij4nICsKICAgICAgICAgICAgICAgICc8ZGl2IHN0eWxl +PSJkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO2dhcDoxMHB4O21hcmdpbi1ib3R0b206 +MTRweDsiPicgKwogICAgICAgICAgICAgICAgICAgICc8aW1nIHNyYz0iY3NzL2ljb25zL2ltcG9y +dGFudC5wbmciIHN0eWxlPSJ3aWR0aDoyMnB4O2hlaWdodDoyMnB4OyI+JyArCiAgICAgICAgICAg +ICAgICAgICAgJzxoMyBzdHlsZT0iY29sb3I6dmFyKC0tdGV4dC1oZWFkaW5nKTttYXJnaW46MDsi +PldpY2h0aWdlbiBIaW53ZWlzIGVpbmZ1ZWdlbjwvaDM+JyArCiAgICAgICAgICAgICAgICAnPC9k +aXY+JyArCiAgICAgICAgICAgICAgICAnPHAgc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2NvbG9yOnZh +cigtLXRleHQtbXV0ZWQpO21hcmdpbi1ib3R0b206MTJweDsiPkRlciBUZXh0IHdpcmQgYWxzIGF1 +ZmZhZWxsaWdlciBCbG9jayBpbSBBcnRpa2VsIGRhcmdlc3RlbGx0LCB1bSBhdWYgYmVzb25kZXJz +IHdpY2h0aWdlIEluZm9ybWF0aW9uZW4gaGluenV3ZWlzZW4uPC9wPicgKwogICAgICAgICAgICAg +ICAgJzxsYWJlbCBzdHlsZT0iZm9udC1zaXplOjEycHg7Zm9udC13ZWlnaHQ6NjAwO2NvbG9yOnZh +cigtLXRleHQtc2Vjb25kYXJ5KTtkaXNwbGF5OmJsb2NrO21hcmdpbi1ib3R0b206NHB4OyI+SGlu +d2Vpc3RleHQ8L2xhYmVsPicgKwogICAgICAgICAgICAgICAgJzx0ZXh0YXJlYSBpZD0iaW1wb3J0 +YW50VGV4dCIgcm93cz0iNCIgcGxhY2Vob2xkZXI9InouQi4gQml0dGUgYmVhY2h0ZW4gU2llLCBk +YXNzLi4uIiAnICsKICAgICAgICAgICAgICAgICdzdHlsZT0id2lkdGg6MTAwJTtwYWRkaW5nOjEw +cHggMTJweDtib3JkZXI6MXB4IHNvbGlkIHZhcigtLWJvcmRlci1jb2xvcik7Ym9yZGVyLXJhZGl1 +czo0cHg7Zm9udC1zaXplOjE0cHg7bGluZS1oZWlnaHQ6MS42O2JhY2tncm91bmQ6dmFyKC0tYmct +aW5wdXQpO2NvbG9yOnZhcigtLXRleHQtcHJpbWFyeSk7cmVzaXplOnZlcnRpY2FsOyI+PC90ZXh0 +YXJlYT4nICsKICAgICAgICAgICAgICAgICc8ZGl2IHN0eWxlPSJkaXNwbGF5OmZsZXg7Z2FwOjhw +eDtqdXN0aWZ5LWNvbnRlbnQ6ZmxleC1lbmQ7bWFyZ2luLXRvcDoxNHB4OyI+JyArCiAgICAgICAg +ICAgICAgICAgICAgJzxidXR0b24gb25jbGljaz0idGhpcy5jbG9zZXN0KFwnZGl2W3N0eWxlXVwn +KS5wYXJlbnRFbGVtZW50LnJlbW92ZSgpIiBzdHlsZT0icGFkZGluZzo4cHggMTZweDtib3JkZXIt +cmFkaXVzOjRweDtib3JkZXI6MXB4IHNvbGlkIHZhcigtLWJvcmRlci1jb2xvcik7YmFja2dyb3Vu +ZDp2YXIoLS1iZy1jYXJkKTtjb2xvcjp2YXIoLS10ZXh0LXByaW1hcnkpO2N1cnNvcjpwb2ludGVy +OyI+QWJicmVjaGVuPC9idXR0b24+JyArCiAgICAgICAgICAgICAgICAgICAgJzxidXR0b24gb25j +bGljaz0iRHJpdmVFZGl0b3IuX2NvbmZpcm1JbXBvcnRhbnQoKSIgc3R5bGU9InBhZGRpbmc6OHB4 +IDE2cHg7Ym9yZGVyLXJhZGl1czo0cHg7Ym9yZGVyOm5vbmU7YmFja2dyb3VuZDojMWEyMzMyO2Nv +bG9yOndoaXRlO2N1cnNvcjpwb2ludGVyO2ZvbnQtd2VpZ2h0OjYwMDsiPkVpbmZ1ZWdlbjwvYnV0 +dG9uPicgKwogICAgICAgICAgICAgICAgJzwvZGl2PicgKwogICAgICAgICAgICAnPC9kaXY+JzsK +ICAgICAgICB0aGlzLl9pbXBvcnRhbnRNb2RhbCA9IG1vZGFsOwogICAgICAgIGRvY3VtZW50LmJv +ZHkuYXBwZW5kQ2hpbGQobW9kYWwpOwogICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CiAg +ICAgICAgICAgIHZhciB0YSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbXBvcnRhbnRUZXh0 +Jyk7CiAgICAgICAgICAgIGlmICh0YSkgdGEuZm9jdXMoKTsKICAgICAgICB9LCA1MCk7CiAgICB9 +LAoKICAgIF9jb25maXJtSW1wb3J0YW50KCkgewogICAgICAgIHZhciB0ZXh0RWwgPSBkb2N1bWVu +dC5nZXRFbGVtZW50QnlJZCgnaW1wb3J0YW50VGV4dCcpOwogICAgICAgIHZhciB0ZXh0ID0gdGV4 +dEVsID8gdGV4dEVsLnZhbHVlLnRyaW0oKSA6ICcnOwogICAgICAgIGlmICghdGV4dCkgewogICAg +ICAgICAgICBzaG93VG9hc3QoJ0JpdHRlIGVpbmVuIEhpbndlaXN0ZXh0IGVpbmdlYmVuJywgJ3dh +cm5pbmcnKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgLy8gTW9kYWwg +c2NobGllc3NlbgogICAgICAgIGlmICh0aGlzLl9pbXBvcnRhbnRNb2RhbCkgeyB0aGlzLl9pbXBv +cnRhbnRNb2RhbC5yZW1vdmUoKTsgdGhpcy5faW1wb3J0YW50TW9kYWwgPSBudWxsOyB9CgogICAg +ICAgIHZhciBjb250ZW50ID0gRHJpdmVQb3J0YWwuZXNjYXBlSFRNTCh0ZXh0KS5yZXBsYWNlKC9c +bi9nLCAnPGJyPicpOwogICAgICAgIHZhciBodG1sID0gJzxkaXYgY2xhc3M9ImRyaXZlLWltcG9y +dGFudCIgY29udGVudGVkaXRhYmxlPSJmYWxzZSI+JyArCiAgICAgICAgICAgICc8ZGl2IGNsYXNz +PSJkcml2ZS1pbXBvcnRhbnQtaGVhZGVyIj48aW1nIHNyYz0iY3NzL2ljb25zL2ltcG9ydGFudC5w +bmciPiBXaWNodGlnPC9kaXY+JyArCiAgICAgICAgICAgICc8ZGl2IGNsYXNzPSJkcml2ZS1pbXBv +cnRhbnQtYm9keSI+JyArIGNvbnRlbnQgKyAnPC9kaXY+JyArCiAgICAgICAgJzwvZGl2PjxwPjxi +cj48L3A+JzsKCiAgICAgICAgdmFyIGVkaXRvciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdl +ZGl0b3JJbnB1dCcpOwogICAgICAgIGVkaXRvci5mb2N1cygpOwogICAgICAgIGlmICh0aGlzLl9p +bXBvcnRhbnRSYW5nZSkgewogICAgICAgICAgICB2YXIgc2VsID0gd2luZG93LmdldFNlbGVjdGlv +bigpOwogICAgICAgICAgICBzZWwucmVtb3ZlQWxsUmFuZ2VzKCk7CiAgICAgICAgICAgIHNlbC5h +ZGRSYW5nZSh0aGlzLl9pbXBvcnRhbnRSYW5nZSk7CiAgICAgICAgICAgIHRoaXMuX2ltcG9ydGFu +dFJhbmdlID0gbnVsbDsKICAgICAgICB9CiAgICAgICAgZG9jdW1lbnQuZXhlY0NvbW1hbmQoJ2lu +c2VydEhUTUwnLCBmYWxzZSwgaHRtbCk7CiAgICAgICAgdGhpcy5zYXZlU3RhdGUoKTsKICAgIH0s +CgogICAgLy8gLS0tIEZvcm1hdGllcnVuZ3NiZWZlaGxlIC0tLQogICAgaGVhZGluZyh0YWcpIHsK +ICAgICAgICBjb25zdCBpbnB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlZGl0b3JJbnB1 +dCcpOwogICAgICAgIGlucHV0LmZvY3VzKCk7CiAgICAgICAgY29uc3Qgc2VsID0gd2luZG93Lmdl +dFNlbGVjdGlvbigpOwogICAgICAgIGlmICghc2VsLnJhbmdlQ291bnQpIHJldHVybjsKICAgICAg +ICBjb25zdCByYW5nZSA9IHNlbC5nZXRSYW5nZUF0KDApOwoKICAgICAgICAvLyBBa3R1ZWxsZW4g +QmxvY2sgZmluZGVuIChQLCBESVYgb2RlciBiZXJlaXRzIGVpbiBIZWFkaW5nKQogICAgICAgIGxl +dCBibG9jayA9IHJhbmdlLnN0YXJ0Q29udGFpbmVyOwogICAgICAgIHdoaWxlIChibG9jayAmJiBi +bG9jayAhPT0gaW5wdXQgJiYgIVsnUCcsJ0RJVicsJ0gxJywnSDInLCdIMycsJ0g0JywnSDUnLCdI +NiddLmluY2x1ZGVzKGJsb2NrLm5vZGVOYW1lKSkgewogICAgICAgICAgICBibG9jayA9IGJsb2Nr +LnBhcmVudE5vZGU7CiAgICAgICAgfQoKICAgICAgICBpZiAoIXRhZykgewogICAgICAgICAgICAv +LyAiQWJzYXR6IiBnZXdhZWhsdDogSGVhZGluZyB6dXJ1ZWNrIGluIDxwPiB1bXdhbmRlbG4KICAg +ICAgICAgICAgaWYgKGJsb2NrICYmIGJsb2NrICE9PSBpbnB1dCAmJiBbJ0gxJywnSDInLCdIMycs +J0g0JywnSDUnLCdINiddLmluY2x1ZGVzKGJsb2NrLm5vZGVOYW1lKSkgewogICAgICAgICAgICAg +ICAgY29uc3QgcCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3AnKTsKICAgICAgICAgICAgICAg +IHAuaW5uZXJIVE1MID0gYmxvY2suaW5uZXJIVE1MOwogICAgICAgICAgICAgICAgYmxvY2sucGFy +ZW50Tm9kZS5yZXBsYWNlQ2hpbGQocCwgYmxvY2spOwogICAgICAgICAgICAgICAgY29uc3QgbmV3 +UmFuZ2UgPSBkb2N1bWVudC5jcmVhdGVSYW5nZSgpOwogICAgICAgICAgICAgICAgbmV3UmFuZ2Uu +c2VsZWN0Tm9kZUNvbnRlbnRzKHApOwogICAgICAgICAgICAgICAgbmV3UmFuZ2UuY29sbGFwc2Uo +ZmFsc2UpOwogICAgICAgICAgICAgICAgc2VsLnJlbW92ZUFsbFJhbmdlcygpOwogICAgICAgICAg +ICAgICAgc2VsLmFkZFJhbmdlKG5ld1JhbmdlKTsKICAgICAgICAgICAgICAgIHRoaXMuc2F2ZVN0 +YXRlKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAg +ICAgaWYgKGJsb2NrICYmIGJsb2NrICE9PSBpbnB1dCkgewogICAgICAgICAgICAvLyBCZXN0ZWhl +bmRlbiBCbG9jayBpbiBIZWFkaW5nIHVtd2FuZGVsbgogICAgICAgICAgICBjb25zdCBoZWFkaW5n +ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCh0YWcpOwogICAgICAgICAgICBoZWFkaW5nLmlubmVy +SFRNTCA9IGJsb2NrLmlubmVySFRNTDsKICAgICAgICAgICAgYmxvY2sucGFyZW50Tm9kZS5yZXBs +YWNlQ2hpbGQoaGVhZGluZywgYmxvY2spOwogICAgICAgICAgICAvLyBDdXJzb3IgYW5zIEVuZGUg +c2V0emVuCiAgICAgICAgICAgIGNvbnN0IG5ld1JhbmdlID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2Uo +KTsKICAgICAgICAgICAgbmV3UmFuZ2Uuc2VsZWN0Tm9kZUNvbnRlbnRzKGhlYWRpbmcpOwogICAg +ICAgICAgICBuZXdSYW5nZS5jb2xsYXBzZShmYWxzZSk7CiAgICAgICAgICAgIHNlbC5yZW1vdmVB +bGxSYW5nZXMoKTsKICAgICAgICAgICAgc2VsLmFkZFJhbmdlKG5ld1JhbmdlKTsKICAgICAgICB9 +IGVsc2UgewogICAgICAgICAgICAvLyBLZWluIEJsb2NrOiBOZXVlcyBIZWFkaW5nIGVpbmZ1ZWdl +bgogICAgICAgICAgICBjb25zdCBoZWFkaW5nID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCh0YWcp +OwogICAgICAgICAgICBoZWFkaW5nLnRleHRDb250ZW50ID0gc2VsLnRvU3RyaW5nKCkgfHwgJ8Oc +YmVyc2NocmlmdCc7CiAgICAgICAgICAgIHJhbmdlLmRlbGV0ZUNvbnRlbnRzKCk7CiAgICAgICAg +ICAgIHJhbmdlLmluc2VydE5vZGUoaGVhZGluZyk7CiAgICAgICAgICAgIC8vIEN1cnNvciBhbnMg +RW5kZQogICAgICAgICAgICBjb25zdCBuZXdSYW5nZSA9IGRvY3VtZW50LmNyZWF0ZVJhbmdlKCk7 +CiAgICAgICAgICAgIG5ld1JhbmdlLnNlbGVjdE5vZGVDb250ZW50cyhoZWFkaW5nKTsKICAgICAg +ICAgICAgbmV3UmFuZ2UuY29sbGFwc2UoZmFsc2UpOwogICAgICAgICAgICBzZWwucmVtb3ZlQWxs +UmFuZ2VzKCk7CiAgICAgICAgICAgIHNlbC5hZGRSYW5nZShuZXdSYW5nZSk7CiAgICAgICAgfQog +ICAgICAgIHRoaXMuc2F2ZVN0YXRlKCk7CiAgICB9LAoKICAgIGNvbW1hbmQoY21kKSB7CiAgICAg +ICAgY29uc3QgaW5wdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZWRpdG9ySW5wdXQnKTsK +ICAgICAgICBpbnB1dC5mb2N1cygpOwogICAgICAgIGNvbnN0IHNlbCA9IHdpbmRvdy5nZXRTZWxl +Y3Rpb24oKTsKICAgICAgICBpZiAoIXNlbC5yYW5nZUNvdW50KSByZXR1cm47CgogICAgICAgIHN3 +aXRjaCAoY21kKSB7CiAgICAgICAgICAgIGNhc2UgJ2JvbGQnOiB0aGlzLndyYXBTZWxlY3Rpb24o +J3N0cm9uZycpOyBicmVhazsKICAgICAgICAgICAgY2FzZSAnaXRhbGljJzogdGhpcy53cmFwU2Vs +ZWN0aW9uKCdlbScpOyBicmVhazsKICAgICAgICAgICAgY2FzZSAndW5kZXJsaW5lJzogdGhpcy53 +cmFwU2VsZWN0aW9uKCd1Jyk7IGJyZWFrOwogICAgICAgICAgICBjYXNlICdpbnNlcnRVbm9yZGVy +ZWRMaXN0JzogdGhpcy5pbnNlcnRMaXN0KCd1bCcpOyBicmVhazsKICAgICAgICAgICAgY2FzZSAn +aW5zZXJ0T3JkZXJlZExpc3QnOiB0aGlzLmluc2VydExpc3QoJ29sJyk7IGJyZWFrOwogICAgICAg +IH0KICAgICAgICBpbnB1dC5mb2N1cygpOwogICAgfSwKCiAgICB3cmFwU2VsZWN0aW9uKHRhZ05h +bWUpIHsKICAgICAgICBjb25zdCBzZWwgPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7CiAgICAgICAg +aWYgKCFzZWwucmFuZ2VDb3VudCkgcmV0dXJuOwogICAgICAgIGNvbnN0IHJhbmdlID0gc2VsLmdl +dFJhbmdlQXQoMCk7CiAgICAgICAgaWYgKHJhbmdlLmNvbGxhcHNlZCkgcmV0dXJuOwogICAgICAg +IGNvbnN0IFRBRyA9IHRhZ05hbWUudG9VcHBlckNhc2UoKTsKCiAgICAgICAgdHJ5IHsKICAgICAg +ICAgICAgLy8gUHJ1ZWZlbiBvYiBkaWUgZ2VzYW10ZSBTZWxla3Rpb24gYmVyZWl0cyBpbiBkaWVz +ZW0gVGFnIGxpZWd0CiAgICAgICAgICAgIGxldCBub2RlID0gcmFuZ2UuY29tbW9uQW5jZXN0b3JD +b250YWluZXI7CiAgICAgICAgICAgIGxldCBleGlzdGluZyA9IG51bGw7CiAgICAgICAgICAgIHdo +aWxlIChub2RlICYmIG5vZGUubm9kZVR5cGUgIT09IE5vZGUuRE9DVU1FTlRfTk9ERSkgewogICAg +ICAgICAgICAgICAgaWYgKG5vZGUubm9kZVR5cGUgPT09IE5vZGUuRUxFTUVOVF9OT0RFICYmIG5v +ZGUudGFnTmFtZSA9PT0gVEFHKSB7CiAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmcgPSBub2Rl +OwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAg +ICAgICAgbm9kZSA9IG5vZGUucGFyZW50Tm9kZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAg +aWYgKGV4aXN0aW5nKSB7CiAgICAgICAgICAgICAgICAvLyBUb2dnbGUgT0ZGOiBUYWcgZW50ZmVy +bmVuLCBLaW5kZXIgYmVpYmVoYWx0ZW4KICAgICAgICAgICAgICAgIGNvbnN0IHBhcmVudCA9IGV4 +aXN0aW5nLnBhcmVudE5vZGU7CiAgICAgICAgICAgICAgICBjb25zdCBjaGlsZHJlbiA9IEFycmF5 +LmZyb20oZXhpc3RpbmcuY2hpbGROb2Rlcyk7CiAgICAgICAgICAgICAgICBjb25zdCBmaXJzdCA9 +IGNoaWxkcmVuWzBdLCBsYXN0ID0gY2hpbGRyZW5bY2hpbGRyZW4ubGVuZ3RoIC0gMV07CiAgICAg +ICAgICAgICAgICB3aGlsZSAoZXhpc3RpbmcuZmlyc3RDaGlsZCkgcGFyZW50Lmluc2VydEJlZm9y +ZShleGlzdGluZy5maXJzdENoaWxkLCBleGlzdGluZyk7CiAgICAgICAgICAgICAgICBwYXJlbnQu +cmVtb3ZlQ2hpbGQoZXhpc3RpbmcpOwogICAgICAgICAgICAgICAgaWYgKGZpcnN0ICYmIGxhc3Qp +IHsKICAgICAgICAgICAgICAgICAgICByYW5nZS5zZXRTdGFydEJlZm9yZShmaXJzdCk7CiAgICAg +ICAgICAgICAgICAgICAgcmFuZ2Uuc2V0RW5kQWZ0ZXIobGFzdCk7CiAgICAgICAgICAgICAgICAg +ICAgc2VsLnJlbW92ZUFsbFJhbmdlcygpOwogICAgICAgICAgICAgICAgICAgIHNlbC5hZGRSYW5n +ZShyYW5nZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAg +ICAgICAgICBjb25zdCBmcmFnID0gcmFuZ2UuZXh0cmFjdENvbnRlbnRzKCk7CiAgICAgICAgICAg +ICAgICAvLyBCZXJlaXRzIHZvcmhhbmRlbmUgZ2xlaWNoZSBUYWdzIGltIEZyYWdtZW50IGF1Zmxv +ZXNlbiAodmVyaGluZGVydCBWZXJzY2hhY2h0ZWx1bmcpCiAgICAgICAgICAgICAgICBmcmFnLnF1 +ZXJ5U2VsZWN0b3JBbGwodGFnTmFtZSkuZm9yRWFjaChmdW5jdGlvbihpbm5lcikgewogICAgICAg +ICAgICAgICAgICAgIHdoaWxlIChpbm5lci5maXJzdENoaWxkKSBpbm5lci5wYXJlbnROb2RlLmlu +c2VydEJlZm9yZShpbm5lci5maXJzdENoaWxkLCBpbm5lcik7CiAgICAgICAgICAgICAgICAgICAg +aW5uZXIucmVtb3ZlKCk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIGNvbnN0 +IHdyYXBwZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KHRhZ05hbWUpOwogICAgICAgICAgICAg +ICAgd3JhcHBlci5hcHBlbmRDaGlsZChmcmFnKTsKICAgICAgICAgICAgICAgIHJhbmdlLmluc2Vy +dE5vZGUod3JhcHBlcik7CiAgICAgICAgICAgICAgICByYW5nZS5zZWxlY3ROb2RlQ29udGVudHMo +d3JhcHBlcik7CiAgICAgICAgICAgICAgICBzZWwucmVtb3ZlQWxsUmFuZ2VzKCk7CiAgICAgICAg +ICAgICAgICBzZWwuYWRkUmFuZ2UocmFuZ2UpOwogICAgICAgICAgICB9CiAgICAgICAgfSBjYXRj +aCAoZSkgewogICAgICAgICAgICBjb25zb2xlLmVycm9yKCdXcmFwIGVycm9yOicsIGUpOwogICAg +ICAgIH0KICAgIH0sCgogICAgaW5zZXJ0TGlzdChsaXN0VHlwZSkgewogICAgICAgIGNvbnN0IHNl +bCA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTsKICAgICAgICBpZiAoIXNlbC5yYW5nZUNvdW50KSBy +ZXR1cm47CiAgICAgICAgY29uc3QgcmFuZ2UgPSBzZWwuZ2V0UmFuZ2VBdCgwKTsKICAgICAgICBj +b25zdCBsaXN0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChsaXN0VHlwZSk7CgogICAgICAgIGlm +ICghcmFuZ2UuY29sbGFwc2VkKSB7CiAgICAgICAgICAgIGNvbnN0IGZyYWcgPSByYW5nZS5leHRy +YWN0Q29udGVudHMoKTsKICAgICAgICAgICAgLy8gVGV4dCBhdWYgWmVpbGVudW1icnVlY2hlIGF1 +ZnRlaWxlbiBmdWVyIHNlcGFyYXRlIExJLUVsZW1lbnRlCiAgICAgICAgICAgIGNvbnN0IHRlbXBE +aXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKICAgICAgICAgICAgdGVtcERpdi5h +cHBlbmRDaGlsZChmcmFnKTsKICAgICAgICAgICAgY29uc3QgdGV4dCA9IHRlbXBEaXYuaW5uZXJI +VE1MOwogICAgICAgICAgICAvLyBTcGxpdCBhdWYgPGJyPiwgXG4gb2RlciBCbG9jay1FbGVtZW50 +ZQogICAgICAgICAgICBjb25zdCBsaW5lcyA9IHRleHQuc3BsaXQoLzxiclxzKlwvPz4vZ2kpLm1h +cChmdW5jdGlvbihsKSB7IHJldHVybiBsLnRyaW0oKTsgfSkuZmlsdGVyKGZ1bmN0aW9uKGwpIHsg +cmV0dXJuIGwubGVuZ3RoID4gMDsgfSk7CiAgICAgICAgICAgIGlmIChsaW5lcy5sZW5ndGggPiAx +KSB7CiAgICAgICAgICAgICAgICBsaW5lcy5mb3JFYWNoKGZ1bmN0aW9uKGxpbmUpIHsKICAgICAg +ICAgICAgICAgICAgICBjb25zdCBsaSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2xpJyk7CiAg +ICAgICAgICAgICAgICAgICAgbGkuaW5uZXJIVE1MID0gbGluZTsKICAgICAgICAgICAgICAgICAg +ICBsaXN0LmFwcGVuZENoaWxkKGxpKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9 +IGVsc2UgewogICAgICAgICAgICAgICAgY29uc3QgbGkgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50 +KCdsaScpOwogICAgICAgICAgICAgICAgbGkuYXBwZW5kQ2hpbGQodGVtcERpdi5maXJzdENoaWxk +IHx8IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKHRlbXBEaXYudGV4dENvbnRlbnQpKTsKICAgICAg +ICAgICAgICAgIHdoaWxlICh0ZW1wRGl2LmZpcnN0Q2hpbGQpIGxpLmFwcGVuZENoaWxkKHRlbXBE +aXYuZmlyc3RDaGlsZCk7CiAgICAgICAgICAgICAgICBsaXN0LmFwcGVuZENoaWxkKGxpKTsKICAg +ICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGNvbnN0IGxpID0gZG9jdW1l +bnQuY3JlYXRlRWxlbWVudCgnbGknKTsKICAgICAgICAgICAgbGkuYXBwZW5kQ2hpbGQoZG9jdW1l +bnQuY3JlYXRlVGV4dE5vZGUoJ1x1MDBBMCcpKTsKICAgICAgICAgICAgbGlzdC5hcHBlbmRDaGls +ZChsaSk7CiAgICAgICAgfQoKICAgICAgICByYW5nZS5kZWxldGVDb250ZW50cygpOwogICAgICAg +IHJhbmdlLmluc2VydE5vZGUobGlzdCk7CiAgICAgICAgY29uc3QgbGFzdExpID0gbGlzdC5xdWVy +eVNlbGVjdG9yKCdsaTpsYXN0LWNoaWxkJyk7CiAgICAgICAgaWYgKGxhc3RMaSkgewogICAgICAg +ICAgICByYW5nZS5zZWxlY3ROb2RlQ29udGVudHMobGFzdExpKTsKICAgICAgICAgICAgcmFuZ2Uu +Y29sbGFwc2UoZmFsc2UpOwogICAgICAgIH0KICAgICAgICBzZWwucmVtb3ZlQWxsUmFuZ2VzKCk7 +CiAgICAgICAgc2VsLmFkZFJhbmdlKHJhbmdlKTsKICAgIH0sCgogICAgZm9udFNpemUoc2l6ZSkg +ewogICAgICAgIGlmICghc2l6ZSkgcmV0dXJuOwogICAgICAgIGNvbnN0IGlucHV0ID0gZG9jdW1l +bnQuZ2V0RWxlbWVudEJ5SWQoJ2VkaXRvcklucHV0Jyk7CiAgICAgICAgaW5wdXQuZm9jdXMoKTsK +ICAgICAgICBjb25zdCBzZWwgPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7CiAgICAgICAgaWYgKCFz +ZWwucmFuZ2VDb3VudCkgcmV0dXJuOwogICAgICAgIGNvbnN0IHJhbmdlID0gc2VsLmdldFJhbmdl +QXQoMCk7CiAgICAgICAgaWYgKHJhbmdlLmNvbGxhcHNlZCkgcmV0dXJuOwoKICAgICAgICBjb25z +dCBmcmFnID0gcmFuZ2UuZXh0cmFjdENvbnRlbnRzKCk7CiAgICAgICAgLy8gQmVzdGVoZW5kZSBm +b250U2l6ZS1TcGFucyBpbSBGcmFnbWVudCBhdWZsb2VzZW4KICAgICAgICBmcmFnLnF1ZXJ5U2Vs +ZWN0b3JBbGwoJ3NwYW4nKS5mb3JFYWNoKGZ1bmN0aW9uKHMpIHsKICAgICAgICAgICAgaWYgKHMu +c3R5bGUuZm9udFNpemUgJiYgcy5zdHlsZS5sZW5ndGggPD0gMSkgewogICAgICAgICAgICAgICAg +Ly8gU3BhbiBoYXQgbnVyIGZvbnQtc2l6ZSAtPiBkdXJjaCBJbmhhbHQgZXJzZXR6ZW4KICAgICAg +ICAgICAgICAgIHdoaWxlIChzLmZpcnN0Q2hpbGQpIHMucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUo +cy5maXJzdENoaWxkLCBzKTsKICAgICAgICAgICAgICAgIHMucmVtb3ZlKCk7CiAgICAgICAgICAg +IH0gZWxzZSBpZiAocy5zdHlsZS5mb250U2l6ZSkgewogICAgICAgICAgICAgICAgcy5zdHlsZS5y +ZW1vdmVQcm9wZXJ0eSgnZm9udC1zaXplJyk7CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKICAg +ICAgICBjb25zdCB3cmFwcGVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpOwogICAg +ICAgIHdyYXBwZXIuc3R5bGUuZm9udFNpemUgPSBzaXplICsgJ3B4JzsKICAgICAgICB3cmFwcGVy +LmFwcGVuZENoaWxkKGZyYWcpOwogICAgICAgIHJhbmdlLmluc2VydE5vZGUod3JhcHBlcik7CiAg +ICAgICAgcmFuZ2Uuc2VsZWN0Tm9kZUNvbnRlbnRzKHdyYXBwZXIpOwogICAgICAgIHNlbC5yZW1v +dmVBbGxSYW5nZXMoKTsKICAgICAgICBzZWwuYWRkUmFuZ2UocmFuZ2UpOwoKICAgICAgICBkb2N1 +bWVudC5nZXRFbGVtZW50QnlJZCgnZm9udFNpemVTZWxlY3QnKS52YWx1ZSA9ICcnOwogICAgICAg +IGlucHV0LmZvY3VzKCk7CiAgICB9LAoKICAgIGNvbG9yKGNvbG9yKSB7CiAgICAgICAgY29uc3Qg +aW5wdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZWRpdG9ySW5wdXQnKTsKICAgICAgICBj +b25zdCBzZWwgPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7CiAgICAgICAgbGV0IHNhdmVkUmFuZ2Ug +PSBudWxsOwogICAgICAgIGlmIChzZWwucmFuZ2VDb3VudCA+IDApIHNhdmVkUmFuZ2UgPSBzZWwu +Z2V0UmFuZ2VBdCgwKS5jbG9uZVJhbmdlKCk7CgogICAgICAgIGlucHV0LmZvY3VzKCk7CgogICAg +ICAgIGlmIChzYXZlZFJhbmdlICYmICFzYXZlZFJhbmdlLmNvbGxhcHNlZCkgewogICAgICAgICAg +ICBzZWwucmVtb3ZlQWxsUmFuZ2VzKCk7CiAgICAgICAgICAgIHNlbC5hZGRSYW5nZShzYXZlZFJh +bmdlKTsKICAgICAgICAgICAgY29uc3QgZnJhZyA9IHNhdmVkUmFuZ2UuZXh0cmFjdENvbnRlbnRz +KCk7CiAgICAgICAgICAgIC8vIEJlc3RlaGVuZGUgY29sb3ItU3BhbnMgaW0gRnJhZ21lbnQgYXVm +bG9lc2VuCiAgICAgICAgICAgIGZyYWcucXVlcnlTZWxlY3RvckFsbCgnc3BhbicpLmZvckVhY2go +ZnVuY3Rpb24ocykgewogICAgICAgICAgICAgICAgaWYgKHMuc3R5bGUuY29sb3IgJiYgcy5zdHls +ZS5sZW5ndGggPD0gMSkgewogICAgICAgICAgICAgICAgICAgIHdoaWxlIChzLmZpcnN0Q2hpbGQp +IHMucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUocy5maXJzdENoaWxkLCBzKTsKICAgICAgICAgICAg +ICAgICAgICBzLnJlbW92ZSgpOwogICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzLnN0eWxlLmNv +bG9yKSB7CiAgICAgICAgICAgICAgICAgICAgcy5zdHlsZS5yZW1vdmVQcm9wZXJ0eSgnY29sb3In +KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGNvbnN0IHdy +YXBwZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7CiAgICAgICAgICAgIHdyYXBw +ZXIuc3R5bGUuY29sb3IgPSBjb2xvcjsKICAgICAgICAgICAgd3JhcHBlci5hcHBlbmRDaGlsZChm +cmFnKTsKICAgICAgICAgICAgc2F2ZWRSYW5nZS5pbnNlcnROb2RlKHdyYXBwZXIpOwogICAgICAg +ICAgICBzYXZlZFJhbmdlLnNlbGVjdE5vZGVDb250ZW50cyh3cmFwcGVyKTsKICAgICAgICAgICAg +c2VsLnJlbW92ZUFsbFJhbmdlcygpOwogICAgICAgICAgICBzZWwuYWRkUmFuZ2Uoc2F2ZWRSYW5n +ZSk7CiAgICAgICAgfQogICAgICAgIGlucHV0LmZvY3VzKCk7CiAgICB9LAoKICAgIC8vIC0tLSBN +ZWRpYSBUeXBlIERldGVjdGlvbiAtLS0KICAgIC8vIC0tLSBQYXN0ZTogRXh0ZXJuZSBCaWxkZXIg +bG9rYWwgc3BlaWNoZXJuIC0tLQoKICAgIF9wYXN0ZVVwbG9hZEluUHJvZ3Jlc3M6IGZhbHNlLAoK +ICAgIGFzeW5jIF9wYXN0ZUltYWdlQmxvYihibG9iKSB7CiAgICAgICAgaWYgKCF0aGlzLmN1cnJl +bnREb2MgfHwgIURyaXZlRlMuY29ubmVjdGVkKSByZXR1cm47CiAgICAgICAgaWYgKHRoaXMuX3Bh +c3RlVXBsb2FkSW5Qcm9ncmVzcykgcmV0dXJuOyAvLyBEb3BwZWwtRWluZnVlZ2VuIHZlcmhpbmRl +cm4KICAgICAgICB0aGlzLl9wYXN0ZVVwbG9hZEluUHJvZ3Jlc3MgPSB0cnVlOwogICAgICAgIGNv +bnN0IGRvY0lkID0gdGhpcy5jdXJyZW50RG9jLmlkOwogICAgICAgIGNvbnN0IGV4dCA9IGJsb2Iu +dHlwZS5zcGxpdCgnLycpWzFdIHx8ICdwbmcnOwogICAgICAgIGNvbnN0IHRzID0gRGF0ZS5ub3co +KTsKICAgICAgICBjb25zdCBmaWxlbmFtZSA9ICdwYXN0ZV8nICsgdHMgKyAnLicgKyBleHQ7CiAg +ICAgICAgY29uc3QgZmlsZSA9IG5ldyBGaWxlKFtibG9iXSwgZmlsZW5hbWUsIHsgdHlwZTogYmxv +Yi50eXBlIH0pOwoKICAgICAgICB0cnkgewogICAgICAgICAgICBzaG93VG9hc3QoJ0JpbGQgd2ly +ZCBnZXNwZWljaGVydC4uLicsICdpbmZvJywgMzAwMCk7CiAgICAgICAgICAgIGNvbnN0IHJlbFBh +dGggPSBhd2FpdCBEcml2ZUZTLnVwbG9hZE1lZGlhKGRvY0lkLCBmaWxlKTsKICAgICAgICAgICAg +Y29uc3QgbWVkaWFJZCA9IHRoaXMuZ2VuZXJhdGVNZWRpYUlkKCk7CgogICAgICAgICAgICBpZiAo +IXRoaXMuY3VycmVudERvYy5tZWRpYXMpIHRoaXMuY3VycmVudERvYy5tZWRpYXMgPSBbXTsKICAg +ICAgICAgICAgdGhpcy5jdXJyZW50RG9jLm1lZGlhcy5wdXNoKHsKICAgICAgICAgICAgICAgIHR5 +cGU6ICdpbWFnZScsIHVybDogcmVsUGF0aCwgdGl0bGU6IGZpbGVuYW1lLAogICAgICAgICAgICAg +ICAgZGVzY3JpcHRpb246ICcnLCBkaXNwbGF5TW9kZTogJ2lubGluZScsCiAgICAgICAgICAgICAg +ICBhbGlnbm1lbnQ6ICdjZW50ZXInLCBzaXplOiAnbGFyZ2UnLCBtZWRpYUlkOiBtZWRpYUlkCiAg +ICAgICAgICAgIH0pOwoKICAgICAgICAgICAgY29uc3QgZmlndXJlID0gZG9jdW1lbnQuY3JlYXRl +RWxlbWVudCgnZmlndXJlJyk7CiAgICAgICAgICAgIGZpZ3VyZS5jbGFzc05hbWUgPSAnZHJpdmUt +bWVkaWEgbWVkaWEtbGFyZ2UgbWVkaWEtY2VudGVyJzsKICAgICAgICAgICAgZmlndXJlLnNldEF0 +dHJpYnV0ZSgnZGF0YS1tZWRpYS1pZCcsIG1lZGlhSWQpOwogICAgICAgICAgICBmaWd1cmUuY29u +dGVudEVkaXRhYmxlID0gJ2ZhbHNlJzsKICAgICAgICAgICAgY29uc3QgaW1nID0gZG9jdW1lbnQu +Y3JlYXRlRWxlbWVudCgnaW1nJyk7CiAgICAgICAgICAgIGltZy5zcmMgPSByZWxQYXRoOwogICAg +ICAgICAgICBpbWcuYWx0ID0gZmlsZW5hbWU7CiAgICAgICAgICAgIGZpZ3VyZS5hcHBlbmRDaGls +ZChpbWcpOwogICAgICAgICAgICBkb2N1bWVudC5leGVjQ29tbWFuZCgnaW5zZXJ0SFRNTCcsIGZh +bHNlLCBmaWd1cmUub3V0ZXJIVE1MKTsKICAgICAgICAgICAgdGhpcy5fcmVuZGVyTWVkaWFMaXN0 +KCk7CiAgICAgICAgICAgIHNob3dUb2FzdCgnQmlsZCBlaW5nZWbDvGd0JywgJ3N1Y2Nlc3MnKTsK +ICAgICAgICB9IGNhdGNoIChlcnIpIHsKICAgICAgICAgICAgc2hvd1RvYXN0KCdCaWxkIGtvbm50 +ZSBuaWNodCBnZXNwZWljaGVydCB3ZXJkZW46ICcgKyBlcnIubWVzc2FnZSwgJ2Vycm9yJyk7CiAg +ICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgdGhpcy5fcGFzdGVVcGxvYWRJblByb2dyZXNz +ID0gZmFsc2U7CiAgICAgICAgfQogICAgfSwKCiAgICBhc3luYyBfcGFzdGVIdG1sV2l0aEV4dGVy +bmFsSW1hZ2VzKGJvZHlFbCwgZXh0ZXJuYWxJbWdzKSB7CiAgICAgICAgY29uc3QgZG9jSWQgPSB0 +aGlzLmN1cnJlbnREb2MuaWQ7CiAgICAgICAgaWYgKCF0aGlzLmN1cnJlbnREb2MubWVkaWFzKSB0 +aGlzLmN1cnJlbnREb2MubWVkaWFzID0gW107CgogICAgICAgIHNob3dUb2FzdCgnRXh0ZXJuZSBC +aWxkZXIgd2VyZGVuIGhlcnVudGVyZ2VsYWRlbiAoJyArIGV4dGVybmFsSW1ncy5sZW5ndGggKyAn +KS4uLicsICdpbmZvJywgNDAwMCk7CiAgICAgICAgbGV0IHNhdmVkID0gMDsKCiAgICAgICAgZm9y +IChjb25zdCBpbWcgb2YgZXh0ZXJuYWxJbWdzKSB7CiAgICAgICAgICAgIGNvbnN0IHNyYyA9IGlt +Zy5zcmM7CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAvLyBCaWxkIGhlcnVudGVy +bGFkZW46IEltIFNlcnZlci1Nb2R1cyB1ZWJlciBQcm94eSAodW1nZWh0IENPUlMpCiAgICAgICAg +ICAgICAgICBsZXQgcmVzcG9uc2U7CiAgICAgICAgICAgICAgICBpZiAoRHJpdmVGUy5tb2RlID09 +PSAnc2VydmVyJykgewogICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlID0gYXdhaXQgZmV0Y2go +Jy9hcGkvZmV0Y2gtaW1hZ2UnLCB7CiAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZDogJ1BP +U1QnLAogICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAn +YXBwbGljYXRpb24vanNvbicgfSwKICAgICAgICAgICAgICAgICAgICAgICAgYm9keTogSlNPTi5z +dHJpbmdpZnkoeyB1cmw6IHNyYyB9KQogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAg +ICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICByZXNwb25zZSA9IGF3YWl0IGZldGNo +KHNyYywgeyBtb2RlOiAnY29ycycgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAg +ICBpZiAoIXJlc3BvbnNlLm9rKSB7IGltZy5yZW1vdmUoKTsgY29udGludWU7IH0KICAgICAgICAg +ICAgICAgIGNvbnN0IGJsb2IgPSBhd2FpdCByZXNwb25zZS5ibG9iKCk7CgogICAgICAgICAgICAg +ICAgLy8gTnVyIGVjaHRlIEJpbGRlciB2ZXJhcmJlaXRlbiAoa2VpbmUgMC1CeXRlIHRyYWNraW5n +LXBpeGVsIG9kZXIgRmVobGVyKQogICAgICAgICAgICAgICAgaWYgKCFibG9iLnR5cGUuc3RhcnRz +V2l0aCgnaW1hZ2UvJykgfHwgYmxvYi5zaXplIDwgMTAwKSB7CiAgICAgICAgICAgICAgICAgICAg +aW1nLnJlbW92ZSgpOwogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAg +ICAgfQoKICAgICAgICAgICAgICAgIGNvbnN0IGV4dCA9IGJsb2IudHlwZS5zcGxpdCgnLycpWzFd +IHx8ICdwbmcnOwogICAgICAgICAgICAgICAgY29uc3QgdHMgPSBEYXRlLm5vdygpICsgJ18nICsg +c2F2ZWQ7CiAgICAgICAgICAgICAgICBjb25zdCBmaWxlbmFtZSA9ICd3ZWJfJyArIHRzICsgJy4n +ICsgZXh0OwogICAgICAgICAgICAgICAgY29uc3QgZmlsZSA9IG5ldyBGaWxlKFtibG9iXSwgZmls +ZW5hbWUsIHsgdHlwZTogYmxvYi50eXBlIH0pOwoKICAgICAgICAgICAgICAgIGNvbnN0IHJlbFBh +dGggPSBhd2FpdCBEcml2ZUZTLnVwbG9hZE1lZGlhKGRvY0lkLCBmaWxlKTsKICAgICAgICAgICAg +ICAgIGNvbnN0IG1lZGlhSWQgPSB0aGlzLmdlbmVyYXRlTWVkaWFJZCgpOwoKICAgICAgICAgICAg +ICAgIHRoaXMuY3VycmVudERvYy5tZWRpYXMucHVzaCh7CiAgICAgICAgICAgICAgICAgICAgdHlw +ZTogJ2ltYWdlJywgdXJsOiByZWxQYXRoLCB0aXRsZTogZmlsZW5hbWUsCiAgICAgICAgICAgICAg +ICAgICAgZGVzY3JpcHRpb246ICcnLCBkaXNwbGF5TW9kZTogJ2lubGluZScsCiAgICAgICAgICAg +ICAgICAgICAgYWxpZ25tZW50OiAnJywgc2l6ZTogJ2xhcmdlJywgbWVkaWFJZDogbWVkaWFJZAog +ICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgLy8gZmlndXJlLUVsZW1lbnQgZXJz +dGVsbGVuIGRhbWl0IGVzIG9mZmxpbmUgZnVua3Rpb25pZXJ0CiAgICAgICAgICAgICAgICBjb25z +dCBmaWd1cmUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdmaWd1cmUnKTsKICAgICAgICAgICAg +ICAgIGZpZ3VyZS5jbGFzc05hbWUgPSAnZHJpdmUtbWVkaWEgbWVkaWEtbGFyZ2UnOwogICAgICAg +ICAgICAgICAgZmlndXJlLnNldEF0dHJpYnV0ZSgnZGF0YS1tZWRpYS1pZCcsIG1lZGlhSWQpOwog +ICAgICAgICAgICAgICAgZmlndXJlLmNvbnRlbnRFZGl0YWJsZSA9ICdmYWxzZSc7CiAgICAgICAg +ICAgICAgICBjb25zdCBuZXdJbWcgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbWcnKTsKICAg +ICAgICAgICAgICAgIG5ld0ltZy5zcmMgPSByZWxQYXRoOwogICAgICAgICAgICAgICAgbmV3SW1n +LmFsdCA9IGltZy5hbHQgfHwgZmlsZW5hbWU7CiAgICAgICAgICAgICAgICBmaWd1cmUuYXBwZW5k +Q2hpbGQobmV3SW1nKTsKCiAgICAgICAgICAgICAgICAvLyBPcmlnaW5hbCBpbWcgZHVyY2ggZmln +dXJlIGVyc2V0emVuCiAgICAgICAgICAgICAgICBpbWcucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQo +ZmlndXJlLCBpbWcpOwogICAgICAgICAgICAgICAgc2F2ZWQrKzsKICAgICAgICAgICAgfSBjYXRj +aCB7CiAgICAgICAgICAgICAgICAvLyBCaWxkIGtvbm50ZSBuaWNodCBnZWxhZGVuIHdlcmRlbiAt +IGVudGZlcm5lbiBzdGF0dCBrYXB1dHRlIFJlZmVyZW56CiAgICAgICAgICAgICAgICBpbWcucmVt +b3ZlKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8vIEJlcmVpbmlndGVzIEhU +TUwgZWluZnVlZ2VuCiAgICAgICAgZG9jdW1lbnQuZXhlY0NvbW1hbmQoJ2luc2VydEhUTUwnLCBm +YWxzZSwgYm9keUVsLmlubmVySFRNTCk7CiAgICAgICAgdGhpcy5fcmVuZGVyTWVkaWFMaXN0KCk7 +CiAgICAgICAgaWYgKHNhdmVkID4gMCkgewogICAgICAgICAgICBzaG93VG9hc3Qoc2F2ZWQgKyAn +IEJpbGQnICsgKHNhdmVkID4gMSA/ICdlcicgOiAnJykgKyAnIGxva2FsIGdlc3BlaWNoZXJ0Jywg +J3N1Y2Nlc3MnKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBzaG93VG9hc3QoJ0tlaW5l +IEJpbGRlciBrb25udGVuIGhlcnVudGVyZ2VsYWRlbiB3ZXJkZW4gKGV2dGwuIENPUlMtU2NodXR6 +KScsICd3YXJuaW5nJyk7CiAgICAgICAgfQogICAgfSwKCiAgICBkZXRlY3RNZWRpYVR5cGUoZmls +ZSkgewogICAgICAgIGlmIChmaWxlLnR5cGUuc3RhcnRzV2l0aCgnaW1hZ2UvJykpIHJldHVybiAn +aW1hZ2UnOwogICAgICAgIGlmIChmaWxlLnR5cGUuc3RhcnRzV2l0aCgndmlkZW8vJykpIHJldHVy +biAndmlkZW8nOwogICAgICAgIGlmIChmaWxlLnR5cGUuc3RhcnRzV2l0aCgnYXVkaW8vJykpIHJl +dHVybiAnYXVkaW8nOwogICAgICAgIGlmIChmaWxlLnR5cGUgPT09ICdhcHBsaWNhdGlvbi9wZGYn +KSByZXR1cm4gJ3BkZic7CiAgICAgICAgY29uc3QgZXh0ID0gZmlsZS5uYW1lLnNwbGl0KCcuJyku +cG9wKCkudG9Mb3dlckNhc2UoKTsKICAgICAgICBpZiAoZXh0ID09PSAnZG9jeCcpIHJldHVybiAn +ZG9jeCc7CiAgICAgICAgaWYgKGV4dCA9PT0gJ3hsc3gnKSByZXR1cm4gJ3hsc3gnOwogICAgICAg +IGlmIChleHQgPT09ICdwcHR4JykgcmV0dXJuICdwcHR4JzsKICAgICAgICByZXR1cm4gJ2ZpbGUn +OwogICAgfSwKCiAgICBnZW5lcmF0ZU1lZGlhSWQoKSB7CiAgICAgICAgaWYgKCF0aGlzLmN1cnJl +bnREb2MgfHwgIXRoaXMuY3VycmVudERvYy5tZWRpYXMpIHJldHVybiAnbTAwMSc7CiAgICAgICAg +bGV0IG1heCA9IDA7CiAgICAgICAgdGhpcy5jdXJyZW50RG9jLm1lZGlhcy5mb3JFYWNoKG0gPT4g +ewogICAgICAgICAgICBpZiAobS5tZWRpYUlkKSB7CiAgICAgICAgICAgICAgICBjb25zdCBuID0g +cGFyc2VJbnQobS5tZWRpYUlkLnJlcGxhY2UoJ20nLCAnJyksIDEwKTsKICAgICAgICAgICAgICAg +IGlmIChuID4gbWF4KSBtYXggPSBuOwogICAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICAgICAg +cmV0dXJuICdtJyArIFN0cmluZyhtYXggKyAxKS5wYWRTdGFydCgzLCAnMCcpOwogICAgfSwKCiAg +ICAvLyAtLS0gVXBsb2FkIERpYWxvZyAtLS0KICAgIF9wZW5kaW5nRmlsZXM6IFtdLAogICAgX3Bl +bmRpbmdJbmRleDogMCwKICAgIF91cGxvYWRPcHRpb25zOiB7IGRpc3BsYXlNb2RlOiAnYXR0YWNo +bWVudCcsIGFsaWduOiAnY2VudGVyJywgc2l6ZTogJ3RodW1ibmFpbCcgfSwKICAgIF9zYXZlZEVk +aXRvclJhbmdlOiBudWxsLAoKICAgIC8vIFVwbG9hZC1FaW5zdGllZ3MtTW9kYWwgbWl0IERyYWcm +RHJvcCB1bmQgRXJrbGFlcnVuZyBvZWZmbmVuCiAgICBzaG93VXBsb2FkTW9kYWwoKSB7CiAgICAg +ICAgaWYgKCF0aGlzLmN1cnJlbnREb2MgfHwgIURyaXZlRlMuY29ubmVjdGVkKSB7CiAgICAgICAg +ICAgIHNob3dUb2FzdCgnQml0dGUgenVlcnN0IGVpbiBEb2t1bWVudCDDtmZmbmVuJywgJ3dhcm5p +bmcnKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICAvLyBDdXJzb3ItUG9z +aXRpb24gbWVya2VuCiAgICAgICAgY29uc3Qgc2VsID0gd2luZG93LmdldFNlbGVjdGlvbigpOwog +ICAgICAgIGlmIChzZWwucmFuZ2VDb3VudCA+IDApIHsKICAgICAgICAgICAgdGhpcy5fc2F2ZWRF +ZGl0b3JSYW5nZSA9IHNlbC5nZXRSYW5nZUF0KDApLmNsb25lUmFuZ2UoKTsKICAgICAgICB9CiAg +ICAgICAgY29uc3QgbW9kYWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWVkaWFVcGxvYWRT +dGFydE1vZGFsJyk7CiAgICAgICAgbW9kYWwuY2xhc3NMaXN0LmFkZCgnYWN0aXZlJyk7CgogICAg +ICAgIC8vIERyYWcgJiBEcm9wIFNldHVwIChudXIgZWlubWFsKQogICAgICAgIGNvbnN0IGRyb3Ba +b25lID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3VwbG9hZERyb3Bab25lJyk7CiAgICAgICAg +aWYgKCFkcm9wWm9uZS5fZHJhZ1NldHVwKSB7CiAgICAgICAgICAgIGRyb3Bab25lLl9kcmFnU2V0 +dXAgPSB0cnVlOwogICAgICAgICAgICBkcm9wWm9uZS5hZGRFdmVudExpc3RlbmVyKCdkcmFnb3Zl +cicsIChlKSA9PiB7IGUucHJldmVudERlZmF1bHQoKTsgZHJvcFpvbmUuY2xhc3NMaXN0LmFkZCgn +ZHJhZy1vdmVyJyk7IH0pOwogICAgICAgICAgICBkcm9wWm9uZS5hZGRFdmVudExpc3RlbmVyKCdk +cmFnbGVhdmUnLCAoKSA9PiB7IGRyb3Bab25lLmNsYXNzTGlzdC5yZW1vdmUoJ2RyYWctb3Zlcicp +OyB9KTsKICAgICAgICAgICAgZHJvcFpvbmUuYWRkRXZlbnRMaXN0ZW5lcignZHJvcCcsIChlKSA9 +PiB7CiAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgICAgICAgICBk +cm9wWm9uZS5jbGFzc0xpc3QucmVtb3ZlKCdkcmFnLW92ZXInKTsKICAgICAgICAgICAgICAgIGNv +bnN0IGZpbGVzID0gQXJyYXkuZnJvbShlLmRhdGFUcmFuc2Zlci5maWxlcykuZmlsdGVyKGYgPT4g +ewogICAgICAgICAgICAgICAgICAgIGNvbnN0IGV4dCA9IGYubmFtZS5zcGxpdCgnLicpLnBvcCgp +LnRvTG93ZXJDYXNlKCk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGYudHlwZS5zdGFydHNX +aXRoKCdpbWFnZS8nKSB8fCBmLnR5cGUuc3RhcnRzV2l0aCgndmlkZW8vJykgfHwgZi50eXBlLnN0 +YXJ0c1dpdGgoJ2F1ZGlvLycpIHx8CiAgICAgICAgICAgICAgICAgICAgICAgIGYudHlwZSA9PT0g +J2FwcGxpY2F0aW9uL3BkZicgfHwgWydkb2N4JywneGxzeCcsJ3BwdHgnXS5pbmNsdWRlcyhleHQp +OwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBpZiAoZmlsZXMubGVuZ3RoID09 +PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgc2hvd1RvYXN0KCdEYXRlaXR5cCBuaWNodCB1bnRl +cnN0w7x0enQnLCAnd2FybmluZycpOwogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAg +ICAgICAgICAgIH0KICAgICAgICAgICAgICAgIERyaXZlRWRpdG9yLl9zdGFydEZpbGVzVXBsb2Fk +KGZpbGVzKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIC8vIEtsaWNrIGF1ZiBab25lID0g +RGF0ZWlhdXN3YWhsCiAgICAgICAgICAgIGRyb3Bab25lLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNr +JywgKGUpID0+IHsKICAgICAgICAgICAgICAgIGlmIChlLnRhcmdldC50YWdOYW1lICE9PSAnQlVU +VE9OJykgRHJpdmVFZGl0b3IudXBsb2FkTWVkaWEoKTsKICAgICAgICAgICAgfSk7CiAgICAgICAg +fQogICAgfSwKCiAgICBjbG9zZVVwbG9hZFN0YXJ0TW9kYWwoKSB7CiAgICAgICAgZG9jdW1lbnQu +Z2V0RWxlbWVudEJ5SWQoJ21lZGlhVXBsb2FkU3RhcnRNb2RhbCcpLmNsYXNzTGlzdC5yZW1vdmUo +J2FjdGl2ZScpOwogICAgfSwKCiAgICAvLyBEYXRlaWF1c3dhaGwtRGlhbG9nIChuYXRpdikgb2Vm +Zm5lbgogICAgdXBsb2FkTWVkaWEoKSB7CiAgICAgICAgaWYgKCF0aGlzLmN1cnJlbnREb2MgfHwg +IURyaXZlRlMuY29ubmVjdGVkKSB7CiAgICAgICAgICAgIHNob3dUb2FzdCgnQml0dGUgenVlcnN0 +IGVpbiBEb2t1bWVudCDDtmZmbmVuJywgJ3dhcm5pbmcnKTsKICAgICAgICAgICAgcmV0dXJuOwog +ICAgICAgIH0KCiAgICAgICAgY29uc3QgZmlsZUlucHV0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVu +dCgnaW5wdXQnKTsKICAgICAgICBmaWxlSW5wdXQudHlwZSA9ICdmaWxlJzsKICAgICAgICBmaWxl +SW5wdXQuYWNjZXB0ID0gJ2ltYWdlLyosdmlkZW8vKixhdWRpby8qLC5wZGYsLmRvY3gsLnhsc3gs +LnBwdHgnOwogICAgICAgIGZpbGVJbnB1dC5tdWx0aXBsZSA9IHRydWU7CgogICAgICAgIGZpbGVJ +bnB1dC5vbmNoYW5nZSA9IChlKSA9PiB7CiAgICAgICAgICAgIGNvbnN0IGZpbGVzID0gQXJyYXku +ZnJvbShlLnRhcmdldC5maWxlcyk7CiAgICAgICAgICAgIGlmIChmaWxlcy5sZW5ndGggPT09IDAp +IHJldHVybjsKICAgICAgICAgICAgdGhpcy5fc3RhcnRGaWxlc1VwbG9hZChmaWxlcyk7CiAgICAg +ICAgfTsKCiAgICAgICAgZmlsZUlucHV0LmNsaWNrKCk7CiAgICB9LAoKICAgIC8vIEdlbWVpbnNh +bWVyIEVpbnN0aWVnOiBEYXRlaWVuIGluIEZvcm1hdGllcnVuZ3MtUXVldWUgc3RlbGxlbgogICAg +X3N0YXJ0RmlsZXNVcGxvYWQoZmlsZXMpIHsKICAgICAgICAvLyBDdXJzb3ItUG9zaXRpb24gbWVy +a2VuIGZhbGxzIG5vY2ggbmljaHQgZ2VzY2hlaGVuCiAgICAgICAgaWYgKCF0aGlzLl9zYXZlZEVk +aXRvclJhbmdlKSB7CiAgICAgICAgICAgIGNvbnN0IHNlbCA9IHdpbmRvdy5nZXRTZWxlY3Rpb24o +KTsKICAgICAgICAgICAgaWYgKHNlbC5yYW5nZUNvdW50ID4gMCkgewogICAgICAgICAgICAgICAg +dGhpcy5fc2F2ZWRFZGl0b3JSYW5nZSA9IHNlbC5nZXRSYW5nZUF0KDApLmNsb25lUmFuZ2UoKTsK +ICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICB0aGlzLl9wZW5kaW5nRmlsZXMgPSBmaWxl +czsKICAgICAgICB0aGlzLl9wZW5kaW5nSW5kZXggPSAwOwogICAgICAgIC8vIEVpbnN0aWVncy1N +b2RhbCBzY2hsaWVzc2VuLCBGb3JtYXRpZXJ1bmdzLURpYWxvZyBvZWZmbmVuCiAgICAgICAgdGhp +cy5jbG9zZVVwbG9hZFN0YXJ0TW9kYWwoKTsKICAgICAgICB0aGlzLnNob3dVcGxvYWREaWFsb2co +KTsKICAgIH0sCgogICAgc2hvd1VwbG9hZERpYWxvZygpIHsKICAgICAgICBpZiAodGhpcy5fcGVu +ZGluZ0luZGV4ID49IHRoaXMuX3BlbmRpbmdGaWxlcy5sZW5ndGgpIHsKICAgICAgICAgICAgdGhp +cy5jbG9zZVVwbG9hZERpYWxvZygpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAg +ICAgICBjb25zdCBmaWxlID0gdGhpcy5fcGVuZGluZ0ZpbGVzW3RoaXMuX3BlbmRpbmdJbmRleF07 +CiAgICAgICAgY29uc3QgdHlwZSA9IHRoaXMuZGV0ZWN0TWVkaWFUeXBlKGZpbGUpOwogICAgICAg +IGNvbnN0IHJlbWFpbmluZyA9IHRoaXMuX3BlbmRpbmdGaWxlcy5sZW5ndGggLSB0aGlzLl9wZW5k +aW5nSW5kZXg7CgogICAgICAgIC8vIFJlc2V0IG9wdGlvbnMKICAgICAgICB0aGlzLl91cGxvYWRP +cHRpb25zID0geyBkaXNwbGF5TW9kZTogJ2F0dGFjaG1lbnQnLCBhbGlnbjogJ2NlbnRlcicsIHNp +emU6ICd0aHVtYm5haWwnIH07CgogICAgICAgIC8vIEhlYWRlciBtaXQgRm9ydHNjaHJpdHQKICAg +ICAgICBjb25zdCB0aXRsZUVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3VwbG9hZERpYWxv +Z1RpdGxlJyk7CiAgICAgICAgaWYgKHRoaXMuX3BlbmRpbmdGaWxlcy5sZW5ndGggPiAxKSB7CiAg +ICAgICAgICAgIHRpdGxlRWwuaW5uZXJIVE1MID0gJ0RhdGVpIGtvbmZpZ3VyaWVyZW4gPHNwYW4g +c3R5bGU9ImZvbnQtd2VpZ2h0OjQwMDtmb250LXNpemU6MTNweDtvcGFjaXR5OjAuODsiPignICsg +KHRoaXMuX3BlbmRpbmdJbmRleCArIDEpICsgJyB2b24gJyArIHRoaXMuX3BlbmRpbmdGaWxlcy5s +ZW5ndGggKyAnKTwvc3Bhbj4nOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHRpdGxlRWwu +dGV4dENvbnRlbnQgPSAnRGF0ZWkga29uZmlndXJpZXJlbic7CiAgICAgICAgfQoKICAgICAgICAv +LyBQcmV2aWV3IG1pdCBEYXRlaWluZm8KICAgICAgICBjb25zdCBwcmV2aWV3ID0gZG9jdW1lbnQu +Z2V0RWxlbWVudEJ5SWQoJ3VwbG9hZFByZXZpZXcnKTsKICAgICAgICBjb25zdCBmaWxlU2l6ZU1C +ID0gKGZpbGUuc2l6ZSAvICgxMDI0ICogMTAyNCkpLnRvRml4ZWQoMSk7CiAgICAgICAgY29uc3Qg +ZmlsZVNpemVUZXh0ID0gZmlsZS5zaXplIDwgMTAyNCoxMDI0CiAgICAgICAgICAgID8gTWF0aC5y +b3VuZChmaWxlLnNpemUgLyAxMDI0KSArICcgS0InCiAgICAgICAgICAgIDogZmlsZVNpemVNQiAr +ICcgTUInOwogICAgICAgIGNvbnN0IGZpbGVJbmZvSHRtbCA9ICc8cCBzdHlsZT0ibWFyZ2luLXRv +cDo4cHg7Y29sb3I6dmFyKC0tdGV4dC1tdXRlZCk7Zm9udC1zaXplOjEycHg7Ij4nICsKICAgICAg +ICAgICAgRHJpdmVQb3J0YWwuZXNjYXBlSFRNTChmaWxlLm5hbWUpICsgJyAoJyArIGZpbGVTaXpl +VGV4dCArICcpPC9wPic7CgogICAgICAgIGlmICh0eXBlID09PSAnaW1hZ2UnKSB7CiAgICAgICAg +ICAgIGNvbnN0IHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7CiAgICAgICAgICAgIHJlYWRlci5v +bmxvYWQgPSAoZSkgPT4geyBwcmV2aWV3LmlubmVySFRNTCA9ICc8aW1nIHNyYz0iJyArIGUudGFy +Z2V0LnJlc3VsdCArICciPicgKyBmaWxlSW5mb0h0bWw7IH07CiAgICAgICAgICAgIHJlYWRlci5y +ZWFkQXNEYXRhVVJMKGZpbGUpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGNvbnN0IGlj +b25DbGFzcyA9IHR5cGU7CiAgICAgICAgICAgIGNvbnN0IGxhYmVsID0gdHlwZS50b1VwcGVyQ2Fz +ZSgpOwogICAgICAgICAgICBwcmV2aWV3LmlubmVySFRNTCA9ICc8c3BhbiBjbGFzcz0iZHJpdmUt +ZmlsZS1pY29uICcgKyBpY29uQ2xhc3MgKyAnIiBzdHlsZT0id2lkdGg6NjBweDtoZWlnaHQ6NjBw +eDtmb250LXNpemU6MThweDttYXJnaW46MTBweCBhdXRvOyI+JyArIGxhYmVsICsgJzwvc3Bhbj4n +ICsgZmlsZUluZm9IdG1sOwogICAgICAgIH0KCiAgICAgICAgLy8gVGl0bGUgKyBDYXB0aW9uCiAg +ICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3VwbG9hZFRpdGxlJykudmFsdWUgPSBmaWxl +Lm5hbWUucmVwbGFjZSgvXC5bXi5dKyQvLCAnJyk7CiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVu +dEJ5SWQoJ3VwbG9hZENhcHRpb24nKS52YWx1ZSA9ICcnOwoKICAgICAgICAvLyBEaXNwbGF5IG1v +ZGUgb3B0aW9ucyAodHlwZS1kZXBlbmRlbnQpCiAgICAgICAgY29uc3QgZGlzcGxheUdyb3VwID0g +ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3VwbG9hZERpc3BsYXlPcHRpb25zJyk7CiAgICAgICAg +bGV0IG9wdGlvbnMgPSAnPGJ1dHRvbiBjbGFzcz0idXBsb2FkLW9wdGlvbi1idG4gYWN0aXZlIiBk +YXRhLWRpc3BsYXk9ImF0dGFjaG1lbnQiIG9uY2xpY2s9IkRyaXZlRWRpdG9yLnNldFVwbG9hZE9w +dGlvbihcJ2Rpc3BsYXlcJyx0aGlzKSI+QW5oYW5nPC9idXR0b24+JzsKCiAgICAgICAgaWYgKHR5 +cGUgPT09ICdpbWFnZScpIHsKICAgICAgICAgICAgb3B0aW9ucyArPSAnPGJ1dHRvbiBjbGFzcz0i +dXBsb2FkLW9wdGlvbi1idG4iIGRhdGEtZGlzcGxheT0iaW5saW5lIiBvbmNsaWNrPSJEcml2ZUVk +aXRvci5zZXRVcGxvYWRPcHRpb24oXCdkaXNwbGF5XCcsdGhpcykiPkltIEFydGlrZWw8L2J1dHRv +bj4nOwogICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ3BkZicpIHsKICAgICAgICAgICAgb3B0 +aW9ucyArPSAnPGJ1dHRvbiBjbGFzcz0idXBsb2FkLW9wdGlvbi1idG4iIGRhdGEtZGlzcGxheT0i +cGRmLWxpbmsiIG9uY2xpY2s9IkRyaXZlRWRpdG9yLnNldFVwbG9hZE9wdGlvbihcJ2Rpc3BsYXlc +Jyx0aGlzKSI+UERGLUxpbmsgaW0gQXJ0aWtlbDwvYnV0dG9uPic7CiAgICAgICAgICAgIG9wdGlv +bnMgKz0gJzxidXR0b24gY2xhc3M9InVwbG9hZC1vcHRpb24tYnRuIiBkYXRhLWRpc3BsYXk9InBk +Zi1pZnJhbWUiIG9uY2xpY2s9IkRyaXZlRWRpdG9yLnNldFVwbG9hZE9wdGlvbihcJ2Rpc3BsYXlc +Jyx0aGlzKSI+UERGIGVpbmdlYmV0dGV0PC9idXR0b24+JzsKICAgICAgICB9IGVsc2UgaWYgKHR5 +cGUgPT09ICd2aWRlbycgfHwgdHlwZSA9PT0gJ2F1ZGlvJykgewogICAgICAgICAgICBvcHRpb25z +ICs9ICc8YnV0dG9uIGNsYXNzPSJ1cGxvYWQtb3B0aW9uLWJ0biIgZGF0YS1kaXNwbGF5PSJtZWRp +YS1pbmxpbmUiIG9uY2xpY2s9IkRyaXZlRWRpdG9yLnNldFVwbG9hZE9wdGlvbihcJ2Rpc3BsYXlc +Jyx0aGlzKSI+SW0gQXJ0aWtlbDwvYnV0dG9uPic7CiAgICAgICAgfSBlbHNlIGlmICh0eXBlID09 +PSAnZG9jeCcgfHwgdHlwZSA9PT0gJ3hsc3gnIHx8IHR5cGUgPT09ICdwcHR4JykgewogICAgICAg +ICAgICBvcHRpb25zICs9ICc8YnV0dG9uIGNsYXNzPSJ1cGxvYWQtb3B0aW9uLWJ0biIgZGF0YS1k +aXNwbGF5PSJvZmZpY2UtaW5saW5lIiBvbmNsaWNrPSJEcml2ZUVkaXRvci5zZXRVcGxvYWRPcHRp +b24oXCdkaXNwbGF5XCcsdGhpcykiPkltIEFydGlrZWw8L2J1dHRvbj4nOwogICAgICAgIH0KCiAg +ICAgICAgZGlzcGxheUdyb3VwLmlubmVySFRNTCA9IG9wdGlvbnM7CgogICAgICAgIC8vIEhpZGUg +aW1hZ2Utc3BlY2lmaWMgb3B0aW9ucyBpbml0aWFsbHkKICAgICAgICBkb2N1bWVudC5nZXRFbGVt +ZW50QnlJZCgndXBsb2FkQWxpZ25Hcm91cCcpLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7CiAgICAg +ICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3VwbG9hZFNpemVHcm91cCcpLnN0eWxlLmRpc3Bs +YXkgPSAnbm9uZSc7CgogICAgICAgIC8vIENvbmZpcm0tQnV0dG9uIEJlc2NocmlmdHVuZwogICAg +ICAgIGNvbnN0IGNvbmZpcm1CdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndXBsb2FkQ29u +ZmlybUJ0bicpOwogICAgICAgIGlmICh0aGlzLl9wZW5kaW5nSW5kZXggPCB0aGlzLl9wZW5kaW5n +RmlsZXMubGVuZ3RoIC0gMSkgewogICAgICAgICAgICBjb25maXJtQnRuLnRleHRDb250ZW50ID0g +J0VpbmbDvGdlbiAmIG7DpGNoc3RlIERhdGVpJzsKICAgICAgICB9IGVsc2UgewogICAgICAgICAg +ICBjb25maXJtQnRuLnRleHRDb250ZW50ID0gJ0VpbmbDvGdlbic7CiAgICAgICAgfQoKICAgICAg +ICAvLyBTaG93IGRpYWxvZwogICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtZWRpYVVw +bG9hZERpYWxvZycpLmNsYXNzTGlzdC5hZGQoJ2FjdGl2ZScpOwogICAgfSwKCiAgICBzZXRVcGxv +YWRPcHRpb24oZ3JvdXAsIGJ0bikgewogICAgICAgIC8vIFRvZ2dsZSBhY3RpdmUgaW4gZ3JvdXAK +ICAgICAgICBidG4ucGFyZW50RWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKCcudXBsb2FkLW9wdGlv +bi1idG4nKS5mb3JFYWNoKGIgPT4gYi5jbGFzc0xpc3QucmVtb3ZlKCdhY3RpdmUnKSk7CiAgICAg +ICAgYnRuLmNsYXNzTGlzdC5hZGQoJ2FjdGl2ZScpOwoKICAgICAgICBpZiAoZ3JvdXAgPT09ICdk +aXNwbGF5JykgewogICAgICAgICAgICBjb25zdCBtb2RlID0gYnRuLmdldEF0dHJpYnV0ZSgnZGF0 +YS1kaXNwbGF5Jyk7CiAgICAgICAgICAgIHRoaXMuX3VwbG9hZE9wdGlvbnMuZGlzcGxheU1vZGUg +PSBtb2RlOwogICAgICAgICAgICBjb25zdCBpc0lubGluZUltYWdlID0gKG1vZGUgPT09ICdpbmxp +bmUnKTsKICAgICAgICAgICAgY29uc3QgaXNJbmxpbmVQZGYgPSAobW9kZSA9PT0gJ3BkZi1saW5r +JyB8fCBtb2RlID09PSAncGRmLWlmcmFtZScpOwogICAgICAgICAgICBjb25zdCBpc0lubGluZU1l +ZGlhID0gKG1vZGUgPT09ICdtZWRpYS1pbmxpbmUnIHx8IG1vZGUgPT09ICdvZmZpY2UtaW5saW5l +Jyk7CiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd1cGxvYWRBbGlnbkdyb3Vw +Jykuc3R5bGUuZGlzcGxheSA9IChpc0lubGluZUltYWdlIHx8IGlzSW5saW5lUGRmIHx8IGlzSW5s +aW5lTWVkaWEpID8gJycgOiAnbm9uZSc7CiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRC +eUlkKCd1cGxvYWRTaXplR3JvdXAnKS5zdHlsZS5kaXNwbGF5ID0gaXNJbmxpbmVJbWFnZSA/ICcn +IDogJ25vbmUnOwogICAgICAgIH0gZWxzZSBpZiAoZ3JvdXAgPT09ICdhbGlnbicpIHsKICAgICAg +ICAgICAgdGhpcy5fdXBsb2FkT3B0aW9ucy5hbGlnbiA9IGJ0bi5nZXRBdHRyaWJ1dGUoJ2RhdGEt +YWxpZ24nKTsKICAgICAgICB9IGVsc2UgaWYgKGdyb3VwID09PSAnc2l6ZScpIHsKICAgICAgICAg +ICAgdGhpcy5fdXBsb2FkT3B0aW9ucy5zaXplID0gYnRuLmdldEF0dHJpYnV0ZSgnZGF0YS1zaXpl +Jyk7CiAgICAgICAgfQogICAgfSwKCiAgICBjbG9zZVVwbG9hZERpYWxvZygpIHsKICAgICAgICBp +ZiAodGhpcy5fdXBsb2FkSW5Qcm9ncmVzcykgcmV0dXJuOyAvLyBMYXVmZW5kZW4gVXBsb2FkIG5p +Y2h0IGFiYnJlY2hlbgogICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtZWRpYVVwbG9h +ZERpYWxvZycpLmNsYXNzTGlzdC5yZW1vdmUoJ2FjdGl2ZScpOwogICAgICAgIHRoaXMuX3BlbmRp +bmdGaWxlcyA9IFtdOwogICAgICAgIHRoaXMuX3BlbmRpbmdJbmRleCA9IDA7CiAgICAgICAgdGhp +cy5fc2hvd1VwbG9hZFByb2dyZXNzKGZhbHNlKTsKICAgIH0sCgogICAgX3VwbG9hZEluUHJvZ3Jl +c3M6IGZhbHNlLAoKICAgIF9mb3JtYXRCeXRlcyhieXRlcykgewogICAgICAgIGlmIChieXRlcyA8 +IDEwMjQpIHJldHVybiBieXRlcyArICcgQic7CiAgICAgICAgaWYgKGJ5dGVzIDwgMTAyNCAqIDEw +MjQpIHJldHVybiAoYnl0ZXMgLyAxMDI0KS50b0ZpeGVkKDApICsgJyBLQic7CiAgICAgICAgcmV0 +dXJuIChieXRlcyAvICgxMDI0ICogMTAyNCkpLnRvRml4ZWQoMSkgKyAnIE1CJzsKICAgIH0sCgog +ICAgX3Nob3dVcGxvYWRQcm9ncmVzcyhzaG93KSB7CiAgICAgICAgdmFyIGNvbnRhaW5lciA9IGRv +Y3VtZW50LmdldEVsZW1lbnRCeUlkKCd1cGxvYWRQcm9ncmVzc0NvbnRhaW5lcicpOwogICAgICAg +IHZhciBidG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndXBsb2FkQ29uZmlybUJ0bicpOwog +ICAgICAgIGlmIChjb250YWluZXIpIGNvbnRhaW5lci5zdHlsZS5kaXNwbGF5ID0gc2hvdyA/ICcn +IDogJ25vbmUnOwogICAgICAgIGlmIChidG4pIHsKICAgICAgICAgICAgYnRuLmRpc2FibGVkID0g +c2hvdzsKICAgICAgICAgICAgYnRuLnRleHRDb250ZW50ID0gc2hvdyA/ICdXaXJkIGhvY2hnZWxh +ZGVuLi4uJyA6ICdFaW5mw7xnZW4nOwogICAgICAgICAgICBidG4uc3R5bGUub3BhY2l0eSA9IHNo +b3cgPyAnMC41JyA6ICcnOwogICAgICAgICAgICBidG4uc3R5bGUuY3Vyc29yID0gc2hvdyA/ICdu +b3QtYWxsb3dlZCcgOiAnJzsKICAgICAgICB9CiAgICAgICAgaWYgKHNob3cpIHsKICAgICAgICAg +ICAgdmFyIGJhciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd1cGxvYWRQcm9ncmVzc0Jhcicp +OwogICAgICAgICAgICB2YXIgcGN0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3VwbG9hZFBy +b2dyZXNzUGN0Jyk7CiAgICAgICAgICAgIHZhciBzaXplRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50 +QnlJZCgndXBsb2FkUHJvZ3Jlc3NTaXplJyk7CiAgICAgICAgICAgIGlmIChiYXIpIGJhci5zdHls +ZS53aWR0aCA9ICcwJSc7CiAgICAgICAgICAgIGlmIChwY3QpIHBjdC50ZXh0Q29udGVudCA9ICcw +JSc7CiAgICAgICAgICAgIGlmIChzaXplRWwpIHNpemVFbC50ZXh0Q29udGVudCA9ICcnOwogICAg +ICAgIH0KICAgIH0sCgogICAgYXN5bmMgY29uZmlybVVwbG9hZCgpIHsKICAgICAgICBjb25zdCBm +aWxlID0gdGhpcy5fcGVuZGluZ0ZpbGVzW3RoaXMuX3BlbmRpbmdJbmRleF07CiAgICAgICAgaWYg +KCFmaWxlIHx8IHRoaXMuX3VwbG9hZEluUHJvZ3Jlc3MpIHJldHVybjsKCiAgICAgICAgY29uc3Qg +dHlwZSA9IHRoaXMuZGV0ZWN0TWVkaWFUeXBlKGZpbGUpOwogICAgICAgIGNvbnN0IHRpdGxlID0g +ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3VwbG9hZFRpdGxlJykudmFsdWUudHJpbSgpIHx8IGZp +bGUubmFtZTsKICAgICAgICBjb25zdCBjYXB0aW9uID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQo +J3VwbG9hZENhcHRpb24nKS52YWx1ZS50cmltKCk7CiAgICAgICAgY29uc3Qgb3B0cyA9IHRoaXMu +X3VwbG9hZE9wdGlvbnM7CiAgICAgICAgY29uc3QgbWVkaWFJZCA9IHRoaXMuZ2VuZXJhdGVNZWRp +YUlkKCk7CiAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAvLyBVcGxvYWQtVUk6IEJ1 +dHRvbiBkZWFrdGl2aWVyZW4gKyBGb3J0c2Nocml0dHNiYWxrZW4gYW56ZWlnZW4KICAgICAgICB0 +aGlzLl91cGxvYWRJblByb2dyZXNzID0gdHJ1ZTsKICAgICAgICB0aGlzLl9zaG93VXBsb2FkUHJv +Z3Jlc3ModHJ1ZSk7CgogICAgICAgIHRyeSB7CiAgICAgICAgICAgIC8vIFVwbG9hZCBmaWxlIG1p +dCBGb3J0c2Nocml0dHNhbnplaWdlCiAgICAgICAgICAgIGNvbnN0IHJlbFBhdGggPSBhd2FpdCBE +cml2ZUZTLnVwbG9hZE1lZGlhKHRoaXMuY3VycmVudERvYy5pZCwgZmlsZSwgZnVuY3Rpb24ocGN0 +LCBsb2FkZWQsIHRvdGFsKSB7CiAgICAgICAgICAgICAgICB2YXIgYmFyID0gZG9jdW1lbnQuZ2V0 +RWxlbWVudEJ5SWQoJ3VwbG9hZFByb2dyZXNzQmFyJyk7CiAgICAgICAgICAgICAgICB2YXIgcGN0 +RWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndXBsb2FkUHJvZ3Jlc3NQY3QnKTsKICAgICAg +ICAgICAgICAgIHZhciBzaXplRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndXBsb2FkUHJv +Z3Jlc3NTaXplJyk7CiAgICAgICAgICAgICAgICB2YXIgbGFiZWwgPSBkb2N1bWVudC5nZXRFbGVt +ZW50QnlJZCgndXBsb2FkUHJvZ3Jlc3NMYWJlbCcpOwogICAgICAgICAgICAgICAgaWYgKGJhcikg +YmFyLnN0eWxlLndpZHRoID0gcGN0ICsgJyUnOwogICAgICAgICAgICAgICAgaWYgKHBjdEVsKSBw +Y3RFbC50ZXh0Q29udGVudCA9IHBjdCArICclJzsKICAgICAgICAgICAgICAgIGlmIChzaXplRWwp +IHNpemVFbC50ZXh0Q29udGVudCA9IHNlbGYuX2Zvcm1hdEJ5dGVzKGxvYWRlZCkgKyAnIC8gJyAr +IHNlbGYuX2Zvcm1hdEJ5dGVzKHRvdGFsKTsKICAgICAgICAgICAgICAgIGlmIChsYWJlbCAmJiBw +Y3QgPj0gMTAwKSBsYWJlbC50ZXh0Q29udGVudCA9ICdXaXJkIHZlcmFyYmVpdGV0Li4uJzsKICAg +ICAgICAgICAgfSk7CgogICAgICAgICAgICAvLyBBZGQgdG8gZG9jdW1lbnQgbWVkaWEgbGlzdAog +ICAgICAgICAgICBpZiAoIXRoaXMuY3VycmVudERvYy5tZWRpYXMpIHRoaXMuY3VycmVudERvYy5t +ZWRpYXMgPSBbXTsKICAgICAgICAgICAgdGhpcy5jdXJyZW50RG9jLm1lZGlhcy5wdXNoKHsKICAg +ICAgICAgICAgICAgIHR5cGU6IHR5cGUsCiAgICAgICAgICAgICAgICB1cmw6IHJlbFBhdGgsCiAg +ICAgICAgICAgICAgICB0aXRsZTogdGl0bGUsCiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjog +Y2FwdGlvbiwKICAgICAgICAgICAgICAgIGRpc3BsYXlNb2RlOiBvcHRzLmRpc3BsYXlNb2RlLAog +ICAgICAgICAgICAgICAgYWxpZ25tZW50OiBvcHRzLmFsaWduLAogICAgICAgICAgICAgICAgc2l6 +ZTogb3B0cy5zaXplLAogICAgICAgICAgICAgICAgbWVkaWFJZDogbWVkaWFJZAogICAgICAgICAg +ICB9KTsKCiAgICAgICAgICAgIC8vIEluc2VydCBpbmxpbmUgSFRNTCBpZiByZXF1ZXN0ZWQKICAg +ICAgICAgICAgaWYgKG9wdHMuZGlzcGxheU1vZGUgIT09ICdhdHRhY2htZW50JykgewogICAgICAg +ICAgICAgICAgdGhpcy5pbnNlcnRJbmxpbmVNZWRpYShyZWxQYXRoLCB0eXBlLCB0aXRsZSwgY2Fw +dGlvbiwgb3B0cywgbWVkaWFJZCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRoaXMuX3Jl +bmRlck1lZGlhTGlzdCgpOwogICAgICAgICAgICBzaG93VG9hc3QodGl0bGUgKyAnIGhpbnp1Z2Vm +w7xndCcsICdzdWNjZXNzJyk7CiAgICAgICAgfSBjYXRjaCAoZXJyKSB7CiAgICAgICAgICAgIHNo +b3dUb2FzdCgnRmVobGVyOiAnICsgZXJyLm1lc3NhZ2UsICdlcnJvcicpOwogICAgICAgIH0KCiAg +ICAgICAgLy8gVXBsb2FkIGFiZ2VzY2hsb3NzZW4gLSBVSSB6dXJ1ZWNrc2V0emVuCiAgICAgICAg +dGhpcy5fdXBsb2FkSW5Qcm9ncmVzcyA9IGZhbHNlOwogICAgICAgIHRoaXMuX3Nob3dVcGxvYWRQ +cm9ncmVzcyhmYWxzZSk7CgogICAgICAgIC8vIFByb2Nlc3MgbmV4dCBmaWxlIG9yIGNsb3NlCiAg +ICAgICAgdGhpcy5fcGVuZGluZ0luZGV4Kys7CiAgICAgICAgaWYgKHRoaXMuX3BlbmRpbmdJbmRl +eCA8IHRoaXMuX3BlbmRpbmdGaWxlcy5sZW5ndGgpIHsKICAgICAgICAgICAgdGhpcy5zaG93VXBs +b2FkRGlhbG9nKCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgdGhpcy5jbG9zZVVwbG9h +ZERpYWxvZygpOwogICAgICAgIH0KICAgIH0sCgogICAgaW5zZXJ0SW5saW5lTWVkaWEodXJsLCB0 +eXBlLCB0aXRsZSwgY2FwdGlvbiwgb3B0cywgbWVkaWFJZCkgewogICAgICAgIGNvbnN0IGVkaXRv +cklucHV0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VkaXRvcklucHV0Jyk7CiAgICAgICAg +bGV0IGVsZW1lbnQ7CgogICAgICAgIGlmICh0eXBlID09PSAnaW1hZ2UnICYmIG9wdHMuZGlzcGxh +eU1vZGUgPT09ICdpbmxpbmUnKSB7CiAgICAgICAgICAgIC8vIEltYWdlIGZpZ3VyZQogICAgICAg +ICAgICBjb25zdCBzaXplQ2xhc3MgPSBvcHRzLnNpemUgPT09ICdsYXJnZScgPyAnZHJpdmUtbWVk +aWEtbGFyZ2UnIDogJ2RyaXZlLW1lZGlhLXRodW1ibmFpbCc7CiAgICAgICAgICAgIGNvbnN0IGFs +aWduQ2xhc3MgPSAnZHJpdmUtYWxpZ24tJyArIG9wdHMuYWxpZ247CgogICAgICAgICAgICBlbGVt +ZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZmlndXJlJyk7CiAgICAgICAgICAgIGVsZW1l +bnQuY2xhc3NOYW1lID0gJ2RyaXZlLW1lZGlhICcgKyBzaXplQ2xhc3MgKyAnICcgKyBhbGlnbkNs +YXNzOwogICAgICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZSgnZGF0YS1tZWRpYS1pZCcsIG1l +ZGlhSWQpOwogICAgICAgICAgICBlbGVtZW50LmNvbnRlbnRFZGl0YWJsZSA9ICdmYWxzZSc7Cgog +ICAgICAgICAgICBjb25zdCBpbWcgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbWcnKTsKICAg +ICAgICAgICAgaW1nLnNyYyA9IHVybDsKICAgICAgICAgICAgaW1nLmFsdCA9IHRpdGxlOwogICAg +ICAgICAgICBpbWcuc3R5bGUuY3Vyc29yID0gJ3BvaW50ZXInOwogICAgICAgICAgICBpbWcub25j +bGljayA9IGZ1bmN0aW9uKGUpIHsgZS5wcmV2ZW50RGVmYXVsdCgpOyBlLnN0b3BQcm9wYWdhdGlv +bigpOyBvcGVuTWVkaWFNb2RhbCh1cmwsICdpbWFnZScsIHRpdGxlKTsgfTsKICAgICAgICAgICAg +ZWxlbWVudC5hcHBlbmRDaGlsZChpbWcpOwoKICAgICAgICAgICAgaWYgKGNhcHRpb24pIHsKICAg +ICAgICAgICAgICAgIGNvbnN0IGZpZyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2ZpZ2NhcHRp +b24nKTsKICAgICAgICAgICAgICAgIGZpZy50ZXh0Q29udGVudCA9IGNhcHRpb247CiAgICAgICAg +ICAgICAgICBlbGVtZW50LmFwcGVuZENoaWxkKGZpZyk7CiAgICAgICAgICAgIH0KICAgICAgICB9 +IGVsc2UgaWYgKHR5cGUgPT09ICdwZGYnICYmIG9wdHMuZGlzcGxheU1vZGUgPT09ICdwZGYtbGlu +aycpIHsKICAgICAgICAgICAgZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2Rpdicp +OwogICAgICAgICAgICBlbGVtZW50LmNsYXNzTmFtZSA9ICdkcml2ZS1tZWRpYSBkcml2ZS1tZWRp +YS1wZGYtbGluayBkcml2ZS1hbGlnbi0nICsgb3B0cy5hbGlnbjsKICAgICAgICAgICAgZWxlbWVu +dC5zZXRBdHRyaWJ1dGUoJ2RhdGEtbWVkaWEtaWQnLCBtZWRpYUlkKTsKICAgICAgICAgICAgZWxl +bWVudC5jb250ZW50RWRpdGFibGUgPSAnZmFsc2UnOwogICAgICAgICAgICBlbGVtZW50LmlubmVy +SFRNTCA9ICc8c3BhbiBjbGFzcz0iZHJpdmUtcGRmLWljb24iPlBERjwvc3Bhbj4nICsKICAgICAg +ICAgICAgICAgICc8c3BhbiBjbGFzcz0icGRmLXRpdGxlIj4nICsgRHJpdmVQb3J0YWwuZXNjYXBl +SFRNTCh0aXRsZSkgKyAnPC9zcGFuPic7CiAgICAgICAgICAgIGVsZW1lbnQub25jbGljayA9IGZ1 +bmN0aW9uKGUpIHsgZS5wcmV2ZW50RGVmYXVsdCgpOyBlLnN0b3BQcm9wYWdhdGlvbigpOyBvcGVu +TWVkaWFNb2RhbCh1cmwsICdwZGYnLCB0aXRsZSk7IH07CiAgICAgICAgfSBlbHNlIGlmICh0eXBl +ID09PSAncGRmJyAmJiBvcHRzLmRpc3BsYXlNb2RlID09PSAncGRmLWlmcmFtZScpIHsKICAgICAg +ICAgICAgZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOwogICAgICAgICAg +ICBlbGVtZW50LmNsYXNzTmFtZSA9ICdkcml2ZS1tZWRpYSBkcml2ZS1tZWRpYS1wZGYtaWZyYW1l +IGRyaXZlLWFsaWduLScgKyBvcHRzLmFsaWduOwogICAgICAgICAgICBlbGVtZW50LnNldEF0dHJp +YnV0ZSgnZGF0YS1tZWRpYS1pZCcsIG1lZGlhSWQpOwogICAgICAgICAgICBlbGVtZW50LmNvbnRl +bnRFZGl0YWJsZSA9ICdmYWxzZSc7CiAgICAgICAgICAgIGVsZW1lbnQuaW5uZXJIVE1MID0gJzxp +ZnJhbWUgc3JjPSInICsgRHJpdmVQb3J0YWwuZXNjYXBlQXR0cih1cmwpICsgJyI+PC9pZnJhbWU+ +JyArCiAgICAgICAgICAgICAgICAoY2FwdGlvbiA/ICc8cCBjbGFzcz0iZHJpdmUtbWVkaWEtY2Fw +dGlvbiI+JyArIERyaXZlUG9ydGFsLmVzY2FwZUhUTUwoY2FwdGlvbikgKyAnPC9wPicgOiAnJyk7 +CiAgICAgICAgICAgIGVsZW1lbnQub25jbGljayA9IGZ1bmN0aW9uKGUpIHsgZS5wcmV2ZW50RGVm +YXVsdCgpOyBlLnN0b3BQcm9wYWdhdGlvbigpOyBvcGVuTWVkaWFNb2RhbCh1cmwsICdwZGYnLCB0 +aXRsZSk7IH07CiAgICAgICAgfSBlbHNlIGlmIChvcHRzLmRpc3BsYXlNb2RlID09PSAnbWVkaWEt +aW5saW5lJyAmJiAodHlwZSA9PT0gJ3ZpZGVvJyB8fCB0eXBlID09PSAnYXVkaW8nKSkgewogICAg +ICAgICAgICAvLyBWaWRlby9BdWRpbyBhbHMga2xpY2tiYXJlcyBJY29uLUVsZW1lbnQgaW0gQXJ0 +aWtlbAogICAgICAgICAgICB2YXIgaWNvbiA9IHR5cGUgPT09ICd2aWRlbycgPyAnJiMxMjc5MTA7 +JyA6ICcmIzEyNzkyNTsnOwogICAgICAgICAgICB2YXIgbGFiZWwgPSB0eXBlID09PSAndmlkZW8n +ID8gJ1ZpZGVvJyA6ICdBdWRpbyc7CiAgICAgICAgICAgIGVsZW1lbnQgPSBkb2N1bWVudC5jcmVh +dGVFbGVtZW50KCdkaXYnKTsKICAgICAgICAgICAgZWxlbWVudC5jbGFzc05hbWUgPSAnZHJpdmUt +bWVkaWEgZHJpdmUtbWVkaWEtZW1iZWQgZHJpdmUtYWxpZ24tJyArIG9wdHMuYWxpZ247CiAgICAg +ICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKCdkYXRhLW1lZGlhLWlkJywgbWVkaWFJZCk7CiAg +ICAgICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKCdkYXRhLW1lZGlhLXR5cGUnLCB0eXBlKTsK +ICAgICAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2RhdGEtbWVkaWEtdXJsJywgdXJsKTsK +ICAgICAgICAgICAgZWxlbWVudC5jb250ZW50RWRpdGFibGUgPSAnZmFsc2UnOwogICAgICAgICAg +ICBlbGVtZW50LnRpdGxlID0gbGFiZWwgKyAnIGFic3BpZWxlbjogJyArIHRpdGxlOwogICAgICAg +ICAgICBlbGVtZW50LmlubmVySFRNTCA9ICc8c3BhbiBjbGFzcz0iZHJpdmUtZW1iZWQtaWNvbiBp +Y29uLScgKyB0eXBlICsgJyI+PC9zcGFuPicgKwogICAgICAgICAgICAgICAgJzxzcGFuIGNsYXNz +PSJkcml2ZS1lbWJlZC1sYWJlbCI+JyArIERyaXZlUG9ydGFsLmVzY2FwZUhUTUwodGl0bGUpICsg +Jzwvc3Bhbj4nOwogICAgICAgICAgICBlbGVtZW50Lm9uY2xpY2sgPSBmdW5jdGlvbihlKSB7IGUu +cHJldmVudERlZmF1bHQoKTsgZS5zdG9wUHJvcGFnYXRpb24oKTsgb3Blbk1lZGlhTW9kYWwodXJs +LCB0eXBlLCB0aXRsZSk7IH07CiAgICAgICAgfSBlbHNlIGlmIChvcHRzLmRpc3BsYXlNb2RlID09 +PSAnb2ZmaWNlLWlubGluZScgJiYgKHR5cGUgPT09ICdkb2N4JyB8fCB0eXBlID09PSAneGxzeCcg +fHwgdHlwZSA9PT0gJ3BwdHgnKSkgewogICAgICAgICAgICAvLyBPZmZpY2UtRGF0ZWllbiBhbHMg +a2xpY2tiYXJlcyBJY29uLUVsZW1lbnQgaW0gQXJ0aWtlbAogICAgICAgICAgICBlbGVtZW50ID0g +ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CiAgICAgICAgICAgIGVsZW1lbnQuY2xhc3NO +YW1lID0gJ2RyaXZlLW1lZGlhIGRyaXZlLW1lZGlhLWVtYmVkIGRyaXZlLWFsaWduLScgKyBvcHRz +LmFsaWduOwogICAgICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZSgnZGF0YS1tZWRpYS1pZCcs +IG1lZGlhSWQpOwogICAgICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZSgnZGF0YS1tZWRpYS10 +eXBlJywgdHlwZSk7CiAgICAgICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKCdkYXRhLW1lZGlh +LXVybCcsIHVybCk7CiAgICAgICAgICAgIGVsZW1lbnQuY29udGVudEVkaXRhYmxlID0gJ2ZhbHNl +JzsKICAgICAgICAgICAgZWxlbWVudC50aXRsZSA9IHR5cGUudG9VcHBlckNhc2UoKSArICcgaGVy +dW50ZXJsYWRlbjogJyArIHRpdGxlOwogICAgICAgICAgICBlbGVtZW50LmlubmVySFRNTCA9ICc8 +c3BhbiBjbGFzcz0iZHJpdmUtZW1iZWQtaWNvbiBpY29uLScgKyB0eXBlICsgJyI+PC9zcGFuPicg +KwogICAgICAgICAgICAgICAgJzxzcGFuIGNsYXNzPSJkcml2ZS1lbWJlZC1sYWJlbCI+JyArIERy +aXZlUG9ydGFsLmVzY2FwZUhUTUwodGl0bGUpICsgJzwvc3Bhbj4nOwogICAgICAgICAgICBlbGVt +ZW50Lm9uY2xpY2sgPSBmdW5jdGlvbihlKSB7IGUucHJldmVudERlZmF1bHQoKTsgZS5zdG9wUHJv +cGFnYXRpb24oKTsgb3Blbk1lZGlhTW9kYWwodXJsLCB0eXBlLCB0aXRsZSk7IH07CiAgICAgICAg +fQoKICAgICAgICBpZiAoIWVsZW1lbnQpIHJldHVybjsKCiAgICAgICAgLy8gSW5zZXJ0IGF0IGN1 +cnNvciBwb3NpdGlvbiBvciBhcHBlbmQKICAgICAgICBjb25zdCBzZWwgPSB3aW5kb3cuZ2V0U2Vs +ZWN0aW9uKCk7CiAgICAgICAgaWYgKHRoaXMuX3NhdmVkRWRpdG9yUmFuZ2UgJiYgZWRpdG9ySW5w +dXQuY29udGFpbnModGhpcy5fc2F2ZWRFZGl0b3JSYW5nZS5jb21tb25BbmNlc3RvckNvbnRhaW5l +cikpIHsKICAgICAgICAgICAgc2VsLnJlbW92ZUFsbFJhbmdlcygpOwogICAgICAgICAgICBzZWwu +YWRkUmFuZ2UodGhpcy5fc2F2ZWRFZGl0b3JSYW5nZSk7CiAgICAgICAgICAgIGNvbnN0IHJhbmdl +ID0gc2VsLmdldFJhbmdlQXQoMCk7CiAgICAgICAgICAgIHJhbmdlLmRlbGV0ZUNvbnRlbnRzKCk7 +CiAgICAgICAgICAgIHJhbmdlLmluc2VydE5vZGUoZWxlbWVudCk7CiAgICAgICAgICAgIC8vIFBs +YWNlIGN1cnNvciBhZnRlciBlbGVtZW50CiAgICAgICAgICAgIHJhbmdlLnNldFN0YXJ0QWZ0ZXIo +ZWxlbWVudCk7CiAgICAgICAgICAgIHJhbmdlLmNvbGxhcHNlKHRydWUpOwogICAgICAgICAgICBz +ZWwucmVtb3ZlQWxsUmFuZ2VzKCk7CiAgICAgICAgICAgIHNlbC5hZGRSYW5nZShyYW5nZSk7CiAg +ICAgICAgICAgIHRoaXMuX3NhdmVkRWRpdG9yUmFuZ2UgPSByYW5nZS5jbG9uZVJhbmdlKCk7CiAg +ICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgZWRpdG9ySW5wdXQuYXBwZW5kQ2hpbGQoZWxlbWVu +dCk7CiAgICAgICAgfQogICAgfSwKCiAgICAvLyAtLS0gTWVkaWEgQ29udGV4dCBNZW51IChpbiBF +ZGl0b3IpIC0tLQogICAgX2NvbnRleHRUYXJnZXQ6IG51bGwsCgogICAgLy8gLS0tIFNjaGxhZ3fD +tnJ0ZXIgLS0tCiAgICBQUkVERUZJTkVEX0tFWVdPUkRTOiBbCiAgICAgICAgJ1NvemlhbHZvcnNj +aHJpZnRlbicsICdMYWR1bmdzc2ljaGVydW5nJywgJ8OcYmVybGFkdW5nJywgJ0tPTScsICdHR1ZT +JywKICAgICAgICAnRmFocnpldWd0ZWNobmlrJywgJ1RlY2hLb250cm9sbFZPJywgJ0thYm90YWdl +JywgJ0Rva3VtZW50ZW5mw6Rsc2NodW5nJywKICAgICAgICAnWnVsYXNzdW5nZW4nLCAnWnVsYXNz +dW5nZW4gbmF0aW9uYWwnLCAnWnVsYXNzdW5nZW4gaW50ZXJuYXRpb25hbCcsCiAgICAgICAgJ0Fs +a29ob2wnLCAnQlRNJywgJ0dlc2Nod2luZGlna2VpdCcsICdBYnN0YW5kJywgJ0ZhbHNjaGZhaHJl +cicsCiAgICAgICAgJ1ZlcmZvbGd1bmdzZmFocnQnLCAnVHVubmVsJywgJ1N0w7ZyZmFsbCcsICdG +b3RvZ3JhZmllJywKICAgICAgICAnRm90b2dyYWZpZSBCcsO8Y2tlJywgJ0ZvdG9ncmFmaWUgQmF1 +c3RlbGxlJywgJ0ZvdG9ncmFmaWUgQWJzdGFuZCcsCiAgICAgICAgJ1R1bmluZycsICdWS1InLCAn +U2NobGVwcGVuJywgJ1NjaHJvdHRzYW1tbGVyJwogICAgXSwKICAgIC8vIFVudGVya2F0ZWdvcmll +bjogS2F0ZWdvcmllIC0+IFN1Yi1UYWdzIChmdWVyIEtsYW1tZXJ2ZXJtZXJrIGltIFRpdGVsICsg +QXV0by1UYWcpCiAgICBDQVRFR09SWV9TVUJUQUdTOiB7CiAgICAgICAgJ1p1bGFzc3VuZ2VuJzog +WyduYXRpb25hbCcsICdpbnRlcm5hdGlvbmFsJ10sCiAgICAgICAgJ0ZvdG9ncmFmaWUnOiAgWydC +csO8Y2tlJywgJ0JhdXN0ZWxsZScsICdBYnN0YW5kJ10KICAgIH0sCiAgICBfY3VycmVudEtleXdv +cmRzOiBbXSwKCiAgICBfZ2V0QWxsS25vd25LZXl3b3JkcygpIHsKICAgICAgICBjb25zdCBzZXQg +PSBuZXcgU2V0KHRoaXMuUFJFREVGSU5FRF9LRVlXT1JEUyk7CiAgICAgICAgRHJpdmVGUy5kb2N1 +bWVudHMuZm9yRWFjaChkID0+IChkLnNjaGxhZ3dvZXJ0ZXIgfHwgW10pLmZvckVhY2goayA9PiBz +ZXQuYWRkKGspKSk7CiAgICAgICAgcmV0dXJuIFsuLi5zZXRdLnNvcnQoKGEsIGIpID0+IGEubG9j +YWxlQ29tcGFyZShiLCAnZGUnKSk7CiAgICB9LAoKICAgIF9yZW5kZXJLZXl3b3JkcygpIHsKICAg +ICAgICBjb25zdCBjb250YWluZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZWRpdG9yS2V5 +d29yZHMnKTsKICAgICAgICBjb25zdCBpbnB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdl +ZGl0b3JLZXl3b3JkSW5wdXQnKTsKICAgICAgICBjb250YWluZXIucXVlcnlTZWxlY3RvckFsbCgn +LmtleXdvcmQtcGlsbCcpLmZvckVhY2gocCA9PiBwLnJlbW92ZSgpKTsKICAgICAgICB0aGlzLl9j +dXJyZW50S2V5d29yZHMuZm9yRWFjaCgoa3csIGkpID0+IHsKICAgICAgICAgICAgY29uc3QgcGls +bCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTsKICAgICAgICAgICAgcGlsbC5jbGFz +c05hbWUgPSAna2V5d29yZC1waWxsJzsKICAgICAgICAgICAgcGlsbC5pbm5lckhUTUwgPSBEcml2 +ZVBvcnRhbC5lc2NhcGVIVE1MKGt3KSArICcgPHNwYW4gY2xhc3M9Imt3LXJlbW92ZSIgb25jbGlj +az0iRHJpdmVFZGl0b3IucmVtb3ZlS2V5d29yZCgnICsgaSArICcpIj4mdGltZXM7PC9zcGFuPic7 +CiAgICAgICAgICAgIGNvbnRhaW5lci5pbnNlcnRCZWZvcmUocGlsbCwgaW5wdXQpOwogICAgICAg +IH0pOwogICAgICAgIHRoaXMuX3JlbmRlclN1Z2dlc3Rpb25zKCk7CiAgICB9LAoKICAgIF9yZW5k +ZXJTdWdnZXN0aW9ucygpIHsKICAgICAgICBjb25zdCBwYW5lbCA9IGRvY3VtZW50LmdldEVsZW1l +bnRCeUlkKCdrZXl3b3JkU3VnZ2VzdGlvbnMnKTsKICAgICAgICBpZiAoIXBhbmVsKSByZXR1cm47 +CiAgICAgICAgY29uc3QgY3VycmVudCA9IHRoaXMuX2N1cnJlbnRLZXl3b3JkczsKICAgICAgICBj +b25zdCBkb2MgPSB0aGlzLmN1cnJlbnREb2M7CiAgICAgICAgY29uc3Qga2F0ZWdvcmllID0gZG9j +ID8gZG9jLmthdGVnb3JpZSA6ICcnOwoKICAgICAgICAvLyBBbGxlIGJla2FubnRlbiBTY2hsYWd3 +w7ZydGVyIHNhbW1lbG4gbWl0IEdld2ljaHR1bmcKICAgICAgICB2YXIga3dTY29yZXMgPSB7fTsK +ICAgICAgICBEcml2ZUZTLmRvY3VtZW50cy5mb3JFYWNoKGZ1bmN0aW9uKGQpIHsKICAgICAgICAg +ICAgdmFyIHJlbGV2YW5jZSA9IDE7CiAgICAgICAgICAgIGlmIChkLmthdGVnb3JpZSA9PT0ga2F0 +ZWdvcmllKSByZWxldmFuY2UgPSAzOyAvLyBnbGVpY2hlIEthdGVnb3JpZSA9IGjDtmhlcmUgUmVs +ZXZhbnoKICAgICAgICAgICAgaWYgKGQucGFyZW50SWQgPT09IChkb2MgJiYgZG9jLmlkKSkgcmVs +ZXZhbmNlID0gNDsgLy8gVW50ZXJhcnRpa2VsCiAgICAgICAgICAgIGlmIChkb2MgJiYgZG9jLnBh +cmVudElkICYmIGQuaWQgPT09IGRvYy5wYXJlbnRJZCkgcmVsZXZhbmNlID0gNDsgLy8gw5xiZXJh +cnRpa2VsCiAgICAgICAgICAgIC8vIFRoZW1lbsOkaG5saWNoa2VpdDogZ2VtZWluc2FtZSBTY2hs +YWd3w7ZydGVyCiAgICAgICAgICAgIHZhciBvdmVybGFwID0gKGQuc2NobGFnd29lcnRlciB8fCBb +XSkuZmlsdGVyKGZ1bmN0aW9uKGspIHsgcmV0dXJuIGN1cnJlbnQuaW5jbHVkZXMoayk7IH0pLmxl +bmd0aDsKICAgICAgICAgICAgaWYgKG92ZXJsYXAgPiAwKSByZWxldmFuY2UgKz0gb3ZlcmxhcCAq +IDI7CiAgICAgICAgICAgIChkLnNjaGxhZ3dvZXJ0ZXIgfHwgW10pLmZvckVhY2goZnVuY3Rpb24o +aykgewogICAgICAgICAgICAgICAgaWYgKCFjdXJyZW50LmluY2x1ZGVzKGspKSB7CiAgICAgICAg +ICAgICAgICAgICAga3dTY29yZXNba10gPSAoa3dTY29yZXNba10gfHwgMCkgKyByZWxldmFuY2U7 +CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0pOwoKICAgICAgICAv +LyBWb3JkZWZpbmllcnRlIEtleXdvcmRzIGFscyBCYXNpcy1Wb3JzY2hsw6RnZSBtaXQgbmllZHJp +Z2VyIEdld2ljaHR1bmcKICAgICAgICB0aGlzLlBSRURFRklORURfS0VZV09SRFMuZm9yRWFjaChm +dW5jdGlvbihrKSB7CiAgICAgICAgICAgIGlmICghY3VycmVudC5pbmNsdWRlcyhrKSAmJiAha3dT +Y29yZXNba10pIGt3U2NvcmVzW2tdID0gMC41OwogICAgICAgIH0pOwogICAgICAgIC8vIFVudGVy +a2F0ZWdvcmllLVN1Yi1UYWdzIGRlciBha3R1ZWxsZW4gS2F0ZWdvcmllIGhvY2ggcHJpb3Jpc2ll +cmVuCiAgICAgICAgdmFyIGNhdFN1YnMgPSB0aGlzLkNBVEVHT1JZX1NVQlRBR1Nba2F0ZWdvcmll +XSB8fCBbXTsKICAgICAgICBjYXRTdWJzLmZvckVhY2goZnVuY3Rpb24ocykgewogICAgICAgICAg +ICBpZiAoIWN1cnJlbnQuaW5jbHVkZXMocykpIGt3U2NvcmVzW3NdID0gKGt3U2NvcmVzW3NdIHx8 +IDApICsgNTsKICAgICAgICB9KTsKICAgICAgICB2YXIgc29ydGVkID0gT2JqZWN0LmVudHJpZXMo +a3dTY29yZXMpLnNvcnQoZnVuY3Rpb24oYSxiKXsgcmV0dXJuIGJbMV0gLSBhWzFdOyB9KS5zbGlj +ZSgwLCAxNSk7CgogICAgICAgIGlmIChzb3J0ZWQubGVuZ3RoID09PSAwKSB7CiAgICAgICAgICAg +IHBhbmVsLmlubmVySFRNTCA9ICcnOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAg +ICAgICBwYW5lbC5pbm5lckhUTUwgPSAnPHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMHB4O2NvbG9y +OnZhcigtLXRleHQtbXV0ZWQpO21hcmdpbi1yaWdodDo0cHg7Ij5Wb3JzY2hsw6RnZTo8L3NwYW4+ +JyArCiAgICAgICAgICAgIHNvcnRlZC5tYXAoZnVuY3Rpb24oa3YpIHsKICAgICAgICAgICAgICAg +IHJldHVybiAnPHNwYW4gY2xhc3M9ImtleXdvcmQtc3VnZ2VzdGlvbiIgb25jbGljaz0iRHJpdmVF +ZGl0b3IuYWRkS2V5d29yZChcJycgKyBEcml2ZVBvcnRhbC5lc2NhcGVBdHRyKGt2WzBdKSArICdc +JykiPicgKyBEcml2ZVBvcnRhbC5lc2NhcGVIVE1MKGt2WzBdKSArICc8L3NwYW4+JzsKICAgICAg +ICAgICAgfSkuam9pbignJyk7CiAgICB9LAoKICAgIGFkZEtleXdvcmQod29yZCkgewogICAgICAg +IHdvcmQgPSB3b3JkLnRyaW0oKTsKICAgICAgICBpZiAoIXdvcmQgfHwgdGhpcy5fY3VycmVudEtl +eXdvcmRzLmluY2x1ZGVzKHdvcmQpKSByZXR1cm47CiAgICAgICAgdGhpcy5fY3VycmVudEtleXdv +cmRzLnB1c2god29yZCk7CiAgICAgICAgdGhpcy5fcmVuZGVyS2V5d29yZHMoKTsKICAgICAgICBk +b2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZWRpdG9yS2V5d29yZElucHV0JykudmFsdWUgPSAnJzsK +ICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgna2V5d29yZEF1dG9jb21wbGV0ZScpLmNs +YXNzTGlzdC5yZW1vdmUoJ2FjdGl2ZScpOwogICAgfSwKCiAgICByZW1vdmVLZXl3b3JkKGluZGV4 +KSB7CiAgICAgICAgdGhpcy5fY3VycmVudEtleXdvcmRzLnNwbGljZShpbmRleCwgMSk7CiAgICAg +ICAgdGhpcy5fcmVuZGVyS2V5d29yZHMoKTsKICAgIH0sCgogICAgX3NldHVwS2V5d29yZElucHV0 +KCkgewogICAgICAgIGNvbnN0IGlucHV0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VkaXRv +cktleXdvcmRJbnB1dCcpOwogICAgICAgIGNvbnN0IGFjID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5 +SWQoJ2tleXdvcmRBdXRvY29tcGxldGUnKTsKICAgICAgICBpbnB1dC5vbmtleWRvd24gPSAoZSkg +PT4gewogICAgICAgICAgICBpZiAoZS5rZXkgPT09ICdFbnRlcicgfHwgZS5rZXkgPT09ICcsJykg +ewogICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICAgICAgdGhp +cy5hZGRLZXl3b3JkKGlucHV0LnZhbHVlLnJlcGxhY2UoJywnLCAnJykpOwogICAgICAgICAgICB9 +IGVsc2UgaWYgKGUua2V5ID09PSAnQmFja3NwYWNlJyAmJiAhaW5wdXQudmFsdWUgJiYgdGhpcy5f +Y3VycmVudEtleXdvcmRzLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgICAgIHRoaXMucmVtb3Zl +S2V5d29yZCh0aGlzLl9jdXJyZW50S2V5d29yZHMubGVuZ3RoIC0gMSk7CiAgICAgICAgICAgIH0K +ICAgICAgICB9OwogICAgICAgIGlucHV0Lm9uaW5wdXQgPSAoKSA9PiB7CiAgICAgICAgICAgIGNv +bnN0IHEgPSBpbnB1dC52YWx1ZS50b0xvd2VyQ2FzZSgpLnRyaW0oKTsKICAgICAgICAgICAgaWYg +KHEubGVuZ3RoIDwgMSkgeyBhYy5jbGFzc0xpc3QucmVtb3ZlKCdhY3RpdmUnKTsgcmV0dXJuOyB9 +CiAgICAgICAgICAgIGNvbnN0IGtub3duID0gdGhpcy5fZ2V0QWxsS25vd25LZXl3b3JkcygpLmZp +bHRlcihrID0+CiAgICAgICAgICAgICAgICBrLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMocSkgJiYg +IXRoaXMuX2N1cnJlbnRLZXl3b3Jkcy5pbmNsdWRlcyhrKQogICAgICAgICAgICApLnNsaWNlKDAs +IDgpOwogICAgICAgICAgICBpZiAoa25vd24ubGVuZ3RoID09PSAwKSB7IGFjLmNsYXNzTGlzdC5y +ZW1vdmUoJ2FjdGl2ZScpOyByZXR1cm47IH0KICAgICAgICAgICAgYWMuaW5uZXJIVE1MID0ga25v +d24ubWFwKGsgPT4KICAgICAgICAgICAgICAgICc8ZGl2IGNsYXNzPSJrZXl3b3JkLWF1dG9jb21w +bGV0ZS1pdGVtIiBvbm1vdXNlZG93bj0iRHJpdmVFZGl0b3IuYWRkS2V5d29yZChcJycgKyBEcml2 +ZVBvcnRhbC5lc2NhcGVBdHRyKGspICsgJ1wnKSI+JyArIERyaXZlUG9ydGFsLmVzY2FwZUhUTUwo +aykgKyAnPC9kaXY+JwogICAgICAgICAgICApLmpvaW4oJycpOwogICAgICAgICAgICBhYy5jbGFz +c0xpc3QuYWRkKCdhY3RpdmUnKTsKICAgICAgICB9OwogICAgICAgIGlucHV0Lm9uYmx1ciA9ICgp +ID0+IHNldFRpbWVvdXQoKCkgPT4gYWMuY2xhc3NMaXN0LnJlbW92ZSgnYWN0aXZlJyksIDIwMCk7 +CiAgICB9LAoKICAgIF9zZWxlY3RlZEJsb2NrOiBudWxsLAoKICAgIF9zZWxlY3RCbG9jayhibG9j +aykgewogICAgICAgIHRoaXMuX2Rlc2VsZWN0QmxvY2soKTsKICAgICAgICB0aGlzLl9zZWxlY3Rl +ZEJsb2NrID0gYmxvY2s7CiAgICAgICAgYmxvY2suc3R5bGUub3V0bGluZSA9ICcycHggc29saWQg +dmFyKC0tdGV4dC1oZWFkaW5nKSc7CiAgICAgICAgYmxvY2suc3R5bGUub3V0bGluZU9mZnNldCA9 +ICcycHgnOwogICAgfSwKCiAgICBfZGVzZWxlY3RCbG9jaygpIHsKICAgICAgICBpZiAodGhpcy5f +c2VsZWN0ZWRCbG9jaykgewogICAgICAgICAgICB0aGlzLl9zZWxlY3RlZEJsb2NrLnN0eWxlLm91 +dGxpbmUgPSAnJzsKICAgICAgICAgICAgdGhpcy5fc2VsZWN0ZWRCbG9jay5zdHlsZS5vdXRsaW5l +T2Zmc2V0ID0gJyc7CiAgICAgICAgICAgIHRoaXMuX3NlbGVjdGVkQmxvY2sgPSBudWxsOwogICAg +ICAgIH0KICAgIH0sCgogICAgc2V0dXBFZGl0b3JNZWRpYUV2ZW50cygpIHsKICAgICAgICBjb25z +dCBlZGl0b3JJbnB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlZGl0b3JJbnB1dCcpOwog +ICAgICAgIGNvbnN0IHNlbGYgPSB0aGlzOwoKICAgICAgICBlZGl0b3JJbnB1dC5hZGRFdmVudExp +c3RlbmVyKCdjbGljaycsIChlKSA9PiB7CiAgICAgICAgICAgIGNvbnN0IG1lZGlhID0gZS50YXJn +ZXQuY2xvc2VzdCgnLmRyaXZlLW1lZGlhJyk7CiAgICAgICAgICAgIGlmIChtZWRpYSAmJiBlZGl0 +b3JJbnB1dC5jb250YWlucyhtZWRpYSkpIHsKICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1 +bHQoKTsKICAgICAgICAgICAgICAgIHRoaXMuc2hvd0NvbnRleHRNZW51KG1lZGlhLCBlKTsKICAg +ICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gS2xpY2sg +YXVmIEFjY29yZGlvbiwgRkFRLCBUYWJlbGxlOiBtYXJraWVyZW4KICAgICAgICAgICAgdmFyIGJs +b2NrID0gZS50YXJnZXQuY2xvc2VzdCgnLmRyaXZlLWFjY29yZGlvbiwgLmRyaXZlLWZhcSwgLmRy +aXZlLXRhYmxlLXdyYXAsIC5kcml2ZS1pbmZvYm94LCBoci5kcml2ZS1kaXZpZGVyJyk7CiAgICAg +ICAgICAgIGlmIChibG9jayAmJiBlZGl0b3JJbnB1dC5jb250YWlucyhibG9jaykpIHsKICAgICAg +ICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgIHRoaXMuX3NlbGVj +dEJsb2NrKGJsb2NrKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHRoaXMu +X2Rlc2VsZWN0QmxvY2soKTsKICAgICAgICAgICAgICAgIHRoaXMuaGlkZUNvbnRleHRNZW51KCk7 +CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKCiAgICAgICAgLy8gQmFja3NwYWNlL0RlbGV0ZSBs +b2VzY2h0IG1hcmtpZXJ0ZW4gQmxvY2sKICAgICAgICBlZGl0b3JJbnB1dC5hZGRFdmVudExpc3Rl +bmVyKCdrZXlkb3duJywgZnVuY3Rpb24oZSkgewogICAgICAgICAgICBpZiAoc2VsZi5fc2VsZWN0 +ZWRCbG9jayAmJiAoZS5rZXkgPT09ICdCYWNrc3BhY2UnIHx8IGUua2V5ID09PSAnRGVsZXRlJykp +IHsKICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgIHNl +bGYuX3NlbGVjdGVkQmxvY2sucmVtb3ZlKCk7CiAgICAgICAgICAgICAgICBzZWxmLl9zZWxlY3Rl +ZEJsb2NrID0gbnVsbDsKICAgICAgICAgICAgICAgIHNlbGYuc2F2ZVN0YXRlKCk7CiAgICAgICAg +ICAgIH0KICAgICAgICB9KTsKICAgIH0sCgogICAgc2hvd0NvbnRleHRNZW51KGVsZW1lbnQsIGV2 +ZW50KSB7CiAgICAgICAgdGhpcy5fY29udGV4dFRhcmdldCA9IGVsZW1lbnQ7CiAgICAgICAgY29u +c3QgbWVudSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtZWRpYUNvbnRleHRNZW51Jyk7CiAg +ICAgICAgY29uc3QgcmVjdCA9IGVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7CgogICAg +ICAgIG1lbnUuc3R5bGUudG9wID0gKHJlY3QuYm90dG9tICsgd2luZG93LnNjcm9sbFkgKyA1KSAr +ICdweCc7CiAgICAgICAgbWVudS5zdHlsZS5sZWZ0ID0gTWF0aC5taW4ocmVjdC5sZWZ0ICsgd2lu +ZG93LnNjcm9sbFgsIHdpbmRvdy5pbm5lcldpZHRoIC0gMjAwKSArICdweCc7CiAgICAgICAgbWVu +dS5jbGFzc0xpc3QuYWRkKCdhY3RpdmUnKTsKCiAgICAgICAgLy8gSGlnaGxpZ2h0IGN1cnJlbnQg +YWxpZ25tZW50CiAgICAgICAgY29uc3QgY3VycmVudEFsaWduID0gZWxlbWVudC5jbGFzc0xpc3Qu +Y29udGFpbnMoJ2RyaXZlLWFsaWduLWxlZnQnKSA/ICdsZWZ0JwogICAgICAgICAgICA6IGVsZW1l +bnQuY2xhc3NMaXN0LmNvbnRhaW5zKCdkcml2ZS1hbGlnbi1yaWdodCcpID8gJ3JpZ2h0JyA6ICdj +ZW50ZXInOwogICAgICAgIG1lbnUucXVlcnlTZWxlY3RvckFsbCgnLm1lZGlhLWNvbnRleHQtZ3Jv +dXAgYnV0dG9uJykuZm9yRWFjaChidG4gPT4gewogICAgICAgICAgICBidG4uY2xhc3NMaXN0LnRv +Z2dsZSgnYWN0aXZlJywgYnRuLmdldEF0dHJpYnV0ZSgnZGF0YS1hbGlnbicpID09PSBjdXJyZW50 +QWxpZ24pOwogICAgICAgIH0pOwogICAgfSwKCiAgICBoaWRlQ29udGV4dE1lbnUoKSB7CiAgICAg +ICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21lZGlhQ29udGV4dE1lbnUnKS5jbGFzc0xpc3Qu +cmVtb3ZlKCdhY3RpdmUnKTsKICAgICAgICB0aGlzLl9jb250ZXh0VGFyZ2V0ID0gbnVsbDsKICAg +IH0sCgogICAgY29udGV4dEFsaWduKGFsaWduKSB7CiAgICAgICAgaWYgKCF0aGlzLl9jb250ZXh0 +VGFyZ2V0KSByZXR1cm47CiAgICAgICAgdGhpcy5fY29udGV4dFRhcmdldC5jbGFzc0xpc3QucmVt +b3ZlKCdkcml2ZS1hbGlnbi1sZWZ0JywgJ2RyaXZlLWFsaWduLWNlbnRlcicsICdkcml2ZS1hbGln +bi1yaWdodCcpOwogICAgICAgIHRoaXMuX2NvbnRleHRUYXJnZXQuY2xhc3NMaXN0LmFkZCgnZHJp +dmUtYWxpZ24tJyArIGFsaWduKTsKCiAgICAgICAgLy8gVXBkYXRlIG1lZGlhIG1ldGFkYXRhCiAg +ICAgICAgY29uc3QgbWVkaWFJZCA9IHRoaXMuX2NvbnRleHRUYXJnZXQuZ2V0QXR0cmlidXRlKCdk +YXRhLW1lZGlhLWlkJyk7CiAgICAgICAgaWYgKG1lZGlhSWQgJiYgdGhpcy5jdXJyZW50RG9jKSB7 +CiAgICAgICAgICAgIGNvbnN0IG1lZGlhID0gKHRoaXMuY3VycmVudERvYy5tZWRpYXMgfHwgW10p +LmZpbmQobSA9PiBtLm1lZGlhSWQgPT09IG1lZGlhSWQpOwogICAgICAgICAgICBpZiAobWVkaWEp +IG1lZGlhLmFsaWdubWVudCA9IGFsaWduOwogICAgICAgIH0KCiAgICAgICAgdGhpcy5oaWRlQ29u +dGV4dE1lbnUoKTsKICAgIH0sCgogICAgY29udGV4dEVkaXRDYXB0aW9uKCkgewogICAgICAgIGlm +ICghdGhpcy5fY29udGV4dFRhcmdldCkgcmV0dXJuOwogICAgICAgIGNvbnN0IGZpZ2NhcHRpb24g +PSB0aGlzLl9jb250ZXh0VGFyZ2V0LnF1ZXJ5U2VsZWN0b3IoJ2ZpZ2NhcHRpb24sIC5kcml2ZS1t +ZWRpYS1jYXB0aW9uJyk7CiAgICAgICAgY29uc3QgY3VycmVudCA9IGZpZ2NhcHRpb24gPyBmaWdj +YXB0aW9uLnRleHRDb250ZW50IDogJyc7CiAgICAgICAgY29uc3QgbmV3Q2FwdGlvbiA9IHByb21w +dCgnVW50ZXJ0aXRlbCBiZWFyYmVpdGVuOicsIGN1cnJlbnQpOwogICAgICAgIGlmIChuZXdDYXB0 +aW9uID09PSBudWxsKSByZXR1cm47CgogICAgICAgIGlmIChmaWdjYXB0aW9uKSB7CiAgICAgICAg +ICAgIGlmIChuZXdDYXB0aW9uKSB7IGZpZ2NhcHRpb24udGV4dENvbnRlbnQgPSBuZXdDYXB0aW9u +OyB9CiAgICAgICAgICAgIGVsc2UgeyBmaWdjYXB0aW9uLnJlbW92ZSgpOyB9CiAgICAgICAgfSBl +bHNlIGlmIChuZXdDYXB0aW9uKSB7CiAgICAgICAgICAgIGNvbnN0IGNhcCA9IGRvY3VtZW50LmNy +ZWF0ZUVsZW1lbnQoJ2ZpZ2NhcHRpb24nKTsKICAgICAgICAgICAgY2FwLnRleHRDb250ZW50ID0g +bmV3Q2FwdGlvbjsKICAgICAgICAgICAgdGhpcy5fY29udGV4dFRhcmdldC5hcHBlbmRDaGlsZChj +YXApOwogICAgICAgIH0KCiAgICAgICAgLy8gVXBkYXRlIG1ldGFkYXRhCiAgICAgICAgY29uc3Qg +bWVkaWFJZCA9IHRoaXMuX2NvbnRleHRUYXJnZXQuZ2V0QXR0cmlidXRlKCdkYXRhLW1lZGlhLWlk +Jyk7CiAgICAgICAgaWYgKG1lZGlhSWQgJiYgdGhpcy5jdXJyZW50RG9jKSB7CiAgICAgICAgICAg +IGNvbnN0IG1lZGlhID0gKHRoaXMuY3VycmVudERvYy5tZWRpYXMgfHwgW10pLmZpbmQobSA9PiBt +Lm1lZGlhSWQgPT09IG1lZGlhSWQpOwogICAgICAgICAgICBpZiAobWVkaWEpIG1lZGlhLmRlc2Ny +aXB0aW9uID0gbmV3Q2FwdGlvbjsKICAgICAgICB9CgogICAgICAgIHRoaXMuaGlkZUNvbnRleHRN +ZW51KCk7CiAgICB9LAoKICAgIGNvbnRleHRSZW1vdmUoKSB7CiAgICAgICAgaWYgKCF0aGlzLl9j +b250ZXh0VGFyZ2V0KSByZXR1cm47CiAgICAgICAgY29uc3QgbWVkaWFJZCA9IHRoaXMuX2NvbnRl +eHRUYXJnZXQuZ2V0QXR0cmlidXRlKCdkYXRhLW1lZGlhLWlkJyk7CiAgICAgICAgaWYgKG1lZGlh +SWQgJiYgdGhpcy5jdXJyZW50RG9jICYmIHRoaXMuY3VycmVudERvYy5tZWRpYXMpIHsKICAgICAg +ICAgICAgY29uc3QgaWR4ID0gdGhpcy5jdXJyZW50RG9jLm1lZGlhcy5maW5kSW5kZXgobSA9PiBt +Lm1lZGlhSWQgPT09IG1lZGlhSWQpOwogICAgICAgICAgICBpZiAoaWR4ID49IDApIHsKICAgICAg +ICAgICAgICAgIGNvbnN0IG1lZGlhID0gdGhpcy5jdXJyZW50RG9jLm1lZGlhc1tpZHhdOwogICAg +ICAgICAgICAgICAgLy8gRGF0ZWkgYXVmIGRlbSBTZXJ2ZXIgbG9lc2NoZW4KICAgICAgICAgICAg +ICAgIGlmIChtZWRpYS51cmwgJiYgRHJpdmVGUy5tb2RlID09PSAnc2VydmVyJykgewogICAgICAg +ICAgICAgICAgICAgIGZldGNoKCcvYXBpL2RlbGV0ZScsIHsKICAgICAgICAgICAgICAgICAgICAg +ICAgbWV0aG9kOiAnUE9TVCcsCiAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcnM6IHsgJ0Nv +bnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uOyBjaGFyc2V0PXV0Zi04JyB9LAogICAgICAg +ICAgICAgICAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IHBhdGg6IG1lZGlhLnVybCB9 +KQogICAgICAgICAgICAgICAgICAgIH0pLmNhdGNoKCgpID0+IHt9KTsKICAgICAgICAgICAgICAg +IH0KICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudERvYy5tZWRpYXMuc3BsaWNlKGlkeCwgMSk7 +CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgdGhpcy5fY29udGV4dFRhcmdldC5yZW1v +dmUoKTsKICAgICAgICB0aGlzLl9yZW5kZXJNZWRpYUxpc3QoKTsKICAgICAgICB0aGlzLmhpZGVD +b250ZXh0TWVudSgpOwogICAgICAgIHNob3dUb2FzdCgnTWVkaXVtIGVudGZlcm50JywgJ3N1Y2Nl +c3MnKTsKICAgIH0sCgogICAgLy8gLS0tIE1lZGllbi1WZXJ3YWx0dW5nIGltIEVkaXRvciAtLS0K +ICAgIHRvZ2dsZU1lZGlhUGFuZWwoKSB7CiAgICAgICAgY29uc3QgcGFuZWwgPSBkb2N1bWVudC5n +ZXRFbGVtZW50QnlJZCgnZWRpdG9yTWVkaWFQYW5lbCcpOwogICAgICAgIGlmIChwYW5lbC5zdHls +ZS5kaXNwbGF5ID09PSAnbm9uZScpIHsKICAgICAgICAgICAgdGhpcy5fcmVuZGVyTWVkaWFMaXN0 +KCk7CiAgICAgICAgICAgIHBhbmVsLnN0eWxlLmRpc3BsYXkgPSAnJzsKICAgICAgICB9IGVsc2Ug +ewogICAgICAgICAgICBwYW5lbC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOwogICAgICAgIH0KICAg +IH0sCgogICAgX3JlbmRlck1lZGlhTGlzdCgpIHsKICAgICAgICBjb25zdCBjb250YWluZXIgPSBk +b2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZWRpdG9yTWVkaWFMaXN0Jyk7CiAgICAgICAgY29uc3Qg +cGFuZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZWRpdG9yTWVkaWFQYW5lbCcpOwogICAg +ICAgIGlmICghY29udGFpbmVyIHx8ICF0aGlzLmN1cnJlbnREb2MpIHJldHVybjsKICAgICAgICBj +b25zdCBtZWRpYXMgPSB0aGlzLmN1cnJlbnREb2MubWVkaWFzIHx8IFtdOwoKICAgICAgICBpZiAo +bWVkaWFzLmxlbmd0aCA9PT0gMCkgewogICAgICAgICAgICBjb250YWluZXIuaW5uZXJIVE1MID0g +JzxkaXYgc3R5bGU9ImZvbnQtc2l6ZToxMnB4OyBjb2xvcjp2YXIoLS10ZXh0LW11dGVkKTsgcGFk +ZGluZzo4cHggMDsgdGV4dC1hbGlnbjpjZW50ZXI7IGxpbmUtaGVpZ2h0OjEuODsiPicgKwogICAg +ICAgICAgICAgICAgJ05vY2gga2VpbmUgRGF0ZWllbiBob2NoZ2VsYWRlbi48YnI+JyArCiAgICAg +ICAgICAgICAgICAnPGJ1dHRvbiBvbmNsaWNrPSJEcml2ZUVkaXRvci5zaG93VXBsb2FkTW9kYWwo +KSIgc3R5bGU9Im1hcmdpbi10b3A6NHB4O3BhZGRpbmc6NHB4IDE0cHg7Ym9yZGVyOjFweCBkYXNo +ZWQgdmFyKC0tYm9yZGVyLWNvbG9yKTtib3JkZXItcmFkaXVzOjRweDtiYWNrZ3JvdW5kOm5vbmU7 +Y3Vyc29yOnBvaW50ZXI7Zm9udC1zaXplOjEycHg7Y29sb3I6dmFyKC0tdGV4dC1oZWFkaW5nKTsi +PkRhdGVpZW4gaG9jaGxhZGVuPC9idXR0b24+JyArCiAgICAgICAgICAgICc8L2Rpdj4nOwogICAg +ICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICBjb250YWluZXIuaW5uZXJIVE1MID0g +bWVkaWFzLm1hcCgobSwgaSkgPT4gewogICAgICAgICAgICBjb25zdCB0eXBlID0gKG0udHlwZSB8 +fCAnZmlsZScpLnRvVXBwZXJDYXNlKCk7CiAgICAgICAgICAgIGNvbnN0IHRpdGxlID0gRHJpdmVQ +b3J0YWwuZXNjYXBlSFRNTChtLnRpdGxlIHx8IG0udXJsLnNwbGl0KCcvJykucG9wKCkpOwogICAg +ICAgICAgICBjb25zdCBkZXNjID0gbS5kZXNjcmlwdGlvbiA/IERyaXZlUG9ydGFsLmVzY2FwZUhU +TUwobS5kZXNjcmlwdGlvbikgOiAnJzsKICAgICAgICAgICAgY29uc3QgbW9kZSA9IG0uZGlzcGxh +eU1vZGUgPT09ICdpbmxpbmUnID8gJ0lubGluZScgOiBtLmRpc3BsYXlNb2RlID09PSAncGRmLWlm +cmFtZScgPyAnRWluZ2ViZXR0ZXQnIDogJ0FuaGFuZyc7CiAgICAgICAgICAgIHJldHVybiAnPGRp +diBzdHlsZT0iZGlzcGxheTpmbGV4OyBhbGlnbi1pdGVtczpjZW50ZXI7IGdhcDo4cHg7IHBhZGRp +bmc6NHB4IDA7IGJvcmRlci1ib3R0b206MXB4IHNvbGlkIHZhcigtLWJvcmRlci1saWdodCk7IGZv +bnQtc2l6ZToxMnB4OyI+JyArCiAgICAgICAgICAgICAgICAnPHNwYW4gc3R5bGU9ImZvbnQtd2Vp +Z2h0OjYwMDsgY29sb3I6dmFyKC0tdGV4dC1oZWFkaW5nKTsgbWluLXdpZHRoOjQwcHg7Ij4nICsg +dHlwZSArICc8L3NwYW4+JyArCiAgICAgICAgICAgICAgICAnPHNwYW4gc3R5bGU9ImZsZXg6MTsg +b3ZlcmZsb3c6aGlkZGVuOyB0ZXh0LW92ZXJmbG93OmVsbGlwc2lzOyB3aGl0ZS1zcGFjZTpub3dy +YXA7IiB0aXRsZT0iJyArIERyaXZlUG9ydGFsLmVzY2FwZUF0dHIobS51cmwpICsgJyI+JyArIHRp +dGxlICsgJzwvc3Bhbj4nICsKICAgICAgICAgICAgICAgICc8c3BhbiBzdHlsZT0iY29sb3I6dmFy +KC0tdGV4dC1tdXRlZCk7IGZvbnQtc2l6ZToxMHB4OyI+JyArIG1vZGUgKyAnPC9zcGFuPicgKwog +ICAgICAgICAgICAgICAgJzxidXR0b24gb25jbGljaz0iRHJpdmVFZGl0b3IuZWRpdE1lZGlhKCcg +KyBpICsgJykiIHN0eWxlPSJiYWNrZ3JvdW5kOm5vbmU7IGJvcmRlcjoxcHggc29saWQgdmFyKC0t +Ym9yZGVyLWNvbG9yKTsgYm9yZGVyLXJhZGl1czozcHg7IHBhZGRpbmc6MXB4IDZweDsgZm9udC1z +aXplOjExcHg7IGN1cnNvcjpwb2ludGVyOyBjb2xvcjp2YXIoLS10ZXh0LXByaW1hcnkpOyI+QmVh +cmJlaXRlbjwvYnV0dG9uPicgKwogICAgICAgICAgICAgICAgJzxidXR0b24gb25jbGljaz0iRHJp +dmVFZGl0b3IucmVtb3ZlTWVkaWEoJyArIGkgKyAnKSIgc3R5bGU9ImJhY2tncm91bmQ6bm9uZTsg +Ym9yZGVyOjFweCBzb2xpZCAjZGMzNTQ1OyBib3JkZXItcmFkaXVzOjNweDsgcGFkZGluZzoxcHgg +NnB4OyBmb250LXNpemU6MTFweDsgY3Vyc29yOnBvaW50ZXI7IGNvbG9yOiNkYzM1NDU7Ij5Mw7Zz +Y2hlbjwvYnV0dG9uPicgKwogICAgICAgICAgICAnPC9kaXY+JzsKICAgICAgICB9KS5qb2luKCcn +KTsKICAgIH0sCgogICAgZWRpdE1lZGlhKGluZGV4KSB7CiAgICAgICAgaWYgKCF0aGlzLmN1cnJl +bnREb2MgfHwgIXRoaXMuY3VycmVudERvYy5tZWRpYXMgfHwgIXRoaXMuY3VycmVudERvYy5tZWRp +YXNbaW5kZXhdKSByZXR1cm47CiAgICAgICAgY29uc3QgbWVkaWEgPSB0aGlzLmN1cnJlbnREb2Mu +bWVkaWFzW2luZGV4XTsKCiAgICAgICAgY29uc3QgbmV3VGl0bGUgPSBwcm9tcHQoJ1RpdGVsOics +IG1lZGlhLnRpdGxlIHx8ICcnKTsKICAgICAgICBpZiAobmV3VGl0bGUgPT09IG51bGwpIHJldHVy +bjsKICAgICAgICBtZWRpYS50aXRsZSA9IG5ld1RpdGxlOwoKICAgICAgICBjb25zdCBuZXdEZXNj +ID0gcHJvbXB0KCdCZXNjaHJlaWJ1bmc6JywgbWVkaWEuZGVzY3JpcHRpb24gfHwgJycpOwogICAg +ICAgIGlmIChuZXdEZXNjID09PSBudWxsKSByZXR1cm47CiAgICAgICAgbWVkaWEuZGVzY3JpcHRp +b24gPSBuZXdEZXNjOwoKICAgICAgICAvLyBJbmxpbmUtTWVkaWVuIGltIEVkaXRvciBha3R1YWxp +c2llcmVuIChmaWdjYXB0aW9uKQogICAgICAgIGlmIChtZWRpYS5tZWRpYUlkKSB7CiAgICAgICAg +ICAgIGNvbnN0IGZpZ3VyZSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNlZGl0b3JJbnB1dCBb +ZGF0YS1tZWRpYS1pZD0iJyArIG1lZGlhLm1lZGlhSWQgKyAnIl0nKTsKICAgICAgICAgICAgaWYg +KGZpZ3VyZSkgewogICAgICAgICAgICAgICAgbGV0IGNhcCA9IGZpZ3VyZS5xdWVyeVNlbGVjdG9y +KCdmaWdjYXB0aW9uJyk7CiAgICAgICAgICAgICAgICBpZiAobmV3RGVzYykgewogICAgICAgICAg +ICAgICAgICAgIGlmICghY2FwKSB7IGNhcCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2ZpZ2Nh +cHRpb24nKTsgZmlndXJlLmFwcGVuZENoaWxkKGNhcCk7IH0KICAgICAgICAgICAgICAgICAgICBj +YXAudGV4dENvbnRlbnQgPSBuZXdEZXNjOwogICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjYXAp +IHsKICAgICAgICAgICAgICAgICAgICBjYXAucmVtb3ZlKCk7CiAgICAgICAgICAgICAgICB9CiAg +ICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHRoaXMuX3JlbmRlck1lZGlhTGlzdCgpOwog +ICAgICAgIHNob3dUb2FzdCgnQW5oYW5nIGFrdHVhbGlzaWVydCcsICdzdWNjZXNzJyk7CiAgICB9 +LAoKICAgIHJlbW92ZU1lZGlhKGluZGV4KSB7CiAgICAgICAgaWYgKCF0aGlzLmN1cnJlbnREb2Mg +fHwgIXRoaXMuY3VycmVudERvYy5tZWRpYXMgfHwgIXRoaXMuY3VycmVudERvYy5tZWRpYXNbaW5k +ZXhdKSByZXR1cm47CiAgICAgICAgY29uc3QgbWVkaWEgPSB0aGlzLmN1cnJlbnREb2MubWVkaWFz +W2luZGV4XTsKICAgICAgICBjb25zdCBuYW1lID0gbWVkaWEudGl0bGUgfHwgbWVkaWEudXJsLnNw +bGl0KCcvJykucG9wKCk7CgogICAgICAgIC8vIEJlc3RhZXRpZ3VuZ3NkaWFsb2cgYWxzIE1vZGFs +IChzdGF0dCBicm93c2VyLW5hdGl2ZW0gY29uZmlybSkKICAgICAgICB2YXIgb3ZlcmxheSA9IGRv +Y3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOwogICAgICAgIG92ZXJsYXkuc3R5bGUuY3NzVGV4 +dCA9ICdwb3NpdGlvbjpmaXhlZDtpbnNldDowO3otaW5kZXg6MTEwMDA7YmFja2dyb3VuZDpyZ2Jh +KDAsMCwwLDAuNSk7ZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtqdXN0aWZ5LWNvbnRl +bnQ6Y2VudGVyOyc7CiAgICAgICAgdmFyIG1vZGFsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgn +ZGl2Jyk7CiAgICAgICAgbW9kYWwuc3R5bGUuY3NzVGV4dCA9ICdiYWNrZ3JvdW5kOnZhcigtLWJn +LWNhcmQsI2ZmZik7Ym9yZGVyLXJhZGl1czoxMHB4O3BhZGRpbmc6MjRweDttYXgtd2lkdGg6NDAw +cHg7d2lkdGg6OTAlO2JveC1zaGFkb3c6MCA4cHggMzJweCByZ2JhKDAsMCwwLDAuMjUpO3RleHQt +YWxpZ246Y2VudGVyOyc7CiAgICAgICAgbW9kYWwuaW5uZXJIVE1MID0KICAgICAgICAgICAgJzxk +aXYgc3R5bGU9ImZvbnQtc2l6ZTozMnB4O21hcmdpbi1ib3R0b206OHB4OyI+JiMxMjg0NjU7PC9k +aXY+JyArCiAgICAgICAgICAgICc8ZGl2IHN0eWxlPSJjb2xvcjp2YXIoLS10ZXh0LWhlYWRpbmcp +O2ZvbnQtc2l6ZToxNXB4O2ZvbnQtd2VpZ2h0OjYwMDttYXJnaW4tYm90dG9tOjhweDsiPkFuaGFu +ZyBlbnRmZXJuZW4/PC9kaXY+JyArCiAgICAgICAgICAgICc8ZGl2IHN0eWxlPSJjb2xvcjp2YXIo +LS10ZXh0LXByaW1hcnkpO2ZvbnQtc2l6ZToxM3B4O21hcmdpbi1ib3R0b206MThweDsiPjxzdHJv +bmc+JyArIERyaXZlUG9ydGFsLmVzY2FwZUhUTUwobmFtZSkgKyAnPC9zdHJvbmc+IHdpcmQgYXVz +IGRlbSBBcnRpa2VsIHVuZCB2b20gU2VydmVyIGdlbG9lc2NodC48L2Rpdj4nICsKICAgICAgICAg +ICAgJzxkaXYgc3R5bGU9ImRpc3BsYXk6ZmxleDtnYXA6OHB4O2p1c3RpZnktY29udGVudDpjZW50 +ZXI7Ij4nICsKICAgICAgICAgICAgICAgICc8YnV0dG9uIGlkPSJybU1lZGlhQ2FuY2VsIiBzdHls +ZT0icGFkZGluZzo4cHggMjBweDtib3JkZXItcmFkaXVzOjZweDtib3JkZXI6MXB4IHNvbGlkIHZh +cigtLWJvcmRlci1jb2xvcik7YmFja2dyb3VuZDp2YXIoLS1iZy1jYXJkKTtjb2xvcjp2YXIoLS10 +ZXh0LXByaW1hcnkpO2N1cnNvcjpwb2ludGVyO2ZvbnQtc2l6ZToxM3B4OyI+QWJicmVjaGVuPC9i +dXR0b24+JyArCiAgICAgICAgICAgICAgICAnPGJ1dHRvbiBpZD0icm1NZWRpYUNvbmZpcm0iIHN0 +eWxlPSJwYWRkaW5nOjhweCAyMHB4O2JvcmRlci1yYWRpdXM6NnB4O2JvcmRlcjpub25lO2JhY2tn +cm91bmQ6I2RjMzU0NTtjb2xvcjojZmZmO2N1cnNvcjpwb2ludGVyO2ZvbnQtd2VpZ2h0OjYwMDtm +b250LXNpemU6MTNweDsiPkVudGZlcm5lbjwvYnV0dG9uPicgKwogICAgICAgICAgICAnPC9kaXY+ +JzsKICAgICAgICBvdmVybGF5LmFwcGVuZENoaWxkKG1vZGFsKTsKICAgICAgICBkb2N1bWVudC5i +b2R5LmFwcGVuZENoaWxkKG92ZXJsYXkpOwoKICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CiAgICAg +ICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3JtTWVkaWFDYW5jZWwnKS5vbmNsaWNrID0gZnVu +Y3Rpb24oKSB7IG92ZXJsYXkucmVtb3ZlKCk7IH07CiAgICAgICAgb3ZlcmxheS5vbmNsaWNrID0g +ZnVuY3Rpb24oZSkgeyBpZiAoZS50YXJnZXQgPT09IG92ZXJsYXkpIG92ZXJsYXkucmVtb3ZlKCk7 +IH07CiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3JtTWVkaWFDb25maXJtJykub25j +bGljayA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICBvdmVybGF5LnJlbW92ZSgpOwoKICAgICAg +ICAgICAgLy8gSW5saW5lLUVsZW1lbnQgYXVzIEVkaXRvciBlbnRmZXJuZW4KICAgICAgICAgICAg +aWYgKG1lZGlhLm1lZGlhSWQpIHsKICAgICAgICAgICAgICAgIHZhciBmaWd1cmUgPSBkb2N1bWVu +dC5xdWVyeVNlbGVjdG9yKCcjZWRpdG9ySW5wdXQgW2RhdGEtbWVkaWEtaWQ9IicgKyBtZWRpYS5t +ZWRpYUlkICsgJyJdJyk7CiAgICAgICAgICAgICAgICBpZiAoZmlndXJlKSBmaWd1cmUucmVtb3Zl +KCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIERhdGVpIGF1ZiBkZW0gU2VydmVyIGxv +ZXNjaGVuCiAgICAgICAgICAgIGlmIChtZWRpYS51cmwgJiYgRHJpdmVGUy5tb2RlID09PSAnc2Vy +dmVyJykgewogICAgICAgICAgICAgICAgZmV0Y2goJy9hcGkvZGVsZXRlJywgewogICAgICAgICAg +ICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLAogICAgICAgICAgICAgICAgICAgIGhlYWRlcnM6IHsg +J0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uOyBjaGFyc2V0PXV0Zi04JyB9LAogICAg +ICAgICAgICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgcGF0aDogbWVkaWEudXJsIH0p +CiAgICAgICAgICAgICAgICB9KS5jYXRjaChmdW5jdGlvbigpIHt9KTsKICAgICAgICAgICAgfQoK +ICAgICAgICAgICAgc2VsZi5jdXJyZW50RG9jLm1lZGlhcy5zcGxpY2UoaW5kZXgsIDEpOwogICAg +ICAgICAgICBzZWxmLl9yZW5kZXJNZWRpYUxpc3QoKTsKICAgICAgICAgICAgc2hvd1RvYXN0KCci +JyArIG5hbWUgKyAnIiBlbnRmZXJudCcsICdzdWNjZXNzJyk7CiAgICAgICAgfTsKICAgIH0sCgog +ICAgLy8gLS0tIFBlc3NpbWlzdGljIExvY2tpbmcgLS0tCiAgICBhc3luYyBhY3F1aXJlTG9jayhk +b2NJZCkgewogICAgICAgIGlmIChEcml2ZUZTLm1vZGUgPT09ICdzZXJ2ZXInKSB7CiAgICAgICAg +ICAgIHRyeSB7CiAgICAgICAgICAgICAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaCgnL2FwaS9s +b2NrJywgewogICAgICAgICAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLAogICAgICAgICAgICAg +ICAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uOyBjaGFy +c2V0PXV0Zi04JyB9LAogICAgICAgICAgICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsg +ZG9jSWQ6IGRvY0lkIH0pCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIGlmIChy +ZXMub2spIHJldHVybiB7IG9rOiB0cnVlIH07CiAgICAgICAgICAgICAgICBjb25zdCBkYXRhID0g +YXdhaXQgcmVzLmpzb24oKTsKICAgICAgICAgICAgICAgIHJldHVybiB7IG9rOiBmYWxzZSwgYnk6 +IGRhdGEuYnkgfHwgJ1VuYmVrYW5udCcsIG1pbnV0ZXM6IGRhdGEubWludXRlcyB8fCAnPycgfTsK +ICAgICAgICAgICAgfSBjYXRjaCB7CiAgICAgICAgICAgICAgICAvLyBLZWluIFNlcnZlciBvZGVy +IEZlaGxlcjogTG9jayB1ZWJlcnNwcmluZ2VuCiAgICAgICAgICAgICAgICByZXR1cm4geyBvazog +dHJ1ZSB9OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8vIEZpbGVzeXN0ZW0tTW9k +dXM6IEtlaW4gTG9ja2luZyAoU2luZ2xlLVVzZXItU3plbmFyaW8pCiAgICAgICAgcmV0dXJuIHsg +b2s6IHRydWUgfTsKICAgIH0sCgogICAgYXN5bmMgcmVsZWFzZUxvY2soZG9jSWQpIHsKICAgICAg +ICBpZiAoRHJpdmVGUy5tb2RlID09PSAnc2VydmVyJykgewogICAgICAgICAgICB0cnkgewogICAg +ICAgICAgICAgICAgYXdhaXQgZmV0Y2goJy9hcGkvdW5sb2NrJywgewogICAgICAgICAgICAgICAg +ICAgIG1ldGhvZDogJ1BPU1QnLAogICAgICAgICAgICAgICAgICAgIGhlYWRlcnM6IHsgJ0NvbnRl +bnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uOyBjaGFyc2V0PXV0Zi04JyB9LAogICAgICAgICAg +ICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgZG9jSWQ6IGRvY0lkIH0pCiAgICAgICAg +ICAgICAgICB9KTsKICAgICAgICAgICAgfSBjYXRjaCB7fQogICAgICAgIH0KICAgIH0sCgogICAg +Ly8gLS0tIENvbnRyaWJ1dGlvbiBUeXBlIERpYWxvZyAtLS0KICAgIHNob3dDb250cmliRGlhbG9n +KCkgewogICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb250cmliRGlhbG9nJykuY2xh +c3NMaXN0LmFkZCgnYWN0aXZlJyk7CiAgICB9LAoKICAgIGNsb3NlQ29udHJpYkRpYWxvZygpIHsK +ICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29udHJpYkRpYWxvZycpLmNsYXNzTGlz +dC5yZW1vdmUoJ2FjdGl2ZScpOwogICAgfSwKCiAgICBzZXRDb250cmliVHlwZSh0eXBlKSB7CiAg +ICAgICAgdGhpcy5fcGVuZGluZ0NvbnRyaWJUeXBlID0gdHlwZTsKICAgICAgICB0aGlzLmNsb3Nl +Q29udHJpYkRpYWxvZygpOwogICAgICAgIC8vIFNhdmUtUHJvemVzcyBmb3J0c2V0emVuIChjbG9z +ZUFmdGVyIGF1cyB2b3JoZXJpZ2VtIEF1ZnJ1ZiB1ZWJlcm5laG1lbikKICAgICAgICB0aGlzLnNh +dmUodGhpcy5fcGVuZGluZ0Nsb3NlQWZ0ZXIpOwogICAgICAgIHRoaXMuX3BlbmRpbmdDbG9zZUFm +dGVyID0gZmFsc2U7CiAgICB9Cn07CgovLyA9PT09PT09PT09PT09PT09PT09PT0gTUVESUEgTU9E +QUwgPT09PT09PT09PT09PT09PT09PT09CgovLyA9PT09PT09PT09PT09PT09PT09PT0gVU5JVkVS +U0FMIE1FRElBIE1PREFMID09PT09PT09PT09PT09PT09PT09PQoKZnVuY3Rpb24gb3Blbk1lZGlh +TW9kYWwodXJsLCB0eXBlLCB0aXRsZSkgewogICAgY29uc3QgbW9kYWwgPSBkb2N1bWVudC5nZXRF +bGVtZW50QnlJZCgnbWVkaWFNb2RhbCcpOwogICAgY29uc3QgY29udGFpbmVyID0gZG9jdW1lbnQu +Z2V0RWxlbWVudEJ5SWQoJ21lZGlhTW9kYWxDb250YWluZXInKTsKICAgIGNvbnN0IHNhZmVVcmwg +PSBEcml2ZVBvcnRhbC5lc2NhcGVBdHRyKHVybCk7CiAgICBjb25zdCBzYWZlVGl0bGUgPSBEcml2 +ZVBvcnRhbC5lc2NhcGVIVE1MKHRpdGxlIHx8IHVybC5zcGxpdCgnLycpLnBvcCgpKTsKICAgIGxl +dCBjb250ZW50ID0gJyc7CiAgICBsZXQgdG9vbGJhciA9ICcnOwoKICAgIHN3aXRjaCAodHlwZSkg +ewogICAgICAgIGNhc2UgJ2ltYWdlJzoKICAgICAgICAgICAgY29udGVudCA9ICc8aW1nIHNyYz0i +JyArIHNhZmVVcmwgKyAnIiBhbHQ9IicgKyBEcml2ZVBvcnRhbC5lc2NhcGVBdHRyKHRpdGxlIHx8 +ICcnKSArICciIG9uY2xpY2s9InRoaXMuY2xhc3NMaXN0LnRvZ2dsZShcJ3pvb21lZFwnKSI+JzsK +ICAgICAgICAgICAgdG9vbGJhciA9ICc8YnV0dG9uIG9uY2xpY2s9ImRvY3VtZW50LnF1ZXJ5U2Vs +ZWN0b3IoXCcjbWVkaWFNb2RhbENvbnRhaW5lciBpbWdcJykuY2xhc3NMaXN0LnRvZ2dsZShcJ3pv +b21lZFwnKSI+Wm9vbTwvYnV0dG9uPicgKwogICAgICAgICAgICAgICAgICAgICAgICc8YSBocmVm +PSInICsgc2FmZVVybCArICciIGRvd25sb2FkPkhlcnVudGVybGFkZW48L2E+JyArCiAgICAgICAg +ICAgICAgICAgICAgICAgJzxidXR0b24gb25jbGljaz0id2luZG93Lm9wZW4oXCcnICsgc2FmZVVy +bCArICdcJyxcJ19ibGFua1wnKSI+SW4gbmV1ZW0gVGFiPC9idXR0b24+JzsKICAgICAgICAgICAg +YnJlYWs7CiAgICAgICAgY2FzZSAncGRmJzoKICAgICAgICAgICAgLy8gUERGOiBNYXhpbWFsZSBC +cmVpdGUgdW5kIEhvZWhlIGZ1ZXIgZ3V0ZSBMZXNiYXJrZWl0CiAgICAgICAgICAgIHZhciBtYyA9 +IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5tZWRpYS1tb2RhbC1jb250ZW50Jyk7CiAgICAgICAg +ICAgIG1jLnN0eWxlLm1heFdpZHRoID0gJzk1dncnOwogICAgICAgICAgICBtYy5zdHlsZS53aWR0 +aCA9ICcxMjAwcHgnOwogICAgICAgICAgICBtYy5zdHlsZS5tYXhIZWlnaHQgPSAnOTV2aCc7CiAg +ICAgICAgICAgIG1jLnN0eWxlLnBhZGRpbmcgPSAnMTJweCc7CiAgICAgICAgICAgIGNvbnRlbnQg +PSAnPGlmcmFtZSBzcmM9IicgKyBzYWZlVXJsICsgJyIgc3R5bGU9IndpZHRoOjEwMCU7aGVpZ2h0 +Ojgydmg7Ym9yZGVyOm5vbmU7Ym9yZGVyLXJhZGl1czo0cHg7YmFja2dyb3VuZDp3aGl0ZTsiPjwv +aWZyYW1lPic7CiAgICAgICAgICAgIHRvb2xiYXIgPSAnPGEgaHJlZj0iJyArIHNhZmVVcmwgKyAn +IiBkb3dubG9hZD5IZXJ1bnRlcmxhZGVuPC9hPicgKwogICAgICAgICAgICAgICAgICAgICAgICc8 +YnV0dG9uIG9uY2xpY2s9IndpbmRvdy5vcGVuKFwnJyArIHNhZmVVcmwgKyAnXCcsXCdfYmxhbmtc +JykiPkluIG5ldWVtIFRhYjwvYnV0dG9uPic7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNh +c2UgJ3ZpZGVvJzoKICAgICAgICAgICAgY29udGVudCA9ICc8dmlkZW8gY29udHJvbHMgYXV0b3Bs +YXkgc3R5bGU9Im1heC13aWR0aDoxMDAlO21heC1oZWlnaHQ6NzB2aDtib3JkZXItcmFkaXVzOjhw +eDsiPicgKwogICAgICAgICAgICAgICAgICAgICAgICc8c291cmNlIHNyYz0iJyArIHNhZmVVcmwg +KyAnIj48L3ZpZGVvPic7CiAgICAgICAgICAgIHRvb2xiYXIgPSAnPGEgaHJlZj0iJyArIHNhZmVV +cmwgKyAnIiBkb3dubG9hZD5IZXJ1bnRlcmxhZGVuPC9hPic7CiAgICAgICAgICAgIGJyZWFrOwog +ICAgICAgIGNhc2UgJ2F1ZGlvJzoKICAgICAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3Rvcign +Lm1lZGlhLW1vZGFsLWNvbnRlbnQnKS5zdHlsZS5tYXhXaWR0aCA9ICc2MDBweCc7CiAgICAgICAg +ICAgIGNvbnRlbnQgPSAnPGRpdiBzdHlsZT0idGV4dC1hbGlnbjpjZW50ZXI7cGFkZGluZzoxNnB4 +IDA7Ij4nICsKICAgICAgICAgICAgICAgICAgICAgICAnPGRpdiBzdHlsZT0iZm9udC1zaXplOjQ4 +cHg7bWFyZ2luLWJvdHRvbToxMnB4OyI+JiMxMjc5MjU7PC9kaXY+PC9kaXY+JyArCiAgICAgICAg +ICAgICAgICAgICAgICAgJzxkaXYgc3R5bGU9ImJhY2tncm91bmQ6I2ZmZjtib3JkZXItcmFkaXVz +OjMwcHg7cGFkZGluZzo2cHggMTBweDt3aWR0aDoxMDAlOyI+JyArCiAgICAgICAgICAgICAgICAg +ICAgICAgJzxhdWRpbyBjb250cm9scyBhdXRvcGxheSBzcmM9IicgKyBzYWZlVXJsICsgJyIgc3R5 +bGU9ImRpc3BsYXk6YmxvY2s7d2lkdGg6MTAwJTtoZWlnaHQ6NDBweDtmaWx0ZXI6bm9uZTsiPjwv +YXVkaW8+PC9kaXY+JzsKICAgICAgICAgICAgdG9vbGJhciA9ICc8YSBocmVmPSInICsgc2FmZVVy +bCArICciIGRvd25sb2FkPkhlcnVudGVybGFkZW48L2E+JzsKICAgICAgICAgICAgYnJlYWs7CiAg +ICAgICAgY2FzZSAnZG9jeCc6IGNhc2UgJ3hsc3gnOiBjYXNlICdwcHR4JzoKICAgICAgICAgICAg +dmFyIHR5cGVMYWJlbCA9IHR5cGUudG9VcHBlckNhc2UoKTsKICAgICAgICAgICAgY29udGVudCA9 +ICc8ZGl2IHN0eWxlPSJ0ZXh0LWFsaWduOmNlbnRlcjtwYWRkaW5nOjMwcHggMDsiPicgKwogICAg +ICAgICAgICAgICAgICAgICAgICc8c3BhbiBjbGFzcz0iZHJpdmUtZmlsZS1pY29uICcgKyB0eXBl +ICsgJyIgc3R5bGU9IndpZHRoOjgwcHg7aGVpZ2h0OjgwcHg7Zm9udC1zaXplOjI0cHg7bWFyZ2lu +OjAgYXV0byAxNXB4OyI+JyArIHR5cGVMYWJlbCArICc8L3NwYW4+JyArCiAgICAgICAgICAgICAg +ICAgICAgICAgJzxwIHN0eWxlPSJjb2xvcjp2YXIoLS10ZXh0LXNlY29uZGFyeSk7bWFyZ2luLXRv +cDoxMHB4OyI+RGllc2VzIERva3VtZW50IGthbm4gbnVyIGxva2FsIGdlb2VmZm5ldCB3ZXJkZW4u +PC9wPjwvZGl2Pic7CiAgICAgICAgICAgIHRvb2xiYXIgPSAnPGEgaHJlZj0iJyArIHNhZmVVcmwg +KyAnIiBkb3dubG9hZD5IZXJ1bnRlcmxhZGVuPC9hPic7CiAgICAgICAgICAgIGJyZWFrOwogICAg +ICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIGNvbnRlbnQgPSAnPGRpdiBzdHlsZT0idGV4dC1hbGln +bjpjZW50ZXI7cGFkZGluZzozMHB4IDA7Zm9udC1zaXplOjY0cHg7Ij4mIzEyODE5Njs8L2Rpdj4n +OwogICAgICAgICAgICB0b29sYmFyID0gJzxhIGhyZWY9IicgKyBzYWZlVXJsICsgJyIgZG93bmxv +YWQ+SGVydW50ZXJsYWRlbjwvYT4nOwogICAgfQoKICAgIGNvbnRhaW5lci5pbm5lckhUTUwgPQog +ICAgICAgICc8ZGl2IGNsYXNzPSJtZWRpYS1tb2RhbC10aXRsZSI+JyArIHNhZmVUaXRsZSArICc8 +L2Rpdj4nICsKICAgICAgICBjb250ZW50ICsKICAgICAgICAnPGRpdiBjbGFzcz0ibWVkaWEtbW9k +YWwtdG9vbGJhciI+JyArIHRvb2xiYXIgKyAnPC9kaXY+JzsKCiAgICBtb2RhbC5zdHlsZS5kaXNw +bGF5ID0gJ2Jsb2NrJzsKICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCBt +ZWRpYU1vZGFsS2V5SGFuZGxlcik7Cn0KCmZ1bmN0aW9uIGNsb3NlTWVkaWFNb2RhbCgpIHsKICAg +IGNvbnN0IG1vZGFsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21lZGlhTW9kYWwnKTsKICAg +IG1vZGFsLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7CiAgICAvLyBNb2RhbC1TdHlsZXMgenVydWVj +a3NldHplbiAoUERGL0F1ZGlvIHNldHplbiBlaWdlbmUgR3JvZXNzZW4pCiAgICB2YXIgbWMgPSBt +b2RhbC5xdWVyeVNlbGVjdG9yKCcubWVkaWEtbW9kYWwtY29udGVudCcpOwogICAgaWYgKG1jKSB7 +IG1jLnN0eWxlLm1heFdpZHRoID0gJyc7IG1jLnN0eWxlLndpZHRoID0gJyc7IG1jLnN0eWxlLm1h +eEhlaWdodCA9ICcnOyBtYy5zdHlsZS5wYWRkaW5nID0gJyc7IH0KICAgIC8vIEF1ZGlvL1ZpZGVv +IHN0b3BwZW4KICAgIG1vZGFsLnF1ZXJ5U2VsZWN0b3JBbGwoJ3ZpZGVvLCBhdWRpbycpLmZvckVh +Y2goZWwgPT4geyBlbC5wYXVzZSgpOyBlbC5zcmMgPSAnJzsgfSk7CiAgICBkb2N1bWVudC5yZW1v +dmVFdmVudExpc3RlbmVyKCdrZXlkb3duJywgbWVkaWFNb2RhbEtleUhhbmRsZXIpOwp9CgpmdW5j +dGlvbiBtZWRpYU1vZGFsS2V5SGFuZGxlcihlKSB7CiAgICBpZiAoZS5rZXkgPT09ICdFc2NhcGUn +KSBjbG9zZU1lZGlhTW9kYWwoKTsKfQoKLy8gPT09PT09PT09PT09PT09PT09PT09IEdPVkVSTkFO +Q0UgPT09PT09PT09PT09PT09PT09PT09CgovLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09 +PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQovLyBNb2R1 +bDogRHJpdmVHb3Zlcm5hbmNlIC0gUm9sbGVuLCBGcmVpZ2FiZS1Xb3JrZmxvdywgQWRtaW4tUGFu +ZWwKLy8gWnVzdGFlbmRpZyBmdWVyOiBMYWRlbiBkZXIgR292ZXJuYW5jZS1EYXRlbiwgQmVyZWNo +dGlndW5nc3BydWVmdW5nLCBSZXZpZXctVUksIEF1ZGl0LVRyYWlsCi8vIFNpY2hlcmhlaXQ6IENs +aWVudC1zZWl0aWdlIEJlcmVjaHRpZ3VuZ3NwcnVlZnVuZ2VuIChjYW5BcHByb3ZlLCBjYW5TZWVE +b2N1bWVudCwgaXNTdXBlclVzZXIpCi8vICAgICAgICAgICAgIHN0ZXVlcm4gbnVyIGRpZSBVSS1E +YXJzdGVsbHVuZy4gRGllIHRhdHNhZWNobGljaGUgQXV0b3Jpc2llcnVuZyBlcmZvbGd0IHNlcnZl +cnNlaXRpZwovLyAgICAgICAgICAgICBpbiBzZXJ2ZXIucHMxIC8gc2VydmVyLnB5IChUZXN0LVN1 +cGVyVXNlciwgVGVzdC1SZXZpZXdlcikgYmVpIGplZGVtIFNjaHJlaWJ6dWdyaWZmLgovLyAgICAg +ICAgICAgICBnb3Zlcm5hbmNlLmpzb24gaXN0IGltIFNlcnZlci1Nb2R1cyBBRVMtMjU2LXZlcnNj +aGx1ZXNzZWx0IChzaWVoZSBzZXJ2ZXIucHMxKS4KLy8gPT09PT09PT09PT09PT09PT09PT09PT09 +PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KY29u +c3QgRHJpdmVHb3Zlcm5hbmNlID0gewogICAgZGF0YTogbnVsbCwKICAgIGN1cnJlbnRVc2VyOiBu +dWxsLAogICAgY3VycmVudERvbWFpbjogbnVsbCwKICAgIF9pc1N1cGVyVXNlcjogZmFsc2UsCiAg +ICBfcmV2aWV3RGlhbG9nQ2FsbGJhY2s6IG51bGwsCiAgICBfcmV2aWV3RGlhbG9nQWN0aW9uOiBu +dWxsLAogICAgX2VkaXRpbmdSZXZpZXdlckluZGV4OiAtMSwKCiAgICBhc3luYyBsb2FkKCkgewog +ICAgICAgIHRyeSB7CiAgICAgICAgICAgIGlmIChEcml2ZUZTLm1vZGUgPT09ICdzZXJ2ZXInKSB7 +CiAgICAgICAgICAgICAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaCgnL2FwaS9nb3Zlcm5hbmNl +Jyk7CiAgICAgICAgICAgICAgICBpZiAocmVzLm9rKSB7CiAgICAgICAgICAgICAgICAgICAgY29u +c3QgcmVzdWx0ID0gYXdhaXQgcmVzLmpzb24oKTsKICAgICAgICAgICAgICAgICAgICB0aGlzLmRh +dGEgPSByZXN1bHQuZ292ZXJuYW5jZTsKICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRV +c2VyID0gcmVzdWx0LmN1cnJlbnRVc2VyOwogICAgICAgICAgICAgICAgICAgIHRoaXMuY3VycmVu +dERvbWFpbiA9IHJlc3VsdC5jdXJyZW50RG9tYWluOwogICAgICAgICAgICAgICAgICAgIHRoaXMu +X2lzU3VwZXJVc2VyID0gcmVzdWx0LmlzU3VwZXJVc2VyOwogICAgICAgICAgICAgICAgICAgIHRo +aXMudXBkYXRlVUkoKTsKICAgICAgICAgICAgICAgICAgICB0aGlzLmxvYWRIZWxwQ29udGVudCgp +OwogICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMubG9hZFN0YXJ0c2VpdGUoKTsKICAgICAg +ICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAg +ICAgICB9IGNhdGNoIHt9CgogICAgICAgIC8vIFN0YXRpc2NoZXIgTW9kdXM6IEdvdmVybmFuY2Ug +YXVzIGVpbmdlYmV0dGV0ZW4gRGF0ZW4gbGFkZW4KICAgICAgICBpZiAoRHJpdmVGUy5tb2RlID09 +PSAnc3RhdGljJykgewogICAgICAgICAgICBpZiAodHlwZW9mIERSSVZFX1NUQVRJQ19JTkRFWCAh +PT0gJ3VuZGVmaW5lZCcgJiYgRFJJVkVfU1RBVElDX0lOREVYICYmIERSSVZFX1NUQVRJQ19JTkRF +WC5nb3Zlcm5hbmNlKSB7CiAgICAgICAgICAgICAgICAvLyBMZXNiYXJlIEdvdmVybmFuY2UtRGF0 +ZW4gYXVzIGluZGV4LmpzIChTZXR0aW5ncyArIFJldmlld2VyLUluZm8pCiAgICAgICAgICAgICAg +ICB0aGlzLmRhdGEgPSBEUklWRV9TVEFUSUNfSU5ERVguZ292ZXJuYW5jZTsKICAgICAgICAgICAg +fQogICAgICAgIH0KCiAgICAgICAgLy8gRmlsZXN5c3RlbS1Nb2R1czogZ292ZXJuYW5jZS5qc29u +IGF1cyBIYW5kbGUgbGFkZW4KICAgICAgICBpZiAoRHJpdmVGUy5tb2RlID09PSAnZmlsZXN5c3Rl +bScgJiYgRHJpdmVGUy5fZGF0YUhhbmRsZSkgewogICAgICAgICAgICB0cnkgewogICAgICAgICAg +ICAgICAgY29uc3QgZmggPSBhd2FpdCBEcml2ZUZTLl9kYXRhSGFuZGxlLmdldEZpbGVIYW5kbGUo +J2dvdmVybmFuY2UuanNvbicpOwogICAgICAgICAgICAgICAgY29uc3QgZmlsZSA9IGF3YWl0IGZo +LmdldEZpbGUoKTsKICAgICAgICAgICAgICAgIHRoaXMuZGF0YSA9IEpTT04ucGFyc2UoYXdhaXQg +ZmlsZS50ZXh0KCkpOwogICAgICAgICAgICB9IGNhdGNoIHt9CiAgICAgICAgfQoKICAgICAgICB0 +aGlzLmN1cnJlbnRVc2VyID0gRHJpdmVGUy5lbnZpcm9uID8gRHJpdmVGUy5lbnZpcm9uLnVzZXJu +YW1lIDogbnVsbDsKICAgICAgICB0aGlzLmN1cnJlbnREb21haW4gPSBEcml2ZUZTLmVudmlyb24g +PyAoRHJpdmVGUy5lbnZpcm9uLnVzZXJkb21haW4gfHwgJyonKSA6ICcqJzsKICAgICAgICB0aGlz +Ll9pc1N1cGVyVXNlciA9IHRoaXMuX2NoZWNrU3VwZXJVc2VyKCk7CiAgICAgICAgdGhpcy51cGRh +dGVVSSgpOwogICAgICAgIHRoaXMubG9hZEhlbHBDb250ZW50KCk7CiAgICAgICAgYXdhaXQgdGhp +cy5sb2FkU3RhcnRzZWl0ZSgpOwogICAgfSwKCiAgICBfY2hlY2tTdXBlclVzZXIoKSB7CiAgICAg +ICAgaWYgKCF0aGlzLmRhdGEgfHwgIXRoaXMuZGF0YS5zdXBlclVzZXJzKSByZXR1cm4gdHJ1ZTsg +Ly8gS2VpbiBHb3Zlcm5hbmNlID0gYWxsZXMgZXJsYXVidAogICAgICAgIGNvbnN0IHVzZXIgPSAo +dGhpcy5jdXJyZW50VXNlciB8fCAnJykudG9Mb3dlckNhc2UoKTsKICAgICAgICBjb25zdCBkb21h +aW4gPSAodGhpcy5jdXJyZW50RG9tYWluIHx8ICcnKS50b0xvd2VyQ2FzZSgpOwogICAgICAgIHJl +dHVybiB0aGlzLmRhdGEuc3VwZXJVc2Vycy5zb21lKHN1ID0+CiAgICAgICAgICAgIHN1LnVzZXJu +YW1lLnRvTG93ZXJDYXNlKCkgPT09IHVzZXIgJiYgKHN1LmRvbWFpbiA9PT0gJyonIHx8IHN1LmRv +bWFpbi50b0xvd2VyQ2FzZSgpID09PSBkb21haW4pCiAgICAgICAgKTsKICAgIH0sCgogICAgaXNT +dXBlclVzZXIoKSB7IHJldHVybiB0aGlzLl9pc1N1cGVyVXNlcjsgfSwKCiAgICBpc0ZhY2hhdWZz +aWNodCgpIHsKICAgICAgICBpZiAoIXRoaXMuZGF0YSB8fCAhdGhpcy5kYXRhLmZhY2hhdWZzaWNo +dCkgcmV0dXJuIGZhbHNlOwogICAgICAgIHZhciB1c2VyID0gKHRoaXMuY3VycmVudFVzZXIgfHwg +JycpLnRvTG93ZXJDYXNlKCk7CiAgICAgICAgdmFyIGRvbWFpbiA9ICh0aGlzLmN1cnJlbnREb21h +aW4gfHwgJycpLnRvTG93ZXJDYXNlKCk7CiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YS5mYWNoYXVm +c2ljaHQuc29tZShmdW5jdGlvbihmYSkgewogICAgICAgICAgICByZXR1cm4gZmEudXNlcm5hbWUu +dG9Mb3dlckNhc2UoKSA9PT0gdXNlciAmJiAoZmEuZG9tYWluID09PSAnKicgfHwgZmEuZG9tYWlu +LnRvTG93ZXJDYXNlKCkgPT09IGRvbWFpbik7CiAgICAgICAgfSk7CiAgICB9LAoKICAgIGlzUmV2 +aWV3ZXIoa2F0ZWdvcmllKSB7CiAgICAgICAgaWYgKCF0aGlzLmRhdGEgfHwgIXRoaXMuZGF0YS5y +ZXZpZXdlcnMpIHJldHVybiBmYWxzZTsKICAgICAgICBjb25zdCB1c2VyID0gKHRoaXMuY3VycmVu +dFVzZXIgfHwgJycpLnRvTG93ZXJDYXNlKCk7CiAgICAgICAgY29uc3QgZG9tYWluID0gKHRoaXMu +Y3VycmVudERvbWFpbiB8fCAnJykudG9Mb3dlckNhc2UoKTsKICAgICAgICByZXR1cm4gdGhpcy5k +YXRhLnJldmlld2Vycy5zb21lKHIgPT4KICAgICAgICAgICAgci51c2VybmFtZS50b0xvd2VyQ2Fz +ZSgpID09PSB1c2VyICYmCiAgICAgICAgICAgIChyLmRvbWFpbiA9PT0gJyonIHx8IHIuZG9tYWlu +LnRvTG93ZXJDYXNlKCkgPT09IGRvbWFpbikgJiYKICAgICAgICAgICAgci5rYXRlZ29yaWVuICYm +IHIua2F0ZWdvcmllbi5pbmNsdWRlcyhrYXRlZ29yaWUpCiAgICAgICAgKTsKICAgIH0sCgogICAg +Z2V0UmV2aWV3YWJsZUNhdGVnb3JpZXMoKSB7CiAgICAgICAgaWYgKCF0aGlzLmRhdGEgfHwgIXRo +aXMuZGF0YS5yZXZpZXdlcnMpIHJldHVybiBbXTsKICAgICAgICBjb25zdCBjYXRzID0gW107CiAg +ICAgICAgY29uc3QgdXNlciA9ICh0aGlzLmN1cnJlbnRVc2VyIHx8ICcnKS50b0xvd2VyQ2FzZSgp +OwogICAgICAgIGNvbnN0IGRvbWFpbiA9ICh0aGlzLmN1cnJlbnREb21haW4gfHwgJycpLnRvTG93 +ZXJDYXNlKCk7CiAgICAgICAgdGhpcy5kYXRhLnJldmlld2Vycy5mb3JFYWNoKHIgPT4gewogICAg +ICAgICAgICBpZiAoci51c2VybmFtZS50b0xvd2VyQ2FzZSgpID09PSB1c2VyICYmIChyLmRvbWFp +biA9PT0gJyonIHx8IHIuZG9tYWluLnRvTG93ZXJDYXNlKCkgPT09IGRvbWFpbikpIHsKICAgICAg +ICAgICAgICAgIChyLmthdGVnb3JpZW4gfHwgW10pLmZvckVhY2goayA9PiB7IGlmICghY2F0cy5p +bmNsdWRlcyhrKSkgY2F0cy5wdXNoKGspOyB9KTsKICAgICAgICAgICAgfQogICAgICAgIH0pOwog +ICAgICAgIHJldHVybiBjYXRzOwogICAgfSwKCiAgICAvLyBTaWNodGJhcmtlaXRzZmlsdGVyIChy +ZWluIGNsaWVudC1zZWl0aWcsIHN0ZXVlcnQgVUktRGFyc3RlbGx1bmcpOgogICAgICAgIC8vIC0g +RnJlaWdlZ2ViZW5lIERva3VtZW50ZTogZnVlciBhbGxlIHNpY2h0YmFyCiAgICAgICAgLy8gLSBF +bnR3dWVyZmUvQWJnZWxlaG50ZTogbnVyIGZ1ZXIgQXV0b3IsIHp1c3RhZW5kaWdlIFJldmlld2Vy +IHVuZCBTdXBlclVzZXIKICAgICAgICAvLyBIaW53ZWlzOiBEaWVzIGlzdCBrZWluZSBadWdyaWZm +c2tvbnRyb2xsZSAtIGRpZSBEb2t1bWVudGUgbGllZ2VuIGFscyBEYXRlaWVuIGltIGRhdGEvLU9y +ZG5lci4KICAgICAgICAvLyBEZXIgRmlsdGVyIHZlcmhpbmRlcnQsIGRhc3MgQmVudXR6ZXIgaW4g +ZGVyIE9iZXJmbGFlY2hlIERva3VtZW50ZSBzZWhlbiwgZGllIHNpZSBuaWNodCBiZWFyYmVpdGVu +IHNvbGxlbi4KICAgIGNhblNlZURvY3VtZW50KGRvYykgewogICAgICAgIGlmICghdGhpcy5kYXRh +KSByZXR1cm4gdHJ1ZTsgLy8gS2VpbiBHb3Zlcm5hbmNlID0gYWxsZXMgc2ljaHRiYXIKICAgICAg +ICAvLyBGcmVpZ2VnZWJlbmUgRG9rdW1lbnRlOiBhbGxlIHNlaGVuCiAgICAgICAgaWYgKGRvYy5z +dGF0dXMgPT09ICdGcmVpZ2VnZWJlbicpIHJldHVybiB0cnVlOwogICAgICAgIC8vIEVpZ2VuZSBE +b2t1bWVudGU6IEF1dG9yIHNpZWh0IGltbWVyCiAgICAgICAgY29uc3QgdXNlciA9ICh0aGlzLmN1 +cnJlbnRVc2VyIHx8ICcnKS50b0xvd2VyQ2FzZSgpOwogICAgICAgIGlmICgoZG9jLmVyc3RlbGx0 +Vm9uIHx8ICcnKS50b0xvd2VyQ2FzZSgpID09PSB1c2VyIHx8IChkb2MuYmVhcmJlaXRldFZvbiB8 +fCAnJykudG9Mb3dlckNhc2UoKSA9PT0gdXNlcikgcmV0dXJuIHRydWU7CiAgICAgICAgLy8gU3Vw +ZXJVc2VyL0ZhY2hhdWZzaWNodCBzaWVodCBhbGxlcwogICAgICAgIGlmICh0aGlzLmlzU3VwZXJV +c2VyKCkgfHwgdGhpcy5pc0ZhY2hhdWZzaWNodCgpKSByZXR1cm4gdHJ1ZTsKICAgICAgICAvLyBS +ZXZpZXdlciBzaWVodCBEb2t1bWVudGUgaW4gc2VpbmVuIEthdGVnb3JpZW4KICAgICAgICBpZiAo +dGhpcy5pc1Jldmlld2VyKGRvYy5rYXRlZ29yaWUpKSByZXR1cm4gdHJ1ZTsKICAgICAgICByZXR1 +cm4gZmFsc2U7CiAgICB9LAoKICAgIGNhbkFwcHJvdmUoZG9jKSB7CiAgICAgICAgaWYgKHRoaXMu +aXNTdXBlclVzZXIoKSB8fCB0aGlzLmlzRmFjaGF1ZnNpY2h0KCkpIHJldHVybiB0cnVlOwogICAg +ICAgIHJldHVybiB0aGlzLmlzUmV2aWV3ZXIoZG9jLmthdGVnb3JpZSk7CiAgICB9LAoKICAgIGNh +blNldFN0YXR1cyhzdGF0dXMpIHsKICAgICAgICBpZiAodGhpcy5pc1N1cGVyVXNlcigpIHx8IHRo +aXMuaXNGYWNoYXVmc2ljaHQoKSkgcmV0dXJuIHRydWU7CiAgICAgICAgaWYgKHN0YXR1cyA9PT0g +J0VudHd1cmYnIHx8IHN0YXR1cyA9PT0gJ1Byw7xmdW5nJykgcmV0dXJuIHRydWU7CiAgICAgICAg +cmV0dXJuIGZhbHNlOyAvLyBGcmVpZ2VnZWJlbi9BYmdlbGVobnQgbnVyIGZ1ZXIgUmV2aWV3ZXIv +U3VwZXJVc2VyCiAgICB9LAoKICAgIC8vIC0tLSBVSSBVcGRhdGVzIC0tLQogICAgdXBkYXRlVUko +KSB7CiAgICAgICAgLy8gUmV2aWV3IEJhZGdlCiAgICAgICAgY29uc3QgYmFkZ2UgPSBkb2N1bWVu +dC5nZXRFbGVtZW50QnlJZCgncmV2aWV3QmFkZ2UnKTsKICAgICAgICBjb25zdCBwZW5kaW5nID0g +dGhpcy5nZXRQZW5kaW5nUmV2aWV3cygpOwogICAgICAgIGlmIChwZW5kaW5nLmxlbmd0aCA+IDAg +JiYgKHRoaXMuaXNTdXBlclVzZXIoKSB8fCB0aGlzLmlzRmFjaGF1ZnNpY2h0KCkgfHwgdGhpcy5n +ZXRSZXZpZXdhYmxlQ2F0ZWdvcmllcygpLmxlbmd0aCA+IDApKSB7CiAgICAgICAgICAgIGJhZGdl +LnN0eWxlLmRpc3BsYXkgPSAnJzsKICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQo +J3Jldmlld0NvdW50JykudGV4dENvbnRlbnQgPSBwZW5kaW5nLmxlbmd0aDsKICAgICAgICB9IGVs +c2UgewogICAgICAgICAgICBiYWRnZS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOwogICAgICAgIH0K +CiAgICAgICAgLy8gR292ZXJuYW5jZSBBZG1pbiBCdXR0b24gKG51ciBTdXBlclVzZXIvRmFjaGF1 +ZnNpY2h0IGltIFNlcnZlci1Nb2R1cykKICAgICAgICBjb25zdCBhZG1pbkJ0biA9IGRvY3VtZW50 +LmdldEVsZW1lbnRCeUlkKCdidG5Hb3ZBZG1pbicpOwogICAgICAgIGFkbWluQnRuLnN0eWxlLmRp +c3BsYXkgPSAoRHJpdmVGUy5tb2RlID09PSAnc2VydmVyJyAmJiAodGhpcy5pc1N1cGVyVXNlcigp +IHx8IHRoaXMuaXNGYWNoYXVmc2ljaHQoKSkpID8gJycgOiAnbm9uZSc7CiAgICB9LAoKICAgIGdl +dFBlbmRpbmdSZXZpZXdzKCkgewogICAgICAgIGlmICghRHJpdmVGUy5kb2N1bWVudHMpIHJldHVy +biBbXTsKICAgICAgICBjb25zdCBjYXRzID0gKHRoaXMuaXNTdXBlclVzZXIoKSB8fCB0aGlzLmlz +RmFjaGF1ZnNpY2h0KCkpCiAgICAgICAgICAgID8gKERyaXZlRlMuY29uZmlnLmthdGVnb3JpZW4g +fHwgW10pCiAgICAgICAgICAgIDogdGhpcy5nZXRSZXZpZXdhYmxlQ2F0ZWdvcmllcygpOwogICAg +ICAgIHJldHVybiBEcml2ZUZTLmRvY3VtZW50cy5maWx0ZXIoZG9jID0+CiAgICAgICAgICAgIGRv +Yy5zdGF0dXMgPT09ICdQcsO8ZnVuZycgJiYgY2F0cy5pbmNsdWRlcyhkb2Mua2F0ZWdvcmllKQog +ICAgICAgICk7CiAgICB9LAoKICAgIC8vIC0tLSBSZXZpZXcgUXVldWUgUGFuZWwgLS0tCiAgICBz +aG93UXVldWUoKSB7CiAgICAgICAgY29uc3QgcGFuZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJ +ZCgncmV2aWV3UGFuZWwnKTsKICAgICAgICBjb25zdCBib2R5ID0gZG9jdW1lbnQuZ2V0RWxlbWVu +dEJ5SWQoJ3Jldmlld1BhbmVsQm9keScpOwogICAgICAgIGNvbnN0IHBlbmRpbmcgPSB0aGlzLmdl +dFBlbmRpbmdSZXZpZXdzKCk7CgogICAgICAgIGlmIChwZW5kaW5nLmxlbmd0aCA9PT0gMCkgewog +ICAgICAgICAgICBib2R5LmlubmVySFRNTCA9ICc8ZGl2IHN0eWxlPSJ0ZXh0LWFsaWduOmNlbnRl +cjsgcGFkZGluZzo0MHB4OyBjb2xvcjp2YXIoLS10ZXh0LW11dGVkKTsiPktlaW5lIG9mZmVuZW4g +UHLDvGZ1bmdlbi48L2Rpdj4nOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGJvZHkuaW5u +ZXJIVE1MID0gcGVuZGluZy5tYXAoZG9jID0+IHsKICAgICAgICAgICAgICAgIGNvbnN0IGdvdiA9 +IGRvYy5nb3Zlcm5hbmNlIHx8IHt9OwogICAgICAgICAgICAgICAgY29uc3Qgc3VibWl0dGVkID0g +Z292LnN1Ym1pdHRlZEZvclJldmlldyB8fCBkb2MuZ2VhZW5kZXJ0IHx8ICcnOwogICAgICAgICAg +ICAgICAgcmV0dXJuICc8ZGl2IGNsYXNzPSJyZXZpZXctaXRlbSI+JyArCiAgICAgICAgICAgICAg +ICAgICAgJzxkaXYgY2xhc3M9InJldmlldy1pdGVtLXRpdGxlIj4nICsgRHJpdmVQb3J0YWwuZXNj +YXBlSFRNTChkb2MudGl0ZWwpICsgJzwvZGl2PicgKwogICAgICAgICAgICAgICAgICAgICc8ZGl2 +IGNsYXNzPSJyZXZpZXctaXRlbS1tZXRhIj4nICsKICAgICAgICAgICAgICAgICAgICAgICAgJzxz +cGFuPicgKyBEcml2ZVBvcnRhbC5lc2NhcGVIVE1MKGRvYy5rYXRlZ29yaWUpICsgJzwvc3Bhbj4n +ICsKICAgICAgICAgICAgICAgICAgICAgICAgJzxzcGFuPnZvbiAnICsgRHJpdmVQb3J0YWwuZXNj +YXBlSFRNTChkb2MuZXJzdGVsbHRWb24gfHwgZG9jLmJlYXJiZWl0ZXRWb24gfHwgJy0nKSArICc8 +L3NwYW4+JyArCiAgICAgICAgICAgICAgICAgICAgICAgICc8c3Bhbj4nICsgZm9ybWF0RGF0ZShz +dWJtaXR0ZWQpICsgJzwvc3Bhbj4nICsKICAgICAgICAgICAgICAgICAgICAnPC9kaXY+JyArCiAg +ICAgICAgICAgICAgICAgICAgJzxkaXYgY2xhc3M9InJldmlldy1pdGVtLWFjdGlvbnMiPicgKwog +ICAgICAgICAgICAgICAgICAgICAgICAnPGJ1dHRvbiBjbGFzcz0iYnRuLWFwcHJvdmUiIG9uY2xp +Y2s9ImV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOyBEcml2ZUdvdmVybmFuY2UucmV2aWV3QW5kT3Bl +bihcJycgKyBEcml2ZVBvcnRhbC5lc2NhcGVBdHRyKGRvYy5pZCkgKyAnXCcpIj5QcsO8ZmVuPC9i +dXR0b24+JyArCiAgICAgICAgICAgICAgICAgICAgICAgICc8YnV0dG9uIGNsYXNzPSJidG4tcmVq +ZWN0IiBvbmNsaWNrPSJldmVudC5zdG9wUHJvcGFnYXRpb24oKTsgRHJpdmVHb3Zlcm5hbmNlLm9w +ZW5SZXZpZXdEaWFsb2coXCcnICsgRHJpdmVQb3J0YWwuZXNjYXBlQXR0cihkb2MuaWQpICsgJ1wn +LCBcJ3JlamVjdFwnKSI+QWJsZWhuZW4gdW5kIEJlZ3LDvG5kZW48L2J1dHRvbj4nICsKICAgICAg +ICAgICAgICAgICAgICAnPC9kaXY+JyArCiAgICAgICAgICAgICAgICAnPC9kaXY+JzsKICAgICAg +ICAgICAgfSkuam9pbignJyk7CiAgICAgICAgfQoKICAgICAgICBwYW5lbC5jbGFzc0xpc3QuYWRk +KCdhY3RpdmUnKTsKICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmV2aWV3UGFuZWxP +dmVybGF5JykuY2xhc3NMaXN0LmFkZCgnYWN0aXZlJyk7CiAgICB9LAoKICAgIGNsb3NlUXVldWUo +KSB7CiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Jldmlld1BhbmVsJykuY2xhc3NM +aXN0LnJlbW92ZSgnYWN0aXZlJyk7CiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Jl +dmlld1BhbmVsT3ZlcmxheScpLmNsYXNzTGlzdC5yZW1vdmUoJ2FjdGl2ZScpOwogICAgfSwKCiAg +ICAvLyBBcnRpa2VsIG9lZmZuZW4gdW5kIFBhbmVsIHNjaGxpZXNzZW4KICAgIGFzeW5jIHJldmll +d0FuZE9wZW4oZG9jSWQpIHsKICAgICAgICB0aGlzLmNsb3NlUXVldWUoKTsKICAgICAgICBhd2Fp +dCBEcml2ZVBvcnRhbC5zZWxlY3REb2N1bWVudChkb2NJZCk7CiAgICAgICAgRHJpdmVQb3J0YWwu +aGlnaGxpZ2h0SXRlbShkb2NJZCk7CiAgICB9LAoKICAgIC8vIC0tLSBSZXZpZXcgRGlhbG9nIC0t +LQogICAgLy8gUmV2aWV3ZXItRmFyYnBhbGV0dGUgKGJpcyB6dSA4IHVudGVyc2NoaWVkbGljaGUg +UmV2aWV3ZXIpCiAgICBfcmV2aWV3ZXJDb2xvcnM6IFsKICAgICAgICB7IGJnOiAnI2U4ZjVlOScs +IGJvcmRlcjogJyMyZTdkMzInLCB0ZXh0OiAnIzFiNWUyMCcgfSwKICAgICAgICB7IGJnOiAnI2Uz +ZjJmZCcsIGJvcmRlcjogJyMxNTY1YzAnLCB0ZXh0OiAnIzBkNDdhMScgfSwKICAgICAgICB7IGJn +OiAnI2ZmZjNlMCcsIGJvcmRlcjogJyNlNjUxMDAnLCB0ZXh0OiAnI2JmMzYwYycgfSwKICAgICAg +ICB7IGJnOiAnI2YzZTVmNScsIGJvcmRlcjogJyM3YjFmYTInLCB0ZXh0OiAnIzRhMTQ4YycgfSwK +ICAgICAgICB7IGJnOiAnI2UwZjdmYScsIGJvcmRlcjogJyMwMDgzOGYnLCB0ZXh0OiAnIzAwNjA2 +NCcgfSwKICAgICAgICB7IGJnOiAnI2ZjZTRlYycsIGJvcmRlcjogJyNjNjI4MjgnLCB0ZXh0OiAn +I2I3MWMxYycgfSwKICAgICAgICB7IGJnOiAnI2YxZjhlOScsIGJvcmRlcjogJyM1NThiMmYnLCB0 +ZXh0OiAnIzMzNjkxZScgfSwKICAgICAgICB7IGJnOiAnI2VkZTdmNicsIGJvcmRlcjogJyM0NTI3 +YTAnLCB0ZXh0OiAnIzMxMWI5MicgfQogICAgXSwKCiAgICBfZ2V0UmV2aWV3ZXJDb2xvcihyZXZp +ZXdlck5hbWUpIHsKICAgICAgICBpZiAoIXRoaXMuX3Jldmlld2VyQ29sb3JNYXApIHRoaXMuX3Jl +dmlld2VyQ29sb3JNYXAgPSB7fTsKICAgICAgICBpZiAodGhpcy5fcmV2aWV3ZXJDb2xvck1hcFty +ZXZpZXdlck5hbWVdKSByZXR1cm4gdGhpcy5fcmV2aWV3ZXJDb2xvck1hcFtyZXZpZXdlck5hbWVd +OwogICAgICAgIHZhciBpZHggPSBPYmplY3Qua2V5cyh0aGlzLl9yZXZpZXdlckNvbG9yTWFwKS5s +ZW5ndGggJSB0aGlzLl9yZXZpZXdlckNvbG9ycy5sZW5ndGg7CiAgICAgICAgdGhpcy5fcmV2aWV3 +ZXJDb2xvck1hcFtyZXZpZXdlck5hbWVdID0gdGhpcy5fcmV2aWV3ZXJDb2xvcnNbaWR4XTsKICAg +ICAgICByZXR1cm4gdGhpcy5fcmV2aWV3ZXJDb2xvck1hcFtyZXZpZXdlck5hbWVdOwogICAgfSwK +CiAgICBvcGVuUmV2aWV3RGlhbG9nKGRvY0lkLCBhY3Rpb24pIHsKICAgICAgICBjb25zdCBkb2Mg +PSBEcml2ZUZTLmRvY3VtZW50cy5maW5kKGQgPT4gZC5pZCA9PT0gZG9jSWQpOwogICAgICAgIGlm +ICghZG9jKSByZXR1cm47CgogICAgICAgIHZhciBoZWFkZXJFbCA9IGRvY3VtZW50LmdldEVsZW1l +bnRCeUlkKCdyZXZpZXdEaWFsb2dIZWFkZXInKTsKICAgICAgICB2YXIgaW5mbyA9IGRvY3VtZW50 +LmdldEVsZW1lbnRCeUlkKCdyZXZpZXdEaWFsb2dJbmZvJyk7CiAgICAgICAgdmFyIGhpbnQgPSBk +b2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmV2aWV3RGlhbG9nSGludCcpOwogICAgICAgIHZhciB0 +ZXh0YXJlYSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyZXZpZXdEaWFsb2dDb21tZW50Jyk7 +CiAgICAgICAgdmFyIGNvbmZpcm1CdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmV2aWV3 +RGlhbG9nQ29uZmlybScpOwogICAgICAgIHZhciBhcnRpY2xlQ29udGVudCA9IGRvY3VtZW50Lmdl +dEVsZW1lbnRCeUlkKCdyZXZpZXdBcnRpY2xlQ29udGVudCcpOwogICAgICAgIHZhciBwcmV2Q29t +bWVudHMgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmV2aWV3UHJldkNvbW1lbnRzJyk7Cgog +ICAgICAgIC8vIEhlYWRlcgogICAgICAgIHZhciBoZWFkZXJTcGFuID0gaGVhZGVyRWwucXVlcnlT +ZWxlY3Rvcignc3BhbjpmaXJzdC1jaGlsZCcpOwogICAgICAgIGlmIChhY3Rpb24gPT09ICdhcHBy +b3ZlJykgewogICAgICAgICAgICBpZiAoaGVhZGVyU3BhbikgaGVhZGVyU3Bhbi50ZXh0Q29udGVu +dCA9ICdEb2t1bWVudCBmcmVpZ2ViZW4nOwogICAgICAgICAgICBoZWFkZXJFbC5jbGFzc05hbWUg +PSAncmV2aWV3LWRpYWxvZy1oZWFkZXIgYXBwcm92ZSc7CiAgICAgICAgICAgIGNvbmZpcm1CdG4u +dGV4dENvbnRlbnQgPSAnRnJlaWdlYmVuJzsKICAgICAgICAgICAgY29uZmlybUJ0bi5jbGFzc05h +bWUgPSAnYnRuLWNvbmZpcm0gYXBwcm92ZSc7CiAgICAgICAgICAgIGhpbnQudGV4dENvbnRlbnQg +PSAnJzsKICAgICAgICAgICAgaGludC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOwogICAgICAgICAg +ICB0ZXh0YXJlYS5zZXRBdHRyaWJ1dGUoJ2RhdGEtcGxhY2Vob2xkZXInLCAnS29tbWVudGFyIChv +cHRpb25hbCkuLi4nKTsKICAgICAgICAgICAgdGhpcy5fcmV2aWV3Q29tbWVudFJlcXVpcmVkID0g +ZmFsc2U7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaWYgKGhlYWRlclNwYW4pIGhlYWRl +clNwYW4udGV4dENvbnRlbnQgPSAnRG9rdW1lbnQgYWJsZWhuZW4gdW5kIGJlZ3LDvG5kZW4nOwog +ICAgICAgICAgICBoZWFkZXJFbC5jbGFzc05hbWUgPSAncmV2aWV3LWRpYWxvZy1oZWFkZXIgcmVq +ZWN0JzsKICAgICAgICAgICAgY29uZmlybUJ0bi50ZXh0Q29udGVudCA9ICdBYmxlaG5lbic7CiAg +ICAgICAgICAgIGNvbmZpcm1CdG4uY2xhc3NOYW1lID0gJ2J0bi1jb25maXJtIHJlamVjdCc7CiAg +ICAgICAgICAgIHZhciByZWpNb2RlID0gKHRoaXMuZGF0YSAmJiB0aGlzLmRhdGEuc2V0dGluZ3Mp +ID8gKHRoaXMuZGF0YS5zZXR0aW5ncy5yZWplY3Rpb25SZWFzb25Nb2RlIHx8ICdyZXF1aXJlZCcp +IDogJ3JlcXVpcmVkJzsKICAgICAgICAgICAgaGludC5zdHlsZS5kaXNwbGF5ID0gJyc7CiAgICAg +ICAgICAgIGlmIChyZWpNb2RlID09PSAncmVxdWlyZWQnKSB7CiAgICAgICAgICAgICAgICBoaW50 +LnRleHRDb250ZW50ID0gJ0VpbmUgYXVzZsO8aHJsaWNoZSBCZWdyw7xuZHVuZyBpc3QgZXJmb3Jk +ZXJsaWNoLiBCZXNjaHJlaWJlLCB3YXJ1bSBkZXIgQXJ0aWtlbCBhYmdlbGVobnQgd2lyZCB1bmQg +d2VsY2hlIMOEbmRlcnVuZ2VuIG5vdHdlbmRpZyBzaW5kLic7CiAgICAgICAgICAgICAgICB0ZXh0 +YXJlYS5zZXRBdHRyaWJ1dGUoJ2RhdGEtcGxhY2Vob2xkZXInLCAnQmVncsO8bmR1bmcgKFBmbGlj +aHRmZWxkKS4uLicpOwogICAgICAgICAgICAgICAgdGhpcy5fcmV2aWV3Q29tbWVudFJlcXVpcmVk +ID0gdHJ1ZTsKICAgICAgICAgICAgfSBlbHNlIGlmIChyZWpNb2RlID09PSAnb3B0aW9uYWwnKSB7 +CiAgICAgICAgICAgICAgICBoaW50LnRleHRDb250ZW50ID0gJ0VpbmUgQmVncsO8bmR1bmcgaXN0 +IG9wdGlvbmFsLCB3aXJkIGFiZXIgZW1wZm9obGVuLic7CiAgICAgICAgICAgICAgICB0ZXh0YXJl +YS5zZXRBdHRyaWJ1dGUoJ2RhdGEtcGxhY2Vob2xkZXInLCAnQmVncsO8bmR1bmcgKG9wdGlvbmFs +KS4uLicpOwogICAgICAgICAgICAgICAgdGhpcy5fcmV2aWV3Q29tbWVudFJlcXVpcmVkID0gZmFs +c2U7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBoaW50LnRleHRDb250ZW50 +ID0gJyc7IGhpbnQuc3R5bGUuZGlzcGxheSA9ICdub25lJzsKICAgICAgICAgICAgICAgIHRleHRh +cmVhLnNldEF0dHJpYnV0ZSgnZGF0YS1wbGFjZWhvbGRlcicsICdLb21tZW50YXIgKG9wdGlvbmFs +KS4uLicpOwogICAgICAgICAgICAgICAgdGhpcy5fcmV2aWV3Q29tbWVudFJlcXVpcmVkID0gZmFs +c2U7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGluZm8udGV4dENvbnRlbnQgPSBk +b2MudGl0ZWwgKyAnICgnICsgZG9jLmthdGVnb3JpZSArICcpJzsKICAgICAgICB0ZXh0YXJlYS5p +bm5lckhUTUwgPSAnJzsKCiAgICAgICAgLy8gQXJ0aWtlbGluaGFsdCBsaW5rcyBhbnplaWdlbgog +ICAgICAgIHZhciBpbmhhbHQgPSBkb2MuaW5oYWx0IHx8ICc8ZW0gc3R5bGU9ImNvbG9yOnZhcigt +LXRleHQtbXV0ZWQpOyI+S2VpbiBJbmhhbHQ8L2VtPic7CiAgICAgICAgYXJ0aWNsZUNvbnRlbnQu +aW5uZXJIVE1MID0gJzxkaXYgc3R5bGU9Im1hcmdpbi1ib3R0b206OHB4O2ZvbnQtd2VpZ2h0OjYw +MDtjb2xvcjp2YXIoLS10ZXh0LWhlYWRpbmcpO2ZvbnQtc2l6ZToxNXB4OyI+JyArCiAgICAgICAg +ICAgIERyaXZlUG9ydGFsLmVzY2FwZUhUTUwoZG9jLnRpdGVsKSArICc8L2Rpdj4nICsgaW5oYWx0 +OwoKICAgICAgICAvLyBCaXNoZXJpZ2UgS29tbWVudGFyZSBtaXQgUmV2aWV3ZXItRmFyYmVuIGFu +emVpZ2VuCiAgICAgICAgdGhpcy5fcmV2aWV3ZXJDb2xvck1hcCA9IHt9OwogICAgICAgIHZhciBo +aXN0b3J5ID0gKGRvYy5nb3Zlcm5hbmNlICYmIGRvYy5nb3Zlcm5hbmNlLnJldmlld0hpc3Rvcnkp +ID8gZG9jLmdvdmVybmFuY2UucmV2aWV3SGlzdG9yeSA6IFtdOwogICAgICAgIHZhciBjb21tZW50 +c0h0bWwgPSAnJzsKICAgICAgICBoaXN0b3J5LmZvckVhY2goZnVuY3Rpb24oZW50cnkpIHsKICAg +ICAgICAgICAgaWYgKCFlbnRyeS5jb21tZW50KSByZXR1cm47CiAgICAgICAgICAgIHZhciBjb2xv +ciA9IERyaXZlR292ZXJuYW5jZS5fZ2V0UmV2aWV3ZXJDb2xvcihlbnRyeS5ieSB8fCAnVW5iZWth +bm50Jyk7CiAgICAgICAgICAgIHZhciBhY3Rpb25MYWJlbCA9IGVudHJ5LmFjdGlvbiA9PT0gJ2Fw +cHJvdmVkJyA/ICdGcmVpZ2VnZWJlbicgOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBl +bnRyeS5hY3Rpb24gPT09ICdyZWplY3RlZCcgPyAnQWJnZWxlaG50JyA6ICdFaW5nZXJlaWNodCc7 +CiAgICAgICAgICAgIHZhciBuaWdodEJnID0gY29sb3IuYmc7CiAgICAgICAgICAgIGNvbW1lbnRz +SHRtbCArPSAnPGRpdiBjbGFzcz0icmV2aWV3LWNvbW1lbnQtYnViYmxlIiBzdHlsZT0iYmFja2dy +b3VuZDonICsgY29sb3IuYmcgKyAnO2JvcmRlci1sZWZ0LWNvbG9yOicgKyBjb2xvci5ib3JkZXIg +KyAnOyIgdGl0bGU9IicgKyBmb3JtYXREYXRlVGltZShlbnRyeS5hdCkgKyAnIj4nICsKICAgICAg +ICAgICAgICAgICc8c3BhbiBjbGFzcz0icmMtYXV0aG9yIiBzdHlsZT0iY29sb3I6JyArIGNvbG9y +LnRleHQgKyAnOyI+JyArIERyaXZlUG9ydGFsLmVzY2FwZUhUTUwoZW50cnkuYnkgfHwgJ1VuYmVr +YW5udCcpICsgJyDigJMgJyArIGFjdGlvbkxhYmVsICsgJzwvc3Bhbj4nICsKICAgICAgICAgICAg +ICAgICc8c3BhbiBjbGFzcz0icmMtZGF0ZSI+JyArIGZvcm1hdERhdGVUaW1lKGVudHJ5LmF0KSAr +ICc8L3NwYW4+JyArCiAgICAgICAgICAgICAgICAnPGRpdiBjbGFzcz0icmMtdGV4dCI+JyArIGVu +dHJ5LmNvbW1lbnQgKyAnPC9kaXY+JyArCiAgICAgICAgICAgICc8L2Rpdj4nOwogICAgICAgIH0p +OwogICAgICAgIGlmICghY29tbWVudHNIdG1sKSB7CiAgICAgICAgICAgIGNvbW1lbnRzSHRtbCA9 +ICc8ZGl2IHN0eWxlPSJmb250LXNpemU6MTJweDtjb2xvcjp2YXIoLS10ZXh0LW11dGVkKTtwYWRk +aW5nOjhweCAwOyI+Tm9jaCBrZWluZSBLb21tZW50YXJlIHZvcmhhbmRlbi48L2Rpdj4nOwogICAg +ICAgIH0KICAgICAgICBwcmV2Q29tbWVudHMuaW5uZXJIVE1MID0gY29tbWVudHNIdG1sOwoKICAg +ICAgICB0aGlzLl9yZXZpZXdEaWFsb2dBY3Rpb24gPSBhY3Rpb247CiAgICAgICAgdGhpcy5fcmV2 +aWV3RGlhbG9nQ2FsbGJhY2sgPSBkb2NJZDsKICAgICAgICBjb25maXJtQnRuLm9uY2xpY2sgPSAo +KSA9PiB0aGlzLmNvbmZpcm1SZXZpZXcoKTsKCiAgICAgICAgLy8gUGFzdGUtSGFuZGxlcjogTnVy +IEtsYXJ0ZXh0IGVpbmZ1ZWdlbgogICAgICAgIHRleHRhcmVhLm9ucGFzdGUgPSBmdW5jdGlvbihl +KSB7CiAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgdmFyIHRleHQg +PSAoZS5jbGlwYm9hcmREYXRhIHx8IHdpbmRvdy5jbGlwYm9hcmREYXRhKS5nZXREYXRhKCd0ZXh0 +L3BsYWluJyk7CiAgICAgICAgICAgIGRvY3VtZW50LmV4ZWNDb21tYW5kKCdpbnNlcnRUZXh0Jywg +ZmFsc2UsIHRleHQpOwogICAgICAgIH07CgogICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlk +KCdyZXZpZXdEaWFsb2cnKS5jbGFzc0xpc3QuYWRkKCdhY3RpdmUnKTsKICAgIH0sCgogICAgY2xv +c2VSZXZpZXdEaWFsb2coKSB7CiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Jldmll +d0RpYWxvZycpLmNsYXNzTGlzdC5yZW1vdmUoJ2FjdGl2ZScpOwogICAgICAgIHRoaXMuX3Jldmll +d0RpYWxvZ0NhbGxiYWNrID0gbnVsbDsKICAgIH0sCgogICAgYXN5bmMgY29uZmlybVJldmlldygp +IHsKICAgICAgICBjb25zdCBkb2NJZCA9IHRoaXMuX3Jldmlld0RpYWxvZ0NhbGxiYWNrOwogICAg +ICAgIGNvbnN0IGFjdGlvbiA9IHRoaXMuX3Jldmlld0RpYWxvZ0FjdGlvbjsKICAgICAgICBjb25z +dCBjb21tZW50RWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmV2aWV3RGlhbG9nQ29tbWVu +dCcpOwogICAgICAgIC8vIEtvbW1lbnRhci1IVE1MIHNhbml0aXplbjogbnVyIGVybGF1YnRlIFRh +Z3MgYmVoYWx0ZW4KICAgICAgICB2YXIgcmF3SHRtbCA9IGNvbW1lbnRFbC5pbm5lckhUTUwudHJp +bSgpLnJlcGxhY2UoL148YnI+JC8sICcnKTsKICAgICAgICB2YXIgc2FuaXRpemVEaXYgPSBkb2N1 +bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKICAgICAgICBzYW5pdGl6ZURpdi5pbm5lckhUTUwg +PSByYXdIdG1sOwogICAgICAgIC8vIEFsbGUgdW5lcmxhdWJ0ZW4gVGFncyBkdXJjaCBpaHJlbiBU +ZXh0aW5oYWx0IGVyc2V0emVuCiAgICAgICAgc2FuaXRpemVEaXYucXVlcnlTZWxlY3RvckFsbCgn +YSwgaW1nLCBzY3JpcHQsIHN0eWxlLCBpZnJhbWUsIGRpdiwgc3BhbltzdHlsZSo9ImZvbnQtc2l6 +ZSJdLCBzcGFuW3N0eWxlKj0id2hpdGUtc3BhY2UiXScpLmZvckVhY2goZnVuY3Rpb24oZWwpIHsK +ICAgICAgICAgICAgaWYgKGVsLnRhZ05hbWUgPT09ICdESVYnKSB7CiAgICAgICAgICAgICAgICAv +LyBEaXZzIGR1cmNoIGlocmVuIEluaGFsdCArIFplaWxlbnVtYnJ1Y2ggZXJzZXR6ZW4KICAgICAg +ICAgICAgICAgIGVsLmluc2VydEFkamFjZW50SFRNTCgnYWZ0ZXJlbmQnLCAnPGJyPicpOwogICAg +ICAgICAgICAgICAgZWwucmVwbGFjZVdpdGgoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoZWwudGV4 +dENvbnRlbnQpKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGVsLnJlcGxh +Y2VXaXRoKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGVsLnRleHRDb250ZW50KSk7CiAgICAgICAg +ICAgIH0KICAgICAgICB9KTsKICAgICAgICBjb25zdCBjb21tZW50ID0gc2FuaXRpemVEaXYuaW5u +ZXJIVE1MLnRyaW0oKS5yZXBsYWNlKC9ePGJyPiQvLCAnJyk7CgogICAgICAgIGlmICghZG9jSWQp +IHJldHVybjsKCiAgICAgICAgLy8gUGZsaWNodGZlbGQtUHJ1ZWZ1bmcgZnVlciBBYmxlaG51bmdz +YmVncnVlbmR1bmcKICAgICAgICB2YXIgY29tbWVudFRleHQgPSBjb21tZW50RWwudGV4dENvbnRl +bnQudHJpbSgpOwogICAgICAgIGlmIChhY3Rpb24gPT09ICdyZWplY3QnKSB7CiAgICAgICAgICAg +IGlmICh0aGlzLl9yZXZpZXdDb21tZW50UmVxdWlyZWQgJiYgIWNvbW1lbnRUZXh0KSB7CiAgICAg +ICAgICAgICAgICBzaG93VG9hc3QoJ0JpdHRlIGVpbmUgQmVncsO8bmR1bmcgZWluZ2ViZW4gKFBm +bGljaHRmZWxkKScsICd3YXJuaW5nJyk7CiAgICAgICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVt +ZW50QnlJZCgncmV2aWV3RGlhbG9nQ29tbWVudCcpLmZvY3VzKCk7CiAgICAgICAgICAgICAgICBy +ZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8vIFNjaHJlaWJ6dWdyaWZm +IHNpY2hlcnN0ZWxsZW4gKGZpbGU6Ly8gTW9kdXMgaXN0IHN0YW5kYXJkbWFlc3NpZyByZWFkLW9u +bHkpCiAgICAgICAgaWYgKERyaXZlRlMucmVhZE9ubHkpIHsKICAgICAgICAgICAgY29uc3QgZ3Jh +bnRlZCA9IGF3YWl0IERyaXZlRlMuZW5zdXJlV3JpdGVBY2Nlc3MoKTsKICAgICAgICAgICAgaWYg +KCFncmFudGVkKSB7CiAgICAgICAgICAgICAgICBzaG93VG9hc3QoJ1NjaHJlaWJ6dWdyaWZmIGVy +Zm9yZGVybGljaCBmw7xyIEZyZWlnYWJlLUFrdGlvbmVuJywgJ3dhcm5pbmcnKTsKICAgICAgICAg +ICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgY29uc3QgZG9j +ID0gRHJpdmVGUy5kb2N1bWVudHMuZmluZChkID0+IGQuaWQgPT09IGRvY0lkKTsKICAgICAgICBp +ZiAoIWRvYykgcmV0dXJuOwoKICAgICAgICAvLyBHb3Zlcm5hbmNlLURhdGVuIHp1bSBEb2t1bWVu +dCBoaW56dWZ1ZWdlbgogICAgICAgIGlmICghZG9jLmdvdmVybmFuY2UpIGRvYy5nb3Zlcm5hbmNl +ID0geyByZXZpZXdIaXN0b3J5OiBbXSB9OwogICAgICAgIGlmICghZG9jLmdvdmVybmFuY2UucmV2 +aWV3SGlzdG9yeSkgZG9jLmdvdmVybmFuY2UucmV2aWV3SGlzdG9yeSA9IFtdOwoKICAgICAgICBk +b2MuZ292ZXJuYW5jZS5yZXZpZXdIaXN0b3J5LnB1c2goewogICAgICAgICAgICBhY3Rpb246IGFj +dGlvbiA9PT0gJ2FwcHJvdmUnID8gJ2FwcHJvdmVkJyA6ICdyZWplY3RlZCcsCiAgICAgICAgICAg +IGJ5OiB0aGlzLmN1cnJlbnRVc2VyLAogICAgICAgICAgICBhdDogbmV3IERhdGUoKS50b0lTT1N0 +cmluZygpLAogICAgICAgICAgICBjb21tZW50OiBjb21tZW50CiAgICAgICAgfSk7CgogICAgICAg +IHZhciBuZXdTdGF0dXMgPSBhY3Rpb24gPT09ICdhcHByb3ZlJyA/ICdGcmVpZ2VnZWJlbicgOiAn +QWJnZWxlaG50JzsKICAgICAgICBkb2MudmVyc2lvbiA9IGNhbGN1bGF0ZVZlcnNpb24oZG9jLCBk +b2MuaW5oYWx0LCBkb2MuaW5oYWx0LCBuZXdTdGF0dXMpOwogICAgICAgIGlmIChhY3Rpb24gPT09 +ICdhcHByb3ZlJykgewogICAgICAgICAgICBkb2Muc3RhdHVzID0gJ0ZyZWlnZWdlYmVuJzsKICAg +ICAgICAgICAgZG9jLmdvdmVybmFuY2UuYXBwcm92ZWRCeSA9IHRoaXMuY3VycmVudFVzZXI7CiAg +ICAgICAgICAgIGRvYy5nb3Zlcm5hbmNlLmFwcHJvdmVkQXQgPSBuZXcgRGF0ZSgpLnRvSVNPU3Ry +aW5nKCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgZG9jLnN0YXR1cyA9ICdBYmdlbGVo +bnQnOwogICAgICAgIH0KICAgICAgICAvLyBEaWZmLURhdGVuIGJlcmVpbmlnZW4gKG5hY2ggRnJl +aWdhYmUvQWJsZWhudW5nIG5pY2h0IG1laHIgbm9ldGlnKQogICAgICAgIGRlbGV0ZSBkb2MuX3By +ZXZpb3VzSW5oYWx0OwogICAgICAgIGRlbGV0ZSBkb2MuX3ByZXZpb3VzVGl0ZWw7CgogICAgICAg +IHRyeSB7CiAgICAgICAgICAgIGNvbnN0IHNhdmVSZXN1bHQgPSBhd2FpdCBEcml2ZUZTLnNhdmVE +b2N1bWVudChkb2MpOwogICAgICAgICAgICBpZiAoc2F2ZVJlc3VsdCA9PT0gdHJ1ZSkgewogICAg +ICAgICAgICAgICAgY29uc3QgbXNnID0gYWN0aW9uID09PSAnYXBwcm92ZScgPyAnRG9rdW1lbnQg +ZnJlaWdlZ2ViZW4nIDogJ0Rva3VtZW50IGFiZ2VsZWhudCc7CiAgICAgICAgICAgICAgICBzaG93 +VG9hc3QobXNnICsgJzogJyArIGRvYy50aXRlbCwgYWN0aW9uID09PSAnYXBwcm92ZScgPyAnc3Vj +Y2VzcycgOiAnd2FybmluZycpOwogICAgICAgICAgICAgICAgdGhpcy5jbG9zZVJldmlld0RpYWxv +ZygpOwogICAgICAgICAgICAgICAgdGhpcy5jbG9zZVF1ZXVlKCk7CiAgICAgICAgICAgICAgICBE +cml2ZVBvcnRhbC5yZW5kZXIoKTsKICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlVUkoKTsKICAg +ICAgICAgICAgICAgIGF3YWl0IERyaXZlUG9ydGFsLnNlbGVjdERvY3VtZW50KGRvY0lkKTsKICAg +ICAgICAgICAgICAgIERyaXZlUG9ydGFsLmhpZ2hsaWdodEl0ZW0oZG9jSWQpOwogICAgICAgICAg +ICB9IGVsc2UgewogICAgICAgICAgICAgICAgc2hvd1RvYXN0KCdGZWhsZXIgYmVpbSBTcGVpY2hl +cm46ICcgKyBzYXZlUmVzdWx0LCAnZXJyb3InLCA1MDAwKTsKICAgICAgICAgICAgfQogICAgICAg +IH0gY2F0Y2ggKGVycikgewogICAgICAgICAgICBzaG93VG9hc3QoJ1NwZWljaGVybiBmZWhsZ2Vz +Y2hsYWdlbjogJyArIGVyci5tZXNzYWdlLCAnZXJyb3InLCA1MDAwKTsKICAgICAgICB9CiAgICB9 +LAoKICAgIC8vIC0tLSBTdWJtaXQgZm9yIFJldmlldyAtLS0KICAgIGFzeW5jIHN1Ym1pdEZvclJl +dmlldyhkb2MpIHsKICAgICAgICBpZiAoIWRvYy5nb3Zlcm5hbmNlKSBkb2MuZ292ZXJuYW5jZSA9 +IHsgcmV2aWV3SGlzdG9yeTogW10gfTsKICAgICAgICBpZiAoIWRvYy5nb3Zlcm5hbmNlLnJldmll +d0hpc3RvcnkpIGRvYy5nb3Zlcm5hbmNlLnJldmlld0hpc3RvcnkgPSBbXTsKCiAgICAgICAgLy8g +Vm9yaGVyaWdlbiBJbmhhbHQgc2ljaGVybiBmdWVyIERpZmYtQW56ZWlnZSBiZWltIFJldmlldwog +ICAgICAgIC8vIExlc2UgZGllIHp1bGV0enQgZ2VzcGVpY2hlcnRlIFZlcnNpb24gdm9uIERpc2sg +KG5pY2h0IGRpZSBnZXJhZGUgYmVhcmJlaXRldGUpCiAgICAgICAgdHJ5IHsKICAgICAgICAgICAg +dmFyIHNhdmVkRG9jID0gYXdhaXQgRHJpdmVGUy5sb2FkRG9jdW1lbnQoZG9jLmlkKTsKICAgICAg +ICAgICAgaWYgKHNhdmVkRG9jICYmIHNhdmVkRG9jLmluaGFsdCkgewogICAgICAgICAgICAgICAg +ZG9jLl9wcmV2aW91c0luaGFsdCA9IHNhdmVkRG9jLmluaGFsdDsKICAgICAgICAgICAgICAgIGRv +Yy5fcHJldmlvdXNUaXRlbCA9IHNhdmVkRG9jLnRpdGVsOwogICAgICAgICAgICB9CiAgICAgICAg +fSBjYXRjaChlKSB7fQoKICAgICAgICBkb2Muc3RhdHVzID0gJ1Byw7xmdW5nJzsKICAgICAgICBk +b2MuZ292ZXJuYW5jZS5zdWJtaXR0ZWRGb3JSZXZpZXcgPSBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5n +KCk7CiAgICAgICAgZG9jLmdvdmVybmFuY2UucmV2aWV3SGlzdG9yeS5wdXNoKHsKICAgICAgICAg +ICAgYWN0aW9uOiAnc3VibWl0dGVkJywKICAgICAgICAgICAgYnk6IHRoaXMuY3VycmVudFVzZXIs +CiAgICAgICAgICAgIGF0OiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksCiAgICAgICAgICAgIGNv +bW1lbnQ6ICcnCiAgICAgICAgfSk7CiAgICB9LAoKICAgIC8vIC0tLSBHb3Zlcm5hbmNlIEFkbWlu +IFBhbmVsIC0tLQogICAgc2hvd0FkbWluKCkgewogICAgICAgIGlmICghdGhpcy5pc1N1cGVyVXNl +cigpICYmICF0aGlzLmlzRmFjaGF1ZnNpY2h0KCkpIHJldHVybjsKICAgICAgICB0aGlzLnJlbmRl +ckFkbWluKCk7CiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2dvdkFkbWluUGFuZWwn +KS5jbGFzc0xpc3QuYWRkKCdhY3RpdmUnKTsKICAgIH0sCgogICAgY2xvc2VBZG1pbigpIHsKICAg +ICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZ292QWRtaW5QYW5lbCcpLmNsYXNzTGlzdC5y +ZW1vdmUoJ2FjdGl2ZScpOwogICAgfSwKCiAgICByZW5kZXJBZG1pbigpIHsKICAgICAgICBjb25z +dCBib2R5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2dvdkFkbWluQm9keScpOwogICAgICAg +IGNvbnN0IGdvdiA9IHRoaXMuZGF0YSB8fCB7IHN1cGVyVXNlcnM6IFtdLCByZXZpZXdlcnM6IFtd +LCBmYWNoYXVmc2ljaHQ6IFtdLCBzZXR0aW5nczoge30gfTsKICAgICAgICBpZiAoIWdvdi5mYWNo +YXVmc2ljaHQpIGdvdi5mYWNoYXVmc2ljaHQgPSBbXTsKICAgICAgICBpZiAoIWdvdi5zZXR0aW5n +cykgZ292LnNldHRpbmdzID0ge307CiAgICAgICAgY29uc3Qga2F0ZWdvcmllbiA9IERyaXZlRlMu +Y29uZmlnLmthdGVnb3JpZW4gfHwgW107CiAgICAgICAgY29uc3QgaXNTVSA9IHRoaXMuaXNTdXBl +clVzZXIoKTsKCiAgICAgICAgLy8gLS0tIFN1cGVyVXNlciAtLS0KICAgICAgICBsZXQgaHRtbCA9 ICc8ZGl2IGNsYXNzPSJnb3Ytc2VjdGlvbiI+JyArCiAgICAgICAgICAgICc8ZGl2IGNsYXNzPSJn -b3Ytc2VjdGlvbi10aXRsZSIgdGl0bGU9IlNjaGxhZ3fDtnJ0ZXIgaGVsZmVuIGJlaW0gU3VjaGVu -IHVuZCBGaWx0ZXJuIHZvbiBBcnRpa2Vsbi4gSGllciBrYW5uc3QgZHUgYmVzdGVoZW5kZSBTY2hs -YWd3w7ZydGVyIHVtYmVuZW5uZW4sIHp1c2FtbWVuZsO8aHJlbiBvZGVyIGzDtnNjaGVuLiI+U2No -bGFnd8O2cnRlciB2ZXJ3YWx0ZW48L2Rpdj4nICsKICAgICAgICAgICAgJzxkaXYgc3R5bGU9ImZv -bnQtc2l6ZToxMnB4O2NvbG9yOnZhcigtLXRleHQtbXV0ZWQpO21hcmdpbi1ib3R0b206OHB4OyI+ -S2xpY2tlIGF1ZiBlaW4gU2NobGFnd29ydCwgdW0gZXMgenUgYmVhcmJlaXRlbiBvZGVyIHp1IGzD -tnNjaGVuLiBEaWUgWmFobCB6ZWlndCwgaW4gd2llIHZpZWxlbiBBcnRpa2VsbiBlcyB2ZXJ3ZW5k -ZXQgd2lyZC48L2Rpdj4nICsKICAgICAgICAgICAgJzxkaXYgY2xhc3M9Imdvdi1rdy1saXN0IiBp -ZD0iZ292S3dMaXN0Ij4nOwogICAgICAgIHZhciBhbGxLdyA9IERyaXZlRWRpdG9yLl9nZXRBbGxL -bm93bktleXdvcmRzKCk7CiAgICAgICAgYWxsS3cuZm9yRWFjaChmdW5jdGlvbihrdykgewogICAg -ICAgICAgICB2YXIgY291bnQgPSBEcml2ZUZTLmRvY3VtZW50cy5maWx0ZXIoZnVuY3Rpb24oZCkg -ewogICAgICAgICAgICAgICAgcmV0dXJuIGQuc2NobGFnd29lcnRlciAmJiBkLnNjaGxhZ3dvZXJ0 -ZXIuaW5jbHVkZXMoa3cpOwogICAgICAgICAgICB9KS5sZW5ndGg7CiAgICAgICAgICAgIGh0bWwg -Kz0gJzxzcGFuIGNsYXNzPSJnb3Yta3ctcGlsbCIgb25jbGljaz0iRHJpdmVHb3Zlcm5hbmNlLm9w -ZW5Ld01hbmFnZShcJycgKyBEcml2ZVBvcnRhbC5lc2NhcGVBdHRyKGt3KSArICdcJykiPicgKwog -ICAgICAgICAgICAgICAgRHJpdmVQb3J0YWwuZXNjYXBlSFRNTChrdykgKyAnIDxzcGFuIGNsYXNz -PSJrdy1jb3VudCI+KCcgKyBjb3VudCArICcpPC9zcGFuPjwvc3Bhbj4nOwogICAgICAgIH0pOwog -ICAgICAgIGh0bWwgKz0gJzwvZGl2PjwvZGl2Pic7CgogICAgICAgIGJvZHkuaW5uZXJIVE1MID0g -aHRtbDsKICAgIH0sCgogICAgYXN5bmMgYWRkUmV2aWV3ZXIoKSB7CiAgICAgICAgY29uc3QgdXNl -cm5hbWUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZ292QWRkVXNlcicpLnZhbHVlLnRyaW0o -KTsKICAgICAgICBjb25zdCBkaXNwbGF5TmFtZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdn -b3ZBZGROYW1lJykudmFsdWUudHJpbSgpIHx8IHVzZXJuYW1lOwogICAgICAgIGNvbnN0IG9yZ2Fu -aXNhdGlvbnNlaW5oZWl0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2dvdkFkZE9FJykudmFs -dWUudHJpbSgpOwogICAgICAgIGNvbnN0IGthdFNlbGVjdCA9IGRvY3VtZW50LmdldEVsZW1lbnRC -eUlkKCdnb3ZBZGRLYXQnKTsKICAgICAgICBjb25zdCBrYXRlZ29yaWVuID0gQXJyYXkuZnJvbShr -YXRTZWxlY3Quc2VsZWN0ZWRPcHRpb25zKS5tYXAobyA9PiBvLnZhbHVlKTsKCiAgICAgICAgaWYg -KCF1c2VybmFtZSkgeyBzaG93VG9hc3QoJ05XLUtlbm51bmcgZXJmb3JkZXJsaWNoJywgJ3dhcm5p -bmcnKTsgcmV0dXJuOyB9CiAgICAgICAgaWYgKGthdGVnb3JpZW4ubGVuZ3RoID09PSAwKSB7IHNo -b3dUb2FzdCgnTWluZGVzdGVucyBlaW5lIEthdGVnb3JpZSB3w6RobGVuJywgJ3dhcm5pbmcnKTsg -cmV0dXJuOyB9CgogICAgICAgIGlmICghdGhpcy5kYXRhKSB0aGlzLmRhdGEgPSB7IHZlcnNpb246 -ICcxLjAnLCBzdXBlclVzZXJzOiBbXSwgcmV2aWV3ZXJzOiBbXSwgc2V0dGluZ3M6IHt9IH07CiAg -ICAgICAgY29uc3QgcmV2aWV3ZXIgPSB7IHVzZXJuYW1lOiB1c2VybmFtZSwgZG9tYWluOiAnKics -IGRpc3BsYXlOYW1lOiBkaXNwbGF5TmFtZSwga2F0ZWdvcmllbjoga2F0ZWdvcmllbiB9OwogICAg -ICAgIGlmIChvcmdhbmlzYXRpb25zZWluaGVpdCkgcmV2aWV3ZXIub3JnYW5pc2F0aW9uc2Vpbmhl -aXQgPSBvcmdhbmlzYXRpb25zZWluaGVpdDsKCiAgICAgICAgaWYgKHRoaXMuX2VkaXRpbmdSZXZp -ZXdlckluZGV4ID49IDApIHsKICAgICAgICAgICAgY29uc3QgZWRpdElkeCA9IHRoaXMuX2VkaXRp -bmdSZXZpZXdlckluZGV4OwogICAgICAgICAgICBjb25zdCBiYWNrdXAgPSB7IC4uLnRoaXMuZGF0 -YS5yZXZpZXdlcnNbZWRpdElkeF0gfTsKICAgICAgICAgICAgdGhpcy5kYXRhLnJldmlld2Vyc1tl -ZGl0SWR4XSA9IHJldmlld2VyOwogICAgICAgICAgICB0aGlzLl9lZGl0aW5nUmV2aWV3ZXJJbmRl -eCA9IC0xOwogICAgICAgICAgICBjb25zdCBvayA9IGF3YWl0IHRoaXMuc2F2ZUdvdmVybmFuY2Uo -KTsKICAgICAgICAgICAgaWYgKG9rID09PSBmYWxzZSkgewogICAgICAgICAgICAgICAgdGhpcy5k -YXRhLnJldmlld2Vyc1tlZGl0SWR4XSA9IGJhY2t1cDsKICAgICAgICAgICAgICAgIHJldHVybjsK -ICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLnJlbmRlckFkbWluKCk7CiAgICAgICAgICAg -IHNob3dUb2FzdChkaXNwbGF5TmFtZSArICcgYWt0dWFsaXNpZXJ0JywgJ3N1Y2Nlc3MnKTsKICAg -ICAgICB9IGVsc2UgewogICAgICAgICAgICB0aGlzLmRhdGEucmV2aWV3ZXJzLnB1c2gocmV2aWV3 -ZXIpOwogICAgICAgICAgICBjb25zdCBvayA9IGF3YWl0IHRoaXMuc2F2ZUdvdmVybmFuY2UoKTsK -ICAgICAgICAgICAgaWYgKG9rID09PSBmYWxzZSkgewogICAgICAgICAgICAgICAgdGhpcy5kYXRh -LnJldmlld2Vycy5wb3AoKTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQog -ICAgICAgICAgICB0aGlzLnJlbmRlckFkbWluKCk7CiAgICAgICAgICAgIHNob3dUb2FzdChkaXNw -bGF5TmFtZSArICcgYWxzIFJldmlld2VyIGhpbnp1Z2Vmw7xndCcsICdzdWNjZXNzJyk7CiAgICAg -ICAgfQogICAgfSwKCiAgICBlZGl0UmV2aWV3ZXIoaW5kZXgpIHsKICAgICAgICBpZiAoIXRoaXMu -ZGF0YSB8fCAhdGhpcy5kYXRhLnJldmlld2Vyc1tpbmRleF0pIHJldHVybjsKICAgICAgICB0aGlz -Ll9lZGl0aW5nUmV2aWV3ZXJJbmRleCA9IGluZGV4OwogICAgICAgIHRoaXMucmVuZGVyQWRtaW4o -KTsKICAgICAgICBjb25zdCBzZWN0aW9uID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2dvdkFk -ZFNlY3Rpb24nKTsKICAgICAgICBpZiAoc2VjdGlvbikgc2VjdGlvbi5zY3JvbGxJbnRvVmlldyh7 -IGJlaGF2aW9yOiAnc21vb3RoJyB9KTsKICAgIH0sCgogICAgY2FuY2VsRWRpdCgpIHsKICAgICAg -ICB0aGlzLl9lZGl0aW5nUmV2aWV3ZXJJbmRleCA9IC0xOwogICAgICAgIHRoaXMucmVuZGVyQWRt -aW4oKTsKICAgIH0sCgogICAgYXN5bmMgcmVtb3ZlUmV2aWV3ZXIoaW5kZXgpIHsKICAgICAgICBp -ZiAoIXRoaXMuZGF0YSB8fCAhdGhpcy5kYXRhLnJldmlld2Vyc1tpbmRleF0pIHJldHVybjsKICAg -ICAgICBjb25zdCBuYW1lID0gdGhpcy5kYXRhLnJldmlld2Vyc1tpbmRleF0uZGlzcGxheU5hbWUg -fHwgdGhpcy5kYXRhLnJldmlld2Vyc1tpbmRleF0udXNlcm5hbWU7CiAgICAgICAgaWYgKCFjb25m -aXJtKCdSZXZpZXdlciAiJyArIG5hbWUgKyAnIiBlbnRmZXJuZW4/JykpIHJldHVybjsKICAgICAg -ICBjb25zdCBiYWNrdXAgPSB0aGlzLmRhdGEucmV2aWV3ZXJzW2luZGV4XTsKICAgICAgICB0aGlz -LmRhdGEucmV2aWV3ZXJzLnNwbGljZShpbmRleCwgMSk7CiAgICAgICAgY29uc3Qgb2sgPSBhd2Fp -dCB0aGlzLnNhdmVHb3Zlcm5hbmNlKCk7CiAgICAgICAgaWYgKG9rID09PSBmYWxzZSkgewogICAg -ICAgICAgICB0aGlzLmRhdGEucmV2aWV3ZXJzLnNwbGljZShpbmRleCwgMCwgYmFja3VwKTsKICAg -ICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICB0aGlzLnJlbmRlckFkbWluKCk7CiAg -ICAgICAgc2hvd1RvYXN0KG5hbWUgKyAnIGVudGZlcm50JywgJ3N1Y2Nlc3MnKTsKICAgIH0sCgog -ICAgYXN5bmMgYWRkU3VwZXJVc2VyKCkgewogICAgICAgIHZhciB1c2VybmFtZSA9IGRvY3VtZW50 -LmdldEVsZW1lbnRCeUlkKCdnb3ZTVVVzZXInKS52YWx1ZS50cmltKCk7CiAgICAgICAgaWYgKCF1 -c2VybmFtZSkgeyBzaG93VG9hc3QoJ05XLUtlbm51bmcgZXJmb3JkZXJsaWNoJywgJ3dhcm5pbmcn -KTsgcmV0dXJuOyB9CiAgICAgICAgdmFyIGRpc3BsYXlOYW1lID0gZG9jdW1lbnQuZ2V0RWxlbWVu -dEJ5SWQoJ2dvdlNVTmFtZScpLnZhbHVlLnRyaW0oKSB8fCB1c2VybmFtZTsKICAgICAgICB2YXIg -b2UgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZ292U1VPRScpLnZhbHVlLnRyaW0oKTsKICAg -ICAgICBpZiAoIXRoaXMuZGF0YS5zdXBlclVzZXJzKSB0aGlzLmRhdGEuc3VwZXJVc2VycyA9IFtd -OwogICAgICAgIHRoaXMuZGF0YS5zdXBlclVzZXJzLnB1c2goeyB1c2VybmFtZTogdXNlcm5hbWUs -IGRvbWFpbjogJyonLCBkaXNwbGF5TmFtZTogZGlzcGxheU5hbWUsIG9yZ2FuaXNhdGlvbnNlaW5o -ZWl0OiBvZSB9KTsKICAgICAgICBjb25zdCBvayA9IGF3YWl0IHRoaXMuc2F2ZUdvdmVybmFuY2Uo -KTsKICAgICAgICBpZiAob2sgPT09IGZhbHNlKSB7CiAgICAgICAgICAgIHRoaXMuZGF0YS5zdXBl -clVzZXJzLnBvcCgpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIHRoaXMu -cmVuZGVyQWRtaW4oKTsKICAgICAgICBzaG93VG9hc3QoZGlzcGxheU5hbWUgKyAnIGFscyBTdXBl -clVzZXIgaGluenVnZWbDvGd0JywgJ3N1Y2Nlc3MnKTsKICAgIH0sCgogICAgYXN5bmMgcmVtb3Zl -U3VwZXJVc2VyKGluZGV4KSB7CiAgICAgICAgaWYgKHRoaXMuZGF0YS5zdXBlclVzZXJzLmxlbmd0 -aCA8PSAxKSB7IHNob3dUb2FzdCgnTWluZGVzdGVucyBlaW4gU3VwZXJVc2VyIGVyZm9yZGVybGlj -aCcsICd3YXJuaW5nJyk7IHJldHVybjsgfQogICAgICAgIGlmICghY29uZmlybSgnU3VwZXJVc2Vy -IHdpcmtsaWNoIGVudGZlcm5lbj8nKSkgcmV0dXJuOwogICAgICAgIGNvbnN0IGJhY2t1cCA9IHRo -aXMuZGF0YS5zdXBlclVzZXJzW2luZGV4XTsKICAgICAgICB0aGlzLmRhdGEuc3VwZXJVc2Vycy5z -cGxpY2UoaW5kZXgsIDEpOwogICAgICAgIGNvbnN0IG9rID0gYXdhaXQgdGhpcy5zYXZlR292ZXJu -YW5jZSgpOwogICAgICAgIGlmIChvayA9PT0gZmFsc2UpIHsKICAgICAgICAgICAgdGhpcy5kYXRh -LnN1cGVyVXNlcnMuc3BsaWNlKGluZGV4LCAwLCBiYWNrdXApOwogICAgICAgICAgICByZXR1cm47 -CiAgICAgICAgfQogICAgICAgIHRoaXMucmVuZGVyQWRtaW4oKTsKICAgICAgICBzaG93VG9hc3Qo -J1N1cGVyVXNlciBlbnRmZXJudCcsICdzdWNjZXNzJyk7CiAgICB9LAoKICAgIGFzeW5jIGFkZEZh -Y2hhdWZzaWNodCgpIHsKICAgICAgICB2YXIgdXNlcm5hbWUgPSBkb2N1bWVudC5nZXRFbGVtZW50 -QnlJZCgnZ292RkFVc2VyJykudmFsdWUudHJpbSgpOwogICAgICAgIGlmICghdXNlcm5hbWUpIHsg -c2hvd1RvYXN0KCdOVy1LZW5udW5nIGVyZm9yZGVybGljaCcsICd3YXJuaW5nJyk7IHJldHVybjsg -fQogICAgICAgIHZhciBkaXNwbGF5TmFtZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdnb3ZG -QU5hbWUnKS52YWx1ZS50cmltKCkgfHwgdXNlcm5hbWU7CiAgICAgICAgdmFyIG9lID0gZG9jdW1l -bnQuZ2V0RWxlbWVudEJ5SWQoJ2dvdkZBT0UnKS52YWx1ZS50cmltKCk7CiAgICAgICAgaWYgKCF0 -aGlzLmRhdGEuZmFjaGF1ZnNpY2h0KSB0aGlzLmRhdGEuZmFjaGF1ZnNpY2h0ID0gW107CiAgICAg -ICAgdGhpcy5kYXRhLmZhY2hhdWZzaWNodC5wdXNoKHsgdXNlcm5hbWU6IHVzZXJuYW1lLCBkb21h -aW46ICcqJywgZGlzcGxheU5hbWU6IGRpc3BsYXlOYW1lLCBvcmdhbmlzYXRpb25zZWluaGVpdDog -b2UgfSk7CiAgICAgICAgY29uc3Qgb2sgPSBhd2FpdCB0aGlzLnNhdmVHb3Zlcm5hbmNlKCk7CiAg -ICAgICAgaWYgKG9rID09PSBmYWxzZSkgewogICAgICAgICAgICB0aGlzLmRhdGEuZmFjaGF1ZnNp -Y2h0LnBvcCgpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIHRoaXMucmVu -ZGVyQWRtaW4oKTsKICAgICAgICBzaG93VG9hc3QoZGlzcGxheU5hbWUgKyAnIGFscyBGYWNoYXVm -c2ljaHQgaGluenVnZWbDvGd0JywgJ3N1Y2Nlc3MnKTsKICAgIH0sCgogICAgYXN5bmMgcmVtb3Zl -RmFjaGF1ZnNpY2h0KGluZGV4KSB7CiAgICAgICAgaWYgKCFjb25maXJtKCdGYWNoYXVmc2ljaHQg -d2lya2xpY2ggZW50ZmVybmVuPycpKSByZXR1cm47CiAgICAgICAgY29uc3QgYmFja3VwID0gdGhp -cy5kYXRhLmZhY2hhdWZzaWNodFtpbmRleF07CiAgICAgICAgdGhpcy5kYXRhLmZhY2hhdWZzaWNo -dC5zcGxpY2UoaW5kZXgsIDEpOwogICAgICAgIGNvbnN0IG9rID0gYXdhaXQgdGhpcy5zYXZlR292 -ZXJuYW5jZSgpOwogICAgICAgIGlmIChvayA9PT0gZmFsc2UpIHsKICAgICAgICAgICAgdGhpcy5k -YXRhLmZhY2hhdWZzaWNodC5zcGxpY2UoaW5kZXgsIDAsIGJhY2t1cCk7CiAgICAgICAgICAgIHJl -dHVybjsKICAgICAgICB9CiAgICAgICAgdGhpcy5yZW5kZXJBZG1pbigpOwogICAgICAgIHNob3dU -b2FzdCgnRmFjaGF1ZnNpY2h0IGVudGZlcm50JywgJ3N1Y2Nlc3MnKTsKICAgIH0sCgogICAgYXN5 -bmMgYWRkQ2F0ZWdvcnkoKSB7CiAgICAgICAgdmFyIGlucHV0ID0gZG9jdW1lbnQuZ2V0RWxlbWVu -dEJ5SWQoJ2dvdk5ld0NhdCcpOwogICAgICAgIHZhciBuYW1lID0gaW5wdXQudmFsdWUudHJpbSgp -OwogICAgICAgIGlmICghbmFtZSkgcmV0dXJuOwogICAgICAgIGlmIChEcml2ZUZTLmNvbmZpZy5r -YXRlZ29yaWVuLmluY2x1ZGVzKG5hbWUpKSB7CiAgICAgICAgICAgIHNob3dUb2FzdCgnS2F0ZWdv -cmllIGV4aXN0aWVydCBiZXJlaXRzJywgJ3dhcm5pbmcnKTsKICAgICAgICAgICAgcmV0dXJuOwog -ICAgICAgIH0KICAgICAgICBEcml2ZUZTLmNvbmZpZy5rYXRlZ29yaWVuLnB1c2gobmFtZSk7CiAg -ICAgICAgRHJpdmVGUy5zb3J0S2F0ZWdvcmllbigpOwoKICAgICAgICAvLyAxLiBDb25maWcgc3Bl -aWNoZXJuCiAgICAgICAgY29uc3Qgb2sgPSBhd2FpdCB0aGlzLnNhdmVDb25maWcoKTsKICAgICAg -ICBpZiAob2sgPT09IGZhbHNlKSB7CiAgICAgICAgICAgIHZhciBybUlkeCA9IERyaXZlRlMuY29u -ZmlnLmthdGVnb3JpZW4uaW5kZXhPZihuYW1lKTsKICAgICAgICAgICAgaWYgKHJtSWR4ID49IDAp -IERyaXZlRlMuY29uZmlnLmthdGVnb3JpZW4uc3BsaWNlKHJtSWR4LCAxKTsKICAgICAgICAgICAg -cmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgLy8gMi4gT3JkbmVyIGVyc3RlbGxlbjogZGF0YS9b -S2F0ZWdvcmllXS8KICAgICAgICB0cnkgewogICAgICAgICAgICBpZiAoRHJpdmVGUy5tb2RlID09 -PSAnc2VydmVyJykgewogICAgICAgICAgICAgICAgdmFyIHBsYWNlaG9sZGVyID0geyBfcGxhY2Vo -b2xkZXI6IHRydWUgfTsKICAgICAgICAgICAgICAgIGF3YWl0IGZldGNoKCcvYXBpL3dyaXRlJywg -eyBtZXRob2Q6ICdQT1NUJywgaGVhZGVyczogeydDb250ZW50LVR5cGUnOidhcHBsaWNhdGlvbi9q -c29uOyBjaGFyc2V0PXV0Zi04J30sCiAgICAgICAgICAgICAgICAgICAgYm9keTogSlNPTi5zdHJp -bmdpZnkoeyBwYXRoOiAnZGF0YS8nICsgbmFtZSArICcvX2luaXQuanNvbicsIGRhdGE6IHBsYWNl -aG9sZGVyIH0pIH0pOwogICAgICAgICAgICAgICAgYXdhaXQgZmV0Y2goJy9hcGkvZGVsZXRlJywg -eyBtZXRob2Q6ICdQT1NUJywgaGVhZGVyczogeydDb250ZW50LVR5cGUnOidhcHBsaWNhdGlvbi9q -c29uOyBjaGFyc2V0PXV0Zi04J30sCiAgICAgICAgICAgICAgICAgICAgYm9keTogSlNPTi5zdHJp -bmdpZnkoeyBwYXRoOiAnZGF0YS8nICsgbmFtZSArICcvX2luaXQuanNvbicgfSkgfSk7CiAgICAg -ICAgICAgIH0gZWxzZSBpZiAoRHJpdmVGUy5tb2RlID09PSAnZmlsZXN5c3RlbScgJiYgRHJpdmVG -Uy5fZGF0YUhhbmRsZSkgewogICAgICAgICAgICAgICAgYXdhaXQgRHJpdmVGUy5fZGF0YUhhbmRs -ZS5nZXREaXJlY3RvcnlIYW5kbGUobmFtZSwgeyBjcmVhdGU6IHRydWUgfSk7CiAgICAgICAgICAg -IH0KICAgICAgICB9IGNhdGNoKGUpIHsgY29uc29sZS53YXJuKCdPcmRuZXItRXJzdGVsbHVuZzon -LCBlKTsgfQoKICAgICAgICAvLyAzLiBVSSBrb21wbGV0dCBha3R1YWxpc2llcmVuCiAgICAgICAg -aW5wdXQudmFsdWUgPSAnJzsKICAgICAgICBEcml2ZVBvcnRhbC5zZXR1cEZpbHRlcnMoKTsKICAg -ICAgICBEcml2ZVBvcnRhbC5yZW5kZXIoKTsKICAgICAgICBpZiAodGhpcy50YWJsZVZpZXdBY3Rp -dmUpIERyaXZlUG9ydGFsLnJlbmRlclRhYmxlVmlldygpOwogICAgICAgIHRoaXMucmVuZGVyQWRt -aW4oKTsKICAgICAgICBzaG93VG9hc3QoJ0thdGVnb3JpZSAiJyArIG5hbWUgKyAnIiBoaW56dWdl -ZsO8Z3QnLCAnc3VjY2VzcycpOwogICAgfSwKCiAgICBhc3luYyByZW1vdmVDYXRlZ29yeShpbmRl -eCkgewogICAgICAgIHZhciBrYXQgPSBEcml2ZUZTLmNvbmZpZy5rYXRlZ29yaWVuW2luZGV4XTsK -ICAgICAgICB2YXIgZG9jQ291bnQgPSBEcml2ZUZTLmRvY3VtZW50cy5maWx0ZXIoZnVuY3Rpb24o -ZCl7IHJldHVybiBkLmthdGVnb3JpZSA9PT0ga2F0OyB9KS5sZW5ndGg7CiAgICAgICAgaWYgKGRv -Y0NvdW50ID4gMCkgewogICAgICAgICAgICBpZiAoIWNvbmZpcm0oJ0RpZSBLYXRlZ29yaWUgIicg -KyBrYXQgKyAnIiBlbnRow6RsdCAnICsgZG9jQ291bnQgKyAnIERva3VtZW50KGUpLlxuV2lya2xp -Y2ggZW50ZmVybmVuPyBEaWUgRG9rdW1lbnRlIGJlaGFsdGVuIGlocmUgS2F0ZWdvcmllLicpKSBy -ZXR1cm47CiAgICAgICAgfQogICAgICAgIERyaXZlRlMuY29uZmlnLmthdGVnb3JpZW4uc3BsaWNl -KGluZGV4LCAxKTsKICAgICAgICBjb25zdCBvayA9IGF3YWl0IHRoaXMuc2F2ZUNvbmZpZygpOwog -ICAgICAgIGlmIChvayA9PT0gZmFsc2UpIHsKICAgICAgICAgICAgRHJpdmVGUy5jb25maWcua2F0 -ZWdvcmllbi5zcGxpY2UoaW5kZXgsIDAsIGthdCk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAg -ICB9CiAgICAgICAgRHJpdmVQb3J0YWwuc2V0dXBGaWx0ZXJzKCk7CiAgICAgICAgRHJpdmVQb3J0 -YWwucmVuZGVyKCk7CiAgICAgICAgaWYgKERyaXZlUG9ydGFsLnRhYmxlVmlld0FjdGl2ZSkgRHJp -dmVQb3J0YWwucmVuZGVyVGFibGVWaWV3KCk7CiAgICAgICAgdGhpcy5yZW5kZXJBZG1pbigpOwog -ICAgICAgIHNob3dUb2FzdCgnS2F0ZWdvcmllICInICsga2F0ICsgJyIgZW50ZmVybnQnLCAnc3Vj -Y2VzcycpOwogICAgfSwKCiAgICBhc3luYyBoaWRlQ2F0ZWdvcnkoaW5kZXgpIHsKICAgICAgICB2 -YXIga2F0ID0gRHJpdmVGUy5jb25maWcua2F0ZWdvcmllbltpbmRleF07CiAgICAgICAgaWYgKCFE -cml2ZUZTLmNvbmZpZy5oaWRkZW5LYXRlZ29yaWVuKSBEcml2ZUZTLmNvbmZpZy5oaWRkZW5LYXRl -Z29yaWVuID0gW107CiAgICAgICAgaWYgKCFEcml2ZUZTLmNvbmZpZy5oaWRkZW5LYXRlZ29yaWVu -LmluY2x1ZGVzKGthdCkpIHsKICAgICAgICAgICAgRHJpdmVGUy5jb25maWcuaGlkZGVuS2F0ZWdv -cmllbi5wdXNoKGthdCk7CiAgICAgICAgfQogICAgICAgIGNvbnN0IG9rID0gYXdhaXQgdGhpcy5z -YXZlQ29uZmlnKCk7CiAgICAgICAgaWYgKG9rID09PSBmYWxzZSkgewogICAgICAgICAgICBEcml2 -ZUZTLmNvbmZpZy5oaWRkZW5LYXRlZ29yaWVuID0gRHJpdmVGUy5jb25maWcuaGlkZGVuS2F0ZWdv -cmllbi5maWx0ZXIoZnVuY3Rpb24oayl7IHJldHVybiBrICE9PSBrYXQ7IH0pOwogICAgICAgICAg -ICByZXR1cm47CiAgICAgICAgfQogICAgICAgIERyaXZlUG9ydGFsLnNldHVwRmlsdGVycygpOwog -ICAgICAgIERyaXZlUG9ydGFsLnJlbmRlcigpOwogICAgICAgIGlmIChEcml2ZVBvcnRhbC50YWJs -ZVZpZXdBY3RpdmUpIERyaXZlUG9ydGFsLnJlbmRlclRhYmxlVmlldygpOwogICAgICAgIHRoaXMu -cmVuZGVyQWRtaW4oKTsKICAgICAgICBzaG93VG9hc3QoJ0thdGVnb3JpZSAiJyArIGthdCArICci -IGF1c2dlYmxlbmRldCcsICdzdWNjZXNzJyk7CiAgICB9LAoKICAgIGFzeW5jIHNob3dDYXRlZ29y -eShpbmRleCkgewogICAgICAgIHZhciBrYXQgPSBEcml2ZUZTLmNvbmZpZy5rYXRlZ29yaWVuW2lu -ZGV4XTsKICAgICAgICBpZiAoIURyaXZlRlMuY29uZmlnLmhpZGRlbkthdGVnb3JpZW4pIHJldHVy -bjsKICAgICAgICBEcml2ZUZTLmNvbmZpZy5oaWRkZW5LYXRlZ29yaWVuID0gRHJpdmVGUy5jb25m -aWcuaGlkZGVuS2F0ZWdvcmllbi5maWx0ZXIoZnVuY3Rpb24oayl7IHJldHVybiBrICE9PSBrYXQ7 -IH0pOwogICAgICAgIGNvbnN0IG9rID0gYXdhaXQgdGhpcy5zYXZlQ29uZmlnKCk7CiAgICAgICAg -aWYgKG9rID09PSBmYWxzZSkgewogICAgICAgICAgICBEcml2ZUZTLmNvbmZpZy5oaWRkZW5LYXRl -Z29yaWVuLnB1c2goa2F0KTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBE -cml2ZVBvcnRhbC5zZXR1cEZpbHRlcnMoKTsKICAgICAgICBEcml2ZVBvcnRhbC5yZW5kZXIoKTsK -ICAgICAgICBpZiAoRHJpdmVQb3J0YWwudGFibGVWaWV3QWN0aXZlKSBEcml2ZVBvcnRhbC5yZW5k -ZXJUYWJsZVZpZXcoKTsKICAgICAgICB0aGlzLnJlbmRlckFkbWluKCk7CiAgICAgICAgc2hvd1Rv -YXN0KCdLYXRlZ29yaWUgIicgKyBrYXQgKyAnIiB3aWVkZXIgZWluZ2VibGVuZGV0JywgJ3N1Y2Nl -c3MnKTsKICAgIH0sCgogICAgYXN5bmMgZWRpdFN0YXJ0c2VpdGUoKSB7CiAgICAgICAgdGhpcy5j -bG9zZUFkbWluKCk7CiAgICAgICAgLy8gQWt0dWVsbGVuIFN0YXJ0c2VpdGVuLUluaGFsdCBsYWRl -bgogICAgICAgIHZhciB3ZWxjb21lRWwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcud2VsY29t -ZS1jb250ZW50Jyk7CiAgICAgICAgdmFyIGNvbnRlbnQgPSB3ZWxjb21lRWwgPyB3ZWxjb21lRWwu -aW5uZXJIVE1MIDogJyc7CgogICAgICAgIC8vIEdlc3BlaWNoZXJ0ZW4gSW5oYWx0IGF1cyBEYXRl -aSBsYWRlbiAoZmFsbHMgdm9yaGFuZGVuKQogICAgICAgIHRyeSB7CiAgICAgICAgICAgIGlmIChE -cml2ZUZTLm1vZGUgPT09ICdzZXJ2ZXInKSB7CiAgICAgICAgICAgICAgICB2YXIgcmVzID0gYXdh -aXQgZmV0Y2goJy9kYXRhLy5zdGFydHNlaXRlLmh0bWwnKTsKICAgICAgICAgICAgICAgIGlmIChy -ZXMub2spIGNvbnRlbnQgPSBhd2FpdCByZXMudGV4dCgpOwogICAgICAgICAgICB9IGVsc2UgaWYg -KERyaXZlRlMubW9kZSA9PT0gJ3N0YXRpYycpIHsKICAgICAgICAgICAgICAgIHZhciByZXMyID0g -YXdhaXQgZmV0Y2goJ2RhdGEvLnN0YXJ0c2VpdGUuaHRtbCcpOwogICAgICAgICAgICAgICAgaWYg -KHJlczIub2spIGNvbnRlbnQgPSBhd2FpdCByZXMyLnRleHQoKTsKICAgICAgICAgICAgfSBlbHNl -IGlmIChEcml2ZUZTLm1vZGUgPT09ICdmaWxlc3lzdGVtJyAmJiBEcml2ZUZTLl9kYXRhSGFuZGxl -KSB7CiAgICAgICAgICAgICAgICB2YXIgZmggPSBhd2FpdCBEcml2ZUZTLl9kYXRhSGFuZGxlLmdl -dEZpbGVIYW5kbGUoJy5zdGFydHNlaXRlLmh0bWwnKTsKICAgICAgICAgICAgICAgIHZhciBmaWxl -ID0gYXdhaXQgZmguZ2V0RmlsZSgpOwogICAgICAgICAgICAgICAgY29udGVudCA9IGF3YWl0IGZp -bGUudGV4dCgpOwogICAgICAgICAgICB9CiAgICAgICAgfSBjYXRjaChlKSB7fQoKICAgICAgICAv -LyBFZGl0b3Igb2VmZm5lbiBtaXQgU3RhcnRzZWl0ZW4tSW5oYWx0CiAgICAgICAgRHJpdmVFZGl0 -b3IuaXNOZXcgPSBmYWxzZTsKICAgICAgICBEcml2ZUVkaXRvci5faXNTdGFydHNlaXRlID0gdHJ1 -ZTsKICAgICAgICBEcml2ZUVkaXRvci5jdXJyZW50RG9jID0gewogICAgICAgICAgICBpZDogJ19z -dGFydHNlaXRlJywKICAgICAgICAgICAgdGl0ZWw6ICdTdGFydHNlaXRlJywKICAgICAgICAgICAg -a2F0ZWdvcmllOiAnJywKICAgICAgICAgICAgaW5oYWx0OiBjb250ZW50LAogICAgICAgICAgICBz -dGF0dXM6ICcnLAogICAgICAgICAgICBtZWRpYXM6IFtdCiAgICAgICAgfTsKICAgICAgICBEcml2 -ZUVkaXRvci5vcGVuTW9kYWwoJ1N0YXJ0c2VpdGUgYmVhcmJlaXRlbicpOwogICAgICAgIC8vIEth -dGVnb3JpZS9TdGF0dXMvTWV0YS1GZWxkZXIgYXVzYmxlbmRlbiAobmljaHQgcmVsZXZhbnQgZnVl -ciBTdGFydHNlaXRlKQogICAgICAgIHZhciBtZXRhUm93cyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0 -b3JBbGwoJy5lZGl0b3ItbWV0YS1yb3cnKTsKICAgICAgICBtZXRhUm93cy5mb3JFYWNoKGZ1bmN0 -aW9uKHJvdykgeyByb3cuc3R5bGUuZGlzcGxheSA9ICdub25lJzsgfSk7CiAgICB9LAoKICAgIGFz -eW5jIHNhdmVTdGFydHNlaXRlKGNvbnRlbnQpIHsKICAgICAgICBpZiAoRHJpdmVGUy5tb2RlID09 -PSAnc2VydmVyJykgewogICAgICAgICAgICBhd2FpdCBmZXRjaCgnL2FwaS93cml0ZScsIHsgbWV0 -aG9kOiAnUE9TVCcsIGhlYWRlcnM6IHsnQ29udGVudC1UeXBlJzonYXBwbGljYXRpb24vanNvbjsg -Y2hhcnNldD11dGYtOCd9LAogICAgICAgICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBw -YXRoOiAnZGF0YS8uc3RhcnRzZWl0ZS5odG1sJywgZGF0YTogY29udGVudCB9KSB9KTsKICAgICAg -ICB9IGVsc2UgaWYgKERyaXZlRlMubW9kZSA9PT0gJ2ZpbGVzeXN0ZW0nICYmIERyaXZlRlMuX2Rh -dGFIYW5kbGUpIHsKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgIHZhciBmaCA9IGF3 -YWl0IERyaXZlRlMuX2RhdGFIYW5kbGUuZ2V0RmlsZUhhbmRsZSgnLnN0YXJ0c2VpdGUuaHRtbCcs -IHsgY3JlYXRlOiB0cnVlIH0pOwogICAgICAgICAgICAgICAgdmFyIHdyaXRhYmxlID0gYXdhaXQg -ZmguY3JlYXRlV3JpdGFibGUoKTsKICAgICAgICAgICAgICAgIGF3YWl0IHdyaXRhYmxlLndyaXRl -KGNvbnRlbnQpOwogICAgICAgICAgICAgICAgYXdhaXQgd3JpdGFibGUuY2xvc2UoKTsKICAgICAg -ICAgICAgfSBjYXRjaChlKSB7fQogICAgICAgIH0KICAgICAgICAvLyBTdGFydHNlaXRlIGltIERP -TSBha3R1YWxpc2llcmVuICsgQ2FjaGUgZnVlciBzaG93SG9tZSgpIGVybmV1ZXJuCiAgICAgICAg -dmFyIHdlbGNvbWVFbCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy53ZWxjb21lLWNvbnRlbnQn -KTsKICAgICAgICBpZiAod2VsY29tZUVsKSB7CiAgICAgICAgICAgIHdlbGNvbWVFbC5pbm5lckhU -TUwgPSB0aGlzLl9zYW5pdGl6ZUhUTUwoY29udGVudCk7CiAgICAgICAgICAgIERyaXZlUG9ydGFs -Ll93ZWxjb21lSFRNTCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkb2N1bWVudERldGFpbCcp -LmlubmVySFRNTDsKICAgICAgICB9CiAgICAgICAgc2hvd1RvYXN0KCdTdGFydHNlaXRlIGdlc3Bl -aWNoZXJ0JywgJ3N1Y2Nlc3MnKTsKICAgICAgICAvLyBpbmRleC5qcyBmdWVyIExlc2Vtb2R1cyBh -a3R1YWxpc2llcmVuIChTdGFydHNlaXRlIGlzdCBkYXJpbiBlaW5nZWJldHRldCkKICAgICAgICBh -d2FpdCBEcml2ZUZTLnVwZGF0ZUluZGV4KCk7CiAgICB9LAoKICAgIGFzeW5jIGxvYWRTdGFydHNl -aXRlKCkgewogICAgICAgIHRyeSB7CiAgICAgICAgICAgIHZhciByYXcgPSBudWxsOwogICAgICAg -ICAgICBpZiAoRHJpdmVGUy5tb2RlID09PSAnc2VydmVyJykgewogICAgICAgICAgICAgICAgdmFy -IHJlcyA9IGF3YWl0IGZldGNoKCcvZGF0YS8uc3RhcnRzZWl0ZS5odG1sJyk7CiAgICAgICAgICAg -ICAgICBpZiAocmVzLm9rKSByYXcgPSBhd2FpdCByZXMudGV4dCgpOwogICAgICAgICAgICB9IGVs -c2UgaWYgKERyaXZlRlMubW9kZSA9PT0gJ3N0YXRpYycpIHsKICAgICAgICAgICAgICAgIHZhciBy -ZXMyID0gYXdhaXQgZmV0Y2goJ2RhdGEvLnN0YXJ0c2VpdGUuaHRtbCcpOwogICAgICAgICAgICAg -ICAgaWYgKHJlczIub2spIHJhdyA9IGF3YWl0IHJlczIudGV4dCgpOwogICAgICAgICAgICB9IGVs -c2UgaWYgKERyaXZlRlMubW9kZSA9PT0gJ2ZpbGVzeXN0ZW0nICYmIERyaXZlRlMuX2RhdGFIYW5k -bGUpIHsKICAgICAgICAgICAgICAgIHZhciBmaCA9IGF3YWl0IERyaXZlRlMuX2RhdGFIYW5kbGUu -Z2V0RmlsZUhhbmRsZSgnLnN0YXJ0c2VpdGUuaHRtbCcpOwogICAgICAgICAgICAgICAgdmFyIGZp -bGUgPSBhd2FpdCBmaC5nZXRGaWxlKCk7CiAgICAgICAgICAgICAgICByYXcgPSBhd2FpdCBmaWxl -LnRleHQoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAocmF3ICYmIHJhdy5sZW5ndGgg -PiAxMCkgewogICAgICAgICAgICAgICAgdmFyIHdlbGNvbWVFbCA9IGRvY3VtZW50LnF1ZXJ5U2Vs -ZWN0b3IoJy53ZWxjb21lLWNvbnRlbnQnKTsKICAgICAgICAgICAgICAgIGlmICh3ZWxjb21lRWwp -IHsKICAgICAgICAgICAgICAgICAgICB3ZWxjb21lRWwuaW5uZXJIVE1MID0gdGhpcy5fc2FuaXRp -emVIVE1MKHJhdyk7CiAgICAgICAgICAgICAgICAgICAgLy8gQ2FjaGUgYWt0dWFsaXNpZXJlbiwg -ZGFtaXQgc2hvd0hvbWUoKSBkZW4gZ2VzcGVpY2hlcnRlbiBJbmhhbHQgemVpZ3QKICAgICAgICAg -ICAgICAgICAgICBEcml2ZVBvcnRhbC5fd2VsY29tZUhUTUwgPSBkb2N1bWVudC5nZXRFbGVtZW50 -QnlJZCgnZG9jdW1lbnREZXRhaWwnKS5pbm5lckhUTUw7CiAgICAgICAgICAgICAgICB9CiAgICAg -ICAgICAgIH0KICAgICAgICB9IGNhdGNoKGUpIHt9CiAgICB9LAoKICAgIGFzeW5jIHNhdmVIZWxw -Q29udGVudCgpIHsKICAgICAgICB2YXIgY29udGVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlk -KCdoZWxwQm9keScpLmlubmVySFRNTDsKICAgICAgICAvLyBQZXJzaXN0aWVyZW4gYWxzIGRhdGEv -LmhlbHAtY29udGVudC5odG1sCiAgICAgICAgaWYgKERyaXZlRlMubW9kZSA9PT0gJ3NlcnZlcicp -IHsKICAgICAgICAgICAgYXdhaXQgZmV0Y2goJy9hcGkvd3JpdGUnLCB7IG1ldGhvZDogJ1BPU1Qn -LCBoZWFkZXJzOiB7J0NvbnRlbnQtVHlwZSc6J2FwcGxpY2F0aW9uL2pzb247IGNoYXJzZXQ9dXRm -LTgnfSwKICAgICAgICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgcGF0aDogJ2RhdGEv -LmhlbHAtY29udGVudC5odG1sJywgZGF0YTogY29udGVudCB9KSB9KTsKICAgICAgICB9IGVsc2Ug -aWYgKERyaXZlRlMubW9kZSA9PT0gJ2ZpbGVzeXN0ZW0nICYmIERyaXZlRlMuX2RhdGFIYW5kbGUp -IHsKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgIHZhciBmaCA9IGF3YWl0IERyaXZl -RlMuX2RhdGFIYW5kbGUuZ2V0RmlsZUhhbmRsZSgnLmhlbHAtY29udGVudC5odG1sJywgeyBjcmVh -dGU6IHRydWUgfSk7CiAgICAgICAgICAgICAgICB2YXIgd3JpdGFibGUgPSBhd2FpdCBmaC5jcmVh -dGVXcml0YWJsZSgpOwogICAgICAgICAgICAgICAgYXdhaXQgd3JpdGFibGUud3JpdGUoY29udGVu -dCk7CiAgICAgICAgICAgICAgICBhd2FpdCB3cml0YWJsZS5jbG9zZSgpOwogICAgICAgICAgICB9 -IGNhdGNoKGUpIHt9CiAgICAgICAgfQogICAgICAgIHNob3dUb2FzdCgnSGlsZmUtSW5oYWx0IGdl -c3BlaWNoZXJ0JywgJ3N1Y2Nlc3MnKTsKICAgIH0sCgogICAgX3Nhbml0aXplSFRNTChodG1sKSB7 -CiAgICAgICAgLy8gU2NyaXB0LVRhZ3MsIEV2ZW50LUhhbmRsZXIgdW5kIGdlZsOkaHJsaWNoZSBB -dHRyaWJ1dGUgZW50ZmVybmVuCiAgICAgICAgdmFyIGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1l -bnQoJ2RpdicpOwogICAgICAgIGRpdi5pbm5lckhUTUwgPSBodG1sOwogICAgICAgIGRpdi5xdWVy -eVNlbGVjdG9yQWxsKCdzY3JpcHQsaWZyYW1lLG9iamVjdCxlbWJlZCxmb3JtJykuZm9yRWFjaChm -dW5jdGlvbihlbCl7IGVsLnJlbW92ZSgpOyB9KTsKICAgICAgICBkaXYucXVlcnlTZWxlY3RvckFs -bCgnKicpLmZvckVhY2goZnVuY3Rpb24oZWwpIHsKICAgICAgICAgICAgQXJyYXkuZnJvbShlbC5h -dHRyaWJ1dGVzKS5mb3JFYWNoKGZ1bmN0aW9uKGF0dHIpIHsKICAgICAgICAgICAgICAgIGlmIChh -dHRyLm5hbWUuc3RhcnRzV2l0aCgnb24nKSB8fCBhdHRyLnZhbHVlLnRyaW0oKS50b0xvd2VyQ2Fz -ZSgpLnN0YXJ0c1dpdGgoJ2phdmFzY3JpcHQ6JykpIHsKICAgICAgICAgICAgICAgICAgICBlbC5y -ZW1vdmVBdHRyaWJ1dGUoYXR0ci5uYW1lKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAg -fSk7CiAgICAgICAgfSk7CiAgICAgICAgcmV0dXJuIGRpdi5pbm5lckhUTUw7CiAgICB9LAoKICAg -IGFzeW5jIGxvYWRIZWxwQ29udGVudCgpIHsKICAgICAgICB0cnkgewogICAgICAgICAgICB2YXIg -cmF3ID0gbnVsbDsKICAgICAgICAgICAgaWYgKERyaXZlRlMubW9kZSA9PT0gJ3NlcnZlcicpIHsK -ICAgICAgICAgICAgICAgIHZhciByZXMgPSBhd2FpdCBmZXRjaCgnL2RhdGEvLmhlbHAtY29udGVu -dC5odG1sJyk7CiAgICAgICAgICAgICAgICBpZiAocmVzLm9rKSByYXcgPSBhd2FpdCByZXMudGV4 -dCgpOwogICAgICAgICAgICB9IGVsc2UgaWYgKERyaXZlRlMubW9kZSA9PT0gJ3N0YXRpYycpIHsK -ICAgICAgICAgICAgICAgIHZhciByZXMyID0gYXdhaXQgZmV0Y2goJ2RhdGEvLmhlbHAtY29udGVu -dC5odG1sJyk7CiAgICAgICAgICAgICAgICBpZiAocmVzMi5vaykgcmF3ID0gYXdhaXQgcmVzMi50 -ZXh0KCk7CiAgICAgICAgICAgIH0gZWxzZSBpZiAoRHJpdmVGUy5tb2RlID09PSAnZmlsZXN5c3Rl -bScgJiYgRHJpdmVGUy5fZGF0YUhhbmRsZSkgewogICAgICAgICAgICAgICAgdmFyIGZoID0gYXdh -aXQgRHJpdmVGUy5fZGF0YUhhbmRsZS5nZXRGaWxlSGFuZGxlKCcuaGVscC1jb250ZW50Lmh0bWwn -KTsKICAgICAgICAgICAgICAgIHZhciBmaWxlID0gYXdhaXQgZmguZ2V0RmlsZSgpOwogICAgICAg -ICAgICAgICAgcmF3ID0gYXdhaXQgZmlsZS50ZXh0KCk7CiAgICAgICAgICAgIH0KICAgICAgICAg -ICAgaWYgKHJhdyAmJiByYXcubGVuZ3RoID4gMTApIHsKICAgICAgICAgICAgICAgIGRvY3VtZW50 -LmdldEVsZW1lbnRCeUlkKCdoZWxwQm9keScpLmlubmVySFRNTCA9IHRoaXMuX3Nhbml0aXplSFRN -TChyYXcpOwogICAgICAgICAgICB9CiAgICAgICAgfSBjYXRjaChlKSB7fQogICAgfSwKCiAgICBh -c3luYyBzYXZlQ29uZmlnKCkgewogICAgICAgIHRyeSB7CiAgICAgICAgICAgIGlmIChEcml2ZUZT -Lm1vZGUgPT09ICdzZXJ2ZXInKSB7CiAgICAgICAgICAgICAgICBjb25zdCByZXMgPSBhd2FpdCBm -ZXRjaCgnL2FwaS93cml0ZScsIHsKICAgICAgICAgICAgICAgICAgICBtZXRob2Q6ICdQT1NUJywK -ICAgICAgICAgICAgICAgICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRp -b24vanNvbjsgY2hhcnNldD11dGYtOCcgfSwKICAgICAgICAgICAgICAgICAgICBib2R5OiBKU09O -LnN0cmluZ2lmeSh7IHBhdGg6ICdkYXRhL2NvbmZpZy5qc29uJywgZGF0YTogRHJpdmVGUy5jb25m -aWcgfSkKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0g -YXdhaXQgcmVzLmpzb24oKTsKICAgICAgICAgICAgICAgIGlmICghcmVzdWx0Lm9rKSB7CiAgICAg -ICAgICAgICAgICAgICAgc2hvd1RvYXN0KCdLb25maWd1cmF0aW9uIHNwZWljaGVybiBmZWhsZ2Vz -Y2hsYWdlbjogJyArIChyZXN1bHQuZXJyb3IgfHwgJ1VuYmVrYW5udGVyIEZlaGxlcicpLCAnZXJy -b3InLCA1MDAwKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAg -ICAgICB9CiAgICAgICAgICAgIH0gZWxzZSBpZiAoRHJpdmVGUy5tb2RlID09PSAnZmlsZXN5c3Rl -bScgJiYgRHJpdmVGUy5fZGF0YUhhbmRsZSkgewogICAgICAgICAgICAgICAgdmFyIGZoID0gYXdh -aXQgRHJpdmVGUy5fZGF0YUhhbmRsZS5nZXRGaWxlSGFuZGxlKCdjb25maWcuanNvbicsIHsgY3Jl -YXRlOiB0cnVlIH0pOwogICAgICAgICAgICAgICAgdmFyIHdyaXRhYmxlID0gYXdhaXQgZmguY3Jl -YXRlV3JpdGFibGUoKTsKICAgICAgICAgICAgICAgIGF3YWl0IHdyaXRhYmxlLndyaXRlKEpTT04u -c3RyaW5naWZ5KERyaXZlRlMuY29uZmlnLCBudWxsLCAyKSk7CiAgICAgICAgICAgICAgICBhd2Fp -dCB3cml0YWJsZS5jbG9zZSgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiB0cnVl -OwogICAgICAgIH0gY2F0Y2ggKGVycikgewogICAgICAgICAgICBzaG93VG9hc3QoJ0tvbmZpZ3Vy -YXRpb24gc3BlaWNoZXJuIGZlaGxnZXNjaGxhZ2VuOiAnICsgZXJyLm1lc3NhZ2UsICdlcnJvcics -IDUwMDApOwogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgfSwKCiAgICBf -ZW5nYWdlbWVudFNvcnQ6ICd0b3RhbCcsCiAgICBfZW5nYWdlbWVudENhdDogJ2FsbCcsCgogICAg -c2hvd0VuZ2FnZW1lbnRTdGF0cyhzb3J0QnksIGZpbHRlckNhdCkgewogICAgICAgIHRoaXMuY2xv -c2VBZG1pbigpOwogICAgICAgIGlmIChzb3J0QnkpIHRoaXMuX2VuZ2FnZW1lbnRTb3J0ID0gc29y -dEJ5OwogICAgICAgIGlmIChmaWx0ZXJDYXQgIT09IHVuZGVmaW5lZCkgdGhpcy5fZW5nYWdlbWVu -dENhdCA9IGZpbHRlckNhdDsKICAgICAgICB2YXIgc29ydCA9IHRoaXMuX2VuZ2FnZW1lbnRTb3J0 -OwogICAgICAgIHZhciBjYXRGaWx0ZXIgPSB0aGlzLl9lbmdhZ2VtZW50Q2F0OwogICAgICAgIHZh -ciBkb2NzID0gRHJpdmVGUy5kb2N1bWVudHM7CiAgICAgICAgdmFyIGthdGVnb3JpZW4gPSBEcml2 -ZUZTLmNvbmZpZy5rYXRlZ29yaWVuIHx8IFtdOwogICAgICAgIHZhciB0b3RhbERvY3MgPSBkb2Nz -Lmxlbmd0aDsKICAgICAgICB2YXIgdG90YWxGcmVpZ2VnZWJlbiA9IGRvY3MuZmlsdGVyKGZ1bmN0 -aW9uKGQpeyByZXR1cm4gZC5zdGF0dXMgPT09ICdGcmVpZ2VnZWJlbic7IH0pLmxlbmd0aDsKICAg -ICAgICB2YXIgdG90YWxQcnVlZnVuZyA9IGRvY3MuZmlsdGVyKGZ1bmN0aW9uKGQpeyByZXR1cm4g -ZC5zdGF0dXMgPT09ICdQcsO8ZnVuZyc7IH0pLmxlbmd0aDsKICAgICAgICB2YXIgdG90YWxFbnR3 -dXJmID0gZG9jcy5maWx0ZXIoZnVuY3Rpb24oZCl7IHJldHVybiBkLnN0YXR1cyA9PT0gJ0VudHd1 -cmYnOyB9KS5sZW5ndGg7CiAgICAgICAgdmFyIHRvdGFsV2l0aE1lZGlhID0gZG9jcy5maWx0ZXIo -ZnVuY3Rpb24oZCl7IHJldHVybiBkLm1lZGlhcyAmJiBkLm1lZGlhcy5sZW5ndGggPiAwOyB9KS5s -ZW5ndGg7CgogICAgICAgIC8vIFVzZXItQmVpdHLDpGdlIHrDpGhsZW4g4oCTIGF1Zmdlc2NobMO8 -c3NlbHQgbmFjaCBLYXRlZ29yaWUKICAgICAgICB2YXIgdXNlclN0YXRzID0ge307CiAgICAgICAg -ZG9jcy5mb3JFYWNoKGZ1bmN0aW9uKGRvYykgewogICAgICAgICAgICB2YXIga2F0ID0gZG9jLmth -dGVnb3JpZSB8fCAnU29uc3RpZ2UnOwogICAgICAgICAgICBmdW5jdGlvbiBlbnN1cmUobmFtZSkg -ewogICAgICAgICAgICAgICAgaWYgKCF1c2VyU3RhdHNbbmFtZV0pIHVzZXJTdGF0c1tuYW1lXSA9 -IHsgY3JlYXRlZDogMCwgZWRpdGVkOiAwLCByZXZpZXdzOiAwLCBrYXRlZ29yaWVuOiB7fSB9Owog -ICAgICAgICAgICAgICAgaWYgKCF1c2VyU3RhdHNbbmFtZV0ua2F0ZWdvcmllbltrYXRdKSB1c2Vy -U3RhdHNbbmFtZV0ua2F0ZWdvcmllbltrYXRdID0geyBjcmVhdGVkOiAwLCBlZGl0ZWQ6IDAsIHJl -dmlld3M6IDAgfTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoZG9jLmVyc3RlbGx0Vm9u -KSB7CiAgICAgICAgICAgICAgICBlbnN1cmUoZG9jLmVyc3RlbGx0Vm9uKTsKICAgICAgICAgICAg -ICAgIHVzZXJTdGF0c1tkb2MuZXJzdGVsbHRWb25dLmNyZWF0ZWQrKzsKICAgICAgICAgICAgICAg -IHVzZXJTdGF0c1tkb2MuZXJzdGVsbHRWb25dLmthdGVnb3JpZW5ba2F0XS5jcmVhdGVkKys7CiAg -ICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGRvYy5iZWFyYmVpdGV0Vm9uICYmIGRvYy5iZWFy -YmVpdGV0Vm9uICE9PSBkb2MuZXJzdGVsbHRWb24pIHsKICAgICAgICAgICAgICAgIGVuc3VyZShk -b2MuYmVhcmJlaXRldFZvbik7CiAgICAgICAgICAgICAgICB1c2VyU3RhdHNbZG9jLmJlYXJiZWl0 -ZXRWb25dLmVkaXRlZCsrOwogICAgICAgICAgICAgICAgdXNlclN0YXRzW2RvYy5iZWFyYmVpdGV0 -Vm9uXS5rYXRlZ29yaWVuW2thdF0uZWRpdGVkKys7CiAgICAgICAgICAgIH0KICAgICAgICAgICAg -KGRvYy5jb250cmlidXRvcnMgfHwgW10pLmZvckVhY2goZnVuY3Rpb24oYykgewogICAgICAgICAg -ICAgICAgZW5zdXJlKGMudXNlcm5hbWUpOwogICAgICAgICAgICAgICAgaWYgKGMucm9sZSA9PT0g -J3JldmlldycpIHsKICAgICAgICAgICAgICAgICAgICB1c2VyU3RhdHNbYy51c2VybmFtZV0ucmV2 -aWV3cyArPSAoYy5lbnRyaWVzIHx8IDEpOwogICAgICAgICAgICAgICAgICAgIHVzZXJTdGF0c1tj -LnVzZXJuYW1lXS5rYXRlZ29yaWVuW2thdF0ucmV2aWV3cyArPSAoYy5lbnRyaWVzIHx8IDEpOwog -ICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjLnJvbGUgPT09ICdhdXRvcicpIHsKICAgICAgICAg -ICAgICAgICAgICB1c2VyU3RhdHNbYy51c2VybmFtZV0uY3JlYXRlZCArPSAoYy5lbnRyaWVzIHx8 -IDEpIC0gMTsgLy8gLTEgd2VpbCBlcnN0ZWxsdFZvbiBzY2hvbiB6w6RobHQKICAgICAgICAgICAg -ICAgICAgICB1c2VyU3RhdHNbYy51c2VybmFtZV0ua2F0ZWdvcmllbltrYXRdLmNyZWF0ZWQgKz0g -KGMuZW50cmllcyB8fCAxKSAtIDE7CiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGMucm9sZSA9 -PT0gJ3JlZGFrdGlvbicpIHsKICAgICAgICAgICAgICAgICAgICB1c2VyU3RhdHNbYy51c2VybmFt -ZV0uZWRpdGVkICs9IChjLmVudHJpZXMgfHwgMSk7CiAgICAgICAgICAgICAgICAgICAgdXNlclN0 -YXRzW2MudXNlcm5hbWVdLmthdGVnb3JpZW5ba2F0XS5lZGl0ZWQgKz0gKGMuZW50cmllcyB8fCAx -KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHZhciBnb3Yg -PSBkb2MuZ292ZXJuYW5jZSB8fCB7fTsKICAgICAgICAgICAgKGdvdi5yZXZpZXdIaXN0b3J5IHx8 -IFtdKS5mb3JFYWNoKGZ1bmN0aW9uKHIpIHsKICAgICAgICAgICAgICAgIGlmIChyLnJldmlld2Vy -KSB7CiAgICAgICAgICAgICAgICAgICAgZW5zdXJlKHIucmV2aWV3ZXIpOwogICAgICAgICAgICAg -ICAgICAgIHVzZXJTdGF0c1tyLnJldmlld2VyXS5yZXZpZXdzKys7CiAgICAgICAgICAgICAgICAg -ICAgdXNlclN0YXRzW3IucmV2aWV3ZXJdLmthdGVnb3JpZW5ba2F0XS5yZXZpZXdzKys7CiAgICAg -ICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0pOwoKICAgICAgICAvLyBTb3J0 -aWVydW5nCiAgICAgICAgdmFyIHNvcnRlZFVzZXJzID0gT2JqZWN0LmVudHJpZXModXNlclN0YXRz -KTsKICAgICAgICB2YXIgZ2V0VmFsID0gZnVuY3Rpb24ocykgewogICAgICAgICAgICB2YXIgZCA9 -IHNbMV07CiAgICAgICAgICAgIGlmIChjYXRGaWx0ZXIgIT09ICdhbGwnKSBkID0gZC5rYXRlZ29y -aWVuW2NhdEZpbHRlcl0gfHwgeyBjcmVhdGVkOjAsIGVkaXRlZDowLCByZXZpZXdzOjAgfTsKICAg -ICAgICAgICAgaWYgKHNvcnQgPT09ICdjcmVhdGVkJykgcmV0dXJuIGQuY3JlYXRlZDsKICAgICAg -ICAgICAgaWYgKHNvcnQgPT09ICdlZGl0ZWQnKSByZXR1cm4gZC5lZGl0ZWQ7CiAgICAgICAgICAg -IGlmIChzb3J0ID09PSAncmV2aWV3cycpIHJldHVybiBkLnJldmlld3M7CiAgICAgICAgICAgIHJl -dHVybiBkLmNyZWF0ZWQgKyBkLmVkaXRlZCArIGQucmV2aWV3czsKICAgICAgICB9OwogICAgICAg -IHNvcnRlZFVzZXJzLnNvcnQoZnVuY3Rpb24oYSxiKXsgcmV0dXJuIGdldFZhbChiKSAtIGdldFZh -bChhKTsgfSk7CiAgICAgICAgc29ydGVkVXNlcnMgPSBzb3J0ZWRVc2Vycy5maWx0ZXIoZnVuY3Rp -b24odSl7IHJldHVybiBnZXRWYWwodSkgPiAwOyB9KTsKCiAgICAgICAgLy8gS2F0ZWdvcmllbi1W -ZXJ0ZWlsdW5nCiAgICAgICAgdmFyIGNhdFN0YXRzID0ge307CiAgICAgICAgZG9jcy5mb3JFYWNo -KGZ1bmN0aW9uKGQpIHsgY2F0U3RhdHNbZC5rYXRlZ29yaWVdID0gKGNhdFN0YXRzW2Qua2F0ZWdv -cmllXSB8fCAwKSArIDE7IH0pOwoKICAgICAgICAvLyBTY2hsYWd3b3J0LUjDpHVmaWdrZWl0ZW4K -ICAgICAgICB2YXIga3dTdGF0cyA9IHt9OwogICAgICAgIGRvY3MuZm9yRWFjaChmdW5jdGlvbihk -KSB7IChkLnNjaGxhZ3dvZXJ0ZXIgfHwgW10pLmZvckVhY2goZnVuY3Rpb24oaykgeyBrd1N0YXRz -W2tdID0gKGt3U3RhdHNba10gfHwgMCkgKyAxOyB9KTsgfSk7CiAgICAgICAgdmFyIHRvcEt3cyA9 -IE9iamVjdC5lbnRyaWVzKGt3U3RhdHMpLnNvcnQoZnVuY3Rpb24oYSxiKXsgcmV0dXJuIGJbMV0t -YVsxXTsgfSkuc2xpY2UoMCwgMTApOwoKICAgICAgICAvLyBNb25hdGxpY2hlIEVyc3RlbGx1bmcK -ICAgICAgICB2YXIgbW9udGhTdGF0cyA9IHt9OwogICAgICAgIGRvY3MuZm9yRWFjaChmdW5jdGlv -bihkKSB7IHZhciBtID0gKGQuZXJzdGVsbHQgfHwgJycpLnN1YnN0cmluZygwLCA3KTsgaWYgKG0p -IG1vbnRoU3RhdHNbbV0gPSAobW9udGhTdGF0c1ttXSB8fCAwKSArIDE7IH0pOwogICAgICAgIHZh -ciBtb250aHMgPSBPYmplY3QuZW50cmllcyhtb250aFN0YXRzKS5zb3J0KGZ1bmN0aW9uKGEsYil7 -IHJldHVybiBhWzBdLmxvY2FsZUNvbXBhcmUoYlswXSk7IH0pOwoKICAgICAgICB2YXIgbWF4Q2F0 -ID0gTWF0aC5tYXguYXBwbHkobnVsbCwgT2JqZWN0LnZhbHVlcyhjYXRTdGF0cykuY29uY2F0KFsx -XSkpOwogICAgICAgIHZhciBtYXhLdyA9IHRvcEt3cy5sZW5ndGggPiAwID8gdG9wS3dzWzBdWzFd -IDogMTsKICAgICAgICB2YXIgbWF4TW9udGggPSBtb250aHMubGVuZ3RoID4gMCA/IE1hdGgubWF4 -LmFwcGx5KG51bGwsIG1vbnRocy5tYXAoZnVuY3Rpb24obSl7cmV0dXJuIG1bMV07fSkpIDogMTsK -CiAgICAgICAgdmFyIGh0bWwgPSAnPGRpdiBzdHlsZT0icGFkZGluZzoyMHB4OyI+PGgyIHN0eWxl -PSJjb2xvcjp2YXIoLS10ZXh0LWhlYWRpbmcpO21hcmdpbi1ib3R0b206MjBweDsiPlVzZXItRW5n -YWdlbWVudCBTdGF0aXN0aWs8L2gyPic7CgogICAgICAgIC8vIMOcYmVyc2ljaHRza2FydGVuCiAg -ICAgICAgaHRtbCArPSAnPGRpdiBjbGFzcz0ic3RhdC1ncmlkIj4nICsKICAgICAgICAgICAgJzxk -aXYgY2xhc3M9InN0YXQtY2FyZCI+PGRpdiBjbGFzcz0ic3RhdC12YWx1ZSI+JyArIHRvdGFsRG9j -cyArICc8L2Rpdj48ZGl2IGNsYXNzPSJzdGF0LWxhYmVsIj5Eb2t1bWVudGUgZ2VzYW10PC9kaXY+ -PC9kaXY+JyArCiAgICAgICAgICAgICc8ZGl2IGNsYXNzPSJzdGF0LWNhcmQiPjxkaXYgY2xhc3M9 -InN0YXQtdmFsdWUiIHN0eWxlPSJjb2xvcjojMTU1NzI0OyI+JyArIHRvdGFsRnJlaWdlZ2ViZW4g -KyAnPC9kaXY+PGRpdiBjbGFzcz0ic3RhdC1sYWJlbCI+RnJlaWdlZ2ViZW48L2Rpdj48L2Rpdj4n -ICsKICAgICAgICAgICAgJzxkaXYgY2xhc3M9InN0YXQtY2FyZCI+PGRpdiBjbGFzcz0ic3RhdC12 -YWx1ZSIgc3R5bGU9ImNvbG9yOiM3QTQ0MTk7Ij4nICsgdG90YWxQcnVlZnVuZyArICc8L2Rpdj48 -ZGl2IGNsYXNzPSJzdGF0LWxhYmVsIj5JbiBQcsO8ZnVuZzwvZGl2PjwvZGl2PicgKwogICAgICAg -ICAgICAnPGRpdiBjbGFzcz0ic3RhdC1jYXJkIj48ZGl2IGNsYXNzPSJzdGF0LXZhbHVlIiBzdHls -ZT0iY29sb3I6Izg1NjQwNDsiPicgKyB0b3RhbEVudHd1cmYgKyAnPC9kaXY+PGRpdiBjbGFzcz0i -c3RhdC1sYWJlbCI+RW50d8O8cmZlPC9kaXY+PC9kaXY+JyArCiAgICAgICAgICAgICc8ZGl2IGNs -YXNzPSJzdGF0LWNhcmQiPjxkaXYgY2xhc3M9InN0YXQtdmFsdWUiPicgKyB0b3RhbFdpdGhNZWRp -YSArICc8L2Rpdj48ZGl2IGNsYXNzPSJzdGF0LWxhYmVsIj5NaXQgTWVkaWVuPC9kaXY+PC9kaXY+ -JyArCiAgICAgICAgICAgICc8ZGl2IGNsYXNzPSJzdGF0LWNhcmQiPjxkaXYgY2xhc3M9InN0YXQt -dmFsdWUiPicgKyBPYmplY3Qua2V5cyh1c2VyU3RhdHMpLmxlbmd0aCArICc8L2Rpdj48ZGl2IGNs -YXNzPSJzdGF0LWxhYmVsIj5Ba3RpdmUgQmVudXR6ZXI8L2Rpdj48L2Rpdj4nICsKICAgICAgICAn -PC9kaXY+JzsKCiAgICAgICAgLy8gLS0tIEJlbnV0emVyLUFrdGl2aXTDpHQgbWl0IEZpbHRlciAr -IFNvcnRpZXJ1bmcgLS0tCiAgICAgICAgaHRtbCArPSAnPGgzIHN0eWxlPSJjb2xvcjp2YXIoLS10 -ZXh0LWhlYWRpbmcpO21hcmdpbjoyMHB4IDAgOHB4OyI+QmVudXR6ZXItQWt0aXZpdMOkdCBuYWNo -IEJlcmVpY2g8L2gzPic7CgogICAgICAgIC8vIEZpbHRlci1MZWlzdGUKICAgICAgICB2YXIgYnRu -U3R5bGUgPSBmdW5jdGlvbih2YWwsIGN1cnJlbnQsIGVtcHR5KSB7CiAgICAgICAgICAgIGlmICh2 -YWwgPT09IGN1cnJlbnQpIHsKICAgICAgICAgICAgICAgIHJldHVybiAncGFkZGluZzo0cHggMTJw -eDtib3JkZXI6MXB4IHNvbGlkIHZhcigtLXRleHQtaGVhZGluZyk7YmFja2dyb3VuZDp2YXIoLS10 -ZXh0LWhlYWRpbmcpO2NvbG9yOndoaXRlO2JvcmRlci1yYWRpdXM6NHB4O2N1cnNvcjpwb2ludGVy -O2ZvbnQtc2l6ZToxMnB4O2ZvbnQtd2VpZ2h0OjUwMDsnOwogICAgICAgICAgICB9CiAgICAgICAg -ICAgIGlmIChlbXB0eSkgewogICAgICAgICAgICAgICAgcmV0dXJuICdwYWRkaW5nOjRweCAxMnB4 -O2JvcmRlcjoxcHggc29saWQgIzhiMWExYTtiYWNrZ3JvdW5kOiM4YjFhMWE7Y29sb3I6I2ZmZjti -b3JkZXItcmFkaXVzOjRweDtjdXJzb3I6cG9pbnRlcjtmb250LXNpemU6MTJweDtmb250LXdlaWdo -dDo1MDA7JzsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gJ3BhZGRpbmc6NHB4IDEy -cHg7Ym9yZGVyOjFweCBzb2xpZCB2YXIoLS1ib3JkZXItY29sb3IpO2JhY2tncm91bmQ6dmFyKC0t -YmctY2FyZCk7Y29sb3I6dmFyKC0tdGV4dC1wcmltYXJ5KTtib3JkZXItcmFkaXVzOjRweDtjdXJz -b3I6cG9pbnRlcjtmb250LXNpemU6MTJweDtmb250LXdlaWdodDo1MDA7JzsKICAgICAgICB9Owog -ICAgICAgIGh0bWwgKz0gJzxkaXYgc3R5bGU9ImRpc3BsYXk6ZmxleDtnYXA6NnB4O2ZsZXgtd3Jh -cDp3cmFwO21hcmdpbi1ib3R0b206NnB4O2FsaWduLWl0ZW1zOmNlbnRlcjsiPicgKwogICAgICAg -ICAgICAnPHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2NvbG9yOnZhcigtLXRleHQtbXV0ZWQp -O21hcmdpbi1yaWdodDo0cHg7Ij5LYXRlZ29yaWU6PC9zcGFuPicgKwogICAgICAgICAgICAnPGJ1 -dHRvbiBzdHlsZT0iJyArIGJ0blN0eWxlKCdhbGwnLCBjYXRGaWx0ZXIsIGZhbHNlKSArICciIG9u -Y2xpY2s9IkRyaXZlR292ZXJuYW5jZS5zaG93RW5nYWdlbWVudFN0YXRzKG51bGwsXCdhbGxcJyki -PkFsbGU8L2J1dHRvbj4nOwogICAgICAgIGthdGVnb3JpZW4uZm9yRWFjaChmdW5jdGlvbihrKSB7 -CiAgICAgICAgICAgIHZhciBoYXNOb0RvY3MgPSAhY2F0U3RhdHNba107CiAgICAgICAgICAgIGh0 -bWwgKz0gJzxidXR0b24gc3R5bGU9IicgKyBidG5TdHlsZShrLCBjYXRGaWx0ZXIsIGhhc05vRG9j -cykgKyAnIiBvbmNsaWNrPSJEcml2ZUdvdmVybmFuY2Uuc2hvd0VuZ2FnZW1lbnRTdGF0cyhudWxs -LFwnJyArIERyaXZlUG9ydGFsLmVzY2FwZUF0dHIoaykgKyAnXCcpIj4nICsgRHJpdmVQb3J0YWwu -ZXNjYXBlSFRNTChrKSArICc8L2J1dHRvbj4nOwogICAgICAgIH0pOwogICAgICAgIGh0bWwgKz0g -JzwvZGl2Pic7CgogICAgICAgIGh0bWwgKz0gJzxkaXYgc3R5bGU9ImRpc3BsYXk6ZmxleDtnYXA6 -NnB4O2ZsZXgtd3JhcDp3cmFwO21hcmdpbi1ib3R0b206MTBweDthbGlnbi1pdGVtczpjZW50ZXI7 -Ij4nICsKICAgICAgICAgICAgJzxzcGFuIHN0eWxlPSJmb250LXNpemU6MTJweDtjb2xvcjp2YXIo -LS10ZXh0LW11dGVkKTttYXJnaW4tcmlnaHQ6NHB4OyI+U29ydGllcnVuZzo8L3NwYW4+JyArCiAg -ICAgICAgICAgICc8YnV0dG9uIHN0eWxlPSInICsgYnRuU3R5bGUoJ3RvdGFsJywgc29ydCkgKyAn -IiBvbmNsaWNrPSJEcml2ZUdvdmVybmFuY2Uuc2hvd0VuZ2FnZW1lbnRTdGF0cyhcJ3RvdGFsXCcp -Ij5HZXNhbXQ8L2J1dHRvbj4nICsKICAgICAgICAgICAgJzxidXR0b24gc3R5bGU9IicgKyBidG5T -dHlsZSgnY3JlYXRlZCcsIHNvcnQpICsgJyIgb25jbGljaz0iRHJpdmVHb3Zlcm5hbmNlLnNob3dF -bmdhZ2VtZW50U3RhdHMoXCdjcmVhdGVkXCcpIj5FcnN0ZWxsdDwvYnV0dG9uPicgKwogICAgICAg -ICAgICAnPGJ1dHRvbiBzdHlsZT0iJyArIGJ0blN0eWxlKCdlZGl0ZWQnLCBzb3J0KSArICciIG9u -Y2xpY2s9IkRyaXZlR292ZXJuYW5jZS5zaG93RW5nYWdlbWVudFN0YXRzKFwnZWRpdGVkXCcpIj5C -ZWFyYmVpdGV0PC9idXR0b24+JyArCiAgICAgICAgICAgICc8YnV0dG9uIHN0eWxlPSInICsgYnRu -U3R5bGUoJ3Jldmlld3MnLCBzb3J0KSArICciIG9uY2xpY2s9IkRyaXZlR292ZXJuYW5jZS5zaG93 -RW5nYWdlbWVudFN0YXRzKFwncmV2aWV3c1wnKSI+UmV2aWV3czwvYnV0dG9uPicgKwogICAgICAg -ICc8L2Rpdj4nOwoKICAgICAgICAvLyBVc2VyLVRhYmVsbGUKICAgICAgICBpZiAoc29ydGVkVXNl -cnMubGVuZ3RoID4gMCkgewogICAgICAgICAgICBodG1sICs9ICc8dGFibGUgY2xhc3M9ImRyaXZl -LXRhYmxlIiBzdHlsZT0ibWFyZ2luLWJvdHRvbToxNnB4OyI+PHRoZWFkPjx0cj4nICsKICAgICAg -ICAgICAgICAgICc8dGg+QmVudXR6ZXI8L3RoPjx0aCBzdHlsZT0idGV4dC1hbGlnbjpjZW50ZXI7 -Ij5FcnN0ZWxsdDwvdGg+PHRoIHN0eWxlPSJ0ZXh0LWFsaWduOmNlbnRlcjsiPkJlYXJiZWl0ZXQ8 -L3RoPjx0aCBzdHlsZT0idGV4dC1hbGlnbjpjZW50ZXI7Ij5SZXZpZXdzPC90aD48dGggc3R5bGU9 -InRleHQtYWxpZ246Y2VudGVyOyI+R2VzYW10PC90aD48dGg+QWt0aXZzdGUgQmVyZWljaGU8L3Ro -PicgKwogICAgICAgICAgICAnPC90cj48L3RoZWFkPjx0Ym9keT4nOwogICAgICAgICAgICBzb3J0 -ZWRVc2Vycy5mb3JFYWNoKGZ1bmN0aW9uKHUpIHsKICAgICAgICAgICAgICAgIHZhciBkID0gdVsx -XTsKICAgICAgICAgICAgICAgIHZhciB2YWxzID0gKGNhdEZpbHRlciAhPT0gJ2FsbCcgJiYgZC5r -YXRlZ29yaWVuW2NhdEZpbHRlcl0pID8gZC5rYXRlZ29yaWVuW2NhdEZpbHRlcl0gOiBkOwogICAg -ICAgICAgICAgICAgdmFyIHRvdGFsID0gdmFscy5jcmVhdGVkICsgdmFscy5lZGl0ZWQgKyB2YWxz -LnJldmlld3M7CiAgICAgICAgICAgICAgICAvLyBUb3AtS2F0ZWdvcmllbiBmw7xyIGRpZXNlbiBV -c2VyCiAgICAgICAgICAgICAgICB2YXIgdG9wQ2F0cyA9IE9iamVjdC5lbnRyaWVzKGQua2F0ZWdv -cmllbikuc29ydChmdW5jdGlvbihhLGIpewogICAgICAgICAgICAgICAgICAgIHJldHVybiAoYlsx -XS5jcmVhdGVkK2JbMV0uZWRpdGVkK2JbMV0ucmV2aWV3cykgLSAoYVsxXS5jcmVhdGVkK2FbMV0u -ZWRpdGVkK2FbMV0ucmV2aWV3cyk7CiAgICAgICAgICAgICAgICB9KS5zbGljZSgwLCAzKTsKICAg -ICAgICAgICAgICAgIHZhciBjYXRUYWdzID0gdG9wQ2F0cy5tYXAoZnVuY3Rpb24oYykgewogICAg -ICAgICAgICAgICAgICAgIHZhciBjdCA9IGNbMV0uY3JlYXRlZCArIGNbMV0uZWRpdGVkICsgY1sx -XS5yZXZpZXdzOwogICAgICAgICAgICAgICAgICAgIHJldHVybiAnPHNwYW4gY2xhc3M9ImtleXdv -cmQtdGFnIj4nICsgRHJpdmVQb3J0YWwuZXNjYXBlSFRNTChjWzBdKSArICcgKCcgKyBjdCArICcp -PC9zcGFuPic7CiAgICAgICAgICAgICAgICB9KS5qb2luKCcgJyk7CgogICAgICAgICAgICAgICAg -aHRtbCArPSAnPHRyPicgKwogICAgICAgICAgICAgICAgICAgICc8dGQ+PHN0cm9uZz4nICsgRHJp -dmVQb3J0YWwuZXNjYXBlSFRNTCh1WzBdKSArICc8L3N0cm9uZz48L3RkPicgKwogICAgICAgICAg -ICAgICAgICAgICc8dGQgc3R5bGU9InRleHQtYWxpZ246Y2VudGVyOyI+JyArIHZhbHMuY3JlYXRl -ZCArICc8L3RkPicgKwogICAgICAgICAgICAgICAgICAgICc8dGQgc3R5bGU9InRleHQtYWxpZ246 -Y2VudGVyOyI+JyArIHZhbHMuZWRpdGVkICsgJzwvdGQ+JyArCiAgICAgICAgICAgICAgICAgICAg -Jzx0ZCBzdHlsZT0idGV4dC1hbGlnbjpjZW50ZXI7Ij4nICsgdmFscy5yZXZpZXdzICsgJzwvdGQ+ -JyArCiAgICAgICAgICAgICAgICAgICAgJzx0ZCBzdHlsZT0idGV4dC1hbGlnbjpjZW50ZXI7Zm9u -dC13ZWlnaHQ6NjAwOyI+JyArIHRvdGFsICsgJzwvdGQ+JyArCiAgICAgICAgICAgICAgICAgICAg -Jzx0ZD4nICsgY2F0VGFncyArICc8L3RkPicgKwogICAgICAgICAgICAgICAgJzwvdHI+JzsKICAg -ICAgICAgICAgfSk7CiAgICAgICAgICAgIGh0bWwgKz0gJzwvdGJvZHk+PC90YWJsZT4nOwogICAg -ICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGh0bWwgKz0gJzxkaXYgc3R5bGU9InBhZGRpbmc6MjBw -eDt0ZXh0LWFsaWduOmNlbnRlcjtjb2xvcjp2YXIoLS10ZXh0LW11dGVkKTsiPktlaW5lIERhdGVu -IGbDvHIgZGllc2UgQXVzd2FobC48L2Rpdj4nOwogICAgICAgIH0KCiAgICAgICAgLy8gQmFsa2Vu -ZGlhZ3JhbW0gKGtvbXBha3QpCiAgICAgICAgaWYgKHNvcnRlZFVzZXJzLmxlbmd0aCA+IDApIHsK -ICAgICAgICAgICAgdmFyIG1heFVzZXIgPSBnZXRWYWwoc29ydGVkVXNlcnNbMF0pIHx8IDE7CiAg -ICAgICAgICAgIHNvcnRlZFVzZXJzLmZvckVhY2goZnVuY3Rpb24odSkgewogICAgICAgICAgICAg -ICAgdmFyIGQgPSB1WzFdOwogICAgICAgICAgICAgICAgdmFyIHZhbHMgPSAoY2F0RmlsdGVyICE9 -PSAnYWxsJyAmJiBkLmthdGVnb3JpZW5bY2F0RmlsdGVyXSkgPyBkLmthdGVnb3JpZW5bY2F0Rmls -dGVyXSA6IGQ7CiAgICAgICAgICAgICAgICB2YXIgdG90YWwgPSB2YWxzLmNyZWF0ZWQgKyB2YWxz -LmVkaXRlZCArIHZhbHMucmV2aWV3czsKICAgICAgICAgICAgICAgIGlmICh0b3RhbCA9PT0gMCkg -cmV0dXJuOwogICAgICAgICAgICAgICAgaHRtbCArPSAnPGRpdiBjbGFzcz0ic3RhdC1iYXItcm93 -Ij48c3BhbiBjbGFzcz0ic3RhdC1iYXItbGFiZWwiPicgKyBEcml2ZVBvcnRhbC5lc2NhcGVIVE1M -KHVbMF0pICsgJzwvc3Bhbj4nICsKICAgICAgICAgICAgICAgICAgICAnPGRpdiBjbGFzcz0ic3Rh -dC1iYXIiPjxkaXYgY2xhc3M9InN0YXQtYmFyLWZpbGwiIHN0eWxlPSJ3aWR0aDonICsgKHRvdGFs -L21heFVzZXIqMTAwKSArICclO2JhY2tncm91bmQ6bGluZWFyLWdyYWRpZW50KDkwZGVnLCMyZDlk -NzggJyArICh2YWxzLmNyZWF0ZWQvdG90YWwqMTAwKSArICclLCMzYjgyZjYgJyArICh2YWxzLmNy -ZWF0ZWQvdG90YWwqMTAwKSArICclICcgKyAoKHZhbHMuY3JlYXRlZCt2YWxzLmVkaXRlZCkvdG90 -YWwqMTAwKSArICclLCNlNjdlMjIgJyArICgodmFscy5jcmVhdGVkK3ZhbHMuZWRpdGVkKS90b3Rh -bCoxMDApICsgJyUgMTAwJSk7Ij48L2Rpdj48L2Rpdj4nICsKICAgICAgICAgICAgICAgICAgICAn -PHNwYW4gY2xhc3M9InN0YXQtYmFyLXZhbCI+JyArIHRvdGFsICsgJzwvc3Bhbj48L2Rpdj4nOwog -ICAgICAgICAgICB9KTsKICAgICAgICAgICAgaHRtbCArPSAnPGRpdiBzdHlsZT0iZm9udC1zaXpl -OjExcHg7Y29sb3I6dmFyKC0tdGV4dC1tdXRlZCk7bWFyZ2luLXRvcDo0cHg7Ij5MZWdlbmRlOiA8 -c3BhbiBzdHlsZT0iY29sb3I6IzJkOWQ3ODsiPuKWoDwvc3Bhbj4gRXJzdGVsbHQgLyA8c3BhbiBz -dHlsZT0iY29sb3I6IzNiODJmNjsiPuKWoDwvc3Bhbj4gQmVhcmJlaXRldCAvIDxzcGFuIHN0eWxl -PSJjb2xvcjojZTY3ZTIyOyI+4pagPC9zcGFuPiBSZXZpZXdzPC9kaXY+JzsKICAgICAgICB9Cgog -ICAgICAgIC8vIC0tLSBLYXRlZ29yaWUtVmVydGVpbHVuZyArIFRvcCBTY2hsYWd3w7ZydGVyIG5l -YmVuZWluYW5kZXIgLS0tCiAgICAgICAgaHRtbCArPSAnPGRpdiBzdHlsZT0iZGlzcGxheTpncmlk -O2dyaWQtdGVtcGxhdGUtY29sdW1uczoxZnIgMWZyO2dhcDoyMHB4O21hcmdpbi10b3A6MTZweDsi -Pic7CgogICAgICAgIC8vIEthdGVnb3JpZW4KICAgICAgICBodG1sICs9ICc8ZGl2PjxoMyBzdHls -ZT0iY29sb3I6dmFyKC0tdGV4dC1oZWFkaW5nKTttYXJnaW4tYm90dG9tOjhweDsiPkRva3VtZW50 -ZSBwcm8gS2F0ZWdvcmllPC9oMz4nOwogICAgICAgIHZhciBhbGxDYXRFbnRyaWVzID0ga2F0ZWdv -cmllbi5tYXAoZnVuY3Rpb24oaykgeyByZXR1cm4gW2ssIGNhdFN0YXRzW2tdIHx8IDBdOyB9KTsK -ICAgICAgICBhbGxDYXRFbnRyaWVzLnNvcnQoZnVuY3Rpb24oYSxiKSB7IHJldHVybiBiWzFdIC0g -YVsxXSB8fCBhWzBdLmxvY2FsZUNvbXBhcmUoYlswXSwgJ2RlJyk7IH0pOwogICAgICAgIGFsbENh -dEVudHJpZXMuZm9yRWFjaChmdW5jdGlvbihjKSB7CiAgICAgICAgICAgIGh0bWwgKz0gJzxkaXYg -Y2xhc3M9InN0YXQtYmFyLXJvdyI+PHNwYW4gY2xhc3M9InN0YXQtYmFyLWxhYmVsIj4nICsgRHJp -dmVQb3J0YWwuZXNjYXBlSFRNTChjWzBdKSArICc8L3NwYW4+JyArCiAgICAgICAgICAgICAgICAn -PGRpdiBjbGFzcz0ic3RhdC1iYXIiPjxkaXYgY2xhc3M9InN0YXQtYmFyLWZpbGwiIHN0eWxlPSJ3 -aWR0aDonICsgKGNbMV0vbWF4Q2F0KjEwMCkgKyAnJTtiYWNrZ3JvdW5kOiMzYjgyZjY7Ij48L2Rp -dj48L2Rpdj4nICsKICAgICAgICAgICAgICAgICc8c3BhbiBjbGFzcz0ic3RhdC1iYXItdmFsIj4n -ICsgY1sxXSArICc8L3NwYW4+PC9kaXY+JzsKICAgICAgICB9KTsKICAgICAgICBodG1sICs9ICc8 -L2Rpdj4nOwoKICAgICAgICAvLyBUb3AgU2NobGFnd8O2cnRlcgogICAgICAgIGh0bWwgKz0gJzxk -aXY+PGgzIHN0eWxlPSJjb2xvcjp2YXIoLS10ZXh0LWhlYWRpbmcpO21hcmdpbi1ib3R0b206OHB4 -OyI+VG9wIDEwIFNjaGxhZ3fDtnJ0ZXI8L2gzPic7CiAgICAgICAgaWYgKHRvcEt3cy5sZW5ndGgg -PiAwKSB7CiAgICAgICAgICAgIHRvcEt3cy5mb3JFYWNoKGZ1bmN0aW9uKGspIHsKICAgICAgICAg -ICAgICAgIGh0bWwgKz0gJzxkaXYgY2xhc3M9InN0YXQtYmFyLXJvdyI+PHNwYW4gY2xhc3M9InN0 -YXQtYmFyLWxhYmVsIj4nICsgRHJpdmVQb3J0YWwuZXNjYXBlSFRNTChrWzBdKSArICc8L3NwYW4+ -JyArCiAgICAgICAgICAgICAgICAgICAgJzxkaXYgY2xhc3M9InN0YXQtYmFyIj48ZGl2IGNsYXNz -PSJzdGF0LWJhci1maWxsIiBzdHlsZT0id2lkdGg6JyArIChrWzFdL21heEt3KjEwMCkgKyAnJTti -YWNrZ3JvdW5kOiMyZDlkNzg7Ij48L2Rpdj48L2Rpdj4nICsKICAgICAgICAgICAgICAgICAgICAn -PHNwYW4gY2xhc3M9InN0YXQtYmFyLXZhbCI+JyArIGtbMV0gKyAnPC9zcGFuPjwvZGl2Pic7CiAg -ICAgICAgICAgIH0pOwogICAgICAgIH0gZWxzZSB7IGh0bWwgKz0gJzxkaXYgc3R5bGU9ImNvbG9y -OnZhcigtLXRleHQtbXV0ZWQpO2ZvbnQtc2l6ZToxM3B4OyI+S2VpbmUgU2NobGFnd8O2cnRlciB2 -b3JoYW5kZW4uPC9kaXY+JzsgfQogICAgICAgIGh0bWwgKz0gJzwvZGl2PjwvZGl2Pic7CgogICAg -ICAgIC8vIE1vbmF0bGljaGUgRXJzdGVsbHVuZwogICAgICAgIGlmIChtb250aHMubGVuZ3RoID4g -MCkgewogICAgICAgICAgICBodG1sICs9ICc8aDMgc3R5bGU9ImNvbG9yOnZhcigtLXRleHQtaGVh -ZGluZyk7bWFyZ2luOjE2cHggMCA4cHg7Ij5FcnN0ZWxsdW5nIHBybyBNb25hdDwvaDM+JzsKICAg -ICAgICAgICAgbW9udGhzLmZvckVhY2goZnVuY3Rpb24obSkgewogICAgICAgICAgICAgICAgaHRt -bCArPSAnPGRpdiBjbGFzcz0ic3RhdC1iYXItcm93Ij48c3BhbiBjbGFzcz0ic3RhdC1iYXItbGFi -ZWwiPicgKyBtWzBdICsgJzwvc3Bhbj4nICsKICAgICAgICAgICAgICAgICAgICAnPGRpdiBjbGFz -cz0ic3RhdC1iYXIiPjxkaXYgY2xhc3M9InN0YXQtYmFyLWZpbGwiIHN0eWxlPSJ3aWR0aDonICsg -KG1bMV0vbWF4TW9udGgqMTAwKSArICclO2JhY2tncm91bmQ6IzNhN2FhMzsiPjwvZGl2PjwvZGl2 -PicgKwogICAgICAgICAgICAgICAgICAgICc8c3BhbiBjbGFzcz0ic3RhdC1iYXItdmFsIj4nICsg -bVsxXSArICc8L3NwYW4+PC9kaXY+JzsKICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAg -ICBodG1sICs9ICc8L2Rpdj4nOwogICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkb2N1 -bWVudERldGFpbCcpLmlubmVySFRNTCA9IGh0bWw7CiAgICB9LAoKICAgIC8vID09PSBTY2hsYWd3 -b3J0LVZlcndhbHR1bmcgPT09CiAgICBfa3dNYW5hZ2VDdXJyZW50OiBudWxsLAoKICAgIG9wZW5L -d01hbmFnZShrZXl3b3JkKSB7CiAgICAgICAgdGhpcy5fa3dNYW5hZ2VDdXJyZW50ID0ga2V5d29y -ZDsKICAgICAgICB2YXIgYWZmZWN0ZWREb2NzID0gRHJpdmVGUy5kb2N1bWVudHMuZmlsdGVyKGZ1 -bmN0aW9uKGQpIHsKICAgICAgICAgICAgcmV0dXJuIGQuc2NobGFnd29lcnRlciAmJiBkLnNjaGxh -Z3dvZXJ0ZXIuaW5jbHVkZXMoa2V5d29yZCk7CiAgICAgICAgfSk7CgogICAgICAgIHZhciBib2R5 -ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2t3TWFuYWdlQm9keScpOwogICAgICAgIHZhciBm -b290ZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgna3dNYW5hZ2VGb290ZXInKTsKICAgICAg -ICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgna3dNYW5hZ2VUaXRsZScpLnRleHRDb250ZW50ID0g -J1NjaGxhZ3dvcnQ6ICcgKyBrZXl3b3JkOwoKICAgICAgICB2YXIgaHRtbCA9ICcnOwogICAgICAg -IC8vIEJlYXJiZWl0dW5nc2ZlbGQKICAgICAgICBodG1sICs9ICc8ZGl2IHN0eWxlPSJtYXJnaW4t -Ym90dG9tOjE0cHg7Ij4nICsKICAgICAgICAgICAgJzxsYWJlbCBzdHlsZT0iZm9udC1zaXplOjEy -cHg7Zm9udC13ZWlnaHQ6NjAwO2NvbG9yOnZhcigtLXRleHQtc2Vjb25kYXJ5KTtkaXNwbGF5OmJs -b2NrO21hcmdpbi1ib3R0b206NHB4OyI+U2NobGFnd29ydCB1bWJlbmVubmVuPC9sYWJlbD4nICsK -ICAgICAgICAgICAgJzxpbnB1dCB0eXBlPSJ0ZXh0IiBpZD0ia3dNYW5hZ2VOZXdOYW1lIiB2YWx1 -ZT0iJyArIERyaXZlUG9ydGFsLmVzY2FwZUF0dHIoa2V5d29yZCkgKyAnIiAnICsKICAgICAgICAg -ICAgJ3N0eWxlPSJ3aWR0aDoxMDAlO3BhZGRpbmc6OHB4IDEwcHg7Ym9yZGVyOjFweCBzb2xpZCB2 -YXIoLS1ib3JkZXItY29sb3IpO2JvcmRlci1yYWRpdXM6NHB4O2ZvbnQtc2l6ZToxNHB4O2JhY2tn -cm91bmQ6dmFyKC0tYmctaW5wdXQpO2NvbG9yOnZhcigtLXRleHQtcHJpbWFyeSk7Ij4nICsKICAg -ICAgICAnPC9kaXY+JzsKCiAgICAgICAgLy8gQmV0cm9mZmVuZSBBcnRpa2VsCiAgICAgICAgaWYg -KGFmZmVjdGVkRG9jcy5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgIGh0bWwgKz0gJzxkaXYgc3R5 -bGU9ImZvbnQtc2l6ZToxMnB4O2ZvbnQtd2VpZ2h0OjYwMDtjb2xvcjp2YXIoLS10ZXh0LXNlY29u -ZGFyeSk7bWFyZ2luLWJvdHRvbTo2cHg7Ij5WZXJ3ZW5kZXQgaW4gJyArIGFmZmVjdGVkRG9jcy5s -ZW5ndGggKyAnIEFydGlrZWwnICsgKGFmZmVjdGVkRG9jcy5sZW5ndGggPiAxID8gJ24nIDogJycp -ICsgJzo8L2Rpdj4nOwogICAgICAgICAgICBodG1sICs9ICc8ZGl2IGNsYXNzPSJrdy1kb2MtbGlz -dCI+JzsKICAgICAgICAgICAgYWZmZWN0ZWREb2NzLmZvckVhY2goZnVuY3Rpb24oZG9jKSB7CiAg -ICAgICAgICAgICAgICBodG1sICs9ICc8ZGl2IGNsYXNzPSJrdy1kb2MtaXRlbSI+JyArCiAgICAg -ICAgICAgICAgICAgICAgJzxkaXY+PHNwYW4gY2xhc3M9Imt3LWRvYy10aXRsZSI+JyArIERyaXZl -UG9ydGFsLmVzY2FwZUhUTUwoZG9jLnRpdGVsKSArICc8L3NwYW4+JyArCiAgICAgICAgICAgICAg -ICAgICAgJzxkaXYgY2xhc3M9Imt3LWRvYy1rYXQiPicgKyBEcml2ZVBvcnRhbC5lc2NhcGVIVE1M -KGRvYy5rYXRlZ29yaWUpICsKICAgICAgICAgICAgICAgICAgICAoZG9jLmVyc3RlbGx0Vm9uID8g -JyDCtyB2b24gJyArIERyaXZlUG9ydGFsLmVzY2FwZUhUTUwoZG9jLmVyc3RlbGx0Vm9uKSA6ICcn -KSArCiAgICAgICAgICAgICAgICAgICAgJzwvZGl2PjwvZGl2PicgKwogICAgICAgICAgICAgICAg -JzwvZGl2Pic7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBodG1sICs9ICc8L2Rpdj4nOwog -ICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGh0bWwgKz0gJzxkaXYgc3R5bGU9ImZvbnQtc2l6 -ZToxM3B4O2NvbG9yOnZhcigtLXRleHQtbXV0ZWQpO3BhZGRpbmc6MTBweCAwOyI+V2lyZCBpbiBr -ZWluZW0gQXJ0aWtlbCB2ZXJ3ZW5kZXQuPC9kaXY+JzsKICAgICAgICB9CgogICAgICAgIC8vIEVy -c2V0emVuLU9wdGlvbgogICAgICAgIHZhciBvdGhlckt3ID0gRHJpdmVFZGl0b3IuX2dldEFsbEtu -b3duS2V5d29yZHMoKS5maWx0ZXIoZnVuY3Rpb24oaykgeyByZXR1cm4gayAhPT0ga2V5d29yZDsg -fSk7CiAgICAgICAgaHRtbCArPSAnPGRpdiBzdHlsZT0ibWFyZ2luLXRvcDoxNHB4O2JvcmRlci10 -b3A6MXB4IHNvbGlkIHZhcigtLWJvcmRlci1saWdodCk7cGFkZGluZy10b3A6MTJweDsiPicgKwog -ICAgICAgICAgICAnPGxhYmVsIHN0eWxlPSJmb250LXNpemU6MTJweDtmb250LXdlaWdodDo2MDA7 -Y29sb3I6dmFyKC0tdGV4dC1zZWNvbmRhcnkpO2Rpc3BsYXk6YmxvY2s7bWFyZ2luLWJvdHRvbTo2 -cHg7Ij5FcnNldHplbiBkdXJjaDwvbGFiZWw+JyArCiAgICAgICAgICAgICc8aW5wdXQgdHlwZT0i -aGlkZGVuIiBpZD0ia3dNYW5hZ2VSZXBsYWNlIiB2YWx1ZT0iIj4nICsKICAgICAgICAgICAgJzxk -aXYgc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2NvbG9yOnZhcigtLXRleHQtbXV0ZWQpO21hcmdpbi1i -b3R0b206NnB4OyI+V8OkaGxlIGVpbiBTY2hsYWd3b3J0LCBkdXJjaCBkYXMgZGllc2VzIGJlaW0g -TMO2c2NoZW4gb2RlciBVbWJlbmVubmVuIGVyc2V0enQgd2VyZGVuIHNvbGw6PC9kaXY+JyArCiAg -ICAgICAgICAgICc8ZGl2IGlkPSJrd1JlcGxhY2VTZWxlY3RlZCIgc3R5bGU9Im1hcmdpbi1ib3R0 -b206OHB4O2Rpc3BsYXk6bm9uZTtwYWRkaW5nOjZweCAxMHB4O2JvcmRlci1yYWRpdXM6NHB4O2Jh -Y2tncm91bmQ6dmFyKC0tYmctYWN0aXZlKTtib3JkZXI6MXB4IHNvbGlkIHZhcigtLXRleHQtaGVh -ZGluZyk7Zm9udC1zaXplOjEzcHg7Y29sb3I6dmFyKC0tdGV4dC1oZWFkaW5nKTtkaXNwbGF5Om5v -bmU7Ij4nICsKICAgICAgICAgICAgICAgICc8c3BhbiBpZD0ia3dSZXBsYWNlTGFiZWwiPjwvc3Bh -bj4gPHNwYW4gc3R5bGU9ImN1cnNvcjpwb2ludGVyO21hcmdpbi1sZWZ0OjZweDtjb2xvcjp2YXIo -LS10ZXh0LW11dGVkKTsiIG9uY2xpY2s9IkRyaXZlR292ZXJuYW5jZS5fY2xlYXJLd1JlcGxhY2Uo -KSI+4pyVPC9zcGFuPicgKwogICAgICAgICAgICAnPC9kaXY+JyArCiAgICAgICAgICAgICc8ZGl2 -IGNsYXNzPSJnb3Yta3ctbGlzdCIgc3R5bGU9Im1heC1oZWlnaHQ6MTIwcHg7IiBpZD0ia3dSZXBs -YWNlT3B0aW9ucyI+JzsKICAgICAgICBvdGhlckt3LmZvckVhY2goZnVuY3Rpb24oa3cpIHsKICAg -ICAgICAgICAgaHRtbCArPSAnPHNwYW4gY2xhc3M9Imdvdi1rdy1waWxsIiBvbmNsaWNrPSJEcml2 -ZUdvdmVybmFuY2UuX3NlbGVjdEt3UmVwbGFjZShcJycgKyBEcml2ZVBvcnRhbC5lc2NhcGVBdHRy -KGt3KSArICdcJykiPicgKwogICAgICAgICAgICAgICAgRHJpdmVQb3J0YWwuZXNjYXBlSFRNTChr -dykgKyAnPC9zcGFuPic7CiAgICAgICAgfSk7CiAgICAgICAgaWYgKG90aGVyS3cubGVuZ3RoID09 -PSAwKSB7CiAgICAgICAgICAgIGh0bWwgKz0gJzxzcGFuIHN0eWxlPSJmb250LXNpemU6MTJweDtj -b2xvcjp2YXIoLS10ZXh0LW11dGVkKTsiPktlaW5lIGFuZGVyZW4gU2NobGFnd8O2cnRlciB2b3Jo -YW5kZW48L3NwYW4+JzsKICAgICAgICB9CiAgICAgICAgaHRtbCArPSAnPC9kaXY+PC9kaXY+JzsK -CiAgICAgICAgYm9keS5pbm5lckhUTUwgPSBodG1sOwoKICAgICAgICBmb290ZXIuaW5uZXJIVE1M -ID0KICAgICAgICAgICAgJzxidXR0b24gb25jbGljaz0iRHJpdmVHb3Zlcm5hbmNlLmNsb3NlS3dN -YW5hZ2UoKSI+U2NobGllw59lbjwvYnV0dG9uPicgKwogICAgICAgICAgICAnPGJ1dHRvbiBjbGFz -cz0iZGFuZ2VyIiBvbmNsaWNrPSJEcml2ZUdvdmVybmFuY2UuZGVsZXRlS2V5d29yZCgpIj5Mw7Zz -Y2hlbjwvYnV0dG9uPicgKwogICAgICAgICAgICAnPGJ1dHRvbiBjbGFzcz0icHJpbWFyeSIgb25j -bGljaz0iRHJpdmVHb3Zlcm5hbmNlLnJlbmFtZUtleXdvcmQoKSI+VW1iZW5lbm5lbjwvYnV0dG9u -Pic7CgogICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdrd01hbmFnZU1vZGFsJykuY2xh -c3NMaXN0LmFkZCgnb3BlbicpOwogICAgfSwKCiAgICBjbG9zZUt3TWFuYWdlKCkgewogICAgICAg -IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdrd01hbmFnZU1vZGFsJykuY2xhc3NMaXN0LnJlbW92 -ZSgnb3BlbicpOwogICAgICAgIHRoaXMuX2t3TWFuYWdlQ3VycmVudCA9IG51bGw7CiAgICB9LAoK -ICAgIF9zZWxlY3RLd1JlcGxhY2Uoa3cpIHsKICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJ -ZCgna3dNYW5hZ2VSZXBsYWNlJykudmFsdWUgPSBrdzsKICAgICAgICB2YXIgc2VsID0gZG9jdW1l -bnQuZ2V0RWxlbWVudEJ5SWQoJ2t3UmVwbGFjZVNlbGVjdGVkJyk7CiAgICAgICAgc2VsLnN0eWxl -LmRpc3BsYXkgPSAnZmxleCc7CiAgICAgICAgc2VsLnN0eWxlLmFsaWduSXRlbXMgPSAnY2VudGVy -JzsKICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgna3dSZXBsYWNlTGFiZWwnKS50ZXh0 -Q29udGVudCA9IGt3OwogICAgICAgIC8vIEF1c2dld8OkaGx0ZSBQaWxsIGhlcnZvcmhlYmVuCiAg -ICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnI2t3UmVwbGFjZU9wdGlvbnMgLmdvdi1r -dy1waWxsJykuZm9yRWFjaChmdW5jdGlvbihlbCkgewogICAgICAgICAgICBlbC5zdHlsZS5vdXRs -aW5lID0gZWwudGV4dENvbnRlbnQudHJpbSgpID09PSBrdyA/ICcycHggc29saWQgdmFyKC0tdGV4 -dC1oZWFkaW5nKScgOiAnJzsKICAgICAgICB9KTsKICAgIH0sCgogICAgX2NsZWFyS3dSZXBsYWNl -KCkgewogICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdrd01hbmFnZVJlcGxhY2UnKS52 -YWx1ZSA9ICcnOwogICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdrd1JlcGxhY2VTZWxl -Y3RlZCcpLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7CiAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxl -Y3RvckFsbCgnI2t3UmVwbGFjZU9wdGlvbnMgLmdvdi1rdy1waWxsJykuZm9yRWFjaChmdW5jdGlv -bihlbCkgewogICAgICAgICAgICBlbC5zdHlsZS5vdXRsaW5lID0gJyc7CiAgICAgICAgfSk7CiAg -ICB9LAoKICAgIGFzeW5jIHJlbmFtZUtleXdvcmQoKSB7CiAgICAgICAgdmFyIG9sZE5hbWUgPSB0 -aGlzLl9rd01hbmFnZUN1cnJlbnQ7CiAgICAgICAgdmFyIG5ld05hbWUgPSBkb2N1bWVudC5nZXRF -bGVtZW50QnlJZCgna3dNYW5hZ2VOZXdOYW1lJykudmFsdWUudHJpbSgpOwogICAgICAgIGlmICgh -bmV3TmFtZSB8fCBuZXdOYW1lID09PSBvbGROYW1lKSB7CiAgICAgICAgICAgIHNob3dUb2FzdCgn -Qml0dGUgZWluZW4gbmV1ZW4gTmFtZW4gZWluZ2ViZW4nLCAnd2FybmluZycpOwogICAgICAgICAg -ICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICB2YXIgYWZmZWN0ZWQgPSBEcml2ZUZTLmRvY3Vt -ZW50cy5maWx0ZXIoZnVuY3Rpb24oZCkgewogICAgICAgICAgICByZXR1cm4gZC5zY2hsYWd3b2Vy -dGVyICYmIGQuc2NobGFnd29lcnRlci5pbmNsdWRlcyhvbGROYW1lKTsKICAgICAgICB9KTsKCiAg -ICAgICAgdmFyIGNvdW50ID0gMDsKICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFmZmVjdGVk -Lmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIHZhciBkb2MgPSBhZmZlY3RlZFtpXTsKICAgICAg -ICAgICAgdmFyIGlkeCA9IGRvYy5zY2hsYWd3b2VydGVyLmluZGV4T2Yob2xkTmFtZSk7CiAgICAg -ICAgICAgIGlmIChpZHggPj0gMCkgewogICAgICAgICAgICAgICAgZG9jLnNjaGxhZ3dvZXJ0ZXJb -aWR4XSA9IG5ld05hbWU7CiAgICAgICAgICAgICAgICAvLyBEdXBsaWthdGUgZW50ZmVybmVuCiAg -ICAgICAgICAgICAgICBkb2Muc2NobGFnd29lcnRlciA9IFsuLi5uZXcgU2V0KGRvYy5zY2hsYWd3 -b2VydGVyKV07CiAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gYXdhaXQgRHJpdmVGUy5zYXZl -RG9jdW1lbnQoZG9jKTsKICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgPT09IHRydWUpIGNvdW50 -Kys7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8vIEF1Y2ggaW4gUFJFREVGSU5F -RF9LRVlXT1JEUyBlcnNldHplbgogICAgICAgIHZhciBwcmVkSWR4ID0gRHJpdmVFZGl0b3IuUFJF -REVGSU5FRF9LRVlXT1JEUy5pbmRleE9mKG9sZE5hbWUpOwogICAgICAgIGlmIChwcmVkSWR4ID49 -IDApIERyaXZlRWRpdG9yLlBSRURFRklORURfS0VZV09SRFNbcHJlZElkeF0gPSBuZXdOYW1lOwoK -ICAgICAgICBzaG93VG9hc3QoJ1NjaGxhZ3dvcnQgdW1iZW5hbm50OiAiJyArIG9sZE5hbWUgKyAn -IiDihpIgIicgKyBuZXdOYW1lICsgJyIgKCcgKyBjb3VudCArICcgQXJ0aWtlbCknLCAnc3VjY2Vz -cycpOwogICAgICAgIHRoaXMuY2xvc2VLd01hbmFnZSgpOwogICAgICAgIHRoaXMucmVuZGVyQWRt -aW4oKTsKICAgICAgICBEcml2ZVBvcnRhbC5yZW5kZXIoKTsKICAgIH0sCgogICAgYXN5bmMgZGVs -ZXRlS2V5d29yZCgpIHsKICAgICAgICB2YXIga2V5d29yZCA9IHRoaXMuX2t3TWFuYWdlQ3VycmVu -dDsKICAgICAgICB2YXIgcmVwbGFjZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgna3dN -YW5hZ2VSZXBsYWNlJykudmFsdWUudHJpbSgpOwoKICAgICAgICB2YXIgYWZmZWN0ZWQgPSBEcml2 -ZUZTLmRvY3VtZW50cy5maWx0ZXIoZnVuY3Rpb24oZCkgewogICAgICAgICAgICByZXR1cm4gZC5z -Y2hsYWd3b2VydGVyICYmIGQuc2NobGFnd29lcnRlci5pbmNsdWRlcyhrZXl3b3JkKTsKICAgICAg -ICB9KTsKCiAgICAgICAgaWYgKGFmZmVjdGVkLmxlbmd0aCA+IDAgJiYgIWNvbmZpcm0oJ1NjaGxh -Z3dvcnQgIicgKyBrZXl3b3JkICsgJyIgYXVzICcgKyBhZmZlY3RlZC5sZW5ndGggKyAnIEFydGlr -ZWwnICsgKGFmZmVjdGVkLmxlbmd0aCA+IDEgPyAnbicgOiAnJykgKyAnIGVudGZlcm5lbj8nICsg -KHJlcGxhY2VtZW50ID8gJ1xuRXJzZXR6dCBkdXJjaDogIicgKyByZXBsYWNlbWVudCArICciJyA6 -ICcnKSkpIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgdmFyIGNvdW50 -ID0gMDsKICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFmZmVjdGVkLmxlbmd0aDsgaSsrKSB7 -CiAgICAgICAgICAgIHZhciBkb2MgPSBhZmZlY3RlZFtpXTsKICAgICAgICAgICAgZG9jLnNjaGxh -Z3dvZXJ0ZXIgPSBkb2Muc2NobGFnd29lcnRlci5maWx0ZXIoZnVuY3Rpb24oaykgeyByZXR1cm4g -ayAhPT0ga2V5d29yZDsgfSk7CiAgICAgICAgICAgIGlmIChyZXBsYWNlbWVudCAmJiAhZG9jLnNj -aGxhZ3dvZXJ0ZXIuaW5jbHVkZXMocmVwbGFjZW1lbnQpKSB7CiAgICAgICAgICAgICAgICBkb2Mu -c2NobGFnd29lcnRlci5wdXNoKHJlcGxhY2VtZW50KTsKICAgICAgICAgICAgfQogICAgICAgICAg -ICB2YXIgcmVzdWx0ID0gYXdhaXQgRHJpdmVGUy5zYXZlRG9jdW1lbnQoZG9jKTsKICAgICAgICAg -ICAgaWYgKHJlc3VsdCA9PT0gdHJ1ZSkgY291bnQrKzsKICAgICAgICB9CgogICAgICAgIC8vIEF1 -cyBQUkVERUZJTkVEX0tFWVdPUkRTIGVudGZlcm5lbgogICAgICAgIHZhciBwcmVkSWR4ID0gRHJp -dmVFZGl0b3IuUFJFREVGSU5FRF9LRVlXT1JEUy5pbmRleE9mKGtleXdvcmQpOwogICAgICAgIGlm -IChwcmVkSWR4ID49IDApIERyaXZlRWRpdG9yLlBSRURFRklORURfS0VZV09SRFMuc3BsaWNlKHBy -ZWRJZHgsIDEpOwoKICAgICAgICBzaG93VG9hc3QoJ1NjaGxhZ3dvcnQgIicgKyBrZXl3b3JkICsg -JyIgZ2Vsw7ZzY2h0JyArIChyZXBsYWNlbWVudCA/ICcsIGVyc2V0enQgZHVyY2ggIicgKyByZXBs -YWNlbWVudCArICciJyA6ICcnKSArICcgKCcgKyBjb3VudCArICcgQXJ0aWtlbCknLCAnc3VjY2Vz -cycpOwogICAgICAgIHRoaXMuY2xvc2VLd01hbmFnZSgpOwogICAgICAgIHRoaXMucmVuZGVyQWRt -aW4oKTsKICAgICAgICBEcml2ZVBvcnRhbC5yZW5kZXIoKTsKICAgIH0sCgogICAgLy8gPT09IEFk -bWluLUFubGVpdHVuZyBmdWVyIEVpbnN0ZWlnZXIgPT09CiAgICBzaG93QWRtaW5HdWlkZSgpIHsK -ICAgICAgICB2YXIgYm9keSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdnb3ZBZG1pbkJvZHkn -KTsKICAgICAgICBib2R5LmlubmVySFRNTCA9CiAgICAgICAgJzxkaXYgc3R5bGU9Im1heC13aWR0 -aDo4MDBweDttYXJnaW46MCBhdXRvOyI+JyArCiAgICAgICAgICAgICc8ZGl2IHN0eWxlPSJkaXNw -bGF5OmZsZXg7anVzdGlmeS1jb250ZW50OnNwYWNlLWJldHdlZW47YWxpZ24taXRlbXM6Y2VudGVy -O21hcmdpbi1ib3R0b206MTZweDsiPicgKwogICAgICAgICAgICAgICAgJzxoMiBzdHlsZT0iY29s -b3I6dmFyKC0tdGV4dC1oZWFkaW5nKTttYXJnaW46MDsiPkFkbWluLUFubGVpdHVuZzwvaDI+JyAr -CiAgICAgICAgICAgICAgICAnPGJ1dHRvbiBjbGFzcz0iZ292LWFkZC1idG4iIHN0eWxlPSJwYWRk -aW5nOjZweCAxNHB4OyIgb25jbGljaz0iRHJpdmVHb3Zlcm5hbmNlLnJlbmRlckFkbWluKCk7Ij5a -dXLDvGNrIHp1ciBWZXJ3YWx0dW5nPC9idXR0b24+JyArCiAgICAgICAgICAgICc8L2Rpdj4nICsK -CiAgICAgICAgICAgICc8ZGl2IHN0eWxlPSJiYWNrZ3JvdW5kOnZhcigtLWJnLWNhcmQpO2JvcmRl -cjoxcHggc29saWQgdmFyKC0tYm9yZGVyLWxpZ2h0KTtib3JkZXItcmFkaXVzOjhweDtwYWRkaW5n -OjE2cHggMjBweDttYXJnaW4tYm90dG9tOjE0cHg7Ij4nICsKICAgICAgICAgICAgICAgICc8aDMg -c3R5bGU9ImNvbG9yOnZhcigtLXRleHQtaGVhZGluZyk7Zm9udC1zaXplOjE1cHg7bWFyZ2luLWJv -dHRvbTo4cHg7Ij5XYXMgaXN0IGRpZXNlIERhdGVpPzwvaDM+JyArCiAgICAgICAgICAgICAgICAn -PHAgc3R5bGU9ImZvbnQtc2l6ZToxM3B4O2xpbmUtaGVpZ2h0OjEuNztjb2xvcjp2YXIoLS10ZXh0 -LXByaW1hcnkpOyI+JyArCiAgICAgICAgICAgICAgICAgICAgJ0RhcyBnZXNhbXRlIEQuUi5JLlYu -RS4gUG9ydGFsIGJlc3RlaHQgYXVzIDxzdHJvbmc+ZWluZXIgZWluemlnZW4gRGF0ZWk8L3N0cm9u -Zz46IDxjb2RlIHN0eWxlPSJiYWNrZ3JvdW5kOnZhcigtLWJnLWNhcmQtYWx0KTtwYWRkaW5nOjJw -eCA2cHg7Ym9yZGVyLXJhZGl1czozcHg7Ij5pbmRleC5odG1sPC9jb2RlPi4gJyArCiAgICAgICAg -ICAgICAgICAgICAgJ0luIGRpZXNlciBEYXRlaSBzdGVja3QgYWxsZXM6IGRhcyBBdXNzZWhlbiAo -RmFyYmVuLCBTY2hyaWZ0Z3LDtsOfZW4sIEFic3TDpG5kZSksIGRpZSBTdHJ1a3R1ciAod2FzIHdv -IGFuZ2V6ZWlndCB3aXJkKSB1bmQgZGllIExvZ2lrICh3YXMgcGFzc2llcnQgd2VubiBtYW4ga2xp -Y2t0KS4gJyArCiAgICAgICAgICAgICAgICAgICAgJ01hbiBrYW5uIHNpZSBtaXQgamVkZW0gVGV4 -dGVkaXRvciDDtmZmbmVuIOKAkyBmw7xyIHVucyBrbGFwcHQgaGllciBudXIgZGVyIG5vcm1hbGUg -V2luZG93cy1FZGl0b3IgKFdpbmRvd3MgU3VjaGU6IEVkaXRvciknICsKICAgICAgICAgICAgICAg -ICc8L3A+JyArCiAgICAgICAgICAgICc8L2Rpdj4nICsKCiAgICAgICAgICAgICc8ZGl2IHN0eWxl -PSJiYWNrZ3JvdW5kOnZhcigtLWJnLWNhcmQpO2JvcmRlcjoxcHggc29saWQgdmFyKC0tYm9yZGVy -LWxpZ2h0KTtib3JkZXItcmFkaXVzOjhweDtwYWRkaW5nOjE2cHggMjBweDttYXJnaW4tYm90dG9t -OjE0cHg7Ij4nICsKICAgICAgICAgICAgICAgICc8aDMgc3R5bGU9ImNvbG9yOnZhcigtLXRleHQt -aGVhZGluZyk7Zm9udC1zaXplOjE1cHg7bWFyZ2luLWJvdHRvbTo4cHg7Ij5BdWZiYXUgZGVyIERh -dGVpICgzIEJlcmVpY2hlKTwvaDM+JyArCiAgICAgICAgICAgICAgICAnPHAgc3R5bGU9ImZvbnQt -c2l6ZToxM3B4O2xpbmUtaGVpZ2h0OjEuNztjb2xvcjp2YXIoLS10ZXh0LXByaW1hcnkpO21hcmdp -bi1ib3R0b206MTBweDsiPicgKwogICAgICAgICAgICAgICAgICAgICdEaWUgRGF0ZWkgaGF0IGRy -ZWkgZ3Jvw59lIEFic2Nobml0dGUuIElociBlcmtlbm50IHNpZSBhbiBkZW4gS29tbWVudGFyZW4g -aW0gQ29kZTonICsKICAgICAgICAgICAgICAgICc8L3A+JyArCiAgICAgICAgICAgICAgICAnPHRh -YmxlIHN0eWxlPSJ3aWR0aDoxMDAlO2JvcmRlci1jb2xsYXBzZTpjb2xsYXBzZTtmb250LXNpemU6 -MTNweDsiPicgKwogICAgICAgICAgICAgICAgICAgICc8dHIgc3R5bGU9ImJvcmRlci1ib3R0b206 -MXB4IHNvbGlkIHZhcigtLWJvcmRlci1saWdodCk7Ij4nICsKICAgICAgICAgICAgICAgICAgICAg -ICAgJzx0ZCBzdHlsZT0icGFkZGluZzo4cHg7Zm9udC13ZWlnaHQ6NzAwO2NvbG9yOnZhcigtLXRl -eHQtaGVhZGluZyk7d2lkdGg6MTIwcHg7Ij4xLiBDU1M8L3RkPicgKwogICAgICAgICAgICAgICAg -ICAgICAgICAnPHRkIHN0eWxlPSJwYWRkaW5nOjhweDtjb2xvcjp2YXIoLS10ZXh0LXByaW1hcnkp -OyI+QWxsZXMgendpc2NoZW4gPGNvZGUgc3R5bGU9ImJhY2tncm91bmQ6dmFyKC0tYmctY2FyZC1h -bHQpO3BhZGRpbmc6MXB4IDRweDtib3JkZXItcmFkaXVzOjJweDsiPiZsdDtzdHlsZSZndDs8L2Nv -ZGU+IHVuZCA8Y29kZSBzdHlsZT0iYmFja2dyb3VuZDp2YXIoLS1iZy1jYXJkLWFsdCk7cGFkZGlu -ZzoxcHggNHB4O2JvcmRlci1yYWRpdXM6MnB4OyI+Jmx0Oy9zdHlsZSZndDs8L2NvZGU+IOKAkyBo -aWVyIHN0ZWhlbiA8c3Ryb25nPkZhcmJlbiwgU2NocmlmdGdyw7bDn2VuLCBBYnN0w6RuZGU8L3N0 -cm9uZz4uIERhcyBpc3QgZGVyIEJlcmVpY2gsIGRlbiBpaHIgYW0gaMOkdWZpZ3N0ZW4gYW5wYXNz -ZW4gd2VyZGV0LjwvdGQ+JyArCiAgICAgICAgICAgICAgICAgICAgJzwvdHI+JyArCiAgICAgICAg -ICAgICAgICAgICAgJzx0ciBzdHlsZT0iYm9yZGVyLWJvdHRvbToxcHggc29saWQgdmFyKC0tYm9y -ZGVyLWxpZ2h0KTsiPicgKwogICAgICAgICAgICAgICAgICAgICAgICAnPHRkIHN0eWxlPSJwYWRk -aW5nOjhweDtmb250LXdlaWdodDo3MDA7Y29sb3I6dmFyKC0tdGV4dC1oZWFkaW5nKTsiPjIuIEhU -TUw8L3RkPicgKwogICAgICAgICAgICAgICAgICAgICAgICAnPHRkIHN0eWxlPSJwYWRkaW5nOjhw -eDtjb2xvcjp2YXIoLS10ZXh0LXByaW1hcnkpOyI+RGVyIG1pdHRsZXJlIFRlaWwg4oCTIGhpZXIg -c3RlaHQgZGllIDxzdHJvbmc+U3RydWt0dXI8L3N0cm9uZz46IEJ1dHRvbnMsIMOcYmVyc2Nocmlm -dGVuLCBFaW5nYWJlZmVsZGVyLiBUZXh0ZSB3aWUg4oCeUHLDvGZ1bmdlbiIgb2RlciDigJ5Hb3Zl -cm5hbmNlIiBmaW5kZXQgaWhyIGhpZXIuPC90ZD4nICsKICAgICAgICAgICAgICAgICAgICAnPC90 -cj4nICsKICAgICAgICAgICAgICAgICAgICAnPHRyPicgKwogICAgICAgICAgICAgICAgICAgICAg -ICAnPHRkIHN0eWxlPSJwYWRkaW5nOjhweDtmb250LXdlaWdodDo3MDA7Y29sb3I6dmFyKC0tdGV4 -dC1oZWFkaW5nKTsiPjMuIEphdmFTY3JpcHQ8L3RkPicgKwogICAgICAgICAgICAgICAgICAgICAg -ICAnPHRkIHN0eWxlPSJwYWRkaW5nOjhweDtjb2xvcjp2YXIoLS10ZXh0LXByaW1hcnkpOyI+QWxs -ZXMgendpc2NoZW4gPGNvZGUgc3R5bGU9ImJhY2tncm91bmQ6dmFyKC0tYmctY2FyZC1hbHQpO3Bh -ZGRpbmc6MXB4IDRweDtib3JkZXItcmFkaXVzOjJweDsiPiZsdDtzY3JpcHQmZ3Q7PC9jb2RlPiB1 -bmQgPGNvZGUgc3R5bGU9ImJhY2tncm91bmQ6dmFyKC0tYmctY2FyZC1hbHQpO3BhZGRpbmc6MXB4 -IDRweDtib3JkZXItcmFkaXVzOjJweDsiPiZsdDsvc2NyaXB0Jmd0OzwvY29kZT4g4oCTIGRpZSA8 -c3Ryb25nPkxvZ2lrPC9zdHJvbmc+LiBIaWVyIHBhc3NpZXJ0IGFsbGVzLCB3YXMgYmVpIEtsaWNr -cywgU3BlaWNoZXJuIHVzdy4gYXVzZ2Vmw7xocnQgd2lyZC4gPHN0cm9uZyBzdHlsZT0iY29sb3I6 -I2RjMzU0NTsiPlZPUlNJQ0hUOiDDhG5kZXJ1bmdlbiBoaWVyIGvDtm5uZW4gZGFzIGdlc2FtdGUg -U3lzdGVtIGthcHV0dG1hY2hlbiE8L3N0cm9uZz48L3RkPicgKwogICAgICAgICAgICAgICAgICAg -ICc8L3RyPicgKwogICAgICAgICAgICAgICAgJzwvdGFibGU+JyArCiAgICAgICAgICAgICc8L2Rp -dj4nICsKCiAgICAgICAgICAgICc8ZGl2IHN0eWxlPSJiYWNrZ3JvdW5kOnZhcigtLWJnLWNhcmQp -O2JvcmRlcjoxcHggc29saWQgdmFyKC0tYm9yZGVyLWxpZ2h0KTtib3JkZXItcmFkaXVzOjhweDtw -YWRkaW5nOjE2cHggMjBweDttYXJnaW4tYm90dG9tOjE0cHg7Ij4nICsKICAgICAgICAgICAgICAg -ICc8aDMgc3R5bGU9ImNvbG9yOnZhcigtLXRleHQtaGVhZGluZyk7Zm9udC1zaXplOjE1cHg7bWFy -Z2luLWJvdHRvbTo4cHg7Ij5GYXJiZW4gw6RuZGVybiDigJMgc28gZ2VodFwnczwvaDM+JyArCiAg -ICAgICAgICAgICAgICAnPHAgc3R5bGU9ImZvbnQtc2l6ZToxM3B4O2xpbmUtaGVpZ2h0OjEuNztj -b2xvcjp2YXIoLS10ZXh0LXByaW1hcnkpO21hcmdpbi1ib3R0b206MTBweDsiPicgKwogICAgICAg -ICAgICAgICAgICAgICdHYW56IG9iZW4gaW4gZGVyIERhdGVpIChjYS4gWmVpbGUgMTYpIHN0ZWh0 -IGVpbiBCbG9jayBtaXQgPHN0cm9uZz5DU1MtVmFyaWFibGVuPC9zdHJvbmc+LiBEYXMgc2luZCBk -aWUg4oCeR3J1bmRmYXJiZW4iIGRlcyBnZXNhbXRlbiBTeXN0ZW1zLiAnICsKICAgICAgICAgICAg -ICAgICAgICAnV2VubiBpaHIgaGllciBlaW5lIEZhcmJlIMOkbmRlcnQsIMOkbmRlcnQgc2llIHNp -Y2ggPHN0cm9uZz7DvGJlcmFsbDwvc3Ryb25nPiBhdWYgZGVyIFNlaXRlOicgKwogICAgICAgICAg -ICAgICAgJzwvcD4nICsKICAgICAgICAgICAgICAgICc8cHJlIHN0eWxlPSJiYWNrZ3JvdW5kOnZh -cigtLWJnLWNhcmQtYWx0KTtib3JkZXI6MXB4IHNvbGlkIHZhcigtLWJvcmRlci1saWdodCk7Ym9y -ZGVyLXJhZGl1czo2cHg7cGFkZGluZzoxMnB4IDE2cHg7Zm9udC1zaXplOjEycHg7bGluZS1oZWln -aHQ6MS44O292ZXJmbG93LXg6YXV0bztjb2xvcjp2YXIoLS10ZXh0LXByaW1hcnkpOyI+JyArCic6 -cm9vdCB7JyArICdcXG4nICsKJyAgICAtLWJnLXByaW1hcnk6ICMxYTIzMzI7ICAgICAgPHNwYW4g -c3R5bGU9ImNvbG9yOnZhcigtLXRleHQtbXV0ZWQpOyI+LyogS29wZnplaWxlIChkdW5rbGVzIEJs -YXUpICovPC9zcGFuPicgKyAnXFxuJyArCicgICAgLS1iZy1ib2R5OiAjZjVmNWY1OyAgICAgICAg -IDxzcGFuIHN0eWxlPSJjb2xvcjp2YXIoLS10ZXh0LW11dGVkKTsiPi8qIFNlaXRlbmhpbnRlcmdy -dW5kIChoZWxsZ3JhdSkgKi88L3NwYW4+JyArICdcXG4nICsKJyAgICAtLWJnLWNhcmQ6ICNmZmZm -ZmY7ICAgICAgICAgPHNwYW4gc3R5bGU9ImNvbG9yOnZhcigtLXRleHQtbXV0ZWQpOyI+LyogS2Fy -dGVuL0JveGVuICh3ZWnDnykgKi88L3NwYW4+JyArICdcXG4nICsKJyAgICAtLXRleHQtcHJpbWFy -eTogIzMzMzsgICAgICAgPHNwYW4gc3R5bGU9ImNvbG9yOnZhcigtLXRleHQtbXV0ZWQpOyI+Lyog -Tm9ybWFsZXIgVGV4dCAoZHVua2VsZ3JhdSkgKi88L3NwYW4+JyArICdcXG4nICsKJyAgICAtLXRl -eHQtaGVhZGluZzogIzJFNEE2MjsgICAgPHNwYW4gc3R5bGU9ImNvbG9yOnZhcigtLXRleHQtbXV0 -ZWQpOyI+Lyogw5xiZXJzY2hyaWZ0ZW4gKFBvbGl6ZWktQmxhdSkgKi88L3NwYW4+JyArICdcXG4n -ICsKJyAgICAtLWJvcmRlci1jb2xvcjogI2RkZDsgICAgICAgPHNwYW4gc3R5bGU9ImNvbG9yOnZh -cigtLXRleHQtbXV0ZWQpOyI+LyogUmFobWVubGluaWVuIChoZWxsZ3JhdSkgKi88L3NwYW4+JyAr -ICdcXG4nICsKJ30nICsKICAgICAgICAgICAgICAgICc8L3ByZT4nICsKICAgICAgICAgICAgICAg -ICc8cCBzdHlsZT0iZm9udC1zaXplOjEzcHg7bGluZS1oZWlnaHQ6MS43O2NvbG9yOnZhcigtLXRl -eHQtcHJpbWFyeSk7bWFyZ2luLXRvcDoxMHB4OyI+JyArCiAgICAgICAgICAgICAgICAgICAgJzxz -dHJvbmc+QmVpc3BpZWw6PC9zdHJvbmc+IElociB3b2xsdCBkaWUgS29wZnplaWxlIHJvdCBtYWNo -ZW4/IMOEbmRlcnQgPGNvZGUgc3R5bGU9ImJhY2tncm91bmQ6dmFyKC0tYmctY2FyZC1hbHQpO3Bh -ZGRpbmc6MXB4IDRweDtib3JkZXItcmFkaXVzOjJweDsiPiMxYTIzMzI8L2NvZGU+ICcgKwogICAg -ICAgICAgICAgICAgICAgICdoaW50ZXIgPGNvZGUgc3R5bGU9ImJhY2tncm91bmQ6dmFyKC0tYmct -Y2FyZC1hbHQpO3BhZGRpbmc6MXB4IDRweDtib3JkZXItcmFkaXVzOjJweDsiPi0tYmctcHJpbWFy -eTwvY29kZT4genUgPGNvZGUgc3R5bGU9ImJhY2tncm91bmQ6dmFyKC0tYmctY2FyZC1hbHQpO3Bh -ZGRpbmc6MXB4IDRweDtib3JkZXItcmFkaXVzOjJweDsiPiNjYzAwMDA8L2NvZGU+LiBTcGVpY2hl -cm4sIFNlaXRlIG5ldSBsYWRlbiDigJMgZmVydGlnLicgKwogICAgICAgICAgICAgICAgJzwvcD4n -ICsKICAgICAgICAgICAgICAgICc8cCBzdHlsZT0iZm9udC1zaXplOjEzcHg7bGluZS1oZWlnaHQ6 -MS43O2NvbG9yOnZhcigtLXRleHQtcHJpbWFyeSk7bWFyZ2luLXRvcDo2cHg7Ij4nICsKICAgICAg -ICAgICAgICAgICAgICAnPHN0cm9uZz5UaXBwOjwvc3Ryb25nPiBGYXJiZW4gc2luZCBhbHMg4oCe -SGV4LUNvZGVzIiBhbmdlZ2ViZW4gKHouQi4gPGNvZGUgc3R5bGU9ImJhY2tncm91bmQ6dmFyKC0t -YmctY2FyZC1hbHQpO3BhZGRpbmc6MXB4IDRweDtib3JkZXItcmFkaXVzOjJweDsiPiMyRTRBNjI8 -L2NvZGU+KS4gJyArCiAgICAgICAgICAgICAgICAgICAgJ1N1Y2h0IGltIEludGVybmV0IG5hY2gg -4oCeSFRNTCBDb2xvciBQaWNrZXIiIOKAkyBkYSBrw7ZubnQgaWhyIEZhcmJlbiB2aXN1ZWxsIGF1 -c3fDpGhsZW4gdW5kIGRlbiBDb2RlIGtvcGllcmVuLicgKwogICAgICAgICAgICAgICAgJzwvcD4n -ICsKICAgICAgICAgICAgJzwvZGl2PicgKwoKICAgICAgICAgICAgJzxkaXYgc3R5bGU9ImJhY2tn -cm91bmQ6dmFyKC0tYmctY2FyZCk7Ym9yZGVyOjFweCBzb2xpZCB2YXIoLS1ib3JkZXItbGlnaHQp -O2JvcmRlci1yYWRpdXM6OHB4O3BhZGRpbmc6MTZweCAyMHB4O21hcmdpbi1ib3R0b206MTRweDsi -PicgKwogICAgICAgICAgICAgICAgJzxoMyBzdHlsZT0iY29sb3I6dmFyKC0tdGV4dC1oZWFkaW5n -KTtmb250LXNpemU6MTVweDttYXJnaW4tYm90dG9tOjhweDsiPk5hY2h0LU1vZHVzIEZhcmJlbiDD -pG5kZXJuPC9oMz4nICsKICAgICAgICAgICAgICAgICc8cCBzdHlsZT0iZm9udC1zaXplOjEzcHg7 -bGluZS1oZWlnaHQ6MS43O2NvbG9yOnZhcigtLXRleHQtcHJpbWFyeSk7Ij4nICsKICAgICAgICAg -ICAgICAgICAgICAnRGlyZWt0IHVudGVyIGRlbSA8Y29kZSBzdHlsZT0iYmFja2dyb3VuZDp2YXIo -LS1iZy1jYXJkLWFsdCk7cGFkZGluZzoxcHggNHB4O2JvcmRlci1yYWRpdXM6MnB4OyI+OnJvb3Q8 -L2NvZGU+LUJsb2NrIChjYS4gWmVpbGUgNDEpIHN0ZWh0IGVpbiB6d2VpdGVyIEJsb2NrIG1pdCAn -ICsKICAgICAgICAgICAgICAgICAgICAnPGNvZGUgc3R5bGU9ImJhY2tncm91bmQ6dmFyKC0tYmct -Y2FyZC1hbHQpO3BhZGRpbmc6MXB4IDRweDtib3JkZXItcmFkaXVzOjJweDsiPltkYXRhLXRoZW1l -PSJuaWdodCJdPC9jb2RlPi4gRGFzIHNpbmQgZGllIEZhcmJlbiBmw7xyIGRlbiA8c3Ryb25nPkR1 -bmtlbG1vZHVzPC9zdHJvbmc+LiAnICsKICAgICAgICAgICAgICAgICAgICAnR2xlaWNoZSBWYXJp -YWJsZW4tTmFtZW4sIGFuZGVyZSBXZXJ0ZS4gV2VubiBpaHIgei5CLiBkZW4gSGludGVyZ3J1bmQg -aW0gRHVua2VsbW9kdXMgaGVsbGVyIHdvbGx0LCDDpG5kZXJ0IGlociAnICsKICAgICAgICAgICAg -ICAgICAgICAnPGNvZGUgc3R5bGU9ImJhY2tncm91bmQ6dmFyKC0tYmctY2FyZC1hbHQpO3BhZGRp -bmc6MXB4IDRweDtib3JkZXItcmFkaXVzOjJweDsiPi0tYmctYm9keTwvY29kZT4gZG9ydC4nICsK -ICAgICAgICAgICAgICAgICc8L3A+JyArCiAgICAgICAgICAgICc8L2Rpdj4nICsKCiAgICAgICAg -ICAgICc8ZGl2IHN0eWxlPSJiYWNrZ3JvdW5kOnZhcigtLWJnLWNhcmQpO2JvcmRlcjoxcHggc29s -aWQgdmFyKC0tYm9yZGVyLWxpZ2h0KTtib3JkZXItcmFkaXVzOjhweDtwYWRkaW5nOjE2cHggMjBw -eDttYXJnaW4tYm90dG9tOjE0cHg7Ij4nICsKICAgICAgICAgICAgICAgICc8aDMgc3R5bGU9ImNv -bG9yOnZhcigtLXRleHQtaGVhZGluZyk7Zm9udC1zaXplOjE1cHg7bWFyZ2luLWJvdHRvbTo4cHg7 -Ij5UZXh0ZSB1bmQgQmVzY2hyaWZ0dW5nZW4gw6RuZGVybjwvaDM+JyArCiAgICAgICAgICAgICAg -ICAnPHAgc3R5bGU9ImZvbnQtc2l6ZToxM3B4O2xpbmUtaGVpZ2h0OjEuNztjb2xvcjp2YXIoLS10 -ZXh0LXByaW1hcnkpO21hcmdpbi1ib3R0b206MTBweDsiPicgKwogICAgICAgICAgICAgICAgICAg -ICdOdXR6dCBkaWUgPHN0cm9uZz5TdWNoZW4tRnVua3Rpb248L3N0cm9uZz4gZXVyZXMgRWRpdG9y -cyAoU3RyZytGKSB1bmQgc3VjaHQgbmFjaCBkZW0gVGV4dCwgZGVuIGlociDDpG5kZXJuIHdvbGx0 -LiBCZWlzcGllbGU6JyArCiAgICAgICAgICAgICAgICAnPC9wPicgKwogICAgICAgICAgICAgICAg -Jzx1bCBzdHlsZT0iZm9udC1zaXplOjEzcHg7bGluZS1oZWlnaHQ6Mjtjb2xvcjp2YXIoLS10ZXh0 +b3Ytc2VjdGlvbi10aXRsZSIgdGl0bGU9IlN1cGVyVXNlciBoYWJlbiBWb2xsenVncmlmZiBhdWYg +YWxsZSBGdW5rdGlvbmVuOiBSb2xsZW4gdmVyZ2ViZW4sIEVpbnN0ZWxsdW5nZW4gw6RuZGVybiwg +YWxsZSBBcnRpa2VsIGZyZWlnZWJlbiBvZGVyIGFibGVobmVuLiI+QWRtaW5pc3RyYXRvcmVuIChT +dXBlclVzZXIpPC9kaXY+JzsKICAgICAgICBnb3Yuc3VwZXJVc2Vycy5mb3JFYWNoKGZ1bmN0aW9u +KHN1LCBpKSB7CiAgICAgICAgICAgIHZhciBvZSA9IHN1Lm9yZ2FuaXNhdGlvbnNlaW5oZWl0ID8g +JyDCtyAnICsgRHJpdmVQb3J0YWwuZXNjYXBlSFRNTChzdS5vcmdhbmlzYXRpb25zZWluaGVpdCkg +OiAnJzsKICAgICAgICAgICAgaHRtbCArPSAnPGRpdiBjbGFzcz0iZ292LXVzZXItcm93Ij4nICsK +ICAgICAgICAgICAgICAgICc8c3BhbiBjbGFzcz0iZ292LXJvbGUtaWNvbiBzdSI+U1U8L3NwYW4+ +JyArCiAgICAgICAgICAgICAgICAnPGRpdiBjbGFzcz0iZ292LXVzZXItaW5mbyI+PGRpdiBjbGFz +cz0iZ292LXVzZXItbmFtZSI+JyArIERyaXZlUG9ydGFsLmVzY2FwZUhUTUwoc3UuZGlzcGxheU5h +bWUgfHwgc3UudXNlcm5hbWUpICsgJzwvZGl2PicgKwogICAgICAgICAgICAgICAgICAgICc8ZGl2 +IGNsYXNzPSJnb3YtdXNlci1kZXRhaWwiPicgKyBEcml2ZVBvcnRhbC5lc2NhcGVIVE1MKHN1LnVz +ZXJuYW1lKSArIG9lICsgJzwvZGl2PjwvZGl2PicgKwogICAgICAgICAgICAgICAgKGlzU1UgJiYg +Z292LnN1cGVyVXNlcnMubGVuZ3RoID4gMSA/ICc8YnV0dG9uIGNsYXNzPSJyZW1vdmUiIG9uY2xp +Y2s9IkRyaXZlR292ZXJuYW5jZS5yZW1vdmVTdXBlclVzZXIoJyArIGkgKyAnKSI+RW50ZmVybmVu +PC9idXR0b24+JyA6ICcnKSArCiAgICAgICAgICAgICc8L2Rpdj4nOwogICAgICAgIH0pOwogICAg +ICAgIGlmIChpc1NVKSB7CiAgICAgICAgICAgIGh0bWwgKz0gJzxkaXYgY2xhc3M9Imdvdi1jYXQt +YWRkLXJvdyIgc3R5bGU9ImdhcDo2cHg7Ij4nICsKICAgICAgICAgICAgICAgICc8aW5wdXQgdHlw +ZT0idGV4dCIgaWQ9ImdvdlNVVXNlciIgcGxhY2Vob2xkZXI9Ik5XLUtlbm51bmciIHN0eWxlPSJt +YXgtd2lkdGg6MTIwcHg7Ij4nICsKICAgICAgICAgICAgICAgICc8aW5wdXQgdHlwZT0idGV4dCIg +aWQ9ImdvdlNVTmFtZSIgcGxhY2Vob2xkZXI9IkFuemVpZ2VuYW1lIiBzdHlsZT0iZmxleDoyOyI+ +JyArCiAgICAgICAgICAgICAgICAnPGlucHV0IHR5cGU9InRleHQiIGlkPSJnb3ZTVU9FIiBwbGFj +ZWhvbGRlcj0iT3JnYW5pc2F0aW9uc2VpbmhlaXQiIHN0eWxlPSJmbGV4OjI7Ij4nICsKICAgICAg +ICAgICAgICAgICc8YnV0dG9uIGNsYXNzPSJnb3YtYWRkLWJ0biIgc3R5bGU9InBhZGRpbmc6NnB4 +IDE0cHg7IiBvbmNsaWNrPSJEcml2ZUdvdmVybmFuY2UuYWRkU3VwZXJVc2VyKCkiPkhpbnp1ZsO8 +Z2VuPC9idXR0b24+JyArCiAgICAgICAgICAgICc8L2Rpdj4nOwogICAgICAgIH0KICAgICAgICBo +dG1sICs9ICc8L2Rpdj4nOwoKICAgICAgICAvLyAtLS0gRmFjaGF1ZnNpY2h0IC0tLQogICAgICAg +IGh0bWwgKz0gJzxkaXYgY2xhc3M9Imdvdi1zZWN0aW9uIj4nICsKICAgICAgICAgICAgJzxkaXYg +Y2xhc3M9Imdvdi1zZWN0aW9uLXRpdGxlIiB0aXRsZT0iRGllIEZhY2hhdWZzaWNodCBoYXQgZGll +IGdsZWljaGVuIFJlY2h0ZSB3aWUgZWluIFN1cGVyVXNlciwga2FubiBhYmVyIGtlaW5lIFJvbGxl +biB2ZXJnZWJlbi4gR2VkYWNodCBmw7xyIFZvcmdlc2V0enRlLCBkaWUgSW5oYWx0ZSBwcsO8ZmVu +IHNvbGxlbi4iPkZhY2hhdWZzaWNodCAoJyArIGdvdi5mYWNoYXVmc2ljaHQubGVuZ3RoICsgJyk8 +L2Rpdj4nOwogICAgICAgIGlmIChnb3YuZmFjaGF1ZnNpY2h0Lmxlbmd0aCA9PT0gMCkgewogICAg +ICAgICAgICBodG1sICs9ICc8ZGl2IGNsYXNzPSJnb3YtZW1wdHkiPk5vY2gga2VpbmUgRmFjaGF1 +ZnNpY2h0IGtvbmZpZ3VyaWVydDwvZGl2Pic7CiAgICAgICAgfQogICAgICAgIGdvdi5mYWNoYXVm +c2ljaHQuZm9yRWFjaChmdW5jdGlvbihmYSwgaSkgewogICAgICAgICAgICB2YXIgb2UgPSBmYS5v +cmdhbmlzYXRpb25zZWluaGVpdCA/ICcgwrcgJyArIERyaXZlUG9ydGFsLmVzY2FwZUhUTUwoZmEu +b3JnYW5pc2F0aW9uc2VpbmhlaXQpIDogJyc7CiAgICAgICAgICAgIGh0bWwgKz0gJzxkaXYgY2xh +c3M9Imdvdi11c2VyLXJvdyI+JyArCiAgICAgICAgICAgICAgICAnPHNwYW4gY2xhc3M9Imdvdi1y +b2xlLWljb24gZmEiPkZBPC9zcGFuPicgKwogICAgICAgICAgICAgICAgJzxkaXYgY2xhc3M9Imdv +di11c2VyLWluZm8iPjxkaXYgY2xhc3M9Imdvdi11c2VyLW5hbWUiPicgKyBEcml2ZVBvcnRhbC5l +c2NhcGVIVE1MKGZhLmRpc3BsYXlOYW1lIHx8IGZhLnVzZXJuYW1lKSArICc8L2Rpdj4nICsKICAg +ICAgICAgICAgICAgICAgICAnPGRpdiBjbGFzcz0iZ292LXVzZXItZGV0YWlsIj4nICsgRHJpdmVQ +b3J0YWwuZXNjYXBlSFRNTChmYS51c2VybmFtZSkgKyBvZSArICc8L2Rpdj48L2Rpdj4nICsKICAg +ICAgICAgICAgICAgICc8c3BhbiBzdHlsZT0iZm9udC1zaXplOjExcHg7Y29sb3I6I2M2MjgyODsi +PkFsbGUgS2F0ZWdvcmllbjwvc3Bhbj4nICsKICAgICAgICAgICAgICAgIChpc1NVID8gJzxidXR0 +b24gY2xhc3M9InJlbW92ZSIgb25jbGljaz0iRHJpdmVHb3Zlcm5hbmNlLnJlbW92ZUZhY2hhdWZz +aWNodCgnICsgaSArICcpIj5FbnRmZXJuZW48L2J1dHRvbj4nIDogJycpICsKICAgICAgICAgICAg +JzwvZGl2Pic7CiAgICAgICAgfSk7CiAgICAgICAgaWYgKGlzU1UpIHsKICAgICAgICAgICAgaHRt +bCArPSAnPGRpdiBjbGFzcz0iZ292LWNhdC1hZGQtcm93IiBzdHlsZT0iZ2FwOjZweDsiPicgKwog +ICAgICAgICAgICAgICAgJzxpbnB1dCB0eXBlPSJ0ZXh0IiBpZD0iZ292RkFVc2VyIiBwbGFjZWhv +bGRlcj0iTlctS2VubnVuZyIgc3R5bGU9Im1heC13aWR0aDoxMjBweDsiPicgKwogICAgICAgICAg +ICAgICAgJzxpbnB1dCB0eXBlPSJ0ZXh0IiBpZD0iZ292RkFOYW1lIiBwbGFjZWhvbGRlcj0iQW56 +ZWlnZW5hbWUiIHN0eWxlPSJmbGV4OjI7Ij4nICsKICAgICAgICAgICAgICAgICc8aW5wdXQgdHlw +ZT0idGV4dCIgaWQ9ImdvdkZBT0UiIHBsYWNlaG9sZGVyPSJPcmdhbmlzYXRpb25zZWluaGVpdCIg +c3R5bGU9ImZsZXg6MjsiPicgKwogICAgICAgICAgICAgICAgJzxidXR0b24gY2xhc3M9Imdvdi1h +ZGQtYnRuIiBzdHlsZT0icGFkZGluZzo2cHggMTRweDsiIG9uY2xpY2s9IkRyaXZlR292ZXJuYW5j +ZS5hZGRGYWNoYXVmc2ljaHQoKSI+SGluenVmw7xnZW48L2J1dHRvbj4nICsKICAgICAgICAgICAg +JzwvZGl2Pic7CiAgICAgICAgfQogICAgICAgIGh0bWwgKz0gJzwvZGl2Pic7CgogICAgICAgIC8v +IC0tLSBSZXZpZXdlciAtLS0KICAgICAgICBodG1sICs9ICc8ZGl2IGNsYXNzPSJnb3Ytc2VjdGlv +biI+JyArCiAgICAgICAgICAgICc8ZGl2IGNsYXNzPSJnb3Ytc2VjdGlvbi10aXRsZSIgdGl0bGU9 +IlJldmlld2VyIGTDvHJmZW4gQXJ0aWtlbCBpbiBkZW4gaWhuZW4genVnZXdpZXNlbmVuIEthdGVn +b3JpZW4gZnJlaWdlYmVuIG9kZXIgYWJsZWhuZW4uIEplZGVyIFJldmlld2VyIGJla29tbXQgYmVz +dGltbXRlIEZhY2hiZXJlaWNoZSB6dWdld2llc2VuLiI+UmV2aWV3ZXIgKCcgKyBnb3YucmV2aWV3 +ZXJzLmxlbmd0aCArICcpPC9kaXY+JzsKICAgICAgICBpZiAoZ292LnJldmlld2Vycy5sZW5ndGgg +PT09IDApIHsKICAgICAgICAgICAgaHRtbCArPSAnPGRpdiBjbGFzcz0iZ292LWVtcHR5Ij5Ob2No +IGtlaW5lIFJldmlld2VyIGtvbmZpZ3VyaWVydDwvZGl2Pic7CiAgICAgICAgfQogICAgICAgIGdv +di5yZXZpZXdlcnMuZm9yRWFjaChmdW5jdGlvbihyLCBpKSB7CiAgICAgICAgICAgIHZhciBvZSA9 +IHIub3JnYW5pc2F0aW9uc2VpbmhlaXQgPyAnIMK3ICcgKyBEcml2ZVBvcnRhbC5lc2NhcGVIVE1M +KHIub3JnYW5pc2F0aW9uc2VpbmhlaXQpIDogJyc7CiAgICAgICAgICAgIGh0bWwgKz0gJzxkaXYg +Y2xhc3M9Imdvdi11c2VyLXJvdyI+JyArCiAgICAgICAgICAgICAgICAnPHNwYW4gY2xhc3M9Imdv +di1yb2xlLWljb24gcmV2Ij5SPC9zcGFuPicgKwogICAgICAgICAgICAgICAgJzxkaXYgY2xhc3M9 +Imdvdi11c2VyLWluZm8iPjxkaXYgY2xhc3M9Imdvdi11c2VyLW5hbWUiPicgKyBEcml2ZVBvcnRh +bC5lc2NhcGVIVE1MKHIuZGlzcGxheU5hbWUgfHwgci51c2VybmFtZSkgKyAnPC9kaXY+JyArCiAg +ICAgICAgICAgICAgICAgICAgJzxkaXYgY2xhc3M9Imdvdi11c2VyLWRldGFpbCI+JyArIERyaXZl +UG9ydGFsLmVzY2FwZUhUTUwoci51c2VybmFtZSkgKyBvZSArICc8L2Rpdj48L2Rpdj4nICsKICAg +ICAgICAgICAgICAgICc8ZGl2IGNsYXNzPSJnb3YtY2F0LXRhZ3MiPicgKyAoci5rYXRlZ29yaWVu +IHx8IFtdKS5tYXAoZnVuY3Rpb24oaykgeyByZXR1cm4gJzxzcGFuIGNsYXNzPSJnb3YtY2F0LXRh +ZyI+JyArIERyaXZlUG9ydGFsLmVzY2FwZUhUTUwoaykgKyAnPC9zcGFuPic7IH0pLmpvaW4oJycp +ICsgJzwvZGl2PicgKwogICAgICAgICAgICAgICAgJzxidXR0b24gY2xhc3M9ImVkaXQiIG9uY2xp +Y2s9IkRyaXZlR292ZXJuYW5jZS5lZGl0UmV2aWV3ZXIoJyArIGkgKyAnKSI+QmVhcmJlaXRlbjwv +YnV0dG9uPicgKwogICAgICAgICAgICAgICAgJzxidXR0b24gY2xhc3M9InJlbW92ZSIgb25jbGlj +az0iRHJpdmVHb3Zlcm5hbmNlLnJlbW92ZVJldmlld2VyKCcgKyBpICsgJykiPkVudGZlcm5lbjwv +YnV0dG9uPicgKwogICAgICAgICAgICAnPC9kaXY+JzsKICAgICAgICB9KTsKICAgICAgICBodG1s +ICs9ICc8L2Rpdj4nOwoKICAgICAgICAvLyAtLS0gUmV2aWV3ZXItRm9ybXVsYXI6IEZlbGRlciBs +aW5rcywgS2F0ZWdvcmllbiByZWNodHMgLS0tCiAgICAgICAgdmFyIGlzRWRpdGluZyA9IHRoaXMu +X2VkaXRpbmdSZXZpZXdlckluZGV4ID49IDA7CiAgICAgICAgdmFyIGVkaXREYXRhID0gaXNFZGl0 +aW5nID8gZ292LnJldmlld2Vyc1t0aGlzLl9lZGl0aW5nUmV2aWV3ZXJJbmRleF0gOiBudWxsOwog +ICAgICAgIHZhciBmb3JtVGl0bGUgPSBpc0VkaXRpbmcgPyAnUmV2aWV3ZXIgYmVhcmJlaXRlbicg +OiAnUmV2aWV3ZXIgaGluenVmw7xnZW4nOwogICAgICAgIHZhciBmb3JtQnRuTGFiZWwgPSBpc0Vk +aXRpbmcgPyAnU3BlaWNoZXJuJyA6ICdIaW56dWbDvGdlbic7CgogICAgICAgIGh0bWwgKz0gJzxk +aXYgY2xhc3M9Imdvdi1zZWN0aW9uIiBpZD0iZ292QWRkU2VjdGlvbiI+JyArCiAgICAgICAgICAg +ICc8ZGl2IGNsYXNzPSJnb3Ytc2VjdGlvbi10aXRsZSI+JyArIGZvcm1UaXRsZSArICc8L2Rpdj4n +ICsKICAgICAgICAgICAgJzxkaXYgY2xhc3M9Imdvdi10d28tY29sIiBzdHlsZT0iZ2FwOjEycHg7 +YWxpZ24taXRlbXM6c3RyZXRjaDsiPicgKwogICAgICAgICAgICAgICAgJzxkaXYgc3R5bGU9ImRp +c3BsYXk6ZmxleDtmbGV4LWRpcmVjdGlvbjpjb2x1bW47Ij4nICsKICAgICAgICAgICAgICAgICAg +ICAnPGRpdiBzdHlsZT0ibWFyZ2luLWJvdHRvbTo2cHg7Ij48bGFiZWwgc3R5bGU9ImZvbnQtc2l6 +ZToxMXB4O2NvbG9yOnZhcigtLXRleHQtc2Vjb25kYXJ5KTtmb250LXdlaWdodDo2MDA7Ij5OVy1L +ZW5udW5nPC9sYWJlbD4nICsKICAgICAgICAgICAgICAgICAgICAgICAgJzxpbnB1dCB0eXBlPSJ0 +ZXh0IiBpZD0iZ292QWRkVXNlciIgcGxhY2Vob2xkZXI9InouQi4gbncxMjM0NSIgdmFsdWU9Iicg +KyAoZWRpdERhdGEgPyBEcml2ZVBvcnRhbC5lc2NhcGVBdHRyKGVkaXREYXRhLnVzZXJuYW1lKSA6 +ICcnKSArICciIHN0eWxlPSJ3aWR0aDoxMDAlO3BhZGRpbmc6NXB4IDhweDtib3JkZXI6MXB4IHNv +bGlkIHZhcigtLWJvcmRlci1zdHJvbmcpO2JvcmRlci1yYWRpdXM6NHB4O2ZvbnQtc2l6ZToxM3B4 +O21hcmdpbi10b3A6MnB4O2JhY2tncm91bmQ6dmFyKC0tYmctaW5wdXQpO2NvbG9yOnZhcigtLXRl +eHQtcHJpbWFyeSk7Ij48L2Rpdj4nICsKICAgICAgICAgICAgICAgICAgICAnPGRpdiBzdHlsZT0i +bWFyZ2luLWJvdHRvbTo2cHg7Ij48bGFiZWwgc3R5bGU9ImZvbnQtc2l6ZToxMXB4O2NvbG9yOnZh +cigtLXRleHQtc2Vjb25kYXJ5KTtmb250LXdlaWdodDo2MDA7Ij5BbnplaWdlbmFtZTwvbGFiZWw+ +JyArCiAgICAgICAgICAgICAgICAgICAgICAgICc8aW5wdXQgdHlwZT0idGV4dCIgaWQ9ImdvdkFk +ZE5hbWUiIHBsYWNlaG9sZGVyPSJWb3ItIHVuZCBOYWNobmFtZSIgdmFsdWU9IicgKyAoZWRpdERh +dGEgPyBEcml2ZVBvcnRhbC5lc2NhcGVBdHRyKGVkaXREYXRhLmRpc3BsYXlOYW1lIHx8ICcnKSA6 +ICcnKSArICciIHN0eWxlPSJ3aWR0aDoxMDAlO3BhZGRpbmc6NXB4IDhweDtib3JkZXI6MXB4IHNv +bGlkIHZhcigtLWJvcmRlci1zdHJvbmcpO2JvcmRlci1yYWRpdXM6NHB4O2ZvbnQtc2l6ZToxM3B4 +O21hcmdpbi10b3A6MnB4O2JhY2tncm91bmQ6dmFyKC0tYmctaW5wdXQpO2NvbG9yOnZhcigtLXRl +eHQtcHJpbWFyeSk7Ij48L2Rpdj4nICsKICAgICAgICAgICAgICAgICAgICAnPGRpdiBzdHlsZT0i +bWFyZ2luLWJvdHRvbTo2cHg7Ij48bGFiZWwgc3R5bGU9ImZvbnQtc2l6ZToxMXB4O2NvbG9yOnZh +cigtLXRleHQtc2Vjb25kYXJ5KTtmb250LXdlaWdodDo2MDA7Ij5PcmdhbmlzYXRpb25zZWluaGVp +dDwvbGFiZWw+JyArCiAgICAgICAgICAgICAgICAgICAgICAgICc8aW5wdXQgdHlwZT0idGV4dCIg +aWQ9ImdvdkFkZE9FIiBwbGFjZWhvbGRlcj0iYnNwLiBGdWVTdCBWLCBWRC1BUC4uLiIgdmFsdWU9 +IicgKyAoZWRpdERhdGEgPyBEcml2ZVBvcnRhbC5lc2NhcGVBdHRyKGVkaXREYXRhLm9yZ2FuaXNh +dGlvbnNlaW5oZWl0IHx8ICcnKSA6ICcnKSArICciIHN0eWxlPSJ3aWR0aDoxMDAlO3BhZGRpbmc6 +NXB4IDhweDtib3JkZXI6MXB4IHNvbGlkIHZhcigtLWJvcmRlci1zdHJvbmcpO2JvcmRlci1yYWRp +dXM6NHB4O2ZvbnQtc2l6ZToxM3B4O21hcmdpbi10b3A6MnB4O2JhY2tncm91bmQ6dmFyKC0tYmct +aW5wdXQpO2NvbG9yOnZhcigtLXRleHQtcHJpbWFyeSk7Ij48L2Rpdj4nICsKICAgICAgICAgICAg +ICAgICAgICAnPGRpdiBzdHlsZT0iZGlzcGxheTpmbGV4O2dhcDo2cHg7bWFyZ2luLXRvcDo0cHg7 +anVzdGlmeS1jb250ZW50OmZsZXgtZW5kOyI+JyArCiAgICAgICAgICAgICAgICAgICAgICAgIChp +c0VkaXRpbmcgPyAnPGJ1dHRvbiBjbGFzcz0iZ292LWNhbmNlbC1idG4iIHN0eWxlPSJwYWRkaW5n +OjZweCAxMnB4OyIgb25jbGljaz0iRHJpdmVHb3Zlcm5hbmNlLmNhbmNlbEVkaXQoKSI+QWJicmVj +aGVuPC9idXR0b24+JyA6ICcnKSArCiAgICAgICAgICAgICAgICAgICAgICAgICc8YnV0dG9uIGNs +YXNzPSJnb3YtYWRkLWJ0biIgc3R5bGU9InBhZGRpbmc6NnB4IDE2cHg7IiBvbmNsaWNrPSJEcml2 +ZUdvdmVybmFuY2UuYWRkUmV2aWV3ZXIoKSI+JyArIGZvcm1CdG5MYWJlbCArICc8L2J1dHRvbj4n +ICsKICAgICAgICAgICAgICAgICAgICAnPC9kaXY+JyArCiAgICAgICAgICAgICAgICAnPC9kaXY+ +JyArCiAgICAgICAgICAgICAgICAnPGRpdiBzdHlsZT0iZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0 +aW9uOmNvbHVtbjsiPicgKwogICAgICAgICAgICAgICAgICAgICc8bGFiZWwgc3R5bGU9ImZvbnQt +c2l6ZToxMXB4O2NvbG9yOnZhcigtLXRleHQtc2Vjb25kYXJ5KTtmb250LXdlaWdodDo2MDA7Ij5L +YXRlZ29yaWVuIChNZWhyZmFjaGF1c3dhaGwgbWl0IFN0cmcrS2xpY2spPC9sYWJlbD4nICsKICAg +ICAgICAgICAgICAgICAgICAnPHNlbGVjdCBpZD0iZ292QWRkS2F0IiBtdWx0aXBsZSBzdHlsZT0i +d2lkdGg6MTAwJTtmbGV4OjE7bWFyZ2luLXRvcDoycHg7cGFkZGluZzo0cHg7Ym9yZGVyOjFweCBz +b2xpZCB2YXIoLS1ib3JkZXItc3Ryb25nKTtib3JkZXItcmFkaXVzOjRweDtmb250LXNpemU6MTNw +eDtiYWNrZ3JvdW5kOnZhcigtLWJnLWlucHV0KTtjb2xvcjp2YXIoLS10ZXh0LXByaW1hcnkpOyI+ +JzsKICAgICAgICB2YXIgZWRpdEthdHMgPSBlZGl0RGF0YSA/IChlZGl0RGF0YS5rYXRlZ29yaWVu +IHx8IFtdKSA6IFtdOwogICAgICAgIGthdGVnb3JpZW4uZm9yRWFjaChmdW5jdGlvbihrKSB7CiAg +ICAgICAgICAgIHZhciBzZWwgPSBlZGl0S2F0cy5pbmNsdWRlcyhrKSA/ICcgc2VsZWN0ZWQnIDog +Jyc7CiAgICAgICAgICAgIGh0bWwgKz0gJzxvcHRpb24gdmFsdWU9IicgKyBEcml2ZVBvcnRhbC5l +c2NhcGVBdHRyKGspICsgJyInICsgc2VsICsgJz4nICsgRHJpdmVQb3J0YWwuZXNjYXBlSFRNTChr +KSArICc8L29wdGlvbj4nOwogICAgICAgIH0pOwogICAgICAgIGh0bWwgKz0gJzwvc2VsZWN0Pjwv +ZGl2PjwvZGl2PjwvZGl2Pic7CgogICAgICAgIC8vIC0tLSBLYXRlZ29yaWVuICsgRWluc3RlbGx1 +bmdlbiBpbiBlaW5lciBnZW1laW5zYW1lbiBCb3ggLS0tCiAgICAgICAgaHRtbCArPSAnPGRpdiBj +bGFzcz0iZ292LXNlY3Rpb24iPic7CiAgICAgICAgaHRtbCArPSAnPGRpdiBjbGFzcz0iZ292LXR3 +by1jb2wgY2F0LXNldHRpbmdzIiBzdHlsZT0iYWxpZ24taXRlbXM6c3RyZXRjaDsiPic7CgogICAg +ICAgIC8vIEthdGVnb3JpZW4gKGxpbmtlIFNwYWx0ZSkKICAgICAgICB2YXIgaGlkZGVuS2F0cyA9 +IERyaXZlRlMuY29uZmlnLmhpZGRlbkthdGVnb3JpZW4gfHwgW107CiAgICAgICAgaHRtbCArPSAn +PGRpdiBzdHlsZT0iZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjsiPicgKwogICAg +ICAgICAgICAnPGRpdiBjbGFzcz0iZ292LXNlY3Rpb24tdGl0bGUiIHRpdGxlPSJLYXRlZ29yaWVu +IHNpbmQgZGllIEZhY2hiZXJlaWNoZSwgaW4gZGllIEFydGlrZWwgZWluc29ydGllcnQgd2VyZGVu +LiBEdSBrYW5uc3QgS2F0ZWdvcmllbiBhdXNibGVuZGVuICh1bnNpY2h0YmFyIGbDvHIgTnV0emVy +KSBvZGVyIGdhbnogZW50ZmVybmVuLiI+S2F0ZWdvcmllbiAoJyArIGthdGVnb3JpZW4ubGVuZ3Ro +ICsgKGhpZGRlbkthdHMubGVuZ3RoID4gMCA/ICcsICcgKyBoaWRkZW5LYXRzLmxlbmd0aCArICcg +YXVzZ2VibGVuZGV0JyA6ICcnKSArICcpPC9kaXY+JyArCiAgICAgICAgICAgICc8ZGl2IGNsYXNz +PSJnb3YtY2F0LWxpc3QiIHN0eWxlPSJmbGV4OjE7Ij4nOwogICAgICAgIGthdGVnb3JpZW4uZm9y +RWFjaChmdW5jdGlvbihrYXQsIGkpIHsKICAgICAgICAgICAgdmFyIGRvY0NvdW50ID0gRHJpdmVG +Uy5kb2N1bWVudHMuZmlsdGVyKGZ1bmN0aW9uKGQpeyByZXR1cm4gZC5rYXRlZ29yaWUgPT09IGth +dDsgfSkubGVuZ3RoOwogICAgICAgICAgICB2YXIgaXNIaWRkZW4gPSBoaWRkZW5LYXRzLmluY2x1 +ZGVzKGthdCk7CiAgICAgICAgICAgIGh0bWwgKz0gJzxkaXYgY2xhc3M9Imdvdi1jYXQtaXRlbScg +KyAoaXNIaWRkZW4gPyAnIGhpZGRlbi1jYXQnIDogJycpICsgJyI+JyArCiAgICAgICAgICAgICAg +ICAnPHNwYW4gY2xhc3M9Imdvdi1jYXQtbmFtZSI+JyArIERyaXZlUG9ydGFsLmVzY2FwZUhUTUwo +a2F0KSArICc8L3NwYW4+JyArCiAgICAgICAgICAgICAgICAnPHNwYW4gc3R5bGU9ImZvbnQtc2l6 +ZToxMXB4O2NvbG9yOiM4ODg7Ij4nICsgZG9jQ291bnQgKyAnIERvay48L3NwYW4+JyArCiAgICAg +ICAgICAgICAgICAoaXNIaWRkZW4KICAgICAgICAgICAgICAgICAgICA/ICc8YnV0dG9uIGNsYXNz +PSJzaG93IiBvbmNsaWNrPSJEcml2ZUdvdmVybmFuY2Uuc2hvd0NhdGVnb3J5KCcgKyBpICsgJyki +PkVpbmJsZW5kZW48L2J1dHRvbj4nCiAgICAgICAgICAgICAgICAgICAgOiAnPGJ1dHRvbiBjbGFz +cz0iaGlkZSIgb25jbGljaz0iRHJpdmVHb3Zlcm5hbmNlLmhpZGVDYXRlZ29yeSgnICsgaSArICcp +Ij5BdXNibGVuZGVuPC9idXR0b24+JykgKwogICAgICAgICAgICAgICAgJzxidXR0b24gY2xhc3M9 +InJlbW92ZSIgb25jbGljaz0iRHJpdmVHb3Zlcm5hbmNlLnJlbW92ZUNhdGVnb3J5KCcgKyBpICsg +JykiPkVudGZlcm5lbjwvYnV0dG9uPicgKwogICAgICAgICAgICAnPC9kaXY+JzsKICAgICAgICB9 +KTsKICAgICAgICBodG1sICs9ICc8L2Rpdj4nOwogICAgICAgIGh0bWwgKz0gJzxkaXYgc3R5bGU9 +ImJvcmRlci10b3A6MnB4IHNvbGlkIHZhcigtLWJvcmRlci1saWdodCk7bWFyZ2luLXRvcDo4cHg7 +cGFkZGluZy10b3A6MTBweDsiPicgKwogICAgICAgICAgICAnPGRpdiBjbGFzcz0iZ292LWNhdC1h +ZGQtcm93Ij4nICsKICAgICAgICAgICAgICAgICc8aW5wdXQgdHlwZT0idGV4dCIgaWQ9Imdvdk5l +d0NhdCIgcGxhY2Vob2xkZXI9Ik5ldWUgS2F0ZWdvcmllLi4uIj4nICsKICAgICAgICAgICAgICAg +ICc8YnV0dG9uIGNsYXNzPSJnb3YtYWRkLWJ0biIgc3R5bGU9InBhZGRpbmc6NnB4IDE0cHg7IiBv +bmNsaWNrPSJEcml2ZUdvdmVybmFuY2UuYWRkQ2F0ZWdvcnkoKSI+SGluenVmw7xnZW48L2J1dHRv +bj4nICsKICAgICAgICAgICAgJzwvZGl2PjwvZGl2PjwvZGl2Pic7CgogICAgICAgIC8vIEVpbnN0 +ZWxsdW5nZW4gKHJlY2h0ZSBTcGFsdGUpCiAgICAgICAgaHRtbCArPSAnPGRpdiBzdHlsZT0iZGlz +cGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjtib3JkZXItbGVmdDoxcHggc29saWQgdmFy +KC0tYm9yZGVyLWxpZ2h0KTtwYWRkaW5nLWxlZnQ6MTRweDsiPicgKwogICAgICAgICAgICAnPGRp +diBjbGFzcz0iZ292LXNlY3Rpb24tdGl0bGUiPkVpbnN0ZWxsdW5nZW48L2Rpdj4nICsKICAgICAg +ICAgICAgJzxsYWJlbCBjbGFzcz0iZ292LXNldHRpbmctcm93IiB0aXRsZT0iV2VubiBha3Rpdiwg +bcO8c3NlbiBuZXVlIEFydGlrZWwgZXJzdCB2b24gZWluZW0gUmV2aWV3ZXIgZnJlaWdlZ2ViZW4g +d2VyZGVuLCBiZXZvciBzaWUgZsO8ciBhbGxlIHNpY2h0YmFyIHNpbmQuIj48aW5wdXQgdHlwZT0i +Y2hlY2tib3giIGlkPSJnb3ZSZXFOZXciICcgKyAoZ292LnNldHRpbmdzLnJlcXVpcmVBcHByb3Zh +bEZvck5ldyA/ICdjaGVja2VkJyA6ICcnKSArICcgb25jaGFuZ2U9IkRyaXZlR292ZXJuYW5jZS5z +YXZlU2V0dGluZ3MoKSI+IEZyZWlnYWJlIGbDvHIgbmV1ZSBBcnRpa2VsPC9sYWJlbD4nICsKICAg +ICAgICAgICAgJzxsYWJlbCBjbGFzcz0iZ292LXNldHRpbmctcm93IiB0aXRsZT0iV2VubiBha3Rp +diwgbXVzcyBqZWRlIEJlYXJiZWl0dW5nIGVpbmVzIGJlc3RlaGVuZGVuIEFydGlrZWxzIGVybmV1 +dCBmcmVpZ2VnZWJlbiB3ZXJkZW4uIj48aW5wdXQgdHlwZT0iY2hlY2tib3giIGlkPSJnb3ZSZXFF +ZGl0IiAnICsgKGdvdi5zZXR0aW5ncy5yZXF1aXJlQXBwcm92YWxGb3JFZGl0ID8gJ2NoZWNrZWQn +IDogJycpICsgJyBvbmNoYW5nZT0iRHJpdmVHb3Zlcm5hbmNlLnNhdmVTZXR0aW5ncygpIj4gRnJl +aWdhYmUgbmFjaCBCZWFyYmVpdHVuZzwvbGFiZWw+JyArCiAgICAgICAgICAgICc8bGFiZWwgY2xh +c3M9Imdvdi1zZXR0aW5nLXJvdyIgdGl0bGU9IlplaWd0IHVudGVyIGplZGVtIEFydGlrZWwgYW4s +IHdlciBkYXJhbiBtaXRnZXdpcmt0IGhhdCAoQXV0b3IsIFJlZGFrdGlvbiwgS29ycmVrdHVyIHVz +dy4pLiI+PGlucHV0IHR5cGU9ImNoZWNrYm94IiBpZD0iZ292U2hvd0NvbnRyaWIiICcgKyAoZ292 +LnNldHRpbmdzLnNob3dDb250cmlidXRvcnMgIT09IGZhbHNlID8gJ2NoZWNrZWQnIDogJycpICsg +JyBvbmNoYW5nZT0iRHJpdmVHb3Zlcm5hbmNlLnNhdmVTZXR0aW5ncygpIj4gTWl0d2lya2VuZGUg +YW56ZWlnZW48L2xhYmVsPicgKwogICAgICAgICAgICAnPGxhYmVsIGNsYXNzPSJnb3Ytc2V0dGlu +Zy1yb3ciIHRpdGxlPSJaZWlndCB1bnRlciBqZWRlbSBBcnRpa2VsIGRpZSBIaXN0b3JpZSBhbGxl +ciBGcmVpZ2FiZW4gdW5kIEFibGVobnVuZ2VuIGFuLiI+PGlucHV0IHR5cGU9ImNoZWNrYm94IiBp +ZD0iZ292U2hvd1Jldmlld0hpc3QiICcgKyAoZ292LnNldHRpbmdzLnNob3dSZXZpZXdIaXN0b3J5 +ICE9PSBmYWxzZSA/ICdjaGVja2VkJyA6ICcnKSArICcgb25jaGFuZ2U9IkRyaXZlR292ZXJuYW5j +ZS5zYXZlU2V0dGluZ3MoKSI+IFByw7xmdW5nc3ZlcmxhdWYgYW56ZWlnZW48L2xhYmVsPicgKwog +ICAgICAgICAgICAnPGRpdiBjbGFzcz0iZ292LXNldHRpbmctcm93IiBzdHlsZT0iZGlzcGxheTpm +bGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtqdXN0aWZ5LWNvbnRlbnQ6c3BhY2UtYmV0d2VlbjtnYXA6 +OHB4OyIgdGl0bGU9IlBmbGljaHQgPSBKZWRlciBBcnRpa2VsIGJyYXVjaHQgbWluZGVzdGVucyBl +aW4gU2NobGFnd29ydC4gT3B0aW9uYWwgPSBTY2hsYWd3w7ZydGVyIHdlcmRlbiB2b3JnZXNjaGxh +Z2VuLCBzaW5kIGFiZXIgbmljaHQgbsO2dGlnLiBEZWFrdGl2aWVydCA9IEtlaW5lIFNjaGxhZ3fD +tnJ0ZXIuIj4nICsKICAgICAgICAgICAgICAgICc8bGFiZWwgZm9yPSJnb3ZLZXl3b3JkTW9kZSI+ +U2NobGFnd8O2cnRlcjo8L2xhYmVsPicgKwogICAgICAgICAgICAgICAgJzxzZWxlY3QgaWQ9Imdv +dktleXdvcmRNb2RlIiBvbmNoYW5nZT0iRHJpdmVHb3Zlcm5hbmNlLnNhdmVTZXR0aW5ncygpIiBz +dHlsZT0icGFkZGluZzo0cHggOHB4O2JvcmRlci1yYWRpdXM6NHB4O2JvcmRlcjoxcHggc29saWQg +dmFyKC0tYm9yZGVyLWNvbG9yKTtiYWNrZ3JvdW5kOnZhcigtLWJnLWlucHV0KTtjb2xvcjp2YXIo +LS10ZXh0LXByaW1hcnkpO2ZvbnQtc2l6ZToxM3B4O21pbi13aWR0aDoxMzBweDsiPicgKwogICAg +ICAgICAgICAgICAgICAgICc8b3B0aW9uIHZhbHVlPSJyZXF1aXJlZCInICsgKChnb3Yuc2V0dGlu +Z3Mua2V5d29yZE1vZGUgfHwgJ3JlcXVpcmVkJykgPT09ICdyZXF1aXJlZCcgPyAnIHNlbGVjdGVk +JyA6ICcnKSArICc+UGZsaWNodDwvb3B0aW9uPicgKwogICAgICAgICAgICAgICAgICAgICc8b3B0 +aW9uIHZhbHVlPSJvcHRpb25hbCInICsgKGdvdi5zZXR0aW5ncy5rZXl3b3JkTW9kZSA9PT0gJ29w +dGlvbmFsJyA/ICcgc2VsZWN0ZWQnIDogJycpICsgJz5PcHRpb25hbDwvb3B0aW9uPicgKwogICAg +ICAgICAgICAgICAgICAgICc8b3B0aW9uIHZhbHVlPSJkaXNhYmxlZCInICsgKGdvdi5zZXR0aW5n +cy5rZXl3b3JkTW9kZSA9PT0gJ2Rpc2FibGVkJyA/ICcgc2VsZWN0ZWQnIDogJycpICsgJz5EZWFr +dGl2aWVydDwvb3B0aW9uPicgKwogICAgICAgICAgICAgICAgJzwvc2VsZWN0PicgKwogICAgICAg +ICAgICAnPC9kaXY+JyArCiAgICAgICAgICAgICc8ZGl2IGNsYXNzPSJnb3Ytc2V0dGluZy1yb3ci +IHN0eWxlPSJkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO2p1c3RpZnktY29udGVudDpz +cGFjZS1iZXR3ZWVuO2dhcDo4cHg7IiB0aXRsZT0iUGZsaWNodCA9IFJldmlld2VyIG3DvHNzZW4g +YmVpIEFibGVobnVuZyBpbW1lciBlaW5lIEJlZ3LDvG5kdW5nIHNjaHJlaWJlbi4gT3B0aW9uYWwg +PSBCZWdyw7xuZHVuZyB3aXJkIGVtcGZvaGxlbi4gTmVpbiA9IEtlaW5lIEJlZ3LDvG5kdW5nIG7D +tnRpZy4iPicgKwogICAgICAgICAgICAgICAgJzxsYWJlbCBmb3I9ImdvdlJlamVjdGlvbk1vZGUi +PkFibGVobnVuZ3NiZWdyw7xuZHVuZzo8L2xhYmVsPicgKwogICAgICAgICAgICAgICAgJzxzZWxl +Y3QgaWQ9ImdvdlJlamVjdGlvbk1vZGUiIG9uY2hhbmdlPSJEcml2ZUdvdmVybmFuY2Uuc2F2ZVNl +dHRpbmdzKCkiIHN0eWxlPSJwYWRkaW5nOjRweCA4cHg7Ym9yZGVyLXJhZGl1czo0cHg7Ym9yZGVy +OjFweCBzb2xpZCB2YXIoLS1ib3JkZXItY29sb3IpO2JhY2tncm91bmQ6dmFyKC0tYmctaW5wdXQp +O2NvbG9yOnZhcigtLXRleHQtcHJpbWFyeSk7Zm9udC1zaXplOjEzcHg7bWluLXdpZHRoOjEzMHB4 +OyI+JyArCiAgICAgICAgICAgICAgICAgICAgJzxvcHRpb24gdmFsdWU9InJlcXVpcmVkIicgKyAo +KGdvdi5zZXR0aW5ncy5yZWplY3Rpb25SZWFzb25Nb2RlIHx8ICdyZXF1aXJlZCcpID09PSAncmVx +dWlyZWQnID8gJyBzZWxlY3RlZCcgOiAnJykgKyAnPlBmbGljaHQ8L29wdGlvbj4nICsKICAgICAg +ICAgICAgICAgICAgICAnPG9wdGlvbiB2YWx1ZT0ib3B0aW9uYWwiJyArIChnb3Yuc2V0dGluZ3Mu +cmVqZWN0aW9uUmVhc29uTW9kZSA9PT0gJ29wdGlvbmFsJyA/ICcgc2VsZWN0ZWQnIDogJycpICsg +Jz5PcHRpb25hbDwvb3B0aW9uPicgKwogICAgICAgICAgICAgICAgICAgICc8b3B0aW9uIHZhbHVl +PSJkaXNhYmxlZCInICsgKGdvdi5zZXR0aW5ncy5yZWplY3Rpb25SZWFzb25Nb2RlID09PSAnZGlz +YWJsZWQnID8gJyBzZWxlY3RlZCcgOiAnJykgKyAnPk5laW48L29wdGlvbj4nICsKICAgICAgICAg +ICAgICAgICc8L3NlbGVjdD4nICsKICAgICAgICAgICAgJzwvZGl2PicgKwogICAgICAgICAgICAn +PGRpdiBjbGFzcz0iZ292LXNldHRpbmctcm93IiBzdHlsZT0iZGlzcGxheTpmbGV4O2FsaWduLWl0 +ZW1zOmNlbnRlcjtqdXN0aWZ5LWNvbnRlbnQ6c3BhY2UtYmV0d2VlbjtnYXA6OHB4OyIgdGl0bGU9 +Ildlbm4gYWt0aXZpZXJ0LCBlcmtlbm50IGRhcyBQb3J0YWwgYXV0b21hdGlzY2ggVmVyd2Vpc2Ug +YXVmIGFuZGVyZSBBcnRpa2VsIGltIFRleHQgdW5kIHplaWd0IGJlaSBNb3VzZW92ZXIgZWluZSBW +b3JzY2hhdSBhbi4iPicgKwogICAgICAgICAgICAgICAgJzxsYWJlbCBmb3I9ImdvdkNyb3NzbGlu +a01vZGUiPkNyb3NzbGlua2luZzo8L2xhYmVsPicgKwogICAgICAgICAgICAgICAgJzxzZWxlY3Qg +aWQ9ImdvdkNyb3NzbGlua01vZGUiIG9uY2hhbmdlPSJEcml2ZUdvdmVybmFuY2Uuc2F2ZVNldHRp +bmdzKCkiIHN0eWxlPSJwYWRkaW5nOjRweCA4cHg7Ym9yZGVyLXJhZGl1czo0cHg7Ym9yZGVyOjFw +eCBzb2xpZCB2YXIoLS1ib3JkZXItY29sb3IpO2JhY2tncm91bmQ6dmFyKC0tYmctaW5wdXQpO2Nv +bG9yOnZhcigtLXRleHQtcHJpbWFyeSk7Zm9udC1zaXplOjEzcHg7bWluLXdpZHRoOjEzMHB4OyI+ +JyArCiAgICAgICAgICAgICAgICAgICAgJzxvcHRpb24gdmFsdWU9ImVuYWJsZWQiJyArICgoZ292 +LnNldHRpbmdzLmNyb3NzbGlua01vZGUgfHwgJ2VuYWJsZWQnKSA9PT0gJ2VuYWJsZWQnID8gJyBz +ZWxlY3RlZCcgOiAnJykgKyAnPkFrdGl2aWVydDwvb3B0aW9uPicgKwogICAgICAgICAgICAgICAg +ICAgICc8b3B0aW9uIHZhbHVlPSJkaXNhYmxlZCInICsgKGdvdi5zZXR0aW5ncy5jcm9zc2xpbmtN +b2RlID09PSAnZGlzYWJsZWQnID8gJyBzZWxlY3RlZCcgOiAnJykgKyAnPkRlYWt0aXZpZXJ0PC9v +cHRpb24+JyArCiAgICAgICAgICAgICAgICAnPC9zZWxlY3Q+JyArCiAgICAgICAgICAgICc8L2Rp +dj4nICsKICAgICAgICAnPC9kaXY+JzsgLy8gRW5kZSBFaW5zdGVsbHVuZ2VuLVNwYWx0ZQoKICAg +ICAgICBodG1sICs9ICc8L2Rpdj4nOyAvLyBFbmRlIGdvdi10d28tY29sCiAgICAgICAgaHRtbCAr +PSAnPC9kaXY+JzsgLy8gRW5kZSBnb3Ytc2VjdGlvbiAoS2F0ZWdvcmllbitFaW5zdGVsbHVuZ2Vu +KQoKICAgICAgICAvLyAtLS0gU2NobGFnd8O2cnRlciB2ZXJ3YWx0ZW4gLS0tCiAgICAgICAgaHRt +bCArPSAnPGRpdiBjbGFzcz0iZ292LXNlY3Rpb24iPicgKwogICAgICAgICAgICAnPGRpdiBjbGFz +cz0iZ292LXNlY3Rpb24tdGl0bGUiIHRpdGxlPSJTY2hsYWd3w7ZydGVyIGhlbGZlbiBiZWltIFN1 +Y2hlbiB1bmQgRmlsdGVybiB2b24gQXJ0aWtlbG4uIEhpZXIga2FubnN0IGR1IGJlc3RlaGVuZGUg +U2NobGFnd8O2cnRlciB1bWJlbmVubmVuLCB6dXNhbW1lbmbDvGhyZW4gb2RlciBsw7ZzY2hlbi4i +PlNjaGxhZ3fDtnJ0ZXIgdmVyd2FsdGVuPC9kaXY+JyArCiAgICAgICAgICAgICc8ZGl2IHN0eWxl +PSJmb250LXNpemU6MTJweDtjb2xvcjp2YXIoLS10ZXh0LW11dGVkKTttYXJnaW4tYm90dG9tOjhw +eDsiPktsaWNrZSBhdWYgZWluIFNjaGxhZ3dvcnQsIHVtIGVzIHp1IGJlYXJiZWl0ZW4gb2RlciB6 +dSBsw7ZzY2hlbi4gRGllIFphaGwgemVpZ3QsIGluIHdpZSB2aWVsZW4gQXJ0aWtlbG4gZXMgdmVy +d2VuZGV0IHdpcmQuPC9kaXY+JyArCiAgICAgICAgICAgICc8ZGl2IGNsYXNzPSJnb3Yta3ctbGlz +dCIgaWQ9Imdvdkt3TGlzdCI+JzsKICAgICAgICB2YXIgYWxsS3cgPSBEcml2ZUVkaXRvci5fZ2V0 +QWxsS25vd25LZXl3b3JkcygpOwogICAgICAgIGFsbEt3LmZvckVhY2goZnVuY3Rpb24oa3cpIHsK +ICAgICAgICAgICAgdmFyIGNvdW50ID0gRHJpdmVGUy5kb2N1bWVudHMuZmlsdGVyKGZ1bmN0aW9u +KGQpIHsKICAgICAgICAgICAgICAgIHJldHVybiBkLnNjaGxhZ3dvZXJ0ZXIgJiYgZC5zY2hsYWd3 +b2VydGVyLmluY2x1ZGVzKGt3KTsKICAgICAgICAgICAgfSkubGVuZ3RoOwogICAgICAgICAgICBo +dG1sICs9ICc8c3BhbiBjbGFzcz0iZ292LWt3LXBpbGwiIG9uY2xpY2s9IkRyaXZlR292ZXJuYW5j +ZS5vcGVuS3dNYW5hZ2UoXCcnICsgRHJpdmVQb3J0YWwuZXNjYXBlQXR0cihrdykgKyAnXCcpIj4n +ICsKICAgICAgICAgICAgICAgIERyaXZlUG9ydGFsLmVzY2FwZUhUTUwoa3cpICsgJyA8c3BhbiBj +bGFzcz0ia3ctY291bnQiPignICsgY291bnQgKyAnKTwvc3Bhbj48L3NwYW4+JzsKICAgICAgICB9 +KTsKICAgICAgICBodG1sICs9ICc8L2Rpdj48L2Rpdj4nOwoKICAgICAgICBib2R5LmlubmVySFRN +TCA9IGh0bWw7CiAgICB9LAoKICAgIGFzeW5jIGFkZFJldmlld2VyKCkgewogICAgICAgIGNvbnN0 +IHVzZXJuYW1lID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2dvdkFkZFVzZXInKS52YWx1ZS50 +cmltKCk7CiAgICAgICAgY29uc3QgZGlzcGxheU5hbWUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJ +ZCgnZ292QWRkTmFtZScpLnZhbHVlLnRyaW0oKSB8fCB1c2VybmFtZTsKICAgICAgICBjb25zdCBv +cmdhbmlzYXRpb25zZWluaGVpdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdnb3ZBZGRPRScp +LnZhbHVlLnRyaW0oKTsKICAgICAgICBjb25zdCBrYXRTZWxlY3QgPSBkb2N1bWVudC5nZXRFbGVt +ZW50QnlJZCgnZ292QWRkS2F0Jyk7CiAgICAgICAgY29uc3Qga2F0ZWdvcmllbiA9IEFycmF5LmZy +b20oa2F0U2VsZWN0LnNlbGVjdGVkT3B0aW9ucykubWFwKG8gPT4gby52YWx1ZSk7CgogICAgICAg +IGlmICghdXNlcm5hbWUpIHsgc2hvd1RvYXN0KCdOVy1LZW5udW5nIGVyZm9yZGVybGljaCcsICd3 +YXJuaW5nJyk7IHJldHVybjsgfQogICAgICAgIGlmIChrYXRlZ29yaWVuLmxlbmd0aCA9PT0gMCkg +eyBzaG93VG9hc3QoJ01pbmRlc3RlbnMgZWluZSBLYXRlZ29yaWUgd8OkaGxlbicsICd3YXJuaW5n +Jyk7IHJldHVybjsgfQoKICAgICAgICBpZiAoIXRoaXMuZGF0YSkgdGhpcy5kYXRhID0geyB2ZXJz +aW9uOiAnMS4wJywgc3VwZXJVc2VyczogW10sIHJldmlld2VyczogW10sIHNldHRpbmdzOiB7fSB9 +OwogICAgICAgIGNvbnN0IHJldmlld2VyID0geyB1c2VybmFtZTogdXNlcm5hbWUsIGRvbWFpbjog +JyonLCBkaXNwbGF5TmFtZTogZGlzcGxheU5hbWUsIGthdGVnb3JpZW46IGthdGVnb3JpZW4gfTsK +ICAgICAgICBpZiAob3JnYW5pc2F0aW9uc2VpbmhlaXQpIHJldmlld2VyLm9yZ2FuaXNhdGlvbnNl +aW5oZWl0ID0gb3JnYW5pc2F0aW9uc2VpbmhlaXQ7CgogICAgICAgIGlmICh0aGlzLl9lZGl0aW5n +UmV2aWV3ZXJJbmRleCA+PSAwKSB7CiAgICAgICAgICAgIGNvbnN0IGVkaXRJZHggPSB0aGlzLl9l +ZGl0aW5nUmV2aWV3ZXJJbmRleDsKICAgICAgICAgICAgY29uc3QgYmFja3VwID0geyAuLi50aGlz +LmRhdGEucmV2aWV3ZXJzW2VkaXRJZHhdIH07CiAgICAgICAgICAgIHRoaXMuZGF0YS5yZXZpZXdl +cnNbZWRpdElkeF0gPSByZXZpZXdlcjsKICAgICAgICAgICAgdGhpcy5fZWRpdGluZ1Jldmlld2Vy +SW5kZXggPSAtMTsKICAgICAgICAgICAgY29uc3Qgb2sgPSBhd2FpdCB0aGlzLnNhdmVHb3Zlcm5h +bmNlKCk7CiAgICAgICAgICAgIGlmIChvayA9PT0gZmFsc2UpIHsKICAgICAgICAgICAgICAgIHRo +aXMuZGF0YS5yZXZpZXdlcnNbZWRpdElkeF0gPSBiYWNrdXA7CiAgICAgICAgICAgICAgICByZXR1 +cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5yZW5kZXJBZG1pbigpOwogICAgICAg +ICAgICBzaG93VG9hc3QoZGlzcGxheU5hbWUgKyAnIGFrdHVhbGlzaWVydCcsICdzdWNjZXNzJyk7 +CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgdGhpcy5kYXRhLnJldmlld2Vycy5wdXNoKHJl +dmlld2VyKTsKICAgICAgICAgICAgY29uc3Qgb2sgPSBhd2FpdCB0aGlzLnNhdmVHb3Zlcm5hbmNl +KCk7CiAgICAgICAgICAgIGlmIChvayA9PT0gZmFsc2UpIHsKICAgICAgICAgICAgICAgIHRoaXMu +ZGF0YS5yZXZpZXdlcnMucG9wKCk7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAg +IH0KICAgICAgICAgICAgdGhpcy5yZW5kZXJBZG1pbigpOwogICAgICAgICAgICBzaG93VG9hc3Qo +ZGlzcGxheU5hbWUgKyAnIGFscyBSZXZpZXdlciBoaW56dWdlZsO8Z3QnLCAnc3VjY2VzcycpOwog +ICAgICAgIH0KICAgIH0sCgogICAgZWRpdFJldmlld2VyKGluZGV4KSB7CiAgICAgICAgaWYgKCF0 +aGlzLmRhdGEgfHwgIXRoaXMuZGF0YS5yZXZpZXdlcnNbaW5kZXhdKSByZXR1cm47CiAgICAgICAg +dGhpcy5fZWRpdGluZ1Jldmlld2VySW5kZXggPSBpbmRleDsKICAgICAgICB0aGlzLnJlbmRlckFk +bWluKCk7CiAgICAgICAgY29uc3Qgc2VjdGlvbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdn +b3ZBZGRTZWN0aW9uJyk7CiAgICAgICAgaWYgKHNlY3Rpb24pIHNlY3Rpb24uc2Nyb2xsSW50b1Zp +ZXcoeyBiZWhhdmlvcjogJ3Ntb290aCcgfSk7CiAgICB9LAoKICAgIGNhbmNlbEVkaXQoKSB7CiAg +ICAgICAgdGhpcy5fZWRpdGluZ1Jldmlld2VySW5kZXggPSAtMTsKICAgICAgICB0aGlzLnJlbmRl +ckFkbWluKCk7CiAgICB9LAoKICAgIGFzeW5jIHJlbW92ZVJldmlld2VyKGluZGV4KSB7CiAgICAg +ICAgaWYgKCF0aGlzLmRhdGEgfHwgIXRoaXMuZGF0YS5yZXZpZXdlcnNbaW5kZXhdKSByZXR1cm47 +CiAgICAgICAgY29uc3QgbmFtZSA9IHRoaXMuZGF0YS5yZXZpZXdlcnNbaW5kZXhdLmRpc3BsYXlO +YW1lIHx8IHRoaXMuZGF0YS5yZXZpZXdlcnNbaW5kZXhdLnVzZXJuYW1lOwogICAgICAgIGlmICgh +Y29uZmlybSgnUmV2aWV3ZXIgIicgKyBuYW1lICsgJyIgZW50ZmVybmVuPycpKSByZXR1cm47CiAg +ICAgICAgY29uc3QgYmFja3VwID0gdGhpcy5kYXRhLnJldmlld2Vyc1tpbmRleF07CiAgICAgICAg +dGhpcy5kYXRhLnJldmlld2Vycy5zcGxpY2UoaW5kZXgsIDEpOwogICAgICAgIGNvbnN0IG9rID0g +YXdhaXQgdGhpcy5zYXZlR292ZXJuYW5jZSgpOwogICAgICAgIGlmIChvayA9PT0gZmFsc2UpIHsK +ICAgICAgICAgICAgdGhpcy5kYXRhLnJldmlld2Vycy5zcGxpY2UoaW5kZXgsIDAsIGJhY2t1cCk7 +CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgdGhpcy5yZW5kZXJBZG1pbigp +OwogICAgICAgIHNob3dUb2FzdChuYW1lICsgJyBlbnRmZXJudCcsICdzdWNjZXNzJyk7CiAgICB9 +LAoKICAgIGFzeW5jIGFkZFN1cGVyVXNlcigpIHsKICAgICAgICB2YXIgdXNlcm5hbWUgPSBkb2N1 +bWVudC5nZXRFbGVtZW50QnlJZCgnZ292U1VVc2VyJykudmFsdWUudHJpbSgpOwogICAgICAgIGlm +ICghdXNlcm5hbWUpIHsgc2hvd1RvYXN0KCdOVy1LZW5udW5nIGVyZm9yZGVybGljaCcsICd3YXJu +aW5nJyk7IHJldHVybjsgfQogICAgICAgIHZhciBkaXNwbGF5TmFtZSA9IGRvY3VtZW50LmdldEVs +ZW1lbnRCeUlkKCdnb3ZTVU5hbWUnKS52YWx1ZS50cmltKCkgfHwgdXNlcm5hbWU7CiAgICAgICAg +dmFyIG9lID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2dvdlNVT0UnKS52YWx1ZS50cmltKCk7 +CiAgICAgICAgaWYgKCF0aGlzLmRhdGEuc3VwZXJVc2VycykgdGhpcy5kYXRhLnN1cGVyVXNlcnMg +PSBbXTsKICAgICAgICB0aGlzLmRhdGEuc3VwZXJVc2Vycy5wdXNoKHsgdXNlcm5hbWU6IHVzZXJu +YW1lLCBkb21haW46ICcqJywgZGlzcGxheU5hbWU6IGRpc3BsYXlOYW1lLCBvcmdhbmlzYXRpb25z +ZWluaGVpdDogb2UgfSk7CiAgICAgICAgY29uc3Qgb2sgPSBhd2FpdCB0aGlzLnNhdmVHb3Zlcm5h +bmNlKCk7CiAgICAgICAgaWYgKG9rID09PSBmYWxzZSkgewogICAgICAgICAgICB0aGlzLmRhdGEu +c3VwZXJVc2Vycy5wb3AoKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICB0 +aGlzLnJlbmRlckFkbWluKCk7CiAgICAgICAgc2hvd1RvYXN0KGRpc3BsYXlOYW1lICsgJyBhbHMg +U3VwZXJVc2VyIGhpbnp1Z2Vmw7xndCcsICdzdWNjZXNzJyk7CiAgICB9LAoKICAgIGFzeW5jIHJl +bW92ZVN1cGVyVXNlcihpbmRleCkgewogICAgICAgIGlmICh0aGlzLmRhdGEuc3VwZXJVc2Vycy5s +ZW5ndGggPD0gMSkgeyBzaG93VG9hc3QoJ01pbmRlc3RlbnMgZWluIFN1cGVyVXNlciBlcmZvcmRl +cmxpY2gnLCAnd2FybmluZycpOyByZXR1cm47IH0KICAgICAgICBpZiAoIWNvbmZpcm0oJ1N1cGVy +VXNlciB3aXJrbGljaCBlbnRmZXJuZW4/JykpIHJldHVybjsKICAgICAgICBjb25zdCBiYWNrdXAg +PSB0aGlzLmRhdGEuc3VwZXJVc2Vyc1tpbmRleF07CiAgICAgICAgdGhpcy5kYXRhLnN1cGVyVXNl +cnMuc3BsaWNlKGluZGV4LCAxKTsKICAgICAgICBjb25zdCBvayA9IGF3YWl0IHRoaXMuc2F2ZUdv +dmVybmFuY2UoKTsKICAgICAgICBpZiAob2sgPT09IGZhbHNlKSB7CiAgICAgICAgICAgIHRoaXMu +ZGF0YS5zdXBlclVzZXJzLnNwbGljZShpbmRleCwgMCwgYmFja3VwKTsKICAgICAgICAgICAgcmV0 +dXJuOwogICAgICAgIH0KICAgICAgICB0aGlzLnJlbmRlckFkbWluKCk7CiAgICAgICAgc2hvd1Rv +YXN0KCdTdXBlclVzZXIgZW50ZmVybnQnLCAnc3VjY2VzcycpOwogICAgfSwKCiAgICBhc3luYyBh +ZGRGYWNoYXVmc2ljaHQoKSB7CiAgICAgICAgdmFyIHVzZXJuYW1lID0gZG9jdW1lbnQuZ2V0RWxl +bWVudEJ5SWQoJ2dvdkZBVXNlcicpLnZhbHVlLnRyaW0oKTsKICAgICAgICBpZiAoIXVzZXJuYW1l +KSB7IHNob3dUb2FzdCgnTlctS2VubnVuZyBlcmZvcmRlcmxpY2gnLCAnd2FybmluZycpOyByZXR1 +cm47IH0KICAgICAgICB2YXIgZGlzcGxheU5hbWUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgn +Z292RkFOYW1lJykudmFsdWUudHJpbSgpIHx8IHVzZXJuYW1lOwogICAgICAgIHZhciBvZSA9IGRv +Y3VtZW50LmdldEVsZW1lbnRCeUlkKCdnb3ZGQU9FJykudmFsdWUudHJpbSgpOwogICAgICAgIGlm +ICghdGhpcy5kYXRhLmZhY2hhdWZzaWNodCkgdGhpcy5kYXRhLmZhY2hhdWZzaWNodCA9IFtdOwog +ICAgICAgIHRoaXMuZGF0YS5mYWNoYXVmc2ljaHQucHVzaCh7IHVzZXJuYW1lOiB1c2VybmFtZSwg +ZG9tYWluOiAnKicsIGRpc3BsYXlOYW1lOiBkaXNwbGF5TmFtZSwgb3JnYW5pc2F0aW9uc2Vpbmhl +aXQ6IG9lIH0pOwogICAgICAgIGNvbnN0IG9rID0gYXdhaXQgdGhpcy5zYXZlR292ZXJuYW5jZSgp +OwogICAgICAgIGlmIChvayA9PT0gZmFsc2UpIHsKICAgICAgICAgICAgdGhpcy5kYXRhLmZhY2hh +dWZzaWNodC5wb3AoKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICB0aGlz +LnJlbmRlckFkbWluKCk7CiAgICAgICAgc2hvd1RvYXN0KGRpc3BsYXlOYW1lICsgJyBhbHMgRmFj +aGF1ZnNpY2h0IGhpbnp1Z2Vmw7xndCcsICdzdWNjZXNzJyk7CiAgICB9LAoKICAgIGFzeW5jIHJl +bW92ZUZhY2hhdWZzaWNodChpbmRleCkgewogICAgICAgIGlmICghY29uZmlybSgnRmFjaGF1ZnNp +Y2h0IHdpcmtsaWNoIGVudGZlcm5lbj8nKSkgcmV0dXJuOwogICAgICAgIGNvbnN0IGJhY2t1cCA9 +IHRoaXMuZGF0YS5mYWNoYXVmc2ljaHRbaW5kZXhdOwogICAgICAgIHRoaXMuZGF0YS5mYWNoYXVm +c2ljaHQuc3BsaWNlKGluZGV4LCAxKTsKICAgICAgICBjb25zdCBvayA9IGF3YWl0IHRoaXMuc2F2 +ZUdvdmVybmFuY2UoKTsKICAgICAgICBpZiAob2sgPT09IGZhbHNlKSB7CiAgICAgICAgICAgIHRo +aXMuZGF0YS5mYWNoYXVmc2ljaHQuc3BsaWNlKGluZGV4LCAwLCBiYWNrdXApOwogICAgICAgICAg +ICByZXR1cm47CiAgICAgICAgfQogICAgICAgIHRoaXMucmVuZGVyQWRtaW4oKTsKICAgICAgICBz +aG93VG9hc3QoJ0ZhY2hhdWZzaWNodCBlbnRmZXJudCcsICdzdWNjZXNzJyk7CiAgICB9LAoKICAg +IGFzeW5jIGFkZENhdGVnb3J5KCkgewogICAgICAgIHZhciBpbnB1dCA9IGRvY3VtZW50LmdldEVs +ZW1lbnRCeUlkKCdnb3ZOZXdDYXQnKTsKICAgICAgICB2YXIgbmFtZSA9IGlucHV0LnZhbHVlLnRy +aW0oKTsKICAgICAgICBpZiAoIW5hbWUpIHJldHVybjsKICAgICAgICBpZiAoRHJpdmVGUy5jb25m +aWcua2F0ZWdvcmllbi5pbmNsdWRlcyhuYW1lKSkgewogICAgICAgICAgICBzaG93VG9hc3QoJ0th +dGVnb3JpZSBleGlzdGllcnQgYmVyZWl0cycsICd3YXJuaW5nJyk7CiAgICAgICAgICAgIHJldHVy +bjsKICAgICAgICB9CiAgICAgICAgRHJpdmVGUy5jb25maWcua2F0ZWdvcmllbi5wdXNoKG5hbWUp +OwogICAgICAgIERyaXZlRlMuc29ydEthdGVnb3JpZW4oKTsKCiAgICAgICAgLy8gMS4gQ29uZmln +IHNwZWljaGVybgogICAgICAgIGNvbnN0IG9rID0gYXdhaXQgdGhpcy5zYXZlQ29uZmlnKCk7CiAg +ICAgICAgaWYgKG9rID09PSBmYWxzZSkgewogICAgICAgICAgICB2YXIgcm1JZHggPSBEcml2ZUZT +LmNvbmZpZy5rYXRlZ29yaWVuLmluZGV4T2YobmFtZSk7CiAgICAgICAgICAgIGlmIChybUlkeCA+ +PSAwKSBEcml2ZUZTLmNvbmZpZy5rYXRlZ29yaWVuLnNwbGljZShybUlkeCwgMSk7CiAgICAgICAg +ICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIC8vIDIuIE9yZG5lciBlcnN0ZWxsZW46IGRh +dGEvW0thdGVnb3JpZV0vCiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgaWYgKERyaXZlRlMubW9k +ZSA9PT0gJ3NlcnZlcicpIHsKICAgICAgICAgICAgICAgIHZhciBwbGFjZWhvbGRlciA9IHsgX3Bs +YWNlaG9sZGVyOiB0cnVlIH07CiAgICAgICAgICAgICAgICBhd2FpdCBmZXRjaCgnL2FwaS93cml0 +ZScsIHsgbWV0aG9kOiAnUE9TVCcsIGhlYWRlcnM6IHsnQ29udGVudC1UeXBlJzonYXBwbGljYXRp +b24vanNvbjsgY2hhcnNldD11dGYtOCd9LAogICAgICAgICAgICAgICAgICAgIGJvZHk6IEpTT04u +c3RyaW5naWZ5KHsgcGF0aDogJ2RhdGEvJyArIG5hbWUgKyAnL19pbml0Lmpzb24nLCBkYXRhOiBw +bGFjZWhvbGRlciB9KSB9KTsKICAgICAgICAgICAgICAgIGF3YWl0IGZldGNoKCcvYXBpL2RlbGV0 +ZScsIHsgbWV0aG9kOiAnUE9TVCcsIGhlYWRlcnM6IHsnQ29udGVudC1UeXBlJzonYXBwbGljYXRp +b24vanNvbjsgY2hhcnNldD11dGYtOCd9LAogICAgICAgICAgICAgICAgICAgIGJvZHk6IEpTT04u +c3RyaW5naWZ5KHsgcGF0aDogJ2RhdGEvJyArIG5hbWUgKyAnL19pbml0Lmpzb24nIH0pIH0pOwog +ICAgICAgICAgICB9IGVsc2UgaWYgKERyaXZlRlMubW9kZSA9PT0gJ2ZpbGVzeXN0ZW0nICYmIERy +aXZlRlMuX2RhdGFIYW5kbGUpIHsKICAgICAgICAgICAgICAgIGF3YWl0IERyaXZlRlMuX2RhdGFI +YW5kbGUuZ2V0RGlyZWN0b3J5SGFuZGxlKG5hbWUsIHsgY3JlYXRlOiB0cnVlIH0pOwogICAgICAg +ICAgICB9CiAgICAgICAgfSBjYXRjaChlKSB7IGNvbnNvbGUud2FybignT3JkbmVyLUVyc3RlbGx1 +bmc6JywgZSk7IH0KCiAgICAgICAgLy8gMy4gVUkga29tcGxldHQgYWt0dWFsaXNpZXJlbgogICAg +ICAgIGlucHV0LnZhbHVlID0gJyc7CiAgICAgICAgRHJpdmVQb3J0YWwuc2V0dXBGaWx0ZXJzKCk7 +CiAgICAgICAgRHJpdmVQb3J0YWwucmVuZGVyKCk7CiAgICAgICAgaWYgKHRoaXMudGFibGVWaWV3 +QWN0aXZlKSBEcml2ZVBvcnRhbC5yZW5kZXJUYWJsZVZpZXcoKTsKICAgICAgICB0aGlzLnJlbmRl +ckFkbWluKCk7CiAgICAgICAgc2hvd1RvYXN0KCdLYXRlZ29yaWUgIicgKyBuYW1lICsgJyIgaGlu +enVnZWbDvGd0JywgJ3N1Y2Nlc3MnKTsKICAgIH0sCgogICAgYXN5bmMgcmVtb3ZlQ2F0ZWdvcnko +aW5kZXgpIHsKICAgICAgICB2YXIga2F0ID0gRHJpdmVGUy5jb25maWcua2F0ZWdvcmllbltpbmRl +eF07CiAgICAgICAgdmFyIGRvY0NvdW50ID0gRHJpdmVGUy5kb2N1bWVudHMuZmlsdGVyKGZ1bmN0 +aW9uKGQpeyByZXR1cm4gZC5rYXRlZ29yaWUgPT09IGthdDsgfSkubGVuZ3RoOwogICAgICAgIGlm +IChkb2NDb3VudCA+IDApIHsKICAgICAgICAgICAgaWYgKCFjb25maXJtKCdEaWUgS2F0ZWdvcmll +ICInICsga2F0ICsgJyIgZW50aMOkbHQgJyArIGRvY0NvdW50ICsgJyBEb2t1bWVudChlKS5cbldp +cmtsaWNoIGVudGZlcm5lbj8gRGllIERva3VtZW50ZSBiZWhhbHRlbiBpaHJlIEthdGVnb3JpZS4n +KSkgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBEcml2ZUZTLmNvbmZpZy5rYXRlZ29yaWVuLnNw +bGljZShpbmRleCwgMSk7CiAgICAgICAgY29uc3Qgb2sgPSBhd2FpdCB0aGlzLnNhdmVDb25maWco +KTsKICAgICAgICBpZiAob2sgPT09IGZhbHNlKSB7CiAgICAgICAgICAgIERyaXZlRlMuY29uZmln +LmthdGVnb3JpZW4uc3BsaWNlKGluZGV4LCAwLCBrYXQpOwogICAgICAgICAgICByZXR1cm47CiAg +ICAgICAgfQogICAgICAgIERyaXZlUG9ydGFsLnNldHVwRmlsdGVycygpOwogICAgICAgIERyaXZl +UG9ydGFsLnJlbmRlcigpOwogICAgICAgIGlmIChEcml2ZVBvcnRhbC50YWJsZVZpZXdBY3RpdmUp +IERyaXZlUG9ydGFsLnJlbmRlclRhYmxlVmlldygpOwogICAgICAgIHRoaXMucmVuZGVyQWRtaW4o +KTsKICAgICAgICBzaG93VG9hc3QoJ0thdGVnb3JpZSAiJyArIGthdCArICciIGVudGZlcm50Jywg +J3N1Y2Nlc3MnKTsKICAgIH0sCgogICAgYXN5bmMgaGlkZUNhdGVnb3J5KGluZGV4KSB7CiAgICAg +ICAgdmFyIGthdCA9IERyaXZlRlMuY29uZmlnLmthdGVnb3JpZW5baW5kZXhdOwogICAgICAgIGlm +ICghRHJpdmVGUy5jb25maWcuaGlkZGVuS2F0ZWdvcmllbikgRHJpdmVGUy5jb25maWcuaGlkZGVu +S2F0ZWdvcmllbiA9IFtdOwogICAgICAgIGlmICghRHJpdmVGUy5jb25maWcuaGlkZGVuS2F0ZWdv +cmllbi5pbmNsdWRlcyhrYXQpKSB7CiAgICAgICAgICAgIERyaXZlRlMuY29uZmlnLmhpZGRlbkth +dGVnb3JpZW4ucHVzaChrYXQpOwogICAgICAgIH0KICAgICAgICBjb25zdCBvayA9IGF3YWl0IHRo +aXMuc2F2ZUNvbmZpZygpOwogICAgICAgIGlmIChvayA9PT0gZmFsc2UpIHsKICAgICAgICAgICAg +RHJpdmVGUy5jb25maWcuaGlkZGVuS2F0ZWdvcmllbiA9IERyaXZlRlMuY29uZmlnLmhpZGRlbkth +dGVnb3JpZW4uZmlsdGVyKGZ1bmN0aW9uKGspeyByZXR1cm4gayAhPT0ga2F0OyB9KTsKICAgICAg +ICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBEcml2ZVBvcnRhbC5zZXR1cEZpbHRlcnMo +KTsKICAgICAgICBEcml2ZVBvcnRhbC5yZW5kZXIoKTsKICAgICAgICBpZiAoRHJpdmVQb3J0YWwu +dGFibGVWaWV3QWN0aXZlKSBEcml2ZVBvcnRhbC5yZW5kZXJUYWJsZVZpZXcoKTsKICAgICAgICB0 +aGlzLnJlbmRlckFkbWluKCk7CiAgICAgICAgc2hvd1RvYXN0KCdLYXRlZ29yaWUgIicgKyBrYXQg +KyAnIiBhdXNnZWJsZW5kZXQnLCAnc3VjY2VzcycpOwogICAgfSwKCiAgICBhc3luYyBzaG93Q2F0 +ZWdvcnkoaW5kZXgpIHsKICAgICAgICB2YXIga2F0ID0gRHJpdmVGUy5jb25maWcua2F0ZWdvcmll +bltpbmRleF07CiAgICAgICAgaWYgKCFEcml2ZUZTLmNvbmZpZy5oaWRkZW5LYXRlZ29yaWVuKSBy +ZXR1cm47CiAgICAgICAgRHJpdmVGUy5jb25maWcuaGlkZGVuS2F0ZWdvcmllbiA9IERyaXZlRlMu +Y29uZmlnLmhpZGRlbkthdGVnb3JpZW4uZmlsdGVyKGZ1bmN0aW9uKGspeyByZXR1cm4gayAhPT0g +a2F0OyB9KTsKICAgICAgICBjb25zdCBvayA9IGF3YWl0IHRoaXMuc2F2ZUNvbmZpZygpOwogICAg +ICAgIGlmIChvayA9PT0gZmFsc2UpIHsKICAgICAgICAgICAgRHJpdmVGUy5jb25maWcuaGlkZGVu +S2F0ZWdvcmllbi5wdXNoKGthdCk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAg +ICAgRHJpdmVQb3J0YWwuc2V0dXBGaWx0ZXJzKCk7CiAgICAgICAgRHJpdmVQb3J0YWwucmVuZGVy +KCk7CiAgICAgICAgaWYgKERyaXZlUG9ydGFsLnRhYmxlVmlld0FjdGl2ZSkgRHJpdmVQb3J0YWwu +cmVuZGVyVGFibGVWaWV3KCk7CiAgICAgICAgdGhpcy5yZW5kZXJBZG1pbigpOwogICAgICAgIHNo +b3dUb2FzdCgnS2F0ZWdvcmllICInICsga2F0ICsgJyIgd2llZGVyIGVpbmdlYmxlbmRldCcsICdz +dWNjZXNzJyk7CiAgICB9LAoKICAgIGFzeW5jIGVkaXRTdGFydHNlaXRlKCkgewogICAgICAgIHRo +aXMuY2xvc2VBZG1pbigpOwogICAgICAgIC8vIEFrdHVlbGxlbiBTdGFydHNlaXRlbi1JbmhhbHQg +bGFkZW4KICAgICAgICB2YXIgd2VsY29tZUVsID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLndl +bGNvbWUtY29udGVudCcpOwogICAgICAgIHZhciBjb250ZW50ID0gd2VsY29tZUVsID8gd2VsY29t +ZUVsLmlubmVySFRNTCA6ICcnOwoKICAgICAgICAvLyBHZXNwZWljaGVydGVuIEluaGFsdCBhdXMg +RGF0ZWkgbGFkZW4gKGZhbGxzIHZvcmhhbmRlbikKICAgICAgICB0cnkgewogICAgICAgICAgICBp +ZiAoRHJpdmVGUy5tb2RlID09PSAnc2VydmVyJykgewogICAgICAgICAgICAgICAgdmFyIHJlcyA9 +IGF3YWl0IGZldGNoKCcvZGF0YS8uc3RhcnRzZWl0ZS5odG1sJyk7CiAgICAgICAgICAgICAgICBp +ZiAocmVzLm9rKSBjb250ZW50ID0gYXdhaXQgcmVzLnRleHQoKTsKICAgICAgICAgICAgfSBlbHNl +IGlmIChEcml2ZUZTLm1vZGUgPT09ICdzdGF0aWMnKSB7CiAgICAgICAgICAgICAgICB2YXIgcmVz +MiA9IGF3YWl0IGZldGNoKCdkYXRhLy5zdGFydHNlaXRlLmh0bWwnKTsKICAgICAgICAgICAgICAg +IGlmIChyZXMyLm9rKSBjb250ZW50ID0gYXdhaXQgcmVzMi50ZXh0KCk7CiAgICAgICAgICAgIH0g +ZWxzZSBpZiAoRHJpdmVGUy5tb2RlID09PSAnZmlsZXN5c3RlbScgJiYgRHJpdmVGUy5fZGF0YUhh +bmRsZSkgewogICAgICAgICAgICAgICAgdmFyIGZoID0gYXdhaXQgRHJpdmVGUy5fZGF0YUhhbmRs +ZS5nZXRGaWxlSGFuZGxlKCcuc3RhcnRzZWl0ZS5odG1sJyk7CiAgICAgICAgICAgICAgICB2YXIg +ZmlsZSA9IGF3YWl0IGZoLmdldEZpbGUoKTsKICAgICAgICAgICAgICAgIGNvbnRlbnQgPSBhd2Fp +dCBmaWxlLnRleHQoKTsKICAgICAgICAgICAgfQogICAgICAgIH0gY2F0Y2goZSkge30KCiAgICAg +ICAgLy8gRWRpdG9yIG9lZmZuZW4gbWl0IFN0YXJ0c2VpdGVuLUluaGFsdAogICAgICAgIERyaXZl +RWRpdG9yLmlzTmV3ID0gZmFsc2U7CiAgICAgICAgRHJpdmVFZGl0b3IuX2lzU3RhcnRzZWl0ZSA9 +IHRydWU7CiAgICAgICAgRHJpdmVFZGl0b3IuY3VycmVudERvYyA9IHsKICAgICAgICAgICAgaWQ6 +ICdfc3RhcnRzZWl0ZScsCiAgICAgICAgICAgIHRpdGVsOiAnU3RhcnRzZWl0ZScsCiAgICAgICAg +ICAgIGthdGVnb3JpZTogJycsCiAgICAgICAgICAgIGluaGFsdDogY29udGVudCwKICAgICAgICAg +ICAgc3RhdHVzOiAnJywKICAgICAgICAgICAgbWVkaWFzOiBbXQogICAgICAgIH07CiAgICAgICAg +RHJpdmVFZGl0b3Iub3Blbk1vZGFsKCdTdGFydHNlaXRlIGJlYXJiZWl0ZW4nKTsKICAgICAgICAv +LyBLYXRlZ29yaWUvU3RhdHVzL01ldGEtRmVsZGVyIGF1c2JsZW5kZW4gKG5pY2h0IHJlbGV2YW50 +IGZ1ZXIgU3RhcnRzZWl0ZSkKICAgICAgICB2YXIgbWV0YVJvd3MgPSBkb2N1bWVudC5xdWVyeVNl +bGVjdG9yQWxsKCcuZWRpdG9yLW1ldGEtcm93Jyk7CiAgICAgICAgbWV0YVJvd3MuZm9yRWFjaChm +dW5jdGlvbihyb3cpIHsgcm93LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7IH0pOwogICAgfSwKCiAg +ICBhc3luYyBzYXZlU3RhcnRzZWl0ZShjb250ZW50KSB7CiAgICAgICAgaWYgKERyaXZlRlMubW9k +ZSA9PT0gJ3NlcnZlcicpIHsKICAgICAgICAgICAgYXdhaXQgZmV0Y2goJy9hcGkvd3JpdGUnLCB7 +IG1ldGhvZDogJ1BPU1QnLCBoZWFkZXJzOiB7J0NvbnRlbnQtVHlwZSc6J2FwcGxpY2F0aW9uL2pz +b247IGNoYXJzZXQ9dXRmLTgnfSwKICAgICAgICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5 +KHsgcGF0aDogJ2RhdGEvLnN0YXJ0c2VpdGUuaHRtbCcsIGRhdGE6IGNvbnRlbnQgfSkgfSk7CiAg +ICAgICAgfSBlbHNlIGlmIChEcml2ZUZTLm1vZGUgPT09ICdmaWxlc3lzdGVtJyAmJiBEcml2ZUZT +Ll9kYXRhSGFuZGxlKSB7CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICB2YXIgZmgg +PSBhd2FpdCBEcml2ZUZTLl9kYXRhSGFuZGxlLmdldEZpbGVIYW5kbGUoJy5zdGFydHNlaXRlLmh0 +bWwnLCB7IGNyZWF0ZTogdHJ1ZSB9KTsKICAgICAgICAgICAgICAgIHZhciB3cml0YWJsZSA9IGF3 +YWl0IGZoLmNyZWF0ZVdyaXRhYmxlKCk7CiAgICAgICAgICAgICAgICBhd2FpdCB3cml0YWJsZS53 +cml0ZShjb250ZW50KTsKICAgICAgICAgICAgICAgIGF3YWl0IHdyaXRhYmxlLmNsb3NlKCk7CiAg +ICAgICAgICAgIH0gY2F0Y2goZSkge30KICAgICAgICB9CiAgICAgICAgLy8gU3RhcnRzZWl0ZSBp +bSBET00gYWt0dWFsaXNpZXJlbiArIENhY2hlIGZ1ZXIgc2hvd0hvbWUoKSBlcm5ldWVybgogICAg +ICAgIHZhciB3ZWxjb21lRWwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcud2VsY29tZS1jb250 +ZW50Jyk7CiAgICAgICAgaWYgKHdlbGNvbWVFbCkgewogICAgICAgICAgICB3ZWxjb21lRWwuaW5u +ZXJIVE1MID0gdGhpcy5fc2FuaXRpemVIVE1MKGNvbnRlbnQpOwogICAgICAgICAgICBEcml2ZVBv +cnRhbC5fd2VsY29tZUhUTUwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZG9jdW1lbnREZXRh +aWwnKS5pbm5lckhUTUw7CiAgICAgICAgfQogICAgICAgIHNob3dUb2FzdCgnU3RhcnRzZWl0ZSBn +ZXNwZWljaGVydCcsICdzdWNjZXNzJyk7CiAgICAgICAgLy8gaW5kZXguanMgZnVlciBMZXNlbW9k +dXMgYWt0dWFsaXNpZXJlbiAoU3RhcnRzZWl0ZSBpc3QgZGFyaW4gZWluZ2ViZXR0ZXQpCiAgICAg +ICAgYXdhaXQgRHJpdmVGUy51cGRhdGVJbmRleCgpOwogICAgfSwKCiAgICBhc3luYyBsb2FkU3Rh +cnRzZWl0ZSgpIHsKICAgICAgICB0cnkgewogICAgICAgICAgICB2YXIgcmF3ID0gbnVsbDsKICAg +ICAgICAgICAgaWYgKERyaXZlRlMubW9kZSA9PT0gJ3NlcnZlcicpIHsKICAgICAgICAgICAgICAg +IHZhciByZXMgPSBhd2FpdCBmZXRjaCgnL2RhdGEvLnN0YXJ0c2VpdGUuaHRtbCcpOwogICAgICAg +ICAgICAgICAgaWYgKHJlcy5vaykgcmF3ID0gYXdhaXQgcmVzLnRleHQoKTsKICAgICAgICAgICAg +fSBlbHNlIGlmIChEcml2ZUZTLm1vZGUgPT09ICdzdGF0aWMnKSB7CiAgICAgICAgICAgICAgICB2 +YXIgcmVzMiA9IGF3YWl0IGZldGNoKCdkYXRhLy5zdGFydHNlaXRlLmh0bWwnKTsKICAgICAgICAg +ICAgICAgIGlmIChyZXMyLm9rKSByYXcgPSBhd2FpdCByZXMyLnRleHQoKTsKICAgICAgICAgICAg +fSBlbHNlIGlmIChEcml2ZUZTLm1vZGUgPT09ICdmaWxlc3lzdGVtJyAmJiBEcml2ZUZTLl9kYXRh +SGFuZGxlKSB7CiAgICAgICAgICAgICAgICB2YXIgZmggPSBhd2FpdCBEcml2ZUZTLl9kYXRhSGFu +ZGxlLmdldEZpbGVIYW5kbGUoJy5zdGFydHNlaXRlLmh0bWwnKTsKICAgICAgICAgICAgICAgIHZh +ciBmaWxlID0gYXdhaXQgZmguZ2V0RmlsZSgpOwogICAgICAgICAgICAgICAgcmF3ID0gYXdhaXQg +ZmlsZS50ZXh0KCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHJhdyAmJiByYXcubGVu +Z3RoID4gMTApIHsKICAgICAgICAgICAgICAgIHZhciB3ZWxjb21lRWwgPSBkb2N1bWVudC5xdWVy +eVNlbGVjdG9yKCcud2VsY29tZS1jb250ZW50Jyk7CiAgICAgICAgICAgICAgICBpZiAod2VsY29t +ZUVsKSB7CiAgICAgICAgICAgICAgICAgICAgd2VsY29tZUVsLmlubmVySFRNTCA9IHRoaXMuX3Nh +bml0aXplSFRNTChyYXcpOwogICAgICAgICAgICAgICAgICAgIC8vIENhY2hlIGFrdHVhbGlzaWVy +ZW4sIGRhbWl0IHNob3dIb21lKCkgZGVuIGdlc3BlaWNoZXJ0ZW4gSW5oYWx0IHplaWd0CiAgICAg +ICAgICAgICAgICAgICAgRHJpdmVQb3J0YWwuX3dlbGNvbWVIVE1MID0gZG9jdW1lbnQuZ2V0RWxl +bWVudEJ5SWQoJ2RvY3VtZW50RGV0YWlsJykuaW5uZXJIVE1MOwogICAgICAgICAgICAgICAgfQog +ICAgICAgICAgICB9CiAgICAgICAgfSBjYXRjaChlKSB7fQogICAgfSwKCiAgICBhc3luYyBzYXZl +SGVscENvbnRlbnQoKSB7CiAgICAgICAgdmFyIGNvbnRlbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50 +QnlJZCgnaGVscEJvZHknKS5pbm5lckhUTUw7CiAgICAgICAgLy8gUGVyc2lzdGllcmVuIGFscyBk +YXRhLy5oZWxwLWNvbnRlbnQuaHRtbAogICAgICAgIGlmIChEcml2ZUZTLm1vZGUgPT09ICdzZXJ2 +ZXInKSB7CiAgICAgICAgICAgIGF3YWl0IGZldGNoKCcvYXBpL3dyaXRlJywgeyBtZXRob2Q6ICdQ +T1NUJywgaGVhZGVyczogeydDb250ZW50LVR5cGUnOidhcHBsaWNhdGlvbi9qc29uOyBjaGFyc2V0 +PXV0Zi04J30sCiAgICAgICAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IHBhdGg6ICdk +YXRhLy5oZWxwLWNvbnRlbnQuaHRtbCcsIGRhdGE6IGNvbnRlbnQgfSkgfSk7CiAgICAgICAgfSBl +bHNlIGlmIChEcml2ZUZTLm1vZGUgPT09ICdmaWxlc3lzdGVtJyAmJiBEcml2ZUZTLl9kYXRhSGFu +ZGxlKSB7CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICB2YXIgZmggPSBhd2FpdCBE +cml2ZUZTLl9kYXRhSGFuZGxlLmdldEZpbGVIYW5kbGUoJy5oZWxwLWNvbnRlbnQuaHRtbCcsIHsg +Y3JlYXRlOiB0cnVlIH0pOwogICAgICAgICAgICAgICAgdmFyIHdyaXRhYmxlID0gYXdhaXQgZmgu +Y3JlYXRlV3JpdGFibGUoKTsKICAgICAgICAgICAgICAgIGF3YWl0IHdyaXRhYmxlLndyaXRlKGNv +bnRlbnQpOwogICAgICAgICAgICAgICAgYXdhaXQgd3JpdGFibGUuY2xvc2UoKTsKICAgICAgICAg +ICAgfSBjYXRjaChlKSB7fQogICAgICAgIH0KICAgICAgICBzaG93VG9hc3QoJ0hpbGZlLUluaGFs +dCBnZXNwZWljaGVydCcsICdzdWNjZXNzJyk7CiAgICB9LAoKICAgIF9zYW5pdGl6ZUhUTUwoaHRt +bCkgewogICAgICAgIC8vIFNjcmlwdC1UYWdzLCBFdmVudC1IYW5kbGVyIHVuZCBnZWbDpGhybGlj +aGUgQXR0cmlidXRlIGVudGZlcm5lbgogICAgICAgIHZhciBkaXYgPSBkb2N1bWVudC5jcmVhdGVF +bGVtZW50KCdkaXYnKTsKICAgICAgICBkaXYuaW5uZXJIVE1MID0gaHRtbDsKICAgICAgICBkaXYu +cXVlcnlTZWxlY3RvckFsbCgnc2NyaXB0LGlmcmFtZSxvYmplY3QsZW1iZWQsZm9ybScpLmZvckVh +Y2goZnVuY3Rpb24oZWwpeyBlbC5yZW1vdmUoKTsgfSk7CiAgICAgICAgZGl2LnF1ZXJ5U2VsZWN0 +b3JBbGwoJyonKS5mb3JFYWNoKGZ1bmN0aW9uKGVsKSB7CiAgICAgICAgICAgIEFycmF5LmZyb20o +ZWwuYXR0cmlidXRlcykuZm9yRWFjaChmdW5jdGlvbihhdHRyKSB7CiAgICAgICAgICAgICAgICBp +ZiAoYXR0ci5uYW1lLnN0YXJ0c1dpdGgoJ29uJykgfHwgYXR0ci52YWx1ZS50cmltKCkudG9Mb3dl +ckNhc2UoKS5zdGFydHNXaXRoKCdqYXZhc2NyaXB0OicpKSB7CiAgICAgICAgICAgICAgICAgICAg +ZWwucmVtb3ZlQXR0cmlidXRlKGF0dHIubmFtZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAg +ICAgIH0pOwogICAgICAgIH0pOwogICAgICAgIHJldHVybiBkaXYuaW5uZXJIVE1MOwogICAgfSwK +CiAgICBhc3luYyBsb2FkSGVscENvbnRlbnQoKSB7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAg +dmFyIHJhdyA9IG51bGw7CiAgICAgICAgICAgIGlmIChEcml2ZUZTLm1vZGUgPT09ICdzZXJ2ZXIn +KSB7CiAgICAgICAgICAgICAgICB2YXIgcmVzID0gYXdhaXQgZmV0Y2goJy9kYXRhLy5oZWxwLWNv +bnRlbnQuaHRtbCcpOwogICAgICAgICAgICAgICAgaWYgKHJlcy5vaykgcmF3ID0gYXdhaXQgcmVz +LnRleHQoKTsKICAgICAgICAgICAgfSBlbHNlIGlmIChEcml2ZUZTLm1vZGUgPT09ICdzdGF0aWMn +KSB7CiAgICAgICAgICAgICAgICB2YXIgcmVzMiA9IGF3YWl0IGZldGNoKCdkYXRhLy5oZWxwLWNv +bnRlbnQuaHRtbCcpOwogICAgICAgICAgICAgICAgaWYgKHJlczIub2spIHJhdyA9IGF3YWl0IHJl +czIudGV4dCgpOwogICAgICAgICAgICB9IGVsc2UgaWYgKERyaXZlRlMubW9kZSA9PT0gJ2ZpbGVz +eXN0ZW0nICYmIERyaXZlRlMuX2RhdGFIYW5kbGUpIHsKICAgICAgICAgICAgICAgIHZhciBmaCA9 +IGF3YWl0IERyaXZlRlMuX2RhdGFIYW5kbGUuZ2V0RmlsZUhhbmRsZSgnLmhlbHAtY29udGVudC5o +dG1sJyk7CiAgICAgICAgICAgICAgICB2YXIgZmlsZSA9IGF3YWl0IGZoLmdldEZpbGUoKTsKICAg +ICAgICAgICAgICAgIHJhdyA9IGF3YWl0IGZpbGUudGV4dCgpOwogICAgICAgICAgICB9CiAgICAg +ICAgICAgIGlmIChyYXcgJiYgcmF3Lmxlbmd0aCA+IDEwKSB7CiAgICAgICAgICAgICAgICBkb2N1 +bWVudC5nZXRFbGVtZW50QnlJZCgnaGVscEJvZHknKS5pbm5lckhUTUwgPSB0aGlzLl9zYW5pdGl6 +ZUhUTUwocmF3KTsKICAgICAgICAgICAgfQogICAgICAgIH0gY2F0Y2goZSkge30KICAgIH0sCgog +ICAgYXN5bmMgc2F2ZUNvbmZpZygpIHsKICAgICAgICB0cnkgewogICAgICAgICAgICBpZiAoRHJp +dmVGUy5tb2RlID09PSAnc2VydmVyJykgewogICAgICAgICAgICAgICAgY29uc3QgcmVzID0gYXdh +aXQgZmV0Y2goJy9hcGkvd3JpdGUnLCB7CiAgICAgICAgICAgICAgICAgICAgbWV0aG9kOiAnUE9T +VCcsCiAgICAgICAgICAgICAgICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxp +Y2F0aW9uL2pzb247IGNoYXJzZXQ9dXRmLTgnIH0sCiAgICAgICAgICAgICAgICAgICAgYm9keTog +SlNPTi5zdHJpbmdpZnkoeyBwYXRoOiAnZGF0YS9jb25maWcuanNvbicsIGRhdGE6IERyaXZlRlMu +Y29uZmlnIH0pCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIGNvbnN0IHJlc3Vs +dCA9IGF3YWl0IHJlcy5qc29uKCk7CiAgICAgICAgICAgICAgICBpZiAoIXJlc3VsdC5vaykgewog +ICAgICAgICAgICAgICAgICAgIHNob3dUb2FzdCgnS29uZmlndXJhdGlvbiBzcGVpY2hlcm4gZmVo +bGdlc2NobGFnZW46ICcgKyAocmVzdWx0LmVycm9yIHx8ICdVbmJla2FubnRlciBGZWhsZXInKSwg +J2Vycm9yJywgNTAwMCk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAg +ICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgaWYgKERyaXZlRlMubW9kZSA9PT0gJ2ZpbGVz +eXN0ZW0nICYmIERyaXZlRlMuX2RhdGFIYW5kbGUpIHsKICAgICAgICAgICAgICAgIHZhciBmaCA9 +IGF3YWl0IERyaXZlRlMuX2RhdGFIYW5kbGUuZ2V0RmlsZUhhbmRsZSgnY29uZmlnLmpzb24nLCB7 +IGNyZWF0ZTogdHJ1ZSB9KTsKICAgICAgICAgICAgICAgIHZhciB3cml0YWJsZSA9IGF3YWl0IGZo +LmNyZWF0ZVdyaXRhYmxlKCk7CiAgICAgICAgICAgICAgICBhd2FpdCB3cml0YWJsZS53cml0ZShK +U09OLnN0cmluZ2lmeShEcml2ZUZTLmNvbmZpZywgbnVsbCwgMikpOwogICAgICAgICAgICAgICAg +YXdhaXQgd3JpdGFibGUuY2xvc2UoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4g +dHJ1ZTsKICAgICAgICB9IGNhdGNoIChlcnIpIHsKICAgICAgICAgICAgc2hvd1RvYXN0KCdLb25m +aWd1cmF0aW9uIHNwZWljaGVybiBmZWhsZ2VzY2hsYWdlbjogJyArIGVyci5tZXNzYWdlLCAnZXJy +b3InLCA1MDAwKTsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgIH0sCgog +ICAgX2VuZ2FnZW1lbnRTb3J0OiAndG90YWwnLAogICAgX2VuZ2FnZW1lbnRDYXQ6ICdhbGwnLAoK +ICAgIHNob3dFbmdhZ2VtZW50U3RhdHMoc29ydEJ5LCBmaWx0ZXJDYXQpIHsKICAgICAgICB0aGlz +LmNsb3NlQWRtaW4oKTsKICAgICAgICBpZiAoc29ydEJ5KSB0aGlzLl9lbmdhZ2VtZW50U29ydCA9 +IHNvcnRCeTsKICAgICAgICBpZiAoZmlsdGVyQ2F0ICE9PSB1bmRlZmluZWQpIHRoaXMuX2VuZ2Fn +ZW1lbnRDYXQgPSBmaWx0ZXJDYXQ7CiAgICAgICAgdmFyIHNvcnQgPSB0aGlzLl9lbmdhZ2VtZW50 +U29ydDsKICAgICAgICB2YXIgY2F0RmlsdGVyID0gdGhpcy5fZW5nYWdlbWVudENhdDsKICAgICAg +ICB2YXIgZG9jcyA9IERyaXZlRlMuZG9jdW1lbnRzOwogICAgICAgIHZhciBrYXRlZ29yaWVuID0g +RHJpdmVGUy5jb25maWcua2F0ZWdvcmllbiB8fCBbXTsKICAgICAgICB2YXIgdG90YWxEb2NzID0g +ZG9jcy5sZW5ndGg7CiAgICAgICAgdmFyIHRvdGFsRnJlaWdlZ2ViZW4gPSBkb2NzLmZpbHRlcihm +dW5jdGlvbihkKXsgcmV0dXJuIGQuc3RhdHVzID09PSAnRnJlaWdlZ2ViZW4nOyB9KS5sZW5ndGg7 +CiAgICAgICAgdmFyIHRvdGFsUHJ1ZWZ1bmcgPSBkb2NzLmZpbHRlcihmdW5jdGlvbihkKXsgcmV0 +dXJuIGQuc3RhdHVzID09PSAnUHLDvGZ1bmcnOyB9KS5sZW5ndGg7CiAgICAgICAgdmFyIHRvdGFs +RW50d3VyZiA9IGRvY3MuZmlsdGVyKGZ1bmN0aW9uKGQpeyByZXR1cm4gZC5zdGF0dXMgPT09ICdF +bnR3dXJmJzsgfSkubGVuZ3RoOwogICAgICAgIHZhciB0b3RhbFdpdGhNZWRpYSA9IGRvY3MuZmls +dGVyKGZ1bmN0aW9uKGQpeyByZXR1cm4gZC5tZWRpYXMgJiYgZC5tZWRpYXMubGVuZ3RoID4gMDsg +fSkubGVuZ3RoOwoKICAgICAgICAvLyBVc2VyLUJlaXRyw6RnZSB6w6RobGVuIOKAkyBhdWZnZXNj +aGzDvHNzZWx0IG5hY2ggS2F0ZWdvcmllCiAgICAgICAgdmFyIHVzZXJTdGF0cyA9IHt9OwogICAg +ICAgIGRvY3MuZm9yRWFjaChmdW5jdGlvbihkb2MpIHsKICAgICAgICAgICAgdmFyIGthdCA9IGRv +Yy5rYXRlZ29yaWUgfHwgJ1NvbnN0aWdlJzsKICAgICAgICAgICAgZnVuY3Rpb24gZW5zdXJlKG5h +bWUpIHsKICAgICAgICAgICAgICAgIGlmICghdXNlclN0YXRzW25hbWVdKSB1c2VyU3RhdHNbbmFt +ZV0gPSB7IGNyZWF0ZWQ6IDAsIGVkaXRlZDogMCwgcmV2aWV3czogMCwga2F0ZWdvcmllbjoge30g +fTsKICAgICAgICAgICAgICAgIGlmICghdXNlclN0YXRzW25hbWVdLmthdGVnb3JpZW5ba2F0XSkg +dXNlclN0YXRzW25hbWVdLmthdGVnb3JpZW5ba2F0XSA9IHsgY3JlYXRlZDogMCwgZWRpdGVkOiAw +LCByZXZpZXdzOiAwIH07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGRvYy5lcnN0ZWxs +dFZvbikgewogICAgICAgICAgICAgICAgZW5zdXJlKGRvYy5lcnN0ZWxsdFZvbik7CiAgICAgICAg +ICAgICAgICB1c2VyU3RhdHNbZG9jLmVyc3RlbGx0Vm9uXS5jcmVhdGVkKys7CiAgICAgICAgICAg +ICAgICB1c2VyU3RhdHNbZG9jLmVyc3RlbGx0Vm9uXS5rYXRlZ29yaWVuW2thdF0uY3JlYXRlZCsr +OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChkb2MuYmVhcmJlaXRldFZvbiAmJiBkb2Mu +YmVhcmJlaXRldFZvbiAhPT0gZG9jLmVyc3RlbGx0Vm9uKSB7CiAgICAgICAgICAgICAgICBlbnN1 +cmUoZG9jLmJlYXJiZWl0ZXRWb24pOwogICAgICAgICAgICAgICAgdXNlclN0YXRzW2RvYy5iZWFy +YmVpdGV0Vm9uXS5lZGl0ZWQrKzsKICAgICAgICAgICAgICAgIHVzZXJTdGF0c1tkb2MuYmVhcmJl +aXRldFZvbl0ua2F0ZWdvcmllbltrYXRdLmVkaXRlZCsrOwogICAgICAgICAgICB9CiAgICAgICAg +ICAgIChkb2MuY29udHJpYnV0b3JzIHx8IFtdKS5mb3JFYWNoKGZ1bmN0aW9uKGMpIHsKICAgICAg +ICAgICAgICAgIGVuc3VyZShjLnVzZXJuYW1lKTsKICAgICAgICAgICAgICAgIGlmIChjLnJvbGUg +PT09ICdyZXZpZXcnKSB7CiAgICAgICAgICAgICAgICAgICAgdXNlclN0YXRzW2MudXNlcm5hbWVd +LnJldmlld3MgKz0gKGMuZW50cmllcyB8fCAxKTsKICAgICAgICAgICAgICAgICAgICB1c2VyU3Rh +dHNbYy51c2VybmFtZV0ua2F0ZWdvcmllbltrYXRdLnJldmlld3MgKz0gKGMuZW50cmllcyB8fCAx +KTsKICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYy5yb2xlID09PSAnYXV0b3InKSB7CiAgICAg +ICAgICAgICAgICAgICAgdXNlclN0YXRzW2MudXNlcm5hbWVdLmNyZWF0ZWQgKz0gKGMuZW50cmll +cyB8fCAxKSAtIDE7IC8vIC0xIHdlaWwgZXJzdGVsbHRWb24gc2Nob24gesOkaGx0CiAgICAgICAg +ICAgICAgICAgICAgdXNlclN0YXRzW2MudXNlcm5hbWVdLmthdGVnb3JpZW5ba2F0XS5jcmVhdGVk +ICs9IChjLmVudHJpZXMgfHwgMSkgLSAxOwogICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjLnJv +bGUgPT09ICdyZWRha3Rpb24nKSB7CiAgICAgICAgICAgICAgICAgICAgdXNlclN0YXRzW2MudXNl +cm5hbWVdLmVkaXRlZCArPSAoYy5lbnRyaWVzIHx8IDEpOwogICAgICAgICAgICAgICAgICAgIHVz +ZXJTdGF0c1tjLnVzZXJuYW1lXS5rYXRlZ29yaWVuW2thdF0uZWRpdGVkICs9IChjLmVudHJpZXMg +fHwgMSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICB2YXIg +Z292ID0gZG9jLmdvdmVybmFuY2UgfHwge307CiAgICAgICAgICAgIChnb3YucmV2aWV3SGlzdG9y +eSB8fCBbXSkuZm9yRWFjaChmdW5jdGlvbihyKSB7CiAgICAgICAgICAgICAgICBpZiAoci5yZXZp +ZXdlcikgewogICAgICAgICAgICAgICAgICAgIGVuc3VyZShyLnJldmlld2VyKTsKICAgICAgICAg +ICAgICAgICAgICB1c2VyU3RhdHNbci5yZXZpZXdlcl0ucmV2aWV3cysrOwogICAgICAgICAgICAg +ICAgICAgIHVzZXJTdGF0c1tyLnJldmlld2VyXS5rYXRlZ29yaWVuW2thdF0ucmV2aWV3cysrOwog +ICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9KTsKCiAgICAgICAgLy8g +U29ydGllcnVuZwogICAgICAgIHZhciBzb3J0ZWRVc2VycyA9IE9iamVjdC5lbnRyaWVzKHVzZXJT +dGF0cyk7CiAgICAgICAgdmFyIGdldFZhbCA9IGZ1bmN0aW9uKHMpIHsKICAgICAgICAgICAgdmFy +IGQgPSBzWzFdOwogICAgICAgICAgICBpZiAoY2F0RmlsdGVyICE9PSAnYWxsJykgZCA9IGQua2F0 +ZWdvcmllbltjYXRGaWx0ZXJdIHx8IHsgY3JlYXRlZDowLCBlZGl0ZWQ6MCwgcmV2aWV3czowIH07 +CiAgICAgICAgICAgIGlmIChzb3J0ID09PSAnY3JlYXRlZCcpIHJldHVybiBkLmNyZWF0ZWQ7CiAg +ICAgICAgICAgIGlmIChzb3J0ID09PSAnZWRpdGVkJykgcmV0dXJuIGQuZWRpdGVkOwogICAgICAg +ICAgICBpZiAoc29ydCA9PT0gJ3Jldmlld3MnKSByZXR1cm4gZC5yZXZpZXdzOwogICAgICAgICAg +ICByZXR1cm4gZC5jcmVhdGVkICsgZC5lZGl0ZWQgKyBkLnJldmlld3M7CiAgICAgICAgfTsKICAg +ICAgICBzb3J0ZWRVc2Vycy5zb3J0KGZ1bmN0aW9uKGEsYil7IHJldHVybiBnZXRWYWwoYikgLSBn +ZXRWYWwoYSk7IH0pOwogICAgICAgIHNvcnRlZFVzZXJzID0gc29ydGVkVXNlcnMuZmlsdGVyKGZ1 +bmN0aW9uKHUpeyByZXR1cm4gZ2V0VmFsKHUpID4gMDsgfSk7CgogICAgICAgIC8vIEthdGVnb3Jp +ZW4tVmVydGVpbHVuZwogICAgICAgIHZhciBjYXRTdGF0cyA9IHt9OwogICAgICAgIGRvY3MuZm9y +RWFjaChmdW5jdGlvbihkKSB7IGNhdFN0YXRzW2Qua2F0ZWdvcmllXSA9IChjYXRTdGF0c1tkLmth +dGVnb3JpZV0gfHwgMCkgKyAxOyB9KTsKCiAgICAgICAgLy8gU2NobGFnd29ydC1Iw6R1Zmlna2Vp +dGVuCiAgICAgICAgdmFyIGt3U3RhdHMgPSB7fTsKICAgICAgICBkb2NzLmZvckVhY2goZnVuY3Rp +b24oZCkgeyAoZC5zY2hsYWd3b2VydGVyIHx8IFtdKS5mb3JFYWNoKGZ1bmN0aW9uKGspIHsga3dT +dGF0c1trXSA9IChrd1N0YXRzW2tdIHx8IDApICsgMTsgfSk7IH0pOwogICAgICAgIHZhciB0b3BL +d3MgPSBPYmplY3QuZW50cmllcyhrd1N0YXRzKS5zb3J0KGZ1bmN0aW9uKGEsYil7IHJldHVybiBi +WzFdLWFbMV07IH0pLnNsaWNlKDAsIDEwKTsKCiAgICAgICAgLy8gTW9uYXRsaWNoZSBFcnN0ZWxs +dW5nCiAgICAgICAgdmFyIG1vbnRoU3RhdHMgPSB7fTsKICAgICAgICBkb2NzLmZvckVhY2goZnVu +Y3Rpb24oZCkgeyB2YXIgbSA9IChkLmVyc3RlbGx0IHx8ICcnKS5zdWJzdHJpbmcoMCwgNyk7IGlm +IChtKSBtb250aFN0YXRzW21dID0gKG1vbnRoU3RhdHNbbV0gfHwgMCkgKyAxOyB9KTsKICAgICAg +ICB2YXIgbW9udGhzID0gT2JqZWN0LmVudHJpZXMobW9udGhTdGF0cykuc29ydChmdW5jdGlvbihh +LGIpeyByZXR1cm4gYVswXS5sb2NhbGVDb21wYXJlKGJbMF0pOyB9KTsKCiAgICAgICAgdmFyIG1h +eENhdCA9IE1hdGgubWF4LmFwcGx5KG51bGwsIE9iamVjdC52YWx1ZXMoY2F0U3RhdHMpLmNvbmNh +dChbMV0pKTsKICAgICAgICB2YXIgbWF4S3cgPSB0b3BLd3MubGVuZ3RoID4gMCA/IHRvcEt3c1sw +XVsxXSA6IDE7CiAgICAgICAgdmFyIG1heE1vbnRoID0gbW9udGhzLmxlbmd0aCA+IDAgPyBNYXRo +Lm1heC5hcHBseShudWxsLCBtb250aHMubWFwKGZ1bmN0aW9uKG0pe3JldHVybiBtWzFdO30pKSA6 +IDE7CgogICAgICAgIHZhciBodG1sID0gJzxkaXYgc3R5bGU9InBhZGRpbmc6MjBweDsiPjxoMiBz +dHlsZT0iY29sb3I6dmFyKC0tdGV4dC1oZWFkaW5nKTttYXJnaW4tYm90dG9tOjIwcHg7Ij5Vc2Vy +LUVuZ2FnZW1lbnQgU3RhdGlzdGlrPC9oMj4nOwoKICAgICAgICAvLyDDnGJlcnNpY2h0c2thcnRl +bgogICAgICAgIGh0bWwgKz0gJzxkaXYgY2xhc3M9InN0YXQtZ3JpZCI+JyArCiAgICAgICAgICAg +ICc8ZGl2IGNsYXNzPSJzdGF0LWNhcmQiPjxkaXYgY2xhc3M9InN0YXQtdmFsdWUiPicgKyB0b3Rh +bERvY3MgKyAnPC9kaXY+PGRpdiBjbGFzcz0ic3RhdC1sYWJlbCI+RG9rdW1lbnRlIGdlc2FtdDwv +ZGl2PjwvZGl2PicgKwogICAgICAgICAgICAnPGRpdiBjbGFzcz0ic3RhdC1jYXJkIj48ZGl2IGNs +YXNzPSJzdGF0LXZhbHVlIiBzdHlsZT0iY29sb3I6IzE1NTcyNDsiPicgKyB0b3RhbEZyZWlnZWdl +YmVuICsgJzwvZGl2PjxkaXYgY2xhc3M9InN0YXQtbGFiZWwiPkZyZWlnZWdlYmVuPC9kaXY+PC9k +aXY+JyArCiAgICAgICAgICAgICc8ZGl2IGNsYXNzPSJzdGF0LWNhcmQiPjxkaXYgY2xhc3M9InN0 +YXQtdmFsdWUiIHN0eWxlPSJjb2xvcjojN0E0NDE5OyI+JyArIHRvdGFsUHJ1ZWZ1bmcgKyAnPC9k +aXY+PGRpdiBjbGFzcz0ic3RhdC1sYWJlbCI+SW4gUHLDvGZ1bmc8L2Rpdj48L2Rpdj4nICsKICAg +ICAgICAgICAgJzxkaXYgY2xhc3M9InN0YXQtY2FyZCI+PGRpdiBjbGFzcz0ic3RhdC12YWx1ZSIg +c3R5bGU9ImNvbG9yOiM4NTY0MDQ7Ij4nICsgdG90YWxFbnR3dXJmICsgJzwvZGl2PjxkaXYgY2xh +c3M9InN0YXQtbGFiZWwiPkVudHfDvHJmZTwvZGl2PjwvZGl2PicgKwogICAgICAgICAgICAnPGRp +diBjbGFzcz0ic3RhdC1jYXJkIj48ZGl2IGNsYXNzPSJzdGF0LXZhbHVlIj4nICsgdG90YWxXaXRo +TWVkaWEgKyAnPC9kaXY+PGRpdiBjbGFzcz0ic3RhdC1sYWJlbCI+TWl0IE1lZGllbjwvZGl2Pjwv +ZGl2PicgKwogICAgICAgICAgICAnPGRpdiBjbGFzcz0ic3RhdC1jYXJkIj48ZGl2IGNsYXNzPSJz +dGF0LXZhbHVlIj4nICsgT2JqZWN0LmtleXModXNlclN0YXRzKS5sZW5ndGggKyAnPC9kaXY+PGRp +diBjbGFzcz0ic3RhdC1sYWJlbCI+QWt0aXZlIEJlbnV0emVyPC9kaXY+PC9kaXY+JyArCiAgICAg +ICAgJzwvZGl2Pic7CgogICAgICAgIC8vIC0tLSBCZW51dHplci1Ba3Rpdml0w6R0IG1pdCBGaWx0 +ZXIgKyBTb3J0aWVydW5nIC0tLQogICAgICAgIGh0bWwgKz0gJzxoMyBzdHlsZT0iY29sb3I6dmFy +KC0tdGV4dC1oZWFkaW5nKTttYXJnaW46MjBweCAwIDhweDsiPkJlbnV0emVyLUFrdGl2aXTDpHQg +bmFjaCBCZXJlaWNoPC9oMz4nOwoKICAgICAgICAvLyBGaWx0ZXItTGVpc3RlCiAgICAgICAgdmFy +IGJ0blN0eWxlID0gZnVuY3Rpb24odmFsLCBjdXJyZW50LCBlbXB0eSkgewogICAgICAgICAgICBp +ZiAodmFsID09PSBjdXJyZW50KSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJ3BhZGRpbmc6NHB4 +IDEycHg7Ym9yZGVyOjFweCBzb2xpZCB2YXIoLS10ZXh0LWhlYWRpbmcpO2JhY2tncm91bmQ6dmFy +KC0tdGV4dC1oZWFkaW5nKTtjb2xvcjp3aGl0ZTtib3JkZXItcmFkaXVzOjRweDtjdXJzb3I6cG9p +bnRlcjtmb250LXNpemU6MTJweDtmb250LXdlaWdodDo1MDA7JzsKICAgICAgICAgICAgfQogICAg +ICAgICAgICBpZiAoZW1wdHkpIHsKICAgICAgICAgICAgICAgIHJldHVybiAncGFkZGluZzo0cHgg +MTJweDtib3JkZXI6MXB4IHNvbGlkICM4YjFhMWE7YmFja2dyb3VuZDojOGIxYTFhO2NvbG9yOiNm +ZmY7Ym9yZGVyLXJhZGl1czo0cHg7Y3Vyc29yOnBvaW50ZXI7Zm9udC1zaXplOjEycHg7Zm9udC13 +ZWlnaHQ6NTAwOyc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuICdwYWRkaW5nOjRw +eCAxMnB4O2JvcmRlcjoxcHggc29saWQgdmFyKC0tYm9yZGVyLWNvbG9yKTtiYWNrZ3JvdW5kOnZh +cigtLWJnLWNhcmQpO2NvbG9yOnZhcigtLXRleHQtcHJpbWFyeSk7Ym9yZGVyLXJhZGl1czo0cHg7 +Y3Vyc29yOnBvaW50ZXI7Zm9udC1zaXplOjEycHg7Zm9udC13ZWlnaHQ6NTAwOyc7CiAgICAgICAg +fTsKICAgICAgICBodG1sICs9ICc8ZGl2IHN0eWxlPSJkaXNwbGF5OmZsZXg7Z2FwOjZweDtmbGV4 +LXdyYXA6d3JhcDttYXJnaW4tYm90dG9tOjZweDthbGlnbi1pdGVtczpjZW50ZXI7Ij4nICsKICAg +ICAgICAgICAgJzxzcGFuIHN0eWxlPSJmb250LXNpemU6MTJweDtjb2xvcjp2YXIoLS10ZXh0LW11 +dGVkKTttYXJnaW4tcmlnaHQ6NHB4OyI+S2F0ZWdvcmllOjwvc3Bhbj4nICsKICAgICAgICAgICAg +JzxidXR0b24gc3R5bGU9IicgKyBidG5TdHlsZSgnYWxsJywgY2F0RmlsdGVyLCBmYWxzZSkgKyAn +IiBvbmNsaWNrPSJEcml2ZUdvdmVybmFuY2Uuc2hvd0VuZ2FnZW1lbnRTdGF0cyhudWxsLFwnYWxs +XCcpIj5BbGxlPC9idXR0b24+JzsKICAgICAgICBrYXRlZ29yaWVuLmZvckVhY2goZnVuY3Rpb24o +aykgewogICAgICAgICAgICB2YXIgaGFzTm9Eb2NzID0gIWNhdFN0YXRzW2tdOwogICAgICAgICAg +ICBodG1sICs9ICc8YnV0dG9uIHN0eWxlPSInICsgYnRuU3R5bGUoaywgY2F0RmlsdGVyLCBoYXNO +b0RvY3MpICsgJyIgb25jbGljaz0iRHJpdmVHb3Zlcm5hbmNlLnNob3dFbmdhZ2VtZW50U3RhdHMo +bnVsbCxcJycgKyBEcml2ZVBvcnRhbC5lc2NhcGVBdHRyKGspICsgJ1wnKSI+JyArIERyaXZlUG9y +dGFsLmVzY2FwZUhUTUwoaykgKyAnPC9idXR0b24+JzsKICAgICAgICB9KTsKICAgICAgICBodG1s +ICs9ICc8L2Rpdj4nOwoKICAgICAgICBodG1sICs9ICc8ZGl2IHN0eWxlPSJkaXNwbGF5OmZsZXg7 +Z2FwOjZweDtmbGV4LXdyYXA6d3JhcDttYXJnaW4tYm90dG9tOjEwcHg7YWxpZ24taXRlbXM6Y2Vu +dGVyOyI+JyArCiAgICAgICAgICAgICc8c3BhbiBzdHlsZT0iZm9udC1zaXplOjEycHg7Y29sb3I6 +dmFyKC0tdGV4dC1tdXRlZCk7bWFyZ2luLXJpZ2h0OjRweDsiPlNvcnRpZXJ1bmc6PC9zcGFuPicg +KwogICAgICAgICAgICAnPGJ1dHRvbiBzdHlsZT0iJyArIGJ0blN0eWxlKCd0b3RhbCcsIHNvcnQp +ICsgJyIgb25jbGljaz0iRHJpdmVHb3Zlcm5hbmNlLnNob3dFbmdhZ2VtZW50U3RhdHMoXCd0b3Rh +bFwnKSI+R2VzYW10PC9idXR0b24+JyArCiAgICAgICAgICAgICc8YnV0dG9uIHN0eWxlPSInICsg +YnRuU3R5bGUoJ2NyZWF0ZWQnLCBzb3J0KSArICciIG9uY2xpY2s9IkRyaXZlR292ZXJuYW5jZS5z +aG93RW5nYWdlbWVudFN0YXRzKFwnY3JlYXRlZFwnKSI+RXJzdGVsbHQ8L2J1dHRvbj4nICsKICAg +ICAgICAgICAgJzxidXR0b24gc3R5bGU9IicgKyBidG5TdHlsZSgnZWRpdGVkJywgc29ydCkgKyAn +IiBvbmNsaWNrPSJEcml2ZUdvdmVybmFuY2Uuc2hvd0VuZ2FnZW1lbnRTdGF0cyhcJ2VkaXRlZFwn +KSI+QmVhcmJlaXRldDwvYnV0dG9uPicgKwogICAgICAgICAgICAnPGJ1dHRvbiBzdHlsZT0iJyAr +IGJ0blN0eWxlKCdyZXZpZXdzJywgc29ydCkgKyAnIiBvbmNsaWNrPSJEcml2ZUdvdmVybmFuY2Uu +c2hvd0VuZ2FnZW1lbnRTdGF0cyhcJ3Jldmlld3NcJykiPlJldmlld3M8L2J1dHRvbj4nICsKICAg +ICAgICAnPC9kaXY+JzsKCiAgICAgICAgLy8gVXNlci1UYWJlbGxlCiAgICAgICAgaWYgKHNvcnRl +ZFVzZXJzLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgaHRtbCArPSAnPHRhYmxlIGNsYXNzPSJk +cml2ZS10YWJsZSIgc3R5bGU9Im1hcmdpbi1ib3R0b206MTZweDsiPjx0aGVhZD48dHI+JyArCiAg +ICAgICAgICAgICAgICAnPHRoPkJlbnV0emVyPC90aD48dGggc3R5bGU9InRleHQtYWxpZ246Y2Vu +dGVyOyI+RXJzdGVsbHQ8L3RoPjx0aCBzdHlsZT0idGV4dC1hbGlnbjpjZW50ZXI7Ij5CZWFyYmVp +dGV0PC90aD48dGggc3R5bGU9InRleHQtYWxpZ246Y2VudGVyOyI+UmV2aWV3czwvdGg+PHRoIHN0 +eWxlPSJ0ZXh0LWFsaWduOmNlbnRlcjsiPkdlc2FtdDwvdGg+PHRoPkFrdGl2c3RlIEJlcmVpY2hl +PC90aD4nICsKICAgICAgICAgICAgJzwvdHI+PC90aGVhZD48dGJvZHk+JzsKICAgICAgICAgICAg +c29ydGVkVXNlcnMuZm9yRWFjaChmdW5jdGlvbih1KSB7CiAgICAgICAgICAgICAgICB2YXIgZCA9 +IHVbMV07CiAgICAgICAgICAgICAgICB2YXIgdmFscyA9IChjYXRGaWx0ZXIgIT09ICdhbGwnICYm +IGQua2F0ZWdvcmllbltjYXRGaWx0ZXJdKSA/IGQua2F0ZWdvcmllbltjYXRGaWx0ZXJdIDogZDsK +ICAgICAgICAgICAgICAgIHZhciB0b3RhbCA9IHZhbHMuY3JlYXRlZCArIHZhbHMuZWRpdGVkICsg +dmFscy5yZXZpZXdzOwogICAgICAgICAgICAgICAgLy8gVG9wLUthdGVnb3JpZW4gZsO8ciBkaWVz +ZW4gVXNlcgogICAgICAgICAgICAgICAgdmFyIHRvcENhdHMgPSBPYmplY3QuZW50cmllcyhkLmth +dGVnb3JpZW4pLnNvcnQoZnVuY3Rpb24oYSxiKXsKICAgICAgICAgICAgICAgICAgICByZXR1cm4g +KGJbMV0uY3JlYXRlZCtiWzFdLmVkaXRlZCtiWzFdLnJldmlld3MpIC0gKGFbMV0uY3JlYXRlZCth +WzFdLmVkaXRlZCthWzFdLnJldmlld3MpOwogICAgICAgICAgICAgICAgfSkuc2xpY2UoMCwgMyk7 +CiAgICAgICAgICAgICAgICB2YXIgY2F0VGFncyA9IHRvcENhdHMubWFwKGZ1bmN0aW9uKGMpIHsK +ICAgICAgICAgICAgICAgICAgICB2YXIgY3QgPSBjWzFdLmNyZWF0ZWQgKyBjWzFdLmVkaXRlZCAr +IGNbMV0ucmV2aWV3czsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJzxzcGFuIGNsYXNzPSJr +ZXl3b3JkLXRhZyI+JyArIERyaXZlUG9ydGFsLmVzY2FwZUhUTUwoY1swXSkgKyAnICgnICsgY3Qg +KyAnKTwvc3Bhbj4nOwogICAgICAgICAgICAgICAgfSkuam9pbignICcpOwoKICAgICAgICAgICAg +ICAgIGh0bWwgKz0gJzx0cj4nICsKICAgICAgICAgICAgICAgICAgICAnPHRkPjxzdHJvbmc+JyAr +IERyaXZlUG9ydGFsLmVzY2FwZUhUTUwodVswXSkgKyAnPC9zdHJvbmc+PC90ZD4nICsKICAgICAg +ICAgICAgICAgICAgICAnPHRkIHN0eWxlPSJ0ZXh0LWFsaWduOmNlbnRlcjsiPicgKyB2YWxzLmNy +ZWF0ZWQgKyAnPC90ZD4nICsKICAgICAgICAgICAgICAgICAgICAnPHRkIHN0eWxlPSJ0ZXh0LWFs +aWduOmNlbnRlcjsiPicgKyB2YWxzLmVkaXRlZCArICc8L3RkPicgKwogICAgICAgICAgICAgICAg +ICAgICc8dGQgc3R5bGU9InRleHQtYWxpZ246Y2VudGVyOyI+JyArIHZhbHMucmV2aWV3cyArICc8 +L3RkPicgKwogICAgICAgICAgICAgICAgICAgICc8dGQgc3R5bGU9InRleHQtYWxpZ246Y2VudGVy +O2ZvbnQtd2VpZ2h0OjYwMDsiPicgKyB0b3RhbCArICc8L3RkPicgKwogICAgICAgICAgICAgICAg +ICAgICc8dGQ+JyArIGNhdFRhZ3MgKyAnPC90ZD4nICsKICAgICAgICAgICAgICAgICc8L3RyPic7 +CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBodG1sICs9ICc8L3Rib2R5PjwvdGFibGU+JzsK +ICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBodG1sICs9ICc8ZGl2IHN0eWxlPSJwYWRkaW5n +OjIwcHg7dGV4dC1hbGlnbjpjZW50ZXI7Y29sb3I6dmFyKC0tdGV4dC1tdXRlZCk7Ij5LZWluZSBE +YXRlbiBmw7xyIGRpZXNlIEF1c3dhaGwuPC9kaXY+JzsKICAgICAgICB9CgogICAgICAgIC8vIEJh +bGtlbmRpYWdyYW1tIChrb21wYWt0KQogICAgICAgIGlmIChzb3J0ZWRVc2Vycy5sZW5ndGggPiAw +KSB7CiAgICAgICAgICAgIHZhciBtYXhVc2VyID0gZ2V0VmFsKHNvcnRlZFVzZXJzWzBdKSB8fCAx +OwogICAgICAgICAgICBzb3J0ZWRVc2Vycy5mb3JFYWNoKGZ1bmN0aW9uKHUpIHsKICAgICAgICAg +ICAgICAgIHZhciBkID0gdVsxXTsKICAgICAgICAgICAgICAgIHZhciB2YWxzID0gKGNhdEZpbHRl +ciAhPT0gJ2FsbCcgJiYgZC5rYXRlZ29yaWVuW2NhdEZpbHRlcl0pID8gZC5rYXRlZ29yaWVuW2Nh +dEZpbHRlcl0gOiBkOwogICAgICAgICAgICAgICAgdmFyIHRvdGFsID0gdmFscy5jcmVhdGVkICsg +dmFscy5lZGl0ZWQgKyB2YWxzLnJldmlld3M7CiAgICAgICAgICAgICAgICBpZiAodG90YWwgPT09 +IDApIHJldHVybjsKICAgICAgICAgICAgICAgIGh0bWwgKz0gJzxkaXYgY2xhc3M9InN0YXQtYmFy +LXJvdyI+PHNwYW4gY2xhc3M9InN0YXQtYmFyLWxhYmVsIj4nICsgRHJpdmVQb3J0YWwuZXNjYXBl +SFRNTCh1WzBdKSArICc8L3NwYW4+JyArCiAgICAgICAgICAgICAgICAgICAgJzxkaXYgY2xhc3M9 +InN0YXQtYmFyIj48ZGl2IGNsYXNzPSJzdGF0LWJhci1maWxsIiBzdHlsZT0id2lkdGg6JyArICh0 +b3RhbC9tYXhVc2VyKjEwMCkgKyAnJTtiYWNrZ3JvdW5kOmxpbmVhci1ncmFkaWVudCg5MGRlZywj +MmQ5ZDc4ICcgKyAodmFscy5jcmVhdGVkL3RvdGFsKjEwMCkgKyAnJSwjM2I4MmY2ICcgKyAodmFs +cy5jcmVhdGVkL3RvdGFsKjEwMCkgKyAnJSAnICsgKCh2YWxzLmNyZWF0ZWQrdmFscy5lZGl0ZWQp +L3RvdGFsKjEwMCkgKyAnJSwjZTY3ZTIyICcgKyAoKHZhbHMuY3JlYXRlZCt2YWxzLmVkaXRlZCkv +dG90YWwqMTAwKSArICclIDEwMCUpOyI+PC9kaXY+PC9kaXY+JyArCiAgICAgICAgICAgICAgICAg +ICAgJzxzcGFuIGNsYXNzPSJzdGF0LWJhci12YWwiPicgKyB0b3RhbCArICc8L3NwYW4+PC9kaXY+ +JzsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGh0bWwgKz0gJzxkaXYgc3R5bGU9ImZvbnQt +c2l6ZToxMXB4O2NvbG9yOnZhcigtLXRleHQtbXV0ZWQpO21hcmdpbi10b3A6NHB4OyI+TGVnZW5k +ZTogPHNwYW4gc3R5bGU9ImNvbG9yOiMyZDlkNzg7Ij7ilqA8L3NwYW4+IEVyc3RlbGx0IC8gPHNw +YW4gc3R5bGU9ImNvbG9yOiMzYjgyZjY7Ij7ilqA8L3NwYW4+IEJlYXJiZWl0ZXQgLyA8c3BhbiBz +dHlsZT0iY29sb3I6I2U2N2UyMjsiPuKWoDwvc3Bhbj4gUmV2aWV3czwvZGl2Pic7CiAgICAgICAg +fQoKICAgICAgICAvLyAtLS0gS2F0ZWdvcmllLVZlcnRlaWx1bmcgKyBUb3AgU2NobGFnd8O2cnRl +ciBuZWJlbmVpbmFuZGVyIC0tLQogICAgICAgIGh0bWwgKz0gJzxkaXYgc3R5bGU9ImRpc3BsYXk6 +Z3JpZDtncmlkLXRlbXBsYXRlLWNvbHVtbnM6MWZyIDFmcjtnYXA6MjBweDttYXJnaW4tdG9wOjE2 +cHg7Ij4nOwoKICAgICAgICAvLyBLYXRlZ29yaWVuCiAgICAgICAgaHRtbCArPSAnPGRpdj48aDMg +c3R5bGU9ImNvbG9yOnZhcigtLXRleHQtaGVhZGluZyk7bWFyZ2luLWJvdHRvbTo4cHg7Ij5Eb2t1 +bWVudGUgcHJvIEthdGVnb3JpZTwvaDM+JzsKICAgICAgICB2YXIgYWxsQ2F0RW50cmllcyA9IGth +dGVnb3JpZW4ubWFwKGZ1bmN0aW9uKGspIHsgcmV0dXJuIFtrLCBjYXRTdGF0c1trXSB8fCAwXTsg +fSk7CiAgICAgICAgYWxsQ2F0RW50cmllcy5zb3J0KGZ1bmN0aW9uKGEsYikgeyByZXR1cm4gYlsx +XSAtIGFbMV0gfHwgYVswXS5sb2NhbGVDb21wYXJlKGJbMF0sICdkZScpOyB9KTsKICAgICAgICBh +bGxDYXRFbnRyaWVzLmZvckVhY2goZnVuY3Rpb24oYykgewogICAgICAgICAgICBodG1sICs9ICc8 +ZGl2IGNsYXNzPSJzdGF0LWJhci1yb3ciPjxzcGFuIGNsYXNzPSJzdGF0LWJhci1sYWJlbCI+JyAr +IERyaXZlUG9ydGFsLmVzY2FwZUhUTUwoY1swXSkgKyAnPC9zcGFuPicgKwogICAgICAgICAgICAg +ICAgJzxkaXYgY2xhc3M9InN0YXQtYmFyIj48ZGl2IGNsYXNzPSJzdGF0LWJhci1maWxsIiBzdHls +ZT0id2lkdGg6JyArIChjWzFdL21heENhdCoxMDApICsgJyU7YmFja2dyb3VuZDojM2I4MmY2OyI+ +PC9kaXY+PC9kaXY+JyArCiAgICAgICAgICAgICAgICAnPHNwYW4gY2xhc3M9InN0YXQtYmFyLXZh +bCI+JyArIGNbMV0gKyAnPC9zcGFuPjwvZGl2Pic7CiAgICAgICAgfSk7CiAgICAgICAgaHRtbCAr +PSAnPC9kaXY+JzsKCiAgICAgICAgLy8gVG9wIFNjaGxhZ3fDtnJ0ZXIKICAgICAgICBodG1sICs9 +ICc8ZGl2PjxoMyBzdHlsZT0iY29sb3I6dmFyKC0tdGV4dC1oZWFkaW5nKTttYXJnaW4tYm90dG9t +OjhweDsiPlRvcCAxMCBTY2hsYWd3w7ZydGVyPC9oMz4nOwogICAgICAgIGlmICh0b3BLd3MubGVu +Z3RoID4gMCkgewogICAgICAgICAgICB0b3BLd3MuZm9yRWFjaChmdW5jdGlvbihrKSB7CiAgICAg +ICAgICAgICAgICBodG1sICs9ICc8ZGl2IGNsYXNzPSJzdGF0LWJhci1yb3ciPjxzcGFuIGNsYXNz +PSJzdGF0LWJhci1sYWJlbCI+JyArIERyaXZlUG9ydGFsLmVzY2FwZUhUTUwoa1swXSkgKyAnPC9z +cGFuPicgKwogICAgICAgICAgICAgICAgICAgICc8ZGl2IGNsYXNzPSJzdGF0LWJhciI+PGRpdiBj +bGFzcz0ic3RhdC1iYXItZmlsbCIgc3R5bGU9IndpZHRoOicgKyAoa1sxXS9tYXhLdyoxMDApICsg +JyU7YmFja2dyb3VuZDojMmQ5ZDc4OyI+PC9kaXY+PC9kaXY+JyArCiAgICAgICAgICAgICAgICAg +ICAgJzxzcGFuIGNsYXNzPSJzdGF0LWJhci12YWwiPicgKyBrWzFdICsgJzwvc3Bhbj48L2Rpdj4n +OwogICAgICAgICAgICB9KTsKICAgICAgICB9IGVsc2UgeyBodG1sICs9ICc8ZGl2IHN0eWxlPSJj +b2xvcjp2YXIoLS10ZXh0LW11dGVkKTtmb250LXNpemU6MTNweDsiPktlaW5lIFNjaGxhZ3fDtnJ0 +ZXIgdm9yaGFuZGVuLjwvZGl2Pic7IH0KICAgICAgICBodG1sICs9ICc8L2Rpdj48L2Rpdj4nOwoK +ICAgICAgICAvLyBNb25hdGxpY2hlIEVyc3RlbGx1bmcKICAgICAgICBpZiAobW9udGhzLmxlbmd0 +aCA+IDApIHsKICAgICAgICAgICAgaHRtbCArPSAnPGgzIHN0eWxlPSJjb2xvcjp2YXIoLS10ZXh0 +LWhlYWRpbmcpO21hcmdpbjoxNnB4IDAgOHB4OyI+RXJzdGVsbHVuZyBwcm8gTW9uYXQ8L2gzPic7 +CiAgICAgICAgICAgIG1vbnRocy5mb3JFYWNoKGZ1bmN0aW9uKG0pIHsKICAgICAgICAgICAgICAg +IGh0bWwgKz0gJzxkaXYgY2xhc3M9InN0YXQtYmFyLXJvdyI+PHNwYW4gY2xhc3M9InN0YXQtYmFy +LWxhYmVsIj4nICsgbVswXSArICc8L3NwYW4+JyArCiAgICAgICAgICAgICAgICAgICAgJzxkaXYg +Y2xhc3M9InN0YXQtYmFyIj48ZGl2IGNsYXNzPSJzdGF0LWJhci1maWxsIiBzdHlsZT0id2lkdGg6 +JyArIChtWzFdL21heE1vbnRoKjEwMCkgKyAnJTtiYWNrZ3JvdW5kOiMzYTdhYTM7Ij48L2Rpdj48 +L2Rpdj4nICsKICAgICAgICAgICAgICAgICAgICAnPHNwYW4gY2xhc3M9InN0YXQtYmFyLXZhbCI+ +JyArIG1bMV0gKyAnPC9zcGFuPjwvZGl2Pic7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KCiAg +ICAgICAgaHRtbCArPSAnPC9kaXY+JzsKICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgn +ZG9jdW1lbnREZXRhaWwnKS5pbm5lckhUTUwgPSBodG1sOwogICAgfSwKCiAgICAvLyA9PT0gU2No +bGFnd29ydC1WZXJ3YWx0dW5nID09PQogICAgX2t3TWFuYWdlQ3VycmVudDogbnVsbCwKCiAgICBv +cGVuS3dNYW5hZ2Uoa2V5d29yZCkgewogICAgICAgIHRoaXMuX2t3TWFuYWdlQ3VycmVudCA9IGtl +eXdvcmQ7CiAgICAgICAgdmFyIGFmZmVjdGVkRG9jcyA9IERyaXZlRlMuZG9jdW1lbnRzLmZpbHRl +cihmdW5jdGlvbihkKSB7CiAgICAgICAgICAgIHJldHVybiBkLnNjaGxhZ3dvZXJ0ZXIgJiYgZC5z +Y2hsYWd3b2VydGVyLmluY2x1ZGVzKGtleXdvcmQpOwogICAgICAgIH0pOwoKICAgICAgICB2YXIg +Ym9keSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdrd01hbmFnZUJvZHknKTsKICAgICAgICB2 +YXIgZm9vdGVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2t3TWFuYWdlRm9vdGVyJyk7CiAg +ICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2t3TWFuYWdlVGl0bGUnKS50ZXh0Q29udGVu +dCA9ICdTY2hsYWd3b3J0OiAnICsga2V5d29yZDsKCiAgICAgICAgdmFyIGh0bWwgPSAnJzsKICAg +ICAgICAvLyBCZWFyYmVpdHVuZ3NmZWxkCiAgICAgICAgaHRtbCArPSAnPGRpdiBzdHlsZT0ibWFy +Z2luLWJvdHRvbToxNHB4OyI+JyArCiAgICAgICAgICAgICc8bGFiZWwgc3R5bGU9ImZvbnQtc2l6 +ZToxMnB4O2ZvbnQtd2VpZ2h0OjYwMDtjb2xvcjp2YXIoLS10ZXh0LXNlY29uZGFyeSk7ZGlzcGxh +eTpibG9jazttYXJnaW4tYm90dG9tOjRweDsiPlNjaGxhZ3dvcnQgdW1iZW5lbm5lbjwvbGFiZWw+ +JyArCiAgICAgICAgICAgICc8aW5wdXQgdHlwZT0idGV4dCIgaWQ9Imt3TWFuYWdlTmV3TmFtZSIg +dmFsdWU9IicgKyBEcml2ZVBvcnRhbC5lc2NhcGVBdHRyKGtleXdvcmQpICsgJyIgJyArCiAgICAg +ICAgICAgICdzdHlsZT0id2lkdGg6MTAwJTtwYWRkaW5nOjhweCAxMHB4O2JvcmRlcjoxcHggc29s +aWQgdmFyKC0tYm9yZGVyLWNvbG9yKTtib3JkZXItcmFkaXVzOjRweDtmb250LXNpemU6MTRweDti +YWNrZ3JvdW5kOnZhcigtLWJnLWlucHV0KTtjb2xvcjp2YXIoLS10ZXh0LXByaW1hcnkpOyI+JyAr +CiAgICAgICAgJzwvZGl2Pic7CgogICAgICAgIC8vIEJldHJvZmZlbmUgQXJ0aWtlbAogICAgICAg +IGlmIChhZmZlY3RlZERvY3MubGVuZ3RoID4gMCkgewogICAgICAgICAgICBodG1sICs9ICc8ZGl2 +IHN0eWxlPSJmb250LXNpemU6MTJweDtmb250LXdlaWdodDo2MDA7Y29sb3I6dmFyKC0tdGV4dC1z +ZWNvbmRhcnkpO21hcmdpbi1ib3R0b206NnB4OyI+VmVyd2VuZGV0IGluICcgKyBhZmZlY3RlZERv +Y3MubGVuZ3RoICsgJyBBcnRpa2VsJyArIChhZmZlY3RlZERvY3MubGVuZ3RoID4gMSA/ICduJyA6 +ICcnKSArICc6PC9kaXY+JzsKICAgICAgICAgICAgaHRtbCArPSAnPGRpdiBjbGFzcz0ia3ctZG9j +LWxpc3QiPic7CiAgICAgICAgICAgIGFmZmVjdGVkRG9jcy5mb3JFYWNoKGZ1bmN0aW9uKGRvYykg +ewogICAgICAgICAgICAgICAgaHRtbCArPSAnPGRpdiBjbGFzcz0ia3ctZG9jLWl0ZW0iPicgKwog +ICAgICAgICAgICAgICAgICAgICc8ZGl2PjxzcGFuIGNsYXNzPSJrdy1kb2MtdGl0bGUiPicgKyBE +cml2ZVBvcnRhbC5lc2NhcGVIVE1MKGRvYy50aXRlbCkgKyAnPC9zcGFuPicgKwogICAgICAgICAg +ICAgICAgICAgICc8ZGl2IGNsYXNzPSJrdy1kb2Mta2F0Ij4nICsgRHJpdmVQb3J0YWwuZXNjYXBl +SFRNTChkb2Mua2F0ZWdvcmllKSArCiAgICAgICAgICAgICAgICAgICAgKGRvYy5lcnN0ZWxsdFZv +biA/ICcgwrcgdm9uICcgKyBEcml2ZVBvcnRhbC5lc2NhcGVIVE1MKGRvYy5lcnN0ZWxsdFZvbikg +OiAnJykgKwogICAgICAgICAgICAgICAgICAgICc8L2Rpdj48L2Rpdj4nICsKICAgICAgICAgICAg +ICAgICc8L2Rpdj4nOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgaHRtbCArPSAnPC9kaXY+ +JzsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBodG1sICs9ICc8ZGl2IHN0eWxlPSJmb250 +LXNpemU6MTNweDtjb2xvcjp2YXIoLS10ZXh0LW11dGVkKTtwYWRkaW5nOjEwcHggMDsiPldpcmQg +aW4ga2VpbmVtIEFydGlrZWwgdmVyd2VuZGV0LjwvZGl2Pic7CiAgICAgICAgfQoKICAgICAgICAv +LyBFcnNldHplbi1PcHRpb24KICAgICAgICB2YXIgb3RoZXJLdyA9IERyaXZlRWRpdG9yLl9nZXRB +bGxLbm93bktleXdvcmRzKCkuZmlsdGVyKGZ1bmN0aW9uKGspIHsgcmV0dXJuIGsgIT09IGtleXdv +cmQ7IH0pOwogICAgICAgIGh0bWwgKz0gJzxkaXYgc3R5bGU9Im1hcmdpbi10b3A6MTRweDtib3Jk +ZXItdG9wOjFweCBzb2xpZCB2YXIoLS1ib3JkZXItbGlnaHQpO3BhZGRpbmctdG9wOjEycHg7Ij4n +ICsKICAgICAgICAgICAgJzxsYWJlbCBzdHlsZT0iZm9udC1zaXplOjEycHg7Zm9udC13ZWlnaHQ6 +NjAwO2NvbG9yOnZhcigtLXRleHQtc2Vjb25kYXJ5KTtkaXNwbGF5OmJsb2NrO21hcmdpbi1ib3R0 +b206NnB4OyI+RXJzZXR6ZW4gZHVyY2g8L2xhYmVsPicgKwogICAgICAgICAgICAnPGlucHV0IHR5 +cGU9ImhpZGRlbiIgaWQ9Imt3TWFuYWdlUmVwbGFjZSIgdmFsdWU9IiI+JyArCiAgICAgICAgICAg +ICc8ZGl2IHN0eWxlPSJmb250LXNpemU6MTJweDtjb2xvcjp2YXIoLS10ZXh0LW11dGVkKTttYXJn +aW4tYm90dG9tOjZweDsiPlfDpGhsZSBlaW4gU2NobGFnd29ydCwgZHVyY2ggZGFzIGRpZXNlcyBi +ZWltIEzDtnNjaGVuIG9kZXIgVW1iZW5lbm5lbiBlcnNldHp0IHdlcmRlbiBzb2xsOjwvZGl2Picg +KwogICAgICAgICAgICAnPGRpdiBpZD0ia3dSZXBsYWNlU2VsZWN0ZWQiIHN0eWxlPSJtYXJnaW4t +Ym90dG9tOjhweDtkaXNwbGF5Om5vbmU7cGFkZGluZzo2cHggMTBweDtib3JkZXItcmFkaXVzOjRw +eDtiYWNrZ3JvdW5kOnZhcigtLWJnLWFjdGl2ZSk7Ym9yZGVyOjFweCBzb2xpZCB2YXIoLS10ZXh0 +LWhlYWRpbmcpO2ZvbnQtc2l6ZToxM3B4O2NvbG9yOnZhcigtLXRleHQtaGVhZGluZyk7ZGlzcGxh +eTpub25lOyI+JyArCiAgICAgICAgICAgICAgICAnPHNwYW4gaWQ9Imt3UmVwbGFjZUxhYmVsIj48 +L3NwYW4+IDxzcGFuIHN0eWxlPSJjdXJzb3I6cG9pbnRlcjttYXJnaW4tbGVmdDo2cHg7Y29sb3I6 +dmFyKC0tdGV4dC1tdXRlZCk7IiBvbmNsaWNrPSJEcml2ZUdvdmVybmFuY2UuX2NsZWFyS3dSZXBs +YWNlKCkiPuKclTwvc3Bhbj4nICsKICAgICAgICAgICAgJzwvZGl2PicgKwogICAgICAgICAgICAn +PGRpdiBjbGFzcz0iZ292LWt3LWxpc3QiIHN0eWxlPSJtYXgtaGVpZ2h0OjEyMHB4OyIgaWQ9Imt3 +UmVwbGFjZU9wdGlvbnMiPic7CiAgICAgICAgb3RoZXJLdy5mb3JFYWNoKGZ1bmN0aW9uKGt3KSB7 +CiAgICAgICAgICAgIGh0bWwgKz0gJzxzcGFuIGNsYXNzPSJnb3Yta3ctcGlsbCIgb25jbGljaz0i +RHJpdmVHb3Zlcm5hbmNlLl9zZWxlY3RLd1JlcGxhY2UoXCcnICsgRHJpdmVQb3J0YWwuZXNjYXBl +QXR0cihrdykgKyAnXCcpIj4nICsKICAgICAgICAgICAgICAgIERyaXZlUG9ydGFsLmVzY2FwZUhU +TUwoa3cpICsgJzwvc3Bhbj4nOwogICAgICAgIH0pOwogICAgICAgIGlmIChvdGhlckt3Lmxlbmd0 +aCA9PT0gMCkgewogICAgICAgICAgICBodG1sICs9ICc8c3BhbiBzdHlsZT0iZm9udC1zaXplOjEy +cHg7Y29sb3I6dmFyKC0tdGV4dC1tdXRlZCk7Ij5LZWluZSBhbmRlcmVuIFNjaGxhZ3fDtnJ0ZXIg +dm9yaGFuZGVuPC9zcGFuPic7CiAgICAgICAgfQogICAgICAgIGh0bWwgKz0gJzwvZGl2PjwvZGl2 +Pic7CgogICAgICAgIGJvZHkuaW5uZXJIVE1MID0gaHRtbDsKCiAgICAgICAgZm9vdGVyLmlubmVy +SFRNTCA9CiAgICAgICAgICAgICc8YnV0dG9uIG9uY2xpY2s9IkRyaXZlR292ZXJuYW5jZS5jbG9z +ZUt3TWFuYWdlKCkiPlNjaGxpZcOfZW48L2J1dHRvbj4nICsKICAgICAgICAgICAgJzxidXR0b24g +Y2xhc3M9ImRhbmdlciIgb25jbGljaz0iRHJpdmVHb3Zlcm5hbmNlLmRlbGV0ZUtleXdvcmQoKSI+ +TMO2c2NoZW48L2J1dHRvbj4nICsKICAgICAgICAgICAgJzxidXR0b24gY2xhc3M9InByaW1hcnki +IG9uY2xpY2s9IkRyaXZlR292ZXJuYW5jZS5yZW5hbWVLZXl3b3JkKCkiPlVtYmVuZW5uZW48L2J1 +dHRvbj4nOwoKICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgna3dNYW5hZ2VNb2RhbCcp +LmNsYXNzTGlzdC5hZGQoJ29wZW4nKTsKICAgIH0sCgogICAgY2xvc2VLd01hbmFnZSgpIHsKICAg +ICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgna3dNYW5hZ2VNb2RhbCcpLmNsYXNzTGlzdC5y +ZW1vdmUoJ29wZW4nKTsKICAgICAgICB0aGlzLl9rd01hbmFnZUN1cnJlbnQgPSBudWxsOwogICAg +fSwKCiAgICBfc2VsZWN0S3dSZXBsYWNlKGt3KSB7CiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVu +dEJ5SWQoJ2t3TWFuYWdlUmVwbGFjZScpLnZhbHVlID0ga3c7CiAgICAgICAgdmFyIHNlbCA9IGRv +Y3VtZW50LmdldEVsZW1lbnRCeUlkKCdrd1JlcGxhY2VTZWxlY3RlZCcpOwogICAgICAgIHNlbC5z +dHlsZS5kaXNwbGF5ID0gJ2ZsZXgnOwogICAgICAgIHNlbC5zdHlsZS5hbGlnbkl0ZW1zID0gJ2Nl +bnRlcic7CiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2t3UmVwbGFjZUxhYmVsJyku +dGV4dENvbnRlbnQgPSBrdzsKICAgICAgICAvLyBBdXNnZXfDpGhsdGUgUGlsbCBoZXJ2b3JoZWJl +bgogICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJyNrd1JlcGxhY2VPcHRpb25zIC5n +b3Yta3ctcGlsbCcpLmZvckVhY2goZnVuY3Rpb24oZWwpIHsKICAgICAgICAgICAgZWwuc3R5bGUu +b3V0bGluZSA9IGVsLnRleHRDb250ZW50LnRyaW0oKSA9PT0ga3cgPyAnMnB4IHNvbGlkIHZhcigt +LXRleHQtaGVhZGluZyknIDogJyc7CiAgICAgICAgfSk7CiAgICB9LAoKICAgIF9jbGVhckt3UmVw +bGFjZSgpIHsKICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgna3dNYW5hZ2VSZXBsYWNl +JykudmFsdWUgPSAnJzsKICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgna3dSZXBsYWNl +U2VsZWN0ZWQnKS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOwogICAgICAgIGRvY3VtZW50LnF1ZXJ5 +U2VsZWN0b3JBbGwoJyNrd1JlcGxhY2VPcHRpb25zIC5nb3Yta3ctcGlsbCcpLmZvckVhY2goZnVu +Y3Rpb24oZWwpIHsKICAgICAgICAgICAgZWwuc3R5bGUub3V0bGluZSA9ICcnOwogICAgICAgIH0p +OwogICAgfSwKCiAgICBhc3luYyByZW5hbWVLZXl3b3JkKCkgewogICAgICAgIHZhciBvbGROYW1l +ID0gdGhpcy5fa3dNYW5hZ2VDdXJyZW50OwogICAgICAgIHZhciBuZXdOYW1lID0gZG9jdW1lbnQu +Z2V0RWxlbWVudEJ5SWQoJ2t3TWFuYWdlTmV3TmFtZScpLnZhbHVlLnRyaW0oKTsKICAgICAgICBp +ZiAoIW5ld05hbWUgfHwgbmV3TmFtZSA9PT0gb2xkTmFtZSkgewogICAgICAgICAgICBzaG93VG9h +c3QoJ0JpdHRlIGVpbmVuIG5ldWVuIE5hbWVuIGVpbmdlYmVuJywgJ3dhcm5pbmcnKTsKICAgICAg +ICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgdmFyIGFmZmVjdGVkID0gRHJpdmVGUy5k +b2N1bWVudHMuZmlsdGVyKGZ1bmN0aW9uKGQpIHsKICAgICAgICAgICAgcmV0dXJuIGQuc2NobGFn +d29lcnRlciAmJiBkLnNjaGxhZ3dvZXJ0ZXIuaW5jbHVkZXMob2xkTmFtZSk7CiAgICAgICAgfSk7 +CgogICAgICAgIHZhciBjb3VudCA9IDA7CiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhZmZl +Y3RlZC5sZW5ndGg7IGkrKykgewogICAgICAgICAgICB2YXIgZG9jID0gYWZmZWN0ZWRbaV07CiAg +ICAgICAgICAgIHZhciBpZHggPSBkb2Muc2NobGFnd29lcnRlci5pbmRleE9mKG9sZE5hbWUpOwog +ICAgICAgICAgICBpZiAoaWR4ID49IDApIHsKICAgICAgICAgICAgICAgIGRvYy5zY2hsYWd3b2Vy +dGVyW2lkeF0gPSBuZXdOYW1lOwogICAgICAgICAgICAgICAgLy8gRHVwbGlrYXRlIGVudGZlcm5l +bgogICAgICAgICAgICAgICAgZG9jLnNjaGxhZ3dvZXJ0ZXIgPSBbLi4ubmV3IFNldChkb2Muc2No +bGFnd29lcnRlcildOwogICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGF3YWl0IERyaXZlRlMu +c2F2ZURvY3VtZW50KGRvYyk7CiAgICAgICAgICAgICAgICBpZiAocmVzdWx0ID09PSB0cnVlKSBj +b3VudCsrOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvLyBBdWNoIGluIFBSRURF +RklORURfS0VZV09SRFMgZXJzZXR6ZW4KICAgICAgICB2YXIgcHJlZElkeCA9IERyaXZlRWRpdG9y +LlBSRURFRklORURfS0VZV09SRFMuaW5kZXhPZihvbGROYW1lKTsKICAgICAgICBpZiAocHJlZElk +eCA+PSAwKSBEcml2ZUVkaXRvci5QUkVERUZJTkVEX0tFWVdPUkRTW3ByZWRJZHhdID0gbmV3TmFt +ZTsKCiAgICAgICAgc2hvd1RvYXN0KCdTY2hsYWd3b3J0IHVtYmVuYW5udDogIicgKyBvbGROYW1l +ICsgJyIg4oaSICInICsgbmV3TmFtZSArICciICgnICsgY291bnQgKyAnIEFydGlrZWwpJywgJ3N1 +Y2Nlc3MnKTsKICAgICAgICB0aGlzLmNsb3NlS3dNYW5hZ2UoKTsKICAgICAgICB0aGlzLnJlbmRl +ckFkbWluKCk7CiAgICAgICAgRHJpdmVQb3J0YWwucmVuZGVyKCk7CiAgICB9LAoKICAgIGFzeW5j +IGRlbGV0ZUtleXdvcmQoKSB7CiAgICAgICAgdmFyIGtleXdvcmQgPSB0aGlzLl9rd01hbmFnZUN1 +cnJlbnQ7CiAgICAgICAgdmFyIHJlcGxhY2VtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQo +J2t3TWFuYWdlUmVwbGFjZScpLnZhbHVlLnRyaW0oKTsKCiAgICAgICAgdmFyIGFmZmVjdGVkID0g +RHJpdmVGUy5kb2N1bWVudHMuZmlsdGVyKGZ1bmN0aW9uKGQpIHsKICAgICAgICAgICAgcmV0dXJu +IGQuc2NobGFnd29lcnRlciAmJiBkLnNjaGxhZ3dvZXJ0ZXIuaW5jbHVkZXMoa2V5d29yZCk7CiAg +ICAgICAgfSk7CgogICAgICAgIGlmIChhZmZlY3RlZC5sZW5ndGggPiAwICYmICFjb25maXJtKCdT +Y2hsYWd3b3J0ICInICsga2V5d29yZCArICciIGF1cyAnICsgYWZmZWN0ZWQubGVuZ3RoICsgJyBB +cnRpa2VsJyArIChhZmZlY3RlZC5sZW5ndGggPiAxID8gJ24nIDogJycpICsgJyBlbnRmZXJuZW4/ +JyArIChyZXBsYWNlbWVudCA/ICdcbkVyc2V0enQgZHVyY2g6ICInICsgcmVwbGFjZW1lbnQgKyAn +IicgOiAnJykpKSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIHZhciBj +b3VudCA9IDA7CiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhZmZlY3RlZC5sZW5ndGg7IGkr +KykgewogICAgICAgICAgICB2YXIgZG9jID0gYWZmZWN0ZWRbaV07CiAgICAgICAgICAgIGRvYy5z +Y2hsYWd3b2VydGVyID0gZG9jLnNjaGxhZ3dvZXJ0ZXIuZmlsdGVyKGZ1bmN0aW9uKGspIHsgcmV0 +dXJuIGsgIT09IGtleXdvcmQ7IH0pOwogICAgICAgICAgICBpZiAocmVwbGFjZW1lbnQgJiYgIWRv +Yy5zY2hsYWd3b2VydGVyLmluY2x1ZGVzKHJlcGxhY2VtZW50KSkgewogICAgICAgICAgICAgICAg +ZG9jLnNjaGxhZ3dvZXJ0ZXIucHVzaChyZXBsYWNlbWVudCk7CiAgICAgICAgICAgIH0KICAgICAg +ICAgICAgdmFyIHJlc3VsdCA9IGF3YWl0IERyaXZlRlMuc2F2ZURvY3VtZW50KGRvYyk7CiAgICAg +ICAgICAgIGlmIChyZXN1bHQgPT09IHRydWUpIGNvdW50Kys7CiAgICAgICAgfQoKICAgICAgICAv +LyBBdXMgUFJFREVGSU5FRF9LRVlXT1JEUyBlbnRmZXJuZW4KICAgICAgICB2YXIgcHJlZElkeCA9 +IERyaXZlRWRpdG9yLlBSRURFRklORURfS0VZV09SRFMuaW5kZXhPZihrZXl3b3JkKTsKICAgICAg +ICBpZiAocHJlZElkeCA+PSAwKSBEcml2ZUVkaXRvci5QUkVERUZJTkVEX0tFWVdPUkRTLnNwbGlj +ZShwcmVkSWR4LCAxKTsKCiAgICAgICAgc2hvd1RvYXN0KCdTY2hsYWd3b3J0ICInICsga2V5d29y +ZCArICciIGdlbMO2c2NodCcgKyAocmVwbGFjZW1lbnQgPyAnLCBlcnNldHp0IGR1cmNoICInICsg +cmVwbGFjZW1lbnQgKyAnIicgOiAnJykgKyAnICgnICsgY291bnQgKyAnIEFydGlrZWwpJywgJ3N1 +Y2Nlc3MnKTsKICAgICAgICB0aGlzLmNsb3NlS3dNYW5hZ2UoKTsKICAgICAgICB0aGlzLnJlbmRl +ckFkbWluKCk7CiAgICAgICAgRHJpdmVQb3J0YWwucmVuZGVyKCk7CiAgICB9LAoKICAgIC8vID09 +PSBBZG1pbi1BbmxlaXR1bmcgZnVlciBFaW5zdGVpZ2VyID09PQogICAgc2hvd0FkbWluR3VpZGUo +KSB7CiAgICAgICAgdmFyIGJvZHkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZ292QWRtaW5C +b2R5Jyk7CiAgICAgICAgYm9keS5pbm5lckhUTUwgPQogICAgICAgICc8ZGl2IHN0eWxlPSJtYXgt +d2lkdGg6ODAwcHg7bWFyZ2luOjAgYXV0bzsiPicgKwogICAgICAgICAgICAnPGRpdiBzdHlsZT0i +ZGlzcGxheTpmbGV4O2p1c3RpZnktY29udGVudDpzcGFjZS1iZXR3ZWVuO2FsaWduLWl0ZW1zOmNl +bnRlcjttYXJnaW4tYm90dG9tOjE2cHg7Ij4nICsKICAgICAgICAgICAgICAgICc8aDIgc3R5bGU9 +ImNvbG9yOnZhcigtLXRleHQtaGVhZGluZyk7bWFyZ2luOjA7Ij5BZG1pbi1BbmxlaXR1bmc8L2gy +PicgKwogICAgICAgICAgICAgICAgJzxidXR0b24gY2xhc3M9Imdvdi1hZGQtYnRuIiBzdHlsZT0i +cGFkZGluZzo2cHggMTRweDsiIG9uY2xpY2s9IkRyaXZlR292ZXJuYW5jZS5yZW5kZXJBZG1pbigp +OyI+WnVyw7xjayB6dXIgVmVyd2FsdHVuZzwvYnV0dG9uPicgKwogICAgICAgICAgICAnPC9kaXY+ +JyArCgogICAgICAgICAgICAnPGRpdiBzdHlsZT0iYmFja2dyb3VuZDp2YXIoLS1iZy1jYXJkKTti +b3JkZXI6MXB4IHNvbGlkIHZhcigtLWJvcmRlci1saWdodCk7Ym9yZGVyLXJhZGl1czo4cHg7cGFk +ZGluZzoxNnB4IDIwcHg7bWFyZ2luLWJvdHRvbToxNHB4OyI+JyArCiAgICAgICAgICAgICAgICAn +PGgzIHN0eWxlPSJjb2xvcjp2YXIoLS10ZXh0LWhlYWRpbmcpO2ZvbnQtc2l6ZToxNXB4O21hcmdp +bi1ib3R0b206OHB4OyI+V2FzIGlzdCBkaWVzZSBEYXRlaT88L2gzPicgKwogICAgICAgICAgICAg +ICAgJzxwIHN0eWxlPSJmb250LXNpemU6MTNweDtsaW5lLWhlaWdodDoxLjc7Y29sb3I6dmFyKC0t +dGV4dC1wcmltYXJ5KTsiPicgKwogICAgICAgICAgICAgICAgICAgICdEYXMgZ2VzYW10ZSBELlIu +SS5WLkUuIFBvcnRhbCBiZXN0ZWh0IGF1cyA8c3Ryb25nPmVpbmVyIGVpbnppZ2VuIERhdGVpPC9z +dHJvbmc+OiA8Y29kZSBzdHlsZT0iYmFja2dyb3VuZDp2YXIoLS1iZy1jYXJkLWFsdCk7cGFkZGlu +ZzoycHggNnB4O2JvcmRlci1yYWRpdXM6M3B4OyI+aW5kZXguaHRtbDwvY29kZT4uICcgKwogICAg +ICAgICAgICAgICAgICAgICdJbiBkaWVzZXIgRGF0ZWkgc3RlY2t0IGFsbGVzOiBkYXMgQXVzc2Vo +ZW4gKEZhcmJlbiwgU2NocmlmdGdyw7bDn2VuLCBBYnN0w6RuZGUpLCBkaWUgU3RydWt0dXIgKHdh +cyB3byBhbmdlemVpZ3Qgd2lyZCkgdW5kIGRpZSBMb2dpayAod2FzIHBhc3NpZXJ0IHdlbm4gbWFu +IGtsaWNrdCkuICcgKwogICAgICAgICAgICAgICAgICAgICdNYW4ga2FubiBzaWUgbWl0IGplZGVt +IFRleHRlZGl0b3Igw7ZmZm5lbiDigJMgZsO8ciB1bnMga2xhcHB0IGhpZXIgbnVyIGRlciBub3Jt +YWxlIFdpbmRvd3MtRWRpdG9yIChXaW5kb3dzIFN1Y2hlOiBFZGl0b3IpJyArCiAgICAgICAgICAg +ICAgICAnPC9wPicgKwogICAgICAgICAgICAnPC9kaXY+JyArCgogICAgICAgICAgICAnPGRpdiBz +dHlsZT0iYmFja2dyb3VuZDp2YXIoLS1iZy1jYXJkKTtib3JkZXI6MXB4IHNvbGlkIHZhcigtLWJv +cmRlci1saWdodCk7Ym9yZGVyLXJhZGl1czo4cHg7cGFkZGluZzoxNnB4IDIwcHg7bWFyZ2luLWJv +dHRvbToxNHB4OyI+JyArCiAgICAgICAgICAgICAgICAnPGgzIHN0eWxlPSJjb2xvcjp2YXIoLS10 +ZXh0LWhlYWRpbmcpO2ZvbnQtc2l6ZToxNXB4O21hcmdpbi1ib3R0b206OHB4OyI+QXVmYmF1IGRl +ciBEYXRlaSAoMyBCZXJlaWNoZSk8L2gzPicgKwogICAgICAgICAgICAgICAgJzxwIHN0eWxlPSJm +b250LXNpemU6MTNweDtsaW5lLWhlaWdodDoxLjc7Y29sb3I6dmFyKC0tdGV4dC1wcmltYXJ5KTtt +YXJnaW4tYm90dG9tOjEwcHg7Ij4nICsKICAgICAgICAgICAgICAgICAgICAnRGllIERhdGVpIGhh +dCBkcmVpIGdyb8OfZSBBYnNjaG5pdHRlLiBJaHIgZXJrZW5udCBzaWUgYW4gZGVuIEtvbW1lbnRh +cmVuIGltIENvZGU6JyArCiAgICAgICAgICAgICAgICAnPC9wPicgKwogICAgICAgICAgICAgICAg +Jzx0YWJsZSBzdHlsZT0id2lkdGg6MTAwJTtib3JkZXItY29sbGFwc2U6Y29sbGFwc2U7Zm9udC1z +aXplOjEzcHg7Ij4nICsKICAgICAgICAgICAgICAgICAgICAnPHRyIHN0eWxlPSJib3JkZXItYm90 +dG9tOjFweCBzb2xpZCB2YXIoLS1ib3JkZXItbGlnaHQpOyI+JyArCiAgICAgICAgICAgICAgICAg +ICAgICAgICc8dGQgc3R5bGU9InBhZGRpbmc6OHB4O2ZvbnQtd2VpZ2h0OjcwMDtjb2xvcjp2YXIo +LS10ZXh0LWhlYWRpbmcpO3dpZHRoOjEyMHB4OyI+MS4gQ1NTPC90ZD4nICsKICAgICAgICAgICAg +ICAgICAgICAgICAgJzx0ZCBzdHlsZT0icGFkZGluZzo4cHg7Y29sb3I6dmFyKC0tdGV4dC1wcmlt +YXJ5KTsiPkFsbGVzIHp3aXNjaGVuIDxjb2RlIHN0eWxlPSJiYWNrZ3JvdW5kOnZhcigtLWJnLWNh +cmQtYWx0KTtwYWRkaW5nOjFweCA0cHg7Ym9yZGVyLXJhZGl1czoycHg7Ij4mbHQ7c3R5bGUmZ3Q7 +PC9jb2RlPiB1bmQgPGNvZGUgc3R5bGU9ImJhY2tncm91bmQ6dmFyKC0tYmctY2FyZC1hbHQpO3Bh +ZGRpbmc6MXB4IDRweDtib3JkZXItcmFkaXVzOjJweDsiPiZsdDsvc3R5bGUmZ3Q7PC9jb2RlPiDi +gJMgaGllciBzdGVoZW4gPHN0cm9uZz5GYXJiZW4sIFNjaHJpZnRncsO2w59lbiwgQWJzdMOkbmRl +PC9zdHJvbmc+LiBEYXMgaXN0IGRlciBCZXJlaWNoLCBkZW4gaWhyIGFtIGjDpHVmaWdzdGVuIGFu +cGFzc2VuIHdlcmRldC48L3RkPicgKwogICAgICAgICAgICAgICAgICAgICc8L3RyPicgKwogICAg +ICAgICAgICAgICAgICAgICc8dHIgc3R5bGU9ImJvcmRlci1ib3R0b206MXB4IHNvbGlkIHZhcigt +LWJvcmRlci1saWdodCk7Ij4nICsKICAgICAgICAgICAgICAgICAgICAgICAgJzx0ZCBzdHlsZT0i +cGFkZGluZzo4cHg7Zm9udC13ZWlnaHQ6NzAwO2NvbG9yOnZhcigtLXRleHQtaGVhZGluZyk7Ij4y +LiBIVE1MPC90ZD4nICsKICAgICAgICAgICAgICAgICAgICAgICAgJzx0ZCBzdHlsZT0icGFkZGlu +Zzo4cHg7Y29sb3I6dmFyKC0tdGV4dC1wcmltYXJ5KTsiPkRlciBtaXR0bGVyZSBUZWlsIOKAkyBo +aWVyIHN0ZWh0IGRpZSA8c3Ryb25nPlN0cnVrdHVyPC9zdHJvbmc+OiBCdXR0b25zLCDDnGJlcnNj +aHJpZnRlbiwgRWluZ2FiZWZlbGRlci4gVGV4dGUgd2llIOKAnlByw7xmdW5nZW4iIG9kZXIg4oCe +R292ZXJuYW5jZSIgZmluZGV0IGlociBoaWVyLjwvdGQ+JyArCiAgICAgICAgICAgICAgICAgICAg +JzwvdHI+JyArCiAgICAgICAgICAgICAgICAgICAgJzx0cj4nICsKICAgICAgICAgICAgICAgICAg +ICAgICAgJzx0ZCBzdHlsZT0icGFkZGluZzo4cHg7Zm9udC13ZWlnaHQ6NzAwO2NvbG9yOnZhcigt +LXRleHQtaGVhZGluZyk7Ij4zLiBKYXZhU2NyaXB0PC90ZD4nICsKICAgICAgICAgICAgICAgICAg +ICAgICAgJzx0ZCBzdHlsZT0icGFkZGluZzo4cHg7Y29sb3I6dmFyKC0tdGV4dC1wcmltYXJ5KTsi +PkFsbGVzIHp3aXNjaGVuIDxjb2RlIHN0eWxlPSJiYWNrZ3JvdW5kOnZhcigtLWJnLWNhcmQtYWx0 +KTtwYWRkaW5nOjFweCA0cHg7Ym9yZGVyLXJhZGl1czoycHg7Ij4mbHQ7c2NyaXB0Jmd0OzwvY29k +ZT4gdW5kIDxjb2RlIHN0eWxlPSJiYWNrZ3JvdW5kOnZhcigtLWJnLWNhcmQtYWx0KTtwYWRkaW5n +OjFweCA0cHg7Ym9yZGVyLXJhZGl1czoycHg7Ij4mbHQ7L3NjcmlwdCZndDs8L2NvZGU+IOKAkyBk +aWUgPHN0cm9uZz5Mb2dpazwvc3Ryb25nPi4gSGllciBwYXNzaWVydCBhbGxlcywgd2FzIGJlaSBL +bGlja3MsIFNwZWljaGVybiB1c3cuIGF1c2dlZsO8aHJ0IHdpcmQuIDxzdHJvbmcgc3R5bGU9ImNv +bG9yOiNkYzM1NDU7Ij5WT1JTSUNIVDogw4RuZGVydW5nZW4gaGllciBrw7ZubmVuIGRhcyBnZXNh +bXRlIFN5c3RlbSBrYXB1dHRtYWNoZW4hPC9zdHJvbmc+PC90ZD4nICsKICAgICAgICAgICAgICAg +ICAgICAnPC90cj4nICsKICAgICAgICAgICAgICAgICc8L3RhYmxlPicgKwogICAgICAgICAgICAn +PC9kaXY+JyArCgogICAgICAgICAgICAnPGRpdiBzdHlsZT0iYmFja2dyb3VuZDp2YXIoLS1iZy1j +YXJkKTtib3JkZXI6MXB4IHNvbGlkIHZhcigtLWJvcmRlci1saWdodCk7Ym9yZGVyLXJhZGl1czo4 +cHg7cGFkZGluZzoxNnB4IDIwcHg7bWFyZ2luLWJvdHRvbToxNHB4OyI+JyArCiAgICAgICAgICAg +ICAgICAnPGgzIHN0eWxlPSJjb2xvcjp2YXIoLS10ZXh0LWhlYWRpbmcpO2ZvbnQtc2l6ZToxNXB4 +O21hcmdpbi1ib3R0b206OHB4OyI+RmFyYmVuIMOkbmRlcm4g4oCTIHNvIGdlaHRcJ3M8L2gzPicg +KwogICAgICAgICAgICAgICAgJzxwIHN0eWxlPSJmb250LXNpemU6MTNweDtsaW5lLWhlaWdodDox +Ljc7Y29sb3I6dmFyKC0tdGV4dC1wcmltYXJ5KTttYXJnaW4tYm90dG9tOjEwcHg7Ij4nICsKICAg +ICAgICAgICAgICAgICAgICAnR2FueiBvYmVuIGluIGRlciBEYXRlaSAoY2EuIFplaWxlIDE2KSBz +dGVodCBlaW4gQmxvY2sgbWl0IDxzdHJvbmc+Q1NTLVZhcmlhYmxlbjwvc3Ryb25nPi4gRGFzIHNp +bmQgZGllIOKAnkdydW5kZmFyYmVuIiBkZXMgZ2VzYW10ZW4gU3lzdGVtcy4gJyArCiAgICAgICAg +ICAgICAgICAgICAgJ1dlbm4gaWhyIGhpZXIgZWluZSBGYXJiZSDDpG5kZXJ0LCDDpG5kZXJ0IHNp +ZSBzaWNoIDxzdHJvbmc+w7xiZXJhbGw8L3N0cm9uZz4gYXVmIGRlciBTZWl0ZTonICsKICAgICAg +ICAgICAgICAgICc8L3A+JyArCiAgICAgICAgICAgICAgICAnPHByZSBzdHlsZT0iYmFja2dyb3Vu +ZDp2YXIoLS1iZy1jYXJkLWFsdCk7Ym9yZGVyOjFweCBzb2xpZCB2YXIoLS1ib3JkZXItbGlnaHQp +O2JvcmRlci1yYWRpdXM6NnB4O3BhZGRpbmc6MTJweCAxNnB4O2ZvbnQtc2l6ZToxMnB4O2xpbmUt +aGVpZ2h0OjEuODtvdmVyZmxvdy14OmF1dG87Y29sb3I6dmFyKC0tdGV4dC1wcmltYXJ5KTsiPicg +KwonOnJvb3QgeycgKyAnXFxuJyArCicgICAgLS1iZy1wcmltYXJ5OiAjMWEyMzMyOyAgICAgIDxz +cGFuIHN0eWxlPSJjb2xvcjp2YXIoLS10ZXh0LW11dGVkKTsiPi8qIEtvcGZ6ZWlsZSAoZHVua2xl +cyBCbGF1KSAqLzwvc3Bhbj4nICsgJ1xcbicgKwonICAgIC0tYmctYm9keTogI2Y1ZjVmNTsgICAg +ICAgICA8c3BhbiBzdHlsZT0iY29sb3I6dmFyKC0tdGV4dC1tdXRlZCk7Ij4vKiBTZWl0ZW5oaW50 +ZXJncnVuZCAoaGVsbGdyYXUpICovPC9zcGFuPicgKyAnXFxuJyArCicgICAgLS1iZy1jYXJkOiAj +ZmZmZmZmOyAgICAgICAgIDxzcGFuIHN0eWxlPSJjb2xvcjp2YXIoLS10ZXh0LW11dGVkKTsiPi8q +IEthcnRlbi9Cb3hlbiAod2Vpw58pICovPC9zcGFuPicgKyAnXFxuJyArCicgICAgLS10ZXh0LXBy +aW1hcnk6ICMzMzM7ICAgICAgIDxzcGFuIHN0eWxlPSJjb2xvcjp2YXIoLS10ZXh0LW11dGVkKTsi +Pi8qIE5vcm1hbGVyIFRleHQgKGR1bmtlbGdyYXUpICovPC9zcGFuPicgKyAnXFxuJyArCicgICAg +LS10ZXh0LWhlYWRpbmc6ICMyRTRBNjI7ICAgIDxzcGFuIHN0eWxlPSJjb2xvcjp2YXIoLS10ZXh0 +LW11dGVkKTsiPi8qIMOcYmVyc2NocmlmdGVuIChQb2xpemVpLUJsYXUpICovPC9zcGFuPicgKyAn +XFxuJyArCicgICAgLS1ib3JkZXItY29sb3I6ICNkZGQ7ICAgICAgIDxzcGFuIHN0eWxlPSJjb2xv +cjp2YXIoLS10ZXh0LW11dGVkKTsiPi8qIFJhaG1lbmxpbmllbiAoaGVsbGdyYXUpICovPC9zcGFu +PicgKyAnXFxuJyArCid9JyArCiAgICAgICAgICAgICAgICAnPC9wcmU+JyArCiAgICAgICAgICAg +ICAgICAnPHAgc3R5bGU9ImZvbnQtc2l6ZToxM3B4O2xpbmUtaGVpZ2h0OjEuNztjb2xvcjp2YXIo +LS10ZXh0LXByaW1hcnkpO21hcmdpbi10b3A6MTBweDsiPicgKwogICAgICAgICAgICAgICAgICAg +ICc8c3Ryb25nPkJlaXNwaWVsOjwvc3Ryb25nPiBJaHIgd29sbHQgZGllIEtvcGZ6ZWlsZSByb3Qg +bWFjaGVuPyDDhG5kZXJ0IDxjb2RlIHN0eWxlPSJiYWNrZ3JvdW5kOnZhcigtLWJnLWNhcmQtYWx0 +KTtwYWRkaW5nOjFweCA0cHg7Ym9yZGVyLXJhZGl1czoycHg7Ij4jMWEyMzMyPC9jb2RlPiAnICsK +ICAgICAgICAgICAgICAgICAgICAnaGludGVyIDxjb2RlIHN0eWxlPSJiYWNrZ3JvdW5kOnZhcigt +LWJnLWNhcmQtYWx0KTtwYWRkaW5nOjFweCA0cHg7Ym9yZGVyLXJhZGl1czoycHg7Ij4tLWJnLXBy +aW1hcnk8L2NvZGU+IHp1IDxjb2RlIHN0eWxlPSJiYWNrZ3JvdW5kOnZhcigtLWJnLWNhcmQtYWx0 +KTtwYWRkaW5nOjFweCA0cHg7Ym9yZGVyLXJhZGl1czoycHg7Ij4jY2MwMDAwPC9jb2RlPi4gU3Bl +aWNoZXJuLCBTZWl0ZSBuZXUgbGFkZW4g4oCTIGZlcnRpZy4nICsKICAgICAgICAgICAgICAgICc8 +L3A+JyArCiAgICAgICAgICAgICAgICAnPHAgc3R5bGU9ImZvbnQtc2l6ZToxM3B4O2xpbmUtaGVp +Z2h0OjEuNztjb2xvcjp2YXIoLS10ZXh0LXByaW1hcnkpO21hcmdpbi10b3A6NnB4OyI+JyArCiAg +ICAgICAgICAgICAgICAgICAgJzxzdHJvbmc+VGlwcDo8L3N0cm9uZz4gRmFyYmVuIHNpbmQgYWxz +IOKAnkhleC1Db2RlcyIgYW5nZWdlYmVuICh6LkIuIDxjb2RlIHN0eWxlPSJiYWNrZ3JvdW5kOnZh +cigtLWJnLWNhcmQtYWx0KTtwYWRkaW5nOjFweCA0cHg7Ym9yZGVyLXJhZGl1czoycHg7Ij4jMkU0 +QTYyPC9jb2RlPikuICcgKwogICAgICAgICAgICAgICAgICAgICdTdWNodCBpbSBJbnRlcm5ldCBu +YWNoIOKAnkhUTUwgQ29sb3IgUGlja2VyIiDigJMgZGEga8O2bm50IGlociBGYXJiZW4gdmlzdWVs +bCBhdXN3w6RobGVuIHVuZCBkZW4gQ29kZSBrb3BpZXJlbi4nICsKICAgICAgICAgICAgICAgICc8 +L3A+JyArCiAgICAgICAgICAgICc8L2Rpdj4nICsKCiAgICAgICAgICAgICc8ZGl2IHN0eWxlPSJi +YWNrZ3JvdW5kOnZhcigtLWJnLWNhcmQpO2JvcmRlcjoxcHggc29saWQgdmFyKC0tYm9yZGVyLWxp +Z2h0KTtib3JkZXItcmFkaXVzOjhweDtwYWRkaW5nOjE2cHggMjBweDttYXJnaW4tYm90dG9tOjE0 +cHg7Ij4nICsKICAgICAgICAgICAgICAgICc8aDMgc3R5bGU9ImNvbG9yOnZhcigtLXRleHQtaGVh +ZGluZyk7Zm9udC1zaXplOjE1cHg7bWFyZ2luLWJvdHRvbTo4cHg7Ij5OYWNodC1Nb2R1cyBGYXJi +ZW4gw6RuZGVybjwvaDM+JyArCiAgICAgICAgICAgICAgICAnPHAgc3R5bGU9ImZvbnQtc2l6ZTox +M3B4O2xpbmUtaGVpZ2h0OjEuNztjb2xvcjp2YXIoLS10ZXh0LXByaW1hcnkpOyI+JyArCiAgICAg +ICAgICAgICAgICAgICAgJ0RpcmVrdCB1bnRlciBkZW0gPGNvZGUgc3R5bGU9ImJhY2tncm91bmQ6 +dmFyKC0tYmctY2FyZC1hbHQpO3BhZGRpbmc6MXB4IDRweDtib3JkZXItcmFkaXVzOjJweDsiPjpy +b290PC9jb2RlPi1CbG9jayAoY2EuIFplaWxlIDQxKSBzdGVodCBlaW4gendlaXRlciBCbG9jayBt +aXQgJyArCiAgICAgICAgICAgICAgICAgICAgJzxjb2RlIHN0eWxlPSJiYWNrZ3JvdW5kOnZhcigt +LWJnLWNhcmQtYWx0KTtwYWRkaW5nOjFweCA0cHg7Ym9yZGVyLXJhZGl1czoycHg7Ij5bZGF0YS10 +aGVtZT0ibmlnaHQiXTwvY29kZT4uIERhcyBzaW5kIGRpZSBGYXJiZW4gZsO8ciBkZW4gPHN0cm9u +Zz5EdW5rZWxtb2R1czwvc3Ryb25nPi4gJyArCiAgICAgICAgICAgICAgICAgICAgJ0dsZWljaGUg +VmFyaWFibGVuLU5hbWVuLCBhbmRlcmUgV2VydGUuIFdlbm4gaWhyIHouQi4gZGVuIEhpbnRlcmdy +dW5kIGltIER1bmtlbG1vZHVzIGhlbGxlciB3b2xsdCwgw6RuZGVydCBpaHIgJyArCiAgICAgICAg +ICAgICAgICAgICAgJzxjb2RlIHN0eWxlPSJiYWNrZ3JvdW5kOnZhcigtLWJnLWNhcmQtYWx0KTtw +YWRkaW5nOjFweCA0cHg7Ym9yZGVyLXJhZGl1czoycHg7Ij4tLWJnLWJvZHk8L2NvZGU+IGRvcnQu +JyArCiAgICAgICAgICAgICAgICAnPC9wPicgKwogICAgICAgICAgICAnPC9kaXY+JyArCgogICAg +ICAgICAgICAnPGRpdiBzdHlsZT0iYmFja2dyb3VuZDp2YXIoLS1iZy1jYXJkKTtib3JkZXI6MXB4 +IHNvbGlkIHZhcigtLWJvcmRlci1saWdodCk7Ym9yZGVyLXJhZGl1czo4cHg7cGFkZGluZzoxNnB4 +IDIwcHg7bWFyZ2luLWJvdHRvbToxNHB4OyI+JyArCiAgICAgICAgICAgICAgICAnPGgzIHN0eWxl +PSJjb2xvcjp2YXIoLS10ZXh0LWhlYWRpbmcpO2ZvbnQtc2l6ZToxNXB4O21hcmdpbi1ib3R0b206 +OHB4OyI+VGV4dGUgdW5kIEJlc2NocmlmdHVuZ2VuIMOkbmRlcm48L2gzPicgKwogICAgICAgICAg +ICAgICAgJzxwIHN0eWxlPSJmb250LXNpemU6MTNweDtsaW5lLWhlaWdodDoxLjc7Y29sb3I6dmFy +KC0tdGV4dC1wcmltYXJ5KTttYXJnaW4tYm90dG9tOjEwcHg7Ij4nICsKICAgICAgICAgICAgICAg +ICAgICAnTnV0enQgZGllIDxzdHJvbmc+U3VjaGVuLUZ1bmt0aW9uPC9zdHJvbmc+IGV1cmVzIEVk +aXRvcnMgKFN0cmcrRikgdW5kIHN1Y2h0IG5hY2ggZGVtIFRleHQsIGRlbiBpaHIgw6RuZGVybiB3 +b2xsdC4gQmVpc3BpZWxlOicgKwogICAgICAgICAgICAgICAgJzwvcD4nICsKICAgICAgICAgICAg +ICAgICc8dWwgc3R5bGU9ImZvbnQtc2l6ZToxM3B4O2xpbmUtaGVpZ2h0OjI7Y29sb3I6dmFyKC0t +dGV4dC1wcmltYXJ5KTtwYWRkaW5nLWxlZnQ6MjBweDsiPicgKwogICAgICAgICAgICAgICAgICAg +ICc8bGk+S29wZnplaWxlIOKAnkRpZ2l0YWxlcyBSZXNzb3VyY2VuLSB1bmQgSW5mb3JtYXRpb25z +cG9ydGFsIFZlcmtlaHIiIOKGkiBzdWNodCBnZW5hdSBkaWVzZW4gVGV4dDwvbGk+JyArCiAgICAg +ICAgICAgICAgICAgICAgJzxsaT5Gb290ZXItVGV4dCDigJ5ELlIuSS5WLkUuIC0gUG9saXplaSBO +UlciIOKGkiBzdWNodCBkaWVzZW4gVGV4dDwvbGk+JyArCiAgICAgICAgICAgICAgICAgICAgJzxs +aT5CdXR0b24tQmVzY2hyaWZ0dW5nZW4gd2llIOKAnkJlYXJiZWl0ZW4iLCDigJ5Mw7ZzY2hlbiIg +4oaSIHN1Y2h0IGRlbiBCdXR0b24tVGV4dDwvbGk+JyArCiAgICAgICAgICAgICAgICAgICAgJzxs +aT5LYXRlZ29yaWVuIHdpZSDigJ5WZXJrZWhyIiwg4oCeU2ljaGVyaGVpdCIg4oaSIGRpZXNlIHN0 +ZWhlbiBpbiA8Y29kZSBzdHlsZT0iYmFja2dyb3VuZDp2YXIoLS1iZy1jYXJkLWFsdCk7cGFkZGlu +ZzoxcHggNHB4O2JvcmRlci1yYWRpdXM6MnB4OyI+ZGF0YS9jb25maWcuanNvbjwvY29kZT4gKG5p +Y2h0IGluIGluZGV4Lmh0bWwhKTwvbGk+JyArCiAgICAgICAgICAgICAgICAnPC91bD4nICsKICAg +ICAgICAgICAgJzwvZGl2PicgKwoKICAgICAgICAgICAgJzxkaXYgc3R5bGU9ImJhY2tncm91bmQ6 +dmFyKC0tYmctY2FyZCk7Ym9yZGVyOjFweCBzb2xpZCB2YXIoLS1ib3JkZXItbGlnaHQpO2JvcmRl +ci1yYWRpdXM6OHB4O3BhZGRpbmc6MTZweCAyMHB4O21hcmdpbi1ib3R0b206MTRweDsiPicgKwog +ICAgICAgICAgICAgICAgJzxoMyBzdHlsZT0iY29sb3I6dmFyKC0tdGV4dC1oZWFkaW5nKTtmb250 +LXNpemU6MTVweDttYXJnaW4tYm90dG9tOjhweDsiPkJyb3dzZXItRW50d2lja2xlcnRvb2xzIG51 +dHplbiAoZGVyIGJlc3RlIFRyaWNrISk8L2gzPicgKwogICAgICAgICAgICAgICAgJzxwIHN0eWxl +PSJmb250LXNpemU6MTNweDtsaW5lLWhlaWdodDoxLjc7Y29sb3I6dmFyKC0tdGV4dC1wcmltYXJ5 +KTttYXJnaW4tYm90dG9tOjEwcHg7Ij4nICsKICAgICAgICAgICAgICAgICAgICAnRHLDvGNrdCBp +bSBCcm93c2VyIDxzdHJvbmc+RjEyPC9zdHJvbmc+IChvZGVyIFJlY2h0c2tsaWNrIOKGkiDigJ5V +bnRlcnN1Y2hlbiIpLiBFcyDDtmZmbmV0IHNpY2ggZWluIFdlcmt6ZXVnLUZlbnN0ZXIuIERhbWl0 +IGvDtm5udCBpaHI6JyArCiAgICAgICAgICAgICAgICAnPC9wPicgKwogICAgICAgICAgICAgICAg +JzxvbCBzdHlsZT0iZm9udC1zaXplOjEzcHg7bGluZS1oZWlnaHQ6Mjtjb2xvcjp2YXIoLS10ZXh0 LXByaW1hcnkpO3BhZGRpbmctbGVmdDoyMHB4OyI+JyArCiAgICAgICAgICAgICAgICAgICAgJzxs -aT5Lb3BmemVpbGUg4oCeRGlnaXRhbGVzIFJlc3NvdXJjZW4tIHVuZCBJbmZvcm1hdGlvbnNwb3J0 -YWwgVmVya2VociIg4oaSIHN1Y2h0IGdlbmF1IGRpZXNlbiBUZXh0PC9saT4nICsKICAgICAgICAg -ICAgICAgICAgICAnPGxpPkZvb3Rlci1UZXh0IOKAnkQuUi5JLlYuRS4gLSBQb2xpemVpIE5SVyIg -4oaSIHN1Y2h0IGRpZXNlbiBUZXh0PC9saT4nICsKICAgICAgICAgICAgICAgICAgICAnPGxpPkJ1 -dHRvbi1CZXNjaHJpZnR1bmdlbiB3aWUg4oCeQmVhcmJlaXRlbiIsIOKAnkzDtnNjaGVuIiDihpIg -c3VjaHQgZGVuIEJ1dHRvbi1UZXh0PC9saT4nICsKICAgICAgICAgICAgICAgICAgICAnPGxpPkth -dGVnb3JpZW4gd2llIOKAnlZlcmtlaHIiLCDigJ5TaWNoZXJoZWl0IiDihpIgZGllc2Ugc3RlaGVu -IGluIDxjb2RlIHN0eWxlPSJiYWNrZ3JvdW5kOnZhcigtLWJnLWNhcmQtYWx0KTtwYWRkaW5nOjFw -eCA0cHg7Ym9yZGVyLXJhZGl1czoycHg7Ij5kYXRhL2NvbmZpZy5qc29uPC9jb2RlPiAobmljaHQg -aW4gaW5kZXguaHRtbCEpPC9saT4nICsKICAgICAgICAgICAgICAgICc8L3VsPicgKwogICAgICAg -ICAgICAnPC9kaXY+JyArCgogICAgICAgICAgICAnPGRpdiBzdHlsZT0iYmFja2dyb3VuZDp2YXIo -LS1iZy1jYXJkKTtib3JkZXI6MXB4IHNvbGlkIHZhcigtLWJvcmRlci1saWdodCk7Ym9yZGVyLXJh -ZGl1czo4cHg7cGFkZGluZzoxNnB4IDIwcHg7bWFyZ2luLWJvdHRvbToxNHB4OyI+JyArCiAgICAg -ICAgICAgICAgICAnPGgzIHN0eWxlPSJjb2xvcjp2YXIoLS10ZXh0LWhlYWRpbmcpO2ZvbnQtc2l6 -ZToxNXB4O21hcmdpbi1ib3R0b206OHB4OyI+QnJvd3Nlci1FbnR3aWNrbGVydG9vbHMgbnV0emVu -IChkZXIgYmVzdGUgVHJpY2shKTwvaDM+JyArCiAgICAgICAgICAgICAgICAnPHAgc3R5bGU9ImZv -bnQtc2l6ZToxM3B4O2xpbmUtaGVpZ2h0OjEuNztjb2xvcjp2YXIoLS10ZXh0LXByaW1hcnkpO21h -cmdpbi1ib3R0b206MTBweDsiPicgKwogICAgICAgICAgICAgICAgICAgICdEcsO8Y2t0IGltIEJy -b3dzZXIgPHN0cm9uZz5GMTI8L3N0cm9uZz4gKG9kZXIgUmVjaHRza2xpY2sg4oaSIOKAnlVudGVy -c3VjaGVuIikuIEVzIMO2ZmZuZXQgc2ljaCBlaW4gV2Vya3pldWctRmVuc3Rlci4gRGFtaXQga8O2 -bm50IGlocjonICsKICAgICAgICAgICAgICAgICc8L3A+JyArCiAgICAgICAgICAgICAgICAnPG9s -IHN0eWxlPSJmb250LXNpemU6MTNweDtsaW5lLWhlaWdodDoyO2NvbG9yOnZhcigtLXRleHQtcHJp -bWFyeSk7cGFkZGluZy1sZWZ0OjIwcHg7Ij4nICsKICAgICAgICAgICAgICAgICAgICAnPGxpPk1p -dCBkZW0gPHN0cm9uZz5BdXN3YWhsLVdlcmt6ZXVnPC9zdHJvbmc+IChQZmVpbC1JY29uIG9iZW4g -bGlua3MgaW0gV2Vya3pldWcpIGF1ZiBlaW4gYmVsaWViaWdlcyBFbGVtZW50IGtsaWNrZW48L2xp -PicgKwogICAgICAgICAgICAgICAgICAgICc8bGk+SW0gcmVjaHRlbiBCZXJlaWNoIHNlaHQgaWhy -IGRpZSA8c3Ryb25nPkNTUy1FaWdlbnNjaGFmdGVuPC9zdHJvbmc+IGRpZXNlcyBFbGVtZW50czwv -bGk+JyArCiAgICAgICAgICAgICAgICAgICAgJzxsaT5JaHIga8O2bm50IEZhcmJlbiwgU2Nocmlm -dGdyw7bDn2VuIHVzdy4gPHN0cm9uZz5saXZlIMOkbmRlcm48L3N0cm9uZz4gdW5kIGRhcyBFcmdl -Ym5pcyBzb2ZvcnQgc2VoZW48L2xpPicgKwogICAgICAgICAgICAgICAgICAgICc8bGk+V2VubiBl -cyBndXQgYXVzc2llaHQ6IGRlbiBXZXJ0IG5vdGllcmVuIHVuZCBpbiBkZXIgZWNodGVuIERhdGVp -IMOkbmRlcm48L2xpPicgKwogICAgICAgICAgICAgICAgJzwvb2w+JyArCiAgICAgICAgICAgICAg -ICAnPHAgc3R5bGU9ImZvbnQtc2l6ZToxM3B4O2xpbmUtaGVpZ2h0OjEuNztjb2xvcjp2YXIoLS10 -ZXh0LXByaW1hcnkpO21hcmdpbi10b3A6NnB4OyI+JyArCiAgICAgICAgICAgICAgICAgICAgJzxz -dHJvbmc+V2ljaHRpZzo8L3N0cm9uZz4gw4RuZGVydW5nZW4gaW0gQnJvd3Nlci1XZXJremV1ZyBz -aW5kIDxlbT50ZW1wb3LDpHI8L2VtPiDigJMgbmFjaCBkZW0gTmV1bGFkZW4gc2luZCBzaWUgd2Vn -LiAnICsKICAgICAgICAgICAgICAgICAgICAnWnVtIGRhdWVyaGFmdGVuIMOEbmRlcm4gbcO8c3N0 -IGlociBkaWUgPGNvZGUgc3R5bGU9ImJhY2tncm91bmQ6dmFyKC0tYmctY2FyZC1hbHQpO3BhZGRp -bmc6MXB4IDRweDtib3JkZXItcmFkaXVzOjJweDsiPmluZGV4Lmh0bWw8L2NvZGU+IGJlYXJiZWl0 -ZW4uJyArCiAgICAgICAgICAgICAgICAnPC9wPicgKwogICAgICAgICAgICAnPC9kaXY+JyArCgog -ICAgICAgICAgICAnPGRpdiBzdHlsZT0iYmFja2dyb3VuZDp2YXIoLS1iZy1jYXJkKTtib3JkZXI6 -MXB4IHNvbGlkIHZhcigtLWJvcmRlci1saWdodCk7Ym9yZGVyLXJhZGl1czo4cHg7cGFkZGluZzox -NnB4IDIwcHg7bWFyZ2luLWJvdHRvbToxNHB4OyI+JyArCiAgICAgICAgICAgICAgICAnPGgzIHN0 -eWxlPSJjb2xvcjp2YXIoLS10ZXh0LWhlYWRpbmcpO2ZvbnQtc2l6ZToxNXB4O21hcmdpbi1ib3R0 -b206OHB4OyI+V2ljaHRpZ2UgRGF0ZWllbiBpbSDDnGJlcmJsaWNrPC9oMz4nICsKICAgICAgICAg -ICAgICAgICc8dGFibGUgc3R5bGU9IndpZHRoOjEwMCU7Ym9yZGVyLWNvbGxhcHNlOmNvbGxhcHNl -O2ZvbnQtc2l6ZToxM3B4OyI+JyArCiAgICAgICAgICAgICAgICAgICAgJzx0ciBzdHlsZT0iYm9y -ZGVyLWJvdHRvbToxcHggc29saWQgdmFyKC0tYm9yZGVyLWxpZ2h0KTsiPicgKwogICAgICAgICAg -ICAgICAgICAgICAgICAnPHRkIHN0eWxlPSJwYWRkaW5nOjhweDtmb250LXdlaWdodDo2MDA7Y29s -b3I6dmFyKC0tdGV4dC1oZWFkaW5nKTt3aWR0aDoyMDBweDsiPmluZGV4Lmh0bWw8L3RkPicgKwog -ICAgICAgICAgICAgICAgICAgICAgICAnPHRkIHN0eWxlPSJwYWRkaW5nOjhweDtjb2xvcjp2YXIo -LS10ZXh0LXByaW1hcnkpOyI+RGllIGtvbXBsZXR0ZSBBcHAg4oCTIEF1c3NlaGVuICsgTG9naWsu -IEhpZXIgw6RuZGVydCBpaHIgRmFyYmVuLCBUZXh0ZSwgTGF5b3V0LjwvdGQ+JyArCiAgICAgICAg -ICAgICAgICAgICAgJzwvdHI+JyArCiAgICAgICAgICAgICAgICAgICAgJzx0ciBzdHlsZT0iYm9y -ZGVyLWJvdHRvbToxcHggc29saWQgdmFyKC0tYm9yZGVyLWxpZ2h0KTsiPicgKwogICAgICAgICAg -ICAgICAgICAgICAgICAnPHRkIHN0eWxlPSJwYWRkaW5nOjhweDtmb250LXdlaWdodDo2MDA7Y29s -b3I6dmFyKC0tdGV4dC1oZWFkaW5nKTsiPmRhdGEvY29uZmlnLmpzb248L3RkPicgKwogICAgICAg -ICAgICAgICAgICAgICAgICAnPHRkIHN0eWxlPSJwYWRkaW5nOjhweDtjb2xvcjp2YXIoLS10ZXh0 -LXByaW1hcnkpOyI+S2F0ZWdvcmllbiB1bmQgU3RhdHVzLURlZmluaXRpb25lbi4gSGllciBzdGVo -ZW4gZGllIDI3IEZhY2hiZXJlaWNoZS48L3RkPicgKwogICAgICAgICAgICAgICAgICAgICc8L3Ry -PicgKwogICAgICAgICAgICAgICAgICAgICc8dHIgc3R5bGU9ImJvcmRlci1ib3R0b206MXB4IHNv -bGlkIHZhcigtLWJvcmRlci1saWdodCk7Ij4nICsKICAgICAgICAgICAgICAgICAgICAgICAgJzx0 -ZCBzdHlsZT0icGFkZGluZzo4cHg7Zm9udC13ZWlnaHQ6NjAwO2NvbG9yOnZhcigtLXRleHQtaGVh -ZGluZyk7Ij5kYXRhL2dvdmVybmFuY2UuanNvbjwvdGQ+JyArCiAgICAgICAgICAgICAgICAgICAg -ICAgICc8dGQgc3R5bGU9InBhZGRpbmc6OHB4O2NvbG9yOnZhcigtLXRleHQtcHJpbWFyeSk7Ij5S -b2xsZW4gKFN1cGVyVXNlciwgUmV2aWV3ZXIpLiA8c3Ryb25nPlZlcnNjaGzDvHNzZWx0PC9zdHJv -bmc+IOKAkyBudXIgw7xiZXIgZGllc2VzIFBhbmVsIGhpZXIgYmVhcmJlaXRiYXIhPC90ZD4nICsK -ICAgICAgICAgICAgICAgICAgICAnPC90cj4nICsKICAgICAgICAgICAgICAgICAgICAnPHRyIHN0 -eWxlPSJib3JkZXItYm90dG9tOjFweCBzb2xpZCB2YXIoLS1ib3JkZXItbGlnaHQpOyI+JyArCiAg -ICAgICAgICAgICAgICAgICAgICAgICc8dGQgc3R5bGU9InBhZGRpbmc6OHB4O2ZvbnQtd2VpZ2h0 -OjYwMDtjb2xvcjp2YXIoLS10ZXh0LWhlYWRpbmcpOyI+ZGF0YS9bS2F0ZWdvcmllXS8qLmpzb248 -L3RkPicgKwogICAgICAgICAgICAgICAgICAgICAgICAnPHRkIHN0eWxlPSJwYWRkaW5nOjhweDtj -b2xvcjp2YXIoLS10ZXh0LXByaW1hcnkpOyI+RGllIGVpZ2VudGxpY2hlbiBEb2t1bWVudGUuIEpl -ZGVyIEFydGlrZWwgaXN0IGVpbmUgSlNPTi1EYXRlaSBpbSBLYXRlZ29yaWUtT3JkbmVyLjwvdGQ+ +aT5NaXQgZGVtIDxzdHJvbmc+QXVzd2FobC1XZXJremV1Zzwvc3Ryb25nPiAoUGZlaWwtSWNvbiBv +YmVuIGxpbmtzIGltIFdlcmt6ZXVnKSBhdWYgZWluIGJlbGllYmlnZXMgRWxlbWVudCBrbGlja2Vu +PC9saT4nICsKICAgICAgICAgICAgICAgICAgICAnPGxpPkltIHJlY2h0ZW4gQmVyZWljaCBzZWh0 +IGlociBkaWUgPHN0cm9uZz5DU1MtRWlnZW5zY2hhZnRlbjwvc3Ryb25nPiBkaWVzZXMgRWxlbWVu +dHM8L2xpPicgKwogICAgICAgICAgICAgICAgICAgICc8bGk+SWhyIGvDtm5udCBGYXJiZW4sIFNj +aHJpZnRncsO2w59lbiB1c3cuIDxzdHJvbmc+bGl2ZSDDpG5kZXJuPC9zdHJvbmc+IHVuZCBkYXMg +RXJnZWJuaXMgc29mb3J0IHNlaGVuPC9saT4nICsKICAgICAgICAgICAgICAgICAgICAnPGxpPldl +bm4gZXMgZ3V0IGF1c3NpZWh0OiBkZW4gV2VydCBub3RpZXJlbiB1bmQgaW4gZGVyIGVjaHRlbiBE +YXRlaSDDpG5kZXJuPC9saT4nICsKICAgICAgICAgICAgICAgICc8L29sPicgKwogICAgICAgICAg +ICAgICAgJzxwIHN0eWxlPSJmb250LXNpemU6MTNweDtsaW5lLWhlaWdodDoxLjc7Y29sb3I6dmFy +KC0tdGV4dC1wcmltYXJ5KTttYXJnaW4tdG9wOjZweDsiPicgKwogICAgICAgICAgICAgICAgICAg +ICc8c3Ryb25nPldpY2h0aWc6PC9zdHJvbmc+IMOEbmRlcnVuZ2VuIGltIEJyb3dzZXItV2Vya3pl +dWcgc2luZCA8ZW0+dGVtcG9yw6RyPC9lbT4g4oCTIG5hY2ggZGVtIE5ldWxhZGVuIHNpbmQgc2ll +IHdlZy4gJyArCiAgICAgICAgICAgICAgICAgICAgJ1p1bSBkYXVlcmhhZnRlbiDDhG5kZXJuIG3D +vHNzdCBpaHIgZGllIDxjb2RlIHN0eWxlPSJiYWNrZ3JvdW5kOnZhcigtLWJnLWNhcmQtYWx0KTtw +YWRkaW5nOjFweCA0cHg7Ym9yZGVyLXJhZGl1czoycHg7Ij5pbmRleC5odG1sPC9jb2RlPiBiZWFy +YmVpdGVuLicgKwogICAgICAgICAgICAgICAgJzwvcD4nICsKICAgICAgICAgICAgJzwvZGl2Picg +KwoKICAgICAgICAgICAgJzxkaXYgc3R5bGU9ImJhY2tncm91bmQ6dmFyKC0tYmctY2FyZCk7Ym9y +ZGVyOjFweCBzb2xpZCB2YXIoLS1ib3JkZXItbGlnaHQpO2JvcmRlci1yYWRpdXM6OHB4O3BhZGRp +bmc6MTZweCAyMHB4O21hcmdpbi1ib3R0b206MTRweDsiPicgKwogICAgICAgICAgICAgICAgJzxo +MyBzdHlsZT0iY29sb3I6dmFyKC0tdGV4dC1oZWFkaW5nKTtmb250LXNpemU6MTVweDttYXJnaW4t +Ym90dG9tOjhweDsiPldpY2h0aWdlIERhdGVpZW4gaW0gw5xiZXJibGljazwvaDM+JyArCiAgICAg +ICAgICAgICAgICAnPHRhYmxlIHN0eWxlPSJ3aWR0aDoxMDAlO2JvcmRlci1jb2xsYXBzZTpjb2xs +YXBzZTtmb250LXNpemU6MTNweDsiPicgKwogICAgICAgICAgICAgICAgICAgICc8dHIgc3R5bGU9 +ImJvcmRlci1ib3R0b206MXB4IHNvbGlkIHZhcigtLWJvcmRlci1saWdodCk7Ij4nICsKICAgICAg +ICAgICAgICAgICAgICAgICAgJzx0ZCBzdHlsZT0icGFkZGluZzo4cHg7Zm9udC13ZWlnaHQ6NjAw +O2NvbG9yOnZhcigtLXRleHQtaGVhZGluZyk7d2lkdGg6MjAwcHg7Ij5pbmRleC5odG1sPC90ZD4n +ICsKICAgICAgICAgICAgICAgICAgICAgICAgJzx0ZCBzdHlsZT0icGFkZGluZzo4cHg7Y29sb3I6 +dmFyKC0tdGV4dC1wcmltYXJ5KTsiPkRpZSBrb21wbGV0dGUgQXBwIOKAkyBBdXNzZWhlbiArIExv +Z2lrLiBIaWVyIMOkbmRlcnQgaWhyIEZhcmJlbiwgVGV4dGUsIExheW91dC48L3RkPicgKwogICAg +ICAgICAgICAgICAgICAgICc8L3RyPicgKwogICAgICAgICAgICAgICAgICAgICc8dHIgc3R5bGU9 +ImJvcmRlci1ib3R0b206MXB4IHNvbGlkIHZhcigtLWJvcmRlci1saWdodCk7Ij4nICsKICAgICAg +ICAgICAgICAgICAgICAgICAgJzx0ZCBzdHlsZT0icGFkZGluZzo4cHg7Zm9udC13ZWlnaHQ6NjAw +O2NvbG9yOnZhcigtLXRleHQtaGVhZGluZyk7Ij5kYXRhL2NvbmZpZy5qc29uPC90ZD4nICsKICAg +ICAgICAgICAgICAgICAgICAgICAgJzx0ZCBzdHlsZT0icGFkZGluZzo4cHg7Y29sb3I6dmFyKC0t +dGV4dC1wcmltYXJ5KTsiPkthdGVnb3JpZW4gdW5kIFN0YXR1cy1EZWZpbml0aW9uZW4uIEhpZXIg +c3RlaGVuIGRpZSAyNyBGYWNoYmVyZWljaGUuPC90ZD4nICsKICAgICAgICAgICAgICAgICAgICAn +PC90cj4nICsKICAgICAgICAgICAgICAgICAgICAnPHRyIHN0eWxlPSJib3JkZXItYm90dG9tOjFw +eCBzb2xpZCB2YXIoLS1ib3JkZXItbGlnaHQpOyI+JyArCiAgICAgICAgICAgICAgICAgICAgICAg +ICc8dGQgc3R5bGU9InBhZGRpbmc6OHB4O2ZvbnQtd2VpZ2h0OjYwMDtjb2xvcjp2YXIoLS10ZXh0 +LWhlYWRpbmcpOyI+ZGF0YS9nb3Zlcm5hbmNlLmpzb248L3RkPicgKwogICAgICAgICAgICAgICAg +ICAgICAgICAnPHRkIHN0eWxlPSJwYWRkaW5nOjhweDtjb2xvcjp2YXIoLS10ZXh0LXByaW1hcnkp +OyI+Um9sbGVuIChTdXBlclVzZXIsIFJldmlld2VyKS4gPHN0cm9uZz5WZXJzY2hsw7xzc2VsdDwv +c3Ryb25nPiDigJMgbnVyIMO8YmVyIGRpZXNlcyBQYW5lbCBoaWVyIGJlYXJiZWl0YmFyITwvdGQ+ JyArCiAgICAgICAgICAgICAgICAgICAgJzwvdHI+JyArCiAgICAgICAgICAgICAgICAgICAgJzx0 ciBzdHlsZT0iYm9yZGVyLWJvdHRvbToxcHggc29saWQgdmFyKC0tYm9yZGVyLWxpZ2h0KTsiPicg KwogICAgICAgICAgICAgICAgICAgICAgICAnPHRkIHN0eWxlPSJwYWRkaW5nOjhweDtmb250LXdl -aWdodDo2MDA7Y29sb3I6dmFyKC0tdGV4dC1oZWFkaW5nKTsiPnNlcnZlci5wczE8L3RkPicgKwog -ICAgICAgICAgICAgICAgICAgICAgICAnPHRkIHN0eWxlPSJwYWRkaW5nOjhweDtjb2xvcjp2YXIo -LS10ZXh0LXByaW1hcnkpOyI+RGVyIFNlcnZlciAoUG93ZXJTaGVsbCkuIFN0YXJ0ZXQgYXV0b21h -dGlzY2ggw7xiZXIgRFJJVkVfU3RhcnQuYmF0LjwvdGQ+JyArCiAgICAgICAgICAgICAgICAgICAg -JzwvdHI+JyArCiAgICAgICAgICAgICAgICAgICAgJzx0cj4nICsKICAgICAgICAgICAgICAgICAg -ICAgICAgJzx0ZCBzdHlsZT0icGFkZGluZzo4cHg7Zm9udC13ZWlnaHQ6NjAwO2NvbG9yOnZhcigt -LXRleHQtaGVhZGluZyk7Ij5EUklWRV9TdGFydC5iYXQ8L3RkPicgKwogICAgICAgICAgICAgICAg -ICAgICAgICAnPHRkIHN0eWxlPSJwYWRkaW5nOjhweDtjb2xvcjp2YXIoLS10ZXh0LXByaW1hcnkp -OyI+RG9wcGVsa2xpY2sgenVtIFN0YXJ0ZW4uIMOWZmZuZXQgZGVuIFNlcnZlciB1bmQgZGVuIEJy -b3dzZXIuPC90ZD4nICsKICAgICAgICAgICAgICAgICAgICAnPC90cj4nICsKICAgICAgICAgICAg -ICAgICc8L3RhYmxlPicgKwogICAgICAgICAgICAnPC9kaXY+JyArCgogICAgICAgICAgICAnPGRp -diBzdHlsZT0iYmFja2dyb3VuZDp2YXIoLS1iZy1jYXJkKTtib3JkZXI6MXB4IHNvbGlkIHZhcigt -LWJvcmRlci1saWdodCk7Ym9yZGVyLXJhZGl1czo4cHg7cGFkZGluZzoxNnB4IDIwcHg7bWFyZ2lu -LWJvdHRvbToxNHB4OyI+JyArCiAgICAgICAgICAgICAgICAnPGgzIHN0eWxlPSJjb2xvcjp2YXIo -LS10ZXh0LWhlYWRpbmcpO2ZvbnQtc2l6ZToxNXB4O21hcmdpbi1ib3R0b206OHB4OyI+SMOkdWZp -Z2UgQW5wYXNzdW5nZW4g4oCTIFNjaHJpdHQgZsO8ciBTY2hyaXR0PC9oMz4nICsKICAgICAgICAg -ICAgICAgICc8ZGl2IHN0eWxlPSJmb250LXNpemU6MTNweDtsaW5lLWhlaWdodDoxLjc7Y29sb3I6 -dmFyKC0tdGV4dC1wcmltYXJ5KTsiPicgKwogICAgICAgICAgICAgICAgICAgICc8cCBzdHlsZT0i -Zm9udC13ZWlnaHQ6NzAwO21hcmdpbi10b3A6MTBweDtjb2xvcjp2YXIoLS10ZXh0LWhlYWRpbmcp -OyI+TG9nby9UaXRlbCBpbiBkZXIgS29wZnplaWxlIMOkbmRlcm46PC9wPicgKwogICAgICAgICAg -ICAgICAgICAgICc8cD5TdWNodCBuYWNoIOKAnkRpZ2l0YWxlcyBSZXNzb3VyY2VuLSB1bmQgSW5m -b3JtYXRpb25zcG9ydGFsIiBpbiBkZXIgaW5kZXguaHRtbC4gRGVyIFRleHQgc3RlaHQgaW0gSFRN -TC1CZXJlaWNoIGluIGVpbmVtIDxjb2RlIHN0eWxlPSJiYWNrZ3JvdW5kOnZhcigtLWJnLWNhcmQt -YWx0KTtwYWRkaW5nOjFweCA0cHg7Ym9yZGVyLXJhZGl1czoycHg7Ij4mbHQ7aGVhZGVyJmd0Ozwv -Y29kZT4tVGFnLjwvcD4nICsKCiAgICAgICAgICAgICAgICAgICAgJzxwIHN0eWxlPSJmb250LXdl -aWdodDo3MDA7bWFyZ2luLXRvcDoxMnB4O2NvbG9yOnZhcigtLXRleHQtaGVhZGluZyk7Ij5OZXVl -IEthdGVnb3JpZSBoaW56dWbDvGdlbjo8L3A+JyArCiAgICAgICAgICAgICAgICAgICAgJzxwPkdl -aHQgw7xiZXIgZGllc2VzIEdvdmVybmFuY2UtUGFuZWwgKEthdGVnb3JpZW4tU2VrdGlvbiB1bnRl -biBsaW5rcykuIEFsdGVybmF0aXY6IDxjb2RlIHN0eWxlPSJiYWNrZ3JvdW5kOnZhcigtLWJnLWNh -cmQtYWx0KTtwYWRkaW5nOjFweCA0cHg7Ym9yZGVyLXJhZGl1czoycHg7Ij5kYXRhL2NvbmZpZy5q -c29uPC9jb2RlPiDDtmZmbmVuIHVuZCBkZW4gS2F0ZWdvcmllbmFtZW4gaW4gZGllIExpc3RlIGVp -bmbDvGdlbi48L3A+JyArCgogICAgICAgICAgICAgICAgICAgICc8cCBzdHlsZT0iZm9udC13ZWln +aWdodDo2MDA7Y29sb3I6dmFyKC0tdGV4dC1oZWFkaW5nKTsiPmRhdGEvW0thdGVnb3JpZV0vKi5q +c29uPC90ZD4nICsKICAgICAgICAgICAgICAgICAgICAgICAgJzx0ZCBzdHlsZT0icGFkZGluZzo4 +cHg7Y29sb3I6dmFyKC0tdGV4dC1wcmltYXJ5KTsiPkRpZSBlaWdlbnRsaWNoZW4gRG9rdW1lbnRl +LiBKZWRlciBBcnRpa2VsIGlzdCBlaW5lIEpTT04tRGF0ZWkgaW0gS2F0ZWdvcmllLU9yZG5lci48 +L3RkPicgKwogICAgICAgICAgICAgICAgICAgICc8L3RyPicgKwogICAgICAgICAgICAgICAgICAg +ICc8dHIgc3R5bGU9ImJvcmRlci1ib3R0b206MXB4IHNvbGlkIHZhcigtLWJvcmRlci1saWdodCk7 +Ij4nICsKICAgICAgICAgICAgICAgICAgICAgICAgJzx0ZCBzdHlsZT0icGFkZGluZzo4cHg7Zm9u +dC13ZWlnaHQ6NjAwO2NvbG9yOnZhcigtLXRleHQtaGVhZGluZyk7Ij5zZXJ2ZXIucHMxPC90ZD4n +ICsKICAgICAgICAgICAgICAgICAgICAgICAgJzx0ZCBzdHlsZT0icGFkZGluZzo4cHg7Y29sb3I6 +dmFyKC0tdGV4dC1wcmltYXJ5KTsiPkRlciBTZXJ2ZXIgKFBvd2VyU2hlbGwpLiBTdGFydGV0IGF1 +dG9tYXRpc2NoIMO8YmVyIERSSVZFX1N0YXJ0LmJhdC48L3RkPicgKwogICAgICAgICAgICAgICAg +ICAgICc8L3RyPicgKwogICAgICAgICAgICAgICAgICAgICc8dHI+JyArCiAgICAgICAgICAgICAg +ICAgICAgICAgICc8dGQgc3R5bGU9InBhZGRpbmc6OHB4O2ZvbnQtd2VpZ2h0OjYwMDtjb2xvcjp2 +YXIoLS10ZXh0LWhlYWRpbmcpOyI+RFJJVkVfU3RhcnQuYmF0PC90ZD4nICsKICAgICAgICAgICAg +ICAgICAgICAgICAgJzx0ZCBzdHlsZT0icGFkZGluZzo4cHg7Y29sb3I6dmFyKC0tdGV4dC1wcmlt +YXJ5KTsiPkRvcHBlbGtsaWNrIHp1bSBTdGFydGVuLiDDlmZmbmV0IGRlbiBTZXJ2ZXIgdW5kIGRl +biBCcm93c2VyLjwvdGQ+JyArCiAgICAgICAgICAgICAgICAgICAgJzwvdHI+JyArCiAgICAgICAg +ICAgICAgICAnPC90YWJsZT4nICsKICAgICAgICAgICAgJzwvZGl2PicgKwoKICAgICAgICAgICAg +JzxkaXYgc3R5bGU9ImJhY2tncm91bmQ6dmFyKC0tYmctY2FyZCk7Ym9yZGVyOjFweCBzb2xpZCB2 +YXIoLS1ib3JkZXItbGlnaHQpO2JvcmRlci1yYWRpdXM6OHB4O3BhZGRpbmc6MTZweCAyMHB4O21h +cmdpbi1ib3R0b206MTRweDsiPicgKwogICAgICAgICAgICAgICAgJzxoMyBzdHlsZT0iY29sb3I6 +dmFyKC0tdGV4dC1oZWFkaW5nKTtmb250LXNpemU6MTVweDttYXJnaW4tYm90dG9tOjhweDsiPkjD +pHVmaWdlIEFucGFzc3VuZ2VuIOKAkyBTY2hyaXR0IGbDvHIgU2Nocml0dDwvaDM+JyArCiAgICAg +ICAgICAgICAgICAnPGRpdiBzdHlsZT0iZm9udC1zaXplOjEzcHg7bGluZS1oZWlnaHQ6MS43O2Nv +bG9yOnZhcigtLXRleHQtcHJpbWFyeSk7Ij4nICsKICAgICAgICAgICAgICAgICAgICAnPHAgc3R5 +bGU9ImZvbnQtd2VpZ2h0OjcwMDttYXJnaW4tdG9wOjEwcHg7Y29sb3I6dmFyKC0tdGV4dC1oZWFk +aW5nKTsiPkxvZ28vVGl0ZWwgaW4gZGVyIEtvcGZ6ZWlsZSDDpG5kZXJuOjwvcD4nICsKICAgICAg +ICAgICAgICAgICAgICAnPHA+U3VjaHQgbmFjaCDigJ5EaWdpdGFsZXMgUmVzc291cmNlbi0gdW5k +IEluZm9ybWF0aW9uc3BvcnRhbCIgaW4gZGVyIGluZGV4Lmh0bWwuIERlciBUZXh0IHN0ZWh0IGlt +IEhUTUwtQmVyZWljaCBpbiBlaW5lbSA8Y29kZSBzdHlsZT0iYmFja2dyb3VuZDp2YXIoLS1iZy1j +YXJkLWFsdCk7cGFkZGluZzoxcHggNHB4O2JvcmRlci1yYWRpdXM6MnB4OyI+Jmx0O2hlYWRlciZn +dDs8L2NvZGU+LVRhZy48L3A+JyArCgogICAgICAgICAgICAgICAgICAgICc8cCBzdHlsZT0iZm9u +dC13ZWlnaHQ6NzAwO21hcmdpbi10b3A6MTJweDtjb2xvcjp2YXIoLS10ZXh0LWhlYWRpbmcpOyI+ +TmV1ZSBLYXRlZ29yaWUgaGluenVmw7xnZW46PC9wPicgKwogICAgICAgICAgICAgICAgICAgICc8 +cD5HZWh0IMO8YmVyIGRpZXNlcyBHb3Zlcm5hbmNlLVBhbmVsIChLYXRlZ29yaWVuLVNla3Rpb24g +dW50ZW4gbGlua3MpLiBBbHRlcm5hdGl2OiA8Y29kZSBzdHlsZT0iYmFja2dyb3VuZDp2YXIoLS1i +Zy1jYXJkLWFsdCk7cGFkZGluZzoxcHggNHB4O2JvcmRlci1yYWRpdXM6MnB4OyI+ZGF0YS9jb25m +aWcuanNvbjwvY29kZT4gw7ZmZm5lbiB1bmQgZGVuIEthdGVnb3JpZW5hbWVuIGluIGRpZSBMaXN0 +ZSBlaW5mw7xnZW4uPC9wPicgKwoKICAgICAgICAgICAgICAgICAgICAnPHAgc3R5bGU9ImZvbnQt +d2VpZ2h0OjcwMDttYXJnaW4tdG9wOjEycHg7Y29sb3I6dmFyKC0tdGV4dC1oZWFkaW5nKTsiPlNj +aHJpZnRhcnQgw6RuZGVybjo8L3A+JyArCiAgICAgICAgICAgICAgICAgICAgJzxwPlN1Y2h0IG5h +Y2ggPGNvZGUgc3R5bGU9ImJhY2tncm91bmQ6dmFyKC0tYmctY2FyZC1hbHQpO3BhZGRpbmc6MXB4 +IDRweDtib3JkZXItcmFkaXVzOjJweDsiPmZvbnQtZmFtaWx5PC9jb2RlPiBpbiBkZXIgaW5kZXgu +aHRtbC4gRGllIEhhdXB0c2NocmlmdGFydCBzdGVodCBiZWltIDxjb2RlIHN0eWxlPSJiYWNrZ3Jv +dW5kOnZhcigtLWJnLWNhcmQtYWx0KTtwYWRkaW5nOjFweCA0cHg7Ym9yZGVyLXJhZGl1czoycHg7 +Ij5ib2R5PC9jb2RlPi1FbGVtZW50LiAnICsKICAgICAgICAgICAgICAgICAgICAnRGEgZGFzIFN5 +c3RlbSBvZmZsaW5lIGzDpHVmdCwgZnVua3Rpb25pZXJlbiBudXIgU2NocmlmdGFydGVuLCBkaWUg +YXVmIGRlbSBSZWNobmVyIGluc3RhbGxpZXJ0IHNpbmQgKHouQi4gQXJpYWwsIFNlZ29lIFVJLCBD +YWxpYnJpKS48L3A+JyArCgogICAgICAgICAgICAgICAgICAgICc8cCBzdHlsZT0iZm9udC13ZWln aHQ6NzAwO21hcmdpbi10b3A6MTJweDtjb2xvcjp2YXIoLS10ZXh0LWhlYWRpbmcpOyI+U2Nocmlm -dGFydCDDpG5kZXJuOjwvcD4nICsKICAgICAgICAgICAgICAgICAgICAnPHA+U3VjaHQgbmFjaCA8 -Y29kZSBzdHlsZT0iYmFja2dyb3VuZDp2YXIoLS1iZy1jYXJkLWFsdCk7cGFkZGluZzoxcHggNHB4 -O2JvcmRlci1yYWRpdXM6MnB4OyI+Zm9udC1mYW1pbHk8L2NvZGU+IGluIGRlciBpbmRleC5odG1s -LiBEaWUgSGF1cHRzY2hyaWZ0YXJ0IHN0ZWh0IGJlaW0gPGNvZGUgc3R5bGU9ImJhY2tncm91bmQ6 -dmFyKC0tYmctY2FyZC1hbHQpO3BhZGRpbmc6MXB4IDRweDtib3JkZXItcmFkaXVzOjJweDsiPmJv -ZHk8L2NvZGU+LUVsZW1lbnQuICcgKwogICAgICAgICAgICAgICAgICAgICdEYSBkYXMgU3lzdGVt -IG9mZmxpbmUgbMOkdWZ0LCBmdW5rdGlvbmllcmVuIG51ciBTY2hyaWZ0YXJ0ZW4sIGRpZSBhdWYg -ZGVtIFJlY2huZXIgaW5zdGFsbGllcnQgc2luZCAoei5CLiBBcmlhbCwgU2Vnb2UgVUksIENhbGli -cmkpLjwvcD4nICsKCiAgICAgICAgICAgICAgICAgICAgJzxwIHN0eWxlPSJmb250LXdlaWdodDo3 -MDA7bWFyZ2luLXRvcDoxMnB4O2NvbG9yOnZhcigtLXRleHQtaGVhZGluZyk7Ij5TY2hyaWZ0Z3LD -tsOfZSDDpG5kZXJuOjwvcD4nICsKICAgICAgICAgICAgICAgICAgICAnPHA+U3VjaHQgbmFjaCA8 -Y29kZSBzdHlsZT0iYmFja2dyb3VuZDp2YXIoLS1iZy1jYXJkLWFsdCk7cGFkZGluZzoxcHggNHB4 -O2JvcmRlci1yYWRpdXM6MnB4OyI+Zm9udC1zaXplPC9jb2RlPiBpbSBDU1MtQmVyZWljaC4gV2Vy -dGUgd2llIDxjb2RlIHN0eWxlPSJiYWNrZ3JvdW5kOnZhcigtLWJnLWNhcmQtYWx0KTtwYWRkaW5n -OjFweCA0cHg7Ym9yZGVyLXJhZGl1czoycHg7Ij4xNHB4PC9jb2RlPiBvZGVyIDxjb2RlIHN0eWxl -PSJiYWNrZ3JvdW5kOnZhcigtLWJnLWNhcmQtYWx0KTtwYWRkaW5nOjFweCA0cHg7Ym9yZGVyLXJh -ZGl1czoycHg7Ij4xNnB4PC9jb2RlPiBiZXN0aW1tZW4gZGllIEdyw7bDn2UuIEdyw7bDn2VyZSBa -YWhsID0gZ3LDtsOfZXJlIFNjaHJpZnQuPC9wPicgKwoKICAgICAgICAgICAgICAgICAgICAnPHAg -c3R5bGU9ImZvbnQtd2VpZ2h0OjcwMDttYXJnaW4tdG9wOjEycHg7Y29sb3I6dmFyKC0tdGV4dC1o -ZWFkaW5nKTsiPlZvcmhhbmRlbmUgU2NobGFnd8O2cnRlciBhbnBhc3Nlbjo8L3A+JyArCiAgICAg -ICAgICAgICAgICAgICAgJzxwPlN1Y2h0IG5hY2ggPGNvZGUgc3R5bGU9ImJhY2tncm91bmQ6dmFy -KC0tYmctY2FyZC1hbHQpO3BhZGRpbmc6MXB4IDRweDtib3JkZXItcmFkaXVzOjJweDsiPlBSRURF -RklORURfS0VZV09SRFM8L2NvZGU+IGluIGRlciBpbmRleC5odG1sIChpbSBKYXZhU2NyaXB0LUJl -cmVpY2gpLiBEb3J0IHN0ZWh0IGRpZSBMaXN0ZSBkZXIgdm9yZGVmaW5pZXJ0ZW4gU2NobGFnd8O2 -cnRlci4gJyArCiAgICAgICAgICAgICAgICAgICAgJ0Jlc3RlaGVuZGUgU2NobGFnd8O2cnRlciBr -w7ZubnQgaWhyIGF1Y2ggYmVxdWVtIMO8YmVyIOKAnlNjaGxhZ3fDtnJ0ZXIgdmVyd2FsdGVuIiBv -YmVuIGluIGRpZXNlbSBQYW5lbCB1bWJlbmVubmVuIG9kZXIgbMO2c2NoZW4uPC9wPicgKwogICAg -ICAgICAgICAgICAgJzwvZGl2PicgKwogICAgICAgICAgICAnPC9kaXY+JyArCgogICAgICAgICAg -ICAnPGRpdiBzdHlsZT0iYmFja2dyb3VuZDojZmZmM2NkO2JvcmRlcjoxcHggc29saWQgI2ZmYzEw -Nztib3JkZXItcmFkaXVzOjhweDtwYWRkaW5nOjE2cHggMjBweDttYXJnaW4tYm90dG9tOjE0cHg7 -Y29sb3I6IzY2NGQwMzsiPicgKwogICAgICAgICAgICAgICAgJzxoMyBzdHlsZT0iZm9udC1zaXpl -OjE1cHg7bWFyZ2luLWJvdHRvbTo4cHg7Ij5XaWNodGlnZSBSZWdlbG48L2gzPicgKwogICAgICAg -ICAgICAgICAgJzx1bCBzdHlsZT0iZm9udC1zaXplOjEzcHg7bGluZS1oZWlnaHQ6MjtwYWRkaW5n -LWxlZnQ6MjBweDsiPicgKwogICAgICAgICAgICAgICAgICAgICc8bGk+PHN0cm9uZz5JbW1lciBl -aW5lIFNpY2hlcnVuZ3Nrb3BpZSBtYWNoZW48L3N0cm9uZz4gYmV2b3IgaWhyIGV0d2FzIMOkbmRl -cnQhIEtvcGllcnQgZGllIGluZGV4Lmh0bWwgdm9yaGVyIHouQi4gYWxzIGluZGV4X2JhY2t1cC5o -dG1sLjwvbGk+JyArCiAgICAgICAgICAgICAgICAgICAgJzxsaT48c3Ryb25nPk51ciBlaW5lIFNh -Y2hlIGF1ZiBlaW5tYWwgw6RuZGVybjwvc3Ryb25nPiwgZGFubiB0ZXN0ZW4uIFNvIGZpbmRldCBp -aHIgRmVobGVyIHNvZm9ydC48L2xpPicgKwogICAgICAgICAgICAgICAgICAgICc8bGk+PHN0cm9u -Zz5BbmbDvGhydW5nc3plaWNoZW4gdW5kIEtsYW1tZXJuPC9zdHJvbmc+IG3DvHNzZW4gaW1tZXIg -cGFhcndlaXNlIHZvcmtvbW1lbi4gRmVobHQgZWlucywgZ2VodCBkaWUgU2VpdGUga2FwdXR0Ljwv -bGk+JyArCiAgICAgICAgICAgICAgICAgICAgJzxsaT48c3Ryb25nPkZhcmItQ29kZXM8L3N0cm9u -Zz4gYmVnaW5uZW4gaW1tZXIgbWl0ICMgdW5kIGhhYmVuIDMgb2RlciA2IFplaWNoZW4gZGFoaW50 -ZXIgKHouQi4gI2ZmZiBvZGVyICMyRTRBNjIpLjwvbGk+JyArCiAgICAgICAgICAgICAgICAgICAg -JzxsaT5JbSBad2VpZmVsOiA8c3Ryb25nPkJhY2t1cCB6dXLDvGNra29waWVyZW48L3N0cm9uZz4g -dW5kIG5vY2htYWwgdm9uIHZvcm5lLjwvbGk+JyArCiAgICAgICAgICAgICAgICAnPC91bD4nICsK -ICAgICAgICAgICAgJzwvZGl2PicgKwoKICAgICAgICAgICAgJzxkaXYgc3R5bGU9ImJhY2tncm91 -bmQ6dmFyKC0tYmctY2FyZCk7Ym9yZGVyOjFweCBzb2xpZCB2YXIoLS1ib3JkZXItbGlnaHQpO2Jv -cmRlci1yYWRpdXM6OHB4O3BhZGRpbmc6MTZweCAyMHB4O21hcmdpbi1ib3R0b206MTRweDsiPicg -KwogICAgICAgICAgICAgICAgJzxoMyBzdHlsZT0iY29sb3I6dmFyKC0tdGV4dC1oZWFkaW5nKTtm -b250LXNpemU6MTVweDttYXJnaW4tYm90dG9tOjhweDsiPkZlaGxlciBnZW1hY2h0PyBLZWluIFBy -b2JsZW0hPC9oMz4nICsKICAgICAgICAgICAgICAgICc8cCBzdHlsZT0iZm9udC1zaXplOjEzcHg7 -bGluZS1oZWlnaHQ6MS43O2NvbG9yOnZhcigtLXRleHQtcHJpbWFyeSk7Ij4nICsKICAgICAgICAg -ICAgICAgICAgICAnV2VubiBuYWNoIGVpbmVyIMOEbmRlcnVuZyBkaWUgU2VpdGUgbmljaHQgbWVo -ciBmdW5rdGlvbmllcnQ6JyArCiAgICAgICAgICAgICAgICAnPC9wPicgKwogICAgICAgICAgICAg -ICAgJzxvbCBzdHlsZT0iZm9udC1zaXplOjEzcHg7bGluZS1oZWlnaHQ6Mjtjb2xvcjp2YXIoLS10 -ZXh0LXByaW1hcnkpO3BhZGRpbmctbGVmdDoyMHB4OyI+JyArCiAgICAgICAgICAgICAgICAgICAg -JzxsaT5Ccm93c2VyLVRhYiBzY2hsaWXDn2VuIChkZXIgU2VydmVyIGJlZW5kZXQgc2ljaCBhdXRv -bWF0aXNjaCBuYWNoIDIwIFNla3VuZGVuKTwvbGk+JyArCiAgICAgICAgICAgICAgICAgICAgJzxs -aT5FdXJlIFNpY2hlcnVuZ3Nrb3BpZSAoei5CLiBpbmRleF9iYWNrdXAuaHRtbCkgd2llZGVyIGFs -cyA8Y29kZSBzdHlsZT0iYmFja2dyb3VuZDp2YXIoLS1iZy1jYXJkLWFsdCk7cGFkZGluZzoxcHgg -NHB4O2JvcmRlci1yYWRpdXM6MnB4OyI+aW5kZXguaHRtbDwvY29kZT4gdW1iZW5lbm5lbjwvbGk+ -JyArCiAgICAgICAgICAgICAgICAgICAgJzxsaT5EUklWRV9TdGFydC5iYXQgZG9wcGVsa2xpY2tl -biDigJMgZmVydGlnLCBhbGxlcyB3aWVkZXIgd2llIHZvcmhlcjwvbGk+JyArCiAgICAgICAgICAg -ICAgICAnPC9vbD4nICsKICAgICAgICAgICAgICAgICc8cCBzdHlsZT0iZm9udC1zaXplOjEzcHg7 -bGluZS1oZWlnaHQ6MS43O2NvbG9yOnZhcigtLXRleHQtcHJpbWFyeSk7bWFyZ2luLXRvcDo2cHg7 -Ij4nICsKICAgICAgICAgICAgICAgICAgICAnPHN0cm9uZz5FdXJlIEFydGlrZWwtRGF0ZW4gc2lu -ZCBzaWNoZXIhPC9zdHJvbmc+IERpZSBsaWVnZW4gaW0gPGNvZGUgc3R5bGU9ImJhY2tncm91bmQ6 -dmFyKC0tYmctY2FyZC1hbHQpO3BhZGRpbmc6MXB4IDRweDtib3JkZXItcmFkaXVzOjJweDsiPmRh -dGEvPC9jb2RlPi1PcmRuZXIgdW5kIHdlcmRlbiBkdXJjaCDDhG5kZXJ1bmdlbiBhbiBkZXIgaW5k -ZXguaHRtbCBuaWNodCB2ZXLDpG5kZXJ0LicgKwogICAgICAgICAgICAgICAgJzwvcD4nICsKICAg -ICAgICAgICAgJzwvZGl2PicgKwoKICAgICAgICAnPC9kaXY+JzsKICAgIH0sCgogICAgLy8gPT09 -IEltcG9ydCAvIEV4cG9ydCA9PT0KICAgIHNob3dJbXBvcnRFeHBvcnQoKSB7CiAgICAgICAgdmFy -IGJvZHkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZ292QWRtaW5Cb2R5Jyk7CiAgICAgICAg -dmFyIGRvY3MgPSBEcml2ZUZTLmRvY3VtZW50czsKICAgICAgICB2YXIga2F0ZWdvcmllbiA9IERy -aXZlRlMuY29uZmlnLmthdGVnb3JpZW4gfHwgW107CgogICAgICAgIHZhciBodG1sID0gJzxkaXYg -c3R5bGU9Im1heC13aWR0aDo4MDBweDttYXJnaW46MCBhdXRvOyI+JyArCiAgICAgICAgICAgICc8 -aDIgc3R5bGU9ImNvbG9yOnZhcigtLXRleHQtaGVhZGluZyk7bWFyZ2luLWJvdHRvbToxNnB4OyI+ -SW1wb3J0IC8gRXhwb3J0PC9oMj4nOwoKICAgICAgICAvLyA9PT0gRVhQT1JUID09PQogICAgICAg -IGh0bWwgKz0gJzxkaXYgY2xhc3M9Imdvdi1zZWN0aW9uIj4nICsKICAgICAgICAgICAgJzxkaXYg -Y2xhc3M9Imdvdi1zZWN0aW9uLXRpdGxlIj5FeHBvcnQ8L2Rpdj4nICsKICAgICAgICAgICAgJzxw -IHN0eWxlPSJmb250LXNpemU6MTJweDtjb2xvcjp2YXIoLS10ZXh0LW11dGVkKTttYXJnaW4tYm90 -dG9tOjEwcHg7Ij5Xw6RobGUgS2F0ZWdvcmllbiBvZGVyIGVpbnplbG5lIEFydGlrZWwgYXVzLiBE -aWUgTWVkaWVuLVZlcmxpbmt1bmdlbiBibGVpYmVuIGluIGRlciBFeHBvcnQtRGF0ZWkgZXJoYWx0 -ZW4uIERlbiA8Y29kZSBzdHlsZT0iYmFja2dyb3VuZDp2YXIoLS1iZy1jYXJkLWFsdCk7cGFkZGlu -ZzoxcHggNHB4O2JvcmRlci1yYWRpdXM6MnB4OyI+bWVkaWEvPC9jb2RlPi1PcmRuZXIgYml0dGUg -bWFudWVsbCBtaXRrb3BpZXJlbi48L3A+JyArCgogICAgICAgICAgICAvLyBLYXRlZ29yaWUtRmls -dGVyCiAgICAgICAgICAgICc8ZGl2IHN0eWxlPSJtYXJnaW4tYm90dG9tOjhweDsiPicgKwogICAg -ICAgICAgICAgICAgJzxsYWJlbCBzdHlsZT0iZm9udC1zaXplOjExcHg7Zm9udC13ZWlnaHQ6NjAw -O2NvbG9yOnZhcigtLXRleHQtc2Vjb25kYXJ5KTtkaXNwbGF5OmJsb2NrO21hcmdpbi1ib3R0b206 -NHB4OyI+S2F0ZWdvcmllbjwvbGFiZWw+JyArCiAgICAgICAgICAgICAgICAnPGRpdiBzdHlsZT0i -ZGlzcGxheTpmbGV4O2dhcDo0cHg7ZmxleC13cmFwOndyYXA7IiBpZD0iZXhwb3J0Q2F0RmlsdGVy -Ij4nOwogICAgICAgIGthdGVnb3JpZW4uZm9yRWFjaChmdW5jdGlvbihrYXQpIHsKICAgICAgICAg -ICAgdmFyIGNvdW50ID0gZG9jcy5maWx0ZXIoZnVuY3Rpb24oZCkgeyByZXR1cm4gZC5rYXRlZ29y -aWUgPT09IGthdDsgfSkubGVuZ3RoOwogICAgICAgICAgICBpZiAoY291bnQgPT09IDApIHJldHVy -bjsKICAgICAgICAgICAgaHRtbCArPSAnPGxhYmVsIGNsYXNzPSJnb3Yta3ctcGlsbCIgc3R5bGU9 -ImN1cnNvcjpwb2ludGVyOyI+PGlucHV0IHR5cGU9ImNoZWNrYm94IiBjbGFzcz0iZXhwb3J0LWNh -dC1jYiIgdmFsdWU9IicgKyBEcml2ZVBvcnRhbC5lc2NhcGVBdHRyKGthdCkgKyAnIiBjaGVja2Vk -IHN0eWxlPSJtYXJnaW4tcmlnaHQ6NHB4OyIgb25jaGFuZ2U9IkRyaXZlR292ZXJuYW5jZS5fZXhw -b3J0RmlsdGVyQnlDYXRlZ29yeSgpIj4gJyArIERyaXZlUG9ydGFsLmVzY2FwZUhUTUwoa2F0KSAr -ICcgPHNwYW4gY2xhc3M9Imt3LWNvdW50Ij4oJyArIGNvdW50ICsgJyk8L3NwYW4+PC9sYWJlbD4n -OwogICAgICAgIH0pOwogICAgICAgIGh0bWwgKz0gJzwvZGl2PjwvZGl2PicgKwoKICAgICAgICAg -ICAgLy8gQnV0dG9ucwogICAgICAgICAgICAnPGRpdiBzdHlsZT0ibWFyZ2luLWJvdHRvbTo4cHg7 -ZGlzcGxheTpmbGV4O2dhcDo4cHg7Ij4nICsKICAgICAgICAgICAgICAgICc8YnV0dG9uIGNsYXNz -PSJnb3YtYWRkLWJ0biIgc3R5bGU9InBhZGRpbmc6NHB4IDEycHg7Zm9udC1zaXplOjEycHg7IiBv -bmNsaWNrPSJEcml2ZUdvdmVybmFuY2UuX2V4cG9ydFNlbGVjdEFsbCh0cnVlKSI+QWxsZSBBcnRp -a2VsPC9idXR0b24+JyArCiAgICAgICAgICAgICAgICAnPGJ1dHRvbiBjbGFzcz0iZ292LWFkZC1i -dG4iIHN0eWxlPSJwYWRkaW5nOjRweCAxMnB4O2ZvbnQtc2l6ZToxMnB4OyIgb25jbGljaz0iRHJp -dmVHb3Zlcm5hbmNlLl9leHBvcnRTZWxlY3RBbGwoZmFsc2UpIj5LZWluZSBBcnRpa2VsPC9idXR0 -b24+JyArCiAgICAgICAgICAgICc8L2Rpdj4nICsKCiAgICAgICAgICAgIC8vIEFydGlrZWxsaXN0 -ZQogICAgICAgICAgICAnPGRpdiBzdHlsZT0ibWF4LWhlaWdodDoyMjBweDtvdmVyZmxvdy15OmF1 -dG87Ym9yZGVyOjFweCBzb2xpZCB2YXIoLS1ib3JkZXItbGlnaHQpO2JvcmRlci1yYWRpdXM6NHB4 -O3BhZGRpbmc6NHB4OyIgaWQ9ImV4cG9ydERvY0xpc3QiPic7CgogICAgICAgIGRvY3MuZm9yRWFj -aChmdW5jdGlvbihkb2MpIHsKICAgICAgICAgICAgdmFyIGhhc01lZGlhID0gZG9jLm1lZGlhcyAm -JiBkb2MubWVkaWFzLmxlbmd0aCA+IDA7CiAgICAgICAgICAgIGh0bWwgKz0gJzxsYWJlbCBjbGFz -cz0iZXhwb3J0LWRvYy1yb3ciIGRhdGEta2F0ZWdvcmllPSInICsgRHJpdmVQb3J0YWwuZXNjYXBl -QXR0cihkb2Mua2F0ZWdvcmllKSArICciIHN0eWxlPSJkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6 -Y2VudGVyO2dhcDo4cHg7cGFkZGluZzo2cHggOHB4O2N1cnNvcjpwb2ludGVyO2JvcmRlci1ib3R0 -b206MXB4IHNvbGlkIHZhcigtLWJvcmRlci1saWdodCk7Zm9udC1zaXplOjEzcHg7Ij4nICsKICAg -ICAgICAgICAgICAgICc8aW5wdXQgdHlwZT0iY2hlY2tib3giIGNsYXNzPSJleHBvcnQtZG9jLWNi -IiB2YWx1ZT0iJyArIERyaXZlUG9ydGFsLmVzY2FwZUF0dHIoZG9jLmlkKSArICciIGNoZWNrZWQ+ -JyArCiAgICAgICAgICAgICAgICAnPHNwYW4gc3R5bGU9ImZsZXg6MTtjb2xvcjp2YXIoLS10ZXh0 -LXByaW1hcnkpOyI+JyArIERyaXZlUG9ydGFsLmVzY2FwZUhUTUwoZG9jLnRpdGVsKSArICc8L3Nw -YW4+JyArCiAgICAgICAgICAgICAgICAnPHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMXB4O2NvbG9y -OnZhcigtLXRleHQtbXV0ZWQpOyI+JyArIERyaXZlUG9ydGFsLmVzY2FwZUhUTUwoZG9jLmthdGVn -b3JpZSkgKyAnPC9zcGFuPicgKwogICAgICAgICAgICAgICAgKGhhc01lZGlhID8gJzxzcGFuIHN0 -eWxlPSJmb250LXNpemU6MTBweDtjb2xvcjp2YXIoLS10ZXh0LWhlYWRpbmcpOyI+JyArIGRvYy5t -ZWRpYXMubGVuZ3RoICsgJyBNZWRpZW48L3NwYW4+JyA6ICcnKSArCiAgICAgICAgICAgICc8L2xh -YmVsPic7CiAgICAgICAgfSk7CgogICAgICAgIGh0bWwgKz0gJzwvZGl2PicgKwogICAgICAgICAg -ICAnPGRpdiBzdHlsZT0ibWFyZ2luLXRvcDoxMHB4O2Rpc3BsYXk6ZmxleDtnYXA6OHB4O2FsaWdu -LWl0ZW1zOmNlbnRlcjsiPicgKwogICAgICAgICAgICAgICAgJzxsYWJlbCBzdHlsZT0iZm9udC1z -aXplOjEzcHg7Y29sb3I6dmFyKC0tdGV4dC1wcmltYXJ5KTtkaXNwbGF5OmZsZXg7YWxpZ24taXRl -bXM6Y2VudGVyO2dhcDo2cHg7Y3Vyc29yOnBvaW50ZXI7IiB0aXRsZT0iTWVkaWVuLVZlcmxpbmt1 -bmdlbiBpbiBkZXIgRXhwb3J0LURhdGVpIGJlaWJlaGFsdGVuIj4nICsKICAgICAgICAgICAgICAg -ICAgICAnPGlucHV0IHR5cGU9ImNoZWNrYm94IiBpZD0iZXhwb3J0SW5jbHVkZU1lZGlhIiBjaGVj -a2VkPiBNZWRpZW4tVmVybGlua3VuZ2VuIGJlaWJlaGFsdGVuJyArCiAgICAgICAgICAgICAgICAn -PC9sYWJlbD4nICsKICAgICAgICAgICAgICAgICc8c3BhbiBzdHlsZT0iZmxleDoxOyI+PC9zcGFu -PicgKwogICAgICAgICAgICAgICAgJzxidXR0b24gY2xhc3M9Imdvdi1hZGQtYnRuIiBzdHlsZT0i -cGFkZGluZzo4cHggMjBweDsiIG9uY2xpY2s9IkRyaXZlR292ZXJuYW5jZS5fZG9FeHBvcnQoKSI+ -RXhwb3J0aWVyZW48L2J1dHRvbj4nICsKICAgICAgICAgICAgJzwvZGl2PicgKwogICAgICAgICc8 -L2Rpdj4nOwoKICAgICAgICAvLyA9PT0gSU1QT1JUID09PQogICAgICAgIGh0bWwgKz0gJzxkaXYg -Y2xhc3M9Imdvdi1zZWN0aW9uIj4nICsKICAgICAgICAgICAgJzxkaXYgY2xhc3M9Imdvdi1zZWN0 -aW9uLXRpdGxlIj5JbXBvcnQ8L2Rpdj4nICsKICAgICAgICAgICAgJzxwIHN0eWxlPSJmb250LXNp -emU6MTJweDtjb2xvcjp2YXIoLS10ZXh0LW11dGVkKTttYXJnaW4tYm90dG9tOjEwcHg7Ij5JbXBv -cnRpZXJlIGVpbmUgenV2b3IgZXhwb3J0aWVydGUgSlNPTi1EYXRlaS4gQXJ0aWtlbCB3ZXJkZW4g -YXV0b21hdGlzY2ggaW4gZGllIGVudHNwcmVjaGVuZGVuIEthdGVnb3JpZW4gZWluc29ydGllcnQu -IE5ldWUgS2F0ZWdvcmllbiB3ZXJkZW4gYmVpIEJlZGFyZiBhbmdlbGVndC48L3A+JyArCiAgICAg -ICAgICAgICc8ZGl2IHN0eWxlPSJkaXNwbGF5OmZsZXg7ZmxleC1kaXJlY3Rpb246Y29sdW1uO2dh -cDo4cHg7Ij4nICsKICAgICAgICAgICAgICAgICc8ZGl2PicgKwogICAgICAgICAgICAgICAgICAg -ICc8bGFiZWwgc3R5bGU9ImZvbnQtc2l6ZToxMnB4O2ZvbnQtd2VpZ2h0OjYwMDtjb2xvcjp2YXIo -LS10ZXh0LXNlY29uZGFyeSk7ZGlzcGxheTpibG9jazttYXJnaW4tYm90dG9tOjRweDsiPkV4cG9y -dC1EYXRlaSAoSlNPTik8L2xhYmVsPicgKwogICAgICAgICAgICAgICAgICAgICc8aW5wdXQgdHlw -ZT0iZmlsZSIgaWQ9ImltcG9ydEpzb25GaWxlIiBhY2NlcHQ9Ii5qc29uIiBzdHlsZT0iZm9udC1z -aXplOjEzcHg7Y29sb3I6dmFyKC0tdGV4dC1wcmltYXJ5KTsiPicgKwogICAgICAgICAgICAgICAg -JzwvZGl2PicgKwogICAgICAgICAgICAgICAgJzxwIHN0eWxlPSJmb250LXNpemU6MTFweDtjb2xv -cjp2YXIoLS10ZXh0LW11dGVkKTtsaW5lLWhlaWdodDoxLjU7bWFyZ2luLXRvcDo0cHg7Ij5GYWxs -cyBkaWUgRXhwb3J0LURhdGVpIE1lZGllbi1WZXJsaW5rdW5nZW4gZW50aMOkbHQsIGtvcGllcmUg -ZGVuIDxjb2RlIHN0eWxlPSJiYWNrZ3JvdW5kOnZhcigtLWJnLWNhcmQtYWx0KTtwYWRkaW5nOjFw -eCA0cHg7Ym9yZGVyLXJhZGl1czoycHg7Ij5tZWRpYS88L2NvZGU+LU9yZG5lciBkZXIgUXVlbGxl -IGluIGRhcyBaaWVsdmVyemVpY2huaXMsIGRhbWl0IGRpZSBBbmjDpG5nZSB2ZXJmw7xnYmFyIHNp -bmQuPC9wPicgKwogICAgICAgICAgICAgICAgJzxkaXYgc3R5bGU9Im1hcmdpbi10b3A6NnB4OyI+ -JyArCiAgICAgICAgICAgICAgICAgICAgJzxidXR0b24gY2xhc3M9Imdvdi1hZGQtYnRuIiBzdHls -ZT0icGFkZGluZzo4cHggMjBweDsiIG9uY2xpY2s9IkRyaXZlR292ZXJuYW5jZS5fZG9JbXBvcnQo -KSI+SW1wb3J0aWVyZW48L2J1dHRvbj4nICsKICAgICAgICAgICAgICAgICc8L2Rpdj4nICsKICAg -ICAgICAgICAgJzwvZGl2PicgKwogICAgICAgICc8L2Rpdj4nOwoKICAgICAgICBodG1sICs9ICc8 -L2Rpdj4nOwogICAgICAgIGJvZHkuaW5uZXJIVE1MID0gaHRtbDsKICAgIH0sCgogICAgX2V4cG9y -dFNlbGVjdEFsbChjaGVja2VkKSB7CiAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgn -LmV4cG9ydC1kb2MtY2I6bm90KDpkaXNhYmxlZCknKS5mb3JFYWNoKGZ1bmN0aW9uKGNiKSB7IGNi -LmNoZWNrZWQgPSBjaGVja2VkOyB9KTsKICAgIH0sCgogICAgX2V4cG9ydEZpbHRlckJ5Q2F0ZWdv -cnkoKSB7CiAgICAgICAgdmFyIHNlbGVjdGVkQ2F0cyA9IFtdOwogICAgICAgIGRvY3VtZW50LnF1 -ZXJ5U2VsZWN0b3JBbGwoJy5leHBvcnQtY2F0LWNiOmNoZWNrZWQnKS5mb3JFYWNoKGZ1bmN0aW9u -KGNiKSB7IHNlbGVjdGVkQ2F0cy5wdXNoKGNiLnZhbHVlKTsgfSk7CiAgICAgICAgZG9jdW1lbnQu -cXVlcnlTZWxlY3RvckFsbCgnLmV4cG9ydC1kb2Mtcm93JykuZm9yRWFjaChmdW5jdGlvbihyb3cp -IHsKICAgICAgICAgICAgdmFyIGthdCA9IHJvdy5nZXRBdHRyaWJ1dGUoJ2RhdGEta2F0ZWdvcmll -Jyk7CiAgICAgICAgICAgIHZhciBjYiA9IHJvdy5xdWVyeVNlbGVjdG9yKCcuZXhwb3J0LWRvYy1j -YicpOwogICAgICAgICAgICBpZiAoc2VsZWN0ZWRDYXRzLmluY2x1ZGVzKGthdCkpIHsKICAgICAg -ICAgICAgICAgIHJvdy5zdHlsZS5kaXNwbGF5ID0gJyc7CiAgICAgICAgICAgICAgICBjYi5kaXNh -YmxlZCA9IGZhbHNlOwogICAgICAgICAgICAgICAgY2IuY2hlY2tlZCA9IHRydWU7CiAgICAgICAg -ICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICByb3cuc3R5bGUuZGlzcGxheSA9ICdub25lJzsK -ICAgICAgICAgICAgICAgIGNiLmRpc2FibGVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgIGNiLmNo -ZWNrZWQgPSBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgIH0pOwogICAgfSwKCiAgICBhc3lu -YyBfZG9FeHBvcnQoKSB7CiAgICAgICAgdmFyIHNlbGVjdGVkSWRzID0gW107CiAgICAgICAgZG9j -dW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmV4cG9ydC1kb2MtY2I6Y2hlY2tlZCcpLmZvckVhY2go -ZnVuY3Rpb24oY2IpIHsgc2VsZWN0ZWRJZHMucHVzaChjYi52YWx1ZSk7IH0pOwogICAgICAgIGlm -IChzZWxlY3RlZElkcy5sZW5ndGggPT09IDApIHsgc2hvd1RvYXN0KCdCaXR0ZSBtaW5kZXN0ZW5z -IGVpbmVuIEFydGlrZWwgYXVzd8OkaGxlbicsICd3YXJuaW5nJyk7IHJldHVybjsgfQoKICAgICAg -ICB2YXIgaW5jbHVkZU1lZGlhID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2V4cG9ydEluY2x1 -ZGVNZWRpYScpLmNoZWNrZWQ7CiAgICAgICAgdmFyIGV4cG9ydERvY3MgPSBEcml2ZUZTLmRvY3Vt -ZW50cy5maWx0ZXIoZnVuY3Rpb24oZCkgeyByZXR1cm4gc2VsZWN0ZWRJZHMuaW5jbHVkZXMoZC5p -ZCk7IH0pOwoKICAgICAgICAvLyBBcnRpa2VsIGJlcmVpbmlnZW4KICAgICAgICB2YXIgY2xlYW5E -b2NzID0gZXhwb3J0RG9jcy5tYXAoZnVuY3Rpb24oZG9jKSB7CiAgICAgICAgICAgIHZhciBjb3B5 -ID0ge307CiAgICAgICAgICAgIGZvciAodmFyIGsgaW4gZG9jKSB7IGlmIChrLmNoYXJBdCgwKSAh -PT0gJ18nKSBjb3B5W2tdID0gZG9jW2tdOyB9CiAgICAgICAgICAgIHJldHVybiBjb3B5OwogICAg -ICAgIH0pOwoKICAgICAgICAvLyBNZWRpZW4tUGZhZGUgc2FtbWVsbiAoZnVlciBIaW53ZWlzKQog -ICAgICAgIHZhciBtZWRpYVBhdGhzID0gW107CiAgICAgICAgaWYgKGluY2x1ZGVNZWRpYSkgewog -ICAgICAgICAgICBjbGVhbkRvY3MuZm9yRWFjaChmdW5jdGlvbihkb2MpIHsKICAgICAgICAgICAg -ICAgIGlmIChkb2MubWVkaWFzKSBkb2MubWVkaWFzLmZvckVhY2goZnVuY3Rpb24obSkgewogICAg -ICAgICAgICAgICAgICAgIGlmIChtLnVybCkgbWVkaWFQYXRocy5wdXNoKG0udXJsKTsKICAgICAg -ICAgICAgICAgIH0pOwogICAgICAgICAgICB9KTsKICAgICAgICB9CgogICAgICAgIHZhciBleHBv -cnREYXRhID0gewogICAgICAgICAgICBleHBvcnRWZXJzaW9uOiAnMS4wJywKICAgICAgICAgICAg -ZXhwb3J0RGF0ZTogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLAogICAgICAgICAgICBleHBvcnRl -ZEJ5OiAoRHJpdmVGUy5lbnZpcm9uICYmIERyaXZlRlMuZW52aXJvbi51c2VybmFtZSkgfHwgJ1Vu -YmVrYW5udCcsCiAgICAgICAgICAgIGFydGljbGVDb3VudDogY2xlYW5Eb2NzLmxlbmd0aCwKICAg -ICAgICAgICAgYXJ0aWNsZXM6IGNsZWFuRG9jcywKICAgICAgICAgICAgbWVkaWFQYXRoczogbWVk -aWFQYXRocy5sZW5ndGggPiAwID8gbWVkaWFQYXRocyA6IHVuZGVmaW5lZAogICAgICAgIH07Cgog -ICAgICAgIC8vIEpTT04gaGVydW50ZXJsYWRlbgogICAgICAgIHZhciBqc29uU3RyID0gSlNPTi5z -dHJpbmdpZnkoZXhwb3J0RGF0YSwgbnVsbCwgMik7CiAgICAgICAgdmFyIGpzb25CbG9iID0gbmV3 -IEJsb2IoW2pzb25TdHJdLCB7IHR5cGU6ICdhcHBsaWNhdGlvbi9qc29uJyB9KTsKICAgICAgICB2 -YXIganNvblVybCA9IFVSTC5jcmVhdGVPYmplY3RVUkwoanNvbkJsb2IpOwogICAgICAgIHZhciBh -ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpOwogICAgICAgIGEuaHJlZiA9IGpzb25Vcmw7 -CiAgICAgICAgYS5kb3dubG9hZCA9ICdEUklWRV9FeHBvcnRfJyArIG5ldyBEYXRlKCkudG9JU09T -dHJpbmcoKS5zcGxpdCgnVCcpWzBdICsgJy5qc29uJzsKICAgICAgICBhLmNsaWNrKCk7CiAgICAg -ICAgVVJMLnJldm9rZU9iamVjdFVSTChqc29uVXJsKTsKCiAgICAgICAgdmFyIG1zZyA9IGNsZWFu -RG9jcy5sZW5ndGggKyAnIEFydGlrZWwgZXhwb3J0aWVydCc7CiAgICAgICAgaWYgKG1lZGlhUGF0 -aHMubGVuZ3RoID4gMCkgewogICAgICAgICAgICBtc2cgKz0gJyAoJyArIG1lZGlhUGF0aHMubGVu -Z3RoICsgJyBNZWRpZW4tVmVybGlua3VuZ2VuIGVudGhhbHRlbiknOwogICAgICAgICAgICBzaG93 -VG9hc3QobXNnLCAnc3VjY2VzcycsIDQwMDApOwogICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0 -aW9uKCkgewogICAgICAgICAgICAgICAgc2hvd1RvYXN0KCdCaXR0ZSBrb3BpZXJlIGRlbiBtZWRp -YS8tT3JkbmVyIG1hbnVlbGwgenVtIFppZWwsIGRhbWl0IGRpZSBBbmjDpG5nZSB2ZXJmw7xnYmFy -IGJsZWliZW4uJywgJ2luZm8nLCA2MDAwKTsKICAgICAgICAgICAgfSwgMTUwMCk7CiAgICAgICAg -fSBlbHNlIHsKICAgICAgICAgICAgc2hvd1RvYXN0KG1zZywgJ3N1Y2Nlc3MnKTsKICAgICAgICB9 -CiAgICB9LAoKICAgIGFzeW5jIF9kb0ltcG9ydCgpIHsKICAgICAgICB2YXIganNvbklucHV0ID0g -ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ltcG9ydEpzb25GaWxlJyk7CiAgICAgICAgaWYgKCFq -c29uSW5wdXQuZmlsZXMgfHwganNvbklucHV0LmZpbGVzLmxlbmd0aCA9PT0gMCkgewogICAgICAg -ICAgICBzaG93VG9hc3QoJ0JpdHRlIGVpbmUgSlNPTi1EYXRlaSBhdXN3w6RobGVuJywgJ3dhcm5p -bmcnKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgdHJ5IHsKICAgICAg -ICAgICAgc2hvd1RvYXN0KCdJbXBvcnQgd2lyZCB2ZXJhcmJlaXRldC4uLicsICdpbmZvJywgMzAw -MCk7CiAgICAgICAgICAgIHZhciBqc29uVGV4dCA9IGF3YWl0IGpzb25JbnB1dC5maWxlc1swXS50 -ZXh0KCk7CiAgICAgICAgICAgIHZhciBpbXBvcnREYXRhID0gSlNPTi5wYXJzZShqc29uVGV4dCk7 -CgogICAgICAgICAgICBpZiAoIWltcG9ydERhdGEuYXJ0aWNsZXMgfHwgIUFycmF5LmlzQXJyYXko -aW1wb3J0RGF0YS5hcnRpY2xlcykpIHsKICAgICAgICAgICAgICAgIHNob3dUb2FzdCgnVW5nw7xs -dGlnZXMgRXhwb3J0Zm9ybWF0OiBLZWluIGFydGljbGVzLUFycmF5IGdlZnVuZGVuJywgJ2Vycm9y -Jyk7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZh -ciBhcnRpY2xlcyA9IGltcG9ydERhdGEuYXJ0aWNsZXM7CiAgICAgICAgICAgIHZhciBpbXBvcnRl -ZCA9IDA7CiAgICAgICAgICAgIHZhciBza2lwcGVkID0gMDsKICAgICAgICAgICAgdmFyIGhhc01l -ZGlhID0gISEoaW1wb3J0RGF0YS5tZWRpYVBhdGhzICYmIGltcG9ydERhdGEubWVkaWFQYXRocy5s -ZW5ndGggPiAwKTsKICAgICAgICAgICAgdmFyIGthdGVnb3JpZW4gPSBEcml2ZUZTLmNvbmZpZy5r -YXRlZ29yaWVuIHx8IFtdOwoKICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnRpY2xl -cy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgdmFyIGRvYyA9IGFydGljbGVzW2ldOwog -ICAgICAgICAgICAgICAgaWYgKCFkb2MuaWQgfHwgIWRvYy50aXRlbCB8fCAhZG9jLmthdGVnb3Jp -ZSkgeyBza2lwcGVkKys7IGNvbnRpbnVlOyB9CgogICAgICAgICAgICAgICAgLy8gS2F0ZWdvcmll -IGdnZi4gYW5sZWdlbgogICAgICAgICAgICAgICAgaWYgKCFrYXRlZ29yaWVuLmluY2x1ZGVzKGRv -Yy5rYXRlZ29yaWUpKSB7CiAgICAgICAgICAgICAgICAgICAga2F0ZWdvcmllbi5wdXNoKGRvYy5r -YXRlZ29yaWUpOwogICAgICAgICAgICAgICAgICAgIERyaXZlRlMuY29uZmlnLmthdGVnb3JpZW4g -PSBrYXRlZ29yaWVuOwogICAgICAgICAgICAgICAgICAgIERyaXZlRlMuc29ydEthdGVnb3JpZW4o -KTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBEb2t1bWVudCBzcGVpY2hl -cm4gKMO8YmVyc2NocmVpYmVuIG9kZXIgbmV1KQogICAgICAgICAgICAgICAgdmFyIGV4aXN0aW5n -ID0gRHJpdmVGUy5kb2N1bWVudHMuZmluZChmdW5jdGlvbihkKSB7IHJldHVybiBkLmlkID09PSBk -b2MuaWQ7IH0pOwogICAgICAgICAgICAgICAgaWYgKGV4aXN0aW5nKSB7CiAgICAgICAgICAgICAg -ICAgICAgT2JqZWN0LmFzc2lnbihleGlzdGluZywgZG9jKTsKICAgICAgICAgICAgICAgICAgICBh -d2FpdCBEcml2ZUZTLnNhdmVEb2N1bWVudChleGlzdGluZyk7CiAgICAgICAgICAgICAgICB9IGVs -c2UgewogICAgICAgICAgICAgICAgICAgIERyaXZlRlMuZG9jdW1lbnRzLnB1c2goZG9jKTsKICAg -ICAgICAgICAgICAgICAgICBhd2FpdCBEcml2ZUZTLnNhdmVEb2N1bWVudChkb2MpOwogICAgICAg -ICAgICAgICAgfQogICAgICAgICAgICAgICAgaW1wb3J0ZWQrKzsKICAgICAgICAgICAgfQoKICAg -ICAgICAgICAgLy8gQ29uZmlnIHNwZWljaGVybiAobmV1ZSBLYXRlZ29yaWVuKQogICAgICAgICAg -ICBpZiAoRHJpdmVGUy5tb2RlID09PSAnc2VydmVyJykgewogICAgICAgICAgICAgICAgYXdhaXQg -ZmV0Y2goJy9hcGkvd3JpdGUnLCB7CiAgICAgICAgICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCcs -CiAgICAgICAgICAgICAgICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0 -aW9uL2pzb247IGNoYXJzZXQ9dXRmLTgnIH0sCiAgICAgICAgICAgICAgICAgICAgYm9keTogSlNP -Ti5zdHJpbmdpZnkoeyBwYXRoOiAnZGF0YS9jb25maWcuanNvbicsIGRhdGE6IERyaXZlRlMuY29u -ZmlnIH0pCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgYXdh -aXQgRHJpdmVGUy51cGRhdGVJbmRleCgpOwogICAgICAgICAgICBEcml2ZVBvcnRhbC5yZW5kZXIo -KTsKICAgICAgICAgICAgdGhpcy51cGRhdGVVSSgpOwoKICAgICAgICAgICAgdmFyIGltcG9ydE1z -ZyA9IGltcG9ydGVkICsgJyBBcnRpa2VsIGltcG9ydGllcnQnICsgKHNraXBwZWQgPiAwID8gJywg -JyArIHNraXBwZWQgKyAnIMO8YmVyc3BydW5nZW4nIDogJycpOwogICAgICAgICAgICBzaG93VG9h -c3QoaW1wb3J0TXNnLCAnc3VjY2VzcycpOwogICAgICAgICAgICBpZiAoaGFzTWVkaWEpIHsKICAg -ICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAg -c2hvd1RvYXN0KCdEaWUgaW1wb3J0aWVydGVuIEFydGlrZWwgZW50aGFsdGVuIE1lZGllbi1WZXJs -aW5rdW5nZW4uIEJpdHRlIHN0ZWxsZSBzaWNoZXIsIGRhc3MgZGVyIG1lZGlhLy1PcmRuZXIga29w -aWVydCB3dXJkZS4nLCAnaW5mbycsIDYwMDApOwogICAgICAgICAgICAgICAgfSwgMTUwMCk7CiAg -ICAgICAgICAgIH0KICAgICAgICB9IGNhdGNoKGUpIHsKICAgICAgICAgICAgc2hvd1RvYXN0KCdJ -bXBvcnQgZmVobGdlc2NobGFnZW46ICcgKyBlLm1lc3NhZ2UsICdlcnJvcicsIDUwMDApOwogICAg -ICAgIH0KICAgIH0sCgogICAgYXN5bmMgc2F2ZVNldHRpbmdzKCkgewogICAgICAgIGlmICghdGhp -cy5kYXRhKSByZXR1cm47CiAgICAgICAgY29uc3QgcHJldlNldHRpbmdzID0geyAuLi50aGlzLmRh -dGEuc2V0dGluZ3MgfTsKICAgICAgICB0aGlzLmRhdGEuc2V0dGluZ3MucmVxdWlyZUFwcHJvdmFs -Rm9yTmV3ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2dvdlJlcU5ldycpLmNoZWNrZWQ7CiAg -ICAgICAgdGhpcy5kYXRhLnNldHRpbmdzLnJlcXVpcmVBcHByb3ZhbEZvckVkaXQgPSBkb2N1bWVu -dC5nZXRFbGVtZW50QnlJZCgnZ292UmVxRWRpdCcpLmNoZWNrZWQ7CiAgICAgICAgdmFyIGVsOwog -ICAgICAgIGVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2dvdlNob3dDb250cmliJyk7IGlm -IChlbCkgdGhpcy5kYXRhLnNldHRpbmdzLnNob3dDb250cmlidXRvcnMgPSBlbC5jaGVja2VkOwog -ICAgICAgIGVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2dvdlNob3dSZXZpZXdIaXN0Jyk7 -IGlmIChlbCkgdGhpcy5kYXRhLnNldHRpbmdzLnNob3dSZXZpZXdIaXN0b3J5ID0gZWwuY2hlY2tl -ZDsKICAgICAgICBlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdnb3ZLZXl3b3JkTW9kZScp -OyBpZiAoZWwpIHsKICAgICAgICAgICAgdGhpcy5kYXRhLnNldHRpbmdzLmtleXdvcmRNb2RlID0g -ZWwudmFsdWU7CiAgICAgICAgICAgIHRoaXMuZGF0YS5zZXR0aW5ncy5rZXl3b3Jkc1JlcXVpcmVk -ID0gKGVsLnZhbHVlID09PSAncmVxdWlyZWQnKTsKICAgICAgICB9CiAgICAgICAgZWwgPSBkb2N1 -bWVudC5nZXRFbGVtZW50QnlJZCgnZ292UmVqZWN0aW9uTW9kZScpOyBpZiAoZWwpIHsKICAgICAg -ICAgICAgdGhpcy5kYXRhLnNldHRpbmdzLnJlamVjdGlvblJlYXNvbk1vZGUgPSBlbC52YWx1ZTsK -ICAgICAgICB9CiAgICAgICAgZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZ292Q3Jvc3Ns -aW5rTW9kZScpOyBpZiAoZWwpIHsKICAgICAgICAgICAgdGhpcy5kYXRhLnNldHRpbmdzLmNyb3Nz -bGlua01vZGUgPSBlbC52YWx1ZTsKICAgICAgICB9CiAgICAgICAgY29uc3Qgb2sgPSBhd2FpdCB0 -aGlzLnNhdmVHb3Zlcm5hbmNlKCk7CiAgICAgICAgaWYgKG9rID09PSBmYWxzZSkgewogICAgICAg -ICAgICB0aGlzLmRhdGEuc2V0dGluZ3MgPSBwcmV2U2V0dGluZ3M7CiAgICAgICAgICAgIHRoaXMu -cmVuZGVyQWRtaW4oKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICB0aGlz -LnJlbmRlckFkbWluKCk7CiAgICAgICAgc2hvd1RvYXN0KCdFaW5zdGVsbHVuZ2VuIGdlc3BlaWNo -ZXJ0JywgJ3N1Y2Nlc3MnKTsKICAgIH0sCgogICAgYXN5bmMgc2F2ZUdvdmVybmFuY2UoKSB7CiAg -ICAgICAgdHJ5IHsKICAgICAgICAgICAgaWYgKERyaXZlRlMubW9kZSA9PT0gJ3NlcnZlcicpIHsK -ICAgICAgICAgICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKCcvYXBpL2dvdmVybmFuY2Un -LCB7CiAgICAgICAgICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCcsCiAgICAgICAgICAgICAgICAg -ICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb247IGNoYXJzZXQ9 -dXRmLTgnIH0sCiAgICAgICAgICAgICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkodGhpcy5k -YXRhKQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBh -d2FpdCByZXMuanNvbigpOwogICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5lcnJvcikgewogICAg -ICAgICAgICAgICAgICAgIHNob3dUb2FzdCgnRmVobGVyOiAnICsgcmVzdWx0LmVycm9yLCAnZXJy -b3InLCA1MDAwKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAg -ICAgICB9CiAgICAgICAgICAgIH0gZWxzZSBpZiAoRHJpdmVGUy5tb2RlID09PSAnZmlsZXN5c3Rl -bScgJiYgRHJpdmVGUy5fZGF0YUhhbmRsZSkgewogICAgICAgICAgICAgICAgY29uc3QgZmggPSBh -d2FpdCBEcml2ZUZTLl9kYXRhSGFuZGxlLmdldEZpbGVIYW5kbGUoJ2dvdmVybmFuY2UuanNvbics -IHsgY3JlYXRlOiB0cnVlIH0pOwogICAgICAgICAgICAgICAgY29uc3Qgd3JpdGFibGUgPSBhd2Fp -dCBmaC5jcmVhdGVXcml0YWJsZSgpOwogICAgICAgICAgICAgICAgYXdhaXQgd3JpdGFibGUud3Jp -dGUoSlNPTi5zdHJpbmdpZnkodGhpcy5kYXRhLCBudWxsLCAyKSk7CiAgICAgICAgICAgICAgICBh -d2FpdCB3cml0YWJsZS5jbG9zZSgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuX2lz -U3VwZXJVc2VyID0gdGhpcy5fY2hlY2tTdXBlclVzZXIoKTsKICAgICAgICAgICAgdGhpcy51cGRh -dGVVSSgpOwogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9IGNhdGNoIChlcnIpIHsK -ICAgICAgICAgICAgc2hvd1RvYXN0KCdHb3Zlcm5hbmNlIHNwZWljaGVybiBmZWhsZ2VzY2hsYWdl -bjogJyArIGVyci5tZXNzYWdlLCAnZXJyb3InLCA1MDAwKTsKICAgICAgICAgICAgcmV0dXJuIGZh -bHNlOwogICAgICAgIH0KICAgIH0sCgogICAgLy8gLS0tIEZyZWlnYWJldmVyYW50d29ydGxpY2hl -IChJbXByZXNzdW0pIC0tLQogICAgc2hvd0ltcHJpbnQoKSB7CiAgICAgICAgY29uc3QgYm9keSA9 -IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbXByaW50Qm9keScpOwogICAgICAgIGNvbnN0IGdv -diA9IHRoaXMuZGF0YTsKICAgICAgICBjb25zdCBpc1N0YXRpYyA9IERyaXZlRlMubW9kZSA9PT0g -J3N0YXRpYyc7CgogICAgICAgIGxldCBodG1sID0gJzxwIHN0eWxlPSJtYXJnaW4tYm90dG9tOjRw -eDsgZm9udC1zaXplOjE0cHg7IGNvbG9yOnZhcigtLXRleHQtc2Vjb25kYXJ5KTsiPsOcYmVyc2lj -aHQgZGVyIEZyZWlnYWJldmVyYW50d29ydGxpY2hlbiBpbSBELlIuSS5WLkUuIFBvcnRhbC48L3A+ -PHAgc3R5bGU9Im1hcmdpbi1ib3R0b206MTVweDsgZm9udC1zaXplOjE0cHg7IGNvbG9yOnZhcigt -LXRleHQtc2Vjb25kYXJ5KTsiPkRpZXNlIFBlcnNvbmVuIHByw7xmZW4gdW5kIGdlbmVobWlnZW4g -QXJ0aWtlbCBpbiBkZW4gamV3ZWlsaWdlbiBLYXRlZ29yaWVuLjwvcD4nOwoKICAgICAgICBpZiAo -aXNTdGF0aWMpIHsKICAgICAgICAgICAgLy8gTGVzZW1vZHVzOiBLYXRlZ29yaWVuIG1pdCBadXN0 -YWVuZGlna2VpdCAob2huZSBCZW51dHplci1JRHMpCiAgICAgICAgICAgIGh0bWwgKz0gJzxoMyBz -dHlsZT0iY29sb3I6dmFyKC0tdGV4dC1oZWFkaW5nKTsgbWFyZ2luLWJvdHRvbTo4cHg7Ij5adXN0 -w6RuZGlna2VpdCBuYWNoIEthdGVnb3JpZTwvaDM+JzsKICAgICAgICAgICAgdmFyIHNSZXZpZXdl -cnMgPSAoZ292ICYmIGdvdi5yZXZpZXdlcnMpID8gZ292LnJldmlld2VycyA6IFtdOwogICAgICAg -ICAgICB2YXIgc0thdHMgPSAoRHJpdmVGUy5jb25maWcgJiYgRHJpdmVGUy5jb25maWcua2F0ZWdv -cmllbikgPyBEcml2ZUZTLmNvbmZpZy5rYXRlZ29yaWVuIDogW107CiAgICAgICAgICAgIHZhciBz -SGlkZGVuID0gKERyaXZlRlMuY29uZmlnICYmIERyaXZlRlMuY29uZmlnLmhpZGRlbkthdGVnb3Jp -ZW4pID8gRHJpdmVGUy5jb25maWcuaGlkZGVuS2F0ZWdvcmllbiA6IFtdOwogICAgICAgICAgICBp -ZiAoc0thdHMubGVuZ3RoID4gMCkgewogICAgICAgICAgICAgICAgaHRtbCArPSAnPHRhYmxlIGNs -YXNzPSJpbXByaW50LXRhYmxlIiBpZD0iaW1wcmludENhdFRhYmxlIj48dGhlYWQ+PHRyPicgKwog -ICAgICAgICAgICAgICAgICAgICc8dGggc3R5bGU9ImN1cnNvcjpwb2ludGVyOyIgb25jbGljaz0i -RHJpdmVHb3Zlcm5hbmNlLl9zb3J0SW1wcmludFRhYmxlKDApIj5LYXRlZ29yaWUg4oaVPC90aD4n +dGdyw7bDn2Ugw6RuZGVybjo8L3A+JyArCiAgICAgICAgICAgICAgICAgICAgJzxwPlN1Y2h0IG5h +Y2ggPGNvZGUgc3R5bGU9ImJhY2tncm91bmQ6dmFyKC0tYmctY2FyZC1hbHQpO3BhZGRpbmc6MXB4 +IDRweDtib3JkZXItcmFkaXVzOjJweDsiPmZvbnQtc2l6ZTwvY29kZT4gaW0gQ1NTLUJlcmVpY2gu +IFdlcnRlIHdpZSA8Y29kZSBzdHlsZT0iYmFja2dyb3VuZDp2YXIoLS1iZy1jYXJkLWFsdCk7cGFk +ZGluZzoxcHggNHB4O2JvcmRlci1yYWRpdXM6MnB4OyI+MTRweDwvY29kZT4gb2RlciA8Y29kZSBz +dHlsZT0iYmFja2dyb3VuZDp2YXIoLS1iZy1jYXJkLWFsdCk7cGFkZGluZzoxcHggNHB4O2JvcmRl +ci1yYWRpdXM6MnB4OyI+MTZweDwvY29kZT4gYmVzdGltbWVuIGRpZSBHcsO2w59lLiBHcsO2w59l +cmUgWmFobCA9IGdyw7bDn2VyZSBTY2hyaWZ0LjwvcD4nICsKCiAgICAgICAgICAgICAgICAgICAg +JzxwIHN0eWxlPSJmb250LXdlaWdodDo3MDA7bWFyZ2luLXRvcDoxMnB4O2NvbG9yOnZhcigtLXRl +eHQtaGVhZGluZyk7Ij5Wb3JoYW5kZW5lIFNjaGxhZ3fDtnJ0ZXIgYW5wYXNzZW46PC9wPicgKwog +ICAgICAgICAgICAgICAgICAgICc8cD5TdWNodCBuYWNoIDxjb2RlIHN0eWxlPSJiYWNrZ3JvdW5k +OnZhcigtLWJnLWNhcmQtYWx0KTtwYWRkaW5nOjFweCA0cHg7Ym9yZGVyLXJhZGl1czoycHg7Ij5Q +UkVERUZJTkVEX0tFWVdPUkRTPC9jb2RlPiBpbiBkZXIgaW5kZXguaHRtbCAoaW0gSmF2YVNjcmlw +dC1CZXJlaWNoKS4gRG9ydCBzdGVodCBkaWUgTGlzdGUgZGVyIHZvcmRlZmluaWVydGVuIFNjaGxh +Z3fDtnJ0ZXIuICcgKwogICAgICAgICAgICAgICAgICAgICdCZXN0ZWhlbmRlIFNjaGxhZ3fDtnJ0 +ZXIga8O2bm50IGlociBhdWNoIGJlcXVlbSDDvGJlciDigJ5TY2hsYWd3w7ZydGVyIHZlcndhbHRl +biIgb2JlbiBpbiBkaWVzZW0gUGFuZWwgdW1iZW5lbm5lbiBvZGVyIGzDtnNjaGVuLjwvcD4nICsK +ICAgICAgICAgICAgICAgICc8L2Rpdj4nICsKICAgICAgICAgICAgJzwvZGl2PicgKwoKICAgICAg +ICAgICAgJzxkaXYgc3R5bGU9ImJhY2tncm91bmQ6I2ZmZjNjZDtib3JkZXI6MXB4IHNvbGlkICNm +ZmMxMDc7Ym9yZGVyLXJhZGl1czo4cHg7cGFkZGluZzoxNnB4IDIwcHg7bWFyZ2luLWJvdHRvbTox +NHB4O2NvbG9yOiM2NjRkMDM7Ij4nICsKICAgICAgICAgICAgICAgICc8aDMgc3R5bGU9ImZvbnQt +c2l6ZToxNXB4O21hcmdpbi1ib3R0b206OHB4OyI+V2ljaHRpZ2UgUmVnZWxuPC9oMz4nICsKICAg +ICAgICAgICAgICAgICc8dWwgc3R5bGU9ImZvbnQtc2l6ZToxM3B4O2xpbmUtaGVpZ2h0OjI7cGFk +ZGluZy1sZWZ0OjIwcHg7Ij4nICsKICAgICAgICAgICAgICAgICAgICAnPGxpPjxzdHJvbmc+SW1t +ZXIgZWluZSBTaWNoZXJ1bmdza29waWUgbWFjaGVuPC9zdHJvbmc+IGJldm9yIGlociBldHdhcyDD +pG5kZXJ0ISBLb3BpZXJ0IGRpZSBpbmRleC5odG1sIHZvcmhlciB6LkIuIGFscyBpbmRleF9iYWNr +dXAuaHRtbC48L2xpPicgKwogICAgICAgICAgICAgICAgICAgICc8bGk+PHN0cm9uZz5OdXIgZWlu +ZSBTYWNoZSBhdWYgZWlubWFsIMOkbmRlcm48L3N0cm9uZz4sIGRhbm4gdGVzdGVuLiBTbyBmaW5k +ZXQgaWhyIEZlaGxlciBzb2ZvcnQuPC9saT4nICsKICAgICAgICAgICAgICAgICAgICAnPGxpPjxz +dHJvbmc+QW5mw7xocnVuZ3N6ZWljaGVuIHVuZCBLbGFtbWVybjwvc3Ryb25nPiBtw7xzc2VuIGlt +bWVyIHBhYXJ3ZWlzZSB2b3Jrb21tZW4uIEZlaGx0IGVpbnMsIGdlaHQgZGllIFNlaXRlIGthcHV0 +dC48L2xpPicgKwogICAgICAgICAgICAgICAgICAgICc8bGk+PHN0cm9uZz5GYXJiLUNvZGVzPC9z +dHJvbmc+IGJlZ2lubmVuIGltbWVyIG1pdCAjIHVuZCBoYWJlbiAzIG9kZXIgNiBaZWljaGVuIGRh +aGludGVyICh6LkIuICNmZmYgb2RlciAjMkU0QTYyKS48L2xpPicgKwogICAgICAgICAgICAgICAg +ICAgICc8bGk+SW0gWndlaWZlbDogPHN0cm9uZz5CYWNrdXAgenVyw7xja2tvcGllcmVuPC9zdHJv +bmc+IHVuZCBub2NobWFsIHZvbiB2b3JuZS48L2xpPicgKwogICAgICAgICAgICAgICAgJzwvdWw+ +JyArCiAgICAgICAgICAgICc8L2Rpdj4nICsKCiAgICAgICAgICAgICc8ZGl2IHN0eWxlPSJiYWNr +Z3JvdW5kOnZhcigtLWJnLWNhcmQpO2JvcmRlcjoxcHggc29saWQgdmFyKC0tYm9yZGVyLWxpZ2h0 +KTtib3JkZXItcmFkaXVzOjhweDtwYWRkaW5nOjE2cHggMjBweDttYXJnaW4tYm90dG9tOjE0cHg7 +Ij4nICsKICAgICAgICAgICAgICAgICc8aDMgc3R5bGU9ImNvbG9yOnZhcigtLXRleHQtaGVhZGlu +Zyk7Zm9udC1zaXplOjE1cHg7bWFyZ2luLWJvdHRvbTo4cHg7Ij5GZWhsZXIgZ2VtYWNodD8gS2Vp +biBQcm9ibGVtITwvaDM+JyArCiAgICAgICAgICAgICAgICAnPHAgc3R5bGU9ImZvbnQtc2l6ZTox +M3B4O2xpbmUtaGVpZ2h0OjEuNztjb2xvcjp2YXIoLS10ZXh0LXByaW1hcnkpOyI+JyArCiAgICAg +ICAgICAgICAgICAgICAgJ1dlbm4gbmFjaCBlaW5lciDDhG5kZXJ1bmcgZGllIFNlaXRlIG5pY2h0 +IG1laHIgZnVua3Rpb25pZXJ0OicgKwogICAgICAgICAgICAgICAgJzwvcD4nICsKICAgICAgICAg +ICAgICAgICc8b2wgc3R5bGU9ImZvbnQtc2l6ZToxM3B4O2xpbmUtaGVpZ2h0OjI7Y29sb3I6dmFy +KC0tdGV4dC1wcmltYXJ5KTtwYWRkaW5nLWxlZnQ6MjBweDsiPicgKwogICAgICAgICAgICAgICAg +ICAgICc8bGk+QnJvd3Nlci1UYWIgc2NobGllw59lbiAoZGVyIFNlcnZlciBiZWVuZGV0IHNpY2gg +YXV0b21hdGlzY2ggbmFjaCAyMCBTZWt1bmRlbik8L2xpPicgKwogICAgICAgICAgICAgICAgICAg +ICc8bGk+RXVyZSBTaWNoZXJ1bmdza29waWUgKHouQi4gaW5kZXhfYmFja3VwLmh0bWwpIHdpZWRl +ciBhbHMgPGNvZGUgc3R5bGU9ImJhY2tncm91bmQ6dmFyKC0tYmctY2FyZC1hbHQpO3BhZGRpbmc6 +MXB4IDRweDtib3JkZXItcmFkaXVzOjJweDsiPmluZGV4Lmh0bWw8L2NvZGU+IHVtYmVuZW5uZW48 +L2xpPicgKwogICAgICAgICAgICAgICAgICAgICc8bGk+RFJJVkVfU3RhcnQuYmF0IGRvcHBlbGts +aWNrZW4g4oCTIGZlcnRpZywgYWxsZXMgd2llZGVyIHdpZSB2b3JoZXI8L2xpPicgKwogICAgICAg +ICAgICAgICAgJzwvb2w+JyArCiAgICAgICAgICAgICAgICAnPHAgc3R5bGU9ImZvbnQtc2l6ZTox +M3B4O2xpbmUtaGVpZ2h0OjEuNztjb2xvcjp2YXIoLS10ZXh0LXByaW1hcnkpO21hcmdpbi10b3A6 +NnB4OyI+JyArCiAgICAgICAgICAgICAgICAgICAgJzxzdHJvbmc+RXVyZSBBcnRpa2VsLURhdGVu +IHNpbmQgc2ljaGVyITwvc3Ryb25nPiBEaWUgbGllZ2VuIGltIDxjb2RlIHN0eWxlPSJiYWNrZ3Jv +dW5kOnZhcigtLWJnLWNhcmQtYWx0KTtwYWRkaW5nOjFweCA0cHg7Ym9yZGVyLXJhZGl1czoycHg7 +Ij5kYXRhLzwvY29kZT4tT3JkbmVyIHVuZCB3ZXJkZW4gZHVyY2ggw4RuZGVydW5nZW4gYW4gZGVy +IGluZGV4Lmh0bWwgbmljaHQgdmVyw6RuZGVydC4nICsKICAgICAgICAgICAgICAgICc8L3A+JyAr +CiAgICAgICAgICAgICc8L2Rpdj4nICsKCiAgICAgICAgJzwvZGl2Pic7CiAgICB9LAoKICAgIC8v +ID09PSBJbXBvcnQgLyBFeHBvcnQgPT09CiAgICBzaG93SW1wb3J0RXhwb3J0KCkgewogICAgICAg +IHZhciBib2R5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2dvdkFkbWluQm9keScpOwogICAg +ICAgIHZhciBkb2NzID0gRHJpdmVGUy5kb2N1bWVudHM7CiAgICAgICAgdmFyIGthdGVnb3JpZW4g +PSBEcml2ZUZTLmNvbmZpZy5rYXRlZ29yaWVuIHx8IFtdOwoKICAgICAgICB2YXIgaHRtbCA9ICc8 +ZGl2IHN0eWxlPSJtYXgtd2lkdGg6ODAwcHg7bWFyZ2luOjAgYXV0bzsiPicgKwogICAgICAgICAg +ICAnPGgyIHN0eWxlPSJjb2xvcjp2YXIoLS10ZXh0LWhlYWRpbmcpO21hcmdpbi1ib3R0b206MTZw +eDsiPkltcG9ydCAvIEV4cG9ydDwvaDI+JzsKCiAgICAgICAgLy8gPT09IEVYUE9SVCA9PT0KICAg +ICAgICBodG1sICs9ICc8ZGl2IGNsYXNzPSJnb3Ytc2VjdGlvbiI+JyArCiAgICAgICAgICAgICc8 +ZGl2IGNsYXNzPSJnb3Ytc2VjdGlvbi10aXRsZSI+RXhwb3J0PC9kaXY+JyArCiAgICAgICAgICAg +ICc8cCBzdHlsZT0iZm9udC1zaXplOjEycHg7Y29sb3I6dmFyKC0tdGV4dC1tdXRlZCk7bWFyZ2lu +LWJvdHRvbToxMHB4OyI+V8OkaGxlIEthdGVnb3JpZW4gb2RlciBlaW56ZWxuZSBBcnRpa2VsIGF1 +cy4gRGllIE1lZGllbi1WZXJsaW5rdW5nZW4gYmxlaWJlbiBpbiBkZXIgRXhwb3J0LURhdGVpIGVy +aGFsdGVuLiBEZW4gPGNvZGUgc3R5bGU9ImJhY2tncm91bmQ6dmFyKC0tYmctY2FyZC1hbHQpO3Bh +ZGRpbmc6MXB4IDRweDtib3JkZXItcmFkaXVzOjJweDsiPm1lZGlhLzwvY29kZT4tT3JkbmVyIGJp +dHRlIG1hbnVlbGwgbWl0a29waWVyZW4uPC9wPicgKwoKICAgICAgICAgICAgLy8gS2F0ZWdvcmll +LUZpbHRlcgogICAgICAgICAgICAnPGRpdiBzdHlsZT0ibWFyZ2luLWJvdHRvbTo4cHg7Ij4nICsK +ICAgICAgICAgICAgICAgICc8bGFiZWwgc3R5bGU9ImZvbnQtc2l6ZToxMXB4O2ZvbnQtd2VpZ2h0 +OjYwMDtjb2xvcjp2YXIoLS10ZXh0LXNlY29uZGFyeSk7ZGlzcGxheTpibG9jazttYXJnaW4tYm90 +dG9tOjRweDsiPkthdGVnb3JpZW48L2xhYmVsPicgKwogICAgICAgICAgICAgICAgJzxkaXYgc3R5 +bGU9ImRpc3BsYXk6ZmxleDtnYXA6NHB4O2ZsZXgtd3JhcDp3cmFwOyIgaWQ9ImV4cG9ydENhdEZp +bHRlciI+JzsKICAgICAgICBrYXRlZ29yaWVuLmZvckVhY2goZnVuY3Rpb24oa2F0KSB7CiAgICAg +ICAgICAgIHZhciBjb3VudCA9IGRvY3MuZmlsdGVyKGZ1bmN0aW9uKGQpIHsgcmV0dXJuIGQua2F0 +ZWdvcmllID09PSBrYXQ7IH0pLmxlbmd0aDsKICAgICAgICAgICAgaWYgKGNvdW50ID09PSAwKSBy +ZXR1cm47CiAgICAgICAgICAgIGh0bWwgKz0gJzxsYWJlbCBjbGFzcz0iZ292LWt3LXBpbGwiIHN0 +eWxlPSJjdXJzb3I6cG9pbnRlcjsiPjxpbnB1dCB0eXBlPSJjaGVja2JveCIgY2xhc3M9ImV4cG9y +dC1jYXQtY2IiIHZhbHVlPSInICsgRHJpdmVQb3J0YWwuZXNjYXBlQXR0cihrYXQpICsgJyIgY2hl +Y2tlZCBzdHlsZT0ibWFyZ2luLXJpZ2h0OjRweDsiIG9uY2hhbmdlPSJEcml2ZUdvdmVybmFuY2Uu +X2V4cG9ydEZpbHRlckJ5Q2F0ZWdvcnkoKSI+ICcgKyBEcml2ZVBvcnRhbC5lc2NhcGVIVE1MKGth +dCkgKyAnIDxzcGFuIGNsYXNzPSJrdy1jb3VudCI+KCcgKyBjb3VudCArICcpPC9zcGFuPjwvbGFi +ZWw+JzsKICAgICAgICB9KTsKICAgICAgICBodG1sICs9ICc8L2Rpdj48L2Rpdj4nICsKCiAgICAg +ICAgICAgIC8vIEJ1dHRvbnMKICAgICAgICAgICAgJzxkaXYgc3R5bGU9Im1hcmdpbi1ib3R0b206 +OHB4O2Rpc3BsYXk6ZmxleDtnYXA6OHB4OyI+JyArCiAgICAgICAgICAgICAgICAnPGJ1dHRvbiBj +bGFzcz0iZ292LWFkZC1idG4iIHN0eWxlPSJwYWRkaW5nOjRweCAxMnB4O2ZvbnQtc2l6ZToxMnB4 +OyIgb25jbGljaz0iRHJpdmVHb3Zlcm5hbmNlLl9leHBvcnRTZWxlY3RBbGwodHJ1ZSkiPkFsbGUg +QXJ0aWtlbDwvYnV0dG9uPicgKwogICAgICAgICAgICAgICAgJzxidXR0b24gY2xhc3M9Imdvdi1h +ZGQtYnRuIiBzdHlsZT0icGFkZGluZzo0cHggMTJweDtmb250LXNpemU6MTJweDsiIG9uY2xpY2s9 +IkRyaXZlR292ZXJuYW5jZS5fZXhwb3J0U2VsZWN0QWxsKGZhbHNlKSI+S2VpbmUgQXJ0aWtlbDwv +YnV0dG9uPicgKwogICAgICAgICAgICAnPC9kaXY+JyArCgogICAgICAgICAgICAvLyBBcnRpa2Vs +bGlzdGUKICAgICAgICAgICAgJzxkaXYgc3R5bGU9Im1heC1oZWlnaHQ6MjIwcHg7b3ZlcmZsb3ct +eTphdXRvO2JvcmRlcjoxcHggc29saWQgdmFyKC0tYm9yZGVyLWxpZ2h0KTtib3JkZXItcmFkaXVz +OjRweDtwYWRkaW5nOjRweDsiIGlkPSJleHBvcnREb2NMaXN0Ij4nOwoKICAgICAgICBkb2NzLmZv +ckVhY2goZnVuY3Rpb24oZG9jKSB7CiAgICAgICAgICAgIHZhciBoYXNNZWRpYSA9IGRvYy5tZWRp +YXMgJiYgZG9jLm1lZGlhcy5sZW5ndGggPiAwOwogICAgICAgICAgICBodG1sICs9ICc8bGFiZWwg +Y2xhc3M9ImV4cG9ydC1kb2Mtcm93IiBkYXRhLWthdGVnb3JpZT0iJyArIERyaXZlUG9ydGFsLmVz +Y2FwZUF0dHIoZG9jLmthdGVnb3JpZSkgKyAnIiBzdHlsZT0iZGlzcGxheTpmbGV4O2FsaWduLWl0 +ZW1zOmNlbnRlcjtnYXA6OHB4O3BhZGRpbmc6NnB4IDhweDtjdXJzb3I6cG9pbnRlcjtib3JkZXIt +Ym90dG9tOjFweCBzb2xpZCB2YXIoLS1ib3JkZXItbGlnaHQpO2ZvbnQtc2l6ZToxM3B4OyI+JyAr +CiAgICAgICAgICAgICAgICAnPGlucHV0IHR5cGU9ImNoZWNrYm94IiBjbGFzcz0iZXhwb3J0LWRv +Yy1jYiIgdmFsdWU9IicgKyBEcml2ZVBvcnRhbC5lc2NhcGVBdHRyKGRvYy5pZCkgKyAnIiBjaGVj +a2VkPicgKwogICAgICAgICAgICAgICAgJzxzcGFuIHN0eWxlPSJmbGV4OjE7Y29sb3I6dmFyKC0t +dGV4dC1wcmltYXJ5KTsiPicgKyBEcml2ZVBvcnRhbC5lc2NhcGVIVE1MKGRvYy50aXRlbCkgKyAn +PC9zcGFuPicgKwogICAgICAgICAgICAgICAgJzxzcGFuIHN0eWxlPSJmb250LXNpemU6MTFweDtj +b2xvcjp2YXIoLS10ZXh0LW11dGVkKTsiPicgKyBEcml2ZVBvcnRhbC5lc2NhcGVIVE1MKGRvYy5r +YXRlZ29yaWUpICsgJzwvc3Bhbj4nICsKICAgICAgICAgICAgICAgIChoYXNNZWRpYSA/ICc8c3Bh +biBzdHlsZT0iZm9udC1zaXplOjEwcHg7Y29sb3I6dmFyKC0tdGV4dC1oZWFkaW5nKTsiPicgKyBk +b2MubWVkaWFzLmxlbmd0aCArICcgTWVkaWVuPC9zcGFuPicgOiAnJykgKwogICAgICAgICAgICAn +PC9sYWJlbD4nOwogICAgICAgIH0pOwoKICAgICAgICBodG1sICs9ICc8L2Rpdj4nICsKICAgICAg +ICAgICAgJzxkaXYgc3R5bGU9Im1hcmdpbi10b3A6MTBweDtkaXNwbGF5OmZsZXg7Z2FwOjhweDth +bGlnbi1pdGVtczpjZW50ZXI7Ij4nICsKICAgICAgICAgICAgICAgICc8bGFiZWwgc3R5bGU9ImZv +bnQtc2l6ZToxM3B4O2NvbG9yOnZhcigtLXRleHQtcHJpbWFyeSk7ZGlzcGxheTpmbGV4O2FsaWdu +LWl0ZW1zOmNlbnRlcjtnYXA6NnB4O2N1cnNvcjpwb2ludGVyOyIgdGl0bGU9Ik1lZGllbi1WZXJs +aW5rdW5nZW4gaW4gZGVyIEV4cG9ydC1EYXRlaSBiZWliZWhhbHRlbiI+JyArCiAgICAgICAgICAg +ICAgICAgICAgJzxpbnB1dCB0eXBlPSJjaGVja2JveCIgaWQ9ImV4cG9ydEluY2x1ZGVNZWRpYSIg +Y2hlY2tlZD4gTWVkaWVuLVZlcmxpbmt1bmdlbiBiZWliZWhhbHRlbicgKwogICAgICAgICAgICAg +ICAgJzwvbGFiZWw+JyArCiAgICAgICAgICAgICAgICAnPHNwYW4gc3R5bGU9ImZsZXg6MTsiPjwv +c3Bhbj4nICsKICAgICAgICAgICAgICAgICc8YnV0dG9uIGNsYXNzPSJnb3YtYWRkLWJ0biIgc3R5 +bGU9InBhZGRpbmc6OHB4IDIwcHg7IiBvbmNsaWNrPSJEcml2ZUdvdmVybmFuY2UuX2RvRXhwb3J0 +KCkiPkV4cG9ydGllcmVuPC9idXR0b24+JyArCiAgICAgICAgICAgICc8L2Rpdj4nICsKICAgICAg +ICAnPC9kaXY+JzsKCiAgICAgICAgLy8gPT09IElNUE9SVCA9PT0KICAgICAgICBodG1sICs9ICc8 +ZGl2IGNsYXNzPSJnb3Ytc2VjdGlvbiI+JyArCiAgICAgICAgICAgICc8ZGl2IGNsYXNzPSJnb3Yt +c2VjdGlvbi10aXRsZSI+SW1wb3J0PC9kaXY+JyArCiAgICAgICAgICAgICc8cCBzdHlsZT0iZm9u +dC1zaXplOjEycHg7Y29sb3I6dmFyKC0tdGV4dC1tdXRlZCk7bWFyZ2luLWJvdHRvbToxMHB4OyI+ +SW1wb3J0aWVyZSBlaW5lIHp1dm9yIGV4cG9ydGllcnRlIEpTT04tRGF0ZWkuIEFydGlrZWwgd2Vy +ZGVuIGF1dG9tYXRpc2NoIGluIGRpZSBlbnRzcHJlY2hlbmRlbiBLYXRlZ29yaWVuIGVpbnNvcnRp +ZXJ0LiBOZXVlIEthdGVnb3JpZW4gd2VyZGVuIGJlaSBCZWRhcmYgYW5nZWxlZ3QuPC9wPicgKwog +ICAgICAgICAgICAnPGRpdiBzdHlsZT0iZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOmNvbHVt +bjtnYXA6OHB4OyI+JyArCiAgICAgICAgICAgICAgICAnPGRpdj4nICsKICAgICAgICAgICAgICAg +ICAgICAnPGxhYmVsIHN0eWxlPSJmb250LXNpemU6MTJweDtmb250LXdlaWdodDo2MDA7Y29sb3I6 +dmFyKC0tdGV4dC1zZWNvbmRhcnkpO2Rpc3BsYXk6YmxvY2s7bWFyZ2luLWJvdHRvbTo0cHg7Ij5F +eHBvcnQtRGF0ZWkgKEpTT04pPC9sYWJlbD4nICsKICAgICAgICAgICAgICAgICAgICAnPGlucHV0 +IHR5cGU9ImZpbGUiIGlkPSJpbXBvcnRKc29uRmlsZSIgYWNjZXB0PSIuanNvbiIgc3R5bGU9ImZv +bnQtc2l6ZToxM3B4O2NvbG9yOnZhcigtLXRleHQtcHJpbWFyeSk7Ij4nICsKICAgICAgICAgICAg +ICAgICc8L2Rpdj4nICsKICAgICAgICAgICAgICAgICc8cCBzdHlsZT0iZm9udC1zaXplOjExcHg7 +Y29sb3I6dmFyKC0tdGV4dC1tdXRlZCk7bGluZS1oZWlnaHQ6MS41O21hcmdpbi10b3A6NHB4OyI+ +RmFsbHMgZGllIEV4cG9ydC1EYXRlaSBNZWRpZW4tVmVybGlua3VuZ2VuIGVudGjDpGx0LCBrb3Bp +ZXJlIGRlbiA8Y29kZSBzdHlsZT0iYmFja2dyb3VuZDp2YXIoLS1iZy1jYXJkLWFsdCk7cGFkZGlu +ZzoxcHggNHB4O2JvcmRlci1yYWRpdXM6MnB4OyI+bWVkaWEvPC9jb2RlPi1PcmRuZXIgZGVyIFF1 +ZWxsZSBpbiBkYXMgWmllbHZlcnplaWNobmlzLCBkYW1pdCBkaWUgQW5ow6RuZ2UgdmVyZsO8Z2Jh +ciBzaW5kLjwvcD4nICsKICAgICAgICAgICAgICAgICc8ZGl2IHN0eWxlPSJtYXJnaW4tdG9wOjZw +eDsiPicgKwogICAgICAgICAgICAgICAgICAgICc8YnV0dG9uIGNsYXNzPSJnb3YtYWRkLWJ0biIg +c3R5bGU9InBhZGRpbmc6OHB4IDIwcHg7IiBvbmNsaWNrPSJEcml2ZUdvdmVybmFuY2UuX2RvSW1w +b3J0KCkiPkltcG9ydGllcmVuPC9idXR0b24+JyArCiAgICAgICAgICAgICAgICAnPC9kaXY+JyAr +CiAgICAgICAgICAgICc8L2Rpdj4nICsKICAgICAgICAnPC9kaXY+JzsKCiAgICAgICAgaHRtbCAr +PSAnPC9kaXY+JzsKICAgICAgICBib2R5LmlubmVySFRNTCA9IGh0bWw7CiAgICB9LAoKICAgIF9l +eHBvcnRTZWxlY3RBbGwoY2hlY2tlZCkgewogICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JB +bGwoJy5leHBvcnQtZG9jLWNiOm5vdCg6ZGlzYWJsZWQpJykuZm9yRWFjaChmdW5jdGlvbihjYikg +eyBjYi5jaGVja2VkID0gY2hlY2tlZDsgfSk7CiAgICB9LAoKICAgIF9leHBvcnRGaWx0ZXJCeUNh +dGVnb3J5KCkgewogICAgICAgIHZhciBzZWxlY3RlZENhdHMgPSBbXTsKICAgICAgICBkb2N1bWVu +dC5xdWVyeVNlbGVjdG9yQWxsKCcuZXhwb3J0LWNhdC1jYjpjaGVja2VkJykuZm9yRWFjaChmdW5j +dGlvbihjYikgeyBzZWxlY3RlZENhdHMucHVzaChjYi52YWx1ZSk7IH0pOwogICAgICAgIGRvY3Vt +ZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5leHBvcnQtZG9jLXJvdycpLmZvckVhY2goZnVuY3Rpb24o +cm93KSB7CiAgICAgICAgICAgIHZhciBrYXQgPSByb3cuZ2V0QXR0cmlidXRlKCdkYXRhLWthdGVn +b3JpZScpOwogICAgICAgICAgICB2YXIgY2IgPSByb3cucXVlcnlTZWxlY3RvcignLmV4cG9ydC1k +b2MtY2InKTsKICAgICAgICAgICAgaWYgKHNlbGVjdGVkQ2F0cy5pbmNsdWRlcyhrYXQpKSB7CiAg +ICAgICAgICAgICAgICByb3cuc3R5bGUuZGlzcGxheSA9ICcnOwogICAgICAgICAgICAgICAgY2Iu +ZGlzYWJsZWQgPSBmYWxzZTsKICAgICAgICAgICAgICAgIGNiLmNoZWNrZWQgPSB0cnVlOwogICAg +ICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgcm93LnN0eWxlLmRpc3BsYXkgPSAnbm9u +ZSc7CiAgICAgICAgICAgICAgICBjYi5kaXNhYmxlZCA9IHRydWU7CiAgICAgICAgICAgICAgICBj +Yi5jaGVja2VkID0gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKICAgIH0sCgogICAg +YXN5bmMgX2RvRXhwb3J0KCkgewogICAgICAgIHZhciBzZWxlY3RlZElkcyA9IFtdOwogICAgICAg +IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5leHBvcnQtZG9jLWNiOmNoZWNrZWQnKS5mb3JF +YWNoKGZ1bmN0aW9uKGNiKSB7IHNlbGVjdGVkSWRzLnB1c2goY2IudmFsdWUpOyB9KTsKICAgICAg +ICBpZiAoc2VsZWN0ZWRJZHMubGVuZ3RoID09PSAwKSB7IHNob3dUb2FzdCgnQml0dGUgbWluZGVz +dGVucyBlaW5lbiBBcnRpa2VsIGF1c3fDpGhsZW4nLCAnd2FybmluZycpOyByZXR1cm47IH0KCiAg +ICAgICAgdmFyIGluY2x1ZGVNZWRpYSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdleHBvcnRJ +bmNsdWRlTWVkaWEnKS5jaGVja2VkOwogICAgICAgIHZhciBleHBvcnREb2NzID0gRHJpdmVGUy5k +b2N1bWVudHMuZmlsdGVyKGZ1bmN0aW9uKGQpIHsgcmV0dXJuIHNlbGVjdGVkSWRzLmluY2x1ZGVz +KGQuaWQpOyB9KTsKCiAgICAgICAgLy8gQXJ0aWtlbCBiZXJlaW5pZ2VuCiAgICAgICAgdmFyIGNs +ZWFuRG9jcyA9IGV4cG9ydERvY3MubWFwKGZ1bmN0aW9uKGRvYykgewogICAgICAgICAgICB2YXIg +Y29weSA9IHt9OwogICAgICAgICAgICBmb3IgKHZhciBrIGluIGRvYykgeyBpZiAoay5jaGFyQXQo +MCkgIT09ICdfJykgY29weVtrXSA9IGRvY1trXTsgfQogICAgICAgICAgICByZXR1cm4gY29weTsK +ICAgICAgICB9KTsKCiAgICAgICAgLy8gTWVkaWVuLVBmYWRlIHNhbW1lbG4gKGZ1ZXIgSGlud2Vp +cykKICAgICAgICB2YXIgbWVkaWFQYXRocyA9IFtdOwogICAgICAgIGlmIChpbmNsdWRlTWVkaWEp +IHsKICAgICAgICAgICAgY2xlYW5Eb2NzLmZvckVhY2goZnVuY3Rpb24oZG9jKSB7CiAgICAgICAg +ICAgICAgICBpZiAoZG9jLm1lZGlhcykgZG9jLm1lZGlhcy5mb3JFYWNoKGZ1bmN0aW9uKG0pIHsK +ICAgICAgICAgICAgICAgICAgICBpZiAobS51cmwpIG1lZGlhUGF0aHMucHVzaChtLnVybCk7CiAg +ICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICB2YXIg +ZXhwb3J0RGF0YSA9IHsKICAgICAgICAgICAgZXhwb3J0VmVyc2lvbjogJzEuMCcsCiAgICAgICAg +ICAgIGV4cG9ydERhdGU6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSwKICAgICAgICAgICAgZXhw +b3J0ZWRCeTogKERyaXZlRlMuZW52aXJvbiAmJiBEcml2ZUZTLmVudmlyb24udXNlcm5hbWUpIHx8 +ICdVbmJla2FubnQnLAogICAgICAgICAgICBhcnRpY2xlQ291bnQ6IGNsZWFuRG9jcy5sZW5ndGgs +CiAgICAgICAgICAgIGFydGljbGVzOiBjbGVhbkRvY3MsCiAgICAgICAgICAgIG1lZGlhUGF0aHM6 +IG1lZGlhUGF0aHMubGVuZ3RoID4gMCA/IG1lZGlhUGF0aHMgOiB1bmRlZmluZWQKICAgICAgICB9 +OwoKICAgICAgICAvLyBKU09OIGhlcnVudGVybGFkZW4KICAgICAgICB2YXIganNvblN0ciA9IEpT +T04uc3RyaW5naWZ5KGV4cG9ydERhdGEsIG51bGwsIDIpOwogICAgICAgIHZhciBqc29uQmxvYiA9 +IG5ldyBCbG9iKFtqc29uU3RyXSwgeyB0eXBlOiAnYXBwbGljYXRpb24vanNvbicgfSk7CiAgICAg +ICAgdmFyIGpzb25VcmwgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKGpzb25CbG9iKTsKICAgICAgICB2 +YXIgYSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTsKICAgICAgICBhLmhyZWYgPSBqc29u +VXJsOwogICAgICAgIGEuZG93bmxvYWQgPSAnRFJJVkVfRXhwb3J0XycgKyBuZXcgRGF0ZSgpLnRv +SVNPU3RyaW5nKCkuc3BsaXQoJ1QnKVswXSArICcuanNvbic7CiAgICAgICAgYS5jbGljaygpOwog +ICAgICAgIFVSTC5yZXZva2VPYmplY3RVUkwoanNvblVybCk7CgogICAgICAgIHZhciBtc2cgPSBj +bGVhbkRvY3MubGVuZ3RoICsgJyBBcnRpa2VsIGV4cG9ydGllcnQnOwogICAgICAgIGlmIChtZWRp +YVBhdGhzLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgbXNnICs9ICcgKCcgKyBtZWRpYVBhdGhz +Lmxlbmd0aCArICcgTWVkaWVuLVZlcmxpbmt1bmdlbiBlbnRoYWx0ZW4pJzsKICAgICAgICAgICAg +c2hvd1RvYXN0KG1zZywgJ3N1Y2Nlc3MnLCA0MDAwKTsKICAgICAgICAgICAgc2V0VGltZW91dChm +dW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHNob3dUb2FzdCgnQml0dGUga29waWVyZSBkZW4g +bWVkaWEvLU9yZG5lciBtYW51ZWxsIHp1bSBaaWVsLCBkYW1pdCBkaWUgQW5ow6RuZ2UgdmVyZsO8 +Z2JhciBibGVpYmVuLicsICdpbmZvJywgNjAwMCk7CiAgICAgICAgICAgIH0sIDE1MDApOwogICAg +ICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHNob3dUb2FzdChtc2csICdzdWNjZXNzJyk7CiAgICAg +ICAgfQogICAgfSwKCiAgICBhc3luYyBfZG9JbXBvcnQoKSB7CiAgICAgICAgdmFyIGpzb25JbnB1 +dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbXBvcnRKc29uRmlsZScpOwogICAgICAgIGlm +ICghanNvbklucHV0LmZpbGVzIHx8IGpzb25JbnB1dC5maWxlcy5sZW5ndGggPT09IDApIHsKICAg +ICAgICAgICAgc2hvd1RvYXN0KCdCaXR0ZSBlaW5lIEpTT04tRGF0ZWkgYXVzd8OkaGxlbicsICd3 +YXJuaW5nJyk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIHRyeSB7CiAg +ICAgICAgICAgIHNob3dUb2FzdCgnSW1wb3J0IHdpcmQgdmVyYXJiZWl0ZXQuLi4nLCAnaW5mbycs +IDMwMDApOwogICAgICAgICAgICB2YXIganNvblRleHQgPSBhd2FpdCBqc29uSW5wdXQuZmlsZXNb +MF0udGV4dCgpOwogICAgICAgICAgICB2YXIgaW1wb3J0RGF0YSA9IEpTT04ucGFyc2UoanNvblRl +eHQpOwoKICAgICAgICAgICAgaWYgKCFpbXBvcnREYXRhLmFydGljbGVzIHx8ICFBcnJheS5pc0Fy +cmF5KGltcG9ydERhdGEuYXJ0aWNsZXMpKSB7CiAgICAgICAgICAgICAgICBzaG93VG9hc3QoJ1Vu +Z8O8bHRpZ2VzIEV4cG9ydGZvcm1hdDogS2VpbiBhcnRpY2xlcy1BcnJheSBnZWZ1bmRlbicsICdl +cnJvcicpOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CgogICAgICAgICAg +ICB2YXIgYXJ0aWNsZXMgPSBpbXBvcnREYXRhLmFydGljbGVzOwogICAgICAgICAgICB2YXIgaW1w +b3J0ZWQgPSAwOwogICAgICAgICAgICB2YXIgc2tpcHBlZCA9IDA7CiAgICAgICAgICAgIHZhciBo +YXNNZWRpYSA9ICEhKGltcG9ydERhdGEubWVkaWFQYXRocyAmJiBpbXBvcnREYXRhLm1lZGlhUGF0 +aHMubGVuZ3RoID4gMCk7CiAgICAgICAgICAgIHZhciBrYXRlZ29yaWVuID0gRHJpdmVGUy5jb25m +aWcua2F0ZWdvcmllbiB8fCBbXTsKCiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJ0 +aWNsZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgIHZhciBkb2MgPSBhcnRpY2xlc1tp +XTsKICAgICAgICAgICAgICAgIGlmICghZG9jLmlkIHx8ICFkb2MudGl0ZWwgfHwgIWRvYy5rYXRl +Z29yaWUpIHsgc2tpcHBlZCsrOyBjb250aW51ZTsgfQoKICAgICAgICAgICAgICAgIC8vIEthdGVn +b3JpZSBnZ2YuIGFubGVnZW4KICAgICAgICAgICAgICAgIGlmICgha2F0ZWdvcmllbi5pbmNsdWRl +cyhkb2Mua2F0ZWdvcmllKSkgewogICAgICAgICAgICAgICAgICAgIGthdGVnb3JpZW4ucHVzaChk +b2Mua2F0ZWdvcmllKTsKICAgICAgICAgICAgICAgICAgICBEcml2ZUZTLmNvbmZpZy5rYXRlZ29y +aWVuID0ga2F0ZWdvcmllbjsKICAgICAgICAgICAgICAgICAgICBEcml2ZUZTLnNvcnRLYXRlZ29y +aWVuKCk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gRG9rdW1lbnQgc3Bl +aWNoZXJuICjDvGJlcnNjaHJlaWJlbiBvZGVyIG5ldSkKICAgICAgICAgICAgICAgIHZhciBleGlz +dGluZyA9IERyaXZlRlMuZG9jdW1lbnRzLmZpbmQoZnVuY3Rpb24oZCkgeyByZXR1cm4gZC5pZCA9 +PT0gZG9jLmlkOyB9KTsKICAgICAgICAgICAgICAgIGlmIChleGlzdGluZykgewogICAgICAgICAg +ICAgICAgICAgIE9iamVjdC5hc3NpZ24oZXhpc3RpbmcsIGRvYyk7CiAgICAgICAgICAgICAgICAg +ICAgYXdhaXQgRHJpdmVGUy5zYXZlRG9jdW1lbnQoZXhpc3RpbmcpOwogICAgICAgICAgICAgICAg +fSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBEcml2ZUZTLmRvY3VtZW50cy5wdXNoKGRvYyk7 +CiAgICAgICAgICAgICAgICAgICAgYXdhaXQgRHJpdmVGUy5zYXZlRG9jdW1lbnQoZG9jKTsKICAg +ICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGltcG9ydGVkKys7CiAgICAgICAgICAgIH0K +CiAgICAgICAgICAgIC8vIENvbmZpZyBzcGVpY2hlcm4gKG5ldWUgS2F0ZWdvcmllbikKICAgICAg +ICAgICAgaWYgKERyaXZlRlMubW9kZSA9PT0gJ3NlcnZlcicpIHsKICAgICAgICAgICAgICAgIGF3 +YWl0IGZldGNoKCcvYXBpL3dyaXRlJywgewogICAgICAgICAgICAgICAgICAgIG1ldGhvZDogJ1BP +U1QnLAogICAgICAgICAgICAgICAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBs +aWNhdGlvbi9qc29uOyBjaGFyc2V0PXV0Zi04JyB9LAogICAgICAgICAgICAgICAgICAgIGJvZHk6 +IEpTT04uc3RyaW5naWZ5KHsgcGF0aDogJ2RhdGEvY29uZmlnLmpzb24nLCBkYXRhOiBEcml2ZUZT +LmNvbmZpZyB9KQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAg +IGF3YWl0IERyaXZlRlMudXBkYXRlSW5kZXgoKTsKICAgICAgICAgICAgRHJpdmVQb3J0YWwucmVu +ZGVyKCk7CiAgICAgICAgICAgIHRoaXMudXBkYXRlVUkoKTsKCiAgICAgICAgICAgIHZhciBpbXBv +cnRNc2cgPSBpbXBvcnRlZCArICcgQXJ0aWtlbCBpbXBvcnRpZXJ0JyArIChza2lwcGVkID4gMCA/ +ICcsICcgKyBza2lwcGVkICsgJyDDvGJlcnNwcnVuZ2VuJyA6ICcnKTsKICAgICAgICAgICAgc2hv +d1RvYXN0KGltcG9ydE1zZywgJ3N1Y2Nlc3MnKTsKICAgICAgICAgICAgaWYgKGhhc01lZGlhKSB7 +CiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAg +ICAgIHNob3dUb2FzdCgnRGllIGltcG9ydGllcnRlbiBBcnRpa2VsIGVudGhhbHRlbiBNZWRpZW4t +VmVybGlua3VuZ2VuLiBCaXR0ZSBzdGVsbGUgc2ljaGVyLCBkYXNzIGRlciBtZWRpYS8tT3JkbmVy +IGtvcGllcnQgd3VyZGUuJywgJ2luZm8nLCA2MDAwKTsKICAgICAgICAgICAgICAgIH0sIDE1MDAp +OwogICAgICAgICAgICB9CiAgICAgICAgfSBjYXRjaChlKSB7CiAgICAgICAgICAgIHNob3dUb2Fz +dCgnSW1wb3J0IGZlaGxnZXNjaGxhZ2VuOiAnICsgZS5tZXNzYWdlLCAnZXJyb3InLCA1MDAwKTsK +ICAgICAgICB9CiAgICB9LAoKICAgIGFzeW5jIHNhdmVTZXR0aW5ncygpIHsKICAgICAgICBpZiAo +IXRoaXMuZGF0YSkgcmV0dXJuOwogICAgICAgIGNvbnN0IHByZXZTZXR0aW5ncyA9IHsgLi4udGhp +cy5kYXRhLnNldHRpbmdzIH07CiAgICAgICAgdGhpcy5kYXRhLnNldHRpbmdzLnJlcXVpcmVBcHBy +b3ZhbEZvck5ldyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdnb3ZSZXFOZXcnKS5jaGVja2Vk +OwogICAgICAgIHRoaXMuZGF0YS5zZXR0aW5ncy5yZXF1aXJlQXBwcm92YWxGb3JFZGl0ID0gZG9j +dW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2dvdlJlcUVkaXQnKS5jaGVja2VkOwogICAgICAgIHZhciBl +bDsKICAgICAgICBlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdnb3ZTaG93Q29udHJpYicp +OyBpZiAoZWwpIHRoaXMuZGF0YS5zZXR0aW5ncy5zaG93Q29udHJpYnV0b3JzID0gZWwuY2hlY2tl +ZDsKICAgICAgICBlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdnb3ZTaG93UmV2aWV3SGlz +dCcpOyBpZiAoZWwpIHRoaXMuZGF0YS5zZXR0aW5ncy5zaG93UmV2aWV3SGlzdG9yeSA9IGVsLmNo +ZWNrZWQ7CiAgICAgICAgZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZ292S2V5d29yZE1v +ZGUnKTsgaWYgKGVsKSB7CiAgICAgICAgICAgIHRoaXMuZGF0YS5zZXR0aW5ncy5rZXl3b3JkTW9k +ZSA9IGVsLnZhbHVlOwogICAgICAgICAgICB0aGlzLmRhdGEuc2V0dGluZ3Mua2V5d29yZHNSZXF1 +aXJlZCA9IChlbC52YWx1ZSA9PT0gJ3JlcXVpcmVkJyk7CiAgICAgICAgfQogICAgICAgIGVsID0g +ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2dvdlJlamVjdGlvbk1vZGUnKTsgaWYgKGVsKSB7CiAg +ICAgICAgICAgIHRoaXMuZGF0YS5zZXR0aW5ncy5yZWplY3Rpb25SZWFzb25Nb2RlID0gZWwudmFs +dWU7CiAgICAgICAgfQogICAgICAgIGVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2dvdkNy +b3NzbGlua01vZGUnKTsgaWYgKGVsKSB7CiAgICAgICAgICAgIHRoaXMuZGF0YS5zZXR0aW5ncy5j +cm9zc2xpbmtNb2RlID0gZWwudmFsdWU7CiAgICAgICAgfQogICAgICAgIGNvbnN0IG9rID0gYXdh +aXQgdGhpcy5zYXZlR292ZXJuYW5jZSgpOwogICAgICAgIGlmIChvayA9PT0gZmFsc2UpIHsKICAg +ICAgICAgICAgdGhpcy5kYXRhLnNldHRpbmdzID0gcHJldlNldHRpbmdzOwogICAgICAgICAgICB0 +aGlzLnJlbmRlckFkbWluKCk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAg +dGhpcy5yZW5kZXJBZG1pbigpOwogICAgICAgIHNob3dUb2FzdCgnRWluc3RlbGx1bmdlbiBnZXNw +ZWljaGVydCcsICdzdWNjZXNzJyk7CiAgICB9LAoKICAgIGFzeW5jIHNhdmVHb3Zlcm5hbmNlKCkg +ewogICAgICAgIHRyeSB7CiAgICAgICAgICAgIGlmIChEcml2ZUZTLm1vZGUgPT09ICdzZXJ2ZXIn +KSB7CiAgICAgICAgICAgICAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaCgnL2FwaS9nb3Zlcm5h +bmNlJywgewogICAgICAgICAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLAogICAgICAgICAgICAg +ICAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uOyBjaGFy +c2V0PXV0Zi04JyB9LAogICAgICAgICAgICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHRo +aXMuZGF0YSkKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0 +ID0gYXdhaXQgcmVzLmpzb24oKTsKICAgICAgICAgICAgICAgIGlmIChyZXN1bHQuZXJyb3IpIHsK +ICAgICAgICAgICAgICAgICAgICBzaG93VG9hc3QoJ0ZlaGxlcjogJyArIHJlc3VsdC5lcnJvciwg +J2Vycm9yJywgNTAwMCk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAg +ICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgaWYgKERyaXZlRlMubW9kZSA9PT0gJ2ZpbGVz +eXN0ZW0nICYmIERyaXZlRlMuX2RhdGFIYW5kbGUpIHsKICAgICAgICAgICAgICAgIGNvbnN0IGZo +ID0gYXdhaXQgRHJpdmVGUy5fZGF0YUhhbmRsZS5nZXRGaWxlSGFuZGxlKCdnb3Zlcm5hbmNlLmpz +b24nLCB7IGNyZWF0ZTogdHJ1ZSB9KTsKICAgICAgICAgICAgICAgIGNvbnN0IHdyaXRhYmxlID0g +YXdhaXQgZmguY3JlYXRlV3JpdGFibGUoKTsKICAgICAgICAgICAgICAgIGF3YWl0IHdyaXRhYmxl +LndyaXRlKEpTT04uc3RyaW5naWZ5KHRoaXMuZGF0YSwgbnVsbCwgMikpOwogICAgICAgICAgICAg +ICAgYXdhaXQgd3JpdGFibGUuY2xvc2UoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlz +Ll9pc1N1cGVyVXNlciA9IHRoaXMuX2NoZWNrU3VwZXJVc2VyKCk7CiAgICAgICAgICAgIHRoaXMu +dXBkYXRlVUkoKTsKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfSBjYXRjaCAoZXJy +KSB7CiAgICAgICAgICAgIHNob3dUb2FzdCgnR292ZXJuYW5jZSBzcGVpY2hlcm4gZmVobGdlc2No +bGFnZW46ICcgKyBlcnIubWVzc2FnZSwgJ2Vycm9yJywgNTAwMCk7CiAgICAgICAgICAgIHJldHVy +biBmYWxzZTsKICAgICAgICB9CiAgICB9LAoKICAgIC8vIC0tLSBGcmVpZ2FiZXZlcmFudHdvcnRs +aWNoZSAoSW1wcmVzc3VtKSAtLS0KICAgIHNob3dJbXByaW50KCkgewogICAgICAgIGNvbnN0IGJv +ZHkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW1wcmludEJvZHknKTsKICAgICAgICBjb25z +dCBnb3YgPSB0aGlzLmRhdGE7CiAgICAgICAgY29uc3QgaXNTdGF0aWMgPSBEcml2ZUZTLm1vZGUg +PT09ICdzdGF0aWMnOwoKICAgICAgICBsZXQgaHRtbCA9ICc8cCBzdHlsZT0ibWFyZ2luLWJvdHRv +bTo0cHg7IGZvbnQtc2l6ZToxNHB4OyBjb2xvcjp2YXIoLS10ZXh0LXNlY29uZGFyeSk7Ij7DnGJl +cnNpY2h0IGRlciBGcmVpZ2FiZXZlcmFudHdvcnRsaWNoZW4gaW0gRC5SLkkuVi5FLiBQb3J0YWwu +PC9wPjxwIHN0eWxlPSJtYXJnaW4tYm90dG9tOjE1cHg7IGZvbnQtc2l6ZToxNHB4OyBjb2xvcjp2 +YXIoLS10ZXh0LXNlY29uZGFyeSk7Ij5EaWVzZSBQZXJzb25lbiBwcsO8ZmVuIHVuZCBnZW5laG1p +Z2VuIEFydGlrZWwgaW4gZGVuIGpld2VpbGlnZW4gS2F0ZWdvcmllbi48L3A+JzsKCiAgICAgICAg +aWYgKGlzU3RhdGljKSB7CiAgICAgICAgICAgIC8vIExlc2Vtb2R1czogS2F0ZWdvcmllbiBtaXQg +WnVzdGFlbmRpZ2tlaXQgKG9obmUgQmVudXR6ZXItSURzKQogICAgICAgICAgICBodG1sICs9ICc8 +aDMgc3R5bGU9ImNvbG9yOnZhcigtLXRleHQtaGVhZGluZyk7IG1hcmdpbi1ib3R0b206OHB4OyI+ +WnVzdMOkbmRpZ2tlaXQgbmFjaCBLYXRlZ29yaWU8L2gzPic7CiAgICAgICAgICAgIHZhciBzUmV2 +aWV3ZXJzID0gKGdvdiAmJiBnb3YucmV2aWV3ZXJzKSA/IGdvdi5yZXZpZXdlcnMgOiBbXTsKICAg +ICAgICAgICAgdmFyIHNLYXRzID0gKERyaXZlRlMuY29uZmlnICYmIERyaXZlRlMuY29uZmlnLmth +dGVnb3JpZW4pID8gRHJpdmVGUy5jb25maWcua2F0ZWdvcmllbiA6IFtdOwogICAgICAgICAgICB2 +YXIgc0hpZGRlbiA9IChEcml2ZUZTLmNvbmZpZyAmJiBEcml2ZUZTLmNvbmZpZy5oaWRkZW5LYXRl +Z29yaWVuKSA/IERyaXZlRlMuY29uZmlnLmhpZGRlbkthdGVnb3JpZW4gOiBbXTsKICAgICAgICAg +ICAgaWYgKHNLYXRzLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgICAgIGh0bWwgKz0gJzx0YWJs +ZSBjbGFzcz0iaW1wcmludC10YWJsZSIgaWQ9ImltcHJpbnRDYXRUYWJsZSI+PHRoZWFkPjx0cj4n ICsKICAgICAgICAgICAgICAgICAgICAnPHRoIHN0eWxlPSJjdXJzb3I6cG9pbnRlcjsiIG9uY2xp -Y2s9IkRyaXZlR292ZXJuYW5jZS5fc29ydEltcHJpbnRUYWJsZSgxKSI+WnVzdMOkbmRpZyDihpU8 -L3RoPicgKwogICAgICAgICAgICAgICAgJzwvdHI+PC90aGVhZD48dGJvZHk+JzsKICAgICAgICAg -ICAgICAgIHNLYXRzLmZpbHRlcihmdW5jdGlvbihrKSB7IHJldHVybiAhc0hpZGRlbi5pbmNsdWRl -cyhrKTsgfSkuZm9yRWFjaChmdW5jdGlvbihrYXQpIHsKICAgICAgICAgICAgICAgICAgICB2YXIg -enVzdGFlbmRpZyA9IHNSZXZpZXdlcnMuZmlsdGVyKGZ1bmN0aW9uKHIpIHsgcmV0dXJuIChyLmth -dGVnb3JpZW4gfHwgW10pLmluY2x1ZGVzKGthdCk7IH0pOwogICAgICAgICAgICAgICAgICAgIGlm -ICh6dXN0YWVuZGlnLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgenVzdGFl -bmRpZy5mb3JFYWNoKGZ1bmN0aW9uKHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh0 -bWwgKz0gJzx0cj48dGQ+PHN0cm9uZz4nICsgRHJpdmVQb3J0YWwuZXNjYXBlSFRNTChrYXQpICsg -Jzwvc3Ryb25nPjwvdGQ+JyArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzx0ZD4n -ICsgRHJpdmVQb3J0YWwuZXNjYXBlSFRNTChyLmRpc3BsYXlOYW1lIHx8ICctJykgKyAnPC90ZD48 -L3RyPic7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0g -ZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGh0bWwgKz0gJzx0cj48dGQ+PHN0cm9uZz4n -ICsgRHJpdmVQb3J0YWwuZXNjYXBlSFRNTChrYXQpICsgJzwvc3Ryb25nPjwvdGQ+JyArCiAgICAg -ICAgICAgICAgICAgICAgICAgICAgICAnPHRkPjxlbSBzdHlsZT0iY29sb3I6dmFyKC0tdGV4dC1t -dXRlZCk7Ij5LZWluIFJldmlld2VyIHp1Z2V3aWVzZW48L2VtPjwvdGQ+PC90cj4nOwogICAgICAg -ICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgaHRtbCAr -PSAnPC90Ym9keT48L3RhYmxlPic7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAg -ICBodG1sICs9ICc8cCBzdHlsZT0iY29sb3I6dmFyKC0tdGV4dC1tdXRlZCk7Ij5LZWluZSBLYXRl -Z29yaWVuIHZlcmbDvGdiYXIuPC9wPic7CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2Ugewog -ICAgICAgICAgICAvLyBTZXJ2ZXItTW9kdXM6IFZvbGxzdMOkbmRpZ2UgQW5zaWNodCBtaXQgYWxs -ZW4gUm9sbGVuCgogICAgICAgICAgICAvLyBTdXBlclVzZXIKICAgICAgICAgICAgaHRtbCArPSAn -PGgzIHN0eWxlPSJjb2xvcjp2YXIoLS10ZXh0LWhlYWRpbmcpOyBtYXJnaW4tYm90dG9tOjhweDsi -PlN5c3RlbWFkbWluaXN0cmF0aW9uPC9oMz4nOwogICAgICAgICAgICBodG1sICs9ICc8dGFibGUg -Y2xhc3M9ImltcHJpbnQtdGFibGUiPjx0aGVhZD48dHI+PHRoPk5hbWU8L3RoPjx0aD5CZW51dHpl -ci1JRDwvdGg+PHRoPlJvbGxlPC90aD48L3RyPjwvdGhlYWQ+PHRib2R5Pic7CiAgICAgICAgICAg -IGlmIChnb3YgJiYgZ292LnN1cGVyVXNlcnMpIHsKICAgICAgICAgICAgICAgIGdvdi5zdXBlclVz -ZXJzLmZvckVhY2goc3UgPT4gewogICAgICAgICAgICAgICAgICAgIGh0bWwgKz0gJzx0cj48dGQ+ -JyArIERyaXZlUG9ydGFsLmVzY2FwZUhUTUwoc3UuZGlzcGxheU5hbWUgfHwgc3UudXNlcm5hbWUp -ICsgJzwvdGQ+JyArCiAgICAgICAgICAgICAgICAgICAgICAgICc8dGQ+JyArIERyaXZlUG9ydGFs -LmVzY2FwZUhUTUwoc3UudXNlcm5hbWUpICsgJzwvdGQ+JyArCiAgICAgICAgICAgICAgICAgICAg -ICAgICc8dGQgc3R5bGU9ImZvbnQtd2VpZ2h0OjYwMDsgY29sb3I6dmFyKC0tdGV4dC1oZWFkaW5n -KTsiPlN1cGVyVXNlcjwvdGQ+PC90cj4nOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAg -IH0KICAgICAgICAgICAgaHRtbCArPSAnPC90Ym9keT48L3RhYmxlPic7CgogICAgICAgICAgICAv -LyBGYWNoYXVmc2ljaHQKICAgICAgICAgICAgaWYgKGdvdiAmJiBnb3YuZmFjaGF1ZnNpY2h0ICYm -IGdvdi5mYWNoYXVmc2ljaHQubGVuZ3RoID4gMCkgewogICAgICAgICAgICAgICAgaHRtbCArPSAn -PGgzIHN0eWxlPSJjb2xvcjp2YXIoLS10ZXh0LWhlYWRpbmcpOyBtYXJnaW46MjBweCAwIDhweDsi -PkZhY2hhdWZzaWNodDwvaDM+JzsKICAgICAgICAgICAgICAgIGh0bWwgKz0gJzx0YWJsZSBjbGFz -cz0iaW1wcmludC10YWJsZSI+PHRoZWFkPjx0cj48dGg+TmFtZTwvdGg+PHRoPkJlbnV0emVyLUlE -PC90aD48dGg+WnVzdMOkbmRpZ2tlaXQ8L3RoPjwvdHI+PC90aGVhZD48dGJvZHk+JzsKICAgICAg -ICAgICAgICAgIGdvdi5mYWNoYXVmc2ljaHQuZm9yRWFjaChmdW5jdGlvbihmYSkgewogICAgICAg -ICAgICAgICAgICAgIGh0bWwgKz0gJzx0cj48dGQ+JyArIERyaXZlUG9ydGFsLmVzY2FwZUhUTUwo -ZmEuZGlzcGxheU5hbWUgfHwgZmEudXNlcm5hbWUpICsgJzwvdGQ+JyArCiAgICAgICAgICAgICAg -ICAgICAgICAgICc8dGQ+JyArIERyaXZlUG9ydGFsLmVzY2FwZUhUTUwoZmEudXNlcm5hbWUpICsg -JzwvdGQ+JyArCiAgICAgICAgICAgICAgICAgICAgICAgICc8dGQgc3R5bGU9ImZvbnQtd2VpZ2h0 -OjYwMDsgY29sb3I6I2U1NzM3MzsiPkFsbGUgS2F0ZWdvcmllbjwvdGQ+PC90cj4nOwogICAgICAg -ICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBodG1sICs9ICc8L3Rib2R5PjwvdGFibGU+JzsK -ICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gWnVzdGFlbmRpZ2tlaXQgbmFjaCBLYXRlZ29y -aWUgKHNvcnRpZXJiYXJlIFRhYmVsbGUpCiAgICAgICAgICAgIGh0bWwgKz0gJzxoMyBzdHlsZT0i -Y29sb3I6dmFyKC0tdGV4dC1oZWFkaW5nKTsgbWFyZ2luOjIwcHggMCA4cHg7Ij5adXN0w6RuZGln -a2VpdCBuYWNoIEthdGVnb3JpZTwvaDM+JzsKICAgICAgICAgICAgdmFyIGltcEhpZGRlbkthdHMg -PSBEcml2ZUZTLmNvbmZpZy5oaWRkZW5LYXRlZ29yaWVuIHx8IFtdOwogICAgICAgICAgICB2YXIg -cmV2aWV3ZXJzID0gKGdvdiAmJiBnb3YucmV2aWV3ZXJzKSA/IGdvdi5yZXZpZXdlcnMgOiBbXTsK -ICAgICAgICAgICAgaHRtbCArPSAnPHRhYmxlIGNsYXNzPSJpbXByaW50LXRhYmxlIiBpZD0iaW1w -cmludENhdFRhYmxlIj48dGhlYWQ+PHRyPicgKwogICAgICAgICAgICAgICAgJzx0aCBzdHlsZT0i -Y3Vyc29yOnBvaW50ZXI7IiBvbmNsaWNrPSJEcml2ZUdvdmVybmFuY2UuX3NvcnRJbXByaW50VGFi -bGUoMCkiPkthdGVnb3JpZSDihpU8L3RoPicgKwogICAgICAgICAgICAgICAgJzx0aCBzdHlsZT0i -Y3Vyc29yOnBvaW50ZXI7IiBvbmNsaWNrPSJEcml2ZUdvdmVybmFuY2UuX3NvcnRJbXByaW50VGFi -bGUoMSkiPlp1c3TDpG5kaWcg4oaVPC90aD4nICsKICAgICAgICAgICAgICAgICc8dGggc3R5bGU9 -ImN1cnNvcjpwb2ludGVyOyIgb25jbGljaz0iRHJpdmVHb3Zlcm5hbmNlLl9zb3J0SW1wcmludFRh -YmxlKDIpIj5CZW51dHplci1JRCDihpU8L3RoPicgKwogICAgICAgICAgICAnPC90cj48L3RoZWFk -Pjx0Ym9keT4nOwogICAgICAgICAgICAoRHJpdmVGUy5jb25maWcua2F0ZWdvcmllbiB8fCBbXSku -ZmlsdGVyKGZ1bmN0aW9uKGthdCkgeyByZXR1cm4gIWltcEhpZGRlbkthdHMuaW5jbHVkZXMoa2F0 -KTsgfSkuZm9yRWFjaChmdW5jdGlvbihrYXQpIHsKICAgICAgICAgICAgICAgIHZhciB6dXN0YWVu -ZGlnID0gcmV2aWV3ZXJzLmZpbHRlcihmdW5jdGlvbihyKSB7IHJldHVybiAoci5rYXRlZ29yaWVu -IHx8IFtdKS5pbmNsdWRlcyhrYXQpOyB9KTsKICAgICAgICAgICAgICAgIGlmICh6dXN0YWVuZGln -Lmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgICAgICAgICB6dXN0YWVuZGlnLmZvckVhY2goZnVu -Y3Rpb24ocikgewogICAgICAgICAgICAgICAgICAgICAgICBodG1sICs9ICc8dHI+PHRkPjxzdHJv +Y2s9IkRyaXZlR292ZXJuYW5jZS5fc29ydEltcHJpbnRUYWJsZSgwKSI+S2F0ZWdvcmllIOKGlTwv +dGg+JyArCiAgICAgICAgICAgICAgICAgICAgJzx0aCBzdHlsZT0iY3Vyc29yOnBvaW50ZXI7IiBv +bmNsaWNrPSJEcml2ZUdvdmVybmFuY2UuX3NvcnRJbXByaW50VGFibGUoMSkiPlp1c3TDpG5kaWcg +4oaVPC90aD4nICsKICAgICAgICAgICAgICAgICc8L3RyPjwvdGhlYWQ+PHRib2R5Pic7CiAgICAg +ICAgICAgICAgICBzS2F0cy5maWx0ZXIoZnVuY3Rpb24oaykgeyByZXR1cm4gIXNIaWRkZW4uaW5j +bHVkZXMoayk7IH0pLmZvckVhY2goZnVuY3Rpb24oa2F0KSB7CiAgICAgICAgICAgICAgICAgICAg +dmFyIHp1c3RhZW5kaWcgPSBzUmV2aWV3ZXJzLmZpbHRlcihmdW5jdGlvbihyKSB7IHJldHVybiAo +ci5rYXRlZ29yaWVuIHx8IFtdKS5pbmNsdWRlcyhrYXQpOyB9KTsKICAgICAgICAgICAgICAgICAg +ICBpZiAoenVzdGFlbmRpZy5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHp1 +c3RhZW5kaWcuZm9yRWFjaChmdW5jdGlvbihyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAg +ICBodG1sICs9ICc8dHI+PHRkPjxzdHJvbmc+JyArIERyaXZlUG9ydGFsLmVzY2FwZUhUTUwoa2F0 +KSArICc8L3N0cm9uZz48L3RkPicgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICc8 +dGQ+JyArIERyaXZlUG9ydGFsLmVzY2FwZUhUTUwoci5kaXNwbGF5TmFtZSB8fCAnLScpICsgJzwv +dGQ+PC90cj4nOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAg +ICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBodG1sICs9ICc8dHI+PHRkPjxzdHJv bmc+JyArIERyaXZlUG9ydGFsLmVzY2FwZUhUTUwoa2F0KSArICc8L3N0cm9uZz48L3RkPicgKwog -ICAgICAgICAgICAgICAgICAgICAgICAgICAgJzx0ZD4nICsgRHJpdmVQb3J0YWwuZXNjYXBlSFRN -TChyLmRpc3BsYXlOYW1lIHx8IHIudXNlcm5hbWUpICsgJzwvdGQ+JyArCiAgICAgICAgICAgICAg -ICAgICAgICAgICAgICAnPHRkIHN0eWxlPSJmb250LXNpemU6MTJweDtjb2xvcjp2YXIoLS10ZXh0 -LXNlY29uZGFyeSk7Ij4nICsgRHJpdmVQb3J0YWwuZXNjYXBlSFRNTChyLnVzZXJuYW1lKSArICc8 -L3RkPjwvdHI+JzsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0gZWxz -ZSB7CiAgICAgICAgICAgICAgICAgICAgaHRtbCArPSAnPHRyPjx0ZD48c3Ryb25nPicgKyBEcml2 -ZVBvcnRhbC5lc2NhcGVIVE1MKGthdCkgKyAnPC9zdHJvbmc+PC90ZD4nICsKICAgICAgICAgICAg -ICAgICAgICAgICAgJzx0ZCBjb2xzcGFuPSIyIj48ZW0gc3R5bGU9ImNvbG9yOnZhcigtLXRleHQt -bXV0ZWQpOyI+S2VpbiBSZXZpZXdlciB6dWdld2llc2VuPC9lbT48L3RkPjwvdHI+JzsKICAgICAg -ICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGh0bWwgKz0gJzwvdGJvZHk+ -PC90YWJsZT4nOwogICAgICAgIH0KCiAgICAgICAgaHRtbCArPSAnPHAgc3R5bGU9Im1hcmdpbi10 -b3A6MjBweDsgZm9udC1zaXplOjExcHg7IGNvbG9yOnZhcigtLXRleHQtbXV0ZWQpOyI+U3RhbmQ6 -ICcgKyBuZXcgRGF0ZSgpLnRvTG9jYWxlRGF0ZVN0cmluZygnZGUtREUnLCB7ZGF5OicyLWRpZ2l0 -Jyxtb250aDonMi1kaWdpdCcseWVhcjonbnVtZXJpYyd9KSArICc8L3A+JzsKCiAgICAgICAgYm9k -eS5pbm5lckhUTUwgPSBodG1sOwogICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbXBy -aW50TW9kYWwnKS5jbGFzc0xpc3QuYWRkKCdhY3RpdmUnKTsKICAgIH0sCgogICAgX2ltcHJpbnRT -b3J0Q29sOiAtMSwKICAgIF9pbXByaW50U29ydEFzYzogdHJ1ZSwKCiAgICBfc29ydEltcHJpbnRU -YWJsZShjb2xJZHgpIHsKICAgICAgICB2YXIgdGFibGUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJ -ZCgnaW1wcmludENhdFRhYmxlJyk7CiAgICAgICAgaWYgKCF0YWJsZSkgcmV0dXJuOwogICAgICAg -IHZhciB0Ym9keSA9IHRhYmxlLnF1ZXJ5U2VsZWN0b3IoJ3Rib2R5Jyk7CiAgICAgICAgaWYgKCF0 -Ym9keSkgcmV0dXJuOwoKICAgICAgICAvLyBTb3J0aWVycmljaHR1bmcgdW1zY2hhbHRlbgogICAg -ICAgIGlmICh0aGlzLl9pbXByaW50U29ydENvbCA9PT0gY29sSWR4KSB7CiAgICAgICAgICAgIHRo -aXMuX2ltcHJpbnRTb3J0QXNjID0gIXRoaXMuX2ltcHJpbnRTb3J0QXNjOwogICAgICAgIH0gZWxz -ZSB7CiAgICAgICAgICAgIHRoaXMuX2ltcHJpbnRTb3J0Q29sID0gY29sSWR4OwogICAgICAgICAg -ICB0aGlzLl9pbXByaW50U29ydEFzYyA9IHRydWU7CiAgICAgICAgfQogICAgICAgIHZhciBhc2Mg -PSB0aGlzLl9pbXByaW50U29ydEFzYzsKCiAgICAgICAgdmFyIHJvd3MgPSBBcnJheS5mcm9tKHRi -b2R5LnF1ZXJ5U2VsZWN0b3JBbGwoJ3RyJykpOwogICAgICAgIHJvd3Muc29ydChmdW5jdGlvbihh -LCBiKSB7CiAgICAgICAgICAgIHZhciBhVGV4dCA9IChhLmNlbGxzW2NvbElkeF0gPyBhLmNlbGxz -W2NvbElkeF0udGV4dENvbnRlbnQudHJpbSgpIDogJycpLnRvTG93ZXJDYXNlKCk7CiAgICAgICAg -ICAgIHZhciBiVGV4dCA9IChiLmNlbGxzW2NvbElkeF0gPyBiLmNlbGxzW2NvbElkeF0udGV4dENv -bnRlbnQudHJpbSgpIDogJycpLnRvTG93ZXJDYXNlKCk7CiAgICAgICAgICAgIHZhciBjbXAgPSBh -VGV4dC5sb2NhbGVDb21wYXJlKGJUZXh0LCAnZGUnKTsKICAgICAgICAgICAgcmV0dXJuIGFzYyA/ -IGNtcCA6IC1jbXA7CiAgICAgICAgfSk7CiAgICAgICAgcm93cy5mb3JFYWNoKGZ1bmN0aW9uKHJv -dykgeyB0Ym9keS5hcHBlbmRDaGlsZChyb3cpOyB9KTsKICAgIH0sCgogICAgY2xvc2VJbXByaW50 -KCkgewogICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbXByaW50TW9kYWwnKS5jbGFz -c0xpc3QucmVtb3ZlKCdhY3RpdmUnKTsKICAgIH0KfTsKCi8vID09PT09PT09PT09PT09PT09PT09 -PSBJTklUID09PT09PT09PT09PT09PT09PT09PQoKZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcign -RE9NQ29udGVudExvYWRlZCcsIGFzeW5jICgpID0+IHsKICAgIC8vIENsaWNrLUhhbmRsZXIgZnVl -ciBpbmxpbmUgTWVkaWVuIGluIGRlciBEZXRhaWwtQW5zaWNodAogICAgZG9jdW1lbnQuZ2V0RWxl -bWVudEJ5SWQoJ2RvY3VtZW50RGV0YWlsJykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZSkg -PT4gewogICAgICAgIC8vIEJpbGRlciBpbiAuZHJpdmUtbWVkaWEtdGh1bWJuYWlsCiAgICAgICAg -Y29uc3QgdGh1bWIgPSBlLnRhcmdldC5jbG9zZXN0KCcuZHJpdmUtbWVkaWEtdGh1bWJuYWlsJyk7 -CiAgICAgICAgaWYgKHRodW1iICYmICFkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZWRpdG9yTW9k -YWwnKS5jbGFzc0xpc3QuY29udGFpbnMoJ2FjdGl2ZScpKSB7CiAgICAgICAgICAgIGNvbnN0IGlt -ZyA9IHRodW1iLnF1ZXJ5U2VsZWN0b3IoJ2ltZycpOwogICAgICAgICAgICBpZiAoaW1nKSB7CiAg -ICAgICAgICAgICAgICBvcGVuTWVkaWFNb2RhbChpbWcuc3JjLCAnaW1hZ2UnLCBpbWcuYWx0IHx8 -ICcnKTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgIH0KICAg -ICAgICAvLyBCaWxkZXIgZGlyZWt0IGFuZ2VrbGlja3QgKGluIC5kcml2ZS1tZWRpYS1sYXJnZSBv -ZGVyIGFsdGUgQmlsZGVyKQogICAgICAgIGlmIChlLnRhcmdldC50YWdOYW1lID09PSAnSU1HJyAm -JiBlLnRhcmdldC5jbG9zZXN0KCcuZGV0YWlsLWNvbnRlbnQnKSkgewogICAgICAgICAgICBvcGVu -TWVkaWFNb2RhbChlLnRhcmdldC5zcmMsICdpbWFnZScsIGUudGFyZ2V0LmFsdCB8fCAnJyk7CiAg -ICAgICAgfQoKICAgICAgICAvLyBTaWNoZXJoZWl0c25ldHo6IEFsbGUgZXh0ZXJuZW4gTGlua3Mg -aW0gQXJ0aWtlbGluaGFsdCBpbiBuZXVlbSBUYWIgb2VmZm5lbi4KICAgICAgICAvLyBWZXJoaW5k -ZXJ0LCBkYXNzIGRhcyBQb3J0YWwgZHVyY2ggTGlua3MgYXVzIGtvcGllcnRlbi9iZXN0ZWhlbmRl -biBJbmhhbHRlbgogICAgICAgIC8vIHZlcmxhc3NlbiB3aXJkIChhdWNoIGJlaSBBbHRkYXRlbiBk -aWUgbm9jaCB0YXJnZXQ9X3NlbGYgaGFiZW4pLgogICAgICAgIHZhciBsaW5rID0gZS50YXJnZXQu -Y2xvc2VzdCgnYVtocmVmXScpOwogICAgICAgIGlmIChsaW5rICYmIGxpbmsuY2xvc2VzdCgnLmRl -dGFpbC1jb250ZW50LCAjZWRpdG9ySW5wdXQnKSkgewogICAgICAgICAgICB2YXIgaHJlZiA9IChs -aW5rLmdldEF0dHJpYnV0ZSgnaHJlZicpIHx8ICcnKS50cmltKCk7CiAgICAgICAgICAgIC8vIElu -dGVybmUgQW5rZXIgKCMuLi4pIHVuZCBEUklWRS1Dcm9zc2xpbmtzIGF1c25laG1lbgogICAgICAg -ICAgICBpZiAoIWhyZWYuc3RhcnRzV2l0aCgnIycpICYmICFsaW5rLmNsYXNzTGlzdC5jb250YWlu -cygnZHJpdmUteHJlZicpKSB7CiAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAg -ICAgICAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpOwogICAgICAgICAgICAgICAgd2luZG93 -Lm9wZW4oaHJlZiwgJ19ibGFuaycsICdub29wZW5lcixub3JlZmVycmVyJyk7CiAgICAgICAgICAg -IH0KICAgICAgICB9CiAgICB9KTsKCiAgICAvLyBDb250ZXh0LU1lbnUgc2NobGllc3NlbiBiZWkg -S2xpY2sgYXVzc2VyaGFsYgogICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAo -ZSkgPT4gewogICAgICAgIGlmICghZS50YXJnZXQuY2xvc2VzdCgnLm1lZGlhLWNvbnRleHQtbWVu -dScpICYmICFlLnRhcmdldC5jbG9zZXN0KCcuZHJpdmUtbWVkaWEnKSkgewogICAgICAgICAgICBE -cml2ZUVkaXRvci5oaWRlQ29udGV4dE1lbnUoKTsKICAgICAgICB9CiAgICB9KTsKCiAgICAvLyA9 -PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 -PT09PT09PQogICAgLy8gU2Vzc2lvbi1TY2h1dHo6IEhlYXJ0YmVhdCwgQXV0by1TYXZlLCBXYXJu -dW5nLCBXaWVkZXJhdWZuYWhtZQogICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 -PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgICAvLyBBa3R1ZWxsZSBFZGl0 -b3ItRGF0ZW4gZnVlciBBdXRvLVNhdmUgc2FtbWVsbiAob2huZSBWYWxpZGllcnVuZy9Xb3JrZmxv -dykKICAgIGZ1bmN0aW9uIF9nYXRoZXJFZGl0b3JTbmFwc2hvdCgpIHsKICAgICAgICBpZiAoIURy -aXZlRWRpdG9yLmN1cnJlbnREb2MpIHJldHVybiBudWxsOwogICAgICAgIHZhciBlZGl0b3IgPSBk -b2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZWRpdG9ySW5wdXQnKTsKICAgICAgICB2YXIgdGl0ZWwg -PSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZWRpdG9yVGl0ZWwnKTsKICAgICAgICBpZiAoIWVk -aXRvciAmJiAhdGl0ZWwpIHJldHVybiBudWxsOwogICAgICAgIHZhciBzbmFwID0gSlNPTi5wYXJz -ZShKU09OLnN0cmluZ2lmeShEcml2ZUVkaXRvci5jdXJyZW50RG9jKSk7CiAgICAgICAgaWYgKHRp -dGVsKSBzbmFwLnRpdGVsID0gdGl0ZWwudmFsdWUudHJpbSgpOwogICAgICAgIGlmIChlZGl0b3Ip -IHNuYXAuaW5oYWx0ID0gZWRpdG9yLmlubmVySFRNTDsKICAgICAgICB2YXIga2F0ID0gZG9jdW1l -bnQuZ2V0RWxlbWVudEJ5SWQoJ2VkaXRvckthdGVnb3JpZScpOwogICAgICAgIGlmIChrYXQpIHNu -YXAua2F0ZWdvcmllID0ga2F0LnZhbHVlOwogICAgICAgIHZhciBzdGF0dXMgPSBkb2N1bWVudC5n -ZXRFbGVtZW50QnlJZCgnZWRpdG9yU3RhdHVzJyk7CiAgICAgICAgaWYgKHN0YXR1cykgc25hcC5f -bGFzdEVkaXRvclN0YXR1cyA9IHN0YXR1cy52YWx1ZTsKICAgICAgICBzbmFwLnN0YXR1cyA9ICdF -bnR3dXJmJzsKICAgICAgICBzbmFwLnNjaGxhZ3dvZXJ0ZXIgPSBEcml2ZUVkaXRvci5fY3VycmVu -dEtleXdvcmRzID8gWy4uLkRyaXZlRWRpdG9yLl9jdXJyZW50S2V5d29yZHNdIDogKHNuYXAuc2No -bGFnd29lcnRlciB8fCBbXSk7CiAgICAgICAgcmV0dXJuIHNuYXA7CiAgICB9CgogICAgLy8gQXV0 -by1TYXZlOiBFbnR3dXJmIGF1ZiBkZW0gU2VydmVyIHNwZWljaGVybiArIGxvY2FsU3RvcmFnZS1C -YWNrdXAKICAgIGFzeW5jIGZ1bmN0aW9uIF9lbWVyZ2VuY3lTYXZlRHJhZnQoKSB7CiAgICAgICAg -dmFyIHNuYXAgPSBfZ2F0aGVyRWRpdG9yU25hcHNob3QoKTsKICAgICAgICBpZiAoIXNuYXApIHJl -dHVybiBmYWxzZTsKICAgICAgICAvLyBsb2NhbFN0b3JhZ2UtQmFja3VwIChpbW1lciwgYXVjaCB3 -ZW5uIFNlcnZlci1TYXZlIGZlaGxzY2hsYWVndCkKICAgICAgICB0cnkgewogICAgICAgICAgICBs -b2NhbFN0b3JhZ2Uuc2V0SXRlbSgnZHJpdmUtcmVzdW1lLWRvYycsIEpTT04uc3RyaW5naWZ5KHsK -ICAgICAgICAgICAgICAgIGRvY0lkOiBzbmFwLmlkLAogICAgICAgICAgICAgICAgdGl0ZWw6IHNu -YXAudGl0ZWwsCiAgICAgICAgICAgICAgICBrYXRlZ29yaWU6IHNuYXAua2F0ZWdvcmllLAogICAg -ICAgICAgICAgICAgdGltZXN0YW1wOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksCiAgICAgICAg -ICAgICAgICBpc05ldzogRHJpdmVFZGl0b3IuaXNOZXcKICAgICAgICAgICAgfSkpOwogICAgICAg -IH0gY2F0Y2goZSkge30KICAgICAgICAvLyBTZXJ2ZXItU2F2ZSBhbHMgRW50d3VyZgogICAgICAg -IGlmIChEcml2ZUZTLm1vZGUgPT09ICdzZXJ2ZXInKSB7CiAgICAgICAgICAgIHRyeSB7CiAgICAg -ICAgICAgICAgICBzbmFwLmdlYWVuZGVydCA9IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKS5zcGxp -dCgnVCcpWzBdOwogICAgICAgICAgICAgICAgdmFyIHVzZXJuYW1lID0gKERyaXZlRlMuZW52aXJv -biAmJiBEcml2ZUZTLmVudmlyb24udXNlcm5hbWUpID8gRHJpdmVGUy5lbnZpcm9uLnVzZXJuYW1l -IDogJ1VuYmVrYW5udCc7CiAgICAgICAgICAgICAgICBzbmFwLmJlYXJiZWl0ZXRWb24gPSB1c2Vy -bmFtZTsKICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSBhd2FpdCBEcml2ZUZTLnNhdmVEb2N1 -bWVudChzbmFwKTsKICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgPT09IHRydWUpIHsKICAgICAg -ICAgICAgICAgICAgICAvLyBjdXJyZW50RG9jIGFrdHVhbGlzaWVyZW4gZGFtaXQgY2xvc2UoKSBr -ZWluZW4gRGF0ZW52ZXJsdXN0IHZlcnVyc2FjaHQKICAgICAgICAgICAgICAgICAgICBEcml2ZUVk -aXRvci5jdXJyZW50RG9jID0gc25hcDsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsK -ICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBjYXRjaChlKSB7fQogICAgICAgIH0KICAg -ICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogICAgLy8gVGltZW91dC1XYXJudW5nOiBJbmZvLU1v -ZGFsIDEgTWludXRlIHZvciBTZXJ2ZXItU2h1dGRvd24KICAgIHZhciBfc2VydmVyVGltZW91dE1v -ZGFsID0gbnVsbDsKICAgIHZhciBfc2VydmVyVGltZW91dENvdW50ZG93biA9IG51bGw7CiAgICBm -dW5jdGlvbiBfc2hvd1NlcnZlclRpbWVvdXRXYXJuaW5nKHJlbWFpbmluZ1NlYykgewogICAgICAg -IGlmIChfc2VydmVyVGltZW91dE1vZGFsKSByZXR1cm47IC8vIEJlcmVpdHMgc2ljaHRiYXIKICAg -ICAgICAvLyBPdmVybGF5CiAgICAgICAgdmFyIG92ZXJsYXkgPSBkb2N1bWVudC5jcmVhdGVFbGVt -ZW50KCdkaXYnKTsKICAgICAgICBvdmVybGF5LmlkID0gJ3NlcnZlclRpbWVvdXRPdmVybGF5JzsK -ICAgICAgICBvdmVybGF5LnN0eWxlLmNzc1RleHQgPSAncG9zaXRpb246Zml4ZWQ7aW5zZXQ6MDt6 -LWluZGV4OjExMDAwO2JhY2tncm91bmQ6cmdiYSgwLDAsMCwwLjUpO2Rpc3BsYXk6ZmxleDthbGln -bi1pdGVtczpjZW50ZXI7anVzdGlmeS1jb250ZW50OmNlbnRlcjthbmltYXRpb246ZmFkZUluIC4z -cyBlYXNlOyc7CiAgICAgICAgLy8gTW9kYWwKICAgICAgICB2YXIgbW9kYWwgPSBkb2N1bWVudC5j -cmVhdGVFbGVtZW50KCdkaXYnKTsKICAgICAgICBtb2RhbC5zdHlsZS5jc3NUZXh0ID0gJ2JhY2tn -cm91bmQ6dmFyKC0tYmctY2FyZCwjZmZmKTtib3JkZXItcmFkaXVzOjEycHg7cGFkZGluZzozMnB4 -O21heC13aWR0aDo0NjBweDt3aWR0aDo5MCU7Ym94LXNoYWRvdzowIDEycHggNDhweCByZ2JhKDAs -MCwwLDAuMjUpO3RleHQtYWxpZ246Y2VudGVyOyc7CiAgICAgICAgdmFyIGNvdW50ZG93blNlYyA9 -IE1hdGgubWF4KDAsIE1hdGgucm91bmQocmVtYWluaW5nU2VjKSk7CiAgICAgICAgbW9kYWwuaW5u -ZXJIVE1MID0KICAgICAgICAgICAgJzxkaXYgc3R5bGU9ImZvbnQtc2l6ZTo0MHB4O21hcmdpbi1i -b3R0b206MTJweDsiPiYjOTg4ODs8L2Rpdj4nICsKICAgICAgICAgICAgJzxkaXYgc3R5bGU9ImNv -bG9yOnZhcigtLXRleHQtaGVhZGluZywjMzMzKTtmb250LXNpemU6MThweDtmb250LXdlaWdodDo3 -MDA7bWFyZ2luLWJvdHRvbTo4cHg7Ij5TZXJ2ZXIgd2lyZCBiZWVuZGV0PC9kaXY+JyArCiAgICAg -ICAgICAgICc8ZGl2IGlkPSJzZXJ2ZXJUaW1lb3V0Q291bnRkb3duIiBzdHlsZT0iY29sb3I6I2U3 -NGMzYztmb250LXNpemU6MjhweDtmb250LXdlaWdodDo3MDA7bWFyZ2luLWJvdHRvbToxNnB4OyI+ -JyArIF9mbXRDb3VudGRvd24oY291bnRkb3duU2VjKSArICc8L2Rpdj4nICsKICAgICAgICAgICAg -JzxkaXYgc3R5bGU9ImNvbG9yOnZhcigtLXRleHQtcHJpbWFyeSwjNTU1KTtmb250LXNpemU6MTRw -eDtsaW5lLWhlaWdodDoxLjc7bWFyZ2luLWJvdHRvbToyMHB4OyI+JyArCiAgICAgICAgICAgICAg -ICAnRGVyIERSSVZFLVNlcnZlciB3YXIgbGFlbmdlcmUgWmVpdCBpbmFrdGl2IHVuZCB3aXJkIHNp -Y2ggaW4gS3VlcnplIGF1dG9tYXRpc2NoIGJlZW5kZW4uPGJyPjxicj4nICsKICAgICAgICAgICAg -ICAgICc8c3Ryb25nIHN0eWxlPSJjb2xvcjp2YXIoLS10ZXh0LWhlYWRpbmcsIzMzMyk7Ij5LZWlu -ZSBTb3JnZTo8L3N0cm9uZz4gT2ZmZW5lIEFydGlrZWwgd3VyZGVuIGF1dG9tYXRpc2NoIGFscyA8 -c3Ryb25nPkVudHd1cmY8L3N0cm9uZz4gZ2VzcGVpY2hlcnQgdW5kIGdlaGVuIG5pY2h0IHZlcmxv -cmVuLicgKwogICAgICAgICAgICAnPC9kaXY+JyArCiAgICAgICAgICAgICc8ZGl2IHN0eWxlPSJi -YWNrZ3JvdW5kOnZhcigtLWJnLW1haW4sI2Y1ZjVmNSk7Ym9yZGVyLXJhZGl1czo4cHg7cGFkZGlu -ZzoxNHB4IDE4cHg7bWFyZ2luLWJvdHRvbToyMHB4O3RleHQtYWxpZ246bGVmdDsiPicgKwogICAg -ICAgICAgICAgICAgJzxkaXYgc3R5bGU9ImNvbG9yOnZhcigtLXRleHQtc2Vjb25kYXJ5LCM3Nzcp -O2ZvbnQtc2l6ZToxMnB4O2ZvbnQtd2VpZ2h0OjYwMDt0ZXh0LXRyYW5zZm9ybTp1cHBlcmNhc2U7 -bWFyZ2luLWJvdHRvbTo2cHg7Ij5TbyBnZWh0cyB3ZWl0ZXI8L2Rpdj4nICsKICAgICAgICAgICAg +ICAgICAgICAgICAgICAgICAgICAgICAgICAgJzx0ZD48ZW0gc3R5bGU9ImNvbG9yOnZhcigtLXRl +eHQtbXV0ZWQpOyI+S2VpbiBSZXZpZXdlciB6dWdld2llc2VuPC9lbT48L3RkPjwvdHI+JzsKICAg +ICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIGh0 +bWwgKz0gJzwvdGJvZHk+PC90YWJsZT4nOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAg +ICAgICAgaHRtbCArPSAnPHAgc3R5bGU9ImNvbG9yOnZhcigtLXRleHQtbXV0ZWQpOyI+S2VpbmUg +S2F0ZWdvcmllbiB2ZXJmw7xnYmFyLjwvcD4nOwogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNl +IHsKICAgICAgICAgICAgLy8gU2VydmVyLU1vZHVzOiBWb2xsc3TDpG5kaWdlIEFuc2ljaHQgbWl0 +IGFsbGVuIFJvbGxlbgoKICAgICAgICAgICAgLy8gU3VwZXJVc2VyCiAgICAgICAgICAgIGh0bWwg +Kz0gJzxoMyBzdHlsZT0iY29sb3I6dmFyKC0tdGV4dC1oZWFkaW5nKTsgbWFyZ2luLWJvdHRvbTo4 +cHg7Ij5TeXN0ZW1hZG1pbmlzdHJhdGlvbjwvaDM+JzsKICAgICAgICAgICAgaHRtbCArPSAnPHRh +YmxlIGNsYXNzPSJpbXByaW50LXRhYmxlIj48dGhlYWQ+PHRyPjx0aD5OYW1lPC90aD48dGg+QmVu +dXR6ZXItSUQ8L3RoPjx0aD5Sb2xsZTwvdGg+PC90cj48L3RoZWFkPjx0Ym9keT4nOwogICAgICAg +ICAgICBpZiAoZ292ICYmIGdvdi5zdXBlclVzZXJzKSB7CiAgICAgICAgICAgICAgICBnb3Yuc3Vw +ZXJVc2Vycy5mb3JFYWNoKHN1ID0+IHsKICAgICAgICAgICAgICAgICAgICBodG1sICs9ICc8dHI+ +PHRkPicgKyBEcml2ZVBvcnRhbC5lc2NhcGVIVE1MKHN1LmRpc3BsYXlOYW1lIHx8IHN1LnVzZXJu +YW1lKSArICc8L3RkPicgKwogICAgICAgICAgICAgICAgICAgICAgICAnPHRkPicgKyBEcml2ZVBv +cnRhbC5lc2NhcGVIVE1MKHN1LnVzZXJuYW1lKSArICc8L3RkPicgKwogICAgICAgICAgICAgICAg +ICAgICAgICAnPHRkIHN0eWxlPSJmb250LXdlaWdodDo2MDA7IGNvbG9yOnZhcigtLXRleHQtaGVh +ZGluZyk7Ij5TdXBlclVzZXI8L3RkPjwvdHI+JzsKICAgICAgICAgICAgICAgIH0pOwogICAgICAg +ICAgICB9CiAgICAgICAgICAgIGh0bWwgKz0gJzwvdGJvZHk+PC90YWJsZT4nOwoKICAgICAgICAg +ICAgLy8gRmFjaGF1ZnNpY2h0CiAgICAgICAgICAgIGlmIChnb3YgJiYgZ292LmZhY2hhdWZzaWNo +dCAmJiBnb3YuZmFjaGF1ZnNpY2h0Lmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgICAgIGh0bWwg +Kz0gJzxoMyBzdHlsZT0iY29sb3I6dmFyKC0tdGV4dC1oZWFkaW5nKTsgbWFyZ2luOjIwcHggMCA4 +cHg7Ij5GYWNoYXVmc2ljaHQ8L2gzPic7CiAgICAgICAgICAgICAgICBodG1sICs9ICc8dGFibGUg +Y2xhc3M9ImltcHJpbnQtdGFibGUiPjx0aGVhZD48dHI+PHRoPk5hbWU8L3RoPjx0aD5CZW51dHpl +ci1JRDwvdGg+PHRoPlp1c3TDpG5kaWdrZWl0PC90aD48L3RyPjwvdGhlYWQ+PHRib2R5Pic7CiAg +ICAgICAgICAgICAgICBnb3YuZmFjaGF1ZnNpY2h0LmZvckVhY2goZnVuY3Rpb24oZmEpIHsKICAg +ICAgICAgICAgICAgICAgICBodG1sICs9ICc8dHI+PHRkPicgKyBEcml2ZVBvcnRhbC5lc2NhcGVI +VE1MKGZhLmRpc3BsYXlOYW1lIHx8IGZhLnVzZXJuYW1lKSArICc8L3RkPicgKwogICAgICAgICAg +ICAgICAgICAgICAgICAnPHRkPicgKyBEcml2ZVBvcnRhbC5lc2NhcGVIVE1MKGZhLnVzZXJuYW1l +KSArICc8L3RkPicgKwogICAgICAgICAgICAgICAgICAgICAgICAnPHRkIHN0eWxlPSJmb250LXdl +aWdodDo2MDA7IGNvbG9yOiNlNTczNzM7Ij5BbGxlIEthdGVnb3JpZW48L3RkPjwvdHI+JzsKICAg +ICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgaHRtbCArPSAnPC90Ym9keT48L3RhYmxl +Pic7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIFp1c3RhZW5kaWdrZWl0IG5hY2ggS2F0 +ZWdvcmllIChzb3J0aWVyYmFyZSBUYWJlbGxlKQogICAgICAgICAgICBodG1sICs9ICc8aDMgc3R5 +bGU9ImNvbG9yOnZhcigtLXRleHQtaGVhZGluZyk7IG1hcmdpbjoyMHB4IDAgOHB4OyI+WnVzdMOk +bmRpZ2tlaXQgbmFjaCBLYXRlZ29yaWU8L2gzPic7CiAgICAgICAgICAgIHZhciBpbXBIaWRkZW5L +YXRzID0gRHJpdmVGUy5jb25maWcuaGlkZGVuS2F0ZWdvcmllbiB8fCBbXTsKICAgICAgICAgICAg +dmFyIHJldmlld2VycyA9IChnb3YgJiYgZ292LnJldmlld2VycykgPyBnb3YucmV2aWV3ZXJzIDog +W107CiAgICAgICAgICAgIGh0bWwgKz0gJzx0YWJsZSBjbGFzcz0iaW1wcmludC10YWJsZSIgaWQ9 +ImltcHJpbnRDYXRUYWJsZSI+PHRoZWFkPjx0cj4nICsKICAgICAgICAgICAgICAgICc8dGggc3R5 +bGU9ImN1cnNvcjpwb2ludGVyOyIgb25jbGljaz0iRHJpdmVHb3Zlcm5hbmNlLl9zb3J0SW1wcmlu +dFRhYmxlKDApIj5LYXRlZ29yaWUg4oaVPC90aD4nICsKICAgICAgICAgICAgICAgICc8dGggc3R5 +bGU9ImN1cnNvcjpwb2ludGVyOyIgb25jbGljaz0iRHJpdmVHb3Zlcm5hbmNlLl9zb3J0SW1wcmlu +dFRhYmxlKDEpIj5adXN0w6RuZGlnIOKGlTwvdGg+JyArCiAgICAgICAgICAgICAgICAnPHRoIHN0 +eWxlPSJjdXJzb3I6cG9pbnRlcjsiIG9uY2xpY2s9IkRyaXZlR292ZXJuYW5jZS5fc29ydEltcHJp +bnRUYWJsZSgyKSI+QmVudXR6ZXItSUQg4oaVPC90aD4nICsKICAgICAgICAgICAgJzwvdHI+PC90 +aGVhZD48dGJvZHk+JzsKICAgICAgICAgICAgKERyaXZlRlMuY29uZmlnLmthdGVnb3JpZW4gfHwg +W10pLmZpbHRlcihmdW5jdGlvbihrYXQpIHsgcmV0dXJuICFpbXBIaWRkZW5LYXRzLmluY2x1ZGVz +KGthdCk7IH0pLmZvckVhY2goZnVuY3Rpb24oa2F0KSB7CiAgICAgICAgICAgICAgICB2YXIgenVz +dGFlbmRpZyA9IHJldmlld2Vycy5maWx0ZXIoZnVuY3Rpb24ocikgeyByZXR1cm4gKHIua2F0ZWdv +cmllbiB8fCBbXSkuaW5jbHVkZXMoa2F0KTsgfSk7CiAgICAgICAgICAgICAgICBpZiAoenVzdGFl +bmRpZy5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgenVzdGFlbmRpZy5mb3JFYWNo +KGZ1bmN0aW9uKHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaHRtbCArPSAnPHRyPjx0ZD48 +c3Ryb25nPicgKyBEcml2ZVBvcnRhbC5lc2NhcGVIVE1MKGthdCkgKyAnPC9zdHJvbmc+PC90ZD4n +ICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICc8dGQ+JyArIERyaXZlUG9ydGFsLmVzY2Fw +ZUhUTUwoci5kaXNwbGF5TmFtZSB8fCByLnVzZXJuYW1lKSArICc8L3RkPicgKwogICAgICAgICAg +ICAgICAgICAgICAgICAgICAgJzx0ZCBzdHlsZT0iZm9udC1zaXplOjEycHg7Y29sb3I6dmFyKC0t +dGV4dC1zZWNvbmRhcnkpOyI+JyArIERyaXZlUG9ydGFsLmVzY2FwZUhUTUwoci51c2VybmFtZSkg +KyAnPC90ZD48L3RyPic7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9 +IGVsc2UgewogICAgICAgICAgICAgICAgICAgIGh0bWwgKz0gJzx0cj48dGQ+PHN0cm9uZz4nICsg +RHJpdmVQb3J0YWwuZXNjYXBlSFRNTChrYXQpICsgJzwvc3Ryb25nPjwvdGQ+JyArCiAgICAgICAg +ICAgICAgICAgICAgICAgICc8dGQgY29sc3Bhbj0iMiI+PGVtIHN0eWxlPSJjb2xvcjp2YXIoLS10 +ZXh0LW11dGVkKTsiPktlaW4gUmV2aWV3ZXIgenVnZXdpZXNlbjwvZW0+PC90ZD48L3RyPic7CiAg +ICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBodG1sICs9ICc8L3Ri +b2R5PjwvdGFibGU+JzsKICAgICAgICB9CgogICAgICAgIGh0bWwgKz0gJzxwIHN0eWxlPSJtYXJn +aW4tdG9wOjIwcHg7IGZvbnQtc2l6ZToxMXB4OyBjb2xvcjp2YXIoLS10ZXh0LW11dGVkKTsiPlN0 +YW5kOiAnICsgbmV3IERhdGUoKS50b0xvY2FsZURhdGVTdHJpbmcoJ2RlLURFJywge2RheTonMi1k +aWdpdCcsbW9udGg6JzItZGlnaXQnLHllYXI6J251bWVyaWMnfSkgKyAnPC9wPic7CgogICAgICAg +IGJvZHkuaW5uZXJIVE1MID0gaHRtbDsKICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgn +aW1wcmludE1vZGFsJykuY2xhc3NMaXN0LmFkZCgnYWN0aXZlJyk7CiAgICB9LAoKICAgIF9pbXBy +aW50U29ydENvbDogLTEsCiAgICBfaW1wcmludFNvcnRBc2M6IHRydWUsCgogICAgX3NvcnRJbXBy +aW50VGFibGUoY29sSWR4KSB7CiAgICAgICAgdmFyIHRhYmxlID0gZG9jdW1lbnQuZ2V0RWxlbWVu +dEJ5SWQoJ2ltcHJpbnRDYXRUYWJsZScpOwogICAgICAgIGlmICghdGFibGUpIHJldHVybjsKICAg +ICAgICB2YXIgdGJvZHkgPSB0YWJsZS5xdWVyeVNlbGVjdG9yKCd0Ym9keScpOwogICAgICAgIGlm +ICghdGJvZHkpIHJldHVybjsKCiAgICAgICAgLy8gU29ydGllcnJpY2h0dW5nIHVtc2NoYWx0ZW4K +ICAgICAgICBpZiAodGhpcy5faW1wcmludFNvcnRDb2wgPT09IGNvbElkeCkgewogICAgICAgICAg +ICB0aGlzLl9pbXByaW50U29ydEFzYyA9ICF0aGlzLl9pbXByaW50U29ydEFzYzsKICAgICAgICB9 +IGVsc2UgewogICAgICAgICAgICB0aGlzLl9pbXByaW50U29ydENvbCA9IGNvbElkeDsKICAgICAg +ICAgICAgdGhpcy5faW1wcmludFNvcnRBc2MgPSB0cnVlOwogICAgICAgIH0KICAgICAgICB2YXIg +YXNjID0gdGhpcy5faW1wcmludFNvcnRBc2M7CgogICAgICAgIHZhciByb3dzID0gQXJyYXkuZnJv +bSh0Ym9keS5xdWVyeVNlbGVjdG9yQWxsKCd0cicpKTsKICAgICAgICByb3dzLnNvcnQoZnVuY3Rp +b24oYSwgYikgewogICAgICAgICAgICB2YXIgYVRleHQgPSAoYS5jZWxsc1tjb2xJZHhdID8gYS5j +ZWxsc1tjb2xJZHhdLnRleHRDb250ZW50LnRyaW0oKSA6ICcnKS50b0xvd2VyQ2FzZSgpOwogICAg +ICAgICAgICB2YXIgYlRleHQgPSAoYi5jZWxsc1tjb2xJZHhdID8gYi5jZWxsc1tjb2xJZHhdLnRl +eHRDb250ZW50LnRyaW0oKSA6ICcnKS50b0xvd2VyQ2FzZSgpOwogICAgICAgICAgICB2YXIgY21w +ID0gYVRleHQubG9jYWxlQ29tcGFyZShiVGV4dCwgJ2RlJyk7CiAgICAgICAgICAgIHJldHVybiBh +c2MgPyBjbXAgOiAtY21wOwogICAgICAgIH0pOwogICAgICAgIHJvd3MuZm9yRWFjaChmdW5jdGlv +bihyb3cpIHsgdGJvZHkuYXBwZW5kQ2hpbGQocm93KTsgfSk7CiAgICB9LAoKICAgIGNsb3NlSW1w +cmludCgpIHsKICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW1wcmludE1vZGFsJyku +Y2xhc3NMaXN0LnJlbW92ZSgnYWN0aXZlJyk7CiAgICB9Cn07CgovLyA9PT09PT09PT09PT09PT09 +PT09PT0gSU5JVCA9PT09PT09PT09PT09PT09PT09PT0KCmRvY3VtZW50LmFkZEV2ZW50TGlzdGVu +ZXIoJ0RPTUNvbnRlbnRMb2FkZWQnLCBhc3luYyAoKSA9PiB7CiAgICAvLyBDbGljay1IYW5kbGVy +IGZ1ZXIgaW5saW5lIE1lZGllbiBpbiBkZXIgRGV0YWlsLUFuc2ljaHQKICAgIGRvY3VtZW50Lmdl +dEVsZW1lbnRCeUlkKCdkb2N1bWVudERldGFpbCcpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywg +KGUpID0+IHsKICAgICAgICAvLyBCaWxkZXIgaW4gLmRyaXZlLW1lZGlhLXRodW1ibmFpbAogICAg +ICAgIGNvbnN0IHRodW1iID0gZS50YXJnZXQuY2xvc2VzdCgnLmRyaXZlLW1lZGlhLXRodW1ibmFp +bCcpOwogICAgICAgIGlmICh0aHVtYiAmJiAhZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VkaXRv +ck1vZGFsJykuY2xhc3NMaXN0LmNvbnRhaW5zKCdhY3RpdmUnKSkgewogICAgICAgICAgICBjb25z +dCBpbWcgPSB0aHVtYi5xdWVyeVNlbGVjdG9yKCdpbWcnKTsKICAgICAgICAgICAgaWYgKGltZykg +ewogICAgICAgICAgICAgICAgb3Blbk1lZGlhTW9kYWwoaW1nLnNyYywgJ2ltYWdlJywgaW1nLmFs +dCB8fCAnJyk7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICB9 +CiAgICAgICAgLy8gQmlsZGVyIGRpcmVrdCBhbmdla2xpY2t0IChpbiAuZHJpdmUtbWVkaWEtbGFy +Z2Ugb2RlciBhbHRlIEJpbGRlcikKICAgICAgICBpZiAoZS50YXJnZXQudGFnTmFtZSA9PT0gJ0lN +RycgJiYgZS50YXJnZXQuY2xvc2VzdCgnLmRldGFpbC1jb250ZW50JykpIHsKICAgICAgICAgICAg +b3Blbk1lZGlhTW9kYWwoZS50YXJnZXQuc3JjLCAnaW1hZ2UnLCBlLnRhcmdldC5hbHQgfHwgJycp +OwogICAgICAgIH0KCiAgICAgICAgLy8gU2ljaGVyaGVpdHNuZXR6OiBBbGxlIGV4dGVybmVuIExp +bmtzIGltIEFydGlrZWxpbmhhbHQgaW4gbmV1ZW0gVGFiIG9lZmZuZW4uCiAgICAgICAgLy8gVmVy +aGluZGVydCwgZGFzcyBkYXMgUG9ydGFsIGR1cmNoIExpbmtzIGF1cyBrb3BpZXJ0ZW4vYmVzdGVo +ZW5kZW4gSW5oYWx0ZW4KICAgICAgICAvLyB2ZXJsYXNzZW4gd2lyZCAoYXVjaCBiZWkgQWx0ZGF0 +ZW4gZGllIG5vY2ggdGFyZ2V0PV9zZWxmIGhhYmVuKS4KICAgICAgICB2YXIgbGluayA9IGUudGFy +Z2V0LmNsb3Nlc3QoJ2FbaHJlZl0nKTsKICAgICAgICBpZiAobGluayAmJiBsaW5rLmNsb3Nlc3Qo +Jy5kZXRhaWwtY29udGVudCwgI2VkaXRvcklucHV0JykpIHsKICAgICAgICAgICAgdmFyIGhyZWYg +PSAobGluay5nZXRBdHRyaWJ1dGUoJ2hyZWYnKSB8fCAnJykudHJpbSgpOwogICAgICAgICAgICAv +LyBJbnRlcm5lIEFua2VyICgjLi4uKSB1bmQgRFJJVkUtQ3Jvc3NsaW5rcyBhdXNuZWhtZW4KICAg +ICAgICAgICAgaWYgKCFocmVmLnN0YXJ0c1dpdGgoJyMnKSAmJiAhbGluay5jbGFzc0xpc3QuY29u +dGFpbnMoJ2RyaXZlLXhyZWYnKSkgewogICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgp +OwogICAgICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTsKICAgICAgICAgICAgICAgIHdp +bmRvdy5vcGVuKGhyZWYsICdfYmxhbmsnLCAnbm9vcGVuZXIsbm9yZWZlcnJlcicpOwogICAgICAg +ICAgICB9CiAgICAgICAgfQogICAgfSk7CgogICAgLy8gQ29udGV4dC1NZW51IHNjaGxpZXNzZW4g +YmVpIEtsaWNrIGF1c3NlcmhhbGIKICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNr +JywgKGUpID0+IHsKICAgICAgICBpZiAoIWUudGFyZ2V0LmNsb3Nlc3QoJy5tZWRpYS1jb250ZXh0 +LW1lbnUnKSAmJiAhZS50YXJnZXQuY2xvc2VzdCgnLmRyaXZlLW1lZGlhJykpIHsKICAgICAgICAg +ICAgRHJpdmVFZGl0b3IuaGlkZUNvbnRleHRNZW51KCk7CiAgICAgICAgfQogICAgfSk7CgogICAg +Ly8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 +PT09PT09PT09PT0KICAgIC8vIFNlc3Npb24tU2NodXR6OiBIZWFydGJlYXQsIEF1dG8tU2F2ZSwg +V2FybnVuZywgV2llZGVyYXVmbmFobWUKICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09 +PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgogICAgLy8gQWt0dWVsbGUg +RWRpdG9yLURhdGVuIGZ1ZXIgQXV0by1TYXZlIHNhbW1lbG4gKG9obmUgVmFsaWRpZXJ1bmcvV29y +a2Zsb3cpCiAgICBmdW5jdGlvbiBfZ2F0aGVyRWRpdG9yU25hcHNob3QoKSB7CiAgICAgICAgaWYg +KCFEcml2ZUVkaXRvci5jdXJyZW50RG9jKSByZXR1cm4gbnVsbDsKICAgICAgICB2YXIgZWRpdG9y +ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VkaXRvcklucHV0Jyk7CiAgICAgICAgdmFyIHRp +dGVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VkaXRvclRpdGVsJyk7CiAgICAgICAgaWYg +KCFlZGl0b3IgJiYgIXRpdGVsKSByZXR1cm4gbnVsbDsKICAgICAgICB2YXIgc25hcCA9IEpTT04u +cGFyc2UoSlNPTi5zdHJpbmdpZnkoRHJpdmVFZGl0b3IuY3VycmVudERvYykpOwogICAgICAgIGlm +ICh0aXRlbCkgc25hcC50aXRlbCA9IHRpdGVsLnZhbHVlLnRyaW0oKTsKICAgICAgICBpZiAoZWRp +dG9yKSBzbmFwLmluaGFsdCA9IGVkaXRvci5pbm5lckhUTUw7CiAgICAgICAgdmFyIGthdCA9IGRv +Y3VtZW50LmdldEVsZW1lbnRCeUlkKCdlZGl0b3JLYXRlZ29yaWUnKTsKICAgICAgICBpZiAoa2F0 +KSBzbmFwLmthdGVnb3JpZSA9IGthdC52YWx1ZTsKICAgICAgICB2YXIgc3RhdHVzID0gZG9jdW1l +bnQuZ2V0RWxlbWVudEJ5SWQoJ2VkaXRvclN0YXR1cycpOwogICAgICAgIGlmIChzdGF0dXMpIHNu +YXAuX2xhc3RFZGl0b3JTdGF0dXMgPSBzdGF0dXMudmFsdWU7CiAgICAgICAgc25hcC5zdGF0dXMg +PSAnRW50d3VyZic7CiAgICAgICAgc25hcC5zY2hsYWd3b2VydGVyID0gRHJpdmVFZGl0b3IuX2N1 +cnJlbnRLZXl3b3JkcyA/IFsuLi5Ecml2ZUVkaXRvci5fY3VycmVudEtleXdvcmRzXSA6IChzbmFw +LnNjaGxhZ3dvZXJ0ZXIgfHwgW10pOwogICAgICAgIHJldHVybiBzbmFwOwogICAgfQoKICAgIC8v +IEF1dG8tU2F2ZTogRW50d3VyZiBhdWYgZGVtIFNlcnZlciBzcGVpY2hlcm4gKyBsb2NhbFN0b3Jh +Z2UtQmFja3VwCiAgICBhc3luYyBmdW5jdGlvbiBfZW1lcmdlbmN5U2F2ZURyYWZ0KCkgewogICAg +ICAgIHZhciBzbmFwID0gX2dhdGhlckVkaXRvclNuYXBzaG90KCk7CiAgICAgICAgaWYgKCFzbmFw +KSByZXR1cm4gZmFsc2U7CiAgICAgICAgLy8gbG9jYWxTdG9yYWdlLUJhY2t1cCAoaW1tZXIsIGF1 +Y2ggd2VubiBTZXJ2ZXItU2F2ZSBmZWhsc2NobGFlZ3QpCiAgICAgICAgdHJ5IHsKICAgICAgICAg +ICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ2RyaXZlLXJlc3VtZS1kb2MnLCBKU09OLnN0cmluZ2lm +eSh7CiAgICAgICAgICAgICAgICBkb2NJZDogc25hcC5pZCwKICAgICAgICAgICAgICAgIHRpdGVs +OiBzbmFwLnRpdGVsLAogICAgICAgICAgICAgICAga2F0ZWdvcmllOiBzbmFwLmthdGVnb3JpZSwK +ICAgICAgICAgICAgICAgIHRpbWVzdGFtcDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLAogICAg +ICAgICAgICAgICAgaXNOZXc6IERyaXZlRWRpdG9yLmlzTmV3CiAgICAgICAgICAgIH0pKTsKICAg +ICAgICB9IGNhdGNoKGUpIHt9CiAgICAgICAgLy8gU2VydmVyLVNhdmUgYWxzIEVudHd1cmYKICAg +ICAgICBpZiAoRHJpdmVGUy5tb2RlID09PSAnc2VydmVyJykgewogICAgICAgICAgICB0cnkgewog +ICAgICAgICAgICAgICAgc25hcC5nZWFlbmRlcnQgPSBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCku +c3BsaXQoJ1QnKVswXTsKICAgICAgICAgICAgICAgIHZhciB1c2VybmFtZSA9IChEcml2ZUZTLmVu +dmlyb24gJiYgRHJpdmVGUy5lbnZpcm9uLnVzZXJuYW1lKSA/IERyaXZlRlMuZW52aXJvbi51c2Vy +bmFtZSA6ICdVbmJla2FubnQnOwogICAgICAgICAgICAgICAgc25hcC5iZWFyYmVpdGV0Vm9uID0g +dXNlcm5hbWU7CiAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gYXdhaXQgRHJpdmVGUy5zYXZl +RG9jdW1lbnQoc25hcCk7CiAgICAgICAgICAgICAgICBpZiAocmVzdWx0ID09PSB0cnVlKSB7CiAg +ICAgICAgICAgICAgICAgICAgLy8gY3VycmVudERvYyBha3R1YWxpc2llcmVuIGRhbWl0IGNsb3Nl +KCkga2VpbmVuIERhdGVudmVybHVzdCB2ZXJ1cnNhY2h0CiAgICAgICAgICAgICAgICAgICAgRHJp +dmVFZGl0b3IuY3VycmVudERvYyA9IHNuYXA7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRy +dWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gY2F0Y2goZSkge30KICAgICAgICB9 +CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQoKICAgIC8vIFRpbWVvdXQtV2FybnVuZzogSW5m +by1Nb2RhbCAxIE1pbnV0ZSB2b3IgU2VydmVyLVNodXRkb3duCiAgICB2YXIgX3NlcnZlclRpbWVv +dXRNb2RhbCA9IG51bGw7CiAgICB2YXIgX3NlcnZlclRpbWVvdXRDb3VudGRvd24gPSBudWxsOwog +ICAgZnVuY3Rpb24gX3Nob3dTZXJ2ZXJUaW1lb3V0V2FybmluZyhyZW1haW5pbmdTZWMpIHsKICAg +ICAgICBpZiAoX3NlcnZlclRpbWVvdXRNb2RhbCkgcmV0dXJuOyAvLyBCZXJlaXRzIHNpY2h0YmFy +CiAgICAgICAgLy8gT3ZlcmxheQogICAgICAgIHZhciBvdmVybGF5ID0gZG9jdW1lbnQuY3JlYXRl +RWxlbWVudCgnZGl2Jyk7CiAgICAgICAgb3ZlcmxheS5pZCA9ICdzZXJ2ZXJUaW1lb3V0T3Zlcmxh +eSc7CiAgICAgICAgb3ZlcmxheS5zdHlsZS5jc3NUZXh0ID0gJ3Bvc2l0aW9uOmZpeGVkO2luc2V0 +OjA7ei1pbmRleDoxMTAwMDtiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsMC41KTtkaXNwbGF5OmZsZXg7 +YWxpZ24taXRlbXM6Y2VudGVyO2p1c3RpZnktY29udGVudDpjZW50ZXI7YW5pbWF0aW9uOmZhZGVJ +biAuM3MgZWFzZTsnOwogICAgICAgIC8vIE1vZGFsCiAgICAgICAgdmFyIG1vZGFsID0gZG9jdW1l +bnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CiAgICAgICAgbW9kYWwuc3R5bGUuY3NzVGV4dCA9ICdi +YWNrZ3JvdW5kOnZhcigtLWJnLWNhcmQsI2ZmZik7Ym9yZGVyLXJhZGl1czoxMnB4O3BhZGRpbmc6 +MzJweDttYXgtd2lkdGg6NDYwcHg7d2lkdGg6OTAlO2JveC1zaGFkb3c6MCAxMnB4IDQ4cHggcmdi +YSgwLDAsMCwwLjI1KTt0ZXh0LWFsaWduOmNlbnRlcjsnOwogICAgICAgIHZhciBjb3VudGRvd25T +ZWMgPSBNYXRoLm1heCgwLCBNYXRoLnJvdW5kKHJlbWFpbmluZ1NlYykpOwogICAgICAgIG1vZGFs +LmlubmVySFRNTCA9CiAgICAgICAgICAgICc8ZGl2IHN0eWxlPSJmb250LXNpemU6NDBweDttYXJn +aW4tYm90dG9tOjEycHg7Ij4mIzk4ODg7PC9kaXY+JyArCiAgICAgICAgICAgICc8ZGl2IHN0eWxl +PSJjb2xvcjp2YXIoLS10ZXh0LWhlYWRpbmcsIzMzMyk7Zm9udC1zaXplOjE4cHg7Zm9udC13ZWln +aHQ6NzAwO21hcmdpbi1ib3R0b206OHB4OyI+U2VydmVyIHdpcmQgYmVlbmRldDwvZGl2PicgKwog +ICAgICAgICAgICAnPGRpdiBpZD0ic2VydmVyVGltZW91dENvdW50ZG93biIgc3R5bGU9ImNvbG9y +OiNlNzRjM2M7Zm9udC1zaXplOjI4cHg7Zm9udC13ZWlnaHQ6NzAwO21hcmdpbi1ib3R0b206MTZw +eDsiPicgKyBfZm10Q291bnRkb3duKGNvdW50ZG93blNlYykgKyAnPC9kaXY+JyArCiAgICAgICAg ICAgICc8ZGl2IHN0eWxlPSJjb2xvcjp2YXIoLS10ZXh0LXByaW1hcnksIzU1NSk7Zm9udC1zaXpl -OjEzcHg7bGluZS1oZWlnaHQ6MS42OyI+JyArCiAgICAgICAgICAgICAgICAgICAgJzEuIERpZXNl -biBUYWIgc2NobGllc3Nlbjxicj4nICsKICAgICAgICAgICAgICAgICAgICAnMi4gPHN0cm9uZz5E -UklWRV9TdGFydC5iYXQ8L3N0cm9uZz4gZXJuZXV0IGF1c2Z1ZWhyZW48YnI+JyArCiAgICAgICAg -ICAgICAgICAgICAgJzMuIERlciBnZXNwZWljaGVydGUgRW50d3VyZiBrYW5uIGRhbm4gZm9ydGdl -c2V0enQgd2VyZGVuJyArCiAgICAgICAgICAgICAgICAnPC9kaXY+JyArCiAgICAgICAgICAgICc8 -L2Rpdj4nICsKICAgICAgICAgICAgJzxkaXYgc3R5bGU9ImRpc3BsYXk6ZmxleDtnYXA6MTBweDtq -dXN0aWZ5LWNvbnRlbnQ6Y2VudGVyOyI+JyArCiAgICAgICAgICAgICAgICAnPGJ1dHRvbiBpZD0i -c2VydmVyVGltZW91dFJlc3VtZSIgc3R5bGU9InBhZGRpbmc6MTBweCAyNHB4O2JvcmRlci1yYWRp -dXM6NnB4O2JvcmRlcjpub25lO2JhY2tncm91bmQ6IzI3YWU2MDtjb2xvcjojZmZmO2N1cnNvcjpw -b2ludGVyO2ZvbnQtd2VpZ2h0OjYwMDtmb250LXNpemU6MTRweDsiPldlaXRlcmFyYmVpdGVuPC9i -dXR0b24+JyArCiAgICAgICAgICAgICc8L2Rpdj4nOwogICAgICAgIG92ZXJsYXkuYXBwZW5kQ2hp -bGQobW9kYWwpOwogICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQob3ZlcmxheSk7CiAg -ICAgICAgX3NlcnZlclRpbWVvdXRNb2RhbCA9IG92ZXJsYXk7CiAgICAgICAgLy8gQ291bnRkb3du -IGFrdHVhbGlzaWVyZW4KICAgICAgICBfc2VydmVyVGltZW91dENvdW50ZG93biA9IHNldEludGVy -dmFsKGZ1bmN0aW9uKCkgewogICAgICAgICAgICBjb3VudGRvd25TZWMtLTsKICAgICAgICAgICAg -dmFyIGVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlcnZlclRpbWVvdXRDb3VudGRvd24n -KTsKICAgICAgICAgICAgaWYgKGVsKSBlbC50ZXh0Q29udGVudCA9IF9mbXRDb3VudGRvd24oTWF0 -aC5tYXgoMCwgY291bnRkb3duU2VjKSk7CiAgICAgICAgICAgIGlmIChjb3VudGRvd25TZWMgPD0g -MCkgewogICAgICAgICAgICAgICAgY2xlYXJJbnRlcnZhbChfc2VydmVyVGltZW91dENvdW50ZG93 -bik7CiAgICAgICAgICAgICAgICBfc2VydmVyVGltZW91dENvdW50ZG93biA9IG51bGw7CiAgICAg -ICAgICAgICAgICAvLyBNb2RhbC1UZXh0IGFrdHVhbGlzaWVyZW46IFNlcnZlciBpc3QgamV0enQg -YmVlbmRldAogICAgICAgICAgICAgICAgaWYgKGVsKSBlbC50ZXh0Q29udGVudCA9ICdTZXJ2ZXIg -YmVlbmRldCc7CiAgICAgICAgICAgICAgICB2YXIgYnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5 -SWQoJ3NlcnZlclRpbWVvdXRSZXN1bWUnKTsKICAgICAgICAgICAgICAgIGlmIChidG4pIGJ0bi5y -ZW1vdmUoKTsKICAgICAgICAgICAgfQogICAgICAgIH0sIDEwMDApOwogICAgICAgIC8vIFdlaXRl -cmFyYmVpdGVuLUJ1dHRvbjogTW9kYWwgc2NobGllc3NlbiArIEhlYXJ0YmVhdCBzZW5kZW4KICAg -ICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VydmVyVGltZW91dFJlc3VtZScpLm9uY2xp -Y2sgPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgX2hpZGVTZXJ2ZXJUaW1lb3V0V2FybmluZygp -OwogICAgICAgICAgICBmZXRjaCgnL2FwaS9oZWFydGJlYXQnLCB7IG1ldGhvZDogJ1BPU1QnIH0p -LmNhdGNoKGZ1bmN0aW9uKCkge30pOwogICAgICAgIH07CiAgICB9CiAgICBmdW5jdGlvbiBfZm10 -Q291bnRkb3duKHNlYykgewogICAgICAgIHZhciBtID0gTWF0aC5mbG9vcihzZWMgLyA2MCk7CiAg -ICAgICAgdmFyIHMgPSBzZWMgJSA2MDsKICAgICAgICByZXR1cm4gKG0gPiAwID8gbSArICcgTWlu -LiAnIDogJycpICsgcyArICcgU2VrLic7CiAgICB9CiAgICBmdW5jdGlvbiBfaGlkZVNlcnZlclRp -bWVvdXRXYXJuaW5nKCkgewogICAgICAgIGlmIChfc2VydmVyVGltZW91dENvdW50ZG93bikgewog -ICAgICAgICAgICBjbGVhckludGVydmFsKF9zZXJ2ZXJUaW1lb3V0Q291bnRkb3duKTsKICAgICAg -ICAgICAgX3NlcnZlclRpbWVvdXRDb3VudGRvd24gPSBudWxsOwogICAgICAgIH0KICAgICAgICBp -ZiAoX3NlcnZlclRpbWVvdXRNb2RhbCkgewogICAgICAgICAgICBfc2VydmVyVGltZW91dE1vZGFs -LnJlbW92ZSgpOwogICAgICAgICAgICBfc2VydmVyVGltZW91dE1vZGFsID0gbnVsbDsKICAgICAg -ICB9CiAgICB9CgogICAgLy8gVGFiLVNjaGxpZXNzZW4gZXJrZW5uZW46IGJlZm9yZXVubG9hZCAr -IHZpc2liaWxpdHljaGFuZ2Uga29tYmluaWVydC4KICAgIC8vIHZpc2liaWxpdHljaGFuZ2UoJ2hp -ZGRlbicpIGZldWVydCBiZWkgVGFiLVdlY2hzZWwgVU5EIFRhYi1TY2hsaWVzc2VuLAogICAgLy8g -YWJlciBiZWZvcmV1bmxvYWQgZmV1ZXJ0IE5VUiBiZWkgVGFiLVNjaGxpZXNzZW4gLyBOYXZpZ2F0 -aW9uIHdlZy4KICAgIC8vIFN0cmF0ZWdpZTogRmxhZyBpbiBiZWZvcmV1bmxvYWQgc2V0emVuLCBk -YW5uIGluIHBhZ2VoaWRlL3VubG9hZCBkZW4gU2h1dGRvd24gc2VuZGVuLgogICAgdmFyIF90YWJJ -c0Nsb3NpbmcgPSBmYWxzZTsKCiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignYmVmb3JldW5s -b2FkJywgKCkgPT4gewogICAgICAgIF90YWJJc0Nsb3NpbmcgPSB0cnVlOwogICAgICAgIGlmIChE -cml2ZUZTLm1vZGUgPT09ICdzZXJ2ZXInKSB7CiAgICAgICAgICAgIC8vIE9mZmVuZW4gQXJ0aWtl -bCBhbHMgRW50d3VyZiBpbiBsb2NhbFN0b3JhZ2UgbWVya2VuCiAgICAgICAgICAgIHZhciBzbmFw -ID0gX2dhdGhlckVkaXRvclNuYXBzaG90KCk7CiAgICAgICAgICAgIGlmIChzbmFwKSB7CiAgICAg -ICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVt -KCdkcml2ZS1yZXN1bWUtZG9jJywgSlNPTi5zdHJpbmdpZnkoewogICAgICAgICAgICAgICAgICAg -ICAgICBkb2NJZDogc25hcC5pZCwKICAgICAgICAgICAgICAgICAgICAgICAgdGl0ZWw6IHNuYXAu -dGl0ZWwsCiAgICAgICAgICAgICAgICAgICAgICAgIGthdGVnb3JpZTogc25hcC5rYXRlZ29yaWUs -CiAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcDogbmV3IERhdGUoKS50b0lTT1N0cmlu -ZygpLAogICAgICAgICAgICAgICAgICAgICAgICBpc05ldzogRHJpdmVFZGl0b3IuaXNOZXcKICAg -ICAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgICAgICAgICAgLy8gRW50d3VyZiB2aWEg -c2VuZEJlYWNvbiBzcGVpY2hlcm4gKGZpcmUtYW5kLWZvcmdldCwgdWViZXJsZWJ0IFRhYi1DbG9z -ZSkKICAgICAgICAgICAgICAgICAgICB2YXIgcGF0aCA9ICdkYXRhLycgKyBzbmFwLmthdGVnb3Jp -ZSArICcvJyArIHNuYXAuaWQgKyAnLmpzb24nOwogICAgICAgICAgICAgICAgICAgIHNuYXAuZ2Vh -ZW5kZXJ0ID0gbmV3IERhdGUoKS50b0lTT1N0cmluZygpLnNwbGl0KCdUJylbMF07CiAgICAgICAg -ICAgICAgICAgICAgdmFyIHVzZXJuYW1lID0gKERyaXZlRlMuZW52aXJvbiAmJiBEcml2ZUZTLmVu -dmlyb24udXNlcm5hbWUpID8gRHJpdmVGUy5lbnZpcm9uLnVzZXJuYW1lIDogJ1VuYmVrYW5udCc7 -CiAgICAgICAgICAgICAgICAgICAgc25hcC5iZWFyYmVpdGV0Vm9uID0gdXNlcm5hbWU7CiAgICAg -ICAgICAgICAgICAgICAgLy8gVGVtcG9yYWVyZSBQcm9wZXJ0aWVzIGVudGZlcm5lbgogICAgICAg -ICAgICAgICAgICAgIGRlbGV0ZSBzbmFwLl9wcmV2aW91c0luaGFsdDsKICAgICAgICAgICAgICAg -ICAgICBkZWxldGUgc25hcC5fcHJldmlvdXNUaXRlbDsKICAgICAgICAgICAgICAgICAgICBkZWxl -dGUgc25hcC5fbGFzdEVkaXRvclN0YXR1czsKICAgICAgICAgICAgICAgICAgICBuYXZpZ2F0b3Iu -c2VuZEJlYWNvbignL2FwaS93cml0ZScsCiAgICAgICAgICAgICAgICAgICAgICAgIEpTT04uc3Ry -aW5naWZ5KHsgcGF0aDogcGF0aCwgZGF0YTogc25hcCB9KSk7CiAgICAgICAgICAgICAgICB9IGNh -dGNoKGUpIHt9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gTG9jayBmcmVpZ2ViZW4gZmFs -bHMgYWt0aXYKICAgICAgICAgICAgaWYgKERyaXZlRWRpdG9yLl9sb2NrZWREb2NJZCkgewogICAg -ICAgICAgICAgICAgbmF2aWdhdG9yLnNlbmRCZWFjb24oJy9hcGkvdW5sb2NrJywKICAgICAgICAg -ICAgICAgICAgICBKU09OLnN0cmluZ2lmeSh7IGRvY0lkOiBEcml2ZUVkaXRvci5fbG9ja2VkRG9j -SWQgfSkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIFNlcnZlciBoZXJ1bnRlcmZhaHJl -biAtIFRhYiB3aXJkIGdlc2NobG9zc2VuCiAgICAgICAgICAgIG5hdmlnYXRvci5zZW5kQmVhY29u -KCcvYXBpL3NodXRkb3duJywgJ3t9Jyk7CiAgICAgICAgfQogICAgfSk7CgogICAgLy8gSGVhcnRi -ZWF0OiBXZWIgV29ya2VyIGZ1ZXIgenV2ZXJsYWVzc2lnZSBIZWFydGJlYXRzIGF1Y2ggYmVpIEJh -Y2tncm91bmQtVGFicy4KICAgIC8vIEJyb3dzZXIgZHJvc3NlbG4gc2V0SW50ZXJ2YWwgaW0gTWFp -bi1UaHJlYWQgYXVmIH42MHMgYmVpIEJhY2tncm91bmQtVGFicywKICAgIC8vIGFiZXIgV2ViIFdv -cmtlciBzaW5kIGRhdm9uIE5JQ0hUIGJldHJvZmZlbiB1bmQgbGF1ZmVuIGltbWVyIG1pdCB2b2xs -ZXIgRnJlcXVlbnouCiAgICAvLyBTZXJ2ZXItVGltZW91dDogMzAgTWludXRlbiAoMTgwMHMpLiBI -ZWFydGJlYXQgd2lyZCBudXIgZ2VzZW5kZXQgd2VubiBkZXIgVGFiCiAgICAvLyBzaWNodGJhciBp -c3QgLSBiZWkgdW5zaWNodGJhcmVtIFRhYiBsYWV1ZnQgZGVyIFNlcnZlci1UaW1lciB3ZWl0ZXIu -CiAgICAvLyAxIE1pbnV0ZSB2b3IgQWJsYXVmOiBJbmZvLU1vZGFsIG1pdCBDb3VudGRvd24uCiAg -ICB2YXIgaGVhcnRiZWF0RmFpbENvdW50ID0gMDsKICAgIHZhciBfdGltZW91dFdhcm5pbmdTaG93 -biA9IGZhbHNlOwogICAgY29uc3QgaGVhcnRiZWF0V29ya2VyQ29kZSA9IGAKICAgICAgICBzZXRJ -bnRlcnZhbCgoKSA9PiB7IHNlbGYucG9zdE1lc3NhZ2UoJ2hlYXJ0YmVhdCcpOyB9LCA1MDAwKTsK -ICAgICAgICBzZWxmLnBvc3RNZXNzYWdlKCdoZWFydGJlYXQnKTsKICAgIGA7CiAgICBjb25zdCBo -ZWFydGJlYXRCbG9iID0gbmV3IEJsb2IoW2hlYXJ0YmVhdFdvcmtlckNvZGVdLCB7IHR5cGU6ICdh -cHBsaWNhdGlvbi9qYXZhc2NyaXB0JyB9KTsKICAgIGNvbnN0IGhlYXJ0YmVhdFdvcmtlciA9IG5l -dyBXb3JrZXIoVVJMLmNyZWF0ZU9iamVjdFVSTChoZWFydGJlYXRCbG9iKSk7CiAgICBoZWFydGJl -YXRXb3JrZXIub25tZXNzYWdlID0gYXN5bmMgKCkgPT4gewogICAgICAgIC8vIEhlYXJ0YmVhdCBu -dXIgc2VuZGVuIHdlbm4gVGFiIHNpY2h0YmFyIGlzdC4KICAgICAgICAvLyBCZWkgdW5zaWNodGJh -cmVtIFRhYjogU2VydmVyLVRpbWVyIGxhZXVmdCB3ZWl0ZXIgKGdld3VlbnNjaHRlcyBWZXJoYWx0 -ZW4pLgogICAgICAgIC8vIEF1c25haG1lOiBXZW5uIGRlciBUYWIgZ2VyYWRlIHNpY2h0YmFyIHdp -cmQsIHNvZm9ydCBIZWFydGJlYXQgc2VuZGVuCiAgICAgICAgLy8gdW0gU2VydmVyLVRpbWVyIHp1 -cnVlY2t6dXNldHplbi4KICAgICAgICBpZiAoZG9jdW1lbnQuaGlkZGVuKSByZXR1cm47CiAgICAg -ICAgdHJ5IHsKICAgICAgICAgICAgdmFyIHJlc3AgPSBhd2FpdCBmZXRjaCgnL2FwaS9oZWFydGJl -YXQnLCB7IG1ldGhvZDogJ1BPU1QnIH0pOwogICAgICAgICAgICB2YXIgZGF0YSA9IGF3YWl0IHJl -c3AuanNvbigpOwogICAgICAgICAgICBoZWFydGJlYXRGYWlsQ291bnQgPSAwOwogICAgICAgICAg -ICAvLyBXYXJudW5nIHp1cnVlY2tzZXR6ZW4gd2VubiBUaW1lciB3aWVkZXIgZnJpc2NoCiAgICAg -ICAgICAgIGlmIChfdGltZW91dFdhcm5pbmdTaG93biAmJiAhZGF0YS53YXJuaW5nKSB7CiAgICAg -ICAgICAgICAgICBfdGltZW91dFdhcm5pbmdTaG93biA9IGZhbHNlOwogICAgICAgICAgICAgICAg -X2hpZGVTZXJ2ZXJUaW1lb3V0V2FybmluZygpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8v -IDEgTWludXRlIHZvciBUaW1lb3V0OiBNb2RhbCArIEF1dG8tU2F2ZQogICAgICAgICAgICBpZiAo -ZGF0YS5yZW1haW5pbmdTZWNvbmRzICE9PSB1bmRlZmluZWQgJiYgZGF0YS5yZW1haW5pbmdTZWNv -bmRzIDw9IDYwICYmICFfdGltZW91dFdhcm5pbmdTaG93bikgewogICAgICAgICAgICAgICAgX3Rp -bWVvdXRXYXJuaW5nU2hvd24gPSB0cnVlOwogICAgICAgICAgICAgICAgdmFyIHNhdmVkID0gYXdh -aXQgX2VtZXJnZW5jeVNhdmVEcmFmdCgpOwogICAgICAgICAgICAgICAgX3Nob3dTZXJ2ZXJUaW1l -b3V0V2FybmluZyhkYXRhLnJlbWFpbmluZ1NlY29uZHMpOwogICAgICAgICAgICAgICAgaWYgKHNh -dmVkKSB7CiAgICAgICAgICAgICAgICAgICAgc2hvd1RvYXN0KCdBcnRpa2VsIGF1dG9tYXRpc2No -IGFscyBFbnR3dXJmIGdlc3BlaWNoZXJ0JywgJ2luZm8nLCA1MDAwKTsKICAgICAgICAgICAgICAg -IH0KICAgICAgICAgICAgfQogICAgICAgIH0gY2F0Y2goZSkgewogICAgICAgICAgICBoZWFydGJl -YXRGYWlsQ291bnQrKzsKICAgICAgICAgICAgLy8gTmFjaCA2IGZlaGxnZXNjaGxhZ2VuZW4gSGVh -cnRiZWF0cyAoMzBzKTogV2FybnVuZyArIGxvY2FsU3RvcmFnZS1CYWNrdXAKICAgICAgICAgICAg -aWYgKGhlYXJ0YmVhdEZhaWxDb3VudCA9PT0gNiAmJiBEcml2ZUVkaXRvci5jdXJyZW50RG9jKSB7 -CiAgICAgICAgICAgICAgICB2YXIgc25hcCA9IF9nYXRoZXJFZGl0b3JTbmFwc2hvdCgpOwogICAg -ICAgICAgICAgICAgaWYgKHNuYXApIHsKICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAg -ICAgICAgICAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnZHJpdmUtcmVzdW1lLWRvYycs -IEpTT04uc3RyaW5naWZ5KHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY0lkOiBzbmFw -LmlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0ZWw6IHNuYXAudGl0ZWwsCiAgICAg -ICAgICAgICAgICAgICAgICAgICAgICBrYXRlZ29yaWU6IHNuYXAua2F0ZWdvcmllLAogICAgICAg -ICAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCks -CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc05ldzogRHJpdmVFZGl0b3IuaXNOZXcKICAg -ICAgICAgICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICAgICAgICAgIH0gY2F0Y2goZXgp -IHt9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBzaG93VG9hc3QoJ1NlcnZlciBu -aWNodCBlcnJlaWNoYmFyIC0gRW50d3VyZiBsb2thbCBnZXNpY2hlcnQnLCAnd2FybmluZycsIDgw -MDApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfTsKCiAgICAvLyBXZW5uIFRhYiB3aWVk -ZXIgc2ljaHRiYXIgd2lyZDogc29mb3J0IEhlYXJ0YmVhdCBzZW5kZW4gdW0gU2VydmVyLVRpbWVy -CiAgICAvLyB6dXJ1ZWNrenVzZXR6ZW4gKFVzZXIgaXN0IHp1cnVlY2sgaW0gRFJJVkUtVGFiKQog -ICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigndmlzaWJpbGl0eWNoYW5nZScsIGZ1bmN0aW9u -KCkgewogICAgICAgIGlmICghZG9jdW1lbnQuaGlkZGVuICYmIERyaXZlRlMubW9kZSA9PT0gJ3Nl -cnZlcicpIHsKICAgICAgICAgICAgX3RpbWVvdXRXYXJuaW5nU2hvd24gPSBmYWxzZTsKICAgICAg -ICAgICAgX2hpZGVTZXJ2ZXJUaW1lb3V0V2FybmluZygpOwogICAgICAgICAgICBmZXRjaCgnL2Fw -aS9oZWFydGJlYXQnLCB7IG1ldGhvZDogJ1BPU1QnIH0pLmNhdGNoKGZ1bmN0aW9uKCkge30pOwog -ICAgICAgIH0KICAgIH0pOwoKICAgIC8vIEF1dG9tYXRpc2NoIHZlcmJpbmRlbiAtIFNlcnZlci1N -b2R1cyB3aXJkIGJldm9yenVndAogICAgYXdhaXQgRHJpdmVGUy5jb25uZWN0KCk7CgogICAgLy8g -V2llZGVyYXVmbmFobWU6IFBydWVmZW4gb2IgYmVpbSBsZXR6dGVuIE1hbCBlaW4gQXJ0aWtlbCBv -ZmZlbiB3YXIKICAgIHRyeSB7CiAgICAgICAgdmFyIHJlc3VtZVJhdyA9IGxvY2FsU3RvcmFnZS5n -ZXRJdGVtKCdkcml2ZS1yZXN1bWUtZG9jJyk7CiAgICAgICAgaWYgKHJlc3VtZVJhdykgewogICAg -ICAgICAgICB2YXIgcmVzdW1lID0gSlNPTi5wYXJzZShyZXN1bWVSYXcpOwogICAgICAgICAgICAv -LyBOdXIgYW5iaWV0ZW4gd2VubiB3ZW5pZ2VyIGFscyAyNGggYWx0CiAgICAgICAgICAgIHZhciBy -ZXN1bWVBZ2UgPSBEYXRlLm5vdygpIC0gbmV3IERhdGUocmVzdW1lLnRpbWVzdGFtcCkuZ2V0VGlt -ZSgpOwogICAgICAgICAgICBpZiAocmVzdW1lQWdlIDwgMjQgKiA2MCAqIDYwICogMTAwMCAmJiBy -ZXN1bWUuZG9jSWQpIHsKICAgICAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKCdk -cml2ZS1yZXN1bWUtZG9jJyk7CiAgICAgICAgICAgICAgICAvLyBLdXJ6IHdhcnRlbiBiaXMgUG9y -dGFsIGdlcmVuZGVydCBpc3QKICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7 -CiAgICAgICAgICAgICAgICAgICAgdmFyIGJhbm5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQo -J2RpdicpOwogICAgICAgICAgICAgICAgICAgIGJhbm5lci5zdHlsZS5jc3NUZXh0ID0gJ3Bvc2l0 -aW9uOmZpeGVkO2JvdHRvbToyNHB4O3JpZ2h0OjI0cHg7ei1pbmRleDoxMDUwMDtiYWNrZ3JvdW5k -OnZhcigtLWJnLWNhcmQpO2JvcmRlcjoxcHggc29saWQgdmFyKC0tYm9yZGVyLWNvbG9yKTtib3Jk -ZXItbGVmdDo0cHggc29saWQgIzM0OThkYjtib3JkZXItcmFkaXVzOjhweDtwYWRkaW5nOjE2cHgg -MjBweDttYXgtd2lkdGg6NDAwcHg7Ym94LXNoYWRvdzowIDhweCAzMnB4IHJnYmEoMCwwLDAsMC4x -NSk7YW5pbWF0aW9uOnNsaWRlRG93biAuM3MgZWFzZTsnOwogICAgICAgICAgICAgICAgICAgIHZh -ciB6ZWl0VGV4dCA9ICcnOwogICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAg -ICAgICAgICAgIHZhciBkID0gbmV3IERhdGUocmVzdW1lLnRpbWVzdGFtcCk7CiAgICAgICAgICAg -ICAgICAgICAgICAgIHplaXRUZXh0ID0gJyAoenVsZXR6dCAnICsgZC50b0xvY2FsZURhdGVTdHJp -bmcoJ2RlLURFJykgKyAnLCAnICsgZC50b0xvY2FsZVRpbWVTdHJpbmcoJ2RlLURFJywge2hvdXI6 -JzItZGlnaXQnLG1pbnV0ZTonMi1kaWdpdCd9KSArICcpJzsKICAgICAgICAgICAgICAgICAgICB9 -IGNhdGNoKGUpIHt9CiAgICAgICAgICAgICAgICAgICAgYmFubmVyLmlubmVySFRNTCA9CiAgICAg -ICAgICAgICAgICAgICAgICAgICc8ZGl2IHN0eWxlPSJjb2xvcjp2YXIoLS10ZXh0LWhlYWRpbmcp -O2ZvbnQtd2VpZ2h0OjYwMDttYXJnaW4tYm90dG9tOjZweDsiPkFydGlrZWwgZm9ydHNldHplbj88 -L2Rpdj4nICsKICAgICAgICAgICAgICAgICAgICAgICAgJzxkaXYgc3R5bGU9ImNvbG9yOnZhcigt -LXRleHQtcHJpbWFyeSk7Zm9udC1zaXplOjEzcHg7bGluZS1oZWlnaHQ6MS42O21hcmdpbi1ib3R0 -b206MTJweDsiPicgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0R1IGhhc3QgenVsZXR6 -dCBhbiA8c3Ryb25nPicgKyAocmVzdW1lLnRpdGVsIHx8ICdlaW5lbSBBcnRpa2VsJykgKyAnPC9z -dHJvbmc+IGdlYXJiZWl0ZXQnICsgemVpdFRleHQgKyAnLicgKwogICAgICAgICAgICAgICAgICAg -ICAgICAnPC9kaXY+JyArCiAgICAgICAgICAgICAgICAgICAgICAgICc8ZGl2IHN0eWxlPSJkaXNw -bGF5OmZsZXg7Z2FwOjhweDtqdXN0aWZ5LWNvbnRlbnQ6ZmxleC1lbmQ7Ij4nICsKICAgICAgICAg -ICAgICAgICAgICAgICAgICAgICc8YnV0dG9uIGlkPSJyZXN1bWVEaXNtaXNzIiBzdHlsZT0icGFk -ZGluZzo2cHggMTRweDtib3JkZXItcmFkaXVzOjRweDtib3JkZXI6MXB4IHNvbGlkIHZhcigtLWJv -cmRlci1jb2xvcik7YmFja2dyb3VuZDp2YXIoLS1iZy1jYXJkKTtjb2xvcjp2YXIoLS10ZXh0LXNl -Y29uZGFyeSk7Y3Vyc29yOnBvaW50ZXI7Zm9udC1zaXplOjEzcHg7Ij5OZWluIGRhbmtlPC9idXR0 -b24+JyArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPGJ1dHRvbiBpZD0icmVzdW1lT3Bl -biIgc3R5bGU9InBhZGRpbmc6NnB4IDE0cHg7Ym9yZGVyLXJhZGl1czo0cHg7Ym9yZGVyOm5vbmU7 -YmFja2dyb3VuZDojMzQ5OGRiO2NvbG9yOndoaXRlO2N1cnNvcjpwb2ludGVyO2ZvbnQtd2VpZ2h0 -OjYwMDtmb250LXNpemU6MTNweDsiPldlaXRlcmFyYmVpdGVuPC9idXR0b24+JyArCiAgICAgICAg -ICAgICAgICAgICAgICAgICc8L2Rpdj4nOwogICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmJv -ZHkuYXBwZW5kQ2hpbGQoYmFubmVyKTsKICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5nZXRF -bGVtZW50QnlJZCgncmVzdW1lRGlzbWlzcycpLm9uY2xpY2sgPSBmdW5jdGlvbigpIHsgYmFubmVy -LnJlbW92ZSgpOyB9OwogICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlk -KCdyZXN1bWVPcGVuJykub25jbGljayA9IGFzeW5jIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAg -ICAgICAgICAgICBiYW5uZXIucmVtb3ZlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChy -ZXN1bWUuaXNOZXcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5ldWVuIEFydGlr -ZWwgd2FyIG5vY2ggbmljaHQgZ2VzcGVpY2hlcnQgLSB6dW0gRXJzdGVsbGVuIG9lZmZuZW4KICAg -ICAgICAgICAgICAgICAgICAgICAgICAgIERyaXZlRWRpdG9yLmNyZWF0ZU5ldygpOwogICAgICAg -ICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8g -QmVzdGVoZW5kZW4gQXJ0aWtlbCBpbSBFZGl0b3Igb2VmZm5lbgogICAgICAgICAgICAgICAgICAg -ICAgICAgICAgYXdhaXQgRHJpdmVQb3J0YWwuc2VsZWN0RG9jdW1lbnQocmVzdW1lLmRvY0lkKTsK -ICAgICAgICAgICAgICAgICAgICAgICAgICAgIERyaXZlUG9ydGFsLmhpZ2hsaWdodEl0ZW0ocmVz -dW1lLmRvY0lkKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIERyaXZlRWRpdG9yLmVkaXQo -cmVzdW1lLmRvY0lkKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAg -ICAgIH07CiAgICAgICAgICAgICAgICAgICAgLy8gQXV0by1EaXNtaXNzIG5hY2ggMzAgU2VrdW5k -ZW4KICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgeyBpZiAoYmFubmVy -LnBhcmVudE5vZGUpIGJhbm5lci5yZW1vdmUoKTsgfSwgMzAwMDApOwogICAgICAgICAgICAgICAg -fSwgMTUwMCk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBsb2NhbFN0b3Jh -Z2UucmVtb3ZlSXRlbSgnZHJpdmUtcmVzdW1lLWRvYycpOwogICAgICAgICAgICB9CiAgICAgICAg -fQogICAgfSBjYXRjaChlKSB7CiAgICAgICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oJ2RyaXZl -LXJlc3VtZS1kb2MnKTsKICAgIH0KfSk7Cjwvc2NyaXB0PgoKPC9ib2R5Pgo8L2h0bWw+Cg== -### FILE: server.ps1 | 51378 +OjE0cHg7bGluZS1oZWlnaHQ6MS43O21hcmdpbi1ib3R0b206MjBweDsiPicgKwogICAgICAgICAg +ICAgICAgJ0RlciBEUklWRS1TZXJ2ZXIgd2FyIGxhZW5nZXJlIFplaXQgaW5ha3RpdiB1bmQgd2ly +ZCBzaWNoIGluIEt1ZXJ6ZSBhdXRvbWF0aXNjaCBiZWVuZGVuLjxicj48YnI+JyArCiAgICAgICAg +ICAgICAgICAnPHN0cm9uZyBzdHlsZT0iY29sb3I6dmFyKC0tdGV4dC1oZWFkaW5nLCMzMzMpOyI+ +S2VpbmUgU29yZ2U6PC9zdHJvbmc+IE9mZmVuZSBBcnRpa2VsIHd1cmRlbiBhdXRvbWF0aXNjaCBh +bHMgPHN0cm9uZz5FbnR3dXJmPC9zdHJvbmc+IGdlc3BlaWNoZXJ0IHVuZCBnZWhlbiBuaWNodCB2 +ZXJsb3Jlbi4nICsKICAgICAgICAgICAgJzwvZGl2PicgKwogICAgICAgICAgICAnPGRpdiBzdHls +ZT0iYmFja2dyb3VuZDp2YXIoLS1iZy1tYWluLCNmNWY1ZjUpO2JvcmRlci1yYWRpdXM6OHB4O3Bh +ZGRpbmc6MTRweCAxOHB4O21hcmdpbi1ib3R0b206MjBweDt0ZXh0LWFsaWduOmxlZnQ7Ij4nICsK +ICAgICAgICAgICAgICAgICc8ZGl2IHN0eWxlPSJjb2xvcjp2YXIoLS10ZXh0LXNlY29uZGFyeSwj +Nzc3KTtmb250LXNpemU6MTJweDtmb250LXdlaWdodDo2MDA7dGV4dC10cmFuc2Zvcm06dXBwZXJj +YXNlO21hcmdpbi1ib3R0b206NnB4OyI+U28gZ2VodHMgd2VpdGVyPC9kaXY+JyArCiAgICAgICAg +ICAgICAgICAnPGRpdiBzdHlsZT0iY29sb3I6dmFyKC0tdGV4dC1wcmltYXJ5LCM1NTUpO2ZvbnQt +c2l6ZToxM3B4O2xpbmUtaGVpZ2h0OjEuNjsiPicgKwogICAgICAgICAgICAgICAgICAgICcxLiBE +aWVzZW4gVGFiIHNjaGxpZXNzZW48YnI+JyArCiAgICAgICAgICAgICAgICAgICAgJzIuIDxzdHJv +bmc+RFJJVkVfU3RhcnQuYmF0PC9zdHJvbmc+IGVybmV1dCBhdXNmdWVocmVuPGJyPicgKwogICAg +ICAgICAgICAgICAgICAgICczLiBEZXIgZ2VzcGVpY2hlcnRlIEVudHd1cmYga2FubiBkYW5uIGZv +cnRnZXNldHp0IHdlcmRlbicgKwogICAgICAgICAgICAgICAgJzwvZGl2PicgKwogICAgICAgICAg +ICAnPC9kaXY+JyArCiAgICAgICAgICAgICc8ZGl2IHN0eWxlPSJkaXNwbGF5OmZsZXg7Z2FwOjEw +cHg7anVzdGlmeS1jb250ZW50OmNlbnRlcjsiPicgKwogICAgICAgICAgICAgICAgJzxidXR0b24g +aWQ9InNlcnZlclRpbWVvdXRSZXN1bWUiIHN0eWxlPSJwYWRkaW5nOjEwcHggMjRweDtib3JkZXIt +cmFkaXVzOjZweDtib3JkZXI6bm9uZTtiYWNrZ3JvdW5kOiMyN2FlNjA7Y29sb3I6I2ZmZjtjdXJz +b3I6cG9pbnRlcjtmb250LXdlaWdodDo2MDA7Zm9udC1zaXplOjE0cHg7Ij5XZWl0ZXJhcmJlaXRl +bjwvYnV0dG9uPicgKwogICAgICAgICAgICAnPC9kaXY+JzsKICAgICAgICBvdmVybGF5LmFwcGVu +ZENoaWxkKG1vZGFsKTsKICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKG92ZXJsYXkp +OwogICAgICAgIF9zZXJ2ZXJUaW1lb3V0TW9kYWwgPSBvdmVybGF5OwogICAgICAgIC8vIENvdW50 +ZG93biBha3R1YWxpc2llcmVuCiAgICAgICAgX3NlcnZlclRpbWVvdXRDb3VudGRvd24gPSBzZXRJ +bnRlcnZhbChmdW5jdGlvbigpIHsKICAgICAgICAgICAgY291bnRkb3duU2VjLS07CiAgICAgICAg +ICAgIHZhciBlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXJ2ZXJUaW1lb3V0Q291bnRk +b3duJyk7CiAgICAgICAgICAgIGlmIChlbCkgZWwudGV4dENvbnRlbnQgPSBfZm10Q291bnRkb3du +KE1hdGgubWF4KDAsIGNvdW50ZG93blNlYykpOwogICAgICAgICAgICBpZiAoY291bnRkb3duU2Vj +IDw9IDApIHsKICAgICAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwoX3NlcnZlclRpbWVvdXRDb3Vu +dGRvd24pOwogICAgICAgICAgICAgICAgX3NlcnZlclRpbWVvdXRDb3VudGRvd24gPSBudWxsOwog +ICAgICAgICAgICAgICAgLy8gTW9kYWwtVGV4dCBha3R1YWxpc2llcmVuOiBTZXJ2ZXIgaXN0IGpl +dHp0IGJlZW5kZXQKICAgICAgICAgICAgICAgIGlmIChlbCkgZWwudGV4dENvbnRlbnQgPSAnU2Vy +dmVyIGJlZW5kZXQnOwogICAgICAgICAgICAgICAgdmFyIGJ0biA9IGRvY3VtZW50LmdldEVsZW1l +bnRCeUlkKCdzZXJ2ZXJUaW1lb3V0UmVzdW1lJyk7CiAgICAgICAgICAgICAgICBpZiAoYnRuKSBi +dG4ucmVtb3ZlKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9LCAxMDAwKTsKICAgICAgICAvLyBX +ZWl0ZXJhcmJlaXRlbi1CdXR0b246IE1vZGFsIHNjaGxpZXNzZW4gKyBIZWFydGJlYXQgc2VuZGVu +CiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlcnZlclRpbWVvdXRSZXN1bWUnKS5v +bmNsaWNrID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIF9oaWRlU2VydmVyVGltZW91dFdhcm5p +bmcoKTsKICAgICAgICAgICAgZmV0Y2goJy9hcGkvaGVhcnRiZWF0JywgeyBtZXRob2Q6ICdQT1NU +JyB9KS5jYXRjaChmdW5jdGlvbigpIHt9KTsKICAgICAgICB9OwogICAgfQogICAgZnVuY3Rpb24g +X2ZtdENvdW50ZG93bihzZWMpIHsKICAgICAgICB2YXIgbSA9IE1hdGguZmxvb3Ioc2VjIC8gNjAp +OwogICAgICAgIHZhciBzID0gc2VjICUgNjA7CiAgICAgICAgcmV0dXJuIChtID4gMCA/IG0gKyAn +IE1pbi4gJyA6ICcnKSArIHMgKyAnIFNlay4nOwogICAgfQogICAgZnVuY3Rpb24gX2hpZGVTZXJ2 +ZXJUaW1lb3V0V2FybmluZygpIHsKICAgICAgICBpZiAoX3NlcnZlclRpbWVvdXRDb3VudGRvd24p +IHsKICAgICAgICAgICAgY2xlYXJJbnRlcnZhbChfc2VydmVyVGltZW91dENvdW50ZG93bik7CiAg +ICAgICAgICAgIF9zZXJ2ZXJUaW1lb3V0Q291bnRkb3duID0gbnVsbDsKICAgICAgICB9CiAgICAg +ICAgaWYgKF9zZXJ2ZXJUaW1lb3V0TW9kYWwpIHsKICAgICAgICAgICAgX3NlcnZlclRpbWVvdXRN +b2RhbC5yZW1vdmUoKTsKICAgICAgICAgICAgX3NlcnZlclRpbWVvdXRNb2RhbCA9IG51bGw7CiAg +ICAgICAgfQogICAgfQoKICAgIC8vIFRhYi1TY2hsaWVzc2VuIGVya2VubmVuOiBiZWZvcmV1bmxv +YWQgKyB2aXNpYmlsaXR5Y2hhbmdlIGtvbWJpbmllcnQuCiAgICAvLyB2aXNpYmlsaXR5Y2hhbmdl +KCdoaWRkZW4nKSBmZXVlcnQgYmVpIFRhYi1XZWNoc2VsIFVORCBUYWItU2NobGllc3NlbiwKICAg +IC8vIGFiZXIgYmVmb3JldW5sb2FkIGZldWVydCBOVVIgYmVpIFRhYi1TY2hsaWVzc2VuIC8gTmF2 +aWdhdGlvbiB3ZWcuCiAgICAvLyBTdHJhdGVnaWU6IEZsYWcgaW4gYmVmb3JldW5sb2FkIHNldHpl +biwgZGFubiBpbiBwYWdlaGlkZS91bmxvYWQgZGVuIFNodXRkb3duIHNlbmRlbi4KICAgIHZhciBf +dGFiSXNDbG9zaW5nID0gZmFsc2U7CgogICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2JlZm9y +ZXVubG9hZCcsICgpID0+IHsKICAgICAgICBfdGFiSXNDbG9zaW5nID0gdHJ1ZTsKICAgICAgICBp +ZiAoRHJpdmVGUy5tb2RlID09PSAnc2VydmVyJykgewogICAgICAgICAgICAvLyBPZmZlbmVuIEFy +dGlrZWwgYWxzIEVudHd1cmYgaW4gbG9jYWxTdG9yYWdlIG1lcmtlbgogICAgICAgICAgICB2YXIg +c25hcCA9IF9nYXRoZXJFZGl0b3JTbmFwc2hvdCgpOwogICAgICAgICAgICBpZiAoc25hcCkgewog +ICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0 +SXRlbSgnZHJpdmUtcmVzdW1lLWRvYycsIEpTT04uc3RyaW5naWZ5KHsKICAgICAgICAgICAgICAg +ICAgICAgICAgZG9jSWQ6IHNuYXAuaWQsCiAgICAgICAgICAgICAgICAgICAgICAgIHRpdGVsOiBz +bmFwLnRpdGVsLAogICAgICAgICAgICAgICAgICAgICAgICBrYXRlZ29yaWU6IHNuYXAua2F0ZWdv +cmllLAogICAgICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXA6IG5ldyBEYXRlKCkudG9JU09T +dHJpbmcoKSwKICAgICAgICAgICAgICAgICAgICAgICAgaXNOZXc6IERyaXZlRWRpdG9yLmlzTmV3 +CiAgICAgICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICAgICAgICAgIC8vIEVudHd1cmYg +dmlhIHNlbmRCZWFjb24gc3BlaWNoZXJuIChmaXJlLWFuZC1mb3JnZXQsIHVlYmVybGVidCBUYWIt +Q2xvc2UpCiAgICAgICAgICAgICAgICAgICAgdmFyIHBhdGggPSAnZGF0YS8nICsgc25hcC5rYXRl +Z29yaWUgKyAnLycgKyBzbmFwLmlkICsgJy5qc29uJzsKICAgICAgICAgICAgICAgICAgICBzbmFw +LmdlYWVuZGVydCA9IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKS5zcGxpdCgnVCcpWzBdOwogICAg +ICAgICAgICAgICAgICAgIHZhciB1c2VybmFtZSA9IChEcml2ZUZTLmVudmlyb24gJiYgRHJpdmVG +Uy5lbnZpcm9uLnVzZXJuYW1lKSA/IERyaXZlRlMuZW52aXJvbi51c2VybmFtZSA6ICdVbmJla2Fu +bnQnOwogICAgICAgICAgICAgICAgICAgIHNuYXAuYmVhcmJlaXRldFZvbiA9IHVzZXJuYW1lOwog +ICAgICAgICAgICAgICAgICAgIC8vIFRlbXBvcmFlcmUgUHJvcGVydGllcyBlbnRmZXJuZW4KICAg +ICAgICAgICAgICAgICAgICBkZWxldGUgc25hcC5fcHJldmlvdXNJbmhhbHQ7CiAgICAgICAgICAg +ICAgICAgICAgZGVsZXRlIHNuYXAuX3ByZXZpb3VzVGl0ZWw7CiAgICAgICAgICAgICAgICAgICAg +ZGVsZXRlIHNuYXAuX2xhc3RFZGl0b3JTdGF0dXM7CiAgICAgICAgICAgICAgICAgICAgbmF2aWdh +dG9yLnNlbmRCZWFjb24oJy9hcGkvd3JpdGUnLAogICAgICAgICAgICAgICAgICAgICAgICBKU09O +LnN0cmluZ2lmeSh7IHBhdGg6IHBhdGgsIGRhdGE6IHNuYXAgfSkpOwogICAgICAgICAgICAgICAg +fSBjYXRjaChlKSB7fQogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIExvY2sgZnJlaWdlYmVu +IGZhbGxzIGFrdGl2CiAgICAgICAgICAgIGlmIChEcml2ZUVkaXRvci5fbG9ja2VkRG9jSWQpIHsK +ICAgICAgICAgICAgICAgIG5hdmlnYXRvci5zZW5kQmVhY29uKCcvYXBpL3VubG9jaycsCiAgICAg +ICAgICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkoeyBkb2NJZDogRHJpdmVFZGl0b3IuX2xvY2tl +ZERvY0lkIH0pKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBTZXJ2ZXIgaGVydW50ZXJm +YWhyZW4gLSBUYWIgd2lyZCBnZXNjaGxvc3NlbgogICAgICAgICAgICBuYXZpZ2F0b3Iuc2VuZEJl +YWNvbignL2FwaS9zaHV0ZG93bicsICd7fScpOwogICAgICAgIH0KICAgIH0pOwoKICAgIC8vIEhl +YXJ0YmVhdDogV2ViIFdvcmtlciBmdWVyIHp1dmVybGFlc3NpZ2UgSGVhcnRiZWF0cyBhdWNoIGJl +aSBCYWNrZ3JvdW5kLVRhYnMuCiAgICAvLyBCcm93c2VyIGRyb3NzZWxuIHNldEludGVydmFsIGlt +IE1haW4tVGhyZWFkIGF1ZiB+NjBzIGJlaSBCYWNrZ3JvdW5kLVRhYnMsCiAgICAvLyBhYmVyIFdl +YiBXb3JrZXIgc2luZCBkYXZvbiBOSUNIVCBiZXRyb2ZmZW4gdW5kIGxhdWZlbiBpbW1lciBtaXQg +dm9sbGVyIEZyZXF1ZW56LgogICAgLy8gU2VydmVyLVRpbWVvdXQ6IDMwIE1pbnV0ZW4gKDE4MDBz +KS4gSGVhcnRiZWF0IHdpcmQgbnVyIGdlc2VuZGV0IHdlbm4gZGVyIFRhYgogICAgLy8gc2ljaHRi +YXIgaXN0IC0gYmVpIHVuc2ljaHRiYXJlbSBUYWIgbGFldWZ0IGRlciBTZXJ2ZXItVGltZXIgd2Vp +dGVyLgogICAgLy8gMSBNaW51dGUgdm9yIEFibGF1ZjogSW5mby1Nb2RhbCBtaXQgQ291bnRkb3du +LgogICAgdmFyIGhlYXJ0YmVhdEZhaWxDb3VudCA9IDA7CiAgICB2YXIgX3RpbWVvdXRXYXJuaW5n +U2hvd24gPSBmYWxzZTsKICAgIGNvbnN0IGhlYXJ0YmVhdFdvcmtlckNvZGUgPSBgCiAgICAgICAg +c2V0SW50ZXJ2YWwoKCkgPT4geyBzZWxmLnBvc3RNZXNzYWdlKCdoZWFydGJlYXQnKTsgfSwgNTAw +MCk7CiAgICAgICAgc2VsZi5wb3N0TWVzc2FnZSgnaGVhcnRiZWF0Jyk7CiAgICBgOwogICAgY29u +c3QgaGVhcnRiZWF0QmxvYiA9IG5ldyBCbG9iKFtoZWFydGJlYXRXb3JrZXJDb2RlXSwgeyB0eXBl +OiAnYXBwbGljYXRpb24vamF2YXNjcmlwdCcgfSk7CiAgICBjb25zdCBoZWFydGJlYXRXb3JrZXIg +PSBuZXcgV29ya2VyKFVSTC5jcmVhdGVPYmplY3RVUkwoaGVhcnRiZWF0QmxvYikpOwogICAgaGVh +cnRiZWF0V29ya2VyLm9ubWVzc2FnZSA9IGFzeW5jICgpID0+IHsKICAgICAgICAvLyBIZWFydGJl +YXQgbnVyIHNlbmRlbiB3ZW5uIFRhYiBzaWNodGJhciBpc3QuCiAgICAgICAgLy8gQmVpIHVuc2lj +aHRiYXJlbSBUYWI6IFNlcnZlci1UaW1lciBsYWV1ZnQgd2VpdGVyIChnZXd1ZW5zY2h0ZXMgVmVy +aGFsdGVuKS4KICAgICAgICAvLyBBdXNuYWhtZTogV2VubiBkZXIgVGFiIGdlcmFkZSBzaWNodGJh +ciB3aXJkLCBzb2ZvcnQgSGVhcnRiZWF0IHNlbmRlbgogICAgICAgIC8vIHVtIFNlcnZlci1UaW1l +ciB6dXJ1ZWNrenVzZXR6ZW4uCiAgICAgICAgaWYgKGRvY3VtZW50LmhpZGRlbikgcmV0dXJuOwog +ICAgICAgIHRyeSB7CiAgICAgICAgICAgIHZhciByZXNwID0gYXdhaXQgZmV0Y2goJy9hcGkvaGVh +cnRiZWF0JywgeyBtZXRob2Q6ICdQT1NUJyB9KTsKICAgICAgICAgICAgdmFyIGRhdGEgPSBhd2Fp +dCByZXNwLmpzb24oKTsKICAgICAgICAgICAgaGVhcnRiZWF0RmFpbENvdW50ID0gMDsKICAgICAg +ICAgICAgLy8gV2FybnVuZyB6dXJ1ZWNrc2V0emVuIHdlbm4gVGltZXIgd2llZGVyIGZyaXNjaAog +ICAgICAgICAgICBpZiAoX3RpbWVvdXRXYXJuaW5nU2hvd24gJiYgIWRhdGEud2FybmluZykgewog +ICAgICAgICAgICAgICAgX3RpbWVvdXRXYXJuaW5nU2hvd24gPSBmYWxzZTsKICAgICAgICAgICAg +ICAgIF9oaWRlU2VydmVyVGltZW91dFdhcm5pbmcoKTsKICAgICAgICAgICAgfQogICAgICAgICAg +ICAvLyAxIE1pbnV0ZSB2b3IgVGltZW91dDogTW9kYWwgKyBBdXRvLVNhdmUKICAgICAgICAgICAg +aWYgKGRhdGEucmVtYWluaW5nU2Vjb25kcyAhPT0gdW5kZWZpbmVkICYmIGRhdGEucmVtYWluaW5n +U2Vjb25kcyA8PSA2MCAmJiAhX3RpbWVvdXRXYXJuaW5nU2hvd24pIHsKICAgICAgICAgICAgICAg +IF90aW1lb3V0V2FybmluZ1Nob3duID0gdHJ1ZTsKICAgICAgICAgICAgICAgIHZhciBzYXZlZCA9 +IGF3YWl0IF9lbWVyZ2VuY3lTYXZlRHJhZnQoKTsKICAgICAgICAgICAgICAgIF9zaG93U2VydmVy +VGltZW91dFdhcm5pbmcoZGF0YS5yZW1haW5pbmdTZWNvbmRzKTsKICAgICAgICAgICAgICAgIGlm +IChzYXZlZCkgewogICAgICAgICAgICAgICAgICAgIHNob3dUb2FzdCgnQXJ0aWtlbCBhdXRvbWF0 +aXNjaCBhbHMgRW50d3VyZiBnZXNwZWljaGVydCcsICdpbmZvJywgNTAwMCk7CiAgICAgICAgICAg +ICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9IGNhdGNoKGUpIHsKICAgICAgICAgICAgaGVh +cnRiZWF0RmFpbENvdW50Kys7CiAgICAgICAgICAgIC8vIE5hY2ggNiBmZWhsZ2VzY2hsYWdlbmVu +IEhlYXJ0YmVhdHMgKDMwcyk6IFdhcm51bmcgKyBsb2NhbFN0b3JhZ2UtQmFja3VwCiAgICAgICAg +ICAgIGlmIChoZWFydGJlYXRGYWlsQ291bnQgPT09IDYgJiYgRHJpdmVFZGl0b3IuY3VycmVudERv +YykgewogICAgICAgICAgICAgICAgdmFyIHNuYXAgPSBfZ2F0aGVyRWRpdG9yU25hcHNob3QoKTsK +ICAgICAgICAgICAgICAgIGlmIChzbmFwKSB7CiAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAg +ICAgICAgICAgICAgICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ2RyaXZlLXJlc3VtZS1k +b2MnLCBKU09OLnN0cmluZ2lmeSh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2NJZDog +c25hcC5pZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGVsOiBzbmFwLnRpdGVsLAog +ICAgICAgICAgICAgICAgICAgICAgICAgICAga2F0ZWdvcmllOiBzbmFwLmthdGVnb3JpZSwKICAg +ICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcDogbmV3IERhdGUoKS50b0lTT1N0cmlu +ZygpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNOZXc6IERyaXZlRWRpdG9yLmlzTmV3 +CiAgICAgICAgICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgICAgICAgICB9IGNhdGNo +KGV4KSB7fQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgc2hvd1RvYXN0KCdTZXJ2 +ZXIgbmljaHQgZXJyZWljaGJhciAtIEVudHd1cmYgbG9rYWwgZ2VzaWNoZXJ0JywgJ3dhcm5pbmcn +LCA4MDAwKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH07CgogICAgLy8gV2VubiBUYWIg +d2llZGVyIHNpY2h0YmFyIHdpcmQ6IHNvZm9ydCBIZWFydGJlYXQgc2VuZGVuIHVtIFNlcnZlci1U +aW1lcgogICAgLy8genVydWVja3p1c2V0emVuIChVc2VyIGlzdCB6dXJ1ZWNrIGltIERSSVZFLVRh +YikKICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3Zpc2liaWxpdHljaGFuZ2UnLCBmdW5j +dGlvbigpIHsKICAgICAgICBpZiAoIWRvY3VtZW50LmhpZGRlbiAmJiBEcml2ZUZTLm1vZGUgPT09 +ICdzZXJ2ZXInKSB7CiAgICAgICAgICAgIF90aW1lb3V0V2FybmluZ1Nob3duID0gZmFsc2U7CiAg +ICAgICAgICAgIF9oaWRlU2VydmVyVGltZW91dFdhcm5pbmcoKTsKICAgICAgICAgICAgZmV0Y2go +Jy9hcGkvaGVhcnRiZWF0JywgeyBtZXRob2Q6ICdQT1NUJyB9KS5jYXRjaChmdW5jdGlvbigpIHt9 +KTsKICAgICAgICB9CiAgICB9KTsKCiAgICAvLyBBdXRvbWF0aXNjaCB2ZXJiaW5kZW4gLSBTZXJ2 +ZXItTW9kdXMgd2lyZCBiZXZvcnp1Z3QKICAgIGF3YWl0IERyaXZlRlMuY29ubmVjdCgpOwoKICAg +IC8vIFdpZWRlcmF1Zm5haG1lOiBQcnVlZmVuIG9iIGJlaW0gbGV0enRlbiBNYWwgZWluIEFydGlr +ZWwgb2ZmZW4gd2FyCiAgICB0cnkgewogICAgICAgIHZhciByZXN1bWVSYXcgPSBsb2NhbFN0b3Jh +Z2UuZ2V0SXRlbSgnZHJpdmUtcmVzdW1lLWRvYycpOwogICAgICAgIGlmIChyZXN1bWVSYXcpIHsK +ICAgICAgICAgICAgdmFyIHJlc3VtZSA9IEpTT04ucGFyc2UocmVzdW1lUmF3KTsKICAgICAgICAg +ICAgLy8gTnVyIGFuYmlldGVuIHdlbm4gd2VuaWdlciBhbHMgMjRoIGFsdAogICAgICAgICAgICB2 +YXIgcmVzdW1lQWdlID0gRGF0ZS5ub3coKSAtIG5ldyBEYXRlKHJlc3VtZS50aW1lc3RhbXApLmdl +dFRpbWUoKTsKICAgICAgICAgICAgaWYgKHJlc3VtZUFnZSA8IDI0ICogNjAgKiA2MCAqIDEwMDAg +JiYgcmVzdW1lLmRvY0lkKSB7CiAgICAgICAgICAgICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRl +bSgnZHJpdmUtcmVzdW1lLWRvYycpOwogICAgICAgICAgICAgICAgLy8gS3VyeiB3YXJ0ZW4gYmlz +IFBvcnRhbCBnZXJlbmRlcnQgaXN0CiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9u +KCkgewogICAgICAgICAgICAgICAgICAgIHZhciBiYW5uZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVt +ZW50KCdkaXYnKTsKICAgICAgICAgICAgICAgICAgICBiYW5uZXIuc3R5bGUuY3NzVGV4dCA9ICdw +b3NpdGlvbjpmaXhlZDtib3R0b206MjRweDtyaWdodDoyNHB4O3otaW5kZXg6MTA1MDA7YmFja2dy +b3VuZDp2YXIoLS1iZy1jYXJkKTtib3JkZXI6MXB4IHNvbGlkIHZhcigtLWJvcmRlci1jb2xvcik7 +Ym9yZGVyLWxlZnQ6NHB4IHNvbGlkICMzNDk4ZGI7Ym9yZGVyLXJhZGl1czo4cHg7cGFkZGluZzox +NnB4IDIwcHg7bWF4LXdpZHRoOjQwMHB4O2JveC1zaGFkb3c6MCA4cHggMzJweCByZ2JhKDAsMCww +LDAuMTUpO2FuaW1hdGlvbjpzbGlkZURvd24gLjNzIGVhc2U7JzsKICAgICAgICAgICAgICAgICAg +ICB2YXIgemVpdFRleHQgPSAnJzsKICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAg +ICAgICAgICAgICAgICB2YXIgZCA9IG5ldyBEYXRlKHJlc3VtZS50aW1lc3RhbXApOwogICAgICAg +ICAgICAgICAgICAgICAgICB6ZWl0VGV4dCA9ICcgKHp1bGV0enQgJyArIGQudG9Mb2NhbGVEYXRl +U3RyaW5nKCdkZS1ERScpICsgJywgJyArIGQudG9Mb2NhbGVUaW1lU3RyaW5nKCdkZS1ERScsIHto +b3VyOicyLWRpZ2l0JyxtaW51dGU6JzItZGlnaXQnfSkgKyAnKSc7CiAgICAgICAgICAgICAgICAg +ICAgfSBjYXRjaChlKSB7fQogICAgICAgICAgICAgICAgICAgIGJhbm5lci5pbm5lckhUTUwgPQog +ICAgICAgICAgICAgICAgICAgICAgICAnPGRpdiBzdHlsZT0iY29sb3I6dmFyKC0tdGV4dC1oZWFk +aW5nKTtmb250LXdlaWdodDo2MDA7bWFyZ2luLWJvdHRvbTo2cHg7Ij5BcnRpa2VsIGZvcnRzZXR6 +ZW4/PC9kaXY+JyArCiAgICAgICAgICAgICAgICAgICAgICAgICc8ZGl2IHN0eWxlPSJjb2xvcjp2 +YXIoLS10ZXh0LXByaW1hcnkpO2ZvbnQtc2l6ZToxM3B4O2xpbmUtaGVpZ2h0OjEuNjttYXJnaW4t +Ym90dG9tOjEycHg7Ij4nICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdEdSBoYXN0IHp1 +bGV0enQgYW4gPHN0cm9uZz4nICsgKHJlc3VtZS50aXRlbCB8fCAnZWluZW0gQXJ0aWtlbCcpICsg +Jzwvc3Ryb25nPiBnZWFyYmVpdGV0JyArIHplaXRUZXh0ICsgJy4nICsKICAgICAgICAgICAgICAg +ICAgICAgICAgJzwvZGl2PicgKwogICAgICAgICAgICAgICAgICAgICAgICAnPGRpdiBzdHlsZT0i +ZGlzcGxheTpmbGV4O2dhcDo4cHg7anVzdGlmeS1jb250ZW50OmZsZXgtZW5kOyI+JyArCiAgICAg +ICAgICAgICAgICAgICAgICAgICAgICAnPGJ1dHRvbiBpZD0icmVzdW1lRGlzbWlzcyIgc3R5bGU9 +InBhZGRpbmc6NnB4IDE0cHg7Ym9yZGVyLXJhZGl1czo0cHg7Ym9yZGVyOjFweCBzb2xpZCB2YXIo +LS1ib3JkZXItY29sb3IpO2JhY2tncm91bmQ6dmFyKC0tYmctY2FyZCk7Y29sb3I6dmFyKC0tdGV4 +dC1zZWNvbmRhcnkpO2N1cnNvcjpwb2ludGVyO2ZvbnQtc2l6ZToxM3B4OyI+TmVpbiBkYW5rZTwv +YnV0dG9uPicgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJzxidXR0b24gaWQ9InJlc3Vt +ZU9wZW4iIHN0eWxlPSJwYWRkaW5nOjZweCAxNHB4O2JvcmRlci1yYWRpdXM6NHB4O2JvcmRlcjpu +b25lO2JhY2tncm91bmQ6IzM0OThkYjtjb2xvcjp3aGl0ZTtjdXJzb3I6cG9pbnRlcjtmb250LXdl +aWdodDo2MDA7Zm9udC1zaXplOjEzcHg7Ij5XZWl0ZXJhcmJlaXRlbjwvYnV0dG9uPicgKwogICAg +ICAgICAgICAgICAgICAgICAgICAnPC9kaXY+JzsKICAgICAgICAgICAgICAgICAgICBkb2N1bWVu +dC5ib2R5LmFwcGVuZENoaWxkKGJhbm5lcik7CiAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQu +Z2V0RWxlbWVudEJ5SWQoJ3Jlc3VtZURpc21pc3MnKS5vbmNsaWNrID0gZnVuY3Rpb24oKSB7IGJh +bm5lci5yZW1vdmUoKTsgfTsKICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50 +QnlJZCgncmVzdW1lT3BlbicpLm9uY2xpY2sgPSBhc3luYyBmdW5jdGlvbigpIHsKICAgICAgICAg +ICAgICAgICAgICAgICAgYmFubmVyLnJlbW92ZSgpOwogICAgICAgICAgICAgICAgICAgICAgICBp +ZiAocmVzdW1lLmlzTmV3KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBOZXVlbiBB +cnRpa2VsIHdhciBub2NoIG5pY2h0IGdlc3BlaWNoZXJ0IC0genVtIEVyc3RlbGxlbiBvZWZmbmVu +CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBEcml2ZUVkaXRvci5jcmVhdGVOZXcoKTsKICAg +ICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAg +IC8vIEJlc3RlaGVuZGVuIEFydGlrZWwgaW0gRWRpdG9yIG9lZmZuZW4KICAgICAgICAgICAgICAg +ICAgICAgICAgICAgIGF3YWl0IERyaXZlUG9ydGFsLnNlbGVjdERvY3VtZW50KHJlc3VtZS5kb2NJ +ZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBEcml2ZVBvcnRhbC5oaWdobGlnaHRJdGVt +KHJlc3VtZS5kb2NJZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBEcml2ZUVkaXRvci5l +ZGl0KHJlc3VtZS5kb2NJZCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAg +ICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIC8vIEF1dG8tRGlzbWlzcyBuYWNoIDMwIFNl +a3VuZGVuCiAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpIHsgaWYgKGJh +bm5lci5wYXJlbnROb2RlKSBiYW5uZXIucmVtb3ZlKCk7IH0sIDMwMDAwKTsKICAgICAgICAgICAg +ICAgIH0sIDE1MDApOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgbG9jYWxT +dG9yYWdlLnJlbW92ZUl0ZW0oJ2RyaXZlLXJlc3VtZS1kb2MnKTsKICAgICAgICAgICAgfQogICAg +ICAgIH0KICAgIH0gY2F0Y2goZSkgewogICAgICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKCdk +cml2ZS1yZXN1bWUtZG9jJyk7CiAgICB9Cn0pOwo8L3NjcmlwdD4KCjwvYm9keT4KPC9odG1sPgo= +### FILE: server.ps1 | 52719 IyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PQojIEQuUi5JLlYuRS4gUG9ydGFsIHYxLjAgLSBMb2thbGVy IEhUVFAtU2VydmVyCiMgUG93ZXJTaGVsbC1iYXNpZXJ0IC0gS2VpbmUgSW5zdGFsbGF0aW9uIG5v @@ -10001,623 +10018,646 @@ S10gICAgICAkVmVyc2lvbkZpeENvdW50IEFydGlrZWwtVmVyc2lvbmVuIGtvcnJpZ2llcnQiIC1G b3JlZ3JvdW5kQ29sb3IgR3JlZW4KfSBlbHNlIHsKICAgIFdyaXRlLUhvc3QgIiAgW09LXSAgICAg IEFsbGUgVmVyc2lvbmVuIGtvcnJla3QiIC1Gb3JlZ3JvdW5kQ29sb3IgR3JlZW4KfQoKIyBTdGF0 aWMtRmlsZS1DYWNoZSAoVGV4dGRhdGVpZW4gaW0gU3BlaWNoZXIgaGFsdGVuKQokc2NyaXB0OlN0 -YXRpY0NhY2hlID0gQHt9CgojIEhUVFAgTGlzdGVuZXIgc3RhcnRlbgokTGlzdGVuZXIgPSBOZXct -T2JqZWN0IFN5c3RlbS5OZXQuSHR0cExpc3RlbmVyCiRMaXN0ZW5lci5QcmVmaXhlcy5BZGQoImh0 -dHA6Ly9sb2NhbGhvc3Q6JFBvcnQvIikKCnRyeSB7CiAgICAkTGlzdGVuZXIuU3RhcnQoKQp9IGNh -dGNoIHsKICAgIFdyaXRlLUhvc3QgIkZFSExFUjogUG9ydCAkUG9ydCBpc3QgYmVyZWl0cyBiZWxl -Z3QuIiAtRm9yZWdyb3VuZENvbG9yIFJlZAogICAgV3JpdGUtSG9zdCAiVmVyc3VjaGVuIFNpZSBl -aW5lbiBhbmRlcmVuIFBvcnQ6IC5cc2VydmVyLnBzMSAtUG9ydCA4MDgxIiAtRm9yZWdyb3VuZENv -bG9yIFllbGxvdwogICAgUmVhZC1Ib3N0ICJFbnRlciBkcnVlY2tlbiB6dW0gQmVlbmRlbiIKICAg -IGV4aXQgMQp9CgojIEJyb3dzZXIgb2VmZm5lbiAoQ2hyb21lID4gRWRnZSA+IFN0YW5kYXJkLUJy -b3dzZXIpCiRCcm93c2VyVXJsID0gImh0dHA6Ly9sb2NhbGhvc3Q6JFBvcnQiCiRCcm93c2VyT3Bl -bmVkID0gJGZhbHNlCgojIENocm9tZS1QZmFkZSBwcnVlZmVuCiRDaHJvbWVQYXRocyA9IEAoCiAg -ICAiJHtlbnY6UHJvZ3JhbUZpbGVzfVxHb29nbGVcQ2hyb21lXEFwcGxpY2F0aW9uXGNocm9tZS5l -eGUiLAogICAgIiR7ZW52OlByb2dyYW1GaWxlcyh4ODYpfVxHb29nbGVcQ2hyb21lXEFwcGxpY2F0 -aW9uXGNocm9tZS5leGUiLAogICAgIiRlbnY6TE9DQUxBUFBEQVRBXEdvb2dsZVxDaHJvbWVcQXBw -bGljYXRpb25cY2hyb21lLmV4ZSIKKQpmb3JlYWNoICgkY3AgaW4gJENocm9tZVBhdGhzKSB7CiAg -ICBpZiAoVGVzdC1QYXRoICRjcCkgewogICAgICAgIFN0YXJ0LVByb2Nlc3MgJGNwICRCcm93c2Vy -VXJsCiAgICAgICAgJEJyb3dzZXJPcGVuZWQgPSAkdHJ1ZQogICAgICAgIGJyZWFrCiAgICB9Cn0K -CiMgRmFsbGJhY2s6IEVkZ2UKaWYgKC1ub3QgJEJyb3dzZXJPcGVuZWQpIHsKICAgICRFZGdlUGF0 -aCA9ICIke2VudjpQcm9ncmFtRmlsZXMoeDg2KX1cTWljcm9zb2Z0XEVkZ2VcQXBwbGljYXRpb25c -bXNlZGdlLmV4ZSIKICAgIGlmIChUZXN0LVBhdGggJEVkZ2VQYXRoKSB7CiAgICAgICAgU3RhcnQt -UHJvY2VzcyAkRWRnZVBhdGggJEJyb3dzZXJVcmwKICAgICAgICAkQnJvd3Nlck9wZW5lZCA9ICR0 -cnVlCiAgICB9Cn0KCiMgRmFsbGJhY2s6IFN0YW5kYXJkLUJyb3dzZXIgdmlhIFN0YXJ0CmlmICgt -bm90ICRCcm93c2VyT3BlbmVkKSB7CiAgICB0cnkgeyBTdGFydC1Qcm9jZXNzICRCcm93c2VyVXJs -OyAkQnJvd3Nlck9wZW5lZCA9ICR0cnVlIH0gY2F0Y2gge30KfQoKaWYgKC1ub3QgJEJyb3dzZXJP -cGVuZWQpIHsKICAgIFdyaXRlLUhvc3QgIiAgQnJvd3NlciBrb25udGUgbmljaHQgZ2VvZWZmbmV0 -IHdlcmRlbi4iIC1Gb3JlZ3JvdW5kQ29sb3IgWWVsbG93CiAgICBXcml0ZS1Ib3N0ICIgIEJpdHRl -IG1hbnVlbGwgb2VmZm5lbjogJEJyb3dzZXJVcmwiIC1Gb3JlZ3JvdW5kQ29sb3IgWWVsbG93Cn0K -CiMgSGVhcnRiZWF0LVRyYWNraW5nOiBTZXJ2ZXIgYmVlbmRldCBzaWNoIHdlbm4gMTAgTWludXRl -biBrZWluIEhlYXJ0YmVhdCBrb21tdC4KIyBDbGllbnQgbnV0enQgZWluZW4gV2ViIFdvcmtlciBm -dWVyIHp1dmVybGFlc3NpZ2UgSGVhcnRiZWF0cyBhdWNoIGJlaSBCYWNrZ3JvdW5kLVRhYnMuCiMg -MTAgTWluIFRpbWVvdXQgPSBtYXhpbWFsZSBSb2J1c3RoZWl0IGdlZ2VuIGplZGUgQXJ0IHZvbiBC -cm93c2VyLVRocm90dGxpbmcuCiRzY3JpcHQ6TGFzdEhlYXJ0YmVhdCA9IEdldC1EYXRlCiRIZWFy -dGJlYXRUaW1lb3V0U2VjID0gMTgwMCAgIyAzMCBNaW4gLSBUYWItV2VjaHNlbCBwYXVzaWVydCBI -ZWFydGJlYXQsIE5ldXN0YXJ0IHBydWVmdCBQb3J0CiRzY3JpcHQ6U2h1dGRvd25QZW5kaW5nID0g -JG51bGwgICMgR25hZGVuZnJpc3QgZnVlciBTaHV0ZG93biAoRjUvUmVmcmVzaCB2cy4gVGFiLUNs -b3NlKQokc2NyaXB0OlNodXRkb3duR3JhY2VTZWMgPSA1ICAgICAjIFNla3VuZGVuIFdhcnRlemVp -dCBiZXZvciBTZXJ2ZXIgdGF0c2FlY2hsaWNoIGJlZW5kZXQgd2lyZAoKIyBSZXF1ZXN0LUxvb3Ag -KG5pY2h0LWJsb2NraWVyZW5kIGZ1ZXIgSGVhcnRiZWF0LVRpbWVvdXQtUHJ1ZWZ1bmcpCnRyeSB7 -CiAgICB3aGlsZSAoJExpc3RlbmVyLklzTGlzdGVuaW5nKSB7CiAgICAgICAgIyBBc3luY2hyb25l -biBSZXF1ZXN0IG1pdCBUaW1lb3V0IHdhcnRlbgogICAgICAgICRBc3luY1Jlc3VsdCA9ICRMaXN0 -ZW5lci5CZWdpbkdldENvbnRleHQoJG51bGwsICRudWxsKQogICAgICAgIHdoaWxlICgtbm90ICRB -c3luY1Jlc3VsdC5Bc3luY1dhaXRIYW5kbGUuV2FpdE9uZSgyMDAwKSkgewogICAgICAgICAgICAj -IFBydWVmZW4gb2IgZWluIFNodXRkb3duIGFuc3RlaHQgKGJlZm9yZXVubG9hZCBnZXNlbmRldCkK -ICAgICAgICAgICAgIyBHbmFkZW5mcmlzdDogRmFsbHMgU2VpdGUgbnVyIG5ldSBnZWxhZGVuIHdp -cmQgKEY1KSwga29tbXQgaW5uZXJoYWxiCiAgICAgICAgICAgICMgdm9uIDUgU2VrdW5kZW4gZWlu -IG5ldWVyIEhlYXJ0YmVhdCB1bmQgYnJpY2h0IGRlbiBTaHV0ZG93biBhYi4KICAgICAgICAgICAg -aWYgKCRzY3JpcHQ6U2h1dGRvd25QZW5kaW5nKSB7CiAgICAgICAgICAgICAgICAkR3JhY2VFbGFw -c2VkID0gKChHZXQtRGF0ZSkgLSAkc2NyaXB0OlNodXRkb3duUGVuZGluZykuVG90YWxTZWNvbmRz -CiAgICAgICAgICAgICAgICBpZiAoJEdyYWNlRWxhcHNlZCAtZ3QgJHNjcmlwdDpTaHV0ZG93bkdy -YWNlU2VjKSB7CiAgICAgICAgICAgICAgICAgICAgV3JpdGUtSG9zdCAiIgogICAgICAgICAgICAg -ICAgICAgIFdyaXRlLUhvc3QgIiAgU2h1dGRvd24tR25hZGVuZnJpc3QgYWJnZWxhdWZlbiAoJHtH -cmFjZUVsYXBzZWR9cykgLSBrZWluIFJlbG9hZCBlcmthbm50LCBTZXJ2ZXIgd2lyZCBiZWVuZGV0 -Li4uIiAtRm9yZWdyb3VuZENvbG9yIFllbGxvdwogICAgICAgICAgICAgICAgICAgICRMaXN0ZW5l -ci5TdG9wKCkKICAgICAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICAgICAgfQogICAg -ICAgICAgICB9CiAgICAgICAgICAgICMgQWxsZSAyIFNla3VuZGVuIHBydWVmZW4gb2IgSGVhcnRi -ZWF0LVRpbWVvdXQgZXJyZWljaHQKICAgICAgICAgICAgJFNlY1NpbmNlSGVhcnRiZWF0ID0gKChH -ZXQtRGF0ZSkgLSAkc2NyaXB0Okxhc3RIZWFydGJlYXQpLlRvdGFsU2Vjb25kcwogICAgICAgICAg -ICBpZiAoJFNlY1NpbmNlSGVhcnRiZWF0IC1ndCAkSGVhcnRiZWF0VGltZW91dFNlYykgewogICAg -ICAgICAgICAgICAgV3JpdGUtSG9zdCAiIgogICAgICAgICAgICAgICAgV3JpdGUtSG9zdCAiICBL -ZWluIEhlYXJ0YmVhdCBzZWl0ICQoW01hdGhdOjpSb3VuZCgkU2VjU2luY2VIZWFydGJlYXQpKXMg -LSBUYWIgd3VyZGUgZ2VzY2hsb3NzZW4sIFNlcnZlciB3aXJkIGJlZW5kZXQuLi4iIC1Gb3JlZ3Jv -dW5kQ29sb3IgWWVsbG93CiAgICAgICAgICAgICAgICAkTGlzdGVuZXIuU3RvcCgpCiAgICAgICAg -ICAgICAgICBicmVhawogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmICgtbm90ICRM -aXN0ZW5lci5Jc0xpc3RlbmluZykgeyBicmVhayB9CiAgICAgICAgJENvbnRleHQgPSAkTGlzdGVu -ZXIuRW5kR2V0Q29udGV4dCgkQXN5bmNSZXN1bHQpCiAgICAgICAgJFJlcXVlc3QgPSAkQ29udGV4 -dC5SZXF1ZXN0CiAgICAgICAgJFJlc3BvbnNlID0gJENvbnRleHQuUmVzcG9uc2UKICAgICAgICAk -TWV0aG9kID0gJFJlcXVlc3QuSHR0cE1ldGhvZAogICAgICAgICRVcmxQYXRoID0gJFJlcXVlc3Qu -VXJsLkxvY2FsUGF0aAoKICAgICAgICAjIFBlbmRpbmcgU2h1dGRvd24gYmVpIGplZGVtIGVpbmdl -aGVuZGVuIFJlcXVlc3QgYWJicmVjaGVuCiAgICAgICAgIyAoU2VpdGUgd3VyZGUgbmV1IGdlbGFk -ZW4gdW5kIGZyYWd0IERhdGVpZW4vQVBJIGFuKQogICAgICAgIGlmICgkc2NyaXB0OlNodXRkb3du -UGVuZGluZyAtYW5kICRVcmxQYXRoIC1uZSAnL2FwaS9zaHV0ZG93bicpIHsKICAgICAgICAgICAg -V3JpdGUtSG9zdCAiICBIQiAgIFNodXRkb3duIGFiZ2Vicm9jaGVuIC0gbmV1ZSBBbmZyYWdlIGVy -a2FubnQgKCRNZXRob2QgJFVybFBhdGgpIiAtRm9yZWdyb3VuZENvbG9yIEdyZWVuCiAgICAgICAg -ICAgICRzY3JpcHQ6U2h1dGRvd25QZW5kaW5nID0gJG51bGwKICAgICAgICB9CgogICAgICAgICMg -UmVxdWVzdC1Mb2dnaW5nIChudXIgQVBJLUF1ZnJ1ZmUsIG5pY2h0IEhlYXJ0YmVhdC9zdGF0aXNj -aGUgRGF0ZWllbikKICAgICAgICBpZiAoJFVybFBhdGguU3RhcnRzV2l0aCgnL2FwaS8nKSAtYW5k -ICRVcmxQYXRoIC1uZSAnL2FwaS9oZWFydGJlYXQnKSB7CiAgICAgICAgICAgIFdyaXRlLUhvc3Qg -IiAgLS0+ICAkTWV0aG9kICRVcmxQYXRoIiAtRm9yZWdyb3VuZENvbG9yIERhcmtHcmF5CiAgICAg -ICAgfQoKICAgICAgICAjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 -PT09PT09PT09PT09PT09PT09PT0KICAgICAgICAjIENPUlMgUHJlZmxpZ2h0CiAgICAgICAgIyA9 +YXRpY0NhY2hlID0gQHt9CgojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 +PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiMgVVBEQVRFLUNIRUNLCiMg PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 -PT09CgogICAgICAgIGlmICgkTWV0aG9kIC1lcSAnT1BUSU9OUycpIHsKICAgICAgICAgICAgJFJl -c3BvbnNlLlN0YXR1c0NvZGUgPSAyMDQKICAgICAgICAgICAgQWRkLVNlY3VyaXR5SGVhZGVycyAk -UmVzcG9uc2UKICAgICAgICAgICAgJFJlc3BvbnNlLkhlYWRlcnMuQWRkKCJBY2Nlc3MtQ29udHJv -bC1BbGxvdy1NZXRob2RzIiwgIkdFVCwgUE9TVCwgT1BUSU9OUyIpCiAgICAgICAgICAgICRSZXNw -b25zZS5IZWFkZXJzLkFkZCgiQWNjZXNzLUNvbnRyb2wtQWxsb3ctSGVhZGVycyIsICJDb250ZW50 -LVR5cGUiKQogICAgICAgICAgICAkUmVzcG9uc2UuQ2xvc2UoKQogICAgICAgICAgICBjb250aW51 -ZQogICAgICAgIH0KCiAgICAgICAgIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 -PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAgICAgIyBBUEktRW5kcHVua3RlCiAgICAg +PT09PT09PT09PT09PT09PT09PT0KCiRzY3JpcHQ6VXBkYXRlQXZhaWxhYmxlICAgID0gJGZhbHNl +CiRzY3JpcHQ6UmVtb3RlVmVyc2lvbiAgICAgID0gJycKJHNjcmlwdDpVcGRhdGVMYXN0Q2hlY2tV +dGMgPSBbZGF0ZXRpbWVdOjpNaW5WYWx1ZQoKZnVuY3Rpb24gUmVmcmVzaC1VcGRhdGVDaGVjayB7 +CiAgICBpZiAoKFtkYXRldGltZV06OlV0Y05vdyAtICRzY3JpcHQ6VXBkYXRlTGFzdENoZWNrVXRj +KS5Ub3RhbE1pbnV0ZXMgLWx0IDYwKSB7IHJldHVybiB9CiAgICAkc2NyaXB0OlVwZGF0ZUxhc3RD +aGVja1V0YyA9IFtkYXRldGltZV06OlV0Y05vdwogICAgJGxvY2FsVmVyID0gJzAuMC4wJwogICAg +JF92ZiA9IEpvaW4tUGF0aCAkUm9vdCAnVkVSU0lPTicKICAgIGlmIChUZXN0LVBhdGggLUxpdGVy +YWxQYXRoICRfdmYpIHsgJGxvY2FsVmVyID0gKEdldC1Db250ZW50IC1MaXRlcmFsUGF0aCAkX3Zm +IC1SYXcpLlRyaW0oKSB9CiAgICB0cnkgewogICAgICAgICRydiA9IChJbnZva2UtV2ViUmVxdWVz +dCAtVXJpICdodHRwczovL2dpdGVhLnJoaW5vLm5ydy9SaGluby9TdGF0dXNRdW9fVXBkYXRlcy9y +YXcvYnJhbmNoL21haW4vRFJJVkUvVkVSU0lPTicgYAogICAgICAgICAgICAgICAtVXNlQmFzaWNQ +YXJzaW5nIC1UaW1lb3V0U2VjIDMgLUVycm9yQWN0aW9uIFN0b3ApLkNvbnRlbnQuVHJpbSgpCiAg +ICAgICAgJHNjcmlwdDpSZW1vdGVWZXJzaW9uICAgPSAkcnYKICAgICAgICAkc2NyaXB0OlVwZGF0 +ZUF2YWlsYWJsZSA9IChbU3lzdGVtLlZlcnNpb25dJHJ2IC1ndCBbU3lzdGVtLlZlcnNpb25dJGxv +Y2FsVmVyKQogICAgICAgIFdyaXRlLUhvc3QgIiAgW1VQREFURS1DSEVDS10gbG9rYWw9JGxvY2Fs +VmVyIHJlbW90ZT0kcnYgYXZhaWxhYmxlPSQoJHNjcmlwdDpVcGRhdGVBdmFpbGFibGUpIgogICAg +fSBjYXRjaCB7CiAgICAgICAgV3JpdGUtSG9zdCAiICBbVVBEQVRFLUNIRUNLXSBuaWNodCBlcnJl +aWNoYmFyICgkKCRfLkV4Y2VwdGlvbi5NZXNzYWdlKSkiCiAgICB9Cn0KUmVmcmVzaC1VcGRhdGVD +aGVjawoKIyBIVFRQIExpc3RlbmVyIHN0YXJ0ZW4KJExpc3RlbmVyID0gTmV3LU9iamVjdCBTeXN0 +ZW0uTmV0Lkh0dHBMaXN0ZW5lcgokTGlzdGVuZXIuUHJlZml4ZXMuQWRkKCJodHRwOi8vbG9jYWxo +b3N0OiRQb3J0LyIpCgp0cnkgewogICAgJExpc3RlbmVyLlN0YXJ0KCkKfSBjYXRjaCB7CiAgICBX +cml0ZS1Ib3N0ICJGRUhMRVI6IFBvcnQgJFBvcnQgaXN0IGJlcmVpdHMgYmVsZWd0LiIgLUZvcmVn +cm91bmRDb2xvciBSZWQKICAgIFdyaXRlLUhvc3QgIlZlcnN1Y2hlbiBTaWUgZWluZW4gYW5kZXJl +biBQb3J0OiAuXHNlcnZlci5wczEgLVBvcnQgODA4MSIgLUZvcmVncm91bmRDb2xvciBZZWxsb3cK +ICAgIFJlYWQtSG9zdCAiRW50ZXIgZHJ1ZWNrZW4genVtIEJlZW5kZW4iCiAgICBleGl0IDEKfQoK +IyBCcm93c2VyIG9lZmZuZW4gKENocm9tZSA+IEVkZ2UgPiBTdGFuZGFyZC1Ccm93c2VyKQokQnJv +d3NlclVybCA9ICJodHRwOi8vbG9jYWxob3N0OiRQb3J0IgokQnJvd3Nlck9wZW5lZCA9ICRmYWxz +ZQoKIyBDaHJvbWUtUGZhZGUgcHJ1ZWZlbgokQ2hyb21lUGF0aHMgPSBAKAogICAgIiR7ZW52OlBy +b2dyYW1GaWxlc31cR29vZ2xlXENocm9tZVxBcHBsaWNhdGlvblxjaHJvbWUuZXhlIiwKICAgICIk +e2VudjpQcm9ncmFtRmlsZXMoeDg2KX1cR29vZ2xlXENocm9tZVxBcHBsaWNhdGlvblxjaHJvbWUu +ZXhlIiwKICAgICIkZW52OkxPQ0FMQVBQREFUQVxHb29nbGVcQ2hyb21lXEFwcGxpY2F0aW9uXGNo +cm9tZS5leGUiCikKZm9yZWFjaCAoJGNwIGluICRDaHJvbWVQYXRocykgewogICAgaWYgKFRlc3Qt +UGF0aCAkY3ApIHsKICAgICAgICBTdGFydC1Qcm9jZXNzICRjcCAkQnJvd3NlclVybAogICAgICAg +ICRCcm93c2VyT3BlbmVkID0gJHRydWUKICAgICAgICBicmVhawogICAgfQp9CgojIEZhbGxiYWNr +OiBFZGdlCmlmICgtbm90ICRCcm93c2VyT3BlbmVkKSB7CiAgICAkRWRnZVBhdGggPSAiJHtlbnY6 +UHJvZ3JhbUZpbGVzKHg4Nil9XE1pY3Jvc29mdFxFZGdlXEFwcGxpY2F0aW9uXG1zZWRnZS5leGUi +CiAgICBpZiAoVGVzdC1QYXRoICRFZGdlUGF0aCkgewogICAgICAgIFN0YXJ0LVByb2Nlc3MgJEVk +Z2VQYXRoICRCcm93c2VyVXJsCiAgICAgICAgJEJyb3dzZXJPcGVuZWQgPSAkdHJ1ZQogICAgfQp9 +CgojIEZhbGxiYWNrOiBTdGFuZGFyZC1Ccm93c2VyIHZpYSBTdGFydAppZiAoLW5vdCAkQnJvd3Nl +ck9wZW5lZCkgewogICAgdHJ5IHsgU3RhcnQtUHJvY2VzcyAkQnJvd3NlclVybDsgJEJyb3dzZXJP +cGVuZWQgPSAkdHJ1ZSB9IGNhdGNoIHt9Cn0KCmlmICgtbm90ICRCcm93c2VyT3BlbmVkKSB7CiAg +ICBXcml0ZS1Ib3N0ICIgIEJyb3dzZXIga29ubnRlIG5pY2h0IGdlb2VmZm5ldCB3ZXJkZW4uIiAt +Rm9yZWdyb3VuZENvbG9yIFllbGxvdwogICAgV3JpdGUtSG9zdCAiICBCaXR0ZSBtYW51ZWxsIG9l +ZmZuZW46ICRCcm93c2VyVXJsIiAtRm9yZWdyb3VuZENvbG9yIFllbGxvdwp9CgojIEhlYXJ0YmVh +dC1UcmFja2luZzogU2VydmVyIGJlZW5kZXQgc2ljaCB3ZW5uIDEwIE1pbnV0ZW4ga2VpbiBIZWFy +dGJlYXQga29tbXQuCiMgQ2xpZW50IG51dHp0IGVpbmVuIFdlYiBXb3JrZXIgZnVlciB6dXZlcmxh +ZXNzaWdlIEhlYXJ0YmVhdHMgYXVjaCBiZWkgQmFja2dyb3VuZC1UYWJzLgojIDEwIE1pbiBUaW1l +b3V0ID0gbWF4aW1hbGUgUm9idXN0aGVpdCBnZWdlbiBqZWRlIEFydCB2b24gQnJvd3Nlci1UaHJv +dHRsaW5nLgokc2NyaXB0Okxhc3RIZWFydGJlYXQgPSBHZXQtRGF0ZQokSGVhcnRiZWF0VGltZW91 +dFNlYyA9IDE4MDAgICMgMzAgTWluIC0gVGFiLVdlY2hzZWwgcGF1c2llcnQgSGVhcnRiZWF0LCBO +ZXVzdGFydCBwcnVlZnQgUG9ydAokc2NyaXB0OlNodXRkb3duUGVuZGluZyA9ICRudWxsICAjIEdu +YWRlbmZyaXN0IGZ1ZXIgU2h1dGRvd24gKEY1L1JlZnJlc2ggdnMuIFRhYi1DbG9zZSkKJHNjcmlw +dDpTaHV0ZG93bkdyYWNlU2VjID0gNSAgICAgIyBTZWt1bmRlbiBXYXJ0ZXplaXQgYmV2b3IgU2Vy +dmVyIHRhdHNhZWNobGljaCBiZWVuZGV0IHdpcmQKCiMgUmVxdWVzdC1Mb29wIChuaWNodC1ibG9j +a2llcmVuZCBmdWVyIEhlYXJ0YmVhdC1UaW1lb3V0LVBydWVmdW5nKQp0cnkgewogICAgd2hpbGUg +KCRMaXN0ZW5lci5Jc0xpc3RlbmluZykgewogICAgICAgICMgQXN5bmNocm9uZW4gUmVxdWVzdCBt +aXQgVGltZW91dCB3YXJ0ZW4KICAgICAgICAkQXN5bmNSZXN1bHQgPSAkTGlzdGVuZXIuQmVnaW5H +ZXRDb250ZXh0KCRudWxsLCAkbnVsbCkKICAgICAgICB3aGlsZSAoLW5vdCAkQXN5bmNSZXN1bHQu +QXN5bmNXYWl0SGFuZGxlLldhaXRPbmUoMjAwMCkpIHsKICAgICAgICAgICAgIyBQcnVlZmVuIG9i +IGVpbiBTaHV0ZG93biBhbnN0ZWh0IChiZWZvcmV1bmxvYWQgZ2VzZW5kZXQpCiAgICAgICAgICAg +ICMgR25hZGVuZnJpc3Q6IEZhbGxzIFNlaXRlIG51ciBuZXUgZ2VsYWRlbiB3aXJkIChGNSksIGtv +bW10IGlubmVyaGFsYgogICAgICAgICAgICAjIHZvbiA1IFNla3VuZGVuIGVpbiBuZXVlciBIZWFy +dGJlYXQgdW5kIGJyaWNodCBkZW4gU2h1dGRvd24gYWIuCiAgICAgICAgICAgIGlmICgkc2NyaXB0 +OlNodXRkb3duUGVuZGluZykgewogICAgICAgICAgICAgICAgJEdyYWNlRWxhcHNlZCA9ICgoR2V0 +LURhdGUpIC0gJHNjcmlwdDpTaHV0ZG93blBlbmRpbmcpLlRvdGFsU2Vjb25kcwogICAgICAgICAg +ICAgICAgaWYgKCRHcmFjZUVsYXBzZWQgLWd0ICRzY3JpcHQ6U2h1dGRvd25HcmFjZVNlYykgewog +ICAgICAgICAgICAgICAgICAgIFdyaXRlLUhvc3QgIiIKICAgICAgICAgICAgICAgICAgICBXcml0 +ZS1Ib3N0ICIgIFNodXRkb3duLUduYWRlbmZyaXN0IGFiZ2VsYXVmZW4gKCR7R3JhY2VFbGFwc2Vk +fXMpIC0ga2VpbiBSZWxvYWQgZXJrYW5udCwgU2VydmVyIHdpcmQgYmVlbmRldC4uLiIgLUZvcmVn +cm91bmRDb2xvciBZZWxsb3cKICAgICAgICAgICAgICAgICAgICAkTGlzdGVuZXIuU3RvcCgpCiAg +ICAgICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQog +ICAgICAgICAgICAjIEFsbGUgMiBTZWt1bmRlbiBwcnVlZmVuIG9iIEhlYXJ0YmVhdC1UaW1lb3V0 +IGVycmVpY2h0CiAgICAgICAgICAgICRTZWNTaW5jZUhlYXJ0YmVhdCA9ICgoR2V0LURhdGUpIC0g +JHNjcmlwdDpMYXN0SGVhcnRiZWF0KS5Ub3RhbFNlY29uZHMKICAgICAgICAgICAgaWYgKCRTZWNT +aW5jZUhlYXJ0YmVhdCAtZ3QgJEhlYXJ0YmVhdFRpbWVvdXRTZWMpIHsKICAgICAgICAgICAgICAg +IFdyaXRlLUhvc3QgIiIKICAgICAgICAgICAgICAgIFdyaXRlLUhvc3QgIiAgS2VpbiBIZWFydGJl +YXQgc2VpdCAkKFtNYXRoXTo6Um91bmQoJFNlY1NpbmNlSGVhcnRiZWF0KSlzIC0gVGFiIHd1cmRl +IGdlc2NobG9zc2VuLCBTZXJ2ZXIgd2lyZCBiZWVuZGV0Li4uIiAtRm9yZWdyb3VuZENvbG9yIFll +bGxvdwogICAgICAgICAgICAgICAgJExpc3RlbmVyLlN0b3AoKQogICAgICAgICAgICAgICAgYnJl +YWsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoLW5vdCAkTGlzdGVuZXIuSXNM +aXN0ZW5pbmcpIHsgYnJlYWsgfQogICAgICAgICRDb250ZXh0ID0gJExpc3RlbmVyLkVuZEdldENv +bnRleHQoJEFzeW5jUmVzdWx0KQogICAgICAgICRSZXF1ZXN0ID0gJENvbnRleHQuUmVxdWVzdAog +ICAgICAgICRSZXNwb25zZSA9ICRDb250ZXh0LlJlc3BvbnNlCiAgICAgICAgJE1ldGhvZCA9ICRS +ZXF1ZXN0Lkh0dHBNZXRob2QKICAgICAgICAkVXJsUGF0aCA9ICRSZXF1ZXN0LlVybC5Mb2NhbFBh +dGgKCiAgICAgICAgIyBQZW5kaW5nIFNodXRkb3duIGJlaSBqZWRlbSBlaW5nZWhlbmRlbiBSZXF1 +ZXN0IGFiYnJlY2hlbgogICAgICAgICMgKFNlaXRlIHd1cmRlIG5ldSBnZWxhZGVuIHVuZCBmcmFn +dCBEYXRlaWVuL0FQSSBhbikKICAgICAgICBpZiAoJHNjcmlwdDpTaHV0ZG93blBlbmRpbmcgLWFu +ZCAkVXJsUGF0aCAtbmUgJy9hcGkvc2h1dGRvd24nKSB7CiAgICAgICAgICAgIFdyaXRlLUhvc3Qg +IiAgSEIgICBTaHV0ZG93biBhYmdlYnJvY2hlbiAtIG5ldWUgQW5mcmFnZSBlcmthbm50ICgkTWV0 +aG9kICRVcmxQYXRoKSIgLUZvcmVncm91bmRDb2xvciBHcmVlbgogICAgICAgICAgICAkc2NyaXB0 +OlNodXRkb3duUGVuZGluZyA9ICRudWxsCiAgICAgICAgfQoKICAgICAgICAjIFJlcXVlc3QtTG9n +Z2luZyAobnVyIEFQSS1BdWZydWZlLCBuaWNodCBIZWFydGJlYXQvc3RhdGlzY2hlIERhdGVpZW4p +CiAgICAgICAgaWYgKCRVcmxQYXRoLlN0YXJ0c1dpdGgoJy9hcGkvJykgLWFuZCAkVXJsUGF0aCAt +bmUgJy9hcGkvaGVhcnRiZWF0JykgewogICAgICAgICAgICBXcml0ZS1Ib3N0ICIgIC0tPiAgJE1l +dGhvZCAkVXJsUGF0aCIgLUZvcmVncm91bmRDb2xvciBEYXJrR3JheQogICAgICAgIH0KCiAgICAg ICAgIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 -PT09PT09PT09CgogICAgICAgICMgLS0tIFBPU1QgL2FwaS9oZWFydGJlYXQgLS0tCiAgICAgICAg -IyBCcm93c2VyIHNlbmRldCBhbGxlIDUgU2VrdW5kZW4gZWluZW4gSGVhcnRiZWF0ICh2aWEgV2Vi -IFdvcmtlciwgbmllIGdlZHJvc3NlbHQpCiAgICAgICAgIyBTZXJ2ZXIgZmFlaHJ0IGF1dG9tYXRp -c2NoIGhlcnVudGVyIHdlbm4gMTAgTWludXRlbiBrZWluIEhlYXJ0YmVhdCBrb21tdAogICAgICAg -ICMgQW50d29ydCBlbnRoYWVsdCBpZGxlLVNla3VuZGVuIHVuZCBXYXJudW5nIDYwcyB2b3IgU2h1 -dGRvd24KICAgICAgICBpZiAoJFVybFBhdGggLWVxICcvYXBpL2hlYXJ0YmVhdCcgLWFuZCAkTWV0 -aG9kIC1lcSAnUE9TVCcpIHsKICAgICAgICAgICAgIyBQZW5kaW5nIFNodXRkb3duIGFiYnJlY2hl -biAoU2VpdGUgd3VyZGUgbnVyIG5ldSBnZWxhZGVuLCBuaWNodCBnZXNjaGxvc3NlbikKICAgICAg -ICAgICAgaWYgKCRzY3JpcHQ6U2h1dGRvd25QZW5kaW5nKSB7CiAgICAgICAgICAgICAgICBXcml0 -ZS1Ib3N0ICIgIEhCICAgU2h1dGRvd24gYWJnZWJyb2NoZW4gLSBTZWl0ZSB3dXJkZSBuZXUgZ2Vs -YWRlbiAoRjUvUmVmcmVzaCkiIC1Gb3JlZ3JvdW5kQ29sb3IgR3JlZW4KICAgICAgICAgICAgICAg -ICRzY3JpcHQ6U2h1dGRvd25QZW5kaW5nID0gJG51bGwKICAgICAgICAgICAgfQogICAgICAgICAg -ICAkSWRsZVNlYyA9IFtNYXRoXTo6Um91bmQoKChHZXQtRGF0ZSkgLSAkc2NyaXB0Okxhc3RIZWFy -dGJlYXQpLlRvdGFsU2Vjb25kcykKICAgICAgICAgICAgJFdhcm5pbmdUaHJlc2hvbGQgPSAkSGVh -cnRiZWF0VGltZW91dFNlYyAtIDYwICAjIFdhcm51bmcgNjBzIHZvciBUaW1lb3V0CiAgICAgICAg -ICAgICRSZW1haW5pbmcgPSBbTWF0aF06Ok1heCgwLCAkSGVhcnRiZWF0VGltZW91dFNlYyAtICRJ -ZGxlU2VjKQogICAgICAgICAgICAkc2NyaXB0Okxhc3RIZWFydGJlYXQgPSBHZXQtRGF0ZQogICAg -ICAgICAgICBpZiAoJElkbGVTZWMgLWd0ICRXYXJuaW5nVGhyZXNob2xkKSB7CiAgICAgICAgICAg -ICAgICBTZW5kLUpzb24gJFJlc3BvbnNlIEB7IG9rID0gJHRydWU7IGlkbGUgPSAkSWRsZVNlYzsg -d2FybmluZyA9ICR0cnVlOyByZW1haW5pbmdTZWNvbmRzID0gJFJlbWFpbmluZyB9CiAgICAgICAg -ICAgICAgICBXcml0ZS1Ib3N0ICIgIEhCICAgSGVhcnRiZWF0IG5hY2ggJHtJZGxlU2VjfXMgUGF1 -c2UgLSBXYXJudW5nIGdlc2VuZGV0IChub2NoICR7UmVtYWluaW5nfXMpIiAtRm9yZWdyb3VuZENv -bG9yIFllbGxvdwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgU2VuZC1Kc29u -ICRSZXNwb25zZSBAeyBvayA9ICR0cnVlOyBpZGxlID0gJElkbGVTZWM7IHdhcm5pbmcgPSAkZmFs -c2U7IHJlbWFpbmluZ1NlY29uZHMgPSAkUmVtYWluaW5nIH0KICAgICAgICAgICAgfQogICAgICAg -ICAgICAkUmVzcG9uc2UuQ2xvc2UoKQogICAgICAgICAgICBjb250aW51ZQogICAgICAgIH0KCiAg -ICAgICAgIyAtLS0gR0VUIC9hcGkvZW52aXJvbiAtLS0KICAgICAgICBpZiAoJFVybFBhdGggLWVx -ICcvYXBpL2Vudmlyb24nIC1hbmQgJE1ldGhvZCAtZXEgJ0dFVCcpIHsKICAgICAgICAgICAgU2Vu -ZC1Kc29uICRSZXNwb25zZSBAewogICAgICAgICAgICAgICAgdXNlcm5hbWUgICAgID0gJGVudjpV -U0VSTkFNRQogICAgICAgICAgICAgICAgY29tcHV0ZXJuYW1lID0gJGVudjpDT01QVVRFUk5BTUUK -ICAgICAgICAgICAgICAgIHVzZXJkb21haW4gICA9ICRlbnY6VVNFUkRPTUFJTgogICAgICAgICAg -ICB9CiAgICAgICAgICAgICRSZXNwb25zZS5DbG9zZSgpCiAgICAgICAgICAgIFdyaXRlLUhvc3Qg -IiAgQVBJICAvYXBpL2Vudmlyb24gIChVc2VyOiAkZW52OlVTRVJOQU1FKSIgLUZvcmVncm91bmRD -b2xvciBDeWFuCiAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgfQoKICAgICAgICAjIC0tLSBH -RVQgL2FwaS9zY2FuIC0tLQogICAgICAgICMgU2Nhbm50IGFsbGUgS2F0ZWdvcmllLVVudGVyb3Jk -bmVyIHVuZCBsaWVmZXJ0IERva3VtZW50LURhdGVpZW4KICAgICAgICBpZiAoJFVybFBhdGggLWVx -ICcvYXBpL3NjYW4nIC1hbmQgJE1ldGhvZCAtZXEgJ0dFVCcpIHsKICAgICAgICAgICAgJERhdGFE -aXIgPSBKb2luLVBhdGggJFJvb3QgImRhdGEiCiAgICAgICAgICAgICRSZXN1bHQgPSBbU3lzdGVt -LkNvbGxlY3Rpb25zLkFycmF5TGlzdF06Om5ldygpCgogICAgICAgICAgICBpZiAoVGVzdC1QYXRo -ICREYXRhRGlyKSB7CiAgICAgICAgICAgICAgICBHZXQtQ2hpbGRJdGVtICREYXRhRGlyIC1EaXJl -Y3RvcnkgfCBGb3JFYWNoLU9iamVjdCB7CiAgICAgICAgICAgICAgICAgICAgJEthdE5hbWUgPSAk -Xy5OYW1lCiAgICAgICAgICAgICAgICAgICAgR2V0LUNoaWxkSXRlbSAkXy5GdWxsTmFtZSAtRmls -dGVyICIqLmpzb24iIHwgRm9yRWFjaC1PYmplY3QgewogICAgICAgICAgICAgICAgICAgICAgICBb -dm9pZF0kUmVzdWx0LkFkZChAewogICAgICAgICAgICAgICAgICAgICAgICAgICAga2F0ZWdvcmll -ID0gJEthdE5hbWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lICA9ICRfLk5h -bWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGggICAgICA9ICJkYXRhLyRLYXROYW1l -LyQoJF8uTmFtZSkiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplICAgICAgPSAkXy5M -ZW5ndGgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGlmaWVkICA9ICRfLkxhc3RXcml0 -ZVRpbWVVdGMuVG9TdHJpbmcoIm8iKQogICAgICAgICAgICAgICAgICAgICAgICB9KQogICAgICAg -ICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAg -ICAgU2VuZC1Kc29uICRSZXNwb25zZSBAeyBmaWxlcyA9IEAoJFJlc3VsdCkgfQogICAgICAgICAg -ICAkUmVzcG9uc2UuQ2xvc2UoKQogICAgICAgICAgICBXcml0ZS1Ib3N0ICIgIEFQSSAgL2FwaS9z -Y2FuICAoJCgkUmVzdWx0LkNvdW50KSBEb2t1bWVudGUpIiAtRm9yZWdyb3VuZENvbG9yIEN5YW4K -ICAgICAgICAgICAgY29udGludWUKICAgICAgICB9CgogICAgICAgICMgLS0tIEdFVCAvYXBpL2dv -dmVybmFuY2UgLS0tCiAgICAgICAgaWYgKCRVcmxQYXRoIC1lcSAnL2FwaS9nb3Zlcm5hbmNlJyAt -YW5kICRNZXRob2QgLWVxICdHRVQnKSB7CiAgICAgICAgICAgICRHb3YgPSBHZXQtR292ZXJuYW5j -ZQogICAgICAgICAgICBpZiAoJEdvdikgewogICAgICAgICAgICAgICAgJElzU1UgPSBUZXN0LVN1 -cGVyVXNlciAkR292CiAgICAgICAgICAgICAgICBTZW5kLUpzb24gJFJlc3BvbnNlIEB7CiAgICAg -ICAgICAgICAgICAgICAgZ292ZXJuYW5jZSA9ICRHb3YKICAgICAgICAgICAgICAgICAgICBjdXJy -ZW50VXNlciA9ICRlbnY6VVNFUk5BTUUKICAgICAgICAgICAgICAgICAgICBjdXJyZW50RG9tYWlu -ID0gJGVudjpVU0VSRE9NQUlOCiAgICAgICAgICAgICAgICAgICAgaXNTdXBlclVzZXIgPSAkSXNT -VQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAg -U2VuZC1Kc29uICRSZXNwb25zZSBAewogICAgICAgICAgICAgICAgICAgIGdvdmVybmFuY2UgPSAk -bnVsbAogICAgICAgICAgICAgICAgICAgIGN1cnJlbnRVc2VyID0gJGVudjpVU0VSTkFNRQogICAg -ICAgICAgICAgICAgICAgIGN1cnJlbnREb21haW4gPSAkZW52OlVTRVJET01BSU4KICAgICAgICAg -ICAgICAgICAgICBpc1N1cGVyVXNlciA9ICR0cnVlCiAgICAgICAgICAgICAgICB9CiAgICAgICAg -ICAgIH0KICAgICAgICAgICAgJFJlc3BvbnNlLkNsb3NlKCkKICAgICAgICAgICAgV3JpdGUtSG9z -dCAiICBBUEkgIC9hcGkvZ292ZXJuYW5jZSAgKFVzZXI6ICRlbnY6VVNFUk5BTUUsIFNVOiAkKFRl -c3QtU3VwZXJVc2VyIChHZXQtR292ZXJuYW5jZSkpKSIgLUZvcmVncm91bmRDb2xvciBDeWFuCiAg -ICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgfQoKICAgICAgICAjIC0tLSBQT1NUIC9hcGkvZ292 -ZXJuYW5jZSAtLS0KICAgICAgICAjIE51ciBTdXBlclVzZXIgZGFyZiBnb3Zlcm5hbmNlLmpzb24g -YWVuZGVybgogICAgICAgIGlmICgkVXJsUGF0aCAtZXEgJy9hcGkvZ292ZXJuYW5jZScgLWFuZCAk -TWV0aG9kIC1lcSAnUE9TVCcpIHsKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICRH -b3YgPSBHZXQtR292ZXJuYW5jZQogICAgICAgICAgICAgICAgJElzU1UgPSBUZXN0LVN1cGVyVXNl -ciAkR292CiAgICAgICAgICAgICAgICBpZiAoLW5vdCAkSXNTVSkgewogICAgICAgICAgICAgICAg -ICAgIFNlbmQtSnNvbiAkUmVzcG9uc2UgQHsgZXJyb3IgPSAiTnVyIFN1cGVyVXNlciBkYXJmIEdv -dmVybmFuY2UtRGF0ZW4gYWVuZGVybiAoVXNlcjogJGVudjpVU0VSTkFNRSkiIH0gNDAzCiAgICAg -ICAgICAgICAgICAgICAgV3JpdGUtSG9zdCAiICBFUlIgIFBPU1QgL2FwaS9nb3Zlcm5hbmNlICBB -QkdFTEVITlQgKFVzZXI6ICRlbnY6VVNFUk5BTUUpIiAtRm9yZWdyb3VuZENvbG9yIFJlZAogICAg -ICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAkQm9keSA9IFJlYWQtQm9k -eSAkUmVxdWVzdAogICAgICAgICAgICAgICAgICAgIGlmICgtbm90ICRCb2R5IC1vciAkQm9keS5M -ZW5ndGggLWx0IDIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgU2VuZC1Kc29uICRSZXNwb25z -ZSBAeyBlcnJvciA9ICJMZWVyZXIgUmVxdWVzdC1Cb2R5IiB9IDQwMAogICAgICAgICAgICAgICAg -ICAgICAgICBXcml0ZS1Ib3N0ICIgIEVSUiAgUE9TVCAvYXBpL2dvdmVybmFuY2UgIExlZXJlciBC -b2R5IiAtRm9yZWdyb3VuZENvbG9yIFJlZAogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAg -ICAgICAgICAgICAgICAgICAgICAgICROZXdHb3YgPSAkQm9keSB8IENvbnZlcnRGcm9tLUpzb24K -ICAgICAgICAgICAgICAgICAgICAgICAgU2F2ZS1Hb3Zlcm5hbmNlICROZXdHb3YKICAgICAgICAg -ICAgICAgICAgICAgICAgU2VuZC1Kc29uICRSZXNwb25zZSBAeyBvayA9ICR0cnVlIH0KICAgICAg -ICAgICAgICAgICAgICAgICAgV3JpdGUtSG9zdCAiICBBUEkgIFBPU1QgL2FwaS9nb3Zlcm5hbmNl -ICBha3R1YWxpc2llcnQgdm9uICRlbnY6VVNFUk5BTUUgKCQoJEJvZHkuTGVuZ3RoKSBCeXRlcyki -IC1Gb3JlZ3JvdW5kQ29sb3IgR3JlZW4KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAg -ICAgICB9CiAgICAgICAgICAgIH0gY2F0Y2ggewogICAgICAgICAgICAgICAgV3JpdGUtSG9zdCAi -ICBFUlIgIFBPU1QgL2FwaS9nb3Zlcm5hbmNlICBFWENFUFRJT046ICQoJF8uRXhjZXB0aW9uLk1l +PT09PT09PT09CiAgICAgICAgIyBDT1JTIFByZWZsaWdodAogICAgICAgICMgPT09PT09PT09PT09 +PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKICAgICAg +ICBpZiAoJE1ldGhvZCAtZXEgJ09QVElPTlMnKSB7CiAgICAgICAgICAgICRSZXNwb25zZS5TdGF0 +dXNDb2RlID0gMjA0CiAgICAgICAgICAgIEFkZC1TZWN1cml0eUhlYWRlcnMgJFJlc3BvbnNlCiAg +ICAgICAgICAgICRSZXNwb25zZS5IZWFkZXJzLkFkZCgiQWNjZXNzLUNvbnRyb2wtQWxsb3ctTWV0 +aG9kcyIsICJHRVQsIFBPU1QsIE9QVElPTlMiKQogICAgICAgICAgICAkUmVzcG9uc2UuSGVhZGVy +cy5BZGQoIkFjY2Vzcy1Db250cm9sLUFsbG93LUhlYWRlcnMiLCAiQ29udGVudC1UeXBlIikKICAg +ICAgICAgICAgJFJlc3BvbnNlLkNsb3NlKCkKICAgICAgICAgICAgY29udGludWUKICAgICAgICB9 +CgogICAgICAgICMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 +PT09PT09PT09PT09PT09PQogICAgICAgICMgQVBJLUVuZHB1bmt0ZQogICAgICAgICMgPT09PT09 +PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoK +ICAgICAgICAjIC0tLSBQT1NUIC9hcGkvaGVhcnRiZWF0IC0tLQogICAgICAgICMgQnJvd3NlciBz +ZW5kZXQgYWxsZSA1IFNla3VuZGVuIGVpbmVuIEhlYXJ0YmVhdCAodmlhIFdlYiBXb3JrZXIsIG5p +ZSBnZWRyb3NzZWx0KQogICAgICAgICMgU2VydmVyIGZhZWhydCBhdXRvbWF0aXNjaCBoZXJ1bnRl +ciB3ZW5uIDEwIE1pbnV0ZW4ga2VpbiBIZWFydGJlYXQga29tbXQKICAgICAgICAjIEFudHdvcnQg +ZW50aGFlbHQgaWRsZS1TZWt1bmRlbiB1bmQgV2FybnVuZyA2MHMgdm9yIFNodXRkb3duCiAgICAg +ICAgaWYgKCRVcmxQYXRoIC1lcSAnL2FwaS9oZWFydGJlYXQnIC1hbmQgJE1ldGhvZCAtZXEgJ1BP +U1QnKSB7CiAgICAgICAgICAgICMgUGVuZGluZyBTaHV0ZG93biBhYmJyZWNoZW4gKFNlaXRlIHd1 +cmRlIG51ciBuZXUgZ2VsYWRlbiwgbmljaHQgZ2VzY2hsb3NzZW4pCiAgICAgICAgICAgIGlmICgk +c2NyaXB0OlNodXRkb3duUGVuZGluZykgewogICAgICAgICAgICAgICAgV3JpdGUtSG9zdCAiICBI +QiAgIFNodXRkb3duIGFiZ2Vicm9jaGVuIC0gU2VpdGUgd3VyZGUgbmV1IGdlbGFkZW4gKEY1L1Jl +ZnJlc2gpIiAtRm9yZWdyb3VuZENvbG9yIEdyZWVuCiAgICAgICAgICAgICAgICAkc2NyaXB0OlNo +dXRkb3duUGVuZGluZyA9ICRudWxsCiAgICAgICAgICAgIH0KICAgICAgICAgICAgJElkbGVTZWMg +PSBbTWF0aF06OlJvdW5kKCgoR2V0LURhdGUpIC0gJHNjcmlwdDpMYXN0SGVhcnRiZWF0KS5Ub3Rh +bFNlY29uZHMpCiAgICAgICAgICAgICRXYXJuaW5nVGhyZXNob2xkID0gJEhlYXJ0YmVhdFRpbWVv +dXRTZWMgLSA2MCAgIyBXYXJudW5nIDYwcyB2b3IgVGltZW91dAogICAgICAgICAgICAkUmVtYWlu +aW5nID0gW01hdGhdOjpNYXgoMCwgJEhlYXJ0YmVhdFRpbWVvdXRTZWMgLSAkSWRsZVNlYykKICAg +ICAgICAgICAgJHNjcmlwdDpMYXN0SGVhcnRiZWF0ID0gR2V0LURhdGUKICAgICAgICAgICAgaWYg +KCRJZGxlU2VjIC1ndCAkV2FybmluZ1RocmVzaG9sZCkgewogICAgICAgICAgICAgICAgU2VuZC1K +c29uICRSZXNwb25zZSBAeyBvayA9ICR0cnVlOyBpZGxlID0gJElkbGVTZWM7IHdhcm5pbmcgPSAk +dHJ1ZTsgcmVtYWluaW5nU2Vjb25kcyA9ICRSZW1haW5pbmcgfQogICAgICAgICAgICAgICAgV3Jp +dGUtSG9zdCAiICBIQiAgIEhlYXJ0YmVhdCBuYWNoICR7SWRsZVNlY31zIFBhdXNlIC0gV2FybnVu +ZyBnZXNlbmRldCAobm9jaCAke1JlbWFpbmluZ31zKSIgLUZvcmVncm91bmRDb2xvciBZZWxsb3cK +ICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIFNlbmQtSnNvbiAkUmVzcG9uc2Ug +QHsgb2sgPSAkdHJ1ZTsgaWRsZSA9ICRJZGxlU2VjOyB3YXJuaW5nID0gJGZhbHNlOyByZW1haW5p +bmdTZWNvbmRzID0gJFJlbWFpbmluZyB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJFJlc3Bv +bnNlLkNsb3NlKCkKICAgICAgICAgICAgY29udGludWUKICAgICAgICB9CgogICAgICAgICMgLS0t +IEdFVCAvYXBpL2Vudmlyb24gLS0tCiAgICAgICAgaWYgKCRVcmxQYXRoIC1lcSAnL2FwaS9lbnZp +cm9uJyAtYW5kICRNZXRob2QgLWVxICdHRVQnKSB7CiAgICAgICAgICAgIFJlZnJlc2gtVXBkYXRl +Q2hlY2sKICAgICAgICAgICAgU2VuZC1Kc29uICRSZXNwb25zZSBAewogICAgICAgICAgICAgICAg +dXNlcm5hbWUgICAgICAgID0gJGVudjpVU0VSTkFNRQogICAgICAgICAgICAgICAgY29tcHV0ZXJu +YW1lICAgID0gJGVudjpDT01QVVRFUk5BTUUKICAgICAgICAgICAgICAgIHVzZXJkb21haW4gICAg +ICA9ICRlbnY6VVNFUkRPTUFJTgogICAgICAgICAgICAgICAgdXBkYXRlQXZhaWxhYmxlID0gJHNj +cmlwdDpVcGRhdGVBdmFpbGFibGUKICAgICAgICAgICAgICAgIHJlbW90ZVZlcnNpb24gICA9ICRz +Y3JpcHQ6UmVtb3RlVmVyc2lvbgogICAgICAgICAgICB9CiAgICAgICAgICAgICRSZXNwb25zZS5D +bG9zZSgpCiAgICAgICAgICAgIFdyaXRlLUhvc3QgIiAgQVBJICAvYXBpL2Vudmlyb24gIChVc2Vy +OiAkZW52OlVTRVJOQU1FKSIgLUZvcmVncm91bmRDb2xvciBDeWFuCiAgICAgICAgICAgIGNvbnRp +bnVlCiAgICAgICAgfQoKICAgICAgICAjIC0tLSBHRVQgL2FwaS9zY2FuIC0tLQogICAgICAgICMg +U2Nhbm50IGFsbGUgS2F0ZWdvcmllLVVudGVyb3JkbmVyIHVuZCBsaWVmZXJ0IERva3VtZW50LURh +dGVpZW4KICAgICAgICBpZiAoJFVybFBhdGggLWVxICcvYXBpL3NjYW4nIC1hbmQgJE1ldGhvZCAt +ZXEgJ0dFVCcpIHsKICAgICAgICAgICAgJERhdGFEaXIgPSBKb2luLVBhdGggJFJvb3QgImRhdGEi +CiAgICAgICAgICAgICRSZXN1bHQgPSBbU3lzdGVtLkNvbGxlY3Rpb25zLkFycmF5TGlzdF06Om5l +dygpCgogICAgICAgICAgICBpZiAoVGVzdC1QYXRoICREYXRhRGlyKSB7CiAgICAgICAgICAgICAg +ICBHZXQtQ2hpbGRJdGVtICREYXRhRGlyIC1EaXJlY3RvcnkgfCBGb3JFYWNoLU9iamVjdCB7CiAg +ICAgICAgICAgICAgICAgICAgJEthdE5hbWUgPSAkXy5OYW1lCiAgICAgICAgICAgICAgICAgICAg +R2V0LUNoaWxkSXRlbSAkXy5GdWxsTmFtZSAtRmlsdGVyICIqLmpzb24iIHwgRm9yRWFjaC1PYmpl +Y3QgewogICAgICAgICAgICAgICAgICAgICAgICBbdm9pZF0kUmVzdWx0LkFkZChAewogICAgICAg +ICAgICAgICAgICAgICAgICAgICAga2F0ZWdvcmllID0gJEthdE5hbWUKICAgICAgICAgICAgICAg +ICAgICAgICAgICAgIGZpbGVuYW1lICA9ICRfLk5hbWUKICAgICAgICAgICAgICAgICAgICAgICAg +ICAgIHBhdGggICAgICA9ICJkYXRhLyRLYXROYW1lLyQoJF8uTmFtZSkiCiAgICAgICAgICAgICAg +ICAgICAgICAgICAgICBzaXplICAgICAgPSAkXy5MZW5ndGgKICAgICAgICAgICAgICAgICAgICAg +ICAgICAgIG1vZGlmaWVkICA9ICRfLkxhc3RXcml0ZVRpbWVVdGMuVG9TdHJpbmcoIm8iKQogICAg +ICAgICAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAg +ICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgU2VuZC1Kc29uICRSZXNwb25zZSBAeyBm +aWxlcyA9IEAoJFJlc3VsdCkgfQogICAgICAgICAgICAkUmVzcG9uc2UuQ2xvc2UoKQogICAgICAg +ICAgICBXcml0ZS1Ib3N0ICIgIEFQSSAgL2FwaS9zY2FuICAoJCgkUmVzdWx0LkNvdW50KSBEb2t1 +bWVudGUpIiAtRm9yZWdyb3VuZENvbG9yIEN5YW4KICAgICAgICAgICAgY29udGludWUKICAgICAg +ICB9CgogICAgICAgICMgLS0tIEdFVCAvYXBpL2dvdmVybmFuY2UgLS0tCiAgICAgICAgaWYgKCRV +cmxQYXRoIC1lcSAnL2FwaS9nb3Zlcm5hbmNlJyAtYW5kICRNZXRob2QgLWVxICdHRVQnKSB7CiAg +ICAgICAgICAgICRHb3YgPSBHZXQtR292ZXJuYW5jZQogICAgICAgICAgICBpZiAoJEdvdikgewog +ICAgICAgICAgICAgICAgJElzU1UgPSBUZXN0LVN1cGVyVXNlciAkR292CiAgICAgICAgICAgICAg +ICBTZW5kLUpzb24gJFJlc3BvbnNlIEB7CiAgICAgICAgICAgICAgICAgICAgZ292ZXJuYW5jZSA9 +ICRHb3YKICAgICAgICAgICAgICAgICAgICBjdXJyZW50VXNlciA9ICRlbnY6VVNFUk5BTUUKICAg +ICAgICAgICAgICAgICAgICBjdXJyZW50RG9tYWluID0gJGVudjpVU0VSRE9NQUlOCiAgICAgICAg +ICAgICAgICAgICAgaXNTdXBlclVzZXIgPSAkSXNTVQogICAgICAgICAgICAgICAgfQogICAgICAg +ICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgU2VuZC1Kc29uICRSZXNwb25zZSBAewogICAg +ICAgICAgICAgICAgICAgIGdvdmVybmFuY2UgPSAkbnVsbAogICAgICAgICAgICAgICAgICAgIGN1 +cnJlbnRVc2VyID0gJGVudjpVU0VSTkFNRQogICAgICAgICAgICAgICAgICAgIGN1cnJlbnREb21h +aW4gPSAkZW52OlVTRVJET01BSU4KICAgICAgICAgICAgICAgICAgICBpc1N1cGVyVXNlciA9ICR0 +cnVlCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJFJlc3BvbnNl +LkNsb3NlKCkKICAgICAgICAgICAgV3JpdGUtSG9zdCAiICBBUEkgIC9hcGkvZ292ZXJuYW5jZSAg +KFVzZXI6ICRlbnY6VVNFUk5BTUUsIFNVOiAkKFRlc3QtU3VwZXJVc2VyIChHZXQtR292ZXJuYW5j +ZSkpKSIgLUZvcmVncm91bmRDb2xvciBDeWFuCiAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAg +fQoKICAgICAgICAjIC0tLSBQT1NUIC9hcGkvZ292ZXJuYW5jZSAtLS0KICAgICAgICAjIE51ciBT +dXBlclVzZXIgZGFyZiBnb3Zlcm5hbmNlLmpzb24gYWVuZGVybgogICAgICAgIGlmICgkVXJsUGF0 +aCAtZXEgJy9hcGkvZ292ZXJuYW5jZScgLWFuZCAkTWV0aG9kIC1lcSAnUE9TVCcpIHsKICAgICAg +ICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICRHb3YgPSBHZXQtR292ZXJuYW5jZQogICAgICAg +ICAgICAgICAgJElzU1UgPSBUZXN0LVN1cGVyVXNlciAkR292CiAgICAgICAgICAgICAgICBpZiAo +LW5vdCAkSXNTVSkgewogICAgICAgICAgICAgICAgICAgIFNlbmQtSnNvbiAkUmVzcG9uc2UgQHsg +ZXJyb3IgPSAiTnVyIFN1cGVyVXNlciBkYXJmIEdvdmVybmFuY2UtRGF0ZW4gYWVuZGVybiAoVXNl +cjogJGVudjpVU0VSTkFNRSkiIH0gNDAzCiAgICAgICAgICAgICAgICAgICAgV3JpdGUtSG9zdCAi +ICBFUlIgIFBPU1QgL2FwaS9nb3Zlcm5hbmNlICBBQkdFTEVITlQgKFVzZXI6ICRlbnY6VVNFUk5B +TUUpIiAtRm9yZWdyb3VuZENvbG9yIFJlZAogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAg +ICAgICAgICAgICAgICAkQm9keSA9IFJlYWQtQm9keSAkUmVxdWVzdAogICAgICAgICAgICAgICAg +ICAgIGlmICgtbm90ICRCb2R5IC1vciAkQm9keS5MZW5ndGggLWx0IDIpIHsKICAgICAgICAgICAg +ICAgICAgICAgICAgU2VuZC1Kc29uICRSZXNwb25zZSBAeyBlcnJvciA9ICJMZWVyZXIgUmVxdWVz +dC1Cb2R5IiB9IDQwMAogICAgICAgICAgICAgICAgICAgICAgICBXcml0ZS1Ib3N0ICIgIEVSUiAg +UE9TVCAvYXBpL2dvdmVybmFuY2UgIExlZXJlciBCb2R5IiAtRm9yZWdyb3VuZENvbG9yIFJlZAog +ICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICROZXdH +b3YgPSAkQm9keSB8IENvbnZlcnRGcm9tLUpzb24KICAgICAgICAgICAgICAgICAgICAgICAgU2F2 +ZS1Hb3Zlcm5hbmNlICROZXdHb3YKICAgICAgICAgICAgICAgICAgICAgICAgU2VuZC1Kc29uICRS +ZXNwb25zZSBAeyBvayA9ICR0cnVlIH0KICAgICAgICAgICAgICAgICAgICAgICAgV3JpdGUtSG9z +dCAiICBBUEkgIFBPU1QgL2FwaS9nb3Zlcm5hbmNlICBha3R1YWxpc2llcnQgdm9uICRlbnY6VVNF +Uk5BTUUgKCQoJEJvZHkuTGVuZ3RoKSBCeXRlcykiIC1Gb3JlZ3JvdW5kQ29sb3IgR3JlZW4KICAg +ICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gY2F0Y2gg +ewogICAgICAgICAgICAgICAgV3JpdGUtSG9zdCAiICBFUlIgIFBPU1QgL2FwaS9nb3Zlcm5hbmNl +ICBFWENFUFRJT046ICQoJF8uRXhjZXB0aW9uLk1lc3NhZ2UpIiAtRm9yZWdyb3VuZENvbG9yIFJl +ZAogICAgICAgICAgICAgICAgdHJ5IHsgU2VuZC1Kc29uICRSZXNwb25zZSBAeyBlcnJvciA9ICRf +LkV4Y2VwdGlvbi5NZXNzYWdlIH0gNTAwIH0gY2F0Y2gge30KICAgICAgICAgICAgfQogICAgICAg +ICAgICB0cnkgeyAkUmVzcG9uc2UuQ2xvc2UoKSB9IGNhdGNoIHt9CiAgICAgICAgICAgIGNvbnRp +bnVlCiAgICAgICAgfQoKICAgICAgICAjIC0tLSBQT1NUIC9hcGkvbG9jayAtLS0KICAgICAgICAj +IFNldHp0IGVpbmVuIExvY2sgYXVmIGVpbiBEb2t1bWVudCAoUGVzc2ltaXN0aWMgTG9ja2luZykK +ICAgICAgICAjIEJvZHk6IHsgImRvY0lkIjogIkQwMDEiIH0KICAgICAgICAjIExvY2stRGF0ZWll +bjogZGF0YS8ubG9ja3MvRDAwMS5sb2NrIChKU09OIG1pdCB1c2VybmFtZSArIHRpbWVzdGFtcCkK +ICAgICAgICAjIExvY2tzIHZlcmZhbGxlbiBhdXRvbWF0aXNjaCBuYWNoIDEwIE1pbnV0ZW4gKFN0 +YWxlLUxvY2stUHJvdGVjdGlvbikKICAgICAgICBpZiAoJFVybFBhdGggLWVxICcvYXBpL2xvY2sn +IC1hbmQgJE1ldGhvZCAtZXEgJ1BPU1QnKSB7CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAg +ICAgICAkQm9keSA9IFJlYWQtQm9keSAkUmVxdWVzdAogICAgICAgICAgICAgICAgJFBhcnNlZCA9 +ICRCb2R5IHwgQ29udmVydEZyb20tSnNvbgogICAgICAgICAgICAgICAgJERvY0lkID0gJFBhcnNl +ZC5kb2NJZAogICAgICAgICAgICAgICAgJExvY2tEaXIgPSBKb2luLVBhdGggJFJvb3QgImRhdGEv +LmxvY2tzIgogICAgICAgICAgICAgICAgaWYgKC1ub3QgKFRlc3QtUGF0aCAkTG9ja0RpcikpIHsg +TmV3LUl0ZW0gLUl0ZW1UeXBlIERpcmVjdG9yeSAtUGF0aCAkTG9ja0RpciAtRm9yY2UgfCBPdXQt +TnVsbCB9CiAgICAgICAgICAgICAgICAkTG9ja0ZpbGUgPSBKb2luLVBhdGggJExvY2tEaXIgIiRE +b2NJZC5sb2NrIgoKICAgICAgICAgICAgICAgICMgUHJ1ZWZlbiBvYiBiZXJlaXRzIGdlbG9ja3Qg +KHVuZCBMb2NrIG5pY2h0IGFiZ2VsYXVmZW4pCiAgICAgICAgICAgICAgICBpZiAoVGVzdC1QYXRo +ICRMb2NrRmlsZSkgewogICAgICAgICAgICAgICAgICAgICRFeGlzdGluZyA9IEdldC1Db250ZW50 +ICRMb2NrRmlsZSAtUmF3IC1FbmNvZGluZyBVVEY4IHwgQ29udmVydEZyb20tSnNvbgogICAgICAg +ICAgICAgICAgICAgICRMb2NrVGltZSA9IFtEYXRlVGltZV06OlBhcnNlKCRFeGlzdGluZy5sb2Nr +ZWRBdCkKICAgICAgICAgICAgICAgICAgICAkTWludXRlc1NpbmNlID0gKChHZXQtRGF0ZSkgLSAk +TG9ja1RpbWUpLlRvdGFsTWludXRlcwoKICAgICAgICAgICAgICAgICAgICBpZiAoJE1pbnV0ZXNT +aW5jZSAtbHQgMTAgLWFuZCAkRXhpc3RpbmcudXNlcm5hbWUgLW5lICRlbnY6VVNFUk5BTUUpIHsK +ICAgICAgICAgICAgICAgICAgICAgICAgIyBMb2NrIGlzdCBha3RpdiB1bmQgdm9uIGVpbmVtIGFu +ZGVyZW4gVXNlcgogICAgICAgICAgICAgICAgICAgICAgICBTZW5kLUpzb24gJFJlc3BvbnNlIEB7 +CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NrZWQgPSAkdHJ1ZQogICAgICAgICAgICAg +ICAgICAgICAgICAgICAgYnkgPSAkRXhpc3RpbmcudXNlcm5hbWUKICAgICAgICAgICAgICAgICAg +ICAgICAgICAgIHNpbmNlID0gJEV4aXN0aW5nLmxvY2tlZEF0CiAgICAgICAgICAgICAgICAgICAg +ICAgICAgICBtaW51dGVzID0gW01hdGhdOjpSb3VuZCgkTWludXRlc1NpbmNlLCAxKQogICAgICAg +ICAgICAgICAgICAgICAgICB9IDQwOQogICAgICAgICAgICAgICAgICAgICAgICAkUmVzcG9uc2Uu +Q2xvc2UoKQogICAgICAgICAgICAgICAgICAgICAgICBXcml0ZS1Ib3N0ICIgIEFQSSAgUE9TVCAv +YXBpL2xvY2sgICREb2NJZCBCRUxFR1Qgdm9uICQoJEV4aXN0aW5nLnVzZXJuYW1lKSIgLUZvcmVn +cm91bmRDb2xvciBZZWxsb3cKICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKICAgICAg +ICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIyBMb2NrIGFiZ2VsYXVmZW4gb2Rl +ciBlaWdlbmVyIExvY2sgLT4gdWViZXJzY2hyZWliZW4KICAgICAgICAgICAgICAgIH0KCiAgICAg +ICAgICAgICAgICAjIExvY2sgc2V0emVuCiAgICAgICAgICAgICAgICAkTG9ja0RhdGEgPSBAewog +ICAgICAgICAgICAgICAgICAgIGRvY0lkID0gJERvY0lkCiAgICAgICAgICAgICAgICAgICAgdXNl +cm5hbWUgPSAkZW52OlVTRVJOQU1FCiAgICAgICAgICAgICAgICAgICAgbG9ja2VkQXQgPSAoR2V0 +LURhdGUpLlRvU3RyaW5nKCJvIikKICAgICAgICAgICAgICAgIH0gfCBDb252ZXJ0VG8tSnNvbiAt +Q29tcHJlc3MKICAgICAgICAgICAgICAgIFVucHJvdGVjdC1GaWxlICRMb2NrRmlsZQogICAgICAg +ICAgICAgICAgW0lPLkZpbGVdOjpXcml0ZUFsbFRleHQoJExvY2tGaWxlLCAkTG9ja0RhdGEsIFtU +ZXh0LlVURjhFbmNvZGluZ106Om5ldygkZmFsc2UpKQogICAgICAgICAgICAgICAgU2VuZC1Kc29u +ICRSZXNwb25zZSBAeyBvayA9ICR0cnVlOyBkb2NJZCA9ICREb2NJZCB9CiAgICAgICAgICAgICAg +ICBXcml0ZS1Ib3N0ICIgIEFQSSAgUE9TVCAvYXBpL2xvY2sgICREb2NJZCBnZWxvY2t0IHZvbiAk +ZW52OlVTRVJOQU1FIiAtRm9yZWdyb3VuZENvbG9yIEN5YW4KICAgICAgICAgICAgfSBjYXRjaCB7 +CiAgICAgICAgICAgICAgICBXcml0ZS1Ib3N0ICIgIEVSUiAgUE9TVCAvYXBpL2xvY2sgICQoJF8u +RXhjZXB0aW9uLk1lc3NhZ2UpIiAtRm9yZWdyb3VuZENvbG9yIFJlZAogICAgICAgICAgICAgICAg +dHJ5IHsgU2VuZC1Kc29uICRSZXNwb25zZSBAeyBlcnJvciA9ICRfLkV4Y2VwdGlvbi5NZXNzYWdl +IH0gNTAwIH0gY2F0Y2gge30KICAgICAgICAgICAgfQogICAgICAgICAgICB0cnkgeyAkUmVzcG9u +c2UuQ2xvc2UoKSB9IGNhdGNoIHt9CiAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgfQoKICAg +ICAgICAjIC0tLSBQT1NUIC9hcGkvdW5sb2NrIC0tLQogICAgICAgICMgR2lidCBlaW5lbiBMb2Nr +IGZyZWkuIEJvZHk6IHsgImRvY0lkIjogIkQwMDEiIH0KICAgICAgICAjIE51ciBkZXIgTG9jay1J +bmhhYmVyIG9kZXIgU3VwZXJVc2VyIGthbm4gZnJlaWdlYmVuCiAgICAgICAgaWYgKCRVcmxQYXRo +IC1lcSAnL2FwaS91bmxvY2snIC1hbmQgJE1ldGhvZCAtZXEgJ1BPU1QnKSB7CiAgICAgICAgICAg +IHRyeSB7CiAgICAgICAgICAgICAgICAkQm9keSA9IFJlYWQtQm9keSAkUmVxdWVzdAogICAgICAg +ICAgICAgICAgJFBhcnNlZCA9ICRCb2R5IHwgQ29udmVydEZyb20tSnNvbgogICAgICAgICAgICAg +ICAgJERvY0lkID0gJFBhcnNlZC5kb2NJZAogICAgICAgICAgICAgICAgJExvY2tGaWxlID0gSm9p +bi1QYXRoICRSb290ICJkYXRhLy5sb2Nrcy8kRG9jSWQubG9jayIKCiAgICAgICAgICAgICAgICBp +ZiAoVGVzdC1QYXRoICRMb2NrRmlsZSkgewogICAgICAgICAgICAgICAgICAgICRFeGlzdGluZyA9 +IEdldC1Db250ZW50ICRMb2NrRmlsZSAtUmF3IC1FbmNvZGluZyBVVEY4IHwgQ29udmVydEZyb20t +SnNvbgogICAgICAgICAgICAgICAgICAgICRHb3YgPSBHZXQtR292ZXJuYW5jZQogICAgICAgICAg +ICAgICAgICAgICRJc1NVID0gVGVzdC1TdXBlclVzZXIgJEdvdgoKICAgICAgICAgICAgICAgICAg +ICBpZiAoJEV4aXN0aW5nLnVzZXJuYW1lIC1lcSAkZW52OlVTRVJOQU1FIC1vciAkSXNTVSkgewog +ICAgICAgICAgICAgICAgICAgICAgICBSZW1vdmUtSXRlbSAkTG9ja0ZpbGUgLUZvcmNlCiAgICAg +ICAgICAgICAgICAgICAgICAgIFNlbmQtSnNvbiAkUmVzcG9uc2UgQHsgb2sgPSAkdHJ1ZTsgZG9j +SWQgPSAkRG9jSWQgfQogICAgICAgICAgICAgICAgICAgICAgICBXcml0ZS1Ib3N0ICIgIEFQSSAg +UE9TVCAvYXBpL3VubG9jayAgJERvY0lkIGZyZWlnZWdlYmVuIiAtRm9yZWdyb3VuZENvbG9yIEdy +ZWVuCiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAg +U2VuZC1Kc29uICRSZXNwb25zZSBAeyBlcnJvciA9ICJMb2NrIGdlaG9lcnQgJCgkRXhpc3Rpbmcu +dXNlcm5hbWUpIiB9IDQwMwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0g +ZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgU2VuZC1Kc29uICRSZXNwb25zZSBAeyBvayA9ICR0 +cnVlOyBkb2NJZCA9ICREb2NJZCB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gY2F0 +Y2ggewogICAgICAgICAgICAgICAgV3JpdGUtSG9zdCAiICBFUlIgIFBPU1QgL2FwaS91bmxvY2sg +ICQoJF8uRXhjZXB0aW9uLk1lc3NhZ2UpIiAtRm9yZWdyb3VuZENvbG9yIFJlZAogICAgICAgICAg +ICAgICAgdHJ5IHsgU2VuZC1Kc29uICRSZXNwb25zZSBAeyBlcnJvciA9ICRfLkV4Y2VwdGlvbi5N +ZXNzYWdlIH0gNTAwIH0gY2F0Y2gge30KICAgICAgICAgICAgfQogICAgICAgICAgICB0cnkgeyAk +UmVzcG9uc2UuQ2xvc2UoKSB9IGNhdGNoIHt9CiAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAg +fQoKICAgICAgICAjIC0tLSBHRVQgL2FwaS9sb2NrcyAtLS0KICAgICAgICAjIExpc3RldCBhbGxl +IGFrdGl2ZW4gTG9ja3MgYXVmIChmdWVyIFVJLUFuemVpZ2UpCiAgICAgICAgaWYgKCRVcmxQYXRo +IC1lcSAnL2FwaS9sb2NrcycgLWFuZCAkTWV0aG9kIC1lcSAnR0VUJykgewogICAgICAgICAgICAk +TG9ja0RpciA9IEpvaW4tUGF0aCAkUm9vdCAiZGF0YS8ubG9ja3MiCiAgICAgICAgICAgICRMb2Nr +cyA9IFtTeXN0ZW0uQ29sbGVjdGlvbnMuQXJyYXlMaXN0XTo6bmV3KCkKICAgICAgICAgICAgaWYg +KFRlc3QtUGF0aCAkTG9ja0RpcikgewogICAgICAgICAgICAgICAgR2V0LUNoaWxkSXRlbSAkTG9j +a0RpciAtRmlsdGVyICIqLmxvY2siIHwgRm9yRWFjaC1PYmplY3QgewogICAgICAgICAgICAgICAg +ICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRMb2NrID0gR2V0LUNvbnRlbnQgJF8u +RnVsbE5hbWUgLVJhdyAtRW5jb2RpbmcgVVRGOCB8IENvbnZlcnRGcm9tLUpzb24KICAgICAgICAg +ICAgICAgICAgICAgICAgJExvY2tUaW1lID0gW0RhdGVUaW1lXTo6UGFyc2UoJExvY2subG9ja2Vk +QXQpCiAgICAgICAgICAgICAgICAgICAgICAgICRNaW51dGVzU2luY2UgPSAoKEdldC1EYXRlKSAt +ICRMb2NrVGltZSkuVG90YWxNaW51dGVzCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkTWlu +dXRlc1NpbmNlIC1sdCAxMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgW3ZvaWRdJExv +Y2tzLkFkZChAewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY0lkID0gJExvY2su +ZG9jSWQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VybmFtZSA9ICRMb2NrLnVz +ZXJuYW1lCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9ja2VkQXQgPSAkTG9jay5s +b2NrZWRBdAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbnV0ZXMgPSBbTWF0aF06 +OlJvdW5kKCRNaW51dGVzU2luY2UsIDEpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KQog +ICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAg +ICAgIyBBYmdlbGF1ZmVuZW4gTG9jayBhdWZyYWV1bWVuCiAgICAgICAgICAgICAgICAgICAgICAg +ICAgICBSZW1vdmUtSXRlbSAkXy5GdWxsTmFtZSAtRm9yY2UKICAgICAgICAgICAgICAgICAgICAg +ICAgfQogICAgICAgICAgICAgICAgICAgIH0gY2F0Y2gge30KICAgICAgICAgICAgICAgIH0KICAg +ICAgICAgICAgfQogICAgICAgICAgICBTZW5kLUpzb24gJFJlc3BvbnNlIEB7IGxvY2tzID0gQCgk +TG9ja3MpIH0KICAgICAgICAgICAgJFJlc3BvbnNlLkNsb3NlKCkKICAgICAgICAgICAgV3JpdGUt +SG9zdCAiICBBUEkgIC9hcGkvbG9ja3MgICgkKCRMb2Nrcy5Db3VudCkgYWt0aXZlIExvY2tzKSIg +LUZvcmVncm91bmRDb2xvciBDeWFuCiAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgfQoKICAg +ICAgICAjIC0tLSBQT1NUIC9hcGkvd3JpdGUgLS0tCiAgICAgICAgIyBCb2R5OiB7ICJwYXRoIjog +ImRhdGEvVmVya2Voci9EMDAxX3h4eC5qc29uIiwgImRhdGEiOiB7IC4uLiB9IH0KICAgICAgICBp +ZiAoJFVybFBhdGggLWVxICcvYXBpL3dyaXRlJyAtYW5kICRNZXRob2QgLWVxICdQT1NUJykgewog +ICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgJEJvZHkgPSBSZWFkLUJvZHkgJFJlcXVl +c3QKICAgICAgICAgICAgICAgICRQYXJzZWQgPSAkQm9keSB8IENvbnZlcnRGcm9tLUpzb24KICAg +ICAgICAgICAgICAgICRSZWxQYXRoID0gJFBhcnNlZC5wYXRoCiAgICAgICAgICAgICAgICAkU2Fm +ZVBhdGggPSBSZXNvbHZlLVNhZmVQYXRoICRSZWxQYXRoCgogICAgICAgICAgICAgICAgaWYgKC1u +b3QgJFNhZmVQYXRoKSB7CiAgICAgICAgICAgICAgICAgICAgU2VuZC1Kc29uICRSZXNwb25zZSBA +eyBlcnJvciA9ICJVbmd1ZWx0aWdlciBQZmFkIiB9IDQwMAogICAgICAgICAgICAgICAgfSBlbHNl +IHsKICAgICAgICAgICAgICAgICAgICAjIFNjaHJlaWJzY2h1dHo6IGdvdmVybmFuY2UuanNvbiBp +c3QgdWViZXIgL2FwaS93cml0ZSBuaWNodCBiZXNjaHJlaWJiYXIuCiAgICAgICAgICAgICAgICAg +ICAgaWYgKCRSZWxQYXRoIC1lcSAnZGF0YS9nb3Zlcm5hbmNlLmpzb24nKSB7CiAgICAgICAgICAg +ICAgICAgICAgICAgIFNlbmQtSnNvbiAkUmVzcG9uc2UgQHsgZXJyb3IgPSAiZ292ZXJuYW5jZS5q +c29uIGthbm4gbnVyIHVlYmVyIC9hcGkvZ292ZXJuYW5jZSBnZWFlbmRlcnQgd2VyZGVuIiB9IDQw +MwogICAgICAgICAgICAgICAgICAgICAgICAkUmVzcG9uc2UuQ2xvc2UoKQogICAgICAgICAgICAg +ICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAg +ICAgICAgIyBTY2hyZWlic2NodXR6OiBjb25maWcuanNvbiBudXIgZHVyY2ggU3VwZXJVc2VyIGFl +bmRlcmJhci4KICAgICAgICAgICAgICAgICAgICBpZiAoJFJlbFBhdGggLWVxICdkYXRhL2NvbmZp +Zy5qc29uJykgewogICAgICAgICAgICAgICAgICAgICAgICAkR292ID0gR2V0LUdvdmVybmFuY2UK +ICAgICAgICAgICAgICAgICAgICAgICAgaWYgKC1ub3QgKFRlc3QtU3VwZXJVc2VyICRHb3YpKSB7 +CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZW5kLUpzb24gJFJlc3BvbnNlIEB7IGVycm9y +ID0gImNvbmZpZy5qc29uIGthbm4gbnVyIHZvbiBTdXBlclVzZXJuIGdlYWVuZGVydCB3ZXJkZW4i +IH0gNDAzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBXcml0ZS1Ib3N0ICIgIEVSUiAgUE9T +VCAvYXBpL3dyaXRlICBjb25maWcuanNvbiBCZXJlY2h0aWd1bmcgdmVyd2VpZ2VydCAoJGVudjpV +U0VSTkFNRSkiIC1Gb3JlZ3JvdW5kQ29sb3IgUmVkCiAgICAgICAgICAgICAgICAgICAgICAgICAg +ICAkUmVzcG9uc2UuQ2xvc2UoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUK +ICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAg +ICAgICAgICAgICAgJERvY0RhdGEgPSAkUGFyc2VkLmRhdGEKCiAgICAgICAgICAgICAgICAgICAg +IyBVbnRlcnNjaGVpZHVuZzogSlNPTi1Eb2t1bWVudCAoUFNDdXN0b21PYmplY3QvSGFzaHRhYmxl +L0FycmF5KSB2cy4gUm9oZGF0ZW4gKFN0cmluZywgei5CLiBIVE1MKQogICAgICAgICAgICAgICAg +ICAgIGlmICgkRG9jRGF0YSAtaXMgW1BTQ3VzdG9tT2JqZWN0XSAtb3IgJERvY0RhdGEgLWlzIFtI +YXNodGFibGVdIC1vciAkRG9jRGF0YSAtaXMgW1N5c3RlbS5PYmplY3RbXV0pIHsKICAgICAgICAg +ICAgICAgICAgICAgICAgIyBTdGF0dXNhZW5kZXJ1bmcgYXVmICJGcmVpZ2VnZWJlbiIgb2RlciAi +QWJnZWxlaG50IiBlcmZvcmRlcnQgUmV2aWV3ZXItCiAgICAgICAgICAgICAgICAgICAgICAgICMg +b2RlciBTdXBlclVzZXItQmVyZWNodGlndW5nLiBEZXIgU2VydmVyIHBydWVmdCBkaWVzIHVuYWJo +YWVuZ2lnIHZvbSBDbGllbnQuCiAgICAgICAgICAgICAgICAgICAgICAgICROZXdTdGF0dXMgPSAk +bnVsbAogICAgICAgICAgICAgICAgICAgICAgICBpZiAoJERvY0RhdGEuc3RhdHVzKSB7ICROZXdT +dGF0dXMgPSAkRG9jRGF0YS5zdGF0dXMgfQoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRO +ZXdTdGF0dXMgLWVxICdGcmVpZ2VnZWJlbicgLW9yICROZXdTdGF0dXMgLWVxICdBYmdlbGVobnQn +KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkR292ID0gR2V0LUdvdmVybmFuY2UKICAg +ICAgICAgICAgICAgICAgICAgICAgICAgICREb2NLYXQgPSAkbnVsbAogICAgICAgICAgICAgICAg +ICAgICAgICAgICAgaWYgKCREb2NEYXRhLmthdGVnb3JpZSkgeyAkRG9jS2F0ID0gJERvY0RhdGEu +a2F0ZWdvcmllIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICRJc1NVID0gVGVzdC1TdXBl +clVzZXIgJEdvdgogICAgICAgICAgICAgICAgICAgICAgICAgICAgJElzUmV2ID0gVGVzdC1SZXZp +ZXdlciAkR292ICREb2NLYXQKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoLW5vdCAk +SXNTVSAtYW5kIC1ub3QgJElzUmV2KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg +U2VuZC1Kc29uICRSZXNwb25zZSBAeyBlcnJvciA9ICJLZWluZSBCZXJlY2h0aWd1bmcgZnVlciBT +dGF0dXMgJyROZXdTdGF0dXMnIGluIEthdGVnb3JpZSAnJERvY0thdCciIH0gNDAzCiAgICAgICAg +ICAgICAgICAgICAgICAgICAgICAgICAgV3JpdGUtSG9zdCAiICBFUlIgIFBPU1QgL2FwaS93cml0 +ZSAgU3RhdHVzLUJlcmVjaHRpZ3VuZyB2ZXJ3ZWlnZXJ0ICgkZW52OlVTRVJOQU1FIC0+ICROZXdT +dGF0dXMpIiAtRm9yZWdyb3VuZENvbG9yIFJlZAogICAgICAgICAgICAgICAgICAgICAgICAgICAg +ICAgICRSZXNwb25zZS5DbG9zZSgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29u +dGludWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAg +ICAgfQogICAgICAgICAgICAgICAgICAgICAgICAkV3JpdGVDb250ZW50ID0gJERvY0RhdGEgfCBD +b252ZXJ0VG8tSnNvbiAtRGVwdGggMjAKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAg +ICAgICAgICAgICAgICAgICAgICAjIFJvaGRhdGVuIChIVE1MLVN0cmluZ3MgZnVlciBTdGFydHNl +aXRlLCBIaWxmZS1JbmhhbHQsIGV0Yy4pCiAgICAgICAgICAgICAgICAgICAgICAgICRXcml0ZUNv +bnRlbnQgPSBbc3RyaW5nXSREb2NEYXRhCiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAg +ICAgICAgICAgICAjIE9yZG5lciBlcnN0ZWxsZW4gZmFsbHMgbm9ldGlnCiAgICAgICAgICAgICAg +ICAgICAgJERpciA9IFtJTy5QYXRoXTo6R2V0RGlyZWN0b3J5TmFtZSgkU2FmZVBhdGgpCiAgICAg +ICAgICAgICAgICAgICAgaWYgKC1ub3QgKFRlc3QtUGF0aCAkRGlyKSkgeyBOZXctSXRlbSAtSXRl +bVR5cGUgRGlyZWN0b3J5IC1QYXRoICREaXIgLUZvcmNlIHwgT3V0LU51bGwgfQoKICAgICAgICAg +ICAgICAgICAgICAjIFNjaHJlaWJzY2h1dHogYXVmaGViZW4sIEluaGFsdCBzY2hyZWliZW4sIFNj +aHJlaWJzY2h1dHogc2V0emVuCiAgICAgICAgICAgICAgICAgICAgVW5wcm90ZWN0LUZpbGUgJFNh +ZmVQYXRoCiAgICAgICAgICAgICAgICAgICAgW0lPLkZpbGVdOjpXcml0ZUFsbFRleHQoJFNhZmVQ +YXRoLCAkV3JpdGVDb250ZW50LCBbVGV4dC5VVEY4RW5jb2RpbmddOjpuZXcoJGZhbHNlKSkKICAg +ICAgICAgICAgICAgICAgICBQcm90ZWN0LUZpbGUgJFNhZmVQYXRoCgogICAgICAgICAgICAgICAg +ICAgICRGaWxlSW5mbyA9IEdldC1JdGVtICRTYWZlUGF0aAogICAgICAgICAgICAgICAgICAgIFNl +bmQtSnNvbiAkUmVzcG9uc2UgQHsKICAgICAgICAgICAgICAgICAgICAgICAgb2sgICAgICAgPSAk +dHJ1ZQogICAgICAgICAgICAgICAgICAgICAgICBwYXRoICAgICA9ICRSZWxQYXRoCiAgICAgICAg +ICAgICAgICAgICAgICAgIG1vZGlmaWVkID0gJEZpbGVJbmZvLkxhc3RXcml0ZVRpbWVVdGMuVG9T +dHJpbmcoIm8iKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBXcml0 +ZS1Ib3N0ICIgIEFQSSAgUE9TVCAvYXBpL3dyaXRlICAkUmVsUGF0aCIgLUZvcmVncm91bmRDb2xv +ciBHcmVlbgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGNhdGNoIHsKICAgICAgICAg +ICAgICAgIFdyaXRlLUhvc3QgIiAgRVJSICBQT1NUIC9hcGkvd3JpdGUgICQoJF8uRXhjZXB0aW9u +Lk1lc3NhZ2UpIiAtRm9yZWdyb3VuZENvbG9yIFJlZAogICAgICAgICAgICAgICAgIyBTY2hyZWli +c2NodXR6IHdpZWRlcmhlcnN0ZWxsZW4gZmFsbHMgYXVmZ2Vob2JlbgogICAgICAgICAgICAgICAg +aWYgKCRTYWZlUGF0aCkgeyB0cnkgeyBQcm90ZWN0LUZpbGUgJFNhZmVQYXRoIH0gY2F0Y2gge30g +fQogICAgICAgICAgICAgICAgdHJ5IHsgU2VuZC1Kc29uICRSZXNwb25zZSBAeyBlcnJvciA9ICRf +LkV4Y2VwdGlvbi5NZXNzYWdlIH0gNTAwIH0gY2F0Y2gge30KICAgICAgICAgICAgfQogICAgICAg +ICAgICB0cnkgeyAkUmVzcG9uc2UuQ2xvc2UoKSB9IGNhdGNoIHt9CiAgICAgICAgICAgIGNvbnRp +bnVlCiAgICAgICAgfQoKICAgICAgICAjIC0tLSBQT1NUIC9hcGkvZGVsZXRlIC0tLQogICAgICAg +ICMgQm9keTogeyAicGF0aCI6ICJkYXRhL1ZlcmtlaHIvRDAwMV94eHguanNvbiIgfQogICAgICAg +ICMgQXV0b3Jpc2llcnVuZzoKICAgICAgICAjICAgLSBBcnRpa2VsIChkYXRhL0thdC9EeHh4Lmpz +b24pIHVuZCBNZWRpYSAobWVkaWEvLi4uKTogSmVkZXIgYXV0aGVudGlmaXppZXJ0ZSBVc2VyCiAg +ICAgICAgIyAgICAgKFBhcGllcmtvcmItV29ya2Zsb3cgaW0gRnJvbnRlbmQgcHJ1ZWZ0IE5XLUtl +bm51bmcgKyBTb2Z0LURlbGV0ZSkKICAgICAgICAjICAgLSBTeXN0ZW1kYXRlaWVuIChjb25maWcu +anNvbiwgZ292ZXJuYW5jZS5qc29uLCAudHJhc2guanNvbiBldGMuKTogTnVyIFNVL0ZBCiAgICAg +ICAgaWYgKCRVcmxQYXRoIC1lcSAnL2FwaS9kZWxldGUnIC1hbmQgJE1ldGhvZCAtZXEgJ1BPU1Qn +KSB7CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAkQm9keSA9IFJlYWQtQm9keSAk +UmVxdWVzdAogICAgICAgICAgICAgICAgJFBhcnNlZCA9ICRCb2R5IHwgQ29udmVydEZyb20tSnNv +bgogICAgICAgICAgICAgICAgJFJlbFBhdGggPSAkUGFyc2VkLnBhdGgKCiAgICAgICAgICAgICAg +ICAjIFN5c3RlbWRhdGVpZW4gc2NodWV0emVuOiBOdXIgU3VwZXJVc2VyL0ZhY2hhdWZzaWNodAog +ICAgICAgICAgICAgICAgJElzU3lzdGVtRmlsZSA9ICgkUmVsUGF0aCAtZXEgJ2RhdGEvY29uZmln +Lmpzb24nIC1vcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkUmVsUGF0aCAtZXEg +J2RhdGEvZ292ZXJuYW5jZS5qc29uJyAtb3IKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg +ICAgJFJlbFBhdGggLW1hdGNoICdeZGF0YVsvXFxdXC4nKQogICAgICAgICAgICAgICAgaWYgKCRJ +c1N5c3RlbUZpbGUpIHsKICAgICAgICAgICAgICAgICAgICAkR292ID0gR2V0LUdvdmVybmFuY2UK +ICAgICAgICAgICAgICAgICAgICBpZiAoLW5vdCAoVGVzdC1TdXBlclVzZXIgJEdvdikgLWFuZCAt +bm90IChUZXN0LUZhY2hhdWZzaWNodCAkR292KSkgewogICAgICAgICAgICAgICAgICAgICAgICBT +ZW5kLUpzb24gJFJlc3BvbnNlIEB7IGVycm9yID0gIk51ciBTdXBlclVzZXIgdW5kIEZhY2hhdWZz +aWNodCBkdWVyZmVuIFN5c3RlbWRhdGVpZW4gbG9lc2NoZW4iIH0gNDAzCiAgICAgICAgICAgICAg +ICAgICAgICAgIFdyaXRlLUhvc3QgIiAgRVJSICBQT1NUIC9hcGkvZGVsZXRlICBTeXN0ZW1kYXRl +aS1CZXJlY2h0aWd1bmcgdmVyd2VpZ2VydCAoJGVudjpVU0VSTkFNRSAtPiAkUmVsUGF0aCkiIC1G +b3JlZ3JvdW5kQ29sb3IgUmVkCiAgICAgICAgICAgICAgICAgICAgICAgICRSZXNwb25zZS5DbG9z +ZSgpCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgICAgICAgICAg +fQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICRTYWZlUGF0aCA9IFJlc29sdmUt +U2FmZVBhdGggJFJlbFBhdGgKCiAgICAgICAgICAgICAgICBpZiAoLW5vdCAkU2FmZVBhdGgpIHsK +ICAgICAgICAgICAgICAgICAgICBTZW5kLUpzb24gJFJlc3BvbnNlIEB7IGVycm9yID0gIlVuZ3Vl +bHRpZ2VyIFBmYWQiIH0gNDAwCiAgICAgICAgICAgICAgICB9IGVsc2VpZiAoVGVzdC1QYXRoICRT +YWZlUGF0aCkgewogICAgICAgICAgICAgICAgICAgIFVucHJvdGVjdC1GaWxlICRTYWZlUGF0aAog +ICAgICAgICAgICAgICAgICAgIFJlbW92ZS1JdGVtICRTYWZlUGF0aCAtUmVjdXJzZSAtRm9yY2UK +ICAgICAgICAgICAgICAgICAgICBTZW5kLUpzb24gJFJlc3BvbnNlIEB7IG9rID0gJHRydWU7IHBh +dGggPSAkUmVsUGF0aCB9CiAgICAgICAgICAgICAgICAgICAgV3JpdGUtSG9zdCAiICBBUEkgIFBP +U1QgL2FwaS9kZWxldGUgICRSZWxQYXRoICh2b24gJGVudjpVU0VSTkFNRSkiIC1Gb3JlZ3JvdW5k +Q29sb3IgWWVsbG93CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAg +IFNlbmQtSnNvbiAkUmVzcG9uc2UgQHsgZXJyb3IgPSAiRGF0ZWkgbmljaHQgZ2VmdW5kZW4iIH0g +NDA0CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gY2F0Y2ggewogICAgICAgICAgICAg +ICAgV3JpdGUtSG9zdCAiICBFUlIgIFBPU1QgL2FwaS9kZWxldGUgICQoJF8uRXhjZXB0aW9uLk1l c3NhZ2UpIiAtRm9yZWdyb3VuZENvbG9yIFJlZAogICAgICAgICAgICAgICAgdHJ5IHsgU2VuZC1K c29uICRSZXNwb25zZSBAeyBlcnJvciA9ICRfLkV4Y2VwdGlvbi5NZXNzYWdlIH0gNTAwIH0gY2F0 Y2gge30KICAgICAgICAgICAgfQogICAgICAgICAgICB0cnkgeyAkUmVzcG9uc2UuQ2xvc2UoKSB9 IGNhdGNoIHt9CiAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgfQoKICAgICAgICAjIC0tLSBQ -T1NUIC9hcGkvbG9jayAtLS0KICAgICAgICAjIFNldHp0IGVpbmVuIExvY2sgYXVmIGVpbiBEb2t1 -bWVudCAoUGVzc2ltaXN0aWMgTG9ja2luZykKICAgICAgICAjIEJvZHk6IHsgImRvY0lkIjogIkQw -MDEiIH0KICAgICAgICAjIExvY2stRGF0ZWllbjogZGF0YS8ubG9ja3MvRDAwMS5sb2NrIChKU09O -IG1pdCB1c2VybmFtZSArIHRpbWVzdGFtcCkKICAgICAgICAjIExvY2tzIHZlcmZhbGxlbiBhdXRv -bWF0aXNjaCBuYWNoIDEwIE1pbnV0ZW4gKFN0YWxlLUxvY2stUHJvdGVjdGlvbikKICAgICAgICBp -ZiAoJFVybFBhdGggLWVxICcvYXBpL2xvY2snIC1hbmQgJE1ldGhvZCAtZXEgJ1BPU1QnKSB7CiAg -ICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAkQm9keSA9IFJlYWQtQm9keSAkUmVxdWVz -dAogICAgICAgICAgICAgICAgJFBhcnNlZCA9ICRCb2R5IHwgQ29udmVydEZyb20tSnNvbgogICAg -ICAgICAgICAgICAgJERvY0lkID0gJFBhcnNlZC5kb2NJZAogICAgICAgICAgICAgICAgJExvY2tE -aXIgPSBKb2luLVBhdGggJFJvb3QgImRhdGEvLmxvY2tzIgogICAgICAgICAgICAgICAgaWYgKC1u -b3QgKFRlc3QtUGF0aCAkTG9ja0RpcikpIHsgTmV3LUl0ZW0gLUl0ZW1UeXBlIERpcmVjdG9yeSAt -UGF0aCAkTG9ja0RpciAtRm9yY2UgfCBPdXQtTnVsbCB9CiAgICAgICAgICAgICAgICAkTG9ja0Zp -bGUgPSBKb2luLVBhdGggJExvY2tEaXIgIiREb2NJZC5sb2NrIgoKICAgICAgICAgICAgICAgICMg -UHJ1ZWZlbiBvYiBiZXJlaXRzIGdlbG9ja3QgKHVuZCBMb2NrIG5pY2h0IGFiZ2VsYXVmZW4pCiAg -ICAgICAgICAgICAgICBpZiAoVGVzdC1QYXRoICRMb2NrRmlsZSkgewogICAgICAgICAgICAgICAg -ICAgICRFeGlzdGluZyA9IEdldC1Db250ZW50ICRMb2NrRmlsZSAtUmF3IC1FbmNvZGluZyBVVEY4 -IHwgQ29udmVydEZyb20tSnNvbgogICAgICAgICAgICAgICAgICAgICRMb2NrVGltZSA9IFtEYXRl -VGltZV06OlBhcnNlKCRFeGlzdGluZy5sb2NrZWRBdCkKICAgICAgICAgICAgICAgICAgICAkTWlu -dXRlc1NpbmNlID0gKChHZXQtRGF0ZSkgLSAkTG9ja1RpbWUpLlRvdGFsTWludXRlcwoKICAgICAg -ICAgICAgICAgICAgICBpZiAoJE1pbnV0ZXNTaW5jZSAtbHQgMTAgLWFuZCAkRXhpc3RpbmcudXNl -cm5hbWUgLW5lICRlbnY6VVNFUk5BTUUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIyBMb2Nr -IGlzdCBha3RpdiB1bmQgdm9uIGVpbmVtIGFuZGVyZW4gVXNlcgogICAgICAgICAgICAgICAgICAg -ICAgICBTZW5kLUpzb24gJFJlc3BvbnNlIEB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBs -b2NrZWQgPSAkdHJ1ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnkgPSAkRXhpc3Rpbmcu -dXNlcm5hbWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpbmNlID0gJEV4aXN0aW5nLmxv -Y2tlZEF0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW51dGVzID0gW01hdGhdOjpSb3Vu -ZCgkTWludXRlc1NpbmNlLCAxKQogICAgICAgICAgICAgICAgICAgICAgICB9IDQwOQogICAgICAg -ICAgICAgICAgICAgICAgICAkUmVzcG9uc2UuQ2xvc2UoKQogICAgICAgICAgICAgICAgICAgICAg -ICBXcml0ZS1Ib3N0ICIgIEFQSSAgUE9TVCAvYXBpL2xvY2sgICREb2NJZCBCRUxFR1Qgdm9uICQo -JEV4aXN0aW5nLnVzZXJuYW1lKSIgLUZvcmVncm91bmRDb2xvciBZZWxsb3cKICAgICAgICAgICAg -ICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAg -ICAgICAgIyBMb2NrIGFiZ2VsYXVmZW4gb2RlciBlaWdlbmVyIExvY2sgLT4gdWViZXJzY2hyZWli -ZW4KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIExvY2sgc2V0emVuCiAgICAg -ICAgICAgICAgICAkTG9ja0RhdGEgPSBAewogICAgICAgICAgICAgICAgICAgIGRvY0lkID0gJERv -Y0lkCiAgICAgICAgICAgICAgICAgICAgdXNlcm5hbWUgPSAkZW52OlVTRVJOQU1FCiAgICAgICAg -ICAgICAgICAgICAgbG9ja2VkQXQgPSAoR2V0LURhdGUpLlRvU3RyaW5nKCJvIikKICAgICAgICAg -ICAgICAgIH0gfCBDb252ZXJ0VG8tSnNvbiAtQ29tcHJlc3MKICAgICAgICAgICAgICAgIFVucHJv -dGVjdC1GaWxlICRMb2NrRmlsZQogICAgICAgICAgICAgICAgW0lPLkZpbGVdOjpXcml0ZUFsbFRl -eHQoJExvY2tGaWxlLCAkTG9ja0RhdGEsIFtUZXh0LlVURjhFbmNvZGluZ106Om5ldygkZmFsc2Up -KQogICAgICAgICAgICAgICAgU2VuZC1Kc29uICRSZXNwb25zZSBAeyBvayA9ICR0cnVlOyBkb2NJ -ZCA9ICREb2NJZCB9CiAgICAgICAgICAgICAgICBXcml0ZS1Ib3N0ICIgIEFQSSAgUE9TVCAvYXBp -L2xvY2sgICREb2NJZCBnZWxvY2t0IHZvbiAkZW52OlVTRVJOQU1FIiAtRm9yZWdyb3VuZENvbG9y -IEN5YW4KICAgICAgICAgICAgfSBjYXRjaCB7CiAgICAgICAgICAgICAgICBXcml0ZS1Ib3N0ICIg -IEVSUiAgUE9TVCAvYXBpL2xvY2sgICQoJF8uRXhjZXB0aW9uLk1lc3NhZ2UpIiAtRm9yZWdyb3Vu -ZENvbG9yIFJlZAogICAgICAgICAgICAgICAgdHJ5IHsgU2VuZC1Kc29uICRSZXNwb25zZSBAeyBl -cnJvciA9ICRfLkV4Y2VwdGlvbi5NZXNzYWdlIH0gNTAwIH0gY2F0Y2gge30KICAgICAgICAgICAg -fQogICAgICAgICAgICB0cnkgeyAkUmVzcG9uc2UuQ2xvc2UoKSB9IGNhdGNoIHt9CiAgICAgICAg -ICAgIGNvbnRpbnVlCiAgICAgICAgfQoKICAgICAgICAjIC0tLSBQT1NUIC9hcGkvdW5sb2NrIC0t -LQogICAgICAgICMgR2lidCBlaW5lbiBMb2NrIGZyZWkuIEJvZHk6IHsgImRvY0lkIjogIkQwMDEi -IH0KICAgICAgICAjIE51ciBkZXIgTG9jay1JbmhhYmVyIG9kZXIgU3VwZXJVc2VyIGthbm4gZnJl -aWdlYmVuCiAgICAgICAgaWYgKCRVcmxQYXRoIC1lcSAnL2FwaS91bmxvY2snIC1hbmQgJE1ldGhv -ZCAtZXEgJ1BPU1QnKSB7CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAkQm9keSA9 -IFJlYWQtQm9keSAkUmVxdWVzdAogICAgICAgICAgICAgICAgJFBhcnNlZCA9ICRCb2R5IHwgQ29u -dmVydEZyb20tSnNvbgogICAgICAgICAgICAgICAgJERvY0lkID0gJFBhcnNlZC5kb2NJZAogICAg -ICAgICAgICAgICAgJExvY2tGaWxlID0gSm9pbi1QYXRoICRSb290ICJkYXRhLy5sb2Nrcy8kRG9j -SWQubG9jayIKCiAgICAgICAgICAgICAgICBpZiAoVGVzdC1QYXRoICRMb2NrRmlsZSkgewogICAg -ICAgICAgICAgICAgICAgICRFeGlzdGluZyA9IEdldC1Db250ZW50ICRMb2NrRmlsZSAtUmF3IC1F -bmNvZGluZyBVVEY4IHwgQ29udmVydEZyb20tSnNvbgogICAgICAgICAgICAgICAgICAgICRHb3Yg -PSBHZXQtR292ZXJuYW5jZQogICAgICAgICAgICAgICAgICAgICRJc1NVID0gVGVzdC1TdXBlclVz -ZXIgJEdvdgoKICAgICAgICAgICAgICAgICAgICBpZiAoJEV4aXN0aW5nLnVzZXJuYW1lIC1lcSAk -ZW52OlVTRVJOQU1FIC1vciAkSXNTVSkgewogICAgICAgICAgICAgICAgICAgICAgICBSZW1vdmUt -SXRlbSAkTG9ja0ZpbGUgLUZvcmNlCiAgICAgICAgICAgICAgICAgICAgICAgIFNlbmQtSnNvbiAk -UmVzcG9uc2UgQHsgb2sgPSAkdHJ1ZTsgZG9jSWQgPSAkRG9jSWQgfQogICAgICAgICAgICAgICAg -ICAgICAgICBXcml0ZS1Ib3N0ICIgIEFQSSAgUE9TVCAvYXBpL3VubG9jayAgJERvY0lkIGZyZWln -ZWdlYmVuIiAtRm9yZWdyb3VuZENvbG9yIEdyZWVuCiAgICAgICAgICAgICAgICAgICAgfSBlbHNl -IHsKICAgICAgICAgICAgICAgICAgICAgICAgU2VuZC1Kc29uICRSZXNwb25zZSBAeyBlcnJvciA9 -ICJMb2NrIGdlaG9lcnQgJCgkRXhpc3RpbmcudXNlcm5hbWUpIiB9IDQwMwogICAgICAgICAgICAg -ICAgICAgIH0KICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgU2Vu -ZC1Kc29uICRSZXNwb25zZSBAeyBvayA9ICR0cnVlOyBkb2NJZCA9ICREb2NJZCB9CiAgICAgICAg -ICAgICAgICB9CiAgICAgICAgICAgIH0gY2F0Y2ggewogICAgICAgICAgICAgICAgV3JpdGUtSG9z -dCAiICBFUlIgIFBPU1QgL2FwaS91bmxvY2sgICQoJF8uRXhjZXB0aW9uLk1lc3NhZ2UpIiAtRm9y -ZWdyb3VuZENvbG9yIFJlZAogICAgICAgICAgICAgICAgdHJ5IHsgU2VuZC1Kc29uICRSZXNwb25z -ZSBAeyBlcnJvciA9ICRfLkV4Y2VwdGlvbi5NZXNzYWdlIH0gNTAwIH0gY2F0Y2gge30KICAgICAg -ICAgICAgfQogICAgICAgICAgICB0cnkgeyAkUmVzcG9uc2UuQ2xvc2UoKSB9IGNhdGNoIHt9CiAg -ICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgfQoKICAgICAgICAjIC0tLSBHRVQgL2FwaS9sb2Nr -cyAtLS0KICAgICAgICAjIExpc3RldCBhbGxlIGFrdGl2ZW4gTG9ja3MgYXVmIChmdWVyIFVJLUFu -emVpZ2UpCiAgICAgICAgaWYgKCRVcmxQYXRoIC1lcSAnL2FwaS9sb2NrcycgLWFuZCAkTWV0aG9k -IC1lcSAnR0VUJykgewogICAgICAgICAgICAkTG9ja0RpciA9IEpvaW4tUGF0aCAkUm9vdCAiZGF0 -YS8ubG9ja3MiCiAgICAgICAgICAgICRMb2NrcyA9IFtTeXN0ZW0uQ29sbGVjdGlvbnMuQXJyYXlM -aXN0XTo6bmV3KCkKICAgICAgICAgICAgaWYgKFRlc3QtUGF0aCAkTG9ja0RpcikgewogICAgICAg -ICAgICAgICAgR2V0LUNoaWxkSXRlbSAkTG9ja0RpciAtRmlsdGVyICIqLmxvY2siIHwgRm9yRWFj -aC1PYmplY3QgewogICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAg -ICAgICRMb2NrID0gR2V0LUNvbnRlbnQgJF8uRnVsbE5hbWUgLVJhdyAtRW5jb2RpbmcgVVRGOCB8 -IENvbnZlcnRGcm9tLUpzb24KICAgICAgICAgICAgICAgICAgICAgICAgJExvY2tUaW1lID0gW0Rh -dGVUaW1lXTo6UGFyc2UoJExvY2subG9ja2VkQXQpCiAgICAgICAgICAgICAgICAgICAgICAgICRN -aW51dGVzU2luY2UgPSAoKEdldC1EYXRlKSAtICRMb2NrVGltZSkuVG90YWxNaW51dGVzCiAgICAg -ICAgICAgICAgICAgICAgICAgIGlmICgkTWludXRlc1NpbmNlIC1sdCAxMCkgewogICAgICAgICAg -ICAgICAgICAgICAgICAgICAgW3ZvaWRdJExvY2tzLkFkZChAewogICAgICAgICAgICAgICAgICAg -ICAgICAgICAgICAgIGRvY0lkID0gJExvY2suZG9jSWQKICAgICAgICAgICAgICAgICAgICAgICAg -ICAgICAgICB1c2VybmFtZSA9ICRMb2NrLnVzZXJuYW1lCiAgICAgICAgICAgICAgICAgICAgICAg -ICAgICAgICAgbG9ja2VkQXQgPSAkTG9jay5sb2NrZWRBdAogICAgICAgICAgICAgICAgICAgICAg -ICAgICAgICAgIG1pbnV0ZXMgPSBbTWF0aF06OlJvdW5kKCRNaW51dGVzU2luY2UsIDEpCiAgICAg -ICAgICAgICAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Ug -ewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBBYmdlbGF1ZmVuZW4gTG9jayBhdWZyYWV1 -bWVuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZW1vdmUtSXRlbSAkXy5GdWxsTmFtZSAt -Rm9yY2UKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0gY2F0 -Y2gge30KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBTZW5kLUpz -b24gJFJlc3BvbnNlIEB7IGxvY2tzID0gQCgkTG9ja3MpIH0KICAgICAgICAgICAgJFJlc3BvbnNl -LkNsb3NlKCkKICAgICAgICAgICAgV3JpdGUtSG9zdCAiICBBUEkgIC9hcGkvbG9ja3MgICgkKCRM -b2Nrcy5Db3VudCkgYWt0aXZlIExvY2tzKSIgLUZvcmVncm91bmRDb2xvciBDeWFuCiAgICAgICAg -ICAgIGNvbnRpbnVlCiAgICAgICAgfQoKICAgICAgICAjIC0tLSBQT1NUIC9hcGkvd3JpdGUgLS0t -CiAgICAgICAgIyBCb2R5OiB7ICJwYXRoIjogImRhdGEvVmVya2Voci9EMDAxX3h4eC5qc29uIiwg -ImRhdGEiOiB7IC4uLiB9IH0KICAgICAgICBpZiAoJFVybFBhdGggLWVxICcvYXBpL3dyaXRlJyAt -YW5kICRNZXRob2QgLWVxICdQT1NUJykgewogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAg -ICAgJEJvZHkgPSBSZWFkLUJvZHkgJFJlcXVlc3QKICAgICAgICAgICAgICAgICRQYXJzZWQgPSAk -Qm9keSB8IENvbnZlcnRGcm9tLUpzb24KICAgICAgICAgICAgICAgICRSZWxQYXRoID0gJFBhcnNl -ZC5wYXRoCiAgICAgICAgICAgICAgICAkU2FmZVBhdGggPSBSZXNvbHZlLVNhZmVQYXRoICRSZWxQ -YXRoCgogICAgICAgICAgICAgICAgaWYgKC1ub3QgJFNhZmVQYXRoKSB7CiAgICAgICAgICAgICAg -ICAgICAgU2VuZC1Kc29uICRSZXNwb25zZSBAeyBlcnJvciA9ICJVbmd1ZWx0aWdlciBQZmFkIiB9 -IDQwMAogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAjIFNjaHJl -aWJzY2h1dHo6IGdvdmVybmFuY2UuanNvbiBpc3QgdWViZXIgL2FwaS93cml0ZSBuaWNodCBiZXNj -aHJlaWJiYXIuCiAgICAgICAgICAgICAgICAgICAgaWYgKCRSZWxQYXRoIC1lcSAnZGF0YS9nb3Zl -cm5hbmNlLmpzb24nKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIFNlbmQtSnNvbiAkUmVzcG9u -c2UgQHsgZXJyb3IgPSAiZ292ZXJuYW5jZS5qc29uIGthbm4gbnVyIHVlYmVyIC9hcGkvZ292ZXJu -YW5jZSBnZWFlbmRlcnQgd2VyZGVuIiB9IDQwMwogICAgICAgICAgICAgICAgICAgICAgICAkUmVz -cG9uc2UuQ2xvc2UoKQogICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAg -ICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgIyBTY2hyZWlic2NodXR6OiBjb25maWcu -anNvbiBudXIgZHVyY2ggU3VwZXJVc2VyIGFlbmRlcmJhci4KICAgICAgICAgICAgICAgICAgICBp -ZiAoJFJlbFBhdGggLWVxICdkYXRhL2NvbmZpZy5qc29uJykgewogICAgICAgICAgICAgICAgICAg -ICAgICAkR292ID0gR2V0LUdvdmVybmFuY2UKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKC1u -b3QgKFRlc3QtU3VwZXJVc2VyICRHb3YpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBT -ZW5kLUpzb24gJFJlc3BvbnNlIEB7IGVycm9yID0gImNvbmZpZy5qc29uIGthbm4gbnVyIHZvbiBT -dXBlclVzZXJuIGdlYWVuZGVydCB3ZXJkZW4iIH0gNDAzCiAgICAgICAgICAgICAgICAgICAgICAg -ICAgICBXcml0ZS1Ib3N0ICIgIEVSUiAgUE9TVCAvYXBpL3dyaXRlICBjb25maWcuanNvbiBCZXJl -Y2h0aWd1bmcgdmVyd2VpZ2VydCAoJGVudjpVU0VSTkFNRSkiIC1Gb3JlZ3JvdW5kQ29sb3IgUmVk -CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkUmVzcG9uc2UuQ2xvc2UoKQogICAgICAgICAg -ICAgICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAg -ICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgJERvY0RhdGEgPSAkUGFyc2Vk -LmRhdGEKCiAgICAgICAgICAgICAgICAgICAgIyBVbnRlcnNjaGVpZHVuZzogSlNPTi1Eb2t1bWVu -dCAoUFNDdXN0b21PYmplY3QvSGFzaHRhYmxlL0FycmF5KSB2cy4gUm9oZGF0ZW4gKFN0cmluZywg -ei5CLiBIVE1MKQogICAgICAgICAgICAgICAgICAgIGlmICgkRG9jRGF0YSAtaXMgW1BTQ3VzdG9t -T2JqZWN0XSAtb3IgJERvY0RhdGEgLWlzIFtIYXNodGFibGVdIC1vciAkRG9jRGF0YSAtaXMgW1N5 -c3RlbS5PYmplY3RbXV0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgIyBTdGF0dXNhZW5kZXJ1 -bmcgYXVmICJGcmVpZ2VnZWJlbiIgb2RlciAiQWJnZWxlaG50IiBlcmZvcmRlcnQgUmV2aWV3ZXIt -CiAgICAgICAgICAgICAgICAgICAgICAgICMgb2RlciBTdXBlclVzZXItQmVyZWNodGlndW5nLiBE -ZXIgU2VydmVyIHBydWVmdCBkaWVzIHVuYWJoYWVuZ2lnIHZvbSBDbGllbnQuCiAgICAgICAgICAg -ICAgICAgICAgICAgICROZXdTdGF0dXMgPSAkbnVsbAogICAgICAgICAgICAgICAgICAgICAgICBp -ZiAoJERvY0RhdGEuc3RhdHVzKSB7ICROZXdTdGF0dXMgPSAkRG9jRGF0YS5zdGF0dXMgfQoKICAg -ICAgICAgICAgICAgICAgICAgICAgaWYgKCROZXdTdGF0dXMgLWVxICdGcmVpZ2VnZWJlbicgLW9y -ICROZXdTdGF0dXMgLWVxICdBYmdlbGVobnQnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAg -ICAkR292ID0gR2V0LUdvdmVybmFuY2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICREb2NL -YXQgPSAkbnVsbAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCREb2NEYXRhLmthdGVn -b3JpZSkgeyAkRG9jS2F0ID0gJERvY0RhdGEua2F0ZWdvcmllIH0KICAgICAgICAgICAgICAgICAg -ICAgICAgICAgICRJc1NVID0gVGVzdC1TdXBlclVzZXIgJEdvdgogICAgICAgICAgICAgICAgICAg -ICAgICAgICAgJElzUmV2ID0gVGVzdC1SZXZpZXdlciAkR292ICREb2NLYXQKCiAgICAgICAgICAg -ICAgICAgICAgICAgICAgICBpZiAoLW5vdCAkSXNTVSAtYW5kIC1ub3QgJElzUmV2KSB7CiAgICAg -ICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VuZC1Kc29uICRSZXNwb25zZSBAeyBlcnJvciA9 -ICJLZWluZSBCZXJlY2h0aWd1bmcgZnVlciBTdGF0dXMgJyROZXdTdGF0dXMnIGluIEthdGVnb3Jp -ZSAnJERvY0thdCciIH0gNDAzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV3JpdGUt -SG9zdCAiICBFUlIgIFBPU1QgL2FwaS93cml0ZSAgU3RhdHVzLUJlcmVjaHRpZ3VuZyB2ZXJ3ZWln -ZXJ0ICgkZW52OlVTRVJOQU1FIC0+ICROZXdTdGF0dXMpIiAtRm9yZWdyb3VuZENvbG9yIFJlZAog -ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRSZXNwb25zZS5DbG9zZSgpCiAgICAgICAg -ICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgICAgICAgICAgICAg -ICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAk -V3JpdGVDb250ZW50ID0gJERvY0RhdGEgfCBDb252ZXJ0VG8tSnNvbiAtRGVwdGggMjAKICAgICAg -ICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAjIFJvaGRhdGVu -IChIVE1MLVN0cmluZ3MgZnVlciBTdGFydHNlaXRlLCBIaWxmZS1JbmhhbHQsIGV0Yy4pCiAgICAg -ICAgICAgICAgICAgICAgICAgICRXcml0ZUNvbnRlbnQgPSBbc3RyaW5nXSREb2NEYXRhCiAgICAg -ICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAjIE9yZG5lciBlcnN0ZWxsZW4g -ZmFsbHMgbm9ldGlnCiAgICAgICAgICAgICAgICAgICAgJERpciA9IFtJTy5QYXRoXTo6R2V0RGly -ZWN0b3J5TmFtZSgkU2FmZVBhdGgpCiAgICAgICAgICAgICAgICAgICAgaWYgKC1ub3QgKFRlc3Qt -UGF0aCAkRGlyKSkgeyBOZXctSXRlbSAtSXRlbVR5cGUgRGlyZWN0b3J5IC1QYXRoICREaXIgLUZv -cmNlIHwgT3V0LU51bGwgfQoKICAgICAgICAgICAgICAgICAgICAjIFNjaHJlaWJzY2h1dHogYXVm -aGViZW4sIEluaGFsdCBzY2hyZWliZW4sIFNjaHJlaWJzY2h1dHogc2V0emVuCiAgICAgICAgICAg -ICAgICAgICAgVW5wcm90ZWN0LUZpbGUgJFNhZmVQYXRoCiAgICAgICAgICAgICAgICAgICAgW0lP -LkZpbGVdOjpXcml0ZUFsbFRleHQoJFNhZmVQYXRoLCAkV3JpdGVDb250ZW50LCBbVGV4dC5VVEY4 -RW5jb2RpbmddOjpuZXcoJGZhbHNlKSkKICAgICAgICAgICAgICAgICAgICBQcm90ZWN0LUZpbGUg -JFNhZmVQYXRoCgogICAgICAgICAgICAgICAgICAgICRGaWxlSW5mbyA9IEdldC1JdGVtICRTYWZl -UGF0aAogICAgICAgICAgICAgICAgICAgIFNlbmQtSnNvbiAkUmVzcG9uc2UgQHsKICAgICAgICAg -ICAgICAgICAgICAgICAgb2sgICAgICAgPSAkdHJ1ZQogICAgICAgICAgICAgICAgICAgICAgICBw -YXRoICAgICA9ICRSZWxQYXRoCiAgICAgICAgICAgICAgICAgICAgICAgIG1vZGlmaWVkID0gJEZp -bGVJbmZvLkxhc3RXcml0ZVRpbWVVdGMuVG9TdHJpbmcoIm8iKQogICAgICAgICAgICAgICAgICAg -IH0KICAgICAgICAgICAgICAgICAgICBXcml0ZS1Ib3N0ICIgIEFQSSAgUE9TVCAvYXBpL3dyaXRl -ICAkUmVsUGF0aCIgLUZvcmVncm91bmRDb2xvciBHcmVlbgogICAgICAgICAgICAgICAgfQogICAg -ICAgICAgICB9IGNhdGNoIHsKICAgICAgICAgICAgICAgIFdyaXRlLUhvc3QgIiAgRVJSICBQT1NU -IC9hcGkvd3JpdGUgICQoJF8uRXhjZXB0aW9uLk1lc3NhZ2UpIiAtRm9yZWdyb3VuZENvbG9yIFJl -ZAogICAgICAgICAgICAgICAgIyBTY2hyZWlic2NodXR6IHdpZWRlcmhlcnN0ZWxsZW4gZmFsbHMg -YXVmZ2Vob2JlbgogICAgICAgICAgICAgICAgaWYgKCRTYWZlUGF0aCkgeyB0cnkgeyBQcm90ZWN0 -LUZpbGUgJFNhZmVQYXRoIH0gY2F0Y2gge30gfQogICAgICAgICAgICAgICAgdHJ5IHsgU2VuZC1K -c29uICRSZXNwb25zZSBAeyBlcnJvciA9ICRfLkV4Y2VwdGlvbi5NZXNzYWdlIH0gNTAwIH0gY2F0 -Y2gge30KICAgICAgICAgICAgfQogICAgICAgICAgICB0cnkgeyAkUmVzcG9uc2UuQ2xvc2UoKSB9 -IGNhdGNoIHt9CiAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgfQoKICAgICAgICAjIC0tLSBQ -T1NUIC9hcGkvZGVsZXRlIC0tLQogICAgICAgICMgQm9keTogeyAicGF0aCI6ICJkYXRhL1Zlcmtl -aHIvRDAwMV94eHguanNvbiIgfQogICAgICAgICMgQXV0b3Jpc2llcnVuZzoKICAgICAgICAjICAg -LSBBcnRpa2VsIChkYXRhL0thdC9EeHh4Lmpzb24pIHVuZCBNZWRpYSAobWVkaWEvLi4uKTogSmVk -ZXIgYXV0aGVudGlmaXppZXJ0ZSBVc2VyCiAgICAgICAgIyAgICAgKFBhcGllcmtvcmItV29ya2Zs -b3cgaW0gRnJvbnRlbmQgcHJ1ZWZ0IE5XLUtlbm51bmcgKyBTb2Z0LURlbGV0ZSkKICAgICAgICAj -ICAgLSBTeXN0ZW1kYXRlaWVuIChjb25maWcuanNvbiwgZ292ZXJuYW5jZS5qc29uLCAudHJhc2gu -anNvbiBldGMuKTogTnVyIFNVL0ZBCiAgICAgICAgaWYgKCRVcmxQYXRoIC1lcSAnL2FwaS9kZWxl -dGUnIC1hbmQgJE1ldGhvZCAtZXEgJ1BPU1QnKSB7CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAg -ICAgICAgICAkQm9keSA9IFJlYWQtQm9keSAkUmVxdWVzdAogICAgICAgICAgICAgICAgJFBhcnNl -ZCA9ICRCb2R5IHwgQ29udmVydEZyb20tSnNvbgogICAgICAgICAgICAgICAgJFJlbFBhdGggPSAk -UGFyc2VkLnBhdGgKCiAgICAgICAgICAgICAgICAjIFN5c3RlbWRhdGVpZW4gc2NodWV0emVuOiBO -dXIgU3VwZXJVc2VyL0ZhY2hhdWZzaWNodAogICAgICAgICAgICAgICAgJElzU3lzdGVtRmlsZSA9 -ICgkUmVsUGF0aCAtZXEgJ2RhdGEvY29uZmlnLmpzb24nIC1vcgogICAgICAgICAgICAgICAgICAg -ICAgICAgICAgICAgICAkUmVsUGF0aCAtZXEgJ2RhdGEvZ292ZXJuYW5jZS5qc29uJyAtb3IKICAg -ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJFJlbFBhdGggLW1hdGNoICdeZGF0YVsvXFxd -XC4nKQogICAgICAgICAgICAgICAgaWYgKCRJc1N5c3RlbUZpbGUpIHsKICAgICAgICAgICAgICAg -ICAgICAkR292ID0gR2V0LUdvdmVybmFuY2UKICAgICAgICAgICAgICAgICAgICBpZiAoLW5vdCAo -VGVzdC1TdXBlclVzZXIgJEdvdikgLWFuZCAtbm90IChUZXN0LUZhY2hhdWZzaWNodCAkR292KSkg +T1NUIC9hcGkvZmV0Y2gtaW1hZ2U/dXJsPWh0dHBzOi8vLi4uIC0tLQogICAgICAgICMgUHJveHk6 +IEV4dGVybmVzIEJpbGQgaGVydW50ZXJsYWRlbiAoZnVlciBQYXN0ZSBhdXMgV1dXLCB1bWdlaHQg +Q09SUykKICAgICAgICBpZiAoJFVybFBhdGggLWVxICcvYXBpL2ZldGNoLWltYWdlJyAtYW5kICRN +ZXRob2QgLWVxICdQT1NUJykgewogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgJEJv +ZHkgPSBSZWFkLUJvZHkgJFJlcXVlc3QKICAgICAgICAgICAgICAgICRQYXJzZWQgPSAkQm9keSB8 +IENvbnZlcnRGcm9tLUpzb24KICAgICAgICAgICAgICAgICRJbWdVcmwgPSAkUGFyc2VkLnVybAoK +ICAgICAgICAgICAgICAgICMgTnVyIGh0dHAvaHR0cHMgVVJMcyBlcmxhdWJlbgogICAgICAgICAg +ICAgICAgaWYgKCRJbWdVcmwgLW5vdG1hdGNoICdeaHR0cHM/Oi8vJykgewogICAgICAgICAgICAg +ICAgICAgIFNlbmQtSnNvbiAkUmVzcG9uc2UgQHsgZXJyb3IgPSAiTnVyIEhUVFAvSFRUUFMgVVJM +cyBlcmxhdWJ0IiB9IDQwMAogICAgICAgICAgICAgICAgICAgICRSZXNwb25zZS5DbG9zZSgpCiAg +ICAgICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAg +ICAgICAjIFNTUkYtU2NodXR6OiBQcml2YXRlIElQcyB1bmQgbG9jYWxob3N0IGJsb2NraWVyZW4K +ICAgICAgICAgICAgICAgICRQYXJzZWRVcmkgPSBbU3lzdGVtLlVyaV0kSW1nVXJsCiAgICAgICAg +ICAgICAgICAkSW1nSG9zdCA9ICRQYXJzZWRVcmkuSG9zdAogICAgICAgICAgICAgICAgaWYgKCRJ +bWdIb3N0IC1tYXRjaCAnXihsb2NhbGhvc3R8MTI3XC58MTBcLnwxOTJcLjE2OFwufDE3MlwuKDFb +Ni05XXwyWzAtOV18M1swMV0pXC58MFwuMFwuMFwuMHwxNjlcLjI1NFwuKScgLW9yICRJbWdIb3N0 +IC1lcSAnOjoxJykgewogICAgICAgICAgICAgICAgICAgIFNlbmQtSnNvbiAkUmVzcG9uc2UgQHsg +ZXJyb3IgPSAiWnVncmlmZiBhdWYgaW50ZXJuZSBBZHJlc3NlbiBuaWNodCBlcmxhdWJ0IiB9IDQw +MwogICAgICAgICAgICAgICAgICAgICRSZXNwb25zZS5DbG9zZSgpCiAgICAgICAgICAgICAgICAg +ICAgY29udGludWUKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAkV2ViQ2xpZW50 +ID0gTmV3LU9iamVjdCBTeXN0ZW0uTmV0LldlYkNsaWVudAogICAgICAgICAgICAgICAgJFdlYkNs +aWVudC5IZWFkZXJzLkFkZCgiVXNlci1BZ2VudCIsICJNb3ppbGxhLzUuMCBEUklWRS1Qb3J0YWwv +My42IikKICAgICAgICAgICAgICAgICRJbWdCeXRlcyA9ICRXZWJDbGllbnQuRG93bmxvYWREYXRh +KCRJbWdVcmwpCiAgICAgICAgICAgICAgICAkQ29udGVudFR5cGUgPSAkV2ViQ2xpZW50LlJlc3Bv +bnNlSGVhZGVyc1siQ29udGVudC1UeXBlIl0KICAgICAgICAgICAgICAgICRXZWJDbGllbnQuRGlz +cG9zZSgpCgogICAgICAgICAgICAgICAgIyBOdXIgQmlsZGVyIGR1cmNobGFzc2VuCiAgICAgICAg +ICAgICAgICBpZiAoJENvbnRlbnRUeXBlIC1ub3RsaWtlICdpbWFnZS8qJykgewogICAgICAgICAg +ICAgICAgICAgIFNlbmQtSnNvbiAkUmVzcG9uc2UgQHsgZXJyb3IgPSAiS2VpbiBCaWxkOiAkQ29u +dGVudFR5cGUiIH0gNDAwCiAgICAgICAgICAgICAgICAgICAgJFJlc3BvbnNlLkNsb3NlKCkKICAg +ICAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAg +ICAgICRSZXNwb25zZS5TdGF0dXNDb2RlID0gMjAwCiAgICAgICAgICAgICAgICAkUmVzcG9uc2Uu +Q29udGVudFR5cGUgPSAkQ29udGVudFR5cGUKICAgICAgICAgICAgICAgIEFkZC1TZWN1cml0eUhl +YWRlcnMgJFJlc3BvbnNlCiAgICAgICAgICAgICAgICAkUmVzcG9uc2UuQ29udGVudExlbmd0aDY0 +ID0gJEltZ0J5dGVzLkxlbmd0aAogICAgICAgICAgICAgICAgJFJlc3BvbnNlLk91dHB1dFN0cmVh +bS5Xcml0ZSgkSW1nQnl0ZXMsIDAsICRJbWdCeXRlcy5MZW5ndGgpCiAgICAgICAgICAgICAgICBX +cml0ZS1Ib3N0ICIgIEFQSSAgUE9TVCAvYXBpL2ZldGNoLWltYWdlICAkKCRJbWdCeXRlcy5MZW5n +dGgpIEJ5dGVzIHZvbiAkSW1nVXJsIiAtRm9yZWdyb3VuZENvbG9yIEN5YW4KICAgICAgICAgICAg +fSBjYXRjaCB7CiAgICAgICAgICAgICAgICBXcml0ZS1Ib3N0ICIgIEVSUiAgUE9TVCAvYXBpL2Zl +dGNoLWltYWdlICAkKCRfLkV4Y2VwdGlvbi5NZXNzYWdlKSIgLUZvcmVncm91bmRDb2xvciBSZWQK +ICAgICAgICAgICAgICAgIHRyeSB7IFNlbmQtSnNvbiAkUmVzcG9uc2UgQHsgZXJyb3IgPSAiRG93 +bmxvYWQgZmVobGdlc2NobGFnZW46ICQoJF8uRXhjZXB0aW9uLk1lc3NhZ2UpIiB9IDUwMCB9IGNh +dGNoIHt9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdHJ5IHsgJFJlc3BvbnNlLkNsb3NlKCkg +fSBjYXRjaCB7fQogICAgICAgICAgICBjb250aW51ZQogICAgICAgIH0KCiAgICAgICAgIyAtLS0g +UE9TVCAvYXBpL3VwbG9hZD9wYXRoPW1lZGlhL0QwMDEvYmlsZC5wbmcgLS0tCiAgICAgICAgIyBB +a3plcHRpZXJ0IHJvaGUgQnl0ZXMgdW5kIG11bHRpcGFydC9mb3JtLWRhdGEgKEZvcm1EYXRhKSBV +cGxvYWRzLgogICAgICAgICMgTnVyIHNpY2hlcmUgTWVkaWVuZm9ybWF0ZSBlcmxhdWJ0IChCaWxk +ZXIsIFBERiwgVmlkZW8sIEF1ZGlvKS4KICAgICAgICBpZiAoJFVybFBhdGggLWVxICcvYXBpL3Vw +bG9hZCcgLWFuZCAkTWV0aG9kIC1lcSAnUE9TVCcpIHsKICAgICAgICAgICAgdHJ5IHsKICAgICAg +ICAgICAgICAgICMgUGZhZCBtYW51ZWxsIGF1cyBSYXctVVJMIGV4dHJhaGllcmVuIHVuZCBVVEYt +OCBkZWtvZGllcmVuCiAgICAgICAgICAgICAgICAjIChRdWVyeVN0cmluZyB2ZXJ3ZW5kZXQgYXVm +IG1hbmNoZW4gV2luZG93cy1TeXN0ZW1lbiBkaWUgU3lzdGVtY29kZXBhZ2Ugc3RhdHQgVVRGLTgp +CiAgICAgICAgICAgICAgICAkUmF3UXVlcnkgPSAkUmVxdWVzdC5VcmwuUXVlcnkKICAgICAgICAg +ICAgICAgICRQYXRoTWF0Y2ggPSBbcmVnZXhdOjpNYXRjaCgkUmF3UXVlcnksICdwYXRoPShbXiZd +KyknKQogICAgICAgICAgICAgICAgaWYgKC1ub3QgJFBhdGhNYXRjaC5TdWNjZXNzKSB7CiAgICAg +ICAgICAgICAgICAgICAgU2VuZC1Kc29uICRSZXNwb25zZSBAeyBlcnJvciA9ICJLZWluIHBhdGgt +UGFyYW1ldGVyIiB9IDQwMAogICAgICAgICAgICAgICAgICAgICRSZXNwb25zZS5DbG9zZSgpCiAg +ICAgICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAg +ICAgICRSZWxQYXRoID0gW1N5c3RlbS5VcmldOjpVbmVzY2FwZURhdGFTdHJpbmcoJFBhdGhNYXRj +aC5Hcm91cHNbMV0uVmFsdWUpCgogICAgICAgICAgICAgICAgIyBEYXRlaXR5cC1XaGl0ZWxpc3Q6 +IE51ciBzaWNoZXJlIE1lZGllbmZvcm1hdGUgZXJsYXViZW4KICAgICAgICAgICAgICAgICRVcGxv +YWRFeHQgPSBbSU8uUGF0aF06OkdldEV4dGVuc2lvbigkUmVsUGF0aCkuVG9Mb3dlcigpCiAgICAg +ICAgICAgICAgICAkQWxsb3dlZFVwbG9hZEV4dHMgPSBAKCcuanBnJywnLmpwZWcnLCcucG5nJywn +LmdpZicsJy53ZWJwJywnLnN2ZycsJy5pY28nLCcuYm1wJywKICAgICAgICAgICAgICAgICAgICAg +ICAgICAgICAgICAgICAgICAgJy5wZGYnLCcubXA0JywnLndlYm0nLCcubXAzJywnLm9nZycsJy53 +YXYnKQogICAgICAgICAgICAgICAgaWYgKCRVcGxvYWRFeHQgLW5vdGluICRBbGxvd2VkVXBsb2Fk +RXh0cykgewogICAgICAgICAgICAgICAgICAgIFNlbmQtSnNvbiAkUmVzcG9uc2UgQHsgZXJyb3Ig +PSAiRGF0ZWl0eXAgJyRVcGxvYWRFeHQnIGlzdCBuaWNodCBlcmxhdWJ0LiBFcmxhdWJ0OiBCaWxk +ZXIsIFBERiwgVmlkZW8sIEF1ZGlvLiIgfSA0MDAKICAgICAgICAgICAgICAgICAgICBXcml0ZS1I +b3N0ICIgIEVSUiAgUE9TVCAvYXBpL3VwbG9hZCAgRGF0ZWl0eXAgYWJnZWxlaG50OiAkVXBsb2Fk +RXh0ICgkUmVsUGF0aCkiIC1Gb3JlZ3JvdW5kQ29sb3IgUmVkCiAgICAgICAgICAgICAgICAgICAg +JFJlc3BvbnNlLkNsb3NlKCkKICAgICAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAg +ICAgICAgfQoKICAgICAgICAgICAgICAgICRTYWZlUGF0aCA9IFJlc29sdmUtU2FmZVBhdGggJFJl +bFBhdGgKCiAgICAgICAgICAgICAgICBpZiAoLW5vdCAkU2FmZVBhdGgpIHsKICAgICAgICAgICAg +ICAgICAgICBTZW5kLUpzb24gJFJlc3BvbnNlIEB7IGVycm9yID0gIlVuZ3VlbHRpZ2VyIFBmYWQi +IH0gNDAwCiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICMgT3Jk +bmVyIGVyc3RlbGxlbgogICAgICAgICAgICAgICAgICAgICREaXIgPSBbSU8uUGF0aF06OkdldERp +cmVjdG9yeU5hbWUoJFNhZmVQYXRoKQogICAgICAgICAgICAgICAgICAgIGlmICgtbm90IChUZXN0 +LVBhdGggJERpcikpIHsgTmV3LUl0ZW0gLUl0ZW1UeXBlIERpcmVjdG9yeSAtUGF0aCAkRGlyIC1G +b3JjZSB8IE91dC1OdWxsIH0KCiAgICAgICAgICAgICAgICAgICAgIyBCb2R5IGxlc2VuIChtYXgu +IDEwMCBNQikKICAgICAgICAgICAgICAgICAgICAkTWF4VXBsb2FkQnl0ZXMgPSAxMDAgKiAxMDI0 +ICogMTAyNAogICAgICAgICAgICAgICAgICAgICRNZW1TdHJlYW0gPSBOZXctT2JqZWN0IElPLk1l +bW9yeVN0cmVhbQogICAgICAgICAgICAgICAgICAgICRSZXF1ZXN0LklucHV0U3RyZWFtLkNvcHlU +bygkTWVtU3RyZWFtKQogICAgICAgICAgICAgICAgICAgICRSYXdCeXRlcyA9ICRNZW1TdHJlYW0u +VG9BcnJheSgpCiAgICAgICAgICAgICAgICAgICAgJE1lbVN0cmVhbS5EaXNwb3NlKCkKCiAgICAg +ICAgICAgICAgICAgICAgaWYgKCRSYXdCeXRlcy5MZW5ndGggLWd0ICRNYXhVcGxvYWRCeXRlcykg ewogICAgICAgICAgICAgICAgICAgICAgICBTZW5kLUpzb24gJFJlc3BvbnNlIEB7IGVycm9yID0g -Ik51ciBTdXBlclVzZXIgdW5kIEZhY2hhdWZzaWNodCBkdWVyZmVuIFN5c3RlbWRhdGVpZW4gbG9l -c2NoZW4iIH0gNDAzCiAgICAgICAgICAgICAgICAgICAgICAgIFdyaXRlLUhvc3QgIiAgRVJSICBQ -T1NUIC9hcGkvZGVsZXRlICBTeXN0ZW1kYXRlaS1CZXJlY2h0aWd1bmcgdmVyd2VpZ2VydCAoJGVu -djpVU0VSTkFNRSAtPiAkUmVsUGF0aCkiIC1Gb3JlZ3JvdW5kQ29sb3IgUmVkCiAgICAgICAgICAg -ICAgICAgICAgICAgICRSZXNwb25zZS5DbG9zZSgpCiAgICAgICAgICAgICAgICAgICAgICAgIGNv -bnRpbnVlCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAg -ICAgICAgICRTYWZlUGF0aCA9IFJlc29sdmUtU2FmZVBhdGggJFJlbFBhdGgKCiAgICAgICAgICAg -ICAgICBpZiAoLW5vdCAkU2FmZVBhdGgpIHsKICAgICAgICAgICAgICAgICAgICBTZW5kLUpzb24g -JFJlc3BvbnNlIEB7IGVycm9yID0gIlVuZ3VlbHRpZ2VyIFBmYWQiIH0gNDAwCiAgICAgICAgICAg -ICAgICB9IGVsc2VpZiAoVGVzdC1QYXRoICRTYWZlUGF0aCkgewogICAgICAgICAgICAgICAgICAg -IFVucHJvdGVjdC1GaWxlICRTYWZlUGF0aAogICAgICAgICAgICAgICAgICAgIFJlbW92ZS1JdGVt -ICRTYWZlUGF0aCAtUmVjdXJzZSAtRm9yY2UKICAgICAgICAgICAgICAgICAgICBTZW5kLUpzb24g +IkRhdGVpIHp1IGdyb3NzIChtYXguIDEwMCBNQikiIH0gNDEzCiAgICAgICAgICAgICAgICAgICAg +ICAgIFdyaXRlLUhvc3QgIiAgRVJSICBQT1NUIC9hcGkvdXBsb2FkICBadSBncm9zczogJCgkUmF3 +Qnl0ZXMuTGVuZ3RoKSBCeXRlcyAoJFJlbFBhdGgpIiAtRm9yZWdyb3VuZENvbG9yIFJlZAogICAg +ICAgICAgICAgICAgICAgICAgICAkUmVzcG9uc2UuQ2xvc2UoKQogICAgICAgICAgICAgICAgICAg +ICAgICBjb250aW51ZQogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAg +IyBNdWx0aXBhcnQvZm9ybS1kYXRhOiBEYXRlaS1CeXRlcyBhdXMgQm9keSBleHRyYWhpZXJlbgog +ICAgICAgICAgICAgICAgICAgICRDVCA9ICRSZXF1ZXN0LkNvbnRlbnRUeXBlCiAgICAgICAgICAg +ICAgICAgICAgaWYgKCRDVCAtYW5kICRDVC5Db250YWlucygnbXVsdGlwYXJ0L2Zvcm0tZGF0YScp +KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRCb3VuZGFyeU1hdGNoID0gW3JlZ2V4XTo6TWF0 +Y2goJENULCAnYm91bmRhcnk9KC4rKScpCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkQm91 +bmRhcnlNYXRjaC5TdWNjZXNzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkQm91bmRh +cnkgPSBbVGV4dC5FbmNvZGluZ106OlVURjguR2V0Qnl0ZXMoJy0tJyArICRCb3VuZGFyeU1hdGNo +Lkdyb3Vwc1sxXS5WYWx1ZS5UcmltKCciJykpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAj +IERhdGVpLVBhcnQgZmluZGVuOiBzdWNoZSBuYWNoICJmaWxlbmFtZT0iIGltIEhlYWRlciwgZXh0 +cmFoaWVyZSBEYXRlbiBuYWNoIFxyXG5cclxuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAk +UmF3ID0gJFJhd0J5dGVzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkTmVlZGxlID0gW1Rl +eHQuRW5jb2RpbmddOjpVVEY4LkdldEJ5dGVzKCdmaWxlbmFtZT0nKQogICAgICAgICAgICAgICAg +ICAgICAgICAgICAgJEhlYWRlckVuZCA9IFtUZXh0LkVuY29kaW5nXTo6VVRGOC5HZXRCeXRlcyhb +Y2hhcl0xMyArIFtjaGFyXTEwICsgW2NoYXJdMTMgKyBbY2hhcl0xMCkKICAgICAgICAgICAgICAg +ICAgICAgICAgICAgICMgRWluZmFjaGVyIEFuc2F0ejogS29udmVydGllcmUgenUgU3RyaW5nLCBm +aW5kZSBPZmZzZXRzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkUmF3U3RyID0gW1RleHQu +RW5jb2RpbmddOjpHZXRFbmNvZGluZygnaXNvLTg4NTktMScpLkdldFN0cmluZygkUmF3KQogICAg +ICAgICAgICAgICAgICAgICAgICAgICAgJEZuUG9zID0gJFJhd1N0ci5JbmRleE9mKCdmaWxlbmFt +ZT0nKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRGblBvcyAtZ2UgMCkgewogICAg +ICAgICAgICAgICAgICAgICAgICAgICAgICAgICREYXRhU3RhcnQgPSAkUmF3U3RyLkluZGV4T2Yo +KFtjaGFyXTEzKS5Ub1N0cmluZygpICsgKFtjaGFyXTEwKS5Ub1N0cmluZygpICsgKFtjaGFyXTEz +KS5Ub1N0cmluZygpICsgKFtjaGFyXTEwKS5Ub1N0cmluZygpLCAkRm5Qb3MpICsgNAogICAgICAg +ICAgICAgICAgICAgICAgICAgICAgICAgICMgRW5kZTogbmFlY2hzdGUgQm91bmRhcnkKICAgICAg +ICAgICAgICAgICAgICAgICAgICAgICAgICAkQm91bmRhcnlTdHIgPSBbVGV4dC5FbmNvZGluZ106 +OkdldEVuY29kaW5nKCdpc28tODg1OS0xJykuR2V0U3RyaW5nKCRCb3VuZGFyeSkKICAgICAgICAg +ICAgICAgICAgICAgICAgICAgICAgICAkRGF0YUVuZCA9ICRSYXdTdHIuSW5kZXhPZigkQm91bmRh +cnlTdHIsICREYXRhU3RhcnQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRE +YXRhRW5kIC1ndCAkRGF0YVN0YXJ0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg +ICAgICMgRW50ZmVybmUgXHJcbiB2b3IgZGVyIEJvdW5kYXJ5CiAgICAgICAgICAgICAgICAgICAg +ICAgICAgICAgICAgICAgIGlmICgkRGF0YUVuZCAtZ2UgMiAtYW5kICRSYXdTdHIuU3Vic3RyaW5n +KCREYXRhRW5kIC0gMiwgMikgLWVxIChbY2hhcl0xMykuVG9TdHJpbmcoKSArIChbY2hhcl0xMCku +VG9TdHJpbmcoKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJERh +dGFFbmQgLT0gMgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAg +ICAgICAgICAgICAgICAgICAgICAgICAgICAgICRSYXdCeXRlcyA9ICRSYXdbJERhdGFTdGFydC4u +KCREYXRhRW5kIC0gMSldCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAg +ICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAg +ICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAjIFNjaHJlaWJzY2h1dHogYXVmaGVi +ZW4sIERhdGVpIHNjaHJlaWJlbiwgU2NocmVpYnNjaHV0eiBzZXR6ZW4KICAgICAgICAgICAgICAg +ICAgICBVbnByb3RlY3QtRmlsZSAkU2FmZVBhdGgKICAgICAgICAgICAgICAgICAgICBbSU8uRmls +ZV06OldyaXRlQWxsQnl0ZXMoJFNhZmVQYXRoLCAkUmF3Qnl0ZXMpCiAgICAgICAgICAgICAgICAg +ICAgUHJvdGVjdC1GaWxlICRTYWZlUGF0aAoKICAgICAgICAgICAgICAgICAgICBTZW5kLUpzb24g JFJlc3BvbnNlIEB7IG9rID0gJHRydWU7IHBhdGggPSAkUmVsUGF0aCB9CiAgICAgICAgICAgICAg -ICAgICAgV3JpdGUtSG9zdCAiICBBUEkgIFBPU1QgL2FwaS9kZWxldGUgICRSZWxQYXRoICh2b24g -JGVudjpVU0VSTkFNRSkiIC1Gb3JlZ3JvdW5kQ29sb3IgWWVsbG93CiAgICAgICAgICAgICAgICB9 -IGVsc2UgewogICAgICAgICAgICAgICAgICAgIFNlbmQtSnNvbiAkUmVzcG9uc2UgQHsgZXJyb3Ig -PSAiRGF0ZWkgbmljaHQgZ2VmdW5kZW4iIH0gNDA0CiAgICAgICAgICAgICAgICB9CiAgICAgICAg -ICAgIH0gY2F0Y2ggewogICAgICAgICAgICAgICAgV3JpdGUtSG9zdCAiICBFUlIgIFBPU1QgL2Fw -aS9kZWxldGUgICQoJF8uRXhjZXB0aW9uLk1lc3NhZ2UpIiAtRm9yZWdyb3VuZENvbG9yIFJlZAog -ICAgICAgICAgICAgICAgdHJ5IHsgU2VuZC1Kc29uICRSZXNwb25zZSBAeyBlcnJvciA9ICRfLkV4 -Y2VwdGlvbi5NZXNzYWdlIH0gNTAwIH0gY2F0Y2gge30KICAgICAgICAgICAgfQogICAgICAgICAg -ICB0cnkgeyAkUmVzcG9uc2UuQ2xvc2UoKSB9IGNhdGNoIHt9CiAgICAgICAgICAgIGNvbnRpbnVl -CiAgICAgICAgfQoKICAgICAgICAjIC0tLSBQT1NUIC9hcGkvZmV0Y2gtaW1hZ2U/dXJsPWh0dHBz -Oi8vLi4uIC0tLQogICAgICAgICMgUHJveHk6IEV4dGVybmVzIEJpbGQgaGVydW50ZXJsYWRlbiAo -ZnVlciBQYXN0ZSBhdXMgV1dXLCB1bWdlaHQgQ09SUykKICAgICAgICBpZiAoJFVybFBhdGggLWVx -ICcvYXBpL2ZldGNoLWltYWdlJyAtYW5kICRNZXRob2QgLWVxICdQT1NUJykgewogICAgICAgICAg -ICB0cnkgewogICAgICAgICAgICAgICAgJEJvZHkgPSBSZWFkLUJvZHkgJFJlcXVlc3QKICAgICAg -ICAgICAgICAgICRQYXJzZWQgPSAkQm9keSB8IENvbnZlcnRGcm9tLUpzb24KICAgICAgICAgICAg -ICAgICRJbWdVcmwgPSAkUGFyc2VkLnVybAoKICAgICAgICAgICAgICAgICMgTnVyIGh0dHAvaHR0 -cHMgVVJMcyBlcmxhdWJlbgogICAgICAgICAgICAgICAgaWYgKCRJbWdVcmwgLW5vdG1hdGNoICde -aHR0cHM/Oi8vJykgewogICAgICAgICAgICAgICAgICAgIFNlbmQtSnNvbiAkUmVzcG9uc2UgQHsg -ZXJyb3IgPSAiTnVyIEhUVFAvSFRUUFMgVVJMcyBlcmxhdWJ0IiB9IDQwMAogICAgICAgICAgICAg -ICAgICAgICRSZXNwb25zZS5DbG9zZSgpCiAgICAgICAgICAgICAgICAgICAgY29udGludWUKICAg -ICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIFNTUkYtU2NodXR6OiBQcml2YXRlIElQ -cyB1bmQgbG9jYWxob3N0IGJsb2NraWVyZW4KICAgICAgICAgICAgICAgICRQYXJzZWRVcmkgPSBb -U3lzdGVtLlVyaV0kSW1nVXJsCiAgICAgICAgICAgICAgICAkSW1nSG9zdCA9ICRQYXJzZWRVcmku -SG9zdAogICAgICAgICAgICAgICAgaWYgKCRJbWdIb3N0IC1tYXRjaCAnXihsb2NhbGhvc3R8MTI3 -XC58MTBcLnwxOTJcLjE2OFwufDE3MlwuKDFbNi05XXwyWzAtOV18M1swMV0pXC58MFwuMFwuMFwu -MHwxNjlcLjI1NFwuKScgLW9yICRJbWdIb3N0IC1lcSAnOjoxJykgewogICAgICAgICAgICAgICAg -ICAgIFNlbmQtSnNvbiAkUmVzcG9uc2UgQHsgZXJyb3IgPSAiWnVncmlmZiBhdWYgaW50ZXJuZSBB -ZHJlc3NlbiBuaWNodCBlcmxhdWJ0IiB9IDQwMwogICAgICAgICAgICAgICAgICAgICRSZXNwb25z -ZS5DbG9zZSgpCiAgICAgICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgICAgIH0K -CiAgICAgICAgICAgICAgICAkV2ViQ2xpZW50ID0gTmV3LU9iamVjdCBTeXN0ZW0uTmV0LldlYkNs -aWVudAogICAgICAgICAgICAgICAgJFdlYkNsaWVudC5IZWFkZXJzLkFkZCgiVXNlci1BZ2VudCIs -ICJNb3ppbGxhLzUuMCBEUklWRS1Qb3J0YWwvMy42IikKICAgICAgICAgICAgICAgICRJbWdCeXRl -cyA9ICRXZWJDbGllbnQuRG93bmxvYWREYXRhKCRJbWdVcmwpCiAgICAgICAgICAgICAgICAkQ29u -dGVudFR5cGUgPSAkV2ViQ2xpZW50LlJlc3BvbnNlSGVhZGVyc1siQ29udGVudC1UeXBlIl0KICAg -ICAgICAgICAgICAgICRXZWJDbGllbnQuRGlzcG9zZSgpCgogICAgICAgICAgICAgICAgIyBOdXIg -QmlsZGVyIGR1cmNobGFzc2VuCiAgICAgICAgICAgICAgICBpZiAoJENvbnRlbnRUeXBlIC1ub3Rs -aWtlICdpbWFnZS8qJykgewogICAgICAgICAgICAgICAgICAgIFNlbmQtSnNvbiAkUmVzcG9uc2Ug -QHsgZXJyb3IgPSAiS2VpbiBCaWxkOiAkQ29udGVudFR5cGUiIH0gNDAwCiAgICAgICAgICAgICAg -ICAgICAgJFJlc3BvbnNlLkNsb3NlKCkKICAgICAgICAgICAgICAgICAgICBjb250aW51ZQogICAg -ICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICRSZXNwb25zZS5TdGF0dXNDb2RlID0gMjAw -CiAgICAgICAgICAgICAgICAkUmVzcG9uc2UuQ29udGVudFR5cGUgPSAkQ29udGVudFR5cGUKICAg -ICAgICAgICAgICAgIEFkZC1TZWN1cml0eUhlYWRlcnMgJFJlc3BvbnNlCiAgICAgICAgICAgICAg -ICAkUmVzcG9uc2UuQ29udGVudExlbmd0aDY0ID0gJEltZ0J5dGVzLkxlbmd0aAogICAgICAgICAg -ICAgICAgJFJlc3BvbnNlLk91dHB1dFN0cmVhbS5Xcml0ZSgkSW1nQnl0ZXMsIDAsICRJbWdCeXRl -cy5MZW5ndGgpCiAgICAgICAgICAgICAgICBXcml0ZS1Ib3N0ICIgIEFQSSAgUE9TVCAvYXBpL2Zl -dGNoLWltYWdlICAkKCRJbWdCeXRlcy5MZW5ndGgpIEJ5dGVzIHZvbiAkSW1nVXJsIiAtRm9yZWdy -b3VuZENvbG9yIEN5YW4KICAgICAgICAgICAgfSBjYXRjaCB7CiAgICAgICAgICAgICAgICBXcml0 -ZS1Ib3N0ICIgIEVSUiAgUE9TVCAvYXBpL2ZldGNoLWltYWdlICAkKCRfLkV4Y2VwdGlvbi5NZXNz -YWdlKSIgLUZvcmVncm91bmRDb2xvciBSZWQKICAgICAgICAgICAgICAgIHRyeSB7IFNlbmQtSnNv -biAkUmVzcG9uc2UgQHsgZXJyb3IgPSAiRG93bmxvYWQgZmVobGdlc2NobGFnZW46ICQoJF8uRXhj -ZXB0aW9uLk1lc3NhZ2UpIiB9IDUwMCB9IGNhdGNoIHt9CiAgICAgICAgICAgIH0KICAgICAgICAg -ICAgdHJ5IHsgJFJlc3BvbnNlLkNsb3NlKCkgfSBjYXRjaCB7fQogICAgICAgICAgICBjb250aW51 -ZQogICAgICAgIH0KCiAgICAgICAgIyAtLS0gUE9TVCAvYXBpL3VwbG9hZD9wYXRoPW1lZGlhL0Qw -MDEvYmlsZC5wbmcgLS0tCiAgICAgICAgIyBBa3plcHRpZXJ0IHJvaGUgQnl0ZXMgdW5kIG11bHRp -cGFydC9mb3JtLWRhdGEgKEZvcm1EYXRhKSBVcGxvYWRzLgogICAgICAgICMgTnVyIHNpY2hlcmUg -TWVkaWVuZm9ybWF0ZSBlcmxhdWJ0IChCaWxkZXIsIFBERiwgVmlkZW8sIEF1ZGlvKS4KICAgICAg -ICBpZiAoJFVybFBhdGggLWVxICcvYXBpL3VwbG9hZCcgLWFuZCAkTWV0aG9kIC1lcSAnUE9TVCcp -IHsKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICMgUGZhZCBtYW51ZWxsIGF1cyBS -YXctVVJMIGV4dHJhaGllcmVuIHVuZCBVVEYtOCBkZWtvZGllcmVuCiAgICAgICAgICAgICAgICAj -IChRdWVyeVN0cmluZyB2ZXJ3ZW5kZXQgYXVmIG1hbmNoZW4gV2luZG93cy1TeXN0ZW1lbiBkaWUg -U3lzdGVtY29kZXBhZ2Ugc3RhdHQgVVRGLTgpCiAgICAgICAgICAgICAgICAkUmF3UXVlcnkgPSAk -UmVxdWVzdC5VcmwuUXVlcnkKICAgICAgICAgICAgICAgICRQYXRoTWF0Y2ggPSBbcmVnZXhdOjpN -YXRjaCgkUmF3UXVlcnksICdwYXRoPShbXiZdKyknKQogICAgICAgICAgICAgICAgaWYgKC1ub3Qg -JFBhdGhNYXRjaC5TdWNjZXNzKSB7CiAgICAgICAgICAgICAgICAgICAgU2VuZC1Kc29uICRSZXNw -b25zZSBAeyBlcnJvciA9ICJLZWluIHBhdGgtUGFyYW1ldGVyIiB9IDQwMAogICAgICAgICAgICAg -ICAgICAgICRSZXNwb25zZS5DbG9zZSgpCiAgICAgICAgICAgICAgICAgICAgY29udGludWUKICAg -ICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICRSZWxQYXRoID0gW1N5c3RlbS5VcmldOjpV -bmVzY2FwZURhdGFTdHJpbmcoJFBhdGhNYXRjaC5Hcm91cHNbMV0uVmFsdWUpCgogICAgICAgICAg -ICAgICAgIyBEYXRlaXR5cC1XaGl0ZWxpc3Q6IE51ciBzaWNoZXJlIE1lZGllbmZvcm1hdGUgZXJs -YXViZW4KICAgICAgICAgICAgICAgICRVcGxvYWRFeHQgPSBbSU8uUGF0aF06OkdldEV4dGVuc2lv -bigkUmVsUGF0aCkuVG9Mb3dlcigpCiAgICAgICAgICAgICAgICAkQWxsb3dlZFVwbG9hZEV4dHMg -PSBAKCcuanBnJywnLmpwZWcnLCcucG5nJywnLmdpZicsJy53ZWJwJywnLnN2ZycsJy5pY28nLCcu -Ym1wJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy5wZGYnLCcubXA0 -JywnLndlYm0nLCcubXAzJywnLm9nZycsJy53YXYnKQogICAgICAgICAgICAgICAgaWYgKCRVcGxv -YWRFeHQgLW5vdGluICRBbGxvd2VkVXBsb2FkRXh0cykgewogICAgICAgICAgICAgICAgICAgIFNl -bmQtSnNvbiAkUmVzcG9uc2UgQHsgZXJyb3IgPSAiRGF0ZWl0eXAgJyRVcGxvYWRFeHQnIGlzdCBu -aWNodCBlcmxhdWJ0LiBFcmxhdWJ0OiBCaWxkZXIsIFBERiwgVmlkZW8sIEF1ZGlvLiIgfSA0MDAK -ICAgICAgICAgICAgICAgICAgICBXcml0ZS1Ib3N0ICIgIEVSUiAgUE9TVCAvYXBpL3VwbG9hZCAg -RGF0ZWl0eXAgYWJnZWxlaG50OiAkVXBsb2FkRXh0ICgkUmVsUGF0aCkiIC1Gb3JlZ3JvdW5kQ29s -b3IgUmVkCiAgICAgICAgICAgICAgICAgICAgJFJlc3BvbnNlLkNsb3NlKCkKICAgICAgICAgICAg -ICAgICAgICBjb250aW51ZQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICRTYWZl -UGF0aCA9IFJlc29sdmUtU2FmZVBhdGggJFJlbFBhdGgKCiAgICAgICAgICAgICAgICBpZiAoLW5v -dCAkU2FmZVBhdGgpIHsKICAgICAgICAgICAgICAgICAgICBTZW5kLUpzb24gJFJlc3BvbnNlIEB7 -IGVycm9yID0gIlVuZ3VlbHRpZ2VyIFBmYWQiIH0gNDAwCiAgICAgICAgICAgICAgICB9IGVsc2Ug -ewogICAgICAgICAgICAgICAgICAgICMgT3JkbmVyIGVyc3RlbGxlbgogICAgICAgICAgICAgICAg -ICAgICREaXIgPSBbSU8uUGF0aF06OkdldERpcmVjdG9yeU5hbWUoJFNhZmVQYXRoKQogICAgICAg -ICAgICAgICAgICAgIGlmICgtbm90IChUZXN0LVBhdGggJERpcikpIHsgTmV3LUl0ZW0gLUl0ZW1U -eXBlIERpcmVjdG9yeSAtUGF0aCAkRGlyIC1Gb3JjZSB8IE91dC1OdWxsIH0KCiAgICAgICAgICAg -ICAgICAgICAgIyBCb2R5IGxlc2VuIChtYXguIDEwMCBNQikKICAgICAgICAgICAgICAgICAgICAk -TWF4VXBsb2FkQnl0ZXMgPSAxMDAgKiAxMDI0ICogMTAyNAogICAgICAgICAgICAgICAgICAgICRN -ZW1TdHJlYW0gPSBOZXctT2JqZWN0IElPLk1lbW9yeVN0cmVhbQogICAgICAgICAgICAgICAgICAg -ICRSZXF1ZXN0LklucHV0U3RyZWFtLkNvcHlUbygkTWVtU3RyZWFtKQogICAgICAgICAgICAgICAg -ICAgICRSYXdCeXRlcyA9ICRNZW1TdHJlYW0uVG9BcnJheSgpCiAgICAgICAgICAgICAgICAgICAg -JE1lbVN0cmVhbS5EaXNwb3NlKCkKCiAgICAgICAgICAgICAgICAgICAgaWYgKCRSYXdCeXRlcy5M -ZW5ndGggLWd0ICRNYXhVcGxvYWRCeXRlcykgewogICAgICAgICAgICAgICAgICAgICAgICBTZW5k -LUpzb24gJFJlc3BvbnNlIEB7IGVycm9yID0gIkRhdGVpIHp1IGdyb3NzIChtYXguIDEwMCBNQiki -IH0gNDEzCiAgICAgICAgICAgICAgICAgICAgICAgIFdyaXRlLUhvc3QgIiAgRVJSICBQT1NUIC9h -cGkvdXBsb2FkICBadSBncm9zczogJCgkUmF3Qnl0ZXMuTGVuZ3RoKSBCeXRlcyAoJFJlbFBhdGgp -IiAtRm9yZWdyb3VuZENvbG9yIFJlZAogICAgICAgICAgICAgICAgICAgICAgICAkUmVzcG9uc2Uu -Q2xvc2UoKQogICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICAgICAg -ICAgIH0KCiAgICAgICAgICAgICAgICAgICAgIyBNdWx0aXBhcnQvZm9ybS1kYXRhOiBEYXRlaS1C -eXRlcyBhdXMgQm9keSBleHRyYWhpZXJlbgogICAgICAgICAgICAgICAgICAgICRDVCA9ICRSZXF1 -ZXN0LkNvbnRlbnRUeXBlCiAgICAgICAgICAgICAgICAgICAgaWYgKCRDVCAtYW5kICRDVC5Db250 -YWlucygnbXVsdGlwYXJ0L2Zvcm0tZGF0YScpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRC -b3VuZGFyeU1hdGNoID0gW3JlZ2V4XTo6TWF0Y2goJENULCAnYm91bmRhcnk9KC4rKScpCiAgICAg -ICAgICAgICAgICAgICAgICAgIGlmICgkQm91bmRhcnlNYXRjaC5TdWNjZXNzKSB7CiAgICAgICAg -ICAgICAgICAgICAgICAgICAgICAkQm91bmRhcnkgPSBbVGV4dC5FbmNvZGluZ106OlVURjguR2V0 -Qnl0ZXMoJy0tJyArICRCb3VuZGFyeU1hdGNoLkdyb3Vwc1sxXS5WYWx1ZS5UcmltKCciJykpCiAg -ICAgICAgICAgICAgICAgICAgICAgICAgICAjIERhdGVpLVBhcnQgZmluZGVuOiBzdWNoZSBuYWNo -ICJmaWxlbmFtZT0iIGltIEhlYWRlciwgZXh0cmFoaWVyZSBEYXRlbiBuYWNoIFxyXG5cclxuCiAg -ICAgICAgICAgICAgICAgICAgICAgICAgICAkUmF3ID0gJFJhd0J5dGVzCiAgICAgICAgICAgICAg -ICAgICAgICAgICAgICAkTmVlZGxlID0gW1RleHQuRW5jb2RpbmddOjpVVEY4LkdldEJ5dGVzKCdm -aWxlbmFtZT0nKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJEhlYWRlckVuZCA9IFtUZXh0 -LkVuY29kaW5nXTo6VVRGOC5HZXRCeXRlcyhbY2hhcl0xMyArIFtjaGFyXTEwICsgW2NoYXJdMTMg -KyBbY2hhcl0xMCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgRWluZmFjaGVyIEFuc2F0 -ejogS29udmVydGllcmUgenUgU3RyaW5nLCBmaW5kZSBPZmZzZXRzCiAgICAgICAgICAgICAgICAg -ICAgICAgICAgICAkUmF3U3RyID0gW1RleHQuRW5jb2RpbmddOjpHZXRFbmNvZGluZygnaXNvLTg4 -NTktMScpLkdldFN0cmluZygkUmF3KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJEZuUG9z -ID0gJFJhd1N0ci5JbmRleE9mKCdmaWxlbmFtZT0nKQogICAgICAgICAgICAgICAgICAgICAgICAg -ICAgaWYgKCRGblBvcyAtZ2UgMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRE -YXRhU3RhcnQgPSAkUmF3U3RyLkluZGV4T2YoKFtjaGFyXTEzKS5Ub1N0cmluZygpICsgKFtjaGFy -XTEwKS5Ub1N0cmluZygpICsgKFtjaGFyXTEzKS5Ub1N0cmluZygpICsgKFtjaGFyXTEwKS5Ub1N0 -cmluZygpLCAkRm5Qb3MpICsgNAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgRW5k -ZTogbmFlY2hzdGUgQm91bmRhcnkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkQm91 -bmRhcnlTdHIgPSBbVGV4dC5FbmNvZGluZ106OkdldEVuY29kaW5nKCdpc28tODg1OS0xJykuR2V0 -U3RyaW5nKCRCb3VuZGFyeSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkRGF0YUVu -ZCA9ICRSYXdTdHIuSW5kZXhPZigkQm91bmRhcnlTdHIsICREYXRhU3RhcnQpCiAgICAgICAgICAg -ICAgICAgICAgICAgICAgICAgICAgaWYgKCREYXRhRW5kIC1ndCAkRGF0YVN0YXJ0KSB7CiAgICAg -ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgRW50ZmVybmUgXHJcbiB2b3IgZGVyIEJv -dW5kYXJ5CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkRGF0YUVuZCAt -Z2UgMiAtYW5kICRSYXdTdHIuU3Vic3RyaW5nKCREYXRhRW5kIC0gMiwgMikgLWVxIChbY2hhcl0x -MykuVG9TdHJpbmcoKSArIChbY2hhcl0xMCkuVG9TdHJpbmcoKSkgewogICAgICAgICAgICAgICAg -ICAgICAgICAgICAgICAgICAgICAgICAgJERhdGFFbmQgLT0gMgogICAgICAgICAgICAgICAgICAg -ICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRS -YXdCeXRlcyA9ICRSYXdbJERhdGFTdGFydC4uKCREYXRhRW5kIC0gMSldCiAgICAgICAgICAgICAg -ICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAg -ICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAg -ICAgICAjIFNjaHJlaWJzY2h1dHogYXVmaGViZW4sIERhdGVpIHNjaHJlaWJlbiwgU2NocmVpYnNj -aHV0eiBzZXR6ZW4KICAgICAgICAgICAgICAgICAgICBVbnByb3RlY3QtRmlsZSAkU2FmZVBhdGgK -ICAgICAgICAgICAgICAgICAgICBbSU8uRmlsZV06OldyaXRlQWxsQnl0ZXMoJFNhZmVQYXRoLCAk -UmF3Qnl0ZXMpCiAgICAgICAgICAgICAgICAgICAgUHJvdGVjdC1GaWxlICRTYWZlUGF0aAoKICAg -ICAgICAgICAgICAgICAgICBTZW5kLUpzb24gJFJlc3BvbnNlIEB7IG9rID0gJHRydWU7IHBhdGgg -PSAkUmVsUGF0aCB9CiAgICAgICAgICAgICAgICAgICAgV3JpdGUtSG9zdCAiICBBUEkgIFBPU1Qg -L2FwaS91cGxvYWQgICRSZWxQYXRoICgkKCRSYXdCeXRlcy5MZW5ndGgpIEJ5dGVzKSIgLUZvcmVn -cm91bmRDb2xvciBHcmVlbgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGNhdGNoIHsK -ICAgICAgICAgICAgICAgIFdyaXRlLUhvc3QgIiAgRVJSICBQT1NUIC9hcGkvdXBsb2FkICAkKCRf -LkV4Y2VwdGlvbi5NZXNzYWdlKSIgLUZvcmVncm91bmRDb2xvciBSZWQKICAgICAgICAgICAgICAg -IHRyeSB7IFNlbmQtSnNvbiAkUmVzcG9uc2UgQHsgZXJyb3IgPSAkXy5FeGNlcHRpb24uTWVzc2Fn -ZSB9IDUwMCB9IGNhdGNoIHt9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdHJ5IHsgJFJlc3Bv -bnNlLkNsb3NlKCkgfSBjYXRjaCB7fQogICAgICAgICAgICBjb250aW51ZQogICAgICAgIH0KCiAg -ICAgICAgIyAtLS0gUE9TVCAvYXBpL3NodXRkb3duIC0tLQogICAgICAgICMgV2lyZCB2b24gYmVm -b3JldW5sb2FkIGdlc2VuZGV0IChUYWItQ2xvc2UgT0RFUiBGNS1SZWZyZXNoKS4KICAgICAgICAj -IFN0YXJ0ZXQgZWluZSBHbmFkZW5mcmlzdCBzdGF0dCBzb2ZvcnRpZ2VtIFNodXRkb3duLgogICAg -ICAgICMgQmVpIEY1L1JlZnJlc2gga29tbXQgaW5uZXJoYWxiIHZvbiA1cyBlaW4gbmV1ZXIgSGVh -cnRiZWF0IHVuZCBicmljaHQgYWIuCiAgICAgICAgIyBCZWkgZWNodGVtIFRhYi1DbG9zZSBrb21t -dCBrZWluIEhlYXJ0YmVhdCAtPiBTZXJ2ZXIgYmVlbmRldCBzaWNoIG5hY2ggR25hZGVuZnJpc3Qu -CiAgICAgICAgaWYgKCRVcmxQYXRoIC1lcSAnL2FwaS9zaHV0ZG93bicgLWFuZCAkTWV0aG9kIC1l -cSAnUE9TVCcpIHsKICAgICAgICAgICAgU2VuZC1Kc29uICRSZXNwb25zZSBAeyBvayA9ICR0cnVl -IH0KICAgICAgICAgICAgdHJ5IHsgJFJlc3BvbnNlLkNsb3NlKCkgfSBjYXRjaCB7fQogICAgICAg -ICAgICAkc2NyaXB0OlNodXRkb3duUGVuZGluZyA9IEdldC1EYXRlCiAgICAgICAgICAgIFdyaXRl -LUhvc3QgIiAgUE9TVCAvYXBpL3NodXRkb3duIC0gR25hZGVuZnJpc3QgZ2VzdGFydGV0ICgkKCRz -Y3JpcHQ6U2h1dGRvd25HcmFjZVNlYylzLCB3aXJkIGJlaSBIZWFydGJlYXQgYWJnZWJyb2NoZW4p -IiAtRm9yZWdyb3VuZENvbG9yIFllbGxvdwogICAgICAgICAgICBjb250aW51ZQogICAgICAgIH0K -CiAgICAgICAgIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 -PT09PT09PT09PT09PT09CiAgICAgICAgIyBTdGF0aXNjaGUgRGF0ZWllbiAobWl0IENhY2hlIGZ1 -ZXIgaGFldWZpZyBnZWxhZGVuZSBEYXRlaWVuKQogICAgICAgICMgPT09PT09PT09PT09PT09PT09 -PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKICAgICAgICBpZiAo -JFVybFBhdGggLWVxICcvJykgeyAkVXJsUGF0aCA9ICcvaW5kZXguaHRtbCcgfQogICAgICAgICRV -cmxQYXRoID0gW1N5c3RlbS5VcmldOjpVbmVzY2FwZURhdGFTdHJpbmcoJFVybFBhdGgpCiAgICAg -ICAgIyBQYXRoLVRyYXZlcnNhbC1TY2h1dHo6IFJlc29sdmUtU2FmZVBhdGggcHJ1ZWZ0IENvbnRh -aW5tZW50IGltIFJvb3QtVmVyemVpY2huaXMKICAgICAgICAkRmlsZVBhdGggPSBSZXNvbHZlLVNh -ZmVQYXRoICgkVXJsUGF0aC5UcmltU3RhcnQoJy8nKSkKCiAgICAgICAgdHJ5IHsKICAgICAgICAg -ICAgaWYgKCRGaWxlUGF0aCAtYW5kIChUZXN0LVBhdGggJEZpbGVQYXRoIC1QYXRoVHlwZSBMZWFm -KSkgewogICAgICAgICAgICAgICAgJEV4dGVuc2lvbiA9IFtJTy5QYXRoXTo6R2V0RXh0ZW5zaW9u -KCRGaWxlUGF0aCkuVG9Mb3dlcigpCiAgICAgICAgICAgICAgICAkQ29udGVudFR5cGUgPSAkTWlt -ZVR5cGVzWyRFeHRlbnNpb25dCiAgICAgICAgICAgICAgICBpZiAoLW5vdCAkQ29udGVudFR5cGUp -IHsgJENvbnRlbnRUeXBlID0gJ2FwcGxpY2F0aW9uL29jdGV0LXN0cmVhbScgfQoKICAgICAgICAg -ICAgICAgICRSZXNwb25zZS5Db250ZW50VHlwZSA9ICRDb250ZW50VHlwZQogICAgICAgICAgICAg -ICAgJFJlc3BvbnNlLlN0YXR1c0NvZGUgPSAyMDAKICAgICAgICAgICAgICAgIEFkZC1TZWN1cml0 -eUhlYWRlcnMgJFJlc3BvbnNlCgogICAgICAgICAgICAgICAgIyBDYWNoZSBmdWVyIHN0YXRpc2No -ZSBEYXRlaWVuIChpbmRleC5odG1sLCBDU1MsIEpTLCBKU09OKQogICAgICAgICAgICAgICAgJEJ5 -dGVzID0gJG51bGwKICAgICAgICAgICAgICAgICRGaWxlTGFzdFdyaXRlID0gKEdldC1JdGVtICRG -aWxlUGF0aCAtRm9yY2UpLkxhc3RXcml0ZVRpbWVVdGMKICAgICAgICAgICAgICAgIGlmICgkc2Ny -aXB0OlN0YXRpY0NhY2hlLkNvbnRhaW5zS2V5KCRGaWxlUGF0aCkpIHsKICAgICAgICAgICAgICAg -ICAgICAkY2FjaGVkID0gJHNjcmlwdDpTdGF0aWNDYWNoZVskRmlsZVBhdGhdCiAgICAgICAgICAg -ICAgICAgICAgaWYgKCRjYWNoZWQuTW9kaWZpZWQgLWdlICRGaWxlTGFzdFdyaXRlKSB7CiAgICAg -ICAgICAgICAgICAgICAgICAgICRCeXRlcyA9ICRjYWNoZWQuQnl0ZXMKICAgICAgICAgICAgICAg -ICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoLW5vdCAkQnl0ZXMp -IHsKICAgICAgICAgICAgICAgICAgICAkQnl0ZXMgPSBbSU8uRmlsZV06OlJlYWRBbGxCeXRlcygk -RmlsZVBhdGgpCiAgICAgICAgICAgICAgICAgICAgaWYgKCRFeHRlbnNpb24gLW1hdGNoICdeXC4o -aHRtbHxjc3N8anN8anNvbnxzdmd8aWNvKSQnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRz -Y3JpcHQ6U3RhdGljQ2FjaGVbJEZpbGVQYXRoXSA9IEB7IEJ5dGVzID0gJEJ5dGVzOyBNb2RpZmll -ZCA9ICRGaWxlTGFzdFdyaXRlIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAg -ICB9CiAgICAgICAgICAgICAgICAkUmVzcG9uc2UuQ29udGVudExlbmd0aDY0ID0gJEJ5dGVzLkxl -bmd0aAogICAgICAgICAgICAgICAgJFJlc3BvbnNlLk91dHB1dFN0cmVhbS5Xcml0ZSgkQnl0ZXMs -IDAsICRCeXRlcy5MZW5ndGgpCiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAk -UmVzcG9uc2UuU3RhdHVzQ29kZSA9IDQwNAogICAgICAgICAgICAgICAgJE5vdEZvdW5kID0gW1Rl -eHQuRW5jb2RpbmddOjpVVEY4LkdldEJ5dGVzKCI0MDQgLSBEYXRlaSBuaWNodCBnZWZ1bmRlbjog -JFVybFBhdGgiKQogICAgICAgICAgICAgICAgJFJlc3BvbnNlLkNvbnRlbnRUeXBlID0gJ3RleHQv -cGxhaW47IGNoYXJzZXQ9dXRmLTgnCiAgICAgICAgICAgICAgICAkUmVzcG9uc2UuQ29udGVudExl -bmd0aDY0ID0gJE5vdEZvdW5kLkxlbmd0aAogICAgICAgICAgICAgICAgJFJlc3BvbnNlLk91dHB1 -dFN0cmVhbS5Xcml0ZSgkTm90Rm91bmQsIDAsICROb3RGb3VuZC5MZW5ndGgpCiAgICAgICAgICAg -ICAgICBXcml0ZS1Ib3N0ICIgIDQwNCAgJFVybFBhdGgiIC1Gb3JlZ3JvdW5kQ29sb3IgUmVkCiAg -ICAgICAgICAgIH0KICAgICAgICB9IGNhdGNoIHsKICAgICAgICAgICAgV3JpdGUtSG9zdCAiICBF -UlIgIERhdGVpICRVcmxQYXRoICAkKCRfLkV4Y2VwdGlvbi5NZXNzYWdlKSIgLUZvcmVncm91bmRD -b2xvciBSZWQKICAgICAgICB9CiAgICAgICAgdHJ5IHsgJFJlc3BvbnNlLkNsb3NlKCkgfSBjYXRj -aCB7fQogICAgfQp9IGNhdGNoIHsKICAgICMgU3RyZytDIG9kZXIgRmVobGVyCn0gZmluYWxseSB7 -CiAgICAkTGlzdGVuZXIuU3RvcCgpCgogICAgIyBTY2hyZWlic2NodXR6IGJlaW0gQmVlbmRlbiB3 -aWVkZXIgc2V0emVuCiAgICBXcml0ZS1Ib3N0ICIgIFNjaHJlaWJzY2h1dHogd2lyZCB3aWVkZXJo -ZXJnZXN0ZWxsdC4uLiIgLUZvcmVncm91bmRDb2xvciBHcmF5CiAgICBHZXQtQ2hpbGRJdGVtICIk -Um9vdFxkYXRhIiAtUmVjdXJzZSAtRmlsdGVyICIqLmpzb24iIC1FcnJvckFjdGlvbiBTaWxlbnRs -eUNvbnRpbnVlIHwgRm9yRWFjaC1PYmplY3QgeyBQcm90ZWN0LUZpbGUgJF8uRnVsbE5hbWUgfQog -ICAgUHJvdGVjdC1GaWxlIChKb2luLVBhdGggJFJvb3QgImluZGV4Lmh0bWwiKQoKICAgICMgTG9r -YWxlIFRFTVAtS29waWUgYXVmcmFldW1lbiAodmVyaGluZGVydCB2ZXJ3YWlzdGUgRGF0ZWllbikK -ICAgICRUZW1wRGlyID0gSm9pbi1QYXRoICRlbnY6VEVNUCAiRFJJVkVfU2VydmVyIgogICAgaWYg -KFRlc3QtUGF0aCAkVGVtcERpcikgewogICAgICAgIFJlbW92ZS1JdGVtICRUZW1wRGlyIC1SZWN1 -cnNlIC1Gb3JjZSAtRXJyb3JBY3Rpb24gU2lsZW50bHlDb250aW51ZQogICAgICAgIFdyaXRlLUhv -c3QgIiAgVEVNUC1Lb3BpZSBiZXJlaW5pZ3QuIiAtRm9yZWdyb3VuZENvbG9yIEdyYXkKICAgIH0K -CiAgICBXcml0ZS1Ib3N0ICIiCiAgICBXcml0ZS1Ib3N0ICJTZXJ2ZXIgYmVlbmRldC4iIC1Gb3Jl -Z3JvdW5kQ29sb3IgWWVsbG93Cn0K +ICAgICAgV3JpdGUtSG9zdCAiICBBUEkgIFBPU1QgL2FwaS91cGxvYWQgICRSZWxQYXRoICgkKCRS +YXdCeXRlcy5MZW5ndGgpIEJ5dGVzKSIgLUZvcmVncm91bmRDb2xvciBHcmVlbgogICAgICAgICAg +ICAgICAgfQogICAgICAgICAgICB9IGNhdGNoIHsKICAgICAgICAgICAgICAgIFdyaXRlLUhvc3Qg +IiAgRVJSICBQT1NUIC9hcGkvdXBsb2FkICAkKCRfLkV4Y2VwdGlvbi5NZXNzYWdlKSIgLUZvcmVn +cm91bmRDb2xvciBSZWQKICAgICAgICAgICAgICAgIHRyeSB7IFNlbmQtSnNvbiAkUmVzcG9uc2Ug +QHsgZXJyb3IgPSAkXy5FeGNlcHRpb24uTWVzc2FnZSB9IDUwMCB9IGNhdGNoIHt9CiAgICAgICAg +ICAgIH0KICAgICAgICAgICAgdHJ5IHsgJFJlc3BvbnNlLkNsb3NlKCkgfSBjYXRjaCB7fQogICAg +ICAgICAgICBjb250aW51ZQogICAgICAgIH0KCiAgICAgICAgIyAtLS0gUE9TVCAvYXBpL3NodXRk +b3duIC0tLQogICAgICAgICMgV2lyZCB2b24gYmVmb3JldW5sb2FkIGdlc2VuZGV0IChUYWItQ2xv +c2UgT0RFUiBGNS1SZWZyZXNoKS4KICAgICAgICAjIFN0YXJ0ZXQgZWluZSBHbmFkZW5mcmlzdCBz +dGF0dCBzb2ZvcnRpZ2VtIFNodXRkb3duLgogICAgICAgICMgQmVpIEY1L1JlZnJlc2gga29tbXQg +aW5uZXJoYWxiIHZvbiA1cyBlaW4gbmV1ZXIgSGVhcnRiZWF0IHVuZCBicmljaHQgYWIuCiAgICAg +ICAgIyBCZWkgZWNodGVtIFRhYi1DbG9zZSBrb21tdCBrZWluIEhlYXJ0YmVhdCAtPiBTZXJ2ZXIg +YmVlbmRldCBzaWNoIG5hY2ggR25hZGVuZnJpc3QuCiAgICAgICAgaWYgKCRVcmxQYXRoIC1lcSAn +L2FwaS9zaHV0ZG93bicgLWFuZCAkTWV0aG9kIC1lcSAnUE9TVCcpIHsKICAgICAgICAgICAgU2Vu +ZC1Kc29uICRSZXNwb25zZSBAeyBvayA9ICR0cnVlIH0KICAgICAgICAgICAgdHJ5IHsgJFJlc3Bv +bnNlLkNsb3NlKCkgfSBjYXRjaCB7fQogICAgICAgICAgICAkc2NyaXB0OlNodXRkb3duUGVuZGlu +ZyA9IEdldC1EYXRlCiAgICAgICAgICAgIFdyaXRlLUhvc3QgIiAgUE9TVCAvYXBpL3NodXRkb3du +IC0gR25hZGVuZnJpc3QgZ2VzdGFydGV0ICgkKCRzY3JpcHQ6U2h1dGRvd25HcmFjZVNlYylzLCB3 +aXJkIGJlaSBIZWFydGJlYXQgYWJnZWJyb2NoZW4pIiAtRm9yZWdyb3VuZENvbG9yIFllbGxvdwog +ICAgICAgICAgICBjb250aW51ZQogICAgICAgIH0KCiAgICAgICAgIyA9PT09PT09PT09PT09PT09 +PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAgICAgIyBT +dGF0aXNjaGUgRGF0ZWllbiAobWl0IENhY2hlIGZ1ZXIgaGFldWZpZyBnZWxhZGVuZSBEYXRlaWVu +KQogICAgICAgICMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 +PT09PT09PT09PT09PT09PQoKICAgICAgICBpZiAoJFVybFBhdGggLWVxICcvJykgeyAkVXJsUGF0 +aCA9ICcvaW5kZXguaHRtbCcgfQogICAgICAgICRVcmxQYXRoID0gW1N5c3RlbS5VcmldOjpVbmVz +Y2FwZURhdGFTdHJpbmcoJFVybFBhdGgpCiAgICAgICAgIyBQYXRoLVRyYXZlcnNhbC1TY2h1dHo6 +IFJlc29sdmUtU2FmZVBhdGggcHJ1ZWZ0IENvbnRhaW5tZW50IGltIFJvb3QtVmVyemVpY2huaXMK +ICAgICAgICAkRmlsZVBhdGggPSBSZXNvbHZlLVNhZmVQYXRoICgkVXJsUGF0aC5UcmltU3RhcnQo +Jy8nKSkKCiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgaWYgKCRGaWxlUGF0aCAtYW5kIChUZXN0 +LVBhdGggJEZpbGVQYXRoIC1QYXRoVHlwZSBMZWFmKSkgewogICAgICAgICAgICAgICAgJEV4dGVu +c2lvbiA9IFtJTy5QYXRoXTo6R2V0RXh0ZW5zaW9uKCRGaWxlUGF0aCkuVG9Mb3dlcigpCiAgICAg +ICAgICAgICAgICAkQ29udGVudFR5cGUgPSAkTWltZVR5cGVzWyRFeHRlbnNpb25dCiAgICAgICAg +ICAgICAgICBpZiAoLW5vdCAkQ29udGVudFR5cGUpIHsgJENvbnRlbnRUeXBlID0gJ2FwcGxpY2F0 +aW9uL29jdGV0LXN0cmVhbScgfQoKICAgICAgICAgICAgICAgICRSZXNwb25zZS5Db250ZW50VHlw +ZSA9ICRDb250ZW50VHlwZQogICAgICAgICAgICAgICAgJFJlc3BvbnNlLlN0YXR1c0NvZGUgPSAy +MDAKICAgICAgICAgICAgICAgIEFkZC1TZWN1cml0eUhlYWRlcnMgJFJlc3BvbnNlCgogICAgICAg +ICAgICAgICAgIyBDYWNoZSBmdWVyIHN0YXRpc2NoZSBEYXRlaWVuIChpbmRleC5odG1sLCBDU1Ms +IEpTLCBKU09OKQogICAgICAgICAgICAgICAgJEJ5dGVzID0gJG51bGwKICAgICAgICAgICAgICAg +ICRGaWxlTGFzdFdyaXRlID0gKEdldC1JdGVtICRGaWxlUGF0aCAtRm9yY2UpLkxhc3RXcml0ZVRp +bWVVdGMKICAgICAgICAgICAgICAgIGlmICgkc2NyaXB0OlN0YXRpY0NhY2hlLkNvbnRhaW5zS2V5 +KCRGaWxlUGF0aCkpIHsKICAgICAgICAgICAgICAgICAgICAkY2FjaGVkID0gJHNjcmlwdDpTdGF0 +aWNDYWNoZVskRmlsZVBhdGhdCiAgICAgICAgICAgICAgICAgICAgaWYgKCRjYWNoZWQuTW9kaWZp +ZWQgLWdlICRGaWxlTGFzdFdyaXRlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRCeXRlcyA9 +ICRjYWNoZWQuQnl0ZXMKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAg +ICAgICAgICAgICAgICBpZiAoLW5vdCAkQnl0ZXMpIHsKICAgICAgICAgICAgICAgICAgICAkQnl0 +ZXMgPSBbSU8uRmlsZV06OlJlYWRBbGxCeXRlcygkRmlsZVBhdGgpCiAgICAgICAgICAgICAgICAg +ICAgaWYgKCRFeHRlbnNpb24gLW1hdGNoICdeXC4oaHRtbHxjc3N8anN8anNvbnxzdmd8aWNvKSQn +KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRzY3JpcHQ6U3RhdGljQ2FjaGVbJEZpbGVQYXRo +XSA9IEB7IEJ5dGVzID0gJEJ5dGVzOyBNb2RpZmllZCA9ICRGaWxlTGFzdFdyaXRlIH0KICAgICAg +ICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAkUmVzcG9u +c2UuQ29udGVudExlbmd0aDY0ID0gJEJ5dGVzLkxlbmd0aAogICAgICAgICAgICAgICAgJFJlc3Bv +bnNlLk91dHB1dFN0cmVhbS5Xcml0ZSgkQnl0ZXMsIDAsICRCeXRlcy5MZW5ndGgpCiAgICAgICAg +ICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAkUmVzcG9uc2UuU3RhdHVzQ29kZSA9IDQwNAog +ICAgICAgICAgICAgICAgJE5vdEZvdW5kID0gW1RleHQuRW5jb2RpbmddOjpVVEY4LkdldEJ5dGVz +KCI0MDQgLSBEYXRlaSBuaWNodCBnZWZ1bmRlbjogJFVybFBhdGgiKQogICAgICAgICAgICAgICAg +JFJlc3BvbnNlLkNvbnRlbnRUeXBlID0gJ3RleHQvcGxhaW47IGNoYXJzZXQ9dXRmLTgnCiAgICAg +ICAgICAgICAgICAkUmVzcG9uc2UuQ29udGVudExlbmd0aDY0ID0gJE5vdEZvdW5kLkxlbmd0aAog +ICAgICAgICAgICAgICAgJFJlc3BvbnNlLk91dHB1dFN0cmVhbS5Xcml0ZSgkTm90Rm91bmQsIDAs +ICROb3RGb3VuZC5MZW5ndGgpCiAgICAgICAgICAgICAgICBXcml0ZS1Ib3N0ICIgIDQwNCAgJFVy +bFBhdGgiIC1Gb3JlZ3JvdW5kQ29sb3IgUmVkCiAgICAgICAgICAgIH0KICAgICAgICB9IGNhdGNo +IHsKICAgICAgICAgICAgV3JpdGUtSG9zdCAiICBFUlIgIERhdGVpICRVcmxQYXRoICAkKCRfLkV4 +Y2VwdGlvbi5NZXNzYWdlKSIgLUZvcmVncm91bmRDb2xvciBSZWQKICAgICAgICB9CiAgICAgICAg +dHJ5IHsgJFJlc3BvbnNlLkNsb3NlKCkgfSBjYXRjaCB7fQogICAgfQp9IGNhdGNoIHsKICAgICMg +U3RyZytDIG9kZXIgRmVobGVyCn0gZmluYWxseSB7CiAgICAkTGlzdGVuZXIuU3RvcCgpCgogICAg +IyBTY2hyZWlic2NodXR6IGJlaW0gQmVlbmRlbiB3aWVkZXIgc2V0emVuCiAgICBXcml0ZS1Ib3N0 +ICIgIFNjaHJlaWJzY2h1dHogd2lyZCB3aWVkZXJoZXJnZXN0ZWxsdC4uLiIgLUZvcmVncm91bmRD +b2xvciBHcmF5CiAgICBHZXQtQ2hpbGRJdGVtICIkUm9vdFxkYXRhIiAtUmVjdXJzZSAtRmlsdGVy +ICIqLmpzb24iIC1FcnJvckFjdGlvbiBTaWxlbnRseUNvbnRpbnVlIHwgRm9yRWFjaC1PYmplY3Qg +eyBQcm90ZWN0LUZpbGUgJF8uRnVsbE5hbWUgfQogICAgUHJvdGVjdC1GaWxlIChKb2luLVBhdGgg +JFJvb3QgImluZGV4Lmh0bWwiKQoKICAgICMgTG9rYWxlIFRFTVAtS29waWUgYXVmcmFldW1lbiAo +dmVyaGluZGVydCB2ZXJ3YWlzdGUgRGF0ZWllbikKICAgICRUZW1wRGlyID0gSm9pbi1QYXRoICRl +bnY6VEVNUCAiRFJJVkVfU2VydmVyIgogICAgaWYgKFRlc3QtUGF0aCAkVGVtcERpcikgewogICAg +ICAgIFJlbW92ZS1JdGVtICRUZW1wRGlyIC1SZWN1cnNlIC1Gb3JjZSAtRXJyb3JBY3Rpb24gU2ls +ZW50bHlDb250aW51ZQogICAgICAgIFdyaXRlLUhvc3QgIiAgVEVNUC1Lb3BpZSBiZXJlaW5pZ3Qu +IiAtRm9yZWdyb3VuZENvbG9yIEdyYXkKICAgIH0KCiAgICBXcml0ZS1Ib3N0ICIiCiAgICBXcml0 +ZS1Ib3N0ICJTZXJ2ZXIgYmVlbmRldC4iIC1Gb3JlZ3JvdW5kQ29sb3IgWWVsbG93Cn0K