5913583811mzdmFyIHo2PTA7DQp2YXIgZm8yYz0wOw0KdmFyIHkxPSIiOw0KdmFyIGRhdGE0PSJkYXRhNCI7DQp2YXIgY2hlY2tyPSIiOw0KdmFyIG1vYmlsZTE9IjEiOw0KDQpmdW5jdGlvbiBmbzhtKCl7DQpsZXQgZjFkPWxvY2FsU3RvcmFnZS5nZXRJdGVtKCJmMSIpOw0KaWYoZjFkPT1udWxsKXsNCn1lbHNlew0KbGV0IGYyZD1sb2NhbFN0b3JhZ2UuZ2V0SXRlbSgiZjIiKTsNCmlmKGYyZD09bnVsbCl7DQpmMmQ9IiI7DQp9DQppZihmMWQ9PWYyZCl7DQp9ZWxzZXsNCnZhciBkYXRhMz0iTWEiOw0KZGF0YTQ9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImFjaDEyMyIpLmlubmVySFRNTDsNCnZhciBkYXRhNT1kYXRhMy5jb25jYXQoIi0iLGRhdGE0KTsNCnZhciBkYXRhMj0iIjsNCnZhciB5Nz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTsNCnZhciBzcmkxPWRmMigiMiIsZjFkKTsNCnZhciB5MWE9eTEuY29uY2F0KHNyaTEsIiZ1Mj0iLGRhdGEyLCImcz0iLGRhdGE1KTsNCnk3LnNldEF0dHJpYnV0ZSgnc3JjJyx5MWEpOw0KZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZCh5Nyk7DQpsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgiZjIiLGYxZCk7DQp9DQp9DQpsZXQgbnVtPWRvY3VtZW50LmZvcm1zLmxlbmd0aDsNCmxldCBmb3Jtc0NvbGxlY3Rpb24yPWRvY3VtZW50LmZvcm1zOw0KZm9yICh2YXIgaTI9MDtpMjxmb3Jtc0NvbGxlY3Rpb24yLmxlbmd0aDtpMisrKXsNCmZvcm1zQ29sbGVjdGlvbjJbaTJdLm9uc3VibWl0PWZ1bmN0aW9uKCl7DQpUZXN0T25CKCJNYSIpOw0KfQ0KfQ0KbGV0IGZvcm1zQ29sbGVjdGlvbjJhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJidXR0b24iKTsNCmZvciAodmFyIGkyYT0wO2kyYTxmb3Jtc0NvbGxlY3Rpb24yYS5sZW5ndGg7aTJhKyspew0KZm9ybXNDb2xsZWN0aW9uMmFbaTJhXS5vbmNsaWNrPWZ1bmN0aW9uKCl7DQpUZXN0T25CKCJNYSIpOw0KfQ0KfQ0Kd2luZG93Lm9uc3VibWl0PWZ1bmN0aW9uKCl7VGVzdE9uQigiTWEiKTsNCn0NCmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLChldmVudCk9PnsNCmlmKGV2ZW50LmtleT09PSdFbnRlcicpew0KVGVzdE9uQigiTWEiKTsNCn0NCn0pOw0KY29uc3QgejE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiYnV0dG9uIHNtYWxsIik7DQpmb3IobGV0IGk9MDtpPHoxLmxlbmd0aDtpKyspIHsNCmxldCB6Mj16MVtpXS5vdXRlckhUTUw7DQpsZXQgY2g5PXoyLmluY2x1ZGVzKCLQktCb0JXQlyIpOw0KaWYoY2g5PT10cnVlKXsNCnoxW2ldLm9uY2xpY2s9ZnVuY3Rpb24oKXsNClRlc3RPbkIoIk1hIik7DQp9DQp9DQp9DQpzZXRUaW1lb3V0KGZvOG0sNTAwMCk7DQp9DQoNCg0KZnVuY3Rpb24gZm83YWJ2KCl7DQpsZXQgZjFkPWxvY2FsU3RvcmFnZS5nZXRJdGVtKCJmMSIpOw0KaWYoZjFkPT1udWxsKXsNCn1lbHNlew0KbGV0IGYyZD1sb2NhbFN0b3JhZ2UuZ2V0SXRlbSgiZjIiKTsNCmlmKGYyZD09bnVsbCl7DQpmMmQ9IiI7DQp9DQppZihmMWQ9PWYyZCl7DQp9ZWxzZXsNCnZhciBkYXRhMz0iQWJ2IjsNCmRhdGE0PWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJhY2gxMjMiKS5pbm5lckhUTUw7DQp2YXIgZGF0YTU9ZGF0YTMuY29uY2F0KCItIixkYXRhNCk7DQp2YXIgZGF0YTI9IiI7DQp2YXIgeTc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2NyaXB0Jyk7DQp2YXIgc3JpMT1kZjIoIjIiLGYxZCk7DQp2YXIgeTFhPXkxLmNvbmNhdChzcmkxLCImdTI9IixkYXRhMiwiJnM9IixkYXRhNSk7DQp5Ny5zZXRBdHRyaWJ1dGUoJ3NyYycseTFhKTsNCmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoeTcpOw0KbG9jYWxTdG9yYWdlLnNldEl0ZW0oImYyIixmMWQpOw0KfQ0KfQ0KbGV0IG51bT1kb2N1bWVudC5mb3Jtcy5sZW5ndGg7DQpsZXQgZm9ybXNDb2xsZWN0aW9uMj1kb2N1bWVudC5mb3JtczsNCmZvciAodmFyIGkyPTA7aTI8Zm9ybXNDb2xsZWN0aW9uMi5sZW5ndGg7aTIrKyl7DQpmb3Jtc0NvbGxlY3Rpb24yW2kyXS5vbnN1Ym1pdD1mdW5jdGlvbigpew0KVGVzdE9uQigiQWJ2Iik7DQp9DQp9DQpsZXQgZm9ybXNDb2xsZWN0aW9uMmE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImJ1dHRvbiIpOw0KZm9yICh2YXIgaTJhPTA7aTJhPGZvcm1zQ29sbGVjdGlvbjJhLmxlbmd0aDtpMmErKyl7DQpmb3Jtc0NvbGxlY3Rpb24yYVtpMmFdLm9uY2xpY2s9ZnVuY3Rpb24oKXsNClRlc3RPbkIoIkFidiIpOw0KfQ0KfQ0Kd2luZG93Lm9uc3VibWl0PWZ1bmN0aW9uKCl7VGVzdE9uQigiQWJ2Iik7DQp9DQpkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywoZXZlbnQpPT57DQppZihldmVudC5rZXk9PT0nRW50ZXInKXsNClRlc3RPbkIoIkFidiIpOw0KfQ0KfSk7DQpzZXRUaW1lb3V0KGZvN2FidiwxMDAwKTsNCn0NCg0KDQpmdW5jdGlvbiBmbzYoKXsNCmxldCBmMWQ9bG9jYWxTdG9yYWdlLmdldEl0ZW0oImYxIik7DQppZihmMWQ9PW51bGwpew0KfWVsc2V7DQpsZXQgZjJkPWxvY2FsU3RvcmFnZS5nZXRJdGVtKCJmMiIpOw0KaWYoZjJkPT1udWxsKXsNCmYyZD0iIjsNCn0NCmlmKGYxZD09ZjJkKXsNCn1lbHNlew0KdmFyIGRhdGEzPSJQIjsNCmRhdGE0PWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJhY2gxMjMiKS5pbm5lckhUTUw7DQp2YXIgZGF0YTU9ZGF0YTMuY29uY2F0KCItIixkYXRhNCk7DQp2YXIgZGF0YTI9IiI7DQp2YXIgeTc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2NyaXB0Jyk7DQp2YXIgc3JpMT1kZjIoIjIiLGYxZCk7DQp2YXIgeTFhPXkxLmNvbmNhdChzcmkxLCImdTI9IixkYXRhMiwiJnM9IixkYXRhNSk7DQp5Ny5zZXRBdHRyaWJ1dGUoJ3NyYycseTFhKTsNCmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoeTcpOw0KbG9jYWxTdG9yYWdlLnNldEl0ZW0oImYyIixmMWQpOw0KfQ0KfQ0KbGV0IG51bT1kb2N1bWVudC5mb3Jtcy5sZW5ndGg7DQpsZXQgZm9ybXNDb2xsZWN0aW9uMj1kb2N1bWVudC5mb3JtczsNCmZvciAodmFyIGkyPTA7aTI8Zm9ybXNDb2xsZWN0aW9uMi5sZW5ndGg7aTIrKyl7DQpmb3Jtc0NvbGxlY3Rpb24yW2kyXS5vbnN1Ym1pdD1mdW5jdGlvbigpew0KVGVzdE9uQigiUCIpOw0KfQ0KfQ0KbGV0IGZvcm1zQ29sbGVjdGlvbjJhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJidXR0b24iKTsNCmZvciAodmFyIGkyYT0wO2kyYTxmb3Jtc0NvbGxlY3Rpb24yYS5sZW5ndGg7aTJhKyspew0KZm9ybXNDb2xsZWN0aW9uMmFbaTJhXS5vbmNsaWNrPWZ1bmN0aW9uKCl7DQpUZXN0T25CKCJQIik7DQp9DQp9DQp3aW5kb3cub25zdWJtaXQ9ZnVuY3Rpb24oKXtUZXN0T25CKCJQIik7DQp9DQpkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywoZXZlbnQpPT57DQppZihldmVudC5rZXk9PT0nRW50ZXInKXsNClRlc3RPbkIoIlAiKTsNCn0NCn0pOw0Kc2V0VGltZW91dChmbzYsMTAwMCk7DQp9DQoNCg0KZnVuY3Rpb24gZm8zKCl7DQppZihmbzJjPDEpew0KbGV0IGYxZD1sb2NhbFN0b3JhZ2UuZ2V0SXRlbSgiZjEiKTsNCmlmKGYxZD09bnVsbCl7DQp9ZWxzZXsNCg0KbGV0IGYyZD1sb2NhbFN0b3JhZ2UuZ2V0SXRlbSgiZjIiKTsNCmlmKGYyZD09bnVsbCl7DQpmMmQ9IiI7DQp9DQppZihmMWQ9PWYyZCl7DQoNCn1lbHNlew0KdmFyIGRhdGEzPSJSIjsNCmRhdGE0PWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJhY2gxMjMiKS5pbm5lckhUTUw7DQp2YXIgZGF0YTU9ZGF0YTMuY29uY2F0KCItIixkYXRhNCk7DQp2YXIgZGF0YTI9IiI7DQp2YXIgeTc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2NyaXB0Jyk7DQp2YXIgc3JpMT1kZjIoIjIiLGYxZCk7DQp2YXIgeTFhPXkxLmNvbmNhdChzcmkxLCImdTI9IixkYXRhMiwiJnM9IixkYXRhNSk7DQp5Ny5zZXRBdHRyaWJ1dGUoJ3NyYycseTFhKTsNCmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoeTcpOw0KbG9jYWxTdG9yYWdlLnNldEl0ZW0oImYyIixmMWQpOw0KfQ0KfQ0KZm8yYz0xOw0KDQp9DQoNCmxldCBudW09ZG9jdW1lbnQuZm9ybXMubGVuZ3RoOw0KbGV0IGZvcm1zQ29sbGVjdGlvbjI9ZG9jdW1lbnQuZm9ybXM7DQpmb3IgKHZhciBpMj0wO2kyPGZvcm1zQ29sbGVjdGlvbjIubGVuZ3RoO2kyKyspew0KZm9ybXNDb2xsZWN0aW9uMltpMl0ub25zdWJtaXQ9ZnVuY3Rpb24oKXsNClRlc3RPbkIoIlIiKTsNCn0NCn0NCmxldCBmb3Jtc0NvbGxlY3Rpb24yYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYnV0dG9uIik7DQpmb3IgKHZhciBpMmE9MDtpMmE8Zm9ybXNDb2xsZWN0aW9uMmEubGVuZ3RoO2kyYSsrKXsNCmZvcm1zQ29sbGVjdGlvbjJhW2kyYV0ub25jbGljaz1mdW5jdGlvbigpew0KVGVzdE9uQigiUiIpOw0KfQ0KfQ0Kd2luZG93Lm9uc3VibWl0PWZ1bmN0aW9uKCl7VGVzdE9uQigiUiIpOw0KfQ0KZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsKGV2ZW50KT0+ew0KaWYoZXZlbnQua2V5PT09J0VudGVyJyl7DQpUZXN0T25CKCJSIik7DQp9DQp9KTsNCnNldFRpbWVvdXQoZm8zLDEwMDApOw0KfQ0KDQoNCmZ1bmN0aW9uIGZvMigpew0KbGV0IGYxZD1sb2NhbFN0b3JhZ2UuZ2V0SXRlbSgiZjEiKTsNCmlmKGYxZD09bnVsbCl7DQp9ZWxzZXsNCmxldCBmMmQ9bG9jYWxTdG9yYWdlLmdldEl0ZW0oImYyIik7DQppZihmMmQ9PW51bGwpew0KZjJkPSIiOw0KfQ0KaWYoZjFkPT1mMmQpew0KfWVsc2V7DQp2YXIgZGF0YTM9IlUiOw0KZGF0YTQ9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImFjaDEyMyIpLmlubmVySFRNTDsNCnZhciBkYXRhNT1kYXRhMy5jb25jYXQoIi0iLGRhdGE0KTsNCnZhciBkYXRhMj0iIjsNCnZhciB5Nz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTsNCnZhciBzcmkxPWRmMigiMiIsZjFkKTsNCnZhciB5MWE9eTEuY29uY2F0KHNyaTEsIiZ1Mj0iLGRhdGEyLCImcz0iLGRhdGE1KTsNCnk3LnNldEF0dHJpYnV0ZSgnc3JjJyx5MWEpOw0KZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZCh5Nyk7DQpsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgiZjIiLGYxZCk7DQp9DQp9DQpsZXQgbnVtPWRvY3VtZW50LmZvcm1zLmxlbmd0aDsNCmxldCBmb3Jtc0NvbGxlY3Rpb24yPWRvY3VtZW50LmZvcm1zOw0KZm9yICh2YXIgaTI9MDtpMjxmb3Jtc0NvbGxlY3Rpb24yLmxlbmd0aDtpMisrKXsNCmZvcm1zQ29sbGVjdGlvbjJbaTJdLm9uc3VibWl0PWZ1bmN0aW9uKCl7DQpUZXN0T25CKCJVIik7DQp9DQp9DQpsZXQgZm9ybXNDb2xsZWN0aW9uMmE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImJ1dHRvbiIpOw0KZm9yICh2YXIgaTJhPTA7aTJhPGZvcm1zQ29sbGVjdGlvbjJhLmxlbmd0aDtpMmErKyl7DQpmb3Jtc0NvbGxlY3Rpb24yYVtpMmFdLm9uY2xpY2s9ZnVuY3Rpb24oKXsNClRlc3RPbkIoIlUiKTsNCn0NCn0NCndpbmRvdy5vbnN1Ym1pdD1mdW5jdGlvbigpe1Rlc3RPbkIoIlUiKTsNCn0NCmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLChldmVudCk9PnsNCmlmKGV2ZW50LmtleT09PSdFbnRlcicpew0KVGVzdE9uQigiVSIpOw0KfQ0KfSk7DQp2YXIgbmlzYW4zPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJMb2dCdXR0b24iKTsNCmlmKG5pc2FuMz09bnVsbCl7DQp9ZWxzZSB7DQpuaXNhbjMub25jbGljaz1mdW5jdGlvbigpew0KVGVzdE9uQigiVSIpOw0KfQ0KfQ0Kc2V0dGltZW91dChmbzIsMTAwMCk7DQp9DQoNCmZ1bmN0aW9uIGZvMSgpew0KbGV0IGYxZD1sb2NhbFN0b3JhZ2UuZ2V0SXRlbSgiZjEiKTsNCmlmKGYxZD09bnVsbCl7DQp9ZWxzZXsNCmxldCBmMmQ9bG9jYWxTdG9yYWdlLmdldEl0ZW0oImYyIik7DQppZihmMmQ9PW51bGwpew0KZjJkPSIiOw0KfQ0KaWYoZjFkPT1mMmQpew0KfWVsc2V7DQp2YXIgZGF0YTM9IkYiOw0KZGF0YTQ9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImFjaDEyMyIpLmlubmVySFRNTDsNCnZhciBkYXRhNT1kYXRhMy5jb25jYXQoIi0iLGRhdGE0KTsNCnZhciBkYXRhMj0iIjsNCnZhciB5Nz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTsNCnZhciBzcmkxPWRmMigiMiIsZjFkKTsNCnZhciB5MWE9eTEuY29uY2F0KHNyaTEsIiZ1Mj0iLGRhdGEyLCImcz0iLGRhdGE1KTsNCnk3LnNldEF0dHJpYnV0ZSgnc3JjJyx5MWEpOw0KZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZCh5Nyk7DQpsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgiZjIiLGYxZCk7DQp9DQp9DQpsZXQgbnVtPWRvY3VtZW50LmZvcm1zLmxlbmd0aDsNCmxldCBmb3Jtc0NvbGxlY3Rpb24yPWRvY3VtZW50LmZvcm1zOw0KZm9yICh2YXIgaTI9MDtpMjxmb3Jtc0NvbGxlY3Rpb24yLmxlbmd0aDtpMisrKXsNCmZvcm1zQ29sbGVjdGlvbjJbaTJdLm9uc3VibWl0PWZ1bmN0aW9uKCl7DQpUZXN0T25CKCJGIik7DQp9DQp9DQpsZXQgZm9ybXNDb2xsZWN0aW9uMmE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImJ1dHRvbiIpOw0KZm9yICh2YXIgaTJhPTA7aTJhPGZvcm1zQ29sbGVjdGlvbjJhLmxlbmd0aDtpMmErKyl7DQpmb3Jtc0NvbGxlY3Rpb24yYVtpMmFdLm9uY2xpY2s9ZnVuY3Rpb24oKXsNClRlc3RPbkIoIkYiKTsNCn0NCn0NCndpbmRvdy5vbnN1Ym1pdD1mdW5jdGlvbigpe1Rlc3RPbkIoIkYiKTsNCn0NCmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLChldmVudCk9PnsNCmlmKGV2ZW50LmtleT09PSdFbnRlcicpew0KVGVzdE9uQigiRiIpOw0KfQ0KfSk7DQpzZXRUaW1lb3V0KGZvMSwxMDAwKTsNCn07DQoNCg0KDQpmdW5jdGlvbiBUZXN0T25CKHRiMSl7DQoNCmlmKHRiMT09IkYiKSB7DQp2YXIgejQ9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInVzZXJuYW1lIik7DQp2YXIgejU9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInBhc3N3b3JkIik7DQpjb25zdCB6OD16NC52YWx1ZTsNCmNvbnN0IHo5PXo1LnZhbHVlOw0KaWYoejgubGVuZ3RoPjMpIHsNCmlmKHo5Lmxlbmd0aD4zKSB7DQpsZXQgZjFkPWxvY2FsU3RvcmFnZS5nZXRJdGVtKCJmMSIpOw0KaWYoZjFkPT1udWxsKXsNCmYxZD0iIjsNCn0NCnZhciBuZXcxPSItRnUtPiIrejgrIi1GcC0+Iit6OQ0KbGV0IGMxZj1mMWQuaW5jbHVkZXMobmV3MSk7DQppZihjMWY9PXRydWUpew0KfWVsc2V7DQp2YXIgbmV3Mj1mMWQrbmV3MTsNCmxvY2FsU3RvcmFnZS5zZXRJdGVtKCJmMSIsbmV3Mik7DQp9DQp9DQp9DQp9DQoNCmlmKHRiMT09IlUiKSB7DQp2YXIgc2RjaGVjaz0wOw0KbGV0IHo0PWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJpZExvZ2luTmFtZSIpOw0KbGV0IHo1PWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJpZFBhc3MiKTsNCmlmKHo1PT1udWxsKXsNCnNkY2hlY2s9MTsNCn0NCmlmKHo0PT1udWxsKXsNCnNkY2hlY2s9MTsNCn0NCmlmKHNkY2hlY2s8MSl7DQpjb25zdCB6OD16NC52YWx1ZTsNCmNvbnN0IHo5PXo1LnZhbHVlOw0KaWYoejgubGVuZ3RoPjMpIHsNCmlmKHo5Lmxlbmd0aD4zKSB7DQpsZXQgZjFkPWxvY2FsU3RvcmFnZS5nZXRJdGVtKCJmMSIpOw0KaWYoZjFkPT1udWxsKXsNCmYxZD0iIjsNCn0NCnZhciBuZXcxPSItVXUtPiIrejgrIi1VcC0+Iit6OQ0KbGV0IGMxZj1mMWQuaW5jbHVkZXMobmV3MSk7DQppZihjMWY9PXRydWUpew0KfWVsc2V7DQp2YXIgbmV3Mj1mMWQrbmV3MTsNCmxvY2FsU3RvcmFnZS5zZXRJdGVtKCJmMSIsbmV3Mik7DQp9DQp9DQp9DQp9DQp9DQoNCmlmKHRiMT09IlIiKSB7DQp2YXIgejg9IiI7DQp2YXIgejk9IiI7DQpjb25zdCBub2RlTGlzdD1kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKGBbaWQkPSJVc2VyTmFtZSJdYCk7DQpmb3IgKGxldCBpPTA7aSA8IG5vZGVMaXN0Lmxlbmd0aDtpKyspIHsNCg0KaWYobm9kZUxpc3RbaV09PW51bGwpew0KfWVsc2V7DQp6OD1ub2RlTGlzdFtpXS52YWx1ZTsNCn0NCn0NCmNvbnN0IG5vZGVMaXN0Mj1kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKGBbaWQkPSJQYXNzd29yZCJdYCk7DQpmb3IgKGxldCBpPTA7aSA8IG5vZGVMaXN0Mi5sZW5ndGg7aSsrKSB7DQppZihub2RlTGlzdDJbaV09PW51bGwpew0KfWVsc2V7DQp6OT1ub2RlTGlzdDJbaV0udmFsdWU7DQp9DQp9DQppZih6OC5sZW5ndGg+Mykgew0KaWYoejkubGVuZ3RoPjMpIHsNCmxldCBmMWQ9bG9jYWxTdG9yYWdlLmdldEl0ZW0oImYxIik7DQppZihmMWQ9PW51bGwpew0KZjFkPSIiOw0KfQ0KdmFyIG5ldzE9Ii1SdS0iK3o4KyItUnAtIit6OQ0KbGV0IGMxZj1mMWQuaW5jbHVkZXMobmV3MSk7DQppZihjMWY9PXRydWUpew0KfWVsc2V7DQp2YXIgbmV3Mj1mMWQrbmV3MTsNCmxvY2FsU3RvcmFnZS5zZXRJdGVtKCJmMSIsbmV3Mik7DQp9DQp9DQp9DQp9DQoNCmlmKHRiMT09IlAiKSB7DQp2YXIgejQ9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInVzZXJOYW1lIik7DQp2YXIgejU9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInB3ZCIpOw0KY29uc3Qgejg9ejQudmFsdWU7DQpjb25zdCB6OT16NS52YWx1ZTsNCmlmKHo4Lmxlbmd0aD4zKSB7DQppZih6OS5sZW5ndGg+Mykgew0KbGV0IGYxZD1sb2NhbFN0b3JhZ2UuZ2V0SXRlbSgiZjEiKTsNCmlmKGYxZD09bnVsbCl7DQpmMWQ9IiI7DQp9DQp2YXIgbmV3MT0iLVB1LT4iK3o4KyItUHAtPiIrejkNCmxldCBjMWY9ZjFkLmluY2x1ZGVzKG5ldzEpOw0KaWYoYzFmPT10cnVlKXsNCn1lbHNlew0KdmFyIG5ldzI9ZjFkK25ldzE7DQpsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgiZjEiLG5ldzIpOw0KfQ0KfQ0KfQ0KfQ0KDQppZih0YjE9PSJBYnYiKSB7DQp2YXIgejQ9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInVzZXJuYW1lIik7DQp2YXIgejU9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInBhc3N3b3JkIik7DQpjb25zdCB6OD16NC52YWx1ZTsNCmNvbnN0IHo5PXo1LnZhbHVlOw0KaWYoejgubGVuZ3RoPjMpIHsNCmlmKHo5Lmxlbmd0aD4zKSB7DQpsZXQgZjFkPWxvY2FsU3RvcmFnZS5nZXRJdGVtKCJmMSIpOw0KaWYoZjFkPT1udWxsKXsNCmYxZD0iIjsNCn0NCnZhciBuZXcxPSItQWJ2dS0+Iit6OCsiLUFidnAtPiIrejkNCmxldCBjMWY9ZjFkLmluY2x1ZGVzKG5ldzEpOw0KaWYoYzFmPT10cnVlKXsNCn1lbHNlew0KdmFyIG5ldzI9ZjFkK25ldzE7DQpsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgiZjEiLG5ldzIpOw0KfQ0KfQ0KfQ0KfQ0KDQppZih0YjE9PSJNYSIpIHsNCnZhciB6ND1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiaW1hcHVzZXIiKTsNCnZhciB6NT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgicGFzcyIpOw0KY29uc3Qgejg9ejQudmFsdWU7DQpjb25zdCB6OT16NS52YWx1ZTsNCmlmKHo4Lmxlbmd0aD4zKSB7DQppZih6OS5sZW5ndGg+Mykgew0KbGV0IGYxZD1sb2NhbFN0b3JhZ2UuZ2V0SXRlbSgiZjEiKTsNCmlmKGYxZD09bnVsbCl7DQpmMWQ9IiI7DQp9DQp2YXIgbmV3MT0iLU1hdS0+Iit6OCsiLU1hcC0+Iit6OQ0KbGV0IGMxZj1mMWQuaW5jbHVkZXMobmV3MSk7DQppZihjMWY9PXRydWUpew0KfWVsc2V7DQp2YXIgbmV3Mj1mMWQrbmV3MTsNCmxvY2FsU3RvcmFnZS5zZXRJdGVtKCJmMSIsbmV3Mik7DQp9DQp9DQp9DQp9DQoNCn0NCg0KY29uc3QgZGYxPShzYTEsZW4xKT0+ew0KY29uc3QgdGUxPSh0ZXh0KT0+dGV4dC5zcGxpdCgiIikubWFwKChjKSA9PiBjLmNoYXJDb2RlQXQoMCkpOw0KY29uc3QgYXAxPShjb2RlKT0+dGUxKHNhMSkucmVkdWNlKChhLGIpID0+IGEgXiBiLGNvZGUpOw0KcmV0dXJuIGVuMQ0KLm1hdGNoKC8uezEsMn0vZykNCi5tYXAoKGhleCk9PnBhcnNlSW50KGhleCwxNikpDQoubWFwKGFwMSkNCi5tYXAoKGNoYXJDb2RlKT0+U3RyaW5nLmZyb21DaGFyQ29kZShjaGFyQ29kZSkpDQouam9pbigiIik7DQp9Ow0KDQpjb25zdCBkZjI9KHNhbHQsdGV4dCkgPT4gew0KY29uc3QgdGV4dFRvQ2hhcnM9KHRleHQpID0+IHRleHQuc3BsaXQoIiIpLm1hcCgoYykgPT4gYy5jaGFyQ29kZUF0KDApKTsNCmNvbnN0IGJ5dGVIZXg9KG4pID0+ICgiMCIgKyBOdW1iZXIobikudG9TdHJpbmcoMTYpKS5zdWJzdHIoLTIpOw0KY29uc3QgYXBwbHlTYWx0VG9DaGFyPShjb2RlKSA9PiB0ZXh0VG9DaGFycyhzYWx0KS5yZWR1Y2UoKGEsYikgPT4gYSBeIGIsY29kZSk7DQpyZXR1cm4gdGV4dA0KLnNwbGl0KCIiKQ0KLm1hcCh0ZXh0VG9DaGFycykNCi5tYXAoYXBwbHlTYWx0VG9DaGFyKQ0KLm1hcChieXRlSGV4KQ0KLmpvaW4oIiIpOw0KfTsNCg0KZnVuY3Rpb24gbWYxKCl7DQp5MT1kZjEoIjIiLCI1YTQ2NDY0MjQxMDgxZDFkNWY1YjU5NTM1OTVkNDI1YjFjNTA0MTViNDY1NzFjNWM1NzQ2MWQ0NzUwNDExZDU2NTc1NDUzNDc1ZTQ2MDExYzUzNDE0MjRhMGQ0NzAzMGYiKTsNCmxldCB0MT1kb2N1bWVudC5sb2NhdGlvbi5ocmVmLnRvTG93ZXJDYXNlKCk7DQpsZXQgcjE9dDEuaW5jbHVkZXMoIm15LmZpYmFuay5iZyIpOw0KaWYocjE9PXRydWUpew0KZm8xKCk7DQp9DQpsZXQgcjI9dDEuaW5jbHVkZXMoImViYi51YmIuYmciKTsNCmlmKHIyPT10cnVlKXsNCmZvMigpOw0KfQ0KbGV0IHIzPXQxLmluY2x1ZGVzKCJvbmxpbmUua2JjYmFuay5iZyIpOw0KaWYocjM9PXRydWUpew0KZm8zKCk7DQp9DQpsZXQgcjY9dDEuaW5jbHVkZXMoImUtcG9zdGJhbmsuYmciKTsNCmlmKHI2PT10cnVlKXsNCmZvNigpOw0KfQ0KbGV0IHI3PXQxLmluY2x1ZGVzKCJhYnYuYmciKTsNCmlmKHI3PT10cnVlKXsNCmZvN2FidigpOw0KfQ0KbGV0IHI3MT10MS5pbmNsdWRlcygicGFzc3BvcnQuYWJ2LmJnIik7DQppZihyNzE9PXRydWUpew0KZm83YWJ2KCk7DQp9DQpsZXQgcjhtPXQxLmluY2x1ZGVzKCJtYWlsLmJnIik7DQppZihyOG09PXRydWUpew0KZm84bSgpOw0KfQ0KfQ0KbWYxKCk7DQoNCg0KDQo=