diff --git a/install-commander-ai-lab.ps1 b/install-commander-ai-lab.ps1 index 65f5a1b..20922f5 100644 --- a/install-commander-ai-lab.ps1 +++ b/install-commander-ai-lab.ps1 @@ -1370,25 +1370,25 @@ $b = 'PCFET0NUWVBFIGh0bWw+CjxodG1sIGxhbmc9ImVuIj4KPGhlYWQ+CiAgICA8bWV0YSBjaGFyc2 'IiBzdHlsZT0iZGlzcGxheTpub25lOyI+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwYW5lbC1oZWFkZXIiPgogICAgICAgICAgICAgICAgICAgIDxoMj5NYW5hIEJhc2UgQWR2aWNlPC9oMj4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPHAgaWQ9ImNvYWNoLW1hbmEtdGV4dCIgY2xhc3M9ImNvYWNoLW1hbmEtdGV4dCI+PC9wPgogICAgICAgICAgICA8L2Rpdj4KCiAgICAgICAgICAgIDwhLS0gUmF3IEV4cGxhbmF0aW9uIChjb2xsYXBzaWJsZSkgLS0+CiAgICAgICAgICAgIDxkZXRhaWxzIGNsYXNzPSJwYW5lbCBjb2FjaC1yYXctZGV0YWlscyI+CiAgICAgICAgICAgICAgICA8c3VtbWFyeT5GdWxsIExMTSBSZXNwb25zZTwvc3VtbWFyeT4KICAgICAgICAgICAgICAgIDxwcmUgaWQ9ImNvYWNoLXJhdy10ZXh0IiBjbGFzcz0iY29hY2gtcmF3LXRleHQiPjwvcHJlPgogICAgICAgICAgICA8L2RldGFpbHM+CiAgICAgICAgPC9zZWN0aW9uPgoKICAgICAgICA8IS0tIFBhc3QgU2Vzc2lvbnMgLS0+CiAgICAgICAgPHNlY3Rpb24gY2xhc3M9InBhbmVsIGNvYWNoLXNlc3Npb25zLXNlY3Rpb24iPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJwYW5lbC1oZWFkZXIiPgogICAgICAgICAgICAgICAgPGgyPlBhc3QgU2Vzc2lvbnM8L2gyPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBpZD0iY29hY2gtc2Vzc2lvbnMtbGlzdCIgY2xhc3M9ImNvYWNoLXNlc3Npb25zLWxpc3QiPgogICAgICAgICAgICAgICAgPHAgY2xhc3M9ImNvYWNoLWVtcHR5Ij5ObyBjb2FjaGluZyBzZXNzaW9ucyB5ZXQuIFJ1biB0aGUgY29hY2ggdG8gZ2V0IHN0YXJ0ZWQuPC9wPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L3NlY3Rpb24+CgogICAgICAgIDwhLS0gVG9hc3QgQ29udGFpbmVyIC0tPgogICAgICAgIDxkaXYgY2xhc3M9ImNvYWNoLXRvYXN0LWNvbnRhaW5lciIgaWQ9ImNvYWNoLXRvYXN0LWNvbnRhaW5lciI+PC9kaXY+CiAgICA8L2Rpdj4KCiAgICA8c2NyaXB0IHNyYz0iY29hY2guanMiPjwvc2NyaXB0Pgo8L2JvZHk+CjwvaHRtbD4K' Install-B64 -R 'ui\coach.html' -B $b -# ui/coach.js (39,376 bytes) +# ui/coach.js (40,377 bytes) $b = 'LyoqCiAqIENvbW1hbmRlciBBSSBMYWIg4oCUIERlY2sgQ29hY2ggVUkgdjI4CiAqIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkAogKiBNdWx0aS10dXJuIGNoYXQgd2l0aCBTU0Ugc3RyZWFtaW5nLCBhcHBseSBzdWdnZXN0aW9ucywKICogY2FyZHMtbGlrZSBzZWFyY2gsIGVuaGFuY2VkIHNlc3Npb24gaGlzdG9yeS4KICovCgooZnVuY3Rpb24gKCkgewogICAgJ3VzZSBzdHJpY3QnOwoKICAgIGNvbnN0IEFQSSA9IHdpbmRvdy5sb2NhdGlvbi5vcmlnaW47CgogICAgLy8g4pSA4pSAIFN0YXRlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAogICAgbGV0IGNoYXRIaXN0b3J5ID0gW107ICAgICAgIC8vIFt7cm9sZSwgY29udGVudH1dCiAgICBsZXQgaXNTdHJlYW1pbmcgPSBmYWxzZTsKICAgIGxldCBjdXJyZW50U2Vzc2lvbklkID0gbnVsbDsKICAgIGxldCBzZXNzaW9uQ2FjaGUgPSB7fTsgICAgICAvLyBzZXNzaW9uSWQg4oaSIGZ1bGwgc2Vzc2lvbiBkYXRhCiAgICBsZXQgZXhwYW5kZWRTZXNzaW9ucyA9IHt9OyAgLy8gc2Vzc2lvbklkIOKGkiBib29sCiAgICBsZXQgZGJEZWNrcyA9IFtdOyAgICAgICAgICAgLy8gW3tpZCwgbmFtZX1dIGZyb20gL2FwaS9kZWNrcwoKICAgIC8vIOKUgOKUgCBET00gUmVmZXJlbmNlcyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKICAgIGNvbnN0IGRlY2tTZWxlY3QgICAgICAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29hY2gtZGVjay1zZWxlY3QnKTsKICAgIGNvbnN0IHBvd2VyU2xpZGVyICAgICAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29hY2gtcG93ZXItbGV2ZWwnKTsKICAgIGNvbnN0IHBvd2VyVmFsdWUgICAgICAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29hY2gtcG93ZXItdmFsdWUnKTsKICAgIGNvbnN0IG1ldGFGb2N1cyAgICAgICAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29hY2gtbWV0YS1mb2N1cycpOwogICAgY29uc3QgYnVkZ2V0U2VsZWN0ICAgICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb2FjaC1idWRnZXQnKTsKICAgIGNvbnN0IHJ1bkJ0biAgICAgICAgICAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29hY2gtcnVuLWJ0bicpOwogICAgY29uc3QgcnVuSGludCAgICAgICAgICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb2FjaC1ydW4taGludCcpOwogICAgY29uc3QgcHJvZ3Jlc3NFbCAgICAgICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb2FjaC1wcm9ncmVzcycpOwogICAgY29uc3QgcHJvZ3Jlc3NUZXh0ICAgICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb2FjaC1wcm9ncmVzcy10ZXh0Jyk7CiAgICBjb25zdCByZXN1bHRzRWwgICAgICAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NvYWNoLXJlc3VsdHMnKTsKCiAgICAvLyBTdGF0dXMKICAgIGNvbnN0IHN0YXR1c0xsbURvdCAgICAgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjc3RhdHVzLWxsbSAuc3RhdHVzLWRvdCcpOwogICAgY29uc3Qgc3RhdHVzTGxtVmFsdWUgICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdGF0dXMtbGxtLXZhbHVlJyk7CiAgICBjb25zdCBzdGF0dXNFbWJEb3QgICAgID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI3N0YXR1cy1lbWJlZGRpbmdzIC5zdGF0dXMtZG90Jyk7CiAgICBjb25zdCBzdGF0dXNFbWJWYWx1ZSAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N0YXR1cy1lbWJlZGRpbmdzLXZhbHVlJyk7CiAgICBjb25zdCBzdGF0dXNSZXBEb3QgICAgID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI3N0YXR1cy1yZXBvcnRzIC5zdGF0dXMtZG90Jyk7CiAgICBjb25zdCBzdGF0dXNSZXBWYWx1ZSAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N0YXR1cy1yZXBvcnRzLXZhbHVlJyk7CgogICAgLy8gUmVzdWx0cwogICAgY29uc3Qgc3VtbWFyeVRleHQgICAgICA9IGRvY3VtZW50LmdldEVsZW1l' + 'bnRCeUlkKCdjb2FjaC1zdW1tYXJ5LXRleHQnKTsKICAgIGNvbnN0IG1ldGFSb3cgICAgICAgICAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29hY2gtbWV0YS1yb3cnKTsKICAgIGNvbnN0IGN1dHNDb3VudCAgICAgICAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29hY2gtY3V0cy1jb3VudCcpOwogICAgY29uc3QgY3V0c0JvZHkgICAgICAgICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb2FjaC1jdXRzLWJvZHknKTsKICAgIGNvbnN0IGN1dHNBbGxDaGVjayAgICAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29hY2gtY3V0cy1hbGwnKTsKICAgIGNvbnN0IGFkZHNDb3VudCAgICAgICAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29hY2gtYWRkcy1jb3VudCcpOwogICAgY29uc3QgYWRkc0JvZHkgICAgICAgICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb2FjaC1hZGRzLWJvZHknKTsKICAgIGNvbnN0IGFkZHNBbGxDaGVjayAgICAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29hY2gtYWRkcy1hbGwnKTsKICAgIGNvbnN0IGhpbnRzQ2FyZCAgICAgICAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29hY2gtaGludHMtY2FyZCcpOwogICAgY29uc3QgaGludHNMaXN0ICAgICAgICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb2FjaC1oaW50cy1saXN0Jyk7CiAgICBjb25zdCBtYW5hQ2FyZCAgICAgICAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NvYWNoLW1hbmEtY2FyZCcpOwogICAgY29uc3QgbWFuYVRleHQgICAgICAgICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb2FjaC1tYW5hLXRleHQnKTsKICAgIGNvbnN0IHJhd1RleHQgICAgICAgICAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29hY2gtcmF3LXRleHQnKTsKICAgIGNvbnN0IHNlc3Npb25zTGlzdCAgICAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29hY2gtc2Vzc2lvbnMtbGlzdCcpOwogICAgY29uc3QgZ2VuUmVwb3J0c0J0biAgICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdnZW5lcmF0ZS1yZXBvcnRzLWJ0bicpOwoKICAgIC8vIENoYXQKICAgIGNvbnN0IGNoYXRNZXNzYWdlcyAgICAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29hY2gtY2hhdC1tZXNzYWdlcycpOwogICAgY29uc3QgY2hhdElucHV0ICAgICAgICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb2FjaC1jaGF0LWlucHV0Jyk7CiAgICBjb25zdCBjaGF0U2VuZEJ0biAgICAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NvYWNoLWNoYXQtc2VuZCcpOwogICAgY29uc3QgY2hhdENsZWFyQnRuICAgICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb2FjaC1jaGF0LWNsZWFyJyk7CgogICAgLy8gQ2FyZHMtTGlrZQogICAgY29uc3QgY2FyZHNsaWtlSW5wdXQgICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjYXJkc2xpa2UtaW5wdXQnKTsKICAgIGNvbnN0IGNhcmRzbGlrZVRvcG4gICAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2FyZHNsaWtlLXRvcG4nKTsKICAgIGNvbnN0IGNhcmRzbGlrZVNlYXJjaCAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2FyZHNsaWtlLXNlYXJjaC1idG4nKTsKICAgIGNvbnN0IGNhcmRzbGlrZVJlc3VsdHMgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2FyZHNsaWtlLXJlc3VsdHMnKTsKICAgIGNvbnN0IGNhcmRzbGlrZUhlYWRlciAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2FyZHNsaWtlLWhlYWRlcicpOwogICAgY29uc3QgY2FyZHNsaWtlQm9keSAgICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjYXJkc2xpa2UtYm9keScpOwogICAgY29uc3QgY2FyZHNsaWtlQXJyb3cgICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjYXJkc2xpa2UtYXJyb3cnKTsKCiAgICAvLyBBcHBseQogICAgY29uc3QgYXBwbHlCdG4gICAgICAgICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb2FjaC1hcHBseS1idG4nKTsKICAgIGNvbnN0IGFwcGx5RGVja1NlbGVjdCAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29hY2gtYXBwbHktZGVjay1zZWxlY3QnKTsKICAgIGNvbnN0IGFwcGx5Q291bnRFbCAgICAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29hY2gtYXBwbHktY291bnQnKTsKCiAgICAvLyDilIDilIAgSW5pdCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi' + 'lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKCiAgICBpbml0KCk7CgogICAgYXN5bmMgZnVuY3Rpb24gaW5pdCgpIHsKICAgICAgICBwb3dlclNsaWRlci5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsICgpID0+IHsKICAgICAgICAgICAgcG93ZXJWYWx1ZS50ZXh0Q29udGVudCA9IHBvd2VyU2xpZGVyLnZhbHVlOwogICAgICAgIH0pOwoKICAgICAgICBkZWNrU2VsZWN0LmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsICgpID0+IHsKICAgICAgICAgICAgY29uc3QgaGFzRGVjayA9IGRlY2tTZWxlY3QudmFsdWUgIT09ICcnOwogICAgICAgICAgICBydW5CdG4uZGlzYWJsZWQgPSAhaGFzRGVjazsKICAgICAgICAgICAgY2hhdFNlbmRCdG4uZGlzYWJsZWQgPSAhaGFzRGVjazsKICAgICAgICAgICAgcnVuSGludC50ZXh0Q29udGVudCA9IGhhc0RlY2sgPyAnUmVhZHkgdG8gYW5hbHl6ZScgOiAnU2VsZWN0IGEgZGVjayB0byBiZWdpbic7CiAgICAgICAgfSk7CgogICAgICAgIHJ1bkJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHJ1bkNvYWNoKTsKICAgICAgICBnZW5SZXBvcnRzQnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZ2VuZXJhdGVSZXBvcnRzKTsKCiAgICAgICAgY3V0c0FsbENoZWNrLmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsICgpID0+IHsKICAgICAgICAgICAgY3V0c0JvZHkucXVlcnlTZWxlY3RvckFsbCgnaW5wdXRbdHlwZT0iY2hlY2tib3giXScpLmZvckVhY2goY2IgPT4gewogICAgICAgICAgICAgICAgY2IuY2hlY2tlZCA9IGN1dHNBbGxDaGVjay5jaGVja2VkOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgdXBkYXRlQXBwbHlDb3VudCgpOwogICAgICAgIH0pOwogICAgICAgIGFkZHNBbGxDaGVjay5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCAoKSA9PiB7CiAgICAgICAgICAgIGFkZHNCb2R5LnF1ZXJ5U2VsZWN0b3JBbGwoJ2lucHV0W3R5cGU9ImNoZWNrYm94Il0nKS5mb3JFYWNoKGNiID0+IHsKICAgICAgICAgICAgICAgIGNiLmNoZWNrZWQgPSBhZGRzQWxsQ2hlY2suY2hlY2tlZDsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHVwZGF0ZUFwcGx5Q291bnQoKTsKICAgICAgICB9KTsKCiAgICAgICAgLy8gQ2hhdCBldmVudHMKICAgICAgICBjaGF0U2VuZEJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHNlbmRDaGF0TWVzc2FnZSk7CiAgICAgICAgY2hhdElucHV0LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCAoZSkgPT4gewogICAgICAgICAgICBpZiAoZS5rZXkgPT09ICdFbnRlcicgJiYgIWUuc2hpZnRLZXkpIHsKICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgIHNlbmRDaGF0TWVzc2FnZSgpOwogICAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICAgICAgY2hhdElucHV0LmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JywgKCkgPT4gewogICAgICAgICAgICBjaGF0U2VuZEJ0bi5kaXNhYmxlZCA9ICFjaGF0SW5wdXQudmFsdWUudHJpbSgpIHx8ICFkZWNrU2VsZWN0LnZhbHVlOwogICAgICAgIH0pOwogICAgICAgIGNoYXRDbGVhckJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGNsZWFyQ2hhdCk7CgogICAgICAgIC8vIENhcmRzLUxpa2UKICAgICAgICBjYXJkc2xpa2VTZWFyY2guYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBzZWFyY2hDYXJkc0xpa2UpOwogICAgICAgIGNhcmRzbGlrZUlucHV0LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCAoZSkgPT4gewogICAgICAgICAgICBpZiAoZS5rZXkgPT09ICdFbnRlcicpIHNlYXJjaENhcmRzTGlrZSgpOwogICAgICAgIH0pOwogICAgICAgIGNhcmRzbGlrZUhlYWRlci5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHsKICAgICAgICAgICAgY2FyZHNsaWtlQm9keS5jbGFzc0xpc3QudG9nZ2xlKCdjb2xsYXBzZWQnKTsKICAgICAgICAgICAgY2FyZHNsaWtlQXJyb3cudGV4dENvbnRlbnQgPSBjYXJkc2xpa2VCb2R5LmNsYXNzTGlzdC5jb250YWlucygnY29sbGFwc2VkJykgPyAnXHUyNUI2JyA6ICdcdTI1QkMnOwogICAgICAgIH0pOwoKICAgICAgICAvLyBBcHBseQogICAgICAgIGFwcGx5QnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgYXBwbHlTdWdnZXN0aW9ucyk7CgogICAgICAgIC8vIERlbGVnYXRlIGNoZWNrYm94IGNoYW5nZXMgaW4gdGFibGVzIGZvciBhcHBseSBjb3VudAogICAgICAgIGRvY3VtZW50' + 'LmdldEVsZW1lbnRCeUlkKCdjb2FjaC1jdXRzLWNhcmQnKS5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCB1cGRhdGVBcHBseUNvdW50KTsKICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29hY2gtYWRkcy1jYXJkJykuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgdXBkYXRlQXBwbHlDb3VudCk7CgogICAgICAgIC8vIExvYWQgZGF0YQogICAgICAgIGF3YWl0IFByb21pc2UuYWxsKFsKICAgICAgICAgICAgY2hlY2tTdGF0dXMoKSwKICAgICAgICAgICAgbG9hZERlY2tzKCksCiAgICAgICAgICAgIGxvYWRTZXNzaW9ucygpLAogICAgICAgICAgICBsb2FkRGJEZWNrcygpLAogICAgICAgIF0pOwogICAgfQoKICAgIC8vIOKUgOKUgCBHb2FscyBIZWxwZXIg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACgogICAgZnVuY3Rpb24gZ2V0R29hbHMoKSB7CiAgICAgICAgY29uc3QgZ29hbHMgPSB7fTsKICAgICAgICBjb25zdCBwbCA9IHBhcnNlSW50KHBvd2VyU2xpZGVyLnZhbHVlKTsKICAgICAgICBpZiAocGwpIGdvYWxzLnRhcmdldFBvd2VyTGV2ZWwgPSBwbDsKICAgICAgICBpZiAobWV0YUZvY3VzLnZhbHVlKSBnb2Fscy5tZXRhRm9jdXMgPSBtZXRhRm9jdXMudmFsdWU7CiAgICAgICAgaWYgKGJ1ZGdldFNlbGVjdC52YWx1ZSkgZ29hbHMuYnVkZ2V0ID0gYnVkZ2V0U2VsZWN0LnZhbHVlOwogICAgICAgIGNvbnN0IGZvY3VzQXJlYXMgPSBbXTsKICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuY29hY2gtZm9jdXMtdGFncyBpbnB1dFt0eXBlPSJjaGVja2JveCJdOmNoZWNrZWQnKS5mb3JFYWNoKGNiID0+IHsKICAgICAgICAgICAgZm9jdXNBcmVhcy5wdXNoKGNiLnZhbHVlKTsKICAgICAgICB9KTsKICAgICAgICBpZiAoZm9jdXNBcmVhcy5sZW5ndGggPiAwKSBnb2Fscy5mb2N1c0FyZWFzID0gZm9jdXNBcmVhczsKICAgICAgICByZXR1cm4gZ29hbHM7CiAgICB9CgogICAgLy8g4pSA4pSAIFN0YXR1cyBDaGVjayDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKCiAgICBhc3luYyBmdW5jdGlvbiBjaGVja1N0YXR1cygpIHsKICAgICAgICB0cnkgewogICAgICAgICAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaChBUEkgKyAnL2FwaS9jb2FjaC9zdGF0dXMnKTsKICAgICAgICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7CgogICAgICAgICAgICBpZiAoZGF0YS5sbG1Db25uZWN0ZWQpIHsKICAgICAgICAgICAgICAgIHNldFN0YXR1cyhzdGF0dXNMbG1Eb3QsIHN0YXR1c0xsbVZhbHVlLCAnb2snLCBkYXRhLmxsbU1vZGVsIHx8ICdDb25uZWN0ZWQnKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHNldFN0YXR1cyhzdGF0dXNMbG1Eb3QsIHN0YXR1c0xsbVZhbHVlLCAnZXJyb3InLCBkYXRhLmVycm9yIHx8ICdOb3QgY29ubmVjdGVkJyk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChkYXRhLmVtYmVkZGluZ3NMb2FkZWQpIHsKICAgICAgICAgICAgICAgIHNldFN0YXR1cyhzdGF0dXNFbWJEb3QsIHN0YXR1c0VtYlZhbHVlLCAnb2snLCBkYXRhLmVtYmVkZGluZ0NhcmRzLnRvTG9jYWxlU3RyaW5nKCkgKyAnIGNhcmRzJyk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBzZXRTdGF0dXMoc3RhdHVzRW1iRG90LCBzdGF0dXNFbWJWYWx1ZSwgJ3dhcm4nLCAnTm90IGxvYWRlZCcpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoZGF0YS5kZWNrUmVwb3J0c0F2YWlsYWJsZSA+IDApIHsKICAgICAgICAgICAgICAgIHNldFN0YXR1cyhzdGF0dXNSZXBEb3QsIHN0YXR1c1JlcFZhbHVlLCAnb2snLCBkYXRhLmRlY2tSZXBvcnRzQXZhaWxhYmxlICsgJyBhdmFpbGFibGUnKTsKICAgICAgICAgICAgICAgIGdlblJlcG9ydHNCdG4uc3R5bGUuZGlzcGxheSA9ICdpbmxpbmUtYmxvY2snOwogICAgICAgICAgICAgICAgZ2VuUmVwb3J0c0J0bi50ZXh0Q29udGVudCA9ICdSZWJ1aWxkIFJlcG9ydHMnOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgc2V0U3RhdHVzKHN0YXR1c1JlcERvdCwgc3RhdHVzUmVwVmFsdWUs' + -'ICd3YXJuJywgJ05vbmUgXHUyMDE0IHJ1biBzaW11bGF0aW9ucyBmaXJzdCcpOwogICAgICAgICAgICAgICAgZ2VuUmVwb3J0c0J0bi5zdHlsZS5kaXNwbGF5ID0gJ2lubGluZS1ibG9jayc7CiAgICAgICAgICAgICAgICBnZW5SZXBvcnRzQnRuLnRleHRDb250ZW50ID0gJ0dlbmVyYXRlIFJlcG9ydHMnOwogICAgICAgICAgICB9CiAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICBzZXRTdGF0dXMoc3RhdHVzTGxtRG90LCBzdGF0dXNMbG1WYWx1ZSwgJ2Vycm9yJywgJ1NlcnZpY2UgdW5hdmFpbGFibGUnKTsKICAgICAgICAgICAgc2V0U3RhdHVzKHN0YXR1c0VtYkRvdCwgc3RhdHVzRW1iVmFsdWUsICdlcnJvcicsICdcdTIwMTQnKTsKICAgICAgICAgICAgc2V0U3RhdHVzKHN0YXR1c1JlcERvdCwgc3RhdHVzUmVwVmFsdWUsICdlcnJvcicsICdcdTIwMTQnKTsKICAgICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gc2V0U3RhdHVzKGRvdEVsLCB2YWx1ZUVsLCBsZXZlbCwgdGV4dCkgewogICAgICAgIGRvdEVsLmNsYXNzTmFtZSA9ICdzdGF0dXMtZG90IHN0YXR1cy0nICsgbGV2ZWw7CiAgICAgICAgdmFsdWVFbC50ZXh0Q29udGVudCA9IHRleHQ7CiAgICB9CgogICAgLy8g4pSA4pSAIExvYWQgRGVja3Mg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACgogICAgYXN5bmMgZnVuY3Rpb24gbG9hZERlY2tzKCkgewogICAgICAgIHRyeSB7CiAgICAgICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKEFQSSArICcvYXBpL2NvYWNoL2RlY2tzJyk7CiAgICAgICAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpOwogICAgICAgICAgICBjb25zdCBkZWNrcyA9IGRhdGEuZGVja3MgfHwgW107CgogICAgICAgICAgICB3aGlsZSAoZGVja1NlbGVjdC5vcHRpb25zLmxlbmd0aCA+IDEpIHsKICAgICAgICAgICAgICAgIGRlY2tTZWxlY3QucmVtb3ZlKDEpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoZGVja3MubGVuZ3RoID09PSAwKSB7CiAgICAgICAgICAgICAgICBjb25zdCBvcHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdvcHRpb24nKTsKICAgICAgICAgICAgICAgIG9wdC5kaXNhYmxlZCA9IHRydWU7CiAgICAgICAgICAgICAgICBvcHQudGV4dENvbnRlbnQgPSAnTm8gZGVjayByZXBvcnRzIGF2YWlsYWJsZSBcdTIwMTQgcnVuIHNpbXVsYXRpb25zIGZpcnN0JzsKICAgICAgICAgICAgICAgIGRlY2tTZWxlY3QuYXBwZW5kQ2hpbGQob3B0KTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgZGVja3Muc29ydCgpOwogICAgICAgICAgICBmb3IgKGNvbnN0IGRlY2tJZCBvZiBkZWNrcykgewogICAgICAgICAgICAgICAgY29uc3Qgb3B0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnb3B0aW9uJyk7CiAgICAgICAgICAgICAgICBvcHQudmFsdWUgPSBkZWNrSWQ7CiAgICAgICAgICAgICAgICBvcHQudGV4dENvbnRlbnQgPSBkZWNrSWQ7CiAgICAgICAgICAgICAgICBkZWNrU2VsZWN0LmFwcGVuZENoaWxkKG9wdCk7CiAgICAgICAgICAgIH0KICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0ZhaWxlZCB0byBsb2FkIGRlY2tzOicsIGUpOwogICAgICAgIH0KICAgIH0KCiAgICAvLyDilIDilIAgTG9hZCBEQiBEZWNrcyAoZm9yIEFwcGx5KSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKCiAgICBhc3luYyBmdW5jdGlvbiBsb2FkRGJEZWNrcygpIHsKICAgICAgICB0cnkgewogICAgICAgICAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaChBUEkgKyAnL2FwaS9kZWNrcycpOwogICAgICAgICAgICBpZiAoIXJlcy5vaykgcmV0dXJuOwogICAgICAgICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTsKICAgICAgICAgICAgZGJEZWNrcyA9IGRhdGEuZGVja3MgfHwgW107CgogICAgICAgICAgICB3aGlsZSAoYXBwbHlEZWNrU2VsZWN0Lm9wdGlvbnMubGVuZ3RoID4gMSkgewogICAgICAgICAgICAgICAgYXBwbHlEZWNrU2VsZWN0LnJlbW92ZSgxKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgZm9yIChjb25zdCBkZWNrIG9mIGRiRGVja3MpIHsKICAgICAgICAg' + -'ICAgICAgIGNvbnN0IG9wdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ29wdGlvbicpOwogICAgICAgICAgICAgICAgb3B0LnZhbHVlID0gZGVjay5pZDsKICAgICAgICAgICAgICAgIG9wdC50ZXh0Q29udGVudCA9IGRlY2submFtZSArIChkZWNrLmNvbW1hbmRlciA/ICcgKCcgKyBkZWNrLmNvbW1hbmRlciArICcpJyA6ICcnKTsKICAgICAgICAgICAgICAgIGFwcGx5RGVja1NlbGVjdC5hcHBlbmRDaGlsZChvcHQpOwogICAgICAgICAgICB9CiAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gbG9hZCBEQiBkZWNrczonLCBlKTsKICAgICAgICB9CiAgICB9CgogICAgLy8g4pSA4pSAIExvYWQgUGFzdCBTZXNzaW9ucyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKCiAgICBhc3luYyBmdW5jdGlvbiBsb2FkU2Vzc2lvbnMoKSB7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goQVBJICsgJy9hcGkvY29hY2gvc2Vzc2lvbnMnKTsKICAgICAgICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7CiAgICAgICAgICAgIGNvbnN0IHNlc3Npb25zID0gZGF0YS5zZXNzaW9ucyB8fCBbXTsKCiAgICAgICAgICAgIGlmIChzZXNzaW9ucy5sZW5ndGggPT09IDApIHsKICAgICAgICAgICAgICAgIHNlc3Npb25zTGlzdC5pbm5lckhUTUwgPSAnPHAgY2xhc3M9ImNvYWNoLWVtcHR5Ij5ObyBjb2FjaGluZyBzZXNzaW9ucyB5ZXQuIFJ1biB0aGUgY29hY2ggdG8gZ2V0IHN0YXJ0ZWQuPC9wPic7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHNlc3Npb25zTGlzdC5pbm5lckhUTUwgPSAnJzsKICAgICAgICAgICAgZm9yIChjb25zdCBzIG9mIHNlc3Npb25zKSB7CiAgICAgICAgICAgICAgICBjb25zdCBpdGVtID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CiAgICAgICAgICAgICAgICBpdGVtLmNsYXNzTmFtZSA9ICdjb2FjaC1zZXNzaW9uLWl0ZW0nOwogICAgICAgICAgICAgICAgaXRlbS5kYXRhc2V0LnNlc3Npb25JZCA9IHMuc2Vzc2lvbklkOwoKICAgICAgICAgICAgICAgIGNvbnN0IHRpbWVTdHIgPSBzLnRpbWVzdGFtcCA/IGZvcm1hdFRpbWUocy50aW1lc3RhbXApIDogJyc7CiAgICAgICAgICAgICAgICBjb25zdCBpc0V4cGFuZGVkID0gZXhwYW5kZWRTZXNzaW9uc1tzLnNlc3Npb25JZF07CgogICAgICAgICAgICAgICAgaXRlbS5pbm5lckhUTUwgPQogICAgICAgICAgICAgICAgICAgICc8ZGl2IGNsYXNzPSJjb2FjaC1zZXNzaW9uLWhlYWRlciIgZGF0YS1zaWQ9IicgKyBlc2NIdG1sKHMuc2Vzc2lvbklkKSArICciPicgKwogICAgICAgICAgICAgICAgICAgICAgICAnPHNwYW4gY2xhc3M9ImNvYWNoLXNlc3Npb24tZXhwYW5kLWFycm93Ij4nICsgKGlzRXhwYW5kZWQgPyAnXHUyNUJDJyA6ICdcdTI1QjYnKSArICc8L3NwYW4+JyArCiAgICAgICAgICAgICAgICAgICAgICAgICc8c3BhbiBjbGFzcz0iY29hY2gtc2Vzc2lvbi1kZWNrIj4nICsgZXNjSHRtbChzLmRlY2tJZCkgKyAnPC9zcGFuPicgKwogICAgICAgICAgICAgICAgICAgICAgICAnPHNwYW4gY2xhc3M9ImNvYWNoLXNlc3Npb24tc3VtbWFyeSI+JyArIGVzY0h0bWwocy5zdW1tYXJ5IHx8ICcobm8gc3VtbWFyeSknKSArICc8L3NwYW4+JyArCiAgICAgICAgICAgICAgICAgICAgICAgICc8c3BhbiBjbGFzcz0iY29hY2gtc2Vzc2lvbi1tZXRhIj4nICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICc8c3BhbiBjbGFzcz0iY29hY2gtc2Vzc2lvbi1jdXRzIj4tJyArIChzLmN1dHNDb3VudCB8fCAwKSArICc8L3NwYW4+JyArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPHNwYW4gY2xhc3M9ImNvYWNoLXNlc3Npb24tYWRkcyI+KycgKyAocy5hZGRzQ291bnQgfHwgMCkgKyAnPC9zcGFuPicgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJzxzcGFuIGNsYXNzPSJjb2FjaC1zZXNzaW9uLXRpbWUiPicgKyBlc2NIdG1sKHRpbWVTdHIpICsgJzwvc3Bhbj4nICsKICAgICAgICAgICAgICAgICAgICAgICAgJzwvc3Bhbj4nICsKICAgICAgICAgICAgICAgICAgICAnPC9kaXY+JyArCiAgICAgICAgICAgICAgICAgICAgJzxkaXYgY2xhc3M9ImNvYWNoLXNlc3Npb24tZGV0YWlsIiBpZD0ic2Vzc2lv' + -'bi1kZXRhaWwtJyArIGVzY0h0bWwocy5zZXNzaW9uSWQpICsgJyIgc3R5bGU9IicgKyAoaXNFeHBhbmRlZCA/ICcnIDogJ2Rpc3BsYXk6bm9uZScpICsgJyI+JyArCiAgICAgICAgICAgICAgICAgICAgICAgICc8ZGl2IGNsYXNzPSJjb2FjaC1zZXNzaW9uLWRldGFpbC1sb2FkaW5nIj5Mb2FkaW5nLi4uPC9kaXY+JyArCiAgICAgICAgICAgICAgICAgICAgJzwvZGl2Pic7CgogICAgICAgICAgICAgICAgLy8gQ2xpY2sgaGFuZGxlciBmb3IgZXhwYW5kL2NvbGxhcHNlCiAgICAgICAgICAgICAgICBpdGVtLnF1ZXJ5U2VsZWN0b3IoJy5jb2FjaC1zZXNzaW9uLWhlYWRlcicpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHRvZ2dsZVNlc3Npb24ocy5zZXNzaW9uSWQpOwogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgc2Vzc2lvbnNMaXN0LmFwcGVuZENoaWxkKGl0ZW0pOwoKICAgICAgICAgICAgICAgIC8vIElmIHByZXZpb3VzbHkgZXhwYW5kZWQsIGxvYWQgZGV0YWlsCiAgICAgICAgICAgICAgICBpZiAoaXNFeHBhbmRlZCAmJiBzZXNzaW9uQ2FjaGVbcy5zZXNzaW9uSWRdKSB7CiAgICAgICAgICAgICAgICAgICAgcmVuZGVyU2Vzc2lvbkRldGFpbChzLnNlc3Npb25JZCwgc2Vzc2lvbkNhY2hlW3Muc2Vzc2lvbklkXSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0ZhaWxlZCB0byBsb2FkIHNlc3Npb25zOicsIGUpOwogICAgICAgIH0KICAgIH0KCiAgICBhc3luYyBmdW5jdGlvbiB0b2dnbGVTZXNzaW9uKHNlc3Npb25JZCkgewogICAgICAgIGNvbnN0IGRldGFpbEVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Nlc3Npb24tZGV0YWlsLScgKyBzZXNzaW9uSWQpOwogICAgICAgIGNvbnN0IGhlYWRlckVsID0gZGV0YWlsRWw/LnByZXZpb3VzRWxlbWVudFNpYmxpbmc7CiAgICAgICAgY29uc3QgYXJyb3dFbCA9IGhlYWRlckVsPy5xdWVyeVNlbGVjdG9yKCcuY29hY2gtc2Vzc2lvbi1leHBhbmQtYXJyb3cnKTsKCiAgICAgICAgaWYgKCFkZXRhaWxFbCkgcmV0dXJuOwoKICAgICAgICBjb25zdCB3YXNIaWRkZW4gPSBkZXRhaWxFbC5zdHlsZS5kaXNwbGF5ID09PSAnbm9uZSc7CgogICAgICAgIGlmICh3YXNIaWRkZW4pIHsKICAgICAgICAgICAgZGV0YWlsRWwuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7CiAgICAgICAgICAgIGV4cGFuZGVkU2Vzc2lvbnNbc2Vzc2lvbklkXSA9IHRydWU7CiAgICAgICAgICAgIGlmIChhcnJvd0VsKSBhcnJvd0VsLnRleHRDb250ZW50ID0gJ1x1MjVCQyc7CgogICAgICAgICAgICBpZiAoIXNlc3Npb25DYWNoZVtzZXNzaW9uSWRdKSB7CiAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKEFQSSArICcvYXBpL2NvYWNoL3Nlc3Npb25zLycgKyBlbmNvZGVVUklDb21wb25lbnQoc2Vzc2lvbklkKSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFyZXMub2spIHRocm93IG5ldyBFcnJvcignU2Vzc2lvbiBub3QgZm91bmQnKTsKICAgICAgICAgICAgICAgICAgICBjb25zdCBzZXNzaW9uID0gYXdhaXQgcmVzLmpzb24oKTsKICAgICAgICAgICAgICAgICAgICBzZXNzaW9uQ2FjaGVbc2Vzc2lvbklkXSA9IHNlc3Npb247CiAgICAgICAgICAgICAgICAgICAgcmVuZGVyU2Vzc2lvbkRldGFpbChzZXNzaW9uSWQsIHNlc3Npb24pOwogICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgIGRldGFpbEVsLmlubmVySFRNTCA9ICc8ZGl2IGNsYXNzPSJjb2FjaC1zZXNzaW9uLWRldGFpbC1lcnJvciI+RmFpbGVkIHRvIGxvYWQgc2Vzc2lvbiBkZXRhaWxzPC9kaXY+JzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHJlbmRlclNlc3Npb25EZXRhaWwoc2Vzc2lvbklkLCBzZXNzaW9uQ2FjaGVbc2Vzc2lvbklkXSk7CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBkZXRhaWxFbC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOwogICAgICAgICAgICBleHBhbmRlZFNlc3Npb25zW3Nlc3Npb25JZF0gPSBmYWxzZTsKICAgICAgICAgICAgaWYgKGFycm93RWwpIGFycm93RWwudGV4dENvbnRlbnQgPSAnXHUyNUI2JzsKICAgICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gcmVuZGVyU2Vzc2lv' + -'bkRldGFpbChzZXNzaW9uSWQsIHNlc3Npb24pIHsKICAgICAgICBjb25zdCBkZXRhaWxFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXNzaW9uLWRldGFpbC0nICsgc2Vzc2lvbklkKTsKICAgICAgICBpZiAoIWRldGFpbEVsKSByZXR1cm47CgogICAgICAgIGNvbnN0IGN1dHMgPSBzZXNzaW9uLnN1Z2dlc3RlZEN1dHMgfHwgW107CiAgICAgICAgY29uc3QgYWRkcyA9IHNlc3Npb24uc3VnZ2VzdGVkQWRkcyB8fCBbXTsKCiAgICAgICAgbGV0IGh0bWwgPSAnPGRpdiBjbGFzcz0iY29hY2gtc2Vzc2lvbi1kZXRhaWwtaW5uZXIiPic7CgogICAgICAgIC8vIFN1bW1hcnkKICAgICAgICBpZiAoc2Vzc2lvbi5zdW1tYXJ5KSB7CiAgICAgICAgICAgIGh0bWwgKz0gJzxwIGNsYXNzPSJjb2FjaC1zZXNzaW9uLWRldGFpbC1zdW1tYXJ5Ij4nICsgZXNjSHRtbChzZXNzaW9uLnN1bW1hcnkpICsgJzwvcD4nOwogICAgICAgIH0KCiAgICAgICAgLy8gQ3V0cwogICAgICAgIGlmIChjdXRzLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgaHRtbCArPSAnPGRpdiBjbGFzcz0iY29hY2gtc2Vzc2lvbi1kZXRhaWwtZ3JvdXAiPic7CiAgICAgICAgICAgIGh0bWwgKz0gJzxzcGFuIGNsYXNzPSJjb2FjaC1zZXNzaW9uLWRldGFpbC1sYWJlbCI+Q3V0czo8L3NwYW4+JzsKICAgICAgICAgICAgaHRtbCArPSAnPGRpdiBjbGFzcz0iY29hY2gtc2Vzc2lvbi1waWxscyI+JzsKICAgICAgICAgICAgZm9yIChjb25zdCBjdXQgb2YgY3V0cykgewogICAgICAgICAgICAgICAgaHRtbCArPSAnPHNwYW4gY2xhc3M9ImNvYWNoLXBpbGwgY29hY2gtcGlsbC1jdXQiIHRpdGxlPSInICsgZXNjSHRtbChjdXQucmVhc29uIHx8ICcnKSArICciPicgKyBlc2NIdG1sKGN1dC5jYXJkTmFtZSkgKyAnPC9zcGFuPic7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaHRtbCArPSAnPC9kaXY+PC9kaXY+JzsKICAgICAgICB9CgogICAgICAgIC8vIEFkZHMKICAgICAgICBpZiAoYWRkcy5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgIGh0bWwgKz0gJzxkaXYgY2xhc3M9ImNvYWNoLXNlc3Npb24tZGV0YWlsLWdyb3VwIj4nOwogICAgICAgICAgICBodG1sICs9ICc8c3BhbiBjbGFzcz0iY29hY2gtc2Vzc2lvbi1kZXRhaWwtbGFiZWwiPkFkZHM6PC9zcGFuPic7CiAgICAgICAgICAgIGh0bWwgKz0gJzxkaXYgY2xhc3M9ImNvYWNoLXNlc3Npb24tcGlsbHMiPic7CiAgICAgICAgICAgIGZvciAoY29uc3QgYWRkIG9mIGFkZHMpIHsKICAgICAgICAgICAgICAgIGh0bWwgKz0gJzxzcGFuIGNsYXNzPSJjb2FjaC1waWxsIGNvYWNoLXBpbGwtYWRkIiB0aXRsZT0iJyArIGVzY0h0bWwoYWRkLnJlYXNvbiB8fCAnJykgKyAnIj4nICsgZXNjSHRtbChhZGQuY2FyZE5hbWUpICsgJzwvc3Bhbj4nOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGh0bWwgKz0gJzwvZGl2PjwvZGl2Pic7CiAgICAgICAgfQoKICAgICAgICAvLyBMb2FkIGluIENoYXQgYnV0dG9uCiAgICAgICAgaHRtbCArPSAnPGRpdiBjbGFzcz0iY29hY2gtc2Vzc2lvbi1kZXRhaWwtYWN0aW9ucyI+JzsKICAgICAgICBodG1sICs9ICc8YnV0dG9uIGNsYXNzPSJidG4gYnRuLWdob3N0IGJ0bi1zbSBjb2FjaC1sb2FkLWNoYXQtYnRuIiBkYXRhLXNpZD0iJyArIGVzY0h0bWwoc2Vzc2lvbklkKSArICciPkxvYWQgaW4gQ2hhdDwvYnV0dG9uPic7CiAgICAgICAgaHRtbCArPSAnPGJ1dHRvbiBjbGFzcz0iYnRuIGJ0bi1naG9zdCBidG4tc20gY29hY2gtdmlldy1mdWxsLWJ0biIgZGF0YS1zaWQ9IicgKyBlc2NIdG1sKHNlc3Npb25JZCkgKyAnIj5WaWV3IEZ1bGwgUmVzdWx0czwvYnV0dG9uPic7CiAgICAgICAgaHRtbCArPSAnPC9kaXY+JzsKCiAgICAgICAgaHRtbCArPSAnPC9kaXY+JzsKICAgICAgICBkZXRhaWxFbC5pbm5lckhUTUwgPSBodG1sOwoKICAgICAgICAvLyBCaW5kIGJ1dHRvbnMKICAgICAgICBkZXRhaWxFbC5xdWVyeVNlbGVjdG9yKCcuY29hY2gtbG9hZC1jaGF0LWJ0bicpPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChlKSA9PiB7CiAgICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7CiAgICAgICAgICAgIGxvYWRTZXNzaW9uSW5DaGF0KHNlc3Npb25JZCk7CiAgICAgICAgfSk7CiAgICAgICAgZGV0YWlsRWwucXVlcnlTZWxlY3RvcignLmNvYWNoLXZpZXctZnVsbC1idG4nKT8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZSkgPT4gewogICAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpOwogICAgICAgICAgICBkaXNw' + -'bGF5U2Vzc2lvbihzZXNzaW9uQ2FjaGVbc2Vzc2lvbklkXSk7CiAgICAgICAgICAgIHJlc3VsdHNFbC5zY3JvbGxJbnRvVmlldyh7IGJlaGF2aW9yOiAnc21vb3RoJywgYmxvY2s6ICdzdGFydCcgfSk7CiAgICAgICAgfSk7CiAgICB9CgogICAgZnVuY3Rpb24gbG9hZFNlc3Npb25JbkNoYXQoc2Vzc2lvbklkKSB7CiAgICAgICAgY29uc3Qgc2Vzc2lvbiA9IHNlc3Npb25DYWNoZVtzZXNzaW9uSWRdOwogICAgICAgIGlmICghc2Vzc2lvbikgcmV0dXJuOwoKICAgICAgICBjbGVhckNoYXQoKTsKCiAgICAgICAgLy8gU2V0IGRlY2sgc2VsZWN0b3IgaWYgcG9zc2libGUKICAgICAgICBpZiAoc2Vzc2lvbi5kZWNrSWQpIHsKICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkZWNrU2VsZWN0Lm9wdGlvbnMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgIGlmIChkZWNrU2VsZWN0Lm9wdGlvbnNbaV0udmFsdWUgPT09IHNlc3Npb24uZGVja0lkKSB7CiAgICAgICAgICAgICAgICAgICAgZGVja1NlbGVjdC52YWx1ZSA9IHNlc3Npb24uZGVja0lkOwogICAgICAgICAgICAgICAgICAgIGRlY2tTZWxlY3QuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoJ2NoYW5nZScpKTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLy8gUHJlLWZpbGwgY2hhdCB3aXRoIGEgc3VtbWFyeSBjb250ZXh0CiAgICAgICAgY29uc3QgY29udGV4dE1zZyA9ICdCYXNlZCBvbiBhIHByZXZpb3VzIGNvYWNoaW5nIHNlc3Npb24gZm9yIHRoaXMgZGVjaywgaGVyZSB3YXMgdGhlIGFuYWx5c2lzOlxuXG4nICsKICAgICAgICAgICAgKHNlc3Npb24uc3VtbWFyeSB8fCAnJykgKyAnXG5cbicgKwogICAgICAgICAgICAnU3VnZ2VzdGVkIGN1dHM6ICcgKyAoc2Vzc2lvbi5zdWdnZXN0ZWRDdXRzIHx8IFtdKS5tYXAoYyA9PiBjLmNhcmROYW1lKS5qb2luKCcsICcpICsgJ1xuJyArCiAgICAgICAgICAgICdTdWdnZXN0ZWQgYWRkczogJyArIChzZXNzaW9uLnN1Z2dlc3RlZEFkZHMgfHwgW10pLm1hcChhID0+IGEuY2FyZE5hbWUpLmpvaW4oJywgJyk7CgogICAgICAgIGNoYXRIaXN0b3J5LnB1c2goeyByb2xlOiAnYXNzaXN0YW50JywgY29udGVudDogY29udGV4dE1zZyB9KTsKICAgICAgICBhcHBlbmRDaGF0QnViYmxlKCdhc3Npc3RhbnQnLCBjb250ZXh0TXNnKTsKCiAgICAgICAgY2hhdElucHV0LmZvY3VzKCk7CiAgICAgICAgc2hvd1RvYXN0KCdTZXNzaW9uIGxvYWRlZCBpbnRvIGNoYXQnLCAnc3VjY2VzcycpOwogICAgfQoKICAgIC8vIOKUgOKUgCBHZW5lcmF0ZSBSZXBvcnRzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAoKICAgIGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlUmVwb3J0cygpIHsKICAgICAgICBnZW5SZXBvcnRzQnRuLmRpc2FibGVkID0gdHJ1ZTsKICAgICAgICBnZW5SZXBvcnRzQnRuLnRleHRDb250ZW50ID0gJ0dlbmVyYXRpbmcuLi4nOwoKICAgICAgICB0cnkgewogICAgICAgICAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaChBUEkgKyAnL2FwaS9jb2FjaC9yZXBvcnRzL2dlbmVyYXRlJywgeyBtZXRob2Q6ICdQT1NUJyB9KTsKICAgICAgICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7CgogICAgICAgICAgICBpZiAoZGF0YS5jb3VudCA+IDApIHsKICAgICAgICAgICAgICAgIGdlblJlcG9ydHNCdG4udGV4dENvbnRlbnQgPSBkYXRhLmNvdW50ICsgJyByZXBvcnRzIGdlbmVyYXRlZCc7CiAgICAgICAgICAgICAgICBhd2FpdCBjaGVja1N0YXR1cygpOwogICAgICAgICAgICAgICAgYXdhaXQgbG9hZERlY2tzKCk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBnZW5SZXBvcnRzQnRuLnRleHRDb250ZW50ID0gJ05vIHJlc3VsdHMgZm91bmQnOwogICAgICAgICAgICB9CiAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICBnZW5SZXBvcnRzQnRuLnRleHRDb250ZW50ID0gJ0Vycm9yOiAnICsgZS5tZXNzYWdlOwogICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gewogICAgICAgICAgICAgICAgZ2VuUmVwb3J0c0J0bi5kaXNhYmxlZCA9IGZhbHNlOwogICAgICAgICAgICAgICAgZ2VuUmVwb3J0c0J0bi50ZXh0Q29udGVudCA9ICdSZWJ1aWxkIFJlcG9y' + -'dHMnOwogICAgICAgICAgICB9LCAzMDAwKTsKICAgICAgICB9CiAgICB9CgogICAgLy8g4pSA4pSAIFJ1biBDb2FjaCAob25lLXNob3QpIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAoKICAgIGFzeW5jIGZ1bmN0aW9uIHJ1bkNvYWNoKCkgewogICAgICAgIGNvbnN0IGRlY2tJZCA9IGRlY2tTZWxlY3QudmFsdWU7CiAgICAgICAgaWYgKCFkZWNrSWQpIHJldHVybjsKCiAgICAgICAgY29uc3QgZ29hbHMgPSBnZXRHb2FscygpOwoKICAgICAgICBydW5CdG4uZGlzYWJsZWQgPSB0cnVlOwogICAgICAgIHByb2dyZXNzRWwuc3R5bGUuZGlzcGxheSA9ICdmbGV4JzsKICAgICAgICBwcm9ncmVzc1RleHQudGV4dENvbnRlbnQgPSAnQW5hbHl6aW5nIGRlY2sgYW5kIGNvbnN1bHRpbmcgTExNLi4uIFRoaXMgbWF5IHRha2UgMzAtNjAgc2Vjb25kcy4nOwogICAgICAgIHJlc3VsdHNFbC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOwoKICAgICAgICBjb25zdCBwcmV2RXJyb3IgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuY29hY2gtZXJyb3InKTsKICAgICAgICBpZiAocHJldkVycm9yKSBwcmV2RXJyb3IucmVtb3ZlKCk7CgogICAgICAgIHRyeSB7CiAgICAgICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKEFQSSArICcvYXBpL2NvYWNoL2RlY2tzLycgKyBlbmNvZGVVUklDb21wb25lbnQoZGVja0lkKSwgewogICAgICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCcsCiAgICAgICAgICAgICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSwKICAgICAgICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgZ29hbHM6IGdvYWxzIH0pLAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIGlmICghcmVzLm9rKSB7CiAgICAgICAgICAgICAgICBjb25zdCBlcnIgPSBhd2FpdCByZXMuanNvbigpLmNhdGNoKCgpID0+ICh7IGRldGFpbDogJ1Vua25vd24gZXJyb3InIH0pKTsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihlcnIuZGV0YWlsIHx8ICdDb2FjaCByZXF1ZXN0IGZhaWxlZCAoJyArIHJlcy5zdGF0dXMgKyAnKScpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBjb25zdCBzZXNzaW9uID0gYXdhaXQgcmVzLmpzb24oKTsKICAgICAgICAgICAgY3VycmVudFNlc3Npb25JZCA9IHNlc3Npb24uc2Vzc2lvbklkIHx8IG51bGw7CiAgICAgICAgICAgIGRpc3BsYXlTZXNzaW9uKHNlc3Npb24pOwogICAgICAgICAgICBsb2FkU2Vzc2lvbnMoKTsKICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgIGNvbnN0IGVyckRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOwogICAgICAgICAgICBlcnJEaXYuY2xhc3NOYW1lID0gJ2NvYWNoLWVycm9yJzsKICAgICAgICAgICAgZXJyRGl2LnRleHRDb250ZW50ID0gJ0NvYWNoIGVycm9yOiAnICsgZS5tZXNzYWdlOwogICAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuY29hY2gtY29uZmlnJykuYXBwZW5kQ2hpbGQoZXJyRGl2KTsKICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICBydW5CdG4uZGlzYWJsZWQgPSBmYWxzZTsKICAgICAgICAgICAgcHJvZ3Jlc3NFbC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOwogICAgICAgIH0KICAgIH0KCiAgICAvLyDilIDilIAgRGlzcGxheSBTZXNzaW9uIFJlc3VsdHMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACgogICAgZnVuY3Rpb24gZGlzcGxheVNlc3Npb24oc2Vzc2lvbikgewogICAgICAgIHJlc3VsdHNFbC5zdHlsZS5kaXNwbGF5ID0gJ2ZsZXgnOwogICAgICAgIGN1cnJlbnRTZXNzaW9uSWQgPSBzZXNzaW9uLnNlc3Npb25JZCB8fCBjdXJyZW50U2Vzc2lvbklkOwoKICAgICAgICBzdW1tYXJ5VGV4dC50ZXh0Q29udGVudCA9IHNlc3Npb24uc3VtbWFyeSB8fCAnKE5vIHN1bW1hcnkgcHJvdmlkZWQpJzsKCiAgICAgICAgbWV0YVJvdy5pbm5lckhUTUwgPSAnJzsKICAgICAgICBpZiAoc2Vzc2lvbi5tb2RlbFVzZWQpIGFkZE1ldGFDaGlwKCdNb2RlbCcsIHNlc3Npb24ubW9kZWxVc2VkKTsKICAgICAgICBpZiAoc2Vzc2lvbi5wcm9tcHRUb2tlbnMpIGFkZE1ldGFDaGlwKCdQcm9tcHQnLCBzZXNzaW9uLnByb21wdFRva2Vucy50b0xvY2FsZVN0cmlu' + -'ZygpICsgJyB0b2tlbnMnKTsKICAgICAgICBpZiAoc2Vzc2lvbi5jb21wbGV0aW9uVG9rZW5zKSBhZGRNZXRhQ2hpcCgnQ29tcGxldGlvbicsIHNlc3Npb24uY29tcGxldGlvblRva2Vucy50b0xvY2FsZVN0cmluZygpICsgJyB0b2tlbnMnKTsKICAgICAgICBpZiAoc2Vzc2lvbi5kZWNrSWQpIGFkZE1ldGFDaGlwKCdEZWNrJywgc2Vzc2lvbi5kZWNrSWQpOwogICAgICAgIGlmIChzZXNzaW9uLnRpbWVzdGFtcCkgYWRkTWV0YUNoaXAoJ1RpbWUnLCBmb3JtYXRUaW1lKHNlc3Npb24udGltZXN0YW1wKSk7CgogICAgICAgIC8vIEN1dHMgdGFibGUKICAgICAgICBjb25zdCBjdXRzID0gc2Vzc2lvbi5zdWdnZXN0ZWRDdXRzIHx8IFtdOwogICAgICAgIGN1dHNDb3VudC50ZXh0Q29udGVudCA9IGN1dHMubGVuZ3RoOwogICAgICAgIGN1dHNCb2R5LmlubmVySFRNTCA9ICcnOwogICAgICAgIGN1dHNBbGxDaGVjay5jaGVja2VkID0gZmFsc2U7CgogICAgICAgIGZvciAoY29uc3QgY3V0IG9mIGN1dHMpIHsKICAgICAgICAgICAgY29uc3QgdHIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0cicpOwogICAgICAgICAgICB0ci5pbm5lckhUTUwgPQogICAgICAgICAgICAgICAgJzx0ZD48aW5wdXQgdHlwZT0iY2hlY2tib3giIGRhdGEtY2FyZD0iJyArIGVzY0h0bWwoY3V0LmNhcmROYW1lKSArICciIC8+PC90ZD4nICsKICAgICAgICAgICAgICAgICc8dGQ+PHNwYW4gY2xhc3M9ImNvYWNoLWNhcmQtbmFtZSI+JyArIGVzY0h0bWwoY3V0LmNhcmROYW1lKSArICc8L3NwYW4+PC90ZD4nICsKICAgICAgICAgICAgICAgICc8dGQ+JyArIGVzY0h0bWwoY3V0LnJlYXNvbikgKyAnPC90ZD4nICsKICAgICAgICAgICAgICAgICc8dGQ+PGRpdiBjbGFzcz0iY29hY2gtcmVwbGFjZW1lbnRzIj4nICsKICAgICAgICAgICAgICAgICAgICAoY3V0LnJlcGxhY2VtZW50T3B0aW9ucyB8fCBbXSkubWFwKHIgPT4KICAgICAgICAgICAgICAgICAgICAgICAgJzxzcGFuIGNsYXNzPSJjb2FjaC1yZXBsYWNlbWVudC1jaGlwIj4nICsgZXNjSHRtbChyKSArICc8L3NwYW4+JwogICAgICAgICAgICAgICAgICAgICkuam9pbignJykgKwogICAgICAgICAgICAgICAgJzwvZGl2PjwvdGQ+JyArCiAgICAgICAgICAgICAgICAnPHRkPicgKyBmb3JtYXRJbXBhY3QoY3V0LmN1cnJlbnRJbXBhY3RTY29yZSkgKyAnPC90ZD4nOwogICAgICAgICAgICBjdXRzQm9keS5hcHBlbmRDaGlsZCh0cik7CiAgICAgICAgfQoKICAgICAgICAvLyBBZGRzIHRhYmxlCiAgICAgICAgY29uc3QgYWRkcyA9IHNlc3Npb24uc3VnZ2VzdGVkQWRkcyB8fCBbXTsKICAgICAgICBhZGRzQ291bnQudGV4dENvbnRlbnQgPSBhZGRzLmxlbmd0aDsKICAgICAgICBhZGRzQm9keS5pbm5lckhUTUwgPSAnJzsKICAgICAgICBhZGRzQWxsQ2hlY2suY2hlY2tlZCA9IGZhbHNlOwoKICAgICAgICBmb3IgKGNvbnN0IGFkZCBvZiBhZGRzKSB7CiAgICAgICAgICAgIGNvbnN0IHRyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndHInKTsKICAgICAgICAgICAgdHIuaW5uZXJIVE1MID0KICAgICAgICAgICAgICAgICc8dGQ+PGlucHV0IHR5cGU9ImNoZWNrYm94IiBkYXRhLWNhcmQ9IicgKyBlc2NIdG1sKGFkZC5jYXJkTmFtZSkgKyAnIiAvPjwvdGQ+JyArCiAgICAgICAgICAgICAgICAnPHRkPjxzcGFuIGNsYXNzPSJjb2FjaC1jYXJkLW5hbWUiPicgKyBlc2NIdG1sKGFkZC5jYXJkTmFtZSkgKyAnPC9zcGFuPjwvdGQ+JyArCiAgICAgICAgICAgICAgICAnPHRkPicgKyAoYWRkLnJvbGUgPyAnPHNwYW4gY2xhc3M9ImNvYWNoLXJvbGUtYmFkZ2UiPicgKyBlc2NIdG1sKGFkZC5yb2xlKSArICc8L3NwYW4+JyA6ICcnKSArICc8L3RkPicgKwogICAgICAgICAgICAgICAgJzx0ZD4nICsgZXNjSHRtbChhZGQucmVhc29uKSArICc8L3RkPicgKwogICAgICAgICAgICAgICAgJzx0ZD48ZGl2IGNsYXNzPSJjb2FjaC1yZXBsYWNlbWVudHMiPicgKwogICAgICAgICAgICAgICAgICAgIChhZGQuc3luZXJneVdpdGggfHwgW10pLm1hcChzID0+CiAgICAgICAgICAgICAgICAgICAgICAgICc8c3BhbiBjbGFzcz0iY29hY2gtc3luZXJneS1jaGlwIj4nICsgZXNjSHRtbChzKSArICc8L3NwYW4+JwogICAgICAgICAgICAgICAgICAgICkuam9pbignJykgKwogICAgICAgICAgICAgICAgJzwvZGl2PjwvdGQ+JzsKICAgICAgICAgICAgYWRkc0JvZHkuYXBwZW5kQ2hpbGQodHIpOwogICAgICAgIH0KCiAgICAgICAgLy8gSGludHMKICAgICAgICBjb25zdCBoaW50' + -'cyA9IHNlc3Npb24uaGV1cmlzdGljSGludHMgfHwgW107CiAgICAgICAgaWYgKGhpbnRzLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgaGludHNDYXJkLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snOwogICAgICAgICAgICBoaW50c0xpc3QuaW5uZXJIVE1MID0gJyc7CiAgICAgICAgICAgIGZvciAoY29uc3QgaGludCBvZiBoaW50cykgewogICAgICAgICAgICAgICAgY29uc3QgbGkgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdsaScpOwogICAgICAgICAgICAgICAgbGkudGV4dENvbnRlbnQgPSBoaW50OwogICAgICAgICAgICAgICAgaGludHNMaXN0LmFwcGVuZENoaWxkKGxpKTsKICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGhpbnRzQ2FyZC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOwogICAgICAgIH0KCiAgICAgICAgLy8gTWFuYSBhZHZpY2UKICAgICAgICBpZiAoc2Vzc2lvbi5tYW5hQmFzZUFkdmljZSkgewogICAgICAgICAgICBtYW5hQ2FyZC5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJzsKICAgICAgICAgICAgbWFuYVRleHQudGV4dENvbnRlbnQgPSBzZXNzaW9uLm1hbmFCYXNlQWR2aWNlOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIG1hbmFDYXJkLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7CiAgICAgICAgfQoKICAgICAgICAvLyBSYXcgdGV4dAogICAgICAgIHJhd1RleHQudGV4dENvbnRlbnQgPSBzZXNzaW9uLnJhd1RleHRFeHBsYW5hdGlvbiB8fCBzZXNzaW9uLnN1bW1hcnkgfHwgJyhlbXB0eSknOwoKICAgICAgICB1cGRhdGVBcHBseUNvdW50KCk7CiAgICB9CgogICAgLy8g4pSA4pSAIEFwcGx5IFN1Z2dlc3Rpb25zIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAoKICAgIGZ1bmN0aW9uIHVwZGF0ZUFwcGx5Q291bnQoKSB7CiAgICAgICAgY29uc3QgY3V0Q2hlY2tlZCA9IGN1dHNCb2R5LnF1ZXJ5U2VsZWN0b3JBbGwoJ2lucHV0W3R5cGU9ImNoZWNrYm94Il06Y2hlY2tlZCcpOwogICAgICAgIGNvbnN0IGFkZENoZWNrZWQgPSBhZGRzQm9keS5xdWVyeVNlbGVjdG9yQWxsKCdpbnB1dFt0eXBlPSJjaGVja2JveCJdOmNoZWNrZWQnKTsKICAgICAgICBjb25zdCB0b3RhbCA9IGN1dENoZWNrZWQubGVuZ3RoICsgYWRkQ2hlY2tlZC5sZW5ndGg7CgogICAgICAgIGFwcGx5Q291bnRFbC50ZXh0Q29udGVudCA9IGN1dENoZWNrZWQubGVuZ3RoICsgJyBjdXRzLCAnICsgYWRkQ2hlY2tlZC5sZW5ndGggKyAnIGFkZHMgc2VsZWN0ZWQnOwogICAgICAgIGFwcGx5QnRuLmRpc2FibGVkID0gdG90YWwgPT09IDAgfHwgIWFwcGx5RGVja1NlbGVjdC52YWx1ZTsKICAgIH0KCiAgICBhcHBseURlY2tTZWxlY3QuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgdXBkYXRlQXBwbHlDb3VudCk7CgogICAgYXN5bmMgZnVuY3Rpb24gYXBwbHlTdWdnZXN0aW9ucygpIHsKICAgICAgICBjb25zdCBkZWNrSWQgPSBwYXJzZUludChhcHBseURlY2tTZWxlY3QudmFsdWUpOwogICAgICAgIGlmICghZGVja0lkKSB7CiAgICAgICAgICAgIHNob3dUb2FzdCgnU2VsZWN0IGEgZGVjayB0byBhcHBseSBzdWdnZXN0aW9ucyB0bycsICd3YXJuaW5nJyk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIGNvbnN0IGFjY2VwdGVkQ3V0cyA9IFtdOwogICAgICAgIGN1dHNCb2R5LnF1ZXJ5U2VsZWN0b3JBbGwoJ2lucHV0W3R5cGU9ImNoZWNrYm94Il06Y2hlY2tlZCcpLmZvckVhY2goY2IgPT4gewogICAgICAgICAgICBjb25zdCBuYW1lID0gY2IuZGF0YXNldC5jYXJkOwogICAgICAgICAgICBpZiAobmFtZSkgYWNjZXB0ZWRDdXRzLnB1c2gobmFtZSk7CiAgICAgICAgfSk7CgogICAgICAgIGNvbnN0IGFjY2VwdGVkQWRkcyA9IFtdOwogICAgICAgIGFkZHNCb2R5LnF1ZXJ5U2VsZWN0b3JBbGwoJ2lucHV0W3R5cGU9ImNoZWNrYm94Il06Y2hlY2tlZCcpLmZvckVhY2goY2IgPT4gewogICAgICAgICAgICBjb25zdCBuYW1lID0gY2IuZGF0YXNldC5jYXJkOwogICAgICAgICAgICBpZiAobmFtZSkgYWNjZXB0ZWRBZGRzLnB1c2gobmFtZSk7CiAgICAgICAgfSk7CgogICAgICAgIGlmIChhY2NlcHRlZEN1dHMubGVuZ3RoID09PSAwICYmIGFjY2VwdGVkQWRkcy5sZW5ndGggPT09IDApIHsKICAgICAgICAgICAgc2hvd1RvYXN0KCdObyBzdWdnZXN0aW9ucyBzZWxlY3RlZCcsICd3YXJuaW5n' + -'Jyk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIGFwcGx5QnRuLmRpc2FibGVkID0gdHJ1ZTsKICAgICAgICBhcHBseUJ0bi50ZXh0Q29udGVudCA9ICdBcHBseWluZy4uLic7CgogICAgICAgIHRyeSB7CiAgICAgICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKEFQSSArICcvYXBpL2NvYWNoL2FwcGx5JywgewogICAgICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCcsCiAgICAgICAgICAgICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSwKICAgICAgICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsKICAgICAgICAgICAgICAgICAgICBzZXNzaW9uX2lkOiBjdXJyZW50U2Vzc2lvbklkIHx8ICdtYW51YWwnLAogICAgICAgICAgICAgICAgICAgIGRlY2tfaWQ6IGRlY2tJZCwKICAgICAgICAgICAgICAgICAgICBhY2NlcHRlZF9jdXRzOiBhY2NlcHRlZEN1dHMsCiAgICAgICAgICAgICAgICAgICAgYWNjZXB0ZWRfYWRkczogYWNjZXB0ZWRBZGRzLAogICAgICAgICAgICAgICAgfSksCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgaWYgKCFyZXMub2spIHsKICAgICAgICAgICAgICAgIGNvbnN0IGVyciA9IGF3YWl0IHJlcy5qc29uKCkuY2F0Y2goKCkgPT4gKHsgZGV0YWlsOiAnQXBwbHkgZmFpbGVkJyB9KSk7CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoZXJyLmRldGFpbCB8fCAnQXBwbHkgZmFpbGVkJyk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJlcy5qc29uKCk7CiAgICAgICAgICAgIGNvbnN0IG1zZyA9ICdBcHBsaWVkOiAnICsgcmVzdWx0LnRvdGFsX2N1dHMgKyAnIGN1dHMsICcgKyByZXN1bHQudG90YWxfYWRkcyArICcgYWRkcycgKwogICAgICAgICAgICAgICAgKHJlc3VsdC5lcnJvcnMubGVuZ3RoID4gMCA/ICcgKCcgKyByZXN1bHQuZXJyb3JzLmxlbmd0aCArICcgZXJyb3JzKScgOiAnJyk7CiAgICAgICAgICAgIHNob3dUb2FzdChtc2csIHJlc3VsdC5lcnJvcnMubGVuZ3RoID4gMCA/ICd3YXJuaW5nJyA6ICdzdWNjZXNzJyk7CgogICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgc2hvd1RvYXN0KCdBcHBseSBlcnJvcjogJyArIGUubWVzc2FnZSwgJ2Vycm9yJyk7CiAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgYXBwbHlCdG4uZGlzYWJsZWQgPSBmYWxzZTsKICAgICAgICAgICAgYXBwbHlCdG4udGV4dENvbnRlbnQgPSAnQXBwbHkgU3VnZ2VzdGlvbnMnOwogICAgICAgICAgICB1cGRhdGVBcHBseUNvdW50KCk7CiAgICAgICAgfQogICAgfQoKICAgIC8vIOKUgOKUgCBNdWx0aS10dXJuIENoYXQg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACgogICAgYXN5bmMgZnVuY3Rpb24gc2VuZENoYXRNZXNzYWdlKCkgewogICAgICAgIGNvbnN0IHRleHQgPSBjaGF0SW5wdXQudmFsdWUudHJpbSgpOwogICAgICAgIGlmICghdGV4dCB8fCAhZGVja1NlbGVjdC52YWx1ZSB8fCBpc1N0cmVhbWluZykgcmV0dXJuOwoKICAgICAgICAvLyBBZGQgdXNlciBtZXNzYWdlCiAgICAgICAgY2hhdEhpc3RvcnkucHVzaCh7IHJvbGU6ICd1c2VyJywgY29udGVudDogdGV4dCB9KTsKICAgICAgICBhcHBlbmRDaGF0QnViYmxlKCd1c2VyJywgdGV4dCk7CiAgICAgICAgY2hhdElucHV0LnZhbHVlID0gJyc7CiAgICAgICAgY2hhdFNlbmRCdG4uZGlzYWJsZWQgPSB0cnVlOwoKICAgICAgICAvLyBTaG93IHR5cGluZyBpbmRpY2F0b3IKICAgICAgICBjb25zdCB0eXBpbmdFbCA9IHNob3dUeXBpbmdJbmRpY2F0b3IoKTsKICAgICAgICBpc1N0cmVhbWluZyA9IHRydWU7CgogICAgICAgIHRyeSB7CiAgICAgICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKEFQSSArICcvYXBpL2NvYWNoL2NoYXQnLCB7CiAgICAgICAgICAgICAgICBtZXRob2Q6ICdQT1NUJywKICAgICAgICAgICAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LAogICAgICAgICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoewogICAgICAgICAgICAgICAgICAgIGRlY2tfaWQ6IGRlY2tTZWxlY3QudmFsdWUsCiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZXM6IGNoYXRIaXN0b3J5LAogICAgICAgICAgICAgICAgICAgIGdvYWxzOiBnZXRH' + -'b2FscygpLAogICAgICAgICAgICAgICAgICAgIHN0cmVhbTogdHJ1ZSwKICAgICAgICAgICAgICAgIH0pLAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIGlmICghcmVzLm9rKSB7CiAgICAgICAgICAgICAgICBjb25zdCBlcnIgPSBhd2FpdCByZXMuanNvbigpLmNhdGNoKCgpID0+ICh7IGRldGFpbDogJ0NoYXQgZmFpbGVkJyB9KSk7CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoZXJyLmRldGFpbCB8fCAnQ2hhdCBmYWlsZWQgKCcgKyByZXMuc3RhdHVzICsgJyknKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gUmVtb3ZlIHR5cGluZyBpbmRpY2F0b3IsIGFkZCBhc3Npc3RhbnQgYnViYmxlCiAgICAgICAgICAgIHR5cGluZ0VsLnJlbW92ZSgpOwogICAgICAgICAgICBjb25zdCBidWJibGVFbCA9IGFwcGVuZENoYXRCdWJibGUoJ2Fzc2lzdGFudCcsICcnKTsKICAgICAgICAgICAgY29uc3QgY29udGVudEVsID0gYnViYmxlRWwucXVlcnlTZWxlY3RvcignLmNvYWNoLWNoYXQtYnViYmxlLWNvbnRlbnQnKTsKCiAgICAgICAgICAgIGxldCBmdWxsQ29udGVudCA9ICcnOwoKICAgICAgICAgICAgLy8gUmVhZCBTU0Ugc3RyZWFtCiAgICAgICAgICAgIGNvbnN0IHJlYWRlciA9IHJlcy5ib2R5LmdldFJlYWRlcigpOwogICAgICAgICAgICBjb25zdCBkZWNvZGVyID0gbmV3IFRleHREZWNvZGVyKCk7CiAgICAgICAgICAgIGxldCBidWZmZXIgPSAnJzsKCiAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7CiAgICAgICAgICAgICAgICBjb25zdCB7IGRvbmUsIHZhbHVlIH0gPSBhd2FpdCByZWFkZXIucmVhZCgpOwogICAgICAgICAgICAgICAgaWYgKGRvbmUpIGJyZWFrOwoKICAgICAgICAgICAgICAgIGJ1ZmZlciArPSBkZWNvZGVyLmRlY29kZSh2YWx1ZSwgeyBzdHJlYW06IHRydWUgfSk7CiAgICAgICAgICAgICAgICBjb25zdCBsaW5lcyA9IGJ1ZmZlci5zcGxpdCgnXG4nKTsKICAgICAgICAgICAgICAgIGJ1ZmZlciA9IGxpbmVzLnBvcCgpIHx8ICcnOwoKICAgICAgICAgICAgICAgIGZvciAoY29uc3QgbGluZSBvZiBsaW5lcykgewogICAgICAgICAgICAgICAgICAgIGNvbnN0IHRyaW1tZWQgPSBsaW5lLnRyaW0oKTsKICAgICAgICAgICAgICAgICAgICBpZiAoIXRyaW1tZWQuc3RhcnRzV2l0aCgnZGF0YTogJykpIGNvbnRpbnVlOwoKICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXlsb2FkID0gdHJpbW1lZC5zbGljZSg2KTsKICAgICAgICAgICAgICAgICAgICBpZiAocGF5bG9hZCA9PT0gJ1tET05FXScpIGJyZWFrOwoKICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaHVuayA9IEpTT04ucGFyc2UocGF5bG9hZCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaHVuay5jb250ZW50KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdWxsQ29udGVudCArPSBjaHVuay5jb250ZW50OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudEVsLmlubmVySFRNTCA9IGZvcm1hdE1hcmtkb3duKGZ1bGxDb250ZW50KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjcm9sbENoYXRUb0JvdHRvbSgpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBza2lwIG1hbGZvcm1lZCBjaHVua3MKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIEZpbmFsaXplCiAgICAgICAgICAgIGNoYXRIaXN0b3J5LnB1c2goeyByb2xlOiAnYXNzaXN0YW50JywgY29udGVudDogZnVsbENvbnRlbnQgfSk7CiAgICAgICAgICAgIGNvbnRlbnRFbC5pbm5lckhUTUwgPSBmb3JtYXRNYXJrZG93bihmdWxsQ29udGVudCk7CiAgICAgICAgICAgIHNjcm9sbENoYXRUb0JvdHRvbSgpOwoKICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgIHR5cGluZ0VsLnJlbW92ZSgpOwogICAgICAgICAgICBhcHBlbmRDaGF0QnViYmxlKCdzeXN0ZW0nLCAnRXJyb3I6ICcgKyBlLm1lc3NhZ2UpOwogICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgIGlzU3RyZWFtaW5nID0gZmFsc2U7CiAgICAgICAgICAgIGNoYXRTZW5kQnRuLmRpc2FibGVkID0gIWNoYXRJbnB1dC52YWx1ZS50cmltKCkgfHwgIWRlY2tTZWxlY3QudmFsdWU7CiAgICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIGFwcGVuZENoYXRCdWJibGUo' + -'cm9sZSwgY29udGVudCkgewogICAgICAgIC8vIFJlbW92ZSB3ZWxjb21lIG1lc3NhZ2UKICAgICAgICBjb25zdCB3ZWxjb21lID0gY2hhdE1lc3NhZ2VzLnF1ZXJ5U2VsZWN0b3IoJy5jb2FjaC1jaGF0LXdlbGNvbWUnKTsKICAgICAgICBpZiAod2VsY29tZSkgd2VsY29tZS5yZW1vdmUoKTsKCiAgICAgICAgY29uc3QgYnViYmxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CiAgICAgICAgYnViYmxlLmNsYXNzTmFtZSA9ICdjb2FjaC1jaGF0LWJ1YmJsZSBjb2FjaC1jaGF0LScgKyByb2xlOwoKICAgICAgICBjb25zdCBsYWJlbCA9IHJvbGUgPT09ICd1c2VyJyA/ICdZb3UnIDogcm9sZSA9PT0gJ2Fzc2lzdGFudCcgPyAnQ29hY2gnIDogJ1N5c3RlbSc7CiAgICAgICAgYnViYmxlLmlubmVySFRNTCA9CiAgICAgICAgICAgICc8ZGl2IGNsYXNzPSJjb2FjaC1jaGF0LWJ1YmJsZS1sYWJlbCI+JyArIGxhYmVsICsgJzwvZGl2PicgKwogICAgICAgICAgICAnPGRpdiBjbGFzcz0iY29hY2gtY2hhdC1idWJibGUtY29udGVudCI+JyArIChjb250ZW50ID8gZm9ybWF0TWFya2Rvd24oY29udGVudCkgOiAnJykgKyAnPC9kaXY+JzsKCiAgICAgICAgY2hhdE1lc3NhZ2VzLmFwcGVuZENoaWxkKGJ1YmJsZSk7CiAgICAgICAgc2Nyb2xsQ2hhdFRvQm90dG9tKCk7CiAgICAgICAgcmV0dXJuIGJ1YmJsZTsKICAgIH0KCiAgICBmdW5jdGlvbiBzaG93VHlwaW5nSW5kaWNhdG9yKCkgewogICAgICAgIGNvbnN0IGVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CiAgICAgICAgZWwuY2xhc3NOYW1lID0gJ2NvYWNoLWNoYXQtdHlwaW5nJzsKICAgICAgICBlbC5pbm5lckhUTUwgPQogICAgICAgICAgICAnPGRpdiBjbGFzcz0iY29hY2gtY2hhdC1idWJibGUtbGFiZWwiPkNvYWNoPC9kaXY+JyArCiAgICAgICAgICAgICc8ZGl2IGNsYXNzPSJjb2FjaC10eXBpbmctZG90cyI+PHNwYW4+PC9zcGFuPjxzcGFuPjwvc3Bhbj48c3Bhbj48L3NwYW4+PC9kaXY+JzsKICAgICAgICBjaGF0TWVzc2FnZXMuYXBwZW5kQ2hpbGQoZWwpOwogICAgICAgIHNjcm9sbENoYXRUb0JvdHRvbSgpOwogICAgICAgIHJldHVybiBlbDsKICAgIH0KCiAgICBmdW5jdGlvbiBzY3JvbGxDaGF0VG9Cb3R0b20oKSB7CiAgICAgICAgY2hhdE1lc3NhZ2VzLnNjcm9sbFRvcCA9IGNoYXRNZXNzYWdlcy5zY3JvbGxIZWlnaHQ7CiAgICB9CgogICAgZnVuY3Rpb24gY2xlYXJDaGF0KCkgewogICAgICAgIGNoYXRIaXN0b3J5ID0gW107CiAgICAgICAgY2hhdE1lc3NhZ2VzLmlubmVySFRNTCA9CiAgICAgICAgICAgICc8ZGl2IGNsYXNzPSJjb2FjaC1jaGF0LXdlbGNvbWUiPicgKwogICAgICAgICAgICAgICAgJzxkaXYgY2xhc3M9ImNvYWNoLWNoYXQtd2VsY29tZS1pY29uIj4mIzEyOTMwMjs8L2Rpdj4nICsKICAgICAgICAgICAgICAgICc8cD5TZWxlY3QgYSBkZWNrIGFib3ZlIGFuZCBhc2sgbWUgYW55dGhpbmcgYWJvdXQgeW91ciBzdHJhdGVneSwgY2FyZCBjaG9pY2VzLCBvciB1cGdyYWRlcy48L3A+JyArCiAgICAgICAgICAgICc8L2Rpdj4nOwogICAgfQoKICAgIGZ1bmN0aW9uIGZvcm1hdE1hcmtkb3duKHRleHQpIHsKICAgICAgICBpZiAoIXRleHQpIHJldHVybiAnJzsKICAgICAgICAvLyBCYXNpYyBtYXJrZG93bjogYm9sZCwgaXRhbGljLCBjb2RlLCBsaW5lIGJyZWFrcwogICAgICAgIHJldHVybiBlc2NIdG1sKHRleHQpCiAgICAgICAgICAgIC5yZXBsYWNlKC9cKlwqKC4rPylcKlwqL2csICc8c3Ryb25nPiQxPC9zdHJvbmc+JykKICAgICAgICAgICAgLnJlcGxhY2UoL1wqKC4rPylcKi9nLCAnPGVtPiQxPC9lbT4nKQogICAgICAgICAgICAucmVwbGFjZSgvYChbXmBdKylgL2csICc8Y29kZT4kMTwvY29kZT4nKQogICAgICAgICAgICAucmVwbGFjZSgvXG4vZywgJzxicj4nKTsKICAgIH0KCiAgICAvLyDilIDilIAgQ2FyZHMtTGlrZSBTZWFyY2gg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACgogICAgYXN5bmMgZnVuY3Rpb24gc2VhcmNoQ2FyZHNMaWtlKCkgewogICAgICAgIGNvbnN0IGNhcmQgPSBjYXJkc2xpa2VJbnB1dC52YWx1ZS50cmltKCk7CiAgICAgICAgaWYgKCFjYXJkKSByZXR1cm47CgogICAgICAgIGNvbnN0IGFjdGl2ZUNvbG9ycyA9IFtdOwogICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5jb2FjaC1jYXJk' + -'c2xpa2UtY29sb3JzIC5jb2FjaC1jb2xvci1waXAuYWN0aXZlJykuZm9yRWFjaChidG4gPT4gewogICAgICAgICAgICBhY3RpdmVDb2xvcnMucHVzaChidG4uZGF0YXNldC5jb2xvcik7CiAgICAgICAgfSk7CgogICAgICAgIGNvbnN0IHRvcE4gPSBwYXJzZUludChjYXJkc2xpa2VUb3BuLnZhbHVlKSB8fCAxMDsKCiAgICAgICAgY2FyZHNsaWtlUmVzdWx0cy5pbm5lckhUTUwgPSAnPGRpdiBjbGFzcz0iY29hY2gtY2FyZHNsaWtlLWxvYWRpbmciPjxkaXYgY2xhc3M9InNwaW5uZXIiPjwvZGl2PiBTZWFyY2hpbmcgZW1iZWRkaW5ncy4uLjwvZGl2Pic7CgogICAgICAgIHRyeSB7CiAgICAgICAgICAgIGxldCB1cmwgPSBBUEkgKyAnL2FwaS9jb2FjaC9jYXJkcy1saWtlP2NhcmQ9JyArIGVuY29kZVVSSUNvbXBvbmVudChjYXJkKSArICcmdG9wX249JyArIHRvcE47CiAgICAgICAgICAgIGlmIChhY3RpdmVDb2xvcnMubGVuZ3RoID4gMCkgewogICAgICAgICAgICAgICAgdXJsICs9ICcmY29sb3JzPScgKyBhY3RpdmVDb2xvcnMuam9pbignJyk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKHVybCk7CiAgICAgICAgICAgIGlmICghcmVzLm9rKSB7CiAgICAgICAgICAgICAgICBjb25zdCBlcnIgPSBhd2FpdCByZXMuanNvbigpLmNhdGNoKCgpID0+ICh7IGRldGFpbDogJ1NlYXJjaCBmYWlsZWQnIH0pKTsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihlcnIuZGV0YWlsIHx8ICdTZWFyY2ggZmFpbGVkJyk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpOwogICAgICAgICAgICBjb25zdCByZXN1bHRzID0gZGF0YS5yZXN1bHRzIHx8IFtdOwoKICAgICAgICAgICAgaWYgKHJlc3VsdHMubGVuZ3RoID09PSAwKSB7CiAgICAgICAgICAgICAgICBjYXJkc2xpa2VSZXN1bHRzLmlubmVySFRNTCA9ICc8ZGl2IGNsYXNzPSJjb2FjaC1jYXJkc2xpa2UtZW1wdHkiPk5vIHNpbWlsYXIgY2FyZHMgZm91bmQ8L2Rpdj4nOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CgogICAgICAgICAgICBjYXJkc2xpa2VSZXN1bHRzLmlubmVySFRNTCA9ICcnOwogICAgICAgICAgICBmb3IgKGNvbnN0IGNhcmQgb2YgcmVzdWx0cykgewogICAgICAgICAgICAgICAgY29uc3QgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CiAgICAgICAgICAgICAgICBkaXYuY2xhc3NOYW1lID0gJ2NvYWNoLWNhcmRzbGlrZS1jYXJkJzsKCiAgICAgICAgICAgICAgICBjb25zdCBzaW1QY3QgPSBNYXRoLnJvdW5kKGNhcmQuc2ltaWxhcml0eSAqIDEwMCk7CiAgICAgICAgICAgICAgICBjb25zdCBvd25lZEJhZGdlID0gY2FyZC5vd25lZF9xdHkgPiAwCiAgICAgICAgICAgICAgICAgICAgPyAnPHNwYW4gY2xhc3M9ImNvYWNoLWNsLW93bmVkIj4nICsgY2FyZC5vd25lZF9xdHkgKyAnIG93bmVkPC9zcGFuPicKICAgICAgICAgICAgICAgICAgICA6ICc8c3BhbiBjbGFzcz0iY29hY2gtY2wtdW5vd25lZCI+bm90IG93bmVkPC9zcGFuPic7CiAgICAgICAgICAgICAgICBjb25zdCBwcmljZSA9IGNhcmQudGNnX3ByaWNlID8gJyQnICsgTnVtYmVyKGNhcmQudGNnX3ByaWNlKS50b0ZpeGVkKDIpIDogJyc7CgogICAgICAgICAgICAgICAgZGl2LmlubmVySFRNTCA9CiAgICAgICAgICAgICAgICAgICAgJzxkaXYgY2xhc3M9ImNvYWNoLWNsLXRvcCI+JyArCiAgICAgICAgICAgICAgICAgICAgICAgICc8c3BhbiBjbGFzcz0iY29hY2gtY2wtbmFtZSI+JyArIGVzY0h0bWwoY2FyZC5uYW1lKSArICc8L3NwYW4+JyArCiAgICAgICAgICAgICAgICAgICAgICAgICc8c3BhbiBjbGFzcz0iY29hY2gtY2wtc2ltIj4nICsgc2ltUGN0ICsgJyU8L3NwYW4+JyArCiAgICAgICAgICAgICAgICAgICAgJzwvZGl2PicgKwogICAgICAgICAgICAgICAgICAgICc8ZGl2IGNsYXNzPSJjb2FjaC1jbC1tZXRhIj4nICsKICAgICAgICAgICAgICAgICAgICAgICAgJzxzcGFuIGNsYXNzPSJjb2FjaC1jbC10eXBlIj4nICsgZXNjSHRtbChjYXJkLnR5cGVzIHx8ICcnKSArICc8L3NwYW4+JyArCiAgICAgICAgICAgICAgICAgICAgICAgIChjYXJkLm1hbmFfY29zdCA/ICc8c3BhbiBjbGFzcz0iY29hY2gtY2wtbWFuYSI+JyArIGVzY0h0bWwoY2FyZC5tYW5hX2Nvc3QpICsgJzwvc3Bhbj4nIDogJycpICsKICAgICAgICAgICAgICAgICAgICAgICAgb3duZWRCYWRnZSArCiAgICAgICAgICAgICAg' + -'ICAgICAgICAgIChwcmljZSA/ICc8c3BhbiBjbGFzcz0iY29hY2gtY2wtcHJpY2UiPicgKyBwcmljZSArICc8L3NwYW4+JyA6ICcnKSArCiAgICAgICAgICAgICAgICAgICAgJzwvZGl2PicgKwogICAgICAgICAgICAgICAgICAgIChjYXJkLnRleHQgPyAnPGRpdiBjbGFzcz0iY29hY2gtY2wtdGV4dCI+JyArIGVzY0h0bWwoY2FyZC50ZXh0KSArICc8L2Rpdj4nIDogJycpICsKICAgICAgICAgICAgICAgICAgICAnPGRpdiBjbGFzcz0iY29hY2gtY2wtYWN0aW9ucyI+JyArCiAgICAgICAgICAgICAgICAgICAgICAgICc8YnV0dG9uIGNsYXNzPSJidG4gYnRuLWdob3N0IGJ0bi14cyBjb2FjaC1jbC1jaGF0LWJ0biI+QWRkIHRvIENoYXQ8L2J1dHRvbj4nICsKICAgICAgICAgICAgICAgICAgICAnPC9kaXY+JzsKCiAgICAgICAgICAgICAgICBkaXYucXVlcnlTZWxlY3RvcignLmNvYWNoLWNsLWNoYXQtYnRuJykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgY2hhdElucHV0LnZhbHVlICs9IChjaGF0SW5wdXQudmFsdWUgPyAnICcgOiAnJykgKyBjYXJkLm5hbWU7CiAgICAgICAgICAgICAgICAgICAgY2hhdElucHV0LmZvY3VzKCk7CiAgICAgICAgICAgICAgICAgICAgc2hvd1RvYXN0KGNhcmQubmFtZSArICcgYWRkZWQgdG8gY2hhdCBpbnB1dCcsICdzdWNjZXNzJyk7CiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICBjYXJkc2xpa2VSZXN1bHRzLmFwcGVuZENoaWxkKGRpdik7CiAgICAgICAgICAgIH0KICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgIGNhcmRzbGlrZVJlc3VsdHMuaW5uZXJIVE1MID0gJzxkaXYgY2xhc3M9ImNvYWNoLWNhcmRzbGlrZS1lbXB0eSI+RXJyb3I6ICcgKyBlc2NIdG1sKGUubWVzc2FnZSkgKyAnPC9kaXY+JzsKICAgICAgICB9CiAgICB9CgogICAgLy8gQ29sb3IgcGlwIHRvZ2dsZQogICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmNvYWNoLWNhcmRzbGlrZS1jb2xvcnMgLmNvYWNoLWNvbG9yLXBpcCcpLmZvckVhY2goYnRuID0+IHsKICAgICAgICBidG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiBidG4uY2xhc3NMaXN0LnRvZ2dsZSgnYWN0aXZlJykpOwogICAgfSk7CgogICAgLy8g4pSA4pSAIFRvYXN0IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAoKICAgIGZ1bmN0aW9uIHNob3dUb2FzdChtZXNzYWdlLCB0eXBlKSB7CiAgICAgICAgY29uc3QgY29udGFpbmVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NvYWNoLXRvYXN0LWNvbnRhaW5lcicpOwogICAgICAgIGNvbnN0IHRvYXN0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CiAgICAgICAgdG9hc3QuY2xhc3NOYW1lID0gJ2NvYWNoLXRvYXN0IGNvYWNoLXRvYXN0LScgKyAodHlwZSB8fCAnaW5mbycpOwogICAgICAgIHRvYXN0LnRleHRDb250ZW50ID0gbWVzc2FnZTsKICAgICAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQodG9hc3QpOwoKICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHRvYXN0LmNsYXNzTGlzdC5hZGQoJ2NvYWNoLXRvYXN0LXNob3cnKSwgMTApOwogICAgICAgIHNldFRpbWVvdXQoKCkgPT4gewogICAgICAgICAgICB0b2FzdC5jbGFzc0xpc3QucmVtb3ZlKCdjb2FjaC10b2FzdC1zaG93Jyk7CiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gdG9hc3QucmVtb3ZlKCksIDMwMCk7CiAgICAgICAgfSwgNDAwMCk7CiAgICB9CgogICAgLy8g4pSA4pSAIEhlbHBlcnMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACgogICAgZnVuY3Rpb24gYWRkTWV0YUNoaXAobGFiZWwsIHZhbHVlKSB7CiAgICAgICAgY29uc3QgY2hpcCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTsKICAgICAgICBjaGlwLmNsYXNzTmFtZSA9ICdjb2FjaC1tZXRhLWNoaXAnOwogICAgICAgIGNoaXAuaW5uZXJIVE1MID0gJzxzdHJvbmc+JyArIGVzY0h0bWwobGFiZWwpICsgJzo8L3N0cm9uZz4gJyArIGVzY0h0bWwodmFsdWUpOwogICAgICAgIG1ldGFSb3cuYXBw' + -'ZW5kQ2hpbGQoY2hpcCk7CiAgICB9CgogICAgZnVuY3Rpb24gZm9ybWF0SW1wYWN0KHNjb3JlKSB7CiAgICAgICAgaWYgKHNjb3JlID09PSB1bmRlZmluZWQgfHwgc2NvcmUgPT09IG51bGwpIHsKICAgICAgICAgICAgcmV0dXJuICc8c3BhbiBjbGFzcz0iY29hY2gtaW1wYWN0IGNvYWNoLWltcGFjdC1uZXV0cmFsIj5cdTIwMTQ8L3NwYW4+JzsKICAgICAgICB9CiAgICAgICAgY29uc3QgZml4ZWQgPSBzY29yZS50b0ZpeGVkKDMpOwogICAgICAgIGlmIChzY29yZSA8IC0wLjAxKSB7CiAgICAgICAgICAgIHJldHVybiAnPHNwYW4gY2xhc3M9ImNvYWNoLWltcGFjdCBjb2FjaC1pbXBhY3QtbmVnYXRpdmUiPicgKyBmaXhlZCArICc8L3NwYW4+JzsKICAgICAgICB9IGVsc2UgaWYgKHNjb3JlID4gMC4wMSkgewogICAgICAgICAgICByZXR1cm4gJzxzcGFuIGNsYXNzPSJjb2FjaC1pbXBhY3QgY29hY2gtaW1wYWN0LXBvc2l0aXZlIj4rJyArIGZpeGVkICsgJzwvc3Bhbj4nOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHJldHVybiAnPHNwYW4gY2xhc3M9ImNvYWNoLWltcGFjdCBjb2FjaC1pbXBhY3QtbmV1dHJhbCI+JyArIGZpeGVkICsgJzwvc3Bhbj4nOwogICAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBmb3JtYXRUaW1lKGlzb1N0cikgewogICAgICAgIHRyeSB7CiAgICAgICAgICAgIGNvbnN0IGQgPSBuZXcgRGF0ZShpc29TdHIpOwogICAgICAgICAgICByZXR1cm4gZC50b0xvY2FsZURhdGVTdHJpbmcoKSArICcgJyArIGQudG9Mb2NhbGVUaW1lU3RyaW5nKFtdLCB7IGhvdXI6ICcyLWRpZ2l0JywgbWludXRlOiAnMi1kaWdpdCcgfSk7CiAgICAgICAgfSBjYXRjaCB7CiAgICAgICAgICAgIHJldHVybiBpc29TdHI7CiAgICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIGVzY0h0bWwoc3RyKSB7CiAgICAgICAgaWYgKCFzdHIpIHJldHVybiAnJzsKICAgICAgICByZXR1cm4gU3RyaW5nKHN0cikKICAgICAgICAgICAgLnJlcGxhY2UoLyYvZywgJyZhbXA7JykKICAgICAgICAgICAgLnJlcGxhY2UoLzwvZywgJyZsdDsnKQogICAgICAgICAgICAucmVwbGFjZSgvPi9nLCAnJmd0OycpCiAgICAgICAgICAgIC5yZXBsYWNlKC8iL2csICcmcXVvdDsnKTsKICAgIH0KCn0pKCk7Cg==' +'ICd3YXJuJywgJ05vbmUgXHUyMDE0IHJ1biBzaW11bGF0aW9ucyBmaXJzdCcpOwogICAgICAgICAgICAgICAgZ2VuUmVwb3J0c0J0bi5zdHlsZS5kaXNwbGF5ID0gJ2lubGluZS1ibG9jayc7CiAgICAgICAgICAgICAgICBnZW5SZXBvcnRzQnRuLnRleHRDb250ZW50ID0gJ0dlbmVyYXRlIFJlcG9ydHMnOwogICAgICAgICAgICB9CiAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICBzZXRTdGF0dXMoc3RhdHVzTGxtRG90LCBzdGF0dXNMbG1WYWx1ZSwgJ2Vycm9yJywgJ1NlcnZpY2UgdW5hdmFpbGFibGUnKTsKICAgICAgICAgICAgc2V0U3RhdHVzKHN0YXR1c0VtYkRvdCwgc3RhdHVzRW1iVmFsdWUsICdlcnJvcicsICdcdTIwMTQnKTsKICAgICAgICAgICAgc2V0U3RhdHVzKHN0YXR1c1JlcERvdCwgc3RhdHVzUmVwVmFsdWUsICdlcnJvcicsICdcdTIwMTQnKTsKICAgICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gc2V0U3RhdHVzKGRvdEVsLCB2YWx1ZUVsLCBsZXZlbCwgdGV4dCkgewogICAgICAgIGRvdEVsLmNsYXNzTmFtZSA9ICdzdGF0dXMtZG90IHN0YXR1cy0nICsgbGV2ZWw7CiAgICAgICAgdmFsdWVFbC50ZXh0Q29udGVudCA9IHRleHQ7CiAgICB9CgogICAgLy8g4pSA4pSAIExvYWQgRGVja3Mg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACgogICAgYXN5bmMgZnVuY3Rpb24gbG9hZERlY2tzKCkgewogICAgICAgIHRyeSB7CiAgICAgICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKEFQSSArICcvYXBpL2NvYWNoL2RlY2tzJyk7CiAgICAgICAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpOwogICAgICAgICAgICAvLyBCYWNrZW5kIHJldHVybnMgYSBiYXJlIGFycmF5IG9mIG9iamVjdHMsIG5vdCB7ZGVja3M6IFsuLi5dfQogICAgICAgICAgICBjb25zdCBkZWNrcyA9IEFycmF5LmlzQXJyYXkoZGF0YSkgPyBkYXRhIDogKGRhdGEuZGVja3MgfHwgW10pOwoKICAgICAgICAgICAgd2hpbGUgKGRlY2tTZWxlY3Qub3B0aW9ucy5sZW5ndGggPiAxKSB7CiAgICAgICAgICAgICAgICBkZWNrU2VsZWN0LnJlbW92ZSgxKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKGRlY2tzLmxlbmd0aCA9PT0gMCkgewogICAgICAgICAgICAgICAgY29uc3Qgb3B0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnb3B0aW9uJyk7CiAgICAgICAgICAgICAgICBvcHQuZGlzYWJsZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgb3B0LnRleHRDb250ZW50ID0gJ05vIGRlY2tzIGZvdW5kIFx1MjAxNCBhZGQgZGVja3MgaW4gRGVjayBCdWlsZGVyIGZpcnN0JzsKICAgICAgICAgICAgICAgIGRlY2tTZWxlY3QuYXBwZW5kQ2hpbGQob3B0KTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gU29ydCBieSBkZWNrIG5hbWUKICAgICAgICAgICAgZGVja3Muc29ydCgoYSwgYikgPT4gewogICAgICAgICAgICAgICAgY29uc3QgbmEgPSAodHlwZW9mIGEgPT09ICdzdHJpbmcnID8gYSA6IGEuZGVja19uYW1lIHx8ICcnKS50b0xvd2VyQ2FzZSgpOwogICAgICAgICAgICAgICAgY29uc3QgbmIgPSAodHlwZW9mIGIgPT09ICdzdHJpbmcnID8gYiA6IGIuZGVja19uYW1lIHx8ICcnKS50b0xvd2VyQ2FzZSgpOwogICAgICAgICAgICAgICAgcmV0dXJuIG5hLmxvY2FsZUNvbXBhcmUobmIpOwogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIGZvciAoY29uc3QgZGVjayBvZiBkZWNrcykgewogICAgICAgICAgICAgICAgY29uc3Qgb3B0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnb3B0aW9uJyk7CiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGRlY2sgPT09ICdzdHJpbmcnKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gTGVnYWN5OiBiYXJlIHN0cmluZyBJRAogICAgICAgICAgICAgICAgICAgIG9wdC52YWx1ZSA9IGRlY2s7CiAgICAgICAgICAgICAgICAgICAgb3B0LnRleHRDb250ZW50ID0gZGVjazsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgLy8gT2JqZWN0IGZvcm1hdDoge2RlY2tfaWQsIGRlY2tfbmFtZSwgY29tbWFuZGVyLCBoYXNfcmVwb3J0LCAuLi59CiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2x1ZyA9IGRlY2suZGVja19uYW1lLnRvTG93ZXJDYXNlKCkucmVwbGFj' + +'ZSgvW15hLXowLTldKy9nLCAnLScpLnJlcGxhY2UoLyheLXwtJCkvZywgJycpOwogICAgICAgICAgICAgICAgICAgIG9wdC52YWx1ZSA9IHNsdWc7CiAgICAgICAgICAgICAgICAgICAgb3B0LnRleHRDb250ZW50ID0gZGVjay5kZWNrX25hbWUgKyAoZGVjay5jb21tYW5kZXIgPyAnICgnICsgZGVjay5jb21tYW5kZXIgKyAnKScgOiAnJyk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFkZWNrLmhhc19yZXBvcnQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgb3B0LnRleHRDb250ZW50ICs9ICcgW25vIHJlcG9ydF0nOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGRlY2tTZWxlY3QuYXBwZW5kQ2hpbGQob3B0KTsKICAgICAgICAgICAgfQogICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgY29uc29sZS5lcnJvcignRmFpbGVkIHRvIGxvYWQgZGVja3M6JywgZSk7CiAgICAgICAgfQogICAgfQoKICAgIC8vIOKUgOKUgCBMb2FkIERCIERlY2tzIChmb3IgQXBwbHkpIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAoKICAgIGFzeW5jIGZ1bmN0aW9uIGxvYWREYkRlY2tzKCkgewogICAgICAgIHRyeSB7CiAgICAgICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKEFQSSArICcvYXBpL2RlY2tzJyk7CiAgICAgICAgICAgIGlmICghcmVzLm9rKSByZXR1cm47CiAgICAgICAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpOwogICAgICAgICAgICBkYkRlY2tzID0gZGF0YS5kZWNrcyB8fCBbXTsKCiAgICAgICAgICAgIHdoaWxlIChhcHBseURlY2tTZWxlY3Qub3B0aW9ucy5sZW5ndGggPiAxKSB7CiAgICAgICAgICAgICAgICBhcHBseURlY2tTZWxlY3QucmVtb3ZlKDEpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBmb3IgKGNvbnN0IGRlY2sgb2YgZGJEZWNrcykgewogICAgICAgICAgICAgICAgY29uc3Qgb3B0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnb3B0aW9uJyk7CiAgICAgICAgICAgICAgICBvcHQudmFsdWUgPSBkZWNrLmlkOwogICAgICAgICAgICAgICAgb3B0LnRleHRDb250ZW50ID0gZGVjay5uYW1lICsgKGRlY2suY29tbWFuZGVyID8gJyAoJyArIGRlY2suY29tbWFuZGVyICsgJyknIDogJycpOwogICAgICAgICAgICAgICAgYXBwbHlEZWNrU2VsZWN0LmFwcGVuZENoaWxkKG9wdCk7CiAgICAgICAgICAgIH0KICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0ZhaWxlZCB0byBsb2FkIERCIGRlY2tzOicsIGUpOwogICAgICAgIH0KICAgIH0KCiAgICAvLyDilIDilIAgTG9hZCBQYXN0IFNlc3Npb25zIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAoKICAgIGFzeW5jIGZ1bmN0aW9uIGxvYWRTZXNzaW9ucygpIHsKICAgICAgICB0cnkgewogICAgICAgICAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaChBUEkgKyAnL2FwaS9jb2FjaC9zZXNzaW9ucycpOwogICAgICAgICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTsKICAgICAgICAgICAgY29uc3Qgc2Vzc2lvbnMgPSBkYXRhLnNlc3Npb25zIHx8IFtdOwoKICAgICAgICAgICAgaWYgKHNlc3Npb25zLmxlbmd0aCA9PT0gMCkgewogICAgICAgICAgICAgICAgc2Vzc2lvbnNMaXN0LmlubmVySFRNTCA9ICc8cCBjbGFzcz0iY29hY2gtZW1wdHkiPk5vIGNvYWNoaW5nIHNlc3Npb25zIHlldC4gUnVuIHRoZSBjb2FjaCB0byBnZXQgc3RhcnRlZC48L3A+JzsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgc2Vzc2lvbnNMaXN0LmlubmVySFRNTCA9ICcnOwogICAgICAgICAgICBmb3IgKGNvbnN0IHMgb2Ygc2Vzc2lvbnMpIHsKICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW0gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKICAgICAgICAgICAgICAgIGl0ZW0uY2xhc3NOYW1lID0gJ2NvYWNoLXNlc3Npb24taXRlbSc7CiAgICAgICAgICAgICAgICBpdGVtLmRhdGFzZXQuc2Vzc2lvbklkID0gcy5zZXNzaW9uSWQ7CgogICAgICAgICAgICAgICAgY29uc3QgdGltZVN0ciA9IHMudGltZXN0YW1wID8gZm9ybWF0VGltZShzLnRpbWVzdGFtcCkgOiAnJzsKICAgICAgICAgICAgICAgIGNv' + +'bnN0IGlzRXhwYW5kZWQgPSBleHBhbmRlZFNlc3Npb25zW3Muc2Vzc2lvbklkXTsKCiAgICAgICAgICAgICAgICBpdGVtLmlubmVySFRNTCA9CiAgICAgICAgICAgICAgICAgICAgJzxkaXYgY2xhc3M9ImNvYWNoLXNlc3Npb24taGVhZGVyIiBkYXRhLXNpZD0iJyArIGVzY0h0bWwocy5zZXNzaW9uSWQpICsgJyI+JyArCiAgICAgICAgICAgICAgICAgICAgICAgICc8c3BhbiBjbGFzcz0iY29hY2gtc2Vzc2lvbi1leHBhbmQtYXJyb3ciPicgKyAoaXNFeHBhbmRlZCA/ICdcdTI1QkMnIDogJ1x1MjVCNicpICsgJzwvc3Bhbj4nICsKICAgICAgICAgICAgICAgICAgICAgICAgJzxzcGFuIGNsYXNzPSJjb2FjaC1zZXNzaW9uLWRlY2siPicgKyBlc2NIdG1sKHMuZGVja0lkKSArICc8L3NwYW4+JyArCiAgICAgICAgICAgICAgICAgICAgICAgICc8c3BhbiBjbGFzcz0iY29hY2gtc2Vzc2lvbi1zdW1tYXJ5Ij4nICsgZXNjSHRtbChzLnN1bW1hcnkgfHwgJyhubyBzdW1tYXJ5KScpICsgJzwvc3Bhbj4nICsKICAgICAgICAgICAgICAgICAgICAgICAgJzxzcGFuIGNsYXNzPSJjb2FjaC1zZXNzaW9uLW1ldGEiPicgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJzxzcGFuIGNsYXNzPSJjb2FjaC1zZXNzaW9uLWN1dHMiPi0nICsgKHMuY3V0c0NvdW50IHx8IDApICsgJzwvc3Bhbj4nICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICc8c3BhbiBjbGFzcz0iY29hY2gtc2Vzc2lvbi1hZGRzIj4rJyArIChzLmFkZHNDb3VudCB8fCAwKSArICc8L3NwYW4+JyArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPHNwYW4gY2xhc3M9ImNvYWNoLXNlc3Npb24tdGltZSI+JyArIGVzY0h0bWwodGltZVN0cikgKyAnPC9zcGFuPicgKwogICAgICAgICAgICAgICAgICAgICAgICAnPC9zcGFuPicgKwogICAgICAgICAgICAgICAgICAgICc8L2Rpdj4nICsKICAgICAgICAgICAgICAgICAgICAnPGRpdiBjbGFzcz0iY29hY2gtc2Vzc2lvbi1kZXRhaWwiIGlkPSJzZXNzaW9uLWRldGFpbC0nICsgZXNjSHRtbChzLnNlc3Npb25JZCkgKyAnIiBzdHlsZT0iJyArIChpc0V4cGFuZGVkID8gJycgOiAnZGlzcGxheTpub25lJykgKyAnIj4nICsKICAgICAgICAgICAgICAgICAgICAgICAgJzxkaXYgY2xhc3M9ImNvYWNoLXNlc3Npb24tZGV0YWlsLWxvYWRpbmciPkxvYWRpbmcuLi48L2Rpdj4nICsKICAgICAgICAgICAgICAgICAgICAnPC9kaXY+JzsKCiAgICAgICAgICAgICAgICAvLyBDbGljayBoYW5kbGVyIGZvciBleHBhbmQvY29sbGFwc2UKICAgICAgICAgICAgICAgIGl0ZW0ucXVlcnlTZWxlY3RvcignLmNvYWNoLXNlc3Npb24taGVhZGVyJykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgdG9nZ2xlU2Vzc2lvbihzLnNlc3Npb25JZCk7CiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICBzZXNzaW9uc0xpc3QuYXBwZW5kQ2hpbGQoaXRlbSk7CgogICAgICAgICAgICAgICAgLy8gSWYgcHJldmlvdXNseSBleHBhbmRlZCwgbG9hZCBkZXRhaWwKICAgICAgICAgICAgICAgIGlmIChpc0V4cGFuZGVkICYmIHNlc3Npb25DYWNoZVtzLnNlc3Npb25JZF0pIHsKICAgICAgICAgICAgICAgICAgICByZW5kZXJTZXNzaW9uRGV0YWlsKHMuc2Vzc2lvbklkLCBzZXNzaW9uQ2FjaGVbcy5zZXNzaW9uSWRdKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgY29uc29sZS5lcnJvcignRmFpbGVkIHRvIGxvYWQgc2Vzc2lvbnM6JywgZSk7CiAgICAgICAgfQogICAgfQoKICAgIGFzeW5jIGZ1bmN0aW9uIHRvZ2dsZVNlc3Npb24oc2Vzc2lvbklkKSB7CiAgICAgICAgY29uc3QgZGV0YWlsRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2Vzc2lvbi1kZXRhaWwtJyArIHNlc3Npb25JZCk7CiAgICAgICAgY29uc3QgaGVhZGVyRWwgPSBkZXRhaWxFbD8ucHJldmlvdXNFbGVtZW50U2libGluZzsKICAgICAgICBjb25zdCBhcnJvd0VsID0gaGVhZGVyRWw/LnF1ZXJ5U2VsZWN0b3IoJy5jb2FjaC1zZXNzaW9uLWV4cGFuZC1hcnJvdycpOwoKICAgICAgICBpZiAoIWRldGFpbEVsKSByZXR1cm47CgogICAgICAgIGNvbnN0IHdhc0hpZGRlbiA9IGRldGFpbEVsLnN0eWxlLmRpc3BsYXkgPT09ICdub25lJzsKCiAgICAgICAgaWYgKHdhc0hpZGRlbikgewogICAgICAgICAgICBkZXRhaWxFbC5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJzsKICAgICAg' + +'ICAgICAgZXhwYW5kZWRTZXNzaW9uc1tzZXNzaW9uSWRdID0gdHJ1ZTsKICAgICAgICAgICAgaWYgKGFycm93RWwpIGFycm93RWwudGV4dENvbnRlbnQgPSAnXHUyNUJDJzsKCiAgICAgICAgICAgIGlmICghc2Vzc2lvbkNhY2hlW3Nlc3Npb25JZF0pIHsKICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goQVBJICsgJy9hcGkvY29hY2gvc2Vzc2lvbnMvJyArIGVuY29kZVVSSUNvbXBvbmVudChzZXNzaW9uSWQpKTsKICAgICAgICAgICAgICAgICAgICBpZiAoIXJlcy5vaykgdGhyb3cgbmV3IEVycm9yKCdTZXNzaW9uIG5vdCBmb3VuZCcpOwogICAgICAgICAgICAgICAgICAgIGNvbnN0IHNlc3Npb24gPSBhd2FpdCByZXMuanNvbigpOwogICAgICAgICAgICAgICAgICAgIHNlc3Npb25DYWNoZVtzZXNzaW9uSWRdID0gc2Vzc2lvbjsKICAgICAgICAgICAgICAgICAgICByZW5kZXJTZXNzaW9uRGV0YWlsKHNlc3Npb25JZCwgc2Vzc2lvbik7CiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgZGV0YWlsRWwuaW5uZXJIVE1MID0gJzxkaXYgY2xhc3M9ImNvYWNoLXNlc3Npb24tZGV0YWlsLWVycm9yIj5GYWlsZWQgdG8gbG9hZCBzZXNzaW9uIGRldGFpbHM8L2Rpdj4nOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgcmVuZGVyU2Vzc2lvbkRldGFpbChzZXNzaW9uSWQsIHNlc3Npb25DYWNoZVtzZXNzaW9uSWRdKTsKICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGRldGFpbEVsLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7CiAgICAgICAgICAgIGV4cGFuZGVkU2Vzc2lvbnNbc2Vzc2lvbklkXSA9IGZhbHNlOwogICAgICAgICAgICBpZiAoYXJyb3dFbCkgYXJyb3dFbC50ZXh0Q29udGVudCA9ICdcdTI1QjYnOwogICAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiByZW5kZXJTZXNzaW9uRGV0YWlsKHNlc3Npb25JZCwgc2Vzc2lvbikgewogICAgICAgIGNvbnN0IGRldGFpbEVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Nlc3Npb24tZGV0YWlsLScgKyBzZXNzaW9uSWQpOwogICAgICAgIGlmICghZGV0YWlsRWwpIHJldHVybjsKCiAgICAgICAgY29uc3QgY3V0cyA9IHNlc3Npb24uc3VnZ2VzdGVkQ3V0cyB8fCBbXTsKICAgICAgICBjb25zdCBhZGRzID0gc2Vzc2lvbi5zdWdnZXN0ZWRBZGRzIHx8IFtdOwoKICAgICAgICBsZXQgaHRtbCA9ICc8ZGl2IGNsYXNzPSJjb2FjaC1zZXNzaW9uLWRldGFpbC1pbm5lciI+JzsKCiAgICAgICAgLy8gU3VtbWFyeQogICAgICAgIGlmIChzZXNzaW9uLnN1bW1hcnkpIHsKICAgICAgICAgICAgaHRtbCArPSAnPHAgY2xhc3M9ImNvYWNoLXNlc3Npb24tZGV0YWlsLXN1bW1hcnkiPicgKyBlc2NIdG1sKHNlc3Npb24uc3VtbWFyeSkgKyAnPC9wPic7CiAgICAgICAgfQoKICAgICAgICAvLyBDdXRzCiAgICAgICAgaWYgKGN1dHMubGVuZ3RoID4gMCkgewogICAgICAgICAgICBodG1sICs9ICc8ZGl2IGNsYXNzPSJjb2FjaC1zZXNzaW9uLWRldGFpbC1ncm91cCI+JzsKICAgICAgICAgICAgaHRtbCArPSAnPHNwYW4gY2xhc3M9ImNvYWNoLXNlc3Npb24tZGV0YWlsLWxhYmVsIj5DdXRzOjwvc3Bhbj4nOwogICAgICAgICAgICBodG1sICs9ICc8ZGl2IGNsYXNzPSJjb2FjaC1zZXNzaW9uLXBpbGxzIj4nOwogICAgICAgICAgICBmb3IgKGNvbnN0IGN1dCBvZiBjdXRzKSB7CiAgICAgICAgICAgICAgICBodG1sICs9ICc8c3BhbiBjbGFzcz0iY29hY2gtcGlsbCBjb2FjaC1waWxsLWN1dCIgdGl0bGU9IicgKyBlc2NIdG1sKGN1dC5yZWFzb24gfHwgJycpICsgJyI+JyArIGVzY0h0bWwoY3V0LmNhcmROYW1lKSArICc8L3NwYW4+JzsKICAgICAgICAgICAgfQogICAgICAgICAgICBodG1sICs9ICc8L2Rpdj48L2Rpdj4nOwogICAgICAgIH0KCiAgICAgICAgLy8gQWRkcwogICAgICAgIGlmIChhZGRzLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgaHRtbCArPSAnPGRpdiBjbGFzcz0iY29hY2gtc2Vzc2lvbi1kZXRhaWwtZ3JvdXAiPic7CiAgICAgICAgICAgIGh0bWwgKz0gJzxzcGFuIGNsYXNzPSJjb2FjaC1zZXNzaW9uLWRldGFpbC1sYWJlbCI+QWRkczo8L3NwYW4+JzsKICAgICAgICAgICAgaHRtbCArPSAnPGRpdiBjbGFzcz0iY29hY2gtc2Vzc2lvbi1waWxscyI+JzsKICAgICAgICAgICAgZm9yIChjb25zdCBhZGQgb2YgYWRkcykgewogICAgICAg' + +'ICAgICAgICAgaHRtbCArPSAnPHNwYW4gY2xhc3M9ImNvYWNoLXBpbGwgY29hY2gtcGlsbC1hZGQiIHRpdGxlPSInICsgZXNjSHRtbChhZGQucmVhc29uIHx8ICcnKSArICciPicgKyBlc2NIdG1sKGFkZC5jYXJkTmFtZSkgKyAnPC9zcGFuPic7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaHRtbCArPSAnPC9kaXY+PC9kaXY+JzsKICAgICAgICB9CgogICAgICAgIC8vIExvYWQgaW4gQ2hhdCBidXR0b24KICAgICAgICBodG1sICs9ICc8ZGl2IGNsYXNzPSJjb2FjaC1zZXNzaW9uLWRldGFpbC1hY3Rpb25zIj4nOwogICAgICAgIGh0bWwgKz0gJzxidXR0b24gY2xhc3M9ImJ0biBidG4tZ2hvc3QgYnRuLXNtIGNvYWNoLWxvYWQtY2hhdC1idG4iIGRhdGEtc2lkPSInICsgZXNjSHRtbChzZXNzaW9uSWQpICsgJyI+TG9hZCBpbiBDaGF0PC9idXR0b24+JzsKICAgICAgICBodG1sICs9ICc8YnV0dG9uIGNsYXNzPSJidG4gYnRuLWdob3N0IGJ0bi1zbSBjb2FjaC12aWV3LWZ1bGwtYnRuIiBkYXRhLXNpZD0iJyArIGVzY0h0bWwoc2Vzc2lvbklkKSArICciPlZpZXcgRnVsbCBSZXN1bHRzPC9idXR0b24+JzsKICAgICAgICBodG1sICs9ICc8L2Rpdj4nOwoKICAgICAgICBodG1sICs9ICc8L2Rpdj4nOwogICAgICAgIGRldGFpbEVsLmlubmVySFRNTCA9IGh0bWw7CgogICAgICAgIC8vIEJpbmQgYnV0dG9ucwogICAgICAgIGRldGFpbEVsLnF1ZXJ5U2VsZWN0b3IoJy5jb2FjaC1sb2FkLWNoYXQtYnRuJyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGUpID0+IHsKICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTsKICAgICAgICAgICAgbG9hZFNlc3Npb25JbkNoYXQoc2Vzc2lvbklkKTsKICAgICAgICB9KTsKICAgICAgICBkZXRhaWxFbC5xdWVyeVNlbGVjdG9yKCcuY29hY2gtdmlldy1mdWxsLWJ0bicpPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChlKSA9PiB7CiAgICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7CiAgICAgICAgICAgIGRpc3BsYXlTZXNzaW9uKHNlc3Npb25DYWNoZVtzZXNzaW9uSWRdKTsKICAgICAgICAgICAgcmVzdWx0c0VsLnNjcm9sbEludG9WaWV3KHsgYmVoYXZpb3I6ICdzbW9vdGgnLCBibG9jazogJ3N0YXJ0JyB9KTsKICAgICAgICB9KTsKICAgIH0KCiAgICBmdW5jdGlvbiBsb2FkU2Vzc2lvbkluQ2hhdChzZXNzaW9uSWQpIHsKICAgICAgICBjb25zdCBzZXNzaW9uID0gc2Vzc2lvbkNhY2hlW3Nlc3Npb25JZF07CiAgICAgICAgaWYgKCFzZXNzaW9uKSByZXR1cm47CgogICAgICAgIGNsZWFyQ2hhdCgpOwoKICAgICAgICAvLyBTZXQgZGVjayBzZWxlY3RvciBpZiBwb3NzaWJsZQogICAgICAgIGlmIChzZXNzaW9uLmRlY2tJZCkgewogICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRlY2tTZWxlY3Qub3B0aW9ucy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgaWYgKGRlY2tTZWxlY3Qub3B0aW9uc1tpXS52YWx1ZSA9PT0gc2Vzc2lvbi5kZWNrSWQpIHsKICAgICAgICAgICAgICAgICAgICBkZWNrU2VsZWN0LnZhbHVlID0gc2Vzc2lvbi5kZWNrSWQ7CiAgICAgICAgICAgICAgICAgICAgZGVja1NlbGVjdC5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudCgnY2hhbmdlJykpOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvLyBQcmUtZmlsbCBjaGF0IHdpdGggYSBzdW1tYXJ5IGNvbnRleHQKICAgICAgICBjb25zdCBjb250ZXh0TXNnID0gJ0Jhc2VkIG9uIGEgcHJldmlvdXMgY29hY2hpbmcgc2Vzc2lvbiBmb3IgdGhpcyBkZWNrLCBoZXJlIHdhcyB0aGUgYW5hbHlzaXM6XG5cbicgKwogICAgICAgICAgICAoc2Vzc2lvbi5zdW1tYXJ5IHx8ICcnKSArICdcblxuJyArCiAgICAgICAgICAgICdTdWdnZXN0ZWQgY3V0czogJyArIChzZXNzaW9uLnN1Z2dlc3RlZEN1dHMgfHwgW10pLm1hcChjID0+IGMuY2FyZE5hbWUpLmpvaW4oJywgJykgKyAnXG4nICsKICAgICAgICAgICAgJ1N1Z2dlc3RlZCBhZGRzOiAnICsgKHNlc3Npb24uc3VnZ2VzdGVkQWRkcyB8fCBbXSkubWFwKGEgPT4gYS5jYXJkTmFtZSkuam9pbignLCAnKTsKCiAgICAgICAgY2hhdEhpc3RvcnkucHVzaCh7IHJvbGU6ICdhc3Npc3RhbnQnLCBjb250ZW50OiBjb250ZXh0TXNnIH0pOwogICAgICAgIGFwcGVuZENoYXRCdWJibGUoJ2Fzc2lzdGFudCcsIGNvbnRleHRNc2cpOwoKICAgICAgICBjaGF0SW5wdXQuZm9jdXMoKTsKICAgICAgICBzaG93VG9h' + +'c3QoJ1Nlc3Npb24gbG9hZGVkIGludG8gY2hhdCcsICdzdWNjZXNzJyk7CiAgICB9CgogICAgLy8g4pSA4pSAIEdlbmVyYXRlIFJlcG9ydHMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACgogICAgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVSZXBvcnRzKCkgewogICAgICAgIGdlblJlcG9ydHNCdG4uZGlzYWJsZWQgPSB0cnVlOwogICAgICAgIGdlblJlcG9ydHNCdG4udGV4dENvbnRlbnQgPSAnR2VuZXJhdGluZy4uLic7CgogICAgICAgIHRyeSB7CiAgICAgICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKEFQSSArICcvYXBpL2NvYWNoL3JlcG9ydHMvZ2VuZXJhdGUnLCB7IG1ldGhvZDogJ1BPU1QnIH0pOwogICAgICAgICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTsKCiAgICAgICAgICAgIGlmIChkYXRhLmNvdW50ID4gMCkgewogICAgICAgICAgICAgICAgZ2VuUmVwb3J0c0J0bi50ZXh0Q29udGVudCA9IGRhdGEuY291bnQgKyAnIHJlcG9ydHMgZ2VuZXJhdGVkJzsKICAgICAgICAgICAgICAgIGF3YWl0IGNoZWNrU3RhdHVzKCk7CiAgICAgICAgICAgICAgICBhd2FpdCBsb2FkRGVja3MoKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGdlblJlcG9ydHNCdG4udGV4dENvbnRlbnQgPSAnTm8gcmVzdWx0cyBmb3VuZCc7CiAgICAgICAgICAgIH0KICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgIGdlblJlcG9ydHNCdG4udGV4dENvbnRlbnQgPSAnRXJyb3I6ICcgKyBlLm1lc3NhZ2U7CiAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7CiAgICAgICAgICAgICAgICBnZW5SZXBvcnRzQnRuLmRpc2FibGVkID0gZmFsc2U7CiAgICAgICAgICAgICAgICBnZW5SZXBvcnRzQnRuLnRleHRDb250ZW50ID0gJ1JlYnVpbGQgUmVwb3J0cyc7CiAgICAgICAgICAgIH0sIDMwMDApOwogICAgICAgIH0KICAgIH0KCiAgICAvLyDilIDilIAgUnVuIENvYWNoIChvbmUtc2hvdCkg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACgogICAgYXN5bmMgZnVuY3Rpb24gcnVuQ29hY2goKSB7CiAgICAgICAgY29uc3QgZGVja0lkID0gZGVja1NlbGVjdC52YWx1ZTsKICAgICAgICBpZiAoIWRlY2tJZCkgcmV0dXJuOwoKICAgICAgICBjb25zdCBnb2FscyA9IGdldEdvYWxzKCk7CgogICAgICAgIHJ1bkJ0bi5kaXNhYmxlZCA9IHRydWU7CiAgICAgICAgcHJvZ3Jlc3NFbC5zdHlsZS5kaXNwbGF5ID0gJ2ZsZXgnOwogICAgICAgIHByb2dyZXNzVGV4dC50ZXh0Q29udGVudCA9ICdBbmFseXppbmcgZGVjayBhbmQgY29uc3VsdGluZyBMTE0uLi4gVGhpcyBtYXkgdGFrZSAzMC02MCBzZWNvbmRzLic7CiAgICAgICAgcmVzdWx0c0VsLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7CgogICAgICAgIGNvbnN0IHByZXZFcnJvciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5jb2FjaC1lcnJvcicpOwogICAgICAgIGlmIChwcmV2RXJyb3IpIHByZXZFcnJvci5yZW1vdmUoKTsKCiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goQVBJICsgJy9hcGkvY29hY2gvZGVja3MvJyArIGVuY29kZVVSSUNvbXBvbmVudChkZWNrSWQpLCB7CiAgICAgICAgICAgICAgICBtZXRob2Q6ICdQT1NUJywKICAgICAgICAgICAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LAogICAgICAgICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBnb2FsczogZ29hbHMgfSksCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgaWYgKCFyZXMub2spIHsKICAgICAgICAgICAgICAgIGNvbnN0IGVyciA9IGF3YWl0IHJlcy5qc29uKCkuY2F0Y2goKCkgPT4gKHsgZGV0YWlsOiAnVW5rbm93biBlcnJvcicgfSkpOwogICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGVyci5kZXRhaWwgfHwgJ0NvYWNoIHJlcXVlc3QgZmFpbGVkICgnICsgcmVzLnN0YXR1cyArICcpJyk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGNvbnN0IHNlc3Npb24gPSBhd2FpdCByZXMuanNvbigpOwogICAgICAgICAgICBjdXJyZW50U2Vzc2lvbklkID0gc2Vzc2lvbi5zZXNzaW9uSWQgfHwgbnVs' + +'bDsKICAgICAgICAgICAgZGlzcGxheVNlc3Npb24oc2Vzc2lvbik7CiAgICAgICAgICAgIGxvYWRTZXNzaW9ucygpOwogICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgY29uc3QgZXJyRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CiAgICAgICAgICAgIGVyckRpdi5jbGFzc05hbWUgPSAnY29hY2gtZXJyb3InOwogICAgICAgICAgICBlcnJEaXYudGV4dENvbnRlbnQgPSAnQ29hY2ggZXJyb3I6ICcgKyBlLm1lc3NhZ2U7CiAgICAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5jb2FjaC1jb25maWcnKS5hcHBlbmRDaGlsZChlcnJEaXYpOwogICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgIHJ1bkJ0bi5kaXNhYmxlZCA9IGZhbHNlOwogICAgICAgICAgICBwcm9ncmVzc0VsLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7CiAgICAgICAgfQogICAgfQoKICAgIC8vIOKUgOKUgCBEaXNwbGF5IFNlc3Npb24gUmVzdWx0cyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKCiAgICBmdW5jdGlvbiBkaXNwbGF5U2Vzc2lvbihzZXNzaW9uKSB7CiAgICAgICAgcmVzdWx0c0VsLnN0eWxlLmRpc3BsYXkgPSAnZmxleCc7CiAgICAgICAgY3VycmVudFNlc3Npb25JZCA9IHNlc3Npb24uc2Vzc2lvbklkIHx8IGN1cnJlbnRTZXNzaW9uSWQ7CgogICAgICAgIHN1bW1hcnlUZXh0LnRleHRDb250ZW50ID0gc2Vzc2lvbi5zdW1tYXJ5IHx8ICcoTm8gc3VtbWFyeSBwcm92aWRlZCknOwoKICAgICAgICBtZXRhUm93LmlubmVySFRNTCA9ICcnOwogICAgICAgIGlmIChzZXNzaW9uLm1vZGVsVXNlZCkgYWRkTWV0YUNoaXAoJ01vZGVsJywgc2Vzc2lvbi5tb2RlbFVzZWQpOwogICAgICAgIGlmIChzZXNzaW9uLnByb21wdFRva2VucykgYWRkTWV0YUNoaXAoJ1Byb21wdCcsIHNlc3Npb24ucHJvbXB0VG9rZW5zLnRvTG9jYWxlU3RyaW5nKCkgKyAnIHRva2VucycpOwogICAgICAgIGlmIChzZXNzaW9uLmNvbXBsZXRpb25Ub2tlbnMpIGFkZE1ldGFDaGlwKCdDb21wbGV0aW9uJywgc2Vzc2lvbi5jb21wbGV0aW9uVG9rZW5zLnRvTG9jYWxlU3RyaW5nKCkgKyAnIHRva2VucycpOwogICAgICAgIGlmIChzZXNzaW9uLmRlY2tJZCkgYWRkTWV0YUNoaXAoJ0RlY2snLCBzZXNzaW9uLmRlY2tJZCk7CiAgICAgICAgaWYgKHNlc3Npb24udGltZXN0YW1wKSBhZGRNZXRhQ2hpcCgnVGltZScsIGZvcm1hdFRpbWUoc2Vzc2lvbi50aW1lc3RhbXApKTsKCiAgICAgICAgLy8gQ3V0cyB0YWJsZQogICAgICAgIGNvbnN0IGN1dHMgPSBzZXNzaW9uLnN1Z2dlc3RlZEN1dHMgfHwgW107CiAgICAgICAgY3V0c0NvdW50LnRleHRDb250ZW50ID0gY3V0cy5sZW5ndGg7CiAgICAgICAgY3V0c0JvZHkuaW5uZXJIVE1MID0gJyc7CiAgICAgICAgY3V0c0FsbENoZWNrLmNoZWNrZWQgPSBmYWxzZTsKCiAgICAgICAgZm9yIChjb25zdCBjdXQgb2YgY3V0cykgewogICAgICAgICAgICBjb25zdCB0ciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RyJyk7CiAgICAgICAgICAgIHRyLmlubmVySFRNTCA9CiAgICAgICAgICAgICAgICAnPHRkPjxpbnB1dCB0eXBlPSJjaGVja2JveCIgZGF0YS1jYXJkPSInICsgZXNjSHRtbChjdXQuY2FyZE5hbWUpICsgJyIgLz48L3RkPicgKwogICAgICAgICAgICAgICAgJzx0ZD48c3BhbiBjbGFzcz0iY29hY2gtY2FyZC1uYW1lIj4nICsgZXNjSHRtbChjdXQuY2FyZE5hbWUpICsgJzwvc3Bhbj48L3RkPicgKwogICAgICAgICAgICAgICAgJzx0ZD4nICsgZXNjSHRtbChjdXQucmVhc29uKSArICc8L3RkPicgKwogICAgICAgICAgICAgICAgJzx0ZD48ZGl2IGNsYXNzPSJjb2FjaC1yZXBsYWNlbWVudHMiPicgKwogICAgICAgICAgICAgICAgICAgIChjdXQucmVwbGFjZW1lbnRPcHRpb25zIHx8IFtdKS5tYXAociA9PgogICAgICAgICAgICAgICAgICAgICAgICAnPHNwYW4gY2xhc3M9ImNvYWNoLXJlcGxhY2VtZW50LWNoaXAiPicgKyBlc2NIdG1sKHIpICsgJzwvc3Bhbj4nCiAgICAgICAgICAgICAgICAgICAgKS5qb2luKCcnKSArCiAgICAgICAgICAgICAgICAnPC9kaXY+PC90ZD4nICsKICAgICAgICAgICAgICAgICc8dGQ+JyArIGZvcm1hdEltcGFjdChjdXQuY3VycmVudEltcGFjdFNjb3JlKSArICc8L3RkPic7CiAgICAgICAgICAgIGN1dHNCb2R5LmFwcGVuZENoaWxkKHRyKTsKICAgICAgICB9CgogICAgICAgIC8vIEFkZHMg' + +'dGFibGUKICAgICAgICBjb25zdCBhZGRzID0gc2Vzc2lvbi5zdWdnZXN0ZWRBZGRzIHx8IFtdOwogICAgICAgIGFkZHNDb3VudC50ZXh0Q29udGVudCA9IGFkZHMubGVuZ3RoOwogICAgICAgIGFkZHNCb2R5LmlubmVySFRNTCA9ICcnOwogICAgICAgIGFkZHNBbGxDaGVjay5jaGVja2VkID0gZmFsc2U7CgogICAgICAgIGZvciAoY29uc3QgYWRkIG9mIGFkZHMpIHsKICAgICAgICAgICAgY29uc3QgdHIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0cicpOwogICAgICAgICAgICB0ci5pbm5lckhUTUwgPQogICAgICAgICAgICAgICAgJzx0ZD48aW5wdXQgdHlwZT0iY2hlY2tib3giIGRhdGEtY2FyZD0iJyArIGVzY0h0bWwoYWRkLmNhcmROYW1lKSArICciIC8+PC90ZD4nICsKICAgICAgICAgICAgICAgICc8dGQ+PHNwYW4gY2xhc3M9ImNvYWNoLWNhcmQtbmFtZSI+JyArIGVzY0h0bWwoYWRkLmNhcmROYW1lKSArICc8L3NwYW4+PC90ZD4nICsKICAgICAgICAgICAgICAgICc8dGQ+JyArIChhZGQucm9sZSA/ICc8c3BhbiBjbGFzcz0iY29hY2gtcm9sZS1iYWRnZSI+JyArIGVzY0h0bWwoYWRkLnJvbGUpICsgJzwvc3Bhbj4nIDogJycpICsgJzwvdGQ+JyArCiAgICAgICAgICAgICAgICAnPHRkPicgKyBlc2NIdG1sKGFkZC5yZWFzb24pICsgJzwvdGQ+JyArCiAgICAgICAgICAgICAgICAnPHRkPjxkaXYgY2xhc3M9ImNvYWNoLXJlcGxhY2VtZW50cyI+JyArCiAgICAgICAgICAgICAgICAgICAgKGFkZC5zeW5lcmd5V2l0aCB8fCBbXSkubWFwKHMgPT4KICAgICAgICAgICAgICAgICAgICAgICAgJzxzcGFuIGNsYXNzPSJjb2FjaC1zeW5lcmd5LWNoaXAiPicgKyBlc2NIdG1sKHMpICsgJzwvc3Bhbj4nCiAgICAgICAgICAgICAgICAgICAgKS5qb2luKCcnKSArCiAgICAgICAgICAgICAgICAnPC9kaXY+PC90ZD4nOwogICAgICAgICAgICBhZGRzQm9keS5hcHBlbmRDaGlsZCh0cik7CiAgICAgICAgfQoKICAgICAgICAvLyBIaW50cwogICAgICAgIGNvbnN0IGhpbnRzID0gc2Vzc2lvbi5oZXVyaXN0aWNIaW50cyB8fCBbXTsKICAgICAgICBpZiAoaGludHMubGVuZ3RoID4gMCkgewogICAgICAgICAgICBoaW50c0NhcmQuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7CiAgICAgICAgICAgIGhpbnRzTGlzdC5pbm5lckhUTUwgPSAnJzsKICAgICAgICAgICAgZm9yIChjb25zdCBoaW50IG9mIGhpbnRzKSB7CiAgICAgICAgICAgICAgICBjb25zdCBsaSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2xpJyk7CiAgICAgICAgICAgICAgICBsaS50ZXh0Q29udGVudCA9IGhpbnQ7CiAgICAgICAgICAgICAgICBoaW50c0xpc3QuYXBwZW5kQ2hpbGQobGkpOwogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaGludHNDYXJkLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7CiAgICAgICAgfQoKICAgICAgICAvLyBNYW5hIGFkdmljZQogICAgICAgIGlmIChzZXNzaW9uLm1hbmFCYXNlQWR2aWNlKSB7CiAgICAgICAgICAgIG1hbmFDYXJkLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snOwogICAgICAgICAgICBtYW5hVGV4dC50ZXh0Q29udGVudCA9IHNlc3Npb24ubWFuYUJhc2VBZHZpY2U7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgbWFuYUNhcmQuc3R5bGUuZGlzcGxheSA9ICdub25lJzsKICAgICAgICB9CgogICAgICAgIC8vIFJhdyB0ZXh0CiAgICAgICAgcmF3VGV4dC50ZXh0Q29udGVudCA9IHNlc3Npb24ucmF3VGV4dEV4cGxhbmF0aW9uIHx8IHNlc3Npb24uc3VtbWFyeSB8fCAnKGVtcHR5KSc7CgogICAgICAgIHVwZGF0ZUFwcGx5Q291bnQoKTsKICAgIH0KCiAgICAvLyDilIDilIAgQXBwbHkgU3VnZ2VzdGlvbnMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACgogICAgZnVuY3Rpb24gdXBkYXRlQXBwbHlDb3VudCgpIHsKICAgICAgICBjb25zdCBjdXRDaGVja2VkID0gY3V0c0JvZHkucXVlcnlTZWxlY3RvckFsbCgnaW5wdXRbdHlwZT0iY2hlY2tib3giXTpjaGVja2VkJyk7CiAgICAgICAgY29uc3QgYWRkQ2hlY2tlZCA9IGFkZHNCb2R5LnF1ZXJ5U2VsZWN0b3JBbGwoJ2lucHV0W3R5cGU9ImNoZWNrYm94Il06Y2hlY2tlZCcpOwogICAgICAgIGNvbnN0IHRvdGFsID0gY3V0Q2hlY2tlZC5sZW5ndGggKyBhZGRDaGVja2VkLmxlbmd0aDsKCiAgICAgICAgYXBwbHlDb3VudEVsLnRleHRDb250ZW50ID0g' + +'Y3V0Q2hlY2tlZC5sZW5ndGggKyAnIGN1dHMsICcgKyBhZGRDaGVja2VkLmxlbmd0aCArICcgYWRkcyBzZWxlY3RlZCc7CiAgICAgICAgYXBwbHlCdG4uZGlzYWJsZWQgPSB0b3RhbCA9PT0gMCB8fCAhYXBwbHlEZWNrU2VsZWN0LnZhbHVlOwogICAgfQoKICAgIGFwcGx5RGVja1NlbGVjdC5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCB1cGRhdGVBcHBseUNvdW50KTsKCiAgICBhc3luYyBmdW5jdGlvbiBhcHBseVN1Z2dlc3Rpb25zKCkgewogICAgICAgIGNvbnN0IGRlY2tJZCA9IHBhcnNlSW50KGFwcGx5RGVja1NlbGVjdC52YWx1ZSk7CiAgICAgICAgaWYgKCFkZWNrSWQpIHsKICAgICAgICAgICAgc2hvd1RvYXN0KCdTZWxlY3QgYSBkZWNrIHRvIGFwcGx5IHN1Z2dlc3Rpb25zIHRvJywgJ3dhcm5pbmcnKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgY29uc3QgYWNjZXB0ZWRDdXRzID0gW107CiAgICAgICAgY3V0c0JvZHkucXVlcnlTZWxlY3RvckFsbCgnaW5wdXRbdHlwZT0iY2hlY2tib3giXTpjaGVja2VkJykuZm9yRWFjaChjYiA9PiB7CiAgICAgICAgICAgIGNvbnN0IG5hbWUgPSBjYi5kYXRhc2V0LmNhcmQ7CiAgICAgICAgICAgIGlmIChuYW1lKSBhY2NlcHRlZEN1dHMucHVzaChuYW1lKTsKICAgICAgICB9KTsKCiAgICAgICAgY29uc3QgYWNjZXB0ZWRBZGRzID0gW107CiAgICAgICAgYWRkc0JvZHkucXVlcnlTZWxlY3RvckFsbCgnaW5wdXRbdHlwZT0iY2hlY2tib3giXTpjaGVja2VkJykuZm9yRWFjaChjYiA9PiB7CiAgICAgICAgICAgIGNvbnN0IG5hbWUgPSBjYi5kYXRhc2V0LmNhcmQ7CiAgICAgICAgICAgIGlmIChuYW1lKSBhY2NlcHRlZEFkZHMucHVzaChuYW1lKTsKICAgICAgICB9KTsKCiAgICAgICAgaWYgKGFjY2VwdGVkQ3V0cy5sZW5ndGggPT09IDAgJiYgYWNjZXB0ZWRBZGRzLmxlbmd0aCA9PT0gMCkgewogICAgICAgICAgICBzaG93VG9hc3QoJ05vIHN1Z2dlc3Rpb25zIHNlbGVjdGVkJywgJ3dhcm5pbmcnKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgYXBwbHlCdG4uZGlzYWJsZWQgPSB0cnVlOwogICAgICAgIGFwcGx5QnRuLnRleHRDb250ZW50ID0gJ0FwcGx5aW5nLi4uJzsKCiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goQVBJICsgJy9hcGkvY29hY2gvYXBwbHknLCB7CiAgICAgICAgICAgICAgICBtZXRob2Q6ICdQT1NUJywKICAgICAgICAgICAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LAogICAgICAgICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoewogICAgICAgICAgICAgICAgICAgIHNlc3Npb25faWQ6IGN1cnJlbnRTZXNzaW9uSWQgfHwgJ21hbnVhbCcsCiAgICAgICAgICAgICAgICAgICAgZGVja19pZDogZGVja0lkLAogICAgICAgICAgICAgICAgICAgIGFjY2VwdGVkX2N1dHM6IGFjY2VwdGVkQ3V0cywKICAgICAgICAgICAgICAgICAgICBhY2NlcHRlZF9hZGRzOiBhY2NlcHRlZEFkZHMsCiAgICAgICAgICAgICAgICB9KSwKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICBpZiAoIXJlcy5vaykgewogICAgICAgICAgICAgICAgY29uc3QgZXJyID0gYXdhaXQgcmVzLmpzb24oKS5jYXRjaCgoKSA9PiAoeyBkZXRhaWw6ICdBcHBseSBmYWlsZWQnIH0pKTsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihlcnIuZGV0YWlsIHx8ICdBcHBseSBmYWlsZWQnKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcmVzLmpzb24oKTsKICAgICAgICAgICAgY29uc3QgbXNnID0gJ0FwcGxpZWQ6ICcgKyByZXN1bHQudG90YWxfY3V0cyArICcgY3V0cywgJyArIHJlc3VsdC50b3RhbF9hZGRzICsgJyBhZGRzJyArCiAgICAgICAgICAgICAgICAocmVzdWx0LmVycm9ycy5sZW5ndGggPiAwID8gJyAoJyArIHJlc3VsdC5lcnJvcnMubGVuZ3RoICsgJyBlcnJvcnMpJyA6ICcnKTsKICAgICAgICAgICAgc2hvd1RvYXN0KG1zZywgcmVzdWx0LmVycm9ycy5sZW5ndGggPiAwID8gJ3dhcm5pbmcnIDogJ3N1Y2Nlc3MnKTsKCiAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICBzaG93VG9hc3QoJ0FwcGx5IGVycm9yOiAnICsgZS5tZXNzYWdlLCAnZXJyb3InKTsKICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICBhcHBseUJ0bi5kaXNhYmxlZCA9IGZhbHNlOwogICAgICAgICAgICBhcHBseUJ0bi50ZXh0Q29udGVudCA9' + +'ICdBcHBseSBTdWdnZXN0aW9ucyc7CiAgICAgICAgICAgIHVwZGF0ZUFwcGx5Q291bnQoKTsKICAgICAgICB9CiAgICB9CgogICAgLy8g4pSA4pSAIE11bHRpLXR1cm4gQ2hhdCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKCiAgICBhc3luYyBmdW5jdGlvbiBzZW5kQ2hhdE1lc3NhZ2UoKSB7CiAgICAgICAgY29uc3QgdGV4dCA9IGNoYXRJbnB1dC52YWx1ZS50cmltKCk7CiAgICAgICAgaWYgKCF0ZXh0IHx8ICFkZWNrU2VsZWN0LnZhbHVlIHx8IGlzU3RyZWFtaW5nKSByZXR1cm47CgogICAgICAgIC8vIEFkZCB1c2VyIG1lc3NhZ2UKICAgICAgICBjaGF0SGlzdG9yeS5wdXNoKHsgcm9sZTogJ3VzZXInLCBjb250ZW50OiB0ZXh0IH0pOwogICAgICAgIGFwcGVuZENoYXRCdWJibGUoJ3VzZXInLCB0ZXh0KTsKICAgICAgICBjaGF0SW5wdXQudmFsdWUgPSAnJzsKICAgICAgICBjaGF0U2VuZEJ0bi5kaXNhYmxlZCA9IHRydWU7CgogICAgICAgIC8vIFNob3cgdHlwaW5nIGluZGljYXRvcgogICAgICAgIGNvbnN0IHR5cGluZ0VsID0gc2hvd1R5cGluZ0luZGljYXRvcigpOwogICAgICAgIGlzU3RyZWFtaW5nID0gdHJ1ZTsKCiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goQVBJICsgJy9hcGkvY29hY2gvY2hhdCcsIHsKICAgICAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLAogICAgICAgICAgICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sCiAgICAgICAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7CiAgICAgICAgICAgICAgICAgICAgZGVja19pZDogZGVja1NlbGVjdC52YWx1ZSwKICAgICAgICAgICAgICAgICAgICBtZXNzYWdlczogY2hhdEhpc3RvcnksCiAgICAgICAgICAgICAgICAgICAgZ29hbHM6IGdldEdvYWxzKCksCiAgICAgICAgICAgICAgICAgICAgc3RyZWFtOiB0cnVlLAogICAgICAgICAgICAgICAgfSksCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgaWYgKCFyZXMub2spIHsKICAgICAgICAgICAgICAgIGNvbnN0IGVyciA9IGF3YWl0IHJlcy5qc29uKCkuY2F0Y2goKCkgPT4gKHsgZGV0YWlsOiAnQ2hhdCBmYWlsZWQnIH0pKTsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihlcnIuZGV0YWlsIHx8ICdDaGF0IGZhaWxlZCAoJyArIHJlcy5zdGF0dXMgKyAnKScpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBSZW1vdmUgdHlwaW5nIGluZGljYXRvciwgYWRkIGFzc2lzdGFudCBidWJibGUKICAgICAgICAgICAgdHlwaW5nRWwucmVtb3ZlKCk7CiAgICAgICAgICAgIGNvbnN0IGJ1YmJsZUVsID0gYXBwZW5kQ2hhdEJ1YmJsZSgnYXNzaXN0YW50JywgJycpOwogICAgICAgICAgICBjb25zdCBjb250ZW50RWwgPSBidWJibGVFbC5xdWVyeVNlbGVjdG9yKCcuY29hY2gtY2hhdC1idWJibGUtY29udGVudCcpOwoKICAgICAgICAgICAgbGV0IGZ1bGxDb250ZW50ID0gJyc7CgogICAgICAgICAgICAvLyBSZWFkIFNTRSBzdHJlYW0KICAgICAgICAgICAgY29uc3QgcmVhZGVyID0gcmVzLmJvZHkuZ2V0UmVhZGVyKCk7CiAgICAgICAgICAgIGNvbnN0IGRlY29kZXIgPSBuZXcgVGV4dERlY29kZXIoKTsKICAgICAgICAgICAgbGV0IGJ1ZmZlciA9ICcnOwoKICAgICAgICAgICAgd2hpbGUgKHRydWUpIHsKICAgICAgICAgICAgICAgIGNvbnN0IHsgZG9uZSwgdmFsdWUgfSA9IGF3YWl0IHJlYWRlci5yZWFkKCk7CiAgICAgICAgICAgICAgICBpZiAoZG9uZSkgYnJlYWs7CgogICAgICAgICAgICAgICAgYnVmZmVyICs9IGRlY29kZXIuZGVjb2RlKHZhbHVlLCB7IHN0cmVhbTogdHJ1ZSB9KTsKICAgICAgICAgICAgICAgIGNvbnN0IGxpbmVzID0gYnVmZmVyLnNwbGl0KCdcbicpOwogICAgICAgICAgICAgICAgYnVmZmVyID0gbGluZXMucG9wKCkgfHwgJyc7CgogICAgICAgICAgICAgICAgZm9yIChjb25zdCBsaW5lIG9mIGxpbmVzKSB7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgdHJpbW1lZCA9IGxpbmUudHJpbSgpOwogICAgICAgICAgICAgICAgICAgIGlmICghdHJpbW1lZC5zdGFydHNXaXRoKCdkYXRhOiAnKSkgY29udGludWU7CgogICAgICAgICAgICAgICAgICAgIGNvbnN0IHBheWxvYWQgPSB0cmltbWVkLnNsaWNlKDYpOwogICAgICAgICAgICAgICAgICAgIGlmIChwYXls' + +'b2FkID09PSAnW0RPTkVdJykgYnJlYWs7CgogICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNodW5rID0gSlNPTi5wYXJzZShwYXlsb2FkKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNodW5rLmNvbnRlbnQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bGxDb250ZW50ICs9IGNodW5rLmNvbnRlbnQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50RWwuaW5uZXJIVE1MID0gZm9ybWF0TWFya2Rvd24oZnVsbENvbnRlbnQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Nyb2xsQ2hhdFRvQm90dG9tKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNraXAgbWFsZm9ybWVkIGNodW5rcwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gRmluYWxpemUKICAgICAgICAgICAgY2hhdEhpc3RvcnkucHVzaCh7IHJvbGU6ICdhc3Npc3RhbnQnLCBjb250ZW50OiBmdWxsQ29udGVudCB9KTsKICAgICAgICAgICAgY29udGVudEVsLmlubmVySFRNTCA9IGZvcm1hdE1hcmtkb3duKGZ1bGxDb250ZW50KTsKICAgICAgICAgICAgc2Nyb2xsQ2hhdFRvQm90dG9tKCk7CgogICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgdHlwaW5nRWwucmVtb3ZlKCk7CiAgICAgICAgICAgIGFwcGVuZENoYXRCdWJibGUoJ3N5c3RlbScsICdFcnJvcjogJyArIGUubWVzc2FnZSk7CiAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgaXNTdHJlYW1pbmcgPSBmYWxzZTsKICAgICAgICAgICAgY2hhdFNlbmRCdG4uZGlzYWJsZWQgPSAhY2hhdElucHV0LnZhbHVlLnRyaW0oKSB8fCAhZGVja1NlbGVjdC52YWx1ZTsKICAgICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gYXBwZW5kQ2hhdEJ1YmJsZShyb2xlLCBjb250ZW50KSB7CiAgICAgICAgLy8gUmVtb3ZlIHdlbGNvbWUgbWVzc2FnZQogICAgICAgIGNvbnN0IHdlbGNvbWUgPSBjaGF0TWVzc2FnZXMucXVlcnlTZWxlY3RvcignLmNvYWNoLWNoYXQtd2VsY29tZScpOwogICAgICAgIGlmICh3ZWxjb21lKSB3ZWxjb21lLnJlbW92ZSgpOwoKICAgICAgICBjb25zdCBidWJibGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKICAgICAgICBidWJibGUuY2xhc3NOYW1lID0gJ2NvYWNoLWNoYXQtYnViYmxlIGNvYWNoLWNoYXQtJyArIHJvbGU7CgogICAgICAgIGNvbnN0IGxhYmVsID0gcm9sZSA9PT0gJ3VzZXInID8gJ1lvdScgOiByb2xlID09PSAnYXNzaXN0YW50JyA/ICdDb2FjaCcgOiAnU3lzdGVtJzsKICAgICAgICBidWJibGUuaW5uZXJIVE1MID0KICAgICAgICAgICAgJzxkaXYgY2xhc3M9ImNvYWNoLWNoYXQtYnViYmxlLWxhYmVsIj4nICsgbGFiZWwgKyAnPC9kaXY+JyArCiAgICAgICAgICAgICc8ZGl2IGNsYXNzPSJjb2FjaC1jaGF0LWJ1YmJsZS1jb250ZW50Ij4nICsgKGNvbnRlbnQgPyBmb3JtYXRNYXJrZG93bihjb250ZW50KSA6ICcnKSArICc8L2Rpdj4nOwoKICAgICAgICBjaGF0TWVzc2FnZXMuYXBwZW5kQ2hpbGQoYnViYmxlKTsKICAgICAgICBzY3JvbGxDaGF0VG9Cb3R0b20oKTsKICAgICAgICByZXR1cm4gYnViYmxlOwogICAgfQoKICAgIGZ1bmN0aW9uIHNob3dUeXBpbmdJbmRpY2F0b3IoKSB7CiAgICAgICAgY29uc3QgZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKICAgICAgICBlbC5jbGFzc05hbWUgPSAnY29hY2gtY2hhdC10eXBpbmcnOwogICAgICAgIGVsLmlubmVySFRNTCA9CiAgICAgICAgICAgICc8ZGl2IGNsYXNzPSJjb2FjaC1jaGF0LWJ1YmJsZS1sYWJlbCI+Q29hY2g8L2Rpdj4nICsKICAgICAgICAgICAgJzxkaXYgY2xhc3M9ImNvYWNoLXR5cGluZy1kb3RzIj48c3Bhbj48L3NwYW4+PHNwYW4+PC9zcGFuPjxzcGFuPjwvc3Bhbj48L2Rpdj4nOwogICAgICAgIGNoYXRNZXNzYWdlcy5hcHBlbmRDaGlsZChlbCk7CiAgICAgICAgc2Nyb2xsQ2hhdFRvQm90dG9tKCk7CiAgICAgICAgcmV0dXJuIGVsOwogICAgfQoKICAgIGZ1bmN0aW9uIHNjcm9sbENoYXRUb0JvdHRvbSgpIHsKICAgICAgICBjaGF0TWVzc2FnZXMuc2Nyb2xsVG9wID0gY2hhdE1lc3NhZ2VzLnNjcm9sbEhlaWdodDsKICAgIH0KCiAgICBmdW5jdGlvbiBjbGVhckNoYXQoKSB7CiAgICAgICAgY2hhdEhpc3RvcnkgPSBb' + +'XTsKICAgICAgICBjaGF0TWVzc2FnZXMuaW5uZXJIVE1MID0KICAgICAgICAgICAgJzxkaXYgY2xhc3M9ImNvYWNoLWNoYXQtd2VsY29tZSI+JyArCiAgICAgICAgICAgICAgICAnPGRpdiBjbGFzcz0iY29hY2gtY2hhdC13ZWxjb21lLWljb24iPiYjMTI5MzAyOzwvZGl2PicgKwogICAgICAgICAgICAgICAgJzxwPlNlbGVjdCBhIGRlY2sgYWJvdmUgYW5kIGFzayBtZSBhbnl0aGluZyBhYm91dCB5b3VyIHN0cmF0ZWd5LCBjYXJkIGNob2ljZXMsIG9yIHVwZ3JhZGVzLjwvcD4nICsKICAgICAgICAgICAgJzwvZGl2Pic7CiAgICB9CgogICAgZnVuY3Rpb24gZm9ybWF0TWFya2Rvd24odGV4dCkgewogICAgICAgIGlmICghdGV4dCkgcmV0dXJuICcnOwogICAgICAgIC8vIEJhc2ljIG1hcmtkb3duOiBib2xkLCBpdGFsaWMsIGNvZGUsIGxpbmUgYnJlYWtzCiAgICAgICAgcmV0dXJuIGVzY0h0bWwodGV4dCkKICAgICAgICAgICAgLnJlcGxhY2UoL1wqXCooLis/KVwqXCovZywgJzxzdHJvbmc+JDE8L3N0cm9uZz4nKQogICAgICAgICAgICAucmVwbGFjZSgvXCooLis/KVwqL2csICc8ZW0+JDE8L2VtPicpCiAgICAgICAgICAgIC5yZXBsYWNlKC9gKFteYF0rKWAvZywgJzxjb2RlPiQxPC9jb2RlPicpCiAgICAgICAgICAgIC5yZXBsYWNlKC9cbi9nLCAnPGJyPicpOwogICAgfQoKICAgIC8vIOKUgOKUgCBDYXJkcy1MaWtlIFNlYXJjaCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKCiAgICBhc3luYyBmdW5jdGlvbiBzZWFyY2hDYXJkc0xpa2UoKSB7CiAgICAgICAgY29uc3QgY2FyZCA9IGNhcmRzbGlrZUlucHV0LnZhbHVlLnRyaW0oKTsKICAgICAgICBpZiAoIWNhcmQpIHJldHVybjsKCiAgICAgICAgY29uc3QgYWN0aXZlQ29sb3JzID0gW107CiAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmNvYWNoLWNhcmRzbGlrZS1jb2xvcnMgLmNvYWNoLWNvbG9yLXBpcC5hY3RpdmUnKS5mb3JFYWNoKGJ0biA9PiB7CiAgICAgICAgICAgIGFjdGl2ZUNvbG9ycy5wdXNoKGJ0bi5kYXRhc2V0LmNvbG9yKTsKICAgICAgICB9KTsKCiAgICAgICAgY29uc3QgdG9wTiA9IHBhcnNlSW50KGNhcmRzbGlrZVRvcG4udmFsdWUpIHx8IDEwOwoKICAgICAgICBjYXJkc2xpa2VSZXN1bHRzLmlubmVySFRNTCA9ICc8ZGl2IGNsYXNzPSJjb2FjaC1jYXJkc2xpa2UtbG9hZGluZyI+PGRpdiBjbGFzcz0ic3Bpbm5lciI+PC9kaXY+IFNlYXJjaGluZyBlbWJlZGRpbmdzLi4uPC9kaXY+JzsKCiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgbGV0IHVybCA9IEFQSSArICcvYXBpL2NvYWNoL2NhcmRzLWxpa2U/Y2FyZD0nICsgZW5jb2RlVVJJQ29tcG9uZW50KGNhcmQpICsgJyZ0b3Bfbj0nICsgdG9wTjsKICAgICAgICAgICAgaWYgKGFjdGl2ZUNvbG9ycy5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICB1cmwgKz0gJyZjb2xvcnM9JyArIGFjdGl2ZUNvbG9ycy5qb2luKCcnKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2godXJsKTsKICAgICAgICAgICAgaWYgKCFyZXMub2spIHsKICAgICAgICAgICAgICAgIGNvbnN0IGVyciA9IGF3YWl0IHJlcy5qc29uKCkuY2F0Y2goKCkgPT4gKHsgZGV0YWlsOiAnU2VhcmNoIGZhaWxlZCcgfSkpOwogICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGVyci5kZXRhaWwgfHwgJ1NlYXJjaCBmYWlsZWQnKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7CiAgICAgICAgICAgIGNvbnN0IHJlc3VsdHMgPSBkYXRhLnJlc3VsdHMgfHwgW107CgogICAgICAgICAgICBpZiAocmVzdWx0cy5sZW5ndGggPT09IDApIHsKICAgICAgICAgICAgICAgIGNhcmRzbGlrZVJlc3VsdHMuaW5uZXJIVE1MID0gJzxkaXYgY2xhc3M9ImNvYWNoLWNhcmRzbGlrZS1lbXB0eSI+Tm8gc2ltaWxhciBjYXJkcyBmb3VuZDwvZGl2Pic7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGNhcmRzbGlrZVJlc3VsdHMuaW5uZXJIVE1MID0gJyc7CiAgICAgICAgICAgIGZvciAoY29uc3QgY2FyZCBvZiByZXN1bHRzKSB7CiAgICAgICAgICAgICAgICBjb25zdCBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKICAgICAgICAgICAgICAgIGRpdi5jbGFzc05hbWUgPSAn' + +'Y29hY2gtY2FyZHNsaWtlLWNhcmQnOwoKICAgICAgICAgICAgICAgIGNvbnN0IHNpbVBjdCA9IE1hdGgucm91bmQoY2FyZC5zaW1pbGFyaXR5ICogMTAwKTsKICAgICAgICAgICAgICAgIGNvbnN0IG93bmVkQmFkZ2UgPSBjYXJkLm93bmVkX3F0eSA+IDAKICAgICAgICAgICAgICAgICAgICA/ICc8c3BhbiBjbGFzcz0iY29hY2gtY2wtb3duZWQiPicgKyBjYXJkLm93bmVkX3F0eSArICcgb3duZWQ8L3NwYW4+JwogICAgICAgICAgICAgICAgICAgIDogJzxzcGFuIGNsYXNzPSJjb2FjaC1jbC11bm93bmVkIj5ub3Qgb3duZWQ8L3NwYW4+JzsKICAgICAgICAgICAgICAgIGNvbnN0IHByaWNlID0gY2FyZC50Y2dfcHJpY2UgPyAnJCcgKyBOdW1iZXIoY2FyZC50Y2dfcHJpY2UpLnRvRml4ZWQoMikgOiAnJzsKCiAgICAgICAgICAgICAgICBkaXYuaW5uZXJIVE1MID0KICAgICAgICAgICAgICAgICAgICAnPGRpdiBjbGFzcz0iY29hY2gtY2wtdG9wIj4nICsKICAgICAgICAgICAgICAgICAgICAgICAgJzxzcGFuIGNsYXNzPSJjb2FjaC1jbC1uYW1lIj4nICsgZXNjSHRtbChjYXJkLm5hbWUpICsgJzwvc3Bhbj4nICsKICAgICAgICAgICAgICAgICAgICAgICAgJzxzcGFuIGNsYXNzPSJjb2FjaC1jbC1zaW0iPicgKyBzaW1QY3QgKyAnJTwvc3Bhbj4nICsKICAgICAgICAgICAgICAgICAgICAnPC9kaXY+JyArCiAgICAgICAgICAgICAgICAgICAgJzxkaXYgY2xhc3M9ImNvYWNoLWNsLW1ldGEiPicgKwogICAgICAgICAgICAgICAgICAgICAgICAnPHNwYW4gY2xhc3M9ImNvYWNoLWNsLXR5cGUiPicgKyBlc2NIdG1sKGNhcmQudHlwZXMgfHwgJycpICsgJzwvc3Bhbj4nICsKICAgICAgICAgICAgICAgICAgICAgICAgKGNhcmQubWFuYV9jb3N0ID8gJzxzcGFuIGNsYXNzPSJjb2FjaC1jbC1tYW5hIj4nICsgZXNjSHRtbChjYXJkLm1hbmFfY29zdCkgKyAnPC9zcGFuPicgOiAnJykgKwogICAgICAgICAgICAgICAgICAgICAgICBvd25lZEJhZGdlICsKICAgICAgICAgICAgICAgICAgICAgICAgKHByaWNlID8gJzxzcGFuIGNsYXNzPSJjb2FjaC1jbC1wcmljZSI+JyArIHByaWNlICsgJzwvc3Bhbj4nIDogJycpICsKICAgICAgICAgICAgICAgICAgICAnPC9kaXY+JyArCiAgICAgICAgICAgICAgICAgICAgKGNhcmQudGV4dCA/ICc8ZGl2IGNsYXNzPSJjb2FjaC1jbC10ZXh0Ij4nICsgZXNjSHRtbChjYXJkLnRleHQpICsgJzwvZGl2PicgOiAnJykgKwogICAgICAgICAgICAgICAgICAgICc8ZGl2IGNsYXNzPSJjb2FjaC1jbC1hY3Rpb25zIj4nICsKICAgICAgICAgICAgICAgICAgICAgICAgJzxidXR0b24gY2xhc3M9ImJ0biBidG4tZ2hvc3QgYnRuLXhzIGNvYWNoLWNsLWNoYXQtYnRuIj5BZGQgdG8gQ2hhdDwvYnV0dG9uPicgKwogICAgICAgICAgICAgICAgICAgICc8L2Rpdj4nOwoKICAgICAgICAgICAgICAgIGRpdi5xdWVyeVNlbGVjdG9yKCcuY29hY2gtY2wtY2hhdC1idG4nKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHsKICAgICAgICAgICAgICAgICAgICBjaGF0SW5wdXQudmFsdWUgKz0gKGNoYXRJbnB1dC52YWx1ZSA/ICcgJyA6ICcnKSArIGNhcmQubmFtZTsKICAgICAgICAgICAgICAgICAgICBjaGF0SW5wdXQuZm9jdXMoKTsKICAgICAgICAgICAgICAgICAgICBzaG93VG9hc3QoY2FyZC5uYW1lICsgJyBhZGRlZCB0byBjaGF0IGlucHV0JywgJ3N1Y2Nlc3MnKTsKICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgIGNhcmRzbGlrZVJlc3VsdHMuYXBwZW5kQ2hpbGQoZGl2KTsKICAgICAgICAgICAgfQogICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgY2FyZHNsaWtlUmVzdWx0cy5pbm5lckhUTUwgPSAnPGRpdiBjbGFzcz0iY29hY2gtY2FyZHNsaWtlLWVtcHR5Ij5FcnJvcjogJyArIGVzY0h0bWwoZS5tZXNzYWdlKSArICc8L2Rpdj4nOwogICAgICAgIH0KICAgIH0KCiAgICAvLyBDb2xvciBwaXAgdG9nZ2xlCiAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuY29hY2gtY2FyZHNsaWtlLWNvbG9ycyAuY29hY2gtY29sb3ItcGlwJykuZm9yRWFjaChidG4gPT4gewogICAgICAgIGJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IGJ0bi5jbGFzc0xpc3QudG9nZ2xlKCdhY3RpdmUnKSk7CiAgICB9KTsKCiAgICAvLyDilIDilIAgVG9hc3Qg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA' + +'4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACgogICAgZnVuY3Rpb24gc2hvd1RvYXN0KG1lc3NhZ2UsIHR5cGUpIHsKICAgICAgICBjb25zdCBjb250YWluZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29hY2gtdG9hc3QtY29udGFpbmVyJyk7CiAgICAgICAgY29uc3QgdG9hc3QgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKICAgICAgICB0b2FzdC5jbGFzc05hbWUgPSAnY29hY2gtdG9hc3QgY29hY2gtdG9hc3QtJyArICh0eXBlIHx8ICdpbmZvJyk7CiAgICAgICAgdG9hc3QudGV4dENvbnRlbnQgPSBtZXNzYWdlOwogICAgICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZCh0b2FzdCk7CgogICAgICAgIHNldFRpbWVvdXQoKCkgPT4gdG9hc3QuY2xhc3NMaXN0LmFkZCgnY29hY2gtdG9hc3Qtc2hvdycpLCAxMCk7CiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7CiAgICAgICAgICAgIHRvYXN0LmNsYXNzTGlzdC5yZW1vdmUoJ2NvYWNoLXRvYXN0LXNob3cnKTsKICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB0b2FzdC5yZW1vdmUoKSwgMzAwKTsKICAgICAgICB9LCA0MDAwKTsKICAgIH0KCiAgICAvLyDilIDilIAgSGVscGVycyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKCiAgICBmdW5jdGlvbiBhZGRNZXRhQ2hpcChsYWJlbCwgdmFsdWUpIHsKICAgICAgICBjb25zdCBjaGlwID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpOwogICAgICAgIGNoaXAuY2xhc3NOYW1lID0gJ2NvYWNoLW1ldGEtY2hpcCc7CiAgICAgICAgY2hpcC5pbm5lckhUTUwgPSAnPHN0cm9uZz4nICsgZXNjSHRtbChsYWJlbCkgKyAnOjwvc3Ryb25nPiAnICsgZXNjSHRtbCh2YWx1ZSk7CiAgICAgICAgbWV0YVJvdy5hcHBlbmRDaGlsZChjaGlwKTsKICAgIH0KCiAgICBmdW5jdGlvbiBmb3JtYXRJbXBhY3Qoc2NvcmUpIHsKICAgICAgICBpZiAoc2NvcmUgPT09IHVuZGVmaW5lZCB8fCBzY29yZSA9PT0gbnVsbCkgewogICAgICAgICAgICByZXR1cm4gJzxzcGFuIGNsYXNzPSJjb2FjaC1pbXBhY3QgY29hY2gtaW1wYWN0LW5ldXRyYWwiPlx1MjAxNDwvc3Bhbj4nOwogICAgICAgIH0KICAgICAgICBjb25zdCBmaXhlZCA9IHNjb3JlLnRvRml4ZWQoMyk7CiAgICAgICAgaWYgKHNjb3JlIDwgLTAuMDEpIHsKICAgICAgICAgICAgcmV0dXJuICc8c3BhbiBjbGFzcz0iY29hY2gtaW1wYWN0IGNvYWNoLWltcGFjdC1uZWdhdGl2ZSI+JyArIGZpeGVkICsgJzwvc3Bhbj4nOwogICAgICAgIH0gZWxzZSBpZiAoc2NvcmUgPiAwLjAxKSB7CiAgICAgICAgICAgIHJldHVybiAnPHNwYW4gY2xhc3M9ImNvYWNoLWltcGFjdCBjb2FjaC1pbXBhY3QtcG9zaXRpdmUiPisnICsgZml4ZWQgKyAnPC9zcGFuPic7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcmV0dXJuICc8c3BhbiBjbGFzcz0iY29hY2gtaW1wYWN0IGNvYWNoLWltcGFjdC1uZXV0cmFsIj4nICsgZml4ZWQgKyAnPC9zcGFuPic7CiAgICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIGZvcm1hdFRpbWUoaXNvU3RyKSB7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgY29uc3QgZCA9IG5ldyBEYXRlKGlzb1N0cik7CiAgICAgICAgICAgIHJldHVybiBkLnRvTG9jYWxlRGF0ZVN0cmluZygpICsgJyAnICsgZC50b0xvY2FsZVRpbWVTdHJpbmcoW10sIHsgaG91cjogJzItZGlnaXQnLCBtaW51dGU6ICcyLWRpZ2l0JyB9KTsKICAgICAgICB9IGNhdGNoIHsKICAgICAgICAgICAgcmV0dXJuIGlzb1N0cjsKICAgICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gZXNjSHRtbChzdHIpIHsKICAgICAgICBpZiAoIXN0cikgcmV0dXJuICcnOwogICAgICAgIHJldHVybiBTdHJpbmcoc3RyKQogICAgICAgICAgICAucmVwbGFjZSgvJi9nLCAnJmFtcDsnKQogICAgICAgICAgICAucmVwbGFjZSgvPC9nLCAnJmx0OycpCiAgICAgICAgICAgIC5yZXBsYWNlKC8+L2csICcmZ3Q7JykKICAgICAgICAgICAgLnJlcGxhY2UoLyIvZywgJyZxdW90OycpOwogICAgfQoKfSkoKTsK' Install-B64 -R 'ui\coach.js' -B $b # ui/collection.css (56,542 bytes) diff --git a/ui/coach.js b/ui/coach.js index 6ec6ad7..d8bb299 100644 --- a/ui/coach.js +++ b/ui/coach.js @@ -208,7 +208,8 @@ try { const res = await fetch(API + '/api/coach/decks'); const data = await res.json(); - const decks = data.decks || []; + // Backend returns a bare array of objects, not {decks: [...]} + const decks = Array.isArray(data) ? data : (data.decks || []); while (deckSelect.options.length > 1) { deckSelect.remove(1); @@ -217,16 +218,33 @@ if (decks.length === 0) { const opt = document.createElement('option'); opt.disabled = true; - opt.textContent = 'No deck reports available \u2014 run simulations first'; + opt.textContent = 'No decks found \u2014 add decks in Deck Builder first'; deckSelect.appendChild(opt); return; } - decks.sort(); - for (const deckId of decks) { + // Sort by deck name + decks.sort((a, b) => { + const na = (typeof a === 'string' ? a : a.deck_name || '').toLowerCase(); + const nb = (typeof b === 'string' ? b : b.deck_name || '').toLowerCase(); + return na.localeCompare(nb); + }); + + for (const deck of decks) { const opt = document.createElement('option'); - opt.value = deckId; - opt.textContent = deckId; + if (typeof deck === 'string') { + // Legacy: bare string ID + opt.value = deck; + opt.textContent = deck; + } else { + // Object format: {deck_id, deck_name, commander, has_report, ...} + const slug = deck.deck_name.toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/(^-|-$)/g, ''); + opt.value = slug; + opt.textContent = deck.deck_name + (deck.commander ? ' (' + deck.commander + ')' : ''); + if (!deck.has_report) { + opt.textContent += ' [no report]'; + } + } deckSelect.appendChild(opt); } } catch (e) {