Transaction

9e4d6c343c6b8e7eaee03091c9fe46911bf5b998ad49b4e1faaf4e603d8aeb93
Timestamp (utc)
2025-05-28 03:54:04
Fee Paid
0.00000478 BSV
(
0.00001999 BSV
-
0.00001521 BSV
)
Fee Rate
9.982 sat/KB
Version
1
Confirmations
38,872
Size Stats
47,884 B

2 Outputs

Total Output:
0.00001521 BSV
  • jM=º{"name":"ChainDisk","timestamp":1748403571302,"files":[{"name":"NoticeBoardModuleB2.html","size":35655,"type":"text/html","content":"Ly8gQ09NUExFVEUgTk9USUNFQk9BUkQgSU5URUdSQVRJT04gLSBGSU5BTCBWRVJTSU9OCi8vIENvcHkgdGhpcyBlbnRpcmUgY29kZSBhbmQgYWRkIGl0IHRvIHlvdXIgSFRNTCBhZnRlciB5b3VyIGV4aXN0aW5nIG5vdGljZWJvYXJkIHNjcmlwdAoKKGZ1bmN0aW9uKCkgewogICd1c2Ugc3RyaWN0JzsKICAKICBjb25zb2xlLmxvZygn8J+agCBMb2FkaW5nIENvbXBsZXRlIE5vdGljZWJvYXJkIEludGVncmF0aW9uLi4uJyk7CiAgCiAgLy8gU3RvcmUgcmVmZXJlbmNlcyB0byBvcmlnaW5hbCBmdW5jdGlvbnMKICBsZXQgb3JpZ2luYWxEaXNwbGF5TWVzc2FnZSA9IG51bGw7CiAgCiAgLy8gQ29tcGxldGUgTm90aWNlYm9hcmQgSW50ZWdyYXRpb24gU3lzdGVtCiAgY29uc3QgQ29tcGxldGVOb3RpY2Vib2FyZEludGVncmF0aW9uID0gewogICAgCiAgICAvKioKICAgICAqIE1haW4gaW5pdGlhbGl6YXRpb24gZnVuY3Rpb24KICAgICAqLwogICAgaW5pdGlhbGl6ZSgpIHsKICAgICAgY29uc29sZS5sb2coJ/CflKcgSW5pdGlhbGl6aW5nIGNvbXBsZXRlIG5vdGljZWJvYXJkIGludGVncmF0aW9uLi4uJyk7CiAgICAgIAogICAgICB0aGlzLmhvb2tEaXNwbGF5TWVzc2FnZSgpOwogICAgICB0aGlzLmVuaGFuY2VFeGlzdGluZ05vdGljZWJvYXJkKCk7CiAgICAgIHRoaXMuc2V0dXBCcm93c2luZ0Z1bmN0aW9uYWxpdHkoKTsKICAgICAgdGhpcy5hZGRHbG9iYWxIZWxwZXJzKCk7CiAgICAgIHRoaXMuaW5qZWN0U3R5bGVzKCk7CiAgICAgIAogICAgICBjb25zb2xlLmxvZygn4pyFIENvbXBsZXRlIG5vdGljZWJvYXJkIGludGVncmF0aW9uIGFjdGl2ZSEnKTsKICAgICAgY29uc29sZS5sb2coJ/CfkqEgQXZhaWxhYmxlIGZ1bmN0aW9uczonKTsKICAgICAgY29uc29sZS5sb2coJyAgIC0gYnJvd3NlQWxsQ29tbXVuaXR5UG9zdHMoKScpOwogICAgICBjb25zb2xlLmxvZygnICAgLSBjaGVja0Zvck5vdGljZWJvYXJkUmVzcG9uc2VzKCknKTsKICAgICAgY29uc29sZS5sb2coJyAgIC0gdGVzdE5vdGljZWJvYXJkRGlzcGxheSgpJyk7CiAgICB9LAogICAgCiAgICAvKioKICAgICAqIEhvb2sgaW50byB0aGUgZXhpc3RpbmcgZGlzcGxheU1lc3NhZ2UgZnVuY3Rpb24KICAgICAqLwogICAgaG9va0Rpc3BsYXlNZXNzYWdlKCkgewogICAgICBjb25zdCBhdHRlbXB0SG9vayA9ICgpID0+IHsKICAgICAgICBpZiAodHlwZW9mIHdpbmRvdy5kaXNwbGF5TWVzc2FnZSA9PT0gJ2Z1bmN0aW9uJykgewogICAgICAgICAgb3JpZ2luYWxEaXNwbGF5TWVzc2FnZSA9IHdpbmRvdy5kaXNwbGF5TWVzc2FnZTsKICAgICAgICAgIGNvbnNvbGUubG9nKCfinIUgRm91bmQgYW5kIGhvb2tlZCBkaXNwbGF5TWVzc2FnZSBmdW5jdGlvbicpOwogICAgICAgICAgCiAgICAgICAgICB3aW5kb3cuZGlzcGxheU1lc3NhZ2UgPSAobWVzc2FnZSkgPT4gewogICAgICAgICAgICBjb25zb2xlLmxvZygn8J+TpyBQcm9jZXNzaW5nIG1lc3NhZ2U6JywgbWVzc2FnZSk7CiAgICAgICAgICAgIAogICAgICAgICAgICBpZiAodGhpcy5pc05vdGljZWJvYXJkUmVzcG9uc2UobWVzc2FnZSkpIHsKICAgICAgICAgICAgICBjb25zb2xlLmxvZygn8J+OryBEZXRlY3RlZCBub3RpY2Vib2FyZCByZXNwb25zZSEnKTsKICAgICAgICAgICAgICB0aGlzLmhhbmRsZU5vdGljZWJvYXJkUmVzcG9uc2UobWVzc2FnZSk7CiAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIAogICAgICAgICAgICBpZiAob3JpZ2luYWxEaXNwbGF5TWVzc2FnZSkgewogICAgICAgICAgICAgIG9yaWdpbmFsRGlzcGxheU1lc3NhZ2UobWVzc2FnZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH07CiAgICAgICAgICAKICAgICAgICB9IGVsc2UgewogICAgICAgICAgY29uc29sZS5sb2coJ+KPsyBkaXNwbGF5TWVzc2FnZSBub3QgZm91bmQsIHJldHJ5aW5nIGluIDIgc2Vjb25kcy4uLicpOwogICAgICAgICAgc2V0VGltZW91dChhdHRlbXB0SG9vaywgMjAwMCk7CiAgICAgICAgfQogICAgICB9OwogICAgICAKICAgICAgYXR0ZW1wdEhvb2soKTsKICAgIH0sCiAgICAKICAgIC8qKgogICAgICogRW5oYW5jZSBleGlzdGluZyBub3RpY2Vib2FyZCBmdW5jdGlvbmFsaXR5CiAgICAgKi8KICAgIGVuaGFuY2VFeGlzdGluZ05vdGljZWJvYXJkKCkgewogICAgICBjb25zdCBhdHRlbXB0RW5oYW5jZSA9ICgpID0+IHsKICAgICAgICBpZiAodHlwZW9mIHdpbmRvdy5HYXRld2F5Tm90aWNlYm9hcmQgIT09ICd1bmRlZmluZWQnKSB7CiAgICAgICAgICBjb25zb2xlLmxvZygn4pyFIEZvdW5kIGV4aXN0aW5nIEdhdGV3YXlOb3RpY2Vib2FyZCwgZW5oYW5jaW5nLi4uJyk7CiAgICAgICAgICB0aGlzLmVuaGFuY2VTZWFyY2hGdW5jdGlvbmFsaXR5KCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGNvbnNvbGUubG9nKCfij7MgR2F0ZXdheU5vdGljZWJvYXJkIG5vdCBmb3VuZCwgcmV0cnlpbmcuLi4nKTsKICAgICAgICAgIHNldFRpbWVvdXQoYXR0ZW1wdEVuaGFuY2UsIDIwMDApOwogICAgICAgIH0KICAgICAgfTsKICAgICAgCiAgICAgIGF0dGVtcHRFbmhhbmNlKCk7CiAgICB9LAogICAgCiAgICAvKioKICAgICAqIEVuaGFuY2Ugc2VhcmNoIGZ1bmN0aW9uYWxpdHkgd2l0aCByZWFsIHJlc3BvbnNlIG1vbml0b3JpbmcKICAgICAqLwogICAgZW5oYW5jZVNlYXJjaEZ1bmN0aW9uYWxpdHkoKSB7CiAgICAgIGlmICghd2luZG93LkdhdGV3YXlOb3RpY2Vib2FyZCkgcmV0dXJuOwogICAgICAKICAgICAgY29uc3Qgb3JpZ2luYWxTdWJtaXRTZWFyY2ggPSB3aW5kb3cuR2F0ZXdheU5vdGljZWJvYXJkLnN1Ym1pdFNlYXJjaDsKICAgICAgCiAgICAgIHdpbmRvdy5HYXRld2F5Tm90aWNlYm9hcmQuc3VibWl0U2VhcmNoID0gYXN5bmMgZnVuY3Rpb24oZXZlbnQpIHsKICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgIAogICAgICAgIGNvbnN0IHF1ZXJ5RWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZWFyY2hRdWVyeScpOwogICAgICAgIGNvbnN0IHF1ZXJ5ID0gcXVlcnlFbGVtZW50ID8gcXVlcnlFbGVtZW50LnZhbHVlLnRyaW0oKSA6ICcnOwogICAgICAgIAogICAgICAgIGlmICghcXVlcnkpIHsKICAgICAgICAgIGFsZXJ0KCdQbGVhc2UgZW50ZXIgd2hhdCB5b3VcJ3JlIGxvb2tpbmcgZm9yJyk7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIAogICAgICAgIGlmIChjb25maXJtKGBTZWFyY2ggZm9yICIke3F1ZXJ5fSIgaW4gQ29tbXVuaXR5IE5vdGljZWJvYXJkP1xuXG5Db3N0OiA2NTAgc2F0b3NoaXNgKSkgewogICAgICAgICAgQ29tcGxldGVOb3RpY2Vib2FyZEludGVncmF0aW9uLnNob3dTZWFyY2hMb2FkaW5nKHF1ZXJ5KTsKICAgICAgICAgIAogICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgLy8gQ2FsbCBvcmlnaW5hbCBzZWFyY2ggdG8gc2VuZCB0cmFuc2FjdGlvbgogICAgICAgICAgICBhd2FpdCBvcmlnaW5hbFN1Ym1pdFNlYXJjaC5jYWxsKHRoaXMsIGV2ZW50KTsKICAgICAgICAgICAgQ29tcGxldGVOb3RpY2Vib2FyZEludGVncmF0aW9uLm1vbml0b3JGb3JTZWFyY2hSZXNwb25zZShxdWVyeSk7CiAgICAgICAgICB9IGNhdGNoIChlcnJvcikgewogICAgICAgICAgICBjb25zb2xlLmVycm9yKCfinYwgU2VhcmNoIHJlcXVlc3QgZmFpbGVkOicsIGVycm9yKTsKICAgICAgICAgICAgYWxlcnQoJ0ZhaWxlZCB0byBzZWFyY2ggbm90aWNlYm9hcmQ6ICcgKyBlcnJvci5tZXNzYWdlKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH07CiAgICB9LAogICAgCiAgICAvKioKICAgICAqIENoZWNrIGlmIG1lc3NhZ2UgaXMgZnJvbSBub3RpY2Vib2FyZCBzZXJ2aWNlCiAgICAgKi8KICAgIGlzTm90aWNlYm9hcmRSZXNwb25zZShtZXNzYWdlKSB7CiAgICAgIHJldHVybiBtZXNzYWdlICYmIAogICAgICAgICAgICAgbWVzc2FnZS5zZW5kZXJOYW1lID09PSAiQlNWIE5vdGljZWJvYXJkIFNlcnZpY2UiICYmCiAgICAgICAgICAgICBtZXNzYWdlLnByb3RvY29sID09PSAiQlNWX1dBTExFVE1BSUxfMS4wIiAmJgogICAgICAgICAgICAgbWVzc2FnZS5tZXNzYWdlVHlwZSA9PT0gImFwcGxpY2F0aW9uL2pzb24iOwogICAgfSwKICAgIAogICAgLyoqCiAgICAgKiBIYW5kbGUgbm90aWNlYm9hcmQgcmVzcG9uc2UgbWVzc2FnZQogICAgICovCiAgICBoYW5kbGVOb3RpY2Vib2FyZFJlc3BvbnNlKG1lc3NhZ2UpIHsKICAgICAgdHJ5IHsKICAgICAgICBjb25zdCBkZWNvZGVkQ29udGVudCA9IGF0b2IobWVzc2FnZS5tZXNzYWdlQ29udGVudCk7CiAgICAgICAgY29uc3QgcmVzcG9uc2VEYXRhID0gSlNPTi5wYXJzZShkZWNvZGVkQ29udGVudCk7CiAgICAgICAgCiAgICAgICAgY29uc29sZS5sb2coJ/Cfk4sgUGFyc2VkIG5vdGljZWJvYXJkIGRhdGE6JywgcmVzcG9uc2VEYXRhKTsKICAgICAgICAKICAgICAgICBpZiAocmVzcG9uc2VEYXRhLnF1ZXJ5ICYmIEFycmF5LmlzQXJyYXkocmVzcG9uc2VEYXRhLnJlc3VsdHMpKSB7CiAgICAgICAgICB0aGlzLmRpc3BsYXlTZWFyY2hSZXN1bHRzKHJlc3BvbnNlRGF0YSk7CiAgICAgICAgfSBlbHNlIGlmIChyZXNwb25zZURhdGEuc3RhdHVzID09PSAicG9zdGVkIikgewogICAgICAgICAgdGhpcy5kaXNwbGF5UG9zdENvbmZpcm1hdGlvbihyZXNwb25zZURhdGEpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB0aGlzLmRpc3BsYXlHZW5lcmljUmVzcG9uc2UocmVzcG9uc2VEYXRhKTsKICAgICAgICB9CiAgICAgICAgCiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7CiAgICAgICAgY29uc29sZS5lcnJvcign4p2MIEVycm9yIGhhbmRsaW5nIG5vdGljZWJvYXJkIHJlc3BvbnNlOicsIGVycm9yKTsKICAgICAgICBpZiAob3JpZ2luYWxEaXNwbGF5TWVzc2FnZSkgewogICAgICAgICAgb3JpZ2luYWxEaXNwbGF5TWVzc2FnZShtZXNzYWdlKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAKICAgIC8qKgogICAgICogRGlzcGxheSBzZWFyY2ggcmVzdWx0cyBpbiBtZXNzYWdlIGFyZWEKICAgICAqLwogICAgZGlzcGxheVNlYXJjaFJlc3VsdHMocmVzcG9uc2VEYXRhKSB7CiAgICAgIGNvbnN0IHsgcXVlcnksIHRvdGFsX2ZvdW5kLCByZXN1bHRzIH0gPSByZXNwb25zZURhdGE7CiAgICAgIGNvbnN0IG1lc3NhZ2VDb250YWluZXIgPSB0aGlzLmZpbmRNZXNzYWdlQ29udGFpbmVyKCk7CiAgICAgIAogICAgICBpZiAoIW1lc3NhZ2VDb250YWluZXIpIHsKICAgICAgICBjb25zb2xlLmVycm9yKCfinYwgQ291bGQgbm90IGZpbmQgbWVzc2FnZSBjb250YWluZXInKTsKICAgICAgICBhbGVydChgU2VhcmNoIHJlc3VsdHMgZm9yICIke3F1ZXJ5fSI6ICR7dG90YWxfZm91bmR9IHJlc3VsdHMgZm91bmRgKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgCiAgICAgIGxldCByZXN1bHRIVE1MID0gJyc7CiAgICAgIAogICAgICBpZiAodG90YWxfZm91bmQgPT09IDApIHsKICAgICAgICByZXN1bHRIVE1MID0gYAogICAgICAgICAgPGRpdiBjbGFzcz0ibm90aWNlYm9hcmQtbWVzc2FnZSBuby1yZXN1bHRzIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0ibm90aWNlYm9hcmQtaGVhZGVyIj4KICAgICAgICAgICAgICA8aDM+8J+UjSBDb21tdW5pdHkgU2VhcmNoIFJlc3VsdHM8L2gzPgogICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJzZWFyY2gtcXVlcnkiPk5vIHJlc3VsdHMgZm9yICIke3RoaXMuZXNjYXBlSHRtbChxdWVyeSl9Ijwvc3Bhbj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9Im5vLXJlc3VsdHMtY29udGVudCI+CiAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZW1wdHktaWNvbiI+8J+TrTwvZGl2PgogICAgICAgICAgICAgIDxoND5ObyBwb3N0cyBmb3VuZDwvaDQ+CiAgICAgICAgICAgICAgPHA+Tm8gY29tbXVuaXR5IHBvc3RzIG1hdGNoIHlvdXIgc2VhcmNoLiBUcnkgZGlmZmVyZW50IGtleXdvcmRzIG9yIGJlIHRoZSBmaXJzdCB0byBwb3N0ITwvcD4KICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJhY3Rpb24tYnV0dG9ucyI+CiAgICAgICAgICAgICAgICA8YnV0dG9uIG9uY2xpY2s9IkNvbXBsZXRlTm90aWNlYm9hcmRJbnRlZ3JhdGlvbi5vcGVuTm90aWNlYm9hcmQoJ3NlYXJjaCcpIiBjbGFzcz0iYnRuLXByaW1hcnkiPgogICAgICAgICAgICAgICAgICDwn5SNIFNlYXJjaCBBZ2FpbgogICAgICAgICAgICAgICAgPC9idXR0b24+CiAgICAgICAgICAgICAgICA8YnV0dG9uIG9uY2xpY2s9IkNvbXBsZXRlTm90aWNlYm9hcmRJbnRlZ3JhdGlvbi5vcGVuTm90aWNlYm9hcmQoJ3Bvc3QnKSIgY2xhc3M9ImJ0bi1zZWNvbmRhcnkiPgogICAgICAgICAgICAgICAgICDwn5OdIFBvc3QgRmlyc3QgT25lCiAgICAgICAgICAgICAgICA8L2J1dHRvbj4KICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICBgOwogICAgICB9IGVsc2UgewogICAgICAgIGNvbnN0IHJlc3VsdHNIVE1MID0gcmVzdWx0cy5tYXAoKHBvc3QsIGluZGV4KSA9PiBgCiAgICAgICAgICA8ZGl2IGNsYXNzPSJjb21tdW5pdHktcG9zdCIgc3R5bGU9ImFuaW1hdGlvbjogc2xpZGVJbiAwLjNzIGVhc2UgJHtpbmRleCAqIDAuMX1zIGJvdGg7Ij4KICAgICAgICAgICAgPGRpdiBjbGFzcz0icG9zdC1oZWFkZXIiPgogICAgICAgICAgICAgIDxoNCBjbGFzcz0icG9zdC10aXRsZSI+JHt0aGlzLmVzY2FwZUh0bWwocG9zdC50aXRsZSl9PC9oND4KICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwb3N0LWNhdGVnb3JpZXMiPgogICAgICAgICAgICAgICAgJHtwb3N0LmNhdGVnb3JpZXM/Lm1hcChjYXQgPT4gYDxzcGFuIGNsYXNzPSJjYXRlZ29yeS10YWciPiR7dGhpcy5lc2NhcGVIdG1sKGNhdCl9PC9zcGFuPmApLmpvaW4oJycpIHx8ICcnfQogICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0icG9zdC1jb250ZW50Ij4ke3RoaXMuZXNjYXBlSHRtbChwb3N0LmNvbnRlbnQpfTwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJwb3N0LW1ldGEiPgogICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1ldGEtbGVmdCI+CiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0icG9zdC1kYXRlIj7wn5OFICR7dGhpcy5mb3JtYXREYXRlKHBvc3QucG9zdGVkX2RhdGUpfTwvc3Bhbj4KICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJwb3N0LWlkIj5JRDogJHtwb3N0LnR4aWQuc2xpY2UoMCwgOCl9Li4uPC9zcGFuPgogICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1ldGEtcmlnaHQiPgogICAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cHM6Ly93aGF0c29uY2hhaW4uY29tL3R4LyR7cG9zdC50eGlkfSIgdGFyZ2V0PSJfYmxhbmsiIGNsYXNzPSJibG9ja2NoYWluLWxpbmsiPgogICAgICAgICAgICAgICAgICDwn5SXIFZlcmlmeQogICAgICAgICAgICAgICAgPC9hPgogICAgICAgICAgICAgICAgPGJ1dHRvbiBvbmNsaWNrPSJDb21wbGV0ZU5vdGljZWJvYXJkSW50ZWdyYXRpb24uY29udGFjdFBvc3RlcignJHtwb3N0LnR4aWR9JykiIGNsYXNzPSJjb250YWN0LWJ0biI+CiAgICAgICAgICAgICAgICAgIPCfkqwgQ29udGFjdAogICAgICAgICAgICAgICAgPC9idXR0b24+CiAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC9kaXY+CiAgICAgICAgYCkuam9pbignJyk7CiAgICAgICAgCiAgICAgICAgcmVzdWx0SFRNTCA9IGAKICAgICAgICAgIDxkaXYgY2xhc3M9Im5vdGljZWJvYXJkLW1lc3NhZ2Ugc2VhcmNoLXJlc3VsdHMiPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJub3RpY2Vib2FyZC1oZWFkZXIiPgogICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImhlYWRlci1sZWZ0Ij4KICAgICAgICAgICAgICAgIDxoMz7wn46JIENvbW11bml0eSBTZWFyY2ggUmVzdWx0czwvaDM+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJyZXN1bHQtc3VtbWFyeSI+CiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJzZWFyY2gtcXVlcnkiPlNlYXJjaDogIiR7dGhpcy5lc2NhcGVIdG1sKHF1ZXJ5KX0iPC9zcGFuPgogICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0ic2VhcmNoLXRpbWUiPiR7bmV3IERhdGUoKS50b0xvY2FsZVRpbWVTdHJpbmcoKX08L3NwYW4+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJoZWFkZXItcmlnaHQiPgogICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9InJlc3VsdC1jb3VudCI+JHt0b3RhbF9mb3VuZH0gcmVzdWx0JHt0b3RhbF9mb3VuZCA9PT0gMSA/ICcnIDogJ3MnfTwvc3Bhbj4KICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9InJlc3VsdHMtY29udGFpbmVyIj4KICAgICAgICAgICAgICAke3Jlc3VsdHNIVE1MfQogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iYWN0aW9uLWJ1dHRvbnMiPgogICAgICAgICAgICAgIDxidXR0b24gb25jbGljaz0iQ29tcGxldGVOb3RpY2Vib2FyZEludGVncmF0aW9uLm9wZW5Ob3RpY2Vib2FyZCgnc2VhcmNoJykiIGNsYXNzPSJidG4tcHJpbWFyeSI+CiAgICAgICAgICAgICAgICDwn5SNIE5ldyBTZWFyY2gKICAgICAgICAgICAgICA8L2J1dHRvbj4KICAgICAgICAgICAgICA8YnV0dG9uIG9uY2xpY2s9IkNvbXBsZXRlTm90aWNlYm9hcmRJbnRlZ3JhdGlvbi5vcGVuTm90aWNlYm9hcmQoJ3Bvc3QnKSIgY2xhc3M9ImJ0bi1zZWNvbmRhcnkiPgogICAgICAgICAgICAgICAg8J+TnSBQb3N0IFNvbWV0aGluZwogICAgICAgICAgICAgIDwvYnV0dG9uPgogICAgICAgICAgICAgIDxidXR0b24gb25jbGljaz0iQ29tcGxldGVOb3RpY2Vib2FyZEludGVncmF0aW9uLmJyb3dzZUFsbFBvc3RzKCkiIGNsYXNzPSJidG4tdGVydGlhcnkiPgogICAgICAgICAgICAgICAg8J+TiyBCcm93c2UgQWxsCiAgICAgICAgICAgICAgPC9idXR0b24+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC9kaXY+CiAgICAgICAgYDsKICAgICAgfQogICAgICAKICAgICAgbWVzc2FnZUNvbnRhaW5lci5pbm5lckhUTUwgPSByZXN1bHRIVE1MOwogICAgICBtZXNzYWdlQ29udGFpbmVyLnNjcm9sbEludG9WaWV3KHsgYmVoYXZpb3I6ICdzbW9vdGgnIH0pOwogICAgfSwKICAgIAogICAgLyoqCiAgICAgKiBEaXNwbGF5IHBvc3QgY29uZmlybWF0aW9uCiAgICAgKi8KICAgIGRpc3BsYXlQb3N0Q29uZmlybWF0aW9uKHJlc3BvbnNlRGF0YSkgewogICAgICBjb25zdCBtZXNzYWdlQ29udGFpbmVyID0gdGhpcy5maW5kTWVzc2FnZUNvbnRhaW5lcigpOwogICAgICBpZiAoIW1lc3NhZ2VDb250YWluZXIpIHJldHVybjsKICAgICAgCiAgICAgIGNvbnN0IGNvbmZpcm1hdGlvbkhUTUwgPSBgCiAgICAgICAgPGRpdiBjbGFzcz0ibm90aWNlYm9hcmQtbWVzc2FnZSBwb3N0LWNvbmZpcm1hdGlvbiI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJub3RpY2Vib2FyZC1oZWFkZXIgc3VjY2VzcyI+CiAgICAgICAgICAgIDxoMz7inIUgUG9zdCBTdWNjZXNzZnVsbHkgU3VibWl0dGVkPC9oMz4KICAgICAgICAgICAgPHNwYW4gY2xhc3M9InN0YXR1cy1iYWRnZSI+TGl2ZSBvbiBDb21tdW5pdHkgQm9hcmQ8L3NwYW4+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbmZpcm1hdGlvbi1kZXRhaWxzIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0ic3VjY2Vzcy1hbmltYXRpb24iPvCfjok8L2Rpdj4KICAgICAgICAgICAgPGg0PllvdXIgcG9zdCBpcyBub3cgbGl2ZSE8L2g0PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJkZXRhaWwtZ3JpZCI+CiAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZGV0YWlsLXJvdyI+CiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZGV0YWlsLWxhYmVsIj5UaXRsZTo8L3NwYW4+CiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZGV0YWlsLXZhbHVlIj4ke3RoaXMuZXNjYXBlSHRtbChyZXNwb25zZURhdGEudGl0bGUpfTwvc3Bhbj4KICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJkZXRhaWwtcm93Ij4KICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJkZXRhaWwtbGFiZWwiPk5vdGljZSBJRDo8L3NwYW4+CiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZGV0YWlsLXZhbHVlIj4ke3Jlc3BvbnNlRGF0YS5ub3RpY2VfaWR9PC9zcGFuPgogICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImRldGFpbC1yb3ciPgogICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImRldGFpbC1sYWJlbCI+RXhwaXJlczo8L3NwYW4+CiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZGV0YWlsLXZhbHVlIj4ke3RoaXMuZm9ybWF0RGF0ZShyZXNwb25zZURhdGEuZXhwaXJlc19kYXRlKX08L3NwYW4+CiAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJhY3Rpb24tYnV0dG9ucyI+CiAgICAgICAgICAgIDxidXR0b24gb25jbGljaz0iQ29tcGxldGVOb3RpY2Vib2FyZEludGVncmF0aW9uLmJyb3dzZUFsbFBvc3RzKCkiIGNsYXNzPSJidG4tcHJpbWFyeSI+CiAgICAgICAgICAgICAg8J+TiyBWaWV3IEFsbCBQb3N0cwogICAgICAgICAgICA8L2J1dHRvbj4KICAgICAgICAgICAgPGJ1dHRvbiBvbmNsaWNrPSJDb21wbGV0ZU5vdGljZWJvYXJkSW50ZWdyYXRpb24ub3Blbk5vdGljZWJvYXJkKCdwb3N0JykiIGNsYXNzPSJidG4tc2Vjb25kYXJ5Ij4KICAgICAgICAgICAgICDwn5OdIFBvc3QgQW5vdGhlcgogICAgICAgICAgICA8L2J1dHRvbj4KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgogICAgICBgOwogICAgICAKICAgICAgbWVzc2FnZUNvbnRhaW5lci5pbm5lckhUTUwgPSBjb25maXJtYXRpb25IVE1MOwogICAgICBtZXNzYWdlQ29udGFpbmVyLnNjcm9sbEludG9WaWV3KHsgYmVoYXZpb3I6ICdzbW9vdGgnIH0pOwogICAgfSwKICAgIAogICAgLyoqCiAgICAgKiBCcm93c2UgYWxsIHBvc3RzIGZyb20gbWVzc2FnZSBoaXN0b3J5CiAgICAgKi8KICAgIGJyb3dzZUFsbFBvc3RzKCkgewogICAgICBjb25zb2xlLmxvZygn8J+UjSBCcm93c2luZyBhbGwgY29tbXVuaXR5IHBvc3RzIGZyb20gbWVzc2FnZSBoaXN0b3J5Li4uJyk7CiAgICAgIAogICAgICBjb25zdCBhbGxQb3N0cyA9IHRoaXMuZmluZEFsbENvbW11bml0eVBvc3RzKCk7CiAgICAgIAogICAgICBpZiAoYWxsUG9zdHMubGVuZ3RoID09PSAwKSB7CiAgICAgICAgdGhpcy5kaXNwbGF5QnJvd3NlTWVzc2FnZSgnTm8gY29tbXVuaXR5IHBvc3RzIGZvdW5kIGluIHlvdXIgbWVzc2FnZSBoaXN0b3J5LiBUcnkgc2VhcmNoaW5nIHRvIGRpc2NvdmVyIHBvc3RzIScpOwogICAgICB9IGVsc2UgewogICAgICAgIHRoaXMuZGlzcGxheUFsbFBvc3RzKGFsbFBvc3RzKTsKICAgICAgfQogICAgfSwKICAgIAogICAgLyoqCiAgICAgKiBGaW5kIGFsbCBjb21tdW5pdHkgcG9zdHMgaW4gbWVzc2FnZSBoaXN0b3J5CiAgICAgKi8KICAgIGZpbmRBbGxDb21tdW5pdHlQb3N0cygpIHsKICAgICAgY29uc3QgYWxsUG9zdHMgPSBbXTsKICAgICAgCiAgICAgIHRyeSB7CiAgICAgICAgY29uc3QgbWVzc2FnZVNvdXJjZXMgPSBbCiAgICAgICAgICB3aW5kb3cubWVzc2FnZUxpc3QsCiAgICAgICAgICB3aW5kb3cubWVzc2FnZXMsCiAgICAgICAgICB3aW5kb3cucmVjZW50TWVzc2FnZXMsCiAgICAgICAgICB0aGlzLmdldFN0b3JlZE1lc3NhZ2VzKCkKICAgICAgICBdOwogICAgICAgIAogICAgICAgIGZvciAoY29uc3Qgc291cmNlIG9mIG1lc3NhZ2VTb3VyY2VzKSB7CiAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShzb3VyY2UpKSB7CiAgICAgICAgICAgIGZvciAoY29uc3QgbWVzc2FnZSBvZiBzb3VyY2UpIHsKICAgICAgICAgICAgICBpZiAodGhpcy5pc05vdGljZWJvYXJkUmVzcG9uc2UobWVzc2FnZSkpIHsKICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgIGNvbnN0IGRlY29kZWRDb250ZW50ID0gYXRvYihtZXNzYWdlLm1lc3NhZ2VDb250ZW50KTsKICAgICAgICAgICAgICAgICAgY29uc3QgcmVzcG9uc2VEYXRhID0gSlNPTi5wYXJzZShkZWNvZGVkQ29udGVudCk7CiAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2VEYXRhLnJlc3VsdHMgJiYgQXJyYXkuaXNBcnJheShyZXNwb25zZURhdGEucmVzdWx0cykpIHsKICAgICAgICAgICAgICAgICAgICByZXNwb25zZURhdGEucmVzdWx0cy5mb3JFYWNoKHBvc3QgPT4gewogICAgICAgICAgICAgICAgICAgICAgcG9zdC5zZWFyY2hRdWVyeSA9IHJlc3BvbnNlRGF0YS5xdWVyeTsKICAgICAgICAgICAgICAgICAgICAgIHBvc3Quc2VhcmNoRGF0ZSA9IG1lc3NhZ2UudGltZXN0YW1wIHx8IERhdGUubm93KCk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgYWxsUG9zdHMucHVzaCguLi5yZXNwb25zZURhdGEucmVzdWx0cyk7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ0Vycm9yIHBhcnNpbmcgbWVzc2FnZTonLCBlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgLy8gUmVtb3ZlIGR1cGxpY2F0ZXMgYW5kIHNvcnQKICAgICAgICBjb25zdCB1bmlxdWVQb3N0cyA9IGFsbFBvc3RzLmZpbHRlcigocG9zdCwgaW5kZXgsIHNlbGYpID0+IAogICAgICAgICAgaW5kZXggPT09IHNlbGYuZmluZEluZGV4KHAgPT4gcC50eGlkID09PSBwb3N0LnR4aWQpCiAgICAgICAgKTsKICAgICAgICAKICAgICAgICB1bmlxdWVQb3N0cy5zb3J0KChhLCBiKSA9PiBuZXcgRGF0ZShiLnBvc3RlZF9kYXRlKSAtIG5ldyBEYXRlKGEucG9zdGVkX2RhdGUpKTsKICAgICAgICAKICAgICAgICBjb25zb2xlLmxvZyhg8J+TiyBGb3VuZCAke3VuaXF1ZVBvc3RzLmxlbmd0aH0gdW5pcXVlIGNvbW11bml0eSBwb3N0c2ApOwogICAgICAgIHJldHVybiB1bmlxdWVQb3N0czsKICAgICAgICAKICAgICAgfSBjYXRjaCAoZXJyb3IpIHsKICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBmaW5kaW5nIGNvbW11bml0eSBwb3N0czonLCBlcnJvcik7CiAgICAgICAgcmV0dXJuIFtdOwogICAgICB9CiAgICB9LAogICAgCiAgICAvKioKICAgICAqIERpc3BsYXkgYWxsIGZvdW5kIHBvc3RzCiAgICAgKi8KICAgIGRpc3BsYXlBbGxQb3N0cyhwb3N0cykgewogICAgICBjb25zdCBtZXNzYWdlQ29udGFpbmVyID0gdGhpcy5maW5kTWVzc2FnZUNvbnRhaW5lcigpOwogICAgICBpZiAoIW1lc3NhZ2VDb250YWluZXIpIHJldHVybjsKICAgICAgCiAgICAgIGNvbnN0IHBvc3RzSFRNTCA9IHBvc3RzLm1hcCgocG9zdCwgaW5kZXgpID0+IGAKICAgICAgICA8ZGl2IGNsYXNzPSJjb21tdW5pdHktcG9zdCIgc3R5bGU9ImFuaW1hdGlvbjogc2xpZGVJbiAwLjNzIGVhc2UgJHtpbmRleCAqIDAuMDV9cyBib3RoOyI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJwb3N0LWhlYWRlciI+CiAgICAgICAgICAgIDxoNCBjbGFzcz0icG9zdC10aXRsZSI+JHt0aGlzLmVzY2FwZUh0bWwocG9zdC50aXRsZSl9PC9oND4KICAgICAgICAgICAgPGRpdiBjbGFzcz0icG9zdC1jYXRlZ29yaWVzIj4KICAgICAgICAgICAgICAke3Bvc3QuY2F0ZWdvcmllcz8ubWFwKGNhdCA9PiBgPHNwYW4gY2xhc3M9ImNhdGVnb3J5LXRhZyI+JHt0aGlzLmVzY2FwZUh0bWwoY2F0KX08L3NwYW4+YCkuam9pbignJykgfHwgJyd9CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJwb3N0LWNvbnRlbnQiPiR7dGhpcy5lc2NhcGVIdG1sKHBvc3QuY29udGVudCl9PC9kaXY+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJwb3N0LW1ldGEiPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJtZXRhLWxlZnQiPgogICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJwb3N0LWRhdGUiPvCfk4UgJHt0aGlzLmZvcm1hdERhdGUocG9zdC5wb3N0ZWRfZGF0ZSl9PC9zcGFuPgogICAgICAgICAgICAgICR7cG9zdC5zZWFyY2hRdWVyeSA/IGA8c3BhbiBjbGFzcz0ic2VhcmNoLWluZm8iPkZvdW5kIHZpYTogIiR7cG9zdC5zZWFyY2hRdWVyeX0iPC9zcGFuPmAgOiAnJ30KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1ldGEtcmlnaHQiPgogICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHBzOi8vd2hhdHNvbmNoYWluLmNvbS90eC8ke3Bvc3QudHhpZH0iIHRhcmdldD0iX2JsYW5rIiBjbGFzcz0iYmxvY2tjaGFpbi1saW5rIj4KICAgICAgICAgICAgICAgIPCflJcgVmVyaWZ5CiAgICAgICAgICAgICAgPC9hPgogICAgICAgICAgICAgIDxidXR0b24gb25jbGljaz0iQ29tcGxldGVOb3RpY2Vib2FyZEludGVncmF0aW9uLmNvbnRhY3RQb3N0ZXIoJyR7cG9zdC50eGlkfScpIiBjbGFzcz0iY29udGFjdC1idG4iPgogICAgICAgICAgICAgICAg8J+SrCBDb250YWN0CiAgICAgICAgICAgICAgPC9idXR0b24+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICAgIGApLmpvaW4oJycpOwogICAgICAKICAgICAgY29uc3QgYnJvd3NlSFRNTCA9IGAKICAgICAgICA8ZGl2IGNsYXNzPSJub3RpY2Vib2FyZC1tZXNzYWdlIGJyb3dzZS1hbGwiPgogICAgICAgICAgPGRpdiBjbGFzcz0ibm90aWNlYm9hcmQtaGVhZGVyIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iaGVhZGVyLWxlZnQiPgogICAgICAgICAgICAgIDxoMz7wn5OLIEFsbCBDb21tdW5pdHkgUG9zdHM8L2gzPgogICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImJyb3dzZS1zdW1tYXJ5Ij4KICAgICAgICAgICAgICAgIDxzcGFuPkZyb20geW91ciBtZXNzYWdlIGhpc3Rvcnk8L3NwYW4+CiAgICAgICAgICAgICAgICA8c3Bhbj4ke3Bvc3RzLmxlbmd0aH0gdG90YWwgcG9zdCR7cG9zdHMubGVuZ3RoID09PSAxID8gJycgOiAncyd9PC9zcGFuPgogICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iaGVhZGVyLXJpZ2h0Ij4KICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0icmVzdWx0LWNvdW50Ij4ke3Bvc3RzLmxlbmd0aH0gRm91bmQ8L3NwYW4+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJyZXN1bHRzLWNvbnRhaW5lciI+CiAgICAgICAgICAgICR7cG9zdHNIVE1MfQogICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJhY3Rpb24tYnV0dG9ucyI+CiAgICAgICAgICAgIDxidXR0b24gb25jbGljaz0iQ29tcGxldGVOb3RpY2Vib2FyZEludGVncmF0aW9uLm9wZW5Ob3RpY2Vib2FyZCgnc2VhcmNoJykiIGNsYXNzPSJidG4tcHJpbWFyeSI+CiAgICAgICAgICAgICAg8J+UjSBTZWFyY2ggUG9zdHMKICAgICAgICAgICAgPC9idXR0b24+CiAgICAgICAgICAgIDxidXR0b24gb25jbGljaz0iQ29tcGxldGVOb3RpY2Vib2FyZEludGVncmF0aW9uLm9wZW5Ob3RpY2Vib2FyZCgncG9zdCcpIiBjbGFzcz0iYnRuLXNlY29uZGFyeSI+CiAgICAgICAgICAgICAg8J+TnSBBZGQgTmV3IFBvc3QKICAgICAgICAgICAgPC9idXR0b24+CiAgICAgICAgICAgIDxidXR0b24gb25jbGljaz0iQ29tcGxldGVOb3RpY2Vib2FyZEludGVncmF0aW9uLnJlZnJlc2hQb3N0cygpIiBjbGFzcz0iYnRuLXRlcnRpYXJ5Ij4KICAgICAgICAgICAgICDwn5SEIFJlZnJlc2gKICAgICAgICAgICAgPC9idXR0b24+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgYDsKICAgICAgCiAgICAgIG1lc3NhZ2VDb250YWluZXIuaW5uZXJIVE1MID0gYnJvd3NlSFRNTDsKICAgICAgbWVzc2FnZUNvbnRhaW5lci5zY3JvbGxJbnRvVmlldyh7IGJlaGF2aW9yOiAnc21vb3RoJyB9KTsKICAgIH0sCiAgICAKICAgIC8qKgogICAgICogU2hvdyBzZWFyY2ggbG9hZGluZyB3aXRoIHByb2dyZXNzCiAgICAgKi8KICAgIHNob3dTZWFyY2hMb2FkaW5nKHF1ZXJ5KSB7CiAgICAgIGNvbnN0IGNvbnRlbnRBcmVhID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ25vdGljZWJvYXJkQ29udGVudEFyZWEnKTsKICAgICAgaWYgKCFjb250ZW50QXJlYSkgcmV0dXJuOwogICAgICAKICAgICAgbGV0IHNlY29uZHMgPSAwOwogICAgICAKICAgICAgY29uc3QgdXBkYXRlTG9hZGluZyA9ICgpID0+IHsKICAgICAgICBjb25zdCBwcm9ncmVzcyA9IE1hdGgubWluKChzZWNvbmRzIC8gNjApICogMTAwLCAxMDApOwogICAgICAgIAogICAgICAgIGNvbnRlbnRBcmVhLmlubmVySFRNTCA9IGAKICAgICAgICAgIDxkaXYgY2xhc3M9InNlYXJjaC1sb2FkaW5nIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0ibG9hZGluZy1hbmltYXRpb24iPgogICAgICAgICAgICAgIDxkaXYgY2xhc3M9InNwaW5uZXIiPjwvZGl2PgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGgyPvCflI0gU2VhcmNoaW5nIGZvciAiJHtxdWVyeX0iPC9oMj4KICAgICAgICAgICAgPHAgY2xhc3M9ImxvYWRpbmctc3RhdHVzIj5Zb3VyIHNlYXJjaCByZXF1ZXN0IGhhcyBiZWVuIHNlbnQgdG8gdGhlIGNvbW11bml0eSBzZW50aW5lbC4uLjwvcD4KICAgICAgICAgICAgPGRpdiBjbGFzcz0icHJvZ3Jlc3MtY29udGFpbmVyIj4KICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwcm9ncmVzcy1iYXIiPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icHJvZ3Jlc3MtZmlsbCIgc3R5bGU9IndpZHRoOiAke3Byb2dyZXNzfSUiPjwvZGl2PgogICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJwcm9ncmVzcy10ZXh0Ij4ke3NlY29uZHN9cyBlbGFwc2VkPC9zcGFuPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0ibG9hZGluZy1zdGVwcyI+CiAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ic3RlcCBjb21wbGV0ZWQiPgogICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9InN0ZXAtaWNvbiI+4pyFPC9zcGFuPgogICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9InN0ZXAtdGV4dCI+VHJhbnNhY3Rpb24gc2VudCAoNjUwIHNhdHMpPC9zcGFuPgogICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgIDxkaXYgY2xhc3M9InN0ZXAgJHtzZWNvbmRzID4gNSA/ICdjb21wbGV0ZWQnIDogJ2FjdGl2ZSd9Ij4KICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJzdGVwLWljb24iPiR7c2Vjb25kcyA+IDUgPyAn4pyFJyA6ICfij7MnfTwvc3Bhbj4KICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJzdGVwLXRleHQiPlNlbnRpbmVsIHByb2Nlc3NpbmcgcXVlcnk8L3NwYW4+CiAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ic3RlcCAke3NlY29uZHMgPiAxNSA/ICdhY3RpdmUnIDogJyd9Ij4KICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJzdGVwLWljb24iPuKPszwvc3Bhbj4KICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJzdGVwLXRleHQiPlNlYXJjaGluZyBjb21tdW5pdHkgZGF0YWJhc2U8L3NwYW4+CiAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8YnV0dG9uIG9uY2xpY2s9IkNvbXBsZXRlTm90aWNlYm9hcmRJbnRlZ3JhdGlvbi5jYW5jZWxTZWFyY2goKSIgY2xhc3M9ImNhbmNlbC1idG4iPgogICAgICAgICAgICAgIENhbmNlbCBTZWFyY2gKICAgICAgICAgICAgPC9idXR0b24+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICBgOwogICAgICB9OwogICAgICAKICAgICAgdXBkYXRlTG9hZGluZygpOwogICAgICAKICAgICAgY29uc3QgdGltZXIgPSBzZXRJbnRlcnZhbCgoKSA9PiB7CiAgICAgICAgc2Vjb25kcysrOwogICAgICAgIHVwZGF0ZUxvYWRpbmcoKTsKICAgICAgICAKICAgICAgICBpZiAoc2Vjb25kcyA+PSA2MCkgewogICAgICAgICAgY2xlYXJJbnRlcnZhbCh0aW1lcik7CiAgICAgICAgICB0aGlzLnNob3dTZWFyY2hUaW1lb3V0KHF1ZXJ5KTsKICAgICAgICB9CiAgICAgIH0sIDEwMDApOwogICAgICAKICAgICAgdGhpcy5zZWFyY2hUaW1lciA9IHRpbWVyOwogICAgfSwKICAgIAogICAgLyoqCiAgICAgKiBNb25pdG9yIGZvciBzZWFyY2ggcmVzcG9uc2UKICAgICAqLwogICAgbW9uaXRvckZvclNlYXJjaFJlc3BvbnNlKG9yaWdpbmFsUXVlcnkpIHsKICAgICAgY29uc29sZS5sb2coJ+KPsyBNb25pdG9yaW5nIGZvciBzZWFyY2ggcmVzcG9uc2UuLi4nKTsKICAgICAgCiAgICAgIGxldCBhdHRlbXB0cyA9IDA7CiAgICAgIGNvbnN0IG1heEF0dGVtcHRzID0gNjA7CiAgICAgIGxldCByZXNwb25zZVJlY2VpdmVkID0gZmFsc2U7CiAgICAgIAogICAgICBjb25zdCBjaGVja0ZvclJlc3BvbnNlID0gc2V0SW50ZXJ2YWwoKCkgPT4gewogICAgICAgIGlmIChyZXNwb25zZVJlY2VpdmVkKSB7CiAgICAgICAgICBjbGVhckludGVydmFsKGNoZWNrRm9yUmVzcG9uc2UpOwogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICAKICAgICAgICBhdHRlbXB0cysrOwogICAgICAgIAogICAgICAgIHRyeSB7CiAgICAgICAgICBjb25zdCByZXNwb25zZSA9IHRoaXMuY2hlY2tGb3JSZXNwb25zZShvcmlnaW5hbFF1ZXJ5KTsKICAgICAgICAgIAogICAgICAgICAgaWYgKHJlc3BvbnNlKSB7CiAgICAgICAgICAgIHJlc3BvbnNlUmVjZWl2ZWQgPSB0cnVlOwogICAgICAgICAgICBjbGVhckludGVydmFsKGNoZWNrRm9yUmVzcG9uc2UpOwogICAgICAgICAgICAKICAgICAgICAgICAgaWYgKHRoaXMuc2VhcmNoVGltZXIpIHsKICAgICAgICAgICAgICBjbGVhckludGVydmFsKHRoaXMuc2VhcmNoVGltZXIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIAogICAgICAgICAgICBjb25zb2xlLmxvZygn4pyFIFNlYXJjaCByZXNwb25zZSByZWNlaXZlZCEnLCByZXNwb25zZSk7CiAgICAgICAgICAgIAogICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHsKICAgICAgICAgICAgICBpZiAoIWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5zZWFyY2gtcmVzdWx0cycpKSB7CiAgICAgICAgICAgICAgICB0aGlzLmRpc3BsYXlTZWFyY2hSZXN1bHRzKHJlc3BvbnNlKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sIDEwMDApOwogICAgICAgICAgICAKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgfQogICAgICAgICAgCiAgICAgICAgICBpZiAoYXR0ZW1wdHMgPj0gbWF4QXR0ZW1wdHMpIHsKICAgICAgICAgICAgY2xlYXJJbnRlcnZhbChjaGVja0ZvclJlc3BvbnNlKTsKICAgICAgICAgICAgdGhpcy5zaG93U2VhcmNoVGltZW91dChvcmlnaW5hbFF1ZXJ5KTsKICAgICAgICAgIH0KICAgICAgICAgIAogICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7CiAgICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBjaGVja2luZyBmb3IgcmVzcG9uc2U6JywgZXJyb3IpOwogICAgICAgIH0KICAgICAgfSwgMTAwMCk7CiAgICB9LAogICAgCiAgICAvKioKICAgICAqIENoZWNrIGZvciByZXNwb25zZSBpbiBtZXNzYWdlcwogICAgICovCiAgICBjaGVja0ZvclJlc3BvbnNlKGV4cGVjdGVkUXVlcnkpIHsKICAgICAgdHJ5IHsKICAgICAgICBjb25zdCBtZXNzYWdlU291cmNlcyA9IFt3aW5kb3cubWVzc2FnZUxpc3QsIHdpbmRvdy5tZXNzYWdlc107CiAgICAgICAgCiAgICAgICAgZm9yIChjb25zdCBzb3VyY2Ugb2YgbWVzc2FnZVNvdXJjZXMpIHsKICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHNvdXJjZSkgJiYgc291cmNlLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgY29uc3QgcmVjZW50TWVzc2FnZXMgPSBzb3VyY2Uuc2xpY2UoLTUpOwogICAgICAgICAgICAKICAgICAgICAgICAgZm9yIChjb25zdCBtZXNzYWdlIG9mIHJlY2VudE1lc3NhZ2VzKSB7CiAgICAgICAgICAgICAgaWYgKHRoaXMuaXNOb3RpY2Vib2FyZFJlc3BvbnNlKG1lc3NhZ2UpKSB7CiAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICBjb25zdCBkZWNvZGVkQ29udGVudCA9IGF0b2IobWVzc2FnZS5tZXNzYWdlQ29udGVudCk7CiAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlRGF0YSA9IEpTT04ucGFyc2UoZGVjb2RlZENvbnRlbnQpOwogICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlRGF0YS5xdWVyeSAmJiBBcnJheS5pc0FycmF5KHJlc3BvbnNlRGF0YS5yZXN1bHRzKSkgewogICAgICAgICAgICAgICAgICAgIGlmICghZXhwZWN0ZWRRdWVyeSB8fCByZXNwb25zZURhdGEucXVlcnkgPT09IGV4cGVjdGVkUXVlcnkpIHsKICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXNwb25zZURhdGE7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdFcnJvciBwYXJzaW5nIG1lc3NhZ2U6JywgZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIAogICAgICAgIHJldHVybiBudWxsOwogICAgICB9IGNhdGNoIChlcnJvcikgewogICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGNoZWNraW5nIGZvciByZXNwb25zZTonLCBlcnJvcik7CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgIH0KICAgIH0sCiAgICAKICAgIC8qKgogICAgICogU2V0dXAgYnJvd3NpbmcgZnVuY3Rpb25hbGl0eQogICAgICovCiAgICBzZXR1cEJyb3dzaW5nRnVuY3Rpb25hbGl0eSgpIHsKICAgICAgY29uc3QgYWRkQnJvd3NlQnV0dG9uID0gKCkgPT4gewogICAgICAgIGlmICh3aW5kb3cuTm90aWNlYm9hcmRBY3Rpb25zKSB7CiAgICAgICAgICB3aW5kb3cuTm90aWNlYm9hcmRBY3Rpb25zLmJyb3dzZUFsbFBvc3RzID0gKCkgPT4gdGhpcy5icm93c2VBbGxQb3N0cygpOwogICAgICAgICAgY29uc29sZS5sb2coJ+KchSBBZGRlZCBicm93c2UgZnVuY3Rpb25hbGl0eSB0byBOb3RpY2Vib2FyZEFjdGlvbnMnKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgc2V0VGltZW91dChhZGRCcm93c2VCdXR0b24sIDIwMDApOwogICAgICAgIH0KICAgICAgfTsKICAgICAgCiAgICAgIGFkZEJyb3dzZUJ1dHRvbigpOwogICAgfSwKICAgIAogICAgLyoqCiAgICAgKiBBZGQgZ2xvYmFsIGhlbHBlciBmdW5jdGlvbnMKICAgICAqLwogICAgYWRkR2xvYmFsSGVscGVycygpIHsKICAgICAgd2luZG93LmJyb3dzZUFsbENvbW11bml0eVBvc3RzID0gKCkgPT4gewogICAgICAgIGNvbnN0IHBvc3RzID0gdGhpcy5maW5kQWxsQ29tbXVuaXR5UG9zdHMoKTsKICAgICAgICBjb25zb2xlLmxvZygn8J+TiyBGb3VuZCBjb21tdW5pdHkgcG9zdHM6JywgcG9zdHMpOwogICAgICAgIHJldHVybiBwb3N0czsKICAgICAgfTsKICAgICAgCiAgICAgIHdpbmRvdy5jaGVja0Zvck5vdGljZWJvYXJkUmVzcG9uc2VzID0gKCkgPT4gewogICAgICAgIGNvbnNvbGUubG9nKCfwn5SNIENoZWNraW5nIGZvciBub3RpY2Vib2FyZCByZXNwb25zZXMuLi4nKTsKICAgICAgICBjb25zdCBmb3VuZCA9IHRoaXMuY2hlY2tGb3JSZXNwb25zZSgpOwogICAgICAgIGlmIChmb3VuZCkgewogICAgICAgICAgY29uc29sZS5sb2coJ+KchSBGb3VuZCByZXNwb25zZTonLCBmb3VuZCk7CiAgICAgICAgICB0aGlzLmRpc3BsYXlTZWFyY2hSZXN1bHRzKGZvdW5kKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgY29uc29sZS5sb2coJ+KdjCBObyByZXNwb25zZXMgZm91bmQnKTsKICAgICAgICAgIGFsZXJ0KCdObyBub3RpY2Vib2FyZCByZXNwb25zZXMgZm91bmQgaW4gcmVjZW50IG1lc3NhZ2VzJyk7CiAgICAgICAgfQogICAgICB9OwogICAgICAKICAgICAgd2luZG93LnRlc3ROb3RpY2Vib2FyZERpc3BsYXkgPSAoKSA9PiB7CiAgICAgICAgY29uc3QgdGVzdFJlc3BvbnNlID0gewogICAgICAgICAgcXVlcnk6ICJ0ZXN0IiwKICAgICAgICAgIHRvdGFsX2ZvdW5kOiAyLAogICAgICAgICAgcmVzdWx0czogWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgdHhpZDogInRlc3QxMjNhYmMiLAogICAgICAgICAgICAgIHRpdGxlOiAiVGVzdCBDb21tdW5pdHkgUG9zdCIsCiAgICAgICAgICAgICAgY29udGVudDogIlRoaXMgaXMgYSB0ZXN0IHBvc3QgdG8gdmVyaWZ5IHRoZSBkaXNwbGF5IHN5c3RlbSBpcyB3b3JraW5nIGNvcnJlY3RseS4iLAogICAgICAgICAgICAgIHBvc3RlZF9kYXRlOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksCiAgICAgICAgICAgICAgY2F0ZWdvcmllczogWyJ0ZXN0IiwgImNvbW11bml0eSJdCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICB0eGlkOiAidGVzdDQ1NmRlZiIsIAogICAgICAgICAgICAgIHRpdGxlOiAiQW5vdGhlciBUZXN0IFBvc3QiLAogICAgICAgICAgICAgIGNvbnRlbnQ6ICJTZWNvbmQgdGVzdCBwb3N0IHdpdGggZGlmZmVyZW50IGNvbnRlbnQgdG8gc2hvdyBtdWx0aXBsZSByZXN1bHRzLiIsCiAgICAgICAgICAgICAgcG9zdGVkX2RhdGU6IG5ldyBEYXRlKERhdGUubm93KCkgLSA4NjQwMDAwMCkudG9JU09TdHJpbmcoKSwKICAgICAgICAgICAgICBjYXRlZ29yaWVzOiBbInRlc3QiXQogICAgICAgICAgICB9CiAgICAgICAgICBdCiAgICAgICAgfTsKICAgICAgICAKICAgICAgICB0aGlzLmRpc3BsYXlTZWFyY2hSZXN1bHRzKHRlc3RSZXNwb25zZSk7CiAgICAgIH07CiAgICB9LAogICAgCiAgICAvKioKICAgICAqIFV0aWxpdHkgRnVuY3Rpb25zCiAgICAgKi8KICAgIG9wZW5Ob3RpY2Vib2FyZChhY3Rpb24gPSBudWxsKSB7CiAgICAgIGlmICh0eXBlb2Ygd2luZG93LnNob3dOb3RpY2Vib2FyZCA9PT0gJ2Z1bmN0aW9uJykgewogICAgICAgIHdpbmRvdy5zaG93Tm90aWNlYm9hcmQoKTsKICAgICAgICAKICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHsKICAgICAgICAgIGlmIChhY3Rpb24gPT09ICdzZWFyY2gnICYmIHdpbmRvdy5Ob3RpY2Vib2FyZEFjdGlvbnM/LnNob3dTZWFyY2hGb3JtKSB7CiAgICAgICAgICAgIHdpbmRvdy5Ob3RpY2Vib2FyZEFjdGlvbnMuc2hvd1NlYXJjaEZvcm0oKTsKICAgICAgICAgIH0gZWxzZSBpZiAoYWN0aW9uID09PSAncG9zdCcgJiYgd2luZG93Lk5vdGljZWJvYXJkQWN0aW9ucz8uc2hvd1Bvc3RGb3JtKSB7CiAgICAgICAgICAgIHdpbmRvdy5Ob3RpY2Vib2FyZEFjdGlvbnMuc2hvd1Bvc3RGb3JtKCk7CiAgICAgICAgICB9CiAgICAgICAgfSwgNTAwKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBhbGVydCgnTm90aWNlYm9hcmQgaW50ZXJmYWNlIG5vdCBhdmFpbGFibGUnKTsKICAgICAgfQogICAgfSwKICAgIAogICAgY29udGFjdFBvc3Rlcih0eGlkKSB7CiAgICAgIGFsZXJ0KGBDb250YWN0IGZ1bmN0aW9uYWxpdHkgZm9yIHBvc3QgJHt0eGlkfS5cblxuVGhpcyB3b3VsZCBpbnRlZ3JhdGUgd2l0aCB5b3VyIG1lc3NhZ2luZyBzeXN0ZW0gdG8gY29udGFjdCB0aGUgcG9zdGVyLmApOwogICAgfSwKICAgIAogICAgY2FuY2VsU2VhcmNoKCkgewogICAgICBpZiAodGhpcy5zZWFyY2hUaW1lcikgewogICAgICAgIGNsZWFySW50ZXJ2YWwodGhpcy5zZWFyY2hUaW1lcik7CiAgICAgIH0KICAgICAgCiAgICAgIGlmICh3aW5kb3cuR2F0ZXdheU5vdGljZWJvYXJkPy5zaG93V2VsY29tZSkgewogICAgICAgIHdpbmRvdy5HYXRld2F5Tm90aWNlYm9hcmQuc2hvd1dlbGNvbWUoKTsKICAgICAgfQogICAgfSwKICAgIAogICAgcmVmcmVzaFBvc3RzKCkgewogICAgICB0aGlzLmJyb3dzZUFsbFBvc3RzKCk7CiAgICB9LAogICAgCiAgICBkaXNwbGF5QnJvd3NlTWVzc2FnZShtZXNzYWdlKSB7CiAgICAgIGNvbnN0IG1lc3NhZ2VDb250YWluZXIgPSB0aGlzLmZpbmRNZXNzYWdlQ29udGFpbmVyKCk7CiAgICAgIGlmICghbWVzc2FnZUNvbnRhaW5lcikgcmV0dXJuOwogICAgICAKICAgICAgY29uc3QgYnJvd3NlSFRNTCA9IGAKICAgICAgICA8ZGl2IGNsYXNzPSJub3RpY2Vib2FyZC1tZXNzYWdlIGJyb3dzZS1lbXB0eSI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJub3RpY2Vib2FyZC1oZWFkZXIiPgogICAgICAgICAgICA8aDM+8J+TiyBDb21tdW5pdHkgUG9zdHM8L2gzPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJlbXB0eS1jb250ZW50Ij4KICAgICAgICAgICAgPHA+JHttZXNzYWdlfTwvcD4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iYWN0aW9uLWJ1dHRvbnMiPgogICAgICAgICAgICAgIDxidXR0b24gb25jbGljaz0iQ29tcGxldGVOb3RpY2Vib2FyZEludGVncmF0aW9uLm9wZW5Ob3RpY2Vib2FyZCgnc2VhcmNoJykiIGNsYXNzPSJidG4tcHJpbWFyeSI+CiAgICAgICAgICAgICAgICDwn5SNIFNlYXJjaCBDb21tdW5pdHkKICAgICAgICAgICAgICA8L2J1dHRvbj4KICAgICAgICAgICAgICA8YnV0dG9uIG9uY2xpY2s9IkNvbXBsZXRlTm90aWNlYm9hcmRJbnRlZ3JhdGlvbi5vcGVuTm90aWNlYm9hcmQoJ3Bvc3QnKSIgY2xhc3M9ImJ0bi1zZWNvbmRhcnkiPgogICAgICAgICAgICAgICAg8J+TnSBQb3N0IFNvbWV0aGluZwogICAgICAgICAgICAgIDwvYnV0dG9uPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgogICAgICBgOwogICAgICAKICAgICAgbWVzc2FnZUNvbnRhaW5lci5pbm5lckhUTUwgPSBicm93c2VIVE1MOwogICAgfSwKICAgIAogICAgZGlzcGxheUdlbmVyaWNSZXNwb25zZShyZXNwb25zZURhdGEpIHsKICAgICAgY29uc3QgbWVzc2FnZUNvbnRhaW5lciA9IHRoaXMuZmluZE1lc3NhZ2VDb250YWluZXIoKTsKICAgICAgaWYgKCFtZXNzYWdlQ29udGFpbmVyKSByZXR1cm47CiAgICAgIAogICAgICBjb25zdCBnZW5lcmljSFRNTCA9IGAKICAgICAgICA8ZGl2IGNsYXNzPSJub3RpY2Vib2FyZC1tZXNzYWdlIGdlbmVyaWMiPgogICAgICAgICAgPGRpdiBjbGFzcz0ibm90aWNlYm9hcmQtaGVhZGVyIj4KICAgICAgICAgICAgPGgzPvCfk4sgQ29tbXVuaXR5IE5vdGljZWJvYXJkIFJlc3BvbnNlPC9oMz4KICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPGRpdiBjbGFzcz0iZ2VuZXJpYy1jb250ZW50Ij4KICAgICAgICAgICAgPHByZT4ke0pTT04uc3RyaW5naWZ5KHJlc3BvbnNlRGF0YSwgbnVsbCwgMil9PC9wcmU+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDxkaXYgY2xhc3M9ImFjdGlvbi1idXR0b25zIj4KICAgICAgICAgICAgPGJ1dHRvbiBvbmNsaWNrPSJDb21wbGV0ZU5vdGljZWJvYXJkSW50ZWdyYXRpb24ub3Blbk5vdGljZWJvYXJkKCkiIGNsYXNzPSJidG4tcHJpbWFyeSI+CiAgICAgICAgICAgICAg8J+TiyBPcGVuIE5vdGljZWJvYXJkCiAgICAgICAgICAgIDwvYnV0dG9uPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICAgIGA7CiAgICAgIAogICAgICBtZXNzYWdlQ29udGFpbmVyLmlubmVySFRNTCA9IGdlbmVyaWNIVE1MOwogICAgfSwKICAgIAogICAgc2hvd1NlYXJjaFRpbWVvdXQocXVlcnkpIHsKICAgICAgY29uc3QgY29udGVudEFyZWEgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbm90aWNlYm9hcmRDb250ZW50QXJlYScpOwogICAgICBpZiAoIWNvbnRlbnRBcmVhKSByZXR1cm47CiAgICAgIAogICAgICBjb250ZW50QXJlYS5pbm5lckhUTUwgPSBgCiAgICAgICAgPGRpdiBjbGFzcz0ic2VhcmNoLXRpbWVvdXQiPgogICAgICAgICAgPGRpdiBjbGFzcz0idGltZW91dC1pY29uIj7ij7HvuI88L2Rpdj4KICAgICAgICAgIDxoMz5TZWFyY2ggVGFraW5nIExvbmdlciBUaGFuIEV4cGVjdGVkPC9oMz4KICAgICAgICAgIDxwPllvdXIgc2VhcmNoIGZvciAiJHtxdWVyeX0iIHdhcyBzZW50IHN1Y2Nlc3NmdWxseSwgYnV0IHRoZSByZXNwb25zZSBpcyBkZWxheWVkLjwvcD4KICAgICAgICAgIDxkaXYgY2xhc3M9ImFjdGlvbi1idXR0b25zIj4KICAgICAgICAgICAgPGJ1dHRvbiBvbmNsaWNrPSJ3aW5kb3cuY2hlY2tGb3JOb3RpY2Vib2FyZFJlc3BvbnNlcygpIiBjbGFzcz0iYnRuLXByaW1hcnkiPgogICAgICAgICAgICAgIPCflI0gQ2hlY2sgZm9yIFJlc3BvbnNlCiAgICAgICAgICAgIDwvYnV0dG9uPgogICAgICAgICAgICA8YnV0dG9uIG9uY2xpY2s9IkNvbXBsZXRlTm90aWNlYm9hcmRJbnRlZ3JhdGlvbi5vcGVuTm90aWNlYm9hcmQoJ3NlYXJjaCcpIiBjbGFzcz0iYnRuLXNlY29uZGFyeSI+CiAgICAgICAgICAgICAg8J+UhCBUcnkgQWdhaW4KICAgICAgICAgICAgPC9idXR0b24+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgYDsKICAgIH0sCiAgICAKICAgIGZpbmRNZXNzYWdlQ29udGFpbmVyKCkgewogICAgICBjb25zdCBjb250YWluZXJzID0gWwogICAgICAgICcjbWVzc2FnZUNvbnRlbnQnLAogICAgICAgICcjbWVzc2FnZURpc3BsYXknLAogICAgICAgICcubWVzc2FnZS1jb250ZW50JywKICAgICAgICAnLm1lc3NhZ2UtZGlzcGxheScsCiAgICAgICAgJy5jb250ZW50LWFyZWEnLAogICAgICAgICcjbWFpbkNvbnRlbnQnLAogICAgICAgICcjbm90aWNlYm9hcmRDb250ZW50QXJlYScKICAgICAgXTsKICAgICAgCiAgICAgIGZvciAoY29uc3Qgc2VsZWN0b3Igb2YgY29udGFpbmVycykgewogICAgICAgIGNvbnN0IGNvbnRhaW5lciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3Ioc2VsZWN0b3IpOwogICAgICAgIGlmIChjb250YWluZXIpIHsKICAgICAgICAgIGNvbnNvbGUubG9nKGDwn5OmIFVzaW5nIGNvbnRhaW5lcjogJHtzZWxlY3Rvcn1gKTsKICAgICAgICAgIHJldHVybiBjb250YWluZXI7CiAgICAgICAgfQogICAgICB9CiAgICAgIAogICAgICBjb25zb2xlLmVycm9yKCfinYwgQ291bGQgbm90IGZpbmQgbWVzc2FnZSBjb250YWluZXInKTsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9LAogICAgCiAgICBnZXRTdG9yZWRNZXNzYWdlcygpIHsKICAgICAgdHJ5IHsKICAgICAgICBjb25zdCBzdG9yZWQgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnbWVzc2FnZXMnKSB8fCBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnbWVzc2FnZUxpc3QnKTsKICAgICAgICByZXR1cm4gc3RvcmVkID8gSlNPTi5wYXJzZShzdG9yZWQpIDogbnVsbDsKICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgIHJldHVybiBudWxsOwogICAgICB9CiAgICB9LAogICAgCiAgICBlc2NhcGVIdG1sKHRleHQpIHsKICAgICAgY29uc3QgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CiAgICAgIGRpdi50ZXh0Q29udGVudCA9IHRleHQ7CiAgICAgIHJldHVybiBkaXYuaW5uZXJIVE1MOwogICAgfSwKICAgIAogICAgZm9ybWF0RGF0ZShkYXRlU3RyaW5nKSB7CiAgICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZShkYXRlU3RyaW5nKTsKICAgICAgY29uc3Qgbm93ID0gbmV3IERhdGUoKTsKICAgICAgY29uc3QgZGlmZlRpbWUgPSBNYXRoLmFicyhub3cgLSBkYXRlKTsKICAgICAgY29uc3QgZGlmZkRheXMgPSBNYXRoLmNlaWwoZGlmZlRpbWUgLyAoMTAwMCAqIDYwICogNjAgKiAyNCkpOwogICAgICAKICAgICAgaWYgKGRpZmZEYXlzID09PSAxKSByZXR1cm4gJ1llc3RlcmRheSc7CiAgICAgIGlmIChkaWZmRGF5cyA8PSA3KSByZXR1cm4gYCR7ZGlmZkRheXN9IGRheXMgYWdvYDsKICAgICAgcmV0dXJuIGRhdGUudG9Mb2NhbGVEYXRlU3RyaW5nKCk7CiAgICB9LAogICAgCiAgICAvKioKICAgICAqIEluamVjdCBDU1Mgc3R5bGVzCiAgICAgKi8KICAgIGluamVjdFN0eWxlcygpIHsKICAgICAgaWYgKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdub3RpY2Vib2FyZE1lc3NhZ2VTdHlsZXMnKSkgcmV0dXJuOwogICAgICAKICAgICAgY29uc3Qgc3R5bGVzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3R5bGUnKTsKICAgICAgc3R5bGVzLmlkID0gJ25vdGljZWJvYXJkTWVzc2FnZVN0eWxlcyc7CiAgICAgIHN0eWxlcy50ZXh0Q29udGVudCA9IGAKICAgICAgICAubm90aWNlYm9hcmQtbWVzc2FnZSB7CiAgICAgICAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoMTM1ZGVnLCAjZjhmYWZjIDAlLCAjZTJlOGYwIDEwMCUpOwogICAgICAgICAgYm9yZGVyOiAycHggc29saWQgIzRmYWNmZTsKICAgICAgICAgIGJvcmRlci1yYWRpdXM6IDE1cHg7CiAgICAgICAgICBwYWRkaW5nOiAyNXB4OwogICAgICAgICAgbWFyZ2luOiAyMHB4IDA7CiAgICAgICAgICBmb250LWZhbWlseTogLWFwcGxlLXN5c3RlbSwgQmxpbmtNYWNTeXN0ZW1Gb250LCAnU2Vnb2UgVUknLCBzYW5zLXNlcmlmOwogICAgICAgICAgYm94LXNoYWRvdzogMCA0cHggNnB4IHJnYmEoMCwgMCwgMCwgMC4xKTsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgLm5vdGljZWJvYXJkLWhlYWRlciB7CiAgICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogICAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICAgIG1hcmdpbi1ib3R0b206IDIwcHg7CiAgICAgICAgICBwYWRkaW5nLWJvdHRvbTogMTVweDsKICAgICAgICAgIGJvcmRlci1ib3R0b206IDJweCBzb2xpZCAjZTJlOGYwOwogICAgICAgIH0KICAgICAgICAKICAgICAgICAubm90aWNlYm9hcmQtaGVhZGVyLnN1Y2Nlc3MgewogICAgICAgICAgYm9yZGVyLWJvdHRvbS1jb2xvcjogIzQ4YmI3ODsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgLm5vdGljZWJvYXJkLWhlYWRlciBoMyB7CiAgICAgICAgICBtYXJnaW46IDA7CiAgICAgICAgICBjb2xvcjogIzJkMzc0ODsKICAgICAgICAgIGZvbnQtc2l6ZTogMS4zcmVtOwogICAgICAgIH0KICAgICAgICAKICAgICAgICAuc2VhcmNoLXF1ZXJ5IHsKICAgICAgICAgIGNvbG9yOiAjNGE1NTY4OwogICAgICAgICAgZm9udC1zdHlsZTogaXRhbGljOwogICAgICAgICAgZm9udC1zaXplOiAwLjlyZW07CiAgICAgICAgfQogICAgICAgIAogICAgICAgIC5yZXN1bHQtY291bnQsIC5zdGF0dXMtYmFkZ2UgewogICAgICAgICAgYmFja2dyb3VuZDogIzRmYWNmZTsKICAgICAgICAgIGNvbG9yOiB3aGl0ZTsKICAgICAgICAgIHBhZGRpbmc6IDZweCAxMnB4OwogICAgICAgICAgYm9yZGVyLXJhZGl1czogMjBweDsKICAgICAgICAgIGZvbnQtc2l6ZTogMC44NXJlbTsKICAgICAgICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIC5zdGF0dXMtYmFkZ2UgewogICAgICAgICAgYmFja2dyb3VuZDogIzQ4YmI3ODsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgLnJlc3VsdHMtY29udGFpbmVyIHsKICAgICAgICAgIG1heC1oZWlnaHQ6IDUwMHB4OwogICAgICAgICAgb3ZlcmZsb3cteTogYXV0bzsKICAgICAgICAgIG1hcmdpbjogMjBweCAwOwogICAgICAgIH0KICAgICAgICAKICAgICAgICAuY29tbXVuaXR5LXBvc3QgewogICAgICAgICAgYmFja2dyb3VuZDogd2hpdGU7CiAgICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAjZTJlOGYwOwogICAgICAgICAgYm9yZGVyLXJhZGl1czogMTBweDsKICAgICAgICAgIHBhZGRpbmc6IDIwcHg7CiAgICAgICAgICBtYXJnaW4tYm90dG9tOiAxNXB4OwogICAgICAgICAgdHJhbnNpdGlvbjogYWxsIDAuMnMgZWFzZTsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgLmNvbW11bml0eS1wb3N0OmhvdmVyIHsKICAgICAgICAgIGJveC1zaGFkb3c6IDAgNHB4IDEycHggcmdiYSgwLDAsMCwwLjEpOwogICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC0ycHgpOwogICAgICAgIH0KICAgICAgICAKICAgICAgICAucG9zdC1oZWFkZXIgewogICAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsKICAgICAgICAgIGFsaWduLWl0ZW1zOiBmbGV4LXN0YXJ0OwogICAgICAgICAgbWFyZ2luLWJvdHRvbTogMTJweDsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgLnBvc3QtdGl0bGUgewogICAgICAgICAgbWFyZ2luOiAwOwogICAgICAgICAgY29sb3I6ICMyZDM3NDg7CiAgICAgICAgICBmb250LXNpemU6IDEuMXJlbTsKICAgICAgICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIC5wb3N0LWNhdGVnb3JpZXMgewogICAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICAgIGdhcDogNXB4OwogICAgICAgICAgZmxleC13cmFwOiB3cmFwOwogICAgICAgIH0KICAgICAgICAKICAgICAgICAuY2F0ZWdvcnktdGFnIHsKICAgICAgICAgIGJhY2tncm91bmQ6ICNlZGYyZjc7CiAgICAgICAgICBjb2xvcjogIzRhNTU2ODsKICAgICAgICAgIHBhZGRpbmc6IDNweCA4cHg7CiAgICAgICAgICBib3JkZXItcmFkaXVzOiAxMnB4OwogICAgICAgICAgZm9udC1zaXplOiAwLjc1cmVtOwogICAgICAgICAgZm9udC13ZWlnaHQ6IDUwMDsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgLnBvc3QtY29udGVudCB7CiAgICAgICAgICBjb2xvcjogIzRhNTU2ODsKICAgICAgICAgIGxpbmUtaGVpZ2h0OiAxLjY7CiAgICAgICAgICBtYXJnaW46IDEycHggMDsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgLnBvc3QtbWV0YSB7CiAgICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogICAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICAgIGZvbnQtc2l6ZTogMC44NXJlbTsKICAgICAgICAgIGNvbG9yOiAjNzE4MDk2OwogICAgICAgICAgcGFkZGluZy10b3A6IDEycHg7CiAgICAgICAgICBib3JkZXItdG9wOiAxcHggc29saWQgI2YxZjVmOTsKICAgICAgICAgIGZsZXgtd3JhcDogd3JhcDsKICAgICAgICAgIGdhcDogMTBweDsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgLnNlYXJjaC1pbmZvIHsKICAgICAgICAgIGZvbnQtc3R5bGU6IGl0YWxpYzsKICAgICAgICAgIGNvbG9yOiAjOWNhM2FmOwogICAgICAgIH0KICAgICAgICAKICAgICAgICAuYmxvY2tjaGFpbi1saW5rIHsKICAgICAgICAgIGNvbG9yOiAjNGZhY2ZlOwogICAgICAgICAgdGV4dC1kZWNvcmF0aW9uOiBub25lOwogICAgICAgICAgZm9udC13ZWlnaHQ6IDUwMDsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgLmJsb2NrY2hhaW4tbGluazpob3ZlciB7CiAgICAgICAgICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgLmNvbnRhY3QtYnRuIHsKICAgICAgICAgIGJhY2tncm91bmQ6ICM0OGJiNzg7CiAgICAgICAgICBjb2xvcjogd2hpdGU7CiAgICAgICAgICBib3JkZXI6IG5vbmU7CiAgICAgICAgICBwYWRkaW5nOiA2cHggMTJweDsKICAgICAgICAgIGJvcmRlci1yYWRpdXM6IDZweDsKICAgICAgICAgIGZvbnQtc2l6ZTogMC44cmVtOwogICAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICAgICAgZm9udC13ZWlnaHQ6IDUwMDsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgLmNvbnRhY3QtYnRuOmhvdmVyIHsKICAgICAgICAgIGJhY2tncm91bmQ6ICMzOGExNjk7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIC5hY3Rpb24tYnV0dG9ucyB7CiAgICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgICAgZ2FwOiAxMnB4OwogICAgICAgICAgbWFyZ2luLXRvcDogMjVweDsKICAgICAgICAgIHBhZGRpbmctdG9wOiAyMHB4OwogICAgICAgICAgYm9yZGVyLXRvcDogMXB4IHNvbGlkICNlMmU4ZjA7CiAgICAgICAgICBmbGV4LXdyYXA6IHdyYXA7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIC5idG4tcHJpbWFyeSwgLmJ0bi1zZWNvbmRhcnksIC5idG4tdGVydGlhcnkgewogICAgICAgICAgZmxleDogMTsKICAgICAgICAgIG1pbi13aWR0aDogMTQwcHg7CiAgICAgICAgICBwYWRkaW5nOiAxMnB4IDIwcHg7CiAgICAgICAgICBib3JkZXI6IG5vbmU7CiAgICAgICAgICBib3JkZXItcmFkaXVzOiA4cHg7CiAgICAgICAgICBmb250LXdlaWdodDogNjAwOwogICAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICAgICAgdHJhbnNpdGlvbjogYWxsIDAuMnMgZWFzZTsKICAgICAgICAgIGZvbnQtc2l6ZTogMC45NXJlbTsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgLmJ0bi1wcmltYXJ5IHsKICAgICAgICAgIGJhY2tncm91bmQ6ICM0ZmFjZmU7CiAgICAgICAgICBjb2xvcjogd2hpdGU7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIC5idG4tcHJpbWFyeTpob3ZlciB7CiAgICAgICAgICBiYWNrZ3JvdW5kOiAjMzE4MmNlOwogICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC0xcHgpOwogICAgICAgIH0KICAgICAgICAKICAgICAgICAuYnRuLXNlY29uZGFyeSB7CiAgICAgICAgICBiYWNrZ3JvdW5kOiAjNDhiYjc4OwogICAgICAgICAgY29sb3I6IHdoaXRlOwogICAgICAgIH0KICAgICAgICAKICAgICAgICAuYnRuLXNlY29uZGFyeTpob3ZlciB7CiAgICAgICAgICBiYWNrZ3JvdW5kOiAjMzhhMTY5OwogICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC0xcHgpOwogICAgICAgIH0KICAgICAgICAKICAgICAgICAuYnRuLXRlcnRpYXJ5IHsKICAgICAgICAgIGJhY2tncm91bmQ6ICM3MTgwOTY7CiAgICAgICAgICBjb2xvcjogd2hpdGU7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIC5idG4tdGVydGlhcnk6aG92ZXIgewogICAgICAgICAgYmFja2dyb3VuZDogIzRhNTU2ODsKICAgICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtMXB4KTsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgLnNlYXJjaC1sb2FkaW5nIHsKICAgICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjsKICAgICAgICAgIHBhZGRpbmc6IDYwcHggMjBweDsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgLnNwaW5uZXIgewogICAgICAgICAgd2lkdGg6IDUwcHg7CiAgICAgICAgICBoZWlnaHQ6IDUwcHg7CiAgICAgICAgICBib3JkZXI6IDRweCBzb2xpZCAjZTJlOGYwOwogICAgICAgICAgYm9yZGVyLXRvcDogNHB4IHNvbGlkICM0ZmFjZmU7CiAgICAgICAgICBib3JkZXItcmFkaXVzOiA1MCU7CiAgICAgICAgICBhbmltYXRpb246IHNwaW4gMXMgbGluZWFyIGluZmluaXRlOwogICAgICAgICAgbWFyZ2luOiAwIGF1dG8gMzBweDsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgLnByb2dyZXNzLWNvbnRhaW5lciB7CiAgICAgICAgICBtYXgtd2lkdGg6IDMwMHB4OwogICAgICAgICAgbWFyZ2luOiAyMHB4IGF1dG87CiAgICAgICAgfQogICAgICAgIAogICAgICAgIC5wcm9ncmVzcy1iYXIgewogICAgICAgICAgYmFja2dyb3VuZDogI2UyZThmMDsKICAgICAgICAgIGJvcmRlci1yYWRpdXM6IDEwcHg7CiAgICAgICAgICBoZWlnaHQ6IDhweDsKICAgICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgICAgfQogICAgICAgIAogICAgICAgIC5wcm9ncmVzcy1maWxsIHsKICAgICAgICAgIGJhY2tncm91bmQ6ICM0ZmFjZmU7CiAgICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgICB0cmFuc2l0aW9uOiB3aWR0aCAwLjVzIGVhc2U7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIC5sb2FkaW5nLXN0ZXBzIHsKICAgICAgICAgIG1heC13aWR0aDogNDAwcHg7CiAgICAgICAgICBtYXJnaW46IDMwcHggYXV0bzsKICAgICAgICAgIHRleHQtYWxpZ246IGxlZnQ7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIC5zdGVwIHsKICAgICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgICAgbWFyZ2luOiAxNXB4IDA7CiAgICAgICAgICBvcGFjaXR5OiAwLjU7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIC5zdGVwLmFjdGl2ZSwgLnN0ZXAuY29tcGxldGVkIHsKICAgICAgICAgIG9wYWNpdHk6IDE7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIC5zdGVwLWljb24gewogICAgICAgICAgbWFyZ2luLXJpZ2h0OiAxMHB4OwogICAgICAgICAgd2lkdGg6IDIwcHg7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIC5jYW5jZWwtYnRuIHsKICAgICAgICAgIGJhY2tncm91bmQ6ICNlNTNlM2U7CiAgICAgICAgICBjb2xvcjogd2hpdGU7CiAgICAgICAgICBib3JkZXI6IG5vbmU7CiAgICAgICAgICBwYWRkaW5nOiAxMHB4IDIwcHg7CiAgICAgICAgICBib3JkZXItcmFkaXVzOiA2cHg7CiAgICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgICAgICBtYXJnaW4tdG9wOiAzMHB4OwogICAgICAgIH0KICAgICAgICAKICAgICAgICBAa2V5ZnJhbWVzIHNwaW4gewogICAgICAgICAgMCUgeyB0cmFuc2Zvcm06IHJvdGF0ZSgwZGVnKTsgfQogICAgICAgICAgMTAwJSB7IHRyYW5zZm9ybTogcm90YXRlKDM2MGRlZyk7IH0KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgQGtleWZyYW1lcyBzbGlkZUluIHsKICAgICAgICAgIGZyb20geyBvcGFjaXR5OiAwOyB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoMjBweCk7IH0KICAgICAgICAgIHRvIHsgb3BhY2l0eTogMTsgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDApOyB9CiAgICAgICAgfQogICAgICAgIAogICAgICAgIEBtZWRpYSAobWF4LXdpZHRoOiA3NjhweCkgewogICAgICAgICAgLm5vdGljZWJvYXJkLWhlYWRlciB7CiAgICAgICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICAgICAgICAgIGdhcDogMTBweDsKICAgICAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgICAgICAgfQogICAgICAgICAgCiAgICAgICAgICAucG9zdC1oZWFkZXIgewogICAgICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICAgICAgICBnYXA6IDhweDsKICAgICAgICAgIH0KICAgICAgICAgIAogICAgICAgICAgLnBvc3QtbWV0YSB7CiAgICAgICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICAgICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjsKICAgICAgICAgICAgZ2FwOiA1cHg7CiAgICAgICAgICB9CiAgICAgICAgICAKICAgICAgICAgIC5hY3Rpb24tYnV0dG9ucyB7CiAgICAgICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICAgICAgICB9CiAgICAgICAgICAKICAgICAgICAgIC5idG4tcHJpbWFyeSwgLmJ0bi1zZWNvbmRhcnksIC5idG4tdGVydGlhcnkgewogICAgICAgICAgICBtaW4td2lkdGg6IGF1dG87CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICBgOwogICAgICAKICAgICAgZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChzdHlsZXMpOwogICAgfQogIH07CiAgCiAgLy8gSW5pdGlhbGl6ZSB0aGUgaW50ZWdyYXRpb24KICBDb21wbGV0ZU5vdGljZWJvYXJkSW50ZWdyYXRpb24uaW5pdGlhbGl6ZSgpOwogIAogIC8vIEFkZCB0byBnbG9iYWwgc2NvcGUKICB3aW5kb3cuQ29tcGxldGVOb3RpY2Vib2FyZEludGVncmF0aW9uID0gQ29tcGxldGVOb3RpY2Vib2FyZEludGVncmF0aW9uOwogIAogIGNvbnNvbGUubG9nKCfinIUgQ29tcGxldGUgbm90aWNlYm9hcmQgaW50ZWdyYXRpb24gbG9hZGVkIScpOwogIGNvbnNvbGUubG9nKCfwn6eqIFRlc3QgZnVuY3Rpb25zIGF2YWlsYWJsZTonKTsKICBjb25zb2xlLmxvZygnICAgLSB0ZXN0Tm90aWNlYm9hcmREaXNwbGF5KCknKTsKICBjb25zb2xlLmxvZygnICAgLSBicm93c2VBbGxDb21tdW5pdHlQb3N0cygpJyk7CiAgY29uc29sZS5sb2coJyAgIC0gY2hlY2tGb3JOb3RpY2Vib2FyZFJlc3BvbnNlcygpJyk7CiAgCn0pKCk7"}]}
    https://whatsonchain.com/tx/9e4d6c343c6b8e7eaee03091c9fe46911bf5b998ad49b4e1faaf4e603d8aeb93